/*****************************************************************************
   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