diff options
Diffstat (limited to 'trainfuck.awk')
-rwxr-xr-x | trainfuck.awk | 53 |
1 files changed, 44 insertions, 9 deletions
diff --git a/trainfuck.awk b/trainfuck.awk index df89821..1a6c19c 100755 --- a/trainfuck.awk +++ b/trainfuck.awk | |||
@@ -39,6 +39,7 @@ BEGIN { | |||
39 | # Constants | 39 | # Constants |
40 | EXE_NAME = (EXE_NAME ? EXE_NAME : "trainfuck") | 40 | EXE_NAME = (EXE_NAME ? EXE_NAME : "trainfuck") |
41 | ERR_SYNTAX = 1 | 41 | ERR_SYNTAX = 1 |
42 | ERR_ARGUMENT = 2 | ||
42 | } | 43 | } |
43 | 44 | ||
44 | BEGIN { | 45 | BEGIN { |
@@ -46,6 +47,7 @@ BEGIN { | |||
46 | ABOARD = 0 | 47 | ABOARD = 0 |
47 | FIRST_LINE = 1 | 48 | FIRST_LINE = 1 |
48 | OFS = "\t" | 49 | OFS = "\t" |
50 | header = 0 | ||
49 | } | 51 | } |
50 | 52 | ||
51 | BF_MODE == "brainfuck" { | 53 | BF_MODE == "brainfuck" { |
@@ -54,14 +56,16 @@ BF_MODE == "brainfuck" { | |||
54 | } | 56 | } |
55 | 57 | ||
56 | FIRST_LINE { | 58 | FIRST_LINE { |
57 | if (BF_PRINT_COMMENTS && first_line != "[") { | 59 | if (BF_PRINT_COMMENTS && $0 !~ /^[ \t]\[/) { |
58 | eprint("[") | 60 | eprint("[ ", 1) |
59 | } | 61 | } |
60 | eprint(first_line) | ||
61 | FIRST_LINE = 0 | 62 | FIRST_LINE = 0 |
62 | } | 63 | } |
63 | 64 | ||
64 | /^ALL ABOARD$/ { | 65 | /^ALL ABOARD$/ { |
66 | if (NR == 1) { | ||
67 | eprint(ARGV[1] " ", 1) | ||
68 | } | ||
65 | if (! header && BF_PRINT_COMMENTS) { | 69 | if (! header && BF_PRINT_COMMENTS) { |
66 | eprint("]") | 70 | eprint("]") |
67 | } | 71 | } |
@@ -94,6 +98,7 @@ END { | |||
94 | exit dead | 98 | exit dead |
95 | } | 99 | } |
96 | printbuf() | 100 | printbuf() |
101 | print "" | ||
97 | if (BF_EXECUTE) { | 102 | if (BF_EXECUTE) { |
98 | brainfuck(bf_program) | 103 | brainfuck(bf_program) |
99 | } | 104 | } |
@@ -108,8 +113,11 @@ function brainfuck(buffer) | |||
108 | for (n = 1; n < 30000; n++) { | 113 | for (n = 1; n < 30000; n++) { |
109 | tape[n] = 0 | 114 | tape[n] = 0 |
110 | } | 115 | } |
111 | while (c <= length(bf)) { | 116 | len_bf = 0 |
112 | # print i, tape[i], c, bf[c] | 117 | for (i in bf) { |
118 | len_bf++ | ||
119 | } | ||
120 | while (c <= len_bf) { | ||
113 | if (bf[c] == "<" && c > 1) { | 121 | if (bf[c] == "<" && c > 1) { |
114 | i-- | 122 | i-- |
115 | } else if (bf[c] == ">") { | 123 | } else if (bf[c] == ">") { |
@@ -163,10 +171,32 @@ function brainfuck(buffer) | |||
163 | } | 171 | } |
164 | } | 172 | } |
165 | 173 | ||
166 | function die(message, errnum) | 174 | function char2number(ch) |
175 | { | ||
176 | ascii = "" # NUL is undefined in POSIX awk ... XXX: | ||
177 | ascii = ascii "\001\002\003\004\005\006\a\b\t\n\v\f\r\016\017" | ||
178 | ascii = ascii "\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" | ||
179 | ascii = ascii " !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNO" | ||
180 | ascii = ascii "PQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\177" | ||
181 | ascii = ascii "\200\201\202\203\204\205\206\207\210\211\212\213\214\215\216\217" | ||
182 | ascii = ascii "\220\221\222\223\224\225\226\227\230\231\232\233\234\235\236\237" | ||
183 | ascii = ascii "\240\241\242\243\244\245\246\247\250\251\252\253\254\255\256\257" | ||
184 | ascii = ascii "\260\261\262\263\264\265\266\267\270\271\272\273\274\275\276\277" | ||
185 | ascii = ascii "\300\301\302\303\304\305\306\307\310\311\312\313\314\315\316\317" | ||
186 | ascii = ascii "\320\321\322\323\324\325\326\327\330\331\332\333\334\335\336\337" | ||
187 | ascii = ascii "\340\341\342\343\344\345\346\347\350\351\352\353\354\355\356\357" | ||
188 | ascii = ascii "\360\361\362\363\364\365\366\367\370\371\372\373\374\375\376\377" | ||
189 | # print ch | ||
190 | return index(ascii, ch) | ||
191 | } | ||
192 | |||
193 | function die(message, errnum, now) | ||
167 | { | 194 | { |
168 | print(message) > "/dev/stderr" | 195 | print(message) > "/dev/stderr" |
169 | dead = errnum | 196 | dead = errnum |
197 | if (now) { | ||
198 | exit errnum | ||
199 | } | ||
170 | } | 200 | } |
171 | 201 | ||
172 | function eprint(message, suppress_newline) | 202 | function eprint(message, suppress_newline) |
@@ -177,9 +207,9 @@ function eprint(message, suppress_newline) | |||
177 | function getchar() | 207 | function getchar() |
178 | { | 208 | { |
179 | system("stty raw") | 209 | system("stty raw") |
180 | cmd = "dd bs=1 count=1 2>/dev/null" | 210 | chcmd = "dd bs=1 count=1 2>/dev/null" |
181 | cmd | getline ch | 211 | chcmd | getline ch |
182 | close(cmd) | 212 | close(chcmd) |
183 | system("stty cooked") | 213 | system("stty cooked") |
184 | return ch | 214 | return ch |
185 | } | 215 | } |
@@ -236,6 +266,11 @@ function process_commandline() | |||
236 | BF_MODE = "brainfuck" | 266 | BF_MODE = "brainfuck" |
237 | BF_MODE_FORCE = 1 | 267 | BF_MODE_FORCE = 1 |
238 | delete ARGV[a] | 268 | delete ARGV[a] |
269 | } else if (ARGV[a] == "-q" || ARGV[a] == "--quiet") { | ||
270 | BF_OUTPUT = "/dev/null" | ||
271 | delete ARGV[a] | ||
272 | } else if (ARGV[a] ~ /^-/) { | ||
273 | die("Unknown option '" ARGV[a] "'", ERR_ARGUMENT, 1) | ||
239 | } | 274 | } |
240 | } | 275 | } |
241 | if (! BF_MODE_FORCE) { | 276 | if (! BF_MODE_FORCE) { |