Annotation of 43BSD/contrib/B/src/bint/b3fil.c, revision 1.1

1.1     ! root        1: /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
        !             2: 
        !             3: /*
        !             4:   $Header: b3fil.c,v 1.4 85/08/27 10:56:00 timo Exp $
        !             5: */
        !             6: 
        !             7: /* Facilities supplied by the file system */
        !             8: 
        !             9: #include "b.h"
        !            10: #include "b0con.h"
        !            11: #include "b0fea.h"
        !            12: #include "b0fil.h"
        !            13: #include "b1obj.h"
        !            14: #include "b3scr.h"
        !            15: #include "b3err.h"
        !            16: #include "b3fil.h"
        !            17: 
        !            18: #ifndef INTEGRATION
        !            19: 
        !            20: /*This file defines the facilities needed for dealing with files,
        !            21:   apart from C's standard I/O facilities which are used throughout the system.
        !            22: 
        !            23:   Units are held on files in a 'workspace', which on Unix is modelled
        !            24:   using directories. The function 'f_uname' converts a unit name into a
        !            25:   unique filename. On Unix this is done by prepending a character to the unit
        !            26:   name to indicate the kind of unit (for how'to ', and for tests and yields
        !            27:   < for zeroadic, " for monadic and > for dyadic; these have been chosen as
        !            28:   characters that are not usually used in filenames), and truncating the
        !            29:   name if necessary. If the name does have to be truncated, then it is
        !            30:   hashed to produce a character that is appended to the filename, in an attempt
        !            31:   to produce a unique filename. Even so, it is still possible for different
        !            32:   unit names to produce the same filename, and in the unlikely event of this
        !            33:   happening you get an error message that the unit already exists when you
        !            34:   try to create the clashing unit name.
        !            35: 
        !            36:   Filenames are at most SAFEFNLEN characters long, which on standard Unix
        !            37:   systems gives you one spare character for making backups or whatever.
        !            38: 
        !            39:   It would be better if the B system effectively maintained its own directories
        !            40:   that mapped units onto files in the real file system, as is done for targets.
        !            41:   With operating systems with a more limited file system (eg even shorter
        !            42:   filenames) this is the only possibility.
        !            43: 
        !            44:   The B system can operate in two ways: with the interpreter in command,
        !            45:   and then the editor is called from the interpreter to edit units;
        !            46:   and with the editor in command, when the editor calls the interpreter to
        !            47:   execute commands. The variable 'filtered' is Yes when the editor is in
        !            48:   command, and No otherwise.
        !            49: */
        !            50: 
        !            51: #define COML 60
        !            52: Hidden char com_line[COML];
        !            53: #define At_eos(s) ((s)+= strlen(s))
        !            54: 
        !            55: Visible Procedure f_edit(fname, errline) value fname; intlet errline; {
        !            56:        /*The default editor is called with a first parameter of the line number
        !            57:          and a second parameter of the file name*/
        !            58:        string cl= com_line; char c;
        !            59: #ifdef unix
        !            60:        if (filtered) {
        !            61:                printf("\001: +%d %s\n", errline, strval(fname));
        !            62:                fflush(stdout);
        !            63:                do { c= fgetc(stdin); } while (c != '\n');
        !            64:                still_ok= Yes; /*ignore interrupts that occurred*/
        !            65:        } else {
        !            66:                strcpy(cl, editorfile);
        !            67:                if (*(cl+strlen(cl)-1) == '+') {
        !            68:                        if (errline != 0) sprintf(At_eos(cl), "%d", errline);
        !            69:                        else *(cl+strlen(cl)-1)= ' ';
        !            70:                }
        !            71:                app_fname(At_eos(cl), fname);
        !            72:                system(com_line);
        !            73:        }
        !            74: #else !unix
        !            75:        fprintf(stderr, "*** Editing units not yet implemented\n");
        !            76: #endif unix
        !            77: }
        !            78: 
        !            79: #else INTEGRATION
        !            80: 
        !            81: Visible Procedure
        !            82: f_edit(fname, errline, prompt)
        !            83:        value fname; intlet errline; literal prompt;
        !            84: {
        !            85:        string filename= Str(fname);
        !            86:        btop(&filename, errline, prompt, 0);
        !            87:        still_ok= Yes;
        !            88: }
        !            89: 
        !            90: #endif
        !            91: 
        !            92: Visible bool ws_writable() {
        !            93:        FILE *f= fopen(tempfile, "w");
        !            94:        if (f == NULL) return No;
        !            95:        fclose(f);
        !            96:        return Yes;
        !            97: }
        !            98: 
        !            99: Hidden bool f_copy(fname, sname) value fname, sname; {
        !           100:        string fn= strval(fname), sn;
        !           101:        FILE *fp= fopen(fn, "r"), *sp; int c; bool ok;
        !           102:        if (fp == NULL) return No;
        !           103:        sn= strval(sname);
        !           104:        sp= fopen(sn, "w");
        !           105:        if (sp == NULL) {
        !           106:                fclose(fp);
        !           107:                return No;
        !           108:        }
        !           109:        while ((c= getc(fp)) != EOF)
        !           110:                putc(c, sp);
        !           111:        fclose(fp);
        !           112:        ok= fflush(sp) != EOF;
        !           113:        if (fclose(sp) == EOF)
        !           114:                ok= No;
        !           115:        return ok;
        !           116: }
        !           117: 
        !           118: Visible value f_save(fname) value fname; {
        !           119:        /* saves the file in a temporary file, whose name is returned */
        !           120:        value sname= mk_text(tempfile);
        !           121:        VOID f_copy(fname, sname);
        !           122:        return sname;
        !           123: }
        !           124: 
        !           125: Visible Procedure f_rename(fname, nfname) value fname, nfname; {
        !           126:        char *f1, f2[100];
        !           127:        strcpy(f2, strval(nfname));
        !           128:        unlink(f2);
        !           129:        f1= strval(fname);
        !           130: #ifndef RENAME
        !           131:        link(f1, f2);
        !           132:        unlink(f1);
        !           133: #else
        !           134:        rename(f1, f2);
        !           135: #endif
        !           136:        /* what if it fails??? */
        !           137: }
        !           138: 
        !           139: Visible Procedure f_delete(fname) value fname; {
        !           140:        unlink(strval(fname));
        !           141: }
        !           142: 
        !           143: Visible bool
        !           144: f_exists(file)
        !           145:        string file;
        !           146: {
        !           147:        FILE *f= fopen(file, "r");
        !           148:        if (f==NULL) return No;
        !           149:        fclose(f);
        !           150:        return Yes;
        !           151: }
        !           152: 
        !           153: #ifndef INTEGRATION
        !           154: 
        !           155: Hidden Procedure app_fname(ceos, fname) string ceos; value fname; {
        !           156:        string fp= strval(fname); intlet k, len= strlen(fp);
        !           157:        *ceos++= ' ';
        !           158:        k_Over_len {
        !           159:                *ceos++= '\\';
        !           160:                *ceos++= *fp++; /*should really use charval(thof(...))*/
        !           161:        }
        !           162:        *ceos= '\0';
        !           163: }
        !           164: 
        !           165: #endif
        !           166: 
        !           167: Visible unsigned f_size(ifile) FILE *ifile; {
        !           168:        long size, ftell();
        !           169:        fseek(ifile, 0l, 2);
        !           170:        size= ftell(ifile);
        !           171:        fseek(ifile, 0l, 0); /* rewind */
        !           172:        return size;
        !           173: }
        !           174: 
        !           175: Visible Procedure f_close(ofile) FILE *ofile; {
        !           176:        bool ok= fflush(ofile) != EOF;
        !           177:        if (fclose(ofile) == EOF || !ok)
        !           178:                error(MESS(3203, "write error (disk full?)"));
        !           179: }
        !           180: 
        !           181: Visible bool f_interactive(ifile) FILE *ifile; {
        !           182: #ifdef ISATTY
        !           183:        return isatty(fileno(ifile));
        !           184: #else
        !           185:        return fileno(ifile) < 3;
        !           186: #endif
        !           187: }
        !           188: 
        !           189: #ifdef IBMPC
        !           190: 
        !           191: #define FNMLEN 8
        !           192: #define TYPLEN 3
        !           193: #define SPCLEN 1
        !           194: 
        !           195: #define FHW "how"
        !           196: #define FZR "zer"
        !           197: #define FMN "mon"
        !           198: #define FDY "dya"
        !           199: #define FTR "tar"
        !           200: 
        !           201: Hidden string
        !           202: filetype(type)
        !           203:        literal type;
        !           204: {
        !           205:        switch (type) {
        !           206:                case Zer:       return FZR;
        !           207:                case Mon:       return FMN;
        !           208:                case Dya:       return FDY;
        !           209:                case How:       return FHW;
        !           210:                case Tar:       return FTR;
        !           211:                default:        syserr(MESS(3200, "filetype()"));
        !           212:                                /* NOTREACHED */
        !           213:        }
        !           214: }
        !           215: 
        !           216: Hidden Procedure
        !           217: cr_fname(name, type, fname, len, pname)
        !           218:        value name; string fname, *pname; literal type; int len;
        !           219: {
        !           220:        *pname= fname;
        !           221:        strncpy(*pname, strval(name), len);
        !           222:        sprintf(fname + len, ".%s", filetype(type));
        !           223: }
        !           224: 
        !           225: #endif IBMPC
        !           226: 
        !           227: #ifdef unix
        !           228: 
        !           229: #define FNMLEN 12
        !           230: #define TYPLEN 1
        !           231: #define SPCLEN 0
        !           232: 
        !           233: #define FHW '\''
        !           234: #define FZR '<'
        !           235: #define FMN '"'
        !           236: #define FDY '>'
        !           237: #define FTR '='
        !           238: 
        !           239: Hidden literal
        !           240: filetype(type)
        !           241:        literal type;
        !           242: {
        !           243:        switch (type) {
        !           244:                case Zer:       return FZR;
        !           245:                case Mon:       return FMN;
        !           246:                case Dya:       return FDY;
        !           247:                case How:       return FHW;
        !           248:                case Tar:       return FTR;
        !           249:                default:        syserr(MESS(3201, "filetype()"));
        !           250:                                /* NOTREACHED */
        !           251:        }
        !           252: }
        !           253: 
        !           254: Hidden Procedure
        !           255: cr_fname(name, type, fname, len, pname)
        !           256:        value name; string fname, *pname; literal type; int len;
        !           257: {
        !           258:        *fname= filetype(type);
        !           259:        fname[1]= '\0';
        !           260:        *pname= fname + 1;
        !           261:        strncat(fname, strval(name), len);
        !           262: }
        !           263: 
        !           264: #endif unix
        !           265: 
        !           266: Hidden bool
        !           267: exists(name)
        !           268:        string name;
        !           269: {
        !           270:        value v= mk_text(name);
        !           271:        bool exist= in(v, file_names);
        !           272:        release(v);
        !           273:        return exist;
        !           274: }
        !           275: 
        !           276: Visible value
        !           277: new_fname(name, type)
        !           278:        value name; literal type;
        !           279: {
        !           280:        char fname[FNMLEN + TYPLEN + SPCLEN + 1];
        !           281:        intlet len= length(name);
        !           282:        string pname;
        !           283:        if (len > FNMLEN) len= FNMLEN;
        !           284:        cr_fname(name, type, fname, len, &pname);
        !           285:        while (exists(fname)) new(pname, len-1);
        !           286:        return mk_text(fname);
        !           287: }
        !           288: 
        !           289: #include <ctype.h>
        !           290: 
        !           291: Hidden Procedure
        !           292: new(name, n)
        !           293:        string name; int n;
        !           294: {
        !           295:        if (n < 1) error(MESS(3202, "too many units"));
        !           296:        else if (!isdigit(name[n])) name[n]= '1';
        !           297:        else if (name[n] != '9') ++name[n];
        !           298:        else {
        !           299:                name[n]= '0';
        !           300:                new(name, --n);
        !           301:        }
        !           302: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.