TABLE table_Create(int opbound, int varbound, int termbound) /*************************************************************** INPUT: bounds for the operator symbol, variable and term indices of the terms to be stored in the signature table (i. e. for every such term its top symbol Index has to be in [1, opbound] and the term numbers of its arguments in [0, termbound] - or its variable Index in [1, varbound] if it is a variable) RETURNS: a new (and empty) signature table ***************************************************************/ { TABLE result; #ifdef CHECK if (opbound < 0) { misc_StartErrorReport(); misc_ErrorReport("\n In table_Create: negative opbound."); misc_FinishErrorReport(); } if (varbound < 0) { misc_StartErrorReport(); misc_ErrorReport("\n In table_Create: negative varbound."); misc_FinishErrorReport(); } if (termbound < 0) { misc_StartErrorReport(); misc_ErrorReport("\n In table_Create: negative termbound."); misc_FinishErrorReport(); } #endif result = (TABLE) memory_Malloc(sizeof(struct table)); table_SetTermarray(result, (TERMARRAY) memory_Calloc ( opbound + varbound + 1, sizeof(struct termarray) ) + varbound); /* move pointer to the middle of the array to allow negative indices */ table_SetPoss( result, (TERMARRAY*) memory_Malloc((termbound + 1) * sizeof(TERMARRAY)) ); table_SetPosstamps(result, (int*) memory_Calloc(termbound + 1, sizeof(int))); table_SetOpbound(result, opbound); table_SetVarbound(result, varbound); table_SetTermbound(result, termbound); table_SetStampcounter(result, 1); return result; }
TABLE table_Init(TABLE table, int opbound, int varbound, int termbound) /*************************************************************** INPUT: the table to recycle and bounds for the operator symbol, variable and term indices of the terms to be stored in the signature table (i. e. for every such term its top symbol index has to be in [1, opbound] and the term numbers of its arguments in [0, termbound] - or its variable index in [1, varbound] if it is a variable) RETURNS: a cleaned up signature table CAUTION: potentially frees the old table, therefore must be called inside of an assignment like: table = table_Init(table, ...) ***************************************************************/ { int opmax, varmax, termmax, i; TERMARRAY old; #ifdef CHECK if (opbound < 0) { misc_StartErrorReport(); misc_ErrorReport("\n In table_Init: negative opbound."); misc_FinishErrorReport(); } if (varbound < 0) { misc_StartErrorReport(); misc_ErrorReport("\n In table_Init: negative varbound."); misc_FinishErrorReport(); } if (termbound < 0) { misc_StartErrorReport(); misc_ErrorReport("\n In table_Init: negative termbound."); misc_FinishErrorReport(); } #endif opmax = table_GetOpbound(table) > opbound ? table_GetOpbound(table) : opbound; varmax = table_GetVarbound(table) > varbound ? table_GetVarbound(table) : varbound; termmax = table_GetTermbound(table) > termbound ? table_GetTermbound(table) : termbound; table_SetStampcounter(table, table_GetStampcounter(table) + 1); /* in case of stamp overflow or too small termarray nodes get a new table: */ if (table_GetStampcounter(table)<=0 || termbound>table_GetTermbound(table)) { table_Free(table); return table_Create(opmax, varmax, termmax); } /* if only the top layer of the tree is too small get a larger top layer: */ else if (opbound+varbound > table_GetOpbound(table)+table_GetVarbound(table)){ old = table_GetTermarray(table); table_SetTermarray(table, (TERMARRAY) memory_Calloc( opmax + varmax + 1, sizeof(struct termarray) ) + varmax); for (i = -table_GetVarbound(table); i <= table_GetOpbound(table); i++) table_SetChild(table_GetTermarray(table) + i, table_GetChild(old + i)); memory_Free( old - table_GetVarbound(table), (table_GetOpbound(table) + table_GetVarbound(table) + 1) * sizeof(struct termarray) ); table_SetOpbound(table, opmax); table_SetVarbound(table, varmax); return table; } else { /* move pointer to termarray's new middle: */ table_SetTermarray( table, table_GetTermarray(table) + table_GetOpbound(table) - opbound ); table_SetVarbound( table, table_GetOpbound(table) + table_GetVarbound(table) - opbound ); table_SetOpbound(table, opbound); return table; } }