You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
153 lines
3.0 KiB
153 lines
3.0 KiB
/*++
|
|
|
|
Copyright (c) 1995 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
infmerge.c
|
|
|
|
Abstract:
|
|
|
|
This module implements a program that merge two inf files
|
|
to one inf file.
|
|
|
|
See below for more information.
|
|
|
|
Author:
|
|
|
|
Katsumi Yokomichi (Katsumiy) 22-May-2000
|
|
|
|
Revision History:
|
|
|
|
--*/
|
|
|
|
|
|
/*
|
|
*/
|
|
|
|
|
|
#include <windows.h>
|
|
#include <stdio.h>
|
|
#include <tchar.h>
|
|
#include <shellapi.h>
|
|
|
|
#include <setupapi.h>
|
|
#include <spapip.h>
|
|
|
|
|
|
CHAR Buffer[1024];
|
|
CHAR Buffer2[1024];
|
|
CHAR Section[1024];
|
|
CHAR Section2[1024];
|
|
FILE *InFile1;
|
|
FILE *InFile2;
|
|
FILE *OutFile;
|
|
CHAR PrevSection[1024];
|
|
|
|
/* Extract Section name (inside of []) from Line text. */
|
|
|
|
BOOL GetSection(CHAR *p, CHAR *SectionName, INT SectionSize)
|
|
{
|
|
CHAR *cp;
|
|
CHAR *sp1;
|
|
CHAR *sp2;
|
|
CHAR *q1;
|
|
CHAR *q2 = 0;
|
|
|
|
cp = strchr(p, ';');
|
|
sp1 = strchr(p, '[');
|
|
sp2 = strchr(p, ']');
|
|
q1 = strchr(p, '"');
|
|
if ( q1 ) {
|
|
q2 = strchr(q1+1, '"');
|
|
}
|
|
|
|
if ((sp1 == NULL) ||
|
|
(sp2 == NULL) ||
|
|
(sp1 > sp2) ||
|
|
(cp != NULL && cp < sp1) ||
|
|
(q1 < sp1 && q2 > sp1)) {
|
|
return FALSE;
|
|
}
|
|
|
|
strncpy(SectionName, sp1, max(SectionSize, sp2 - sp1));
|
|
return TRUE;
|
|
}
|
|
|
|
/* Read 1 section from 2nd file and merge into Output file. */
|
|
|
|
VOID Merge(VOID)
|
|
{
|
|
BOOL InSection2;
|
|
|
|
fseek(InFile2, 0, SEEK_SET);
|
|
InSection2 = FALSE;
|
|
while (fgets(Buffer2, sizeof(Buffer2), InFile2)) {
|
|
if (GetSection(Buffer2,Section2, sizeof(Section2))) {
|
|
if (InSection2) {
|
|
break;
|
|
} else {
|
|
if (0 == strcmp(Section2, PrevSection)) {
|
|
InSection2 = TRUE;
|
|
continue;
|
|
}
|
|
}
|
|
}
|
|
if (InSection2) {
|
|
fputs(Buffer2, OutFile);
|
|
}
|
|
}
|
|
}
|
|
|
|
int
|
|
__cdecl
|
|
main(
|
|
IN int argc,
|
|
IN CHAR *argv[]
|
|
)
|
|
{
|
|
BOOL InSection;
|
|
|
|
if (argc != 4) {
|
|
goto ErrorExit;
|
|
}
|
|
|
|
if ((InFile1 = fopen(argv[1], "r")) == NULL) {
|
|
fprintf(stderr, "Can't open %s.\n", argv[1]);
|
|
goto ErrorExit;
|
|
}
|
|
|
|
if ((InFile2 = fopen(argv[2], "r")) == NULL) {
|
|
fprintf(stderr, "Can't open %s.\n", argv[2]);
|
|
goto ErrorExit;
|
|
}
|
|
|
|
if ((OutFile = fopen(argv[3], "w")) == NULL) {
|
|
fprintf(stderr, "Can't open %s.\n", argv[3]);
|
|
goto ErrorExit;
|
|
}
|
|
|
|
InSection = FALSE;
|
|
while (fgets(Buffer, sizeof(Buffer), InFile1)) {
|
|
if (GetSection(Buffer,Section, sizeof(Section))) {
|
|
if (InSection) {
|
|
Merge();
|
|
strcpy(PrevSection, Section);
|
|
} else {
|
|
InSection = TRUE;
|
|
strcpy(PrevSection, Section);
|
|
}
|
|
}
|
|
fputs(Buffer, OutFile);
|
|
}
|
|
|
|
if (InSection) {
|
|
Merge();
|
|
}
|
|
|
|
return 0;
|
|
|
|
ErrorExit:
|
|
fprintf(stderr, "Usage: %s InputFile1 InputFile2 OutputFile.\n", argv[0]);
|
|
return 1;
|
|
}
|