[BACK]Return to dictutil.c CVS log [TXT][DIR] Up to [contributed] / early-roguelike / urogue

Annotation of early-roguelike/urogue/dictutil.c, Revision 1.1

1.1     ! rubenllo    1: /*
        !             2:     dictutil.c
        !             3:
        !             4:     UltraRogue: The Ultimate Adventure in the Dungeons of Doom
        !             5:     Copyright (C) 1995 Herb Chong
        !             6:     All rights reserved.
        !             7:
        !             8:     See the file LICENSE.TXT for full copyright and licensing information.
        !             9: */
        !            10:
        !            11: /*************************************************************************
        !            12: **   Utilities for Dictionary Maintenence Functions
        !            13: *************************************************************************/
        !            14:
        !            15: static char sccsid[] = "%W% %G%";
        !            16:
        !            17: #include <stdio.h>
        !            18: #include <string.h>
        !            19: #include <stdlib.h>
        !            20: #if !defined(OS2) && !defined(_WIN32)
        !            21:    #include <unistd.h>
        !            22: #else
        !            23:    #include <io.h>
        !            24:    #include <fcntl.h>
        !            25: #endif
        !            26:
        !            27: #include "dict.h"
        !            28: #include "dictutil.h"
        !            29: #include "rogue.h"
        !            30:
        !            31: int   dict_trace;
        !            32: FILE  *ft;
        !            33:
        !            34:
        !            35: /***********
        !            36: **  Read 'count' characters into 'buffer' at 'offset' in a binary file
        !            37: **  Return 0 on success; -1 on failure;
        !            38: ***********/
        !            39:
        !            40: int block_read( FILE *fi , char *buffer , size_t count , long offset )
        !            41: {
        !            42:    if ( fseek(fi,offset,SEEK_SET) == -1 )
        !            43:       return( -1 );
        !            44:
        !            45:    if ( fread(buffer,1,count,fi) != count )
        !            46:       return( -1 );
        !            47:    return( 0 );
        !            48: }
        !            49:
        !            50: /***********
        !            51: **  Write 'count' characters from 'buffer' to a binary file.
        !            52: **  Return -1 on failure; 0 on success.
        !            53: ***********/
        !            54:
        !            55: int block_write( FILE *fo , char *buffer , size_t count )
        !            56: {
        !            57:    if ( fwrite(buffer,1,count,fo) != count )
        !            58:       return( -1 );
        !            59:    return( 0 );
        !            60: }
        !            61:
        !            62: /***********
        !            63: **  Load a dictionary table entry with id TOC_id into memory pointed to by block.
        !            64: **  Update the dictionary TOC.
        !            65: **  If *block=NULL, allocate the block of memory.
        !            66: **  Return 0 on success; -1 on failure.
        !            67: **  Set dt_entry->ptr to where the block is stored.
        !            68: ***********/
        !            69:
        !            70: void *dict_load_block( DICTIONARY *dict , char *toc_id ,
        !            71:                           FILE *fi , void *block )
        !            72: {  DICT_TOC_ENTRY  *dt_entry;
        !            73:    static void     *ptr;
        !            74:    int             index, ret_code;
        !            75:
        !            76:    index = dict_toc_index( dict , toc_id );
        !            77:    if ( index != -1 ) {  /* Found the id */
        !            78:       dt_entry = &(dict->toc[index]);
        !            79:    } else {
        !            80:       signal_error( "dict_load_block: could not find TOC_id" , toc_id , 1 );
        !            81:       return( NULL );
        !            82:    } /* endif */
        !            83:
        !            84:    if ( block == NULL ) {
        !            85:       ptr = malloc( dt_entry->size );
        !            86:       if ( dict_trace > 3 ) {
        !            87:          fprintf( ft , "\ndict_load_block allocates %lx bytes at location %p\n" ,
        !            88:                    dt_entry->size , ptr );
        !            89:       } /* endif */
        !            90:    } else {
        !            91:       ptr = block;
        !            92:       if ( dict_trace > 3 ) {
        !            93:          fprintf( ft , "\ndict_load_block uses memory at location %p\n" , ptr );
        !            94:       } /* endif */
        !            95:    } /* endif */
        !            96:    if ( ptr == NULL ) {
        !            97:       signal_error( "dict_load_block: alloc failed " , toc_id , 1 );
        !            98:       return( NULL );
        !            99:    } /* endif */
        !           100:
        !           101:    ret_code = block_read( fi ,
        !           102:                           (char*)ptr ,
        !           103:                           dt_entry->size ,
        !           104:                           dt_entry->offset );
        !           105:    if ( ret_code == -1 )
        !           106:       return( NULL );
        !           107:
        !           108:    if ( dt_entry->checksum !=
        !           109:         compute_checksum( dt_entry->size , (char*)ptr ) ) {
        !           110:       signal_error( "dict_load_block: invalid checksum ", toc_id, 1);
        !           111:       return( NULL );
        !           112:    } /* endif */
        !           113:
        !           114:    dt_entry->ptr = ptr;
        !           115:
        !           116:    if ( dict_trace > 3 ) {
        !           117:       fprintf( ft , "\nLoaded block\nTOC entry:    id:%s  offset:%lx  size:%lx  ptr:%p  checksum:%lx  type:%d\n" ,
        !           118:                dict->toc[index].id , dict->toc[index].offset ,
        !           119:                dict->toc[index].size , dict->toc[index].ptr ,
        !           120:                dict->toc[index].checksum , dict->toc[index].type );
        !           121:    } /* endif */
        !           122:
        !           123:    return( ptr );
        !           124: }
        !           125:
        !           126: /***********
        !           127: **  Save a dictionary table entry.
        !           128: **  Update the dictionary TOC entry offset and checksum fields.
        !           129: **  Return 0 on success, -1 on failure.
        !           130: **  Note: It is assumed that the size and pointer fields in TOC entry are
        !           131: **        already up to date; i.e., that they are consistent with the current
        !           132: **        location and size of the block being written. This is essential
        !           133: **        because the table of contents must have already been written
        !           134: **        into the file.
        !           135: ***********/
        !           136:
        !           137: BOOLEANC dict_save_block( DICTIONARY *dict , char *toc_id , FILE *fo )
        !           138: {  DICT_TOC_ENTRY   *dt_entry;
        !           139:    int              index, ret_code;
        !           140:    char             *block;
        !           141:
        !           142:    index = dict_toc_index( dict , toc_id );
        !           143:    if ( index == -1 ) {
        !           144:       signal_error( "dict_save_block: id not found " , toc_id , 1 );
        !           145:       return( FALSE );
        !           146:    } /* endif */
        !           147:    dt_entry = &(dict->toc[index]);
        !           148:    block = (char*)(dt_entry->ptr);
        !           149:
        !           150:    if ( block == NULL ) {
        !           151:       signal_error( "dict_save_block: NULL block " , toc_id , 1 );
        !           152:       return( FALSE );
        !           153:    } /* endif */
        !           154:
        !           155:    /* dt_entry->offset = fseek( fo , 0 , SEEK_END ); */
        !           156:    dt_entry->checksum = compute_checksum( dt_entry->size , block );
        !           157:    ret_code = block_write( fo , dt_entry->ptr , dt_entry->size );
        !           158:    if ( ret_code == -1 ) {
        !           159:       signal_error( "dict_save_block: block_write failed " , toc_id , 1 );
        !           160:       return( FALSE );
        !           161:    } /* endif */
        !           162:
        !           163:    if ( dict_trace > 3 ) {
        !           164:       fprintf( ft , "\nStored block\nTOC entry:           id:%s  offset:%lx  size:%lx  ptr:%p  checksum:%lx  type:%d\n" ,
        !           165:                dict->toc[index].id , dict->toc[index].offset ,
        !           166:                dict->toc[index].size , dict->toc[index].ptr ,
        !           167:                dict->toc[index].checksum , dict->toc[index].type );
        !           168:    } /* endif */
        !           169:
        !           170:    return( TRUE );
        !           171: }
        !           172:
        !           173: /***********
        !           174: **  Look up and id in the table of contents.
        !           175: **  Return its index (-1 on failure).
        !           176: ***********/
        !           177:
        !           178: int dict_toc_index( DICTIONARY *dict , char *toc_id )
        !           179: {  int index;
        !           180:
        !           181:    for ( index = 0 ; index < dict->sig->toc_size ; index++ ) {
        !           182:            if ( strcmp(dict->toc[index].id,toc_id) == 0 )
        !           183:                    return( index );
        !           184:    } /* endfor */
        !           185:
        !           186:    return( -1 );
        !           187: }
        !           188:
        !           189: /***********
        !           190: **  Compute a block checksum.
        !           191: **  (Currently just returns 0.)
        !           192: ***********/
        !           193:
        !           194: unsigned long compute_checksum( size_t size , char *block )
        !           195: {
        !           196:     NOOP(size);
        !           197:     NOOP(block);
        !           198:     return( 0 );
        !           199: }
        !           200:
        !           201: /***********
        !           202: **  Create a dictionary paramter entry.
        !           203: ***********/
        !           204:
        !           205: DICT_PARM_ENTRY *dict_make_parm_entry( char *id , unsigned long value )
        !           206: {  static DICT_PARM_ENTRY  *entry;
        !           207:
        !           208:    entry = (DICT_PARM_ENTRY *) malloc( sizeof(DICT_PARM_ENTRY) );
        !           209:    if ( entry == NULL )
        !           210:       return(NULL);
        !           211:
        !           212:    strncpy( entry->id , id , 13 );
        !           213:    entry->value = value;
        !           214:
        !           215:    return( entry );
        !           216: }
        !           217:
        !           218: /***********
        !           219: **  Look up and id in the parameter array.
        !           220: **  Return its index (-1 on failure).
        !           221: ***********/
        !           222:
        !           223: int dict_parm_index( DICTIONARY *dict , char *parm_id )
        !           224: {  long index;
        !           225:
        !           226:    for ( index = 0 ; index < dict->sig->nparms ; index++ ) {
        !           227:            if ( strcmp( dict->parm[index].id , parm_id ) == 0 )
        !           228:                    return( (int) index );
        !           229:    } /* endfor */
        !           230:
        !           231:    return( -1 );
        !           232: }
        !           233:
        !           234: /***********
        !           235: **  Reset table of contents offsets and checksums
        !           236: **  in preparation for dict_save().
        !           237: ***********/
        !           238:
        !           239: BOOLEANC dict_reset_toc_offsets( DICTIONARY *dict )
        !           240: {  int  i;
        !           241:    long offset;
        !           242:
        !           243:    offset = sizeof(DICT_SIG)
        !           244:           + dict->sig->toc_size * sizeof(DICT_TOC_ENTRY);
        !           245:    for ( i = 0 ; i < dict->sig->toc_size ; i++ ) {
        !           246:       dict->toc[i].offset = offset;
        !           247:       offset += dict->toc[i].size;
        !           248:       dict->toc[i].checksum =
        !           249:          compute_checksum( dict->toc[i].size , dict->toc[i].ptr );
        !           250:    } /* endfor */
        !           251:
        !           252:    return( TRUE );
        !           253: }
        !           254:
        !           255: /***********
        !           256: **  Load the names of the dictionary parameters.
        !           257: **  14 parms
        !           258: ***********/
        !           259:
        !           260: BOOLEANC dict_set_parm_ids( DICTIONARY *dict )
        !           261: {
        !           262:    if ( dict==NULL || dict->sig == NULL ) {
        !           263:       signal_error( "dict_set_parm_ids: Allocate dict and signature first." , "" , 0 );
        !           264:       return( FALSE );
        !           265:    }
        !           266:    dict->sig->nparms = 14;
        !           267:    strcpy( dict->parm[0].id , "FLAGS_______" );
        !           268:    strcpy( dict->parm[1].id , "ENTRY_COUNT_" );
        !           269:    strcpy( dict->parm[2].id , "ARRAY_SIZE__" );
        !           270:    strcpy( dict->parm[3].id , "ARRAY_USED__" );
        !           271:    strcpy( dict->parm[4].id , "ARR_GROW_CT_" );
        !           272:    strcpy( dict->parm[5].id , "STRING_MAX__" );
        !           273:    strcpy( dict->parm[6].id , "STR_GROW_CT_" );
        !           274:    strcpy( dict->parm[7].id , "LONG_CHAIN__" );
        !           275:    strcpy( dict->parm[8].id , "ALLOW_CHAIN_" );
        !           276:    strcpy( dict->parm[9].id , "HASH_TAB_SIZ" );
        !           277:    strcpy( dict->parm[10].id , "HASH_MASK___" );
        !           278:    strcpy( dict->parm[11].id , "HASH_GROW_CT" );
        !           279:    strcpy( dict->parm[12].id , "CHECK_VALUE_" );
        !           280:    strcpy( dict->parm[13].id , "SCAN_STR_IX_" );
        !           281:
        !           282:    return( TRUE );
        !           283: }
        !           284:
        !           285: /***********
        !           286: **  Set the dictionary parm structure from the values in the dict structure.
        !           287: **  14 parms
        !           288: ***********/
        !           289:
        !           290: BOOLEANC dict_set_parm_values( DICTIONARY *dict )
        !           291: {  int  index;
        !           292:
        !           293:    if ( (index=dict_parm_index(dict,"FLAGS_______")) == -1 )
        !           294:       return( FALSE );
        !           295:    dict->parm[index].value = (unsigned long)dict->flags;
        !           296:
        !           297:    if ( (index=dict_parm_index(dict,"ENTRY_COUNT_")) == -1 )
        !           298:       return( FALSE );
        !           299:    dict->parm[index].value = (unsigned long)dict->entry_count;
        !           300:
        !           301:    if ( (index=dict_parm_index(dict,"ARRAY_SIZE__")) == -1 )
        !           302:       return( FALSE );
        !           303:    dict->parm[index].value = (unsigned long)dict->array_size;
        !           304:
        !           305:    if ( (index=dict_parm_index(dict,"ARRAY_USED__")) == -1 )
        !           306:       return( FALSE );
        !           307:    dict->parm[index].value = (unsigned long)dict->array_used;
        !           308:
        !           309:    if ( (index=dict_parm_index(dict,"ARR_GROW_CT_")) == -1 )
        !           310:       return( FALSE );
        !           311:    dict->parm[index].value = (unsigned long)dict->array_growth_count;
        !           312:
        !           313:    if ( (index=dict_parm_index(dict,"STRING_MAX__")) == -1 )
        !           314:       return( FALSE );
        !           315:    dict->parm[index].value = (unsigned long)dict->string_max;
        !           316:
        !           317:    if ( (index=dict_parm_index(dict,"STR_GROW_CT_")) == -1 )
        !           318:       return( FALSE );
        !           319:    dict->parm[index].value = (unsigned long)dict->string_growth_count;
        !           320:
        !           321:    if ( (index=dict_parm_index(dict,"LONG_CHAIN__")) == -1 )
        !           322:       return( FALSE );
        !           323:    dict->parm[index].value = (unsigned long)dict->longest_chain_length;
        !           324:
        !           325:    if ( (index=dict_parm_index(dict,"ALLOW_CHAIN_")) == -1 )
        !           326:       return( FALSE );
        !           327:    dict->parm[index].value = (unsigned long)dict->allowable_chain_length;
        !           328:
        !           329:    if ( (index=dict_parm_index(dict,"HASH_TAB_SIZ")) == -1 )
        !           330:       return( FALSE );
        !           331:    dict->parm[index].value = (unsigned long)dict->table_size;
        !           332:
        !           333:    if ( (index=dict_parm_index(dict,"HASH_MASK___")) == -1 )
        !           334:       return( FALSE );
        !           335:    dict->parm[index].value = (unsigned long)dict->hash_mask;
        !           336:
        !           337:    if ( (index=dict_parm_index(dict,"HASH_GROW_CT")) == -1 )
        !           338:       return( FALSE );
        !           339:    dict->parm[index].value = (unsigned long)dict->hash_growth_count;
        !           340:
        !           341:    if ( (index=dict_parm_index(dict,"CHECK_VALUE_")) == -1 )
        !           342:       return( FALSE );
        !           343:    dict->parm[index].value = (unsigned long)dict->check_value;
        !           344:
        !           345:    if ( (index=dict_parm_index(dict,"SCAN_STR_IX_")) == -1 )
        !           346:       return( FALSE );
        !           347:    dict->parm[index].value = (unsigned long)dict->scan_string_index;
        !           348:
        !           349:    return( TRUE );
        !           350: }
        !           351:
        !           352:
        !           353: /***********
        !           354: **  Set the values in the dict structure from the dictionary parm structure.
        !           355: **  14 parms
        !           356: ***********/
        !           357:
        !           358: BOOLEANC dict_set_parm_variables( DICTIONARY *dict )
        !           359: {  int  index;
        !           360:
        !           361:    if ( (index=dict_parm_index(dict,"FLAGS_______")) == -1 )
        !           362:       return( FALSE );
        !           363:    dict->flags = (unsigned long)dict->parm[index].value;
        !           364:
        !           365:    if ( (index=dict_parm_index(dict,"ENTRY_COUNT_")) == -1 )
        !           366:       return( FALSE );
        !           367:    dict->entry_count = (long)dict->parm[index].value;
        !           368:
        !           369:    if ( (index=dict_parm_index(dict,"ARRAY_SIZE__")) == -1 )
        !           370:       return( FALSE );
        !           371:    dict->array_size = (long)dict->parm[index].value;
        !           372:
        !           373:    if ( (index=dict_parm_index(dict,"ARRAY_USED__")) == -1 )
        !           374:       return( FALSE );
        !           375:    dict->array_used = (long)dict->parm[index].value;
        !           376:
        !           377:    if ( (index=dict_parm_index(dict,"ARR_GROW_CT_")) == -1 )
        !           378:       return( FALSE );
        !           379:    dict->array_growth_count = (int)dict->parm[index].value;
        !           380:
        !           381:    if ( (index=dict_parm_index(dict,"STRING_MAX__")) == -1 )
        !           382:       return( FALSE );
        !           383:    dict->string_max = (long)dict->parm[index].value ;
        !           384:
        !           385:    if ( (index=dict_parm_index(dict,"STR_GROW_CT_")) == -1 )
        !           386:       return( FALSE );
        !           387:    dict->string_growth_count = (int)dict->parm[index].value;
        !           388:
        !           389:    if ( (index=dict_parm_index(dict,"LONG_CHAIN__")) == -1 )
        !           390:       return( FALSE );
        !           391:    dict->longest_chain_length = (int)dict->parm[index].value;
        !           392:
        !           393:    if ( (index=dict_parm_index(dict,"ALLOW_CHAIN_")) == -1 )
        !           394:       return( FALSE );
        !           395:    dict->allowable_chain_length = (int)dict->parm[index].value;
        !           396:
        !           397:    if ( (index=dict_parm_index(dict,"HASH_TAB_SIZ")) == -1 )
        !           398:       return( FALSE );
        !           399:    dict->table_size = (long)dict->parm[index].value;
        !           400:
        !           401:    if ( (index=dict_parm_index(dict,"HASH_MASK___")) == -1 )
        !           402:       return( FALSE );
        !           403:    dict->hash_mask = (unsigned long)dict->parm[index].value;
        !           404:
        !           405:    if ( (index=dict_parm_index(dict,"HASH_GROW_CT")) == -1 )
        !           406:       return( FALSE );
        !           407:    dict->hash_growth_count = (int)dict->parm[index].value;
        !           408:
        !           409:    if ( (index=dict_parm_index(dict,"CHECK_VALUE_")) == -1 )
        !           410:       return( FALSE );
        !           411:    dict->check_value = (unsigned long)dict->parm[index].value;
        !           412:
        !           413:    if ( (index=dict_parm_index(dict,"SCAN_STR_IX_")) == -1 )
        !           414:       return( FALSE );
        !           415:    dict->scan_string_index = (long)dict->parm[index].value;
        !           416:
        !           417:    return( TRUE );
        !           418: }
        !           419:
        !           420: /***********
        !           421: **  If dict_trace (global) > 0 , signal an error
        !           422: **  If severity > 0 , abort
        !           423: ***********/
        !           424:
        !           425: void signal_error( char *header , char *message , int severity )
        !           426: {
        !           427:   FILE *fpe;
        !           428:
        !           429:   if ( dict_trace > 0 ) {
        !           430:      printf( "%s: %s\n" , header , message );
        !           431:      fpe = fopen( "ERROR.FIL" , "a" );
        !           432:      fprintf( fpe , "\n%s: %s\n" , header , message );
        !           433:      fclose( fpe );
        !           434:   } /* endif */
        !           435:
        !           436:   if ( severity > 0 )
        !           437:      abort();
        !           438: }

CVSweb