/* * Name: MicroEMACS * Version: Gnu v30 * Commodore Amiga file I/O. * Last edit: 13-Dec-86 ...ihnp4!seismo!ut-sally!ut-ngp!mic * Created: 23-Jul-86 ...ihnp4!seismo!ut-sally!ut-ngp!mic * (from sys/bsd/fileio.c) * * Read and write ASCII files. All * of the low level file I/O knowledge is here. * Pretty much vanilla standard I/O, except for * fbackupfile() */ #include #include #undef TRUE #undef FALSE #include "def.h" /* With Lattice, make sure you use -Idf0:include/lattice/ to */ /* put the Lattice files in the right spot. */ static FILE *ffp; /* * Open a file for reading. */ ffropen(fn) char *fn; { if ((ffp=fopen(fn, "r")) == NULL) return (FIOFNF); return (FIOSUC); } /* * Open a file for writing. * Return TRUE if all is well, and * FALSE on error (cannot create). */ ffwopen(fn) char *fn; { if ((ffp=fopen(fn, "w")) == NULL) { ewprintf("Cannot open file for writing"); return (FIOERR); } return (FIOSUC); } /* * Close a file. * Should look at the status. */ ffclose() { fclose(ffp); return (FIOSUC); } /* * Write a line to the already * opened file. The "buf" points to the * buffer, and the "nbuf" is its length, less * the free newline. Return the status. * Check only at the newline. */ ffputline(buf, nbuf) register char buf[]; { register int i; for (i=0; i= nbuf-1) { ewprintf("File has long line"); return (FIOERR); } buf[i++] = '\r'; } } if (c==EOF || c=='\n') /* End of line. */ break; if (i >= nbuf-1) { ewprintf("File has long line"); return (FIOERR); } buf[i++] = c; } if (c == EOF) { /* End of file. */ if (ferror(ffp) != FALSE) { ewprintf("File read error"); return (FIOERR); } if (i == 0) /* Don't get upset if */ return (FIOEOF); /* no newline at EOF. */ } buf[i] = 0; return (FIOSUC); } #ifdef BACKUP /* * Rename the current file into a backup copy, * possibly after deleting the original file. */ fbackupfile(fname) char *fname; { struct FileLock *twiddle, *lock, *Lock(); ULONG Rename(), UnLock(); char buffer[NFILEN]; (void) strncpy(buffer,fname,NFILEN - 1); (void) strcat(buffer,"~"); lock = Lock(fname,(ULONG)EXCLUSIVE_LOCK);/* does file exist? */ if (!lock) return (FALSE); /* nope, return error */ twiddle = Lock(buffer,(ULONG)EXCLUSIVE_LOCK); if (twiddle) { /* delete old backup */ UnLock(twiddle); /* let it go */ if (!DeleteFile(buffer)) { UnLock(lock); return (FALSE); } twiddle = NULL; } /* rename file to backup name (after unlocking the file) */ UnLock(lock); return (int) Rename(fname,buffer); } #endif BACKUP #ifdef STARTUP /* * Return name of user's startup file. On Amiga, make it * s:.mg */ static char startname[] = ".mg"; static char altstartname[] = "s:.mg"; char *startupfile() { FILE *f, *fopen(); if (f = fopen(startname,"r")) { /* first try */ fclose(f); return(startname); } if (f = fopen(altstartname,"r")) { /* second try */ fclose(f); return (altstartname); } return (NULL); } #endif STARTUP /* * The string "fn" is a file name. * Perform any required case adjustments. * On the Amiga file names are dual case, * so we leave everything alone. */ adjustcase(fn) register char *fn; { return (TRUE); }