perl 4.0 patch 25: patch #20, continued
[p5sagit/p5-mst-13.2.git] / atarist / echo.c
1 /*
2  * echo args, globbing is necessary.
3  * usage:
4  *      echo [-n] [args ...]
5  * \n \r \b \c \v \\ \f \t \NNN escapes supported
6  * -n and \c mean dont echo the final newline.
7  *
8  * ++jrb  bammi@cadence.com
9  */
10
11 #include <stdio.h>
12
13 #if __STDC__
14 # include <compiler.h>
15 #else
16 # define __PROTO(X) ()
17 #endif
18
19 char    **glob __PROTO((char *patt, int decend_dir));
20 int     contains_wild __PROTO((char *patt));
21 void    free_all __PROTO((void));
22
23
24 int final_newline = 1; /* turned off by -n or \c */
25
26 int main(argc, argv)
27 int argc;
28 char **argv;
29 {
30     --argc; ++argv;
31     if((*argv)[0] == '-')
32     {
33         if ((*argv)[1] == 'n')
34             final_newline = 0;
35         else
36         {
37             fputs("usage: echo [-n] [arguement ... ]\n", stderr);
38             return 1;
39         }
40         --argc; ++argv;
41     }
42
43     while(argc--)
44     {
45         char *word = *argv;
46         char **list;
47
48         if(contains_wild(word) && (list = glob(word, 0)))
49         {
50             while(*list)
51             {
52                 fputs(*list, stdout);
53                 if(*++list) putchar(' ');
54             }
55             free_all();
56         }
57         else
58         {
59             char c;
60             for(c = *word; c; c = (*word)? *++word : 0)
61             {
62                 if(c != '\\')
63                     putchar(c);
64                 else
65                 {
66                     switch(*++word)
67                     {
68                         case 'b':  putchar('\b'); break;
69                         case 'f':  putchar('\f'); break;
70                         case 'n':  putchar('\n'); break;
71                         case 'r':  putchar('\r'); break;
72                         case 't':  putchar('\t'); break;
73                         case 'v':  putchar('\v'); break;
74                         case '\\': putchar('\\'); break;
75                         case 'c':  final_newline = 0; break;
76                         default:   putchar(*word); /* ?? */
77                         case '0':
78                         {
79                             int n = 0;
80                             for(c = *++word; (c >= '0') && (c <= '7'); c = *++word)
81                                 n = (n << 3) + (c - '0');
82                             putchar(n);
83                         }
84                     }
85                 }
86             }
87         }
88         if(*++argv) putchar(' ');
89     }
90     if(final_newline) putchar('\n');
91     return 0;
92 }
93
94                                   
95         
96         
97         
98