windows-nt/Source/XPSP1/NT/base/ntsetup/stripinf/stripinf.c
2020-09-26 16:20:57 +08:00

156 lines
3 KiB
C

#include <stdio.h>
#include <stdlib.h>
/*
This program reads NT SETUP INF files and removes:
o blank lines
o lines whose first non-white-space character is ';'
o all data after and including a non-quoted ';'
character in a line
Command line:
stripinf <input INF name> <output INF name>
*/
#define MAX_CHARACTERS_PER_LINE 1000
#if !defined(TRUE)
#define TRUE 1
#define FALSE 0
#endif
typedef int bool ;
void die ( char * pszMsg )
{
fprintf( stderr, "STRIPINF error: %s", pszMsg ) ;
exit(3);
}
int processInf ( FILE * fIn, FILE * fOut )
{
char chLine [ MAX_CHARACTERS_PER_LINE ] ;
char * pch,
* pchComment ;
bool bKeep,
bQuote,
bStop ;
for ( ; (! feof(fIn)) && (pch = fgets( chLine, sizeof chLine, fIn )) ; )
{
bStop = bQuote = bKeep = FALSE ;
pchComment = NULL ;
for ( ; *pch && (! bStop) ; pch++ )
{
switch ( *pch )
{
case '\n':
bStop = TRUE ;
break ;
case '\0':
die( "input line longer than 1000 characters" ) ;
break ;
case '\"':
bQuote = ! bQuote ;
bKeep = TRUE ;
break ;
case ' ':
case '\t':
break ;
case ';':
if ( bQuote )
break ;
if ( bKeep )
{
*pch++ = '\n' ;
*pch = '\0' ;
}
bStop = TRUE ;
break ;
case 0x1a: /* control-Z */
*pch = '\0';
break;
default:
bKeep = TRUE ;
break ;
}
}
if ( bKeep )
{
if ( fputs( chLine, fOut ) == EOF )
die("failure writing output file") ;
}
}
return TRUE ;
}
int
__cdecl
main ( int argc, char * argv[], char * envp[] )
{
int i ;
char * pchIn = NULL,
* pchOut = NULL,
chOpt ;
FILE * fIn, * fOut ;
for ( i = 1 ; argv[i] ; i++ )
{
switch ( chOpt = argv[i][0] )
{
case '-':
case '/':
die( "invalid option" ) ;
break;
default:
if ( pchIn == NULL )
pchIn = argv[i] ;
else
if ( pchOut == NULL )
pchOut = argv[i] ;
else
die( "too many file specifications" ) ;
break;
}
}
if ( pchIn == NULL || pchOut == NULL )
die( "too few file specifications" ) ;
fIn = fopen( pchIn, "r" ) ;
if ( ! fIn )
die( "input file failed to open" ) ;
fOut = fopen( pchOut, "w" );
if ( ! fOut )
die( "output file failed to open" );
if ( ! processInf( fIn, fOut ) )
die( "internal failure in processing" );
fclose( fOut ) ;
fclose( fIn ) ;
return 0 ;
}
// End of STRIPINF.C