]> git.proxmox.com Git - mirror_edk2.git/blame - BaseTools/Source/C/Common/PcdValueCommon.c
BaseTools: Fix make PcdValueCommon.c failure on GCC
[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
309e37a2
LG
315\r
316 Index = LookupPcdIndex (SkuName, DefaultValueName, TokenSpaceGuidName, TokenName);\r
317 if (Index < 0) {\r
318 fprintf (stderr, "PCD %s.%s.%s.%s is not in database\n", SkuName, DefaultValueName, TokenSpaceGuidName, TokenName);\r
319 exit (EXIT_FAILURE);\r
320 }\r
321 switch (PcdList[Index].PcdDataType) {\r
322 case PcdDataTypeBoolean:\r
323 case PcdDataTypeUint8:\r
324 case PcdDataTypeUint16:\r
325 case PcdDataTypeUint32:\r
326 case PcdDataTypeUint64:\r
327 fprintf (stderr, "PCD %s.%s.%s.%s is a value. Use PcdGet()\n", SkuName, DefaultValueName, TokenSpaceGuidName, TokenName);\r
328 exit (EXIT_FAILURE);\r
329 break;\r
330 case PcdDataTypePointer:\r
331 Value = &PcdList[Index].Value[1];\r
693877f8 332 for (*Size = 0, strtoul(Value, &End, 16); Value != End; strtoul(Value, &End, 16), *Size = *Size + 1) {\r
309e37a2
LG
333 Value = End + 1;\r
334 }\r
4faf5340 335 Buffer = malloc(*Size + 1);\r
66329d53
HW
336 if (Buffer == NULL) {\r
337 *Size = 0;\r
338 return NULL;\r
339 }\r
309e37a2
LG
340 Value = &PcdList[Index].Value[1];\r
341 for (*Size = 0, Buffer[*Size] = (UINT8) strtoul(Value, &End, 16); Value != End; *Size = *Size + 1, Buffer[*Size] = (UINT8) strtoul(Value, &End, 16)) {\r
342 Value = End + 1;\r
343 }\r
344 return Buffer;\r
345 }\r
346 *Size = 0;\r
347 return 0;\r
348}\r
349\r
350VOID\r
351__PcdSetPtr (\r
352 CHAR8 *SkuName OPTIONAL,\r
353 CHAR8 *DefaultValueName OPTIONAL,\r
354 CHAR8 *TokenSpaceGuidName,\r
355 CHAR8 *TokenName,\r
356 UINT32 Size,\r
357 UINT8 *Value\r
358 )\r
359/*++\r
360\r
361Routine Description:\r
362\r
363 Set PCD value buffer\r
364\r
365Arguments:\r
366\r
367 SkuName SkuName String\r
368 DefaultValueName DefaultValueName String\r
369 TokenSpaceGuidName TokenSpaceGuidName String\r
370 TokenName TokenName String\r
371 Size Size of PCD value\r
372 Value Pointer to the updated PCD value buffer\r
373\r
374Returns:\r
375\r
376 None\r
377--*/\r
378{\r
379 int Index;\r
380 UINT32 ValueIndex;\r
381\r
382 Index = LookupPcdIndex (SkuName, DefaultValueName, TokenSpaceGuidName, TokenName);\r
383 if (Index < 0) {\r
384 fprintf (stderr, "PCD %s.%s.%s.%s is not in database\n", SkuName, DefaultValueName, TokenSpaceGuidName, TokenName);\r
385 exit (EXIT_FAILURE);\r
386 }\r
387 switch (PcdList[Index].PcdDataType) {\r
388 case PcdDataTypeBoolean:\r
389 case PcdDataTypeUint8:\r
390 case PcdDataTypeUint16:\r
391 case PcdDataTypeUint32:\r
392 case PcdDataTypeUint64:\r
393 fprintf (stderr, "PCD %s.%s.%s.%s is a value. Use PcdGet()\n", SkuName, DefaultValueName, TokenSpaceGuidName, TokenName);\r
394 exit (EXIT_FAILURE);\r
395 break;\r
396 case PcdDataTypePointer:\r
397 free(PcdList[Index].Value);\r
398 PcdList[Index].Value = malloc(Size * 5 + 3);\r
399 PcdList[Index].Value[0] = '{';\r
400 for (ValueIndex = 0; ValueIndex < Size; ValueIndex++) {\r
309e37a2
LG
401 sprintf(&PcdList[Index].Value[1 + ValueIndex * 5], "0x%02x,", Value[ValueIndex]);\r
402 }\r
403 PcdList[Index].Value[1 + Size * 5 - 1] = '}';\r
404 PcdList[Index].Value[1 + Size * 5 ] = 0;\r
405 break;\r
406 }\r
407}\r
408\r
409VOID\r
410STATIC\r
411ReadInputFile (\r
412 CHAR8 *InputFileName,\r
413 UINT8 **FileBuffer,\r
414 UINT32 *FileSize\r
415 )\r
416/*++\r
417\r
418Routine Description:\r
419\r
420 Read the file buffer from the input file.\r
421\r
422Arguments:\r
423\r
424 InputFileName Point to the input file name.\r
425 FileBuffer Point to the input file buffer.\r
426 FileSize Size of the file buffer.\r
427\r
428Returns:\r
429\r
430 None\r
431--*/\r
432{\r
433 FILE *InputFile;\r
434 UINT32 BytesRead;\r
435\r
436 //\r
437 // Open Input file and read file data.\r
438 //\r
439 InputFile = fopen (InputFileName, "rb");\r
440 if (InputFile == NULL) {\r
441 fprintf (stderr, "Error opening file %s\n", InputFileName);\r
442 exit (EXIT_FAILURE);\r
443 }\r
444\r
445 //\r
446 // Go to the end so that we can determine the file size\r
447 //\r
448 if (fseek (InputFile, 0, SEEK_END)) {\r
449 fprintf (stderr, "Error reading input file %s\n", InputFileName);\r
450 fclose (InputFile);\r
451 exit (EXIT_FAILURE);\r
452 }\r
453\r
454 //\r
455 // Get the file size\r
456 //\r
457 *FileSize = ftell (InputFile);\r
458 if (*FileSize == -1) {\r
459 fprintf (stderr, "Error parsing the input file %s\n", InputFileName);\r
460 fclose (InputFile);\r
461 exit (EXIT_FAILURE);\r
462 }\r
463\r
464 //\r
465 // Allocate a buffer\r
466 //\r
467 *FileBuffer = malloc (*FileSize);\r
468 if (*FileBuffer == NULL) {\r
469 fprintf (stderr, "Can not allocate buffer for input input file %s\n", InputFileName);\r
470 fclose (InputFile);\r
471 exit (EXIT_FAILURE);\r
472 }\r
473\r
474 //\r
475 // Reset to the beginning of the file\r
476 //\r
477 if (fseek (InputFile, 0, SEEK_SET)) {\r
478 fprintf (stderr, "Error reading the input file %s\n", InputFileName);\r
479 fclose (InputFile);\r
480 free (*FileBuffer);\r
481 exit (EXIT_FAILURE);\r
482 }\r
483\r
484 //\r
485 // Read all of the file contents.\r
486 //\r
487 BytesRead = fread (*FileBuffer, sizeof (UINT8), *FileSize, InputFile);\r
488 if (BytesRead != *FileSize * sizeof (UINT8)) {\r
489 fprintf (stderr, "Error reading the input file %s\n", InputFileName);\r
490 fclose (InputFile);\r
491 free (*FileBuffer);\r
492 exit (EXIT_FAILURE);\r
493 }\r
494\r
495 //\r
496 // Close the file\r
497 //\r
498 fclose (InputFile);\r
499}\r
500\r
501VOID\r
502STATIC\r
503ParseFile (\r
504 UINT8 *FileBuffer,\r
505 UINT32 FileSize\r
506 )\r
507/*++\r
508\r
509Routine Description:\r
510\r
511 Read the initial PCD value from the input file buffer.\r
512\r
513Arguments:\r
514\r
515 FileBuffer Point to the input file buffer.\r
516 FileSize Size of the file buffer.\r
517\r
518Returns:\r
519\r
520 None\r
521--*/\r
522{\r
523 UINT32 Index;\r
524 UINT32 NumLines;\r
525 UINT32 TokenIndex;\r
526 UINT32 TokenStart;\r
527\r
528 for (Index = 0, NumLines = 0; Index < FileSize; Index++) {\r
529 if (FileBuffer[Index] == '\n') {\r
530 NumLines++;\r
531 }\r
532 }\r
533 PcdList = malloc((NumLines + 1) * sizeof(PcdList[0]));\r
534\r
535 for (Index = 0, TokenIndex = 0, PcdListLength = 0, TokenStart = 0; Index < FileSize; Index++) {\r
536 if (FileBuffer[Index] == ' ') {\r
537 continue;\r
538 }\r
539 if (FileBuffer[Index] == '|' || FileBuffer[Index] == '.' || FileBuffer[Index] == '\n' || FileBuffer[Index] == '\r') {\r
540 RecordToken (FileBuffer, PcdListLength, TokenIndex, TokenStart, Index);\r
541 if (FileBuffer[Index] == '\n' || FileBuffer[Index] == '\r') {\r
542 if (TokenIndex != 0) {\r
543 PcdListLength++;\r
544 TokenIndex = 0;\r
545 }\r
546 } else {\r
547 TokenIndex++;\r
548 }\r
549 TokenStart = Index + 1;\r
550 continue;\r
551 }\r
552 }\r
553 if (Index > TokenStart) {\r
554 RecordToken (FileBuffer, PcdListLength, TokenIndex, TokenStart, Index);\r
555 if (TokenIndex != 0) {\r
556 PcdListLength++;\r
557 }\r
558 }\r
559}\r
560\r
561VOID\r
562STATIC\r
563WriteOutputFile (\r
564 CHAR8 *OutputFileName\r
565 )\r
566/*++\r
567\r
568Routine Description:\r
569\r
570 Write the updated PCD value into the output file name.\r
571\r
572Arguments:\r
573\r
574 OutputFileName Point to the output file name.\r
575\r
576Returns:\r
577\r
578 None\r
579--*/\r
580{\r
581 FILE *OutputFile;\r
582 UINT32 Index;\r
583\r
584 //\r
585 // Open output file\r
586 //\r
587 OutputFile = fopen (OutputFileName, "wb");\r
588 if (OutputFile == NULL) {\r
589 fprintf (stderr, "Error opening file %s\n", OutputFileName);\r
590 exit (EXIT_FAILURE);\r
591 }\r
592\r
593 for (Index = 0; Index < PcdListLength; Index++) {\r
594 fprintf (\r
595 OutputFile,\r
596 "%s.%s.%s.%s|%s|%s\n",\r
597 PcdList[Index].SkuName,\r
598 PcdList[Index].DefaultValueName,\r
599 PcdList[Index].TokenSpaceGuidName,\r
600 PcdList[Index].TokenName,\r
601 PcdList[Index].DataType,\r
602 PcdList[Index].Value\r
603 );\r
604 }\r
605\r
606 //\r
607 // Done, write output file.\r
608 //\r
609 if (OutputFile != NULL) {\r
610 fclose (OutputFile);\r
611 }\r
612}\r
613\r
614VOID\r
615STATIC\r
616Usage (\r
617 VOID\r
618 )\r
619/*++\r
620\r
621Routine Description:\r
622\r
623 Displays the utility usage syntax to STDOUT\r
624\r
625Arguments:\r
626\r
627 None\r
628\r
629Returns:\r
630\r
631 None\r
632\r
633--*/\r
634{\r
635 fprintf (stdout, "Usage: -i <input_file> -o <output_file>\n\n");\r
636 fprintf (stdout, "optional arguments:\n");\r
637 fprintf (stdout, " -h, --help Show this help message and exit\n");\r
638 fprintf (stdout, " -i INPUT_FILENAME, --input INPUT_FILENAME\n\\r
639 PCD Database Input file name\n");\r
640 fprintf (stdout, " -o OUTPUT_FILENAME, --output OUTPUT_FILENAME\n\\r
641 PCD Database Output file name\n");\r
642}\r
643\r
644VOID\r
645STATIC\r
646ParseArguments (\r
647 int argc,\r
648 char *argv[],\r
649 CHAR8 **InputFileName,\r
650 CHAR8 **OutputFileName\r
651 )\r
652/*++\r
653\r
654Routine Description:\r
655\r
656 Parse the input parameters to get the input/output file name.\r
657\r
658Arguments:\r
659\r
660 argc Number of command line parameters.\r
661 argv Array of pointers to parameter strings.\r
662 InputFileName Point to the input file name.\r
663 OutputFileName Point to the output file name.\r
664\r
665Returns:\r
666\r
667 None\r
668--*/\r
669{\r
670 if (argc == 1) {\r
671 fprintf (stderr, "Missing options\n");\r
672 exit (EXIT_FAILURE);\r
673 }\r
674\r
675 //\r
676 // Parse command line\r
677 //\r
678 argc--;\r
679 argv++;\r
680\r
681 if ((stricmp (argv[0], "-h") == 0) || (stricmp (argv[0], "--help") == 0)) {\r
682 Usage ();\r
683 exit (EXIT_SUCCESS);\r
684 }\r
685\r
686 while (argc > 0) {\r
687 if ((stricmp (argv[0], "-i") == 0) || (stricmp (argv[0], "--input") == 0)) {\r
688 if (argv[1] == NULL || argv[1][0] == '-') {\r
689 fprintf (stderr, "Invalid option value. Input File name is missing for -i option\n");\r
690 exit (EXIT_FAILURE);\r
691 }\r
692 *InputFileName = argv[1];\r
693 argc -= 2;\r
694 argv += 2;\r
695 continue;\r
696 }\r
697\r
698 if ((stricmp (argv[0], "-o") == 0) || (stricmp (argv[0], "--output") == 0)) {\r
699 if (argv[1] == NULL || argv[1][0] == '-') {\r
700 fprintf (stderr, "Invalid option value. Output File name is missing for -i option\n");\r
701 exit (EXIT_FAILURE);\r
702 }\r
703 *OutputFileName = argv[1];\r
704 argc -= 2;\r
705 argv += 2;\r
706 continue;\r
707 }\r
708\r
709 if (argv[0][0] == '-') {\r
710 fprintf (stderr, "Unknown option %s\n", argv[0]);\r
711 exit (EXIT_FAILURE);\r
712 }\r
713 argc --;\r
714 argv ++;\r
715 }\r
716\r
717 //\r
718 // Check Input paramters\r
719 //\r
720 if (*InputFileName == NULL) {\r
721 fprintf (stderr, "Missing option. Input files is not specified\n");\r
722 exit (EXIT_FAILURE);\r
309e37a2
LG
723 }\r
724\r
725 if (*OutputFileName == NULL) {\r
726 fprintf (stderr, "Missing option. Output file is not specified\n");\r
727 exit (EXIT_FAILURE);\r
309e37a2
LG
728 }\r
729}\r
730\r
731int\r
732PcdValueMain (\r
733 int argc,\r
734 char *argv[]\r
735 )\r
736/*++\r
737\r
738Routine Description:\r
739\r
740 Main function updates PCD values.\r
741\r
742Arguments:\r
743\r
744 argc Number of command line parameters.\r
745 argv Array of pointers to parameter strings.\r
746\r
747Returns:\r
748 EXIT_SUCCESS\r
749--*/\r
750{\r
751 CHAR8 *InputFileName;\r
752 CHAR8 *OutputFileName;\r
753 UINT8 *FileBuffer;\r
754 UINT32 FileSize;\r
755\r
309e37a2
LG
756 InputFileName = NULL;\r
757 OutputFileName = NULL;\r
758\r
759 //\r
760 // Parse the input arguments\r
761 //\r
762 ParseArguments (argc, argv, &InputFileName, &OutputFileName);\r
763\r
764 //\r
765 // Open Input file and read file data.\r
766 //\r
767 ReadInputFile (InputFileName, &FileBuffer, &FileSize);\r
768\r
769 //\r
770 // Read the initial Pcd value\r
771 //\r
772 ParseFile (FileBuffer, FileSize);\r
773\r
774 //\r
775 // Customize PCD values in the PCD Database\r
776 //\r
777 PcdEntryPoint ();\r
778\r
779 //\r
780 // Save the updated PCD value\r
781 //\r
782 WriteOutputFile (OutputFileName);\r
783\r
309e37a2
LG
784 exit (EXIT_SUCCESS);\r
785}\r