Theodore Ts'o | 3839e65 | 1997-04-26 13:21:57 +0000 | [diff] [blame] | 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 | # |
| 28 | # The first section of this script is just to cannoicalize the file. |
| 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 | # |
| 44 | # Now we take care of some syntatic sugar..... |
| 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 |