1 /* 2 * Copyright 1987, 1988 by MIT Student Information Processing Board 3 * 4 * Permission to use, copy, modify, and distribute this software and 5 * its documentation for any purpose is hereby granted, provided that 6 * the names of M.I.T. and the M.I.T. S.I.P.B. not be used in 7 * advertising or publicity pertaining to distribution of the software 8 * without specific, written prior permission. M.I.T. and the 9 * M.I.T. S.I.P.B. make no representations about the suitability of 10 * this software for any purpose. It is provided "as is" without 11 * express or implied warranty. 12 */ 13 14 #include "config.h" 15 #ifdef HAVE_ERRNO_H 16 #include <errno.h> 17 #endif 18 19 #include "ss_internal.h" 20 21 #define ssrt ss_request_table /* for some readable code... */ 22 23 void ss_add_request_table(int sci_idx, ssrt *rqtbl_ptr, int position, int *code_ptr) 24 { 25 register ss_data *info; 26 register int i, size; 27 ssrt **t; 28 29 info = ss_info(sci_idx); 30 for (size=0; info->rqt_tables[size] != (ssrt *)NULL; size++) 31 ; 32 /* size == C subscript of NULL == #elements */ 33 size += 2; /* new element, and NULL */ 34 t = (ssrt **)realloc(info->rqt_tables, (unsigned)size*sizeof(ssrt *)); 35 if (t == (ssrt **)NULL) { 36 *code_ptr = errno; 37 return; 38 } 39 info->rqt_tables = t; 40 if (position > size - 2) 41 position = size - 2; 42 43 if (size > 1) 44 for (i = size - 2; i >= position; i--) 45 info->rqt_tables[i+1] = info->rqt_tables[i]; 46 47 info->rqt_tables[position] = rqtbl_ptr; 48 info->rqt_tables[size-1] = (ssrt *)NULL; 49 *code_ptr = 0; 50 } 51 52 void ss_delete_request_table(int sci_idx, ssrt *rqtbl_ptr, int *code_ptr) 53 { 54 register ss_data *info; 55 register ssrt **rt1, **rt2; 56 57 *code_ptr = SS_ET_TABLE_NOT_FOUND; 58 info = ss_info(sci_idx); 59 rt1 = info->rqt_tables; 60 for (rt2 = rt1; *rt1; rt1++) { 61 if (*rt1 != rqtbl_ptr) { 62 *rt2++ = *rt1; 63 *code_ptr = 0; 64 } 65 } 66 *rt2 = (ssrt *)NULL; 67 return; 68 } 69