Home | History | Annotate | Line # | Download | only in libsa
gets.c revision 1.2
      1 /*	$NetBSD: gets.c,v 1.2 2003/08/07 16:30:00 agc Exp $	*/
      2 
      3 /*-
      4  * Copyright (c) 1993
      5  *	The Regents of the University of California.  All rights reserved.
      6  *
      7  * Redistribution and use in source and binary forms, with or without
      8  * modification, are permitted provided that the following conditions
      9  * are met:
     10  * 1. Redistributions of source code must retain the above copyright
     11  *    notice, this list of conditions and the following disclaimer.
     12  * 2. Redistributions in binary form must reproduce the above copyright
     13  *    notice, this list of conditions and the following disclaimer in the
     14  *    documentation and/or other materials provided with the distribution.
     15  * 3. Neither the name of the University nor the names of its contributors
     16  *    may be used to endorse or promote products derived from this software
     17  *    without specific prior written permission.
     18  *
     19  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
     20  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     21  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     22  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
     23  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     24  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     25  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     26  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
     27  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
     28  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     29  * SUCH DAMAGE.
     30  *
     31  *	@(#)gets.c	8.1 (Berkeley) 6/11/93
     32  */
     33 
     34 #include "stand.h"
     35 
     36 /*
     37  * This implementation assumes that getchar() does echo, because
     38  * on some machines, it is hard to keep echo from being done.
     39  * Those that need it can do echo in their getchar() function.
     40  *
     41  * Yes, the code below will echo CR, DEL, and other control chars,
     42  * but sending CR or DEL here is harmless.  All the other editing
     43  * characters will be followed by a newline, so it doesn't matter.
     44  * (Most terminals will not show them anyway.)
     45  */
     46 
     47 void
     48 gets(buf)
     49 	char *buf;
     50 {
     51 	register int c;
     52 	register char *lp;
     53 
     54 top:
     55 	lp = buf;
     56 
     57 	for (;;) {
     58 		c = getchar() & 0177;
     59 
     60 #ifdef	GETS_MUST_ECHO	/* Preserved in case someone wants it... */
     61 		putchar(c);
     62 #endif
     63 
     64 		switch (c) {
     65 
     66 		default:
     67 			*lp++ = c;
     68 			continue;
     69 
     70 		case '\177':
     71 			putchar('\b');
     72 			/* fall through */
     73 		case '\b':
     74 			putchar(' ');
     75 			putchar('\b');
     76 			/* fall through */
     77 		case '#':
     78 			if (lp > buf)
     79 				lp--;
     80 			continue;
     81 
     82 #ifdef	GETS_REPRINT
     83 		/*
     84 		 * This is not very useful in a boot program.
     85 		 * (It costs you 52 bytes on m68k, gcc -O3).
     86 		 */
     87 		case 'r'&037: {
     88 			register char *p;
     89 			putchar('\n');
     90 			for (p = buf; p < lp; ++p)
     91 				putchar(*p);
     92 			continue;
     93 		}
     94 #endif
     95 
     96 		case '@':
     97 		case 'u'&037:
     98 		case 'w'&037:
     99 			putchar('\n');
    100 			goto top;
    101 
    102 		case '\r':
    103 			putchar('\n');
    104 			/* fall through */
    105 		case '\n':
    106 			*lp = '\0';
    107 			return;
    108 
    109 		} /* switch */
    110 	}
    111 	/*NOTREACHED*/
    112 }
    113