Annotation of 43BSD/lib/libc/vax/stdio/puts.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 "@(#)puts.c     5.4 (Berkeley) 4/1/86"
                      9: #endif LIBC_SCCS
                     10: 
                     11: /*
                     12:  * puts(s);
                     13:  * char *s;
                     14:  *
                     15:  * argument: a source string.
                     16:  * side effects: writes to the standard output using the data in
                     17:  *     the null-terminated source string; a newline is appended.
                     18:  * result: technically void; for compatibility we return 0 for the null
                     19:  *     string, non-zero otherwise.  We return zero for errors too.
                     20:  */
                     21: 
                     22: #include "DEFS.h"
                     23: 
                     24: #define                NBF     04
                     25: #define                LBF     0200
                     26: 
                     27: #define                NL      012
                     28: 
                     29: ENTRY(puts, R11|R10|R9)
                     30: 
                     31: #define                S       r11
                     32:        movl    4(ap),S
                     33: #define                IOP     r10
                     34: #define                _CNT
                     35: #define                _PTR    4
                     36: #define                _BASE   8
                     37: #define                _BUFSIZ 12
                     38: #define                _FLAG   16
                     39:        movab   __iob+20,IOP
                     40: 
                     41: #define                UNBUF   -4(fp)
                     42: 
                     43: #define                COUNT   r9
                     44: 
                     45:        /*
                     46:         * For unbuffered I/O, line buffer the output line.
                     47:         * Ugly but fast -- and doesn't CURRENTLY break anything (sigh).
                     48:         */
                     49:        movab   -1028(sp),sp
                     50:        bicw3   $~NBF,_FLAG(IOP),UNBUF
                     51:        jeql    1f
                     52: 
                     53:        bicw2   $NBF,_FLAG(IOP)         /* Clear no-buffering flag */
                     54:        movl    sp,_BASE(IOP)           /* Create a buffer */
                     55:        movl    sp,_PTR(IOP)
                     56:        cvtwl   $1024,_BUFSIZ(IOP)
                     57:        jbr     2f
                     58: 
                     59: 1:
                     60:        tstl    _CNT(IOP)               /* Has a buffer been allocated? */
                     61:        jgtr    2f
                     62:        pushl   IOP                     /* Get _flsbuf() to make one */
                     63:        pushl   $0
                     64:        calls   $2,__flsbuf
                     65:        tstl    r0
                     66:        jlss    Lerror
                     67:        incl    _CNT(IOP)               /* Unput the char we sent */
                     68:        decl    _PTR(IOP)
                     69: 2:
                     70: 
                     71:        /*
                     72:         * Search for the terminating null.
                     73:         */
                     74: Lloop:
                     75:        addl3   _BASE(IOP),_BUFSIZ(IOP),COUNT   /* How many bytes? */
                     76:        subl2   _PTR(IOP),COUNT
                     77:        locc    $0,COUNT,(S)            /* Look for a null */
                     78:        jeql    Lagain
                     79: 
                     80:        subl2   r0,COUNT                /* Copy the data */
                     81:        movc3   COUNT,(S),*_PTR(IOP)
                     82:        movl    r3,_PTR(IOP)            /* Fix up IOP */
                     83:        subl2   COUNT,_CNT(IOP)
                     84: 
                     85: Lnl:
                     86:        movb    $NL,*_PTR(IOP)          /* Append a newline */
                     87:        incl    _PTR(IOP)
                     88:        decl    _CNT(IOP)
                     89: 
                     90:        bitw    $LBF,_FLAG(IOP)         /* If line buffered... */
                     91:        jneq    1f
                     92:        tstw    UNBUF                   /* or unbuffered... */
                     93:        jneq    1f
                     94:        tstl    _CNT(IOP)               /* or a full buffer... */
                     95:        jgtr    2f
                     96: 1:
                     97:        pushl   IOP                     /* ... flush the buffer */
                     98:        calls   $1,_fflush
                     99:        tstl    r0
                    100:        jlss    Lerror
                    101: 2:
                    102: 
                    103:        /*
                    104:         * Fix up buffering again.
                    105:         */
                    106:        tstw    UNBUF
                    107:        jeql    1f
                    108:        bisw2   $NBF,_FLAG(IOP)         /* Reset flag */
                    109:        clrl    _BASE(IOP)              /* Clear data structure */
                    110:        clrl    _BUFSIZ(IOP)
                    111:        clrl    _CNT(IOP)
                    112: 1:
                    113:        cvtbl   $NL,r0                  /* Compatibility hack */
                    114:        ret
                    115: 
                    116:        /*
                    117:         * We didn't find the null -- loop.
                    118:         */
                    119: Lagain:
                    120:        movc3   COUNT,(S),*_PTR(IOP)    /* Copy the data */
                    121:        movl    r1,S
                    122:        movl    r3,_PTR(IOP)            /* Fix up IOP */
                    123:        subl2   COUNT,_CNT(IOP)
                    124:        pushl   IOP                     /* The buffer is full -- flush it */
                    125:        calls   $1,_fflush
                    126:        tstl    r0
                    127:        jlss    Lerror
                    128:        tstb    (S)                     /* More data? */
                    129:        jneq    Lloop
                    130:        jbr     Lnl
                    131: 
                    132:        /*
                    133:         * Bomb out.  Return 0 (why not? that's what the old one did).
                    134:         */
                    135: Lerror:
                    136:        clrl    r0
                    137:        ret

unix.superglobalmegacorp.com

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