diff options
Diffstat (limited to 'sed.c')
-rw-r--r-- | sed.c | 250 |
1 files changed, 126 insertions, 124 deletions
@@ -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) { |