aboutsummaryrefslogtreecommitdiff
path: root/sed.c
diff options
context:
space:
mode:
Diffstat (limited to 'sed.c')
-rw-r--r--sed.c250
1 files changed, 126 insertions, 124 deletions
diff --git a/sed.c b/sed.c
index 3a7737e2f..608f86813 100644
--- a/sed.c
+++ b/sed.c
@@ -82,7 +82,7 @@ static inline int at_last(FILE * fp)
82 if (feof(fp)) 82 if (feof(fp))
83 return 1; 83 return 1;
84 else { 84 else {
85 char ch; 85 int ch;
86 86
87 if ((ch = fgetc(fp)) == EOF) 87 if ((ch = fgetc(fp)) == EOF)
88 res++; 88 res++;
@@ -183,129 +183,131 @@ extern int sed_main(int argc, char **argv)
183 usage(sed_usage); 183 usage(sed_usage);
184 } 184 }
185 185
186 if (**argv == '-') { 186 while (argc > 1) {
187 argc--; 187 if (**argv == '-') {
188 cp = *argv++; 188 argc--;
189 stopNow = FALSE; 189 cp = *argv++;
190 190 stopNow = FALSE;
191 while (*++cp && stopNow == FALSE) { 191
192 switch (*cp) { 192 while (*++cp && stopNow == FALSE) {
193 case 'n': 193 switch (*cp) {
194 quietFlag = TRUE; 194 case 'n':
195 break; 195 quietFlag = TRUE;
196 case 'e': 196 break;
197 if (*(cp + 1) == 0 && --argc < 0) { 197 case 'e':
198 usage(sed_usage); 198 if (*(cp + 1) == 0 && --argc < 0) {
199 } 199 usage(sed_usage);
200 if (*++cp != 's') 200 }
201 cp = *argv++; 201 if (*++cp != 's')
202 202 cp = *argv++;
203 /* Read address if present */ 203
204 SKIPSPACES(cp); 204 /* Read address if present */
205 if (*cp == '$') { 205 SKIPSPACES(cp);
206 addr_line = LAST_LINE; 206 if (*cp == '$') {
207 cp++; 207 addr_line = LAST_LINE;
208 } else { 208 cp++;
209 if (isdigit(*cp)) { /* LINE ADDRESS */ 209 } else {
210 line_s = cp; 210 if (isdigit(*cp)) { /* LINE ADDRESS */
211 while (isdigit(*cp)) 211 line_s = cp;
212 cp++; 212 while (isdigit(*cp))
213 if (cp > line_s) { 213 cp++;
214 /* numeric line */ 214 if (cp > line_s) {
215 saved = *cp; 215 /* numeric line */
216 *cp = '\0'; 216 saved = *cp;
217 addr_line = atoi(line_s); 217 *cp = '\0';
218 *cp = saved; 218 addr_line = atoi(line_s);
219 } 219 *cp = saved;
220 } else if (*cp == '/') { /* PATTERN ADDRESS */ 220 }
221 pos = addr_pattern = cp + 1; 221 } else if (*cp == '/') { /* PATTERN ADDRESS */
222 pos = strchr(pos, '/'); 222 pos = addr_pattern = cp + 1;
223 if (!pos) 223 pos = strchr(pos, '/');
224 usage(sed_usage); 224 if (!pos)
225 *pos = '\0'; 225 usage(sed_usage);
226 cp = pos + 1; 226 *pos = '\0';
227 } 227 cp = pos + 1;
228 } 228 }
229 229 }
230 SKIPSPACES(cp); 230
231 if (*cp == '!') { 231 SKIPSPACES(cp);
232 negated++; 232 if (*cp == '!') {
233 cp++; 233 negated++;
234 } 234 cp++;
235 235 }
236 /* Read command */ 236
237 237 /* Read command */
238 SKIPSPACES(cp); 238
239 switch (*cp) { 239 SKIPSPACES(cp);
240 case 's': /* REPLACE */ 240 switch (*cp) {
241 if (strlen(cp) <= 3 || *(cp + 1) != '/') 241 case 's': /* REPLACE */
242 break; 242 if (strlen(cp) <= 3 || *(cp + 1) != '/')
243 sed_f = f_replace; 243 break;
244 244 sed_f = f_replace;
245 pos = needle = cp + 2; 245
246 246 pos = needle = cp + 2;
247 for (;;) { 247
248 pos = strchr(pos, '/'); 248 for (;;) {
249 if (pos == NULL) { 249 pos = strchr(pos, '/');
250 usage(sed_usage); 250 if (pos == NULL) {
251 } 251 usage(sed_usage);
252 if (*(pos - 1) == '\\') { 252 }
253 pos++; 253 if (*(pos - 1) == '\\') {
254 continue; 254 pos++;
255 } 255 continue;
256 break; 256 }
257 } 257 break;
258 *pos = 0; 258 }
259 newNeedle = ++pos; 259 *pos = 0;
260 for (;;) { 260 newNeedle = ++pos;
261 pos = strchr(pos, '/'); 261 for (;;) {
262 if (pos == NULL) { 262 pos = strchr(pos, '/');
263 usage(sed_usage); 263 if (pos == NULL) {
264 } 264 usage(sed_usage);
265 if (*(pos - 1) == '\\') { 265 }
266 pos++; 266 if (*(pos - 1) == '\\') {
267 continue; 267 pos++;
268 } 268 continue;
269 break; 269 }
270 } 270 break;
271 *pos = 0; 271 }
272 if (pos + 2 != 0) { 272 *pos = 0;
273 while (*++pos) { 273 if (pos + 2 != 0) {
274 switch (*pos) { 274 while (*++pos) {
275 case 'i': 275 switch (*pos) {
276 ignoreCase = TRUE; 276 case 'i':
277 break; 277 ignoreCase = TRUE;
278 case 'p': 278 break;
279 printFlag = TRUE; 279 case 'p':
280 break; 280 printFlag = TRUE;
281 case 'g': 281 break;
282 break; 282 case 'g':
283 default: 283 break;
284 usage(sed_usage); 284 default:
285 } 285 usage(sed_usage);
286 } 286 }
287 } 287 }
288 cp = pos; 288 }
289 /* fprintf(stderr, "replace '%s' with '%s'\n", needle, newNeedle); */ 289 cp = pos;
290 break; 290 /* fprintf(stderr, "replace '%s' with '%s'\n", needle, newNeedle); */
291 291 break;
292 case 'a': /* APPEND */ 292
293 if (strlen(cp) < 2) 293 case 'a': /* APPEND */
294 break; 294 if (strlen(cp) < 2)
295 sed_f = f_append; 295 break;
296 appendline = ++cp; 296 sed_f = f_append;
297 /* fprintf(stderr, "append '%s'\n", appendline); */ 297 appendline = ++cp;
298 break; 298 /* fprintf(stderr, "append '%s'\n", appendline); */
299 } 299 break;
300 300 }
301 stopNow = TRUE; 301
302 break; 302 stopNow = TRUE;
303 303 break;
304 default: 304
305 usage(sed_usage); 305 default:
306 } 306 usage(sed_usage);
307 } 307 }
308 } 308 }
309 }
310 }
309 311
310 if (argc == 0) { 312 if (argc == 0) {
311 switch (sed_f) { 313 switch (sed_f) {