00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #define _BSAVE_SOURCE_
00024
00025 #include "setup.h"
00026
00027 #if BLOAD || BLOAD_ONLY || BLOAD_AND_BSAVE || BLOAD_INSTANCES || BSAVE_INSTANCES
00028
00029 #include "argacces.h"
00030 #include "bload.h"
00031 #include "bsave.h"
00032 #include "cstrnbin.h"
00033 #include "envrnmnt.h"
00034 #include "exprnpsr.h"
00035 #include "memalloc.h"
00036 #include "moduldef.h"
00037 #include "router.h"
00038
00039 #include "symblbin.h"
00040
00041
00042
00043
00044
00045 static void ReadNeededBitMaps(void *);
00046 #if BLOAD_AND_BSAVE || BSAVE_INSTANCES
00047 static void WriteNeededBitMaps(void *,FILE *);
00048 #endif
00049
00050 #if BLOAD_AND_BSAVE || BSAVE_INSTANCES
00051
00052
00053
00054
00055
00056
00057 globle void WriteNeededAtomicValues(
00058 void *theEnv,
00059 FILE *fp)
00060 {
00061 WriteNeededSymbols(theEnv,fp);
00062 WriteNeededFloats(theEnv,fp);
00063 WriteNeededIntegers(theEnv,fp);
00064 WriteNeededBitMaps(theEnv,fp);
00065 }
00066
00067
00068
00069
00070
00071
00072 globle void InitAtomicValueNeededFlags(
00073 void *theEnv)
00074 {
00075 unsigned long i;
00076 SYMBOL_HN *symbolPtr, **symbolArray;
00077 FLOAT_HN *floatPtr, **floatArray;
00078 INTEGER_HN *integerPtr, **integerArray;
00079 BITMAP_HN *bitMapPtr, **bitMapArray;
00080
00081
00082
00083
00084
00085 symbolArray = GetSymbolTable(theEnv);
00086
00087 for (i = 0; i < SYMBOL_HASH_SIZE; i++)
00088 {
00089 symbolPtr = symbolArray[i];
00090 while (symbolPtr != NULL)
00091 {
00092 symbolPtr->neededSymbol = FALSE;
00093 symbolPtr = symbolPtr->next;
00094 }
00095 }
00096
00097
00098
00099
00100
00101 floatArray = GetFloatTable(theEnv);
00102
00103 for (i = 0; i < FLOAT_HASH_SIZE; i++)
00104 {
00105 floatPtr = floatArray[i];
00106 while (floatPtr != NULL)
00107 {
00108 floatPtr->neededFloat = FALSE;
00109 floatPtr = floatPtr->next;
00110 }
00111 }
00112
00113
00114
00115
00116
00117 integerArray = GetIntegerTable(theEnv);
00118
00119 for (i = 0; i < INTEGER_HASH_SIZE; i++)
00120 {
00121 integerPtr = integerArray[i];
00122 while (integerPtr != NULL)
00123 {
00124 integerPtr->neededInteger = FALSE;
00125 integerPtr = integerPtr->next;
00126 }
00127 }
00128
00129
00130
00131
00132
00133 bitMapArray = GetBitMapTable(theEnv);
00134
00135 for (i = 0; i < BITMAP_HASH_SIZE; i++)
00136 {
00137 bitMapPtr = bitMapArray[i];
00138 while (bitMapPtr != NULL)
00139 {
00140 bitMapPtr->neededBitMap = FALSE;
00141 bitMapPtr = bitMapPtr->next;
00142 }
00143 }
00144 }
00145
00146
00147
00148
00149
00150 globle void WriteNeededSymbols(
00151 void *theEnv,
00152 FILE *fp)
00153 {
00154 unsigned long i;
00155 size_t length;
00156 SYMBOL_HN **symbolArray;
00157 SYMBOL_HN *symbolPtr;
00158 unsigned long int numberOfUsedSymbols = 0;
00159 size_t size = 0;
00160
00161
00162
00163
00164
00165 symbolArray = GetSymbolTable(theEnv);
00166
00167
00168
00169
00170
00171 for (i = 0; i < SYMBOL_HASH_SIZE; i++)
00172 {
00173 for (symbolPtr = symbolArray[i];
00174 symbolPtr != NULL;
00175 symbolPtr = symbolPtr->next)
00176 {
00177 if (symbolPtr->neededSymbol)
00178 {
00179 numberOfUsedSymbols++;
00180 size += strlen(symbolPtr->contents) + 1;
00181 }
00182 }
00183 }
00184
00185
00186
00187
00188
00189 GenWrite((void *) &numberOfUsedSymbols,(unsigned long) sizeof(unsigned long int),fp);
00190 GenWrite((void *) &size,(unsigned long) sizeof(unsigned long int),fp);
00191
00192 for (i = 0; i < SYMBOL_HASH_SIZE; i++)
00193 {
00194 for (symbolPtr = symbolArray[i];
00195 symbolPtr != NULL;
00196 symbolPtr = symbolPtr->next)
00197 {
00198 if (symbolPtr->neededSymbol)
00199 {
00200 length = strlen(symbolPtr->contents) + 1;
00201 GenWrite((void *) symbolPtr->contents,(unsigned long) length,fp);
00202 }
00203 }
00204 }
00205 }
00206
00207
00208
00209
00210
00211 globle void WriteNeededFloats(
00212 void *theEnv,
00213 FILE *fp)
00214 {
00215 int i;
00216 FLOAT_HN **floatArray;
00217 FLOAT_HN *floatPtr;
00218 unsigned long int numberOfUsedFloats = 0;
00219
00220
00221
00222
00223
00224 floatArray = GetFloatTable(theEnv);
00225
00226
00227
00228
00229
00230 for (i = 0; i < FLOAT_HASH_SIZE; i++)
00231 {
00232 for (floatPtr = floatArray[i];
00233 floatPtr != NULL;
00234 floatPtr = floatPtr->next)
00235 { if (floatPtr->neededFloat) numberOfUsedFloats++; }
00236 }
00237
00238
00239
00240
00241
00242 GenWrite(&numberOfUsedFloats,(unsigned long) sizeof(unsigned long int),fp);
00243
00244 for (i = 0 ; i < FLOAT_HASH_SIZE; i++)
00245 {
00246 for (floatPtr = floatArray[i];
00247 floatPtr != NULL;
00248 floatPtr = floatPtr->next)
00249 {
00250 if (floatPtr->neededFloat)
00251 { GenWrite(&floatPtr->contents,
00252 (unsigned long) sizeof(floatPtr->contents),fp); }
00253 }
00254 }
00255 }
00256
00257
00258
00259
00260
00261 globle void WriteNeededIntegers(
00262 void *theEnv,
00263 FILE *fp)
00264 {
00265 int i;
00266 INTEGER_HN **integerArray;
00267 INTEGER_HN *integerPtr;
00268 unsigned long int numberOfUsedIntegers = 0;
00269
00270
00271
00272
00273
00274 integerArray = GetIntegerTable(theEnv);
00275
00276
00277
00278
00279
00280 for (i = 0 ; i < INTEGER_HASH_SIZE; i++)
00281 {
00282 for (integerPtr = integerArray[i];
00283 integerPtr != NULL;
00284 integerPtr = integerPtr->next)
00285 {
00286 if (integerPtr->neededInteger) numberOfUsedIntegers++;
00287 }
00288 }
00289
00290
00291
00292
00293
00294 GenWrite(&numberOfUsedIntegers,(unsigned long) sizeof(unsigned long int),fp);
00295
00296 for (i = 0 ; i < INTEGER_HASH_SIZE; i++)
00297 {
00298 for (integerPtr = integerArray[i];
00299 integerPtr != NULL;
00300 integerPtr = integerPtr->next)
00301 {
00302 if (integerPtr->neededInteger)
00303 {
00304 GenWrite(&integerPtr->contents,
00305 (unsigned long) sizeof(integerPtr->contents),fp);
00306 }
00307 }
00308 }
00309 }
00310
00311
00312
00313
00314
00315 static void WriteNeededBitMaps(
00316 void *theEnv,
00317 FILE *fp)
00318 {
00319 int i;
00320 BITMAP_HN **bitMapArray;
00321 BITMAP_HN *bitMapPtr;
00322 unsigned long int numberOfUsedBitMaps = 0, size = 0;
00323 char tempSize;
00324
00325
00326
00327
00328
00329 bitMapArray = GetBitMapTable(theEnv);
00330
00331
00332
00333
00334
00335 for (i = 0; i < BITMAP_HASH_SIZE; i++)
00336 {
00337 for (bitMapPtr = bitMapArray[i];
00338 bitMapPtr != NULL;
00339 bitMapPtr = bitMapPtr->next)
00340 {
00341 if (bitMapPtr->neededBitMap)
00342 {
00343 numberOfUsedBitMaps++;
00344 size += (unsigned long) (bitMapPtr->size + 1);
00345 }
00346 }
00347 }
00348
00349
00350
00351
00352
00353 GenWrite((void *) &numberOfUsedBitMaps,(unsigned long) sizeof(unsigned long int),fp);
00354 GenWrite((void *) &size,(unsigned long) sizeof(unsigned long int),fp);
00355
00356 for (i = 0; i < BITMAP_HASH_SIZE; i++)
00357 {
00358 for (bitMapPtr = bitMapArray[i];
00359 bitMapPtr != NULL;
00360 bitMapPtr = bitMapPtr->next)
00361 {
00362 if (bitMapPtr->neededBitMap)
00363 {
00364 tempSize = (char) bitMapPtr->size;
00365 GenWrite((void *) &tempSize,(unsigned long) sizeof(char),fp);
00366 GenWrite((void *) bitMapPtr->contents,(unsigned long) bitMapPtr->size,fp);
00367 }
00368 }
00369 }
00370 }
00371
00372 #endif
00373
00374
00375
00376
00377
00378
00379 globle void ReadNeededAtomicValues(
00380 void *theEnv)
00381 {
00382 ReadNeededSymbols(theEnv);
00383 ReadNeededFloats(theEnv);
00384 ReadNeededIntegers(theEnv);
00385 ReadNeededBitMaps(theEnv);
00386 }
00387
00388
00389
00390
00391
00392 globle void ReadNeededSymbols(
00393 void *theEnv)
00394 {
00395 char *symbolNames, *namePtr;
00396 unsigned long space;
00397 long i;
00398
00399
00400
00401
00402
00403
00404 GenReadBinary(theEnv,(void *) &SymbolData(theEnv)->NumberOfSymbols,(unsigned long) sizeof(long int));
00405 GenReadBinary(theEnv,&space,(unsigned long) sizeof(unsigned long int));
00406 if (SymbolData(theEnv)->NumberOfSymbols == 0)
00407 {
00408 SymbolData(theEnv)->SymbolArray = NULL;
00409 return;
00410 }
00411
00412
00413
00414
00415
00416 symbolNames = (char *) gm3(theEnv,(long) space);
00417 GenReadBinary(theEnv,(void *) symbolNames,space);
00418
00419
00420
00421
00422
00423 SymbolData(theEnv)->SymbolArray = (SYMBOL_HN **)
00424 gm3(theEnv,(long) sizeof(SYMBOL_HN *) * SymbolData(theEnv)->NumberOfSymbols);
00425 namePtr = symbolNames;
00426 for (i = 0; i < SymbolData(theEnv)->NumberOfSymbols; i++)
00427 {
00428 SymbolData(theEnv)->SymbolArray[i] = (SYMBOL_HN *) EnvAddSymbol(theEnv,namePtr);
00429 namePtr += strlen(namePtr) + 1;
00430 }
00431
00432
00433
00434
00435
00436 rm3(theEnv,(void *) symbolNames,(long) space);
00437 }
00438
00439
00440
00441
00442
00443 globle void ReadNeededFloats(
00444 void *theEnv)
00445 {
00446 double *floatValues;
00447 long i;
00448
00449
00450
00451
00452
00453 GenReadBinary(theEnv,&SymbolData(theEnv)->NumberOfFloats,(unsigned long) sizeof(long int));
00454 if (SymbolData(theEnv)->NumberOfFloats == 0)
00455 {
00456 SymbolData(theEnv)->FloatArray = NULL;
00457 return;
00458 }
00459
00460
00461
00462
00463
00464 floatValues = (double *) gm3(theEnv,(long) sizeof(double) * SymbolData(theEnv)->NumberOfFloats);
00465 GenReadBinary(theEnv,(void *) floatValues,(unsigned long) (sizeof(double) * SymbolData(theEnv)->NumberOfFloats));
00466
00467
00468
00469
00470
00471 SymbolData(theEnv)->FloatArray = (FLOAT_HN **)
00472 gm3(theEnv,(long) sizeof(FLOAT_HN *) * SymbolData(theEnv)->NumberOfFloats);
00473 for (i = 0; i < SymbolData(theEnv)->NumberOfFloats; i++)
00474 { SymbolData(theEnv)->FloatArray[i] = (FLOAT_HN *) EnvAddDouble(theEnv,floatValues[i]); }
00475
00476
00477
00478
00479
00480 rm3(theEnv,(void *) floatValues,(long) (sizeof(double) * SymbolData(theEnv)->NumberOfFloats));
00481 }
00482
00483
00484
00485
00486
00487 globle void ReadNeededIntegers(
00488 void *theEnv)
00489 {
00490 long long *integerValues;
00491 long i;
00492
00493
00494
00495
00496
00497 GenReadBinary(theEnv,&SymbolData(theEnv)->NumberOfIntegers,(unsigned long) sizeof(unsigned long int));
00498 if (SymbolData(theEnv)->NumberOfIntegers == 0)
00499 {
00500 SymbolData(theEnv)->IntegerArray = NULL;
00501 return;
00502 }
00503
00504
00505
00506
00507
00508 integerValues = (long long *) gm3(theEnv,(long) (sizeof(long long) * SymbolData(theEnv)->NumberOfIntegers));
00509 GenReadBinary(theEnv,(void *) integerValues,(unsigned long) (sizeof(long long) * SymbolData(theEnv)->NumberOfIntegers));
00510
00511
00512
00513
00514
00515 SymbolData(theEnv)->IntegerArray = (INTEGER_HN **)
00516 gm3(theEnv,(long) (sizeof(INTEGER_HN *) * SymbolData(theEnv)->NumberOfIntegers));
00517 for (i = 0; i < SymbolData(theEnv)->NumberOfIntegers; i++)
00518 { SymbolData(theEnv)->IntegerArray[i] = (INTEGER_HN *) EnvAddLong(theEnv,integerValues[i]); }
00519
00520
00521
00522
00523
00524 rm3(theEnv,(void *) integerValues,(long) (sizeof(long long) * SymbolData(theEnv)->NumberOfIntegers));
00525 }
00526
00527
00528
00529
00530
00531 static void ReadNeededBitMaps(
00532 void *theEnv)
00533 {
00534 char *bitMapStorage, *bitMapPtr;
00535 unsigned long space;
00536 long i;
00537
00538
00539
00540
00541
00542
00543 GenReadBinary(theEnv,(void *) &SymbolData(theEnv)->NumberOfBitMaps,(unsigned long) sizeof(long int));
00544 GenReadBinary(theEnv,&space,(unsigned long) sizeof(unsigned long int));
00545 if (SymbolData(theEnv)->NumberOfBitMaps == 0)
00546 {
00547 SymbolData(theEnv)->BitMapArray = NULL;
00548 return;
00549 }
00550
00551
00552
00553
00554
00555 bitMapStorage = (char *) gm3(theEnv,(long) space);
00556 GenReadBinary(theEnv,(void *) bitMapStorage,space);
00557
00558
00559
00560
00561
00562 SymbolData(theEnv)->BitMapArray = (BITMAP_HN **)
00563 gm3(theEnv,(long) sizeof(BITMAP_HN *) * SymbolData(theEnv)->NumberOfBitMaps);
00564 bitMapPtr = bitMapStorage;
00565 for (i = 0; i < SymbolData(theEnv)->NumberOfBitMaps; i++)
00566 {
00567 SymbolData(theEnv)->BitMapArray[i] = (BITMAP_HN *) EnvAddBitMap(theEnv,bitMapPtr+1,*bitMapPtr);
00568 bitMapPtr += *bitMapPtr + 1;
00569 }
00570
00571
00572
00573
00574
00575 rm3(theEnv,(void *) bitMapStorage,(long) space);
00576 }
00577
00578
00579
00580
00581
00582
00583 globle void FreeAtomicValueStorage(
00584 void *theEnv)
00585 {
00586 if (SymbolData(theEnv)->SymbolArray != NULL)
00587 rm3(theEnv,(void *) SymbolData(theEnv)->SymbolArray,(long) sizeof(SYMBOL_HN *) * SymbolData(theEnv)->NumberOfSymbols);
00588 if (SymbolData(theEnv)->FloatArray != NULL)
00589 rm3(theEnv,(void *) SymbolData(theEnv)->FloatArray,(long) sizeof(FLOAT_HN *) * SymbolData(theEnv)->NumberOfFloats);
00590 if (SymbolData(theEnv)->IntegerArray != NULL)
00591 rm3(theEnv,(void *) SymbolData(theEnv)->IntegerArray,(long) sizeof(INTEGER_HN *) * SymbolData(theEnv)->NumberOfIntegers);
00592 if (SymbolData(theEnv)->BitMapArray != NULL)
00593 rm3(theEnv,(void *) SymbolData(theEnv)->BitMapArray,(long) sizeof(BITMAP_HN *) * SymbolData(theEnv)->NumberOfBitMaps);
00594
00595 SymbolData(theEnv)->SymbolArray = NULL;
00596 SymbolData(theEnv)->FloatArray = NULL;
00597 SymbolData(theEnv)->IntegerArray = NULL;
00598 SymbolData(theEnv)->BitMapArray = NULL;
00599 SymbolData(theEnv)->NumberOfSymbols = 0;
00600 SymbolData(theEnv)->NumberOfFloats = 0;
00601 SymbolData(theEnv)->NumberOfIntegers = 0;
00602 SymbolData(theEnv)->NumberOfBitMaps = 0;
00603 }
00604
00605 #endif