Annotation of coherent/d/bin/echo.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * echo -- print arguments
                      3:  *
                      4:  * Usage:      echo [ -n ] [ argument ... ]
                      5:  *
                      6:  * Option:     -n      Do not print terminal newline
                      7:  *
                      8:  * Note:       The following C-like escape conventions are usable with
                      9:  *             ECHO; beware of conflicts with the shell's use of \:
                     10:  *                     \b      backspace
                     11:  *                     \c      print line without new-line
                     12:  *                             (same as -n option)
                     13:  *                     \f      form-feed
                     14:  *                     \n      new-line
                     15:  *                     \r      carriage returnm
                     16:  *                     \t      tab
                     17:  *                     \v      vertical tab
                     18:  *                     \\      backslash
                     19:  *                     \0x     where x represents the octal value of an
                     20:  *                             ASCII character
                     21:  *
                     22:  */
                     23: 
                     24: static char    buf[512];                       /* working buffer */
                     25: static char   * bufend = &buf[sizeof buf];     /* pointer to end ogf buf */
                     26: static char   * bufp   = &buf[0];      /* pointer to current offset in buf */
                     27: static char    lastch  = '\n';         /* last output char (if non-zero) */
                     28: static int     asc;                    /* octal value */
                     29: 
                     30: main( argc, argv )
                     31: int    argc;
                     32: register char  ** argv;
                     33: {
                     34:        extern  echos();
                     35: 
                     36:        if ( strcmp( *++argv, "-n" ) == 0 ) {
                     37:                lastch = 0;
                     38:                ++argv;
                     39:        }
                     40: 
                     41:        /*
                     42:         * Read all argument strings into buffer. Separate each argument
                     43:         * with a blank.
                     44:         */
                     45:        while ( *argv ) {
                     46:                echos( *argv );
                     47:                if ( *++argv )
                     48:                        echos( " " );
                     49:        }
                     50: 
                     51:        if ( *bufp = lastch )
                     52:                ++bufp;
                     53: 
                     54:        if ( bufp > buf )
                     55:                write( 1, buf, bufp - buf );
                     56: 
                     57:        exit( 0 );
                     58: }
                     59: 
                     60: /*
                     61:  * static
                     62:  * echos( sp )
                     63:  * char * sp;
                     64:  *
                     65:  *     Input:  sp      - pointer to string to append to output buffer.
                     66:  *
                     67:  *     Action: Transfer string to output buffer at offset specified by 'bufp'.
                     68:  *             If buffer becomes full during transfer, write buffer to stdout,
                     69:  *             and wrap 'bufp' back to beginning of buffer.
                     70:  */
                     71: 
                     72: static
                     73: echos( sp )
                     74: register char  * sp;
                     75: {
                     76:        register char   * dp = bufp;
                     77:        extern char *   getoct();
                     78: 
                     79:        /*
                     80:         * Copy argument to buffer.
                     81:         */
                     82:        for ( ; *sp ; ++sp ) {
                     83:                if ( *sp == '\\' ) {
                     84:                        if ( *++sp == '\0' )
                     85:                                break;
                     86: 
                     87:                        switch (*sp) {
                     88:                        case 'b': *dp = '\b';   break;
                     89:                        case 'f': *dp = '\f';   break;
                     90:                        case 'n': *dp = '\n';   break;
                     91:                        case 'r': *dp = '\r';   break;
                     92:                        case 't': *dp = '\t';   break;
                     93:                        case 'v': *dp = 013;    break;
                     94:                        case 'c': lastch = 0; --dp; break;
                     95:                        case '0': sp  = getoct( ++sp );
                     96:                                  *dp = (char)asc;
                     97:                                  break;
                     98:                        default : *dp = *sp;    break;
                     99:                        }
                    100:                } else
                    101:                        *dp = *sp;
                    102: 
                    103:                /*
                    104:                 * Empty buffer to standard output if full.
                    105:                 */
                    106:                if ( ++dp == bufend ) {
                    107:                        write( 1, buf, sizeof buf );
                    108:                        dp = buf;
                    109:                }
                    110:        }
                    111: 
                    112:        bufp = dp;
                    113: }
                    114: 
                    115: /*
                    116:  * char *
                    117:  * getoct( s )
                    118:  * char * s;
                    119:  *
                    120:  *     Input:  s       - pointer to current offset in string.
                    121:  *
                    122:  *     Action: Read octal value from string ( up to 3 characters ).
                    123:  *
                    124:  *     Return: Pointer to current offset in string.
                    125:  */
                    126: char *
                    127: getoct( s )
                    128: char   * s;
                    129: {
                    130:        int     i;      /* working counter */
                    131: 
                    132:        i   = 0;
                    133:        asc = 0;        /* clear octal value buffer */
                    134: 
                    135:        while ( (*s) && (*s >= '0') && (*s <= '7') && ( i < 3 ) ) {
                    136:                asc = asc * 8 + *s - '0';       /* octal value accumulation */
                    137:                ++s;
                    138:                ++i;
                    139:        }
                    140: 
                    141:        return( --s );
                    142: }

unix.superglobalmegacorp.com

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