xref: /freebsd/contrib/less/lessecho.c (revision a79b71281cd63ad7a6cc43a6d5673a2510b51630)
1 /*
2  * Copyright (C) 1984-2000  Mark Nudelman
3  *
4  * You may distribute under the terms of either the GNU General Public
5  * License or the Less License, as specified in the README file.
6  *
7  * For more information about less, or for information on how to
8  * contact the author, see the README file.
9  */
10 
11 
12 /*
13  * lessecho [-ox] [-cx] [-pn] [-dn] [-a] file ...
14  * Simply echos its filename arguments on standard output.
15  * But any argument containing spaces is enclosed in quotes.
16  *
17  * -ox	Specifies "x" to be the open quote character.
18  * -cx	Specifies "x" to be the close quote character.
19  * -pn	Specifies "n" to be the open quote character, as an integer.
20  * -dn	Specifies "n" to be the close quote character, as an integer.
21  * -a	Specifies that all arguments are to be quoted.
22  *	The default is that only arguments containing spaces are quoted.
23  */
24 
25 #include "less.h"
26 
27 static char *version = "$Revision: 1.6 $";
28 
29 static int quote_all = 0;
30 static char openquote = '"';
31 static char closequote = '"';
32 
33 	static void
34 pr_usage()
35 {
36 	fprintf(stderr,
37 		"usage: lessecho [-ox] [-cx] [-pn] [-dn] [-a] file ...\n");
38 }
39 
40 	static void
41 pr_version()
42 {
43 	char *p;
44 	char buf[10];
45 	char *pbuf = buf;
46 
47 	for (p = version;  *p != ' ';  p++)
48 		if (*p == '\0')
49 			return;
50 	for (p++;  *p != '$' && *p != ' ' && *p != '\0';  p++)
51 		*pbuf++ = *p;
52 	*pbuf = '\0';
53 	printf("%s\n", buf);
54 }
55 
56 	static void
57 pr_error(s)
58 	char *s;
59 {
60 	fprintf(stderr, "%s\n", s);
61 	exit(1);
62 }
63 
64 	static long
65 lstrtol(s, radix, pend)
66 	char *s;
67 	int radix;
68 	char **pend;
69 {
70 	int v;
71 	int neg = 0;
72 	long n = 0;
73 
74 	/* Skip leading white space. */
75 	while (*s == ' ' || *s == '\t')
76 		s++;
77 
78 	/* Check for a leading + or -. */
79 	if (*s == '-')
80 	{
81 		neg = 1;
82 		s++;
83 	} else if (*s == '+')
84 	{
85 		s++;
86 	}
87 
88 	/* Determine radix if caller does not specify. */
89 	if (radix == 0)
90 	{
91 		radix = 10;
92 		if (*s == '0')
93 		{
94 			switch (*++s)
95 			{
96 			case 'x':
97 				radix = 16;
98 				s++;
99 				break;
100 			default:
101 				radix = 8;
102 				break;
103 			}
104 		}
105 	}
106 
107 	/* Parse the digits of the number. */
108 	for (;;)
109 	{
110 		if (*s >= '0' && *s <= '9')
111 			v = *s - '0';
112 		else if (*s >= 'a' && *s <= 'f')
113 			v = *s - 'a' + 10;
114 		else if (*s >= 'A' && *s <= 'F')
115 			v = *s - 'A' + 10;
116 		else
117 			break;
118 		if (v >= radix)
119 			break;
120 		n = n * radix + v;
121 		s++;
122 	}
123 
124 	if (pend != NULL)
125 	{
126 		/* Skip trailing white space. */
127 		while (*s == ' ' || *s == '\t')
128 			s++;
129 		*pend = s;
130 	}
131 	if (neg)
132 		return (-n);
133 	return (n);
134 }
135 
136 
137 #if !HAVE_STRCHR
138 	char *
139 strchr(s, c)
140 	char *s;
141 	int c;
142 {
143 	for ( ;  *s != '\0';  s++)
144 		if (*s == c)
145 			return (s);
146 	if (c == '\0')
147 		return (s);
148 	return (NULL);
149 }
150 #endif
151 
152 	int
153 main(argc, argv)
154 	int argc;
155 	char *argv[];
156 {
157 	char *arg;
158 	char *s;
159 	int no_more_options;
160 
161 	no_more_options = 0;
162 	while (--argc > 0)
163 	{
164 		arg = *++argv;
165 		if (*arg != '-' || no_more_options)
166 			break;
167 		switch (*++arg)
168 		{
169 		case 'a':
170 			quote_all = 1;
171 			break;
172 		case 'o':
173 			openquote = *++arg;
174 			break;
175 		case 'c':
176 			closequote = *++arg;
177 			break;
178 		case 'p':
179 			openquote = lstrtol(++arg, 0, &s);
180 			if (s == arg)
181 				pr_error("Missing number after -O");
182 			break;
183 		case 'd':
184 			closequote = lstrtol(++arg, 0, &s);
185 			if (s == arg)
186 				pr_error("Missing number after -C");
187 			break;
188 		case '?':
189 			pr_usage();
190 			return (0);
191 		case '-':
192 			if (*++arg == '\0')
193 			{
194 				no_more_options = 1;
195 				break;
196 			}
197 			if (strcmp(arg, "version") == 0)
198 			{
199 				pr_version();
200 				return (0);
201 			}
202 			if (strcmp(arg, "help") == 0)
203 			{
204 				pr_usage();
205 				return (0);
206 			}
207 			pr_error("Invalid option after --");
208 		default:
209 			pr_error("Invalid option letter");
210 		}
211 	}
212 
213 	while (argc-- > 0)
214 	{
215 		arg = *argv++;
216 		if (quote_all || strchr(arg, ' ') != NULL)
217 			printf("%c%s%c", openquote, arg, closequote);
218 		else
219 			printf("%s", arg);
220 		if (argc > 0)
221 			printf(" ");
222 		else
223 			printf("\n");
224 	}
225 	return (0);
226 }
227