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