Doxygen Source Code Documentation
Main Page Alphabetical List Data Structures File List Data Fields Globals Search
uncomment.c
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007 #include "mrilib.h"
00008
00009 #ifdef putchar
00010 #undef putchar
00011 #endif
00012 #define putchar(x) fputc((x),stdout)
00013
00014 char * suck_file( char * fname )
00015 {
00016 int len , fd , ii ;
00017 char * buf ;
00018
00019 if( fname == NULL || fname[0] == '\0' ) return NULL ;
00020
00021 len = THD_filesize( fname ) ;
00022 if( len <= 0 ) return NULL ;
00023
00024 fd = open( fname , O_RDONLY ) ;
00025 if( fd < 0 ) return NULL ;
00026
00027 #if 0
00028 fprintf(stderr,"THD_filesize = %d\n",len) ;
00029 #endif
00030
00031 #define NEX 4
00032
00033 buf = (char *) malloc( sizeof(char) * (len+NEX) ) ;
00034 ii = read( fd , buf , len ) ;
00035 close( fd ) ;
00036 if( ii <= 0 ){ free(buf) ; return NULL; }
00037
00038 for( ii=0 ; ii < NEX ; ii++ ) buf[len+ii] = '\0' ;
00039 return buf ;
00040 }
00041
00042 int main( int argc , char * argv[] )
00043 {
00044 char * infile ;
00045 int nin , comm , ii , quote ;
00046
00047 if( argc < 2 || strcmp(argv[1],"-help") == 0 ){
00048 printf("Usage: uncomment infile.c > outfile.c\n") ;
00049 exit(0) ;
00050 }
00051
00052 infile = suck_file( argv[1] ) ;
00053 if( infile == NULL || strlen(infile) == 0 ){
00054 fprintf(stderr,"*** Can't read from file %s\n",argv[1]) ;
00055 exit(1) ;
00056 }
00057
00058 nin = strlen(infile) ;
00059 comm = 0 ;
00060 quote = 0 ;
00061 ii = 0 ;
00062
00063 while( ii < nin ){
00064
00065
00066
00067 if( quote && infile[ii] == '"' && infile[ii-1] != '\\' ){
00068 putchar(infile[ii++]) ; quote = 0 ; continue ;
00069 }
00070
00071
00072
00073 if( !quote && !comm && infile[ii] == '"' && infile[ii-1] != '\\' ){
00074 putchar(infile[ii++]) ; quote = 1 ; continue ;
00075 }
00076
00077
00078
00079 if( comm && infile[ii] == '*' && infile[ii+1] == '/' ){
00080 ii += 2 ; comm = 0 ; continue ;
00081 }
00082
00083
00084
00085 if( !quote && !comm && infile[ii] == '/' && infile[ii+1] == '*' ){
00086 putchar(' ') ; ii += 2 ; comm = 1 ; continue ;
00087 }
00088
00089
00090
00091 #if 0
00092 fprintf(stderr,"at %d/%d: comm=%d char=%d\n",ii,nin,comm,infile[ii]) ;
00093 #endif
00094
00095 if( !comm ) putchar(infile[ii]) ;
00096 ii++ ;
00097 }
00098 putchar('\n') ;
00099
00100 if( comm ) fprintf(stderr,"*** Warning: ended inside a comment!\n") ;
00101 else if( quote ) fprintf(stderr,"*** Warning: ended inside a quote!\n") ;
00102 exit(0) ;
00103 }