// NOTE: when loading a file, you have to allocate one extra byte and set it to \0 int vfsLoadFile( const char *filename, void **bufferptr, int index ){ int i, count = 0; char tmp[NAME_MAX], fixed[NAME_MAX]; GSList *lst; *bufferptr = NULL; strcpy( fixed, filename ); vfsFixDOSName( fixed ); strlwr( fixed ); for ( i = 0; i < g_numDirs; i++ ) { strcpy( tmp, g_strDirs[i] ); strcat( tmp, filename ); if ( access( tmp, R_OK ) == 0 ) { if ( count == index ) { return vfsLoadFullPathFile( tmp,bufferptr ); } count++; } } for ( lst = g_pakFiles; lst != NULL; lst = g_slist_next( lst ) ) { VFS_PAKFILE* file = (VFS_PAKFILE*)lst->data; if ( strcmp( file->name, fixed ) != 0 ) { continue; } if ( count == index ) { memcpy( file->zipfile, &file->zipinfo, sizeof( unz_s ) ); if ( unzOpenCurrentFile( file->zipfile ) != UNZ_OK ) { return -1; } *bufferptr = g_malloc( file->size + 1 ); // we need to end the buffer with a 0 ( (char*) ( *bufferptr ) )[file->size] = 0; i = unzReadCurrentFile( file->zipfile, *bufferptr, file->size ); unzCloseCurrentFile( file->zipfile ); if ( i > 0 ) { return file->size; } else{ return -1; } } count++; } return -1; }
void Eclass_ScanFile( char *filename ){ int size; char *data; char temp[1024]; GSList *l_classes = NULL; char token_debug[1024]; //++Hydra FIXME: cleanup this. bool done = false; int len,classtype; char *token = Token(); QE_ConvertDOSToUnixName( temp, filename ); size = vfsLoadFullPathFile( filename, (void**)&data ); if ( size <= 0 ) { Sys_FPrintf( SYS_ERR, "Eclass_ScanFile: %s not found\n", filename ); return; } Sys_Printf( "ScanFile: %s\n", temp ); // start parsing the file StartTokenParsing( data ); // build a list of base classes first while ( !done ) { // find an @ sign. do { if ( !GetToken( true ) ) { done = true; break; } } while ( token[0] != '@' ); strcpy( temp,token + 1 ); // skip the @ classtype = CLASS_NOCLASS; if ( !stricmp( temp,"BaseClass" ) ) { classtype = CLASS_BASECLASS; } if ( !stricmp( temp,"PointClass" ) ) { classtype = CLASS_POINTCLASS; } if ( !stricmp( temp,"SolidClass" ) ) { classtype = CLASS_SOLIDCLASS; } if ( classtype ) { class_t *newclass = (class_t *) malloc( sizeof( class_s ) ); memset( newclass, 0, sizeof( class_s ) ); newclass->classtype = classtype; while ( 1 ) { GetTokenExtra( false,"(",false ); // option or = strcpy( token_debug,token ); if ( !strcmp( token,"=" ) ) { UnGetToken(); break; } else { strlower( token ); if ( !strcmp( token,"base" ) ) { GetTokenExtra( false,"(",true ); // ( if ( !strcmp( token,"(" ) ) { while ( GetTokenExtra( false,",)",false ) ) // option) or option, { newclass->l_baselist = g_slist_append( newclass->l_baselist, strdup( token ) ); GetTokenExtra( false,",)",true ); // , or ) if ( !strcmp( token,")" ) ) { break; } } } } else if ( !strcmp( token,"size" ) ) { // parse (w h d) or (x y z, x y z) GetTokenExtra( false,"(",true ); // ( if ( !strcmp( token,"(" ) ) { int sizedone = false; float w,h,d; GetToken( false ); w = atof( token ); GetToken( false ); h = atof( token ); GetToken( false ); // number) or number , strcpy( temp,token ); len = strlen( temp ); if ( temp[len - 1] == ')' ) { sizedone = true; } temp[len - 1] = 0; d = atof( temp ); if ( sizedone ) { // only one set of cordinates supplied, change the W,H,D to mins/maxs newclass->boundingbox[0][0] = 0 - ( w / 2 ); newclass->boundingbox[1][0] = w / 2; newclass->boundingbox[0][1] = 0 - ( h / 2 ); newclass->boundingbox[1][1] = h / 2; newclass->boundingbox[0][2] = 0 - ( d / 2 ); newclass->boundingbox[1][2] = d / 2; newclass->gotsize = true; } else { newclass->boundingbox[0][0] = w; newclass->boundingbox[0][1] = h; newclass->boundingbox[0][2] = d; GetToken( false ); newclass->boundingbox[1][0] = atof( token ); GetToken( false ); newclass->boundingbox[1][1] = atof( token ); /* GetToken(false); // "number)" or "number )" strcpy(temp,token); len = strlen(temp); if (temp[len-1] == ')') temp[len-1] = 0; else GetToken(false); // ) newclass->boundingbox[1][2] = atof(temp); */ GetTokenExtra( false,")",false ); // number newclass->boundingbox[1][2] = atof( token ); newclass->gotsize = true; GetTokenExtra( false,")",true ); // ) } } } else if ( !strcmp( token,"color" ) ) { GetTokenExtra( false,"(",true ); // ( if ( !strcmp( token,"(" ) ) { // get the color values (0-255) and normalize them if required. GetToken( false ); newclass->color[0] = atof( token ); if ( newclass->color[0] > 1 ) { newclass->color[0] /= 255; } GetToken( false ); newclass->color[1] = atof( token ); if ( newclass->color[1] > 1 ) { newclass->color[1] /= 255; } GetToken( false ); strcpy( temp,token ); len = strlen( temp ); if ( temp[len - 1] == ')' ) { temp[len - 1] = 0; } newclass->color[2] = atof( temp ); if ( newclass->color[2] > 1 ) { newclass->color[2] /= 255; } newclass->gotcolor = true; } } else if ( !strcmp( token,"iconsprite" ) ) { GetTokenExtra( false,"(",true ); // ( if ( !strcmp( token,"(" ) ) { GetTokenExtra( false,")",false ); // filename) // the model plugins will handle sprites too. // newclass->sprite = strdup(token); newclass->model = strdup( token ); GetTokenExtra( false,")",true ); // ) } } else if ( !strcmp( token,"model" ) ) { GetTokenExtra( false,"(",true ); // ( if ( !strcmp( token,"(" ) ) { GetTokenExtra( false,")",false ); // filename) newclass->model = strdup( token ); GetTokenExtra( false,")",true ); // ) } } else { // Unsupported GetToken( false ); // skip it. } } } GetToken( false ); // = strcpy( token_debug,token ); if ( !strcmp( token,"=" ) ) { GetToken( false ); newclass->classname = strdup( token ); } // Get the description if ( newclass->classtype != CLASS_BASECLASS ) { GetToken( false ); if ( !strcmp( token,":" ) ) { GetToken( false ); newclass->description = strdup( token ); } else{ UnGetToken(); // no description } } // now build the option list. GetToken( true ); // [ or [] if ( strcmp( token,"[]" ) ) { // got some options ? if ( !strcmp( token,"[" ) ) { // yup bool optioncomplete = false; option_t *newoption; while ( 1 ) { GetToken( true ); if ( !strcmp( token,"]" ) ) { break; // no more options } // parse the data and build the option_t strcpy( temp,token ); len = strlen( temp ); char *ptr = strchr( temp,'(' ); if ( !ptr ) { break; } newoption = (option_t *) malloc( sizeof( option_s ) ); memset( newoption, 0, sizeof( option_s ) ); *ptr++ = 0; newoption->epairname = strdup( temp ); len = strlen( ptr ); if ( ptr[len - 1] != ')' ) { break; } ptr[len - 1] = 0; strlower( ptr ); if ( !strcmp( ptr,"integer" ) ) { newoption->optiontype = OPTION_INTEGER; } else if ( !strcmp( ptr,"choices" ) ) { newoption->optiontype = OPTION_CHOICES; } else if ( !strcmp( ptr,"flags" ) ) { newoption->optiontype = OPTION_FLAGS; } else // string { newoption->optiontype = OPTION_STRING; } switch ( newoption->optiontype ) { case OPTION_STRING: case OPTION_INTEGER: if ( !TokenAvailable() ) { optioncomplete = true; break; } GetToken( false ); // : strcpy( token_debug,token ); if ( ( token[0] == ':' ) && ( strlen( token ) > 1 ) ) { newoption->optioninfo = strdup( token + 1 ); } else { GetToken( false ); newoption->optioninfo = strdup( token ); } if ( TokenAvailable() ) { // default value ? GetToken( false ); if ( !strcmp( token,":" ) ) { if ( GetToken( false ) ) { newoption->optiondefault = strdup( token ); optioncomplete = true; } } } else { optioncomplete = true; } break; case OPTION_CHOICES: GetTokenExtra( false,":",true ); // : or :"something like this" (bah!) strcpy( token_debug,token ); if ( ( token[0] == ':' ) && ( strlen( token ) > 1 ) ) { if ( token[1] == '\"' ) { strcpy( temp,token + 2 ); while ( 1 ) { if ( !GetToken( false ) ) { break; } strcat( temp," " ); strcat( temp,token ); len = strlen( temp ); if ( temp[len - 1] == '\"' ) { temp[len - 1] = 0; break; } } } newoption->optioninfo = strdup( temp ); } else { GetToken( false ); newoption->optioninfo = strdup( token ); } GetToken( false ); // : or = strcpy( token_debug,token ); if ( !strcmp( token,":" ) ) { GetToken( false ); newoption->optiondefault = strdup( token ); } else { UnGetToken(); } // And Follow on... case OPTION_FLAGS: GetToken( false ); // : or = strcpy( token_debug,token ); if ( strcmp( token,"=" ) ) { // missing ? break; } GetToken( true ); // [ strcpy( token_debug,token ); if ( strcmp( token,"[" ) ) { // missing ? break; } choice_t *newchoice; while ( 1 ) { GetTokenExtra( true,":",true ); // "]" or "number", or "number:" strcpy( token_debug,token ); if ( !strcmp( token,"]" ) ) { // no more ? optioncomplete = true; break; } strcpy( temp,token ); len = strlen( temp ); if ( temp[len - 1] == ':' ) { temp[len - 1] = 0; } else { GetToken( false ); // : if ( strcmp( token,":" ) ) { // missing ? break; } } if ( !TokenAvailable() ) { break; } GetToken( false ); // the name newchoice = (choice_t *) malloc( sizeof( choice_s ) ); memset( newchoice, 0, sizeof( choice_s ) ); newchoice->value = atoi( temp ); newchoice->name = strdup( token ); newoption->choices = g_slist_append( newoption->choices, newchoice ); // ignore any remaining tokens on the line while ( TokenAvailable() ) GetToken( false ); // and it we found a "]" on the end of the line, put it back in the queue. if ( !strcmp( token,"]" ) ) { UnGetToken(); } } break; } // add option to the newclass if ( optioncomplete ) { if ( newoption ) { // add it to the list. newclass->l_optionlist = g_slist_append( newclass->l_optionlist, newoption ); } } else { Sys_Printf( "%WARNING: Parse error occured in '%s - %s'\n",classnames[newclass->classtype],newclass->classname ); Free_Option( newoption ); } } } else { UnGetToken(); // shouldn't get here. } } // add it to our list. l_classes = g_slist_append( l_classes, newclass ); } } // finished with the file now. g_free( data ); Sys_Printf( "FGD scan complete, building entities...\n" ); // Once we get here we should have a few (!) lists in memory that we // can extract all the information required to build a the eclass_t structures. Create_EClasses( l_classes ); // Free everything GSList *p = l_classes; while ( p ) { class_t *tmpclass = (class_t *)p->data; #ifdef FGD_VERBOSE // DEBUG: dump the info... Sys_Printf( "%s: %s (", classnames[tmpclass->classtype],tmpclass->classname ); for ( GSList *tmp = tmpclass->l_baselist; tmp != NULL; tmp = tmp->next ) { if ( tmp != tmpclass->l_baselist ) { Sys_Printf( ", " ); } Sys_Printf( "%s", (char *)tmp->data ); } if ( tmpclass->gotsize ) { sprintf( temp,"(%.0f %.0f %.0f) - (%.0f %.0f %.0f)",tmpclass->boundingbox[0][0], tmpclass->boundingbox[0][1], tmpclass->boundingbox[0][2], tmpclass->boundingbox[1][0], tmpclass->boundingbox[1][1], tmpclass->boundingbox[1][2] ); } else{ strcpy( temp,"No Size" ); } Sys_Printf( ") '%s' Size: %s",tmpclass->description ? tmpclass->description : "No description",temp ); if ( tmpclass->gotcolor ) { sprintf( temp,"(%d %d %d)",tmpclass->color[0], tmpclass->color[1], tmpclass->color[2] ); } else{ strcpy( temp,"No Color" ); } Sys_Printf( " Color: %s Options:\n",temp ); if ( !tmpclass->l_optionlist ) { Sys_Printf( " No Options\n" ); } else { option_t *tmpoption; int count; GSList *olst; for ( olst = tmpclass->l_optionlist, count = 1; olst != NULL; olst = olst->next, count++ ) { tmpoption = (option_t *)olst->data; Sys_Printf( " %d, Type: %s, EPair: %s\n", count,optionnames[tmpoption->optiontype], tmpoption->epairname ); choice_t *tmpchoice; GSList *clst; int ccount; for ( clst = tmpoption->choices, ccount = 1; clst != NULL; clst = clst->next, ccount++ ) { tmpchoice = (choice_t *)clst->data; Sys_Printf( " %d, Value: %d, Name: %s\n", ccount, tmpchoice->value, tmpchoice->name ); } } } #endif // free the baselist. ClearGSList( tmpclass->l_baselist ); Free_Class( tmpclass ); p = g_slist_remove( p, p->data ); } }
void WINAPI Pointfile_Check( void ) { char name[1024]; int size; char *data; char *text; int line = 1; vec3_t v; strcpy( name, currentmap ); StripExtension( name ); strcat( name, ".lin" ); size = vfsLoadFullPathFile( name, (void**)&data ); if ( size <= 0 ) { Sys_FPrintf( SYS_ERR, "Pointfile %s not found\n", name ); return; } // store a pointer text = data; Sys_Printf( "Reading pointfile %s\n", name ); g_pointfile.Init(); while ( *data ) { if ( sscanf( data,"%f %f %f", &v[0], &v[1], &v[2] ) != 3 ) { Sys_Printf( "Corrupt point file, line %d\n",line ); break; } while ( *data && *data != '\n' ) { if ( *( data - 1 ) == ' ' && *( data ) == '-' && *( data + 1 ) == ' ' ) { break; } data++; } // deal with zhlt style point files. if ( *data == '-' ) { if ( sscanf( data,"- %f %f %f", &v[0], &v[1], &v[2] ) != 3 ) { Sys_Printf( "Corrupt point file, line %d\n",line ); break; } while ( *data && *data != '\n' ) data++; } while ( *data == '\n' ) { data++; // skip the \n line++; } g_pointfile.PushPoint( v ); } g_free( text ); g_pointfile.GenerateDisplayList(); Sys_UpdateWindows( W_ALL ); }
// NOTE: when loading a file, you have to allocate one extra byte and set it to \0 int vfsLoadFile( const char *filename, void **bufferptr, int index ){ int i, count = 0; char tmp[NAME_MAX], fixed[NAME_MAX]; GSList *lst; *bufferptr = NULL; strcpy( fixed, filename ); vfsFixDOSName( fixed ); strlwr( fixed ); for ( i = 0; i < g_numDirs; i++ ) { strcpy( tmp, g_strDirs[i] ); strcat( tmp, filename ); if ( access( tmp, R_OK ) == 0 ) { if ( count == index ) { return vfsLoadFullPathFile( tmp,bufferptr ); /* long len; FILE *f; f = fopen (tmp, "rb"); if (f == NULL) return -1; fseek (f, 0, SEEK_END); len = ftell (f); rewind (f); *bufferptr = g_malloc (len+1); if (*bufferptr == NULL) return -1; fread (*bufferptr, 1, len, f); fclose (f); // we need to end the buffer with a 0 ((char*) (*bufferptr))[len] = 0; return len; */ } count++; } } // Textures in HalfLife wads don't have paths, but in the list of files // we store the actual full paths of the files and what WAD they're in. // so what we have to do is strip the paths and just compare filenames. // Hydra: well, we did do this, but now we don't, as the map loader now // fills in the correct paths for each texture. /* char *searchname; char *fixedptr; fixedptr = fixed; for (i = strlen(fixed)-1 ; i >= 0 && fixed[i] != '\\' && fixed[i] != '/' ; i --) fixedptr = (char *)fixed + i; */ for ( lst = g_pakFiles; lst != NULL; lst = g_slist_next( lst ) ) { VFS_PAKFILE* file = (VFS_PAKFILE*)lst->data; /* searchname = file->name; for (i = strlen(file->name)-1 ; i >= 0 && file->name[i] != '\\' && file->name[i] != '/' ; i --) searchname = (char *)file->name + i; if (strcmp (searchname, fixedptr) != 0) continue; */ if ( strcmp( file->name, fixed ) != 0 ) { continue; } if ( count == index ) { // Useful for debugging //Sys_Printf("VFSWAD: reading from %s\n",file->wadfile->wadfilename); if ( wadOpenCurrentFileByNum( file->wadfile, file->filenumber ) != 1 ) { return -1; } *bufferptr = g_malloc( file->size + 1 ); // we need to end the buffer with a 0 ( (char*) ( *bufferptr ) )[file->size] = 0; i = wadReadCurrentFile( file->wadfile, (char *)*bufferptr, file->size ); wadCloseCurrentFile( file->wadfile ); if ( i > 0 ) { return file->size; } else{ return -1; } } count++; } return -1; }