00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037 #pragma ident "@(#) libf/pxf/table.c 92.2 10/29/99 21:41:49"
00038
00039 #include <malloc.h>
00040 #include <string.h>
00041 #include <liberrno.h>
00042 #include <errno.h>
00043 #include "table.h"
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068 #define GROW_SIZE 10
00069 #define NEW_SIZE(n) (n + GROW_SIZE)
00070 #define ONE_INDEX(zero_index) (zero_index + 1)
00071
00072 #define ZERO_INDEX(one_index) (one_index - 1)
00073
00074
00075
00076 pxfhandle_table_t _pxfhandle_table;
00077 table_t _pxfdir_table;
00078
00079
00080
00081
00082
00083
00084
00085 _f_int
00086 _table_add(table_t *table,
00087 void *entry)
00088 {
00089 _f_int return_val;
00090 void **temp;
00091
00092 MEM_LOCK(&table->mutex)
00093
00094
00095
00096 if (table->size <= table->next_index &&
00097 (temp =
00098 (void **) realloc(table->entries,
00099 sizeof(void *)*NEW_SIZE(table->size)))
00100 == NULL) {
00101 return_val = -1;
00102 } else {
00103 return_val = ONE_INDEX(table->next_index);
00104 if (table->size <= table->next_index) {
00105 table->size = NEW_SIZE(table->size);
00106 table->entries = temp;
00107 }
00108 table->entries[table->next_index++] = entry;
00109 }
00110
00111 MEM_UNLOCK(&table->mutex)
00112 return(return_val);
00113 }
00114
00115
00116
00117
00118
00119
00120
00121
00122 int
00123 _table_remove(table_t *table,
00124 _f_int entry_num)
00125 {
00126 int return_val;
00127 int entry_num_zero = ZERO_INDEX(entry_num);
00128
00129 MEM_LOCK(&table->mutex)
00130
00131 if (entry_num_zero < table->next_index &&
00132 entry_num_zero >= 0) {
00133 free(table->entries[entry_num_zero]);
00134 table->entries[entry_num_zero] = NULL;
00135 return_val = 1;
00136 } else {
00137 return_val = 0;
00138 }
00139
00140 MEM_UNLOCK(&table->mutex)
00141 return(return_val);
00142 }
00143
00144
00145
00146
00147
00148
00149
00150
00151 void *
00152 _table_lookup(table_t *table,
00153 _f_int entry_num)
00154 {
00155 void *return_val;
00156 int entry_num_zero = ZERO_INDEX(entry_num);
00157
00158 MEM_LOCK(&table->mutex)
00159
00160 if (entry_num_zero < table->size &&
00161 entry_num_zero >= 0) {
00162 return_val = table->entries[entry_num_zero];
00163 } else {
00164 return_val = NULL;
00165 }
00166
00167 MEM_UNLOCK(&table->mutex)
00168 return(return_val);
00169 }
00170
00171
00172
00173
00174
00175
00176
00177
00178
00179
00180
00181 _f_int
00182 _pxfhandle_table_add(pxfhandle_table_t *table,
00183 void *entryp,
00184 int entry_type)
00185 {
00186 _f_int return_val;
00187 struct pxfhandle *temp;
00188
00189 MEM_LOCK(&table->mutex)
00190
00191
00192
00193 if (table->size <= table->next_index &&
00194 (temp =
00195 (struct pxfhandle *)realloc(table->entries,
00196 sizeof(struct pxfhandle)*
00197 NEW_SIZE(table->size)))
00198 == NULL) {
00199 return_val = -1;
00200 } else {
00201 return_val = ONE_INDEX(table->next_index);
00202 if (table->size <= table->next_index) {
00203 table->size = NEW_SIZE(table->size);
00204 table->entries = temp;
00205 }
00206 table->entries[table->next_index].pxfstructptr = entryp;
00207 table->entries[table->next_index++].pxftype = entry_type;
00208 }
00209
00210 MEM_UNLOCK(&table->mutex)
00211 return(return_val);
00212 }
00213
00214
00215
00216
00217
00218
00219
00220
00221 int
00222 _pxfhandle_table_remove(pxfhandle_table_t *table,
00223 _f_int entry_num)
00224 {
00225 int return_val;
00226 int entry_num_zero = ZERO_INDEX(entry_num);
00227
00228 MEM_LOCK(&table->mutex)
00229
00230 if (entry_num_zero < table->next_index &&
00231 entry_num_zero >= 0) {
00232 free(table->entries[entry_num_zero].pxfstructptr);
00233
00234 (void)memset(&(table->entries[entry_num_zero]), 0,
00235 sizeof(struct pxfhandle));
00236 return_val = 1;
00237 } else {
00238 return_val = 0;
00239 }
00240
00241 MEM_UNLOCK(&table->mutex)
00242 return(return_val);
00243 }
00244
00245
00246
00247
00248
00249
00250
00251
00252 int
00253 _pxfhandle_table_replace(pxfhandle_table_t *table,
00254 _f_int entry_num,
00255 void *new_entry,
00256 int entry_type)
00257 {
00258 int return_val;
00259 int entry_num_zero = ZERO_INDEX(entry_num);
00260
00261 MEM_LOCK(&table->mutex)
00262
00263
00264 if (entry_num_zero < table->next_index &&
00265 entry_num_zero >= 0 &&
00266 table->entries[entry_num_zero].pxftype == entry_type) {
00267 return_val = 1;
00268 free(table->entries[entry_num_zero].pxfstructptr);
00269 table->entries[entry_num_zero].pxfstructptr = new_entry;
00270 } else {
00271 return_val = 0;
00272 }
00273
00274 MEM_UNLOCK(&table->mutex)
00275 return(return_val);
00276 }
00277
00278
00279
00280
00281
00282
00283
00284
00285 struct pxfhandle
00286 _pxfhandle_table_lookup(pxfhandle_table_t *table,
00287 _f_int entry_num)
00288 {
00289 struct pxfhandle return_val;
00290 int entry_num_zero = ZERO_INDEX(entry_num);
00291
00292 MEM_LOCK(&table->mutex)
00293
00294 if (entry_num_zero < table->size &&
00295 entry_num_zero >= 0) {
00296 return_val = table->entries[entry_num_zero];
00297 } else {
00298 (void)memset(&return_val, 0, sizeof(struct pxfhandle));
00299 }
00300
00301 MEM_UNLOCK(&table->mutex)
00302 return(return_val);
00303 }
00304
00305
00306
00307
00308
00309