/* * Add a social to the social index table - Thoric * Hashed and insert sorted. */ void add_social( SOC_INDEX_DATA *social ) { SOC_INDEX_DATA *tmp; SOC_INDEX_DATA *prev; int hash; int x; if ( !social ) { bug( "Add_social: NULL social", 0 ); return; } if ( !social->name ) { bug( "Add_social: NULL social->name", 0 ); return; } if ( !social->char_no_arg ) { bug( "Add_social: NULL social->char_no_arg", 0 ); return; } /* make sure the name is all lowercase */ for ( x = 0; social->name[x] != '\0'; x++ ) social->name[x] = LOWER( social->name[x] ); if ( social->name[0] < 'a' || social->name[0] > 'z' ) hash = 0; else hash = ( social->name[0] - 'a' ) + 1; if ( !( prev = tmp = soc_index_hash[hash] ) ) { social->next = soc_index_hash[hash]; soc_index_hash[hash] = social; return; } for ( ; tmp; tmp = tmp->next ) { if ( !( x = strcmp( social->name, tmp->name ) ) ) { bug( "Add_social: trying to add duplicate name to bucket %d", hash); free_social( social ); return; } else if ( x < 0 ) { if ( tmp == soc_index_hash[hash] ) { social->next = soc_index_hash[hash]; soc_index_hash[hash] = social; return; } prev->next = social; social->next = tmp; return; } prev = tmp; } /* add to end */ prev->next = social; social->next = NULL; return; }
void fread_social( FILE *fp ) { const char *word; SOC_INDEX_DATA *social; bool fMatch; int stat; social = new_social( ); for ( ; ; ) { GET_TOKEN( fp, word, "End" ); fMatch = FALSE; switch ( UPPER( word[0] ) ) { case '*': fMatch = TRUE; fread_to_eol( fp ); break; case 'C': SKEY( "CharNoArg", social->char_no_arg ); SKEY( "CharFound", social->char_found ); SKEY( "CharAuto", social->char_auto ); break; case 'E': if ( !str_cmp( word, "End" ) ) { if ( !social->name ) { bugf( "Fread_social: Name not found" ); free_social( social ); return; } if ( !social->char_no_arg ) { bugf( "Fread_social: CharNoArg not found" ); free_social( social ); return; } add_social( social ); return; } break; case 'N': SKEY( "Name", social->name ); break; case 'O': SKEY( "OthersNoArg", social->others_no_arg ); SKEY( "OthersFound", social->others_found ); SKEY( "OthersAuto", social->others_auto ); break; case 'V': SKEY( "VictFound", social->vict_found ); break; } if ( !fMatch ) { bugf( "Fread_social: no match: %s. Skipping to next line.", word ); fread_to_eol( fp ); } } return; }
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 ); } } }