/*****************************************************************************
Major portions of this software are copyrighted by the Medical College
of Wisconsin, 1994-2000, and are released under the Gnu General Public
License, Version 2. See the file README.Copyright for details.
******************************************************************************/
#include "mrilib.h"
#ifdef putchar
#undef putchar
#endif
#define putchar(x) fputc((x),stdout)
char * suck_file( char * fname )
{
int len , fd , ii ;
char * buf ;
if( fname == NULL || fname[0] == '\0' ) return NULL ;
len = THD_filesize( fname ) ;
if( len <= 0 ) return NULL ;
fd = open( fname , O_RDONLY ) ;
if( fd < 0 ) return NULL ;
#if 0
fprintf(stderr,"THD_filesize = %d\n",len) ;
#endif
#define NEX 4
buf = (char *) malloc( sizeof(char) * (len+NEX) ) ;
ii = read( fd , buf , len ) ;
close( fd ) ;
if( ii <= 0 ){ free(buf) ; return NULL; }
for( ii=0 ; ii < NEX ; ii++ ) buf[len+ii] = '\0' ;
return buf ;
}
int main( int argc , char * argv[] )
{
char * infile ;
int nin , comm , ii , quote ;
if( argc < 2 || strcmp(argv[1],"-help") == 0 ){
printf("Usage: uncomment infile.c > outfile.c\n") ;
exit(0) ;
}
infile = suck_file( argv[1] ) ;
if( infile == NULL || strlen(infile) == 0 ){
fprintf(stderr,"*** Can't read from file %s\n",argv[1]) ;
exit(1) ;
}
nin = strlen(infile) ;
comm = 0 ;
quote = 0 ;
ii = 0 ;
while( ii < nin ){
/* if inside a quote, and see an end quote: */
if( quote && infile[ii] == '"' && infile[ii-1] != '\\' ){
putchar(infile[ii++]) ; quote = 0 ; continue ;
}
/* if not inside a quote or comment, and see a start quote: */
if( !quote && !comm && infile[ii] == '"' && infile[ii-1] != '\\' ){
putchar(infile[ii++]) ; quote = 1 ; continue ;
}
/* if inside a comment and see an end comment: */
if( comm && infile[ii] == '*' && infile[ii+1] == '/' ){
ii += 2 ; comm = 0 ; continue ;
}
/* if not inside a quote or comment, and see a start comment: */
if( !quote && !comm && infile[ii] == '/' && infile[ii+1] == '*' ){
putchar(' ') ; ii += 2 ; comm = 1 ; continue ;
}
/* normal case: output character if not inside a comment: */
#if 0
fprintf(stderr,"at %d/%d: comm=%d char=%d\n",ii,nin,comm,infile[ii]) ;
#endif
if( !comm ) putchar(infile[ii]) ;
ii++ ;
}
putchar('\n') ;
if( comm ) fprintf(stderr,"*** Warning: ended inside a comment!\n") ;
else if( quote ) fprintf(stderr,"*** Warning: ended inside a quote!\n") ;
exit(0) ;
}
syntax highlighted by Code2HTML, v. 0.9.1