master xplshn/aruu / cmd / posix / sh / echo.c
  1/*-
  2 * SPDX-License-Identifier: BSD-3-Clause
  3 *
  4 * Copyright (c) 1991, 1993
  5 *	The Regents of the University of California.  All rights reserved.
  6 *
  7 * This code is derived from software contributed to Berkeley by
  8 * Kenneth Almquist.
  9 *
 10 * Redistribution and use in source and binary forms, with or without
 11 * modification, are permitted provided that the following conditions
 12 * are met:
 13 * 1. Redistributions of source code must retain the above copyright
 14 *    notice, this list of conditions and the following disclaimer.
 15 * 2. Redistributions in binary form must reproduce the above copyright
 16 *    notice, this list of conditions and the following disclaimer in the
 17 *    documentation and/or other materials provided with the distribution.
 18 * 3. Neither the name of the University nor the names of its contributors
 19 *    may be used to endorse or promote products derived from this software
 20 *    without specific prior written permission.
 21 *
 22 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
 23 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 24 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 25 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
 26 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 27 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 28 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 29 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 30 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 31 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 32 * SUCH DAMAGE.
 33 */
 34
 35#include "bltin.h"
 36
 37/*
 38 * Echo command.
 39 */
 40
 41#define main echocmd
 42
 43/* #define eflag 1 */
 44
 45int
 46main(int argc, char *argv[])
 47{
 48  char **ap;
 49  char  *p;
 50  char   c;
 51  int    count;
 52  int    nflag = 0;
 53#ifndef eflag
 54  int eflag = 0;
 55#endif
 56
 57  ap = argv;
 58  if (argc)
 59    ap++;
 60  if ((p = *ap) != NULL) {
 61    if (equal(p, "-n")) {
 62      nflag++;
 63      ap++;
 64    } else if (equal(p, "-e")) {
 65#ifndef eflag
 66      eflag++;
 67#endif
 68      ap++;
 69    }
 70  }
 71  while ((p = *ap++) != NULL) {
 72    while ((c = *p++) != '\0') {
 73      if (c == '\\' && eflag) {
 74        switch (*p++) {
 75          case 'a':
 76            c = '\a';
 77            break;
 78          case 'b':
 79            c = '\b';
 80            break;
 81          case 'c':
 82            return 0; /* exit */
 83          case 'e':
 84            c = '\033';
 85            break;
 86          case 'f':
 87            c = '\f';
 88            break;
 89          case 'n':
 90            c = '\n';
 91            break;
 92          case 'r':
 93            c = '\r';
 94            break;
 95          case 't':
 96            c = '\t';
 97            break;
 98          case 'v':
 99            c = '\v';
100            break;
101          case '\\':
102            break; /* c = '\\' */
103          case '0':
104            c     = 0;
105            count = 3;
106            while (--count >= 0 && (unsigned)(*p - '0') < 8)
107              c = (c << 3) + (*p++ - '0');
108            break;
109          default:
110            p--;
111            break;
112        }
113      }
114      putchar(c);
115    }
116    if (*ap)
117      putchar(' ');
118  }
119  if (!nflag)
120    putchar('\n');
121  return 0;
122}