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 #define _MODULDEF_SOURCE_
00031
00032 #include "setup.h"
00033
00034 #include <stdio.h>
00035 #include <string.h>
00036 #define _STDIO_INCLUDED_
00037
00038 #include "memalloc.h"
00039 #include "constant.h"
00040 #include "router.h"
00041 #include "extnfunc.h"
00042 #include "argacces.h"
00043 #include "constrct.h"
00044 #include "modulpsr.h"
00045 #include "modulcmp.h"
00046 #include "modulbsc.h"
00047 #include "utility.h"
00048 #include "envrnmnt.h"
00049
00050 #if BLOAD || BLOAD_ONLY || BLOAD_AND_BSAVE
00051 #include "bload.h"
00052 #include "modulbin.h"
00053 #endif
00054
00055 #include "moduldef.h"
00056
00057
00058
00059
00060
00061 #if (! RUN_TIME)
00062 static void ReturnDefmodule(void *,struct defmodule *,intBool);
00063 #endif
00064 static void DeallocateDefmoduleData(void *);
00065
00066
00067
00068
00069 globle void AllocateDefmoduleGlobals(
00070 void *theEnv)
00071 {
00072 AllocateEnvironmentData(theEnv,DEFMODULE_DATA,sizeof(struct defmoduleData),NULL);
00073 AddEnvironmentCleanupFunction(theEnv,"defmodules",DeallocateDefmoduleData,-1000);
00074 DefmoduleData(theEnv)->CallModuleChangeFunctions = TRUE;
00075 DefmoduleData(theEnv)->MainModuleRedefinable = TRUE;
00076 }
00077
00078
00079
00080
00081
00082 static void DeallocateDefmoduleData(
00083 void *theEnv)
00084 {
00085 struct moduleStackItem *tmpMSPtr, *nextMSPtr;
00086 struct moduleItem *tmpMIPtr, *nextMIPtr;
00087 #if (! RUN_TIME) && (! BLOAD_ONLY)
00088 struct defmodule *tmpDMPtr, *nextDMPtr;
00089 struct portConstructItem *tmpPCPtr, *nextPCPtr;
00090 #endif
00091 #if (BLOAD || BLOAD_ONLY || BLOAD_AND_BSAVE) && (! RUN_TIME)
00092 int i;
00093 size_t space;
00094 #endif
00095
00096 #if (BLOAD || BLOAD_ONLY || BLOAD_AND_BSAVE) && (! RUN_TIME)
00097 for (i = 0; i < DefmoduleData(theEnv)->BNumberOfDefmodules; i++)
00098 {
00099 if (DefmoduleData(theEnv)->DefmoduleArray[i].itemsArray != NULL)
00100 {
00101 rm(theEnv,DefmoduleData(theEnv)->DefmoduleArray[i].itemsArray,
00102 sizeof(void *) * GetNumberOfModuleItems(theEnv));
00103 }
00104 }
00105
00106 space = DefmoduleData(theEnv)->BNumberOfDefmodules * sizeof(struct defmodule);
00107 if (space != 0)
00108 {
00109 genfree(theEnv,(void *) DefmoduleData(theEnv)->DefmoduleArray,space);
00110 DefmoduleData(theEnv)->ListOfDefmodules = NULL;
00111 }
00112
00113 space = DefmoduleData(theEnv)->NumberOfPortItems * sizeof(struct portItem);
00114 if (space != 0) genfree(theEnv,(void *) DefmoduleData(theEnv)->PortItemArray,space);
00115 #endif
00116
00117 #if (! RUN_TIME) && (! BLOAD_ONLY)
00118 tmpDMPtr = DefmoduleData(theEnv)->ListOfDefmodules;
00119 while (tmpDMPtr != NULL)
00120 {
00121 nextDMPtr = tmpDMPtr->next;
00122 ReturnDefmodule(theEnv,tmpDMPtr,TRUE);
00123 tmpDMPtr = nextDMPtr;
00124 }
00125
00126 tmpPCPtr = DefmoduleData(theEnv)->ListOfPortConstructItems;
00127 while (tmpPCPtr != NULL)
00128 {
00129 nextPCPtr = tmpPCPtr->next;
00130 rtn_struct(theEnv,portConstructItem,tmpPCPtr);
00131 tmpPCPtr = nextPCPtr;
00132 }
00133 #endif
00134
00135 tmpMSPtr = DefmoduleData(theEnv)->ModuleStack;
00136 while (tmpMSPtr != NULL)
00137 {
00138 nextMSPtr = tmpMSPtr->next;
00139 rtn_struct(theEnv,moduleStackItem,tmpMSPtr);
00140 tmpMSPtr = nextMSPtr;
00141 }
00142
00143 tmpMIPtr = DefmoduleData(theEnv)->ListOfModuleItems;
00144 while (tmpMIPtr != NULL)
00145 {
00146 nextMIPtr = tmpMIPtr->next;
00147 rtn_struct(theEnv,moduleItem,tmpMIPtr);
00148 tmpMIPtr = nextMIPtr;
00149 }
00150
00151 #if (! RUN_TIME) && (! BLOAD_ONLY)
00152 DeallocateCallList(theEnv,DefmoduleData(theEnv)->AfterModuleDefinedFunctions);
00153 #endif
00154 DeallocateCallList(theEnv,DefmoduleData(theEnv)->AfterModuleChangeFunctions);
00155 }
00156
00157
00158
00159
00160 globle void InitializeDefmodules(
00161 void *theEnv)
00162 {
00163 DefmoduleBasicCommands(theEnv);
00164
00165 #if (! RUN_TIME)
00166 CreateMainModule(theEnv);
00167 #endif
00168
00169 #if DEFMODULE_CONSTRUCT && (! RUN_TIME) && (! BLOAD_ONLY)
00170 AddConstruct(theEnv,"defmodule","defmodules",ParseDefmodule,NULL,NULL,NULL,NULL,
00171 NULL,NULL,NULL,NULL,NULL);
00172 #endif
00173
00174 #if (! RUN_TIME) && DEFMODULE_CONSTRUCT
00175 EnvDefineFunction2(theEnv,"get-current-module", 'w',
00176 PTIEF GetCurrentModuleCommand,
00177 "GetCurrentModuleCommand", "00");
00178
00179 EnvDefineFunction2(theEnv,"set-current-module", 'w',
00180 PTIEF SetCurrentModuleCommand,
00181 "SetCurrentModuleCommand", "11w");
00182 #endif
00183 }
00184
00185
00186
00187
00188
00189 globle int RegisterModuleItem(
00190 void *theEnv,
00191 char *theItem,
00192 void *(*allocateFunction)(void *),
00193 void (*freeFunction)(void *,void *),
00194 void *(*bloadModuleReference)(void *,int),
00195 void (*constructsToCModuleReference)(void *,FILE *,int,int,int),
00196 void *(*findFunction)(void *,char *))
00197 {
00198 struct moduleItem *newModuleItem;
00199
00200 newModuleItem = get_struct(theEnv,moduleItem);
00201 newModuleItem->name = theItem;
00202 newModuleItem->allocateFunction = allocateFunction;
00203 newModuleItem->freeFunction = freeFunction;
00204 newModuleItem->bloadModuleReference = bloadModuleReference;
00205 newModuleItem->constructsToCModuleReference = constructsToCModuleReference;
00206 newModuleItem->findFunction = findFunction;
00207 newModuleItem->moduleIndex = DefmoduleData(theEnv)->NumberOfModuleItems++;
00208 newModuleItem->next = NULL;
00209
00210 if (DefmoduleData(theEnv)->LastModuleItem == NULL)
00211 {
00212 DefmoduleData(theEnv)->ListOfModuleItems = newModuleItem;
00213 DefmoduleData(theEnv)->LastModuleItem = newModuleItem;
00214 }
00215 else
00216 {
00217 DefmoduleData(theEnv)->LastModuleItem->next = newModuleItem;
00218 DefmoduleData(theEnv)->LastModuleItem = newModuleItem;
00219 }
00220
00221 return(newModuleItem->moduleIndex);
00222 }
00223
00224
00225
00226
00227 globle struct moduleItem *GetListOfModuleItems(
00228 void *theEnv)
00229 {
00230 return (DefmoduleData(theEnv)->ListOfModuleItems);
00231 }
00232
00233
00234
00235
00236 globle int GetNumberOfModuleItems(
00237 void *theEnv)
00238 {
00239 return (DefmoduleData(theEnv)->NumberOfModuleItems);
00240 }
00241
00242
00243
00244
00245
00246 globle struct moduleItem *FindModuleItem(
00247 void *theEnv,
00248 char *theName)
00249 {
00250 struct moduleItem *theModuleItem;
00251
00252 for (theModuleItem = DefmoduleData(theEnv)->ListOfModuleItems;
00253 theModuleItem != NULL;
00254 theModuleItem = theModuleItem->next)
00255 { if (strcmp(theModuleItem->name,theName) == 0) return(theModuleItem); }
00256
00257 return(NULL);
00258 }
00259
00260
00261
00262
00263
00264 globle void *EnvGetCurrentModule(
00265 void *theEnv)
00266 {
00267 return ((void *) DefmoduleData(theEnv)->CurrentModule);
00268 }
00269
00270
00271
00272
00273 globle void *EnvSetCurrentModule(
00274 void *theEnv,
00275 void *xNewValue)
00276 {
00277 struct defmodule *newValue = (struct defmodule *) xNewValue;
00278 struct callFunctionItem *changeFunctions;
00279 void *rv;
00280
00281
00282
00283
00284
00285
00286
00287 rv = (void *) DefmoduleData(theEnv)->CurrentModule;
00288 DefmoduleData(theEnv)->CurrentModule = newValue;
00289
00290
00291
00292
00293
00294
00295
00296
00297
00298
00299 if (DefmoduleData(theEnv)->CallModuleChangeFunctions)
00300 {
00301 DefmoduleData(theEnv)->ModuleChangeIndex++;
00302 changeFunctions = DefmoduleData(theEnv)->AfterModuleChangeFunctions;
00303 while (changeFunctions != NULL)
00304 {
00305 (* (void (*)(void *)) changeFunctions->func)(theEnv);
00306 changeFunctions = changeFunctions->next;
00307 }
00308 }
00309
00310
00311
00312
00313
00314 return(rv);
00315 }
00316
00317
00318
00319
00320
00321
00322 globle void SaveCurrentModule(
00323 void *theEnv)
00324 {
00325 MODULE_STACK_ITEM *tmp;
00326
00327 tmp = get_struct(theEnv,moduleStackItem);
00328 tmp->changeFlag = DefmoduleData(theEnv)->CallModuleChangeFunctions;
00329 DefmoduleData(theEnv)->CallModuleChangeFunctions = FALSE;
00330 tmp->theModule = DefmoduleData(theEnv)->CurrentModule;
00331 tmp->next = DefmoduleData(theEnv)->ModuleStack;
00332 DefmoduleData(theEnv)->ModuleStack = tmp;
00333 }
00334
00335
00336
00337
00338
00339
00340 globle void RestoreCurrentModule(
00341 void *theEnv)
00342 {
00343 MODULE_STACK_ITEM *tmp;
00344
00345 tmp = DefmoduleData(theEnv)->ModuleStack;
00346 DefmoduleData(theEnv)->ModuleStack = tmp->next;
00347 DefmoduleData(theEnv)->CallModuleChangeFunctions = tmp->changeFlag;
00348 DefmoduleData(theEnv)->CurrentModule = tmp->theModule;
00349 rtn_struct(theEnv,moduleStackItem,tmp);
00350 }
00351
00352
00353
00354
00355
00356
00357
00358 globle void *GetModuleItem(
00359 void *theEnv,
00360 struct defmodule *theModule,
00361 int moduleItemIndex)
00362 {
00363 if (theModule == NULL)
00364 {
00365 if (DefmoduleData(theEnv)->CurrentModule == NULL) return(NULL);
00366 theModule = DefmoduleData(theEnv)->CurrentModule;
00367 }
00368
00369 if (theModule->itemsArray == NULL) return (NULL);
00370 return ((void *) theModule->itemsArray[moduleItemIndex]);
00371 }
00372
00373
00374
00375
00376
00377
00378
00379 globle void SetModuleItem(
00380 void *theEnv,
00381 struct defmodule *theModule,
00382 int moduleItemIndex,
00383 void *newValue)
00384 {
00385 if (theModule == NULL)
00386 {
00387 if (DefmoduleData(theEnv)->CurrentModule == NULL) return;
00388 theModule = DefmoduleData(theEnv)->CurrentModule;
00389 }
00390
00391 if (theModule->itemsArray == NULL) return;
00392 theModule->itemsArray[moduleItemIndex] = (struct defmoduleItemHeader *) newValue;
00393 }
00394
00395
00396
00397
00398 globle void CreateMainModule(
00399 void *theEnv)
00400 {
00401 struct defmodule *newDefmodule;
00402 struct moduleItem *theItem;
00403 int i;
00404 struct defmoduleItemHeader *theHeader;
00405
00406
00407
00408
00409
00410
00411 newDefmodule = get_struct(theEnv,defmodule);
00412 newDefmodule->name = (SYMBOL_HN *) EnvAddSymbol(theEnv,"MAIN");
00413 IncrementSymbolCount(newDefmodule->name);
00414 newDefmodule->next = NULL;
00415 newDefmodule->ppForm = NULL;
00416 newDefmodule->importList = NULL;
00417 newDefmodule->exportList = NULL;
00418 newDefmodule->bsaveID = 0L;
00419 newDefmodule->usrData = NULL;
00420
00421
00422
00423
00424
00425
00426 if (DefmoduleData(theEnv)->NumberOfModuleItems == 0) newDefmodule->itemsArray = NULL;
00427 else
00428 {
00429 newDefmodule->itemsArray = (struct defmoduleItemHeader **)
00430 gm2(theEnv,sizeof(void *) * DefmoduleData(theEnv)->NumberOfModuleItems);
00431 for (i = 0, theItem = DefmoduleData(theEnv)->ListOfModuleItems;
00432 (i < DefmoduleData(theEnv)->NumberOfModuleItems) && (theItem != NULL);
00433 i++, theItem = theItem->next)
00434 {
00435 if (theItem->allocateFunction == NULL)
00436 { newDefmodule->itemsArray[i] = NULL; }
00437 else
00438 {
00439 newDefmodule->itemsArray[i] = (struct defmoduleItemHeader *)
00440 (*theItem->allocateFunction)(theEnv);
00441 theHeader = (struct defmoduleItemHeader *) newDefmodule->itemsArray[i];
00442 theHeader->theModule = newDefmodule;
00443 theHeader->firstItem = NULL;
00444 theHeader->lastItem = NULL;
00445 }
00446 }
00447 }
00448
00449
00450
00451
00452
00453
00454 #if (! BLOAD_ONLY) && (! RUN_TIME) && DEFMODULE_CONSTRUCT
00455 SetNumberOfDefmodules(theEnv,1L);
00456 #endif
00457
00458 DefmoduleData(theEnv)->LastDefmodule = newDefmodule;
00459 DefmoduleData(theEnv)->ListOfDefmodules = newDefmodule;
00460 EnvSetCurrentModule(theEnv,(void *) newDefmodule);
00461 }
00462
00463
00464
00465
00466
00467
00468 globle void SetListOfDefmodules(
00469 void *theEnv,
00470 void *defmodulePtr)
00471 {
00472 DefmoduleData(theEnv)->ListOfDefmodules = (struct defmodule *) defmodulePtr;
00473
00474 DefmoduleData(theEnv)->LastDefmodule = DefmoduleData(theEnv)->ListOfDefmodules;
00475 if (DefmoduleData(theEnv)->LastDefmodule == NULL) return;
00476 while (DefmoduleData(theEnv)->LastDefmodule->next != NULL) DefmoduleData(theEnv)->LastDefmodule = DefmoduleData(theEnv)->LastDefmodule->next;
00477 }
00478
00479
00480
00481
00482
00483
00484 globle void *EnvGetNextDefmodule(
00485 void *theEnv,
00486 void *defmodulePtr)
00487 {
00488 if (defmodulePtr == NULL)
00489 { return((void *) DefmoduleData(theEnv)->ListOfDefmodules); }
00490 else
00491 { return((void *) (((struct defmodule *) defmodulePtr)->next)); }
00492 }
00493
00494
00495
00496
00497
00498 #if WIN_BTC
00499 #pragma argsused
00500 #endif
00501 globle char *EnvGetDefmoduleName(
00502 void *theEnv,
00503 void *defmodulePtr)
00504 {
00505 #if MAC_MCW || WIN_MCW || MAC_XCD
00506 #pragma unused(theEnv)
00507 #endif
00508
00509 return(ValueToString(((struct defmodule *) defmodulePtr)->name));
00510 }
00511
00512
00513
00514
00515
00516 #if WIN_BTC
00517 #pragma argsused
00518 #endif
00519 globle char *EnvGetDefmodulePPForm(
00520 void *theEnv,
00521 void *defmodulePtr)
00522 {
00523 #if MAC_MCW || WIN_MCW || MAC_XCD
00524 #pragma unused(theEnv)
00525 #endif
00526
00527 return(((struct defmodule *) defmodulePtr)->ppForm);
00528 }
00529
00530 #if (! RUN_TIME)
00531
00532
00533
00534
00535
00536 globle void RemoveAllDefmodules(
00537 void *theEnv)
00538 {
00539 struct defmodule *nextDefmodule;
00540
00541 while (DefmoduleData(theEnv)->ListOfDefmodules != NULL)
00542 {
00543 nextDefmodule = DefmoduleData(theEnv)->ListOfDefmodules->next;
00544 ReturnDefmodule(theEnv,DefmoduleData(theEnv)->ListOfDefmodules,FALSE);
00545 DefmoduleData(theEnv)->ListOfDefmodules = nextDefmodule;
00546 }
00547
00548 DefmoduleData(theEnv)->CurrentModule = NULL;
00549 DefmoduleData(theEnv)->LastDefmodule = NULL;
00550 }
00551
00552
00553
00554
00555
00556 static void ReturnDefmodule(
00557 void *theEnv,
00558 struct defmodule *theDefmodule,
00559 intBool environmentClear)
00560 {
00561 int i;
00562 struct moduleItem *theItem;
00563 struct portItem *theSpec, *nextSpec;
00564
00565
00566
00567
00568
00569 if (theDefmodule == NULL) return;
00570
00571 if (! environmentClear)
00572 { EnvSetCurrentModule(theEnv,(void *) theDefmodule); }
00573
00574
00575
00576
00577
00578
00579 if (theDefmodule->itemsArray != NULL)
00580 {
00581 if (! environmentClear)
00582 {
00583 for (i = 0, theItem = DefmoduleData(theEnv)->ListOfModuleItems;
00584 (i < DefmoduleData(theEnv)->NumberOfModuleItems) && (theItem != NULL);
00585 i++, theItem = theItem->next)
00586 {
00587 if (theItem->freeFunction != NULL)
00588 { (*theItem->freeFunction)(theEnv,theDefmodule->itemsArray[i]); }
00589 }
00590 }
00591
00592 rm(theEnv,theDefmodule->itemsArray,sizeof(void *) * DefmoduleData(theEnv)->NumberOfModuleItems);
00593 }
00594
00595
00596
00597
00598
00599 if (! environmentClear)
00600 { DecrementSymbolCount(theEnv,theDefmodule->name); }
00601
00602
00603
00604
00605
00606 theSpec = theDefmodule->importList;
00607 while (theSpec != NULL)
00608 {
00609 nextSpec = theSpec->next;
00610 if (! environmentClear)
00611 {
00612 if (theSpec->moduleName != NULL) DecrementSymbolCount(theEnv,theSpec->moduleName);
00613 if (theSpec->constructType != NULL) DecrementSymbolCount(theEnv,theSpec->constructType);
00614 if (theSpec->constructName != NULL) DecrementSymbolCount(theEnv,theSpec->constructName);
00615 }
00616 rtn_struct(theEnv,portItem,theSpec);
00617 theSpec = nextSpec;
00618 }
00619
00620
00621
00622
00623
00624 theSpec = theDefmodule->exportList;
00625 while (theSpec != NULL)
00626 {
00627 nextSpec = theSpec->next;
00628 if (! environmentClear)
00629 {
00630 if (theSpec->moduleName != NULL) DecrementSymbolCount(theEnv,theSpec->moduleName);
00631 if (theSpec->constructType != NULL) DecrementSymbolCount(theEnv,theSpec->constructType);
00632 if (theSpec->constructName != NULL) DecrementSymbolCount(theEnv,theSpec->constructName);
00633 }
00634 rtn_struct(theEnv,portItem,theSpec);
00635 theSpec = nextSpec;
00636 }
00637
00638
00639
00640
00641
00642 if (theDefmodule->ppForm != NULL)
00643 {
00644 rm(theEnv,theDefmodule->ppForm,
00645 (int) sizeof(char) * (strlen(theDefmodule->ppForm) + 1));
00646 }
00647
00648
00649
00650
00651
00652 ClearUserDataList(theEnv,theDefmodule->usrData);
00653
00654
00655
00656
00657
00658 rtn_struct(theEnv,defmodule,theDefmodule);
00659 }
00660
00661 #endif
00662
00663
00664
00665
00666
00667 globle void *EnvFindDefmodule(
00668 void *theEnv,
00669 char *defmoduleName)
00670 {
00671 struct defmodule *defmodulePtr;
00672 SYMBOL_HN *findValue;
00673
00674 if ((findValue = (SYMBOL_HN *) FindSymbolHN(theEnv,defmoduleName)) == NULL) return(NULL);
00675
00676 defmodulePtr = DefmoduleData(theEnv)->ListOfDefmodules;
00677 while (defmodulePtr != NULL)
00678 {
00679 if (defmodulePtr->name == findValue)
00680 { return((void *) defmodulePtr); }
00681
00682 defmodulePtr = defmodulePtr->next;
00683 }
00684
00685 return(NULL);
00686 }
00687
00688
00689
00690
00691
00692 globle void *GetCurrentModuleCommand(
00693 void *theEnv)
00694 {
00695 struct defmodule *theModule;
00696
00697 EnvArgCountCheck(theEnv,"get-current-module",EXACTLY,0);
00698
00699 theModule = (struct defmodule *) EnvGetCurrentModule(theEnv);
00700
00701 if (theModule == NULL) return((SYMBOL_HN *) EnvFalseSymbol(theEnv));
00702
00703 return((SYMBOL_HN *) EnvAddSymbol(theEnv,ValueToString(theModule->name)));
00704 }
00705
00706
00707
00708
00709
00710 globle void *SetCurrentModuleCommand(
00711 void *theEnv)
00712 {
00713 DATA_OBJECT argPtr;
00714 char *argument;
00715 struct defmodule *theModule;
00716 SYMBOL_HN *defaultReturn;
00717
00718
00719
00720
00721
00722 theModule = ((struct defmodule *) EnvGetCurrentModule(theEnv));
00723 if (theModule == NULL) return((SYMBOL_HN *) EnvFalseSymbol(theEnv));
00724
00725 defaultReturn = (SYMBOL_HN *) EnvAddSymbol(theEnv,ValueToString(((struct defmodule *) EnvGetCurrentModule(theEnv))->name));
00726
00727 if (EnvArgCountCheck(theEnv,"set-current-module",EXACTLY,1) == -1)
00728 { return(defaultReturn); }
00729
00730 if (EnvArgTypeCheck(theEnv,"set-current-module",1,SYMBOL,&argPtr) == FALSE)
00731 { return(defaultReturn); }
00732
00733 argument = DOToString(argPtr);
00734
00735
00736
00737
00738
00739 theModule = (struct defmodule *) EnvFindDefmodule(theEnv,argument);
00740
00741 if (theModule == NULL)
00742 {
00743 CantFindItemErrorMessage(theEnv,"defmodule",argument);
00744 return(defaultReturn);
00745 }
00746
00747 EnvSetCurrentModule(theEnv,(void *) theModule);
00748
00749
00750
00751
00752
00753 return((SYMBOL_HN *) defaultReturn);
00754 }
00755
00756
00757
00758
00759
00760
00761 globle void AddAfterModuleChangeFunction(
00762 void *theEnv,
00763 char *name,
00764 void (*func)(void *),
00765 int priority)
00766 {
00767 DefmoduleData(theEnv)->AfterModuleChangeFunctions =
00768 AddFunctionToCallList(theEnv,name,priority,func,DefmoduleData(theEnv)->AfterModuleChangeFunctions,TRUE);
00769 }
00770
00771
00772
00773
00774
00775 globle void IllegalModuleSpecifierMessage(
00776 void *theEnv)
00777 {
00778 PrintErrorID(theEnv,"MODULDEF",1,TRUE);
00779 EnvPrintRouter(theEnv,WERROR,"Illegal use of the module specifier.\n");
00780 }
00781
00782