/* * This function reads one immortal host to a file. * Shaddai July 27, 1997 */ int fread_imm_host( FILE * fp, IMMORTAL_HOST * data ) { const char *word; bool fMatch; int temp; for( ;; ) { word = feof( fp ) ? "End" : fread_word( fp ); fMatch = FALSE; switch ( UPPER( word[0] ) ) { case 'E': if( !str_cmp( word, "End" ) ) return rNONE; case 'H': KEY( "Host", data->host, fread_string_nohash( fp ) ); break; case 'N': KEY( "Name", data->name, fread_string_nohash( fp ) ); break; case 'P': if( !str_cmp( word, "Prefix" ) ) { temp = fread_number( fp ); if( temp ) data->prefix = TRUE; else data->prefix = FALSE; fMatch = TRUE; } break; case 'S': if( !str_cmp( word, "Suffix" ) ) { temp = fread_number( fp ); if( temp ) data->suffix = TRUE; else data->suffix = FALSE; fMatch = TRUE; } break; } if( !fMatch ) { bug( "%s: no match: %s", __func__, word ); fread_to_eol( fp ); } } }
int fread_imm_host ( FILE *fp , IMMORTAL_HOST *data ) { char buf[MAX_STRING_LENGTH]; char *word; bool fMatch; int temp; for ( ; ; ) { word = feof (fp) ? "End" : fread_word (fp); fMatch = FALSE; switch ( UPPER ( word[0] ) ) { case 'E': if ( !str_cmp( word, "End" ) ) return rNONE; case 'H': KEY ("Host", data->host, fread_string_nohash (fp) ); break; case 'N': KEY ("Name", data->name, fread_string_nohash ( fp ) ); break; case 'P': if ( !str_cmp( word, "Prefix" ) ) { temp = fread_number ( fp ); if ( temp ) data->prefix = TRUE; else data->prefix = FALSE; fMatch = TRUE; } break; case 'S': if ( !str_cmp( word, "Suffix" ) ) { temp = fread_number ( fp ); if ( temp ) data->suffix = TRUE; else data->suffix = FALSE; fMatch = TRUE; } break; } if (!fMatch) { sprintf (buf, "Fread_immortal_host: no match: %s", word ); bug ( buf, 0 ); } } return rNONE; }
/* Read in an individual holiday */ void fread_day( HOLIDAY_DATA * day, FILE * fp ) { const char *word; bool fMatch; for( ;; ) { word = feof( fp ) ? "End" : fread_word( fp ); fMatch = FALSE; switch ( UPPER( word[0] ) ) { case '*': fMatch = TRUE; fread_to_eol( fp ); break; case 'A': KEY( "Announce", day->announce, fread_string_nohash( fp ) ); break; case 'D': KEY( "Day", day->day, fread_number( fp ) ); break; case 'E': if( !str_cmp( word, "End" ) ) { if( !day->announce ) day->announce = str_dup( "Today is a holiday, but who the hell knows which one." ); return; } break; case 'M': KEY( "Month", day->month, fread_number( fp ) ); break; case 'N': KEY( "Name", day->name, fread_string_nohash( fp ) ); break; } if( !fMatch ) bug( "fread_day: no match: %s", word ); } }
SHIP_DATA *load_ship( FILE * fp ) { SHIP_DATA *ship = NULL; const char *word; bool fMatch; word = feof( fp ) ? "EndShip" : fread_word( fp ); if( !str_cmp( word, "EndShip" ) ) return NULL; if( !str_cmp( word, "SHIPFNAME" ) ) { const char *name = fread_string_nohash( fp ); /* is this right? - Gavin */ SHIP_DATA *temp_ship = NULL; for( temp_ship = first_ship; temp_ship; temp_ship = temp_ship->next ) { if( !str_cmp( name, temp_ship->filename ) ) { ship = temp_ship; break; } } if( ship == NULL ) { bug( "%s: No ship data for filename %s", __FUNCTION__, name ); DISPOSE( name ); return NULL; for( ;; ) { word = feof( fp ) ? "EndShip" : fread_word( fp ); if( !str_cmp( word, "EndShip" ) ) break; } } DISPOSE( name ); } else { for( ;; ) { word = feof( fp ) ? "EndShip" : fread_word( fp ); if( !str_cmp( word, "EndShip" ) ) break; } bug( "%s: shipfname not found", __FUNCTION__ ); return NULL; } for( ;; ) { word = feof( fp ) ? "EndShip" : fread_word( fp ); fMatch = FALSE; switch ( UPPER( word[0] ) ) { case '*': fMatch = TRUE; fread_to_eol( fp ); break; /* * case '#': * if ( !str_cmp( word, "#TORPEDO" ) ) * { * mob->tempnum = -9999; * fread_obj( mob, fp, OS_CARRY ); * } * break; */ case 'A': KEY( "Autorecharge", ship->autorecharge, ( bool ) fread_number( fp ) ); KEY( "Autotrack", ship->autotrack, ( bool ) fread_number( fp ) ); KEY( "Autospeed", ship->autospeed, ( bool ) fread_number( fp ) ); KEY( "Autopilot", ship->autopilot, ( bool ) fread_number( fp ) ); break; case 'C': KEY( "Currspeed", ship->currspeed, fread_number( fp ) ); if( !str_cmp( word, "Currjump" ) ) { const char *temp = fread_string_nohash( fp ); extract_ship( ship ); ship->location = 0; ship->currjump = starsystem_from_name( temp ); DISPOSE( temp ); fMatch = TRUE; break; } KEY( "Chaff", ship->chaff, fread_number( fp ) ); break; case 'E': KEY( "Energy", ship->energy, fread_number( fp ) ); if( !str_cmp( word, "EndShip" ) ) { return ship; } if( !str_cmp( word, "End" ) ) /* End of object, need to ignore this. sometimes they creep in there somehow -- Scion */ fMatch = TRUE; /* Trick the system into thinking it matched something */ break; case 'H': KEY( "Hull", ship->hull, fread_number( fp ) ); KEY( "HX", ship->hx, ( float )fread_number( fp ) ); KEY( "HY", ship->hy, ( float )fread_number( fp ) ); KEY( "HZ", ship->hz, ( float )fread_number( fp ) ); KEY( "Hyperdistance", ship->hyperdistance, fread_number( fp ) ); break; case 'J': KEY( "JX", ship->jx, ( float )fread_number( fp ) ); KEY( "JY", ship->jy, ( float )fread_number( fp ) ); KEY( "JZ", ship->jz, ( float )fread_number( fp ) ); break; case 'L': if( !str_cmp( word, "Landdest" ) ) { STRFREE( ship->dest ); ship->dest = fread_string( fp ); fMatch = TRUE; break; } break; case 'M': KEY( "Missiles", ship->missiles, fread_number( fp ) ); break; case 'R': KEY( "Rockets", ship->rockets, fread_number( fp ) ); break; case 'S': KEY( "Shield", ship->shield, fread_number( fp ) ); KEY( "Shipstate", ship->shipstate, fread_number( fp ) ); if( !str_cmp( word, "Starsystem" ) ) { const char *star_name = fread_string_nohash( fp ); SPACE_DATA *starsystem = starsystem_from_name( star_name ); DISPOSE( star_name ); fMatch = TRUE; extract_ship( ship ); ship->location = 0; if( ship->starsystem ) ship_from_starsystem( ship, starsystem ); ship_to_starsystem( ship, starsystem ); break; } break; case 'T': KEY( "Torpedos", ship->torpedos, fread_number( fp ) ); if( !str_cmp( word, "target0" ) ) { const char *temp = fread_string( fp ); SHIP_DATA *target = get_ship( temp ); ship->target0 = target; STRFREE( temp ); fMatch = TRUE; break; } if( !str_cmp( word, "target1" ) ) { const char *temp = fread_string( fp ); SHIP_DATA *target = get_ship( temp ); ship->target1 = target; STRFREE( temp ); fMatch = TRUE; break; } if( !str_cmp( word, "target2" ) ) { const char *temp = fread_string( fp ); SHIP_DATA *target = get_ship( temp ); ship->target2 = target; STRFREE( temp ); fMatch = TRUE; break; } break; case 'V': KEY( "VX", ship->vx, ( float )fread_number( fp ) ); KEY( "VY", ship->vy, ( float )fread_number( fp ) ); KEY( "VZ", ship->vz, ( float )fread_number( fp ) ); break; } if( !fMatch && str_cmp( word, "End" ) ) bug( "%s: no match: %s", __FUNCTION__, word ); } return NULL; }
void fread_mssp_info( FILE * fp ) { const char *word; bool fMatch; for ( ;; ) { word = feof( fp ) ? "End" : fread_word( fp ); fMatch = FALSE; switch ( UPPER( word[0] ) ) { case '*': fMatch = TRUE; fread_to_eol( fp ); break; case 'A': KEY( "AdultMaterial", mssp_info->adultMaterial, fread_number( fp ) ); KEY( "Ansi", mssp_info->ansi, fread_number( fp ) ); break; case 'C': KEY( "Contact", mssp_info->contact, fread_string_nohash( fp ) ); KEY( "Created", mssp_info->created, fread_number( fp ) ); break; case 'E': KEY( "EquipmentSystem", mssp_info->equipmentSystem, fread_string_nohash( fp ) ); if ( !str_cmp( word, "End" ) ) return; break; case 'F': KEY( "Family", mssp_info->family, fread_string_nohash( fp ) ); break; case 'G': KEY( "Genre", mssp_info->genre, fread_string_nohash( fp ) ); KEY( "GamePlay", mssp_info->gamePlay, fread_string_nohash( fp ) ); KEY( "GameSystem", mssp_info->gameSystem, fread_string_nohash( fp ) ); break; case 'H': KEY( "Hostname", mssp_info->hostname, fread_string_nohash( fp ) ); KEY( "HiringBuilders", mssp_info->hiringBuilders, fread_number( fp ) ); KEY( "HiringCoders", mssp_info->hiringCoders, fread_number( fp ) ); break; case 'I': KEY( "Icon", mssp_info->icon, fread_string_nohash( fp ) ); KEY( "Intermud", mssp_info->intermud, fread_string_nohash( fp ) ); break; case 'L': KEY( "Language", mssp_info->language, fread_string_nohash( fp ) ); KEY( "Location", mssp_info->location, fread_string_nohash( fp ) ); break; case 'M': KEY( "MCCP", mssp_info->mccp, fread_number( fp ) ); KEY( "MCP", mssp_info->mcp, fread_number( fp ) ); KEY( "MinAge", mssp_info->minAge, fread_number( fp ) ); KEY( "MSP", mssp_info->msp, fread_number( fp ) ); KEY( "Multiclassing", mssp_info->multiclassing, fread_number( fp ) ); KEY( "Multiplaying", mssp_info->multiplaying, fread_string_nohash( fp ) ); KEY( "MXP", mssp_info->mxp, fread_number( fp ) ); break; case 'N': KEY( "NewbieFriendly", mssp_info->newbieFriendly, fread_number( fp ) ); break; case 'P': KEY( "Pay2Play", mssp_info->pay2play, fread_number( fp ) ); KEY( "Pay4Perks", mssp_info->pay4perks, fread_number( fp ) ); KEY( "PlayerCities", mssp_info->playerCities, fread_number( fp ) ); KEY( "PlayerClans", mssp_info->playerClans, fread_number( fp ) ); KEY( "PlayerCrafting", mssp_info->playerCrafting, fread_number( fp ) ); KEY( "PlayerGuilds", mssp_info->playerGuilds, fread_number( fp ) ); KEY( "PlayerKilling", mssp_info->playerKilling, fread_string_nohash( fp ) ); KEY( "Pueblo", mssp_info->pueblo, fread_number( fp ) ); break; case 'Q': KEY( "QuestSystem", mssp_info->questSystem, fread_string_nohash( fp ) ); break; case 'R': KEY( "RolePlaying", mssp_info->roleplaying, fread_string_nohash( fp ) ); break; case 'S': KEY( "SSL", mssp_info->ssl, fread_number( fp ) ); KEY( "Status", mssp_info->status, fread_string_nohash( fp ) ); KEY( "SubGenre", mssp_info->subgenre, fread_string_nohash( fp ) ); break; case 'T': KEY( "TrainingSystem", mssp_info->trainingSystem, fread_string_nohash( fp ) ); break; case 'V': KEY( "Vt100", mssp_info->vt100, fread_number( fp ) ); break; case 'W': KEY( "Website", mssp_info->website, fread_string_nohash( fp ) ); KEY( "WorldOriginality", mssp_info->worldOriginality, fread_string_nohash( fp ) ); KEY( "Worlds", mssp_info->worlds, fread_number( fp ) ); break; case 'X': KEY( "Xterm256", mssp_info->xterm256, fread_number( fp ) ); break; } if ( !fMatch ) bug( "%s: no match: %s", __FUNCTION__, word ); } }
void fread_command( FILE * fp ) { char buf[MAX_STRING_LENGTH]; const char *word; bool fMatch; CMDTYPE *command; CREATE( command, CMDTYPE, 1 ); for( ;; ) { word = feof( fp ) ? "End" : fread_word( fp ); fMatch = FALSE; switch ( UPPER( word[0] ) ) { case '*': fMatch = TRUE; fread_to_eol( fp ); break; case 'C': KEY( "Code", command->fun_name, str_dup( fread_word( fp ) ) ); break; case 'E': if ( !str_cmp( word, "End" ) ) { if( !command->name ) { bug( "%s", "Fread_command: Name not found" ); free_command( command ); return; } if( !command->fun_name ) { bug( "fread_command: No function name supplied for %s", command->name ); free_command( command ); return; } /* * Mods by Trax * Fread in code into char* and try linkage here then * deal in the "usual" way I suppose.. */ command->do_fun = skill_function( command->fun_name ); if( command->do_fun == skill_notfound ) { bug( "Fread_command: Function %s not found for %s", command->fun_name, command->name ); free_command( command ); return; } add_command( command ); return; } break; case 'L': KEY( "Level", command->level, fread_number( fp ) ); KEY( "Log", command->log, fread_number( fp ) ); break; case 'N': KEY( "Name", command->name, fread_string_nohash( fp ) ); break; case 'P': KEY( "Position", command->position, fread_number( fp ) ); break; } if( !fMatch ) { sprintf( buf, "Fread_command: no match: %s", word ); bug( buf, 0 ); } } }
void fread_social( FILE * fp ) { char buf[MAX_STRING_LENGTH]; const char *word; bool fMatch; SOCIALTYPE *social; CREATE( social, SOCIALTYPE, 1 ); for( ;; ) { word = feof( fp ) ? "End" : fread_word( fp ); fMatch = FALSE; switch ( UPPER( word[0] ) ) { case '*': fMatch = TRUE; fread_to_eol( fp ); break; case 'C': KEY( "CharNoArg", social->char_no_arg, fread_string_nohash( fp ) ); KEY( "CharFound", social->char_found, fread_string_nohash( fp ) ); KEY( "CharAuto", social->char_auto, fread_string_nohash( fp ) ); break; case 'E': if( !str_cmp( word, "End" ) ) { if( !social->name ) { bug( "Fread_social: Name not found", 0 ); free_social( social ); return; } if( !social->char_no_arg ) { bug( "Fread_social: CharNoArg not found", 0 ); free_social( social ); return; } add_social( social ); return; } break; case 'N': KEY( "Name", social->name, fread_string_nohash( fp ) ); break; case 'O': KEY( "OthersNoArg", social->others_no_arg, fread_string_nohash( fp ) ); KEY( "OthersFound", social->others_found, fread_string_nohash( fp ) ); KEY( "OthersAuto", social->others_auto, fread_string_nohash( fp ) ); break; case 'V': KEY( "VictFound", social->vict_found, fread_string_nohash( fp ) ); break; } if( !fMatch ) { sprintf( buf, "Fread_social: no match: %s", word ); bug( buf, 0 ); } } }
void fread_fuss_room( FILE * fp, area_data * tarea ) { room_index *pRoomIndex = NULL; bool oldroom = false; for( ;; ) { const char *word = ( feof( fp ) ? "#ENDROOM" : fread_word( fp ) ); if( word[0] == '\0' ) { log_printf( "%s: EOF encountered reading file!", __func__ ); word = "#ENDROOM"; } switch ( word[0] ) { default: bug( "%s: no match: %s", __func__, word ); fread_to_eol( fp ); break; case '#': if( !str_cmp( word, "#ENDROOM" ) ) { if( !oldroom ) { room_index_table.insert( map < int, room_index * >::value_type( pRoomIndex->vnum, pRoomIndex ) ); tarea->rooms.push_back( pRoomIndex ); ++top_room; } return; } // Format of this section is identical to AFKMud. Let's cheat :) if( !str_cmp( word, "#EXIT" ) ) { fread_afk_exit( fp, pRoomIndex ); break; } // Format of this section is identical to AFKMud. Let's cheat :) if( !str_cmp( word, "#EXDESC" ) ) { extra_descr_data *ed = fread_afk_exdesc( fp ); if( ed ) pRoomIndex->extradesc.push_back( ed ); break; } // Format of this section is identical to AFKMud. Let's cheat :) if( !str_cmp( word, "#MUDPROG" ) ) { mud_prog_data *mprg = new mud_prog_data; fread_afk_mudprog( fp, mprg, pRoomIndex ); pRoomIndex->mudprogs.push_back( mprg ); ++top_prog; break; } break; case 'A': if( !str_cmp( word, "Affect" ) || !str_cmp( word, "AffectData" ) ) { affect_data *af = fread_fuss_affect( fp, word ); if( af ) pRoomIndex->permaffects.push_back( af ); break; } break; case 'D': KEY( "Desc", pRoomIndex->roomdesc, fread_string_nohash( fp ) ); break; case 'F': if( !str_cmp( word, "Flags" ) ) { flag_set( fp, pRoomIndex->flags, fuss_r_flags ); break; } break; case 'N': KEY( "Name", pRoomIndex->name, fread_string( fp ) ); break; // Format of this section is identical to AFKMud. Let's cheat :) case 'R': CLKEY( "Reset", pRoomIndex->load_reset( fp, false ) ); break; case 'S': if( !str_cmp( word, "Sector" ) ) { const char *sec_type = fread_flagstring( fp ); int sector = get_fuss_sectypes( sec_type ); if( sector < 0 || sector >= SECT_MAX ) { bug( "%s: Room #%d has bad sector type: %s", __func__, pRoomIndex->vnum, sec_type ); sector = 1; } pRoomIndex->sector_type = sector; pRoomIndex->winter_sector = -1; break; } if( !str_cmp( word, "Stats" ) ) { const char *ln = fread_line( fp ); int x1, x2, x3, x4; x1 = x2 = x3 = x4 = 0; sscanf( ln, "%d %d %d %d", &x1, &x2, &x3, &x4 ); pRoomIndex->tele_delay = x1; pRoomIndex->tele_vnum = x2; pRoomIndex->tunnel = x3; pRoomIndex->max_weight = x4; break; } break; case 'V': if( !str_cmp( word, "Vnum" ) ) { bool tmpBootDb = fBootDb; fBootDb = false; int vnum = fread_number( fp ); list < area_data * >::iterator iarea; for( iarea = arealist.begin( ); iarea != arealist.end( ); ++iarea ) { area_data *area = *iarea; if( !str_cmp( area->filename, tarea->filename ) ) continue; bool area_conflict = check_area_conflict( area, vnum, vnum ); if( area_conflict ) { log_printf( "ERROR: %s has vnum conflict with %s!", tarea->filename, ( area->filename ? area->filename : "(invalid)" ) ); log_printf( "%s occupies vnums : %-6d - %-6d", ( area->filename ? area->filename : "(invalid)" ), area->low_vnum, area->hi_vnum ); log_printf( "%s wants to use vnum: %-6d", tarea->filename, vnum ); log_string( "This is a fatal error. Program terminated." ); exit( 1 ); } } if( get_room_index( vnum ) ) { if( tmpBootDb ) { fBootDb = tmpBootDb; bug( "%s: vnum %d duplicated.", __func__, vnum ); // Try to recover, read to end of duplicated room and then bail out for( ;; ) { word = feof( fp ) ? "#ENDROOM" : fread_word( fp ); if( !str_cmp( word, "#ENDROOM" ) ) return; } } else { pRoomIndex = get_room_index( vnum ); log_printf_plus( LOG_BUILD, sysdata->build_level, "Cleaning room: %d", vnum ); pRoomIndex->clean_room( ); oldroom = true; } } else { pRoomIndex = new room_index; pRoomIndex->clean_room( ); } pRoomIndex->vnum = vnum; pRoomIndex->area = tarea; fBootDb = tmpBootDb; if( fBootDb ) { if( !tarea->low_vnum ) tarea->low_vnum = vnum; if( vnum > tarea->hi_vnum ) tarea->hi_vnum = vnum; } if( !pRoomIndex->resets.empty( ) ) { if( fBootDb ) { int count = 0; list < reset_data * >::iterator rst; bug( "%s: WARNING: resets already exist for this room.", __func__ ); for( rst = pRoomIndex->resets.begin( ); rst != pRoomIndex->resets.end( ); ++rst ) { reset_data *rtmp = *rst; ++count; if( !rtmp->resets.empty( ) ) count += rtmp->resets.size( ); } } else { /* * Clean out the old resets */ log_printf_plus( LOG_BUILD, sysdata->build_level, "Cleaning resets: %s", tarea->name ); pRoomIndex->clean_resets( ); } } break; } break; } } }
void fread_fuss_areadata( FILE * fp, area_data * tarea ) { for( ;; ) { const char *word = ( feof( fp ) ? "#ENDAREADATA" : fread_word( fp ) ); if( word[0] == '\0' ) { log_printf( "%s: EOF encountered reading file!", __func__ ); word = "#ENDAREADATA"; } switch ( word[0] ) { default: log_printf( "%s: no match: %s", __func__, word ); fread_to_eol( fp ); break; case '#': if( !str_cmp( word, "#ENDAREADATA" ) ) { tarea->age = tarea->reset_frequency; return; } break; case 'A': KEY( "Author", tarea->author, fread_string( fp ) ); break; case 'C': KEY( "Credits", tarea->credits, fread_string( fp ) ); break; case 'E': // Economy field is unused by AFKMud - skip it. if( !str_cmp( word, "Economy" ) ) { fread_number( fp ); fread_number( fp ); break; } break; case 'F': if( !str_cmp( word, "Flags" ) ) { flag_set( fp, tarea->flags, area_flags ); break; } break; case 'N': KEY( "Name", tarea->name, fread_string_nohash( fp ) ); break; case 'R': if( !str_cmp( word, "Ranges" ) ) { int x1, x2, x3, x4; const char *ln = fread_line( fp ); x1 = x2 = x3 = x4 = 0; sscanf( ln, "%d %d %d %d", &x1, &x2, &x3, &x4 ); tarea->low_soft_range = x1; tarea->hi_soft_range = x2; tarea->low_hard_range = x3; tarea->hi_hard_range = x4; break; } KEY( "ResetMsg", tarea->resetmsg, fread_string_nohash( fp ) ); KEY( "ResetFreq", tarea->reset_frequency, fread_short( fp ) ); break; case 'S': // Spelllimit field is unused by AFKMud - skip it. if( !str_cmp( word, "Spelllimit" ) ) { fread_number( fp ); break; } break; case 'V': KEY( "Version", tarea->version, fread_number( fp ) ); break; // FIXME: Uncomment this when we've converted Kayle's weather code. //case 'W': // KEY( "WeatherX", tarea->weatherx, fread_number( fp ) ); // KEY( "WeatherY", tarea->weathery, fread_number( fp ) ); // break; } } }
NOTE_DATA *read_note( char *notefile, FILE * fp ) { NOTE_DATA *pnote = NULL; for( ;; ) { const char *word = NULL; char letter = 0; do { letter = fgetc( fp ); if( feof( fp ) ) { fclose( fp ); return NULL; } } while( isspace( ( int ) letter ) ) ; ungetc( letter, fp ); CREATE( pnote, NOTE_DATA, 1 ); if( str_cmp( fread_word( fp ), "sender" ) ) break; pnote->sender = fread_string( fp ); if( str_cmp( fread_word( fp ), "date" ) ) break; pnote->date = fread_string( fp ); if( str_cmp( fread_word( fp ), "to" ) ) break; pnote->to_list = fread_string( fp ); if( str_cmp( fread_word( fp ), "subject" ) ) break; pnote->subject = fread_string( fp ); word = fread_word( fp ); if( !str_cmp( word, "voting" ) ) { pnote->voting = fread_number( fp ); if( str_cmp( fread_word( fp ), "yesvotes" ) ) break; pnote->yesvotes = fread_string_nohash( fp ); if( str_cmp( fread_word( fp ), "novotes" ) ) break; pnote->novotes = fread_string_nohash( fp ); if( str_cmp( fread_word( fp ), "abstentions" ) ) break; pnote->abstentions = fread_string_nohash( fp ); word = fread_word( fp ); } if( str_cmp( word, "text" ) ) break; pnote->text = fread_string( fp ); if( !pnote->yesvotes ) pnote->yesvotes = str_dup( "" ); if( !pnote->novotes ) pnote->novotes = str_dup( "" ); if( !pnote->abstentions ) pnote->abstentions = str_dup( "" ); pnote->next = NULL; pnote->prev = NULL; return pnote; } bug( "read_note: bad key word.", 0 ); exit( 1 ); }
BOARD_DATA *read_board( const char *boardfile, FILE * fp ) { BOARD_DATA *board = NULL; char buf[MAX_STRING_LENGTH]; bool fMatch = FALSE; char letter = 0; do { letter = fgetc( fp ); if( feof( fp ) ) { fclose( fp ); return NULL; } } while( isspace( ( int ) letter ) ); ungetc( letter, fp ); CREATE( board, BOARD_DATA, 1 ); for( ;; ) { const char *word = feof( fp ) ? "End" : fread_word( fp ); fMatch = FALSE; switch ( UPPER( word[0] ) ) { case '*': fMatch = TRUE; fread_to_eol( fp ); break; case 'E': KEY( "Extra_readers", board->extra_readers, fread_string_nohash( fp ) ); KEY( "Extra_removers", board->extra_removers, fread_string_nohash( fp ) ); if( !str_cmp( word, "End" ) ) { board->num_posts = 0; board->first_note = NULL; board->last_note = NULL; board->next = NULL; board->prev = NULL; if( !board->read_group ) board->read_group = str_dup( "" ); if( !board->post_group ) board->post_group = str_dup( "" ); if( !board->extra_readers ) board->extra_readers = str_dup( "" ); if( !board->extra_removers ) board->extra_removers = str_dup( "" ); return board; } case 'F': KEY( "Filename", board->note_file, fread_string_nohash( fp ) ); case 'M': KEY( "Min_read_level", board->min_read_level, fread_number( fp ) ); KEY( "Min_post_level", board->min_post_level, fread_number( fp ) ); KEY( "Min_remove_level", board->min_remove_level, fread_number( fp ) ); KEY( "Max_posts", board->max_posts, fread_number( fp ) ); case 'P': KEY( "Post_group", board->post_group, fread_string_nohash( fp ) ); case 'R': KEY( "Read_group", board->read_group, fread_string_nohash( fp ) ); case 'T': KEY( "Type", board->type, fread_number( fp ) ); case 'V': KEY( "Vnum", board->board_obj, fread_number( fp ) ); } if( !fMatch ) { sprintf( buf, "read_board: no match: %s", word ); bug( buf, 0 ); } } return board; }
void fread_finger( CHAR_DATA *ch, FILE *fp, char *laston ) { char buf[MAX_STRING_LENGTH]; char *word; char *email = NULL; char *homepage = NULL; char *name = NULL; char *site = NULL; char *title = NULL; int race = 0, sex = 0; int level = 0; bool fMatch; for ( ; ; ) { word = feof( fp ) ? "End" : fread_word( fp ); fMatch = FALSE; switch ( UPPER(word[0]) ) { case '*': fMatch = TRUE; fread_to_eol( fp ); break; case 'E': if ( !strcmp( word, "End" ) ) goto finger_display; KEY( "Email", email, fread_string_nohash( fp ) ); break; case 'H': KEY( "Homepage", homepage, fread_string_nohash( fp ) ); break; case 'L': KEY( "Level", level, fread_number( fp ) ); break; case 'N': KEY ("Name", name, fread_string( fp ) ); break; case 'R': KEY( "Race", race, fread_number( fp ) ); break; case 'S': KEY( "Sex", sex, fread_number( fp ) ); KEY( "Site", site, fread_string( fp ) ); break; case 'T': KEY( "Title", title, fread_string( fp ) ); break; } if ( !fMatch ) { sprintf( buf, "finger.c: fread_finger: no match: %s", word ); bug( buf, 0 ); } } /* Extremely ugly and disgusting goto hack, if there's a better way to do this, I'd sure like to know - Samson */ finger_display: /* if ( top_level >= LEVEL_IMMORTAL && !IS_IMMORTAL(ch) ) { send_to_char( "Cannot finger an immortal.\n\r", ch ); return; } if ( ( ch->top_level < top_level && ch->top_level < LEVEL_INFINITE ) && IS_IMMORTAL(ch) ) { send_to_char( "Cannot finger an immortal above your own level.\n\r", ch ); return; } */ if( level > 100 && !IS_IMMORTAL(ch) ) { send_to_char("You can not finger an Immortal!\r\n", ch); return; } send_to_char("&w Finger Info\n\r", ch); send_to_char(" -----------\n\r", ch); ch_printf(ch, "&wName : &G%-20s\n\r", name ); /* ch_printf(ch, "&wLevel: &G%-20d\n\r", top_level );*/ ch_printf(ch, "&wSex : &G%-20s &w\n\r", sex == SEX_MALE ? "Male" : sex == SEX_FEMALE ? "Female" : "Neutral"); ch_printf(ch, "&wTitle: &G%s\n\r", title ); ch_printf(ch, "&wHomepage: &G%s\n\r", homepage ? homepage : "None" ); ch_printf(ch, "&wEmail: &G%s\n\r", email ? email : "None specified" ); ch_printf(ch, "&wLast on: &G%s\n\r", laston ); if ( IS_IMMORTAL(ch) ) ch_printf(ch, "&wFrom site: &G%s\n\r", site ); return; }
void fread_ban( FILE * fp, int type ) { BAN_DATA *pban; unsigned int i = 0; bool fMatch = FALSE; CREATE( pban, BAN_DATA, 1 ); pban->name = fread_string_nohash( fp ); pban->level = fread_number( fp ); pban->duration = fread_number( fp ); pban->unban_date = fread_number( fp ); if( type == BAN_SITE ) { /* Sites have 2 extra numbers written out */ pban->prefix = fread_number( fp ); pban->suffix = fread_number( fp ); } pban->warn = fread_number( fp ); pban->ban_by = fread_string_nohash( fp ); pban->ban_time = fread_string_nohash( fp ); pban->note = fread_string( fp ); /* * Need to lookup the class or race number if it is of that type */ if( type == BAN_CLASS ) for( i = 0; i < MAX_CLASS; i++ ) { if( !str_cmp( class_table[i]->who_name, pban->name ) ) { fMatch = TRUE; break; } } else if( type == BAN_RACE ) for( i = 0; i < MAX_RACE; i++ ) { if( !str_cmp( race_table[i]->race_name, pban->name ) ) { fMatch = TRUE; break; } } else if( type == BAN_SITE ) for( i = 0; i < strlen( pban->name ); i++ ) { if( pban->name[i] == '@' ) { char *temp; const char *temp2; temp = str_dup( pban->name ); temp[i] = '\0'; temp2 = &pban->name[i + 1]; DISPOSE( pban->name ); pban->name = str_dup( temp2 ); DISPOSE( temp ); break; } } if( type == BAN_RACE || type == BAN_CLASS ) { if( fMatch ) pban->flag = i; else /* The file is corupted throw out this ban structure */ { bug( "Bad class structure %d.\r\n", i ); free_ban( pban ); return; } } if( type == BAN_CLASS ) LINK( pban, first_ban_class, last_ban_class, next, prev ); else if( type == BAN_RACE ) LINK( pban, first_ban_race, last_ban_race, next, prev ); else if( type == BAN_SITE ) LINK( pban, first_ban, last_ban, next, prev ); else /* Bad type throw out the ban structure */ { bug( "Fread_ban: Bad type %d", type ); free_ban( pban ); } return; }