pc_token_list *CreateTokenList( int handle ) { pc_token_t token; char filename[ MAX_QPATH ]; pc_token_list *current = nullptr; pc_token_list *root = nullptr; while ( trap_Parse_ReadToken( handle, &token ) ) { pc_token_list *list = ( pc_token_list * ) BG_Alloc( sizeof( pc_token_list ) ); if ( current ) { list->prev = current; current->next = list; } else { list->prev = list; root = list; } current = list; current->next = nullptr; current->token.floatvalue = token.floatvalue; current->token.intvalue = token.intvalue; current->token.subtype = token.subtype; current->token.type = token.type; current->token.string = BG_strdup( token.string ); trap_Parse_SourceFileAndLine( handle, filename, ¤t->token.line ); } return root; }
/* ============ BG_VoiceParseError ============ */ static void NORETURN BG_VoiceParseError( fileHandle_t handle, char *err ) { int line; char filename[ MAX_QPATH ]; trap_Parse_SourceFileAndLine( handle, filename, &line ); trap_Parse_FreeSource( handle ); Com_Error( ERR_FATAL, "%s on line %d of %s", err, line, filename ); }
/* ================= PC_SourceError ================= */ void PRINTF_LIKE(2) PC_SourceError( int handle, const char *format, ... ) { int line; char filename[ 128 ]; va_list argptr; static char string[ 4096 ]; va_start( argptr, format ); Q_vsnprintf( string, sizeof( string ), format, argptr ); va_end( argptr ); filename[ 0 ] = '\0'; line = 0; trap_Parse_SourceFileAndLine( handle, filename, &line ); Com_Printf( S_ERROR "%s, line %d: %s\n", filename, line, string ); }
/* ============ BG_VoiceParse ============ */ static voiceCmd_t *BG_VoiceParse( const char *name ) { voiceCmd_t *voiceCmds = NULL; voiceCmd_t *top = NULL; pc_token_t token; qboolean parsingCmd = qfalse; int handle; handle = trap_Parse_LoadSource( va( "voice/%s.voice", name ) ); if ( !handle ) { return NULL; } while ( trap_Parse_ReadToken( handle, &token ) ) { if ( parsingCmd ) { if ( token.string[ 0 ] == '{' ) { voiceCmds->tracks = BG_VoiceParseCommand( handle ); parsingCmd = qfalse; continue; } else { int line; char filename[ MAX_QPATH ]; trap_Parse_SourceFileAndLine( handle, filename, &line ); Com_Error( ERR_FATAL, "BG_VoiceParse(): " "parse error on line %d of %s", line, filename ); } } if ( strlen( token.string ) >= MAX_VOICE_CMD_LEN ) { int line; char filename[ MAX_QPATH ]; trap_Parse_SourceFileAndLine( handle, filename, &line ); Com_Error( ERR_FATAL, "BG_VoiceParse(): " "command \"%s\" exceeds MAX_VOICE_CMD_LEN (%d) on line %d of %s", token.string, MAX_VOICE_CMD_LEN, line, filename ); } if ( top == NULL ) { voiceCmds = BG_Alloc( sizeof( voiceCmd_t ) ); top = voiceCmds; } else { voiceCmds->next = BG_Alloc( sizeof( voiceCmd_t ) ); voiceCmds = voiceCmds->next; } Q_strncpyz( voiceCmds->cmd, token.string, sizeof( voiceCmds->cmd ) ); voiceCmds->next = NULL; parsingCmd = qtrue; } trap_Parse_FreeSource( handle ); return top; }
/* ============ BG_VoiceParseCommand ============ */ static voiceTrack_t *BG_VoiceParseCommand( int handle ) { pc_token_t token; qboolean parsingTrack = qfalse; voiceTrack_t *voiceTracks = NULL; voiceTrack_t *top = NULL; while ( trap_Parse_ReadToken( handle, &token ) ) { if ( !parsingTrack && token.string[ 0 ] == '}' ) { return top; } if ( parsingTrack ) { if ( token.string[ 0 ] == '{' ) { BG_VoiceParseTrack( handle, voiceTracks ); parsingTrack = qfalse; continue; } else { BG_VoiceParseError( handle, va( "BG_VoiceParseCommand(): " "parse error at \"%s\"", token.string ) ); } } if ( top == NULL ) { voiceTracks = BG_Alloc( sizeof( voiceTrack_t ) ); top = voiceTracks; } else { voiceTracks->next = BG_Alloc( sizeof( voiceCmd_t ) ); voiceTracks = voiceTracks->next; } if ( !trap_FS_FOpenFile( token.string, NULL, FS_READ ) ) { int line; char filename[ MAX_QPATH ]; trap_Parse_SourceFileAndLine( handle, filename, &line ); Com_Printf( S_WARNING "BG_VoiceParseCommand(): " "track \"%s\" referenced on line %d of %s does not exist\n", token.string, line, filename ); } else { #ifdef CGAME voiceTracks->track = trap_S_RegisterSound( token.string, qfalse ); voiceTracks->duration = 0; // FIXME: Was always zero... #endif } voiceTracks->team = -1; voiceTracks->pClass = -1; voiceTracks->weapon = -1; voiceTracks->enthusiasm = 0; voiceTracks->text = NULL; voiceTracks->next = NULL; parsingTrack = qtrue; } return NULL; }