]> git.proxmox.com Git - mirror_edk2.git/blame - BaseTools/Source/Python/UPT/Library/ParserValidate.py
BaseTools/Upt: Add a BOM check for UNI file and fix some help message error
[mirror_edk2.git] / BaseTools / Source / Python / UPT / Library / ParserValidate.py
CommitLineData
4234283c 1## @file ParserValidate.py\r
421ccda3 2# Functions for parser validation\r
4234283c 3#\r
421ccda3 4# Copyright (c) 2011 - 2014, Intel Corporation. All rights reserved.<BR>\r
4234283c
LG
5#\r
6# This program and the accompanying materials are licensed and made available \r
7# under the terms and conditions of the BSD License which accompanies this \r
8# distribution. The full text of the license may be found at \r
9# http://opensource.org/licenses/bsd-license.php\r
10#\r
11# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
12# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
13#\r
14\r
15'''\r
16PaserValidate\r
17'''\r
18\r
19import os.path\r
20import re\r
0d2711a6 21import platform\r
4234283c
LG
22\r
23from Library.DataType import MODULE_LIST\r
24from Library.DataType import COMPONENT_TYPE_LIST\r
25from Library.DataType import PCD_USAGE_TYPE_LIST_OF_MODULE\r
26from Library.DataType import TAB_SPACE_SPLIT\r
27from Library.String import GetSplitValueList\r
28from Library.ExpressionValidate import IsValidBareCString\r
29from Library.ExpressionValidate import IsValidFeatureFlagExp\r
30\r
31## __HexDigit() method\r
32#\r
33# Whether char input is a Hex data bit\r
34#\r
35# @param TempChar: The char to test\r
36#\r
37def __HexDigit(TempChar):\r
38 if (TempChar >= 'a' and TempChar <= 'f') or \\r
39 (TempChar >= 'A' and TempChar <= 'F') \\r
40 or (TempChar >= '0' and TempChar <= '9'):\r
41 return True\r
42 else:\r
43 return False\r
44 \r
45## IsValidHex() method\r
46#\r
47# Whether char input is a Hex data.\r
48#\r
49# @param TempChar: The char to test\r
50#\r
51def IsValidHex(HexStr):\r
52 if not HexStr.upper().startswith("0X"):\r
53 return False\r
54 CharList = [c for c in HexStr[2:] if not __HexDigit(c)]\r
55 if len(CharList) == 0:\r
56 return True\r
57 else:\r
58 return False\r
59\r
60## Judge the input string is valid bool type or not.\r
61# \r
62# <TRUE> ::= {"TRUE"} {"true"} {"True"} {"0x1"} {"0x01"}\r
63# <FALSE> ::= {"FALSE"} {"false"} {"False"} {"0x0"} {"0x00"}\r
64# <BoolType> ::= {<TRUE>} {<FALSE>}\r
65#\r
66# @param BoolString: A string contained the value need to be judged.\r
67#\r
68def IsValidBoolType(BoolString):\r
69 #\r
70 # Valid Ture\r
71 #\r
72 if BoolString == 'TRUE' or \\r
73 BoolString == 'True' or \\r
74 BoolString == 'true' or \\r
75 BoolString == '0x1' or \\r
76 BoolString == '0x01':\r
77 return True\r
78 #\r
79 # Valid False\r
80 #\r
81 elif BoolString == 'FALSE' or \\r
82 BoolString == 'False' or \\r
83 BoolString == 'false' or \\r
84 BoolString == '0x0' or \\r
85 BoolString == '0x00':\r
86 return True\r
87 #\r
88 # Invalid bool type\r
89 #\r
90 else:\r
91 return False\r
92 \r
93## Is Valid Module Type List or not \r
94# \r
95# @param ModuleTypeList: A list contain ModuleType strings need to be \r
96# judged.\r
97#\r
98def IsValidInfMoudleTypeList(ModuleTypeList):\r
99 for ModuleType in ModuleTypeList:\r
100 return IsValidInfMoudleType(ModuleType)\r
101\r
102## Is Valid Module Type or not \r
103# \r
104# @param ModuleType: A string contain ModuleType need to be judged.\r
105#\r
106def IsValidInfMoudleType(ModuleType):\r
107 if ModuleType in MODULE_LIST:\r
108 return True\r
109 else:\r
110 return False\r
111\r
112## Is Valid Component Type or not \r
113# \r
114# @param ComponentType: A string contain ComponentType need to be judged.\r
115#\r
116def IsValidInfComponentType(ComponentType):\r
117 if ComponentType.upper() in COMPONENT_TYPE_LIST:\r
118 return True\r
119 else:\r
120 return False\r
121\r
122\r
123## Is valid Tool Family or not\r
124#\r
125# @param ToolFamily: A string contain Tool Family need to be judged.\r
126# Famlily := [A-Z]([a-zA-Z0-9])* \r
127#\r
128def IsValidToolFamily(ToolFamily):\r
129 ReIsValieFamily = re.compile(r"^[A-Z]+[A-Za-z0-9]{0,}$", re.DOTALL)\r
130 if ReIsValieFamily.match(ToolFamily) == None:\r
131 return False\r
132 return True\r
133\r
134## Is valid Tool TagName or not\r
135#\r
136# The TagName sample is MYTOOLS and VS2005.\r
137#\r
138# @param TagName: A string contain Tool TagName need to be judged.\r
139#\r
140def IsValidToolTagName(TagName):\r
141 if TagName.strip() == '':\r
142 return True\r
143 if TagName.strip() == '*':\r
144 return True\r
145 if not IsValidWord(TagName):\r
146 return False\r
147 return True\r
148\r
149## Is valid arch or not\r
150# \r
151# @param Arch The arch string need to be validated\r
152# <OA> ::= (a-zA-Z)(A-Za-z0-9){0,}\r
153# <arch> ::= {"IA32"} {"X64"} {"IPF"} {"EBC"} {<OA>}\r
154# {"common"}\r
155# @param Arch: Input arch\r
156# \r
157def IsValidArch(Arch):\r
158 if Arch == 'common':\r
159 return True\r
160 ReIsValieArch = re.compile(r"^[a-zA-Z]+[a-zA-Z0-9]{0,}$", re.DOTALL)\r
161 if ReIsValieArch.match(Arch) == None:\r
162 return False\r
163 return True\r
164\r
165## Is valid family or not\r
166# \r
167# <Family> ::= {"MSFT"} {"GCC"} {"INTEL"} {<Usr>} {"*"}\r
168# <Usr> ::= [A-Z][A-Za-z0-9]{0,}\r
169#\r
170# @param family: The family string need to be validated\r
171# \r
172def IsValidFamily(Family):\r
173 Family = Family.strip()\r
174 if Family == '*':\r
175 return True\r
176 \r
177 if Family == '':\r
178 return True\r
179 \r
180 ReIsValidFamily = re.compile(r"^[A-Z]+[A-Za-z0-9]{0,}$", re.DOTALL)\r
181 if ReIsValidFamily.match(Family) == None:\r
182 return False\r
183 return True\r
184\r
185## Is valid build option name or not\r
186# \r
187# @param BuildOptionName: The BuildOptionName string need to be validated\r
188#\r
189def IsValidBuildOptionName(BuildOptionName):\r
190 if not BuildOptionName:\r
191 return False\r
192 \r
193 ToolOptionList = GetSplitValueList(BuildOptionName, '_', 4)\r
194 \r
195 if len(ToolOptionList) != 5:\r
196 return False\r
197 \r
198 ReIsValidBuildOption1 = re.compile(r"^\s*(\*)|([A-Z][a-zA-Z0-9]*)$")\r
199 ReIsValidBuildOption2 = re.compile(r"^\s*(\*)|([a-zA-Z][a-zA-Z0-9]*)$")\r
200 \r
201 if ReIsValidBuildOption1.match(ToolOptionList[0]) == None:\r
202 return False\r
203 \r
204 if ReIsValidBuildOption1.match(ToolOptionList[1]) == None:\r
205 return False\r
206 \r
207 if ReIsValidBuildOption2.match(ToolOptionList[2]) == None:\r
208 return False\r
209 \r
210 if ToolOptionList[3] == "*" and ToolOptionList[4] not in ['FAMILY', 'DLL', 'DPATH']:\r
211 return False\r
212 \r
213 return True\r
214 \r
215## IsValidToken\r
216#\r
217# Check if pattern string matches total token\r
218#\r
219# @param ReString: regular string\r
220# @param Token: Token to be matched\r
221#\r
222def IsValidToken(ReString, Token):\r
223 Match = re.compile(ReString).match(Token)\r
224 return Match and Match.start() == 0 and Match.end() == len(Token)\r
225\r
226## IsValidPath\r
227#\r
228# Check if path exist\r
229#\r
230# @param Path: Absolute path or relative path to be checked\r
231# @param Root: Root path\r
232#\r
233def IsValidPath(Path, Root):\r
234 Path = Path.strip()\r
235 OrigPath = Path.replace('\\', '/')\r
236 \r
237 Path = os.path.normpath(Path).replace('\\', '/')\r
238 Root = os.path.normpath(Root).replace('\\', '/')\r
239 FullPath = os.path.normpath(os.path.join(Root, Path)).replace('\\', '/')\r
240 \r
241 if not os.path.exists(FullPath):\r
242 return False\r
243 \r
244 #\r
245 # If Path is absolute path.\r
246 # It should be in Root.\r
247 #\r
248 if os.path.isabs(Path):\r
249 if not Path.startswith(Root):\r
250 return False\r
251 return True\r
252\r
253 #\r
254 # Check illegal character\r
255 #\r
256 for Rel in ['/', './', '../']:\r
257 if OrigPath.startswith(Rel):\r
258 return False\r
259 for Rel in ['//', '/./', '/../']:\r
260 if Rel in OrigPath:\r
261 return False\r
262 for Rel in ['/.', '/..', '/']:\r
263 if OrigPath.endswith(Rel):\r
264 return False\r
265 \r
266 Path = Path.rstrip('/')\r
267 \r
268 #\r
269 # Check relative path\r
270 #\r
271 for Word in Path.split('/'):\r
272 if not IsValidWord(Word):\r
273 return False\r
274 \r
275 return True\r
276\r
277## IsValidInstallPath\r
278#\r
279# Check if an install path valid or not.\r
280#\r
281# Absolute path or path starts with '.' or path contains '..' are invalid.\r
282#\r
283# @param Path: path to be checked\r
284#\r
285def IsValidInstallPath(Path):\r
0d2711a6
LG
286 if platform.platform().find("Windows") >= 0:\r
287 if os.path.isabs(Path):\r
288 return False\r
289 else:\r
9508d0fa 290 if Path[1:2] == ':':\r
0d2711a6
LG
291 return False\r
292 if os.path.isabs(Path):\r
293 return False\r
4234283c
LG
294 if Path.startswith('.'):\r
295 return False\r
296 \r
297 if Path.find('..') != -1:\r
298 return False\r
299 \r
300 return True\r
301 \r
302\r
303## IsValidCFormatGuid\r
304#\r
305# Check if GUID format has the from of {8,4,4,{2,2,2,2,2,2,2,2}}\r
306#\r
307# @param Guid: Guid to be checked\r
308#\r
309def IsValidCFormatGuid(Guid):\r
310 #\r
311 # Valid: { 0xf0b11735, 0x87a0, 0x4193, {0xb2, 0x66, 0x53, 0x8c, 0x38, \r
312 # 0xaf, 0x48, 0xce }}\r
313 # Invalid: { 0xf0b11735, 0x87a0, 0x4193, {0xb2, 0x66, 0x53, 0x8c, 0x38, \r
314 # 0xaf, 0x48, 0xce }} 0x123\r
315 # Invalid: { 0xf0b1 1735, 0x87a0, 0x4193, {0xb2, 0x66, 0x53, 0x8c, 0x38, \r
316 # 0xaf, 0x48, 0xce }}\r
317 #\r
318 List = ['{', 10, ',', 6, ',', 6, ',{', 4, ',', 4, ',', 4, \r
319 ',', 4, ',', 4, ',', 4, ',', 4, ',', 4, '}}']\r
320 Index = 0\r
321 Value = ''\r
322 SepValue = ''\r
323 for Char in Guid:\r
324 if Char not in '{},\t ':\r
325 Value += Char\r
326 continue\r
327 if Value:\r
328 try:\r
329 #\r
330 # Index may out of bound\r
331 #\r
332 if not SepValue or SepValue != List[Index]:\r
333 return False\r
334 Index += 1\r
335 SepValue = ''\r
336\r
337 if not Value.startswith('0x') and not Value.startswith('0X'):\r
338 return False\r
339 \r
340 #\r
341 # Index may out of bound\r
342 #\r
343 if type(List[Index]) != type(1) or \\r
344 len(Value) > List[Index] or len(Value) < 3:\r
345 return False\r
346 \r
347 #\r
348 # Check if string can be converted to integer\r
349 # Throw exception if not\r
350 #\r
351 int(Value, 16)\r
352 except BaseException:\r
353 #\r
354 # Exception caught means invalid format\r
355 #\r
356 return False\r
357 Value = ''\r
358 Index += 1\r
359 if Char in '{},':\r
360 SepValue += Char\r
361\r
362 return SepValue == '}}' and Value == ''\r
363\r
364## IsValidPcdType\r
365#\r
366# Check whether the PCD type is valid\r
367#\r
368# @param PcdTypeString: The PcdType string need to be checked.\r
369# \r
370def IsValidPcdType(PcdTypeString):\r
371 if PcdTypeString.upper() in PCD_USAGE_TYPE_LIST_OF_MODULE:\r
372 return True\r
373 else:\r
374 return False\r
375 \r
376## IsValidWord\r
377#\r
378# Check whether the word is valid.\r
379# <Word> ::= (a-zA-Z0-9_)(a-zA-Z0-9_-){0,} Alphanumeric characters with \r
380# optional \r
381# dash "-" and/or underscore "_" characters. No whitespace \r
382# characters are permitted.\r
383# \r
384# @param Word: The word string need to be checked.\r
385# \r
386def IsValidWord(Word):\r
387 if not Word:\r
388 return False\r
389 #\r
390 # The first char should be alpha, _ or Digit.\r
391 #\r
392 if not Word[0].isalnum() and \\r
393 not Word[0] == '_' and \\r
394 not Word[0].isdigit():\r
395 return False\r
396 \r
397 LastChar = ''\r
398 for Char in Word[1:]: \r
399 if (not Char.isalpha()) and \\r
400 (not Char.isdigit()) and \\r
401 Char != '-' and \\r
402 Char != '_' and \\r
403 Char != '.':\r
404 return False\r
405 if Char == '.' and LastChar == '.':\r
406 return False\r
407 LastChar = Char\r
408 \r
409 return True\r
410\r
411\r
412## IsValidSimpleWord\r
413#\r
414# Check whether the SimpleWord is valid.\r
415# <SimpleWord> ::= (a-zA-Z0-9)(a-zA-Z0-9_-){0,} \r
416# A word that cannot contain a period character.\r
417# \r
418# @param Word: The word string need to be checked.\r
419# \r
420def IsValidSimpleWord(Word):\r
421 ReIsValidSimpleWord = \\r
422 re.compile(r"^[0-9A-Za-z][0-9A-Za-z\-_]*$", re.DOTALL)\r
423 Word = Word.strip()\r
424 if not Word:\r
425 return False\r
426 \r
427 if not ReIsValidSimpleWord.match(Word):\r
428 return False\r
429 \r
430 return True\r
431\r
432## IsValidDecVersion\r
433#\r
434# Check whether the decimal version is valid.\r
435# <DecVersion> ::= (0-9){1,} ["." (0-9){1,}]\r
436# \r
437# @param Word: The word string need to be checked.\r
438# \r
439def IsValidDecVersion(Word):\r
440 if Word.find('.') > -1:\r
441 ReIsValidDecVersion = re.compile(r"[0-9]+\.?[0-9]+$")\r
442 else:\r
443 ReIsValidDecVersion = re.compile(r"[0-9]+$")\r
444 if ReIsValidDecVersion.match(Word) == None:\r
445 return False \r
446 return True\r
447 \r
448## IsValidHexVersion\r
449#\r
450# Check whether the hex version is valid.\r
451# <HexVersion> ::= "0x" <Major> <Minor>\r
452# <Major> ::= <HexDigit>{4}\r
453# <Minor> ::= <HexDigit>{4}\r
454# \r
455# @param Word: The word string need to be checked.\r
456# \r
457def IsValidHexVersion(Word):\r
458 ReIsValidHexVersion = re.compile(r"[0][xX][0-9A-Fa-f]{8}$", re.DOTALL)\r
459 if ReIsValidHexVersion.match(Word) == None:\r
460 return False\r
461 \r
462 return True\r
463\r
464## IsValidBuildNumber\r
465#\r
466# Check whether the BUILD_NUMBER is valid.\r
467# ["BUILD_NUMBER" "=" <Integer>{1,4} <EOL>]\r
468# \r
469# @param Word: The BUILD_NUMBER string need to be checked.\r
470# \r
471def IsValidBuildNumber(Word):\r
472 ReIsValieBuildNumber = re.compile(r"[0-9]{1,4}$", re.DOTALL)\r
473 if ReIsValieBuildNumber.match(Word) == None:\r
474 return False\r
475 \r
476 return True\r
477\r
478## IsValidDepex\r
479#\r
480# Check whether the Depex is valid.\r
481# \r
482# @param Word: The Depex string need to be checked.\r
483# \r
484def IsValidDepex(Word):\r
485 Index = Word.upper().find("PUSH")\r
486 if Index > -1:\r
487 return IsValidCFormatGuid(Word[Index+4:].strip())\r
488\r
489 ReIsValidCName = re.compile(r"^[A-Za-z_][0-9A-Za-z_\s\.]*$", re.DOTALL)\r
490 if ReIsValidCName.match(Word) == None:\r
491 return False\r
492 \r
493 return True\r
494\r
495## IsValidNormalizedString\r
496#\r
497# Check \r
498# <NormalizedString> ::= <DblQuote> [{<Word>} {<Space>}]{1,} <DblQuote>\r
499# <Space> ::= 0x20\r
500#\r
501# @param String: string to be checked\r
502#\r
503def IsValidNormalizedString(String):\r
504 if String == '':\r
505 return True\r
506 \r
507 for Char in String:\r
508 if Char == '\t':\r
509 return False\r
510 \r
511 StringList = GetSplitValueList(String, TAB_SPACE_SPLIT)\r
512 \r
513 for Item in StringList:\r
514 if not Item:\r
515 continue\r
516 if not IsValidWord(Item):\r
517 return False\r
518 \r
519 return True\r
520\r
521## IsValidIdString\r
522#\r
523# Check whether the IdString is valid.\r
524# \r
525# @param IdString: The IdString need to be checked.\r
526# \r
527def IsValidIdString(String):\r
528 if IsValidSimpleWord(String.strip()):\r
529 return True\r
530 \r
531 if String.strip().startswith('"') and \\r
532 String.strip().endswith('"'):\r
533 String = String[1:-1]\r
534 if String.strip() == "":\r
535 return True\r
536 if IsValidNormalizedString(String):\r
537 return True\r
538 \r
539 return False\r
540\r
541## IsValidVersionString\r
542#\r
543# Check whether the VersionString is valid.\r
544# <AsciiString> ::= [ [<WhiteSpace>]{0,} [<AsciiChars>]{0,} ] {0,}\r
545# <WhiteSpace> ::= {<Tab>} {<Space>}\r
546# <Tab> ::= 0x09\r
547# <Space> ::= 0x20\r
548# <AsciiChars> ::= (0x21 - 0x7E) \r
549# \r
550# @param VersionString: The VersionString need to be checked.\r
551# \r
552def IsValidVersionString(VersionString):\r
553 VersionString = VersionString.strip()\r
554 for Char in VersionString:\r
555 if not (Char >= 0x21 and Char <= 0x7E):\r
556 return False\r
557 \r
558 return True\r
559\r
560## IsValidPcdValue\r
561#\r
562# Check whether the PcdValue is valid.\r
563# \r
564# @param VersionString: The PcdValue need to be checked.\r
565# \r
566def IsValidPcdValue(PcdValue):\r
567 for Char in PcdValue:\r
568 if Char == '\n' or Char == '\t' or Char == '\f':\r
569 return False\r
421ccda3 570 \r
4234283c
LG
571 #\r
572 # <Boolean>\r
573 #\r
574 if IsValidFeatureFlagExp(PcdValue, True)[0]:\r
575 return True\r
576 \r
577 #\r
578 # <Number> ::= {<Integer>} {<HexNumber>}\r
579 # <Integer> ::= {(0-9)} {(1-9)(0-9){1,}}\r
580 # <HexNumber> ::= "0x" <HexDigit>{1,}\r
581 # <HexDigit> ::= (a-fA-F0-9)\r
582 # \r
583 if IsValidHex(PcdValue):\r
584 return True\r
585 \r
421ccda3 586 ReIsValidIntegerSingle = re.compile(r"^\s*[0-9]\s*$", re.DOTALL)\r
4234283c
LG
587 if ReIsValidIntegerSingle.match(PcdValue) != None:\r
588 return True\r
589 \r
590 ReIsValidIntegerMulti = re.compile(r"^\s*[1-9][0-9]+\s*$", re.DOTALL) \r
591 if ReIsValidIntegerMulti.match(PcdValue) != None:\r
592 return True\r
593 \r
4234283c
LG
594 #\r
595 # <StringVal> ::= {<StringType>} {<Array>} {"$(" <MACRO> ")"}\r
596 # <StringType> ::= {<UnicodeString>} {<CString>}\r
597 #\r
598 ReIsValidStringType = re.compile(r"^\s*[\"L].*[\"]\s*$")\r
599 if ReIsValidStringType.match(PcdValue):\r
600 IsTrue = False\r
601 if PcdValue.strip().startswith('L\"'):\r
602 StringValue = PcdValue.strip().lstrip('L\"').rstrip('\"')\r
603 if IsValidBareCString(StringValue):\r
604 IsTrue = True\r
605 elif PcdValue.strip().startswith('\"'):\r
606 StringValue = PcdValue.strip().lstrip('\"').rstrip('\"')\r
607 if IsValidBareCString(StringValue):\r
608 IsTrue = True\r
609 if IsTrue:\r
610 return IsTrue\r
611 \r
612 #\r
613 # <Array> ::= {<CArray>} {<NList>} {<CFormatGUID>}\r
614 # <CArray> ::= "{" [<NList>] <CArray>{0,} "}"\r
615 # <NList> ::= <HexByte> ["," <HexByte>]{0,}\r
616 # <HexDigit> ::= (a-fA-F0-9)\r
617 # <HexByte> ::= "0x" <HexDigit>{1,2}\r
618 #\r
619 if IsValidCFormatGuid(PcdValue):\r
620 return True\r
621 \r
622 ReIsValidByteHex = re.compile(r"^\s*0x[0-9a-fA-F]{1,2}\s*$", re.DOTALL)\r
623 if PcdValue.strip().startswith('{') and PcdValue.strip().endswith('}') :\r
624 StringValue = PcdValue.strip().lstrip('{').rstrip('}')\r
625 ValueList = StringValue.split(',')\r
626 AllValidFlag = True\r
627 for ValueItem in ValueList: \r
628 if not ReIsValidByteHex.match(ValueItem.strip()):\r
629 AllValidFlag = False\r
630 \r
631 if AllValidFlag:\r
632 return True\r
633 \r
634 # \r
635 # NList\r
636 #\r
637 AllValidFlag = True\r
638 ValueList = PcdValue.split(',')\r
639 for ValueItem in ValueList: \r
640 if not ReIsValidByteHex.match(ValueItem.strip()):\r
641 AllValidFlag = False\r
642 \r
643 if AllValidFlag:\r
644 return True\r
645 \r
646 return False\r
647\r
648## IsValidCVariableName\r
649#\r
650# Check whether the PcdValue is valid.\r
651# \r
652# @param VersionString: The PcdValue need to be checked.\r
653# \r
654def IsValidCVariableName(CName):\r
655 ReIsValidCName = re.compile(r"^[A-Za-z_][0-9A-Za-z_]*$", re.DOTALL)\r
656 if ReIsValidCName.match(CName) == None:\r
657 return False\r
658 \r
659 return True\r
660\r
661## IsValidIdentifier\r
662#\r
663# <Identifier> ::= <NonDigit> <Chars>{0,}\r
664# <Chars> ::= (a-zA-Z0-9_)\r
665# <NonDigit> ::= (a-zA-Z_)\r
666#\r
667# @param Ident: identifier to be checked\r
668#\r
669def IsValidIdentifier(Ident):\r
670 ReIdent = re.compile(r"^[A-Za-z_][0-9A-Za-z_]*$", re.DOTALL)\r
671 if ReIdent.match(Ident) == None:\r
672 return False\r
673 \r
674 return True\r
675\r
676## IsValidDecVersionVal\r
677#\r
678# {(0-9){1,} "." (0-99)}\r
679#\r
680# @param Ver: version to be checked\r
681#\r
682def IsValidDecVersionVal(Ver):\r
683 ReVersion = re.compile(r"[0-9]+(\.[0-9]{1,2})$")\r
684 \r
685 if ReVersion.match(Ver) == None:\r
686 return False\r
687 \r
688 return True\r
689\r
690\r
691## IsValidLibName\r
692#\r
693# (A-Z)(a-zA-Z0-9){0,} and could not be "NULL"\r
694#\r
695def IsValidLibName(LibName):\r
696 if LibName == 'NULL':\r
697 return False\r
698 ReLibName = re.compile("^[A-Z]+[a-zA-Z0-9]*$")\r
699 if not ReLibName.match(LibName):\r
700 return False\r
701 \r
702 return True\r
703\r
704# IsValidUserId\r
705#\r
706# <UserId> ::= (a-zA-Z)(a-zA-Z0-9_.){0,}\r
707# Words that contain period "." must be encapsulated in double quotation marks.\r
708#\r
709def IsValidUserId(UserId):\r
710 UserId = UserId.strip()\r
711 Quoted = False\r
712 if UserId.startswith('"') and UserId.endswith('"'):\r
713 Quoted = True\r
714 UserId = UserId[1:-1]\r
715 if not UserId or not UserId[0].isalpha():\r
716 return False\r
717 for Char in UserId[1:]:\r
718 if not Char.isalnum() and not Char in '_.':\r
719 return False\r
720 if Char == '.' and not Quoted:\r
721 return False\r
722 return True\r
723\r
fe90f483
HC
724#\r
725# Check if a UTF16-LE file has a BOM header\r
726#\r
727def CheckUTF16FileHeader(File):\r
728 FileIn = open(File, 'rb').read(2)\r
729 if FileIn != '\xff\xfe':\r
730 return False\r
731\r
732 return True\r