mirror of
https://github.com/GnoConsortium/gno.git
synced 2024-06-08 05:29:33 +00:00
Remaining files for awk 2.0 that were left out of the previous checkin.
Maybe someday I'll become adept at using cvs...
This commit is contained in:
parent
0b6d503134
commit
ddb82cb2e0
207
usr.bin/awk/proctab.c
Normal file
207
usr.bin/awk/proctab.c
Normal file
|
@ -0,0 +1,207 @@
|
|||
/* $Id: proctab.c,v 1.1 1998/04/07 17:03:52 tribby Exp $ */
|
||||
|
||||
#include <stdio.h>
|
||||
#include "awk.h"
|
||||
#include "ytab.h"
|
||||
|
||||
static char *printname[92] = {
|
||||
(char *) "FIRSTTOKEN", /* 257 */
|
||||
(char *) "PROGRAM", /* 258 */
|
||||
(char *) "PASTAT", /* 259 */
|
||||
(char *) "PASTAT2", /* 260 */
|
||||
(char *) "XBEGIN", /* 261 */
|
||||
(char *) "XEND", /* 262 */
|
||||
(char *) "NL", /* 263 */
|
||||
(char *) "ARRAY", /* 264 */
|
||||
(char *) "MATCH", /* 265 */
|
||||
(char *) "NOTMATCH", /* 266 */
|
||||
(char *) "MATCHOP", /* 267 */
|
||||
(char *) "FINAL", /* 268 */
|
||||
(char *) "DOT", /* 269 */
|
||||
(char *) "ALL", /* 270 */
|
||||
(char *) "CCL", /* 271 */
|
||||
(char *) "NCCL", /* 272 */
|
||||
(char *) "CHAR", /* 273 */
|
||||
(char *) "OR", /* 274 */
|
||||
(char *) "STAR", /* 275 */
|
||||
(char *) "QUEST", /* 276 */
|
||||
(char *) "PLUS", /* 277 */
|
||||
(char *) "AND", /* 278 */
|
||||
(char *) "BOR", /* 279 */
|
||||
(char *) "APPEND", /* 280 */
|
||||
(char *) "EQ", /* 281 */
|
||||
(char *) "GE", /* 282 */
|
||||
(char *) "GT", /* 283 */
|
||||
(char *) "LE", /* 284 */
|
||||
(char *) "LT", /* 285 */
|
||||
(char *) "NE", /* 286 */
|
||||
(char *) "IN", /* 287 */
|
||||
(char *) "ARG", /* 288 */
|
||||
(char *) "BLTIN", /* 289 */
|
||||
(char *) "BREAK", /* 290 */
|
||||
(char *) "CLOSE", /* 291 */
|
||||
(char *) "CONTINUE", /* 292 */
|
||||
(char *) "DELETE", /* 293 */
|
||||
(char *) "DO", /* 294 */
|
||||
(char *) "EXIT", /* 295 */
|
||||
(char *) "FOR", /* 296 */
|
||||
(char *) "FUNC", /* 297 */
|
||||
(char *) "SUB", /* 298 */
|
||||
(char *) "GSUB", /* 299 */
|
||||
(char *) "IF", /* 300 */
|
||||
(char *) "INDEX", /* 301 */
|
||||
(char *) "LSUBSTR", /* 302 */
|
||||
(char *) "MATCHFCN", /* 303 */
|
||||
(char *) "NEXT", /* 304 */
|
||||
(char *) "NEXTFILE", /* 305 */
|
||||
(char *) "ADD", /* 306 */
|
||||
(char *) "MINUS", /* 307 */
|
||||
(char *) "MULT", /* 308 */
|
||||
(char *) "DIVIDE", /* 309 */
|
||||
(char *) "MOD", /* 310 */
|
||||
(char *) "ASSIGN", /* 311 */
|
||||
(char *) "ASGNOP", /* 312 */
|
||||
(char *) "ADDEQ", /* 313 */
|
||||
(char *) "SUBEQ", /* 314 */
|
||||
(char *) "MULTEQ", /* 315 */
|
||||
(char *) "DIVEQ", /* 316 */
|
||||
(char *) "MODEQ", /* 317 */
|
||||
(char *) "POWEQ", /* 318 */
|
||||
(char *) "PRINT", /* 319 */
|
||||
(char *) "PRINTF", /* 320 */
|
||||
(char *) "SPRINTF", /* 321 */
|
||||
(char *) "ELSE", /* 322 */
|
||||
(char *) "INTEST", /* 323 */
|
||||
(char *) "CONDEXPR", /* 324 */
|
||||
(char *) "POSTINCR", /* 325 */
|
||||
(char *) "PREINCR", /* 326 */
|
||||
(char *) "POSTDECR", /* 327 */
|
||||
(char *) "PREDECR", /* 328 */
|
||||
(char *) "VAR", /* 329 */
|
||||
(char *) "IVAR", /* 330 */
|
||||
(char *) "VARNF", /* 331 */
|
||||
(char *) "CALL", /* 332 */
|
||||
(char *) "NUMBER", /* 333 */
|
||||
(char *) "STRING", /* 334 */
|
||||
(char *) "REGEXPR", /* 335 */
|
||||
(char *) "GETLINE", /* 336 */
|
||||
(char *) "RETURN", /* 337 */
|
||||
(char *) "SPLIT", /* 338 */
|
||||
(char *) "SUBSTR", /* 339 */
|
||||
(char *) "WHILE", /* 340 */
|
||||
(char *) "CAT", /* 341 */
|
||||
(char *) "NOT", /* 342 */
|
||||
(char *) "UMINUS", /* 343 */
|
||||
(char *) "POWER", /* 344 */
|
||||
(char *) "DECR", /* 345 */
|
||||
(char *) "INCR", /* 346 */
|
||||
(char *) "INDIRECT", /* 347 */
|
||||
(char *) "LASTTOKEN", /* 348 */
|
||||
};
|
||||
|
||||
|
||||
Cell *(*proctab[92])(Node **, int) = {
|
||||
nullproc, /* FIRSTTOKEN */
|
||||
program, /* PROGRAM */
|
||||
pastat, /* PASTAT */
|
||||
dopa2, /* PASTAT2 */
|
||||
nullproc, /* XBEGIN */
|
||||
nullproc, /* XEND */
|
||||
nullproc, /* NL */
|
||||
array, /* ARRAY */
|
||||
matchop, /* MATCH */
|
||||
matchop, /* NOTMATCH */
|
||||
nullproc, /* MATCHOP */
|
||||
nullproc, /* FINAL */
|
||||
nullproc, /* DOT */
|
||||
nullproc, /* ALL */
|
||||
nullproc, /* CCL */
|
||||
nullproc, /* NCCL */
|
||||
nullproc, /* CHAR */
|
||||
nullproc, /* OR */
|
||||
nullproc, /* STAR */
|
||||
nullproc, /* QUEST */
|
||||
nullproc, /* PLUS */
|
||||
boolop, /* AND */
|
||||
boolop, /* BOR */
|
||||
nullproc, /* APPEND */
|
||||
relop, /* EQ */
|
||||
relop, /* GE */
|
||||
relop, /* GT */
|
||||
relop, /* LE */
|
||||
relop, /* LT */
|
||||
relop, /* NE */
|
||||
instat, /* IN */
|
||||
arg, /* ARG */
|
||||
bltin, /* BLTIN */
|
||||
jump, /* BREAK */
|
||||
closefile, /* CLOSE */
|
||||
jump, /* CONTINUE */
|
||||
awkdelete, /* DELETE */
|
||||
dostat, /* DO */
|
||||
jump, /* EXIT */
|
||||
forstat, /* FOR */
|
||||
nullproc, /* FUNC */
|
||||
sub, /* SUB */
|
||||
gsub, /* GSUB */
|
||||
ifstat, /* IF */
|
||||
sindex, /* INDEX */
|
||||
nullproc, /* LSUBSTR */
|
||||
matchop, /* MATCHFCN */
|
||||
jump, /* NEXT */
|
||||
jump, /* NEXTFILE */
|
||||
arith, /* ADD */
|
||||
arith, /* MINUS */
|
||||
arith, /* MULT */
|
||||
arith, /* DIVIDE */
|
||||
arith, /* MOD */
|
||||
assign, /* ASSIGN */
|
||||
nullproc, /* ASGNOP */
|
||||
assign, /* ADDEQ */
|
||||
assign, /* SUBEQ */
|
||||
assign, /* MULTEQ */
|
||||
assign, /* DIVEQ */
|
||||
assign, /* MODEQ */
|
||||
assign, /* POWEQ */
|
||||
printstat, /* PRINT */
|
||||
awkprintf, /* PRINTF */
|
||||
awksprintf, /* SPRINTF */
|
||||
nullproc, /* ELSE */
|
||||
intest, /* INTEST */
|
||||
condexpr, /* CONDEXPR */
|
||||
incrdecr, /* POSTINCR */
|
||||
incrdecr, /* PREINCR */
|
||||
incrdecr, /* POSTDECR */
|
||||
incrdecr, /* PREDECR */
|
||||
nullproc, /* VAR */
|
||||
nullproc, /* IVAR */
|
||||
getnf, /* VARNF */
|
||||
call, /* CALL */
|
||||
nullproc, /* NUMBER */
|
||||
nullproc, /* STRING */
|
||||
nullproc, /* REGEXPR */
|
||||
getline, /* GETLINE */
|
||||
jump, /* RETURN */
|
||||
split, /* SPLIT */
|
||||
substr, /* SUBSTR */
|
||||
whilestat, /* WHILE */
|
||||
cat, /* CAT */
|
||||
boolop, /* NOT */
|
||||
arith, /* UMINUS */
|
||||
arith, /* POWER */
|
||||
nullproc, /* DECR */
|
||||
nullproc, /* INCR */
|
||||
indirect, /* INDIRECT */
|
||||
nullproc, /* LASTTOKEN */
|
||||
};
|
||||
|
||||
char *tokname(int n)
|
||||
{
|
||||
static char buf[100];
|
||||
|
||||
if (n < FIRSTTOKEN || n > LASTTOKEN) {
|
||||
sprintf(buf, "token %d", n);
|
||||
return buf;
|
||||
}
|
||||
return printname[n-FIRSTTOKEN];
|
||||
}
|
16
usr.bin/awk/tests/addr.1
Normal file
16
usr.bin/awk/tests/addr.1
Normal file
|
@ -0,0 +1,16 @@
|
|||
Adam Smith
|
||||
1234 Wall St., Apt. 5C
|
||||
New York, NY 10021
|
||||
212 555-4321
|
||||
|
||||
David W. Copperfield
|
||||
221 Dickens Lane
|
||||
Monterey, CA 93940
|
||||
408 555-0041
|
||||
work phone 408 555-6532
|
||||
Mary, birthday January 30
|
||||
|
||||
Canadian Consulate
|
||||
555 Fifth Ave
|
||||
New York, NY
|
||||
212 586-2400
|
19
usr.bin/awk/tests/array.awk
Normal file
19
usr.bin/awk/tests/array.awk
Normal file
|
@ -0,0 +1,19 @@
|
|||
# Read values into an array
|
||||
|
||||
$1 == "REMOVE" { delete value[$2]; next }
|
||||
|
||||
$1 == "RESET" {delete value; next}
|
||||
|
||||
$1 == "SKIP" {nextfile}
|
||||
|
||||
$1 == "PRINT" {printarray(value); next}
|
||||
|
||||
{ value[$1] = $2 }
|
||||
|
||||
END { printarray(value) }
|
||||
|
||||
function printarray(A, key) {
|
||||
print "Values in array";
|
||||
for (key in A) print " ",key,A[key];
|
||||
print " ";
|
||||
}
|
21
usr.bin/awk/tests/array1.data
Normal file
21
usr.bin/awk/tests/array1.data
Normal file
|
@ -0,0 +1,21 @@
|
|||
one 1
|
||||
two 2
|
||||
three 3
|
||||
four 4
|
||||
five 5
|
||||
six 6
|
||||
seven 7
|
||||
eight 8
|
||||
nine 9
|
||||
PRINT
|
||||
REMOVE nine
|
||||
REMOVE bad
|
||||
PRINT
|
||||
RESET
|
||||
one I
|
||||
two II
|
||||
three III
|
||||
four IIII
|
||||
SKIP
|
||||
badentry BAD
|
||||
PRINT
|
3
usr.bin/awk/tests/array2.data
Normal file
3
usr.bin/awk/tests/array2.data
Normal file
|
@ -0,0 +1,3 @@
|
|||
four IV
|
||||
five V
|
||||
six VI
|
48
usr.bin/awk/tests/asm
Normal file
48
usr.bin/awk/tests/asm
Normal file
|
@ -0,0 +1,48 @@
|
|||
# asm - assembler and interpreter for simple computer
|
||||
# usage: awk -f asm program-file data-files...
|
||||
|
||||
BEGIN {
|
||||
srcfile = ARGV[1]
|
||||
ARGV[1] = "" # remaining files are data
|
||||
tempfile = "/tmp/asm.temp"
|
||||
n = split("const get put ld st add sub jpos jz j halt", x)
|
||||
for (i = 1; i <= n; i++) # create table of op codes
|
||||
op[x[i]] = i-1
|
||||
|
||||
# ASSEMBLER PASS 1
|
||||
FS = "[ \t]+"
|
||||
while (getline <srcfile > 0) {
|
||||
sub(/#.*/, "") # strip comments
|
||||
symtab[$1] = nextmem # remember label location
|
||||
if ($2 != "") { # save op, addr if present
|
||||
print $2 "\t" $3 >tempfile
|
||||
nextmem++
|
||||
}
|
||||
}
|
||||
close(tempfile)
|
||||
|
||||
# ASSEMBLER PASS 2
|
||||
nextmem = 0
|
||||
while (getline <tempfile > 0) {
|
||||
if ($2 !~ /^[0-9]*$/) # if symbolic addr,
|
||||
$2 = symtab[$2] # replace by numeric value
|
||||
mem[nextmem++] = 1000 * op[$1] + $2 # pack into word
|
||||
}
|
||||
|
||||
# INTERPRETER
|
||||
for (pc = 0; pc >= 0; ) {
|
||||
addr = mem[pc] % 1000
|
||||
code = int(mem[pc++] / 1000)
|
||||
if (code == op["get"]) { getline acc }
|
||||
else if (code == op["put"]) { print acc }
|
||||
else if (code == op["st"]) { mem[addr] = acc }
|
||||
else if (code == op["ld"]) { acc = mem[addr] }
|
||||
else if (code == op["add"]) { acc += mem[addr] }
|
||||
else if (code == op["sub"]) { acc -= mem[addr] }
|
||||
else if (code == op["jpos"]) { if (acc > 0) pc = addr }
|
||||
else if (code == op["jz"]) { if (acc == 0) pc = addr }
|
||||
else if (code == op["j"]) { pc = addr }
|
||||
else if (code == op["halt"]) { pc = -1 }
|
||||
else { pc = -1 }
|
||||
}
|
||||
}
|
37
usr.bin/awk/tests/asm.print
Normal file
37
usr.bin/awk/tests/asm.print
Normal file
|
@ -0,0 +1,37 @@
|
|||
# asm - assembler and interpreter for simple computer
|
||||
# usage: awk -f asm program-file data-files...
|
||||
|
||||
# this is a special version to produce a listing
|
||||
|
||||
BEGIN {
|
||||
srcfile = ARGV[1]
|
||||
ARGV[1] = "" # remaining files are data
|
||||
tempfile = "/tmp/asm.temp"
|
||||
n = split("const get put ld st add sub jpos jz j halt", x)
|
||||
for (i = 1; i <= n; i++) # create table of op codes
|
||||
op[x[i]] = i-1
|
||||
|
||||
# ASSEMBLER PASS 1
|
||||
nextmem = 0 # new
|
||||
FS = "[ \t]+"
|
||||
while (getline <srcfile > 0) {
|
||||
input[nextmem] = $0 # new: remember source line
|
||||
sub(/#.*/, "") # strip comments
|
||||
symtab[$1] = nextmem # remember label location
|
||||
if ($2 != "") { # save op, addr if present
|
||||
print $2 "\t" $3 >tempfile
|
||||
nextmem++
|
||||
}
|
||||
}
|
||||
close(tempfile)
|
||||
|
||||
# ASSEMBLER PASS 2
|
||||
nextmem = 0
|
||||
while (getline <tempfile > 0) {
|
||||
if ($2 !~ /^[0-9]*$/) # if symbolic addr,
|
||||
$2 = symtab[$2] # replace by numeric value
|
||||
mem[nextmem++] = 1000 * op[$1] + $2 # pack into word
|
||||
}
|
||||
for (i = 0; i < nextmem; i++) # new: print memory
|
||||
printf("%3d: %05d %s\n", i, mem[i], input[i]) # new
|
||||
}
|
171
usr.bin/awk/tests/awk.parser
Normal file
171
usr.bin/awk/tests/awk.parser
Normal file
|
@ -0,0 +1,171 @@
|
|||
# awk.parser - recursive-descent translator for part of awk
|
||||
# input: awk program (very restricted subset)
|
||||
# output: C code to implement the awk program
|
||||
|
||||
BEGIN { program() }
|
||||
|
||||
function advance() { # lexical analyzer; returns next token
|
||||
if (tok == "(eof)") return "(eof)"
|
||||
while (length(line) == 0)
|
||||
if (getline line == 0)
|
||||
return tok = "(eof)"
|
||||
sub(/^[ \t]+/, "", line) # remove white space
|
||||
if (match(line, /^[A-Za-z_][A-Za-z_0-9]*/) || # identifier
|
||||
match(line, /^-?([0-9]+\.?[0-9]*|\.[0-9]+)/) || # number
|
||||
match(line, /^(<|<=|==|!=|>=|>)/) || # relational
|
||||
match(line, /^./)) { # everything else
|
||||
tok = substr(line, 1, RLENGTH)
|
||||
line = substr(line, RLENGTH+1)
|
||||
return tok
|
||||
}
|
||||
error("line " NR " incomprehensible at " line)
|
||||
}
|
||||
function gen(s) { # print s with nt leading tabs
|
||||
printf("%s%s\n", substr("\t\t\t\t\t\t\t\t\t", 1, nt), s)
|
||||
}
|
||||
function eat(s) { # read next token if s == tok
|
||||
if (tok != s) error("line " NF ": saw " tok ", expected " s)
|
||||
advance()
|
||||
}
|
||||
function nl() { # absorb newlines and semicolons
|
||||
while (tok == "\n" || tok == ";")
|
||||
advance()
|
||||
}
|
||||
function error(s) { print "Error: " s | "cat 1>&2"; exit 1 }
|
||||
|
||||
function program() {
|
||||
advance()
|
||||
if (tok == "BEGIN") { eat("BEGIN"); statlist() }
|
||||
pastats()
|
||||
if (tok == "END") { eat("END"); statlist() }
|
||||
if (tok != "(eof)") error("program continues after END")
|
||||
}
|
||||
function pastats() {
|
||||
gen("while (getrec()) {"); nt++
|
||||
while (tok != "END" && tok != "(eof)") pastat()
|
||||
nt--; gen("}")
|
||||
}
|
||||
function pastat() { # pattern-action statement
|
||||
if (tok == "{") # action only
|
||||
statlist()
|
||||
else { # pattern-action
|
||||
gen("if (" pattern() ") {"); nt++
|
||||
if (tok == "{") statlist()
|
||||
else # default action is print $0
|
||||
gen("print(field(0));")
|
||||
nt--; gen("}")
|
||||
}
|
||||
}
|
||||
function pattern() { return expr() }
|
||||
|
||||
function statlist() {
|
||||
eat("{"); nl(); while (tok != "}") stat(); eat("}"); nl()
|
||||
}
|
||||
|
||||
function stat() {
|
||||
if (tok == "print") { eat("print"); gen("print(" exprlist() ");") }
|
||||
else if (tok == "if") ifstat()
|
||||
else if (tok == "while") whilestat()
|
||||
else if (tok == "{") statlist()
|
||||
else gen(simplestat() ";")
|
||||
nl()
|
||||
}
|
||||
|
||||
function ifstat() {
|
||||
eat("if"); eat("("); gen("if (" expr() ") {"); eat(")"); nl(); nt++
|
||||
stat()
|
||||
if (tok == "else") { # optional else
|
||||
eat("else")
|
||||
nl(); nt--; gen("} else {"); nt++
|
||||
stat()
|
||||
}
|
||||
nt--; gen("}")
|
||||
}
|
||||
|
||||
function whilestat() {
|
||||
eat("while"); eat("("); gen("while (" expr() ") {"); eat(")"); nl()
|
||||
nt++; stat(); nt--; gen("}")
|
||||
}
|
||||
|
||||
function simplestat( lhs) { # ident = expr | name(exprlist)
|
||||
lhs = ident()
|
||||
if (tok == "=") {
|
||||
eat("=")
|
||||
return "assign(" lhs ", " expr() ")"
|
||||
} else return lhs
|
||||
}
|
||||
|
||||
function exprlist( n, e) { # expr , expr , ...
|
||||
e = expr() # has to be at least one
|
||||
for (n = 1; tok == ","; n++) {
|
||||
advance()
|
||||
e = e ", " expr()
|
||||
}
|
||||
return e
|
||||
}
|
||||
|
||||
function expr(e) { # rel | rel relop rel
|
||||
e = rel()
|
||||
while (tok ~ /<|<=|==|!=|>=|>/) {
|
||||
op = tok
|
||||
advance()
|
||||
e = sprintf("eval(\"%s\", %s, %s)", op, e, rel())
|
||||
}
|
||||
return e
|
||||
}
|
||||
|
||||
function rel(op, e) { # term | term [+-] term
|
||||
e = term()
|
||||
while (tok == "+" || tok == "-") {
|
||||
op = tok
|
||||
advance()
|
||||
e = sprintf("eval(\"%s\", %s, %s)", op, e, term())
|
||||
}
|
||||
return e
|
||||
}
|
||||
|
||||
function term(op, e) { # fact | fact [*/%] fact
|
||||
e = fact()
|
||||
while (tok == "*" || tok == "/" || tok == "%") {
|
||||
op = tok
|
||||
advance()
|
||||
e = sprintf("eval(\"%s\", %s, %s)", op, e, fact())
|
||||
}
|
||||
return e
|
||||
}
|
||||
|
||||
function fact( e) { # (expr) | $fact | ident | number
|
||||
if (tok == "(") {
|
||||
eat("("); e = expr(); eat(")")
|
||||
return "(" e ")"
|
||||
} else if (tok == "$") {
|
||||
eat("$")
|
||||
return "field(" fact() ")"
|
||||
} else if (tok ~ /^[A-Za-z][A-Za-z0-9]*/) {
|
||||
return ident()
|
||||
} else if (tok ~ /^-?([0-9]+\.?[0-9]*|\.[0-9]+)/) {
|
||||
e = tok
|
||||
advance()
|
||||
return "num((float)" e ")"
|
||||
} else
|
||||
error("unexpected " tok " at line " NR)
|
||||
}
|
||||
|
||||
function ident( id, e) { # name | name[expr] | name(exprlist)
|
||||
if (!match(tok, /^[A-Za-z_][A-Za-z_0-9]*/))
|
||||
error("unexpected " tok " at line " NR)
|
||||
id = tok
|
||||
advance()
|
||||
if (tok == "[") { # array
|
||||
eat("["); e = expr(); eat("]")
|
||||
return "array(" id ", " e ")"
|
||||
} else if (tok == "(") { # function call
|
||||
eat("(")
|
||||
if (tok != ")") {
|
||||
e = exprlist()
|
||||
eat(")")
|
||||
} else eat(")")
|
||||
return id "(" e ")" # calls are statements
|
||||
} else
|
||||
return id # variable
|
||||
}
|
6
usr.bin/awk/tests/bigpop
Normal file
6
usr.bin/awk/tests/bigpop
Normal file
|
@ -0,0 +1,6 @@
|
|||
USSR 275
|
||||
China 1032
|
||||
USA 237
|
||||
Brazil 134
|
||||
India 746
|
||||
Japan 120
|
58
usr.bin/awk/tests/bridge.ans
Normal file
58
usr.bin/awk/tests/bridge.ans
Normal file
|
@ -0,0 +1,58 @@
|
|||
# bridge - generate random bridge hands
|
||||
|
||||
BEGIN { split(permute(52,52), deck) # generate a random deck
|
||||
sort(1,13); sort(14,26); sort(27,39); sort(40,52) # sort hands
|
||||
prhands() # format and print the four hands
|
||||
}
|
||||
|
||||
function permute(k, n, i, p, r) { # generate a random permutation
|
||||
srand(1); # leave out "1" for more randomness
|
||||
p = " " # of k integers between 1 and n
|
||||
for (i = n-k+1; i <= n; i++)
|
||||
if (p ~ " " (r = int(i*rand())+1) " " )
|
||||
sub(" " r " ", " " r " " i " ", p) # put i after r in p
|
||||
else p = " " r p # put r at beginning of p
|
||||
return p
|
||||
}
|
||||
|
||||
function sort(left,right, i,j,t) { # sort hand in deck[left..right]
|
||||
for (i = left+1; i <= right; i++)
|
||||
for (j = i; j > left && deck[j-1] < deck[j]; j--) {
|
||||
t = deck[j-1]; deck[j-1] = deck[j]; deck[j] = t
|
||||
}
|
||||
}
|
||||
|
||||
function prhands() { # print the four hands
|
||||
b = sprintf("%20s", " "); b40 = sprintf("%40s", " ")
|
||||
card = 1 # global index into deck
|
||||
suits(13); print b " NORTH"
|
||||
print b spds; print b hrts; print b dnds; print b clbs
|
||||
suits(26) # create the west hand from deck[14..26]
|
||||
ws = spds substr(b40, 1, 40 - length(spds))
|
||||
wh = hrts substr(b40, 1, 40 - length(hrts))
|
||||
wd = dnds substr(b40, 1, 40 - length(dnds))
|
||||
wc = clbs substr(b40, 1, 40 - length(clbs))
|
||||
suits(39); print " WEST" sprintf("%36s", " ") "EAST"
|
||||
print ws spds; print wh hrts; print wd dnds; print wc clbs
|
||||
suits(52); print b " SOUTH"
|
||||
print b spds; print b hrts; print b dnds; print b clbs
|
||||
}
|
||||
|
||||
function suits(j) { # collect suits of hand in deck[j-12..j]
|
||||
for (spds = "S:"; deck[card] > 39 && card <= j; card++)
|
||||
spds = spds " " fvcard(deck[card])
|
||||
for (hrts = "H:"; deck[card] > 26 && card <= j; card++)
|
||||
hrts = hrts " " fvcard(deck[card])
|
||||
for (dnds = "D:"; deck[card] > 13 && card <= j; card++)
|
||||
dnds = dnds " " fvcard(deck[card])
|
||||
for (clbs = "C:"; card <= j; card++)
|
||||
clbs = clbs " " fvcard(deck[card])
|
||||
}
|
||||
|
||||
function fvcard(i) { # compute face value of card i
|
||||
if (i % 13 == 0) return "A"
|
||||
else if (i % 13 == 12) return "K"
|
||||
else if (i % 13 == 11) return "Q"
|
||||
else if (i % 13 == 10) return "J"
|
||||
else return (i % 13) + 1
|
||||
}
|
3
usr.bin/awk/tests/bundle
Normal file
3
usr.bin/awk/tests/bundle
Normal file
|
@ -0,0 +1,3 @@
|
|||
# bundle - combine multiple files into one
|
||||
|
||||
{ print FILENAME, $0 }
|
11
usr.bin/awk/tests/capitals
Normal file
11
usr.bin/awk/tests/capitals
Normal file
|
@ -0,0 +1,11 @@
|
|||
USSR Moscow
|
||||
Canada Ottawa
|
||||
China Beijing
|
||||
USA Washington
|
||||
Brazil Brasilia
|
||||
India New Delhi
|
||||
Mexico Mexico City
|
||||
France Paris
|
||||
Japan Tokyo
|
||||
Germany Bonn
|
||||
England London
|
11
usr.bin/awk/tests/capitals.sort
Normal file
11
usr.bin/awk/tests/capitals.sort
Normal file
|
@ -0,0 +1,11 @@
|
|||
Brazil Brasilia
|
||||
Canada Ottawa
|
||||
China Beijing
|
||||
England London
|
||||
France Paris
|
||||
Germany Bonn
|
||||
India New Delhi
|
||||
Japan Tokyo
|
||||
Mexico Mexico City
|
||||
USA Washington
|
||||
USSR Moscow
|
1
usr.bin/awk/tests/ch1p11a.awk
Normal file
1
usr.bin/awk/tests/ch1p11a.awk
Normal file
|
@ -0,0 +1 @@
|
|||
{ printf("%-8s $%6.2f\n", $1, $2 * $3) }
|
2
usr.bin/awk/tests/ch1p11b.awk
Normal file
2
usr.bin/awk/tests/ch1p11b.awk
Normal file
|
@ -0,0 +1,2 @@
|
|||
{ product = $2 * $3;
|
||||
print $1, $2, $3, product }
|
1
usr.bin/awk/tests/ch1p12.awk
Normal file
1
usr.bin/awk/tests/ch1p12.awk
Normal file
|
@ -0,0 +1 @@
|
|||
$2 >= 5
|
1
usr.bin/awk/tests/ch1p13.awk
Normal file
1
usr.bin/awk/tests/ch1p13.awk
Normal file
|
@ -0,0 +1 @@
|
|||
$2 * $3 > 50 { printf("$%.2f for %s\n", $2 * $3, $1) }
|
1
usr.bin/awk/tests/ch1p22.awk
Normal file
1
usr.bin/awk/tests/ch1p22.awk
Normal file
|
@ -0,0 +1 @@
|
|||
!($2 < 4 && $3 < 20)
|
1
usr.bin/awk/tests/ch1p28.awk
Normal file
1
usr.bin/awk/tests/ch1p28.awk
Normal file
|
@ -0,0 +1 @@
|
|||
{ print NF, $1, $NF }
|
2
usr.bin/awk/tests/ch1p30.awk
Normal file
2
usr.bin/awk/tests/ch1p30.awk
Normal file
|
@ -0,0 +1,2 @@
|
|||
BEGIN { print "NAME RATE HOURS"; print "" }
|
||||
{ print }
|
2
usr.bin/awk/tests/ch1p31.awk
Normal file
2
usr.bin/awk/tests/ch1p31.awk
Normal file
|
@ -0,0 +1,2 @@
|
|||
$3 > 15 { emp = emp + 1 }
|
||||
END { print emp, "employees worked more than 15 hours" }
|
5
usr.bin/awk/tests/ch1p32.awk
Normal file
5
usr.bin/awk/tests/ch1p32.awk
Normal file
|
@ -0,0 +1,5 @@
|
|||
{ pay = pay + $2 * $3 }
|
||||
END { print NR, "employees"
|
||||
print "total pay is", pay
|
||||
print "average pay is", pay/NR
|
||||
}
|
2
usr.bin/awk/tests/ch1p33.awk
Normal file
2
usr.bin/awk/tests/ch1p33.awk
Normal file
|
@ -0,0 +1,2 @@
|
|||
$2 > maxrate { maxrate = $2; maxemp = $1 }
|
||||
END { print "highest hourly rate:", maxrate, "for", maxemp }
|
2
usr.bin/awk/tests/ch1p33a.awk
Normal file
2
usr.bin/awk/tests/ch1p33a.awk
Normal file
|
@ -0,0 +1,2 @@
|
|||
{ last = $0 }
|
||||
END { print last }
|
2
usr.bin/awk/tests/ch1p34.awk
Normal file
2
usr.bin/awk/tests/ch1p34.awk
Normal file
|
@ -0,0 +1,2 @@
|
|||
{ names = names $1 " " }
|
||||
END { print names }
|
4
usr.bin/awk/tests/ch1p40a.awk
Normal file
4
usr.bin/awk/tests/ch1p40a.awk
Normal file
|
@ -0,0 +1,4 @@
|
|||
{ nc = nc + length($0) + 1
|
||||
nw = nw + NF
|
||||
}
|
||||
END { print NR, "lines,", nw, "words,", nc, "characters" }
|
7
usr.bin/awk/tests/ch1p41.awk
Normal file
7
usr.bin/awk/tests/ch1p41.awk
Normal file
|
@ -0,0 +1,7 @@
|
|||
$2 > 6 { n = n + 1; pay = pay + $2 * $3 }
|
||||
END { if (n > 0)
|
||||
print n, "employees, total pay is", pay,
|
||||
"average pay is", pay/n
|
||||
else
|
||||
print "no employees are paid more than $6/hour"
|
||||
}
|
7
usr.bin/awk/tests/ch1p51.awk
Normal file
7
usr.bin/awk/tests/ch1p51.awk
Normal file
|
@ -0,0 +1,7 @@
|
|||
# reverse - print input in reverse order by line
|
||||
|
||||
{ line[NR] = $0 } # remember each input line
|
||||
|
||||
END { for (i = NR; i > 0; i = i - 1)
|
||||
print line[i]
|
||||
}
|
2
usr.bin/awk/tests/ch1p63.awk
Normal file
2
usr.bin/awk/tests/ch1p63.awk
Normal file
|
@ -0,0 +1,2 @@
|
|||
{ field = $NF}
|
||||
END { print field }
|
2
usr.bin/awk/tests/ch1p67.awk
Normal file
2
usr.bin/awk/tests/ch1p67.awk
Normal file
|
@ -0,0 +1,2 @@
|
|||
{ nf = nf + NF }
|
||||
END { print nf }
|
2
usr.bin/awk/tests/ch1p69.awk
Normal file
2
usr.bin/awk/tests/ch1p69.awk
Normal file
|
@ -0,0 +1,2 @@
|
|||
$1 > max { max = $1; maxline = $0 }
|
||||
END { print max, maxline }
|
4
usr.bin/awk/tests/ch1p78.awk
Normal file
4
usr.bin/awk/tests/ch1p78.awk
Normal file
|
@ -0,0 +1,4 @@
|
|||
{ sum = 0
|
||||
for (i = 1; i <= NF; i = i + 1) sum = sum + $i
|
||||
print sum
|
||||
}
|
2
usr.bin/awk/tests/ch1p79.awk
Normal file
2
usr.bin/awk/tests/ch1p79.awk
Normal file
|
@ -0,0 +1,2 @@
|
|||
{ for (i = 1; i <= NF; i = i + 1) sum = sum + $i }
|
||||
END { print sum }
|
11
usr.bin/awk/tests/ch2p11.awk
Normal file
11
usr.bin/awk/tests/ch2p11.awk
Normal file
|
@ -0,0 +1,11 @@
|
|||
# print countries with column headers and totals
|
||||
|
||||
BEGIN { FS = "\t" # make tab the field separator
|
||||
printf("%10s %6s %5s %s\n\n",
|
||||
"COUNTRY", "AREA", "POP", "CONTINENT")
|
||||
}
|
||||
{ printf("%10s %6d %5d %s\n", $1, $2, $3, $4)
|
||||
area = area + $2
|
||||
pop = pop + $3
|
||||
}
|
||||
END { printf("\n%10s %6d %5d\n", "TOTAL", area, pop) }
|
1
usr.bin/awk/tests/ch2p20.awk
Normal file
1
usr.bin/awk/tests/ch2p20.awk
Normal file
|
@ -0,0 +1 @@
|
|||
$4 ~ /^(Asia|Europe)$/
|
1
usr.bin/awk/tests/ch2p20a.awk
Normal file
1
usr.bin/awk/tests/ch2p20a.awk
Normal file
|
@ -0,0 +1 @@
|
|||
/Asia/ || /Europe/
|
1
usr.bin/awk/tests/ch2p20b.awk
Normal file
1
usr.bin/awk/tests/ch2p20b.awk
Normal file
|
@ -0,0 +1 @@
|
|||
/Asia|Europe/
|
1
usr.bin/awk/tests/ch2p21.awk
Normal file
1
usr.bin/awk/tests/ch2p21.awk
Normal file
|
@ -0,0 +1 @@
|
|||
/Europe/, /Africa/
|
1
usr.bin/awk/tests/ch2p22.awk
Normal file
1
usr.bin/awk/tests/ch2p22.awk
Normal file
|
@ -0,0 +1 @@
|
|||
FNR == 1, FNR == 5 { print FILENAME ": " $0 }
|
4
usr.bin/awk/tests/ch2p32.awk
Normal file
4
usr.bin/awk/tests/ch2p32.awk
Normal file
|
@ -0,0 +1,4 @@
|
|||
$4 == "Asia" { pop = pop + $3; n = n + 1 }
|
||||
END { print "Total population of the", n,
|
||||
"Asian countries is", pop, "million."
|
||||
}
|
4
usr.bin/awk/tests/ch2p34.awk
Normal file
4
usr.bin/awk/tests/ch2p34.awk
Normal file
|
@ -0,0 +1,4 @@
|
|||
$3 > maxpop { maxpop = $3; country = $1 }
|
||||
END { print "country with largest population:",
|
||||
country, maxpop
|
||||
}
|
1
usr.bin/awk/tests/ch2p35.awk
Normal file
1
usr.bin/awk/tests/ch2p35.awk
Normal file
|
@ -0,0 +1 @@
|
|||
{ print NR ":" $0 }
|
1
usr.bin/awk/tests/ch2p36.awk
Normal file
1
usr.bin/awk/tests/ch2p36.awk
Normal file
|
@ -0,0 +1 @@
|
|||
{ gsub(/USA/, "United States"); print }
|
1
usr.bin/awk/tests/ch2p39.awk
Normal file
1
usr.bin/awk/tests/ch2p39.awk
Normal file
|
@ -0,0 +1 @@
|
|||
{ $1 = substr($1, 1, 3); print $0 }
|
2
usr.bin/awk/tests/ch2p40.awk
Normal file
2
usr.bin/awk/tests/ch2p40.awk
Normal file
|
@ -0,0 +1,2 @@
|
|||
{ s = s substr($1, 1, 3) " " }
|
||||
END { print s }
|
4
usr.bin/awk/tests/ch2p42.awk
Normal file
4
usr.bin/awk/tests/ch2p42.awk
Normal file
|
@ -0,0 +1,4 @@
|
|||
BEGIN { FS = OFS = "\t" }
|
||||
$4 == "North America" { $4 = "NA" }
|
||||
$4 == "South America" { $4 = "SA" }
|
||||
{ print }
|
15
usr.bin/awk/tests/ch2p44.awk
Normal file
15
usr.bin/awk/tests/ch2p44.awk
Normal file
|
@ -0,0 +1,15 @@
|
|||
# seq - print sequences of integers
|
||||
# input: arguments q, p q, or p q r; q >= p; r > 0
|
||||
# output: integers 1 to q, p to q, or p to q in steps of r
|
||||
|
||||
BEGIN {
|
||||
if (ARGC == 2)
|
||||
for (i = 1; i <= ARGV[1]; i++)
|
||||
print i
|
||||
else if (ARGC == 3)
|
||||
for (i = ARGV[1]; i <= ARGV[2]; i++)
|
||||
print i
|
||||
else if (ARGC == 4)
|
||||
for (i = ARGV[1]; i <= ARGV[2]; i += ARGV[3])
|
||||
print i
|
||||
}
|
6
usr.bin/awk/tests/ch2p45.awk
Normal file
6
usr.bin/awk/tests/ch2p45.awk
Normal file
|
@ -0,0 +1,6 @@
|
|||
{ i = 1
|
||||
while (i <= NF) {
|
||||
print $i
|
||||
i++
|
||||
}
|
||||
}
|
3
usr.bin/awk/tests/ch2p46.awk
Normal file
3
usr.bin/awk/tests/ch2p46.awk
Normal file
|
@ -0,0 +1,3 @@
|
|||
{ for (i = 1; i <= NF; i++)
|
||||
print $i
|
||||
}
|
7
usr.bin/awk/tests/ch2p47.awk
Normal file
7
usr.bin/awk/tests/ch2p47.awk
Normal file
|
@ -0,0 +1,7 @@
|
|||
/Asia/ { pop["Asia"] += $3 }
|
||||
/Europe/ { pop["Europe"] += $3 }
|
||||
END { print "Asian population is",
|
||||
pop["Asia"], "million."
|
||||
print "European population is",
|
||||
pop["Europe"], "million."
|
||||
}
|
5
usr.bin/awk/tests/ch2p48.awk
Normal file
5
usr.bin/awk/tests/ch2p48.awk
Normal file
|
@ -0,0 +1,5 @@
|
|||
BEGIN { FS = "\t" }
|
||||
{ pop[$4] += $3 }
|
||||
END { for (name in pop)
|
||||
print name, pop[name]
|
||||
}
|
2
usr.bin/awk/tests/ch2p52.awk
Normal file
2
usr.bin/awk/tests/ch2p52.awk
Normal file
|
@ -0,0 +1,2 @@
|
|||
BEGIN { OFS = ":"; ORS = "\n\n" }
|
||||
{ print $1, $2 }
|
1
usr.bin/awk/tests/ch2p53a.awk
Normal file
1
usr.bin/awk/tests/ch2p53a.awk
Normal file
|
@ -0,0 +1 @@
|
|||
{ print($1, $3) > ($3 > 100 ? "/tmp/out2/bigpop" : "/tmp/out2/smallpop") }
|
7
usr.bin/awk/tests/ch2p54.awk
Normal file
7
usr.bin/awk/tests/ch2p54.awk
Normal file
|
@ -0,0 +1,7 @@
|
|||
# print continents and populations, sorted by population
|
||||
|
||||
BEGIN { FS = "\t" }
|
||||
{ pop[$4] += $3 }
|
||||
END { for (c in pop)
|
||||
printf("%15s\t%6d\n", c, pop[c]) | "sort -t'\t' +1rn"
|
||||
}
|
9
usr.bin/awk/tests/ch2p60.awk
Normal file
9
usr.bin/awk/tests/ch2p60.awk
Normal file
|
@ -0,0 +1,9 @@
|
|||
# include - replace #include "f" by contents of file f
|
||||
|
||||
/^#include/ {
|
||||
gsub(/"/, "", $2)
|
||||
while (getline x <$2 > 0)
|
||||
print x
|
||||
next
|
||||
}
|
||||
{ print }
|
7
usr.bin/awk/tests/ch2p61.awk
Normal file
7
usr.bin/awk/tests/ch2p61.awk
Normal file
|
@ -0,0 +1,7 @@
|
|||
# echo - print command-line arguments
|
||||
|
||||
BEGIN {
|
||||
for (i = 1; i < ARGC; i++)
|
||||
printf "%s ", ARGV[i]
|
||||
printf "\n"
|
||||
}
|
2
usr.bin/awk/tests/ch2p62.awk
Normal file
2
usr.bin/awk/tests/ch2p62.awk
Normal file
|
@ -0,0 +1,2 @@
|
|||
$1 == "#include" { gsub(/"/, "", $2); system("cat " $2); next }
|
||||
{ print }
|
19
usr.bin/awk/tests/check1
Normal file
19
usr.bin/awk/tests/check1
Normal file
|
@ -0,0 +1,19 @@
|
|||
# check1 - print total deposits and checks
|
||||
|
||||
/^check/ { ck = 1; next }
|
||||
/^deposit/ { dep = 1; next }
|
||||
/^amount/ { amt = $2; next }
|
||||
/^$/ { addup() }
|
||||
|
||||
END { addup()
|
||||
printf("deposits $%.2f, checks $%.2f\n",
|
||||
deposits, checks)
|
||||
}
|
||||
|
||||
function addup() {
|
||||
if (ck)
|
||||
checks += amt
|
||||
else if (dep)
|
||||
deposits += amt
|
||||
ck = dep = amt = 0
|
||||
}
|
16
usr.bin/awk/tests/check3a
Normal file
16
usr.bin/awk/tests/check3a
Normal file
|
@ -0,0 +1,16 @@
|
|||
# check3 - print check information
|
||||
# check3a modified to print in format that prchecks can use
|
||||
|
||||
BEGIN { RS = ""; FS = "\n" }
|
||||
/(^|\n)check/ {
|
||||
for (i = 1; i <= NF; i++) {
|
||||
split($i, f, "\t")
|
||||
val[f[1]] = f[2]
|
||||
}
|
||||
printf("%5d\t%s\t%s\n",
|
||||
val["check"],
|
||||
sprintf("%.2f", val["amount"]),
|
||||
val["to"])
|
||||
for (i in val)
|
||||
delete val[i]
|
||||
}
|
58
usr.bin/awk/tests/checkfix.ans
Normal file
58
usr.bin/awk/tests/checkfix.ans
Normal file
|
@ -0,0 +1,58 @@
|
|||
# prchecks - print formatted checks
|
||||
# input: number \t amount \t payee
|
||||
# output: eight lines of text for preprinted check forms
|
||||
|
||||
BEGIN {
|
||||
FS = "\t"
|
||||
dashes = sp45 = sprintf("%45s", " ")
|
||||
gsub(/ /, "-", dashes) # to protect the payee
|
||||
### Just use a fixed date: to avoid pipe and to ensure consistency
|
||||
## "date" | getline date # get today's date
|
||||
## split(date, d, " ")
|
||||
## date = d[2] ". " d[3] ", " d[6]
|
||||
date = "Mar. 7, 1998"
|
||||
initnum() # set up tables for number conversion
|
||||
}
|
||||
NF != 3 {
|
||||
printf("\nrec %d has %d fields:\n|%s|\n\nVOID\nVOID\n\n\n",
|
||||
NR, NF, $0)
|
||||
next
|
||||
}
|
||||
{ printf("\n") # nothing on line 1
|
||||
printf("%s%s\n", sp45, $1) # number, indented 45 spaces
|
||||
printf("%s%s\n", sp45, date) # date, indented 45 spaces
|
||||
amt = sprintf("%.2f", $2) # formatted amount
|
||||
printf("Pay to %45.45s $%s\n", $3 dashes, amt) # line 4
|
||||
printf("the sum of %s\n", numtowords(amt)) # line 5
|
||||
printf("\n\n\n") # lines 6, 7 and 8
|
||||
}
|
||||
function numtowords(n, cents, dols, s) { # n has 2 decimal places
|
||||
cents = substr(n, length(n)-1, 2)
|
||||
dols = substr(n, 1, length(n)-3)
|
||||
if (dols == 0)
|
||||
s = "zero dollars and " cents " cents exactly"
|
||||
else
|
||||
s = intowords(dols) " dollars and " cents " cents exactly"
|
||||
sub(/^one dollars/, "one dollar", s)
|
||||
gsub(/ +/, " ", s)
|
||||
return s
|
||||
}
|
||||
function intowords(n) {
|
||||
n = int(n)
|
||||
if (n >= 1000000)
|
||||
return("VOID")
|
||||
if (n >= 1000)
|
||||
return intowords(n/1000) " thousand " intowords(n%1000)
|
||||
if (n >= 100)
|
||||
return intowords(n/100) " hundred " intowords(n%100)
|
||||
if (n >= 20)
|
||||
return tens[int(n/10)] " " intowords(n%10)
|
||||
return nums[n]
|
||||
}
|
||||
function initnum() {
|
||||
split("one two three four five six seven eight nine " \
|
||||
"ten eleven twelve thirteen fourteen fifteen " \
|
||||
"sixteen seventeen eighteen nineteen", nums, " ")
|
||||
split("ten twenty thirty forty fifty sixty " \
|
||||
"seventy eighty ninety", tens, " ")
|
||||
}
|
30
usr.bin/awk/tests/checks.data
Normal file
30
usr.bin/awk/tests/checks.data
Normal file
|
@ -0,0 +1,30 @@
|
|||
check 1021
|
||||
to Champagne Unlimited
|
||||
amount 123.10
|
||||
date 1/1/87
|
||||
|
||||
deposit
|
||||
amount 500.00
|
||||
date 1/1/87
|
||||
|
||||
check 1022
|
||||
date 1/2/87
|
||||
amount 45.10
|
||||
to Getwell Drug Store
|
||||
tax medical
|
||||
|
||||
check 1023
|
||||
amount 125.00
|
||||
to International Travel
|
||||
date 1/3/87
|
||||
|
||||
amount 50.00
|
||||
to Carnegie Hall
|
||||
date 1/3/87
|
||||
check 1024
|
||||
tax charitable contribution
|
||||
|
||||
to American Express
|
||||
check 1025
|
||||
amount 75.75
|
||||
date 1/5/87
|
33
usr.bin/awk/tests/codesize.awk
Normal file
33
usr.bin/awk/tests/codesize.awk
Normal file
|
@ -0,0 +1,33 @@
|
|||
# awk program to parse the output of "lseg -d <files>" and calculate
|
||||
# 1. The total size of code in each object file
|
||||
# 2. The name of any procedure that uses over "maxseg" bytes (default=100)
|
||||
|
||||
BEGIN {
|
||||
# If maxseg was not set on command line, use default
|
||||
if (maxseg <= 0) maxseg = 100;
|
||||
}
|
||||
|
||||
/ Code / {
|
||||
# Is this the beginning of a new file's statistics?
|
||||
if ($1 != filename) {
|
||||
if (codesize > 0) {
|
||||
sizes[filename] = codesize;
|
||||
}
|
||||
filename = $1;
|
||||
codesize = 0;
|
||||
}
|
||||
codesize += $3;
|
||||
# If there are > 4 fields, fourth one is the stack size
|
||||
if ($4 > maxseg) print $5," in file ", $1," uses ",$4," stack bytes"
|
||||
}
|
||||
|
||||
END {
|
||||
# Print the report
|
||||
print "Code file Code bytes"
|
||||
for (fname in sizes) {
|
||||
printf "%s", fname;
|
||||
i = length(fname);
|
||||
while (i++ < 20) printf " ";
|
||||
printf " %6d\n", sizes[fname];
|
||||
}
|
||||
}
|
177
usr.bin/awk/tests/codesize.txt
Normal file
177
usr.bin/awk/tests/codesize.txt
Normal file
|
@ -0,0 +1,177 @@
|
|||
File Type Size Stack Name
|
||||
-------------------- ------------------ -------- ------ ----------------
|
||||
../main.o Code 3467 22 "main"
|
||||
../main.o Code 669 14 "pgetc"
|
||||
../main.o Code 38 "~GLOBALS"
|
||||
../main.o Code 80 "~ARRAYS"
|
||||
../b.o Code 1151 20 "makedfa"
|
||||
../b.o Code 841 22 "mkdfa"
|
||||
../b.o Code 1657 12 "makeinit"
|
||||
../b.o Code 759 8 "penter"
|
||||
../b.o Code 586 8 "freetr"
|
||||
../b.o Code 377 16 "hexstr"
|
||||
../b.o Code 506 16 "quoted"
|
||||
../b.o Code 1151 24 "cclenter"
|
||||
../b.o Code 89 2 "overflo"
|
||||
../b.o Code 1400 14 "cfoll"
|
||||
../b.o Code 1277 14 "first"
|
||||
../b.o Code 333 12 "follow"
|
||||
../b.o Code 87 8 "member"
|
||||
../b.o Code 354 16 "match"
|
||||
../b.o Code 1552 24 "pmatch"
|
||||
../b.o Code 1525 24 "nematch"
|
||||
../b.o Code 281 10 "reparse"
|
||||
../b.o Code 43 6 "regexp"
|
||||
../b.o Code 815 12 "primary"
|
||||
../b.o Code 128 8 "concat"
|
||||
../b.o Code 96 6 "alt"
|
||||
../b.o Code 199 8 "unary"
|
||||
../b.o Code 1270 20 "relex"
|
||||
../b.o Code 3513 22 "cgoto"
|
||||
../b.o Code 1123 8 "freefa"
|
||||
../b.o Code 51 "~GLOBALS"
|
||||
../b.o Code 80 "~ARRAYS"
|
||||
../lib.o Code 537 6 "recinit"
|
||||
../lib.o Code 392 58 "makefields"
|
||||
../lib.o Code 182 12 "initgetrec"
|
||||
../lib.o Code 1879 20 "getrec"
|
||||
../lib.o Code 88 "nextfile"
|
||||
../lib.o Code 1801 26 "readrec"
|
||||
../lib.o Code 188 64 "getargv"
|
||||
../lib.o Code 318 18 "setclvar"
|
||||
../lib.o Code 3069 31 "fldbld"
|
||||
../lib.o Code 240 12 "cleanfld"
|
||||
../lib.o Code 97 6 "newfld"
|
||||
../lib.o Code 180 10 "fieldadr"
|
||||
../lib.o Code 214 8 "growfldtab"
|
||||
../lib.o Code 1208 22 "refldbld"
|
||||
../lib.o Code 1581 22 "recbld"
|
||||
../lib.o Code 343 6 "yyerror"
|
||||
../lib.o Code 73 2 "fpecatch"
|
||||
../lib.o Code 112 4 "bracecheck"
|
||||
../lib.o Code 363 6 "bcheck2"
|
||||
../lib.o Code 838 6 "error"
|
||||
../lib.o Code 3866 20 "eprint"
|
||||
../lib.o Code 102 4 "bclass"
|
||||
../lib.o Code 268 10 "errcheck"
|
||||
../lib.o Code 303 12 "isclvar"
|
||||
../lib.o Code 301 20 "isnumber"
|
||||
../lib.o Code 46 "~GLOBALS"
|
||||
../lib.o Code 450 "~ARRAYS"
|
||||
../proctab.o Code 188 10 "tokname"
|
||||
../proctab.o Code 1 "~GLOBALS"
|
||||
../proctab.o Code 1380 "~ARRAYS"
|
||||
../tran.o Code 1112 6 "syminit"
|
||||
../tran.o Code 358 62 "arginit"
|
||||
../tran.o Code 406 14 "envinit"
|
||||
../tran.o Code 250 18 "makesymtab"
|
||||
../tran.o Code 560 20 "freesymtab"
|
||||
../tran.o Code 503 20 "freeelem"
|
||||
../tran.o Code 830 16 "setsymtab"
|
||||
../tran.o Code 144 12 "hash"
|
||||
../tran.o Code 408 24 "rehash"
|
||||
../tran.o Code 243 20 "lookup"
|
||||
../tran.o Code 378 20 "setfval"
|
||||
../tran.o Code 319 6 "funnyvar"
|
||||
../tran.o Code 585 20 "setsval"
|
||||
../tran.o Code 410 18 "getfval"
|
||||
../tran.o Code 618 122 "getsval"
|
||||
../tran.o Code 190 10 "tostring"
|
||||
../tran.o Code 1031 24 "qstring"
|
||||
../tran.o Code 105 "~GLOBALS"
|
||||
../lex.o Code 37 10 "peek"
|
||||
../lex.o Code 1379 24 "gettok"
|
||||
../lex.o Code 3792 14 "yylex"
|
||||
../lex.o Code 1919 128 "string"
|
||||
../lex.o Code 203 16 "binsearch"
|
||||
../lex.o Code 885 18 "word"
|
||||
../lex.o Code 7 "startreg"
|
||||
../lex.o Code 702 14 "regexpr"
|
||||
../lex.o Code 303 10 "input"
|
||||
../lex.o Code 320 6 "unput"
|
||||
../lex.o Code 123 8 "unputstr"
|
||||
../lex.o Code 43 "~GLOBALS"
|
||||
../lex.o Code 991 "~ARRAYS"
|
||||
../parse.o Code 209 14 "nodealloc"
|
||||
../parse.o Code 44 10 "exptostat"
|
||||
../parse.o Code 133 14 "node1"
|
||||
../parse.o Code 200 14 "node2"
|
||||
../parse.o Code 265 14 "node3"
|
||||
../parse.o Code 332 14 "node4"
|
||||
../parse.o Code 66 14 "stat1"
|
||||
../parse.o Code 70 14 "stat2"
|
||||
../parse.o Code 74 14 "stat3"
|
||||
../parse.o Code 78 14 "stat4"
|
||||
../parse.o Code 66 14 "op1"
|
||||
../parse.o Code 70 14 "op2"
|
||||
../parse.o Code 74 14 "op3"
|
||||
../parse.o Code 78 14 "op4"
|
||||
../parse.o Code 101 14 "celltonode"
|
||||
../parse.o Code 51 6 "rectonode"
|
||||
../parse.o Code 344 14 "makearr"
|
||||
../parse.o Code 172 14 "pa2stat"
|
||||
../parse.o Code 231 14 "linkum"
|
||||
../parse.o Code 283 12 "defn"
|
||||
../parse.o Code 209 14 "isarg"
|
||||
../parse.o Code 3 "~GLOBALS"
|
||||
../parse.o Code 100 "~ARRAYS"
|
||||
../run.o Code 353 16 "adjbuf"
|
||||
../run.o Code 31 2 "run"
|
||||
../run.o Code 854 22 "execute"
|
||||
../run.o Code 940 14 "program"
|
||||
../run.o Code 2949 54 "call"
|
||||
../run.o Code 238 14 "copycell"
|
||||
../run.o Code 351 10 "arg"
|
||||
../run.o Code 881 20 "jump"
|
||||
../run.o Code 1323 32 "getline"
|
||||
../run.o Code 91 10 "getnf"
|
||||
../run.o Code 1085 42 "array"
|
||||
../run.o Code 944 38 "adelete"
|
||||
../run.o Code 1073 42 "intest"
|
||||
../run.o Code 821 40 "matchop"
|
||||
../run.o Code 587 22 "boolop"
|
||||
../run.o Code 805 30 "relop"
|
||||
../run.o Code 306 6 "tfree"
|
||||
../run.o Code 387 16 "gettemp"
|
||||
../run.o Code 327 20 "indirect"
|
||||
../run.o Code 1171 34 "substr"
|
||||
../run.o Code 550 50 "sindex"
|
||||
../run.o Code 3191 44 "format"
|
||||
../run.o Code 482 24 "awksprintf"
|
||||
../run.o Code 911 30 "awkprintf"
|
||||
../run.o Code 1335 48 "arith"
|
||||
../run.o Code 285 22 "ipow"
|
||||
../run.o Code 425 28 "incrdecr"
|
||||
../run.o Code 1466 48 "assign"
|
||||
../run.o Code 530 30 "cat"
|
||||
../run.o Code 321 14 "pastat"
|
||||
../run.o Code 558 16 "dopa2"
|
||||
../run.o Code 3051 101 "split"
|
||||
../run.o Code 283 14 "condexpr"
|
||||
../run.o Code 354 14 "ifstat"
|
||||
../run.o Code 392 14 "whilestat"
|
||||
../run.o Code 412 14 "dostat"
|
||||
../run.o Code 616 14 "forstat"
|
||||
../run.o Code 704 36 "instat"
|
||||
../run.o Code 1848 46 "bltin"
|
||||
../run.o Code 670 22 "printstat"
|
||||
../run.o Code 65 6 "nullproc"
|
||||
../run.o Code 209 22 "redirect"
|
||||
../run.o Code 1458 22 "openfile"
|
||||
../run.o Code 206 12 "filename"
|
||||
../run.o Code 1262 18 "closefile"
|
||||
../run.o Code 686 10 "closeall"
|
||||
../run.o Code 1890 48 "sub"
|
||||
../run.o Code 2844 54 "gsub"
|
||||
../run.o Code 706 14 "backsub"
|
||||
../run.o Code 55 "~GLOBALS"
|
||||
../run.o Code 689 "~ARRAYS"
|
||||
../ytab.o Code 16 4 "yywrap"
|
||||
../ytab.o Code 214 6 "setfname"
|
||||
../ytab.o Code 134 8 "constnode"
|
||||
../ytab.o Code 108 10 "strnode"
|
||||
../ytab.o Code 140 12 "notnull"
|
||||
../ytab.o Code 222 10 "checkdup"
|
||||
../ytab.o Code 17185 32 "yyparse"
|
||||
../ytab.o Code 45 "~GLOBALS"
|
||||
../ytab.o Code 13274 "~ARRAYS"
|
23
usr.bin/awk/tests/columns.data
Normal file
23
usr.bin/awk/tests/columns.data
Normal file
|
@ -0,0 +1,23 @@
|
|||
605 506 156 3292 133 1054 608 6605 Comment
|
||||
502 31296 1926 672 933 2167 1706 168
|
||||
1868 186 737 197 1308 856 4637 71392
|
||||
456 1038 6380 1089 1800 588 2206 232
|
||||
1279 3008 678 163 1517 450 207 432
|
||||
1265 4853 3288 2335 847 3817 224 4204
|
||||
1541 6431 2635 1904 1295 4830 1658 2615
|
||||
4593 1933 545 2269 4247 8784 1354 2341 Nice!
|
||||
1429 12451 711 661 6757 9831 702 15964
|
||||
4284 10646 2082 2254 2066 2386 216 2148
|
||||
14795 264 3200 476 6383 791 739 929
|
||||
145 1165 1985 385 336 3263 3900 268
|
||||
14954 268 131 2863 784 20472 579 2340
|
||||
3371 1092 163 882 6248 3124 14806 3695
|
||||
1334 557 3984 8215 12075 6579 2648 167
|
||||
15805 4533 33468 16518 9353 141 2936 3459
|
||||
157 1715 2155 1508 8735 149 167 1343
|
||||
1925 1807 65901 16015 36833 20737 35547 2166
|
||||
225 574 14016 11902 181 181 4761 1619
|
||||
181 186 186 196 272 261 1129 3164
|
||||
178 3740 368 3335 1564 1506 78880 142
|
||||
169 176 6619 176 181 408 9510 207
|
||||
790 441 251 167 1274 3794 3708 4132
|
12
usr.bin/awk/tests/comb.ans
Normal file
12
usr.bin/awk/tests/comb.ans
Normal file
|
@ -0,0 +1,12 @@
|
|||
# print k distinct random integers between 1 and n
|
||||
|
||||
{ random($1, $2) }
|
||||
|
||||
function random(k, n, A, i, r) {
|
||||
for (i = n-k+1; i <= n; i++)
|
||||
((r = randint(i)) in A) ? A[i] : A[r]
|
||||
for (i in A)
|
||||
print i
|
||||
}
|
||||
|
||||
function randint(n) { return int(n*rand())+1 }
|
11
usr.bin/awk/tests/countries
Normal file
11
usr.bin/awk/tests/countries
Normal file
|
@ -0,0 +1,11 @@
|
|||
USSR 8649 275 Asia
|
||||
Canada 3852 25 North America
|
||||
China 3705 1032 Asia
|
||||
USA 3615 237 North America
|
||||
Brazil 3286 134 South America
|
||||
India 1267 746 Asia
|
||||
Mexico 762 78 North America
|
||||
France 211 55 Europe
|
||||
Japan 144 120 Asia
|
||||
Germany 96 61 Europe
|
||||
England 94 56 Europe
|
11
usr.bin/awk/tests/countries.sort
Normal file
11
usr.bin/awk/tests/countries.sort
Normal file
|
@ -0,0 +1,11 @@
|
|||
Brazil 3286 134 South America
|
||||
Canada 3852 25 North America
|
||||
China 3705 1032 Asia
|
||||
England 94 56 Europe
|
||||
France 211 55 Europe
|
||||
Germany 96 61 Europe
|
||||
India 1267 746 Asia
|
||||
Japan 144 120 Asia
|
||||
Mexico 762 78 North America
|
||||
USA 3615 237 North America
|
||||
USSR 8649 275 Asia
|
5
usr.bin/awk/tests/date.data
Normal file
5
usr.bin/awk/tests/date.data
Normal file
|
@ -0,0 +1,5 @@
|
|||
013042 mary's birthday
|
||||
032772 mark's birthday
|
||||
052470 anniversary
|
||||
061209 mother's birthday
|
||||
110175 elizabeth's birthday
|
3
usr.bin/awk/tests/datecvt
Normal file
3
usr.bin/awk/tests/datecvt
Normal file
|
@ -0,0 +1,3 @@
|
|||
# date convert - convert mmddyy into yymmdd in $1
|
||||
|
||||
{ $1 = substr($1,5,2) substr($1,1,2) substr($1,3,2); print }
|
1206
usr.bin/awk/tests/dotests
Normal file
1206
usr.bin/awk/tests/dotests
Normal file
File diff suppressed because it is too large
Load Diff
6
usr.bin/awk/tests/emp.data
Normal file
6
usr.bin/awk/tests/emp.data
Normal file
|
@ -0,0 +1,6 @@
|
|||
Beth 4.00 0
|
||||
Dan 3.75 0
|
||||
Kathy 4.00 10
|
||||
Mark 5.00 20
|
||||
Mary 5.50 22
|
||||
Susie 4.25 18
|
22
usr.bin/awk/tests/factorial.awk
Normal file
22
usr.bin/awk/tests/factorial.awk
Normal file
|
@ -0,0 +1,22 @@
|
|||
# Calculate factorial of command-line argument
|
||||
|
||||
BEGIN {
|
||||
# Get the command-line argument
|
||||
if (ARGC < 2) {
|
||||
print "ERROR: please provide number as command-line parameter"
|
||||
exit 1
|
||||
}
|
||||
n = ARGV[1]; ARGV[1] = "";
|
||||
# Print heading
|
||||
print "Calculating",n,"factorial"
|
||||
# Start the recursion
|
||||
nf = factorial(n);
|
||||
# All done; print the result
|
||||
print "Result:",nf;
|
||||
}
|
||||
|
||||
# Recursive function
|
||||
function factorial(n) {
|
||||
if (n <= 1) return 1;
|
||||
else return n*factorial(n-1);
|
||||
}
|
19
usr.bin/awk/tests/file1.UPPER
Normal file
19
usr.bin/awk/tests/file1.UPPER
Normal file
|
@ -0,0 +1,19 @@
|
|||
# CREATE THE TEST ENVIRONMENT FOR TR
|
||||
|
||||
# COMPILE AND LOAD FLAGS PASSED TO OCC
|
||||
# -V: VERBOSE
|
||||
# -I: ADD DIRECTORY TO HEADER PATH
|
||||
CFLAGS += -V -I /USR/INCLUDE
|
||||
LDFLAGS += -V
|
||||
|
||||
# DEFAULT TARGET, "ALL," GENERATES THE FILES
|
||||
ALL: FILE2.BIN1 GENBIN
|
||||
|
||||
# FILES DEPEND UPON PROGRAM
|
||||
FILE2.BIN1: GENBIN
|
||||
./GENBIN
|
||||
|
||||
# REMOVE INTERMEDIATE FILES
|
||||
CLEAN:
|
||||
$(RM) -F *.O
|
||||
$(RM) -F *.ROOT
|
19
usr.bin/awk/tests/file1.mixed
Normal file
19
usr.bin/awk/tests/file1.mixed
Normal file
|
@ -0,0 +1,19 @@
|
|||
# Create the test environment for tr
|
||||
|
||||
# Compile and load flags passed to occ
|
||||
# -v: verbose
|
||||
# -I: add directory to header path
|
||||
CFLAGS += -v -I /usr/include
|
||||
LDFLAGS += -v
|
||||
|
||||
# Default target, "all," generates the files
|
||||
all: file2.bin1 genbin
|
||||
|
||||
# Files depend upon program
|
||||
file2.bin1: genbin
|
||||
./genbin
|
||||
|
||||
# Remove intermediate files
|
||||
clean:
|
||||
$(RM) -f *.o
|
||||
$(RM) -f *.root
|
19
usr.bin/awk/tests/file1.nolower
Normal file
19
usr.bin/awk/tests/file1.nolower
Normal file
|
@ -0,0 +1,19 @@
|
|||
# C
|
||||
|
||||
# C
|
||||
# -:
|
||||
# -I:
|
||||
CFLAGS += - -I //
|
||||
LDFLAGS += -
|
||||
|
||||
# D , ","
|
||||
: 2.1
|
||||
|
||||
# F
|
||||
2.1:
|
||||
./
|
||||
|
||||
# R
|
||||
:
|
||||
$(RM) - *.
|
||||
$(RM) - *.
|
19
usr.bin/awk/tests/file1.novowel
Normal file
19
usr.bin/awk/tests/file1.novowel
Normal file
|
@ -0,0 +1,19 @@
|
|||
# Crt th tst nvrnmnt fr tr
|
||||
|
||||
# Cmpl nd ld flgs pssd t cc
|
||||
# -v: vrbs
|
||||
# -I: dd drctr t hdr pth
|
||||
CFLAGS += -v -I /sr/ncld
|
||||
LDFLAGS += -v
|
||||
|
||||
# Dflt trgt, "ll," gnrts th fls
|
||||
ll: fl2.bn1 gnbn
|
||||
|
||||
# Fls dpnd pn prgrm
|
||||
fl2.bn1: gnbn
|
||||
./gnbn
|
||||
|
||||
# Rmv ntrmdt fls
|
||||
cln:
|
||||
$(RM) -f *.
|
||||
$(RM) -f *.rt
|
22
usr.bin/awk/tests/form.gen
Normal file
22
usr.bin/awk/tests/form.gen
Normal file
|
@ -0,0 +1,22 @@
|
|||
# form.gen - generate form letters
|
||||
# input: prototype file letter.text; data lines
|
||||
# output: one form letter per data line
|
||||
|
||||
BEGIN {
|
||||
oldfs = FS;
|
||||
FS = ":"
|
||||
while (getline <"letter.text" > 0) # read form letter
|
||||
form[++n] = $0
|
||||
FS = oldfs;
|
||||
# get country name from command-line argument
|
||||
pat = ARGV[1]; ARGV[1] = "-"
|
||||
}
|
||||
|
||||
$1 ~ pat { for (i = 1; i <= n; i++) { # read data line for country
|
||||
temp = form[i]
|
||||
for (j = 1; j <= 3; j++)
|
||||
gsub("#" j, $j, temp)
|
||||
gsub("#4", $2/$3, temp)
|
||||
print temp
|
||||
}
|
||||
}
|
10
usr.bin/awk/tests/form1
Normal file
10
usr.bin/awk/tests/form1
Normal file
|
@ -0,0 +1,10 @@
|
|||
# form1 - format countries data by continent, pop. den.
|
||||
|
||||
BEGIN { FS = ":"
|
||||
printf("%-15s %-10s %10s %7s %12s\n",
|
||||
"CONTINENT", "COUNTRY", "POPULATION",
|
||||
"AREA", "POP. DEN.")
|
||||
}
|
||||
{ printf("%-15s %-10s %7d %10d %10.1f\n",
|
||||
$1, $2, $3, $4, $5)
|
||||
}
|
15
usr.bin/awk/tests/form2
Normal file
15
usr.bin/awk/tests/form2
Normal file
|
@ -0,0 +1,15 @@
|
|||
# form2 - format countries by continent, pop. den.
|
||||
|
||||
BEGIN { FS = ":"
|
||||
printf("%-15s %-10s %10s %7s %12s\n",
|
||||
"CONTINENT", "COUNTRY", "POPULATION",
|
||||
"AREA", "POP. DEN.")
|
||||
}
|
||||
{ if ($1 != prev) {
|
||||
print ""
|
||||
prev = $1
|
||||
} else
|
||||
$1 = ""
|
||||
printf("%-15s %-10s %7d %10d %10.1f\n",
|
||||
$1, $2, $3, $4, $5)
|
||||
}
|
4
usr.bin/awk/tests/genrand.awk
Normal file
4
usr.bin/awk/tests/genrand.awk
Normal file
|
@ -0,0 +1,4 @@
|
|||
# generate random integers
|
||||
BEGIN { for (i = 1; i <= 200; i++)
|
||||
print int(101*rand())
|
||||
}
|
10
usr.bin/awk/tests/grammar
Normal file
10
usr.bin/awk/tests/grammar
Normal file
|
@ -0,0 +1,10 @@
|
|||
Sentence -> Nounphrase Verbphrase
|
||||
Nounphrase -> the boy
|
||||
Nounphrase -> the girl
|
||||
Verbphrase -> Verb Modlist Adverb
|
||||
Verb -> runs
|
||||
Verb -> walks
|
||||
Modlist ->
|
||||
Modlist -> very Modlist
|
||||
Adverb -> quickly
|
||||
Adverb -> slowly
|
19
usr.bin/awk/tests/histans1.awk
Normal file
19
usr.bin/awk/tests/histans1.awk
Normal file
|
@ -0,0 +1,19 @@
|
|||
|
||||
{ x[int($1/10)]++ }
|
||||
END { max = MAXSTARS = 25
|
||||
for (i = 0; i <= 10; i++)
|
||||
if (x[i] > max)
|
||||
max = x[i]
|
||||
for (i = 0; i <= 10; i++)
|
||||
y[i] = x[i]/max * MAXSTARS
|
||||
for (i = 0; i < 10; i++)
|
||||
printf(" %2d - %2d: %3d %s\n",
|
||||
10*i, 10*i+9, x[i], rep(y[i],"*"))
|
||||
printf("100: %3d %s\n", x[10], rep(y[10],"*"))
|
||||
}
|
||||
|
||||
function rep(n,s, t) { # return string of n s's
|
||||
while (n-- > 0)
|
||||
t = t s
|
||||
return t
|
||||
}
|
17
usr.bin/awk/tests/histogram
Normal file
17
usr.bin/awk/tests/histogram
Normal file
|
@ -0,0 +1,17 @@
|
|||
# histogram
|
||||
# input: numbers between 0 and 100
|
||||
# output: histogram of deciles
|
||||
|
||||
{ x[int($1/10)]++ }
|
||||
|
||||
END { for (i = 0; i < 10; i++)
|
||||
printf(" %2d - %2d: %3d %s\n",
|
||||
10*i, 10*i+9, x[i], rep(x[i],"*"))
|
||||
printf("100: %3d %s\n", x[10], rep(x[10],"*"))
|
||||
}
|
||||
|
||||
function rep(n,s, t) { # return string of n s's
|
||||
while (n-- > 0)
|
||||
t = t s
|
||||
return t
|
||||
}
|
4
usr.bin/awk/tests/include.data
Normal file
4
usr.bin/awk/tests/include.data
Normal file
|
@ -0,0 +1,4 @@
|
|||
This is a testfile for the awk test ch2p62.awk
|
||||
|
||||
#include bigpop
|
||||
#include smallpop
|
7
usr.bin/awk/tests/info.awk
Normal file
7
usr.bin/awk/tests/info.awk
Normal file
|
@ -0,0 +1,7 @@
|
|||
BEGIN { FS = "\t"; pat = ARGV[1]; ARGV[1] = "-" }
|
||||
$1 ~ pat {
|
||||
printf("%s:\n", $1)
|
||||
printf("\t%d million people\n", $3)
|
||||
printf("\t%.3f million sq. mi.\n", $2/1000)
|
||||
printf("\t%.1f people per sq. mi.\n", 1000*$3/$2)
|
||||
}
|
46
usr.bin/awk/tests/join.awk
Normal file
46
usr.bin/awk/tests/join.awk
Normal file
|
@ -0,0 +1,46 @@
|
|||
# join - join file1 file2 on first field
|
||||
# input: two sorted files, tab-separated fields
|
||||
# output: natural join of lines with common first field
|
||||
|
||||
BEGIN {
|
||||
OFS = sep = "\t"
|
||||
file2 = ARGV[2]
|
||||
ARGV[2] = "" # read file1 implicitly, file2 explicitly
|
||||
eofstat = 1 # end of file status for file2
|
||||
if ((ng = getgroup()) <= 0)
|
||||
exit # file2 is empty
|
||||
}
|
||||
|
||||
{ while (prefix($0) > prefix(gp[1]))
|
||||
if ((ng = getgroup()) <= 0)
|
||||
exit # file2 exhausted
|
||||
if (prefix($0) == prefix(gp[1])) # 1st attributes in file1
|
||||
for (i = 1; i <= ng; i++) # and file2 match
|
||||
print $0, suffix(gp[i]) # print joined line
|
||||
}
|
||||
|
||||
function getgroup() { # put equal prefix group into gp[1..ng]
|
||||
if (getone(file2, gp, 1) <= 0) # end of file
|
||||
return 0
|
||||
for (ng = 2; getone(file2, gp, ng) > 0; ng++)
|
||||
if (prefix(gp[ng]) != prefix(gp[1])) {
|
||||
unget(gp[ng]) # went too far
|
||||
return ng-1
|
||||
}
|
||||
return ng-1
|
||||
}
|
||||
|
||||
function getone(f, gp, n) { # get next line in gp[n]
|
||||
if (eofstat <= 0) # eof or error has occurred
|
||||
return 0
|
||||
if (ungot) { # return lookahead line if it exists
|
||||
gp[n] = ungotline
|
||||
ungot = 0
|
||||
return 1
|
||||
}
|
||||
return eofstat = (getline gp[n] <f)
|
||||
}
|
||||
|
||||
function unget(s) { ungotline = s; ungot = 1 }
|
||||
function prefix(s) { return substr(s, 1, index(s, sep) - 1) }
|
||||
function suffix(s) { return substr(s, index(s, sep) + 1) }
|
8
usr.bin/awk/tests/letter.text
Normal file
8
usr.bin/awk/tests/letter.text
Normal file
|
@ -0,0 +1,8 @@
|
|||
Subject: Demographic Information About #1
|
||||
From: AWK Demographics, Inc.
|
||||
|
||||
In response to your request for information about #1,
|
||||
our latest research has revealed that its population is #2
|
||||
million people and its area is #3 million square miles.
|
||||
This gives #1 a population density of #4 people per
|
||||
square mile.
|
8
usr.bin/awk/tests/merge.awk
Normal file
8
usr.bin/awk/tests/merge.awk
Normal file
|
@ -0,0 +1,8 @@
|
|||
BEGIN { FS = "\t" }
|
||||
FILENAME == "capitals" {
|
||||
cap[$1] = $2
|
||||
}
|
||||
FILENAME == "countries" && $4 == "Asia" {
|
||||
print $1, $3, cap[$1]
|
||||
}
|
||||
|
96
usr.bin/awk/tests/numbers.data
Normal file
96
usr.bin/awk/tests/numbers.data
Normal file
|
@ -0,0 +1,96 @@
|
|||
605 506
|
||||
156 3292
|
||||
133 1054
|
||||
608 6605
|
||||
502 31296
|
||||
1926 672
|
||||
933 2167
|
||||
1706 168
|
||||
1868 186
|
||||
737 197
|
||||
1308 856
|
||||
4637 71392
|
||||
456 1038
|
||||
6380 1089
|
||||
1800 588
|
||||
2206 232
|
||||
1279 3008
|
||||
678 163
|
||||
1517 450
|
||||
207 432
|
||||
1265 4853
|
||||
3288 2335
|
||||
847 3817
|
||||
224 4204
|
||||
1541 6431
|
||||
2635 1904
|
||||
1295 4830
|
||||
1658 2615
|
||||
4593 1933
|
||||
545 2269
|
||||
4247 8784
|
||||
1354 2341
|
||||
1429 12451
|
||||
711 661
|
||||
6757 9831
|
||||
702 15964
|
||||
4284 10646
|
||||
2082 2254
|
||||
2066 2386
|
||||
216 2148
|
||||
14795 264
|
||||
3200 476
|
||||
6383 791
|
||||
739 929
|
||||
145 1165
|
||||
1985 385
|
||||
336 3263
|
||||
3900 268
|
||||
14954 268
|
||||
131 2863
|
||||
784 20472
|
||||
579 2340
|
||||
3371 1092
|
||||
163 882
|
||||
6248 3124
|
||||
14806 3695
|
||||
1334 557
|
||||
3984 8215
|
||||
12075 6579
|
||||
2648 167
|
||||
15805 4533
|
||||
33468 16518
|
||||
9353 141
|
||||
2936 3459
|
||||
157 1715
|
||||
2155 1508
|
||||
8735 149
|
||||
167 1343
|
||||
1925 1807
|
||||
65901 16015
|
||||
36833 20737
|
||||
35547 2166
|
||||
225 574
|
||||
14016 11902
|
||||
181 181
|
||||
4761 1619
|
||||
181 186
|
||||
186 196
|
||||
272 261
|
||||
1129 3164
|
||||
178 3740
|
||||
368 3335
|
||||
1564 1506
|
||||
78880 142
|
||||
169 176
|
||||
6619 176
|
||||
181 408
|
||||
9510 207
|
||||
790 441
|
||||
251 167
|
||||
1274 3794
|
||||
3708 4132
|
||||
2376 4659
|
||||
654 8094
|
||||
3399 168
|
||||
1907 914864
|
2
usr.bin/awk/tests/ny2.awk
Normal file
2
usr.bin/awk/tests/ny2.awk
Normal file
|
@ -0,0 +1,2 @@
|
|||
BEGIN { RS = ""; ORS = "\n\n" }
|
||||
/New York/
|
13
usr.bin/awk/tests/parser.in
Normal file
13
usr.bin/awk/tests/parser.in
Normal file
|
@ -0,0 +1,13 @@
|
|||
BEGIN { x = 0; y = 1 }
|
||||
|
||||
$1 > x { if (x == y+1) {
|
||||
x = 1
|
||||
y = x * 2
|
||||
} else
|
||||
print x, z[x]
|
||||
}
|
||||
|
||||
NR > 1 { print $1 }
|
||||
|
||||
END { print NR }
|
||||
|
10
usr.bin/awk/tests/percent
Normal file
10
usr.bin/awk/tests/percent
Normal file
|
@ -0,0 +1,10 @@
|
|||
# percent
|
||||
# input: a column of nonnegative numbers
|
||||
# output: each number and its percentage of the total
|
||||
|
||||
{ x[NR] = $1; sum += $1 }
|
||||
|
||||
END { if (sum != 0)
|
||||
for (i = 1; i <= NR; i++)
|
||||
printf("%10.2f %5.1f\n", x[i], 100*x[i]/sum)
|
||||
}
|
6
usr.bin/awk/tests/prep1
Normal file
6
usr.bin/awk/tests/prep1
Normal file
|
@ -0,0 +1,6 @@
|
|||
# prep1 - prepare countries by continent and pop. den.
|
||||
|
||||
BEGIN { FS = "\t" }
|
||||
{ printf("%s:%s:%d:%d:%.1f\n",
|
||||
$4, $1, $3, $2, 1000*$3/$2) | "sort -t: +0 -1 +4rn"
|
||||
}
|
7
usr.bin/awk/tests/prep2
Normal file
7
usr.bin/awk/tests/prep2
Normal file
|
@ -0,0 +1,7 @@
|
|||
# prep2 - prepare countries by continent, inverse pop. den.
|
||||
|
||||
BEGIN { FS = "\t"}
|
||||
{ den = 1000*$3/$2
|
||||
printf("%-15s:%12.8f:%s:%d:%d:%.1f\n",
|
||||
$4, 1/den, $1, $3, $2, den) | "sort"
|
||||
}
|
23
usr.bin/awk/tests/printenv.awk
Normal file
23
usr.bin/awk/tests/printenv.awk
Normal file
|
@ -0,0 +1,23 @@
|
|||
|
||||
# Print environment variables' values; names passed on command line
|
||||
|
||||
BEGIN {
|
||||
if (ARGC < 2) {
|
||||
print "Error: provide environment variable name on command line"
|
||||
exit 1;
|
||||
}
|
||||
i = 1;
|
||||
do {
|
||||
rawname = ARGV[i];
|
||||
upname = toupper(rawname);
|
||||
loname = tolower(rawname);
|
||||
printf "%s = '%s'", rawname,ENVIRON[rawname];
|
||||
if (rawname != upname)
|
||||
printf "; %s = '%s'", upname,ENVIRON[upname];
|
||||
if (rawname != loname)
|
||||
printf "; %s = '%s'", loname,ENVIRON[loname];
|
||||
printf "\n"
|
||||
i++;
|
||||
} while (i < ARGC)
|
||||
|
||||
}
|
30
usr.bin/awk/tests/sentgen
Normal file
30
usr.bin/awk/tests/sentgen
Normal file
|
@ -0,0 +1,30 @@
|
|||
# sentgen - random sentence generator
|
||||
# input: grammar file; sequence of nonterminals
|
||||
# output: a random sentence for each nonterminal
|
||||
|
||||
BEGIN { # read rules from grammar file
|
||||
while (getline < "grammar" > 0)
|
||||
if ($2 == "->") {
|
||||
i = ++lhs[$1] # count lhs
|
||||
rhscnt[$1, i] = NF-2 # how many in rhs
|
||||
for (j = 3; j <= NF; j++) # record them
|
||||
rhslist[$1, i, j-2] = $j
|
||||
} else
|
||||
print "illegal production: " $0
|
||||
}
|
||||
|
||||
{ if ($1 in lhs) { # nonterminal to expand
|
||||
gen($1)
|
||||
printf("\n")
|
||||
} else
|
||||
print "unknown nonterminal: " $0
|
||||
}
|
||||
|
||||
function gen(sym, i, j) {
|
||||
if (sym in lhs) { # a nonterminal
|
||||
i = int(lhs[sym] * rand()) + 1 # random production
|
||||
for (j = 1; j <= rhscnt[sym, i]; j++) # expand rhs's
|
||||
gen(rhslist[sym, i, j])
|
||||
} else
|
||||
printf("%s ", sym)
|
||||
}
|
7
usr.bin/awk/tests/sentgen.data
Normal file
7
usr.bin/awk/tests/sentgen.data
Normal file
|
@ -0,0 +1,7 @@
|
|||
Sentence
|
||||
Sentence
|
||||
Nounphrase
|
||||
Verb
|
||||
Adverb
|
||||
BadElement
|
||||
Sentence
|
38
usr.bin/awk/tests/sentgen2
Normal file
38
usr.bin/awk/tests/sentgen2
Normal file
|
@ -0,0 +1,38 @@
|
|||
# sentgen2 - random sentence generator (nonrecursive)
|
||||
# input: grammar file; sequence of nonterminals
|
||||
# output: random sentences generated by the grammar
|
||||
|
||||
BEGIN { # read rules from grammar file
|
||||
while (getline < "grammar" > 0)
|
||||
if ($2 == "->") {
|
||||
i = ++lhs[$1] # count lhs
|
||||
rhscnt[$1, i] = NF-2 # how many in rhs
|
||||
for (j = 3; j <= NF; j++) # record them
|
||||
rhslist[$1, i, j-2] = $j
|
||||
} else
|
||||
print "illegal production: " $0
|
||||
}
|
||||
|
||||
{ if ($1 in lhs) { # nonterminal to expand
|
||||
push($1)
|
||||
gen()
|
||||
printf("\n")
|
||||
} else
|
||||
print "unknown nonterminal: " $0
|
||||
}
|
||||
|
||||
function gen( i, j) {
|
||||
while (stp >= 1) {
|
||||
sym = pop()
|
||||
if (sym in lhs) { # a nonterminal
|
||||
i = int(lhs[sym] * rand()) + 1 # random production
|
||||
for (j = rhscnt[sym, i]; j >= 1; j--) # expand rhs's
|
||||
push(rhslist[sym, i, j])
|
||||
} else
|
||||
printf("%s ", sym)
|
||||
}
|
||||
}
|
||||
|
||||
function push(s) { stack[++stp] = s }
|
||||
|
||||
function pop() { return stack[stp--] }
|
5
usr.bin/awk/tests/smallpop
Normal file
5
usr.bin/awk/tests/smallpop
Normal file
|
@ -0,0 +1,5 @@
|
|||
Canada 25
|
||||
Mexico 78
|
||||
France 55
|
||||
Germany 61
|
||||
England 56
|
58
usr.bin/awk/tests/sortgen
Normal file
58
usr.bin/awk/tests/sortgen
Normal file
|
@ -0,0 +1,58 @@
|
|||
# sortgen - generate sort command
|
||||
# input: sequence of lines describing sorting options
|
||||
# output: Unix sort command with appropriate arguments
|
||||
|
||||
BEGIN { key = 0 }
|
||||
|
||||
/no |not |n't / { print "error: can't do negatives:", $0; ok = 1 }
|
||||
|
||||
# rules for global options
|
||||
{ ok = 0 }
|
||||
/uniq|discard.*(iden|dupl)/ { uniq = " -u"; ok = 1 }
|
||||
/separ.*tab|tab.*sep/ { sep = "t'\t'"; ok = 1 }
|
||||
/separ/ { for (i = 1; i <= NF; i++)
|
||||
if (length($i) == 1)
|
||||
sep = "t'" $i "'"
|
||||
ok = 1
|
||||
}
|
||||
/key/ { key++; dokey(); ok = 1 } # new key; must come in order
|
||||
|
||||
# rules for each key
|
||||
|
||||
/dict/ { dict[key] = "d"; ok = 1 }
|
||||
/ignore.*(space|blank)/ { blank[key] = "b"; ok = 1 }
|
||||
/fold|case/ { fold[key] = "f"; ok = 1 }
|
||||
/num/ { num[key] = "n"; ok = 1 }
|
||||
/rev|descend|decreas|down|oppos/ { rev[key] = "r"; ok = 1 }
|
||||
/forward|ascend|increas|up|alpha/ { next } # this is sort's default
|
||||
!ok { print "error: can't understand:", $0 }
|
||||
|
||||
END { # print flags for each key
|
||||
cmd = "sort" uniq
|
||||
flag = dict[0] blank[0] fold[0] rev[0] num[0] sep
|
||||
if (flag) cmd = cmd " -" flag
|
||||
for (i = 1; i <= key; i++)
|
||||
if (pos[i] != "") {
|
||||
flag = pos[i] dict[i] blank[i] fold[i] rev[i] num[i]
|
||||
if (flag) cmd = cmd " +" flag
|
||||
if (pos2[i]) cmd = cmd " -" pos2[i]
|
||||
}
|
||||
print cmd
|
||||
}
|
||||
|
||||
function dokey( i) { # determine position of key
|
||||
for (i = 1; i <= NF; i++)
|
||||
if ($i ~ /^[0-9]+$/) {
|
||||
pos[key] = $i - 1 # sort uses 0-origin
|
||||
break
|
||||
}
|
||||
for (i++; i <= NF; i++)
|
||||
if ($i ~ /^[0-9]+$/) {
|
||||
pos2[key] = $i
|
||||
break
|
||||
}
|
||||
if (pos[key] == "")
|
||||
printf("error: invalid key specification: %s\n", $0)
|
||||
if (pos2[key] == "")
|
||||
pos2[key] = pos[key] + 1
|
||||
}
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user