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 #include "setup.h"
00027
00028 #if DEFINSTANCES_CONSTRUCT && (BLOAD || BLOAD_ONLY || BLOAD_AND_BSAVE)
00029
00030 #include "bload.h"
00031 #include "bsave.h"
00032 #include "envrnmnt.h"
00033 #include "memalloc.h"
00034 #include "cstrcbin.h"
00035 #include "defins.h"
00036 #include "modulbin.h"
00037
00038 #define _DFINSBIN_SOURCE_
00039 #include "dfinsbin.h"
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052 typedef struct bsaveDefinstancesModule
00053 {
00054 struct bsaveDefmoduleItemHeader header;
00055 } BSAVE_DEFINSTANCES_MODULE;
00056
00057 typedef struct bsaveDefinstances
00058 {
00059 struct bsaveConstructHeader header;
00060 long mkinstance;
00061 } BSAVE_DEFINSTANCES;
00062
00063
00064
00065
00066
00067
00068
00069 #if BLOAD_AND_BSAVE
00070 static void BsaveDefinstancesFind(void *);
00071 static void MarkDefinstancesItems(void *,struct constructHeader *,void *);
00072 static void BsaveDefinstancesExpressions(void *,FILE *);
00073 static void BsaveDefinstancesExpression(void *,struct constructHeader *,void *);
00074 static void BsaveStorageDefinstances(void *,FILE *);
00075 static void BsaveDefinstancesDriver(void *,FILE *);
00076 static void BsaveDefinstances(void *,struct constructHeader *,void *);
00077 #endif
00078
00079 static void BloadStorageDefinstances(void *);
00080 static void BloadDefinstances(void *);
00081 static void UpdateDefinstancesModule(void *,void *,long);
00082 static void UpdateDefinstances(void *,void *,long);
00083 static void ClearDefinstancesBload(void *);
00084 static void DeallocateDefinstancesBinaryData(void *);
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101 globle void SetupDefinstancesBload(
00102 void *theEnv)
00103 {
00104 AllocateEnvironmentData(theEnv,DFINSBIN_DATA,sizeof(struct definstancesBinaryData),DeallocateDefinstancesBinaryData);
00105 #if BLOAD_AND_BSAVE
00106 AddBinaryItem(theEnv,"definstances",0,BsaveDefinstancesFind,BsaveDefinstancesExpressions,
00107 BsaveStorageDefinstances,BsaveDefinstancesDriver,
00108 BloadStorageDefinstances,BloadDefinstances,
00109 ClearDefinstancesBload);
00110 #else
00111 AddBinaryItem(theEnv,"definstances",0,NULL,NULL,NULL,NULL,
00112 BloadStorageDefinstances,BloadDefinstances,
00113 ClearDefinstancesBload);
00114 #endif
00115 }
00116
00117
00118
00119
00120
00121 static void DeallocateDefinstancesBinaryData(
00122 void *theEnv)
00123 {
00124 size_t space;
00125
00126 #if (BLOAD || BLOAD_ONLY || BLOAD_AND_BSAVE) && (! RUN_TIME)
00127 space = DefinstancesBinaryData(theEnv)->DefinstancesCount * sizeof(struct definstances);
00128 if (space != 0) genfree(theEnv,(void *) DefinstancesBinaryData(theEnv)->DefinstancesArray,space);
00129
00130 space = DefinstancesBinaryData(theEnv)->ModuleCount * sizeof(struct definstancesModule);
00131 if (space != 0) genfree(theEnv,(void *) DefinstancesBinaryData(theEnv)->ModuleArray,space);
00132 #endif
00133 }
00134
00135
00136
00137
00138
00139
00140
00141
00142
00143
00144 globle void *BloadDefinstancesModuleRef(
00145 void *theEnv,
00146 int theIndex)
00147 {
00148 return ((void *) &DefinstancesBinaryData(theEnv)->ModuleArray[theIndex]);
00149 }
00150
00151
00152
00153
00154
00155
00156
00157 #if BLOAD_AND_BSAVE
00158
00159
00160
00161
00162
00163
00164
00165
00166
00167
00168
00169
00170
00171
00172
00173
00174 static void BsaveDefinstancesFind(
00175 void *theEnv)
00176 {
00177 SaveBloadCount(theEnv,DefinstancesBinaryData(theEnv)->ModuleCount);
00178 SaveBloadCount(theEnv,DefinstancesBinaryData(theEnv)->DefinstancesCount);
00179 DefinstancesBinaryData(theEnv)->DefinstancesCount = 0L;
00180
00181 DefinstancesBinaryData(theEnv)->ModuleCount =
00182 DoForAllConstructs(theEnv,MarkDefinstancesItems,DefinstancesData(theEnv)->DefinstancesModuleIndex,
00183 FALSE,NULL);
00184 }
00185
00186
00187
00188
00189
00190
00191
00192
00193
00194
00195
00196
00197 #if WIN_BTC
00198 #pragma argsused
00199 #endif
00200 static void MarkDefinstancesItems(
00201 void *theEnv,
00202 struct constructHeader *theDefinstances,
00203 void *userBuffer)
00204 {
00205 #if MAC_MCW || WIN_MCW || MAC_XCD
00206 #pragma unused(userBuffer)
00207 #endif
00208
00209 MarkConstructHeaderNeededItems(theDefinstances,DefinstancesBinaryData(theEnv)->DefinstancesCount++);
00210 ExpressionData(theEnv)->ExpressionCount += ExpressionSize(((DEFINSTANCES *) theDefinstances)->mkinstance);
00211 MarkNeededItems(theEnv,((DEFINSTANCES *) theDefinstances)->mkinstance);
00212 }
00213
00214
00215
00216
00217
00218
00219
00220
00221
00222
00223 static void BsaveDefinstancesExpressions(
00224 void *theEnv,
00225 FILE *fp)
00226 {
00227 DoForAllConstructs(theEnv,BsaveDefinstancesExpression,DefinstancesData(theEnv)->DefinstancesModuleIndex,
00228 FALSE,(void *) fp);
00229 }
00230
00231
00232
00233
00234
00235
00236
00237
00238
00239
00240
00241 static void BsaveDefinstancesExpression(
00242 void *theEnv,
00243 struct constructHeader *theDefinstances,
00244 void *userBuffer)
00245 {
00246 BsaveExpression(theEnv,((DEFINSTANCES *) theDefinstances)->mkinstance,(FILE *) userBuffer);
00247 }
00248
00249
00250
00251
00252
00253
00254
00255
00256
00257
00258
00259 static void BsaveStorageDefinstances(
00260 void *theEnv,
00261 FILE *fp)
00262 {
00263 size_t space;
00264
00265 space = sizeof(unsigned long) * 2;
00266 GenWrite((void *) &space,sizeof(size_t),fp);
00267 GenWrite((void *) &DefinstancesBinaryData(theEnv)->ModuleCount,sizeof(unsigned long),fp);
00268 GenWrite((void *) &DefinstancesBinaryData(theEnv)->DefinstancesCount,sizeof(unsigned long),fp);
00269 }
00270
00271
00272
00273
00274
00275
00276
00277
00278
00279
00280
00281 static void BsaveDefinstancesDriver(
00282 void *theEnv,
00283 FILE *fp)
00284 {
00285 size_t space;
00286 struct defmodule *theModule;
00287 DEFINSTANCES_MODULE *theModuleItem;
00288 BSAVE_DEFINSTANCES_MODULE dummy_mitem;
00289
00290 space = ((sizeof(BSAVE_DEFINSTANCES_MODULE) * DefinstancesBinaryData(theEnv)->ModuleCount) +
00291 (sizeof(BSAVE_DEFINSTANCES) * DefinstancesBinaryData(theEnv)->DefinstancesCount));
00292 GenWrite((void *) &space,sizeof(size_t),fp);
00293
00294
00295
00296
00297 DefinstancesBinaryData(theEnv)->DefinstancesCount = 0L;
00298 theModule = (struct defmodule *) EnvGetNextDefmodule(theEnv,NULL);
00299 while (theModule != NULL)
00300 {
00301 theModuleItem = (DEFINSTANCES_MODULE *)
00302 GetModuleItem(theEnv,theModule,FindModuleItem(theEnv,"definstances")->moduleIndex);
00303 AssignBsaveDefmdlItemHdrVals(&dummy_mitem.header,&theModuleItem->header);
00304 GenWrite((void *) &dummy_mitem,sizeof(BSAVE_DEFINSTANCES_MODULE),fp);
00305 theModule = (struct defmodule *) EnvGetNextDefmodule(theEnv,(void *) theModule);
00306 }
00307
00308
00309
00310
00311 DoForAllConstructs(theEnv,BsaveDefinstances,DefinstancesData(theEnv)->DefinstancesModuleIndex,
00312 FALSE,(void *) fp);
00313
00314 RestoreBloadCount(theEnv,&DefinstancesBinaryData(theEnv)->ModuleCount);
00315 RestoreBloadCount(theEnv,&DefinstancesBinaryData(theEnv)->DefinstancesCount);
00316 }
00317
00318
00319
00320
00321
00322
00323
00324
00325
00326
00327 static void BsaveDefinstances(
00328 void *theEnv,
00329 struct constructHeader *theDefinstances,
00330 void *userBuffer)
00331 {
00332 DEFINSTANCES *dptr = (DEFINSTANCES *) theDefinstances;
00333 BSAVE_DEFINSTANCES dummy_df;
00334
00335 AssignBsaveConstructHeaderVals(&dummy_df.header,&dptr->header);
00336 if (dptr->mkinstance != NULL)
00337 {
00338 dummy_df.mkinstance = ExpressionData(theEnv)->ExpressionCount;
00339 ExpressionData(theEnv)->ExpressionCount += ExpressionSize(dptr->mkinstance);
00340 }
00341 else
00342 dummy_df.mkinstance = -1L;
00343 GenWrite((void *) &dummy_df,(unsigned long) sizeof(BSAVE_DEFINSTANCES),(FILE *) userBuffer);
00344 }
00345
00346 #endif
00347
00348
00349
00350
00351
00352
00353
00354
00355
00356
00357
00358 static void BloadStorageDefinstances(
00359 void *theEnv)
00360 {
00361 size_t space;
00362
00363 GenReadBinary(theEnv,(void *) &space,sizeof(size_t));
00364 if (space == 0L)
00365 return;
00366 GenReadBinary(theEnv,(void *) &DefinstancesBinaryData(theEnv)->ModuleCount,sizeof(unsigned long));
00367 GenReadBinary(theEnv,(void *) &DefinstancesBinaryData(theEnv)->DefinstancesCount,sizeof(unsigned long));
00368 if (DefinstancesBinaryData(theEnv)->ModuleCount == 0L)
00369 {
00370 DefinstancesBinaryData(theEnv)->ModuleArray = NULL;
00371 DefinstancesBinaryData(theEnv)->DefinstancesArray = NULL;
00372 return;
00373 }
00374
00375 space = (DefinstancesBinaryData(theEnv)->ModuleCount * sizeof(DEFINSTANCES_MODULE));
00376 DefinstancesBinaryData(theEnv)->ModuleArray = (DEFINSTANCES_MODULE *) genalloc(theEnv,space);
00377
00378 if (DefinstancesBinaryData(theEnv)->DefinstancesCount == 0L)
00379 {
00380 DefinstancesBinaryData(theEnv)->DefinstancesArray = NULL;
00381 return;
00382 }
00383
00384 space = (DefinstancesBinaryData(theEnv)->DefinstancesCount * sizeof(DEFINSTANCES));
00385 DefinstancesBinaryData(theEnv)->DefinstancesArray = (DEFINSTANCES *) genalloc(theEnv,space);
00386 }
00387
00388
00389
00390
00391
00392
00393
00394
00395
00396
00397
00398
00399 static void BloadDefinstances(
00400 void *theEnv)
00401 {
00402 size_t space;
00403
00404 GenReadBinary(theEnv,(void *) &space,sizeof(size_t));
00405 BloadandRefresh(theEnv,DefinstancesBinaryData(theEnv)->ModuleCount,sizeof(BSAVE_DEFINSTANCES_MODULE),UpdateDefinstancesModule);
00406 BloadandRefresh(theEnv,DefinstancesBinaryData(theEnv)->DefinstancesCount,sizeof(BSAVE_DEFINSTANCES),UpdateDefinstances);
00407 }
00408
00409
00410
00411
00412
00413
00414
00415
00416
00417
00418
00419
00420
00421 static void UpdateDefinstancesModule(
00422 void *theEnv,
00423 void *buf,
00424 long obji)
00425 {
00426 BSAVE_DEFINSTANCES_MODULE *bdptr;
00427
00428 bdptr = (BSAVE_DEFINSTANCES_MODULE *) buf;
00429 UpdateDefmoduleItemHeader(theEnv,&bdptr->header,&DefinstancesBinaryData(theEnv)->ModuleArray[obji].header,
00430 (int) sizeof(DEFINSTANCES),(void *) DefinstancesBinaryData(theEnv)->DefinstancesArray);
00431 }
00432
00433
00434
00435
00436
00437
00438
00439
00440
00441
00442
00443
00444
00445 static void UpdateDefinstances(
00446 void *theEnv,
00447 void *buf,
00448 long obji)
00449 {
00450 BSAVE_DEFINSTANCES *bdptr;
00451 DEFINSTANCES *dfiptr;
00452
00453 bdptr = (BSAVE_DEFINSTANCES *) buf;
00454 dfiptr = (DEFINSTANCES *) &DefinstancesBinaryData(theEnv)->DefinstancesArray[obji];
00455
00456 UpdateConstructHeader(theEnv,&bdptr->header,&dfiptr->header,
00457 (int) sizeof(DEFINSTANCES_MODULE),(void *) DefinstancesBinaryData(theEnv)->ModuleArray,
00458 (int) sizeof(DEFINSTANCES),(void *) DefinstancesBinaryData(theEnv)->DefinstancesArray);
00459 dfiptr->mkinstance = ExpressionPointer(bdptr->mkinstance);
00460 dfiptr->busy = 0;
00461 }
00462
00463
00464
00465
00466
00467
00468
00469
00470
00471
00472
00473 static void ClearDefinstancesBload(
00474 void *theEnv)
00475 {
00476 register long i;
00477 size_t space;
00478
00479 space = (sizeof(DEFINSTANCES_MODULE) * DefinstancesBinaryData(theEnv)->ModuleCount);
00480 if (space == 0L)
00481 return;
00482 genfree(theEnv,(void *) DefinstancesBinaryData(theEnv)->ModuleArray,space);
00483 DefinstancesBinaryData(theEnv)->ModuleArray = NULL;
00484 DefinstancesBinaryData(theEnv)->ModuleCount = 0L;
00485
00486 for (i = 0L ; i < DefinstancesBinaryData(theEnv)->DefinstancesCount ; i++)
00487 UnmarkConstructHeader(theEnv,&DefinstancesBinaryData(theEnv)->DefinstancesArray[i].header);
00488 space = (sizeof(DEFINSTANCES) * DefinstancesBinaryData(theEnv)->DefinstancesCount);
00489 if (space == 0L)
00490 return;
00491 genfree(theEnv,(void *) DefinstancesBinaryData(theEnv)->DefinstancesArray,space);
00492 DefinstancesBinaryData(theEnv)->DefinstancesArray = NULL;
00493 DefinstancesBinaryData(theEnv)->DefinstancesCount = 0L;
00494 }
00495
00496 #endif
00497