]> git.proxmox.com Git - mirror_edk2.git/blame - BaseTools/Source/C/Common/PcdValueCommon.c
BaseTools: Fix compile error on VS2010
[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
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
309 UINT8 Byte;\r
310\r
311 Index = LookupPcdIndex (SkuName, DefaultValueName, TokenSpaceGuidName, TokenName);\r
312 if (Index < 0) {\r
313 fprintf (stderr, "PCD %s.%s.%s.%s is not in database\n", SkuName, DefaultValueName, TokenSpaceGuidName, TokenName);\r
314 exit (EXIT_FAILURE);\r
315 }\r
316 switch (PcdList[Index].PcdDataType) {\r
317 case PcdDataTypeBoolean:\r
318 case PcdDataTypeUint8:\r
319 case PcdDataTypeUint16:\r
320 case PcdDataTypeUint32:\r
321 case PcdDataTypeUint64:\r
322 fprintf (stderr, "PCD %s.%s.%s.%s is a value. Use PcdGet()\n", SkuName, DefaultValueName, TokenSpaceGuidName, TokenName);\r
323 exit (EXIT_FAILURE);\r
324 break;\r
325 case PcdDataTypePointer:\r
326 Value = &PcdList[Index].Value[1];\r
327 printf ("Value = %s\n", PcdList[Index].Value);\r
328 for (*Size = 0, Byte = (UINT8) strtoul(Value, &End, 16); Value != End; Byte = (UINT8) strtoul(Value, &End, 16), *Size = *Size + 1) {\r
329 printf("%x\n", Byte);\r
330 Value = End + 1;\r
331 }\r
332 Buffer = malloc(*Size);\r
333 Value = &PcdList[Index].Value[1];\r
334 for (*Size = 0, Buffer[*Size] = (UINT8) strtoul(Value, &End, 16); Value != End; *Size = *Size + 1, Buffer[*Size] = (UINT8) strtoul(Value, &End, 16)) {\r
335 Value = End + 1;\r
336 }\r
337 return Buffer;\r
338 }\r
339 *Size = 0;\r
340 return 0;\r
341}\r
342\r
343VOID\r
344__PcdSetPtr (\r
345 CHAR8 *SkuName OPTIONAL,\r
346 CHAR8 *DefaultValueName OPTIONAL,\r
347 CHAR8 *TokenSpaceGuidName,\r
348 CHAR8 *TokenName,\r
349 UINT32 Size,\r
350 UINT8 *Value\r
351 )\r
352/*++\r
353\r
354Routine Description:\r
355\r
356 Set PCD value buffer\r
357\r
358Arguments:\r
359\r
360 SkuName SkuName String\r
361 DefaultValueName DefaultValueName String\r
362 TokenSpaceGuidName TokenSpaceGuidName String\r
363 TokenName TokenName String\r
364 Size Size of PCD value\r
365 Value Pointer to the updated PCD value buffer\r
366\r
367Returns:\r
368\r
369 None\r
370--*/\r
371{\r
372 int Index;\r
373 UINT32 ValueIndex;\r
374\r
375 Index = LookupPcdIndex (SkuName, DefaultValueName, TokenSpaceGuidName, TokenName);\r
376 if (Index < 0) {\r
377 fprintf (stderr, "PCD %s.%s.%s.%s is not in database\n", SkuName, DefaultValueName, TokenSpaceGuidName, TokenName);\r
378 exit (EXIT_FAILURE);\r
379 }\r
380 switch (PcdList[Index].PcdDataType) {\r
381 case PcdDataTypeBoolean:\r
382 case PcdDataTypeUint8:\r
383 case PcdDataTypeUint16:\r
384 case PcdDataTypeUint32:\r
385 case PcdDataTypeUint64:\r
386 fprintf (stderr, "PCD %s.%s.%s.%s is a value. Use PcdGet()\n", SkuName, DefaultValueName, TokenSpaceGuidName, TokenName);\r
387 exit (EXIT_FAILURE);\r
388 break;\r
389 case PcdDataTypePointer:\r
390 free(PcdList[Index].Value);\r
391 PcdList[Index].Value = malloc(Size * 5 + 3);\r
392 PcdList[Index].Value[0] = '{';\r
393 for (ValueIndex = 0; ValueIndex < Size; ValueIndex++) {\r
394 printf("Value[%d] = %02x\n", ValueIndex, Value[ValueIndex]);\r
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
712 // Check Input paramters\r
713 //\r
714 if (*InputFileName == NULL) {\r
715 fprintf (stderr, "Missing option. Input files is not specified\n");\r
716 exit (EXIT_FAILURE);\r
717 } else {\r
718 printf ("Input file name is %s\n", *InputFileName);\r
719 }\r
720\r
721 if (*OutputFileName == NULL) {\r
722 fprintf (stderr, "Missing option. Output file is not specified\n");\r
723 exit (EXIT_FAILURE);\r
724 } else {\r
725 printf ("Output file name is %s\n", *OutputFileName);\r
726 }\r
727}\r
728\r
729int\r
730PcdValueMain (\r
731 int argc,\r
732 char *argv[]\r
733 )\r
734/*++\r
735\r
736Routine Description:\r
737\r
738 Main function updates PCD values.\r
739\r
740Arguments:\r
741\r
742 argc Number of command line parameters.\r
743 argv Array of pointers to parameter strings.\r
744\r
745Returns:\r
746 EXIT_SUCCESS\r
747--*/\r
748{\r
749 CHAR8 *InputFileName;\r
750 CHAR8 *OutputFileName;\r
751 UINT8 *FileBuffer;\r
752 UINT32 FileSize;\r
753\r
754 printf ("PCD tool start.\n");\r
755 InputFileName = NULL;\r
756 OutputFileName = NULL;\r
757\r
758 //\r
759 // Parse the input arguments\r
760 //\r
761 ParseArguments (argc, argv, &InputFileName, &OutputFileName);\r
762\r
763 //\r
764 // Open Input file and read file data.\r
765 //\r
766 ReadInputFile (InputFileName, &FileBuffer, &FileSize);\r
767\r
768 //\r
769 // Read the initial Pcd value\r
770 //\r
771 ParseFile (FileBuffer, FileSize);\r
772\r
773 //\r
774 // Customize PCD values in the PCD Database\r
775 //\r
776 PcdEntryPoint ();\r
777\r
778 //\r
779 // Save the updated PCD value\r
780 //\r
781 WriteOutputFile (OutputFileName);\r
782\r
783 printf ("PCD tool done.\n");\r
784\r
785 exit (EXIT_SUCCESS);\r
786}\r