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