⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 insfile.c

📁 clips源代码
💻 C
📖 第 1 页 / 共 4 页
字号:
        instanceCount++;      ReturnExpression(theEnv,top->argList);      top->argList = NULL;      GetToken(theEnv,ilog,&DefclassData(theEnv)->ObjectParseToken);     }   rtn_struct(theEnv,expr,top);   if (isFileName) {     GenClose(theEnv,sfile);     SetFastLoad(theEnv,svload);   }   InstanceData(theEnv)->MkInsMsgPass = svoverride;   return(instanceCount);  }/***************************************************  NAME         : ProcessFileErrorMessage  DESCRIPTION  : Prints an error message when a                 file containing text or binary                 instances cannot be processed.  INPUTS       : The name of the input file and the                 function which opened it.  RETURNS      : No value  SIDE EFFECTS : None  NOTES        : None ***************************************************/static void ProcessFileErrorMessage(  void *theEnv,  char *functionName,  char *fileName)  {   PrintErrorID(theEnv,"INSFILE",1,FALSE);   EnvPrintRouter(theEnv,WERROR,"Function ");   EnvPrintRouter(theEnv,WERROR,functionName);   EnvPrintRouter(theEnv,WERROR," could not completely process file ");   EnvPrintRouter(theEnv,WERROR,fileName);   EnvPrintRouter(theEnv,WERROR,".\n");  }#if BLOAD_INSTANCES/*******************************************************  NAME         : VerifyBinaryHeader  DESCRIPTION  : Reads the prefix and version headers                 from a file to verify that the                 input is a valid binary instances file  INPUTS       : The name of the file  RETURNS      : TRUE if OK, FALSE otherwise  SIDE EFFECTS : Input prefix and version read  NOTES        : Assumes file already open with                  GenOpenReadBinary *******************************************************/static intBool VerifyBinaryHeader(  void *theEnv,  char *theFile)  {   char buf[20];   GenReadBinary(theEnv,(void *) buf,(unsigned long) (strlen(InstanceFileData(theEnv)->InstanceBinaryPrefixID) + 1));   if (strcmp(buf,InstanceFileData(theEnv)->InstanceBinaryPrefixID) != 0)     {      PrintErrorID(theEnv,"INSFILE",2,FALSE);      EnvPrintRouter(theEnv,WERROR,theFile);      EnvPrintRouter(theEnv,WERROR," file is not a binary instances file.\n");      return(FALSE);     }   GenReadBinary(theEnv,(void *) buf,(unsigned long) (strlen(InstanceFileData(theEnv)->InstanceBinaryVersionID) + 1));   if (strcmp(buf,InstanceFileData(theEnv)->InstanceBinaryVersionID) != 0)     {      PrintErrorID(theEnv,"INSFILE",3,FALSE);      EnvPrintRouter(theEnv,WERROR,theFile);      EnvPrintRouter(theEnv,WERROR," file is not a compatible binary instances file.\n");      return(FALSE);     }   return(TRUE);  }/***************************************************  NAME         : LoadSingleBinaryInstance  DESCRIPTION  : Reads the binary data for a new                 instance and its slot values and                 creates/initializes the instance  INPUTS       : None  RETURNS      : TRUE if all OK,                 FALSE otherwise  SIDE EFFECTS : Binary data read and instance                 created  NOTES        : Uses global GenReadBinary(theEnv,) ***************************************************/static intBool LoadSingleBinaryInstance(  void *theEnv)  {   SYMBOL_HN *instanceName,             *className;   int slotCount;   DEFCLASS *theDefclass;   INSTANCE_TYPE *newInstance;   struct bsaveSlotValue *bsArray;   struct bsaveSlotValueAtom *bsaArray = NULL;   long nameIndex;   unsigned long totalValueCount;   long i, j;   INSTANCE_SLOT *sp;   DATA_OBJECT slotValue,junkValue;   /* =====================      Get the instance name      ===================== */   BufferedRead(theEnv,(void *) &nameIndex,(unsigned long) sizeof(long));   instanceName = SymbolPointer(nameIndex);   /* ==================      Get the class name      ================== */   BufferedRead(theEnv,(void *) &nameIndex,(unsigned long) sizeof(long));   className = SymbolPointer(nameIndex);   /* ==================      Get the slot count      ================== */   BufferedRead(theEnv,(void *) &slotCount,(unsigned long) sizeof(unsigned));   /* =============================      Make sure the defclass exists      and check the slot count      ============================= */   theDefclass = LookupDefclassInScope(theEnv,ValueToString(className));   if (theDefclass == NULL)     {      ClassExistError(theEnv,"bload-instances",ValueToString(className));      return(FALSE);     }   if (theDefclass->instanceSlotCount != slotCount)     {      BinaryLoadInstanceError(theEnv,instanceName,theDefclass);      return(FALSE);     }   /* ===================================      Create the new unitialized instance      =================================== */   newInstance = BuildInstance(theEnv,instanceName,theDefclass,FALSE);   if (newInstance == NULL)     {      BinaryLoadInstanceError(theEnv,instanceName,theDefclass);      return(FALSE);     }   if (slotCount == 0)     return(TRUE);   /* ====================================      Read all slot override info and slot      value atoms into big arrays      ==================================== */   bsArray = (struct bsaveSlotValue *) gm2(theEnv,(sizeof(struct bsaveSlotValue) * slotCount));   BufferedRead(theEnv,(void *) bsArray,(unsigned long) (sizeof(struct bsaveSlotValue) * slotCount));   BufferedRead(theEnv,(void *) &totalValueCount,(unsigned long) sizeof(unsigned long));   if (totalValueCount != 0L)     {      bsaArray = (struct bsaveSlotValueAtom *)                  gm3(theEnv,(long) (totalValueCount * sizeof(struct bsaveSlotValueAtom)));      BufferedRead(theEnv,(void *) bsaArray,                   (unsigned long) (totalValueCount * sizeof(struct bsaveSlotValueAtom)));     }   /* =========================      Insert the values for the      slot overrides      ========================= */   for (i = 0 , j = 0L ; i < slotCount ; i++)     {      /* ===========================================================         Here is another check for the validity of the binary file -         the order of the slots in the file should match the         order in the class definition         =========================================================== */      sp = newInstance->slotAddresses[i];      if (sp->desc->slotName->name != SymbolPointer(bsArray[i].slotName))        goto LoadError;      CreateSlotValue(theEnv,&slotValue,(struct bsaveSlotValueAtom *) &bsaArray[j],                      bsArray[i].valueCount);      if (PutSlotValue(theEnv,newInstance,sp,&slotValue,&junkValue,"bload-instances") == FALSE)        goto LoadError;      j += (unsigned long) bsArray[i].valueCount;     }   rm(theEnv,(void *) bsArray,(sizeof(struct bsaveSlotValue) * slotCount));   if (totalValueCount != 0L)     rm3(theEnv,(void *) bsaArray,         (long) (totalValueCount * sizeof(struct bsaveSlotValueAtom)));   return(TRUE);LoadError:   BinaryLoadInstanceError(theEnv,instanceName,theDefclass);   QuashInstance(theEnv,newInstance);   rm(theEnv,(void *) bsArray,(sizeof(struct bsaveSlotValue) * slotCount));   rm3(theEnv,(void *) bsaArray,       (long) (totalValueCount * sizeof(struct bsaveSlotValueAtom)));   return(FALSE);  }/***************************************************  NAME         : BinaryLoadInstanceError  DESCRIPTION  : Prints out an error message when                 an instance could not be                 successfully loaded from a                 binary file  INPUTS       : 1) The instance name                 2) The defclass  RETURNS      : Nothing useful  SIDE EFFECTS : Error message printed  NOTES        : None ***************************************************/static void BinaryLoadInstanceError(  void *theEnv,  SYMBOL_HN *instanceName,  DEFCLASS *theDefclass)  {   PrintErrorID(theEnv,"INSFILE",4,FALSE);   EnvPrintRouter(theEnv,WERROR,"Function bload-instances unable to load instance [");   EnvPrintRouter(theEnv,WERROR,ValueToString(instanceName));   EnvPrintRouter(theEnv,WERROR,"] of class ");   PrintClassName(theEnv,WERROR,theDefclass,TRUE);  }/***************************************************  NAME         : CreateSlotValue  DESCRIPTION  : Creates a data object value from                 the binary slot value atom data  INPUTS       : 1) A data object buffer                 2) The slot value atoms array                 3) The number of values to put                    in the data object  RETURNS      : Nothing useful  SIDE EFFECTS : Data object initialized                 (if more than one value, a                 multifield is created)  NOTES        : None ***************************************************/static void CreateSlotValue(  void *theEnv,  DATA_OBJECT *result,  struct bsaveSlotValueAtom *bsaValues,  unsigned long valueCount)  {   register unsigned i;   if (valueCount == 0)     {      result->type = MULTIFIELD;      result->value = EnvCreateMultifield(theEnv,0L);      result->begin = 0;      result->end = -1;     }   else if (valueCount == 1)     {      result->type = bsaValues[0].type;      result->value = GetBinaryAtomValue(theEnv,&bsaValues[0]);     }   else     {      result->type = MULTIFIELD;      result->value = EnvCreateMultifield(theEnv,valueCount);      result->begin = 0;      SetpDOEnd(result,valueCount);      for (i = 1 ; i <= valueCount ; i++)        {         SetMFType(result->value,i,(short) bsaValues[i-1].type);         SetMFValue(result->value,i,GetBinaryAtomValue(theEnv,&bsaValues[i-1]));        }     }  }/***************************************************  NAME         : GetBinaryAtomValue  DESCRIPTION  : Uses the binary index of an atom                 to find the ephemeris value  INPUTS       : The binary type and index  RETURNS      : The symbol/etc. pointer  SIDE EFFECTS : None  NOTES        : None ***************************************************/static void *GetBinaryAtomValue(  void *theEnv,  struct bsaveSlotValueAtom *ba)  {   switch (ba->type)     {      case SYMBOL:      case STRING:      case INSTANCE_NAME:         return((void *) SymbolPointer(ba->value));      case FLOAT:         return((void *) FloatPointer(ba->value));      case INTEGER:         return((void *) IntegerPointer(ba->value));      case FACT_ADDRESS:#if DEFTEMPLATE_CONSTRUCT && DEFRULE_CONSTRUCT         return((void *) &FactData(theEnv)->DummyFact);#else         return(NULL);#endif      case EXTERNAL_ADDRESS:        return(NULL);      default:        {         SystemError(theEnv,"INSFILE",1);         EnvExitRouter(theEnv,EXIT_FAILURE);        }     }   return(NULL);  }/***************************************************  NAME         : BufferedRead  DESCRIPTION  : Reads data from binary file                 (Larger blocks than requested size                  may be read and buffered)  INPUTS       : 1) The buffer                 2) The buffer size  RETURNS      : Nothing useful  SIDE EFFECTS : Data stored in buffer  NOTES        : None ***************************************************/static void BufferedRead(  void *theEnv,  void *buf,  unsigned long bufsz)  {   unsigned long i,amountLeftToRead;   if (InstanceFileData(theEnv)->CurrentReadBuffer != NULL)     {      amountLeftToRead = InstanceFileData(theEnv)->CurrentReadBufferSize - InstanceFileData(theEnv)->CurrentReadBufferOffset;      if (bufsz <= amountLeftToRead)        {         for (i = 0L ; i < bufsz ; i++)           ((char *) buf)[i] = InstanceFileData(theEnv)->CurrentReadBuffer[i + InstanceFileData(theEnv)->CurrentReadBufferOffset];         InstanceFileData(theEnv)->CurrentReadBufferOffset += bufsz;         if (InstanceFileData(theEnv)->CurrentReadBufferOffset == InstanceFileData(theEnv)->CurrentReadBufferSize)           FreeReadBuffer(theEnv);        }      else        {         if (InstanceFileData(theEnv)->CurrentReadBufferOffset < InstanceFileData(theEnv)->CurrentReadBufferSize)           {            for (i = 0L ; i < amountLeftToRead ; i++)              ((char *) buf)[i] = InstanceFileData(theEnv)->CurrentReadBuffer[i + InstanceFileData(theEnv)->CurrentReadBufferOffset];            bufsz -= amountLeftToRead;            buf = (void *) (((char *) buf) + amountLeftToRead);           }         FreeReadBuffer(theEnv);         BufferedRead(theEnv,buf,bufsz);        }     }   else     {      if (bufsz > MAX_BLOCK_SIZE)        {         InstanceFileData(theEnv)->CurrentReadBufferSize = bufsz;         if (bufsz > (InstanceFileData(theEnv)->BinaryInstanceFileSize - InstanceFileData(theEnv)->BinaryInstanceFileOffset))           {            SystemError(theEnv,"INSFILE",2);            EnvExitRouter(theEnv,EXIT_FAILURE);           }        }      else if (MAX_BLOCK_SIZE >              (InstanceFileData(theEnv)->BinaryInstanceFileSize - InstanceFileData(theEnv)->BinaryInstanceFileOffset))        InstanceFileData(theEnv)->CurrentReadBufferSize = InstanceFileData(theEnv)->BinaryInstanceFileSize - InstanceFileData(theEnv)->BinaryInstanceFileOffset;      else        InstanceFileData(theEnv)->CurrentReadBufferSize = (unsigned long) MAX_BLOCK_SIZE;      InstanceFileData(theEnv)->CurrentReadBuffer = (char *) genalloc(theEnv,InstanceFileData(theEnv)->CurrentReadBufferSize);      GenReadBinary(theEnv,(void *) InstanceFileData(theEnv)->CurrentReadBuffer,InstanceFileData(theEnv)->CurrentReadBufferSize);      for (i = 0L ; i < bufsz ; i++)        ((char *) buf)[i] = InstanceFileData(theEnv)->CurrentReadBuffer[i];      InstanceFileData(theEnv)->CurrentReadBufferOffset = bufsz;      InstanceFileData(theEnv)->BinaryInstanceFileOffset += InstanceFileData(theEnv)->CurrentReadBufferSize;     }  }/*****************************************************  NAME         : FreeReadBuffer  DESCRIPTION  : Deallocates buffer for binary reads  INPUTS       : None  RETURNS      : Nothing usefu  SIDE EFFECTS : Binary global read buffer deallocated  NOTES        : None *****************************************************/static void FreeReadBuffer(  void *theEnv)  {   if (InstanceFileData(theEnv)->CurrentReadBufferSize != 0L)     {      genfree(theEnv,(void *) InstanceFileData(theEnv)->CurrentReadBuffer,InstanceFileData(theEnv)->CurrentReadBufferSize);      InstanceFileData(theEnv)->CurrentReadBuffer = NULL;      InstanceFileData(theEnv)->CurrentReadBufferSize = 0L;     }  }#endif#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -