/* * LocateTag - locate a tag in the tag file */ vi_rc LocateTag( char *str, char *fname, char *buff ) { char tag[MAX_STR]; int i; FILE *f; /* * get file and buffer */ f = GetFromEnvAndOpen( EditVars.TagFileName ); if( !f ) { if( EditFlags.SearchForTagfile ) { f = SearchForTags(); } if( !f ) { return( ERR_FILE_NOT_FOUND ); } } /* * loop until tag found */ for( ;; ) { if( fgets( buff, MAX_STR, f ) == NULL ) { fclose( f ); return( ERR_TAG_NOT_FOUND ); } if( NextWord1( buff, tag ) <= 0 ) { continue; } if( EditFlags.IgnoreTagCase ) { i = stricmp( str, tag ); } else { i = strcmp( str, tag ); if( i < 0 ) { fclose( f ); return( ERR_TAG_NOT_FOUND ); } } if( !i ) { return( selectTag( f, str, buff, fname ) ); } } } /* LocateTag */
int main( int argc, char *argv[] ) { char *buff = NULL; char *buff2, *buff3; char *buffn, *buffs; char *ptr; int i, bytes, j, k, sl; FILE *f; struct stat fs; char drive[_MAX_DRIVE], dir[_MAX_DIR]; char fname[_MAX_FNAME], ext[_MAX_EXT]; char path[_MAX_PATH]; char tmppath[_MAX_PATH]; char tmpfname[_MAX_FNAME], tmpext[_MAX_EXT]; unsigned cnt; unsigned lines; bind_size *index; bind_size *entries; for( j = argc - 1; j > 0; --j ) { if( argv[j][0] == '/' || argv[j][0] == '-' ) { sl = strlen( argv[j] ); for( i = 1; i < sl; i++ ) { switch( argv[j][i] ) { case 's': sflag = true; break; case 'q': qflag = true; break; case 'd': bindfile = &argv[j][i + 1]; i = sl; break; case '?': Banner(); Usage( NULL ); default: Banner(); Usage( "Invalid option" ); } } for( i = j; i < argc; i++ ) { argv[i]= argv[i + 1]; } argc--; } } Banner(); /* * now, check for null file name */ if( argc < 2 ) { Usage( "No executable to bind" ); } _splitpath( argv[1], drive, dir, fname, ext ); if( ext[0] == 0 ) { _makepath( path, drive, dir, fname, ".exe" ); } else { strcpy( path, argv[1] ); } if( stat( path, &fs ) == -1 ) { Abort( "Could not find executable \"%s\"", path ); } cnt = 0; if( !sflag ) { buff = MyAlloc( 65000 ); buff2 = MyAlloc( 32000 ); buff3 = MyAlloc( MAX_LINE_LEN ); /* * read in all data files */ MyPrintf( "Getting data files from" ); f = GetFromEnvAndOpen( bindfile ); MyPrintf( "\n" ); if( f == NULL ) { Abort( "Could not open %s", bindfile ); } while( (ptr = fgets( buff3, MAX_LINE_LEN, f )) != NULL ) { for( i = strlen( ptr ); i && isWSorCtrlZ( ptr[i - 1] ); --i ) { ptr[i - 1] = '\0'; } if( ptr[0] == '\0' ) { continue; } ptr = SkipLeadingSpaces( ptr ); if( ptr[0] == '#' ) { continue; } dats[FileCount] = MyAlloc( strlen( ptr ) + 1 ); strcpy( dats[FileCount], ptr ); FileCount++; if( FileCount >= MAX_DATA_FILES ) { Abort( "Too many files to bind!" ); } } fclose( f ); index = MyAlloc( FileCount * sizeof( bind_size ) ); entries = MyAlloc( FileCount * sizeof( bind_size ) ); buffn = buff; *(bind_size *)buffn = FileCount; buffn += sizeof( bind_size ); cnt += sizeof( bind_size ); buffs = buffn; buffn += sizeof( bind_size ); cnt += sizeof( bind_size ); k = 0; for( i = 0; i < FileCount; i++ ) { // j = strlen( dats[i] ) + 1; // memcpy( buffn, dats[i], j ); _splitpath( dats[i], NULL, NULL, tmpfname, tmpext ); _makepath( tmppath, NULL, NULL, tmpfname, tmpext ); j = strlen( tmppath ) + 1; memcpy( buffn, tmppath, j ); buffn += j; cnt += j; k += j; } *(bind_size *)buffs = k + 1; /* size of token list */ *buffn = 0; /* trailing zero */ buffn++; cnt++; buffs = buffn; buffn += FileCount * ( sizeof( bind_size ) + sizeof( bind_size ) ); cnt += FileCount * ( sizeof( bind_size ) + sizeof( bind_size ) ); for( j = 0; j < FileCount; j++ ) { MyPrintf( "Loading" ); f = GetFromEnvAndOpen( dats[j] ); if( f == NULL ) { Abort( "\nLoad of %s failed!", dats[j] ); } setvbuf( f, buff2, _IOFBF, 32000 ); bytes = lines = 0; index[j] = cnt; while( (ptr = fgets( buff3, MAX_LINE_LEN, f )) != NULL ) { unsigned len; for( len = strlen( ptr ); len && isWSorCtrlZ( ptr[len - 1] ); --len ) ptr[len - 1] = '\0'; if( ptr[0] == '\0' ) { continue; } ptr = SkipLeadingSpaces( ptr ); if( ptr[0] == '#' ) { continue; } len = strlen( ptr ); *buffn = (char)len; buffn++; memcpy( buffn, ptr, len ); buffn += len; cnt += len + 1; lines++; bytes += len; } fclose( f ); entries[j] = lines; MyPrintf( "Added %d lines (%d bytes)\n", lines, bytes ); } memcpy( buffs, index, FileCount * sizeof( bind_size ) ); buffs += FileCount * sizeof( bind_size ); memcpy( buffs, entries, FileCount * sizeof( bind_size ) ); } AddDataToEXE( path, buff, cnt, fs.st_size ); if( !sflag ) { MyPrintf( "Added %d bytes to \"%s\"\n", cnt, path ); } else { MyPrintf( "\"%s\" has been stripped of configuration information\n", path ); } return( 0 ); } /* main */
/* * SpecialOpen - open a file or exe */ bool SpecialOpen( const char *fn, GENERIC_FILE *gf, bool bounddata ) { long shift = 0; int h, i; unsigned char len; vi_rc rc; /* * process bound file */ if( BoundData ) { if( !strcmp( fn, CONFIG_FILE ) ) { i = 0; } else { i = Tokenize( dataFnames, fn, true ); } if( i != TOK_INVALID && bounddata ) { shift = dataStart + dataOffsets[i]; gf->type = GF_BOUND; EditFlags.BndMemoryLocked = true; if( BndMemory == NULL ) { h = sopen3( EXEName, O_RDONLY | O_BINARY, SH_COMPAT ); if( h == -1 ) { return( false ); } lseek( h, shift, SEEK_END ); read( h, &len, 1 ); gf->data.handle = h; } else { shift -= dataStart; gf->data.pos = BndMemory + shift; len = gf->data.pos[0]; gf->data.pos++; } gf->gf.a.currline = 0; gf->gf.a.maxlines = entryCounts[i]; gf->gf.a.length = len; return( true ); } } /* * special case - open current buffer */ if( fn[0] == '.' && fn[1] == '\0' ) { gf->type = GF_BUFFER; gf->data.cfile = CurrentFile; rc = GimmeLinePtr( 1, CurrentFile, &(gf->gf.b.cfcb), &(gf->gf.b.cline)); return( rc == ERR_NO_ERR ); } /* * process regular file */ gf->type = GF_FILE; gf->data.f = GetFromEnvAndOpen( fn ); return( gf->data.f != NULL ); } /* SpecialOpen */