]> git.proxmox.com Git - mirror_edk2.git/blame - BaseTools/Source/C/Common/PcdValueCommon.c
BaseTools/C/Common: Fix potential memory leak
[mirror_edk2.git] / BaseTools / Source / C / Common / PcdValueCommon.c
CommitLineData
309e37a2
LG
1/** @file\r
2This file contains the PcdValue structure definition.\r
3\r
1f7e7e70 4Copyright (c) 2017 - 2018, Intel Corporation. All rights reserved.<BR>\r
309e37a2
LG
5\r
6This program and the accompanying materials\r
7are licensed and made available under the terms and conditions of the BSD License\r
8which accompanies this distribution. The full text of the license may be found at\r
9http://opensource.org/licenses/bsd-license.php\r
10\r
11THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
12WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
13\r
14**/\r
15\r
16#include <stdio.h>\r
17#include <string.h>\r
18#include <stdlib.h>\r
19#include "CommonLib.h"\r
20#include "PcdValueCommon.h"\r
21\r
22typedef enum {\r
23 PcdDataTypeBoolean,\r
24 PcdDataTypeUint8,\r
25 PcdDataTypeUint16,\r
26 PcdDataTypeUint32,\r
27 PcdDataTypeUint64,\r
28 PcdDataTypePointer\r
29} PCD_DATA_TYPE;\r
30\r
31typedef struct {\r
32 CHAR8 *SkuName;\r
33 CHAR8 *DefaultValueName;\r
34 CHAR8 *TokenSpaceGuidName;\r
35 CHAR8 *TokenName;\r
36 CHAR8 *DataType;\r
37 CHAR8 *Value;\r
38 PCD_DATA_TYPE PcdDataType;\r
39} PCD_ENTRY;\r
40\r
41PCD_ENTRY *PcdList;\r
42UINT32 PcdListLength;\r
43\r
44VOID\r
45STATIC\r
46RecordToken (\r
47 UINT8 *FileBuffer,\r
48 UINT32 PcdIndex,\r
49 UINT32 TokenIndex,\r
50 UINT32 TokenStart,\r
51 UINT32 TokenEnd\r
52 )\r
53/*++\r
54\r
55Routine Description:\r
56\r
57 Record new token information\r
58\r
59Arguments:\r
60\r
61 FileBuffer File Buffer to be record\r
62 PcdIndex Index of PCD in database\r
63 TokenIndex Index of Token\r
64 TokenStart Start of Token\r
65 TokenEnd End of Token\r
66\r
67Returns:\r
68\r
69 None\r
70--*/\r
71{\r
72 CHAR8 *Token;\r
73\r
74 Token = malloc (TokenEnd - TokenStart + 1);\r
75 memcpy (Token, &FileBuffer[TokenStart], TokenEnd - TokenStart);\r
76 Token[TokenEnd - TokenStart] = 0;\r
77 switch (TokenIndex) {\r
78 case 0:\r
79 PcdList[PcdIndex].SkuName = Token;\r
80 break;\r
81 case 1:\r
82 PcdList[PcdIndex].DefaultValueName = Token;\r
83 break;\r
84 case 2:\r
85 PcdList[PcdIndex].TokenSpaceGuidName = Token;\r
86 break;\r
87 case 3:\r
88 PcdList[PcdIndex].TokenName = Token;\r
89 break;\r
90 case 4:\r
91 PcdList[PcdIndex].DataType = Token;\r
92 if (strcmp (Token, "BOOLEAN") == 0) {\r
93 PcdList[PcdIndex].PcdDataType = PcdDataTypeBoolean;\r
94 } else if (strcmp (Token, "UINT8") == 0) {\r
95 PcdList[PcdIndex].PcdDataType = PcdDataTypeUint8;\r
96 } else if (strcmp (Token, "UINT16") == 0) {\r
97 PcdList[PcdIndex].PcdDataType = PcdDataTypeUint16;\r
98 } else if (strcmp (Token, "UINT32") == 0) {\r
99 PcdList[PcdIndex].PcdDataType = PcdDataTypeUint32;\r
100 } else if (strcmp (Token, "UINT64") == 0) {\r
101 PcdList[PcdIndex].PcdDataType = PcdDataTypeUint64;\r
102 } else {\r
103 PcdList[PcdIndex].PcdDataType = PcdDataTypePointer;\r
104 }\r
105 break;\r
106 case 5:\r
107 PcdList[PcdIndex].Value = Token;\r
108 break;\r
1f7e7e70
HW
109 default:\r
110 free (Token);\r
111 break;\r
309e37a2
LG
112 }\r
113}\r
114\r
115int\r
116STATIC\r
117LookupPcdIndex (\r
118 CHAR8 *SkuName OPTIONAL,\r
119 CHAR8 *DefaultValueName OPTIONAL,\r
120 CHAR8 *TokenSpaceGuidName,\r
121 CHAR8 *TokenName\r
122 )\r
123/*++\r
124\r
125Routine Description:\r
126\r
127 Get PCD index in Pcd database\r
128\r
129Arguments:\r
130\r
131 SkuName SkuName String\r
132 DefaultValueName DefaultValueName String\r
133 TokenSpaceGuidName TokenSpaceGuidName String\r
134 TokenName TokenName String\r
135\r
136Returns:\r
137\r
138 Index of PCD in Pcd database\r
139--*/\r
140{\r
141 UINT32 Index;\r
142\r
143 if (SkuName == NULL) {\r
144 SkuName = "DEFAULT";\r
145 }\r
146 if (DefaultValueName == NULL) {\r
147 DefaultValueName = "DEFAULT";\r
148 }\r
149 for (Index = 0; Index < PcdListLength; Index++) {\r
150 if (strcmp(PcdList[Index].TokenSpaceGuidName, TokenSpaceGuidName) != 0) {\r
151 continue;\r
152 }\r
153 if (strcmp(PcdList[Index].TokenName, TokenName) != 0) {\r
154 continue;\r
155 }\r
156 if (strcmp(PcdList[Index].SkuName, SkuName) != 0) {\r
157 continue;\r
158 }\r
159 if (strcmp(PcdList[Index].DefaultValueName, DefaultValueName) != 0) {\r
160 continue;\r
161 }\r
162 return Index;\r
163 }\r
164 return -1;\r
165}\r
166\r
167UINT64\r
168__PcdGet (\r
169 CHAR8 *SkuName OPTIONAL,\r
170 CHAR8 *DefaultValueName OPTIONAL,\r
171 CHAR8 *TokenSpaceGuidName,\r
172 CHAR8 *TokenName\r
173 )\r
174/*++\r
175\r
176Routine Description:\r
177\r
178 Get PCD value\r
179\r
180Arguments:\r
181\r
182 SkuName SkuName String\r
183 DefaultValueName DefaultValueName String\r
184 TokenSpaceGuidName TokenSpaceGuidName String\r
185 TokenName TokenName String\r
186\r
187Returns:\r
188\r
189 PCD value\r
190--*/\r
191{\r
192 int Index;\r
193 CHAR8 *End;\r
194\r
195 Index = LookupPcdIndex (SkuName, DefaultValueName, TokenSpaceGuidName, TokenName);\r
196 if (Index < 0) {\r
197 fprintf (stderr, "PCD %s.%s.%s.%s is not in database\n", SkuName, DefaultValueName, TokenSpaceGuidName, TokenName);\r
198 exit (EXIT_FAILURE);\r
199 }\r
200 switch (PcdList[Index].PcdDataType) {\r
201 case PcdDataTypeBoolean:\r
202 case PcdDataTypeUint8:\r
203 case PcdDataTypeUint16:\r
204 case PcdDataTypeUint32:\r
205 return (UINT64)strtoul(PcdList[Index].Value, &End, 16);\r
206 break;\r
207 case PcdDataTypeUint64:\r
208 return (UINT64)strtoul(PcdList[Index].Value, &End, 16);\r
209 break;\r
210 case PcdDataTypePointer:\r
211 fprintf (stderr, "PCD %s.%s.%s.%s is structure. Use PcdGetPtr()\n", SkuName, DefaultValueName, TokenSpaceGuidName, TokenName);\r
212 exit (EXIT_FAILURE);\r
213 break;\r
214 }\r
215 return 0;\r
216}\r
217\r
218VOID\r
219__PcdSet (\r
220 CHAR8 *SkuName OPTIONAL,\r
221 CHAR8 *DefaultValueName OPTIONAL,\r
222 CHAR8 *TokenSpaceGuidName,\r
223 CHAR8 *TokenName,\r
224 UINT64 Value\r
225 )\r
226/*++\r
227\r
228Routine Description:\r
229\r
230 Set PCD value\r
231\r
232Arguments:\r
233\r
234 SkuName SkuName String\r
235 DefaultValueName DefaultValueName String\r
236 TokenSpaceGuidName TokenSpaceGuidName String\r
237 TokenName TokenName String\r
238 Value PCD value to be set\r
239\r
240Returns:\r
241\r
242 None\r
243--*/\r
244{\r
245 int Index;\r
246\r
247 Index = LookupPcdIndex (SkuName, DefaultValueName, TokenSpaceGuidName, TokenName);\r
248 if (Index < 0) {\r
249 fprintf (stderr, "PCD %s.%s.%s.%s is not in database\n", SkuName, DefaultValueName, TokenSpaceGuidName, TokenName);\r
250 exit (EXIT_FAILURE);\r
251 }\r
252 free(PcdList[Index].Value);\r
253 PcdList[Index].Value = malloc(20);\r
254 switch (PcdList[Index].PcdDataType) {\r
255 case PcdDataTypeBoolean:\r
256 if (Value == 0) {\r
257 strcpy (PcdList[Index].Value, "0x00");\r
258 } else {\r
259 strcpy (PcdList[Index].Value, "0x01");\r
260 }\r
261 break;\r
262 case PcdDataTypeUint8:\r
263 sprintf(PcdList[Index].Value, "0x%02x", (UINT8)(Value & 0xff));\r
264 break;\r
265 case PcdDataTypeUint16:\r
266 sprintf(PcdList[Index].Value, "0x%04x", (UINT16)(Value & 0xffff));\r
267 break;\r
268 case PcdDataTypeUint32:\r
269 sprintf(PcdList[Index].Value, "0x%08x", (UINT32)(Value & 0xffffffff));\r
270 break;\r
271 case PcdDataTypeUint64:\r
beacbc74 272 sprintf(PcdList[Index].Value, "0x%016llx", (unsigned long long)Value);\r
309e37a2
LG
273 break;\r
274 case PcdDataTypePointer:\r
275 fprintf (stderr, "PCD %s.%s.%s.%s is structure. Use PcdSetPtr()\n", SkuName, DefaultValueName, TokenSpaceGuidName, TokenName);\r
276 exit (EXIT_FAILURE);\r
277 break;\r
278 }\r
279}\r
280\r
281VOID *\r
282__PcdGetPtr (\r
283 CHAR8 *SkuName OPTIONAL,\r
284 CHAR8 *DefaultValueName OPTIONAL,\r
285 CHAR8 *TokenSpaceGuidName,\r
286 CHAR8 *TokenName,\r
287 UINT32 *Size\r
288 )\r
289/*++\r
290\r
291Routine Description:\r
292\r
293 Get PCD value buffer\r
294\r
295Arguments:\r
296\r
297 SkuName SkuName String\r
298 DefaultValueName DefaultValueName String\r
299 TokenSpaceGuidName TokenSpaceGuidName String\r
300 TokenName TokenName String\r
301 Size Size of PCD value buffer\r
302\r
303Returns:\r
304\r
305 PCD value buffer\r
306--*/\r
307{\r
308 int Index;\r
309 CHAR8 *Value;\r
310 UINT8 *Buffer;\r
311 CHAR8 *End;\r
312 UINT8 Byte;\r
313\r
314 Index = LookupPcdIndex (SkuName, DefaultValueName, TokenSpaceGuidName, TokenName);\r
315 if (Index < 0) {\r
316 fprintf (stderr, "PCD %s.%s.%s.%s is not in database\n", SkuName, DefaultValueName, TokenSpaceGuidName, TokenName);\r
317 exit (EXIT_FAILURE);\r
318 }\r
319 switch (PcdList[Index].PcdDataType) {\r
320 case PcdDataTypeBoolean:\r
321 case PcdDataTypeUint8:\r
322 case PcdDataTypeUint16:\r
323 case PcdDataTypeUint32:\r
324 case PcdDataTypeUint64:\r
325 fprintf (stderr, "PCD %s.%s.%s.%s is a value. Use PcdGet()\n", SkuName, DefaultValueName, TokenSpaceGuidName, TokenName);\r
326 exit (EXIT_FAILURE);\r
327 break;\r
328 case PcdDataTypePointer:\r
329 Value = &PcdList[Index].Value[1];\r
330 printf ("Value = %s\n", PcdList[Index].Value);\r
331 for (*Size = 0, Byte = (UINT8) strtoul(Value, &End, 16); Value != End; Byte = (UINT8) strtoul(Value, &End, 16), *Size = *Size + 1) {\r
332 printf("%x\n", Byte);\r
333 Value = End + 1;\r
334 }\r
335 Buffer = malloc(*Size);\r
336 Value = &PcdList[Index].Value[1];\r
337 for (*Size = 0, Buffer[*Size] = (UINT8) strtoul(Value, &End, 16); Value != End; *Size = *Size + 1, Buffer[*Size] = (UINT8) strtoul(Value, &End, 16)) {\r
338 Value = End + 1;\r
339 }\r
340 return Buffer;\r
341 }\r
342 *Size = 0;\r
343 return 0;\r
344}\r
345\r
346VOID\r
347__PcdSetPtr (\r
348 CHAR8 *SkuName OPTIONAL,\r
349 CHAR8 *DefaultValueName OPTIONAL,\r
350 CHAR8 *TokenSpaceGuidName,\r
351 CHAR8 *TokenName,\r
352 UINT32 Size,\r
353 UINT8 *Value\r
354 )\r
355/*++\r
356\r
357Routine Description:\r
358\r
359 Set PCD value buffer\r
360\r
361Arguments:\r
362\r
363 SkuName SkuName String\r
364 DefaultValueName DefaultValueName String\r
365 TokenSpaceGuidName TokenSpaceGuidName String\r
366 TokenName TokenName String\r
367 Size Size of PCD value\r
368 Value Pointer to the updated PCD value buffer\r
369\r
370Returns:\r
371\r
372 None\r
373--*/\r
374{\r
375 int Index;\r
376 UINT32 ValueIndex;\r
377\r
378 Index = LookupPcdIndex (SkuName, DefaultValueName, TokenSpaceGuidName, TokenName);\r
379 if (Index < 0) {\r
380 fprintf (stderr, "PCD %s.%s.%s.%s is not in database\n", SkuName, DefaultValueName, TokenSpaceGuidName, TokenName);\r
381 exit (EXIT_FAILURE);\r
382 }\r
383 switch (PcdList[Index].PcdDataType) {\r
384 case PcdDataTypeBoolean:\r
385 case PcdDataTypeUint8:\r
386 case PcdDataTypeUint16:\r
387 case PcdDataTypeUint32:\r
388 case PcdDataTypeUint64:\r
389 fprintf (stderr, "PCD %s.%s.%s.%s is a value. Use PcdGet()\n", SkuName, DefaultValueName, TokenSpaceGuidName, TokenName);\r
390 exit (EXIT_FAILURE);\r
391 break;\r
392 case PcdDataTypePointer:\r
393 free(PcdList[Index].Value);\r
394 PcdList[Index].Value = malloc(Size * 5 + 3);\r
395 PcdList[Index].Value[0] = '{';\r
396 for (ValueIndex = 0; ValueIndex < Size; ValueIndex++) {\r
397 printf("Value[%d] = %02x\n", ValueIndex, Value[ValueIndex]);\r
398 sprintf(&PcdList[Index].Value[1 + ValueIndex * 5], "0x%02x,", Value[ValueIndex]);\r
399 }\r
400 PcdList[Index].Value[1 + Size * 5 - 1] = '}';\r
401 PcdList[Index].Value[1 + Size * 5 ] = 0;\r
402 break;\r
403 }\r
404}\r
405\r
406VOID\r
407STATIC\r
408ReadInputFile (\r
409 CHAR8 *InputFileName,\r
410 UINT8 **FileBuffer,\r
411 UINT32 *FileSize\r
412 )\r
413/*++\r
414\r
415Routine Description:\r
416\r
417 Read the file buffer from the input file.\r
418\r
419Arguments:\r
420\r
421 InputFileName Point to the input file name.\r
422 FileBuffer Point to the input file buffer.\r
423 FileSize Size of the file buffer.\r
424\r
425Returns:\r
426\r
427 None\r
428--*/\r
429{\r
430 FILE *InputFile;\r
431 UINT32 BytesRead;\r
432\r
433 //\r
434 // Open Input file and read file data.\r
435 //\r
436 InputFile = fopen (InputFileName, "rb");\r
437 if (InputFile == NULL) {\r
438 fprintf (stderr, "Error opening file %s\n", InputFileName);\r
439 exit (EXIT_FAILURE);\r
440 }\r
441\r
442 //\r
443 // Go to the end so that we can determine the file size\r
444 //\r
445 if (fseek (InputFile, 0, SEEK_END)) {\r
446 fprintf (stderr, "Error reading input file %s\n", InputFileName);\r
447 fclose (InputFile);\r
448 exit (EXIT_FAILURE);\r
449 }\r
450\r
451 //\r
452 // Get the file size\r
453 //\r
454 *FileSize = ftell (InputFile);\r
455 if (*FileSize == -1) {\r
456 fprintf (stderr, "Error parsing the input file %s\n", InputFileName);\r
457 fclose (InputFile);\r
458 exit (EXIT_FAILURE);\r
459 }\r
460\r
461 //\r
462 // Allocate a buffer\r
463 //\r
464 *FileBuffer = malloc (*FileSize);\r
465 if (*FileBuffer == NULL) {\r
466 fprintf (stderr, "Can not allocate buffer for input input file %s\n", InputFileName);\r
467 fclose (InputFile);\r
468 exit (EXIT_FAILURE);\r
469 }\r
470\r
471 //\r
472 // Reset to the beginning of the file\r
473 //\r
474 if (fseek (InputFile, 0, SEEK_SET)) {\r
475 fprintf (stderr, "Error reading the input file %s\n", InputFileName);\r
476 fclose (InputFile);\r
477 free (*FileBuffer);\r
478 exit (EXIT_FAILURE);\r
479 }\r
480\r
481 //\r
482 // Read all of the file contents.\r
483 //\r
484 BytesRead = fread (*FileBuffer, sizeof (UINT8), *FileSize, InputFile);\r
485 if (BytesRead != *FileSize * sizeof (UINT8)) {\r
486 fprintf (stderr, "Error reading the input file %s\n", InputFileName);\r
487 fclose (InputFile);\r
488 free (*FileBuffer);\r
489 exit (EXIT_FAILURE);\r
490 }\r
491\r
492 //\r
493 // Close the file\r
494 //\r
495 fclose (InputFile);\r
496}\r
497\r
498VOID\r
499STATIC\r
500ParseFile (\r
501 UINT8 *FileBuffer,\r
502 UINT32 FileSize\r
503 )\r
504/*++\r
505\r
506Routine Description:\r
507\r
508 Read the initial PCD value from the input file buffer.\r
509\r
510Arguments:\r
511\r
512 FileBuffer Point to the input file buffer.\r
513 FileSize Size of the file buffer.\r
514\r
515Returns:\r
516\r
517 None\r
518--*/\r
519{\r
520 UINT32 Index;\r
521 UINT32 NumLines;\r
522 UINT32 TokenIndex;\r
523 UINT32 TokenStart;\r
524\r
525 for (Index = 0, NumLines = 0; Index < FileSize; Index++) {\r
526 if (FileBuffer[Index] == '\n') {\r
527 NumLines++;\r
528 }\r
529 }\r
530 PcdList = malloc((NumLines + 1) * sizeof(PcdList[0]));\r
531\r
532 for (Index = 0, TokenIndex = 0, PcdListLength = 0, TokenStart = 0; Index < FileSize; Index++) {\r
533 if (FileBuffer[Index] == ' ') {\r
534 continue;\r
535 }\r
536 if (FileBuffer[Index] == '|' || FileBuffer[Index] == '.' || FileBuffer[Index] == '\n' || FileBuffer[Index] == '\r') {\r
537 RecordToken (FileBuffer, PcdListLength, TokenIndex, TokenStart, Index);\r
538 if (FileBuffer[Index] == '\n' || FileBuffer[Index] == '\r') {\r
539 if (TokenIndex != 0) {\r
540 PcdListLength++;\r
541 TokenIndex = 0;\r
542 }\r
543 } else {\r
544 TokenIndex++;\r
545 }\r
546 TokenStart = Index + 1;\r
547 continue;\r
548 }\r
549 }\r
550 if (Index > TokenStart) {\r
551 RecordToken (FileBuffer, PcdListLength, TokenIndex, TokenStart, Index);\r
552 if (TokenIndex != 0) {\r
553 PcdListLength++;\r
554 }\r
555 }\r
556}\r
557\r
558VOID\r
559STATIC\r
560WriteOutputFile (\r
561 CHAR8 *OutputFileName\r
562 )\r
563/*++\r
564\r
565Routine Description:\r
566\r
567 Write the updated PCD value into the output file name.\r
568\r
569Arguments:\r
570\r
571 OutputFileName Point to the output file name.\r
572\r
573Returns:\r
574\r
575 None\r
576--*/\r
577{\r
578 FILE *OutputFile;\r
579 UINT32 Index;\r
580\r
581 //\r
582 // Open output file\r
583 //\r
584 OutputFile = fopen (OutputFileName, "wb");\r
585 if (OutputFile == NULL) {\r
586 fprintf (stderr, "Error opening file %s\n", OutputFileName);\r
587 exit (EXIT_FAILURE);\r
588 }\r
589\r
590 for (Index = 0; Index < PcdListLength; Index++) {\r
591 fprintf (\r
592 OutputFile,\r
593 "%s.%s.%s.%s|%s|%s\n",\r
594 PcdList[Index].SkuName,\r
595 PcdList[Index].DefaultValueName,\r
596 PcdList[Index].TokenSpaceGuidName,\r
597 PcdList[Index].TokenName,\r
598 PcdList[Index].DataType,\r
599 PcdList[Index].Value\r
600 );\r
601 }\r
602\r
603 //\r
604 // Done, write output file.\r
605 //\r
606 if (OutputFile != NULL) {\r
607 fclose (OutputFile);\r
608 }\r
609}\r
610\r
611VOID\r
612STATIC\r
613Usage (\r
614 VOID\r
615 )\r
616/*++\r
617\r
618Routine Description:\r
619\r
620 Displays the utility usage syntax to STDOUT\r
621\r
622Arguments:\r
623\r
624 None\r
625\r
626Returns:\r
627\r
628 None\r
629\r
630--*/\r
631{\r
632 fprintf (stdout, "Usage: -i <input_file> -o <output_file>\n\n");\r
633 fprintf (stdout, "optional arguments:\n");\r
634 fprintf (stdout, " -h, --help Show this help message and exit\n");\r
635 fprintf (stdout, " -i INPUT_FILENAME, --input INPUT_FILENAME\n\\r
636 PCD Database Input file name\n");\r
637 fprintf (stdout, " -o OUTPUT_FILENAME, --output OUTPUT_FILENAME\n\\r
638 PCD Database Output file name\n");\r
639}\r
640\r
641VOID\r
642STATIC\r
643ParseArguments (\r
644 int argc,\r
645 char *argv[],\r
646 CHAR8 **InputFileName,\r
647 CHAR8 **OutputFileName\r
648 )\r
649/*++\r
650\r
651Routine Description:\r
652\r
653 Parse the input parameters to get the input/output file name.\r
654\r
655Arguments:\r
656\r
657 argc Number of command line parameters.\r
658 argv Array of pointers to parameter strings.\r
659 InputFileName Point to the input file name.\r
660 OutputFileName Point to the output file name.\r
661\r
662Returns:\r
663\r
664 None\r
665--*/\r
666{\r
667 if (argc == 1) {\r
668 fprintf (stderr, "Missing options\n");\r
669 exit (EXIT_FAILURE);\r
670 }\r
671\r
672 //\r
673 // Parse command line\r
674 //\r
675 argc--;\r
676 argv++;\r
677\r
678 if ((stricmp (argv[0], "-h") == 0) || (stricmp (argv[0], "--help") == 0)) {\r
679 Usage ();\r
680 exit (EXIT_SUCCESS);\r
681 }\r
682\r
683 while (argc > 0) {\r
684 if ((stricmp (argv[0], "-i") == 0) || (stricmp (argv[0], "--input") == 0)) {\r
685 if (argv[1] == NULL || argv[1][0] == '-') {\r
686 fprintf (stderr, "Invalid option value. Input File name is missing for -i option\n");\r
687 exit (EXIT_FAILURE);\r
688 }\r
689 *InputFileName = argv[1];\r
690 argc -= 2;\r
691 argv += 2;\r
692 continue;\r
693 }\r
694\r
695 if ((stricmp (argv[0], "-o") == 0) || (stricmp (argv[0], "--output") == 0)) {\r
696 if (argv[1] == NULL || argv[1][0] == '-') {\r
697 fprintf (stderr, "Invalid option value. Output File name is missing for -i option\n");\r
698 exit (EXIT_FAILURE);\r
699 }\r
700 *OutputFileName = argv[1];\r
701 argc -= 2;\r
702 argv += 2;\r
703 continue;\r
704 }\r
705\r
706 if (argv[0][0] == '-') {\r
707 fprintf (stderr, "Unknown option %s\n", argv[0]);\r
708 exit (EXIT_FAILURE);\r
709 }\r
710 argc --;\r
711 argv ++;\r
712 }\r
713\r
714 //\r
715 // Check Input paramters\r
716 //\r
717 if (*InputFileName == NULL) {\r
718 fprintf (stderr, "Missing option. Input files is not specified\n");\r
719 exit (EXIT_FAILURE);\r
720 } else {\r
721 printf ("Input file name is %s\n", *InputFileName);\r
722 }\r
723\r
724 if (*OutputFileName == NULL) {\r
725 fprintf (stderr, "Missing option. Output file is not specified\n");\r
726 exit (EXIT_FAILURE);\r
727 } else {\r
728 printf ("Output file name is %s\n", *OutputFileName);\r
729 }\r
730}\r
731\r
732int\r
733PcdValueMain (\r
734 int argc,\r
735 char *argv[]\r
736 )\r
737/*++\r
738\r
739Routine Description:\r
740\r
741 Main function updates PCD values.\r
742\r
743Arguments:\r
744\r
745 argc Number of command line parameters.\r
746 argv Array of pointers to parameter strings.\r
747\r
748Returns:\r
749 EXIT_SUCCESS\r
750--*/\r
751{\r
752 CHAR8 *InputFileName;\r
753 CHAR8 *OutputFileName;\r
754 UINT8 *FileBuffer;\r
755 UINT32 FileSize;\r
756\r
757 printf ("PCD tool start.\n");\r
758 InputFileName = NULL;\r
759 OutputFileName = NULL;\r
760\r
761 //\r
762 // Parse the input arguments\r
763 //\r
764 ParseArguments (argc, argv, &InputFileName, &OutputFileName);\r
765\r
766 //\r
767 // Open Input file and read file data.\r
768 //\r
769 ReadInputFile (InputFileName, &FileBuffer, &FileSize);\r
770\r
771 //\r
772 // Read the initial Pcd value\r
773 //\r
774 ParseFile (FileBuffer, FileSize);\r
775\r
776 //\r
777 // Customize PCD values in the PCD Database\r
778 //\r
779 PcdEntryPoint ();\r
780\r
781 //\r
782 // Save the updated PCD value\r
783 //\r
784 WriteOutputFile (OutputFileName);\r
785\r
786 printf ("PCD tool done.\n");\r
787\r
788 exit (EXIT_SUCCESS);\r
789}\r