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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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 }