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