fac5025312208c608e979591611ef89837733e74
[people/mcb30/basetools.git] / Source / Python / AutoGen / StrGather.py
1 # Copyright (c) 2007, Intel Corporation\r
2 # All rights reserved. This program and the accompanying materials\r
3 # are licensed and made available under the terms and conditions of the BSD License\r
4 # which accompanies this distribution.  The full text of the license may be found at\r
5 # http://opensource.org/licenses/bsd-license.php\r
6 #\r
7 # THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
8 # WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
9 \r
10 #\r
11 #This file is used to parse a strings file and create or add to a string database file.\r
12 #\r
13 \r
14 import re\r
15 import Common.EdkLogger as EdkLogger\r
16 from Common.BuildToolError import *\r
17 from UniClassObject import *\r
18 \r
19 HexHeader = '0x'\r
20 \r
21 COMMENT = '// '\r
22 DEFINE_STR = '#define'\r
23 COMMENT_DEFINE_STR = COMMENT + DEFINE_STR\r
24 NOT_REFERENCED = 'not referenced'\r
25 COMMENT_NOT_REFERENCED = ' ' + COMMENT + NOT_REFERENCED\r
26 CHAR_ARRAY_DEFIN = 'unsigned char'\r
27 COMMON_FILE_NAME = 'Strings'\r
28 OFFSET = 'offset'\r
29 STRING = 'string'\r
30 TO = 'to'\r
31 STRING_TOKEN = re.compile('STRING_TOKEN *\(([A-Z0-9_]+) *\)', re.MULTILINE | re.UNICODE)\r
32 \r
33 LENGTH_EFI_HII_STRING_PACK_HEADER = 22\r
34 LENGTH_STRING_OFFSET = 4\r
35 \r
36 H_C_FILE_HEADER = ['//', \\r
37                    '//  DO NOT EDIT -- auto-generated file', \\r
38                    '//', \\r
39                    '//  This file is generated by the string gather utility', \\r
40                    '//']\r
41 LANGUAGE_NAME_STRING_NAME = '$LANGUAGE_NAME'\r
42 PRINTABLE_LANGUAGE_NAME_STRING_NAME = '$PRINTABLE_LANGUAGE_NAME'\r
43 \r
44 def DecToHexStr(Dec, Digit):\r
45     return eval("'0x%0" + str(Digit) + "X' % int(Dec)")\r
46 \r
47 def DecToHexList(Dec):\r
48     Hex = "%08X" % int(Dec)\r
49     List = [HexHeader + Hex[6:8], HexHeader + Hex[4:6], HexHeader + Hex[2:4], HexHeader + Hex[0:2]]\r
50     return List\r
51 \r
52 def CreateHFileHeader(BaseName):\r
53     Str = ''\r
54     for Item in H_C_FILE_HEADER:\r
55         Str = WriteLine(Str, Item)\r
56     Str = WriteLine(Str, '#ifndef _' + BaseName.upper() + '_STRINGS_DEFINE_H_')\r
57     Str = WriteLine(Str, '#define _' + BaseName.upper() + '_STRINGS_DEFINE_H_')\r
58     return Str\r
59 \r
60 def CreateHFileContent(BaseName, UniObjectClass):\r
61     Str = ''\r
62     ValueStartPtr = 60\r
63     Line = COMMENT_DEFINE_STR + ' ' + LANGUAGE_NAME_STRING_NAME + ' ' * (ValueStartPtr - len(DEFINE_STR + LANGUAGE_NAME_STRING_NAME)) + DecToHexStr(0, 4) + COMMENT_NOT_REFERENCED\r
64     Str = WriteLine(Str, Line)\r
65     Line = COMMENT_DEFINE_STR + ' ' + PRINTABLE_LANGUAGE_NAME_STRING_NAME + ' ' * (ValueStartPtr - len(DEFINE_STR + PRINTABLE_LANGUAGE_NAME_STRING_NAME)) + DecToHexStr(1, 4) + COMMENT_NOT_REFERENCED\r
66     Str = WriteLine(Str, Line)\r
67     for Index in range(2, len(UniObjectClass.OrderedStringList[UniObjectClass.LanguageDef[0][0]])):\r
68         StringItem = UniObjectClass.OrderedStringList[UniObjectClass.LanguageDef[0][0]][Index]\r
69         Name = StringItem.StringName\r
70         Token = StringItem.Token\r
71         Referenced = StringItem.Referenced\r
72         if Name != None:\r
73             Line = ''\r
74             if Referenced == True:\r
75                 Line = DEFINE_STR + ' ' + Name + ' ' * (ValueStartPtr - len(DEFINE_STR + Name)) + DecToHexStr(Token, 4)\r
76             else:\r
77                 Line = COMMENT_DEFINE_STR + ' ' + Name + ' ' * (ValueStartPtr - len(DEFINE_STR + Name)) + DecToHexStr(Token, 4) + COMMENT_NOT_REFERENCED\r
78             Str = WriteLine(Str, Line)\r
79     \r
80     Str =  WriteLine(Str, '')\r
81     Str = WriteLine(Str, 'extern unsigned char ' + BaseName + 'Strings[];')\r
82     return Str\r
83 \r
84 def CreateHFile(BaseName, UniObjectClass):\r
85     #HFile = WriteLine('', CreateHFileHeader(BaseName))\r
86     HFile = WriteLine('', CreateHFileContent(BaseName, UniObjectClass))\r
87     #HFile = WriteLine(HFile, '#endif')\r
88     return HFile\r
89 \r
90 def CreateCFileHeader():\r
91     Str = ''\r
92     for Item in H_C_FILE_HEADER:\r
93         Str = WriteLine(Str, Item)\r
94     \r
95     return Str\r
96   \r
97 def CreateArrayItem(Value, Width = 16):\r
98     MaxLength = Width\r
99     Index = 0\r
100     Line = '  '\r
101     ArrayItem = ''\r
102     \r
103     for Item in Value:\r
104         if Index < MaxLength:\r
105             Line = Line + Item + ', '\r
106             Index = Index + 1\r
107         else:\r
108             ArrayItem = WriteLine(ArrayItem, Line)\r
109             Line = '  ' + Item +  ', '\r
110             Index = 1\r
111     ArrayItem = Write(ArrayItem, Line.rstrip())\r
112     \r
113     return ArrayItem\r
114 \r
115 def CreateCFileStringDef(Name, Offset, Token, UseOtherLangDef = ''):\r
116     Comment = ''\r
117     if UseOtherLangDef != '':\r
118         Comment = ' - not defined for this language -- using secondary language ' + UniToStr(UseOtherLangDef) + ' definition'\r
119     Str = Write('', CreateArrayItem(DecToHexList(Offset)) + '  ' + COMMENT + 'offset to string ' + Name + ' (' + DecToHexStr(Token, 4) + ')' + Comment)\r
120 \r
121     return Str\r
122     \r
123 def CreateCFileStringValue(Name, Language, Value, Offset):    \r
124     Str = WriteLine('  ', COMMENT + STRING + ' ' + Name + ' ' + OFFSET + ' ' + DecToHexStr(Offset, 8))\r
125     Str = WriteLine(Str, CreateArrayItem(Value))\r
126     \r
127     return Str\r
128 \r
129 def CreateCFileContent(BaseName, UniObjectClass):\r
130     Str = ''\r
131 \r
132     Str = WriteLine(Str, CHAR_ARRAY_DEFIN + ' ' + BaseName + COMMON_FILE_NAME + '[] = {\n' )\r
133     for IndexI in range(len(UniObjectClass.LanguageDef)):\r
134         Language = UniObjectClass.LanguageDef[IndexI][0]\r
135         LangPrintName = UniObjectClass.LanguageDef[IndexI][1]\r
136         Length = 0\r
137         NameLength = 0\r
138         Count = 0\r
139         for Item in UniObjectClass.OrderedStringList[Language]:\r
140             if Item.Referenced:\r
141                 Length = Length + Item.Length\r
142                 Count = Count + 1\r
143 \r
144         Str = WriteLine(Str, '//******************************************************************************')\r
145         Str = WriteLine(Str, COMMENT + 'Start of string definitions for ' + Language)\r
146         \r
147         #\r
148         # EFI_HII_STRING_PACK_HEADER\r
149         #\r
150         Offset = LENGTH_EFI_HII_STRING_PACK_HEADER + LENGTH_STRING_OFFSET * Count\r
151         Length = Offset + Length\r
152         List = DecToHexList(Length) + DecToHexList(2)[0:2] + DecToHexList(Offset) + DecToHexList(Offset + len(UniToHexList(Language)) + 2) + DecToHexList(Count) + DecToHexList(0)\r
153         Str = WriteLine(Str, CreateArrayItem(List, 8))\r
154         \r
155         Str = WriteLine(Str, '  // offset 0x16')\r
156         StrStringDef = ''\r
157         StrStringValue = ''\r
158         for Item in UniObjectClass.OrderedStringList[Language]:\r
159             Name = Item.StringName\r
160             Value = Item.StringValueByteList\r
161             Referenced = Item.Referenced\r
162             Token = Item.Token\r
163             Length = Item.Length\r
164             UseOtherLangDef = Item.UseOtherLangDef\r
165              \r
166             if Referenced:\r
167                 StrStringDef = WriteLine(StrStringDef, CreateCFileStringDef(Name, Offset, Token, UseOtherLangDef))\r
168                 StrStringValue = Write(StrStringValue, CreateCFileStringValue(Name, Language, Value, Offset))\r
169                 Offset = Offset + Length\r
170             else:\r
171                 StrStringDef = WriteLine(StrStringDef, '  ' + COMMENT + Name + ' ' + NOT_REFERENCED)\r
172 \r
173         Str = WriteLine(Str, StrStringDef)\r
174         Str = WriteLine(Str, StrStringValue)\r
175     return Str\r
176 \r
177 def CreateCFileEnd():\r
178     Str = WriteLine('  ', '// strings terminator pack')\r
179     Str = WriteLine(Str, '  ' + '0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ')\r
180     Str = WriteLine(Str, '  ' + '0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ')\r
181     Str = Write(Str, '};')\r
182     return Str\r
183 \r
184 def CreateCFile(BaseName, UniObjectClass):\r
185     #CFile = WriteLine('', CreateCFileHeader())\r
186     CFile = WriteLine('', CreateCFileContent(BaseName, UniObjectClass))\r
187     CFile = WriteLine(CFile, CreateCFileEnd())\r
188     return CFile\r
189 \r
190 def GetFileList(IncludeList, SkipList):\r
191     if IncludeList == None:\r
192         raise AutoGenError("Include path for unicode file is not defined")\r
193     \r
194     FileList = []\r
195     if SkipList == None:\r
196         SkipList = []\r
197         \r
198     for Dir in IncludeList:\r
199         for File in os.listdir(Dir):\r
200             File = os.path.join(Dir, os.path.normcase(File))\r
201             #\r
202             # Ignore Dir\r
203             #\r
204             if os.path.isfile(File) != True:\r
205                 continue\r
206             #\r
207             # Ignore file listed in skip list\r
208             #\r
209             IsSkip = False\r
210             for Skip in SkipList:\r
211                 if os.path.splitext(File)[1].upper() == Skip.upper():\r
212                     IsSkip = True\r
213                     break\r
214             \r
215             if not IsSkip:\r
216                 FileList.append(File)\r
217     \r
218     return FileList\r
219 \r
220 def SearchString(UniObjectClass, FileList):\r
221     if FileList == []:\r
222         return UniObjectClass\r
223     \r
224     for File in FileList:\r
225         if os.path.isfile(File):\r
226             Lines = open(File, 'r')\r
227             for Line in Lines:\r
228                 StringTokenList = STRING_TOKEN.findall(Line)\r
229                 for StrName in StringTokenList:\r
230                     EdkLogger.debug(EdkLogger.DEBUG_5, "Found string identifier: " + StrName)\r
231                     UniObjectClass.SetStringReferenced(StrName)\r
232     \r
233     UniObjectClass.ReToken()\r
234     \r
235     return UniObjectClass\r
236 \r
237 def GetStringFiles(UniFilList, IncludeList, SkipList, BaseName):\r
238     Status = True\r
239     ErrorMessage = ''\r
240     \r
241     if len(UniFilList) > 0:\r
242         Uni = UniFileClassObject(UniFilList)\r
243     else:\r
244         raise AutoGenError('No unicode files given')\r
245     \r
246     FileList = GetFileList(IncludeList, SkipList)\r
247     \r
248     Uni = SearchString(Uni, FileList)\r
249     \r
250     HFile = CreateHFile(BaseName, Uni)\r
251     CFile = CreateCFile(BaseName, Uni)\r
252     \r
253     return HFile, CFile\r
254 \r
255 def Write(Target, Item):\r
256     return Target + Item\r
257 \r
258 def WriteLine(Target, Item):\r
259     return Target + Item + '\n'\r
260     \r
261 # This acts like the main() function for the script, unless it is 'import'ed into another\r
262 # script.\r
263 if __name__ == '__main__':\r
264     EdkLogger.info('start')\r
265     \r
266 #    UniFileList = [\r
267 #        r'E:\SRC\r9prime\verify\LakeportX64Dev\LakeportX64Pkg\SmbiosMiscDxe\SmbiosMiscStrings.uni',\r
268 #        r'E:\SRC\r9prime\verify\LakeportX64Dev\LakeportX64Pkg\SmbiosMiscDxe\MiscOemString.uni',\r
269 #        r'E:\SRC\r9prime\verify\LakeportX64Dev\LakeportX64Pkg\SmbiosMiscDxe\MiscSystemOptionString.uni',\r
270 #        r'E:\SRC\r9prime\verify\LakeportX64Dev\LakeportX64Pkg\SmbiosMiscDxe\MiscOnboardDevice.uni',\r
271 #        r'E:\SRC\r9prime\verify\LakeportX64Dev\LakeportX64Pkg\SmbiosMiscDxe\MiscSystemSlotOnboardDevices.uni',\r
272 #        r'E:\SRC\r9prime\verify\LakeportX64Dev\LakeportX64Pkg\SmbiosMiscDxe\MiscBiosVendor.uni',\r
273 #        r'E:\SRC\r9prime\verify\LakeportX64Dev\LakeportX64Pkg\SmbiosMiscDxe\MiscChassisManufacturer.uni',\r
274 #        r'E:\SRC\r9prime\verify\LakeportX64Dev\LakeportX64Pkg\SmbiosMiscDxe\MiscSystemSlotDesignation.uni',\r
275 #        r'E:\SRC\r9prime\verify\LakeportX64Dev\LakeportX64Pkg\SmbiosMiscDxe\MiscPortInternalConnectorDesignator.uni',\r
276 #        r'E:\SRC\r9prime\verify\LakeportX64Dev\LakeportX64Pkg\SmbiosMiscDxe\MiscSystemManufacturer.uni',\r
277 #    ]\r
278 #    IncludeList = [\r
279 #        r'E:\SRC\r9prime\verify\LakeportX64Dev\LakeportX64Pkg\SmbiosMiscDxe',\r
280 #        r'E:\SRC\r9prime\verify\LakeportX64Dev\Build\LakeportX64Pkg\DEBUG_MYTOOLS\X64\LakeportX64Pkg\SmbiosMiscDxe\SmbiosMiscDxe\DEBUG',\r
281 #        r'E:\SRC\r9prime\verify\LakeportX64Dev\MdePkg',\r
282 #        r'E:\SRC\r9prime\verify\LakeportX64Dev\MdePkg\Include\x64',\r
283 #        r'E:\SRC\r9prime\verify\LakeportX64Dev\MdePkg\Include',\r
284 #        r'E:\SRC\r9prime\verify\LakeportX64Dev\IntelFrameworkPkg',\r
285 #        r'E:\SRC\r9prime\verify\LakeportX64Dev\IntelFrameworkPkg\Include',\r
286 #        r'E:\SRC\r9prime\verify\LakeportX64Dev\MdeModulePkg',\r
287 #        r'E:\SRC\r9prime\verify\LakeportX64Dev\MdeModulePkg\Include',\r
288 #        r'E:\SRC\r9prime\verify\LakeportX64Dev\LakeportX64Pkg',\r
289 #        r'E:\SRC\r9prime\verify\LakeportX64Dev\LakeportX64Pkg\Include',\r
290 #    ]\r
291     \r
292     UniFileList = [\r
293         r'C:\SVN\EDKII\Nt32Pkg\PlatformBdsDxe\Generic\FrontPageStrings.uni',\r
294         r'C:\SVN\EDKII\Nt32Pkg\PlatformBdsDxe\Generic\Strings.uni',\r
295         r'C:\SVN\EDKII\Nt32Pkg\PlatformBdsDxe\Generic\DeviceMngr\DeviceManagerStrings.uni',\r
296         r'C:\SVN\EDKII\Nt32Pkg\PlatformBdsDxe\Generic\BootMngr\BootManagerStrings.uni',\r
297         r'C:\SVN\EDKII\Nt32Pkg\PlatformBdsDxe\Generic\FrontPageStrings.uni',\r
298         r'C:\SVN\EDKII\Nt32Pkg\PlatformBdsDxe\Generic\BootMaint\bmstring.uni'\r
299     ]\r
300 \r
301     IncludeList = [\r
302         r'C:\SVN\EDKII\Nt32Pkg\PlatformBdsDxe\Generic\BootMngr',\r
303         r'C:\SVN\EDKII\Nt32Pkg\PlatformBdsDxe\Generic',\r
304         r'C:\SVN\EDKII\Nt32Pkg\PlatformBdsDxe\Generic\DeviceMngr',\r
305         r'C:\SVN\EDKII\Nt32Pkg\PlatformBdsDxe\Generic\BootMaint',\r
306         r'C:\SVN\EDKII\Nt32Pkg\PlatformBdsDxe',\r
307         r'C:\SVN\EDKII\Build\NT32\DEBUG_MYTOOLS\IA32\Nt32Pkg\PlatformBdsDxe\PlatformBdsDxe\DEBUG',\r
308         r'C:\SVN\EDKII\Nt32Pkg',\r
309         r'C:\SVN\EDKII\Nt32Pkg\Include',\r
310         r'C:\SVN\EDKII\MdePkg',\r
311         r'C:\SVN\EDKII\MdePkg\Include',\r
312         r'C:\SVN\EDKII\MdePkg\Include\Ia32',\r
313         r'C:\SVN\EDKII\IntelFrameworkPkg',\r
314         r'C:\SVN\EDKII\IntelFrameworkPkg\Include',\r
315         r'C:\SVN\EDKII\IntelFrameworkModulePkg',\r
316         r'C:\SVN\EDKII\IntelFrameworkModulePkg\Include',\r
317         r'C:\SVN\EDKII\MdeModulePkg',\r
318         r'C:\SVN\EDKII\MdeModulePkg\Include'\r
319     ]\r
320     \r
321     SkipList = ['.inf', '.uni']\r
322     BaseName = 'SetupBrowser'\r
323     (h, c) = GetStringFiles(UniFileList, IncludeList, SkipList, BaseName)\r
324     hfile = open('unistring.h', 'w')\r
325     cfile = open('unistring.c', 'w')\r
326     hfile.write(h)\r
327     cfile.write(c)\r
328     \r
329     EdkLogger.info('end')\r