Mercurial > hg > toybox
annotate toys/pending/sed.c @ 1545:b6ff5dc17763 draft
Implement a few sed commands. Not done, and not tested yet.
author | Rob Landley <rob@landley.net> |
---|---|
date | Sat, 08 Nov 2014 01:51:59 -0600 |
parents | ad6b2f0e566b |
children | 2997847aa299 |
rev | line source |
---|---|
1537
a6ef79b31829
Fill out rest of help text for sed.
Rob Landley <rob@landley.net>
parents:
1532
diff
changeset
|
1 /* sed.c - stream editor. Thing that does s/// and other stuff. |
233
d4176f3f3835
Zap toys/Config.in and instead create generated/Config.in from contents of
Rob Landley <rob@landley.net>
parents:
231
diff
changeset
|
2 * |
1520
dfd6b3404c16
Started over on sed (by reading the posix spec).
Rob Landley <rob@landley.net>
parents:
1235
diff
changeset
|
3 * Copyright 2014 Rob Landley <rob@landley.net> |
dfd6b3404c16
Started over on sed (by reading the posix spec).
Rob Landley <rob@landley.net>
parents:
1235
diff
changeset
|
4 * |
dfd6b3404c16
Started over on sed (by reading the posix spec).
Rob Landley <rob@landley.net>
parents:
1235
diff
changeset
|
5 * See http://pubs.opengroup.org/onlinepubs/9699919799/utilities/sed.html |
233
d4176f3f3835
Zap toys/Config.in and instead create generated/Config.in from contents of
Rob Landley <rob@landley.net>
parents:
231
diff
changeset
|
6 * |
1520
dfd6b3404c16
Started over on sed (by reading the posix spec).
Rob Landley <rob@landley.net>
parents:
1235
diff
changeset
|
7 * What happens when first address matched, then EOF? How about ",42" or "1," |
dfd6b3404c16
Started over on sed (by reading the posix spec).
Rob Landley <rob@landley.net>
parents:
1235
diff
changeset
|
8 * Does $ match last line of file or last line of input |
dfd6b3404c16
Started over on sed (by reading the posix spec).
Rob Landley <rob@landley.net>
parents:
1235
diff
changeset
|
9 * If file doesn't end with newline |
dfd6b3404c16
Started over on sed (by reading the posix spec).
Rob Landley <rob@landley.net>
parents:
1235
diff
changeset
|
10 * command preceded by whitespace. whitespace before rw or s///w file |
dfd6b3404c16
Started over on sed (by reading the posix spec).
Rob Landley <rob@landley.net>
parents:
1235
diff
changeset
|
11 * space before address |
dfd6b3404c16
Started over on sed (by reading the posix spec).
Rob Landley <rob@landley.net>
parents:
1235
diff
changeset
|
12 * numerical addresses that cross, select one line |
dfd6b3404c16
Started over on sed (by reading the posix spec).
Rob Landley <rob@landley.net>
parents:
1235
diff
changeset
|
13 * test backslash escapes in regex; share code with printf? |
1530
3eafa445c1a6
Random in-progress snapshot of sed, not finished yet.
Rob Landley <rob@landley.net>
parents:
1520
diff
changeset
|
14 * address counts lines cumulatively across files |
3eafa445c1a6
Random in-progress snapshot of sed, not finished yet.
Rob Landley <rob@landley.net>
parents:
1520
diff
changeset
|
15 * Why can't I start an address with \\ (posix says no, but _why_?) |
3eafa445c1a6
Random in-progress snapshot of sed, not finished yet.
Rob Landley <rob@landley.net>
parents:
1520
diff
changeset
|
16 * Fun with \nblah\nn vs \tblah\tt |
3eafa445c1a6
Random in-progress snapshot of sed, not finished yet.
Rob Landley <rob@landley.net>
parents:
1520
diff
changeset
|
17 * |
3eafa445c1a6
Random in-progress snapshot of sed, not finished yet.
Rob Landley <rob@landley.net>
parents:
1520
diff
changeset
|
18 * echo -e "one\ntwo\nthree" | sed -n '$,$p' |
233
d4176f3f3835
Zap toys/Config.in and instead create generated/Config.in from contents of
Rob Landley <rob@landley.net>
parents:
231
diff
changeset
|
19 |
1543
ad6b2f0e566b
Next round of sed infrastructure, parses most commands now, doesn't implement them yet.
Rob Landley <rob@landley.net>
parents:
1538
diff
changeset
|
20 USE_SED(NEWTOY(sed, "(version)e*f*inr", TOYFLAG_USR|TOYFLAG_BIN|TOYFLAG_LOCALE)) |
234
163498bf547b
Move NEWTOY() list from end of toylist.h to generated/newtoys.h.
Rob Landley <rob@landley.net>
parents:
233
diff
changeset
|
21 |
233
d4176f3f3835
Zap toys/Config.in and instead create generated/Config.in from contents of
Rob Landley <rob@landley.net>
parents:
231
diff
changeset
|
22 config SED |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
674
diff
changeset
|
23 bool "sed" |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
674
diff
changeset
|
24 default n |
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
674
diff
changeset
|
25 help |
1520
dfd6b3404c16
Started over on sed (by reading the posix spec).
Rob Landley <rob@landley.net>
parents:
1235
diff
changeset
|
26 usage: sed [-inr] [-e SCRIPT]...|SCRIPT [-f SCRIPT_FILE]... [FILE...] |
dfd6b3404c16
Started over on sed (by reading the posix spec).
Rob Landley <rob@landley.net>
parents:
1235
diff
changeset
|
27 |
1537
a6ef79b31829
Fill out rest of help text for sed.
Rob Landley <rob@landley.net>
parents:
1532
diff
changeset
|
28 Stream editor. Apply one or more editing SCRIPTs to each line of input |
a6ef79b31829
Fill out rest of help text for sed.
Rob Landley <rob@landley.net>
parents:
1532
diff
changeset
|
29 (from FILE or stdin) producing output (by default to stdout). |
233
d4176f3f3835
Zap toys/Config.in and instead create generated/Config.in from contents of
Rob Landley <rob@landley.net>
parents:
231
diff
changeset
|
30 |
1520
dfd6b3404c16
Started over on sed (by reading the posix spec).
Rob Landley <rob@landley.net>
parents:
1235
diff
changeset
|
31 -e add SCRIPT to list |
dfd6b3404c16
Started over on sed (by reading the posix spec).
Rob Landley <rob@landley.net>
parents:
1235
diff
changeset
|
32 -f add contents of SCRIPT_FILE to list |
dfd6b3404c16
Started over on sed (by reading the posix spec).
Rob Landley <rob@landley.net>
parents:
1235
diff
changeset
|
33 -i Edit each file in place. |
dfd6b3404c16
Started over on sed (by reading the posix spec).
Rob Landley <rob@landley.net>
parents:
1235
diff
changeset
|
34 -n No default output. (Use the p command to output matched lines.) |
dfd6b3404c16
Started over on sed (by reading the posix spec).
Rob Landley <rob@landley.net>
parents:
1235
diff
changeset
|
35 -r Use extended regular expression syntax. |
1538
8bc715741481
Next drop of sed infrastructure, mostly argument parsing, doesn't do anything interesting yet.
Rob Landley <rob@landley.net>
parents:
1537
diff
changeset
|
36 -s Treat input files separately (implied by -i) |
1520
dfd6b3404c16
Started over on sed (by reading the posix spec).
Rob Landley <rob@landley.net>
parents:
1235
diff
changeset
|
37 |
dfd6b3404c16
Started over on sed (by reading the posix spec).
Rob Landley <rob@landley.net>
parents:
1235
diff
changeset
|
38 A SCRIPT is a series of one or more COMMANDs separated by newlines or |
dfd6b3404c16
Started over on sed (by reading the posix spec).
Rob Landley <rob@landley.net>
parents:
1235
diff
changeset
|
39 semicolons. All -e SCRIPTs are concatenated together as if separated |
dfd6b3404c16
Started over on sed (by reading the posix spec).
Rob Landley <rob@landley.net>
parents:
1235
diff
changeset
|
40 by newlines, followed by all lines from -f SCRIPT_FILEs, in order. |
dfd6b3404c16
Started over on sed (by reading the posix spec).
Rob Landley <rob@landley.net>
parents:
1235
diff
changeset
|
41 If no -e or -f SCRIPTs are specified, the first argument is the SCRIPT. |
dfd6b3404c16
Started over on sed (by reading the posix spec).
Rob Landley <rob@landley.net>
parents:
1235
diff
changeset
|
42 |
dfd6b3404c16
Started over on sed (by reading the posix spec).
Rob Landley <rob@landley.net>
parents:
1235
diff
changeset
|
43 Each COMMAND may be preceded by an address which limits the command to |
1537
a6ef79b31829
Fill out rest of help text for sed.
Rob Landley <rob@landley.net>
parents:
1532
diff
changeset
|
44 apply only to the specified line(s). Commands without an address apply to |
a6ef79b31829
Fill out rest of help text for sed.
Rob Landley <rob@landley.net>
parents:
1532
diff
changeset
|
45 every line. Addresses are of the form: |
1520
dfd6b3404c16
Started over on sed (by reading the posix spec).
Rob Landley <rob@landley.net>
parents:
1235
diff
changeset
|
46 |
1537
a6ef79b31829
Fill out rest of help text for sed.
Rob Landley <rob@landley.net>
parents:
1532
diff
changeset
|
47 [ADDRESS[,ADDRESS]]COMMAND |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
674
diff
changeset
|
48 |
1520
dfd6b3404c16
Started over on sed (by reading the posix spec).
Rob Landley <rob@landley.net>
parents:
1235
diff
changeset
|
49 The ADDRESS may be a decimal line number (starting at 1), a /regular |
dfd6b3404c16
Started over on sed (by reading the posix spec).
Rob Landley <rob@landley.net>
parents:
1235
diff
changeset
|
50 expression/ within a pair of forward slashes, or the character "$" which |
1537
a6ef79b31829
Fill out rest of help text for sed.
Rob Landley <rob@landley.net>
parents:
1532
diff
changeset
|
51 matches the last line of input. (In -s or -i mode this matches the last |
a6ef79b31829
Fill out rest of help text for sed.
Rob Landley <rob@landley.net>
parents:
1532
diff
changeset
|
52 line of each file, otherwise just the last line of the last file.) A single |
a6ef79b31829
Fill out rest of help text for sed.
Rob Landley <rob@landley.net>
parents:
1532
diff
changeset
|
53 address matches one line, a pair of comma separated addresses match |
a6ef79b31829
Fill out rest of help text for sed.
Rob Landley <rob@landley.net>
parents:
1532
diff
changeset
|
54 everything from the first address to the second address (inclusive). If |
a6ef79b31829
Fill out rest of help text for sed.
Rob Landley <rob@landley.net>
parents:
1532
diff
changeset
|
55 both addresses are regular expressions, more than one range of lines in |
a6ef79b31829
Fill out rest of help text for sed.
Rob Landley <rob@landley.net>
parents:
1532
diff
changeset
|
56 each file can match. |
1520
dfd6b3404c16
Started over on sed (by reading the posix spec).
Rob Landley <rob@landley.net>
parents:
1235
diff
changeset
|
57 |
dfd6b3404c16
Started over on sed (by reading the posix spec).
Rob Landley <rob@landley.net>
parents:
1235
diff
changeset
|
58 REGULAR EXPRESSIONS in sed are started and ended by the same character |
dfd6b3404c16
Started over on sed (by reading the posix spec).
Rob Landley <rob@landley.net>
parents:
1235
diff
changeset
|
59 (traditionally / but anything except a backslash or a newline works). |
dfd6b3404c16
Started over on sed (by reading the posix spec).
Rob Landley <rob@landley.net>
parents:
1235
diff
changeset
|
60 Backslashes may be used to escape the delimiter if it occurs in the |
dfd6b3404c16
Started over on sed (by reading the posix spec).
Rob Landley <rob@landley.net>
parents:
1235
diff
changeset
|
61 regex, and for the usual printf escapes (\abcefnrtv and octal, hex, |
dfd6b3404c16
Started over on sed (by reading the posix spec).
Rob Landley <rob@landley.net>
parents:
1235
diff
changeset
|
62 and unicode). An empty regex repeats the previous one. ADDRESS regexes |
dfd6b3404c16
Started over on sed (by reading the posix spec).
Rob Landley <rob@landley.net>
parents:
1235
diff
changeset
|
63 (above) require the first delimeter to be escaped with a backslash when |
dfd6b3404c16
Started over on sed (by reading the posix spec).
Rob Landley <rob@landley.net>
parents:
1235
diff
changeset
|
64 it isn't a forward slash (to distinguish it from the COMMANDs below). |
dfd6b3404c16
Started over on sed (by reading the posix spec).
Rob Landley <rob@landley.net>
parents:
1235
diff
changeset
|
65 |
1537
a6ef79b31829
Fill out rest of help text for sed.
Rob Landley <rob@landley.net>
parents:
1532
diff
changeset
|
66 Sed mostly operates on individual lines one at a time. It reads each line, |
a6ef79b31829
Fill out rest of help text for sed.
Rob Landley <rob@landley.net>
parents:
1532
diff
changeset
|
67 processes it, and either writes it to the output or discards it before |
a6ef79b31829
Fill out rest of help text for sed.
Rob Landley <rob@landley.net>
parents:
1532
diff
changeset
|
68 reading the next line. Sed can remember one additional line in a separate |
a6ef79b31829
Fill out rest of help text for sed.
Rob Landley <rob@landley.net>
parents:
1532
diff
changeset
|
69 buffer (using the h, H, g, G, and x commands), and can read the next line |
a6ef79b31829
Fill out rest of help text for sed.
Rob Landley <rob@landley.net>
parents:
1532
diff
changeset
|
70 of input early (using the n and N command), but other than that command |
a6ef79b31829
Fill out rest of help text for sed.
Rob Landley <rob@landley.net>
parents:
1532
diff
changeset
|
71 scripts operate on individual lines of text. |
a6ef79b31829
Fill out rest of help text for sed.
Rob Landley <rob@landley.net>
parents:
1532
diff
changeset
|
72 |
a6ef79b31829
Fill out rest of help text for sed.
Rob Landley <rob@landley.net>
parents:
1532
diff
changeset
|
73 Each COMMAND starts with a single character. The following commands take |
a6ef79b31829
Fill out rest of help text for sed.
Rob Landley <rob@landley.net>
parents:
1532
diff
changeset
|
74 no arguments: |
a6ef79b31829
Fill out rest of help text for sed.
Rob Landley <rob@landley.net>
parents:
1532
diff
changeset
|
75 |
a6ef79b31829
Fill out rest of help text for sed.
Rob Landley <rob@landley.net>
parents:
1532
diff
changeset
|
76 { Start a new command block, continuing until a corresponding "}". |
a6ef79b31829
Fill out rest of help text for sed.
Rob Landley <rob@landley.net>
parents:
1532
diff
changeset
|
77 Command blocks may nest. If the block has an address, commands within |
a6ef79b31829
Fill out rest of help text for sed.
Rob Landley <rob@landley.net>
parents:
1532
diff
changeset
|
78 the block are only run for lines within the block's address range. |
a6ef79b31829
Fill out rest of help text for sed.
Rob Landley <rob@landley.net>
parents:
1532
diff
changeset
|
79 |
a6ef79b31829
Fill out rest of help text for sed.
Rob Landley <rob@landley.net>
parents:
1532
diff
changeset
|
80 } End command block (this command cannot have an address) |
a6ef79b31829
Fill out rest of help text for sed.
Rob Landley <rob@landley.net>
parents:
1532
diff
changeset
|
81 |
a6ef79b31829
Fill out rest of help text for sed.
Rob Landley <rob@landley.net>
parents:
1532
diff
changeset
|
82 d Delete this line and move on to the next one |
a6ef79b31829
Fill out rest of help text for sed.
Rob Landley <rob@landley.net>
parents:
1532
diff
changeset
|
83 (ignores remaining COMMANDs) |
a6ef79b31829
Fill out rest of help text for sed.
Rob Landley <rob@landley.net>
parents:
1532
diff
changeset
|
84 |
a6ef79b31829
Fill out rest of help text for sed.
Rob Landley <rob@landley.net>
parents:
1532
diff
changeset
|
85 D Delete one line of input and restart command SCRIPT (same as "d" |
a6ef79b31829
Fill out rest of help text for sed.
Rob Landley <rob@landley.net>
parents:
1532
diff
changeset
|
86 unless you've glued lines together with "N" or similar) |
a6ef79b31829
Fill out rest of help text for sed.
Rob Landley <rob@landley.net>
parents:
1532
diff
changeset
|
87 |
a6ef79b31829
Fill out rest of help text for sed.
Rob Landley <rob@landley.net>
parents:
1532
diff
changeset
|
88 g Get remembered line (overwriting current line) |
a6ef79b31829
Fill out rest of help text for sed.
Rob Landley <rob@landley.net>
parents:
1532
diff
changeset
|
89 |
a6ef79b31829
Fill out rest of help text for sed.
Rob Landley <rob@landley.net>
parents:
1532
diff
changeset
|
90 G Get remembered line (appending to current line) |
a6ef79b31829
Fill out rest of help text for sed.
Rob Landley <rob@landley.net>
parents:
1532
diff
changeset
|
91 |
a6ef79b31829
Fill out rest of help text for sed.
Rob Landley <rob@landley.net>
parents:
1532
diff
changeset
|
92 h Remember this line (overwriting remembered line) |
a6ef79b31829
Fill out rest of help text for sed.
Rob Landley <rob@landley.net>
parents:
1532
diff
changeset
|
93 |
a6ef79b31829
Fill out rest of help text for sed.
Rob Landley <rob@landley.net>
parents:
1532
diff
changeset
|
94 H Remember this line (appending to remembered line, if any) |
a6ef79b31829
Fill out rest of help text for sed.
Rob Landley <rob@landley.net>
parents:
1532
diff
changeset
|
95 |
a6ef79b31829
Fill out rest of help text for sed.
Rob Landley <rob@landley.net>
parents:
1532
diff
changeset
|
96 l Print this line, escaping \abfrtv (but leaving \n as a newline), |
a6ef79b31829
Fill out rest of help text for sed.
Rob Landley <rob@landley.net>
parents:
1532
diff
changeset
|
97 using octal escapes for other nonprintable characters, and |
a6ef79b31829
Fill out rest of help text for sed.
Rob Landley <rob@landley.net>
parents:
1532
diff
changeset
|
98 wrapping lines to terminal width with a backslash and newline |
a6ef79b31829
Fill out rest of help text for sed.
Rob Landley <rob@landley.net>
parents:
1532
diff
changeset
|
99 |
a6ef79b31829
Fill out rest of help text for sed.
Rob Landley <rob@landley.net>
parents:
1532
diff
changeset
|
100 n Print default output and read next line, replacing current line |
a6ef79b31829
Fill out rest of help text for sed.
Rob Landley <rob@landley.net>
parents:
1532
diff
changeset
|
101 (If no next line available, quit processing script) |
a6ef79b31829
Fill out rest of help text for sed.
Rob Landley <rob@landley.net>
parents:
1532
diff
changeset
|
102 |
a6ef79b31829
Fill out rest of help text for sed.
Rob Landley <rob@landley.net>
parents:
1532
diff
changeset
|
103 N Append next line of input to this line, separated by a newline |
a6ef79b31829
Fill out rest of help text for sed.
Rob Landley <rob@landley.net>
parents:
1532
diff
changeset
|
104 (This advances the line counter for address matching and "=", if no |
a6ef79b31829
Fill out rest of help text for sed.
Rob Landley <rob@landley.net>
parents:
1532
diff
changeset
|
105 next line available quit processing script without default output) |
a6ef79b31829
Fill out rest of help text for sed.
Rob Landley <rob@landley.net>
parents:
1532
diff
changeset
|
106 |
a6ef79b31829
Fill out rest of help text for sed.
Rob Landley <rob@landley.net>
parents:
1532
diff
changeset
|
107 p Print this line |
a6ef79b31829
Fill out rest of help text for sed.
Rob Landley <rob@landley.net>
parents:
1532
diff
changeset
|
108 |
a6ef79b31829
Fill out rest of help text for sed.
Rob Landley <rob@landley.net>
parents:
1532
diff
changeset
|
109 P Print this line up to first newline (from "N") |
a6ef79b31829
Fill out rest of help text for sed.
Rob Landley <rob@landley.net>
parents:
1532
diff
changeset
|
110 |
a6ef79b31829
Fill out rest of help text for sed.
Rob Landley <rob@landley.net>
parents:
1532
diff
changeset
|
111 q Quit (print default output, no more commands processed or lines read) |
a6ef79b31829
Fill out rest of help text for sed.
Rob Landley <rob@landley.net>
parents:
1532
diff
changeset
|
112 |
a6ef79b31829
Fill out rest of help text for sed.
Rob Landley <rob@landley.net>
parents:
1532
diff
changeset
|
113 x Exchange this line with remembered line (overwrite in both directions) |
1520
dfd6b3404c16
Started over on sed (by reading the posix spec).
Rob Landley <rob@landley.net>
parents:
1235
diff
changeset
|
114 |
1537
a6ef79b31829
Fill out rest of help text for sed.
Rob Landley <rob@landley.net>
parents:
1532
diff
changeset
|
115 = Print the current line number (followed by a newline) |
a6ef79b31829
Fill out rest of help text for sed.
Rob Landley <rob@landley.net>
parents:
1532
diff
changeset
|
116 |
a6ef79b31829
Fill out rest of help text for sed.
Rob Landley <rob@landley.net>
parents:
1532
diff
changeset
|
117 The following commands (may) take an argument. ("b", "s", "t", "T", "y" |
a6ef79b31829
Fill out rest of help text for sed.
Rob Landley <rob@landley.net>
parents:
1532
diff
changeset
|
118 and ":" may be ended with semicolons, the rest eat at least one line.) |
a6ef79b31829
Fill out rest of help text for sed.
Rob Landley <rob@landley.net>
parents:
1532
diff
changeset
|
119 |
a6ef79b31829
Fill out rest of help text for sed.
Rob Landley <rob@landley.net>
parents:
1532
diff
changeset
|
120 a [text] Append text to output before attempting to read next line, |
a6ef79b31829
Fill out rest of help text for sed.
Rob Landley <rob@landley.net>
parents:
1532
diff
changeset
|
121 if text ends with unescaped "\" append next line of script |
a6ef79b31829
Fill out rest of help text for sed.
Rob Landley <rob@landley.net>
parents:
1532
diff
changeset
|
122 |
a6ef79b31829
Fill out rest of help text for sed.
Rob Landley <rob@landley.net>
parents:
1532
diff
changeset
|
123 b [label] Branch, jumps to :label (or with no label, to end of SCRIPT) |
a6ef79b31829
Fill out rest of help text for sed.
Rob Landley <rob@landley.net>
parents:
1532
diff
changeset
|
124 |
a6ef79b31829
Fill out rest of help text for sed.
Rob Landley <rob@landley.net>
parents:
1532
diff
changeset
|
125 c [text] Delete current address range and print text instead, |
a6ef79b31829
Fill out rest of help text for sed.
Rob Landley <rob@landley.net>
parents:
1532
diff
changeset
|
126 if text ends with unescaped "\" append next line of script |
a6ef79b31829
Fill out rest of help text for sed.
Rob Landley <rob@landley.net>
parents:
1532
diff
changeset
|
127 |
a6ef79b31829
Fill out rest of help text for sed.
Rob Landley <rob@landley.net>
parents:
1532
diff
changeset
|
128 i [text] Print text, if text ends with unescaped "\" append next |
a6ef79b31829
Fill out rest of help text for sed.
Rob Landley <rob@landley.net>
parents:
1532
diff
changeset
|
129 line of script |
a6ef79b31829
Fill out rest of help text for sed.
Rob Landley <rob@landley.net>
parents:
1532
diff
changeset
|
130 |
a6ef79b31829
Fill out rest of help text for sed.
Rob Landley <rob@landley.net>
parents:
1532
diff
changeset
|
131 r [file] Append contents of file to output before attempting to read |
a6ef79b31829
Fill out rest of help text for sed.
Rob Landley <rob@landley.net>
parents:
1532
diff
changeset
|
132 next line. |
a6ef79b31829
Fill out rest of help text for sed.
Rob Landley <rob@landley.net>
parents:
1532
diff
changeset
|
133 |
a6ef79b31829
Fill out rest of help text for sed.
Rob Landley <rob@landley.net>
parents:
1532
diff
changeset
|
134 s/S/R/F Search for regex S, replace matched text with R using flags F. |
a6ef79b31829
Fill out rest of help text for sed.
Rob Landley <rob@landley.net>
parents:
1532
diff
changeset
|
135 The first character after the "s" (anything but newline or |
a6ef79b31829
Fill out rest of help text for sed.
Rob Landley <rob@landley.net>
parents:
1532
diff
changeset
|
136 backslash) is the delimiter, escape with \ to use normally. |
1520
dfd6b3404c16
Started over on sed (by reading the posix spec).
Rob Landley <rob@landley.net>
parents:
1235
diff
changeset
|
137 |
1537
a6ef79b31829
Fill out rest of help text for sed.
Rob Landley <rob@landley.net>
parents:
1532
diff
changeset
|
138 The replacement text may contain "&" to substitute the matched |
a6ef79b31829
Fill out rest of help text for sed.
Rob Landley <rob@landley.net>
parents:
1532
diff
changeset
|
139 text (escape it with backslash for a literal &), or \1 through |
a6ef79b31829
Fill out rest of help text for sed.
Rob Landley <rob@landley.net>
parents:
1532
diff
changeset
|
140 \9 to substitute a parenthetical subexpression in the regex. |
a6ef79b31829
Fill out rest of help text for sed.
Rob Landley <rob@landley.net>
parents:
1532
diff
changeset
|
141 You can also use the normal backslash escapes such as \n and |
a6ef79b31829
Fill out rest of help text for sed.
Rob Landley <rob@landley.net>
parents:
1532
diff
changeset
|
142 a backslash at the end of the line appends the next line. |
a6ef79b31829
Fill out rest of help text for sed.
Rob Landley <rob@landley.net>
parents:
1532
diff
changeset
|
143 |
a6ef79b31829
Fill out rest of help text for sed.
Rob Landley <rob@landley.net>
parents:
1532
diff
changeset
|
144 The flags are: |
a6ef79b31829
Fill out rest of help text for sed.
Rob Landley <rob@landley.net>
parents:
1532
diff
changeset
|
145 |
a6ef79b31829
Fill out rest of help text for sed.
Rob Landley <rob@landley.net>
parents:
1532
diff
changeset
|
146 [0-9] A number, substitute only that occurrence of pattern |
a6ef79b31829
Fill out rest of help text for sed.
Rob Landley <rob@landley.net>
parents:
1532
diff
changeset
|
147 g Global, substitute all occurrences of pattern |
1543
ad6b2f0e566b
Next round of sed infrastructure, parses most commands now, doesn't implement them yet.
Rob Landley <rob@landley.net>
parents:
1538
diff
changeset
|
148 i Ignore case when matching |
1537
a6ef79b31829
Fill out rest of help text for sed.
Rob Landley <rob@landley.net>
parents:
1532
diff
changeset
|
149 p Print the line if match was found and replaced |
a6ef79b31829
Fill out rest of help text for sed.
Rob Landley <rob@landley.net>
parents:
1532
diff
changeset
|
150 w [file] Write (append) line to file if match replaced |
1520
dfd6b3404c16
Started over on sed (by reading the posix spec).
Rob Landley <rob@landley.net>
parents:
1235
diff
changeset
|
151 |
1537
a6ef79b31829
Fill out rest of help text for sed.
Rob Landley <rob@landley.net>
parents:
1532
diff
changeset
|
152 t [label] Test, jump to :label only if an "s" command found a match in |
a6ef79b31829
Fill out rest of help text for sed.
Rob Landley <rob@landley.net>
parents:
1532
diff
changeset
|
153 this line since last test (replacing with same text counts) |
a6ef79b31829
Fill out rest of help text for sed.
Rob Landley <rob@landley.net>
parents:
1532
diff
changeset
|
154 |
a6ef79b31829
Fill out rest of help text for sed.
Rob Landley <rob@landley.net>
parents:
1532
diff
changeset
|
155 T [label] Test false, jump only if "s" hasn't found a match. |
a6ef79b31829
Fill out rest of help text for sed.
Rob Landley <rob@landley.net>
parents:
1532
diff
changeset
|
156 |
a6ef79b31829
Fill out rest of help text for sed.
Rob Landley <rob@landley.net>
parents:
1532
diff
changeset
|
157 w [file] Write (append) line to file |
a6ef79b31829
Fill out rest of help text for sed.
Rob Landley <rob@landley.net>
parents:
1532
diff
changeset
|
158 |
a6ef79b31829
Fill out rest of help text for sed.
Rob Landley <rob@landley.net>
parents:
1532
diff
changeset
|
159 y/old/new/ Change each character in 'old' to corresponding character |
a6ef79b31829
Fill out rest of help text for sed.
Rob Landley <rob@landley.net>
parents:
1532
diff
changeset
|
160 in 'new' (with standard backslash escapes, delimiter can be |
a6ef79b31829
Fill out rest of help text for sed.
Rob Landley <rob@landley.net>
parents:
1532
diff
changeset
|
161 any repeated character except \ or \n) |
a6ef79b31829
Fill out rest of help text for sed.
Rob Landley <rob@landley.net>
parents:
1532
diff
changeset
|
162 |
a6ef79b31829
Fill out rest of help text for sed.
Rob Landley <rob@landley.net>
parents:
1532
diff
changeset
|
163 : [label] Labeled target for jump commands |
a6ef79b31829
Fill out rest of help text for sed.
Rob Landley <rob@landley.net>
parents:
1532
diff
changeset
|
164 |
a6ef79b31829
Fill out rest of help text for sed.
Rob Landley <rob@landley.net>
parents:
1532
diff
changeset
|
165 # Comment, ignore rest of this line of SCRIPT |
1520
dfd6b3404c16
Started over on sed (by reading the posix spec).
Rob Landley <rob@landley.net>
parents:
1235
diff
changeset
|
166 |
dfd6b3404c16
Started over on sed (by reading the posix spec).
Rob Landley <rob@landley.net>
parents:
1235
diff
changeset
|
167 Deviations from posix: we allow extended regular expressions with -r, |
1537
a6ef79b31829
Fill out rest of help text for sed.
Rob Landley <rob@landley.net>
parents:
1532
diff
changeset
|
168 editing in place with -i, separate with -s, printf escapes in text, line |
a6ef79b31829
Fill out rest of help text for sed.
Rob Landley <rob@landley.net>
parents:
1532
diff
changeset
|
169 continuations, semicolons after all commands, 2-address anywhere an |
a6ef79b31829
Fill out rest of help text for sed.
Rob Landley <rob@landley.net>
parents:
1532
diff
changeset
|
170 address is allowed, "T" command. |
233
d4176f3f3835
Zap toys/Config.in and instead create generated/Config.in from contents of
Rob Landley <rob@landley.net>
parents:
231
diff
changeset
|
171 */ |
231
31dc682c18ad
Very early stub of sed, does nothing yet.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
172 |
674
7e846e281e38
New build infrastructure to generate FLAG_ macros and TT alias, #define FOR_commandname before #including toys.h to trigger it. Rename DEFINE_GLOBALS() to just GLOBALS() (because I could never remember if it was DECLARE_GLOBALS). Convert existing commands to use new infrastructure, and replace optflag constants with FLAG_ macros where appropriate.
Rob Landley <rob@landley.net>
parents:
656
diff
changeset
|
173 #define FOR_sed |
231
31dc682c18ad
Very early stub of sed, does nothing yet.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
174 #include "toys.h" |
31dc682c18ad
Very early stub of sed, does nothing yet.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
175 |
674
7e846e281e38
New build infrastructure to generate FLAG_ macros and TT alias, #define FOR_commandname before #including toys.h to trigger it. Rename DEFINE_GLOBALS() to just GLOBALS() (because I could never remember if it was DECLARE_GLOBALS). Convert existing commands to use new infrastructure, and replace optflag constants with FLAG_ macros where appropriate.
Rob Landley <rob@landley.net>
parents:
656
diff
changeset
|
176 GLOBALS( |
1520
dfd6b3404c16
Started over on sed (by reading the posix spec).
Rob Landley <rob@landley.net>
parents:
1235
diff
changeset
|
177 struct arg_list *f; |
dfd6b3404c16
Started over on sed (by reading the posix spec).
Rob Landley <rob@landley.net>
parents:
1235
diff
changeset
|
178 struct arg_list *e; |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
674
diff
changeset
|
179 |
1530
3eafa445c1a6
Random in-progress snapshot of sed, not finished yet.
Rob Landley <rob@landley.net>
parents:
1520
diff
changeset
|
180 // processed pattern list |
3eafa445c1a6
Random in-progress snapshot of sed, not finished yet.
Rob Landley <rob@landley.net>
parents:
1520
diff
changeset
|
181 struct double_list *pattern; |
1532
bf2c5216d726
Basic sed range support, enough for "sed -n 9,11p README" to work.
Rob Landley <rob@landley.net>
parents:
1530
diff
changeset
|
182 |
1545
b6ff5dc17763
Implement a few sed commands. Not done, and not tested yet.
Rob Landley <rob@landley.net>
parents:
1543
diff
changeset
|
183 char *nextline, *remember; |
b6ff5dc17763
Implement a few sed commands. Not done, and not tested yet.
Rob Landley <rob@landley.net>
parents:
1543
diff
changeset
|
184 void *restart; |
b6ff5dc17763
Implement a few sed commands. Not done, and not tested yet.
Rob Landley <rob@landley.net>
parents:
1543
diff
changeset
|
185 long nextlen, rememberlen, count; |
1532
bf2c5216d726
Basic sed range support, enough for "sed -n 9,11p README" to work.
Rob Landley <rob@landley.net>
parents:
1530
diff
changeset
|
186 int fdout, noeol; |
237
7cb15eae1664
Zap toylist.h, moving contents of global structures into DEFINE_GLOBALS()
Rob Landley <rob@landley.net>
parents:
234
diff
changeset
|
187 ) |
7cb15eae1664
Zap toylist.h, moving contents of global structures into DEFINE_GLOBALS()
Rob Landley <rob@landley.net>
parents:
234
diff
changeset
|
188 |
1530
3eafa445c1a6
Random in-progress snapshot of sed, not finished yet.
Rob Landley <rob@landley.net>
parents:
1520
diff
changeset
|
189 struct step { |
3eafa445c1a6
Random in-progress snapshot of sed, not finished yet.
Rob Landley <rob@landley.net>
parents:
1520
diff
changeset
|
190 struct step *next, *prev; |
3eafa445c1a6
Random in-progress snapshot of sed, not finished yet.
Rob Landley <rob@landley.net>
parents:
1520
diff
changeset
|
191 |
3eafa445c1a6
Random in-progress snapshot of sed, not finished yet.
Rob Landley <rob@landley.net>
parents:
1520
diff
changeset
|
192 // Begin and end of each match |
3eafa445c1a6
Random in-progress snapshot of sed, not finished yet.
Rob Landley <rob@landley.net>
parents:
1520
diff
changeset
|
193 long lmatch[2]; |
1538
8bc715741481
Next drop of sed infrastructure, mostly argument parsing, doesn't do anything interesting yet.
Rob Landley <rob@landley.net>
parents:
1537
diff
changeset
|
194 int rmatch[2]; // offset to regex_t, because realloc() would confuse pointer |
1543
ad6b2f0e566b
Next round of sed infrastructure, parses most commands now, doesn't implement them yet.
Rob Landley <rob@landley.net>
parents:
1538
diff
changeset
|
195 unsigned not, hit, sflags; |
1530
3eafa445c1a6
Random in-progress snapshot of sed, not finished yet.
Rob Landley <rob@landley.net>
parents:
1520
diff
changeset
|
196 |
1543
ad6b2f0e566b
Next round of sed infrastructure, parses most commands now, doesn't implement them yet.
Rob Landley <rob@landley.net>
parents:
1538
diff
changeset
|
197 int arg1, arg2, arg3; // offset start of to argument (string or regex_t) |
ad6b2f0e566b
Next round of sed infrastructure, parses most commands now, doesn't implement them yet.
Rob Landley <rob@landley.net>
parents:
1538
diff
changeset
|
198 char c; // action |
1530
3eafa445c1a6
Random in-progress snapshot of sed, not finished yet.
Rob Landley <rob@landley.net>
parents:
1520
diff
changeset
|
199 }; |
3eafa445c1a6
Random in-progress snapshot of sed, not finished yet.
Rob Landley <rob@landley.net>
parents:
1520
diff
changeset
|
200 |
1532
bf2c5216d726
Basic sed range support, enough for "sed -n 9,11p README" to work.
Rob Landley <rob@landley.net>
parents:
1530
diff
changeset
|
201 // Write out line with potential embedded NUL, handling eol/noeol |
bf2c5216d726
Basic sed range support, enough for "sed -n 9,11p README" to work.
Rob Landley <rob@landley.net>
parents:
1530
diff
changeset
|
202 static int emit(char *line, long len, int eol) |
bf2c5216d726
Basic sed range support, enough for "sed -n 9,11p README" to work.
Rob Landley <rob@landley.net>
parents:
1530
diff
changeset
|
203 { |
bf2c5216d726
Basic sed range support, enough for "sed -n 9,11p README" to work.
Rob Landley <rob@landley.net>
parents:
1530
diff
changeset
|
204 if (TT.noeol && !writeall(TT.fdout, "\n", 1)) return 1; |
bf2c5216d726
Basic sed range support, enough for "sed -n 9,11p README" to work.
Rob Landley <rob@landley.net>
parents:
1530
diff
changeset
|
205 if (eol) line[len++] = '\n'; |
bf2c5216d726
Basic sed range support, enough for "sed -n 9,11p README" to work.
Rob Landley <rob@landley.net>
parents:
1530
diff
changeset
|
206 TT.noeol = !eol; |
bf2c5216d726
Basic sed range support, enough for "sed -n 9,11p README" to work.
Rob Landley <rob@landley.net>
parents:
1530
diff
changeset
|
207 if (len != writeall(TT.fdout, line, len)) { |
bf2c5216d726
Basic sed range support, enough for "sed -n 9,11p README" to work.
Rob Landley <rob@landley.net>
parents:
1530
diff
changeset
|
208 perror_msg("short write"); |
bf2c5216d726
Basic sed range support, enough for "sed -n 9,11p README" to work.
Rob Landley <rob@landley.net>
parents:
1530
diff
changeset
|
209 |
bf2c5216d726
Basic sed range support, enough for "sed -n 9,11p README" to work.
Rob Landley <rob@landley.net>
parents:
1530
diff
changeset
|
210 return 1; |
bf2c5216d726
Basic sed range support, enough for "sed -n 9,11p README" to work.
Rob Landley <rob@landley.net>
parents:
1530
diff
changeset
|
211 } |
bf2c5216d726
Basic sed range support, enough for "sed -n 9,11p README" to work.
Rob Landley <rob@landley.net>
parents:
1530
diff
changeset
|
212 |
bf2c5216d726
Basic sed range support, enough for "sed -n 9,11p README" to work.
Rob Landley <rob@landley.net>
parents:
1530
diff
changeset
|
213 return 0; |
bf2c5216d726
Basic sed range support, enough for "sed -n 9,11p README" to work.
Rob Landley <rob@landley.net>
parents:
1530
diff
changeset
|
214 } |
bf2c5216d726
Basic sed range support, enough for "sed -n 9,11p README" to work.
Rob Landley <rob@landley.net>
parents:
1530
diff
changeset
|
215 |
1538
8bc715741481
Next drop of sed infrastructure, mostly argument parsing, doesn't do anything interesting yet.
Rob Landley <rob@landley.net>
parents:
1537
diff
changeset
|
216 // Do regex matching handling embedded NUL bytes in string. Note that |
8bc715741481
Next drop of sed infrastructure, mostly argument parsing, doesn't do anything interesting yet.
Rob Landley <rob@landley.net>
parents:
1537
diff
changeset
|
217 // neither the pattern nor the match can currently include NUL bytes |
8bc715741481
Next drop of sed infrastructure, mostly argument parsing, doesn't do anything interesting yet.
Rob Landley <rob@landley.net>
parents:
1537
diff
changeset
|
218 // (even with wildcards) and string must be nul terminated. |
8bc715741481
Next drop of sed infrastructure, mostly argument parsing, doesn't do anything interesting yet.
Rob Landley <rob@landley.net>
parents:
1537
diff
changeset
|
219 static int ghostwheel(regex_t *preg, char *string, long len, int nmatch, |
1532
bf2c5216d726
Basic sed range support, enough for "sed -n 9,11p README" to work.
Rob Landley <rob@landley.net>
parents:
1530
diff
changeset
|
220 regmatch_t pmatch[], int eflags) |
bf2c5216d726
Basic sed range support, enough for "sed -n 9,11p README" to work.
Rob Landley <rob@landley.net>
parents:
1530
diff
changeset
|
221 { |
1538
8bc715741481
Next drop of sed infrastructure, mostly argument parsing, doesn't do anything interesting yet.
Rob Landley <rob@landley.net>
parents:
1537
diff
changeset
|
222 /* |
1532
bf2c5216d726
Basic sed range support, enough for "sed -n 9,11p README" to work.
Rob Landley <rob@landley.net>
parents:
1530
diff
changeset
|
223 // todo: this |
1538
8bc715741481
Next drop of sed infrastructure, mostly argument parsing, doesn't do anything interesting yet.
Rob Landley <rob@landley.net>
parents:
1537
diff
changeset
|
224 long start = 0, rc = 0, matches = 0; |
8bc715741481
Next drop of sed infrastructure, mostly argument parsing, doesn't do anything interesting yet.
Rob Landley <rob@landley.net>
parents:
1537
diff
changeset
|
225 |
8bc715741481
Next drop of sed infrastructure, mostly argument parsing, doesn't do anything interesting yet.
Rob Landley <rob@landley.net>
parents:
1537
diff
changeset
|
226 for (;;) { |
8bc715741481
Next drop of sed infrastructure, mostly argument parsing, doesn't do anything interesting yet.
Rob Landley <rob@landley.net>
parents:
1537
diff
changeset
|
227 long new = strlen(string+start); |
8bc715741481
Next drop of sed infrastructure, mostly argument parsing, doesn't do anything interesting yet.
Rob Landley <rob@landley.net>
parents:
1537
diff
changeset
|
228 |
8bc715741481
Next drop of sed infrastructure, mostly argument parsing, doesn't do anything interesting yet.
Rob Landley <rob@landley.net>
parents:
1537
diff
changeset
|
229 // eflags nobegin noend |
8bc715741481
Next drop of sed infrastructure, mostly argument parsing, doesn't do anything interesting yet.
Rob Landley <rob@landley.net>
parents:
1537
diff
changeset
|
230 rc |= regexec(preg, string+start, nmatch-matches, pmatch+matches, eflags); |
8bc715741481
Next drop of sed infrastructure, mostly argument parsing, doesn't do anything interesting yet.
Rob Landley <rob@landley.net>
parents:
1537
diff
changeset
|
231 if ((start += end + 1) >= len) break; |
8bc715741481
Next drop of sed infrastructure, mostly argument parsing, doesn't do anything interesting yet.
Rob Landley <rob@landley.net>
parents:
1537
diff
changeset
|
232 } |
8bc715741481
Next drop of sed infrastructure, mostly argument parsing, doesn't do anything interesting yet.
Rob Landley <rob@landley.net>
parents:
1537
diff
changeset
|
233 |
8bc715741481
Next drop of sed infrastructure, mostly argument parsing, doesn't do anything interesting yet.
Rob Landley <rob@landley.net>
parents:
1537
diff
changeset
|
234 return rc; |
8bc715741481
Next drop of sed infrastructure, mostly argument parsing, doesn't do anything interesting yet.
Rob Landley <rob@landley.net>
parents:
1537
diff
changeset
|
235 */ |
1532
bf2c5216d726
Basic sed range support, enough for "sed -n 9,11p README" to work.
Rob Landley <rob@landley.net>
parents:
1530
diff
changeset
|
236 return regexec(preg, string, nmatch, pmatch, eflags); |
1538
8bc715741481
Next drop of sed infrastructure, mostly argument parsing, doesn't do anything interesting yet.
Rob Landley <rob@landley.net>
parents:
1537
diff
changeset
|
237 |
1532
bf2c5216d726
Basic sed range support, enough for "sed -n 9,11p README" to work.
Rob Landley <rob@landley.net>
parents:
1530
diff
changeset
|
238 } |
bf2c5216d726
Basic sed range support, enough for "sed -n 9,11p README" to work.
Rob Landley <rob@landley.net>
parents:
1530
diff
changeset
|
239 |
1545
b6ff5dc17763
Implement a few sed commands. Not done, and not tested yet.
Rob Landley <rob@landley.net>
parents:
1543
diff
changeset
|
240 // Extend allocation to include new string. |
b6ff5dc17763
Implement a few sed commands. Not done, and not tested yet.
Rob Landley <rob@landley.net>
parents:
1543
diff
changeset
|
241 |
b6ff5dc17763
Implement a few sed commands. Not done, and not tested yet.
Rob Landley <rob@landley.net>
parents:
1543
diff
changeset
|
242 static char *extend_string(char **old, char *new, int oldlen, int newlen) |
b6ff5dc17763
Implement a few sed commands. Not done, and not tested yet.
Rob Landley <rob@landley.net>
parents:
1543
diff
changeset
|
243 { |
b6ff5dc17763
Implement a few sed commands. Not done, and not tested yet.
Rob Landley <rob@landley.net>
parents:
1543
diff
changeset
|
244 int newline = newlen < 0; |
b6ff5dc17763
Implement a few sed commands. Not done, and not tested yet.
Rob Landley <rob@landley.net>
parents:
1543
diff
changeset
|
245 char *s; |
b6ff5dc17763
Implement a few sed commands. Not done, and not tested yet.
Rob Landley <rob@landley.net>
parents:
1543
diff
changeset
|
246 |
b6ff5dc17763
Implement a few sed commands. Not done, and not tested yet.
Rob Landley <rob@landley.net>
parents:
1543
diff
changeset
|
247 if (newline) newlen = -newlen; |
b6ff5dc17763
Implement a few sed commands. Not done, and not tested yet.
Rob Landley <rob@landley.net>
parents:
1543
diff
changeset
|
248 s = *old = xrealloc(*old, oldlen+newlen+newline+1); |
b6ff5dc17763
Implement a few sed commands. Not done, and not tested yet.
Rob Landley <rob@landley.net>
parents:
1543
diff
changeset
|
249 if (newline) s[oldlen++] = '\n'; |
b6ff5dc17763
Implement a few sed commands. Not done, and not tested yet.
Rob Landley <rob@landley.net>
parents:
1543
diff
changeset
|
250 memcpy(s+oldlen, new, newlen); |
b6ff5dc17763
Implement a few sed commands. Not done, and not tested yet.
Rob Landley <rob@landley.net>
parents:
1543
diff
changeset
|
251 s[oldlen+newlen] = 0; |
b6ff5dc17763
Implement a few sed commands. Not done, and not tested yet.
Rob Landley <rob@landley.net>
parents:
1543
diff
changeset
|
252 |
b6ff5dc17763
Implement a few sed commands. Not done, and not tested yet.
Rob Landley <rob@landley.net>
parents:
1543
diff
changeset
|
253 return s+oldlen+newlen; |
b6ff5dc17763
Implement a few sed commands. Not done, and not tested yet.
Rob Landley <rob@landley.net>
parents:
1543
diff
changeset
|
254 } |
b6ff5dc17763
Implement a few sed commands. Not done, and not tested yet.
Rob Landley <rob@landley.net>
parents:
1543
diff
changeset
|
255 |
1530
3eafa445c1a6
Random in-progress snapshot of sed, not finished yet.
Rob Landley <rob@landley.net>
parents:
1520
diff
changeset
|
256 // Apply pattern to line from input file |
1538
8bc715741481
Next drop of sed infrastructure, mostly argument parsing, doesn't do anything interesting yet.
Rob Landley <rob@landley.net>
parents:
1537
diff
changeset
|
257 static void walk_pattern(char **pline, long plen) |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
674
diff
changeset
|
258 { |
1545
b6ff5dc17763
Implement a few sed commands. Not done, and not tested yet.
Rob Landley <rob@landley.net>
parents:
1543
diff
changeset
|
259 char *line = TT.nextline, *append = 0; |
1532
bf2c5216d726
Basic sed range support, enough for "sed -n 9,11p README" to work.
Rob Landley <rob@landley.net>
parents:
1530
diff
changeset
|
260 long len = TT.nextlen; |
bf2c5216d726
Basic sed range support, enough for "sed -n 9,11p README" to work.
Rob Landley <rob@landley.net>
parents:
1530
diff
changeset
|
261 struct step *logrus; |
1545
b6ff5dc17763
Implement a few sed commands. Not done, and not tested yet.
Rob Landley <rob@landley.net>
parents:
1543
diff
changeset
|
262 int eol = 0, tea = 0; |
1532
bf2c5216d726
Basic sed range support, enough for "sed -n 9,11p README" to work.
Rob Landley <rob@landley.net>
parents:
1530
diff
changeset
|
263 |
1545
b6ff5dc17763
Implement a few sed commands. Not done, and not tested yet.
Rob Landley <rob@landley.net>
parents:
1543
diff
changeset
|
264 // Grab next line for deferred processing (EOF detection: we get a NULL |
1532
bf2c5216d726
Basic sed range support, enough for "sed -n 9,11p README" to work.
Rob Landley <rob@landley.net>
parents:
1530
diff
changeset
|
265 // pline at EOF to flush last line). Note that only end of _last_ input |
bf2c5216d726
Basic sed range support, enough for "sed -n 9,11p README" to work.
Rob Landley <rob@landley.net>
parents:
1530
diff
changeset
|
266 // file matches $ (unless we're doing -i). |
bf2c5216d726
Basic sed range support, enough for "sed -n 9,11p README" to work.
Rob Landley <rob@landley.net>
parents:
1530
diff
changeset
|
267 if (pline) { |
bf2c5216d726
Basic sed range support, enough for "sed -n 9,11p README" to work.
Rob Landley <rob@landley.net>
parents:
1530
diff
changeset
|
268 TT.nextline = *pline; |
bf2c5216d726
Basic sed range support, enough for "sed -n 9,11p README" to work.
Rob Landley <rob@landley.net>
parents:
1530
diff
changeset
|
269 TT.nextlen = plen; |
bf2c5216d726
Basic sed range support, enough for "sed -n 9,11p README" to work.
Rob Landley <rob@landley.net>
parents:
1530
diff
changeset
|
270 *pline = 0; |
bf2c5216d726
Basic sed range support, enough for "sed -n 9,11p README" to work.
Rob Landley <rob@landley.net>
parents:
1530
diff
changeset
|
271 } |
bf2c5216d726
Basic sed range support, enough for "sed -n 9,11p README" to work.
Rob Landley <rob@landley.net>
parents:
1530
diff
changeset
|
272 |
bf2c5216d726
Basic sed range support, enough for "sed -n 9,11p README" to work.
Rob Landley <rob@landley.net>
parents:
1530
diff
changeset
|
273 if (!line || !len) return; |
bf2c5216d726
Basic sed range support, enough for "sed -n 9,11p README" to work.
Rob Landley <rob@landley.net>
parents:
1530
diff
changeset
|
274 if (line[len-1] == '\n') line[--len] = eol++; |
bf2c5216d726
Basic sed range support, enough for "sed -n 9,11p README" to work.
Rob Landley <rob@landley.net>
parents:
1530
diff
changeset
|
275 TT.count++; |
bf2c5216d726
Basic sed range support, enough for "sed -n 9,11p README" to work.
Rob Landley <rob@landley.net>
parents:
1530
diff
changeset
|
276 |
1545
b6ff5dc17763
Implement a few sed commands. Not done, and not tested yet.
Rob Landley <rob@landley.net>
parents:
1543
diff
changeset
|
277 logrus = TT.restart ? TT.restart : (void *)TT.pattern; |
b6ff5dc17763
Implement a few sed commands. Not done, and not tested yet.
Rob Landley <rob@landley.net>
parents:
1543
diff
changeset
|
278 TT.restart = 0; |
b6ff5dc17763
Implement a few sed commands. Not done, and not tested yet.
Rob Landley <rob@landley.net>
parents:
1543
diff
changeset
|
279 while (logrus) { |
b6ff5dc17763
Implement a few sed commands. Not done, and not tested yet.
Rob Landley <rob@landley.net>
parents:
1543
diff
changeset
|
280 char *str, c = logrus->c; |
1532
bf2c5216d726
Basic sed range support, enough for "sed -n 9,11p README" to work.
Rob Landley <rob@landley.net>
parents:
1530
diff
changeset
|
281 |
bf2c5216d726
Basic sed range support, enough for "sed -n 9,11p README" to work.
Rob Landley <rob@landley.net>
parents:
1530
diff
changeset
|
282 // Have we got a matching range for this rule? |
1538
8bc715741481
Next drop of sed infrastructure, mostly argument parsing, doesn't do anything interesting yet.
Rob Landley <rob@landley.net>
parents:
1537
diff
changeset
|
283 if (*logrus->lmatch || *logrus->rmatch) { |
1532
bf2c5216d726
Basic sed range support, enough for "sed -n 9,11p README" to work.
Rob Landley <rob@landley.net>
parents:
1530
diff
changeset
|
284 int miss = 0; |
bf2c5216d726
Basic sed range support, enough for "sed -n 9,11p README" to work.
Rob Landley <rob@landley.net>
parents:
1530
diff
changeset
|
285 long lm; |
bf2c5216d726
Basic sed range support, enough for "sed -n 9,11p README" to work.
Rob Landley <rob@landley.net>
parents:
1530
diff
changeset
|
286 |
bf2c5216d726
Basic sed range support, enough for "sed -n 9,11p README" to work.
Rob Landley <rob@landley.net>
parents:
1530
diff
changeset
|
287 // In a match that might end? |
bf2c5216d726
Basic sed range support, enough for "sed -n 9,11p README" to work.
Rob Landley <rob@landley.net>
parents:
1530
diff
changeset
|
288 if (logrus->hit) { |
bf2c5216d726
Basic sed range support, enough for "sed -n 9,11p README" to work.
Rob Landley <rob@landley.net>
parents:
1530
diff
changeset
|
289 if (!(lm = logrus->lmatch[1])) { |
1538
8bc715741481
Next drop of sed infrastructure, mostly argument parsing, doesn't do anything interesting yet.
Rob Landley <rob@landley.net>
parents:
1537
diff
changeset
|
290 if (!logrus->rmatch[1]) logrus->hit = 0; |
1532
bf2c5216d726
Basic sed range support, enough for "sed -n 9,11p README" to work.
Rob Landley <rob@landley.net>
parents:
1530
diff
changeset
|
291 else { |
1538
8bc715741481
Next drop of sed infrastructure, mostly argument parsing, doesn't do anything interesting yet.
Rob Landley <rob@landley.net>
parents:
1537
diff
changeset
|
292 void *rm = logrus->rmatch[1] + (char *)logrus; |
8bc715741481
Next drop of sed infrastructure, mostly argument parsing, doesn't do anything interesting yet.
Rob Landley <rob@landley.net>
parents:
1537
diff
changeset
|
293 |
1532
bf2c5216d726
Basic sed range support, enough for "sed -n 9,11p README" to work.
Rob Landley <rob@landley.net>
parents:
1530
diff
changeset
|
294 // regex match end includes matching line, so defer deactivation |
1538
8bc715741481
Next drop of sed infrastructure, mostly argument parsing, doesn't do anything interesting yet.
Rob Landley <rob@landley.net>
parents:
1537
diff
changeset
|
295 if (!ghostwheel(rm, line, len, 0, 0, 0)) miss = 1; |
1532
bf2c5216d726
Basic sed range support, enough for "sed -n 9,11p README" to work.
Rob Landley <rob@landley.net>
parents:
1530
diff
changeset
|
296 } |
bf2c5216d726
Basic sed range support, enough for "sed -n 9,11p README" to work.
Rob Landley <rob@landley.net>
parents:
1530
diff
changeset
|
297 } else if (lm > 0 && lm < TT.count) logrus->hit = 0; |
bf2c5216d726
Basic sed range support, enough for "sed -n 9,11p README" to work.
Rob Landley <rob@landley.net>
parents:
1530
diff
changeset
|
298 |
bf2c5216d726
Basic sed range support, enough for "sed -n 9,11p README" to work.
Rob Landley <rob@landley.net>
parents:
1530
diff
changeset
|
299 // Start a new match? |
bf2c5216d726
Basic sed range support, enough for "sed -n 9,11p README" to work.
Rob Landley <rob@landley.net>
parents:
1530
diff
changeset
|
300 } else { |
bf2c5216d726
Basic sed range support, enough for "sed -n 9,11p README" to work.
Rob Landley <rob@landley.net>
parents:
1530
diff
changeset
|
301 if (!(lm = *logrus->lmatch)) { |
1538
8bc715741481
Next drop of sed infrastructure, mostly argument parsing, doesn't do anything interesting yet.
Rob Landley <rob@landley.net>
parents:
1537
diff
changeset
|
302 void *rm = *logrus->rmatch + (char *)logrus; |
8bc715741481
Next drop of sed infrastructure, mostly argument parsing, doesn't do anything interesting yet.
Rob Landley <rob@landley.net>
parents:
1537
diff
changeset
|
303 |
8bc715741481
Next drop of sed infrastructure, mostly argument parsing, doesn't do anything interesting yet.
Rob Landley <rob@landley.net>
parents:
1537
diff
changeset
|
304 if (!ghostwheel(rm, line, len, 0, 0, 0)) logrus->hit++; |
8bc715741481
Next drop of sed infrastructure, mostly argument parsing, doesn't do anything interesting yet.
Rob Landley <rob@landley.net>
parents:
1537
diff
changeset
|
305 } else if (lm == TT.count || (lm == -1 && !pline)) logrus->hit++; |
1532
bf2c5216d726
Basic sed range support, enough for "sed -n 9,11p README" to work.
Rob Landley <rob@landley.net>
parents:
1530
diff
changeset
|
306 } |
bf2c5216d726
Basic sed range support, enough for "sed -n 9,11p README" to work.
Rob Landley <rob@landley.net>
parents:
1530
diff
changeset
|
307 |
1538
8bc715741481
Next drop of sed infrastructure, mostly argument parsing, doesn't do anything interesting yet.
Rob Landley <rob@landley.net>
parents:
1537
diff
changeset
|
308 // Didn't match? |
8bc715741481
Next drop of sed infrastructure, mostly argument parsing, doesn't do anything interesting yet.
Rob Landley <rob@landley.net>
parents:
1537
diff
changeset
|
309 if (!(logrus->hit ^ logrus->not)) { |
8bc715741481
Next drop of sed infrastructure, mostly argument parsing, doesn't do anything interesting yet.
Rob Landley <rob@landley.net>
parents:
1537
diff
changeset
|
310 |
8bc715741481
Next drop of sed infrastructure, mostly argument parsing, doesn't do anything interesting yet.
Rob Landley <rob@landley.net>
parents:
1537
diff
changeset
|
311 // Handle skipping curly bracket command group |
8bc715741481
Next drop of sed infrastructure, mostly argument parsing, doesn't do anything interesting yet.
Rob Landley <rob@landley.net>
parents:
1537
diff
changeset
|
312 if (c == '{') { |
8bc715741481
Next drop of sed infrastructure, mostly argument parsing, doesn't do anything interesting yet.
Rob Landley <rob@landley.net>
parents:
1537
diff
changeset
|
313 int curly = 1; |
8bc715741481
Next drop of sed infrastructure, mostly argument parsing, doesn't do anything interesting yet.
Rob Landley <rob@landley.net>
parents:
1537
diff
changeset
|
314 |
8bc715741481
Next drop of sed infrastructure, mostly argument parsing, doesn't do anything interesting yet.
Rob Landley <rob@landley.net>
parents:
1537
diff
changeset
|
315 while (curly) { |
8bc715741481
Next drop of sed infrastructure, mostly argument parsing, doesn't do anything interesting yet.
Rob Landley <rob@landley.net>
parents:
1537
diff
changeset
|
316 logrus = logrus->next; |
8bc715741481
Next drop of sed infrastructure, mostly argument parsing, doesn't do anything interesting yet.
Rob Landley <rob@landley.net>
parents:
1537
diff
changeset
|
317 if (logrus->c == '{') curly++; |
8bc715741481
Next drop of sed infrastructure, mostly argument parsing, doesn't do anything interesting yet.
Rob Landley <rob@landley.net>
parents:
1537
diff
changeset
|
318 if (logrus->c == '}') curly--; |
8bc715741481
Next drop of sed infrastructure, mostly argument parsing, doesn't do anything interesting yet.
Rob Landley <rob@landley.net>
parents:
1537
diff
changeset
|
319 } |
8bc715741481
Next drop of sed infrastructure, mostly argument parsing, doesn't do anything interesting yet.
Rob Landley <rob@landley.net>
parents:
1537
diff
changeset
|
320 } |
8bc715741481
Next drop of sed infrastructure, mostly argument parsing, doesn't do anything interesting yet.
Rob Landley <rob@landley.net>
parents:
1537
diff
changeset
|
321 continue; |
8bc715741481
Next drop of sed infrastructure, mostly argument parsing, doesn't do anything interesting yet.
Rob Landley <rob@landley.net>
parents:
1537
diff
changeset
|
322 } |
8bc715741481
Next drop of sed infrastructure, mostly argument parsing, doesn't do anything interesting yet.
Rob Landley <rob@landley.net>
parents:
1537
diff
changeset
|
323 // Deferred disable from regex end match |
1532
bf2c5216d726
Basic sed range support, enough for "sed -n 9,11p README" to work.
Rob Landley <rob@landley.net>
parents:
1530
diff
changeset
|
324 if (miss) logrus->hit = 0; |
bf2c5216d726
Basic sed range support, enough for "sed -n 9,11p README" to work.
Rob Landley <rob@landley.net>
parents:
1530
diff
changeset
|
325 } |
bf2c5216d726
Basic sed range support, enough for "sed -n 9,11p README" to work.
Rob Landley <rob@landley.net>
parents:
1530
diff
changeset
|
326 |
1545
b6ff5dc17763
Implement a few sed commands. Not done, and not tested yet.
Rob Landley <rob@landley.net>
parents:
1543
diff
changeset
|
327 // Process command |
b6ff5dc17763
Implement a few sed commands. Not done, and not tested yet.
Rob Landley <rob@landley.net>
parents:
1543
diff
changeset
|
328 |
b6ff5dc17763
Implement a few sed commands. Not done, and not tested yet.
Rob Landley <rob@landley.net>
parents:
1543
diff
changeset
|
329 if (c == 'a') { |
b6ff5dc17763
Implement a few sed commands. Not done, and not tested yet.
Rob Landley <rob@landley.net>
parents:
1543
diff
changeset
|
330 long alen = append ? strlen(append) : 0; |
b6ff5dc17763
Implement a few sed commands. Not done, and not tested yet.
Rob Landley <rob@landley.net>
parents:
1543
diff
changeset
|
331 |
b6ff5dc17763
Implement a few sed commands. Not done, and not tested yet.
Rob Landley <rob@landley.net>
parents:
1543
diff
changeset
|
332 str = logrus->arg1+(char *)logrus; |
b6ff5dc17763
Implement a few sed commands. Not done, and not tested yet.
Rob Landley <rob@landley.net>
parents:
1543
diff
changeset
|
333 extend_string(&append, str, alen, -strlen(str)); |
b6ff5dc17763
Implement a few sed commands. Not done, and not tested yet.
Rob Landley <rob@landley.net>
parents:
1543
diff
changeset
|
334 } else if (c == 'b') { |
b6ff5dc17763
Implement a few sed commands. Not done, and not tested yet.
Rob Landley <rob@landley.net>
parents:
1543
diff
changeset
|
335 str = logrus->arg1+(char *)logrus; |
1532
bf2c5216d726
Basic sed range support, enough for "sed -n 9,11p README" to work.
Rob Landley <rob@landley.net>
parents:
1530
diff
changeset
|
336 |
1545
b6ff5dc17763
Implement a few sed commands. Not done, and not tested yet.
Rob Landley <rob@landley.net>
parents:
1543
diff
changeset
|
337 if (!*str) break; |
b6ff5dc17763
Implement a few sed commands. Not done, and not tested yet.
Rob Landley <rob@landley.net>
parents:
1543
diff
changeset
|
338 for (logrus = (void *)TT.pattern; logrus; logrus = logrus->next) |
b6ff5dc17763
Implement a few sed commands. Not done, and not tested yet.
Rob Landley <rob@landley.net>
parents:
1543
diff
changeset
|
339 if (logrus->c == ':' && !strcmp(logrus->arg1+(char *)logrus, str)) |
b6ff5dc17763
Implement a few sed commands. Not done, and not tested yet.
Rob Landley <rob@landley.net>
parents:
1543
diff
changeset
|
340 break; |
b6ff5dc17763
Implement a few sed commands. Not done, and not tested yet.
Rob Landley <rob@landley.net>
parents:
1543
diff
changeset
|
341 if (!logrus) error_exit("no :%s", str); |
b6ff5dc17763
Implement a few sed commands. Not done, and not tested yet.
Rob Landley <rob@landley.net>
parents:
1543
diff
changeset
|
342 } else if (c == 'd') goto done; |
b6ff5dc17763
Implement a few sed commands. Not done, and not tested yet.
Rob Landley <rob@landley.net>
parents:
1543
diff
changeset
|
343 else if (c == 'D') { |
b6ff5dc17763
Implement a few sed commands. Not done, and not tested yet.
Rob Landley <rob@landley.net>
parents:
1543
diff
changeset
|
344 // Delete up to \n or end of buffer |
b6ff5dc17763
Implement a few sed commands. Not done, and not tested yet.
Rob Landley <rob@landley.net>
parents:
1543
diff
changeset
|
345 for (str = line; !*str || *str == '\n'; str++); |
b6ff5dc17763
Implement a few sed commands. Not done, and not tested yet.
Rob Landley <rob@landley.net>
parents:
1543
diff
changeset
|
346 len -= str - line; |
b6ff5dc17763
Implement a few sed commands. Not done, and not tested yet.
Rob Landley <rob@landley.net>
parents:
1543
diff
changeset
|
347 memmove(line, str, len); |
b6ff5dc17763
Implement a few sed commands. Not done, and not tested yet.
Rob Landley <rob@landley.net>
parents:
1543
diff
changeset
|
348 line[len] = 0; |
1538
8bc715741481
Next drop of sed infrastructure, mostly argument parsing, doesn't do anything interesting yet.
Rob Landley <rob@landley.net>
parents:
1537
diff
changeset
|
349 |
1545
b6ff5dc17763
Implement a few sed commands. Not done, and not tested yet.
Rob Landley <rob@landley.net>
parents:
1543
diff
changeset
|
350 // restart script |
b6ff5dc17763
Implement a few sed commands. Not done, and not tested yet.
Rob Landley <rob@landley.net>
parents:
1543
diff
changeset
|
351 logrus = (void *)TT.pattern; |
b6ff5dc17763
Implement a few sed commands. Not done, and not tested yet.
Rob Landley <rob@landley.net>
parents:
1543
diff
changeset
|
352 continue; |
b6ff5dc17763
Implement a few sed commands. Not done, and not tested yet.
Rob Landley <rob@landley.net>
parents:
1543
diff
changeset
|
353 } else if (c == 'g') { |
b6ff5dc17763
Implement a few sed commands. Not done, and not tested yet.
Rob Landley <rob@landley.net>
parents:
1543
diff
changeset
|
354 free(line); |
b6ff5dc17763
Implement a few sed commands. Not done, and not tested yet.
Rob Landley <rob@landley.net>
parents:
1543
diff
changeset
|
355 line = xstrdup(TT.remember); |
b6ff5dc17763
Implement a few sed commands. Not done, and not tested yet.
Rob Landley <rob@landley.net>
parents:
1543
diff
changeset
|
356 len = TT.rememberlen; |
b6ff5dc17763
Implement a few sed commands. Not done, and not tested yet.
Rob Landley <rob@landley.net>
parents:
1543
diff
changeset
|
357 } else if (c == 'G') { |
b6ff5dc17763
Implement a few sed commands. Not done, and not tested yet.
Rob Landley <rob@landley.net>
parents:
1543
diff
changeset
|
358 line = xrealloc(line, len+TT.rememberlen+2); |
b6ff5dc17763
Implement a few sed commands. Not done, and not tested yet.
Rob Landley <rob@landley.net>
parents:
1543
diff
changeset
|
359 line[len++] = '\n'; |
b6ff5dc17763
Implement a few sed commands. Not done, and not tested yet.
Rob Landley <rob@landley.net>
parents:
1543
diff
changeset
|
360 memcpy(line+len, TT.remember, TT.rememberlen); |
b6ff5dc17763
Implement a few sed commands. Not done, and not tested yet.
Rob Landley <rob@landley.net>
parents:
1543
diff
changeset
|
361 line[len += TT.rememberlen] = 0; |
b6ff5dc17763
Implement a few sed commands. Not done, and not tested yet.
Rob Landley <rob@landley.net>
parents:
1543
diff
changeset
|
362 } else if (c == 'h') { |
b6ff5dc17763
Implement a few sed commands. Not done, and not tested yet.
Rob Landley <rob@landley.net>
parents:
1543
diff
changeset
|
363 free(TT.remember); |
b6ff5dc17763
Implement a few sed commands. Not done, and not tested yet.
Rob Landley <rob@landley.net>
parents:
1543
diff
changeset
|
364 TT.remember = xstrdup(line); |
b6ff5dc17763
Implement a few sed commands. Not done, and not tested yet.
Rob Landley <rob@landley.net>
parents:
1543
diff
changeset
|
365 TT.rememberlen = len; |
b6ff5dc17763
Implement a few sed commands. Not done, and not tested yet.
Rob Landley <rob@landley.net>
parents:
1543
diff
changeset
|
366 } else if (c == 'H') { |
b6ff5dc17763
Implement a few sed commands. Not done, and not tested yet.
Rob Landley <rob@landley.net>
parents:
1543
diff
changeset
|
367 TT.remember = xrealloc(TT.remember, TT.rememberlen+len+2); |
b6ff5dc17763
Implement a few sed commands. Not done, and not tested yet.
Rob Landley <rob@landley.net>
parents:
1543
diff
changeset
|
368 TT.remember[TT.rememberlen++] = '\n'; |
b6ff5dc17763
Implement a few sed commands. Not done, and not tested yet.
Rob Landley <rob@landley.net>
parents:
1543
diff
changeset
|
369 memcpy(TT.remember+TT.rememberlen, line, len); |
b6ff5dc17763
Implement a few sed commands. Not done, and not tested yet.
Rob Landley <rob@landley.net>
parents:
1543
diff
changeset
|
370 TT.remember[TT.rememberlen += len] = 0; |
b6ff5dc17763
Implement a few sed commands. Not done, and not tested yet.
Rob Landley <rob@landley.net>
parents:
1543
diff
changeset
|
371 } else if (c == 'l') { |
b6ff5dc17763
Implement a few sed commands. Not done, and not tested yet.
Rob Landley <rob@landley.net>
parents:
1543
diff
changeset
|
372 error_exit("todo: l"); |
b6ff5dc17763
Implement a few sed commands. Not done, and not tested yet.
Rob Landley <rob@landley.net>
parents:
1543
diff
changeset
|
373 } else if (c == 'n') { |
b6ff5dc17763
Implement a few sed commands. Not done, and not tested yet.
Rob Landley <rob@landley.net>
parents:
1543
diff
changeset
|
374 TT.restart = logrus->next; |
b6ff5dc17763
Implement a few sed commands. Not done, and not tested yet.
Rob Landley <rob@landley.net>
parents:
1543
diff
changeset
|
375 |
b6ff5dc17763
Implement a few sed commands. Not done, and not tested yet.
Rob Landley <rob@landley.net>
parents:
1543
diff
changeset
|
376 break; |
b6ff5dc17763
Implement a few sed commands. Not done, and not tested yet.
Rob Landley <rob@landley.net>
parents:
1543
diff
changeset
|
377 } else if (c == 'N') { |
b6ff5dc17763
Implement a few sed commands. Not done, and not tested yet.
Rob Landley <rob@landley.net>
parents:
1543
diff
changeset
|
378 if (pline) { |
b6ff5dc17763
Implement a few sed commands. Not done, and not tested yet.
Rob Landley <rob@landley.net>
parents:
1543
diff
changeset
|
379 TT.restart = logrus->next; |
b6ff5dc17763
Implement a few sed commands. Not done, and not tested yet.
Rob Landley <rob@landley.net>
parents:
1543
diff
changeset
|
380 extend_string(&line, TT.nextline, plen, -TT.nextlen); |
b6ff5dc17763
Implement a few sed commands. Not done, and not tested yet.
Rob Landley <rob@landley.net>
parents:
1543
diff
changeset
|
381 free(TT.nextline); |
b6ff5dc17763
Implement a few sed commands. Not done, and not tested yet.
Rob Landley <rob@landley.net>
parents:
1543
diff
changeset
|
382 TT.nextline = line; |
b6ff5dc17763
Implement a few sed commands. Not done, and not tested yet.
Rob Landley <rob@landley.net>
parents:
1543
diff
changeset
|
383 } |
b6ff5dc17763
Implement a few sed commands. Not done, and not tested yet.
Rob Landley <rob@landley.net>
parents:
1543
diff
changeset
|
384 |
b6ff5dc17763
Implement a few sed commands. Not done, and not tested yet.
Rob Landley <rob@landley.net>
parents:
1543
diff
changeset
|
385 goto append; |
b6ff5dc17763
Implement a few sed commands. Not done, and not tested yet.
Rob Landley <rob@landley.net>
parents:
1543
diff
changeset
|
386 } else if (c == 'p') { |
1532
bf2c5216d726
Basic sed range support, enough for "sed -n 9,11p README" to work.
Rob Landley <rob@landley.net>
parents:
1530
diff
changeset
|
387 if (emit(line, len, eol)) break; |
1545
b6ff5dc17763
Implement a few sed commands. Not done, and not tested yet.
Rob Landley <rob@landley.net>
parents:
1543
diff
changeset
|
388 } else if (c == 'q') break; |
b6ff5dc17763
Implement a few sed commands. Not done, and not tested yet.
Rob Landley <rob@landley.net>
parents:
1543
diff
changeset
|
389 else if (c == 'x') { |
b6ff5dc17763
Implement a few sed commands. Not done, and not tested yet.
Rob Landley <rob@landley.net>
parents:
1543
diff
changeset
|
390 long swap = TT.rememberlen; |
b6ff5dc17763
Implement a few sed commands. Not done, and not tested yet.
Rob Landley <rob@landley.net>
parents:
1543
diff
changeset
|
391 |
b6ff5dc17763
Implement a few sed commands. Not done, and not tested yet.
Rob Landley <rob@landley.net>
parents:
1543
diff
changeset
|
392 str = TT.remember; |
b6ff5dc17763
Implement a few sed commands. Not done, and not tested yet.
Rob Landley <rob@landley.net>
parents:
1543
diff
changeset
|
393 TT.remember = line; |
b6ff5dc17763
Implement a few sed commands. Not done, and not tested yet.
Rob Landley <rob@landley.net>
parents:
1543
diff
changeset
|
394 line = str; |
b6ff5dc17763
Implement a few sed commands. Not done, and not tested yet.
Rob Landley <rob@landley.net>
parents:
1543
diff
changeset
|
395 TT.rememberlen = len; |
b6ff5dc17763
Implement a few sed commands. Not done, and not tested yet.
Rob Landley <rob@landley.net>
parents:
1543
diff
changeset
|
396 len = swap; |
b6ff5dc17763
Implement a few sed commands. Not done, and not tested yet.
Rob Landley <rob@landley.net>
parents:
1543
diff
changeset
|
397 } else if (c == '=') xprintf("%ld\n", TT.count); |
b6ff5dc17763
Implement a few sed commands. Not done, and not tested yet.
Rob Landley <rob@landley.net>
parents:
1543
diff
changeset
|
398 // labcirstTwy |
b6ff5dc17763
Implement a few sed commands. Not done, and not tested yet.
Rob Landley <rob@landley.net>
parents:
1543
diff
changeset
|
399 else if (c != ':') error_exit("todo: %c", c); |
b6ff5dc17763
Implement a few sed commands. Not done, and not tested yet.
Rob Landley <rob@landley.net>
parents:
1543
diff
changeset
|
400 |
b6ff5dc17763
Implement a few sed commands. Not done, and not tested yet.
Rob Landley <rob@landley.net>
parents:
1543
diff
changeset
|
401 logrus = logrus->next; |
1532
bf2c5216d726
Basic sed range support, enough for "sed -n 9,11p README" to work.
Rob Landley <rob@landley.net>
parents:
1530
diff
changeset
|
402 } |
bf2c5216d726
Basic sed range support, enough for "sed -n 9,11p README" to work.
Rob Landley <rob@landley.net>
parents:
1530
diff
changeset
|
403 |
bf2c5216d726
Basic sed range support, enough for "sed -n 9,11p README" to work.
Rob Landley <rob@landley.net>
parents:
1530
diff
changeset
|
404 if (!(toys.optflags & FLAG_n)) emit(line, len, eol); |
bf2c5216d726
Basic sed range support, enough for "sed -n 9,11p README" to work.
Rob Landley <rob@landley.net>
parents:
1530
diff
changeset
|
405 |
1545
b6ff5dc17763
Implement a few sed commands. Not done, and not tested yet.
Rob Landley <rob@landley.net>
parents:
1543
diff
changeset
|
406 done: |
1532
bf2c5216d726
Basic sed range support, enough for "sed -n 9,11p README" to work.
Rob Landley <rob@landley.net>
parents:
1530
diff
changeset
|
407 free(line); |
1545
b6ff5dc17763
Implement a few sed commands. Not done, and not tested yet.
Rob Landley <rob@landley.net>
parents:
1543
diff
changeset
|
408 |
b6ff5dc17763
Implement a few sed commands. Not done, and not tested yet.
Rob Landley <rob@landley.net>
parents:
1543
diff
changeset
|
409 append: |
b6ff5dc17763
Implement a few sed commands. Not done, and not tested yet.
Rob Landley <rob@landley.net>
parents:
1543
diff
changeset
|
410 if (append) { |
b6ff5dc17763
Implement a few sed commands. Not done, and not tested yet.
Rob Landley <rob@landley.net>
parents:
1543
diff
changeset
|
411 emit(append, strlen(append), 1); |
b6ff5dc17763
Implement a few sed commands. Not done, and not tested yet.
Rob Landley <rob@landley.net>
parents:
1543
diff
changeset
|
412 free(append); |
b6ff5dc17763
Implement a few sed commands. Not done, and not tested yet.
Rob Landley <rob@landley.net>
parents:
1543
diff
changeset
|
413 } |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
674
diff
changeset
|
414 } |
231
31dc682c18ad
Very early stub of sed, does nothing yet.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
415 |
1530
3eafa445c1a6
Random in-progress snapshot of sed, not finished yet.
Rob Landley <rob@landley.net>
parents:
1520
diff
changeset
|
416 // Genericish function, can probably get moved to lib.c |
3eafa445c1a6
Random in-progress snapshot of sed, not finished yet.
Rob Landley <rob@landley.net>
parents:
1520
diff
changeset
|
417 |
3eafa445c1a6
Random in-progress snapshot of sed, not finished yet.
Rob Landley <rob@landley.net>
parents:
1520
diff
changeset
|
418 // Iterate over lines in file, calling function. Function can write NULL to |
3eafa445c1a6
Random in-progress snapshot of sed, not finished yet.
Rob Landley <rob@landley.net>
parents:
1520
diff
changeset
|
419 // the line pointer if they want to keep it, otherwise line is freed. |
3eafa445c1a6
Random in-progress snapshot of sed, not finished yet.
Rob Landley <rob@landley.net>
parents:
1520
diff
changeset
|
420 // Passed file descriptor is closed at the end of processing. |
1520
dfd6b3404c16
Started over on sed (by reading the posix spec).
Rob Landley <rob@landley.net>
parents:
1235
diff
changeset
|
421 static void do_lines(int fd, char *name, void (*call)(char **pline, long len)) |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
674
diff
changeset
|
422 { |
1543
ad6b2f0e566b
Next round of sed infrastructure, parses most commands now, doesn't implement them yet.
Rob Landley <rob@landley.net>
parents:
1538
diff
changeset
|
423 FILE *fp = fd ? xfdopen(fd, "r") : stdin; |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
674
diff
changeset
|
424 |
1520
dfd6b3404c16
Started over on sed (by reading the posix spec).
Rob Landley <rob@landley.net>
parents:
1235
diff
changeset
|
425 for (;;) { |
dfd6b3404c16
Started over on sed (by reading the posix spec).
Rob Landley <rob@landley.net>
parents:
1235
diff
changeset
|
426 char *line = 0; |
dfd6b3404c16
Started over on sed (by reading the posix spec).
Rob Landley <rob@landley.net>
parents:
1235
diff
changeset
|
427 ssize_t len; |
231
31dc682c18ad
Very early stub of sed, does nothing yet.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
428 |
1520
dfd6b3404c16
Started over on sed (by reading the posix spec).
Rob Landley <rob@landley.net>
parents:
1235
diff
changeset
|
429 len = getline(&line, (void *)&len, fp); |
1538
8bc715741481
Next drop of sed infrastructure, mostly argument parsing, doesn't do anything interesting yet.
Rob Landley <rob@landley.net>
parents:
1537
diff
changeset
|
430 if (len > 0) { |
8bc715741481
Next drop of sed infrastructure, mostly argument parsing, doesn't do anything interesting yet.
Rob Landley <rob@landley.net>
parents:
1537
diff
changeset
|
431 call(&line, len); |
8bc715741481
Next drop of sed infrastructure, mostly argument parsing, doesn't do anything interesting yet.
Rob Landley <rob@landley.net>
parents:
1537
diff
changeset
|
432 free(line); |
8bc715741481
Next drop of sed infrastructure, mostly argument parsing, doesn't do anything interesting yet.
Rob Landley <rob@landley.net>
parents:
1537
diff
changeset
|
433 } else break; |
1520
dfd6b3404c16
Started over on sed (by reading the posix spec).
Rob Landley <rob@landley.net>
parents:
1235
diff
changeset
|
434 } |
1543
ad6b2f0e566b
Next round of sed infrastructure, parses most commands now, doesn't implement them yet.
Rob Landley <rob@landley.net>
parents:
1538
diff
changeset
|
435 |
ad6b2f0e566b
Next round of sed infrastructure, parses most commands now, doesn't implement them yet.
Rob Landley <rob@landley.net>
parents:
1538
diff
changeset
|
436 if (fd) fclose(fp); |
1530
3eafa445c1a6
Random in-progress snapshot of sed, not finished yet.
Rob Landley <rob@landley.net>
parents:
1520
diff
changeset
|
437 } |
3eafa445c1a6
Random in-progress snapshot of sed, not finished yet.
Rob Landley <rob@landley.net>
parents:
1520
diff
changeset
|
438 |
3eafa445c1a6
Random in-progress snapshot of sed, not finished yet.
Rob Landley <rob@landley.net>
parents:
1520
diff
changeset
|
439 // Iterate over newline delimited data blob (potentially with embedded NUL), |
3eafa445c1a6
Random in-progress snapshot of sed, not finished yet.
Rob Landley <rob@landley.net>
parents:
1520
diff
changeset
|
440 // call function on each line. |
1532
bf2c5216d726
Basic sed range support, enough for "sed -n 9,11p README" to work.
Rob Landley <rob@landley.net>
parents:
1530
diff
changeset
|
441 static void chop_lines(char *data, long len, void (*call)(char **p, long l)) |
1530
3eafa445c1a6
Random in-progress snapshot of sed, not finished yet.
Rob Landley <rob@landley.net>
parents:
1520
diff
changeset
|
442 { |
3eafa445c1a6
Random in-progress snapshot of sed, not finished yet.
Rob Landley <rob@landley.net>
parents:
1520
diff
changeset
|
443 long ll; |
3eafa445c1a6
Random in-progress snapshot of sed, not finished yet.
Rob Landley <rob@landley.net>
parents:
1520
diff
changeset
|
444 |
3eafa445c1a6
Random in-progress snapshot of sed, not finished yet.
Rob Landley <rob@landley.net>
parents:
1520
diff
changeset
|
445 for (ll = 0; ll < len; ll++) { |
3eafa445c1a6
Random in-progress snapshot of sed, not finished yet.
Rob Landley <rob@landley.net>
parents:
1520
diff
changeset
|
446 if (data[ll] == '\n') { |
3eafa445c1a6
Random in-progress snapshot of sed, not finished yet.
Rob Landley <rob@landley.net>
parents:
1520
diff
changeset
|
447 char *c = data; |
3eafa445c1a6
Random in-progress snapshot of sed, not finished yet.
Rob Landley <rob@landley.net>
parents:
1520
diff
changeset
|
448 |
3eafa445c1a6
Random in-progress snapshot of sed, not finished yet.
Rob Landley <rob@landley.net>
parents:
1520
diff
changeset
|
449 data[ll] = 0; |
3eafa445c1a6
Random in-progress snapshot of sed, not finished yet.
Rob Landley <rob@landley.net>
parents:
1520
diff
changeset
|
450 call(&c, len); |
3eafa445c1a6
Random in-progress snapshot of sed, not finished yet.
Rob Landley <rob@landley.net>
parents:
1520
diff
changeset
|
451 data[ll++] = '\n'; |
3eafa445c1a6
Random in-progress snapshot of sed, not finished yet.
Rob Landley <rob@landley.net>
parents:
1520
diff
changeset
|
452 data += ll; |
3eafa445c1a6
Random in-progress snapshot of sed, not finished yet.
Rob Landley <rob@landley.net>
parents:
1520
diff
changeset
|
453 len -= ll; |
3eafa445c1a6
Random in-progress snapshot of sed, not finished yet.
Rob Landley <rob@landley.net>
parents:
1520
diff
changeset
|
454 ll = -1; |
3eafa445c1a6
Random in-progress snapshot of sed, not finished yet.
Rob Landley <rob@landley.net>
parents:
1520
diff
changeset
|
455 } |
3eafa445c1a6
Random in-progress snapshot of sed, not finished yet.
Rob Landley <rob@landley.net>
parents:
1520
diff
changeset
|
456 } |
3eafa445c1a6
Random in-progress snapshot of sed, not finished yet.
Rob Landley <rob@landley.net>
parents:
1520
diff
changeset
|
457 if (len) call(&data, len); |
1520
dfd6b3404c16
Started over on sed (by reading the posix spec).
Rob Landley <rob@landley.net>
parents:
1235
diff
changeset
|
458 } |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
674
diff
changeset
|
459 |
1520
dfd6b3404c16
Started over on sed (by reading the posix spec).
Rob Landley <rob@landley.net>
parents:
1235
diff
changeset
|
460 static void do_sed(int fd, char *name) |
dfd6b3404c16
Started over on sed (by reading the posix spec).
Rob Landley <rob@landley.net>
parents:
1235
diff
changeset
|
461 { |
1532
bf2c5216d726
Basic sed range support, enough for "sed -n 9,11p README" to work.
Rob Landley <rob@landley.net>
parents:
1530
diff
changeset
|
462 int i = toys.optflags & FLAG_i; |
bf2c5216d726
Basic sed range support, enough for "sed -n 9,11p README" to work.
Rob Landley <rob@landley.net>
parents:
1530
diff
changeset
|
463 |
bf2c5216d726
Basic sed range support, enough for "sed -n 9,11p README" to work.
Rob Landley <rob@landley.net>
parents:
1530
diff
changeset
|
464 if (i) { |
bf2c5216d726
Basic sed range support, enough for "sed -n 9,11p README" to work.
Rob Landley <rob@landley.net>
parents:
1530
diff
changeset
|
465 // todo: rename dance |
bf2c5216d726
Basic sed range support, enough for "sed -n 9,11p README" to work.
Rob Landley <rob@landley.net>
parents:
1530
diff
changeset
|
466 } |
1538
8bc715741481
Next drop of sed infrastructure, mostly argument parsing, doesn't do anything interesting yet.
Rob Landley <rob@landley.net>
parents:
1537
diff
changeset
|
467 do_lines(fd, name, walk_pattern); |
1532
bf2c5216d726
Basic sed range support, enough for "sed -n 9,11p README" to work.
Rob Landley <rob@landley.net>
parents:
1530
diff
changeset
|
468 if (i) { |
1538
8bc715741481
Next drop of sed infrastructure, mostly argument parsing, doesn't do anything interesting yet.
Rob Landley <rob@landley.net>
parents:
1537
diff
changeset
|
469 walk_pattern(0, 0); |
1532
bf2c5216d726
Basic sed range support, enough for "sed -n 9,11p README" to work.
Rob Landley <rob@landley.net>
parents:
1530
diff
changeset
|
470 |
bf2c5216d726
Basic sed range support, enough for "sed -n 9,11p README" to work.
Rob Landley <rob@landley.net>
parents:
1530
diff
changeset
|
471 // todo: rename dance |
bf2c5216d726
Basic sed range support, enough for "sed -n 9,11p README" to work.
Rob Landley <rob@landley.net>
parents:
1530
diff
changeset
|
472 } |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
674
diff
changeset
|
473 } |
231
31dc682c18ad
Very early stub of sed, does nothing yet.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
474 |
1543
ad6b2f0e566b
Next round of sed infrastructure, parses most commands now, doesn't implement them yet.
Rob Landley <rob@landley.net>
parents:
1538
diff
changeset
|
475 // Note: removing backslash escapes edits the source string, which could |
ad6b2f0e566b
Next round of sed infrastructure, parses most commands now, doesn't implement them yet.
Rob Landley <rob@landley.net>
parents:
1538
diff
changeset
|
476 // be from the environment space via -e, which could screw up what |
ad6b2f0e566b
Next round of sed infrastructure, parses most commands now, doesn't implement them yet.
Rob Landley <rob@landley.net>
parents:
1538
diff
changeset
|
477 // "ps" sees, and I'm ok with that. |
ad6b2f0e566b
Next round of sed infrastructure, parses most commands now, doesn't implement them yet.
Rob Landley <rob@landley.net>
parents:
1538
diff
changeset
|
478 |
ad6b2f0e566b
Next round of sed infrastructure, parses most commands now, doesn't implement them yet.
Rob Landley <rob@landley.net>
parents:
1538
diff
changeset
|
479 // extract regex up to delimeter, converting \escapes |
ad6b2f0e566b
Next round of sed infrastructure, parses most commands now, doesn't implement them yet.
Rob Landley <rob@landley.net>
parents:
1538
diff
changeset
|
480 // You can't use \ as delimiter because how would you escape anything? |
ad6b2f0e566b
Next round of sed infrastructure, parses most commands now, doesn't implement them yet.
Rob Landley <rob@landley.net>
parents:
1538
diff
changeset
|
481 static int parse_regex(regex_t *reg, char **pstr, char delim) |
ad6b2f0e566b
Next round of sed infrastructure, parses most commands now, doesn't implement them yet.
Rob Landley <rob@landley.net>
parents:
1538
diff
changeset
|
482 { |
ad6b2f0e566b
Next round of sed infrastructure, parses most commands now, doesn't implement them yet.
Rob Landley <rob@landley.net>
parents:
1538
diff
changeset
|
483 char *to, *from = *pstr; |
ad6b2f0e566b
Next round of sed infrastructure, parses most commands now, doesn't implement them yet.
Rob Landley <rob@landley.net>
parents:
1538
diff
changeset
|
484 int rc; |
ad6b2f0e566b
Next round of sed infrastructure, parses most commands now, doesn't implement them yet.
Rob Landley <rob@landley.net>
parents:
1538
diff
changeset
|
485 |
ad6b2f0e566b
Next round of sed infrastructure, parses most commands now, doesn't implement them yet.
Rob Landley <rob@landley.net>
parents:
1538
diff
changeset
|
486 if (delim == '\\') rc = 0; |
ad6b2f0e566b
Next round of sed infrastructure, parses most commands now, doesn't implement them yet.
Rob Landley <rob@landley.net>
parents:
1538
diff
changeset
|
487 else { |
ad6b2f0e566b
Next round of sed infrastructure, parses most commands now, doesn't implement them yet.
Rob Landley <rob@landley.net>
parents:
1538
diff
changeset
|
488 for (to = from; *from != delim; *(to++) = *(from++)) { |
ad6b2f0e566b
Next round of sed infrastructure, parses most commands now, doesn't implement them yet.
Rob Landley <rob@landley.net>
parents:
1538
diff
changeset
|
489 if (!*from) break; |
ad6b2f0e566b
Next round of sed infrastructure, parses most commands now, doesn't implement them yet.
Rob Landley <rob@landley.net>
parents:
1538
diff
changeset
|
490 if (*from == '\\') { |
ad6b2f0e566b
Next round of sed infrastructure, parses most commands now, doesn't implement them yet.
Rob Landley <rob@landley.net>
parents:
1538
diff
changeset
|
491 if (!from[1]) break; |
ad6b2f0e566b
Next round of sed infrastructure, parses most commands now, doesn't implement them yet.
Rob Landley <rob@landley.net>
parents:
1538
diff
changeset
|
492 |
ad6b2f0e566b
Next round of sed infrastructure, parses most commands now, doesn't implement them yet.
Rob Landley <rob@landley.net>
parents:
1538
diff
changeset
|
493 // Check escaped end delimiter before printf style escapes. |
ad6b2f0e566b
Next round of sed infrastructure, parses most commands now, doesn't implement them yet.
Rob Landley <rob@landley.net>
parents:
1538
diff
changeset
|
494 if (from[1] == delim) from++; |
ad6b2f0e566b
Next round of sed infrastructure, parses most commands now, doesn't implement them yet.
Rob Landley <rob@landley.net>
parents:
1538
diff
changeset
|
495 else { |
ad6b2f0e566b
Next round of sed infrastructure, parses most commands now, doesn't implement them yet.
Rob Landley <rob@landley.net>
parents:
1538
diff
changeset
|
496 char c = unescape(from[1]); |
ad6b2f0e566b
Next round of sed infrastructure, parses most commands now, doesn't implement them yet.
Rob Landley <rob@landley.net>
parents:
1538
diff
changeset
|
497 |
ad6b2f0e566b
Next round of sed infrastructure, parses most commands now, doesn't implement them yet.
Rob Landley <rob@landley.net>
parents:
1538
diff
changeset
|
498 if (c) { |
ad6b2f0e566b
Next round of sed infrastructure, parses most commands now, doesn't implement them yet.
Rob Landley <rob@landley.net>
parents:
1538
diff
changeset
|
499 *to = c; |
ad6b2f0e566b
Next round of sed infrastructure, parses most commands now, doesn't implement them yet.
Rob Landley <rob@landley.net>
parents:
1538
diff
changeset
|
500 from++; |
ad6b2f0e566b
Next round of sed infrastructure, parses most commands now, doesn't implement them yet.
Rob Landley <rob@landley.net>
parents:
1538
diff
changeset
|
501 } |
ad6b2f0e566b
Next round of sed infrastructure, parses most commands now, doesn't implement them yet.
Rob Landley <rob@landley.net>
parents:
1538
diff
changeset
|
502 } |
ad6b2f0e566b
Next round of sed infrastructure, parses most commands now, doesn't implement them yet.
Rob Landley <rob@landley.net>
parents:
1538
diff
changeset
|
503 } |
ad6b2f0e566b
Next round of sed infrastructure, parses most commands now, doesn't implement them yet.
Rob Landley <rob@landley.net>
parents:
1538
diff
changeset
|
504 } |
ad6b2f0e566b
Next round of sed infrastructure, parses most commands now, doesn't implement them yet.
Rob Landley <rob@landley.net>
parents:
1538
diff
changeset
|
505 rc = (*from == delim); |
ad6b2f0e566b
Next round of sed infrastructure, parses most commands now, doesn't implement them yet.
Rob Landley <rob@landley.net>
parents:
1538
diff
changeset
|
506 } |
ad6b2f0e566b
Next round of sed infrastructure, parses most commands now, doesn't implement them yet.
Rob Landley <rob@landley.net>
parents:
1538
diff
changeset
|
507 |
ad6b2f0e566b
Next round of sed infrastructure, parses most commands now, doesn't implement them yet.
Rob Landley <rob@landley.net>
parents:
1538
diff
changeset
|
508 if (rc) { |
ad6b2f0e566b
Next round of sed infrastructure, parses most commands now, doesn't implement them yet.
Rob Landley <rob@landley.net>
parents:
1538
diff
changeset
|
509 delim = *to; |
ad6b2f0e566b
Next round of sed infrastructure, parses most commands now, doesn't implement them yet.
Rob Landley <rob@landley.net>
parents:
1538
diff
changeset
|
510 *to = 0; |
ad6b2f0e566b
Next round of sed infrastructure, parses most commands now, doesn't implement them yet.
Rob Landley <rob@landley.net>
parents:
1538
diff
changeset
|
511 xregcomp(reg, *pstr, ((toys.optflags & FLAG_r)*REG_EXTENDED)|REG_NOSUB); |
ad6b2f0e566b
Next round of sed infrastructure, parses most commands now, doesn't implement them yet.
Rob Landley <rob@landley.net>
parents:
1538
diff
changeset
|
512 *to = delim; |
ad6b2f0e566b
Next round of sed infrastructure, parses most commands now, doesn't implement them yet.
Rob Landley <rob@landley.net>
parents:
1538
diff
changeset
|
513 } |
ad6b2f0e566b
Next round of sed infrastructure, parses most commands now, doesn't implement them yet.
Rob Landley <rob@landley.net>
parents:
1538
diff
changeset
|
514 *pstr = from + rc; |
ad6b2f0e566b
Next round of sed infrastructure, parses most commands now, doesn't implement them yet.
Rob Landley <rob@landley.net>
parents:
1538
diff
changeset
|
515 |
ad6b2f0e566b
Next round of sed infrastructure, parses most commands now, doesn't implement them yet.
Rob Landley <rob@landley.net>
parents:
1538
diff
changeset
|
516 return rc; |
ad6b2f0e566b
Next round of sed infrastructure, parses most commands now, doesn't implement them yet.
Rob Landley <rob@landley.net>
parents:
1538
diff
changeset
|
517 } |
ad6b2f0e566b
Next round of sed infrastructure, parses most commands now, doesn't implement them yet.
Rob Landley <rob@landley.net>
parents:
1538
diff
changeset
|
518 |
1530
3eafa445c1a6
Random in-progress snapshot of sed, not finished yet.
Rob Landley <rob@landley.net>
parents:
1520
diff
changeset
|
519 // Translate primal pattern into walkable form. |
3eafa445c1a6
Random in-progress snapshot of sed, not finished yet.
Rob Landley <rob@landley.net>
parents:
1520
diff
changeset
|
520 static void jewel_of_judgement(char **pline, long len) |
3eafa445c1a6
Random in-progress snapshot of sed, not finished yet.
Rob Landley <rob@landley.net>
parents:
1520
diff
changeset
|
521 { |
1538
8bc715741481
Next drop of sed infrastructure, mostly argument parsing, doesn't do anything interesting yet.
Rob Landley <rob@landley.net>
parents:
1537
diff
changeset
|
522 struct step *corwin = (void *)TT.pattern; |
8bc715741481
Next drop of sed infrastructure, mostly argument parsing, doesn't do anything interesting yet.
Rob Landley <rob@landley.net>
parents:
1537
diff
changeset
|
523 char *line = *pline, *reg, c; |
1530
3eafa445c1a6
Random in-progress snapshot of sed, not finished yet.
Rob Landley <rob@landley.net>
parents:
1520
diff
changeset
|
524 int i; |
3eafa445c1a6
Random in-progress snapshot of sed, not finished yet.
Rob Landley <rob@landley.net>
parents:
1520
diff
changeset
|
525 |
1538
8bc715741481
Next drop of sed infrastructure, mostly argument parsing, doesn't do anything interesting yet.
Rob Landley <rob@landley.net>
parents:
1537
diff
changeset
|
526 // Append additional line to pattern argument string? |
8bc715741481
Next drop of sed infrastructure, mostly argument parsing, doesn't do anything interesting yet.
Rob Landley <rob@landley.net>
parents:
1537
diff
changeset
|
527 if (corwin && corwin->prev->hit) { |
1543
ad6b2f0e566b
Next round of sed infrastructure, parses most commands now, doesn't implement them yet.
Rob Landley <rob@landley.net>
parents:
1538
diff
changeset
|
528 // Remove half-finished entry from list so remalloc() doesn't confuse it |
ad6b2f0e566b
Next round of sed infrastructure, parses most commands now, doesn't implement them yet.
Rob Landley <rob@landley.net>
parents:
1538
diff
changeset
|
529 TT.pattern = TT.pattern->prev; |
ad6b2f0e566b
Next round of sed infrastructure, parses most commands now, doesn't implement them yet.
Rob Landley <rob@landley.net>
parents:
1538
diff
changeset
|
530 corwin = dlist_pop(&TT.pattern); |
1538
8bc715741481
Next drop of sed infrastructure, mostly argument parsing, doesn't do anything interesting yet.
Rob Landley <rob@landley.net>
parents:
1537
diff
changeset
|
531 corwin->hit = 0; |
8bc715741481
Next drop of sed infrastructure, mostly argument parsing, doesn't do anything interesting yet.
Rob Landley <rob@landley.net>
parents:
1537
diff
changeset
|
532 c = corwin->c; |
8bc715741481
Next drop of sed infrastructure, mostly argument parsing, doesn't do anything interesting yet.
Rob Landley <rob@landley.net>
parents:
1537
diff
changeset
|
533 reg = (char *)corwin; |
8bc715741481
Next drop of sed infrastructure, mostly argument parsing, doesn't do anything interesting yet.
Rob Landley <rob@landley.net>
parents:
1537
diff
changeset
|
534 reg += corwin->arg1 + strlen(reg + corwin->arg1); |
8bc715741481
Next drop of sed infrastructure, mostly argument parsing, doesn't do anything interesting yet.
Rob Landley <rob@landley.net>
parents:
1537
diff
changeset
|
535 |
1543
ad6b2f0e566b
Next round of sed infrastructure, parses most commands now, doesn't implement them yet.
Rob Landley <rob@landley.net>
parents:
1538
diff
changeset
|
536 // Resume parsing |
1538
8bc715741481
Next drop of sed infrastructure, mostly argument parsing, doesn't do anything interesting yet.
Rob Landley <rob@landley.net>
parents:
1537
diff
changeset
|
537 goto append; |
8bc715741481
Next drop of sed infrastructure, mostly argument parsing, doesn't do anything interesting yet.
Rob Landley <rob@landley.net>
parents:
1537
diff
changeset
|
538 } |
8bc715741481
Next drop of sed infrastructure, mostly argument parsing, doesn't do anything interesting yet.
Rob Landley <rob@landley.net>
parents:
1537
diff
changeset
|
539 |
1543
ad6b2f0e566b
Next round of sed infrastructure, parses most commands now, doesn't implement them yet.
Rob Landley <rob@landley.net>
parents:
1538
diff
changeset
|
540 // Loop through commands in line |
ad6b2f0e566b
Next round of sed infrastructure, parses most commands now, doesn't implement them yet.
Rob Landley <rob@landley.net>
parents:
1538
diff
changeset
|
541 |
ad6b2f0e566b
Next round of sed infrastructure, parses most commands now, doesn't implement them yet.
Rob Landley <rob@landley.net>
parents:
1538
diff
changeset
|
542 corwin = 0; |
1538
8bc715741481
Next drop of sed infrastructure, mostly argument parsing, doesn't do anything interesting yet.
Rob Landley <rob@landley.net>
parents:
1537
diff
changeset
|
543 for (;;) { |
1543
ad6b2f0e566b
Next round of sed infrastructure, parses most commands now, doesn't implement them yet.
Rob Landley <rob@landley.net>
parents:
1538
diff
changeset
|
544 if (corwin) dlist_add_nomalloc(&TT.pattern, (void *)corwin); |
ad6b2f0e566b
Next round of sed infrastructure, parses most commands now, doesn't implement them yet.
Rob Landley <rob@landley.net>
parents:
1538
diff
changeset
|
545 |
1538
8bc715741481
Next drop of sed infrastructure, mostly argument parsing, doesn't do anything interesting yet.
Rob Landley <rob@landley.net>
parents:
1537
diff
changeset
|
546 while (isspace(*line) || *line == ';') line++; |
8bc715741481
Next drop of sed infrastructure, mostly argument parsing, doesn't do anything interesting yet.
Rob Landley <rob@landley.net>
parents:
1537
diff
changeset
|
547 if (!*line || *line == '#') return; |
1530
3eafa445c1a6
Random in-progress snapshot of sed, not finished yet.
Rob Landley <rob@landley.net>
parents:
1520
diff
changeset
|
548 |
1532
bf2c5216d726
Basic sed range support, enough for "sed -n 9,11p README" to work.
Rob Landley <rob@landley.net>
parents:
1530
diff
changeset
|
549 memset(toybuf, 0, sizeof(struct step)); |
bf2c5216d726
Basic sed range support, enough for "sed -n 9,11p README" to work.
Rob Landley <rob@landley.net>
parents:
1530
diff
changeset
|
550 corwin = (void *)toybuf; |
bf2c5216d726
Basic sed range support, enough for "sed -n 9,11p README" to work.
Rob Landley <rob@landley.net>
parents:
1530
diff
changeset
|
551 reg = toybuf + sizeof(struct step); |
1530
3eafa445c1a6
Random in-progress snapshot of sed, not finished yet.
Rob Landley <rob@landley.net>
parents:
1520
diff
changeset
|
552 |
1532
bf2c5216d726
Basic sed range support, enough for "sed -n 9,11p README" to work.
Rob Landley <rob@landley.net>
parents:
1530
diff
changeset
|
553 // Parse address range (if any) |
bf2c5216d726
Basic sed range support, enough for "sed -n 9,11p README" to work.
Rob Landley <rob@landley.net>
parents:
1530
diff
changeset
|
554 for (i = 0; i < 2; i++) { |
bf2c5216d726
Basic sed range support, enough for "sed -n 9,11p README" to work.
Rob Landley <rob@landley.net>
parents:
1530
diff
changeset
|
555 if (*line == ',') line++; |
bf2c5216d726
Basic sed range support, enough for "sed -n 9,11p README" to work.
Rob Landley <rob@landley.net>
parents:
1530
diff
changeset
|
556 else if (i) break; |
1530
3eafa445c1a6
Random in-progress snapshot of sed, not finished yet.
Rob Landley <rob@landley.net>
parents:
1520
diff
changeset
|
557 |
1532
bf2c5216d726
Basic sed range support, enough for "sed -n 9,11p README" to work.
Rob Landley <rob@landley.net>
parents:
1530
diff
changeset
|
558 if (isdigit(*line)) corwin->lmatch[i] = strtol(line, &line, 0); |
bf2c5216d726
Basic sed range support, enough for "sed -n 9,11p README" to work.
Rob Landley <rob@landley.net>
parents:
1530
diff
changeset
|
559 else if (*line == '$') { |
bf2c5216d726
Basic sed range support, enough for "sed -n 9,11p README" to work.
Rob Landley <rob@landley.net>
parents:
1530
diff
changeset
|
560 corwin->lmatch[i] = -1; |
bf2c5216d726
Basic sed range support, enough for "sed -n 9,11p README" to work.
Rob Landley <rob@landley.net>
parents:
1530
diff
changeset
|
561 line++; |
bf2c5216d726
Basic sed range support, enough for "sed -n 9,11p README" to work.
Rob Landley <rob@landley.net>
parents:
1530
diff
changeset
|
562 } else if (*line == '/' || *line == '\\') { |
1543
ad6b2f0e566b
Next round of sed infrastructure, parses most commands now, doesn't implement them yet.
Rob Landley <rob@landley.net>
parents:
1538
diff
changeset
|
563 char delim = *(line++); |
1530
3eafa445c1a6
Random in-progress snapshot of sed, not finished yet.
Rob Landley <rob@landley.net>
parents:
1520
diff
changeset
|
564 |
1532
bf2c5216d726
Basic sed range support, enough for "sed -n 9,11p README" to work.
Rob Landley <rob@landley.net>
parents:
1530
diff
changeset
|
565 if (delim == '\\') { |
bf2c5216d726
Basic sed range support, enough for "sed -n 9,11p README" to work.
Rob Landley <rob@landley.net>
parents:
1530
diff
changeset
|
566 if (!*line) goto brand; |
1543
ad6b2f0e566b
Next round of sed infrastructure, parses most commands now, doesn't implement them yet.
Rob Landley <rob@landley.net>
parents:
1538
diff
changeset
|
567 delim = *(line++); |
1532
bf2c5216d726
Basic sed range support, enough for "sed -n 9,11p README" to work.
Rob Landley <rob@landley.net>
parents:
1530
diff
changeset
|
568 } |
1530
3eafa445c1a6
Random in-progress snapshot of sed, not finished yet.
Rob Landley <rob@landley.net>
parents:
1520
diff
changeset
|
569 |
1543
ad6b2f0e566b
Next round of sed infrastructure, parses most commands now, doesn't implement them yet.
Rob Landley <rob@landley.net>
parents:
1538
diff
changeset
|
570 if (!parse_regex((void *)reg, &line, delim)) goto brand; |
1538
8bc715741481
Next drop of sed infrastructure, mostly argument parsing, doesn't do anything interesting yet.
Rob Landley <rob@landley.net>
parents:
1537
diff
changeset
|
571 corwin->rmatch[i] = reg-toybuf; |
1532
bf2c5216d726
Basic sed range support, enough for "sed -n 9,11p README" to work.
Rob Landley <rob@landley.net>
parents:
1530
diff
changeset
|
572 reg += sizeof(regex_t); |
bf2c5216d726
Basic sed range support, enough for "sed -n 9,11p README" to work.
Rob Landley <rob@landley.net>
parents:
1530
diff
changeset
|
573 } else break; |
bf2c5216d726
Basic sed range support, enough for "sed -n 9,11p README" to work.
Rob Landley <rob@landley.net>
parents:
1530
diff
changeset
|
574 } |
bf2c5216d726
Basic sed range support, enough for "sed -n 9,11p README" to work.
Rob Landley <rob@landley.net>
parents:
1530
diff
changeset
|
575 |
bf2c5216d726
Basic sed range support, enough for "sed -n 9,11p README" to work.
Rob Landley <rob@landley.net>
parents:
1530
diff
changeset
|
576 while (isspace(*line)) line++; |
1538
8bc715741481
Next drop of sed infrastructure, mostly argument parsing, doesn't do anything interesting yet.
Rob Landley <rob@landley.net>
parents:
1537
diff
changeset
|
577 if (!*line) break; |
1532
bf2c5216d726
Basic sed range support, enough for "sed -n 9,11p README" to work.
Rob Landley <rob@landley.net>
parents:
1530
diff
changeset
|
578 |
1538
8bc715741481
Next drop of sed infrastructure, mostly argument parsing, doesn't do anything interesting yet.
Rob Landley <rob@landley.net>
parents:
1537
diff
changeset
|
579 while (*line == '!') corwin->not = 1; |
8bc715741481
Next drop of sed infrastructure, mostly argument parsing, doesn't do anything interesting yet.
Rob Landley <rob@landley.net>
parents:
1537
diff
changeset
|
580 while (isspace(*line)) line++; |
8bc715741481
Next drop of sed infrastructure, mostly argument parsing, doesn't do anything interesting yet.
Rob Landley <rob@landley.net>
parents:
1537
diff
changeset
|
581 |
8bc715741481
Next drop of sed infrastructure, mostly argument parsing, doesn't do anything interesting yet.
Rob Landley <rob@landley.net>
parents:
1537
diff
changeset
|
582 c = corwin->c = *(line++); |
8bc715741481
Next drop of sed infrastructure, mostly argument parsing, doesn't do anything interesting yet.
Rob Landley <rob@landley.net>
parents:
1537
diff
changeset
|
583 if (strchr("}:", c) && i) break; |
8bc715741481
Next drop of sed infrastructure, mostly argument parsing, doesn't do anything interesting yet.
Rob Landley <rob@landley.net>
parents:
1537
diff
changeset
|
584 if (strchr("aiqr=", c) && i>1) break; |
1532
bf2c5216d726
Basic sed range support, enough for "sed -n 9,11p README" to work.
Rob Landley <rob@landley.net>
parents:
1530
diff
changeset
|
585 |
bf2c5216d726
Basic sed range support, enough for "sed -n 9,11p README" to work.
Rob Landley <rob@landley.net>
parents:
1530
diff
changeset
|
586 // Add step to pattern |
bf2c5216d726
Basic sed range support, enough for "sed -n 9,11p README" to work.
Rob Landley <rob@landley.net>
parents:
1530
diff
changeset
|
587 corwin = xmalloc(reg-toybuf); |
bf2c5216d726
Basic sed range support, enough for "sed -n 9,11p README" to work.
Rob Landley <rob@landley.net>
parents:
1530
diff
changeset
|
588 memcpy(corwin, toybuf, reg-toybuf); |
1543
ad6b2f0e566b
Next round of sed infrastructure, parses most commands now, doesn't implement them yet.
Rob Landley <rob@landley.net>
parents:
1538
diff
changeset
|
589 reg = (reg-toybuf) + (char *)corwin; |
1532
bf2c5216d726
Basic sed range support, enough for "sed -n 9,11p README" to work.
Rob Landley <rob@landley.net>
parents:
1530
diff
changeset
|
590 |
1538
8bc715741481
Next drop of sed infrastructure, mostly argument parsing, doesn't do anything interesting yet.
Rob Landley <rob@landley.net>
parents:
1537
diff
changeset
|
591 // Parse arguments by command type |
8bc715741481
Next drop of sed infrastructure, mostly argument parsing, doesn't do anything interesting yet.
Rob Landley <rob@landley.net>
parents:
1537
diff
changeset
|
592 if (c == '{') TT.nextlen++; |
8bc715741481
Next drop of sed infrastructure, mostly argument parsing, doesn't do anything interesting yet.
Rob Landley <rob@landley.net>
parents:
1537
diff
changeset
|
593 else if (c == '}') { |
8bc715741481
Next drop of sed infrastructure, mostly argument parsing, doesn't do anything interesting yet.
Rob Landley <rob@landley.net>
parents:
1537
diff
changeset
|
594 if (!TT.nextlen--) break; |
8bc715741481
Next drop of sed infrastructure, mostly argument parsing, doesn't do anything interesting yet.
Rob Landley <rob@landley.net>
parents:
1537
diff
changeset
|
595 } else if (c == 's') { |
1543
ad6b2f0e566b
Next round of sed infrastructure, parses most commands now, doesn't implement them yet.
Rob Landley <rob@landley.net>
parents:
1538
diff
changeset
|
596 char delim = *line; |
ad6b2f0e566b
Next round of sed infrastructure, parses most commands now, doesn't implement them yet.
Rob Landley <rob@landley.net>
parents:
1538
diff
changeset
|
597 int end; |
ad6b2f0e566b
Next round of sed infrastructure, parses most commands now, doesn't implement them yet.
Rob Landley <rob@landley.net>
parents:
1538
diff
changeset
|
598 |
ad6b2f0e566b
Next round of sed infrastructure, parses most commands now, doesn't implement them yet.
Rob Landley <rob@landley.net>
parents:
1538
diff
changeset
|
599 // s/pattern/replacement/flags |
ad6b2f0e566b
Next round of sed infrastructure, parses most commands now, doesn't implement them yet.
Rob Landley <rob@landley.net>
parents:
1538
diff
changeset
|
600 |
ad6b2f0e566b
Next round of sed infrastructure, parses most commands now, doesn't implement them yet.
Rob Landley <rob@landley.net>
parents:
1538
diff
changeset
|
601 if (delim) line++; |
ad6b2f0e566b
Next round of sed infrastructure, parses most commands now, doesn't implement them yet.
Rob Landley <rob@landley.net>
parents:
1538
diff
changeset
|
602 else break; |
ad6b2f0e566b
Next round of sed infrastructure, parses most commands now, doesn't implement them yet.
Rob Landley <rob@landley.net>
parents:
1538
diff
changeset
|
603 |
ad6b2f0e566b
Next round of sed infrastructure, parses most commands now, doesn't implement them yet.
Rob Landley <rob@landley.net>
parents:
1538
diff
changeset
|
604 // get pattern |
ad6b2f0e566b
Next round of sed infrastructure, parses most commands now, doesn't implement them yet.
Rob Landley <rob@landley.net>
parents:
1538
diff
changeset
|
605 end = reg - (char *)corwin; |
ad6b2f0e566b
Next round of sed infrastructure, parses most commands now, doesn't implement them yet.
Rob Landley <rob@landley.net>
parents:
1538
diff
changeset
|
606 corwin = xrealloc(corwin, end+sizeof(regex_t)); |
ad6b2f0e566b
Next round of sed infrastructure, parses most commands now, doesn't implement them yet.
Rob Landley <rob@landley.net>
parents:
1538
diff
changeset
|
607 reg = end + (char *)corwin; |
ad6b2f0e566b
Next round of sed infrastructure, parses most commands now, doesn't implement them yet.
Rob Landley <rob@landley.net>
parents:
1538
diff
changeset
|
608 if (!parse_regex((void *)reg, &line, delim)) break; |
ad6b2f0e566b
Next round of sed infrastructure, parses most commands now, doesn't implement them yet.
Rob Landley <rob@landley.net>
parents:
1538
diff
changeset
|
609 corwin->arg1 = reg-toybuf; |
ad6b2f0e566b
Next round of sed infrastructure, parses most commands now, doesn't implement them yet.
Rob Landley <rob@landley.net>
parents:
1538
diff
changeset
|
610 reg += sizeof(regex_t); |
ad6b2f0e566b
Next round of sed infrastructure, parses most commands now, doesn't implement them yet.
Rob Landley <rob@landley.net>
parents:
1538
diff
changeset
|
611 |
ad6b2f0e566b
Next round of sed infrastructure, parses most commands now, doesn't implement them yet.
Rob Landley <rob@landley.net>
parents:
1538
diff
changeset
|
612 // get replacement |
ad6b2f0e566b
Next round of sed infrastructure, parses most commands now, doesn't implement them yet.
Rob Landley <rob@landley.net>
parents:
1538
diff
changeset
|
613 |
ad6b2f0e566b
Next round of sed infrastructure, parses most commands now, doesn't implement them yet.
Rob Landley <rob@landley.net>
parents:
1538
diff
changeset
|
614 for (end = 0; line[end] != delim; end++) { |
ad6b2f0e566b
Next round of sed infrastructure, parses most commands now, doesn't implement them yet.
Rob Landley <rob@landley.net>
parents:
1538
diff
changeset
|
615 if (line[end] == '\\') end++; |
ad6b2f0e566b
Next round of sed infrastructure, parses most commands now, doesn't implement them yet.
Rob Landley <rob@landley.net>
parents:
1538
diff
changeset
|
616 if (!line[end]) goto brand; |
ad6b2f0e566b
Next round of sed infrastructure, parses most commands now, doesn't implement them yet.
Rob Landley <rob@landley.net>
parents:
1538
diff
changeset
|
617 } |
ad6b2f0e566b
Next round of sed infrastructure, parses most commands now, doesn't implement them yet.
Rob Landley <rob@landley.net>
parents:
1538
diff
changeset
|
618 |
ad6b2f0e566b
Next round of sed infrastructure, parses most commands now, doesn't implement them yet.
Rob Landley <rob@landley.net>
parents:
1538
diff
changeset
|
619 corwin->arg2 = reg - (char*)corwin; |
ad6b2f0e566b
Next round of sed infrastructure, parses most commands now, doesn't implement them yet.
Rob Landley <rob@landley.net>
parents:
1538
diff
changeset
|
620 reg = extend_string((void *)&corwin, line, corwin->arg2, end); |
ad6b2f0e566b
Next round of sed infrastructure, parses most commands now, doesn't implement them yet.
Rob Landley <rob@landley.net>
parents:
1538
diff
changeset
|
621 line += end+1; |
ad6b2f0e566b
Next round of sed infrastructure, parses most commands now, doesn't implement them yet.
Rob Landley <rob@landley.net>
parents:
1538
diff
changeset
|
622 |
ad6b2f0e566b
Next round of sed infrastructure, parses most commands now, doesn't implement them yet.
Rob Landley <rob@landley.net>
parents:
1538
diff
changeset
|
623 // flags: |
1538
8bc715741481
Next drop of sed infrastructure, mostly argument parsing, doesn't do anything interesting yet.
Rob Landley <rob@landley.net>
parents:
1537
diff
changeset
|
624 // [0-9] A number, substitute only that occurrence of pattern |
8bc715741481
Next drop of sed infrastructure, mostly argument parsing, doesn't do anything interesting yet.
Rob Landley <rob@landley.net>
parents:
1537
diff
changeset
|
625 // g Global, substitute all occurrences of pattern |
8bc715741481
Next drop of sed infrastructure, mostly argument parsing, doesn't do anything interesting yet.
Rob Landley <rob@landley.net>
parents:
1537
diff
changeset
|
626 // p Print the line if match was found and replaced |
8bc715741481
Next drop of sed infrastructure, mostly argument parsing, doesn't do anything interesting yet.
Rob Landley <rob@landley.net>
parents:
1537
diff
changeset
|
627 // w [file] Write (append) line to file if match replaced |
1543
ad6b2f0e566b
Next round of sed infrastructure, parses most commands now, doesn't implement them yet.
Rob Landley <rob@landley.net>
parents:
1538
diff
changeset
|
628 // i case insensitive match |
1538
8bc715741481
Next drop of sed infrastructure, mostly argument parsing, doesn't do anything interesting yet.
Rob Landley <rob@landley.net>
parents:
1537
diff
changeset
|
629 |
1543
ad6b2f0e566b
Next round of sed infrastructure, parses most commands now, doesn't implement them yet.
Rob Landley <rob@landley.net>
parents:
1538
diff
changeset
|
630 for (;;) { |
ad6b2f0e566b
Next round of sed infrastructure, parses most commands now, doesn't implement them yet.
Rob Landley <rob@landley.net>
parents:
1538
diff
changeset
|
631 long l; |
ad6b2f0e566b
Next round of sed infrastructure, parses most commands now, doesn't implement them yet.
Rob Landley <rob@landley.net>
parents:
1538
diff
changeset
|
632 |
ad6b2f0e566b
Next round of sed infrastructure, parses most commands now, doesn't implement them yet.
Rob Landley <rob@landley.net>
parents:
1538
diff
changeset
|
633 line++; |
ad6b2f0e566b
Next round of sed infrastructure, parses most commands now, doesn't implement them yet.
Rob Landley <rob@landley.net>
parents:
1538
diff
changeset
|
634 if (!*line || *line == ';') break; |
ad6b2f0e566b
Next round of sed infrastructure, parses most commands now, doesn't implement them yet.
Rob Landley <rob@landley.net>
parents:
1538
diff
changeset
|
635 if (isspace(*line)) continue; |
ad6b2f0e566b
Next round of sed infrastructure, parses most commands now, doesn't implement them yet.
Rob Landley <rob@landley.net>
parents:
1538
diff
changeset
|
636 |
ad6b2f0e566b
Next round of sed infrastructure, parses most commands now, doesn't implement them yet.
Rob Landley <rob@landley.net>
parents:
1538
diff
changeset
|
637 if (0 <= (l = stridx("gpi", *line))) corwin->sflags |= 1<<l; |
ad6b2f0e566b
Next round of sed infrastructure, parses most commands now, doesn't implement them yet.
Rob Landley <rob@landley.net>
parents:
1538
diff
changeset
|
638 else if (!corwin->sflags >> 4 && 0<(l = strtol(line+end, &line, 10))) { |
ad6b2f0e566b
Next round of sed infrastructure, parses most commands now, doesn't implement them yet.
Rob Landley <rob@landley.net>
parents:
1538
diff
changeset
|
639 corwin->sflags |= l << 4; |
ad6b2f0e566b
Next round of sed infrastructure, parses most commands now, doesn't implement them yet.
Rob Landley <rob@landley.net>
parents:
1538
diff
changeset
|
640 line--; |
ad6b2f0e566b
Next round of sed infrastructure, parses most commands now, doesn't implement them yet.
Rob Landley <rob@landley.net>
parents:
1538
diff
changeset
|
641 } else if (*line == 'w') { |
ad6b2f0e566b
Next round of sed infrastructure, parses most commands now, doesn't implement them yet.
Rob Landley <rob@landley.net>
parents:
1538
diff
changeset
|
642 while (isspace(*++line)); |
ad6b2f0e566b
Next round of sed infrastructure, parses most commands now, doesn't implement them yet.
Rob Landley <rob@landley.net>
parents:
1538
diff
changeset
|
643 if (!*line) goto brand; |
ad6b2f0e566b
Next round of sed infrastructure, parses most commands now, doesn't implement them yet.
Rob Landley <rob@landley.net>
parents:
1538
diff
changeset
|
644 corwin->arg3 = reg - (char *)corwin; |
ad6b2f0e566b
Next round of sed infrastructure, parses most commands now, doesn't implement them yet.
Rob Landley <rob@landley.net>
parents:
1538
diff
changeset
|
645 reg = extend_string((void *)&corwin, line, corwin->arg3, |
ad6b2f0e566b
Next round of sed infrastructure, parses most commands now, doesn't implement them yet.
Rob Landley <rob@landley.net>
parents:
1538
diff
changeset
|
646 strlen(line)); |
ad6b2f0e566b
Next round of sed infrastructure, parses most commands now, doesn't implement them yet.
Rob Landley <rob@landley.net>
parents:
1538
diff
changeset
|
647 } else goto brand; |
ad6b2f0e566b
Next round of sed infrastructure, parses most commands now, doesn't implement them yet.
Rob Landley <rob@landley.net>
parents:
1538
diff
changeset
|
648 } |
1538
8bc715741481
Next drop of sed infrastructure, mostly argument parsing, doesn't do anything interesting yet.
Rob Landley <rob@landley.net>
parents:
1537
diff
changeset
|
649 } else if (c == 'y') { |
8bc715741481
Next drop of sed infrastructure, mostly argument parsing, doesn't do anything interesting yet.
Rob Landley <rob@landley.net>
parents:
1537
diff
changeset
|
650 // y/old/new/ |
8bc715741481
Next drop of sed infrastructure, mostly argument parsing, doesn't do anything interesting yet.
Rob Landley <rob@landley.net>
parents:
1537
diff
changeset
|
651 } else if (strchr("abcirtTw:", c)) { |
1543
ad6b2f0e566b
Next round of sed infrastructure, parses most commands now, doesn't implement them yet.
Rob Landley <rob@landley.net>
parents:
1538
diff
changeset
|
652 int end, class; |
1538
8bc715741481
Next drop of sed infrastructure, mostly argument parsing, doesn't do anything interesting yet.
Rob Landley <rob@landley.net>
parents:
1537
diff
changeset
|
653 |
8bc715741481
Next drop of sed infrastructure, mostly argument parsing, doesn't do anything interesting yet.
Rob Landley <rob@landley.net>
parents:
1537
diff
changeset
|
654 // Trim whitespace from "b ;" and ": blah " but only first space in "w x " |
8bc715741481
Next drop of sed infrastructure, mostly argument parsing, doesn't do anything interesting yet.
Rob Landley <rob@landley.net>
parents:
1537
diff
changeset
|
655 |
8bc715741481
Next drop of sed infrastructure, mostly argument parsing, doesn't do anything interesting yet.
Rob Landley <rob@landley.net>
parents:
1537
diff
changeset
|
656 while (isspace(*line)) line++; |
8bc715741481
Next drop of sed infrastructure, mostly argument parsing, doesn't do anything interesting yet.
Rob Landley <rob@landley.net>
parents:
1537
diff
changeset
|
657 append: |
1543
ad6b2f0e566b
Next round of sed infrastructure, parses most commands now, doesn't implement them yet.
Rob Landley <rob@landley.net>
parents:
1538
diff
changeset
|
658 class = !strchr("btT:", c); |
ad6b2f0e566b
Next round of sed infrastructure, parses most commands now, doesn't implement them yet.
Rob Landley <rob@landley.net>
parents:
1538
diff
changeset
|
659 end = strcspn(line, class ? "" : "; \t\r\n\v\f"); |
1538
8bc715741481
Next drop of sed infrastructure, mostly argument parsing, doesn't do anything interesting yet.
Rob Landley <rob@landley.net>
parents:
1537
diff
changeset
|
660 |
1543
ad6b2f0e566b
Next round of sed infrastructure, parses most commands now, doesn't implement them yet.
Rob Landley <rob@landley.net>
parents:
1538
diff
changeset
|
661 if (!end) { |
1538
8bc715741481
Next drop of sed infrastructure, mostly argument parsing, doesn't do anything interesting yet.
Rob Landley <rob@landley.net>
parents:
1537
diff
changeset
|
662 if (!strchr("btT", c)) break; |
8bc715741481
Next drop of sed infrastructure, mostly argument parsing, doesn't do anything interesting yet.
Rob Landley <rob@landley.net>
parents:
1537
diff
changeset
|
663 continue; |
8bc715741481
Next drop of sed infrastructure, mostly argument parsing, doesn't do anything interesting yet.
Rob Landley <rob@landley.net>
parents:
1537
diff
changeset
|
664 } |
8bc715741481
Next drop of sed infrastructure, mostly argument parsing, doesn't do anything interesting yet.
Rob Landley <rob@landley.net>
parents:
1537
diff
changeset
|
665 |
8bc715741481
Next drop of sed infrastructure, mostly argument parsing, doesn't do anything interesting yet.
Rob Landley <rob@landley.net>
parents:
1537
diff
changeset
|
666 // Extend allocation to include new string. We use offsets instead of |
8bc715741481
Next drop of sed infrastructure, mostly argument parsing, doesn't do anything interesting yet.
Rob Landley <rob@landley.net>
parents:
1537
diff
changeset
|
667 // pointers so realloc() moving stuff doesn't break things. Do it |
8bc715741481
Next drop of sed infrastructure, mostly argument parsing, doesn't do anything interesting yet.
Rob Landley <rob@landley.net>
parents:
1537
diff
changeset
|
668 // here instead of toybuf so there's no maximum size. |
1543
ad6b2f0e566b
Next round of sed infrastructure, parses most commands now, doesn't implement them yet.
Rob Landley <rob@landley.net>
parents:
1538
diff
changeset
|
669 |
ad6b2f0e566b
Next round of sed infrastructure, parses most commands now, doesn't implement them yet.
Rob Landley <rob@landley.net>
parents:
1538
diff
changeset
|
670 if (!corwin->arg1) corwin->arg1 = reg - (char*)corwin; |
ad6b2f0e566b
Next round of sed infrastructure, parses most commands now, doesn't implement them yet.
Rob Landley <rob@landley.net>
parents:
1538
diff
changeset
|
671 reg = extend_string((void *)&corwin, line, reg - (char *)corwin, end); |
1538
8bc715741481
Next drop of sed infrastructure, mostly argument parsing, doesn't do anything interesting yet.
Rob Landley <rob@landley.net>
parents:
1537
diff
changeset
|
672 |
8bc715741481
Next drop of sed infrastructure, mostly argument parsing, doesn't do anything interesting yet.
Rob Landley <rob@landley.net>
parents:
1537
diff
changeset
|
673 // Line continuation? |
1543
ad6b2f0e566b
Next round of sed infrastructure, parses most commands now, doesn't implement them yet.
Rob Landley <rob@landley.net>
parents:
1538
diff
changeset
|
674 if (class && reg[-1] == '\\') { |
ad6b2f0e566b
Next round of sed infrastructure, parses most commands now, doesn't implement them yet.
Rob Landley <rob@landley.net>
parents:
1538
diff
changeset
|
675 reg[-1] = 0; |
1538
8bc715741481
Next drop of sed infrastructure, mostly argument parsing, doesn't do anything interesting yet.
Rob Landley <rob@landley.net>
parents:
1537
diff
changeset
|
676 corwin->hit++; |
8bc715741481
Next drop of sed infrastructure, mostly argument parsing, doesn't do anything interesting yet.
Rob Landley <rob@landley.net>
parents:
1537
diff
changeset
|
677 } |
8bc715741481
Next drop of sed infrastructure, mostly argument parsing, doesn't do anything interesting yet.
Rob Landley <rob@landley.net>
parents:
1537
diff
changeset
|
678 |
8bc715741481
Next drop of sed infrastructure, mostly argument parsing, doesn't do anything interesting yet.
Rob Landley <rob@landley.net>
parents:
1537
diff
changeset
|
679 // Commands that take no arguments |
8bc715741481
Next drop of sed infrastructure, mostly argument parsing, doesn't do anything interesting yet.
Rob Landley <rob@landley.net>
parents:
1537
diff
changeset
|
680 } else if (!strchr("{dDgGhHlnNpPqx=", *line)) break; |
1530
3eafa445c1a6
Random in-progress snapshot of sed, not finished yet.
Rob Landley <rob@landley.net>
parents:
1520
diff
changeset
|
681 } |
3eafa445c1a6
Random in-progress snapshot of sed, not finished yet.
Rob Landley <rob@landley.net>
parents:
1520
diff
changeset
|
682 |
3eafa445c1a6
Random in-progress snapshot of sed, not finished yet.
Rob Landley <rob@landley.net>
parents:
1520
diff
changeset
|
683 brand: |
3eafa445c1a6
Random in-progress snapshot of sed, not finished yet.
Rob Landley <rob@landley.net>
parents:
1520
diff
changeset
|
684 // Reminisce about chestnut trees. |
1543
ad6b2f0e566b
Next round of sed infrastructure, parses most commands now, doesn't implement them yet.
Rob Landley <rob@landley.net>
parents:
1538
diff
changeset
|
685 error_exit("bad pattern '%s'@%ld (%c)", *pline, line-*pline+1, *line); |
1530
3eafa445c1a6
Random in-progress snapshot of sed, not finished yet.
Rob Landley <rob@landley.net>
parents:
1520
diff
changeset
|
686 } |
3eafa445c1a6
Random in-progress snapshot of sed, not finished yet.
Rob Landley <rob@landley.net>
parents:
1520
diff
changeset
|
687 |
231
31dc682c18ad
Very early stub of sed, does nothing yet.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
688 void sed_main(void) |
31dc682c18ad
Very early stub of sed, does nothing yet.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
689 { |
1530
3eafa445c1a6
Random in-progress snapshot of sed, not finished yet.
Rob Landley <rob@landley.net>
parents:
1520
diff
changeset
|
690 struct arg_list *dworkin; |
1520
dfd6b3404c16
Started over on sed (by reading the posix spec).
Rob Landley <rob@landley.net>
parents:
1235
diff
changeset
|
691 char **args = toys.optargs; |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
674
diff
changeset
|
692 |
1530
3eafa445c1a6
Random in-progress snapshot of sed, not finished yet.
Rob Landley <rob@landley.net>
parents:
1520
diff
changeset
|
693 // Lie to autoconf when it asks stupid questions, so configure regexes |
3eafa445c1a6
Random in-progress snapshot of sed, not finished yet.
Rob Landley <rob@landley.net>
parents:
1520
diff
changeset
|
694 // that look for "GNU sed version %f" greater than some old buggy number |
3eafa445c1a6
Random in-progress snapshot of sed, not finished yet.
Rob Landley <rob@landley.net>
parents:
1520
diff
changeset
|
695 // don't fail us for not matching their narrow expectations. |
1532
bf2c5216d726
Basic sed range support, enough for "sed -n 9,11p README" to work.
Rob Landley <rob@landley.net>
parents:
1530
diff
changeset
|
696 if (toys.optflags & FLAG_version) { |
1530
3eafa445c1a6
Random in-progress snapshot of sed, not finished yet.
Rob Landley <rob@landley.net>
parents:
1520
diff
changeset
|
697 xprintf("This is not GNU sed version 9.0\n"); |
3eafa445c1a6
Random in-progress snapshot of sed, not finished yet.
Rob Landley <rob@landley.net>
parents:
1520
diff
changeset
|
698 return; |
3eafa445c1a6
Random in-progress snapshot of sed, not finished yet.
Rob Landley <rob@landley.net>
parents:
1520
diff
changeset
|
699 } |
3eafa445c1a6
Random in-progress snapshot of sed, not finished yet.
Rob Landley <rob@landley.net>
parents:
1520
diff
changeset
|
700 |
1532
bf2c5216d726
Basic sed range support, enough for "sed -n 9,11p README" to work.
Rob Landley <rob@landley.net>
parents:
1530
diff
changeset
|
701 // Need a pattern. If no unicorns about, fight serpent and take its eye. |
1530
3eafa445c1a6
Random in-progress snapshot of sed, not finished yet.
Rob Landley <rob@landley.net>
parents:
1520
diff
changeset
|
702 if (!TT.e && !TT.f) { |
1520
dfd6b3404c16
Started over on sed (by reading the posix spec).
Rob Landley <rob@landley.net>
parents:
1235
diff
changeset
|
703 if (!*toys.optargs) error_exit("no pattern"); |
dfd6b3404c16
Started over on sed (by reading the posix spec).
Rob Landley <rob@landley.net>
parents:
1235
diff
changeset
|
704 (TT.e = xzalloc(sizeof(struct arg_list)))->arg = *(args++); |
694
786841fdb1e0
Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents:
674
diff
changeset
|
705 } |
1543
ad6b2f0e566b
Next round of sed infrastructure, parses most commands now, doesn't implement them yet.
Rob Landley <rob@landley.net>
parents:
1538
diff
changeset
|
706 |
ad6b2f0e566b
Next round of sed infrastructure, parses most commands now, doesn't implement them yet.
Rob Landley <rob@landley.net>
parents:
1538
diff
changeset
|
707 // Option parsing infrastructure can't interlace "-e blah -f blah -e blah" |
ad6b2f0e566b
Next round of sed infrastructure, parses most commands now, doesn't implement them yet.
Rob Landley <rob@landley.net>
parents:
1538
diff
changeset
|
708 // so handle all -e, then all -f. (At least the behavior's consistent.) |
ad6b2f0e566b
Next round of sed infrastructure, parses most commands now, doesn't implement them yet.
Rob Landley <rob@landley.net>
parents:
1538
diff
changeset
|
709 |
1532
bf2c5216d726
Basic sed range support, enough for "sed -n 9,11p README" to work.
Rob Landley <rob@landley.net>
parents:
1530
diff
changeset
|
710 for (dworkin = TT.e; dworkin; dworkin = dworkin->next) |
1530
3eafa445c1a6
Random in-progress snapshot of sed, not finished yet.
Rob Landley <rob@landley.net>
parents:
1520
diff
changeset
|
711 chop_lines(dworkin->arg, strlen(dworkin->arg), jewel_of_judgement); |
1532
bf2c5216d726
Basic sed range support, enough for "sed -n 9,11p README" to work.
Rob Landley <rob@landley.net>
parents:
1530
diff
changeset
|
712 for (dworkin = TT.f; dworkin; dworkin = dworkin->next) |
bf2c5216d726
Basic sed range support, enough for "sed -n 9,11p README" to work.
Rob Landley <rob@landley.net>
parents:
1530
diff
changeset
|
713 do_lines(xopen(dworkin->arg, O_RDONLY), dworkin->arg, jewel_of_judgement); |
bf2c5216d726
Basic sed range support, enough for "sed -n 9,11p README" to work.
Rob Landley <rob@landley.net>
parents:
1530
diff
changeset
|
714 dlist_terminate(TT.pattern); |
1538
8bc715741481
Next drop of sed infrastructure, mostly argument parsing, doesn't do anything interesting yet.
Rob Landley <rob@landley.net>
parents:
1537
diff
changeset
|
715 if (TT.nextlen) error_exit("no }"); |
1530
3eafa445c1a6
Random in-progress snapshot of sed, not finished yet.
Rob Landley <rob@landley.net>
parents:
1520
diff
changeset
|
716 |
1532
bf2c5216d726
Basic sed range support, enough for "sed -n 9,11p README" to work.
Rob Landley <rob@landley.net>
parents:
1530
diff
changeset
|
717 TT.fdout = 1; |
1545
b6ff5dc17763
Implement a few sed commands. Not done, and not tested yet.
Rob Landley <rob@landley.net>
parents:
1543
diff
changeset
|
718 TT.remember = xstrdup(""); |
1530
3eafa445c1a6
Random in-progress snapshot of sed, not finished yet.
Rob Landley <rob@landley.net>
parents:
1520
diff
changeset
|
719 |
1520
dfd6b3404c16
Started over on sed (by reading the posix spec).
Rob Landley <rob@landley.net>
parents:
1235
diff
changeset
|
720 // Inflict pattern upon input files |
1530
3eafa445c1a6
Random in-progress snapshot of sed, not finished yet.
Rob Landley <rob@landley.net>
parents:
1520
diff
changeset
|
721 loopfiles_rw(args, O_RDONLY, 0, 0, do_sed); |
1532
bf2c5216d726
Basic sed range support, enough for "sed -n 9,11p README" to work.
Rob Landley <rob@landley.net>
parents:
1530
diff
changeset
|
722 |
1538
8bc715741481
Next drop of sed infrastructure, mostly argument parsing, doesn't do anything interesting yet.
Rob Landley <rob@landley.net>
parents:
1537
diff
changeset
|
723 if (!(toys.optflags & FLAG_i)) walk_pattern(0, 0); |
231
31dc682c18ad
Very early stub of sed, does nothing yet.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
724 } |