|
|
1.1 ! root 1: /* Implement a vector type that indicates its used size and allocated size. ! 2: Copyright (C) 1992 Free Software Foundation, Inc. ! 3: ! 4: This file is part of GNU CC. ! 5: ! 6: GNU CC is free software; you can redistribute it and/or modify ! 7: it under the terms of the GNU General Public License as published by ! 8: the Free Software Foundation; either version 2, or (at your option) ! 9: any later version. ! 10: ! 11: GNU CC is distributed in the hope that it will be useful, ! 12: but WITHOUT ANY WARRANTY; without even the implied warranty of ! 13: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ! 14: GNU General Public License for more details. ! 15: ! 16: You should have received a copy of the GNU General Public License ! 17: along with GNU CC; see the file COPYING. If not, write to ! 18: the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ ! 19: ! 20: /* As a special exception, if you link this library with files ! 21: compiled with GCC to produce an executable, this does not cause ! 22: the resulting executable to be covered by the GNU General Public License. ! 23: This exception does not however invalidate any other reasons why ! 24: the executable file might be covered by the GNU General Public License. */ ! 25: ! 26: ! 27: #ifndef __record_INCLUDE_GNU ! 28: #define __record_INCLUDE_GNU ! 29: ! 30: #include "assert.h" ! 31: ! 32: ! 33: /* Structure to hold records. */ ! 34: struct record ! 35: { ! 36: unsigned int capacity; ! 37: unsigned int used; ! 38: void **records; ! 39: }; ! 40: ! 41: ! 42: extern void *__objc_xmalloc (unsigned int); ! 43: extern void *__objc_xcalloc (unsigned int, unsigned int); ! 44: extern void *__objc_xrealloc (void *, unsigned int); ! 45: ! 46: /* Allocate, initialize and return a new record structure. */ ! 47: ! 48: static inline struct record * ! 49: record_new () ! 50: { ! 51: struct record *record; ! 52: ! 53: record = (struct record *) __objc_xcalloc (1, sizeof (struct record)); ! 54: record->capacity = 8; ! 55: record ->records ! 56: = (void **) __objc_xcalloc (record->capacity, sizeof (void *)); ! 57: ! 58: return record; ! 59: } ! 60: ! 61: ! 62: /* Delete the record. */ ! 63: static inline void ! 64: record_delete (struct record *record) ! 65: { ! 66: free (record->records); ! 67: free (record); ! 68: } ! 69: ! 70: ! 71: /* Return the number of entries in the record. */ ! 72: ! 73: static inline unsigned int ! 74: record_entries (struct record *record) ! 75: { ! 76: return record->used; ! 77: } ! 78: ! 79: ! 80: /* Return the capacity of the record. */ ! 81: ! 82: static inline unsigned int ! 83: record_capacity (struct record *record) ! 84: { ! 85: return record->capacity; ! 86: } ! 87: ! 88: ! 89: /* Store an entry at the specified record location. */ ! 90: ! 91: static inline void ! 92: record_store_at (unsigned int i, void *value, struct record *record) ! 93: { ! 94: assert (i); ! 95: assert (i <= record_entries (record)); ! 96: ! 97: record->records[i] = value; ! 98: } ! 99: ! 100: ! 101: /* Make a record entry. Expand the record's size if full. */ ! 102: ! 103: static inline void ! 104: record_store (void *value, struct record *record) ! 105: { ! 106: ++record->used; ! 107: if (record_entries (record) == record_capacity (record)) ! 108: { ! 109: record->capacity *= 2; ! 110: record->records ! 111: = (void **) __objc_xrealloc (record->records, ! 112: record_capacity (record) * sizeof (void *)); ! 113: } ! 114: record_store_at (record_entries (record), value, record); ! 115: } ! 116: ! 117: ! 118: /* Get a value from the record. */ ! 119: ! 120: static inline void * ! 121: record_get (unsigned int i, struct record *record) ! 122: { ! 123: assert (i); ! 124: assert (i <= record_entries (record)); ! 125: return record->records[i]; ! 126: } ! 127: ! 128: #endif /* not __record_INCLUDE_GNU */ ! 129:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.