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