perl 5.0 alpha 9
[p5sagit/p5-mst-13.2.git] / atarist / echo.c
CommitLineData
1d4d38c3 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
19char **glob __PROTO((char *patt, int decend_dir));
20int contains_wild __PROTO((char *patt));
21void free_all __PROTO((void));
22
23
24int final_newline = 1; /* turned off by -n or \c */
25
26int main(argc, argv)
27int argc;
28char **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