75 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			75 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
/*
 | 
						|
 * Echo command.
 | 
						|
 *
 | 
						|
 * Copyright (C) 1989 by Kenneth Almquist.  All rights reserved.
 | 
						|
 * This file is part of ash, which is distributed under the terms specified
 | 
						|
 * by the Ash General Public License.  See the file named LICENSE.
 | 
						|
 */
 | 
						|
 | 
						|
#define main echocmd
 | 
						|
 | 
						|
#include "bltin.h"
 | 
						|
 | 
						|
#undef eflag
 | 
						|
 | 
						|
 | 
						|
main(argc, argv)  char **argv; {
 | 
						|
      register char **ap;
 | 
						|
      register char *p;
 | 
						|
      register char c;
 | 
						|
      int count;
 | 
						|
      int nflag = 0;
 | 
						|
#ifndef eflag
 | 
						|
      int eflag = 0;
 | 
						|
#endif
 | 
						|
 | 
						|
      ap = argv;
 | 
						|
      if (argc)
 | 
						|
	    ap++;
 | 
						|
      if ((p = *ap) != NULL) {
 | 
						|
	    if (equal(p, "--")) {
 | 
						|
		  ap++;
 | 
						|
	    }
 | 
						|
	    if (equal(p, "-n")) {
 | 
						|
		  nflag++;
 | 
						|
		  ap++;
 | 
						|
	    } else if (equal(p, "-e")) {
 | 
						|
#ifndef eflag
 | 
						|
		  eflag++;
 | 
						|
#endif
 | 
						|
		  ap++;
 | 
						|
	    }
 | 
						|
      }
 | 
						|
      while ((p = *ap++) != NULL) {
 | 
						|
	    while ((c = *p++) != '\0') {
 | 
						|
		  if (c == '\\' && eflag) {
 | 
						|
			switch (*p++) {
 | 
						|
			case 'b':  c = '\b';  break;
 | 
						|
			case 'c':  return 0;		/* exit */
 | 
						|
			case 'f':  c = '\f';  break;
 | 
						|
			case 'n':  c = '\n';  break;
 | 
						|
			case 'r':  c = '\r';  break;
 | 
						|
			case 't':  c = '\t';  break;
 | 
						|
			case 'v':  c = '\v';  break;
 | 
						|
			case '\\':  break;		/* c = '\\' */
 | 
						|
			case '0':
 | 
						|
			      c = 0;
 | 
						|
			      count = 3;
 | 
						|
			      while (--count >= 0 && (unsigned)(*p - '0') < 8)
 | 
						|
				    c = (c << 3) + (*p++ - '0');
 | 
						|
			      break;
 | 
						|
			default:
 | 
						|
			      p--;
 | 
						|
			      break;
 | 
						|
			}
 | 
						|
		  }
 | 
						|
		  putchar(c);
 | 
						|
	    }
 | 
						|
	    if (*ap)
 | 
						|
		  putchar(' ');
 | 
						|
      }
 | 
						|
      if (! nflag)
 | 
						|
	    putchar('\n');
 | 
						|
      return 0;
 | 
						|
}
 |