about summary refs log tree commit diff stats
path: root/trainfuck.awk
diff options
context:
space:
mode:
Diffstat (limited to 'trainfuck.awk')
-rwxr-xr-xtrainfuck.awk53
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
44BEGIN { 45BEGIN {
@@ -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
51BF_MODE == "brainfuck" { 53BF_MODE == "brainfuck" {
@@ -54,14 +56,16 @@ BF_MODE == "brainfuck" {
54} 56}
55 57
56FIRST_LINE { 58FIRST_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
166function die(message, errnum) 174function 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
193function 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
172function eprint(message, suppress_newline) 202function eprint(message, suppress_newline)
@@ -177,9 +207,9 @@ function eprint(message, suppress_newline)
177function getchar() 207function 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) {