|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T f
Length: 4129 (0x1021) Types: TextFile Names: »fileio.c«
└─⟦a0efdde77⟧ Bits:30001252 EUUGD11 Tape, 1987 Spring Conference Helsinki └─⟦this⟧ »EUUGD11/euug-87hel/sec1/micrognu/sys/osk/fileio.c«
/* * Os9/68k fileio.c for MicroGnuEmacs by Robert A. Larson * system dependent file io routines */ #include "def.h" char *getenv(); 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; ++i) putc(buf[i]&0xFF, ffp); putc('\n', ffp); if (ferror(ffp) != FALSE) { ewprintf("Write I/O error"); return (FIOERR); } return (FIOSUC); } /* * Read a line from a file, and store the bytes * in the supplied buffer. Stop on end of file or end of * line. Don't get upset by files that don't have an end of * line on the last line; this seem to be common on CP/M-86 and * MS-DOS (the suspected culprit is VAX/VMS kermit, but this * has not been confirmed. If this is sufficiently researched * it may be possible to pull this kludge). */ ffgetline(buf, nbuf) register char *buf; { register int c; register int i; i = 0; for (;;) { c = getc(ffp); 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 file "fname" into a backup copy. * The backup copy is the same name with ".BAK" appended unless the file * name is to long. If your file name is 28 characters long ending in ".BAK" * you lose. The error handling is all in "file.c". */ fbackupfile(fname) char *fname; { register char *params; int status; register char *fn; register int fnamel; register int fnl; char *rindex(); if((fn = rindex(fname, '/')) == NULL) fn = fname; else fn++; fnamel = strlen(fname); fnl = strlen(fn); if((params = malloc(strlen(fname)+strlen(fn)+6)) == NULL) return(ABORT); /* delete the old backup */ strcpy(params, fname); if(fnl < 25) strcat(params, ".BAK"); else strcpy(params+(fnamel-fnl+24), ".BAK"); unlink(params); /* ignore errors */ /* now do the rename (This is rather akward) */ strcpy(params, fname); strcat(params, " "); strcat(params, fn); if(fnl < 25) strcat(params, ".BAK"); else strcpy(params+fnamel+1+24, ".BAK"); if(os9fork("rename", strlen(params)+1, params, 0, 0, 0, 0)==-1) { free(params); return (FALSE); } wait(&status); free(params); return ((status & 0xffff)==0); } #endif /* * The string "fn" is a file name. * Perform any required case adjustments. All sustems * we deal with so far have case insensitive file systems. * We zap everything to lower case. The problem we are trying * to solve is getting 2 buffers holding the same file if * you visit one of them with the "caps lock" key down. * On UNIX file names are dual case, so we leave * everything alone. Os9's dual case storage but non-case sensitivity * does not seem to be accounted for here. I'm treating it as a * mono-case system, but it would be better to beleive the file (if found) * or the user (if not). */ adjustcase(fn) register char *fn; { register int c; while ((c = *fn) != 0) { if (c>='A' && c<='Z') *fn = c + 'a' - 'A'; ++fn; } } #ifndef MICRO char *startupfile() { static char startname[64]; char *cp; if ((cp = getenv("HOME")) == NULL) return ".mg"; strncpy(startname, cp, 64 - 4); strcat(startname, "/.mg"); return startname; } #endif