/*++ | |
Copyright (c) 1999 - 2002 Intel Corporation. All rights reserved | |
This software and associated documentation (if any) is furnished | |
under a license and may only be used or copied in accordance | |
with the terms of the license. Except as permitted by such | |
license, no part of this software or documentation may be | |
reproduced, stored in a retrieval system, or transmitted in any | |
form or by any means without the express written consent of | |
Intel Corporation. | |
Module Name: | |
ModifyInf.c | |
Abstract: | |
It is a simple tool to modify some fields in a FV inf file | |
and output a new FV inf file. | |
--*/ | |
#include "stdio.h" | |
#include "string.h" | |
// | |
// Read a line into buffer including '\r\n' | |
// | |
int | |
ReadLine ( | |
char *LineBuffer, | |
FILE *fp | |
) | |
/*++ | |
Routine Description: | |
GC_TODO: Add function description | |
Arguments: | |
LineBuffer - GC_TODO: add argument description | |
fp - GC_TODO: add argument description | |
Returns: | |
GC_TODO: add return values | |
--*/ | |
{ | |
int CharC; | |
char *Line; | |
Line = LineBuffer; | |
while ((CharC = fgetc (fp)) != EOF) { | |
*Line++ = (char) CharC; | |
if (CharC == 0x0a) { | |
break; | |
} | |
} | |
*Line = 0; | |
if (CharC == EOF) { | |
return 0; | |
} else { | |
return 1; | |
} | |
} | |
// | |
// Write a line into output file | |
// | |
int | |
WriteLine ( | |
char *Line, | |
FILE *fp | |
) | |
/*++ | |
Routine Description: | |
GC_TODO: Add function description | |
Arguments: | |
Line - GC_TODO: add argument description | |
fp - GC_TODO: add argument description | |
Returns: | |
GC_TODO: add return values | |
--*/ | |
{ | |
fwrite (Line, strlen (Line), 1, fp); | |
return 0; | |
} | |
// | |
// Apply patterns to a line | |
// Currently there are 2 patterns to support | |
// '==' replace a field value with a new value | |
// '+=' append a string at the end of original line | |
// '-' prevent the line from applying any patterns | |
// it has the highest priority | |
// | |
int | |
ApplyPattern ( | |
char *Line, | |
char *argv[], | |
int argc | |
) | |
/*++ | |
Routine Description: | |
GC_TODO: Add function description | |
Arguments: | |
Line - GC_TODO: add argument description | |
] - GC_TODO: add argument description | |
argc - GC_TODO: add argument description | |
Returns: | |
GC_TODO: add return values | |
--*/ | |
{ | |
static char Section[256]; | |
char PatternBuffer[256]; | |
char *Pattern; | |
char *Pattern1; | |
char *Pattern2; | |
int PatternNum; | |
char *Ptr; | |
Pattern = PatternBuffer; | |
PatternNum = argc; | |
// | |
// For section field | |
// record current scope section into static buffer | |
// | |
Ptr = Line; | |
if (*Ptr == '[') { | |
while (*Ptr != ']') { | |
if (!(*Ptr++)) { | |
return -1; | |
} | |
} | |
strcpy (Section, Line); | |
Section[Ptr - Line + 1] = 0; | |
} | |
// | |
// Apply each pattern on the line | |
// | |
while (PatternNum-- > 3) { | |
strcpy (Pattern, argv[PatternNum]); | |
// | |
// For pattern '-' | |
// keep it unmodified by other patterns | |
// | |
if (*Pattern == '-') { | |
if (strstr (Line, Pattern + 1)) { | |
return 0; | |
} else { | |
continue; | |
} | |
} | |
// | |
// For other patterns | |
// get its section at first if it has | |
// | |
if (*Pattern == '[') { | |
if (strncmp (Section, Pattern, strlen (Section))) { | |
// | |
// This pattern can't be appied for current section | |
// | |
continue; | |
} | |
// | |
// Strip the section field | |
// | |
while (*Pattern != ']') { | |
if (!(*Pattern++)) { | |
return -1; | |
} | |
} | |
Pattern++; | |
} | |
// | |
// Apply patterns | |
// | |
Pattern1 = strstr (Pattern, "=="); | |
Pattern2 = strstr (Pattern, "+="); | |
if (Pattern1) { | |
// | |
// For pattern '==' | |
// replace the field value with a new string | |
// | |
if (!strncmp (Line, Pattern, Pattern1 - Pattern)) { | |
Pattern1 += 2; | |
Ptr = strstr (Line, "="); | |
if (!Ptr) { | |
return -1; | |
} | |
while (*(++Ptr) == ' ') | |
; | |
*Ptr = 0; | |
strcat (Line, Pattern1); | |
strcat (Line, "\r\n"); | |
} | |
} else if (Pattern2) { | |
// | |
// For pattern '+=' | |
// append a string at end of the original string | |
// | |
if (!strncmp (Line, Pattern, Pattern2 - Pattern)) { | |
Pattern2 += 2; | |
Ptr = Line; | |
while (*Ptr != 0x0D && *Ptr != 0x0A) { | |
Ptr++; | |
} | |
*Ptr = 0; | |
strcat (Line, Pattern2); | |
strcat (Line, "\r\n"); | |
} | |
} | |
} | |
return 0; | |
} | |
void | |
Usage ( | |
void | |
) | |
/*++ | |
Routine Description: | |
GC_TODO: Add function description | |
Arguments: | |
None | |
Returns: | |
GC_TODO: add return values | |
--*/ | |
{ | |
printf ("ModifyInf InputFVInfFileName OutputFVInfFileName [Pattern strings]\r\n"); | |
} | |
int | |
main ( | |
int argc, | |
char*argv[] | |
) | |
/*++ | |
Routine Description: | |
GC_TODO: Add function description | |
Arguments: | |
argc - GC_TODO: add argument description | |
] - GC_TODO: add argument description | |
Returns: | |
GC_TODO: add return values | |
--*/ | |
{ | |
char LineBuffer[256]; | |
FILE *fpin; | |
FILE *fpout; | |
if (argc < 3) { | |
Usage (); | |
return -1; | |
} | |
fpin = fopen (argv[1], "rb"); | |
if (!fpin) { | |
printf ("Can't open input file!\r\n"); | |
return -1; | |
} | |
fpout = fopen (argv[2], "wb"); | |
if (!fpout) { | |
fclose (fpin); | |
printf ("Can't create output file!\r\n"); | |
return -1; | |
} | |
while (ReadLine (LineBuffer, fpin)) { | |
ApplyPattern (LineBuffer, argv, argc); | |
WriteLine (LineBuffer, fpout); | |
} | |
fclose (fpin); | |
fclose (fpout); | |
return 0; | |
} |