static void ioSuppTempOpen( // OPEN TEMPORARY FILE void ) { auto char fname[_MAX_PATH]; for(;;) { tempFname( fname ); #if defined(__DOS__) { tiny_ret_t rc; rc = TinyCreateNew( fname, 0 ); if( TINY_ERROR( rc ) ) { temphandle = -1; } else { temphandle = TINY_INFO( rc ); __SetIOMode( temphandle, _READ | _WRITE | _BINARY ); } } #else temphandle = open( fname, AMODE, PMODE_RW ); #endif if( temphandle != -1 ) break; if( workFile[5] == 'Z' ) { temphandle = -1; break; } switch( workFile[5] ) { case '9': workFile[5] = 'A'; break; case 'I': workFile[5] = 'J'; /* file-system may be EBCDIC */ break; case 'R': workFile[5] = 'S'; /* file-system may be EBCDIC */ break; default: ++workFile[5]; break; } } #if defined(__UNIX__) /* Under POSIX it's legal to remove a file that's open. The file space will be reclaimed when the handle is closed. This makes sure that the work file always gets removed. */ remove( fname ); tempname = NULL; #else tempname = FNameAdd( fname ); #endif if( temphandle == -1 ) { ioSuppError( ERR_UNABLE_TO_OPEN_WORK_FILE ); } }
static void scanInputFile( // PROCESS NAME OF INPUT FILE void ) { char filename[ _MAX_PATH ]; // - scanned file name size_t len; // - length of file name char const *fnm; // - file name in command line len = CmdScanFilename( &fnm ); ++CompInfo.compfile_max; if( CompInfo.compfile_max == CompInfo.compfile_cur ) { if( WholeFName == NULL ) { stvcpy( filename, fnm, len ); StripQuotes( filename ); WholeFName = FNameAdd( filename ); } else { CErr1( ERR_CAN_ONLY_COMPILE_ONE_FILE ); } } }
static boolean openSrcPath( // ATTEMPT TO OPEN FILE (PATH TO BE PREPENDED) char *path, // - path char **exts, // - file extensions struct path_descr *fd, // - file descriptor enum file_type typ ) // - type of file being opened { boolean retn; // - return: TRUE ==> opened struct path_descr pd; // - path descriptor char dir[ _MAX_PATH*2 ]; // - new path char *pp; // - pointer into path char *ext; // - extension opened splitFileName( path, &pd ); if( fd->drv[0] == '\0' ) { pp = stpcpy( dir, path ); } else if( pd.drv[0] == '\0' ) { pp = stpcpy( dir, fd->drv ); pp = stpcpy( pp, path ); } else { pp = NULL; } if( pp == NULL ) { retn = FALSE; } else { pp = concSep( pp, dir ); makeDirName( pp, fd ); splitFileName( dir, &pd ); ext = openSrcExts( exts, &pd, typ ); if( ext == NULL ) { retn = FALSE; } else { if( ( typ == FT_SRC ) && ( ext != fd->ext ) ) { _makepath( dir, fd->drv, fd->dir, fd->fnm, ext ); WholeFName = FNameAdd( dir ); } retn = TRUE; } } return retn; }
static void ioSuppTempOpen( // OPEN TEMPORARY FILE void ) { int mode; auto char fname[ _MAX_PATH ]; mode = O_RDWR | O_CREAT | O_EXCL; #ifdef __UNIX__ #ifndef O_TEMP #define O_TEMP 0 /* Not a standard flag */ #endif // Unix files are always binary mode |= O_TEMP; #else mode |= O_BINARY; #endif for(;;) { tempFname( fname ); #if defined(__DOS__) { tiny_ret_t rc; rc = TinyCreateNew( fname, 0 ); if( TINY_ERROR( rc ) ) { temphandle = -1; } else { temphandle = TINY_INFO( rc ); __SetIOMode( temphandle, _READ | _WRITE | _BINARY ); } } #else temphandle = open( fname, mode, S_IRUSR | S_IWUSR ); #endif if( temphandle != -1 ) break; if( workFile[5] == 'Z' ) { temphandle = -1; break; } switch( workFile[5] ) { case '9': workFile[5] = 'A'; break; case 'I': workFile[5] = 'J'; /* file-system may be EBCDIC */ break; case 'R': workFile[5] = 'S'; /* file-system may be EBCDIC */ break; default: ++workFile[5]; break; } } #if defined(__UNIX__) /* Under POSIX it's legal to remove a file that's open. The file space will be reclaimed when the handle is closed. This makes sure that the work file always gets removed. */ remove( fname ); tempname = NULL; #else tempname = FNameAdd( fname ); #endif if( temphandle == -1 ) { ioSuppError( ERR_UNABLE_TO_OPEN_WORK_FILE ); } }
static boolean doIoSuppOpenSrc( // OPEN A SOURCE FILE (PRIMARY,HEADER) struct path_descr *fd, // - descriptor for file name enum file_type typ ) // - type of search path to use { char **paths; // - optional paths to prepend char **exts; // - optional extensions to append boolean retn; // - return: TRUE ==> opened char *path; // - next path char bufpth[ _MAX_PATH ]; // - buffer for next path SRCFILE curr; // - current included file SRCFILE stdin_srcfile; // - srcfile for stdin struct path_descr idescr; // - descriptor for included file LINE_NO dummy; // - dummy line number holder char prevpth[ _MAX_PATH ]; // - buffer for previous path switch( typ ) { case FT_SRC: if( fd->fnm[0] == '\0' && fd->ext[0] == '.' && fd->ext[1] == '\0' ) { if( ErrCount != 0 ) { // command line errors may result in "." as the input name // so the user thinks that the compiler is hung! return( FALSE ); } WholeFName = FNameAdd( "stdin" ); stdin_srcfile = SrcFileOpen( stdin, WholeFName ); SrcFileNotAFile( stdin_srcfile ); goto file_was_found; } paths = pathSrc; exts = extsSrc; break; case FT_HEADER: case FT_LIBRARY: if( !CompFlags.ignore_current_dir ) { paths = pathHdr; } else { paths = NULL; } exts = extsHdr; break; case FT_CMD: paths = pathCmd; exts = extsCmd; break; } switch( typ ) { case FT_LIBRARY: if( fd->drv[0] != '\0' || IS_DIR_SEP( fd->dir[0] ) ) { retn = openSrcPath( "", exts, fd, typ ); if( retn ) goto file_was_found; } break; case FT_HEADER: // even if ignoreing current dir, have to look for absolute paths if( !CompFlags.ignore_current_dir || fd->drv[0] != '\0' ) { // look in current directory retn = openSrcPath( "", exts, fd, typ ); if( retn ) goto file_was_found; } /* check directories of currently included files */ if( !IS_PATH_SEP( fd->dir[0] ) ) { prevpth[0] = '\xff'; /* to make it not compare with anything else */ prevpth[1] = '\0'; curr = SrcFileCurrent(); for( ;; ) { if( curr == NULL ) break; splitFileName( SrcFileName( curr ), &idescr ); _makepath( bufpth, idescr.drv, idescr.dir, NULL, NULL ); /*optimization: don't try and open if in previously checked dir*/ if( strcmp( bufpth, prevpth ) != 0 ) { retn = openSrcPath( bufpth, exts, fd, FT_HEADER ); if( retn ) goto file_was_found; } curr = SrcFileIncluded( curr, &dummy ); strcpy( prevpth, bufpth ); } } break; case FT_SRC: case FT_CMD: retn = openSrcPath( "", exts, fd, typ ); if( retn ) goto file_was_found; break; } switch( typ ) { case FT_HEADER: case FT_LIBRARY: HFileListStart(); for( ; ; ) { HFileListNext( bufpth ); if( *bufpth == '\0' ) break; retn = openSrcPath( bufpth, exts, fd, typ ); if( retn ) goto file_was_found; } break; } switch( typ ) { case FT_HEADER: case FT_CMD: case FT_SRC: if( IS_PATH_SEP( fd->dir[0] ) ) { // absolute path break; } if( paths != NULL ) { for( ; ; ) { path = *paths++; if( path == NULL ) break; retn = openSrcPath( path, exts, fd, typ ); if( retn ) goto file_was_found; } } break; } return FALSE; file_was_found: switch( typ ) { case FT_CMD: SrcFileCommand(); break; case FT_LIBRARY: SrcFileLibrary(); break; } return TRUE; }