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

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

1.1     ! rubenllo    1: /*
        !             2:     ident.c - routines to associate an identifier with an object
        !             3:
        !             4:     UltraRogue: The Ultimate Adventure in the Dungeons of Doom
        !             5:     Copyright (C) 1986, 1991, 1993, 1995 Herb Chong
        !             6:     All rights reserved.
        !             7:
        !             8:     See the file LICENSE.TXT for full copyright and licensing information.
        !             9: */
        !            10:
        !            11: /*
        !            12:  * ident
        !            13:  *
        !            14:  * This file contains routines to associate an identifier with an object. The
        !            15:  * identifiers are organized by type. Once an identifier is attached to an
        !            16:  * object, it remains with that object until the object is removed from the
        !            17:  * game. The identifiers are small integers, and they are assigned merely by
        !            18:  * counting objects of the same type. Allocation picks the next available
        !            19:  * integer.
        !            20:  *
        !            21:  * It is required that the linked list be sorted within types so that gaps can
        !            22:  * easily be detected.
        !            23:  */
        !            24:
        !            25: #include "rogue.h"
        !            26:
        !            27: /*
        !            28:  * Index of 0 is invalid (unused state)
        !            29:  */
        !            30:
        !            31: char print_letters[] = " abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
        !            32: linked_list *ident_list = NULL; /* master list of all items */
        !            33:
        !            34: /*
        !            35:     get_ident()
        !            36:
        !            37:     Gets the identifier for the given object. If an identifier exists, it is
        !            38:     returned. If not, one is allocated and returned to the user. The
        !            39:     identifier remains constant as long as the object is in the game.
        !            40: */
        !            41:
        !            42: int
        !            43: get_ident(struct object *obj_p)
        !            44: {
        !            45:     int obj_type = obj_p->o_type;
        !            46:     linked_list *list_p;           /* pointer into ident_list */
        !            47:     int new_id = 1;                /* in case we have to allocate */
        !            48:     struct object *tmp_obj_p;
        !            49:     struct linked_list *new_place_p = NULL;
        !            50:
        !            51:     if (identifier(obj_p) != 0)
        !            52:         return (identifier(obj_p));
        !            53:
        !            54:     /* no identifier - must allocate one */
        !            55:
        !            56:     for (list_p = ident_list; list_p != NULL; list_p = next(list_p))
        !            57:     {
        !            58:         tmp_obj_p = OBJPTR(list_p);
        !            59:
        !            60:         if (tmp_obj_p->o_type == obj_type)
        !            61:         {
        !            62:             if (identifier(tmp_obj_p) == new_id)
        !            63:             {
        !            64:                 /* if this id is taken, try next */
        !            65:                 new_place_p = list_p;
        !            66:                 new_id++;
        !            67:             }
        !            68:         }
        !            69:     }
        !            70:
        !            71:     /*
        !            72:      * If we get here, the object is not in the list, and we need to add
        !            73:      * it. The proper id is in new_id, and the place to put it is right
        !            74:      * after new_place_p.
        !            75:      */
        !            76:
        !            77:     list_p = new_list();
        !            78:     _attach_after(&ident_list, new_place_p, list_p);
        !            79:     identifier(obj_p) = new_id;
        !            80:     list_p->data.obj = obj_p;
        !            81:     return(new_id);
        !            82: }
        !            83:
        !            84: /*
        !            85:     free_ident()
        !            86:
        !            87:     Frees up an identifier by removing the list entry that contains that item.
        !            88:     If the item isn't found, nothing is done.
        !            89: */
        !            90:
        !            91: void
        !            92: free_ident(struct object *obj_p)
        !            93: {
        !            94:     linked_list *list_p;
        !            95:
        !            96:     for (list_p = ident_list; list_p != NULL; list_p = next(list_p))
        !            97:     {
        !            98:         if (obj_p == OBJPTR(list_p))
        !            99:         {
        !           100:             _detach(&ident_list, list_p);   /* unlink it from the list */
        !           101:             ur_free(list_p);                /* release link structure */
        !           102:             break;
        !           103:         }
        !           104:     }
        !           105: }
        !           106:
        !           107: /*
        !           108:     unprint_id()
        !           109:
        !           110:     Converts a printable id from print_letters to the real thing by getting the
        !           111:     index.
        !           112: */
        !           113:
        !           114: int
        !           115: unprint_id(char *print_id)
        !           116: {
        !           117:     char    *id_p;
        !           118:
        !           119:     for (id_p = print_letters; id_p != NULL; id_p++)
        !           120:         if (*id_p == *print_id)
        !           121:             break;
        !           122:
        !           123:     return( (int) (id_p - print_letters) );
        !           124: }
        !           125:
        !           126: /*
        !           127:     max_print()
        !           128:
        !           129:         returns the size of the print list
        !           130: */
        !           131:
        !           132: int
        !           133: max_print(void)
        !           134: {
        !           135:     return(sizeof(print_letters) - 2); /* 1 for blank and 1 for EOS string */
        !           136: }

CVSweb