]>
Commit | Line | Data |
---|---|---|
3839e657 TT |
1 | # |
2 | # This script parses a command_table file into something which is a bit | |
3 | # easier for an awk script to understand. | |
4 | # | |
5 | # Input syntax: a .ct file | |
6 | # | |
7 | # Output syntax: | |
8 | # (for the command_table line) | |
9 | # command_table <command_table> | |
10 | # | |
11 | #(for each request definition) | |
12 | # BOR | |
13 | # sub: <subroutine name> | |
14 | # hlp: <help text> | |
15 | # cmd: <command> | |
16 | # opt: <option> | |
17 | # EOR | |
18 | # (there may be more than one 'cmd' or 'opt' line | |
19 | # | |
20 | # A number sent to the output represents a parse error --- it will be | |
21 | # followed by the next line which will have the form: | |
22 | # ERROR: <error text> | |
23 | # | |
24 | # The design of this output syntax is such that it should be easy for | |
25 | # an awk script to parse. | |
26 | ||
27 | # | |
055866d8 | 28 | # The first section of this script is just to canonicalize the file. |
3839e657 TT |
29 | # It removes comments, and puts each command_table request onto a single |
30 | # line | |
31 | # | |
32 | :FIRST | |
33 | y/ / / | |
34 | s/^ *// | |
35 | s/#.*$// | |
36 | /; *$/!{ | |
37 | N | |
38 | y/ / / | |
39 | s/\n */ / | |
40 | bFIRST | |
41 | } | |
42 | s/, */, /g | |
43 | # | |
055866d8 | 44 | # Now we take care of some syntactic sugar..... |
3839e657 TT |
45 | # |
46 | /^unimplemented/ { | |
47 | s/^unimplemented [A-Za-z_0-9]*/request ss_unimplemented/ | |
48 | s/;/, (dont_list, dont_summarize);/ | |
49 | } | |
50 | /^unknown/ { | |
51 | s/^unknown /request ss_unknown, "", / | |
52 | } | |
53 | # | |
54 | # Dispatch based on the keyword.... illegal keywords are prefixed by ERROR: | |
55 | # and are handled by the awk script. | |
56 | # | |
57 | /^command_table /bCMD | |
58 | /^request /bREQUEST | |
59 | /^end;/bEND | |
60 | s/ .*// | |
61 | s/^/ERROR: unknown keyword: / | |
62 | = | |
63 | b | |
64 | # | |
65 | # Handle the command_table keyword | |
66 | # | |
67 | :CMD | |
68 | s/;$// | |
69 | p | |
70 | d | |
71 | b | |
72 | # | |
73 | # Handle the request keyword --- this is the heart of the sed script. | |
74 | # | |
75 | :REQUEST | |
76 | s/^request *// | |
77 | h | |
78 | i\ | |
79 | BOR | |
80 | # First, parse out the subroutine name | |
81 | s/^/sub: / | |
82 | s/,.*// | |
83 | p | |
84 | # Next, parse out the help message, being careful to handle a quoted string | |
85 | g | |
86 | s/^[^,]*, *// | |
87 | h | |
88 | /^"/ { | |
89 | s/^"// | |
90 | s/".*// | |
91 | x | |
92 | s/^"[^"]*", *// | |
93 | x | |
94 | b EMITHLP | |
95 | } | |
96 | s/[^a-zA-Z0-9].*// | |
97 | x | |
98 | s/[a-zA-Z0-9]*, *// | |
99 | x | |
100 | :EMITHLP | |
101 | s/^/hlp: / | |
102 | p | |
103 | # Next take care of the command names | |
104 | :CMDLIST | |
105 | g | |
106 | /^(/b OPTIONS | |
107 | /^;/b EOR | |
108 | /^"/ { | |
109 | s/^"// | |
110 | s/".*// | |
111 | x | |
112 | s/^"[^"]*"// | |
113 | s/, *// | |
114 | x | |
115 | b EMITREQ | |
116 | } | |
117 | s/[^A-Za-z_0-9].*// | |
118 | x | |
119 | s/[A-Za-z_0-9]*// | |
120 | s/, *// | |
121 | x | |
122 | :EMITREQ | |
123 | s/^/cmd: / | |
124 | p | |
125 | b CMDLIST | |
126 | # | |
127 | # Here we parse the list of options. | |
128 | # | |
129 | : OPTIONS | |
130 | g | |
131 | s/^(// | |
132 | h | |
133 | : OPTLIST | |
134 | /^)/ b EOR | |
135 | /^[^A-Za-z_0-9]/ { | |
136 | = | |
137 | c\ | |
138 | ERROR: parse error in options list | |
139 | } | |
140 | s/[^A-Za-z_0-9].*// | |
141 | x | |
142 | s/[A-Za-z_0-9]*// | |
143 | s/, *// | |
144 | x | |
145 | s/^/opt: / | |
146 | p | |
147 | g | |
148 | b OPTLIST | |
149 | : EOR | |
150 | c\ | |
151 | EOR\ | |
152 | ||
153 | d | |
154 | b | |
155 | # | |
156 | # Handle the end keyword --- it's basically ignored. | |
157 | # | |
158 | :END | |
159 | d | |
160 | b |