-+-+-+-+-+-+-+-+ START OF PART 204 -+-+-+-+-+-+-+-+ X "EXECUTE_STRUCTURE", X "LABEL", X "APPLICATION_DATA", X "GENERALIZED_STRUCTURE_ELEMENT", X "SET_PICK_IDENTIFIER" X`7D; X Xstatic Pchar *Peditmodenames`5B`5D = X`7B X "INSERT", "REPLACE" X`7D; X Xstatic Pchar *Preffnames`5B`5D = X`7B X "DELETE", "KEEP" X`7D; X Xstatic Pchar *Pcovalidnames`5B`5D = X`7B X "ABSENT", "PRESENT" X`7D; X Xstatic Pchar *Perrormodenames`5B`5D = X`7B X "OFF", "ON" X`7D; X Xstatic Pchar *Psrchdirnames`5B`5D = X`7B X "BACKWARD", "FORWARD" X`7D; X Xstatic Pchar *Psrchstatusnames`5B`5D = X`7B X "FAILURE", "SUCCESS" X`7D; X Xstatic Pchar *Psrcheltypenames`5B`5D = X`7B X "ALL", X "NIL", X "POLYLINE3", X "POLYLINE", X "POLYMARKER3", X "POLYMARKER", X "TEXT3", X "TEXT", X#ifdef VMS X "ANNOTATION_TEXT_FIXED3", X "ANNOTATION_TEXT_FIXED", X#endif X "ANNOTATION_TEXT_RELATIVE3", X "ANNOTATION_TEXT_RELATIVE", X "FILL_AREA3", X "FILL_AREA", X "FILL_AREA_SET3", X "FILL_AREA_SET", X "CELL_ARRAY3", X "CELL_ARRAY", X "GENERALIZED_DRAWING_PRIMITIVE3", X "GENERALIZED_DRAWING_PRIMITIVE", X "SET_POLYLINE_INDEX", X "SET_POLYMARKER_INDEX", X "SET_TEXT_INDEX", X "SET_INTERIOR_INDEX", X "SET_EDGE_INDEX", X "SET_LINETYPE", X "SET_LINEWIDTH_SCALE_FACTOR", X "SET_POLYLINE_COLOUR_INDEX", X "SET_MARKER_TYPE", X "SET_MARKER_SIZE_SCALE_FACTOR", X "SET_MARKER_COLOUR_INDEX", X "SET_TEXT_FONT", X "SET_TEXT_PRECISION", X "SET_CHARACTER_EXPANSION_FACTOR", X "SET_CHARACTER_SPACING", X "SET_TEXT_COLOUR_INDEX", X "SET_CHARACTER_HEIGHT", X "SET_CHARACTER_UP_VECTOR", X "SET_TEXT_PATH", X "SET_TEXT_ALIGNMENT", X "SET_ANNOTATION_TEXT_CHARACTER_HEIGHT", X "SET_ANNOTATION_TEXT_CHARACTER_UP_VECTOR", X "SET_ANNOTATION_TEXT_PATH", X "SET_ANNOTATION_TEXT_ALIGNMENT", X "SET_ANNOTATION_STYLE", X "SET_INTERIOR_STYLE", X "SET_INTERIOR_STYLE_INDEX", X "SET_INTERIOR_COLOUR_INDEX", X "SET_EDGE_FLAG", X "SET_EDGETYPE", X "SET_EDGEWIDTH_SCALE_FACTOR", X "SET_EDGE_COLOUR_INDEX", X "SET_PATTERN_SIZE", X "SET_PATTERN_REFERENCE_POINT_AND_VECTORS", X "SET_PATTERN_REFERENCE_POINT", X "ADD_NAMES_TO_SET", X "REMOVE_NAMES_FROM_SET", X "SET_INDIVIDUAL_ASF", X "SET_HLHSR_IDENTIFIER", X "SET_LOCAL_MODELLING_TRANSFORMATION3", X "SET_LOCAL_MODELLING_TRANSFORMATION", X "SET_GLOBAL_MODELLING_TRANSFORMATION3", X "SET_GLOBAL_MODELLING_TRANSFORMATION", X#ifdef SUN X "SET_MODELLING_CLIPPING_VOLUME3", X#endif X "SET_MODELLING_CLIPPING_VOLUME", X "SET_MODELLING_CLIPPING_INDICATOR", X "RESTORE_MODELLING_CLIPPING_VOLUME", X "SET_VIEW_INDEX", X "EXECUTE_STRUCTURE", X "LABEL", X "APPLICATION_DATA", X "GENERALIZED_STRUCTURE_ELEMENT", X "SET_PICK_IDENTIFIER" X`7D; X Xstatic Pchar *Pdefmodenames`5B`5D =`20 X`7B X "ASAP", "BNIG", "BNIL", "ASTI", "WAIT" X`7D; X Xstatic Pchar *Pmodnames`5B`5D =`20 X`7B X "NIVE", "UWOR", "UQUM" X`7D; X Xstatic Pchar *Pconfresnames`5B`5D =`20 X`7B X "MAINTAIN", "ABANDON", "UPDATE" X`7D; X Xstatic Pchar *Pregennames`5B`5D =`20 X`7B X "PERFORM", "POSTPONE" X`7D; X Xstatic Pchar *Pprojtypenames`5B`5D =`20 X`7B X "PARALLEL", "PERSPECTIVE" X`7D; X Xstatic Pchar *Pcomptypenames`5B`5D =`20 X`7B X "PRECONCATENATE", "POSTCONCATENATE", "REPLACE" X`7D; X Xstatic Pchar *Ptxpathnames`5B`5D =`20 X`7B X "RIGHT", "LEFT", "UP", "DOWN" X`7D; X Xstatic Pchar *Ptxhornames`5B`5D =`20 X`7B X "NORMAL", "LEFT", "CENTRE", "RIGHT" X`7D; X Xstatic Pchar *Ptxvernames`5B`5D =`20 X`7B X "NORMAL", "TOP", "CAP", "HALF", "BASE", "BOTTOM" X`7D; X Xstatic Pchar *Pattrsnames`5B`5D =`20 X`7B X "POLYLINE", "POLYMARKER", "TEXT", "INTERIOR", "EDGE" X`7D; X Xstatic Pchar *Ptxprecnames`5B`5D =`20 X`7B X "STRING", "CHAR", "STROKE" X`7D; X Xstatic Pchar *Pinterstylenames`5B`5D =`20 X`7B X "HOLLOW", "SOLID", "PATTERN", "HATCH", "EMPTY", "GENERAL" X`7D; X Xstatic Pchar *Pbasenames`5B`5D =`20 X`7B X "PHIGS_SUN_TOOL", "PHIGS_SUN_CANVAS", "PHIGS_CGM_OUT",`20 X "PHIGS_SUN_CANVAS_REGION" X`7D; X Xstatic Pchar *Pwsattrnames`5B`5D = X`7B X "GP_USAGE", X "MSG_WIN_SIZE", X "TEXTSW", X "PANEL", X "BASE_NAME", X "COLOURMAP_NAME", X "DOUBLE_BUFFER", X "VAL_PANEL_X", X "VAL_PANEL_Y", X "NORM_CURSOR_TYPE", X "NORM_CURSOR_COLOUR", X "NORM_CURSOR_OP", X "TRAV_CURSOR_TYPE", X "TRAV_CURSOR_COLOUR", X "TRAV_CURSOR_OP", X "ACCELERATOR_USAGE", X "COLOUR_MODE", X "TOOL_WIDTH", X "TOOL_HEIGHT", X "TOOL_X", X "TOOL_Y", X "TOOL_LABEL", X "TOOL_ICON_FILE", X "TOOL_FOREGROUND_COLOUR", X "TOOL_BACKGROUND_COLOUR", X "TOOL_SHOW_LABEL", X "TOOL_ICON_LABEL", X "TOOL_FULLSCREEN", X "WS_CATEGORY", X "COLOUR_TABLE_SIZE", X "DEVICE_COORD_XMAX_PTR", X "DEVICE_COORD_YMAX_PTR", X "CGM_ENCODING", X "CGM_CONFORMANCE", X "CGM_METRIC_HEIGHT_PTR", X "CGM_METRIC_WIDTH_PTR", X "CGM_METRIC_LINE_WIDTH_PTR", X "CGM_VDC_PRECISION", X "REGION_RECT", X "REGION_PRIORITY", X "REGION_BACKGROUND", X "USE_DECOMP" X`7D; X Xstatic Pchar *Pdblbuffnames`5B`5D = X`7B X "PHIGS_DBL_NONE", X "PHIGS_DBL_CMAP", X "PHIGS_DBL_HW" X`7D; X Xstatic Pchar *Pusagenames`5B`5D = X`7B X "PHIGS_USE_PREFERRED", X "PHIGS_USE_REQUIRED", X "PHIGS_USE_NONE" X`7D; X Xstatic Pchar *Paccusagenames`5B`5D = X`7B X "PHIGS_USE_ACC_PREFERRED", X "PHIGS_USE_ACC_REQUIRED", X "PHIGS_USE_GP_PREFERRED", X "PHIGS_USE_GP_REQUIRED", X "PHIGS_USE_CG6_PREFERRED", X "PHIGS_USE_CG6_REQUIRED", X "BLANK", X "BLANK", X "PHIGS_USE_TAAC_PREFERRED", X "PHIGS_USE_TAAC_REQUIRED", X "PHIGS_USE_ACC_NONE" X`7D; X Xstatic Pchar *Pcolourmodenames`5B`5D = X`7B X "PHIGS_INDEX_COLOUR", X "PHIGS_TRUE_COLOUR" X`7D; X Xstatic Pchar *Pcreationnames`5B`5D = X`7B X "PHIGS_NONE", X "PHIGS_CREATE" X`7D; X Xstatic Pchar *Pcgmencodingnames`5B`5D = X`7B X "PHIGS_CGM_BINARY", X "PHIGS_CGM_CHARACTER", X "PHIGS_CGM_CLEAR_TEXT" X`7D; X Xstatic Pchar *Pcgmconformancenames`5B`5D = X`7B X "PHIGS_CGM_CONFORM_NONE", X "PHIGS_CGM_CONFORM_TOP", X "PHIGS_CGM_CONFORM_TOP_BASIC" X`7D; X Xstatic Pchar *Pcgmvdcprecisionnames`5B`5D = X`7B X "PHIGS_CGM_LOW_PREC", X "PHIGS_CGM_HIGH_PREC" X`7D; X Xstatic Pchar *Pbgclearnames`5B`5D = X`7B X "PHIGS_BG_CLEAR", X "PHIGS_BG_NO_CLEAR" X`7D; X Xstatic Pchar *Pdcmpnames`5B`5D = X`7B X "PHIGS_USE_DCMP_ON", X "PHIGS_USE_DCMP_OFF" X`7D; X X/* end of enumname.c */ $ CALL UNPACK [.SOURCE.LIBRARY]ENUMNAME.C;1 259800913 $ create 'f' X/*-------------------------------------------------------------------------- V-- X X Module name: hash strings to integers. X`20 X Author: S. Larkin. X X Function: Contains routines to manipulate a table of hashtables. X The routines allocate unique integer id`60s to strings`20 X and also allow retrieval of these strings via their unique id`60s. X X Dependencies: machine.h. X X External function list:`20 X ptk_inithashtables X ptk_idtostring X ptk_delstring X ptk_delhashtable X ptk_stringtoid `20 X ptk_stringused X ptk_inqstrings X ptk_inqhashtables X ptk_storehashtable X ptk_storeallhashtables X ptk_restorehashtable X ptk_restoreallhashtables X ptk_createhashtable X ptk_hashtableused X X Internal function list:`20 X searchforstring X getnextstrid X freestrid X hashstring X parsestring X stringlength X outputfreeidlist X addstring X addstringtotable X addtabletotable X ptk_stringtotable X X Hashtables used: all. X X Modification history : (Version), (Date), (Name), (Description). X X 1.0, 18th August 1988, S. Larkin, First version. X X 1.1, 7th November 1988, S. Larkin, This module now`20 X supports a fixed number ( 10 ) of independent hashtables. X All functions now take a table parameter which specifies`20 X which hashing table is being accessed. X Two new func/proc have been added: X string_Used which returns TRUE if the supplied X string has been used in the hashing table. X Inquire_table which returns details about appropriate X hashtable. X X 2.0, 4th January 1991, G. Williams, Converted from Pascal X to C. Function names changed to PHIGS Toolkit convention - ptk_xxx. X There is now no restriction on the number of hashtables, the user X must call ptk_hashinitialise to initialise a hashtable. Each hashtable X has a specified range of structure identifiers which is supplied by X the user. X X 2.1, 18th March 1991, G. Williams, new strategy - a table of tables. X X---------------------------------------------------------------------------- V*/ X X#include X#include X#ifdef SUN X#include X#endif X#include X#include "machine.h" X#include "ptktype.h" X#include "hashtype.h" X#include "perrfns.h" X X#define NIL -1 X X#define sizeofhashtable 1009 X Xtypedef struct ptksstridentry `20 X`7B X Pchar *strdata; X Pint stringlen; X Pint uniqint; X Pint clashptr, prevptr; X`7D ptksstridentry; X Xtypedef Pint ptkahashtablecont`5Bsizeofhashtable`5D; X Xtypedef struct ptksfreeint`20 X`7B X Pint freeint; X struct ptksfreeint *next; X`7D ptksfreeint; X Xtypedef struct ptkshashtable X`7B X ptkahashtablecont hashtable; X Pint numstrings; X Pint minuniqint; X Pint maxuniqint; X ptksstridentry *stridtable; X ptksfreeint *freeintlist; X`7D ptkshashtable; X Xtypedef struct ptkstableentry X`7B X Pchar *strdata; X Pint stringlen; X ptkshashtable *tableptr; X Pint clashptr, prevptr; X`7D ptkstableentry; X Xtypedef struct ptkshashtablelst X`7B X ptkahashtablecont hashtable; X Pint numtables; X ptkstableentry *tablelist; X ptksfreeint *freeintlist; X`7D ptkshashtablelst; X Xstatic ptkshashtablelst toptable; X X/*-------------------------------------------------------------------------- V*/ X Xstatic Pint hashstring(C(Pchar *)str, C(Pint) strlength) XPreANSI(Pchar *str) XPreANSI(Pint strlength) X/* X** \blurb`7BThis function returns a hash value in the range 1 to `60sizeofha Vshtable'.`7D X** \param`7Bstr`7D`7Bstring`7D X** \param`7Bstrlength`7D`7Blength of string. `7D X** none. X** return value: hash value of str. X*/ X`7B X Pint i, l, shift; X unsigned int res, ch; X X l = 0; X res = 0; X shift = 1; X for (i = 0; i < strlength; i++)`20 X `7B X ch = (unsigned int)str`5Bi`5D * shift; X res `5E= ch; X l++; X if (shift == 1) X shift = 256; X else X shift *= 256; X if (l == 4)`20 X `7B X l = 0; X shift = 1; X `7D X `7D X return (res % sizeofhashtable + 1); X`7D /* hashstring */ X X/*-------------------------------------------------------------------------- V*/ X Xstatic void searchforstring(C(Pchar *)sname, C(Pint) startentry, X C(ptkshashtable *)table,`20 X C(Pint *)foundentry, C(ptkboolean *)isfound) XPreANSI(Pchar *sname)`20 XPreANSI(Pint startentry) XPreANSI(ptkshashtable *table)`20 XPreANSI(Pint *foundentry)`20 XPreANSI(ptkboolean *isfound) X/* X** \blurb`7BSearches for the given string in a hashtable.`7D X** \param`7Bsname`7D`7Bstring to search for`7D X** \param`7Bstartentry`7D`7Bposition to start searching for string in string V table`7D X** \param`7Btable`7D`7Bhashtable`7D X** \param`7Bfoundentry`7D`7Bposition in string table of string`7D X** \param`7Bisfound`7D`7BTRUE if string is in table, FALSE if not`7D X** return value: none. X*/ X`7B X Pint nextentry; X ptksstridentry *entry; X X *isfound = FALSE; X if (startentry != NIL)`20 X `7B X do`20 X `7B X entry = &table->stridtable`5Bstartentry`5D; X if (entry->strdata != NULL) X if (!strncmp(entry->strdata, sname, strlen(entry->strdata))) X`09 *isfound = TRUE; X if (!*isfound) X `7B `20 X /* check next id */ X`09 nextentry = entry->prevptr; X`09 if (nextentry != NIL) X`09 startentry = nextentry; X`09`7D X `7D while (*isfound != TRUE && nextentry != NIL); X `7D X *foundentry = startentry; X`7D /* searchforstring */ X X/*-------------------------------------------------------------------------- V*/ X Xstatic void searchfortable(C(Pchar *)tabname, C(Pint) startentry, X C(Pint *)foundentry, C(ptkboolean *)isfound) XPreANSI(Pchar *tabname)`20 XPreANSI(Pint startentry) XPreANSI(Pint *foundentry)`20 XPreANSI(ptkboolean *isfound) X/* X** \blurb`7BSearches for the given table name in hashtable table.`7D X** \param`7Btabname`7D`7Bname of table to search for`7D X** \param`7Bstartentry`7D`7Bposition to start searching for table in hashtab Vle table`7D X** \param`7Btable`7D`7Bhashtable table`7D X** \param`7Bfoundentry`7D`7Bposition in hashtable table of table`7D X** \param`7Bisfound`7D`7BTRUE if table is in hashtable table, FALSE if not`7 VD X** X** return value: none. X*/ X`7B X Pint nextentry; X ptkstableentry *entry; X X *isfound = FALSE; X if (startentry != NIL)`20 X `7B X do`20 X `7B X entry = &toptable.tablelist`5Bstartentry`5D; X if (entry->strdata != NULL) X if (!strncmp(entry->strdata, tabname, strlen(entry->strdata))) X`09 *isfound = TRUE; X`09if (!*isfound)`20 X `7B `20 X /* check next id */ X`09 nextentry = entry->prevptr; X`09 if (nextentry != NIL) X`09 startentry = nextentry; X`09`7D X `7D while (*isfound != TRUE && nextentry != NIL); X `7D X *foundentry = startentry; X`7D /* searchfortable */ X X/*-------------------------------------------------------------------------- V*/ X Xstatic Pint getnextstrid(C(ptksfreeint **) freelist) XPreANSI(ptksfreeint **freelist) X/* X** \blurb`7BReturns next free string id, returns 0 if no more left.`7D X** \param`7Btable`7D`7Bhashtable`7D X** return value: next free string identifier. X** error conditions: table->freeintlist == NULL - no more free string id's. X*/ X`7B X Pint result; X X result = 0; X if (*freelist == NULL)`20 X `7B X fprintf(stderr, "HashStrings: Run out of integers to allocate\n"); X return result; X `7D X result = (*freelist)->freeint; X if ((*freelist)->next == NULL) /* end of list */ X ((*freelist)->freeint)++; /* make next id free */ X else X *freelist = (*freelist)->next; +-+-+-+-+-+-+-+- END OF PART 204 +-+-+-+-+-+-+-+-