Annotation of 43BSD/lib/libc/vax/stdio/gets.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * Copyright (c) 1985 Regents of the University of California.
                      3:  * All rights reserved.  The Berkeley software License Agreement
                      4:  * specifies the terms and conditions for redistribution.
                      5:  */
                      6: 
                      7: #ifdef LIBC_SCCS
                      8: _sccsid:.asciz "@(#)gets.c     5.2 (Berkeley) 3/9/86"
                      9: #endif LIBC_SCCS
                     10: 
                     11: /*
                     12:  * char *gets(s);
                     13:  * char *s;
                     14:  *
                     15:  * argument: a target string
                     16:  * side effects: reads bytes up to and including a newline from the
                     17:  *     standard input into the target string and replaces the newline
                     18:  *     with a null to null-terminate the string.
                     19:  * result: the target string if successful, 0 otherwise.
                     20:  */
                     21: 
                     22: #include "DEFS.h"
                     23: 
                     24: #define                NL      0xa
                     25: 
                     26: ENTRY(gets, R11|R10)
                     27: 
                     28: #define                S       r11
                     29:        movl    4(ap),S
                     30: #define                IPTR    r10
                     31: #define                _CNT
                     32: #define                _PTR    4
                     33: #define                _BASE   8
                     34: #define                _BUFSIZ 12
                     35: #define                _FLAG   16
                     36:        movab   __iob,IPTR
                     37: 
                     38: #define                OLD_S   4(ap)
                     39: 
                     40:        /*
                     41:         * If no characters, call _filbuf() to get some.
                     42:         */
                     43:        tstl    _CNT(IPTR)
                     44:        jgtr    Lscan
                     45: 
                     46: Lloop:
                     47:        pushl   IPTR
                     48:        calls   $1,__filbuf
                     49:        tstl    r0                      /* What did _filbuf() return? */
                     50:        jlss    Leof
                     51:        cmpb    r0,$NL
                     52:        jneq    1f
                     53:        clrb    (S)
                     54:        jbr     Lret
                     55: 1:
                     56:        movb    r0,(S)+                 /* Save the returned character */
                     57:        tstl    _BASE(IPTR)             /* Is input buffered? */
                     58:        jeql    Lloop
                     59: 
                     60:        /*
                     61:         * Look for a newline in the buffer.
                     62:         */
                     63: Lscan:
                     64:        locc    $NL,_CNT(IPTR),*_PTR(IPTR)
                     65:        jeql    Lagain
                     66: 
                     67:        /*
                     68:         * Success -- copy the data and return.
                     69:         */
                     70:        subl3   r0,_CNT(IPTR),r2
                     71:        subl2   r2,_CNT(IPTR)
                     72:        movc3   r2,*_PTR(IPTR),(S)      /* Copy the data */
                     73:        clrb    (r3)
                     74:        movl    r1,_PTR(IPTR)
                     75:        decl    _CNT(IPTR)              /* Skip the newline */
                     76:        incl    _PTR(IPTR)
                     77: 
                     78:        /*
                     79:         * Normal return.
                     80:         */
                     81: Lret:
                     82:        movl    OLD_S,r0
                     83:        ret
                     84: 
                     85:        /*
                     86:         * If we run out of characters, copy the buffer and loop.
                     87:         */
                     88: Lagain:
                     89:        movc3   _CNT(IPTR),*_PTR(IPTR),(S)      /* Copy the data */
                     90:        movl    r3,S
                     91:        movl    _BASE(IPTR),_PTR(IPTR)          /* Reset stdio */
                     92:        clrl    _CNT(IPTR)
                     93:        jbr     Lloop
                     94: 
                     95:        /*
                     96:         * End of file?  Check to see if we copied any data.
                     97:         */
                     98: Leof:
                     99:        cmpl    S,OLD_S
                    100:        jeql    Lerror
                    101:        clrb    (S)
                    102:        jbr     Lret
                    103: 
                    104:        /*
                    105:         * Error/eof return -- null pointer.
                    106:         */
                    107: Lerror:
                    108:        clrl    r0
                    109:        ret

unix.superglobalmegacorp.com

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