Annotation of 43BSDTahoe/new/jove/fp.c, revision 1.1

1.1     ! root        1: /***************************************************************************
        !             2:  * This program is Copyright (C) 1986, 1987, 1988 by Jonathan Payne.  JOVE *
        !             3:  * is provided to you without charge, and with no warranty.  You may give  *
        !             4:  * away copies of JOVE, including sources, provided that this notice is    *
        !             5:  * included in all the files.                                              *
        !             6:  ***************************************************************************/
        !             7: 
        !             8: #include "jove.h"
        !             9: #include "io.h"
        !            10: #include "ctype.h"
        !            11: #include "termcap.h"
        !            12: 
        !            13: #ifdef MAC
        !            14: #      include "mac.h"
        !            15: #else
        !            16: #      include <sys/stat.h>
        !            17: #      ifndef MSDOS
        !            18: #              include <sys/file.h>
        !            19: #      else /* MSDOS */
        !            20: #              include <fcntl.h>
        !            21: #              include <io.h>
        !            22: #      endif /* MSDOS */
        !            23: #endif /* MAC */
        !            24: 
        !            25: #include <errno.h>
        !            26: 
        !            27: #ifdef MAC
        !            28: #      undef private
        !            29: #      define private
        !            30: #endif
        !            31: 
        !            32: #ifdef LINT_ARGS
        !            33: private File * f_alloc(char *, int, int, char *, int);
        !            34: #ifdef RAINBOW
        !            35: private int rbwrite(int, char *, int);
        !            36: #endif
        !            37: #else
        !            38: private File * f_alloc();
        !            39: #ifdef RAINBOW
        !            40: private int rbwrite();
        !            41: #endif
        !            42: #endif /* LINT_ARGS */
        !            43: 
        !            44: #ifdef MAC
        !            45: #      undef private
        !            46: #      define private static
        !            47: #endif
        !            48: 
        !            49: #ifndef L_SET
        !            50: #      define L_SET 0
        !            51: #endif
        !            52: 
        !            53: #define MAXFILES       20      /* good enough for my purposes */
        !            54: 
        !            55: private File   _openfiles[MAXFILES] = {0};
        !            56: 
        !            57: private File *
        !            58: f_alloc(name, flags, fd, buffer, buf_size)
        !            59: char   *name,
        !            60:        *buffer;
        !            61: {
        !            62:        register File   *fp;
        !            63:        register int    i;
        !            64: 
        !            65:        for (fp = _openfiles, i = 0; i < MAXFILES; i++, fp++)
        !            66:                if (fp->f_flags == 0)
        !            67:                        break;
        !            68:        if (i == MAXFILES)
        !            69:                complain("[Too many open files!]");
        !            70:        fp->f_bufsize = buf_size;
        !            71:        fp->f_cnt = 0;
        !            72:        fp->f_fd = fd;
        !            73:        fp->f_flags = flags;
        !            74:        if (buffer == 0) {
        !            75:                buffer = emalloc(buf_size);
        !            76:                fp->f_flags |= F_MYBUF;
        !            77:        }
        !            78:        fp->f_base = fp->f_ptr = buffer;
        !            79:        fp->f_name = copystr(name);
        !            80: 
        !            81:        return fp;
        !            82: }
        !            83: 
        !            84: void
        !            85: gc_openfiles()
        !            86: {
        !            87:        register File   *fp;
        !            88: 
        !            89:        for (fp = _openfiles; fp < &_openfiles[MAXFILES]; fp++)
        !            90:                if (fp->f_flags != 0 && (fp->f_flags & F_LOCKED) == 0)
        !            91:                        f_close(fp);
        !            92: }
        !            93: 
        !            94: File *
        !            95: fd_open(name, flags, fd, buffer, bsize)
        !            96: char   *name,
        !            97:        *buffer;
        !            98: {
        !            99:        return f_alloc(name, flags, fd, buffer, bsize);
        !           100: }
        !           101: 
        !           102: File *
        !           103: f_open(name, flags, buffer, buf_size)
        !           104: char   *name,
        !           105:        *buffer;
        !           106: {
        !           107:        register int    fd;
        !           108:        int     mode = F_MODE(flags);
        !           109: 
        !           110:        if (mode == F_READ)
        !           111:                fd = open(name, 0);
        !           112:        if (mode == F_APPEND) {
        !           113:                fd = open(name, 1);
        !           114:                if (fd == -1)
        !           115:                        mode = F_WRITE;
        !           116:                else
        !           117:                        (void) lseek(fd, 0L, 2);
        !           118:        }
        !           119:        if (mode == F_WRITE)
        !           120:                fd = creat(name, CreatMode);
        !           121:        if (fd == -1)
        !           122:                return NIL;
        !           123: #ifdef MSDOS
        !           124:        else
        !           125:                setmode(fd, 0x8000);
        !           126: #endif /* MSDOS */
        !           127:        return f_alloc(name, flags, fd, buffer, buf_size);
        !           128: }
        !           129: 
        !           130: void
        !           131: f_close(fp)
        !           132: File   *fp;
        !           133: {
        !           134:        flush(fp);
        !           135: #ifdef BSD4_2 
        !           136:        if (fp->f_flags & (F_WRITE|F_APPEND))
        !           137:                (void) fsync(fp->f_fd);
        !           138: #endif 
        !           139:        (void) close(fp->f_fd);
        !           140:        if (fp->f_flags & F_MYBUF)
        !           141:                free(fp->f_base);
        !           142:        free(fp->f_name);
        !           143:        fp->f_flags = 0;        /* indicates that we're available */
        !           144: }
        !           145: 
        !           146: int
        !           147: filbuf(fp)
        !           148: File   *fp;
        !           149: {
        !           150:        if (fp->f_flags & (F_EOF|F_ERR))
        !           151:                return EOF;
        !           152:        fp->f_ptr = fp->f_base;
        !           153: #ifndef MSDOS
        !           154:        do
        !           155: #endif /* MSDOS */
        !           156:                fp->f_cnt = read(fp->f_fd, fp->f_base, fp->f_bufsize);
        !           157: #ifndef MSDOS
        !           158:        while (fp->f_cnt == -1 && errno == EINTR);
        !           159: #endif /* MSDOS */
        !           160:        if (fp->f_cnt == -1) {
        !           161:                printf("[Read error %d]", errno);
        !           162:                fp->f_flags |= F_ERR;
        !           163:        }
        !           164:        if (fp->f_cnt == 0) {
        !           165:                fp->f_flags |= F_EOF;
        !           166:                return EOF;
        !           167:        }
        !           168:        io_chars += fp->f_cnt;
        !           169:        return getc(fp);
        !           170: }
        !           171: 
        !           172: void
        !           173: putstr(s)
        !           174: register char  *s;
        !           175: {
        !           176: #ifndef IBMPC
        !           177:        register int    c;
        !           178: 
        !           179:        while (c = *s++)
        !           180:                putchar(c);
        !           181: #else /* IBMPC */
        !           182:        write_emif(s);
        !           183: #endif /* IBMPC */
        !           184: }
        !           185: 
        !           186: void
        !           187: fputnchar(s, n, fp)
        !           188: register char  *s;
        !           189: register int   n;
        !           190: register File  *fp;
        !           191: {
        !           192:        while (--n >= 0)
        !           193:                putc(*s++, fp);
        !           194: }
        !           195: 
        !           196: void
        !           197: flusho()
        !           198: {
        !           199: #ifndef IBMPC
        !           200:        _flush(EOF, stdout);
        !           201: #endif /* IBMPC */
        !           202: }
        !           203: 
        !           204: void
        !           205: flush(fp)
        !           206: File   *fp;
        !           207: {
        !           208:        _flush(EOF, fp);
        !           209: }
        !           210: 
        !           211: void
        !           212: f_seek(fp, offset)
        !           213: register File  *fp;
        !           214: off_t  offset;
        !           215: {
        !           216:        if (fp->f_flags & F_WRITE)
        !           217:                flush(fp);
        !           218:        fp->f_cnt = 0;          /* next read will filbuf(), next write
        !           219:                                   will flush() with no bad effects */
        !           220:        lseek(fp->f_fd, (long) offset, L_SET);
        !           221: }
        !           222: 
        !           223: int            /* is void - but for lints sake */
        !           224: _flush(c, fp)
        !           225: register File  *fp;
        !           226: {
        !           227:        register int    n;
        !           228: 
        !           229:        if (fp->f_flags & (F_READ | F_STRING | F_ERR))
        !           230:                return EOF;
        !           231:        if (((n = (fp->f_ptr - fp->f_base)) > 0) &&
        !           232: #ifndef RAINBOW
        !           233:            (write(fp->f_fd, fp->f_base, n) != n) &&
        !           234: #else
        !           235:            (rbwrite(fp->f_fd, fp->f_base, n) != n) &&
        !           236: #endif
        !           237:            (fp != stdout)) {
        !           238:                fp->f_flags |= F_ERR;
        !           239:                error("[I/O error(%d); file = %s, fd = %d]",
        !           240:                        errno, fp->f_name, fp->f_fd);
        !           241:        }
        !           242: 
        !           243:        fp->f_cnt = fp->f_bufsize;
        !           244:        fp->f_ptr = fp->f_base;
        !           245:        if (c != EOF)
        !           246:                return putc(c, fp);
        !           247: }
        !           248: 
        !           249: int
        !           250: f_gets(fp, buf, max)
        !           251: register File  *fp;
        !           252: char   *buf;
        !           253: {
        !           254:        register char   *cp = buf;
        !           255:        register int    c;
        !           256:        char    *endp = buf + max - 1;
        !           257: 
        !           258:        if (fp->f_flags & F_EOF)
        !           259:                return EOF;
        !           260:        while (((c = getc(fp)) != EOF) && (c != '\n')) {
        !           261:                if (c == '\0')  /* possibly different from NULL */
        !           262:                        break;          /* sorry we don't read nulls */
        !           263: #ifdef MSDOS
        !           264:                if (c == '\r') {
        !           265:                        if ((c = getc(fp)) == '\n')
        !           266:                           break;
        !           267:                        else
        !           268:                           *cp++ = '\r';
        !           269:                }
        !           270: #endif /* MSDOS */
        !           271:                if (cp >= endp) {
        !           272:                        add_mess(" [Line too long]");
        !           273:                        rbell();
        !           274:                        return EOF;
        !           275:                }
        !           276:                *cp++ = c;
        !           277:        }
        !           278:        *cp = '\0';
        !           279:        if (c == EOF) {
        !           280:                if (cp != buf)
        !           281:                        add_mess(" [Incomplete last line]");
        !           282:                fp->f_flags |= F_EOF;
        !           283:                return EOF;
        !           284:        }
        !           285:        io_lines += 1;
        !           286:        return 0;       /* this means okay */
        !           287: }
        !           288: 
        !           289: /* skip to beginning of next line, i.e., next read returns first
        !           290:    character of new line */
        !           291: 
        !           292: void
        !           293: f_toNL(fp)
        !           294: register File  *fp;
        !           295: {
        !           296:        register int    c;
        !           297: 
        !           298:        if (fp->f_flags & F_EOF)
        !           299:                return;
        !           300:        while (((c = getc(fp)) != EOF) && (c != '\n'))
        !           301:                ;
        !           302:        if (c == EOF)
        !           303:                fp->f_flags |= F_EOF;
        !           304: }
        !           305: 
        !           306: void
        !           307: f_readn(fp, addr, n)
        !           308: register File  *fp;
        !           309: register char  *addr;
        !           310: register int   n;
        !           311: {
        !           312:        while (--n >= 0)
        !           313:                *addr++ = getc(fp);
        !           314: }
        !           315: 
        !           316: int
        !           317: f_getint(fp)
        !           318: File   *fp;
        !           319: {
        !           320:        int     n = 0,
        !           321:                c;
        !           322: 
        !           323:        while (isdigit(c = getc(fp)))
        !           324:                n = (n * 10) + c;
        !           325:        return n;
        !           326: }
        !           327: 
        !           328: /* Deals with output to the terminal, setting up the amount of characters
        !           329:    to be buffered depending on the output baud rate.  Why it's in a 
        !           330:    separate file I don't know ... */
        !           331: 
        !           332: private char   one_buf;
        !           333: 
        !           334: int    BufSize = 1;
        !           335: 
        !           336: private File   _stdout = {1, 1, 1, F_WRITE, &one_buf, &one_buf};
        !           337: File   *stdout = &_stdout;
        !           338: 
        !           339: /* put a string with padding */
        !           340: 
        !           341: #ifndef IBMPC
        !           342: void
        !           343: tputc(c)
        !           344: {
        !           345:        putchar(c);
        !           346: }
        !           347: 
        !           348: #undef putchar         /* for files which forget to include io.h,
        !           349:                                           here's a real putchar procedure. */
        !           350: void
        !           351: putchar(c)
        !           352: {
        !           353:        putc(c, stdout);
        !           354: }
        !           355: 
        !           356: #endif /* IBMPC */
        !           357: #ifndef MAC
        !           358: void
        !           359: putpad(str, lines)
        !           360: char   *str;
        !           361: {
        !           362: #ifndef IBMPC
        !           363:        if (str)
        !           364:                tputs(str, lines, tputc);
        !           365: #else /* IBMPC */
        !           366:        write_emif(str);
        !           367: #endif /* IBMPC */
        !           368: }
        !           369: #endif
        !           370: 
        !           371: /* Determine the number of characters to buffer at each baud rate.  The
        !           372:    lower the number, the quicker the response when new input arrives.  Of
        !           373:    course the lower the number, the more prone the program is to stop in
        !           374:    output.  Decide what matters most to you. This sets BufSize to the right
        !           375:    number or chars, and initiaizes `stdout'.  */
        !           376: 
        !           377: void
        !           378: settout(ttbuf)
        !           379: char   *ttbuf;
        !           380: {
        !           381: #ifndef MAC
        !           382: #ifndef MSDOS
        !           383:        static int speeds[] = {
        !           384:                1,      /* 0    */
        !           385:                1,      /* 50   */
        !           386:                1,      /* 75   */
        !           387:                1,      /* 110  */
        !           388:                1,      /* 134  */
        !           389:                1,      /* 150  */
        !           390:                1,      /* 200  */
        !           391:                2,      /* 300  */
        !           392:                4,      /* 600  */
        !           393:                8,      /* 1200 */
        !           394:                16,     /* 1800 */
        !           395:                32,     /* 2400 */
        !           396:                128,    /* 4800 */
        !           397:                256,    /* 9600 */
        !           398:                512,    /* EXTA */
        !           399:                1024    /* EXT  */
        !           400:        };
        !           401:        flusho();               /* flush the one character buffer */
        !           402:        BufSize = min(MAXTTYBUF, speeds[ospeed] * max(LI / 24, 1));
        !           403:        stdout = fd_open("/dev/tty", F_WRITE|F_LOCKED, 1, ttbuf, BufSize);
        !           404: #else /* MSDOS */
        !           405: #ifndef IBMPC
        !           406:        flusho();               /* flush the one character buffer */
        !           407:        BufSize = BUFSIZ; 
        !           408:        stdout = fd_open("con", F_WRITE|F_LOCKED, 1, ttbuf, BufSize);
        !           409: #endif /* IBMPC */
        !           410: #endif /* MSDOS */
        !           411: #endif /* MAC */
        !           412: }
        !           413: 
        !           414: #ifdef RAINBOW
        !           415: 
        !           416: /*
        !           417:  * use the Rainbow's video output function
        !           418:  */
        !           419: 
        !           420: #include <dos.h>
        !           421: 
        !           422: private int
        !           423: rbwrite(fd, buf, cnt)
        !           424: char *buf;
        !           425: {
        !           426:        union REGS vr;
        !           427: 
        !           428:        if (fd != 1) {
        !           429:                write(fd, buf, cnt);
        !           430:        } else {
        !           431:                while (cnt-- > 0) {
        !           432:                        vr.x.ax = *buf++;
        !           433:                        vr.x.di = 0;
        !           434:                        int86(0x18, &vr, &vr);
        !           435:                }
        !           436:        }
        !           437: }
        !           438: #endif /* RAINBOW */

unix.superglobalmegacorp.com

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