globle FILE *GenOpen( void *theEnv, char *fileName, char *accessType) { FILE *theFile; if (SystemDependentData(theEnv)->BeforeOpenFunction != NULL) { (*SystemDependentData(theEnv)->BeforeOpenFunction)(theEnv); } #if WIN_MVC #if _MSC_VER >= 1400 fopen_s(&theFile,fileName,accessType); #else theFile = fopen(fileName,accessType); #endif #else theFile = fopen(fileName,accessType); #endif if (SystemDependentData(theEnv)->AfterOpenFunction != NULL) { (*SystemDependentData(theEnv)->AfterOpenFunction)(theEnv); } return theFile; }
globle void genexit( void *theEnv, int num) { if (SystemDependentData(theEnv)->jmpBuffer != NULL) { longjmp(*SystemDependentData(theEnv)->jmpBuffer,1); } exit(num); }
globle int (*EnvSetAfterOpenFunction(void *theEnv, int (*theFunction)(void *)))(void *) { int (*tempFunction)(void *); tempFunction = SystemDependentData(theEnv)->AfterOpenFunction; SystemDependentData(theEnv)->AfterOpenFunction = theFunction; return(tempFunction); }
static void RestoreInterruptVectors() { #if ALLOW_ENVIRONMENT_GLOBALS void *theEnv; theEnv = GetCurrentEnvironment(); _dos_setvect(0x23,SystemDependentData(theEnv)->OldCtrlC); _dos_setvect(0x1b,SystemDependentData(theEnv)->OldBreak); #endif }
globle void GetSeekSetBinary( void *theEnv, long offset) { #if WIN_MVC _lseek(SystemDependentData(theEnv)->BinaryFileHandle,offset,SEEK_SET); #endif #if (! WIN_MVC) fseek(SystemDependentData(theEnv)->BinaryFP,offset,SEEK_SET); #endif }
globle void GenTellBinary( void *theEnv, long *offset) { #if WIN_MVC *offset = _lseek(SystemDependentData(theEnv)->BinaryFileHandle,0,SEEK_CUR); #endif #if (! WIN_MVC) *offset = ftell(SystemDependentData(theEnv)->BinaryFP); #endif }
globle void GenCloseBinary( void *theEnv) { #if MAC FSClose(SystemDependentData(theEnv)->BinaryRefNum); #endif #if IBM_TBC || IBM_MSC || IBM_ICB /* || IBM_MCW */ close(SystemDependentData(theEnv)->BinaryFileHandle); #endif #if (! MAC) && (! IBM_TBC) && (! IBM_MSC) && (! IBM_ICB) /* && (! IBM_MCW) */ fclose(SystemDependentData(theEnv)->BinaryFP); #endif }
globle int GenClose( void *theEnv, FILE *theFile) { int rv; if (SystemDependentData(theEnv)->BeforeOpenFunction != NULL) { (*SystemDependentData(theEnv)->BeforeOpenFunction)(theEnv); } rv = fclose(theFile); if (SystemDependentData(theEnv)->AfterOpenFunction != NULL) { (*SystemDependentData(theEnv)->AfterOpenFunction)(theEnv); } return rv; }
globle void GetSeekSetBinary( void *theEnv, long offset) { #if MAC SetFPos(SystemDependentData(theEnv)->BinaryRefNum,fsFromStart,offset); #endif #if IBM_TBC || IBM_MSC || IBM_ICB /* || IBM_MCW || IBM_ZTC */ lseek(SystemDependentData(theEnv)->BinaryFileHandle,offset,SEEK_SET); #endif #if (! MAC) && (! IBM_TBC) && (! IBM_MSC) && (! IBM_ICB) /* && (! IBM_MCW) && (! IBM_ZTC) */ fseek(SystemDependentData(theEnv)->BinaryFP,offset,SEEK_SET); #endif }
globle int genungetchar( void *theEnv, int theChar) { #if WIN_BTC || WIN_MVC if (SystemDependentData(theEnv)->getcPosition > 0) { SystemDependentData(theEnv)->getcPosition--; return theChar; } else { return EOF; } #else return(ungetc(theChar,stdin)); #endif }
globle void GenTellBinary( void *theEnv, long *offset) { #if MAC GetFPos(SystemDependentData(theEnv)->BinaryRefNum,offset); #endif #if IBM_TBC || IBM_MSC || IBM_ICB /* || IBM_MCW || IBM_ZTC */ *offset = lseek(SystemDependentData(theEnv)->BinaryFileHandle,0,SEEK_CUR); #endif #if (! MAC) && (! IBM_TBC) && (! IBM_MSC) && (! IBM_ICB) /* && (! IBM_MCW) && (! IBM_ZTC) */ *offset = ftell(SystemDependentData(theEnv)->BinaryFP); #endif }
globle void GenReadBinary( void *theEnv, void *dataPtr, unsigned long size) { #if MAC long dataSize; dataSize = (long) size; FSRead(SystemDependentData(theEnv)->BinaryRefNum,&dataSize,dataPtr); #endif #if IBM_TBC || IBM_MSC || IBM_ICB /* || IBM_MCW */ char *tempPtr; tempPtr = (char *) dataPtr; while (size > INT_MAX) { read(SystemDependentData(theEnv)->BinaryFileHandle,tempPtr,INT_MAX); size -= INT_MAX; tempPtr = tempPtr + INT_MAX; } if (size > 0) { read(SystemDependentData(theEnv)->BinaryFileHandle,tempPtr,(STD_SIZE) size); } #endif #if (! MAC) && (! IBM_TBC) && (! IBM_MSC) && (! IBM_ICB) /* && (! IBM_MCW) && (! IBM_ZTC) */ unsigned int temp, number_of_reads, read_size; if (sizeof(int) == sizeof(long)) { read_size = size; } else { read_size = (1L << (sizeof(int) * 8L)) - 1L ; } number_of_reads = size / read_size; temp = size - ((long) number_of_reads * (long) read_size); while (number_of_reads > 0) { fread(dataPtr,(STD_SIZE) read_size,1,SystemDependentData(theEnv)->BinaryFP); dataPtr = ((char *) dataPtr) + read_size; number_of_reads--; } fread(dataPtr,(STD_SIZE) temp,1,SystemDependentData(theEnv)->BinaryFP); #endif }
globle int gengetchar( void *theEnv) { #if WIN_BTC || WIN_MVC if (SystemDependentData(theEnv)->getcLength == SystemDependentData(theEnv)->getcPosition) { TCHAR tBuffer = 0; DWORD count = 0; WCHAR wBuffer = 0; ReadConsole(GetStdHandle(STD_INPUT_HANDLE),&tBuffer,1,&count,NULL); wBuffer = tBuffer; SystemDependentData(theEnv)->getcLength = WideCharToMultiByte(CP_UTF8,0,&wBuffer,1, (char *) SystemDependentData(theEnv)->getcBuffer, 7,NULL,NULL); SystemDependentData(theEnv)->getcPosition = 0; } return SystemDependentData(theEnv)->getcBuffer[SystemDependentData(theEnv)->getcPosition++]; #else return(getc(stdin)); #endif }
static void InitializeNonportableFeatures( void *theEnv) { #if MAC_MCW || IBM_MCW #pragma unused(theEnv) #endif #if ! WINDOW_INTERFACE #if MAC AddPeriodicFunction("systemtask",CallSystemTask,0); #endif #if VAX_VMS || UNIX_V || UNIX_7 || IBM_GCC signal(SIGINT,CatchCtrlC); #endif #if IBM_TBC SystemDependentData(theEnv)->OldCtrlC = getvect(0x23); SystemDependentData(theEnv)->OldBreak = getvect(0x1b); setvect(0x23,CatchCtrlC); setvect(0x1b,CatchCtrlC); atexit(RestoreInterruptVectors); #endif #if IBM_MSC || IBM_ICB SystemDependentData(theEnv)->OldCtrlC = _dos_getvect(0x23); SystemDependentData(theEnv)->OldBreak = _dos_getvect(0x1b); _dos_setvect(0x23,CatchCtrlC); _dos_setvect(0x1b,CatchCtrlC); atexit(RestoreInterruptVectors); #endif #if IBM_ZTC || IBM_SC _controlc_handler = CatchCtrlC; controlc_open(); #endif #endif }
globle void GenReadBinary( void *theEnv, void *dataPtr, size_t size) { #if WIN_MVC char *tempPtr; tempPtr = (char *) dataPtr; while (size > INT_MAX) { _read(SystemDependentData(theEnv)->BinaryFileHandle,tempPtr,INT_MAX); size -= INT_MAX; tempPtr = tempPtr + INT_MAX; } if (size > 0) { _read(SystemDependentData(theEnv)->BinaryFileHandle,tempPtr,(unsigned int) size); } #endif #if WIN_BTC char *tempPtr; tempPtr = (char *) dataPtr; while (size > INT_MAX) { read(SystemDependentData(theEnv)->BinaryFileHandle,tempPtr,INT_MAX); size -= INT_MAX; tempPtr = tempPtr + INT_MAX; } if (size > 0) { read(SystemDependentData(theEnv)->BinaryFileHandle,tempPtr,(STD_SIZE) size); } #endif #if (! WIN_BTC) && (! WIN_MVC) fread(dataPtr,size,1,SystemDependentData(theEnv)->BinaryFP); #endif }
globle void GenCloseBinary( void *theEnv) { if (SystemDependentData(theEnv)->BeforeOpenFunction != NULL) { (*SystemDependentData(theEnv)->BeforeOpenFunction)(theEnv); } #if WIN_MVC _close(SystemDependentData(theEnv)->BinaryFileHandle); #endif #if (! WIN_MVC) fclose(SystemDependentData(theEnv)->BinaryFP); #endif if (SystemDependentData(theEnv)->AfterOpenFunction != NULL) { (*SystemDependentData(theEnv)->AfterOpenFunction)(theEnv); } }
globle void SetContinueEnvFunction( void *theEnv, void (*theFunction)(void *,int)) { SystemDependentData(theEnv)->ContinueEnvFunction = theFunction; }
globle void SetPauseEnvFunction( void *theEnv, void (*theFunction)(void *)) { SystemDependentData(theEnv)->PauseEnvFunction = theFunction; }
globle void SetRedrawFunction( void *theEnv, void (*theFunction)(void *)) { SystemDependentData(theEnv)->RedrawScreenFunction = theFunction; }
globle int GenOpenReadBinary( void *theEnv, const char *funcName, const char *fileName) { if (SystemDependentData(theEnv)->BeforeOpenFunction != NULL) { (*SystemDependentData(theEnv)->BeforeOpenFunction)(theEnv); } #if WIN_MVC SystemDependentData(theEnv)->BinaryFileHandle = _open(fileName,O_RDONLY | O_BINARY); if (SystemDependentData(theEnv)->BinaryFileHandle == -1) { if (SystemDependentData(theEnv)->AfterOpenFunction != NULL) { (*SystemDependentData(theEnv)->AfterOpenFunction)(theEnv); } OpenErrorMessage(theEnv,funcName,fileName); return(FALSE); } #endif #if (! WIN_MVC) if ((SystemDependentData(theEnv)->BinaryFP = fopen(fileName,"rb")) == NULL) { if (SystemDependentData(theEnv)->AfterOpenFunction != NULL) { (*SystemDependentData(theEnv)->AfterOpenFunction)(theEnv); } OpenErrorMessage(theEnv,funcName,fileName); return(FALSE); } #endif if (SystemDependentData(theEnv)->AfterOpenFunction != NULL) { (*SystemDependentData(theEnv)->AfterOpenFunction)(theEnv); } return(TRUE); }
globle FILE *GenOpen( void *theEnv, const char *fileName, const char *accessType) { FILE *theFile; /*==================================*/ /* Invoke the before open function. */ /*==================================*/ if (SystemDependentData(theEnv)->BeforeOpenFunction != NULL) { (*SystemDependentData(theEnv)->BeforeOpenFunction)(theEnv); } /*================*/ /* Open the file. */ /*================*/ #if WIN_MVC #if _MSC_VER >= 1400 fopen_s(&theFile,fileName,accessType); #else theFile = fopen(fileName,accessType); #endif #else theFile = fopen(fileName,accessType); #endif /*=====================================*/ /* Check for a UTF-8 Byte Order Marker */ /* (BOM): 0xEF,0xBB,0xBF. */ /*=====================================*/ if ((theFile != NULL) & (strcmp(accessType,"r") == 0)) { int theChar; theChar = getc(theFile); if (theChar == 0xEF) { theChar = getc(theFile); if (theChar == 0xBB) { theChar = getc(theFile); if (theChar != 0xBF) { ungetc(theChar,theFile);} } else { ungetc(theChar,theFile);} } else { ungetc(theChar,theFile); } } /*=================================*/ /* Invoke the after open function. */ /*=================================*/ if (SystemDependentData(theEnv)->AfterOpenFunction != NULL) { (*SystemDependentData(theEnv)->AfterOpenFunction)(theEnv); } /*===============================*/ /* Return a pointer to the file. */ /*===============================*/ return theFile; }
globle void (*GetRedrawFunction(void *theEnv))(void *) { return SystemDependentData(theEnv)->RedrawScreenFunction; }
globle void (*GetContinueEnvFunction(void *theEnv))(void *,int) { return SystemDependentData(theEnv)->ContinueEnvFunction; }
globle void (*GetPauseEnvFunction(void *theEnv))(void *) { return SystemDependentData(theEnv)->PauseEnvFunction; }
globle void SetJmpBuffer( void *theEnv, jmp_buf *theJmpBuffer) { SystemDependentData(theEnv)->jmpBuffer = theJmpBuffer; }
globle void gensystem( void *theEnv) { char *commandBuffer = NULL; size_t bufferPosition = 0; size_t bufferMaximum = 0; int numa, i; DATA_OBJECT tempValue; const char *theString; /*===========================================*/ /* Check for the corret number of arguments. */ /*===========================================*/ if ((numa = EnvArgCountCheck(theEnv,"system",AT_LEAST,1)) == -1) return; /*============================================================*/ /* Concatenate the arguments together to form a single string */ /* containing the command to be sent to the operating system. */ /*============================================================*/ for (i = 1 ; i <= numa; i++) { EnvRtnUnknown(theEnv,i,&tempValue); if ((GetType(tempValue) != STRING) && (GetType(tempValue) != SYMBOL)) { SetHaltExecution(theEnv,TRUE); SetEvaluationError(theEnv,TRUE); ExpectedTypeError2(theEnv,"system",i); return; } theString = DOToString(tempValue); commandBuffer = AppendToString(theEnv,theString,commandBuffer,&bufferPosition,&bufferMaximum); } if (commandBuffer == NULL) return; /*=======================================*/ /* Execute the operating system command. */ /*=======================================*/ #if VAX_VMS if (SystemDependentData(theEnv)->PauseEnvFunction != NULL) (*SystemDependentData(theEnv)->PauseEnvFunction)(theEnv); VMSSystem(commandBuffer); putchar('\n'); if (SystemDependentData(theEnv)->ContinueEnvFunction != NULL) (*SystemDependentData(theEnv)->ContinueEnvFunction)(theEnv,1); if (SystemDependentData(theEnv)->RedrawScreenFunction != NULL) (*SystemDependentData(theEnv)->RedrawScreenFunction)(theEnv); #endif #if UNIX_7 || UNIX_V || LINUX || DARWIN || WIN_MVC || WIN_GCC || MAC_XCD if (SystemDependentData(theEnv)->PauseEnvFunction != NULL) (*SystemDependentData(theEnv)->PauseEnvFunction)(theEnv); system(commandBuffer); if (SystemDependentData(theEnv)->ContinueEnvFunction != NULL) (*SystemDependentData(theEnv)->ContinueEnvFunction)(theEnv,1); if (SystemDependentData(theEnv)->RedrawScreenFunction != NULL) (*SystemDependentData(theEnv)->RedrawScreenFunction)(theEnv); #else #if ! VAX_VMS EnvPrintRouter(theEnv,WDIALOG, "System function not fully defined for this system.\n"); #endif #endif /*==================================================*/ /* Return the string buffer containing the command. */ /*==================================================*/ rm(theEnv,commandBuffer,bufferMaximum); return; }
globle int GenOpenReadBinary( void *theEnv, char *funcName, char *fileName) { #if MAC Str255 tempName; OSErr resultCode; Str255 volName; short int vRefNum; long vDirNum; FSSpec theFSSpec; resultCode = HGetVol(volName,&vRefNum,&vDirNum); if (resultCode != noErr) { OpenErrorMessage(theEnv,funcName,fileName); return(0); } strcpy((char *) tempName,fileName); CopyCStringToPascal((char *) tempName,tempName); resultCode = FSMakeFSSpec(vRefNum,vDirNum,tempName,&theFSSpec); if (resultCode != noErr) { OpenErrorMessage(theEnv,funcName,fileName); return(FALSE); } resultCode = FSpOpenDF(&theFSSpec,fsCurPerm,&SystemDependentData(theEnv)->BinaryRefNum); if (resultCode != noErr) { OpenErrorMessage(theEnv,funcName,fileName); return(FALSE); } #endif #if IBM_TBC || IBM_MSC || IBM_ICB SystemDependentData(theEnv)->BinaryFileHandle = open(fileName,O_RDONLY | O_BINARY); if (SystemDependentData(theEnv)->BinaryFileHandle == -1) { OpenErrorMessage(theEnv,funcName,fileName); return(FALSE); } #endif #if (! MAC) && (! IBM_TBC) && (! IBM_MSC) && (! IBM_ICB) if ((SystemDependentData(theEnv)->BinaryFP = fopen(fileName,"rb")) == NULL) { OpenErrorMessage(theEnv,funcName,fileName); return(FALSE); } #endif return(TRUE); }