query.test (9883B)
1 ./querytest tests/query1 2 <<< 3 BEGIN { 4 } 5 >>> 6 BEGIN { 7 } 8 >>>2 9 >>>= 0 10 11 ./querytest tests/query2 12 <<< 13 foo(<bar>) 14 >>> 15 foo(get("bar")) 16 >>>2 17 >>>= 0 18 19 ./querytest tests/query3 20 <<< 21 x[<y<z>>] = <a'b()'> 22 >>> 23 x[get("y"get("z"))] = get("a"(b())) 24 >>>2 25 >>>= 0 26 27 ./querytest tests/query4 28 <<< 29 y = "" 30 >>> 31 y = "" 32 >>>2 33 >>>= 0 34 35 ./querytest tests/query5 36 <<< 37 y = (y) (<c:>) 38 >>> 39 y = (y) ((find("c")?found:"")) 40 >>>2 41 >>>= 0 42 43 ./querytest tests/query6 44 <<< 45 y = (y) (<d:'0'>) 46 >>> 47 y = (y) ((find("d")?found:(0))) 48 >>>2 49 >>>= 0 50 51 ./querytest tests/query7 52 <<< 53 y = (y) (<e:<f>>) 54 >>> 55 y = (y) ((find("e")?found:get("f"))) 56 >>>2 57 >>>= 0 58 59 ./querytest tests/query8 60 <<< 61 y = (y) (<g:<h:<i>>>) 62 >>> 63 y = (y) ((find("g")?found:(find("h")?found:get("i")))) 64 >>>2 65 >>>= 0 66 67 ./querytest tests/query9 68 <<< 69 y = (y) (<g:<h:<i:'<j> - (<k:'0'>)'>>>) 70 >>> 71 y = (y) ((find("g")?found:(find("h")?found:(find("i")?found:(get("j") - ((find("k")?found:(0)))))))) 72 >>>2 73 >>>= 0 74 75 ./querytest tests/query10 76 <<< 77 y = (y) (<g:<h:<i:'(<j>) - (<k:'0'>)'>>>) 78 >>> 79 y = (y) ((find("g")?found:(find("h")?found:(find("i")?found:((get("j")) - ((find("k")?found:(0)))))))) 80 >>>2 81 >>>= 0 82 83 ./querytest tests/query11 84 <<< 85 y = (y) (<a|C:'"r\n"'>) 86 >>> 87 y = (y) ((find("a")?C(found):("r\n"))) 88 >>>2 89 >>>= 0 90 91 ./querytest tests/query12 92 <<< 93 y = (y) (<a|C:"r\n">) 94 >>> 95 y = (y) ((find("a")?C(found):"r\n")) 96 >>>2 97 >>>= 0 98 99 ./querytest tests/query13 100 <<< 101 y = (y) (<a|C>) 102 >>> 103 y = (y) (C(get("a"))) 104 >>>2 105 >>>= 0 106 107 ./querytest tests/query14 108 <<< 109 #!/bin/awk -f 110 >>> 111 #!/bin/awk -f 112 >>>2 113 >>>= 0 114 115 ./querytest tests/query15 116 <<< 117 #!/bin/awk -f 118 BEGIN { 119 print "Hello!" 120 } 121 >>> 122 #!/bin/awk -f 123 BEGIN { 124 print "Hello!" 125 } 126 >>>2 127 >>>= 0 128 129 ./querytest tests/query16 130 <<< 131 #!/bin/awk -f 132 BEGIN { 133 FS="\t" 134 SUBSEP="." 135 state = 0 136 # 0 read normal variables 137 # 1 seen start of field list, read titles 138 # 2 reading list values 139 # ident_re = /[a-zA-Z_][a-zA-Z0-9_]*/ 140 ident_re = "[a-zA-Z_][a-zA-Z0-9_]*" 141 } 142 >>> 143 #!/bin/awk -f 144 BEGIN { 145 FS="\t" 146 SUBSEP="." 147 state = 0 148 # 0 read normal variables 149 # 1 seen start of field list, read titles 150 # 2 reading list values 151 # ident_re = /[a-zA-Z_][a-zA-Z0-9_]*/ 152 ident_re = "[a-zA-Z_][a-zA-Z0-9_]*" 153 } 154 >>>2 155 >>>= 0 156 157 ./querytest tests/query17 158 <<< 159 $0 == "]" && state == 2 { 160 # end of field list 161 state = 0 162 next 163 } 164 165 state == 2 { 166 V[varname,++V[varname,"rows"]] = $0 167 next 168 } 169 170 state == 1 { 171 if((varname, "fields") in V) { 172 if(V[varname,"fields"] != $0) { 173 print "data.awk: differing field definition for '"varname"'" >"/dev/stderr" 174 print "previous: '"V[varname,"fields"]"'" >"/dev/stderr" 175 print "current: '"$0"'" >"/dev/stderr" 176 exit 1 177 } 178 } 179 V[varname,"fields"] = $0 180 state = 2 181 next 182 } 183 >>> 184 $0 == "]" && state == 2 { 185 # end of field list 186 state = 0 187 next 188 } 189 190 state == 2 { 191 V[varname,++V[varname,"rows"]] = $0 192 next 193 } 194 195 state == 1 { 196 if((varname, "fields") in V) { 197 if(V[varname,"fields"] != $0) { 198 print "data.awk: differing field definition for '"varname"'" >"/dev/stderr" 199 print "previous: '"V[varname,"fields"]"'" >"/dev/stderr" 200 print "current: '"$0"'" >"/dev/stderr" 201 exit 1 202 } 203 } 204 V[varname,"fields"] = $0 205 state = 2 206 next 207 } 208 >>>2 209 >>>=0 210 211 ./querytest tests/query18 212 <<< 213 /^del[ \t].*[a-zA-Z_][a-zA-Z0-9_.]$/ { 214 del_pattern = substr($0, 5) 215 for(varname in V) { 216 if (match(varname, del_pattern)) { 217 delete V[varname] 218 } 219 } 220 } 221 222 /^[a-zA-Z_][a-zA-Z0-9_.]*=\[$/ { 223 # start of field list 224 state = 1 225 m = match($0, ident_re) 226 varname = substr($0, m, RLENGTH) 227 next 228 } 229 230 /^[a-zA-Z_][a-zA-Z0-9_.]*=/ { 231 m = match($0, ident_re) 232 varname = substr($0, m, RLENGTH) 233 V[varname] = substr($0, m+1+RLENGTH) 234 if(DEBUG) printf "got scalar: %s ⇒ %s (%d)\n", varname, V[varname], m >"/dev/stderr" 235 next 236 } 237 238 /^\t/ { 239 V[varname] = V[varname] "\n" substr($0, 1) 240 next 241 } 242 243 /^#/ { next } 244 /^$/ { next } 245 >>> 246 /^del[ \t].*[a-zA-Z_][a-zA-Z0-9_.]$/ { 247 del_pattern = substr($0, 5) 248 for(varname in V) { 249 if (match(varname, del_pattern)) { 250 delete V[varname] 251 } 252 } 253 } 254 255 /^[a-zA-Z_][a-zA-Z0-9_.]*=\[$/ { 256 # start of field list 257 state = 1 258 m = match($0, ident_re) 259 varname = substr($0, m, RLENGTH) 260 next 261 } 262 263 /^[a-zA-Z_][a-zA-Z0-9_.]*=/ { 264 m = match($0, ident_re) 265 varname = substr($0, m, RLENGTH) 266 V[varname] = substr($0, m+1+RLENGTH) 267 if(DEBUG) printf "got scalar: %s ⇒ %s (%d)\n", varname, V[varname], m >"/dev/stderr" 268 next 269 } 270 271 /^\t/ { 272 V[varname] = V[varname] "\n" substr($0, 1) 273 next 274 } 275 276 /^#/ { next } 277 /^$/ { next } 278 >>>2 279 >>>=0 280 281 ./querytest tests/query19 282 <<< 283 { 284 # TODO posix compliance 285 print "data.awk: unparseable line: '"$0"'" >"/dev/stderr" 286 exit 1 287 } 288 289 function loop_start(varname, prefix, depth) { 290 depth = ++loop_stack["depth"] 291 loop_stack[depth,"row"] = 0 292 loop_stack[depth,"var"] = varname 293 loop_stack[depth,"pre"] = prefix 294 return depth 295 } 296 297 function loop_iter(depth) { 298 loop_stack[depth,"row"]++ 299 return (loop_stack[depth,"var"], loop_stack[depth,"row"]) in V 300 } 301 302 function loop_end() { 303 delete loop_stack[loop_stack["depth"], "row"] 304 delete loop_stack[loop_stack["depth"], "var"] 305 delete loop_stack[loop_stack["depth"], "pre"] 306 loop_stack["depth"]-- 307 } 308 309 function find(varname, i, n, names, values, loopvar, looprow, prefix) { 310 for(i=loop_stack["depth"]; i>0; i--) { 311 prefix = loop_stack[i, "pre"] 312 if(prefix) 313 if(substr(varname, 1, length(prefix)) != prefix) 314 continue 315 loopvar = loop_stack[i, "var"] 316 looprow = loop_stack[i, "row"] 317 if(varname == prefix"_index") 318 return looprow 319 if(varname == prefix"_index0") 320 return looprow - 1 321 if(varname == prefix"_revindex") 322 return V[loopvar, "rows"] - looprow + 1 323 if(varname == prefix"_revindex0") 324 return V[loopvar, "rows"] - looprow 325 if(varname == prefix"_first") 326 return looprow == 1 327 if(varname == prefix"_last") 328 return looprow == V[loopvar, "rows"] 329 if(varname == prefix"_length") 330 return V[loopvar, "rows"] 331 split(V[loopvar, "fields"], names) 332 for(n in names) { 333 if(varname == (prefix names[n])) { 334 split(V[loopvar, looprow], values) 335 return values[n] 336 } 337 } 338 } 339 if(!(varname in V)) { 340 if(DEBUG) { 341 print "variable not found: " varname >"/dev/stderr" 342 } 343 return 0 344 } 345 found = V[varname] 346 return 1 347 } 348 349 function get(varname) { 350 if(!find(varname)) { 351 print "error: undefined variable '"varname"'" >"/dev/stderr" 352 exit 1 353 } 354 if(DEBUG) { 355 print "get →" varname "← ⇒ →"found"←" >"/dev/stderr" 356 } 357 return found 358 } 359 360 function or_(a, b) { 361 return a ? a : b 362 } 363 364 END { 365 if(DEBUG) { 366 print "--- loaded keys ---" >"/dev/stderr" 367 for(key in V) 368 printf("%s\t→%s←\t", key, V[key]) >"/dev/stderr" 369 printf(">> %d →%s←\n", find(key), found) >"/dev/stderr" 370 print "-------------------" >"/dev/stderr" 371 } 372 } 373 >>> 374 { 375 # TODO posix compliance 376 print "data.awk: unparseable line: '"$0"'" >"/dev/stderr" 377 exit 1 378 } 379 380 function loop_start(varname, prefix, depth) { 381 depth = ++loop_stack["depth"] 382 loop_stack[depth,"row"] = 0 383 loop_stack[depth,"var"] = varname 384 loop_stack[depth,"pre"] = prefix 385 return depth 386 } 387 388 function loop_iter(depth) { 389 loop_stack[depth,"row"]++ 390 return (loop_stack[depth,"var"], loop_stack[depth,"row"]) in V 391 } 392 393 function loop_end() { 394 delete loop_stack[loop_stack["depth"], "row"] 395 delete loop_stack[loop_stack["depth"], "var"] 396 delete loop_stack[loop_stack["depth"], "pre"] 397 loop_stack["depth"]-- 398 } 399 400 function find(varname, i, n, names, values, loopvar, looprow, prefix) { 401 for(i=loop_stack["depth"]; i>0; i--) { 402 prefix = loop_stack[i, "pre"] 403 if(prefix) 404 if(substr(varname, 1, length(prefix)) != prefix) 405 continue 406 loopvar = loop_stack[i, "var"] 407 looprow = loop_stack[i, "row"] 408 if(varname == prefix"_index") 409 return looprow 410 if(varname == prefix"_index0") 411 return looprow - 1 412 if(varname == prefix"_revindex") 413 return V[loopvar, "rows"] - looprow + 1 414 if(varname == prefix"_revindex0") 415 return V[loopvar, "rows"] - looprow 416 if(varname == prefix"_first") 417 return looprow == 1 418 if(varname == prefix"_last") 419 return looprow == V[loopvar, "rows"] 420 if(varname == prefix"_length") 421 return V[loopvar, "rows"] 422 split(V[loopvar, "fields"], names) 423 for(n in names) { 424 if(varname == (prefix names[n])) { 425 split(V[loopvar, looprow], values) 426 return values[n] 427 } 428 } 429 } 430 if(!(varname in V)) { 431 if(DEBUG) { 432 print "variable not found: " varname >"/dev/stderr" 433 } 434 return 0 435 } 436 found = V[varname] 437 return 1 438 } 439 440 function get(varname) { 441 if(!find(varname)) { 442 print "error: undefined variable '"varname"'" >"/dev/stderr" 443 exit 1 444 } 445 if(DEBUG) { 446 print "get →" varname "← ⇒ →"found"←" >"/dev/stderr" 447 } 448 return found 449 } 450 451 function or_(a, b) { 452 return a ? a : b 453 } 454 455 END { 456 if(DEBUG) { 457 print "--- loaded keys ---" >"/dev/stderr" 458 for(key in V) 459 printf("%s\t→%s←\t", key, V[key]) >"/dev/stderr" 460 printf(">> %d →%s←\n", find(key), found) >"/dev/stderr" 461 print "-------------------" >"/dev/stderr" 462 } 463 } 464 >>>2 465 >>>= 0 466 467 ./querytest tests/query20 468 <<< 469 # start @awk /home/ccx/.local/bzr/aat/data.awk {{{ 470 #!/bin/awk -f 471 BEGIN { 472 } 473 # }}} end @awk /home/ccx/.local/bzr/aat/data.awk 474 # START: bar/inherit/example/data.aat 475 END{ 476 printf "%s", "hostname=" (<hostname:"localhost">) "\n" 477 } 478 # END: bar/inherit/example/data.aat 479 >>> 480 # start @awk /home/ccx/.local/bzr/aat/data.awk {{{ 481 #!/bin/awk -f 482 BEGIN { 483 } 484 # }}} end @awk /home/ccx/.local/bzr/aat/data.awk 485 # START: bar/inherit/example/data.aat 486 END{ 487 printf "%s", "hostname=" ((find("hostname")?found:"localhost")) "\n" 488 } 489 # END: bar/inherit/example/data.aat 490 >>>2 491 >>>= 0 492 493 ./querytest tests/query21 494 <<< 495 if(DEBUG) printf "got scalar: %s ⇒ %s (%d)\n", varname, V[varname], m >"/dev/stderr" 496 >>> 497 if(DEBUG) printf "got scalar: %s ⇒ %s (%d)\n", varname, V[varname], m >"/dev/stderr" 498 >>>2 499 >>>= 0 500 501 ./querytest tests/query22 502 <<< 503 printf "%s", (ifdir) "/" (int_args[n]) " " (<int.'int_args[n]'|C:"r">) "\n" 504 >>> 505 printf "%s", (ifdir) "/" (int_args[n]) " " ((find("int."(int_args[n]))?C(found):"r")) "\n" 506 >>>2 507 >>>= 0 508 509 ./querytest tests/query23 510 <<< 511 printf "%s", (vsdir) "/shellͺ " (<vs.shell|C:"r">) "\n" 512 >>> 513 printf "%s", (vsdir) "/shellͺ " ((find("vs.shell")?C(found):"r")) "\n" 514 >>>2 515 >>>= 0