static void PP_CloseAllFiles( void ) { FILELIST *tmp; while( PP_File != NULL ) { tmp = PP_File; PP_File = PP_File->prev_file; fclose( tmp->handle ); PP_Free( tmp->filename ); PP_Free( tmp ); } }
static char *AddIncludePath( char *old_list, const char *path_list ) { size_t len; size_t old_len; char *new_list; char *p; new_list = old_list; if( path_list != NULL && *path_list != '\0' ) { len = strlen( path_list ); if( old_list == NULL ) { p = new_list = PP_Malloc( len + 1 ); } else { old_len = strlen( old_list ); new_list = PP_Malloc( old_len + 1 + len + 1 ); memcpy( new_list, old_list, old_len ); PP_Free( old_list ); p = new_list + old_len; } while( *path_list != '\0' ) { if( p != new_list ) *p++ = PATH_LIST_SEP; path_list = GetPathElement( path_list, NULL, &p ); } *p = '\0'; } return( new_list ); }
void PP_Include( char *ptr ) { char *filename; char delim; int incl_type; while( *ptr == ' ' || *ptr == '\t' ) ++ptr; filename = ptr+1; if( *ptr == '<' ) { delim = '>'; incl_type = PPINCLUDE_SYS; } else if( *ptr == '"' ) { delim = '"'; incl_type = PPINCLUDE_USR; } else { PP_GenError( "Unrecognized INCLUDE directive" ); return; } ++ptr; while( *ptr != delim && *ptr != '\0' ) ++ptr; *ptr = '\0'; if( PP_OpenInclude( filename, incl_type ) == NULL ) { filename = doStrDup( filename ); // want to reuse buffer PPCharPtr = &PPLineBuf[1]; sprintf( PPCharPtr, "%cerror Unable to open '%s'\n", PreProcChar, filename ); PP_Free( filename ); } else { PP_GenLine(); } }
void PP_Fini( void ) { int hash; MACRO_ENTRY *me; for( hash = 0; hash < HASH_SIZE; hash++ ) { for( ; (me = PPHashTable[hash]) != NULL; ) { PPHashTable[hash] = me->next; if( me->replacement_list != NULL ) PP_Free( me->replacement_list ); PP_Free( me ); } } free_macro_buf(); PP_CloseAllFiles(); PP_Free( IncludePath2 ); }
int PP_Char( void ) { MACRO_TOKEN *mtok; MACRO_ENTRY *me; ppt_token token; if( *PPTokenPtr == '\0' ) { for( ; (mtok = PPTokenList) != NULL; ) { PPTokenList = mtok->next; PP_Free( mtok ); mtok = PPTokenList; if( mtok == NULL ) break; if( !IS_END_OF_MACRO( mtok ) ) { PPTokenPtr = mtok->data; return( *PPTokenPtr++ ); } DeleteNestedMacro(); } for( ;; ) { for( ;; ) { if( PP_ScanNextToken( &token ) == EOF ) return( EOF ); if( token != PPT_COMMENT ) break; if( PPFlags & PPFLAG_KEEP_COMMENTS ) break; if( PPSavedChar == '\0' ) { PPTokenPtr = PPNextTokenPtr; return( '\n' ); } else { // replace comment with a space PPTokenPtr = PPNextTokenPtr; return( ' ' ); } } if( token != PPT_ID ) break; me = PP_MacroLookup( PPTokenPtr, strlen( PPTokenPtr ) ); if( me == NULL ) break; if( me->parmcount != PP_SPECIAL_MACRO && me->parmcount != 0 ) { if( PPSavedChar != '(' ) { break; } } DoMacroExpansion( me ); if( PPTokenList != NULL ) { PPTokenPtr = PPTokenList->data; break; } } } return( *PPTokenPtr++ ); }
int PP_Char( void ) { MACRO_TOKEN *mtok; MACRO_ENTRY *me; char token; if( *PPTokenPtr == '\0' ) { for( ;; ) { mtok = PPTokenList; if( mtok == NULL ) break; PPTokenList = mtok->next; PP_Free( mtok ); mtok = PPTokenList; if( mtok == NULL ) break; if( mtok->token == PPT_NULL && mtok->data[0] == 'Z' ) { DeleteNestedMacro(); continue; } PPTokenPtr = mtok->data; return( *PPTokenPtr++ ); } for( ;; ) { for( ;; ) { if( PP_ScanNextToken( &token ) == EOF ) return( EOF ); if( token != PPT_COMMENT ) break; if( PPFlags & PPFLAG_KEEP_COMMENTS ) break; if( PPSavedChar == '\0' ) { PPTokenPtr = PPCharPtr; return( '\n' ); } else { // replace comment with a space PPTokenPtr = PPCharPtr; return( ' ' ); } } if( token != PPT_ID ) break; me = PP_MacroLookup( PPTokenPtr ); if( me == NULL ) break; if( me->parmcount != PP_SPECIAL_MACRO && me->parmcount != 0) { if( PPSavedChar != '(' ) { break; } } DoMacroExpansion( me ); if( PPTokenList != NULL ) { /* 08-feb-93 */ PPTokenPtr = PPTokenList->data; break; } } } return( *PPTokenPtr++ ); }
static char *resize_macro_buf( char *buf, size_t new_size ) { if( new_size > macro_buf_size ) { new_size = ( ( 255 + new_size ) / 256 ) * 256; macro_buf = PP_Malloc( new_size ); if( buf != NULL ) { memcpy( macro_buf, buf, macro_buf_size ); PP_Free( buf ); } macro_buf_size = new_size; } return( macro_buf ); }
static void PP_Endif( void ) { CPP_INFO *cpp; if( NestLevel != 0 ) { --NestLevel; cpp = PPStack; PPStack = cpp->prev_cpp; PP_Free( cpp ); } if( NestLevel < SkipLevel ) { SkipLevel = NestLevel; } }
void PP_RCInclude( char *ptr ) { char *filename; int quoted = 0; while( *ptr == ' ' || *ptr == '\t' ) ++ptr; if( *ptr == '\"' ) { ptr++; quoted = 1; } filename = ptr; ++ptr; if( quoted ) { while( *ptr != '\"' ) { ptr++; } } else { for( ;; ) { if( *ptr == ' ' ) break; if( *ptr == '\t' ) break; if( *ptr == '\r' ) break; if( *ptr == '\n' ) break; if( *ptr == '\0' ) break; if( *ptr == '\"' ) break; ++ptr; } } *ptr = '\0'; if( PP_OpenInclude( filename, PPINCLUDE_USR ) == NULL ) { filename = doStrDup( filename ); // want to reuse buffer PPCharPtr = &PPLineBuf[1]; sprintf( PPCharPtr, "%cerror Unable to open '%s'\n", PreProcChar, filename ); PP_Free( filename ); } else { PP_GenLine(); } }
static size_t PP_ReadLine( char *line_generated ) { FILELIST *this_file; size_t len; unsigned char c; if( PP_File == NULL ) { // if end of main file return( 0 ); // - indicate EOF } PPLineNumber = PP_File->linenum; PPLineBuf[0] = '\0'; PPNextTokenPtr = PPLineBuf + 1; *line_generated = 0; len = 1; for( ;; ) { for( ;; ) { for( ;; ) { c = *PPBufPtr; if( c == DOS_EOF_CHAR ) { // 17-oct-94 c = '\n'; if( len != 1 ) break; c = DOS_EOF_CHAR; } else { ++PPBufPtr; if( c != '\0' ) { break; } } if( c == DOS_EOF_CHAR || (PP_ReadBuf() == 0) ) { // if the last line of a file does not end with a carriage // return then still return what is on that line if( len > 1 ) { c = '\n'; break; } this_file = PP_File; fclose( this_file->handle ); PP_File = this_file->prev_file; PPBufPtr = this_file->prev_bufptr; PP_Free( this_file->filename ); PP_Free( this_file ); if( PP_File == NULL ) { // if end of main file return( 0 ); // - indicate EOF } PP_GenLine(); *line_generated = 1; len = strlen( PPNextTokenPtr ); return( len ); } } PPLineBuf[len] = c; if( c == '\n' ) break; ++len; } PP_File->linenum++; if( PPLineBuf[len - 1] == '\r' ) --len; if( PPLineBuf[len - 1] != '\\' ) break; --len; } PPLineBuf[len++] = '\n'; PPLineBuf[len++] = '\0'; PPNextTokenPtr = PPLineBuf + 1; return( len ); }
static void free_macro_buf( void ) { PP_Free( macro_buf ); macro_buf = NULL; macro_buf_size = 0; }
void PP_IncludePathFini( void ) { PP_Free( IncludePath1 ); }