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 #define _SYMBOL_SOURCE_
00038
00039 #include <stdio.h>
00040 #define _STDIO_INCLUDED_
00041 #include <stdlib.h>
00042 #include <string.h>
00043
00044 #include "setup.h"
00045
00046 #include "constant.h"
00047 #include "envrnmnt.h"
00048 #include "memalloc.h"
00049 #include "router.h"
00050 #include "utility.h"
00051 #include "argacces.h"
00052 #include "sysdep.h"
00053
00054 #include "symbol.h"
00055
00056
00057
00058
00059
00060 #define FALSE_STRING "FALSE"
00061 #define TRUE_STRING "TRUE"
00062 #define POSITIVE_INFINITY_STRING "+oo"
00063 #define NEGATIVE_INFINITY_STRING "-oo"
00064
00065 #define AVERAGE_STRING_SIZE 10
00066 #define AVERAGE_BITMAP_SIZE sizeof(long)
00067 #define NUMBER_OF_LONGS_FOR_HASH 25
00068
00069
00070
00071
00072
00073 static void RemoveHashNode(void *,GENERIC_HN *,GENERIC_HN **,int,int);
00074 static void AddEphemeralHashNode(void *,GENERIC_HN *,struct ephemeron **,
00075 int,int);
00076 static void RemoveEphemeralHashNodes(void *,struct ephemeron **,
00077 GENERIC_HN **,
00078 int,int,int);
00079 static char *StringWithinString(char *,char *);
00080 static size_t CommonPrefixLength(char *,char *);
00081 static void DeallocateSymbolData(void *);
00082
00083
00084
00085
00086
00087
00088 #if WIN_BTC && (! RUN_TIME)
00089 #pragma argsused
00090 #endif
00091 globle void InitializeAtomTables(
00092 void *theEnv,
00093 struct symbolHashNode **symbolTable,
00094 struct floatHashNode **floatTable,
00095 struct integerHashNode **integerTable,
00096 struct bitMapHashNode **bitmapTable,
00097 struct externalAddressHashNode **externalAddressTable)
00098 {
00099 #if MAC_MCW || WIN_MCW || MAC_XCD
00100 #pragma unused(symbolTable)
00101 #pragma unused(floatTable)
00102 #pragma unused(integerTable)
00103 #pragma unused(bitmapTable)
00104 #pragma unused(externalAddressTable)
00105 #endif
00106 unsigned long i;
00107
00108 AllocateEnvironmentData(theEnv,SYMBOL_DATA,sizeof(struct symbolData),DeallocateSymbolData);
00109
00110 #if ! RUN_TIME
00111
00112
00113
00114
00115 SymbolData(theEnv)->SymbolTable = (SYMBOL_HN **)
00116 gm3(theEnv,sizeof (SYMBOL_HN *) * SYMBOL_HASH_SIZE);
00117
00118 SymbolData(theEnv)->FloatTable = (FLOAT_HN **)
00119 gm2(theEnv,(int) sizeof (FLOAT_HN *) * FLOAT_HASH_SIZE);
00120
00121 SymbolData(theEnv)->IntegerTable = (INTEGER_HN **)
00122 gm2(theEnv,(int) sizeof (INTEGER_HN *) * INTEGER_HASH_SIZE);
00123
00124 SymbolData(theEnv)->BitMapTable = (BITMAP_HN **)
00125 gm2(theEnv,(int) sizeof (BITMAP_HN *) * BITMAP_HASH_SIZE);
00126
00127 SymbolData(theEnv)->ExternalAddressTable = (EXTERNAL_ADDRESS_HN **)
00128 gm2(theEnv,(int) sizeof (EXTERNAL_ADDRESS_HN *) * EXTERNAL_ADDRESS_HASH_SIZE);
00129
00130
00131
00132
00133
00134 for (i = 0; i < SYMBOL_HASH_SIZE; i++) SymbolData(theEnv)->SymbolTable[i] = NULL;
00135 for (i = 0; i < FLOAT_HASH_SIZE; i++) SymbolData(theEnv)->FloatTable[i] = NULL;
00136 for (i = 0; i < INTEGER_HASH_SIZE; i++) SymbolData(theEnv)->IntegerTable[i] = NULL;
00137 for (i = 0; i < BITMAP_HASH_SIZE; i++) SymbolData(theEnv)->BitMapTable[i] = NULL;
00138 for (i = 0; i < EXTERNAL_ADDRESS_HASH_SIZE; i++) SymbolData(theEnv)->ExternalAddressTable[i] = NULL;
00139
00140
00141
00142
00143
00144 SymbolData(theEnv)->TrueSymbolHN = EnvAddSymbol(theEnv,TRUE_STRING);
00145 IncrementSymbolCount(SymbolData(theEnv)->TrueSymbolHN);
00146 SymbolData(theEnv)->FalseSymbolHN = EnvAddSymbol(theEnv,FALSE_STRING);
00147 IncrementSymbolCount(SymbolData(theEnv)->FalseSymbolHN);
00148 SymbolData(theEnv)->PositiveInfinity = EnvAddSymbol(theEnv,POSITIVE_INFINITY_STRING);
00149 IncrementSymbolCount(SymbolData(theEnv)->PositiveInfinity);
00150 SymbolData(theEnv)->NegativeInfinity = EnvAddSymbol(theEnv,NEGATIVE_INFINITY_STRING);
00151 IncrementSymbolCount(SymbolData(theEnv)->NegativeInfinity);
00152 SymbolData(theEnv)->Zero = EnvAddLong(theEnv,0LL);
00153 IncrementIntegerCount(SymbolData(theEnv)->Zero);
00154 #else
00155 SetSymbolTable(theEnv,symbolTable);
00156 SetFloatTable(theEnv,floatTable);
00157 SetIntegerTable(theEnv,integerTable);
00158 SetBitMapTable(theEnv,bitmapTable);
00159
00160 SymbolData(theEnv)->ExternalAddressTable = (EXTERNAL_ADDRESS_HN **)
00161 gm2(theEnv,(int) sizeof (EXTERNAL_ADDRESS_HN *) * EXTERNAL_ADDRESS_HASH_SIZE);
00162
00163 for (i = 0; i < EXTERNAL_ADDRESS_HASH_SIZE; i++) SymbolData(theEnv)->ExternalAddressTable[i] = NULL;
00164 #endif
00165 }
00166
00167
00168
00169
00170
00171 static void DeallocateSymbolData(
00172 void *theEnv)
00173 {
00174 int i;
00175 SYMBOL_HN *shPtr, *nextSHPtr;
00176 INTEGER_HN *ihPtr, *nextIHPtr;
00177 FLOAT_HN *fhPtr, *nextFHPtr;
00178 BITMAP_HN *bmhPtr, *nextBMHPtr;
00179 EXTERNAL_ADDRESS_HN *eahPtr, *nextEAHPtr;
00180 struct ephemeron *edPtr, *nextEDPtr;
00181
00182 if ((SymbolData(theEnv)->SymbolTable == NULL) ||
00183 (SymbolData(theEnv)->FloatTable == NULL) ||
00184 (SymbolData(theEnv)->IntegerTable == NULL) ||
00185 (SymbolData(theEnv)->BitMapTable == NULL) ||
00186 (SymbolData(theEnv)->ExternalAddressTable == NULL))
00187 { return; }
00188
00189 for (i = 0; i < SYMBOL_HASH_SIZE; i++)
00190 {
00191 shPtr = SymbolData(theEnv)->SymbolTable[i];
00192
00193 while (shPtr != NULL)
00194 {
00195 nextSHPtr = shPtr->next;
00196 if (! shPtr->permanent)
00197 {
00198 rm(theEnv,shPtr->contents,strlen(shPtr->contents)+1);
00199 rtn_struct(theEnv,symbolHashNode,shPtr);
00200 }
00201 shPtr = nextSHPtr;
00202 }
00203 }
00204
00205 for (i = 0; i < FLOAT_HASH_SIZE; i++)
00206 {
00207 fhPtr = SymbolData(theEnv)->FloatTable[i];
00208
00209 while (fhPtr != NULL)
00210 {
00211 nextFHPtr = fhPtr->next;
00212 if (! fhPtr->permanent)
00213 { rtn_struct(theEnv,floatHashNode,fhPtr); }
00214 fhPtr = nextFHPtr;
00215 }
00216 }
00217
00218 for (i = 0; i < INTEGER_HASH_SIZE; i++)
00219 {
00220 ihPtr = SymbolData(theEnv)->IntegerTable[i];
00221
00222 while (ihPtr != NULL)
00223 {
00224 nextIHPtr = ihPtr->next;
00225 if (! ihPtr->permanent)
00226 { rtn_struct(theEnv,integerHashNode,ihPtr); }
00227 ihPtr = nextIHPtr;
00228 }
00229 }
00230
00231 for (i = 0; i < BITMAP_HASH_SIZE; i++)
00232 {
00233 bmhPtr = SymbolData(theEnv)->BitMapTable[i];
00234
00235 while (bmhPtr != NULL)
00236 {
00237 nextBMHPtr = bmhPtr->next;
00238 if (! bmhPtr->permanent)
00239 {
00240 rm(theEnv,bmhPtr->contents,bmhPtr->size);
00241 rtn_struct(theEnv,bitMapHashNode,bmhPtr);
00242 }
00243 bmhPtr = nextBMHPtr;
00244 }
00245 }
00246
00247 for (i = 0; i < EXTERNAL_ADDRESS_HASH_SIZE; i++)
00248 {
00249 eahPtr = SymbolData(theEnv)->ExternalAddressTable[i];
00250
00251 while (eahPtr != NULL)
00252 {
00253 nextEAHPtr = eahPtr->next;
00254 if (! eahPtr->permanent)
00255 {
00256 rtn_struct(theEnv,externalAddressHashNode,eahPtr);
00257 }
00258 eahPtr = nextEAHPtr;
00259 }
00260 }
00261
00262
00263
00264
00265
00266 edPtr = SymbolData(theEnv)->EphemeralSymbolList;
00267
00268 while (edPtr != NULL)
00269 {
00270 nextEDPtr = edPtr->next;
00271 rtn_struct(theEnv,ephemeron,edPtr);
00272 edPtr = nextEDPtr;
00273 }
00274
00275 edPtr = SymbolData(theEnv)->EphemeralFloatList;
00276
00277 while (edPtr != NULL)
00278 {
00279 nextEDPtr = edPtr->next;
00280 rtn_struct(theEnv,ephemeron,edPtr);
00281 edPtr = nextEDPtr;
00282 }
00283
00284 edPtr = SymbolData(theEnv)->EphemeralIntegerList;
00285
00286 while (edPtr != NULL)
00287 {
00288 nextEDPtr = edPtr->next;
00289 rtn_struct(theEnv,ephemeron,edPtr);
00290 edPtr = nextEDPtr;
00291 }
00292
00293 edPtr = SymbolData(theEnv)->EphemeralBitMapList;
00294
00295 while (edPtr != NULL)
00296 {
00297 nextEDPtr = edPtr->next;
00298 rtn_struct(theEnv,ephemeron,edPtr);
00299 edPtr = nextEDPtr;
00300 }
00301
00302 edPtr = SymbolData(theEnv)->EphemeralExternalAddressList;
00303
00304 while (edPtr != NULL)
00305 {
00306 nextEDPtr = edPtr->next;
00307 rtn_struct(theEnv,ephemeron,edPtr);
00308 edPtr = nextEDPtr;
00309 }
00310
00311
00312
00313
00314
00315 #if ! RUN_TIME
00316 rm3(theEnv,SymbolData(theEnv)->SymbolTable,sizeof (SYMBOL_HN *) * SYMBOL_HASH_SIZE);
00317
00318 genfree(theEnv,SymbolData(theEnv)->FloatTable,(int) sizeof (FLOAT_HN *) * FLOAT_HASH_SIZE);
00319
00320 genfree(theEnv,SymbolData(theEnv)->IntegerTable,(int) sizeof (INTEGER_HN *) * INTEGER_HASH_SIZE);
00321
00322 genfree(theEnv,SymbolData(theEnv)->BitMapTable,(int) sizeof (BITMAP_HN *) * BITMAP_HASH_SIZE);
00323 #endif
00324
00325 genfree(theEnv,SymbolData(theEnv)->ExternalAddressTable,(int) sizeof (EXTERNAL_ADDRESS_HN *) * EXTERNAL_ADDRESS_HASH_SIZE);
00326
00327
00328
00329
00330
00331 #if BLOAD || BLOAD_ONLY || BLOAD_AND_BSAVE || BLOAD_INSTANCES || BSAVE_INSTANCES
00332 if (SymbolData(theEnv)->SymbolArray != NULL)
00333 rm3(theEnv,(void *) SymbolData(theEnv)->SymbolArray,(long) sizeof(SYMBOL_HN *) * SymbolData(theEnv)->NumberOfSymbols);
00334 if (SymbolData(theEnv)->FloatArray != NULL)
00335 rm3(theEnv,(void *) SymbolData(theEnv)->FloatArray,(long) sizeof(FLOAT_HN *) * SymbolData(theEnv)->NumberOfFloats);
00336 if (SymbolData(theEnv)->IntegerArray != NULL)
00337 rm3(theEnv,(void *) SymbolData(theEnv)->IntegerArray,(long) sizeof(INTEGER_HN *) * SymbolData(theEnv)->NumberOfIntegers);
00338 if (SymbolData(theEnv)->BitMapArray != NULL)
00339 rm3(theEnv,(void *) SymbolData(theEnv)->BitMapArray,(long) sizeof(BITMAP_HN *) * SymbolData(theEnv)->NumberOfBitMaps);
00340 #endif
00341 }
00342
00343
00344
00345
00346
00347
00348
00349
00350 globle void *EnvAddSymbol(
00351 void *theEnv,
00352 char *str)
00353 {
00354 unsigned long tally;
00355 size_t length;
00356 SYMBOL_HN *past = NULL, *peek;
00357
00358
00359
00360
00361
00362 if (str == NULL)
00363 {
00364 SystemError(theEnv,"SYMBOL",1);
00365 EnvExitRouter(theEnv,EXIT_FAILURE);
00366 }
00367
00368 tally = HashSymbol(str,SYMBOL_HASH_SIZE);
00369 peek = SymbolData(theEnv)->SymbolTable[tally];
00370
00371
00372
00373
00374
00375
00376
00377 while (peek != NULL)
00378 {
00379 if (strcmp(str,peek->contents) == 0)
00380 { return((void *) peek); }
00381 past = peek;
00382 peek = peek->next;
00383 }
00384
00385
00386
00387
00388
00389
00390 peek = get_struct(theEnv,symbolHashNode);
00391
00392 if (past == NULL) SymbolData(theEnv)->SymbolTable[tally] = peek;
00393 else past->next = peek;
00394
00395 length = strlen(str) + 1;
00396 peek->contents = (char *) gm2(theEnv,length);
00397 peek->next = NULL;
00398 peek->bucket = tally;
00399 peek->count = 0;
00400 peek->permanent = FALSE;
00401 genstrcpy(peek->contents,str);
00402
00403
00404
00405
00406
00407 AddEphemeralHashNode(theEnv,(GENERIC_HN *) peek,&SymbolData(theEnv)->EphemeralSymbolList,
00408 sizeof(SYMBOL_HN),AVERAGE_STRING_SIZE);
00409 peek->depth = EvaluationData(theEnv)->CurrentEvaluationDepth;
00410
00411
00412
00413
00414
00415 return((void *) peek);
00416 }
00417
00418
00419
00420
00421
00422 globle SYMBOL_HN *FindSymbolHN(
00423 void *theEnv,
00424 char *str)
00425 {
00426 unsigned long tally;
00427 SYMBOL_HN *peek;
00428
00429 tally = HashSymbol(str,SYMBOL_HASH_SIZE);
00430
00431 for (peek = SymbolData(theEnv)->SymbolTable[tally];
00432 peek != NULL;
00433 peek = peek->next)
00434 {
00435 if (strcmp(str,peek->contents) == 0)
00436 { return(peek); }
00437 }
00438
00439 return(NULL);
00440 }
00441
00442
00443
00444
00445
00446
00447
00448 globle void *EnvAddDouble(
00449 void *theEnv,
00450 double number)
00451 {
00452 unsigned long tally;
00453 FLOAT_HN *past = NULL, *peek;
00454
00455
00456
00457
00458
00459 tally = HashFloat(number,FLOAT_HASH_SIZE);
00460 peek = SymbolData(theEnv)->FloatTable[tally];
00461
00462
00463
00464
00465
00466
00467
00468 while (peek != NULL)
00469 {
00470 if (number == peek->contents)
00471 { return((void *) peek); }
00472 past = peek;
00473 peek = peek->next;
00474 }
00475
00476
00477
00478
00479
00480
00481 peek = get_struct(theEnv,floatHashNode);
00482
00483 if (past == NULL) SymbolData(theEnv)->FloatTable[tally] = peek;
00484 else past->next = peek;
00485
00486 peek->contents = number;
00487 peek->next = NULL;
00488 peek->bucket = tally;
00489 peek->count = 0;
00490 peek->permanent = FALSE;
00491
00492
00493
00494
00495
00496 AddEphemeralHashNode(theEnv,(GENERIC_HN *) peek,&SymbolData(theEnv)->EphemeralFloatList,
00497 sizeof(FLOAT_HN),0);
00498 peek->depth = EvaluationData(theEnv)->CurrentEvaluationDepth;
00499
00500
00501
00502
00503
00504 return((void *) peek);
00505 }
00506
00507
00508
00509
00510
00511
00512
00513 globle void *EnvAddLong(
00514 void *theEnv,
00515 long long number)
00516 {
00517 unsigned long tally;
00518 INTEGER_HN *past = NULL, *peek;
00519
00520
00521
00522
00523
00524 tally = HashInteger(number,INTEGER_HASH_SIZE);
00525 peek = SymbolData(theEnv)->IntegerTable[tally];
00526
00527
00528
00529
00530
00531
00532
00533 while (peek != NULL)
00534 {
00535 if (number == peek->contents)
00536 { return((void *) peek); }
00537 past = peek;
00538 peek = peek->next;
00539 }
00540
00541
00542
00543
00544
00545
00546 peek = get_struct(theEnv,integerHashNode);
00547 if (past == NULL) SymbolData(theEnv)->IntegerTable[tally] = peek;
00548 else past->next = peek;
00549
00550 peek->contents = number;
00551 peek->next = NULL;
00552 peek->bucket = tally;
00553 peek->count = 0;
00554 peek->permanent = FALSE;
00555
00556
00557
00558
00559
00560 AddEphemeralHashNode(theEnv,(GENERIC_HN *) peek,&SymbolData(theEnv)->EphemeralIntegerList,
00561 sizeof(INTEGER_HN),0);
00562 peek->depth = EvaluationData(theEnv)->CurrentEvaluationDepth;
00563
00564
00565
00566
00567
00568 return((void *) peek);
00569 }
00570
00571
00572
00573
00574
00575 globle INTEGER_HN *FindLongHN(
00576 void *theEnv,
00577 long long theLong)
00578 {
00579 unsigned long tally;
00580 INTEGER_HN *peek;
00581
00582 tally = HashInteger(theLong,INTEGER_HASH_SIZE);
00583
00584 for (peek = SymbolData(theEnv)->IntegerTable[tally];
00585 peek != NULL;
00586 peek = peek->next)
00587 { if (peek->contents == theLong) return(peek); }
00588
00589 return(NULL);
00590 }
00591
00592
00593
00594
00595
00596
00597
00598 globle void *EnvAddBitMap(
00599 void *theEnv,
00600 void *vTheBitMap,
00601 unsigned size)
00602 {
00603 char *theBitMap = (char *) vTheBitMap;
00604 unsigned long tally;
00605 unsigned i;
00606 BITMAP_HN *past = NULL, *peek;
00607
00608
00609
00610
00611
00612 if (theBitMap == NULL)
00613 {
00614 SystemError(theEnv,"SYMBOL",2);
00615 EnvExitRouter(theEnv,EXIT_FAILURE);
00616 }
00617
00618 tally = HashBitMap(theBitMap,BITMAP_HASH_SIZE,size);
00619 peek = SymbolData(theEnv)->BitMapTable[tally];
00620
00621
00622
00623
00624
00625
00626
00627 while (peek != NULL)
00628 {
00629 if (peek->size == (unsigned short) size)
00630 {
00631 for (i = 0; i < size ; i++)
00632 { if (peek->contents[i] != theBitMap[i]) break; }
00633
00634 if (i == size) return((void *) peek);
00635 }
00636
00637 past = peek;
00638 peek = peek->next;
00639 }
00640
00641
00642
00643
00644
00645
00646 peek = get_struct(theEnv,bitMapHashNode);
00647 if (past == NULL) SymbolData(theEnv)->BitMapTable[tally] = peek;
00648 else past->next = peek;
00649
00650 peek->contents = (char *) gm2(theEnv,size);
00651 peek->next = NULL;
00652 peek->bucket = tally;
00653 peek->count = 0;
00654 peek->permanent = FALSE;
00655 peek->size = (unsigned short) size;
00656
00657 for (i = 0; i < size ; i++) peek->contents[i] = theBitMap[i];
00658
00659
00660
00661
00662
00663 AddEphemeralHashNode(theEnv,(GENERIC_HN *) peek,&SymbolData(theEnv)->EphemeralBitMapList,
00664 sizeof(BITMAP_HN),sizeof(long));
00665 peek->depth = EvaluationData(theEnv)->CurrentEvaluationDepth;
00666
00667
00668
00669
00670
00671 return((void *) peek);
00672 }
00673
00674
00675
00676
00677
00678
00679
00680
00681 globle void *EnvAddExternalAddress(
00682 void *theEnv,
00683 void *theExternalAddress,
00684 unsigned theType)
00685 {
00686 unsigned long tally;
00687 EXTERNAL_ADDRESS_HN *past = NULL, *peek;
00688
00689
00690
00691
00692
00693 tally = HashExternalAddress(theExternalAddress,EXTERNAL_ADDRESS_HASH_SIZE);
00694
00695 peek = SymbolData(theEnv)->ExternalAddressTable[tally];
00696
00697
00698
00699
00700
00701
00702
00703 while (peek != NULL)
00704 {
00705 if ((peek->type == (unsigned short) theType) &&
00706 (peek->externalAddress == theExternalAddress))
00707 { return((void *) peek); }
00708
00709 past = peek;
00710 peek = peek->next;
00711 }
00712
00713
00714
00715
00716
00717
00718 peek = get_struct(theEnv,externalAddressHashNode);
00719 if (past == NULL) SymbolData(theEnv)->ExternalAddressTable[tally] = peek;
00720 else past->next = peek;
00721
00722 peek->externalAddress = theExternalAddress;
00723 peek->type = (unsigned short) theType;
00724 peek->next = NULL;
00725 peek->bucket = tally;
00726 peek->count = 0;
00727 peek->permanent = FALSE;
00728
00729
00730
00731
00732
00733 AddEphemeralHashNode(theEnv,(GENERIC_HN *) peek,&SymbolData(theEnv)->EphemeralExternalAddressList,
00734 sizeof(EXTERNAL_ADDRESS_HN),sizeof(long));
00735 peek->depth = EvaluationData(theEnv)->CurrentEvaluationDepth;
00736
00737
00738
00739
00740
00741 return((void *) peek);
00742 }
00743
00744
00745
00746
00747 globle unsigned long HashSymbol(
00748 char *word,
00749 unsigned long range)
00750 {
00751 register int i;
00752 unsigned long tally = 0;
00753
00754 for (i = 0; word[i]; i++)
00755 { tally = tally * 127 + word[i]; }
00756
00757 if (range == 0)
00758 { return tally; }
00759
00760 return(tally % range);
00761 }
00762
00763
00764
00765
00766 globle unsigned long HashFloat(
00767 double number,
00768 unsigned long range)
00769 {
00770 unsigned long tally = 0;
00771 char *word;
00772 unsigned i;
00773
00774 word = (char *) &number;
00775
00776 for (i = 0; i < sizeof(double); i++)
00777 { tally = tally * 127 + word[i]; }
00778
00779 if (range == 0)
00780 { return tally; }
00781
00782 return(tally % range);
00783 }
00784
00785
00786
00787
00788 globle unsigned long HashInteger(
00789 long long number,
00790 unsigned long range)
00791 {
00792 unsigned long tally;
00793
00794 #if WIN_MVC
00795 if (number < 0)
00796 { number = - number; }
00797 tally = (((unsigned) number) % range);
00798 #else
00799 tally = (((unsigned) llabs(number)) % range);
00800 #endif
00801
00802 if (range == 0)
00803 { return tally; }
00804
00805 return(tally);
00806 }
00807
00808
00809
00810
00811
00812 globle unsigned long HashExternalAddress(
00813 void *theExternalAddress,
00814 unsigned long range)
00815 {
00816 unsigned long tally;
00817 union
00818 {
00819 void *vv;
00820 unsigned uv;
00821 } fis;
00822
00823 fis.uv = 0;
00824 fis.vv = theExternalAddress;
00825 tally = (fis.uv / 256);
00826
00827 if (range == 0)
00828 { return tally; }
00829
00830 return(tally % range);
00831 }
00832
00833
00834
00835
00836 globle unsigned long HashBitMap(
00837 char *word,
00838 unsigned long range,
00839 unsigned length)
00840 {
00841 register unsigned k,j,i;
00842 unsigned long tally;
00843 unsigned longLength;
00844 unsigned long count = 0L,tmpLong;
00845 char *tmpPtr;
00846
00847 tmpPtr = (char *) &tmpLong;
00848
00849
00850
00851
00852
00853 longLength = length / sizeof(unsigned long);
00854 for (i = 0 , j = 0 ; i < longLength; i++)
00855 {
00856 for (k = 0 ; k < sizeof(unsigned long) ; k++ , j++)
00857 tmpPtr[k] = word[j];
00858 count += tmpLong;
00859 }
00860
00861
00862
00863
00864
00865 for (; j < length; j++) count += (unsigned long) word[j];
00866
00867
00868
00869
00870
00871 if (range == 0)
00872 { return count; }
00873
00874 tally = (count % range);
00875
00876 return(tally);
00877 }
00878
00879
00880
00881
00882
00883
00884 globle void DecrementSymbolCount(
00885 void *theEnv,
00886 SYMBOL_HN *theValue)
00887 {
00888 if (theValue->count < 0)
00889 {
00890 SystemError(theEnv,"SYMBOL",3);
00891 EnvExitRouter(theEnv,EXIT_FAILURE);
00892 }
00893
00894 if (theValue->count == 0)
00895 {
00896 SystemError(theEnv,"SYMBOL",4);
00897 EnvExitRouter(theEnv,EXIT_FAILURE);
00898 }
00899
00900 theValue->count--;
00901
00902 if (theValue->count != 0) return;
00903
00904 if (theValue->markedEphemeral == FALSE)
00905 {
00906 AddEphemeralHashNode(theEnv,(GENERIC_HN *) theValue,&SymbolData(theEnv)->EphemeralSymbolList,
00907 sizeof(SYMBOL_HN),AVERAGE_STRING_SIZE);
00908 }
00909
00910 return;
00911 }
00912
00913
00914
00915
00916
00917
00918 globle void DecrementFloatCount(
00919 void *theEnv,
00920 FLOAT_HN *theValue)
00921 {
00922 if (theValue->count <= 0)
00923 {
00924 SystemError(theEnv,"SYMBOL",5);
00925 EnvExitRouter(theEnv,EXIT_FAILURE);
00926 }
00927
00928 theValue->count--;
00929
00930 if (theValue->count != 0) return;
00931
00932 if (theValue->markedEphemeral == FALSE)
00933 {
00934 AddEphemeralHashNode(theEnv,(GENERIC_HN *) theValue,&SymbolData(theEnv)->EphemeralFloatList,
00935 sizeof(FLOAT_HN),0);
00936 }
00937
00938 return;
00939 }
00940
00941
00942
00943
00944
00945
00946 globle void DecrementIntegerCount(
00947 void *theEnv,
00948 INTEGER_HN *theValue)
00949 {
00950 if (theValue->count <= 0)
00951 {
00952 SystemError(theEnv,"SYMBOL",6);
00953 EnvExitRouter(theEnv,EXIT_FAILURE);
00954 }
00955
00956 theValue->count--;
00957
00958 if (theValue->count != 0) return;
00959
00960 if (theValue->markedEphemeral == FALSE)
00961 {
00962 AddEphemeralHashNode(theEnv,(GENERIC_HN *) theValue,&SymbolData(theEnv)->EphemeralIntegerList,
00963 sizeof(INTEGER_HN),0);
00964 }
00965
00966 return;
00967 }
00968
00969
00970
00971
00972
00973
00974 globle void DecrementBitMapCount(
00975 void *theEnv,
00976 BITMAP_HN *theValue)
00977 {
00978 if (theValue->count < 0)
00979 {
00980 SystemError(theEnv,"SYMBOL",7);
00981 EnvExitRouter(theEnv,EXIT_FAILURE);
00982 }
00983
00984 if (theValue->count == 0)
00985 {
00986 SystemError(theEnv,"SYMBOL",8);
00987 EnvExitRouter(theEnv,EXIT_FAILURE);
00988 }
00989
00990 theValue->count--;
00991
00992 if (theValue->count != 0) return;
00993
00994 if (theValue->markedEphemeral == FALSE)
00995 {
00996 AddEphemeralHashNode(theEnv,(GENERIC_HN *) theValue,&SymbolData(theEnv)->EphemeralBitMapList,
00997 sizeof(BITMAP_HN),sizeof(long));
00998 }
00999
01000 return;
01001 }
01002
01003
01004
01005
01006
01007
01008 globle void DecrementExternalAddressCount(
01009 void *theEnv,
01010 EXTERNAL_ADDRESS_HN *theValue)
01011 {
01012 if (theValue->count < 0)
01013 {
01014 SystemError(theEnv,"SYMBOL",9);
01015 EnvExitRouter(theEnv,EXIT_FAILURE);
01016 }
01017
01018 if (theValue->count == 0)
01019 {
01020 SystemError(theEnv,"SYMBOL",10);
01021 EnvExitRouter(theEnv,EXIT_FAILURE);
01022 }
01023
01024 theValue->count--;
01025
01026 if (theValue->count != 0) return;
01027
01028 if (theValue->markedEphemeral == FALSE)
01029 {
01030 AddEphemeralHashNode(theEnv,(GENERIC_HN *) theValue,&SymbolData(theEnv)->EphemeralExternalAddressList,
01031 sizeof(EXTERNAL_ADDRESS_HN),sizeof(long));
01032 }
01033
01034 return;
01035 }
01036
01037
01038
01039
01040
01041
01042 static void RemoveHashNode(
01043 void *theEnv,
01044 GENERIC_HN *theValue,
01045 GENERIC_HN **theTable,
01046 int size,
01047 int type)
01048 {
01049 GENERIC_HN *previousNode, *currentNode;
01050 struct externalAddressHashNode *theAddress;
01051
01052
01053
01054
01055
01056 previousNode = NULL;
01057 currentNode = theTable[theValue->bucket];
01058
01059 while (currentNode != theValue)
01060 {
01061 previousNode = currentNode;
01062 currentNode = currentNode->next;
01063
01064 if (currentNode == NULL)
01065 {
01066 SystemError(theEnv,"SYMBOL",11);
01067 EnvExitRouter(theEnv,EXIT_FAILURE);
01068 }
01069 }
01070
01071
01072
01073
01074
01075
01076 if (previousNode == NULL)
01077 { theTable[theValue->bucket] = theValue->next; }
01078 else
01079 { previousNode->next = currentNode->next; }
01080
01081
01082
01083
01084
01085
01086 if (type == SYMBOL)
01087 {
01088 rm(theEnv,((SYMBOL_HN *) theValue)->contents,
01089 strlen(((SYMBOL_HN *) theValue)->contents) + 1);
01090 }
01091 else if (type == BITMAPARRAY)
01092 {
01093 rm(theEnv,((BITMAP_HN *) theValue)->contents,
01094 ((BITMAP_HN *) theValue)->size);
01095 }
01096 else if (type == EXTERNAL_ADDRESS)
01097 {
01098 theAddress = (struct externalAddressHashNode *) theValue;
01099
01100 if ((EvaluationData(theEnv)->ExternalAddressTypes[theAddress->type] != NULL) &&
01101 (EvaluationData(theEnv)->ExternalAddressTypes[theAddress->type]->discardFunction != NULL))
01102 { (*EvaluationData(theEnv)->ExternalAddressTypes[theAddress->type]->discardFunction)(theEnv,theAddress->externalAddress); }
01103 }
01104
01105
01106
01107
01108
01109
01110 rtn_sized_struct(theEnv,size,theValue);
01111 }
01112
01113
01114
01115
01116
01117
01118
01119 static void AddEphemeralHashNode(
01120 void *theEnv,
01121 GENERIC_HN *theHashNode,
01122 struct ephemeron **theEphemeralList,
01123 int hashNodeSize,
01124 int averageContentsSize)
01125 {
01126 struct ephemeron *temp;
01127
01128
01129
01130
01131
01132
01133 if (theHashNode->count != 0)
01134 {
01135 SystemError(theEnv,"SYMBOL",12);
01136 EnvExitRouter(theEnv,EXIT_FAILURE);
01137 }
01138
01139
01140
01141
01142
01143 theHashNode->markedEphemeral = TRUE;
01144
01145
01146
01147
01148
01149
01150 temp = get_struct(theEnv,ephemeron);
01151 temp->associatedValue = theHashNode;
01152 temp->next = *theEphemeralList;
01153 *theEphemeralList = temp;
01154
01155
01156
01157
01158
01159
01160
01161 UtilityData(theEnv)->EphemeralItemCount++;
01162 UtilityData(theEnv)->EphemeralItemSize += sizeof(struct ephemeron) + hashNodeSize +
01163 averageContentsSize;
01164 }
01165
01166
01167
01168
01169
01170
01171
01172 globle void RemoveEphemeralAtoms(
01173 void *theEnv)
01174 {
01175 RemoveEphemeralHashNodes(theEnv,&SymbolData(theEnv)->EphemeralSymbolList,(GENERIC_HN **) SymbolData(theEnv)->SymbolTable,
01176 sizeof(SYMBOL_HN),SYMBOL,AVERAGE_STRING_SIZE);
01177 RemoveEphemeralHashNodes(theEnv,&SymbolData(theEnv)->EphemeralFloatList,(GENERIC_HN **) SymbolData(theEnv)->FloatTable,
01178 sizeof(FLOAT_HN),FLOAT,0);
01179 RemoveEphemeralHashNodes(theEnv,&SymbolData(theEnv)->EphemeralIntegerList,(GENERIC_HN **) SymbolData(theEnv)->IntegerTable,
01180 sizeof(INTEGER_HN),INTEGER,0);
01181 RemoveEphemeralHashNodes(theEnv,&SymbolData(theEnv)->EphemeralBitMapList,(GENERIC_HN **) SymbolData(theEnv)->BitMapTable,
01182 sizeof(BITMAP_HN),BITMAPARRAY,AVERAGE_BITMAP_SIZE);
01183 RemoveEphemeralHashNodes(theEnv,&SymbolData(theEnv)->EphemeralExternalAddressList,(GENERIC_HN **) SymbolData(theEnv)->ExternalAddressTable,
01184 sizeof(EXTERNAL_ADDRESS_HN),EXTERNAL_ADDRESS,0);
01185 }
01186
01187
01188
01189
01190
01191
01192
01193
01194
01195
01196
01197
01198 static void RemoveEphemeralHashNodes(
01199 void *theEnv,
01200 struct ephemeron **theEphemeralList,
01201 GENERIC_HN **theTable,
01202 int hashNodeSize,
01203 int hashNodeType,
01204 int averageContentsSize)
01205 {
01206 struct ephemeron *edPtr, *lastPtr = NULL, *nextPtr;
01207
01208 edPtr = *theEphemeralList;
01209
01210 while (edPtr != NULL)
01211 {
01212
01213
01214
01215
01216
01217
01218 nextPtr = edPtr->next;
01219
01220
01221
01222
01223
01224
01225
01226 if ((edPtr->associatedValue->count == 0) &&
01227 (edPtr->associatedValue->depth > EvaluationData(theEnv)->CurrentEvaluationDepth))
01228 {
01229 RemoveHashNode(theEnv,edPtr->associatedValue,theTable,hashNodeSize,hashNodeType);
01230 rtn_struct(theEnv,ephemeron,edPtr);
01231 if (lastPtr == NULL) *theEphemeralList = nextPtr;
01232 else lastPtr->next = nextPtr;
01233 UtilityData(theEnv)->EphemeralItemCount--;
01234 UtilityData(theEnv)->EphemeralItemSize -= sizeof(struct ephemeron) + hashNodeSize +
01235 averageContentsSize;
01236 }
01237
01238
01239
01240
01241
01242
01243 else if (edPtr->associatedValue->count > 0)
01244 {
01245 edPtr->associatedValue->markedEphemeral = FALSE;
01246
01247 rtn_struct(theEnv,ephemeron,edPtr);
01248
01249 if (lastPtr == NULL) *theEphemeralList = nextPtr;
01250 else lastPtr->next = nextPtr;
01251 UtilityData(theEnv)->EphemeralItemCount--;
01252 UtilityData(theEnv)->EphemeralItemSize -= sizeof(struct ephemeron) + hashNodeSize +
01253 averageContentsSize;
01254 }
01255
01256
01257
01258
01259
01260 else
01261 { lastPtr = edPtr; }
01262
01263 edPtr = nextPtr;
01264 }
01265 }
01266
01267
01268
01269
01270 globle SYMBOL_HN **GetSymbolTable(
01271 void *theEnv)
01272 {
01273 return(SymbolData(theEnv)->SymbolTable);
01274 }
01275
01276
01277
01278
01279 globle void SetSymbolTable(
01280 void *theEnv,
01281 SYMBOL_HN **value)
01282 {
01283 SymbolData(theEnv)->SymbolTable = value;
01284 }
01285
01286
01287
01288
01289 globle FLOAT_HN **GetFloatTable(
01290 void *theEnv)
01291 {
01292 return(SymbolData(theEnv)->FloatTable);
01293 }
01294
01295
01296
01297
01298 globle void SetFloatTable(
01299 void *theEnv,
01300 FLOAT_HN **value)
01301 {
01302 SymbolData(theEnv)->FloatTable = value;
01303 }
01304
01305
01306
01307
01308 globle INTEGER_HN **GetIntegerTable(
01309 void *theEnv)
01310 {
01311 return(SymbolData(theEnv)->IntegerTable);
01312 }
01313
01314
01315
01316
01317 globle void SetIntegerTable(
01318 void *theEnv,
01319 INTEGER_HN **value)
01320 {
01321 SymbolData(theEnv)->IntegerTable = value;
01322 }
01323
01324
01325
01326
01327 globle BITMAP_HN **GetBitMapTable(
01328 void *theEnv)
01329 {
01330 return(SymbolData(theEnv)->BitMapTable);
01331 }
01332
01333
01334
01335
01336 globle void SetBitMapTable(
01337 void *theEnv,
01338 BITMAP_HN **value)
01339 {
01340 SymbolData(theEnv)->BitMapTable = value;
01341 }
01342
01343
01344
01345
01346 globle EXTERNAL_ADDRESS_HN **GetExternalAddressTable(
01347 void *theEnv)
01348 {
01349 return(SymbolData(theEnv)->ExternalAddressTable);
01350 }
01351
01352
01353
01354
01355 globle void SetExternalAddressTable(
01356 void *theEnv,
01357 EXTERNAL_ADDRESS_HN **value)
01358 {
01359 SymbolData(theEnv)->ExternalAddressTable = value;
01360 }
01361
01362
01363
01364
01365
01366
01367 globle void RefreshSpecialSymbols(
01368 void *theEnv)
01369 {
01370 SymbolData(theEnv)->TrueSymbolHN = (void *) FindSymbolHN(theEnv,TRUE_STRING);
01371 SymbolData(theEnv)->FalseSymbolHN = (void *) FindSymbolHN(theEnv,FALSE_STRING);
01372 SymbolData(theEnv)->PositiveInfinity = (void *) FindSymbolHN(theEnv,POSITIVE_INFINITY_STRING);
01373 SymbolData(theEnv)->NegativeInfinity = (void *) FindSymbolHN(theEnv,NEGATIVE_INFINITY_STRING);
01374 SymbolData(theEnv)->Zero = (void *) FindLongHN(theEnv,0L);
01375 }
01376
01377
01378
01379
01380
01381
01382
01383 globle struct symbolMatch *FindSymbolMatches(
01384 void *theEnv,
01385 char *searchString,
01386 unsigned *numberOfMatches,
01387 size_t *commonPrefixLength)
01388 {
01389 struct symbolMatch *reply = NULL, *temp;
01390 struct symbolHashNode *hashPtr = NULL;
01391 size_t searchLength;
01392
01393 searchLength = strlen(searchString);
01394 *numberOfMatches = 0;
01395
01396 while ((hashPtr = GetNextSymbolMatch(theEnv,searchString,searchLength,hashPtr,
01397 FALSE,commonPrefixLength)) != NULL)
01398 {
01399 *numberOfMatches = *numberOfMatches + 1;
01400 temp = get_struct(theEnv,symbolMatch);
01401 temp->match = hashPtr;
01402 temp->next = reply;
01403 reply = temp;
01404 }
01405
01406 return(reply);
01407 }
01408
01409
01410
01411
01412 globle void ReturnSymbolMatches(
01413 void *theEnv,
01414 struct symbolMatch *listOfMatches)
01415 {
01416 struct symbolMatch *temp;
01417
01418 while (listOfMatches != NULL)
01419 {
01420 temp = listOfMatches->next;
01421 rtn_struct(theEnv,symbolMatch,listOfMatches);
01422 listOfMatches = temp;
01423 }
01424 }
01425
01426
01427
01428
01429 globle void ClearBitString(
01430 void *vTheBitMap,
01431 unsigned length)
01432 {
01433 char *theBitMap = (char *) vTheBitMap;
01434 unsigned i;
01435
01436 for (i = 0; i < length; i++) theBitMap[i] = '\0';
01437 }
01438
01439
01440
01441
01442
01443
01444
01445 globle SYMBOL_HN *GetNextSymbolMatch(
01446 void *theEnv,
01447 char *searchString,
01448 size_t searchLength,
01449 SYMBOL_HN *prevSymbol,
01450 int anywhere,
01451 size_t *commonPrefixLength)
01452 {
01453 register unsigned long i;
01454 SYMBOL_HN *hashPtr;
01455 int flag = TRUE;
01456 size_t prefixLength;
01457
01458
01459
01460
01461
01462
01463 if (anywhere && (commonPrefixLength != NULL))
01464 *commonPrefixLength = 0;
01465
01466
01467
01468
01469
01470
01471 if (prevSymbol == NULL)
01472 {
01473 i = 0;
01474 hashPtr = SymbolData(theEnv)->SymbolTable[0];
01475 }
01476
01477
01478
01479
01480
01481
01482 else
01483 {
01484 i = prevSymbol->bucket;
01485 hashPtr = prevSymbol->next;
01486 }
01487
01488
01489
01490
01491
01492 while (flag)
01493 {
01494
01495
01496
01497
01498
01499 for (; hashPtr != NULL; hashPtr = hashPtr->next)
01500 {
01501
01502
01503
01504
01505
01506
01507
01508 if ((hashPtr->contents[0] == '(') ||
01509 (hashPtr->markedEphemeral))
01510 { continue; }
01511
01512
01513
01514
01515
01516
01517
01518
01519 if (! anywhere)
01520 {
01521
01522
01523
01524
01525
01526
01527
01528 if (prevSymbol != NULL)
01529 prefixLength = CommonPrefixLength(prevSymbol->contents,hashPtr->contents);
01530 else
01531 prefixLength = CommonPrefixLength(searchString,hashPtr->contents);
01532
01533
01534
01535
01536
01537
01538
01539
01540
01541
01542 if (prefixLength >= searchLength)
01543 {
01544 if (commonPrefixLength != NULL)
01545 {
01546 if (prevSymbol == NULL)
01547 *commonPrefixLength = strlen(hashPtr->contents);
01548 else if (prefixLength < *commonPrefixLength)
01549 *commonPrefixLength = prefixLength;
01550 }
01551 return(hashPtr);
01552 }
01553 }
01554 else
01555 {
01556 if (StringWithinString(hashPtr->contents,searchString) != NULL)
01557 { return(hashPtr); }
01558 }
01559 }
01560
01561
01562
01563
01564
01565 if (++i >= SYMBOL_HASH_SIZE) flag = FALSE;
01566 else hashPtr = SymbolData(theEnv)->SymbolTable[i];
01567 }
01568
01569
01570
01571
01572
01573 return(NULL);
01574 }
01575
01576
01577
01578
01579
01580 static char *StringWithinString(
01581 char *cs,
01582 char *ct)
01583 {
01584 register unsigned i,j,k;
01585
01586 for (i = 0 ; cs[i] != '\0' ; i++)
01587 {
01588 for (j = i , k = 0 ; ct[k] != '\0' && cs[j] == ct[k] ; j++, k++) ;
01589 if ((ct[k] == '\0') && (k != 0))
01590 return(cs + i);
01591 }
01592 return(NULL);
01593 }
01594
01595
01596
01597
01598
01599 static size_t CommonPrefixLength(
01600 char *cs,
01601 char *ct)
01602 {
01603 register unsigned i;
01604
01605 for (i = 0 ; (cs[i] != '\0') && (ct[i] != '\0') ; i++)
01606 if (cs[i] != ct[i])
01607 break;
01608 return(i);
01609 }
01610
01611 #if BLOAD_AND_BSAVE || CONSTRUCT_COMPILER || BSAVE_INSTANCES
01612
01613
01614
01615
01616
01617
01618
01619 globle void SetAtomicValueIndices(
01620 void *theEnv,
01621 int setAll)
01622 {
01623 unsigned long count;
01624 unsigned long i;
01625 SYMBOL_HN *symbolPtr, **symbolArray;
01626 FLOAT_HN *floatPtr, **floatArray;
01627 INTEGER_HN *integerPtr, **integerArray;
01628 BITMAP_HN *bitMapPtr, **bitMapArray;
01629
01630
01631
01632
01633
01634 count = 0;
01635 symbolArray = GetSymbolTable(theEnv);
01636
01637 for (i = 0; i < SYMBOL_HASH_SIZE; i++)
01638 {
01639 for (symbolPtr = symbolArray[i];
01640 symbolPtr != NULL;
01641 symbolPtr = symbolPtr->next)
01642 {
01643 if ((symbolPtr->neededSymbol == TRUE) || setAll)
01644 {
01645 symbolPtr->bucket = count++;
01646 if (symbolPtr->bucket != (count - 1))
01647 { SystemError(theEnv,"SYMBOL",13); }
01648 }
01649 }
01650 }
01651
01652
01653
01654
01655
01656 count = 0;
01657 floatArray = GetFloatTable(theEnv);
01658
01659 for (i = 0; i < FLOAT_HASH_SIZE; i++)
01660 {
01661 for (floatPtr = floatArray[i];
01662 floatPtr != NULL;
01663 floatPtr = floatPtr->next)
01664 {
01665 if ((floatPtr->neededFloat == TRUE) || setAll)
01666 {
01667 floatPtr->bucket = count++;
01668 if (floatPtr->bucket != (count - 1))
01669 { SystemError(theEnv,"SYMBOL",14); }
01670 }
01671 }
01672 }
01673
01674
01675
01676
01677
01678 count = 0;
01679 integerArray = GetIntegerTable(theEnv);
01680
01681 for (i = 0; i < INTEGER_HASH_SIZE; i++)
01682 {
01683 for (integerPtr = integerArray[i];
01684 integerPtr != NULL;
01685 integerPtr = integerPtr->next)
01686 {
01687 if ((integerPtr->neededInteger == TRUE) || setAll)
01688 {
01689 integerPtr->bucket = count++;
01690 if (integerPtr->bucket != (count - 1))
01691 { SystemError(theEnv,"SYMBOL",15); }
01692 }
01693 }
01694 }
01695
01696
01697
01698
01699
01700 count = 0;
01701 bitMapArray = GetBitMapTable(theEnv);
01702
01703 for (i = 0; i < BITMAP_HASH_SIZE; i++)
01704 {
01705 for (bitMapPtr = bitMapArray[i];
01706 bitMapPtr != NULL;
01707 bitMapPtr = bitMapPtr->next)
01708 {
01709 if ((bitMapPtr->neededBitMap == TRUE) || setAll)
01710 {
01711 bitMapPtr->bucket = count++;
01712 if (bitMapPtr->bucket != (count - 1))
01713 { SystemError(theEnv,"SYMBOL",16); }
01714 }
01715 }
01716 }
01717 }
01718
01719
01720
01721
01722
01723
01724 globle void RestoreAtomicValueBuckets(
01725 void *theEnv)
01726 {
01727 unsigned long i;
01728 SYMBOL_HN *symbolPtr, **symbolArray;
01729 FLOAT_HN *floatPtr, **floatArray;
01730 INTEGER_HN *integerPtr, **integerArray;
01731 BITMAP_HN *bitMapPtr, **bitMapArray;
01732
01733
01734
01735
01736
01737 symbolArray = GetSymbolTable(theEnv);
01738
01739 for (i = 0; i < SYMBOL_HASH_SIZE; i++)
01740 {
01741 for (symbolPtr = symbolArray[i];
01742 symbolPtr != NULL;
01743 symbolPtr = symbolPtr->next)
01744 { symbolPtr->bucket = i; }
01745 }
01746
01747
01748
01749
01750
01751 floatArray = GetFloatTable(theEnv);
01752
01753 for (i = 0; i < FLOAT_HASH_SIZE; i++)
01754 {
01755 for (floatPtr = floatArray[i];
01756 floatPtr != NULL;
01757 floatPtr = floatPtr->next)
01758 { floatPtr->bucket = i; }
01759 }
01760
01761
01762
01763
01764
01765 integerArray = GetIntegerTable(theEnv);
01766
01767 for (i = 0; i < INTEGER_HASH_SIZE; i++)
01768 {
01769 for (integerPtr = integerArray[i];
01770 integerPtr != NULL;
01771 integerPtr = integerPtr->next)
01772 { integerPtr->bucket = i; }
01773 }
01774
01775
01776
01777
01778
01779 bitMapArray = GetBitMapTable(theEnv);
01780
01781 for (i = 0; i < BITMAP_HASH_SIZE; i++)
01782 {
01783 for (bitMapPtr = bitMapArray[i];
01784 bitMapPtr != NULL;
01785 bitMapPtr = bitMapPtr->next)
01786 { bitMapPtr->bucket = i; }
01787 }
01788 }
01789
01790 #endif