Annotation of 43BSD/contrib/jove/fp.c, revision 1.1.1.1

1.1       root        1: /*************************************************************************
                      2:  * This program is copyright (C) 1985, 1986 by Jonathan Payne.  It is    *
                      3:  * provided to you without charge for use only on a licensed Unix        *
                      4:  * system.  You may copy JOVE provided that this notice is included with *
                      5:  * the copy.  You may not sell copies of this program or versions        *
                      6:  * modified for use on microcomputer systems, unless the copies are      *
                      7:  * included with a Unix system distribution and the source is provided.  *
                      8:  *************************************************************************/
                      9: 
                     10: #include "jove.h"
                     11: #include "io.h"
                     12: #include "termcap.h"
                     13: #include <sys/stat.h>
                     14: #include <sys/file.h>
                     15: #include <errno.h>
                     16: 
                     17: #define MAXFILES       20      /* good enough for my purposes */
                     18: 
                     19: static File    _openfiles[MAXFILES] = {0};
                     20: 
                     21: static File *
                     22: f_alloc(name, flags, fd, buffer, buf_size)
                     23: char   *buffer;
                     24: {
                     25:        register File   *fp;
                     26:        register int    i;
                     27: 
                     28:        for (fp = _openfiles, i = 0; i < MAXFILES; i++, fp++)
                     29:                if (fp->f_flags == 0)
                     30:                        break;
                     31:        if (i == MAXFILES)
                     32:                complain("[Too many open files!]");
                     33:        fp->f_bufsize = buf_size;
                     34:        fp->f_cnt = 0;
                     35:        fp->f_fd = fd;
                     36:        fp->f_flags = flags;
                     37:        if (buffer == 0) {
                     38:                buffer = emalloc(buf_size);
                     39:                fp->f_flags |= F_MYBUF;
                     40:        }
                     41:        fp->f_base = fp->f_ptr = buffer;
                     42:        fp->f_name = copystr(name);
                     43: 
                     44:        return fp;
                     45: }
                     46: 
                     47: gc_openfiles()
                     48: {
                     49:        register File   *fp;
                     50: 
                     51:        for (fp = _openfiles; fp < &_openfiles[MAXFILES]; fp++)
                     52:                if (fp->f_flags != 0 && (fp->f_flags & F_LOCK) == 0)
                     53:                        f_close(fp);
                     54: }
                     55: 
                     56: File *
                     57: fd_open(name, flags, fd, buffer, bsize)
                     58: char   *buffer;
                     59: {
                     60:        return f_alloc(name, flags, fd, buffer, bsize);
                     61: }
                     62: 
                     63: File *
                     64: f_open(name, flags, buffer, buf_size)
                     65: char   *name,
                     66:        *buffer;
                     67: {
                     68:        register int    fd;
                     69:        int     mode = F_MODE(flags);
                     70: 
                     71:        if (mode == F_READ)
                     72:                fd = open(name, 0);
                     73:        if (mode == F_APPEND) {
                     74:                fd = open(name, 1);
                     75:                if (fd == -1)
                     76:                        mode = F_WRITE;
                     77:                else
                     78:                        (void) lseek(fd, (long) 0, 2);
                     79:        }
                     80:        if (mode == F_WRITE)
                     81:                fd = creat(name, CreatMode);
                     82:        if (fd == -1)
                     83:                return NIL;
                     84:        return f_alloc(name, flags, fd, buffer, buf_size);
                     85: }
                     86: 
                     87: f_close(fp)
                     88: File   *fp;
                     89: {
                     90:        flush(fp);
                     91: #ifdef BSD4_2 
                     92:        if (fp->f_flags & (F_WRITE|F_APPEND))
                     93:                (void) fsync(fp->f_fd);
                     94: #endif 
                     95:        (void) close(fp->f_fd);
                     96:        if (fp->f_flags & F_MYBUF)
                     97:                free(fp->f_base);
                     98:        free(fp->f_name);
                     99:        fp->f_flags = 0;        /* indicates that we're available */
                    100: }
                    101: 
                    102: filbuf(fp)
                    103: File   *fp;
                    104: {
                    105:        if (fp->f_flags & (F_EOF|F_ERR))
                    106:                return EOF;
                    107:        fp->f_ptr = fp->f_base;
                    108:        fp->f_cnt = read(fp->f_fd, fp->f_base, fp->f_bufsize);
                    109:        if (fp->f_cnt == -1) {
                    110:                printf("[Read error %d]", errno);
                    111:                fp->f_flags |= F_ERR;
                    112:        }
                    113:        if (fp->f_cnt == 0) {
                    114:                fp->f_flags |= F_EOF;
                    115:                return EOF;
                    116:        }
                    117:        io_chars += fp->f_cnt;
                    118:        return getc(fp);
                    119: }
                    120: 
                    121: putstr(s)
                    122: register char  *s;
                    123: {
                    124:        register int    c;
                    125: 
                    126:        while (c = *s++)
                    127:                putchar(c);
                    128: }
                    129: 
                    130: fputnchar(s, n, fp)
                    131: register char  *s;
                    132: register int   n;
                    133: register File  *fp;
                    134: {
                    135:        while (--n >= 0)
                    136:                putc(*s++, fp);
                    137: }
                    138: 
                    139: putnchar(s, n)
                    140: register char  *s;
                    141: register int   n;
                    142: {
                    143:        fputnchar(s, n, stdout);
                    144: }
                    145: 
                    146: flusho()
                    147: {
                    148:        _flush(EOF, stdout);
                    149: }
                    150: 
                    151: flush(fp)
                    152: File   *fp;
                    153: {
                    154:        _flush(EOF, fp);
                    155: }
                    156: 
                    157: _flush(c, fp)
                    158: register File  *fp;
                    159: {
                    160:        register int    n;
                    161: 
                    162:        if ((fp->f_flags & F_READ) ||
                    163:            ((fp->f_flags & F_STRING)))
                    164:                return;
                    165:        if (((n = (fp->f_ptr - fp->f_base)) > 0) &&
                    166:            (write(fp->f_fd, fp->f_base, n) != n) &&
                    167:            (fp != stdout))
                    168:                error("[I/O error(%d); file = %s, fd = %d]",
                    169:                        errno, fp->f_name, fp->f_fd);
                    170: 
                    171:        if (fp == stdout)
                    172:                OkayAbort = YES;
                    173:        fp->f_cnt = fp->f_bufsize;
                    174:        fp->f_ptr = fp->f_base;
                    175:        if (c != EOF)
                    176:                putc(c, fp);
                    177: }
                    178: 
                    179: f_gets(fp, buf, max)
                    180: register File  *fp;
                    181: char   *buf;
                    182: {
                    183:        register char   *cp = buf;
                    184:        register int    c;
                    185:        char    *endp = buf + max - 1;
                    186: 
                    187:        if (fp->f_flags & F_EOF)
                    188:                return EOF;
                    189:        while (((c = getc(fp)) != EOF) && (c != '\n')) {
                    190:                if (c == NULL)
                    191:                        continue;       /* sorry we don't read nulls */
                    192:                if (cp >= endp) {
                    193:                        add_mess(" [Line too long]");
                    194:                        rbell();
                    195:                        return EOF;
                    196:                }
                    197:                *cp++ = c;
                    198:        }
                    199:        *cp = '\0';
                    200:        if (c == EOF) {
                    201:                if (cp != buf)
                    202:                        add_mess(" [Incomplete last line]");
                    203:                fp->f_flags |= F_EOF;
                    204:                return EOF;
                    205:        }
                    206:        io_lines++;
                    207:        return NIL;     /* this means okay */
                    208: }
                    209: 
                    210: /* Deals with output to the terminal, setting up the amount of characters
                    211:    to be buffered depending on the output baud rate.  Why it's in a 
                    212:    separate file I don't know ... */
                    213: 
                    214: static char    one_buf;
                    215: 
                    216: int    BufSize = 1;
                    217: 
                    218: static File    _stdout = {1, 1, 1, F_WRITE, &one_buf, &one_buf};
                    219: File   *stdout = &_stdout;
                    220: 
                    221: /* put a string with padding */
                    222: 
                    223: tputc(c)
                    224: {
                    225:        putchar(c);
                    226: }
                    227: 
                    228: #undef putchar         /* for files which forget to include io.h,
                    229:                           here's a real putchar procedure. */
                    230: putchar(c)
                    231: {
                    232:        putc(c, stdout);
                    233: }
                    234: 
                    235: putpad(str, lines)
                    236: char   *str;
                    237: {
                    238:        if (str)
                    239:                tputs(str, lines, tputc);
                    240: }
                    241: 
                    242: /* Determine the number of characters to buffer at each baud rate.  The
                    243:    lower the number, the quicker the response when new input arrives.  Of
                    244:    course the lower the number, the more prone the program is to stop in
                    245:    output.  Decide what matters most to you. This sets BufSize to the right
                    246:    number or chars, and initiaizes `stdout'.  */
                    247: 
                    248: settout(ttbuf)
                    249: char   *ttbuf;
                    250: {
                    251:        static int speeds[] = {
                    252:                1,      /* 0    */
                    253:                1,      /* 50   */
                    254:                1,      /* 75   */
                    255:                1,      /* 110  */
                    256:                1,      /* 134  */
                    257:                1,      /* 150  */
                    258:                1,      /* 200  */
                    259:                2,      /* 300  */
                    260:                4,      /* 600  */
                    261:                8,      /* 1200 */
                    262:                16,     /* 1800 */
                    263:                32,     /* 2400 */
                    264:                128,    /* 4800 */
                    265:                256,    /* 9600 */
                    266:                512,    /* EXTA */
                    267:                512     /* EXT  */
                    268:        };
                    269:        BufSize = min(512, (speeds[ospeed] * max(LI / 24, 1)));
                    270:        stdout = fd_open("/dev/tty", F_WRITE|F_LOCK, 1, ttbuf, BufSize);
                    271: }
                    272: 

unix.superglobalmegacorp.com

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