5169 lines
118 KiB
Plaintext
5169 lines
118 KiB
Plaintext
--------------------------------------------------------------------------------
|
|
[CMD] qseawk -f cou-001.awk cou.dat </dev/stdin 2>&1
|
|
--------------------------------------------------------------------------------
|
|
USSR 275
|
|
Canada 25
|
|
China 1032
|
|
USA 237
|
|
Brazil 134
|
|
India 746
|
|
Mexico 78
|
|
France 55
|
|
Japan 120
|
|
Germany 61
|
|
England 56
|
|
--------------------------------------------------------------------------------
|
|
[CMD] qseawk -f cou-002.awk cou.dat </dev/stdin 2>&1
|
|
--------------------------------------------------------------------------------
|
|
COUNTRY AREA POP CONTINENT
|
|
|
|
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
|
|
|
|
TOTAL 25681 2819
|
|
--------------------------------------------------------------------------------
|
|
[CMD] qseawk -f cou-003.awk cou.dat </dev/stdin 2>&1
|
|
--------------------------------------------------------------------------------
|
|
India 1267 746 Asia
|
|
Japan 144 120 Asia
|
|
Germany 96 61 Europe
|
|
England 94 56 Europe
|
|
--------------------------------------------------------------------------------
|
|
[CMD] qseawk -f cou-004.awk cou.dat </dev/stdin 2>&1
|
|
--------------------------------------------------------------------------------
|
|
USSR 8649 275 Asia
|
|
USA 3615 237 North America
|
|
Mexico 762 78 North America
|
|
--------------------------------------------------------------------------------
|
|
[CMD] qseawk -f cou-005.awk cou.dat </dev/stdin 2>&1
|
|
--------------------------------------------------------------------------------
|
|
Canada 3852 25 North America
|
|
Brazil 3286 134 South America
|
|
Mexico 762 78 North America
|
|
England 94 56 Europe
|
|
--------------------------------------------------------------------------------
|
|
[CMD] qseawk -f cou-006.awk cou.dat </dev/stdin 2>&1
|
|
--------------------------------------------------------------------------------
|
|
--------------------------------------------------------------------------------
|
|
[CMD] qseawk -f cou-007.awk cou.dat </dev/stdin 2>&1
|
|
--------------------------------------------------------------------------------
|
|
USSR 8649 275 Asia
|
|
China 3705 1032 Asia
|
|
India 1267 746 Asia
|
|
Japan 144 120 Asia
|
|
--------------------------------------------------------------------------------
|
|
[CMD] qseawk -f cou-008.awk cou.dat </dev/stdin 2>&1
|
|
--------------------------------------------------------------------------------
|
|
USSR 8649 275 Asia
|
|
China 3705 1032 Asia
|
|
India 1267 746 Asia
|
|
Japan 144 120 Asia
|
|
--------------------------------------------------------------------------------
|
|
[CMD] qseawk -f cou-009.awk cou.dat </dev/stdin 2>&1
|
|
--------------------------------------------------------------------------------
|
|
Canada 3852 25 North America
|
|
USA 3615 237 North America
|
|
Brazil 3286 134 South America
|
|
Mexico 762 78 North America
|
|
France 211 55 Europe
|
|
Germany 96 61 Europe
|
|
England 94 56 Europe
|
|
--------------------------------------------------------------------------------
|
|
[CMD] qseawk -f cou-010.awk cou.dat </dev/stdin 2>&1
|
|
--------------------------------------------------------------------------------
|
|
USSR 8649 275 Asia
|
|
China 3705 1032 Asia
|
|
India 1267 746 Asia
|
|
Japan 144 120 Asia
|
|
--------------------------------------------------------------------------------
|
|
[CMD] qseawk -f cou-011.awk cou.dat </dev/stdin 2>&1
|
|
--------------------------------------------------------------------------------
|
|
--------------------------------------------------------------------------------
|
|
[CMD] qseawk -f cou-012.awk cou.dat </dev/stdin 2>&1
|
|
--------------------------------------------------------------------------------
|
|
China 3705 1032 Asia
|
|
India 1267 746 Asia
|
|
--------------------------------------------------------------------------------
|
|
[CMD] qseawk -f cou-013.awk cou.dat </dev/stdin 2>&1
|
|
--------------------------------------------------------------------------------
|
|
USSR 8649 275 Asia
|
|
China 3705 1032 Asia
|
|
India 1267 746 Asia
|
|
France 211 55 Europe
|
|
Japan 144 120 Asia
|
|
Germany 96 61 Europe
|
|
England 94 56 Europe
|
|
--------------------------------------------------------------------------------
|
|
[CMD] qseawk -f cou-014.awk cou.dat </dev/stdin 2>&1
|
|
--------------------------------------------------------------------------------
|
|
USSR 8649 275 Asia
|
|
China 3705 1032 Asia
|
|
India 1267 746 Asia
|
|
France 211 55 Europe
|
|
Japan 144 120 Asia
|
|
Germany 96 61 Europe
|
|
England 94 56 Europe
|
|
--------------------------------------------------------------------------------
|
|
[CMD] qseawk -f cou-015.awk cou.dat </dev/stdin 2>&1
|
|
--------------------------------------------------------------------------------
|
|
USSR 8649 275 Asia
|
|
China 3705 1032 Asia
|
|
India 1267 746 Asia
|
|
France 211 55 Europe
|
|
Japan 144 120 Asia
|
|
Germany 96 61 Europe
|
|
England 94 56 Europe
|
|
--------------------------------------------------------------------------------
|
|
[CMD] qseawk -f cou-016.awk cou.dat </dev/stdin 2>&1
|
|
--------------------------------------------------------------------------------
|
|
USSR 8649 275 Asia
|
|
China 3705 1032 Asia
|
|
India 1267 746 Asia
|
|
France 211 55 Europe
|
|
Japan 144 120 Asia
|
|
Germany 96 61 Europe
|
|
England 94 56 Europe
|
|
--------------------------------------------------------------------------------
|
|
[CMD] qseawk -f cou-017.awk cou.dat </dev/stdin 2>&1
|
|
--------------------------------------------------------------------------------
|
|
Canada 3852 25 North America
|
|
China 3705 1032 Asia
|
|
USA 3615 237 North America
|
|
--------------------------------------------------------------------------------
|
|
[CMD] qseawk -f cou-018.awk cou.dat </dev/stdin 2>&1
|
|
--------------------------------------------------------------------------------
|
|
--------------------------------------------------------------------------------
|
|
[CMD] qseawk -f cou-019.awk cou.dat </dev/stdin 2>&1
|
|
--------------------------------------------------------------------------------
|
|
cou.dat: USSR 8649 275 Asia
|
|
cou.dat: Canada 3852 25 North America
|
|
cou.dat: China 3705 1032 Asia
|
|
cou.dat: USA 3615 237 North America
|
|
cou.dat: Brazil 3286 134 South America
|
|
--------------------------------------------------------------------------------
|
|
[CMD] qseawk -f cou-020.awk cou.dat </dev/stdin 2>&1
|
|
--------------------------------------------------------------------------------
|
|
cou.dat: USSR 8649 275 Asia
|
|
cou.dat: Canada 3852 25 North America
|
|
cou.dat: China 3705 1032 Asia
|
|
cou.dat: USA 3615 237 North America
|
|
cou.dat: Brazil 3286 134 South America
|
|
--------------------------------------------------------------------------------
|
|
[CMD] qseawk -f cou-021.awk cou.dat </dev/stdin 2>&1
|
|
--------------------------------------------------------------------------------
|
|
USSR 8649000
|
|
China 3705000
|
|
India 1267000
|
|
Japan 144000
|
|
--------------------------------------------------------------------------------
|
|
[CMD] qseawk -f cou-022.awk cou.dat </dev/stdin 2>&1
|
|
--------------------------------------------------------------------------------
|
|
USSR 8649 275 Asia
|
|
Canada 3852 25 NA
|
|
China 3705 1032 Asia
|
|
USA 3615 237 NA
|
|
Brazil 3286 134 SA
|
|
India 1267 746 Asia
|
|
Mexico 762 78 NA
|
|
France 211 55 Europe
|
|
Japan 144 120 Asia
|
|
Germany 96 61 Europe
|
|
England 94 56 Europe
|
|
--------------------------------------------------------------------------------
|
|
[CMD] qseawk -f cou-023.awk cou.dat </dev/stdin 2>&1
|
|
--------------------------------------------------------------------------------
|
|
USSR 8649 275 Asia 31.7956
|
|
Canada 3852 25 North America 6.49013
|
|
China 3705 1032 Asia 278.543
|
|
USA 3615 237 North America 65.5602
|
|
Brazil 3286 134 South America 40.7791
|
|
India 1267 746 Asia 588.792
|
|
Mexico 762 78 North America 102.362
|
|
France 211 55 Europe 260.664
|
|
Japan 144 120 Asia 833.333
|
|
Germany 96 61 Europe 635.417
|
|
England 94 56 Europe 595.745
|
|
--------------------------------------------------------------------------------
|
|
[CMD] qseawk -f cou-024.awk cou.dat </dev/stdin 2>&1
|
|
--------------------------------------------------------------------------------
|
|
Total population of the 4 Asian countries is 2173 million.
|
|
--------------------------------------------------------------------------------
|
|
[CMD] qseawk -f cou-025.awk cou.dat </dev/stdin 2>&1
|
|
--------------------------------------------------------------------------------
|
|
Asian population is 2173 million.
|
|
European population is 172 million.
|
|
--------------------------------------------------------------------------------
|
|
[CMD] qseawk -f cou-026.awk cou.dat </dev/stdin 2>&1
|
|
--------------------------------------------------------------------------------
|
|
Asia 2173
|
|
Europe 172
|
|
North America 340
|
|
South America 134
|
|
--------------------------------------------------------------------------------
|
|
[CMD] qseawk -f cou-027.awk cou.dat </dev/stdin 2>&1
|
|
--------------------------------------------------------------------------------
|
|
Asia 2173
|
|
North America 340
|
|
Europe 172
|
|
South America 134
|
|
--------------------------------------------------------------------------------
|
|
[CMD] qseawk -f emp-001.awk emp.dat </dev/stdin 2>&1
|
|
--------------------------------------------------------------------------------
|
|
Kathy 40
|
|
Mark 100
|
|
Mary 121
|
|
Susie 76.5
|
|
--------------------------------------------------------------------------------
|
|
[CMD] qseawk -f emp-002.awk emp.dat </dev/stdin 2>&1
|
|
--------------------------------------------------------------------------------
|
|
Beth
|
|
Dan
|
|
--------------------------------------------------------------------------------
|
|
[CMD] qseawk -f emp-003.awk emp.dat </dev/stdin 2>&1
|
|
--------------------------------------------------------------------------------
|
|
3 Beth 0
|
|
3 Dan 0
|
|
3 Kathy 10
|
|
3 Mark 20
|
|
3 Mary 22
|
|
3 Susie 18
|
|
--------------------------------------------------------------------------------
|
|
[CMD] qseawk -f emp-004.awk emp.dat </dev/stdin 2>&1
|
|
--------------------------------------------------------------------------------
|
|
1 Beth 4.00 0
|
|
2 Dan 3.74 0
|
|
3 Kathy 4.00 10
|
|
4 Mark 5.00 20
|
|
5 Mary 5.50 22
|
|
6 Susie 4.25 18
|
|
--------------------------------------------------------------------------------
|
|
[CMD] qseawk -f emp-005.awk emp.dat </dev/stdin 2>&1
|
|
--------------------------------------------------------------------------------
|
|
total pay for Beth is 0
|
|
total pay for Dan is 0
|
|
total pay for Kathy is 40
|
|
total pay for Mark is 100
|
|
total pay for Mary is 121
|
|
total pay for Susie is 76.5
|
|
--------------------------------------------------------------------------------
|
|
[CMD] qseawk -f emp-006.awk emp.dat </dev/stdin 2>&1
|
|
--------------------------------------------------------------------------------
|
|
total pay for Beth is $0.00
|
|
total pay for Dan is $0.00
|
|
total pay for Kathy is $40.00
|
|
total pay for Mark is $100.00
|
|
total pay for Mary is $121.00
|
|
total pay for Susie is $76.50
|
|
--------------------------------------------------------------------------------
|
|
[CMD] qseawk -f emp-007.awk emp.dat </dev/stdin 2>&1
|
|
--------------------------------------------------------------------------------
|
|
Beth $ 0.00
|
|
Dan $ 0.00
|
|
Kathy $ 40.00
|
|
Mark $100.00
|
|
Mary $121.00
|
|
Susie $ 76.50
|
|
--------------------------------------------------------------------------------
|
|
[CMD] qseawk -f emp-008.awk emp.dat </dev/stdin 2>&1
|
|
--------------------------------------------------------------------------------
|
|
Mark 5.00 20
|
|
Mary 5.50 22
|
|
--------------------------------------------------------------------------------
|
|
[CMD] qseawk -f emp-009.awk emp.dat </dev/stdin 2>&1
|
|
--------------------------------------------------------------------------------
|
|
$100.00 for Mark
|
|
$121.00 for Mary
|
|
$76.50 for Susie
|
|
--------------------------------------------------------------------------------
|
|
[CMD] qseawk -f emp-010.awk emp.dat </dev/stdin 2>&1
|
|
--------------------------------------------------------------------------------
|
|
Susie 4.25 18
|
|
--------------------------------------------------------------------------------
|
|
[CMD] qseawk -f emp-011.awk emp.dat </dev/stdin 2>&1
|
|
--------------------------------------------------------------------------------
|
|
Susie 4.25 18
|
|
--------------------------------------------------------------------------------
|
|
[CMD] qseawk -f emp-012.awk emp.dat </dev/stdin 2>&1
|
|
--------------------------------------------------------------------------------
|
|
Beth 4.00 0
|
|
Kathy 4.00 10
|
|
Mark 5.00 20
|
|
Mary 5.50 22
|
|
Susie 4.25 18
|
|
--------------------------------------------------------------------------------
|
|
[CMD] qseawk -f emp-013.awk emp.dat </dev/stdin 2>&1
|
|
--------------------------------------------------------------------------------
|
|
Beth 4.00 0
|
|
Kathy 4.00 10
|
|
Mark 5.00 20
|
|
Mark 5.00 20
|
|
Mary 5.50 22
|
|
Mary 5.50 22
|
|
Susie 4.25 18
|
|
--------------------------------------------------------------------------------
|
|
[CMD] qseawk -f emp-014.awk emp.dat </dev/stdin 2>&1
|
|
--------------------------------------------------------------------------------
|
|
Beth 4.00 0
|
|
Kathy 4.00 10
|
|
Mark 5.00 20
|
|
Mary 5.50 22
|
|
Susie 4.25 18
|
|
--------------------------------------------------------------------------------
|
|
[CMD] qseawk -f emp-015.awk emp.dat </dev/stdin 2>&1
|
|
--------------------------------------------------------------------------------
|
|
--------------------------------------------------------------------------------
|
|
[CMD] qseawk -f emp-016.awk emp.dat </dev/stdin 2>&1
|
|
--------------------------------------------------------------------------------
|
|
NAME RATE HOURS
|
|
|
|
Beth 4.00 0
|
|
Dan 3.74 0
|
|
Kathy 4.00 10
|
|
Mark 5.00 20
|
|
Mary 5.50 22
|
|
Susie 4.25 18
|
|
--------------------------------------------------------------------------------
|
|
[CMD] qseawk -f emp-017.awk emp.dat </dev/stdin 2>&1
|
|
--------------------------------------------------------------------------------
|
|
3 employees worked more than 15 hours
|
|
--------------------------------------------------------------------------------
|
|
[CMD] qseawk -f emp-018.awk emp.dat </dev/stdin 2>&1
|
|
--------------------------------------------------------------------------------
|
|
6 employees
|
|
--------------------------------------------------------------------------------
|
|
[CMD] qseawk -f emp-019.awk emp.dat </dev/stdin 2>&1
|
|
--------------------------------------------------------------------------------
|
|
6 employees
|
|
total pay is 337.5
|
|
average pay is 56.25
|
|
--------------------------------------------------------------------------------
|
|
[CMD] qseawk -f emp-020.awk emp.dat </dev/stdin 2>&1
|
|
--------------------------------------------------------------------------------
|
|
highest hourly rage: 5.50 for Mary
|
|
--------------------------------------------------------------------------------
|
|
[CMD] qseawk -f emp-021.awk emp.dat </dev/stdin 2>&1
|
|
--------------------------------------------------------------------------------
|
|
Beth Dan Kathy Mark Mary Susie
|
|
--------------------------------------------------------------------------------
|
|
[CMD] qseawk -f emp-022.awk emp.dat </dev/stdin 2>&1
|
|
--------------------------------------------------------------------------------
|
|
Susie 4.25 18
|
|
--------------------------------------------------------------------------------
|
|
[CMD] qseawk -f emp-023.awk emp.dat </dev/stdin 2>&1
|
|
--------------------------------------------------------------------------------
|
|
Beth 4
|
|
Dan 3
|
|
Kathy 5
|
|
Mark 4
|
|
Mary 4
|
|
Susie 5
|
|
--------------------------------------------------------------------------------
|
|
[CMD] qseawk -f emp-024.awk emp.dat </dev/stdin 2>&1
|
|
--------------------------------------------------------------------------------
|
|
6 lines, 18 words, 77 characters
|
|
--------------------------------------------------------------------------------
|
|
[CMD] qseawk -f emp-025.awk emp.dat </dev/stdin 2>&1
|
|
--------------------------------------------------------------------------------
|
|
no employees are paid more than $6/hour
|
|
--------------------------------------------------------------------------------
|
|
[CMD] qseawk -f emp-026.awk emp.dat </dev/stdin 2>&1
|
|
--------------------------------------------------------------------------------
|
|
Susie 4.25 18
|
|
Mary 5.50 22
|
|
Mark 5.00 20
|
|
Kathy 4.00 10
|
|
Dan 3.74 0
|
|
Beth 4.00 0
|
|
--------------------------------------------------------------------------------
|
|
[CMD] qseawk -f emp-027.awk emp.dat </dev/stdin 2>&1
|
|
--------------------------------------------------------------------------------
|
|
Susie 4.25 18
|
|
Mary 5.50 22
|
|
Mark 5.00 20
|
|
Kathy 4.00 10
|
|
Dan 3.74 0
|
|
Beth 4.00 0
|
|
--------------------------------------------------------------------------------
|
|
[CMD] qseawk -f adr-001.awk adr.dat </dev/stdin 2>&1
|
|
--------------------------------------------------------------------------------
|
|
James Brown 012-345-678
|
|
Richie Ren 02-3473-9192
|
|
Toh WeeKung 9102-1203
|
|
--------------------------------------------------------------------------------
|
|
[CMD] qseawk -f adr-002.awk adr.dat </dev/stdin 2>&1
|
|
--------------------------------------------------------------------------------
|
|
James Brown Somewhere over the rainbow 012-345-678
|
|
Toh WeeKung Singapore 9102-1203
|
|
--------------------------------------------------------------------------------
|
|
[CMD] qseawk -f unr-001.awk unr.dat </dev/stdin 2>&1
|
|
--------------------------------------------------------------------------------
|
|
Beth 4 0
|
|
Dan 3.74 0
|
|
0 4.00 10
|
|
Mark 5.00 20
|
|
Mary 5.5 22
|
|
Susie 4.25 18
|
|
--------------------------------------------------------------------------------
|
|
[CMD] qseawk --strictnaming=off --newline=on -d- -f lang-001.awk </dev/stdin 2>&1
|
|
--------------------------------------------------------------------------------
|
|
function f (__p0)
|
|
{
|
|
print __p0;
|
|
}
|
|
|
|
BEGIN {
|
|
f("hello");
|
|
}
|
|
|
|
hello
|
|
--------------------------------------------------------------------------------
|
|
[CMD] qseawk --newline=on -d- -f lang-002.awk </dev/stdin 2>&1
|
|
--------------------------------------------------------------------------------
|
|
function f (__p0)
|
|
{
|
|
print __p0;
|
|
f("my hello");
|
|
}
|
|
|
|
BEGIN {
|
|
f(10);
|
|
}
|
|
|
|
10
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
my hello
|
|
ERROR: CODE 17 LINE 6 COLUMN 1 FILE lang-002.awk - block nested too deeply
|
|
--------------------------------------------------------------------------------
|
|
[CMD] qseawk --newline=on -d- -f lang-003.awk </dev/stdin 2>&1
|
|
--------------------------------------------------------------------------------
|
|
function fn (__p0)
|
|
{
|
|
__p0 = 20;
|
|
}
|
|
|
|
BEGIN {
|
|
f = 50;
|
|
fn(100);
|
|
print f;
|
|
}
|
|
|
|
50
|
|
--------------------------------------------------------------------------------
|
|
[CMD] qseawk --newline=on -d- -f lang-004.awk </dev/stdin 2>&1
|
|
--------------------------------------------------------------------------------
|
|
ERROR: CODE 44 LINE 3 COLUMN 9 FILE lang-004.awk - function 'a' redefined
|
|
--------------------------------------------------------------------------------
|
|
[CMD] qseawk --implicit=off --newline=on -d- -f lang-005.awk </dev/stdin 2>&1
|
|
--------------------------------------------------------------------------------
|
|
function a (__p0)
|
|
{
|
|
print __p0;
|
|
}
|
|
|
|
BEGIN {
|
|
@local __l0, __l1;
|
|
{
|
|
__l0 = 50;
|
|
{
|
|
__l1 = 30;
|
|
print __l1;
|
|
}
|
|
print __l0;
|
|
}
|
|
a(100);
|
|
}
|
|
|
|
30
|
|
50
|
|
100
|
|
--------------------------------------------------------------------------------
|
|
[CMD] qseawk --implicit=off --newline=on -d- -f lang-006.awk </dev/stdin 2>&1
|
|
--------------------------------------------------------------------------------
|
|
ERROR: CODE 45 LINE 5 COLUMN 10 FILE lang-006.awk - global variable 'a' redefined
|
|
--------------------------------------------------------------------------------
|
|
[CMD] qseawk --implicit=on --newline=on -d- -f lang-007.awk </dev/stdin 2>&1
|
|
--------------------------------------------------------------------------------
|
|
@global __g18;
|
|
|
|
function fn ()
|
|
{
|
|
a = 20;
|
|
return a;
|
|
}
|
|
|
|
BEGIN {
|
|
__g18 = 30;
|
|
print fn();
|
|
print __g18;
|
|
}
|
|
|
|
20
|
|
30
|
|
--------------------------------------------------------------------------------
|
|
[CMD] qseawk --implicit=off --newline=on -d- -f lang-008.awk </dev/stdin 2>&1
|
|
--------------------------------------------------------------------------------
|
|
@global x;
|
|
|
|
BEGIN {
|
|
@local __l0, __l1;
|
|
x = 1;
|
|
{
|
|
__l0 = 2;
|
|
{
|
|
__l1 = 3;
|
|
print __l1;
|
|
}
|
|
print __l0;
|
|
}
|
|
print x;
|
|
}
|
|
|
|
3
|
|
2
|
|
1
|
|
--------------------------------------------------------------------------------
|
|
[CMD] qseawk --implicit=off --newline=on --strictnaming=off -d- -f lang-009.awk lang-009.awk </dev/stdin 2>&1
|
|
--------------------------------------------------------------------------------
|
|
function a (__p0)
|
|
{
|
|
print __p0;
|
|
}
|
|
|
|
BEGIN {
|
|
@local __l0;
|
|
__l0 = 20;
|
|
}
|
|
|
|
END {
|
|
a(1000);
|
|
}
|
|
1000
|
|
--------------------------------------------------------------------------------
|
|
[CMD] qseawk --newline=on -d- -f lang-010.awk this is just a test </dev/stdin 2>&1
|
|
--------------------------------------------------------------------------------
|
|
BEGIN {
|
|
print "ARGC=",ARGC;
|
|
for (i in ARGV)
|
|
{
|
|
print (("ARGV[" i) "]"),ARGV[i];
|
|
}
|
|
print "----------------------";
|
|
print "ARGC=",ARGC;
|
|
split("111 22 333 555 666 777",ARGV);
|
|
for (i in ARGV)
|
|
{
|
|
print (("ARGV[" i) "]"),ARGV[i];
|
|
}
|
|
if ((ARGC >= 0))
|
|
printf ("ARGC [%++#10.10i] is positive\n",10);
|
|
if ((ARGC >= 0))
|
|
printf ("ARGC [%++#10.10f] is positive\n",10);
|
|
if ((ARGC >= 0))
|
|
printf ("ARGC [%++#10.10E] is positive\n",10124.1123);
|
|
if ((ARGC >= 0))
|
|
printf ("ARGC [%++#10.10G] is positive\n",10124.1123);
|
|
if ((ARGC >= 0))
|
|
printf ("ARGC [%++#10.10g] is positive\n",10124.1123);
|
|
if ((ARGC >= 0))
|
|
printf ("ARGC [%++#10.10f] is positive\n",10124.1123);
|
|
printf ("[%d], [%f], [%s]\n",10124.1123,10124.1123,10124.1123);
|
|
printf ("[%-10c] [% 0*.*d]\n",65,45,48,-1);
|
|
print sprintf("abc%d %*.*d %c %s %c",10,20,30,40,"good","good",75.34);
|
|
}
|
|
|
|
ARGC= 6
|
|
ARGV[0] qseawk
|
|
ARGV[1] this
|
|
ARGV[2] is
|
|
ARGV[3] just
|
|
ARGV[4] a
|
|
ARGV[5] test
|
|
----------------------
|
|
ARGC= 6
|
|
ARGV[1] 111
|
|
ARGV[2] 22
|
|
ARGV[3] 333
|
|
ARGV[4] 555
|
|
ARGV[5] 666
|
|
ARGV[6] 777
|
|
ARGC [+0000000010] is positive
|
|
ARGC [+10.0000000000] is positive
|
|
ARGC [+1.0124112300E+04] is positive
|
|
ARGC [+10124.11230] is positive
|
|
ARGC [+10124.11230] is positive
|
|
ARGC [+10124.1123000000] is positive
|
|
[10124], [10124.112300], [10124.1]
|
|
[A ] [-000000000000000000000000000000000000000000000001]
|
|
abc10 000000000000000000000000000040 g good K
|
|
--------------------------------------------------------------------------------
|
|
[CMD] qseawk --newline=on -d- -f lang-011.awk </dev/stdin 2>&1
|
|
--------------------------------------------------------------------------------
|
|
BEGIN {
|
|
a[1,2,3] = 20;
|
|
a[4,5,6] = 30;
|
|
for (i in a)
|
|
{
|
|
n = split(i,k,SUBSEP);
|
|
for (j = 1; (j <= n); (j)++)
|
|
{
|
|
print k[j];
|
|
}
|
|
print "-------------------";
|
|
}
|
|
if (((1,2,3) in a))
|
|
{
|
|
print ("(1,2,3) in a ==> " a[1,2,3]);
|
|
}
|
|
else
|
|
{
|
|
print "(1,2,3) not in a";
|
|
}
|
|
if (((4,5) in a))
|
|
{
|
|
print ("(4,5) in a ==> " a[4,5]);
|
|
}
|
|
else
|
|
{
|
|
print "(4,5) not in a";
|
|
}
|
|
}
|
|
|
|
4
|
|
5
|
|
6
|
|
-------------------
|
|
1
|
|
2
|
|
3
|
|
-------------------
|
|
(1,2,3) in a ==> 20
|
|
(4,5) not in a
|
|
--------------------------------------------------------------------------------
|
|
[CMD] qseawk --newline=on -d- -f lang-012.awk </dev/stdin 2>&1
|
|
--------------------------------------------------------------------------------
|
|
BEGIN {
|
|
OFS = "\t\t";
|
|
print "1==1 :",(1 == 1);
|
|
print "1==0 :",(1 == 0);
|
|
print "1.0==1 :",(1.0 == 1);
|
|
print "1.1==1 :",(1.1 == 1);
|
|
print "1.0!=1 :",(1.0 != 1);
|
|
print "1.1!=1 :",(1.1 != 1);
|
|
print "\"abc\" == \"abc\"",("abc" == "abc");
|
|
print "\"abc\" != \"abc\"",("abc" != "abc");
|
|
print "--------------------------";
|
|
print "a == \"\" :",(a == "");
|
|
print "a >= \"\" :",(a >= "");
|
|
print "a <= \"\" :",(a <= "");
|
|
print "a > \"\" :",(a > "");
|
|
print "a < \"\" :",(a < "");
|
|
print "--------------------------";
|
|
print "a == \" \" :",(a == " ");
|
|
print "a >= \" \" :",(a >= " ");
|
|
print "a <= \" \" :",(a <= " ");
|
|
print "a > \" \" :",(a > " ");
|
|
print "a < \" \" :",(a < " ");
|
|
print "--------------------------";
|
|
print "\"\" == a :",("" == a);
|
|
print "\"\" >= a:",("" >= a);
|
|
print "\"\" <= a:",("" <= a);
|
|
print "\"\" > a:",("" > a);
|
|
print "\"\" < a:",("" < a);
|
|
print "--------------------------";
|
|
print "\" \" == a :",(" " == a);
|
|
print "\" \" >= a:",(" " >= a);
|
|
print "\" \" <= a:",(" " <= a);
|
|
print "\" \" > a:",(" " > a);
|
|
print "\" \" < a:",(" " < a);
|
|
print "--------------------------";
|
|
print "10 == \"10\"",(10 == "10");
|
|
print "10 != \"10\"",(10 != "10");
|
|
print "10 >= \"10\"",(10 >= "10");
|
|
print "10 <= \"10\"",(10 <= "10");
|
|
print "10 > \"10\"",(10 > "10");
|
|
print "10 < \"10\"",(10 < "10");
|
|
print "--------------------------";
|
|
print "10 == \"11\"",(10 == "11");
|
|
print "10 != \"11\"",(10 != "11");
|
|
print "10 >= \"11\"",(10 >= "11");
|
|
print "10 <= \"11\"",(10 <= "11");
|
|
print "10 > \"11\"",(10 > "11");
|
|
print "10 < \"11\"",(10 < "11");
|
|
print "--------------------------";
|
|
print "11 == \"10\"",(11 == "10");
|
|
print "11 != \"10\"",(11 != "10");
|
|
print "11 >= \"10\"",(11 >= "10");
|
|
print "11 <= \"10\"",(11 <= "10");
|
|
print "11 > \"10\"",(11 > "10");
|
|
print "11 < \"10\"",(11 < "10");
|
|
print "--------------------------";
|
|
print "010 == \"8\"",(010 == "8");
|
|
print "010 != \"8\"",(010 != "8");
|
|
print "010 >= \"8\"",(010 >= "8");
|
|
print "010 <= \"8\"",(010 <= "8");
|
|
print "010 > \"8\"",(010 > "8");
|
|
print "010 < \"8\"",(010 < "8");
|
|
print "--------------------------";
|
|
print "10 == \"10.0\"",(10 == "10.0");
|
|
print "10 != \"10.0\"",(10 != "10.0");
|
|
print "10 >= \"10.0\"",(10 >= "10.0");
|
|
print "10 <= \"10.0\"",(10 <= "10.0");
|
|
print "10 > \"10.0\"",(10 > "10.0");
|
|
print "10 < \"10.0\"",(10 < "10.0");
|
|
print "--------------------------";
|
|
print "10.0 == \"10\"",(10.0 == "10");
|
|
print "10.0 != \"10\"",(10.0 != "10");
|
|
print "10.0 >= \"10\"",(10.0 >= "10");
|
|
print "10.0 <= \"10\"",(10.0 <= "10");
|
|
print "10.0 > \"10\"",(10.0 > "10");
|
|
print "10.0 < \"10\"",(10.0 < "10");
|
|
print "--------------------------";
|
|
print "\"10\" == 10.0",("10" == 10.0);
|
|
print "\"10\" != 10.0",("10" != 10.0);
|
|
print "\"10\" >= 10.0",("10" >= 10.0);
|
|
print "\"10\" <= 10.0",("10" <= 10.0);
|
|
print "\"10\" > 10.0",("10" > 10.0);
|
|
print "\"10\" < 10.0",("10" < 10.0);
|
|
print "--------------------------";
|
|
print "\"10\" == 10.1",("10" == 10.1);
|
|
print "\"10\" != 10.1",("10" != 10.1);
|
|
print "\"10\" >= 10.1",("10" >= 10.1);
|
|
print "\"10\" <= 10.1",("10" <= 10.1);
|
|
print "\"10\" > 10.1",("10" > 10.1);
|
|
print "\"10\" < 10.1",("10" < 10.1);
|
|
print 1.245230;
|
|
print 12345678901234567890E20;
|
|
print .123;
|
|
print 0.123000;
|
|
print -0.123000;
|
|
print .123E-;
|
|
print 0.123000;
|
|
print -0.123000;
|
|
print (-0.123000 + "123");
|
|
}
|
|
|
|
1==1 : 1
|
|
1==0 : 0
|
|
1.0==1 : 1
|
|
1.1==1 : 0
|
|
1.0!=1 : 0
|
|
1.1!=1 : 1
|
|
"abc" == "abc" 1
|
|
"abc" != "abc" 0
|
|
--------------------------
|
|
a == "" : 1
|
|
a >= "" : 1
|
|
a <= "" : 1
|
|
a > "" : 0
|
|
a < "" : 0
|
|
--------------------------
|
|
a == " " : 0
|
|
a >= " " : 0
|
|
a <= " " : 1
|
|
a > " " : 0
|
|
a < " " : 1
|
|
--------------------------
|
|
"" == a : 1
|
|
"" >= a: 1
|
|
"" <= a: 1
|
|
"" > a: 0
|
|
"" < a: 0
|
|
--------------------------
|
|
" " == a : 0
|
|
" " >= a: 1
|
|
" " <= a: 0
|
|
" " > a: 1
|
|
" " < a: 0
|
|
--------------------------
|
|
10 == "10" 1
|
|
10 != "10" 0
|
|
10 >= "10" 1
|
|
10 <= "10" 1
|
|
10 > "10" 0
|
|
10 < "10" 0
|
|
--------------------------
|
|
10 == "11" 0
|
|
10 != "11" 1
|
|
10 >= "11" 0
|
|
10 <= "11" 1
|
|
10 > "11" 0
|
|
10 < "11" 1
|
|
--------------------------
|
|
11 == "10" 0
|
|
11 != "10" 1
|
|
11 >= "10" 1
|
|
11 <= "10" 0
|
|
11 > "10" 1
|
|
11 < "10" 0
|
|
--------------------------
|
|
010 == "8" 1
|
|
010 != "8" 0
|
|
010 >= "8" 1
|
|
010 <= "8" 1
|
|
010 > "8" 0
|
|
010 < "8" 0
|
|
--------------------------
|
|
10 == "10.0" 0
|
|
10 != "10.0" 1
|
|
10 >= "10.0" 0
|
|
10 <= "10.0" 1
|
|
10 > "10.0" 0
|
|
10 < "10.0" 1
|
|
--------------------------
|
|
10.0 == "10" 1
|
|
10.0 != "10" 0
|
|
10.0 >= "10" 1
|
|
10.0 <= "10" 1
|
|
10.0 > "10" 0
|
|
10.0 < "10" 0
|
|
--------------------------
|
|
"10" == 10.0 1
|
|
"10" != 10.0 0
|
|
"10" >= 10.0 1
|
|
"10" <= 10.0 1
|
|
"10" > 10.0 0
|
|
"10" < 10.0 0
|
|
--------------------------
|
|
"10" == 10.1 0
|
|
"10" != 10.1 1
|
|
"10" >= 10.1 0
|
|
"10" <= 10.1 1
|
|
"10" > 10.1 0
|
|
"10" < 10.1 1
|
|
1.24523
|
|
1.23457e+39
|
|
0.123
|
|
0.123
|
|
-0.123
|
|
0.123
|
|
0.123
|
|
-0.123
|
|
122.877
|
|
--------------------------------------------------------------------------------
|
|
[CMD] qseawk --newline=on -d- -f lang-013.awk </dev/stdin 2>&1
|
|
--------------------------------------------------------------------------------
|
|
BEGIN {
|
|
CONVFMT = "%s";
|
|
printf ("%s\n",10.34);
|
|
}
|
|
|
|
ERROR: CODE 110 LINE 3 COLUMN 2 FILE lang-013.awk - recursion detected in format conversion
|
|
--------------------------------------------------------------------------------
|
|
[CMD] qseawk --newline=on -d- -f lang-014.awk </dev/stdin 2>&1
|
|
--------------------------------------------------------------------------------
|
|
BEGIN {
|
|
a = 30;
|
|
b = 30;
|
|
c = 30;
|
|
print a,b,c;
|
|
}
|
|
|
|
30 30 30
|
|
--------------------------------------------------------------------------------
|
|
[CMD] qseawk --newline=on -d- -f lang-015.awk </dev/stdin 2>&1
|
|
--------------------------------------------------------------------------------
|
|
ERROR: CODE 17 LINE 3 COLUMN 50 FILE lang-015.awk - block nested too deeply
|
|
--------------------------------------------------------------------------------
|
|
[CMD] qseawk --newline=on -d- -f lang-016.awk </dev/stdin 2>&1
|
|
--------------------------------------------------------------------------------
|
|
BEGIN {
|
|
printf "[[[[[%s]]]]\n",sprintf("abc %s abc",sprintf("def %s %s",sprintf("%s %s %s","xyz",1.2342,"xyz"),sprintf("ttt %s tttt",123.12)));
|
|
printf "[[[[%s]]]]\n",sprintf("ttt %s tttt",123.12);
|
|
}
|
|
|
|
[[[[[abc def xyz 1.2342 xyz ttt 123.12 tttt abc]]]]
|
|
[[[[ttt 123.12 tttt]]]]
|
|
--------------------------------------------------------------------------------
|
|
[CMD] qseawk --newline=on -d- -f lang-017.awk </dev/stdin 2>&1
|
|
--------------------------------------------------------------------------------
|
|
function gety ()
|
|
{
|
|
return (y)++;
|
|
}
|
|
|
|
function getx ()
|
|
{
|
|
if ((x == 2))
|
|
error();
|
|
return (x)++;
|
|
}
|
|
|
|
function main ()
|
|
{
|
|
x = 0;
|
|
y = 0;
|
|
print (getx() + gety());
|
|
print (getx() + gety());
|
|
print (getx() + gety());
|
|
print (getx() + gety());
|
|
return 999;
|
|
}
|
|
|
|
function error ()
|
|
{
|
|
exit 200;
|
|
}
|
|
|
|
BEGIN {
|
|
main();
|
|
}
|
|
|
|
END {
|
|
print "END OF PROGRAM";
|
|
return 10;
|
|
}
|
|
END {
|
|
print "END OF PROGRAM 2";
|
|
exit 100;
|
|
}
|
|
END {
|
|
print "END OF PROGRAM 3";
|
|
exit 900;
|
|
}
|
|
0
|
|
2
|
|
END OF PROGRAM
|
|
END OF PROGRAM 2
|
|
--------------------------------------------------------------------------------
|
|
[CMD] qseawk --call main --newline=on -d- -f lang-017.awk </dev/stdin 2>&1
|
|
--------------------------------------------------------------------------------
|
|
function gety ()
|
|
{
|
|
return (y)++;
|
|
}
|
|
|
|
function getx ()
|
|
{
|
|
if ((x == 2))
|
|
error();
|
|
return (x)++;
|
|
}
|
|
|
|
function main ()
|
|
{
|
|
x = 0;
|
|
y = 0;
|
|
print (getx() + gety());
|
|
print (getx() + gety());
|
|
print (getx() + gety());
|
|
print (getx() + gety());
|
|
return 999;
|
|
}
|
|
|
|
function error ()
|
|
{
|
|
exit 200;
|
|
}
|
|
|
|
BEGIN {
|
|
main();
|
|
}
|
|
|
|
END {
|
|
print "END OF PROGRAM";
|
|
return 10;
|
|
}
|
|
END {
|
|
print "END OF PROGRAM 2";
|
|
exit 100;
|
|
}
|
|
END {
|
|
print "END OF PROGRAM 3";
|
|
exit 900;
|
|
}
|
|
0
|
|
2
|
|
--------------------------------------------------------------------------------
|
|
[CMD] qseawk --newline=on -d- -f lang-018.awk </dev/stdin 2>&1
|
|
--------------------------------------------------------------------------------
|
|
ERROR: CODE 49 LINE 1 COLUMN 9 FILE lang-018.awk - duplicate global variable 'ARGV'
|
|
--------------------------------------------------------------------------------
|
|
[CMD] qseawk --newline=on -d- -f lang-019.awk </dev/stdin 2>&1
|
|
--------------------------------------------------------------------------------
|
|
ERROR: CODE 51 LINE 1 COLUMN 15 FILE lang-019.awk - '+' not a valid parameter name
|
|
--------------------------------------------------------------------------------
|
|
[CMD] qseawk --newline=on -d- -f lang-020.awk </dev/stdin 2>&1
|
|
--------------------------------------------------------------------------------
|
|
ERROR: CODE 52 LINE 1 COLUMN 9 FILE lang-020.awk - '+' not a valid variable name
|
|
--------------------------------------------------------------------------------
|
|
[CMD] qseawk --newline=on -d- -f lang-021.awk </dev/stdin 2>&1
|
|
--------------------------------------------------------------------------------
|
|
ERROR: CODE 52 LINE 3 COLUMN 9 FILE lang-021.awk - '+' not a valid variable name
|
|
--------------------------------------------------------------------------------
|
|
[CMD] qseawk --newline=on -d- -f lang-022.awk </dev/stdin 2>&1
|
|
--------------------------------------------------------------------------------
|
|
ERROR: CODE 25 LINE 2 COLUMN 9 FILE lang-022.awk - left parenthesis expected in place of '='
|
|
--------------------------------------------------------------------------------
|
|
[CMD] qseawk --newline=on -d- -f lang-023.awk </dev/stdin 2>&1
|
|
--------------------------------------------------------------------------------
|
|
ERROR: CODE 30 LINE 5 COLUMN 20 FILE lang-023.awk - colon expected in place of ';'
|
|
--------------------------------------------------------------------------------
|
|
[CMD] qseawk --newline=on -d- -f lang-024.awk </dev/stdin 2>&1
|
|
--------------------------------------------------------------------------------
|
|
BEGIN {
|
|
@local __l0;
|
|
__l0 = 21;
|
|
print ((__l0 > 20))?1:2;
|
|
c = ((__l0)++ ++(b));
|
|
print __l0;
|
|
print b;
|
|
print c;
|
|
print (99 ++(c));
|
|
x = (("he" "ll") "o");
|
|
x %%= " world";
|
|
print x;
|
|
}
|
|
|
|
1
|
|
22
|
|
1
|
|
211
|
|
99212
|
|
hello world
|
|
--------------------------------------------------------------------------------
|
|
[CMD] qseawk --newline=on -d- -f lang-025.awk </dev/stdin 2>&1
|
|
--------------------------------------------------------------------------------
|
|
BEGIN {
|
|
iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiix = 20;
|
|
delete iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiix;
|
|
}
|
|
|
|
ERROR: CODE 81 LINE 3 COLUMN 9 FILE lang-025.awk - 'iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiix' not deletable
|
|
--------------------------------------------------------------------------------
|
|
[CMD] qseawk --newline=on -d- -f lang-026.awk </dev/stdin 2>&1
|
|
--------------------------------------------------------------------------------
|
|
BEGIN {
|
|
abc[20] = "abc";
|
|
print abc[20];
|
|
abc = 10;
|
|
print abc;
|
|
}
|
|
|
|
abc
|
|
10
|
|
--------------------------------------------------------------------------------
|
|
[CMD] qseawk --newline=on -d- -f lang-027.awk </dev/stdin 2>&1
|
|
--------------------------------------------------------------------------------
|
|
ERROR: CODE 19 LINE 2 COLUMN 1 FILE lang-027.awk - invalid character '<NUL>'
|
|
--------------------------------------------------------------------------------
|
|
[CMD] qseawk --newline=on -d- -f lang-028.awk </dev/stdin 2>&1
|
|
--------------------------------------------------------------------------------
|
|
ERROR: CODE 43 LINE 2 COLUMN 10 FILE lang-028.awk - intrinsic function 'substr' redefined
|
|
--------------------------------------------------------------------------------
|
|
[CMD] qseawk --newline=on -d- -f lang-029.awk </dev/stdin 2>&1
|
|
--------------------------------------------------------------------------------
|
|
ERROR: CODE 44 LINE 9 COLUMN 10 FILE lang-029.awk - function 'abc' redefined
|
|
--------------------------------------------------------------------------------
|
|
[CMD] qseawk --newline=on -d- -f lang-030.awk </dev/stdin 2>&1
|
|
--------------------------------------------------------------------------------
|
|
BEGIN {
|
|
print 1;
|
|
print 255;
|
|
print 10;
|
|
print 16;
|
|
print 2;
|
|
print 0;
|
|
print 0;
|
|
print "-----------------------";
|
|
print 1;
|
|
print 255;
|
|
print 10;
|
|
print 16;
|
|
print 2;
|
|
print 0;
|
|
print 0;
|
|
print "-----------------------";
|
|
print -1;
|
|
print -255;
|
|
print -10;
|
|
print -16;
|
|
print -2;
|
|
print 0;
|
|
print 0;
|
|
}
|
|
|
|
1
|
|
255
|
|
10
|
|
16
|
|
2
|
|
0
|
|
0
|
|
-----------------------
|
|
1
|
|
255
|
|
10
|
|
16
|
|
2
|
|
0
|
|
0
|
|
-----------------------
|
|
-1
|
|
-255
|
|
-10
|
|
-16
|
|
-2
|
|
0
|
|
0
|
|
--------------------------------------------------------------------------------
|
|
[CMD] qseawk --newline=on -d- -f lang-031.awk </dev/stdin 2>&1
|
|
--------------------------------------------------------------------------------
|
|
BEGIN {
|
|
print match("hhhheeeo",/e+/);
|
|
print RSTART,RLENGTH;
|
|
print match("heeeo",/e/);
|
|
print RSTART,RLENGTH;
|
|
print match("heeeo",/t/);
|
|
print RSTART,RLENGTH;
|
|
print "--------------------------";
|
|
print match("hhhheeeo","e+");
|
|
print RSTART,RLENGTH;
|
|
print match("heeeo","e");
|
|
print RSTART,RLENGTH;
|
|
print match("heeeo","t");
|
|
print RSTART,RLENGTH;
|
|
print "--------------------------";
|
|
}
|
|
|
|
5
|
|
5 3
|
|
2
|
|
2 1
|
|
0
|
|
0 -1
|
|
--------------------------
|
|
5
|
|
5 3
|
|
2
|
|
2 1
|
|
0
|
|
0 -1
|
|
--------------------------
|
|
--------------------------------------------------------------------------------
|
|
[CMD] qseawk --newline=on -d- -f lang-032.awk </dev/stdin 2>&1
|
|
--------------------------------------------------------------------------------
|
|
BEGIN {
|
|
a = 91;
|
|
print ((a)++ 10);
|
|
print ((a)++ 10);
|
|
print ((a)++ 10);
|
|
print ((a)++ 10);
|
|
print ((a)++ 10);
|
|
print "---------------------";
|
|
a = 91;
|
|
print (++(a) 10);
|
|
}
|
|
|
|
9110
|
|
9210
|
|
9310
|
|
9410
|
|
9510
|
|
---------------------
|
|
9210
|
|
--------------------------------------------------------------------------------
|
|
[CMD] qseawk --newline=on -d- -vdatadir=awk -vdatafile=passwd.dat -f lang-033.awk </dev/stdin 2>&1
|
|
--------------------------------------------------------------------------------
|
|
BEGIN {
|
|
while (((((("cat " datadir) "/") datafile) | getline x) > 0))
|
|
print x;
|
|
}
|
|
|
|
root:x:0:0:root:/root:/bin/bash
|
|
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
|
|
bin:x:2:2:bin:/bin:/bin/sh
|
|
sys:x:3:3:sys:/dev:/bin/sh
|
|
sync:x:4:65534:sync:/bin:/bin/sync
|
|
games:x:5:60:games:/usr/games:/bin/sh
|
|
man:x:6:12:man:/var/cache/man:/bin/sh
|
|
lp:x:7:7:lp:/var/spool/lpd:/bin/sh
|
|
mail:x:8:8:mail:/var/mail:/bin/sh
|
|
news:x:9:9:news:/var/spool/news:/bin/sh
|
|
uucp:x:10:10:uucp:/var/spool/uucp:/bin/sh
|
|
proxy:x:13:13:proxy:/bin:/bin/sh
|
|
www-data:x:33:33:www-data:/var/www:/bin/sh
|
|
backup:x:34:34:backup:/var/backups:/bin/sh
|
|
list:x:38:38:Mailing List Manager:/var/list:/bin/sh
|
|
irc:x:39:39:ircd:/var/run/ircd:/bin/sh
|
|
gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/bin/sh
|
|
nobody:x:65534:65534:nobody:/nonexistent:/bin/sh
|
|
libuuid:x:100:101::/var/lib/libuuid:/bin/sh
|
|
syslog:x:101:102::/home/syslog:/bin/false
|
|
klog:x:102:103::/home/klog:/bin/false
|
|
hplip:x:103:7:HPLIP system user,,,:/var/run/hplip:/bin/false
|
|
avahi-autoipd:x:104:110:Avahi autoip daemon,,,:/var/lib/avahi-autoipd:/bin/false
|
|
gdm:x:105:111:Gnome Display Manager:/var/lib/gdm:/bin/false
|
|
saned:x:106:113::/home/saned:/bin/false
|
|
pulse:x:107:114:PulseAudio daemon,,,:/var/run/pulse:/bin/false
|
|
messagebus:x:108:117::/var/run/dbus:/bin/false
|
|
polkituser:x:109:118:PolicyKit,,,:/var/run/PolicyKit:/bin/false
|
|
avahi:x:110:119:Avahi mDNS daemon,,,:/var/run/avahi-daemon:/bin/false
|
|
haldaemon:x:111:120:Hardware abstraction layer,,,:/var/run/hald:/bin/false
|
|
statd:x:112:65534::/var/lib/nfs:/bin/false
|
|
sshd:x:113:65534::/var/run/sshd:/usr/sbin/nologin
|
|
speech-dispatcher:x:114:29:Speech Dispatcher,,,:/var/run/speech-dispatcher:/bin/sh
|
|
couchdb:x:115:116:CouchDB Administrator,,,:/var/lib/couchdb:/bin/bash
|
|
kernoops:x:116:65534:Kernel Oops Tracking Daemon,,,:/:/bin/false
|
|
mysql:x:117:124:MySQL Server,,,:/var/lib/mysql:/bin/false
|
|
openldap:x:118:125:OpenLDAP Server Account,,,:/nonexistent:/bin/false
|
|
postfix:x:119:126::/var/spool/postfix:/bin/false
|
|
--------------------------------------------------------------------------------
|
|
[CMD] qseawk --newline=on --rwpipe=on -d- -f lang-034.awk </dev/stdin 2>&1
|
|
--------------------------------------------------------------------------------
|
|
BEGIN {
|
|
print "15" || "sort";
|
|
print "14" || "sort";
|
|
print "13" || "sort";
|
|
print "12" || "sort";
|
|
print "11" || "sort";
|
|
close("sort","r");
|
|
print "-----";
|
|
while ((("sort" || getline x) > 0))
|
|
print "xx:",x;
|
|
}
|
|
|
|
-----
|
|
xx: 11
|
|
xx: 12
|
|
xx: 13
|
|
xx: 14
|
|
xx: 15
|
|
--------------------------------------------------------------------------------
|
|
[CMD] qseawk --newline=on -d- -vdatadir=awk -vdatafile=lang-035.dat1 -vgroupname=lang-035 -f lang-035.awk lang-035.dat2 </dev/stdin 2>&1
|
|
--------------------------------------------------------------------------------
|
|
BEGIN {
|
|
max_cid_vars = 100;
|
|
datapath = ((datadir "/") datafile);
|
|
first = 1;
|
|
while (((getline x < datapath) > 0))
|
|
{
|
|
if (first)
|
|
{
|
|
first = 0;
|
|
continue;
|
|
}
|
|
n = split(x,f,",");
|
|
if ((n < 3))
|
|
continue;
|
|
if ((f[3] == ""))
|
|
continue;
|
|
for (suffix = 0; (suffix < max_cid_vars); (suffix)++)
|
|
{
|
|
oldval = tab[f[2],suffix];
|
|
if ((oldval == ""))
|
|
{
|
|
tab[f[2],suffix] = f[3];
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/^lease[[:space:]]+.+[[:space:]]*{[[:space:]]*$/ {
|
|
voice_no = 0;
|
|
}
|
|
|
|
{
|
|
if ((($1 == "option") && ($2 == "agent.circuit-id")))
|
|
{
|
|
pos = index($0,"agent.circuit-id ");
|
|
len = length($0);
|
|
last = substr($0,len,1);
|
|
adj = 0;
|
|
if ((last != ";"))
|
|
(adj)++;
|
|
cid = substr($0,(pos + 17),(length($0) - ((pos + 17) + adj)));
|
|
for (suffix = 0; (suffix < max_cid_vars); (suffix)++)
|
|
{
|
|
val = tab[cid,suffix];
|
|
if ((val == ""))
|
|
break;
|
|
print ((((" info awk.voice-no-" voice_no) " ") val) ";");
|
|
(voice_no)++;
|
|
}
|
|
}
|
|
print $0;
|
|
if ((($1 == "hardware") && ($2 == "ethernet")))
|
|
{
|
|
print ((" info awk.groupname \"" groupname) "\";");
|
|
}
|
|
}
|
|
|
|
# The format of this file is documented in the dhcpd.leases(5) manual page.
|
|
# This lease file was written by isc-dhcp-V3.1.1
|
|
|
|
lease 20.1.20.52 {
|
|
starts 5 2009/08/07 08:33:03;
|
|
ends 5 2009/08/07 08:38:14;
|
|
tstp 5 2009/08/07 08:38:14;
|
|
cltt 5 2009/08/07 08:33:03;
|
|
binding state free;
|
|
hardware ethernet 00:13:5e:4f:d2:d3;
|
|
info awk.groupname "lang-035";
|
|
}
|
|
lease 20.1.20.57 {
|
|
starts 1 2009/08/10 09:04:12;
|
|
ends 2 2009/08/11 09:04:12;
|
|
cltt 1 2009/08/10 09:04:12;
|
|
binding state active;
|
|
next binding state free;
|
|
hardware ethernet 00:13:5e:50:23:6b;
|
|
info awk.groupname "lang-035";
|
|
info awk.voice-no-0 "68599021";
|
|
option agent.circuit-id "BLM1500_AR3_ILAB ONT/9/1/1 /0.0";
|
|
option agent.unknown-9 0:0:0:c1:8:45:52:49:43:53:53:4f:4e;
|
|
}
|
|
lease 20.1.20.54 {
|
|
starts 1 2009/08/10 09:04:16;
|
|
ends 2 2009/08/11 09:04:16;
|
|
cltt 1 2009/08/10 09:04:16;
|
|
binding state active;
|
|
next binding state free;
|
|
hardware ethernet 00:13:5e:50:25:aa;
|
|
info awk.groupname "lang-035";
|
|
info awk.voice-no-0 "68599011";
|
|
option agent.circuit-id "BLM1500_AR3_ILAB ONT/9/1/2 /0.0";
|
|
option agent.unknown-9 0:0:0:c1:8:45:52:49:43:53:53:4f:4e;
|
|
}
|
|
lease 20.1.20.55 {
|
|
starts 1 2009/08/10 13:53:08;
|
|
ends 2 2009/08/11 13:53:08;
|
|
cltt 1 2009/08/10 13:53:08;
|
|
binding state active;
|
|
next binding state free;
|
|
hardware ethernet 00:13:5e:50:20:af;
|
|
info awk.groupname "lang-035";
|
|
info awk.voice-no-0 "68599012";
|
|
option agent.circuit-id "BLM1500_AR3_ILAB ONT/9/2/1 /0.0";
|
|
option agent.unknown-9 0:0:0:c1:8:45:52:49:43:53:53:4f:4e;
|
|
}
|
|
lease 20.1.20.56 {
|
|
starts 1 2009/08/10 13:53:42;
|
|
ends 2 2009/08/11 13:53:42;
|
|
cltt 1 2009/08/10 13:53:42;
|
|
binding state active;
|
|
next binding state free;
|
|
hardware ethernet 00:13:5e:50:20:29;
|
|
info awk.groupname "lang-035";
|
|
info awk.voice-no-0 "68599022";
|
|
option agent.circuit-id "BLM1500_AR3_ILAB ONT/9/2/2 /0.0";
|
|
option agent.unknown-9 0:0:0:c1:8:45:52:49:43:53:53:4f:4e;
|
|
}
|
|
lease 10.218.255.53 {
|
|
starts 5 2009/08/07 08:18:04;
|
|
ends 5 2009/08/07 08:28:04;
|
|
tstp 5 2009/08/07 08:28:04;
|
|
cltt 5 2009/08/07 08:18:04;
|
|
binding state free;
|
|
hardware ethernet 00:1b:5b:9c:4f:7d;
|
|
info awk.groupname "lang-035";
|
|
uid "\001\000\033[\234O}";
|
|
}
|
|
lease 10.218.255.54 {
|
|
starts 5 2009/08/07 08:32:37;
|
|
ends 5 2009/08/07 08:42:37;
|
|
tstp 5 2009/08/07 08:42:37;
|
|
cltt 5 2009/08/07 08:32:37;
|
|
binding state free;
|
|
hardware ethernet 00:1b:5b:9c:1b:35;
|
|
info awk.groupname "lang-035";
|
|
uid "\001\000\033[\234\0335";
|
|
}
|
|
lease 10.218.255.59 {
|
|
starts 5 2009/08/07 10:39:01;
|
|
ends 6 2009/08/08 10:29:45;
|
|
tstp 6 2009/08/08 10:29:45;
|
|
cltt 5 2009/08/07 10:39:01;
|
|
binding state free;
|
|
hardware ethernet 00:1f:b3:79:7e:30;
|
|
info awk.groupname "lang-035";
|
|
uid "\001\000\037\263y~0";
|
|
}
|
|
lease 10.218.255.58 {
|
|
starts 0 2009/08/09 14:21:00;
|
|
ends 1 2009/08/10 09:13:42;
|
|
tstp 1 2009/08/10 09:13:42;
|
|
cltt 0 2009/08/09 14:21:00;
|
|
binding state free;
|
|
hardware ethernet 00:19:e4:43:0e:c8;
|
|
info awk.groupname "lang-035";
|
|
uid "\001\000\031\344C\016\310";
|
|
}
|
|
lease 10.218.255.55 {
|
|
starts 1 2009/08/10 09:02:31;
|
|
ends 2 2009/08/11 09:02:31;
|
|
cltt 1 2009/08/10 09:02:31;
|
|
binding state active;
|
|
next binding state free;
|
|
hardware ethernet 00:1b:5b:9c:90:00;
|
|
info awk.groupname "lang-035";
|
|
uid "\001\000\033[\234\220\000";
|
|
info awk.voice-no-0 "68599019";
|
|
info awk.voice-no-1 "68599014";
|
|
option agent.circuit-id "AR_Remote atm 1/1/03/12:2.100";
|
|
option agent.remote-id "22M-fast";
|
|
}
|
|
lease 10.218.255.52 {
|
|
starts 1 2009/08/10 09:04:04;
|
|
ends 2 2009/08/11 09:04:04;
|
|
cltt 1 2009/08/10 09:04:04;
|
|
binding state active;
|
|
next binding state free;
|
|
hardware ethernet 00:1b:5b:9c:81:35;
|
|
info awk.groupname "lang-035";
|
|
uid "\001\000\033[\234\2015";
|
|
}
|
|
lease 10.218.255.56 {
|
|
starts 1 2009/08/10 09:06:09;
|
|
ends 2 2009/08/11 09:06:09;
|
|
cltt 1 2009/08/10 09:06:09;
|
|
binding state active;
|
|
next binding state free;
|
|
hardware ethernet 00:1e:c7:fb:29:7d;
|
|
info awk.groupname "lang-035";
|
|
uid "\001\000\036\307\373)}";
|
|
}
|
|
lease 10.218.255.57 {
|
|
starts 1 2009/08/10 09:14:33;
|
|
ends 2 2009/08/11 09:14:33;
|
|
cltt 1 2009/08/10 09:14:33;
|
|
binding state active;
|
|
next binding state free;
|
|
hardware ethernet 00:1e:c7:fb:29:4d;
|
|
info awk.groupname "lang-035";
|
|
uid "\001\000\036\307\373)M";
|
|
}
|
|
lease 10.218.255.66 {
|
|
starts 1 2009/08/10 13:57:24;
|
|
ends 2 2009/08/11 13:57:24;
|
|
cltt 1 2009/08/10 13:57:24;
|
|
binding state active;
|
|
next binding state free;
|
|
hardware ethernet 00:1a:04:f9:e2:90;
|
|
info awk.groupname "lang-035";
|
|
uid "\001\000\032\004\371\342\220";
|
|
info awk.voice-no-0 "68599018";
|
|
option agent.circuit-id "AR_Remote atm 1/1/03/02:2.100";
|
|
option agent.remote-id "3play";
|
|
}
|
|
lease 10.218.255.60 {
|
|
starts 1 2009/08/10 17:25:17;
|
|
ends 2 2009/08/11 17:25:17;
|
|
cltt 1 2009/08/10 17:25:17;
|
|
binding state active;
|
|
next binding state free;
|
|
hardware ethernet 00:1e:c7:fb:29:1d;
|
|
info awk.groupname "lang-035";
|
|
uid "\001\000\036\307\373)\035";
|
|
info awk.voice-no-0 "68599017";
|
|
info awk.voice-no-1 "68599013";
|
|
option agent.circuit-id "AL_AM3_LAB atm 1/1/01/01:2.100";
|
|
option agent.remote-id "Testing DHCP";
|
|
}
|
|
# The format of this file is documented in the dhcpd.leases(5) manual page.
|
|
# This lease file was written by isc-dhcp-V3.1.1
|
|
|
|
lease 10.218.255.151 {
|
|
starts 5 2009/08/07 08:09:38;
|
|
ends 5 2009/08/07 08:13:59;
|
|
tstp 5 2009/08/07 08:13:59;
|
|
cltt 5 2009/08/07 08:09:38;
|
|
binding state free;
|
|
hardware ethernet 00:1b:5b:9c:90:00;
|
|
info awk.groupname "lang-035";
|
|
uid "\001\000\033[\234\220\000";
|
|
}
|
|
--------------------------------------------------------------------------------
|
|
[CMD] qseawk --newline=on -d- -f lang-036.awk lang-036.dat </dev/stdin 2>&1
|
|
--------------------------------------------------------------------------------
|
|
{
|
|
if (($0 ~ /^-+$/))
|
|
{
|
|
(getline x);
|
|
printf " %s\n",x;
|
|
nobar = 0;
|
|
}
|
|
else
|
|
{
|
|
if (nobar)
|
|
printf "\n";
|
|
printf "%s",$0;
|
|
nobar = 1;
|
|
}
|
|
}
|
|
|
|
ab...c AAA
|
|
|
|
de...f
|
|
gh...i AAA1
|
|
|
|
jk...l
|
|
mn...o
|
|
pq...r AAA2
|
|
|
|
|
|
|
|
kbs ddd
|
|
dif cccc
|
|
--------------------------------------------------------------------------------
|
|
[CMD] qseawk --newline=on -d- -f lang-037.awk lang-037.dat </dev/stdin 2>&1
|
|
--------------------------------------------------------------------------------
|
|
BEGIN {
|
|
RS = "\n-+\n";
|
|
first = 1;
|
|
}
|
|
|
|
{
|
|
if ((!(first)))
|
|
printf " ";
|
|
printf "%s",$0;
|
|
first = 0;
|
|
}
|
|
|
|
ab...c AAA
|
|
|
|
de...f
|
|
gh...i AAA1
|
|
|
|
jk...l
|
|
mn...o
|
|
pq...r AAA2
|
|
|
|
|
|
|
|
kbs ddd
|
|
dif cccc
|
|
--------------------------------------------------------------------------------
|
|
[CMD] qseawk --newline=on -d- -f lang-038.awk </dev/stdin 2>&1
|
|
--------------------------------------------------------------------------------
|
|
BEGIN {
|
|
xstr = "abcdefabcdefabcdef";
|
|
xsub = "abc";
|
|
xlen = length(xsub);
|
|
i = 1;
|
|
while ((i = index(xstr,xsub,i) > 0))
|
|
{
|
|
print i,substr(xstr,i,xlen);
|
|
i += xlen;
|
|
}
|
|
print "----------------";
|
|
i = 1;
|
|
while ((match(xstr,xsub,i) > 0))
|
|
{
|
|
print RSTART,substr(xstr,RSTART,RLENGTH);
|
|
i = (RSTART + RLENGTH);
|
|
}
|
|
}
|
|
|
|
1 abc
|
|
7 abc
|
|
13 abc
|
|
----------------
|
|
1 abc
|
|
7 abc
|
|
13 abc
|
|
--------------------------------------------------------------------------------
|
|
[CMD] qseawk --newline=on -d- -f lang-039.awk </dev/stdin 2>&1
|
|
--------------------------------------------------------------------------------
|
|
BEGIN {
|
|
print (length() 11);
|
|
print length(11);
|
|
}
|
|
|
|
011
|
|
2
|
|
--------------------------------------------------------------------------------
|
|
[CMD] qseawk --newline=on -d- -f lang-040.awk </dev/stdin 2>&1
|
|
--------------------------------------------------------------------------------
|
|
BEGIN {
|
|
for (x in y)
|
|
print x;
|
|
}
|
|
|
|
--------------------------------------------------------------------------------
|
|
[CMD] qseawk --newline=on -d- -f lang-041.awk </dev/stdin 2>&1
|
|
--------------------------------------------------------------------------------
|
|
BEGIN {
|
|
abc = 20;
|
|
print (abc 10);
|
|
}
|
|
|
|
2010
|
|
--------------------------------------------------------------------------------
|
|
[CMD] qseawk --newline=on -d- -f lang-042.awk </dev/stdin 2>&1
|
|
--------------------------------------------------------------------------------
|
|
BEGIN {
|
|
print //;
|
|
print /=/;
|
|
print /.*/;
|
|
a = 5;
|
|
a /= 10;
|
|
print a;
|
|
for (IGNORECASE = 0; (IGNORECASE <= 1); (IGNORECASE)++)
|
|
{
|
|
print "IGNORECASE=",IGNORECASE;
|
|
print ("abc" ~ /^[[:upper:]]+$/);
|
|
print ("abc" ~ /^[[:lower:]]+$/);
|
|
print ("ABC" ~ /^[[:upper:]]+$/);
|
|
print ("ABC" ~ /^[[:lower:]]+$/);
|
|
print ("AbC" ~ /^[[:upper:]]+$/);
|
|
print ("aBc" ~ /^[[:lower:]]+$/);
|
|
}
|
|
}
|
|
|
|
1
|
|
0
|
|
1
|
|
0.5
|
|
IGNORECASE= 0
|
|
0
|
|
1
|
|
1
|
|
0
|
|
0
|
|
0
|
|
IGNORECASE= 1
|
|
1
|
|
1
|
|
1
|
|
1
|
|
1
|
|
1
|
|
--------------------------------------------------------------------------------
|
|
[CMD] qseawk --newline=on -d- -f lang-043.awk lang-043.dat </dev/stdin 2>&1
|
|
--------------------------------------------------------------------------------
|
|
BEGIN {
|
|
RS = "[\t\n\v\f\r ]*[\r\n]+[\t\n\v\f\r ]*";
|
|
}
|
|
|
|
{
|
|
print $0;
|
|
}
|
|
|
|
abcd
|
|
dcba
|
|
j
|
|
--------------------------------------------------------------------------------
|
|
[CMD] qseawk --newline=on -d- -f lang-044.awk lang-044.dat </dev/stdin 2>&1
|
|
--------------------------------------------------------------------------------
|
|
BEGIN {
|
|
RS = "";
|
|
}
|
|
|
|
{
|
|
print (("[" $0) "]");
|
|
}
|
|
|
|
[abc
|
|
this is the second line]
|
|
[def
|
|
vwxyz
|
|
this is the second second line]
|
|
[ ttttt
|
|
killer]
|
|
--------------------------------------------------------------------------------
|
|
[CMD] qseawk --newline=on -d- -f lang-045.awk </dev/stdin 2>&1
|
|
--------------------------------------------------------------------------------
|
|
BEGIN {
|
|
for (i = -10.000000; (i < 10.0); (i)++)
|
|
{
|
|
print sin(i);
|
|
print cos(i);
|
|
print tan(i);
|
|
print atan(i);
|
|
print atan2(i,1);
|
|
print log(i);
|
|
print exp(i);
|
|
print sqrt(i);
|
|
}
|
|
}
|
|
|
|
0.544021
|
|
-0.839072
|
|
-0.648361
|
|
-1.47113
|
|
-1.47113
|
|
nan
|
|
4.53999e-05
|
|
-nan
|
|
-0.412118
|
|
-0.91113
|
|
0.452316
|
|
-1.46014
|
|
-1.46014
|
|
nan
|
|
0.00012341
|
|
-nan
|
|
-0.989358
|
|
-0.1455
|
|
6.79971
|
|
-1.44644
|
|
-1.44644
|
|
nan
|
|
0.000335463
|
|
-nan
|
|
-0.656987
|
|
0.753902
|
|
-0.871448
|
|
-1.4289
|
|
-1.4289
|
|
nan
|
|
0.000911882
|
|
-nan
|
|
0.279415
|
|
0.96017
|
|
0.291006
|
|
-1.40565
|
|
-1.40565
|
|
nan
|
|
0.00247875
|
|
-nan
|
|
0.958924
|
|
0.283662
|
|
3.38052
|
|
-1.3734
|
|
-1.3734
|
|
nan
|
|
0.00673795
|
|
-nan
|
|
0.756802
|
|
-0.653644
|
|
-1.15782
|
|
-1.32582
|
|
-1.32582
|
|
nan
|
|
0.0183156
|
|
-nan
|
|
-0.14112
|
|
-0.989992
|
|
0.142547
|
|
-1.24905
|
|
-1.24905
|
|
nan
|
|
0.0497871
|
|
-nan
|
|
-0.909297
|
|
-0.416147
|
|
2.18504
|
|
-1.10715
|
|
-1.10715
|
|
nan
|
|
0.135335
|
|
-nan
|
|
-0.841471
|
|
0.540302
|
|
-1.55741
|
|
-0.785398
|
|
-0.785398
|
|
nan
|
|
0.367879
|
|
-nan
|
|
0
|
|
1
|
|
0
|
|
0
|
|
0
|
|
-inf
|
|
1
|
|
0
|
|
0.841471
|
|
0.540302
|
|
1.55741
|
|
0.785398
|
|
0.785398
|
|
0
|
|
2.71828
|
|
1
|
|
0.909297
|
|
-0.416147
|
|
-2.18504
|
|
1.10715
|
|
1.10715
|
|
0.693147
|
|
7.38906
|
|
1.41421
|
|
0.14112
|
|
-0.989992
|
|
-0.142547
|
|
1.24905
|
|
1.24905
|
|
1.09861
|
|
20.0855
|
|
1.73205
|
|
-0.756802
|
|
-0.653644
|
|
1.15782
|
|
1.32582
|
|
1.32582
|
|
1.38629
|
|
54.5982
|
|
2
|
|
-0.958924
|
|
0.283662
|
|
-3.38052
|
|
1.3734
|
|
1.3734
|
|
1.60944
|
|
148.413
|
|
2.23607
|
|
-0.279415
|
|
0.96017
|
|
-0.291006
|
|
1.40565
|
|
1.40565
|
|
1.79176
|
|
403.429
|
|
2.44949
|
|
0.656987
|
|
0.753902
|
|
0.871448
|
|
1.4289
|
|
1.4289
|
|
1.94591
|
|
1096.63
|
|
2.64575
|
|
0.989358
|
|
-0.1455
|
|
-6.79971
|
|
1.44644
|
|
1.44644
|
|
2.07944
|
|
2980.96
|
|
2.82843
|
|
0.412118
|
|
-0.91113
|
|
-0.452316
|
|
1.46014
|
|
1.46014
|
|
2.19722
|
|
8103.08
|
|
3
|
|
--------------------------------------------------------------------------------
|
|
[CMD] qseawk --newline=on -d- -vdatadir=awk -vdatafile=lang-046.dat1 -f lang-046.awk lang-046.dat2 </dev/stdin 2>&1
|
|
--------------------------------------------------------------------------------
|
|
1
|
|
|
|
((getline < ((datadir "/") datafile)) >= 0)
|
|
|
|
2 AAAAAAAAAAAAAAAAAAAAAAAAA
|
|
1 AAAAAAAAAAAAAAAAAAAAAAAAA
|
|
2 BBBBBBBBBBBBBBBBBBBBBBBBB
|
|
1 BBBBBBBBBBBBBBBBBBBBBBBBB
|
|
2 CCCCCCCCCCCCCCCCCCCCCCCCC
|
|
1 CCCCCCCCCCCCCCCCCCCCCCCCC
|
|
2 DDDDDDDDDDDDDDDDDDDDDDDDD
|
|
1 DDDDDDDDDDDDDDDDDDDDDDDDD
|
|
--------------------------------------------------------------------------------
|
|
[CMD] qseawk --newline=on --tolerant=on -d- -f lang-047.awk </dev/stdin 2>&1
|
|
--------------------------------------------------------------------------------
|
|
BEGIN {
|
|
print (print (print (print 10)));
|
|
print (print 10 > "/tmp/should/not/be/creatable");
|
|
if (((print 10 > "/tmp/should/not/be/creatable") <= -1))
|
|
print "FAILURE";
|
|
else
|
|
print "SUCCESS";
|
|
print "------------------------------------";
|
|
a = (1 (print 10 > "/tmp/should/not/be/creatable"));
|
|
print a;
|
|
print "------------------------------------";
|
|
b = (++(a) (print 10));
|
|
printf "%d\n",b;
|
|
print "------------------------------------";
|
|
printf ("%d\n",(b + ((print (print (print 80))) + 40)));
|
|
print "------------------------------------";
|
|
printf ("%d\n",(b + ((print (print (print (30 50)))) + 40)));
|
|
print "------------------------------------";
|
|
$(print 0 > "/dev/null") = "this is wonderful";
|
|
print $0;
|
|
print "------------------------------------";
|
|
$((getline dummy) > "/dev/zero") = "that";
|
|
print $0;
|
|
print "------------------------------------";
|
|
x[0] = 20;
|
|
abc = ((print ("hello","world",(1,abc = 20,abc = 45))) in x);
|
|
print abc;
|
|
}
|
|
|
|
10
|
|
0
|
|
0
|
|
0
|
|
-1
|
|
FAILURE
|
|
------------------------------------
|
|
1-1
|
|
------------------------------------
|
|
10
|
|
20
|
|
------------------------------------
|
|
80
|
|
0
|
|
0
|
|
60
|
|
------------------------------------
|
|
3050
|
|
0
|
|
0
|
|
60
|
|
------------------------------------
|
|
this is wonderful
|
|
------------------------------------
|
|
that is wonderful
|
|
------------------------------------
|
|
hello world 45
|
|
1
|
|
--------------------------------------------------------------------------------
|
|
[CMD] qseawk --newline=on -d- -f lang-048.awk </dev/stdin 2>&1
|
|
--------------------------------------------------------------------------------
|
|
function int2ip (__p0, __p1, __p2)
|
|
{
|
|
__p1 = (__p0 & 255);
|
|
__p0 = (__p0 >> 8);
|
|
for (; (__p2 < 3); (__p2)++)
|
|
{
|
|
__p1 = (((__p0 & 255) ".") __p1);
|
|
__p0 = (__p0 >> 8);
|
|
}
|
|
return __p1;
|
|
}
|
|
|
|
function ip2int (__p0)
|
|
{
|
|
ret = 0;
|
|
n = split(__p0,a,".");
|
|
for (x = 1; (x <= n); (x)++)
|
|
ret = ((ret << 8) | a[x]);
|
|
return ret;
|
|
}
|
|
|
|
BEGIN {
|
|
print int2ip(ip2int("255.255.255.0"));
|
|
print int2ip(ip2int("255.0.255.0"));
|
|
print int2ip(ip2int("127.0.0.1"));
|
|
print int2ip(ip2int("192.168.1.1"));
|
|
}
|
|
|
|
255.255.255.0
|
|
255.0.255.0
|
|
127.0.0.1
|
|
192.168.1.1
|
|
--------------------------------------------------------------------------------
|
|
[CMD] qseawk --newline=on -d- -f lang-049.awk </dev/stdin 2>&1
|
|
--------------------------------------------------------------------------------
|
|
ERROR: CODE 62 LINE 2 COLUMN 9 FILE lang-049.awk - no argument provided
|
|
--------------------------------------------------------------------------------
|
|
[CMD] qseawk --newline=on --flexmap=off -d- -f lang-050.awk </dev/stdin 2>&1
|
|
--------------------------------------------------------------------------------
|
|
BEGIN {
|
|
a = 20;
|
|
a[10] = 30;
|
|
for (i in a)
|
|
print i,a[i];
|
|
}
|
|
|
|
ERROR: CODE 91 LINE 6 COLUMN 2 FILE lang-050.awk - cannot change a scalar to a map
|
|
--------------------------------------------------------------------------------
|
|
[CMD] qseawk --newline=on --flexmap=on -d- -f lang-050.awk </dev/stdin 2>&1
|
|
--------------------------------------------------------------------------------
|
|
BEGIN {
|
|
a = 20;
|
|
a[10] = 30;
|
|
for (i in a)
|
|
print i,a[i];
|
|
}
|
|
|
|
10 30
|
|
--------------------------------------------------------------------------------
|
|
[CMD] qseawk --newline=on --flexmap=off -d- -f lang-051.awk </dev/stdin 2>&1
|
|
--------------------------------------------------------------------------------
|
|
BEGIN {
|
|
split("a b c d e",ARGC);
|
|
for (i in ARGC)
|
|
print i,ARGC[i];
|
|
}
|
|
|
|
ERROR: CODE 94 LINE 7 COLUMN 2 FILE lang-051.awk - cannot change a scalar 'ARGC' to a map
|
|
--------------------------------------------------------------------------------
|
|
[CMD] qseawk --newline=on --flexmap=on -d- -f lang-051.awk </dev/stdin 2>&1
|
|
--------------------------------------------------------------------------------
|
|
BEGIN {
|
|
split("a b c d e",ARGC);
|
|
for (i in ARGC)
|
|
print i,ARGC[i];
|
|
}
|
|
|
|
1 a
|
|
2 b
|
|
3 c
|
|
4 d
|
|
5 e
|
|
--------------------------------------------------------------------------------
|
|
[CMD] qseawk --newline=on --flexmap=off -d- -f lang-052.awk </dev/stdin 2>&1
|
|
--------------------------------------------------------------------------------
|
|
BEGIN {
|
|
split("a b c d e",ARGV);
|
|
for (i in ARGV)
|
|
print i,ARGV[i];
|
|
}
|
|
|
|
1 a
|
|
2 b
|
|
3 c
|
|
4 d
|
|
5 e
|
|
--------------------------------------------------------------------------------
|
|
[CMD] qseawk --newline=on --flexmap=on -d- -f lang-052.awk </dev/stdin 2>&1
|
|
--------------------------------------------------------------------------------
|
|
BEGIN {
|
|
split("a b c d e",ARGV);
|
|
for (i in ARGV)
|
|
print i,ARGV[i];
|
|
}
|
|
|
|
1 a
|
|
2 b
|
|
3 c
|
|
4 d
|
|
5 e
|
|
--------------------------------------------------------------------------------
|
|
[CMD] qseawk --newline=on --flexmap=off -d- -f lang-053.awk </dev/stdin 2>&1
|
|
--------------------------------------------------------------------------------
|
|
BEGIN {
|
|
a[1] = 1;
|
|
a[2] = 2;
|
|
b[4] = 4;
|
|
b[5] = 5;
|
|
a = b;
|
|
for (i in a)
|
|
print i,a[i];
|
|
}
|
|
|
|
ERROR: CODE 92 LINE 10 COLUMN 2 FILE lang-053.awk - cannot change a map 'a' to another map
|
|
--------------------------------------------------------------------------------
|
|
[CMD] qseawk --newline=on --flexmap=on -d- -f lang-053.awk </dev/stdin 2>&1
|
|
--------------------------------------------------------------------------------
|
|
BEGIN {
|
|
a[1] = 1;
|
|
a[2] = 2;
|
|
b[4] = 4;
|
|
b[5] = 5;
|
|
a = b;
|
|
for (i in a)
|
|
print i,a[i];
|
|
}
|
|
|
|
4 4
|
|
5 5
|
|
--------------------------------------------------------------------------------
|
|
[CMD] qseawk --newline=on --flexmap=off -d- -f lang-054.awk </dev/stdin 2>&1
|
|
--------------------------------------------------------------------------------
|
|
BEGIN {
|
|
print getioattr("xxxx","rtimeout",ARGV);
|
|
print ARGV;
|
|
}
|
|
|
|
ERROR: CODE 93 LINE 4 COLUMN 8 FILE lang-054.awk - cannot change a map 'ARGV' to a scalar
|
|
--------------------------------------------------------------------------------
|
|
[CMD] qseawk --newline=on --flexmap=on -d- -f lang-054.awk </dev/stdin 2>&1
|
|
--------------------------------------------------------------------------------
|
|
BEGIN {
|
|
print getioattr("xxxx","rtimeout",ARGV);
|
|
print ARGV;
|
|
}
|
|
|
|
0
|
|
-999
|
|
--------------------------------------------------------------------------------
|
|
[CMD] qseawk --newline=on -F: -f columnate.awk passwd.dat </dev/stdin 2>&1
|
|
--------------------------------------------------------------------------------
|
|
root x 0 0 root /root /bin/bash
|
|
daemon x 1 1 daemon /usr/sbin /bin/sh
|
|
bin x 2 2 bin /bin /bin/sh
|
|
sys x 3 3 sys /dev /bin/sh
|
|
sync x 4 65534 sync /bin /bin/sync
|
|
games x 5 60 games /usr/games /bin/sh
|
|
man x 6 12 man /var/cache/man /bin/sh
|
|
lp x 7 7 lp /var/spool/lpd /bin/sh
|
|
mail x 8 8 mail /var/mail /bin/sh
|
|
news x 9 9 news /var/spool/news /bin/sh
|
|
uucp x 10 10 uucp /var/spool/uucp /bin/sh
|
|
proxy x 13 13 proxy /bin /bin/sh
|
|
www-data x 33 33 www-data /var/www /bin/sh
|
|
backup x 34 34 backup /var/backups /bin/sh
|
|
list x 38 38 Mailing List Manager /var/list /bin/sh
|
|
irc x 39 39 ircd /var/run/ircd /bin/sh
|
|
gnats x 41 41 Gnats Bug-Reporting System (admin) /var/lib/gnats /bin/sh
|
|
nobody x 65534 65534 nobody /nonexistent /bin/sh
|
|
libuuid x 100 101 /var/lib/libuuid /bin/sh
|
|
syslog x 101 102 /home/syslog /bin/false
|
|
klog x 102 103 /home/klog /bin/false
|
|
hplip x 103 7 HPLIP system user,,, /var/run/hplip /bin/false
|
|
avahi-autoipd x 104 110 Avahi autoip daemon,,, /var/lib/avahi-autoipd /bin/false
|
|
gdm x 105 111 Gnome Display Manager /var/lib/gdm /bin/false
|
|
saned x 106 113 /home/saned /bin/false
|
|
pulse x 107 114 PulseAudio daemon,,, /var/run/pulse /bin/false
|
|
messagebus x 108 117 /var/run/dbus /bin/false
|
|
polkituser x 109 118 PolicyKit,,, /var/run/PolicyKit /bin/false
|
|
avahi x 110 119 Avahi mDNS daemon,,, /var/run/avahi-daemon /bin/false
|
|
haldaemon x 111 120 Hardware abstraction layer,,, /var/run/hald /bin/false
|
|
statd x 112 65534 /var/lib/nfs /bin/false
|
|
sshd x 113 65534 /var/run/sshd /usr/sbin/nologin
|
|
speech-dispatcher x 114 29 Speech Dispatcher,,, /var/run/speech-dispatcher /bin/sh
|
|
couchdb x 115 116 CouchDB Administrator,,, /var/lib/couchdb /bin/bash
|
|
kernoops x 116 65534 Kernel Oops Tracking Daemon,,, / /bin/false
|
|
mysql x 117 124 MySQL Server,,, /var/lib/mysql /bin/false
|
|
openldap x 118 125 OpenLDAP Server Account,,, /nonexistent /bin/false
|
|
postfix x 119 126 /var/spool/postfix /bin/false
|
|
--------------------------------------------------------------------------------
|
|
[CMD] qseawk --newline=on -f levenshtein-utests.awk </dev/stdin 2>&1
|
|
--------------------------------------------------------------------------------
|
|
3: Correct distance between 'kitten' and 'sitting'
|
|
3: Correct distance between 'Saturday' and 'Sunday'
|
|
1: Correct distance between 'acc' and 'ac'
|
|
2: Correct distance between 'foo' and 'four'
|
|
0: Correct distance between 'foo' and 'foo'
|
|
2: Correct distance between 'cow' and 'cat'
|
|
5: Correct distance between 'cat' and 'moocow'
|
|
5: Correct distance between 'cat' and 'cowmoo'
|
|
1: Correct distance between 'sebastian' and 'sebastien'
|
|
5: Correct distance between 'more' and 'cowbell'
|
|
1: Correct distance between 'freshpack' and 'freshpak'
|
|
1: Correct distance between 'freshpak' and 'freshpack'
|
|
--------------------------------------------------------------------------------
|
|
[CMD] qseawk --newline=on -v target=89000 -f rcalc.awk </dev/stdin 2>&1
|
|
--------------------------------------------------------------------------------
|
|
Result Ra Rb Connect Error
|
|
|
|
88800.00 82000 6800 series -0.22%
|
|
89000.00 56000 33000 series
|
|
89000.00 62000 27000 series
|
|
89130.43 820000 100000 parallel +0.15%
|
|
89137.93 470000 110000 parallel +0.15%
|
|
89189.19 220000 150000 parallel +0.21%
|
|
--------------------------------------------------------------------------------
|
|
[CMD] qseawk -f quicksort.awk quicksort.dat </dev/stdin 2>&1
|
|
--------------------------------------------------------------------------------
|
|
0.0000000000
|
|
0.11111111111111111111111111111
|
|
1
|
|
0xA
|
|
11.2839091
|
|
12
|
|
29
|
|
0b11111
|
|
34
|
|
35
|
|
92
|
|
301
|
|
493
|
|
19123
|
|
1.E12
|
|
99X
|
|
--------------------------------------------------------------------------------
|
|
[CMD] qseawk -vQSEAWK="/home/hyung-hwan/workspace/qse/bld/x86_64-linux-wchar-debug-shared/cmd/awk/.libs/qseawk" -vSCRIPT_PATH="awk" -f quicksort2.awk quicksort2.dat </dev/stdin 2>&1
|
|
--------------------------------------------------------------------------------
|
|
0.0000000000
|
|
0.11111111111111111111111111111
|
|
1
|
|
0xA
|
|
11.2839091
|
|
12
|
|
29
|
|
0b11111
|
|
34
|
|
35
|
|
92
|
|
301
|
|
493
|
|
19123
|
|
1.E12
|
|
99X
|
|
--------------------------------------------------------------------------------
|
|
[CMD] qseawk -f asm.awk asm.s <asm.dat 2>&1
|
|
--------------------------------------------------------------------------------
|
|
549
|
|
--------------------------------------------------------------------------------
|
|
[CMD] qseawk -f stripcomment.awk stripcomment.dat </dev/stdin 2>&1
|
|
--------------------------------------------------------------------------------
|
|
|
|
|
|
#include <stdio.h>
|
|
int main ()
|
|
{
|
|
|
|
printf ("hello, world\n");
|
|
return 0;
|
|
}
|
|
--------------------------------------------------------------------------------
|
|
[CMD] qseawk -f wordfreq.awk wordfreq.awk </dev/stdin 2>&1
|
|
--------------------------------------------------------------------------------
|
|
_ 2
|
|
a 2
|
|
print 2
|
|
case 1
|
|
tolower 1
|
|
i 4
|
|
freq 3
|
|
distinctions 1
|
|
frequencies 1
|
|
list 1
|
|
alnum 2
|
|
nf 1
|
|
punctuation 1
|
|
remove 2
|
|
awk 1
|
|
end 1
|
|
gsub 2
|
|
of 1
|
|
word 4
|
|
wordfreq 1
|
|
for 2
|
|
in 1
|
|
0 3
|
|
1 1
|
|
blank 2
|
|
--------------------------------------------------------------------------------
|
|
[CMD] qseawk -f hanoi.awk </dev/stdin 2>&1
|
|
--------------------------------------------------------------------------------
|
|
0 54321
|
|
1
|
|
2
|
|
|
|
0 5432
|
|
1 1
|
|
2
|
|
|
|
0 543
|
|
1 1
|
|
2 2
|
|
|
|
0 543
|
|
1
|
|
2 21
|
|
|
|
0 54
|
|
1 3
|
|
2 21
|
|
|
|
0 541
|
|
1 3
|
|
2 2
|
|
|
|
0 541
|
|
1 32
|
|
2
|
|
|
|
0 54
|
|
1 321
|
|
2
|
|
|
|
0 5
|
|
1 321
|
|
2 4
|
|
|
|
0 5
|
|
1 32
|
|
2 41
|
|
|
|
0 52
|
|
1 3
|
|
2 41
|
|
|
|
0 521
|
|
1 3
|
|
2 4
|
|
|
|
0 521
|
|
1
|
|
2 43
|
|
|
|
0 52
|
|
1 1
|
|
2 43
|
|
|
|
0 5
|
|
1 1
|
|
2 432
|
|
|
|
0 5
|
|
1
|
|
2 4321
|
|
|
|
0
|
|
1 5
|
|
2 4321
|
|
|
|
0 1
|
|
1 5
|
|
2 432
|
|
|
|
0 1
|
|
1 52
|
|
2 43
|
|
|
|
0
|
|
1 521
|
|
2 43
|
|
|
|
0 3
|
|
1 521
|
|
2 4
|
|
|
|
0 3
|
|
1 52
|
|
2 41
|
|
|
|
0 32
|
|
1 5
|
|
2 41
|
|
|
|
0 321
|
|
1 5
|
|
2 4
|
|
|
|
0 321
|
|
1 54
|
|
2
|
|
|
|
0 32
|
|
1 541
|
|
2
|
|
|
|
0 3
|
|
1 541
|
|
2 2
|
|
|
|
0 3
|
|
1 54
|
|
2 21
|
|
|
|
0
|
|
1 543
|
|
2 21
|
|
|
|
0 1
|
|
1 543
|
|
2 2
|
|
|
|
0 1
|
|
1 5432
|
|
2
|
|
|
|
0
|
|
1 54321
|
|
2
|
|
|
|
--------------------------------------------------------------------------------
|
|
[CMD] qseawk -f indent.awk indent.dat </dev/stdin 2>&1
|
|
--------------------------------------------------------------------------------
|
|
#!/bin/sh
|
|
|
|
if [ $# -ne 0 ]
|
|
then
|
|
echo "not the right usage"
|
|
exit 1
|
|
fi
|
|
|
|
while true
|
|
do
|
|
sleep 20
|
|
done
|
|
--------------------------------------------------------------------------------
|
|
[CMD] qseawk -d- -f lisp/awklisp lisp/startup lisp/fib.lsp </dev/stdin 2>&1
|
|
--------------------------------------------------------------------------------
|
|
function eval_rands (__p0)
|
|
{
|
|
for (; (__p0 != NIL); __p0 = cdr[__p0])
|
|
stack[(stack_ptr)++] = eval(car[__p0]);
|
|
}
|
|
|
|
function def_prim (__p0, __p1, __p2)
|
|
{
|
|
__p2 = string_to_symbol(__p0);
|
|
value[__p2] = string_to_symbol(sprintf("#<Primitive %s>",__p0));
|
|
if ((__p1 != ""))
|
|
num_params[value[__p2]] = __p1;
|
|
return value[__p2];
|
|
}
|
|
|
|
function is_symbol (__p0)
|
|
{
|
|
return ((__p0 % 4) == 2);
|
|
}
|
|
|
|
function is_number (__p0)
|
|
{
|
|
return ((__p0 % 4) == 0);
|
|
}
|
|
|
|
function read (__p0, __p1)
|
|
{
|
|
skip_blanks();
|
|
if ((token == eof))
|
|
if (__p0)
|
|
error("Unexpected EOF");
|
|
else
|
|
return THE_EOF_OBJECT;
|
|
if ((token == "("))
|
|
{
|
|
advance();
|
|
__p1 = NIL;
|
|
for (; ; )
|
|
{
|
|
skip_blanks();
|
|
if ((token == "."))
|
|
{
|
|
advance();
|
|
after_dot = read(1);
|
|
skip_blanks();
|
|
if ((token != ")"))
|
|
error("')' expected");
|
|
advance();
|
|
return nreverse(__p1,after_dot);
|
|
}
|
|
else
|
|
if ((token == ")"))
|
|
{
|
|
advance();
|
|
return nreverse(__p1,NIL);
|
|
}
|
|
else
|
|
{
|
|
protect(__p1);
|
|
__p1 = cons(read(1),__p1);
|
|
unprotect();
|
|
}
|
|
}
|
|
}
|
|
else
|
|
if ((token == "'"))
|
|
{
|
|
advance();
|
|
return cons(QUOTE,cons(read(1),NIL));
|
|
}
|
|
else
|
|
if ((token ~ /^-?[0-9]+$/))
|
|
{
|
|
__p1 = make_number(token);
|
|
advance();
|
|
return __p1;
|
|
}
|
|
else
|
|
{
|
|
__p1 = string_to_symbol(token);
|
|
advance();
|
|
return __p1;
|
|
}
|
|
}
|
|
|
|
function protect (__p0)
|
|
{
|
|
protected[++(protected_ptr)] = __p0;
|
|
}
|
|
|
|
function mark (__p0)
|
|
{
|
|
while ((is_pair(__p0) && (!((__p0 in marks)))))
|
|
{
|
|
marks[__p0] = 1;
|
|
mark(car[__p0]);
|
|
__p0 = cdr[__p0];
|
|
}
|
|
}
|
|
|
|
function write_expr (__p0)
|
|
{
|
|
if (is_atom(__p0))
|
|
{
|
|
if ((!(is_symbol(__p0))))
|
|
printf ("%d",numeric_value(__p0));
|
|
else
|
|
{
|
|
if ((!((__p0 in printname))))
|
|
error((("BUG: " __p0) " has no printname"));
|
|
printf ("%s",printname[__p0]);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
printf "(";
|
|
write_expr(car[__p0]);
|
|
for (__p0 = cdr[__p0]; is_pair(__p0); __p0 = cdr[__p0])
|
|
{
|
|
printf " ";
|
|
write_expr(car[__p0]);
|
|
}
|
|
if ((__p0 != NIL))
|
|
{
|
|
printf " . ";
|
|
write_expr(__p0);
|
|
}
|
|
printf ")";
|
|
}
|
|
}
|
|
|
|
function make_number (__p0)
|
|
{
|
|
return (__p0 * 4);
|
|
}
|
|
|
|
function print_expr (__p0)
|
|
{
|
|
write_expr(__p0);
|
|
print "";
|
|
}
|
|
|
|
function progn (__p0)
|
|
{
|
|
for (; (cdr[__p0] != NIL); __p0 = cdr[__p0])
|
|
eval(car[__p0]);
|
|
return eval(car[__p0]);
|
|
}
|
|
|
|
function string_to_symbol (__p0)
|
|
{
|
|
if ((__p0 in intern))
|
|
return intern[__p0];
|
|
symbol_ptr += 4;
|
|
intern[__p0] = symbol_ptr;
|
|
printname[symbol_ptr] = __p0;
|
|
return symbol_ptr;
|
|
}
|
|
|
|
function cons (__p0, __p1)
|
|
{
|
|
while ((pair_ptr in marks))
|
|
{
|
|
delete marks[pair_ptr];
|
|
pair_ptr += 4;
|
|
}
|
|
if ((pair_ptr == pair_limit))
|
|
gc(__p0,__p1);
|
|
car[pair_ptr] = __p0;
|
|
cdr[pair_ptr] = __p1;
|
|
pair_ptr += 4;
|
|
return (pair_ptr - 4);
|
|
}
|
|
|
|
function listify_args (__p0, __p1)
|
|
{
|
|
__p1 = NIL;
|
|
for (__p0 = (stack_ptr - 1); (frame_ptr <= __p0); --(__p0))
|
|
__p1 = cons(stack[__p0],__p1);
|
|
return __p1;
|
|
}
|
|
|
|
function numeric_value (__p0)
|
|
{
|
|
if (((__p0 % 4) != 0))
|
|
error("Not a number");
|
|
return (__p0 / 4);
|
|
}
|
|
|
|
function skip_blanks ()
|
|
{
|
|
while ((token ~ /^[ ]*$/))
|
|
advance();
|
|
}
|
|
|
|
function apply (__p0)
|
|
{
|
|
if (profiling)
|
|
++(call_count[__p0]);
|
|
if ((car[__p0] == LAMBDA))
|
|
{
|
|
extend_env(car[cdr[__p0]]);
|
|
result = progn(cdr[cdr[__p0]]);
|
|
unwind_env(car[cdr[__p0]]);
|
|
return result;
|
|
}
|
|
if (((__p0 in num_params) && (num_params[__p0] != (stack_ptr - frame_ptr))))
|
|
error(("Wrong number of arguments to " printname[cdr[__p0]]));
|
|
if ((__p0 == CAR))
|
|
return car[is(a_pair,stack[frame_ptr])];
|
|
if ((__p0 == CDR))
|
|
return cdr[is(a_pair,stack[frame_ptr])];
|
|
if ((__p0 == CONS))
|
|
return cons(stack[frame_ptr],stack[(frame_ptr + 1)]);
|
|
if ((__p0 == NULL))
|
|
return ((stack[frame_ptr] == NIL))?T:NIL;
|
|
if ((__p0 == EQ))
|
|
return ((stack[frame_ptr] == stack[(frame_ptr + 1)]))?T:NIL;
|
|
if ((__p0 == ATOMP))
|
|
return (is_atom(stack[frame_ptr]))?T:NIL;
|
|
if ((__p0 == ADD))
|
|
return (is(a_number,stack[frame_ptr]) + is(a_number,stack[(frame_ptr + 1)]));
|
|
if ((__p0 == SUB))
|
|
return (is(a_number,stack[frame_ptr]) - is(a_number,stack[(frame_ptr + 1)]));
|
|
if ((__p0 == MUL))
|
|
return make_number((numeric_value(stack[frame_ptr]) * numeric_value(stack[(frame_ptr + 1)])));
|
|
if ((__p0 == DIV))
|
|
return make_number(int((numeric_value(stack[frame_ptr]) / numeric_value(stack[(frame_ptr + 1)]))));
|
|
if ((__p0 == MOD))
|
|
return make_number((numeric_value(stack[frame_ptr]) % numeric_value(stack[(frame_ptr + 1)])));
|
|
if ((__p0 == LT))
|
|
return (((stack[frame_ptr] + 0) < (stack[(frame_ptr + 1)] + 0)))?T:NIL;
|
|
if ((__p0 == GET))
|
|
return (((stack[frame_ptr],stack[(frame_ptr + 1)]) in property))?property[stack[frame_ptr],stack[(frame_ptr + 1)]]:NIL;
|
|
if ((__p0 == PUT))
|
|
return property[stack[frame_ptr],stack[(frame_ptr + 1)]] = stack[(frame_ptr + 2)];
|
|
if ((__p0 == CADR))
|
|
return car[is(a_pair,cdr[is(a_pair,stack[frame_ptr])])];
|
|
if ((__p0 == CDDR))
|
|
return cdr[is(a_pair,cdr[is(a_pair,stack[frame_ptr])])];
|
|
if ((__p0 == LIST))
|
|
return listify_args();
|
|
if ((__p0 == SYMBOLP))
|
|
return (is_symbol(stack[frame_ptr]))?T:NIL;
|
|
if ((__p0 == PAIRP))
|
|
return (is_pair(stack[frame_ptr]))?T:NIL;
|
|
if ((__p0 == NUMBERP))
|
|
return (is_number(stack[frame_ptr]))?T:NIL;
|
|
if ((__p0 == SETCAR))
|
|
return car[is(a_pair,stack[frame_ptr])] = stack[(frame_ptr + 1)];
|
|
if ((__p0 == SETCDR))
|
|
return cdr[is(a_pair,stack[frame_ptr])] = stack[(frame_ptr + 1)];
|
|
if ((__p0 == APPLY))
|
|
return do_apply(stack[frame_ptr],stack[(frame_ptr + 1)]);
|
|
if ((__p0 == EVAL))
|
|
return eval(stack[frame_ptr]);
|
|
if ((__p0 == NREV))
|
|
return nreverse(stack[frame_ptr],NIL);
|
|
if ((__p0 == WRITE))
|
|
{
|
|
write_expr(stack[frame_ptr]);
|
|
printf " ";
|
|
return NIL;
|
|
}
|
|
if ((__p0 == NEWLINE))
|
|
{
|
|
printf "\n";
|
|
return NIL;
|
|
}
|
|
if ((__p0 == READ))
|
|
return read();
|
|
if ((__p0 == RANDOM))
|
|
return make_number(int((rand() * numeric_value(stack[frame_ptr]))));
|
|
if ((__p0 == GENSYM))
|
|
return string_to_symbol(("#G" ++(gensym_counter)));
|
|
if ((__p0 == ERROR))
|
|
{
|
|
printf "Error!\n";
|
|
print_expr(listify_args());
|
|
exit 1;
|
|
}
|
|
error("Unknown procedure type");
|
|
}
|
|
|
|
function error (__p0)
|
|
{
|
|
print ("ERROR: " __p0) > "/dev/stderr";
|
|
exit 1;
|
|
}
|
|
|
|
function gc (__p0, __p1, __p2, __p3)
|
|
{
|
|
if (loud_gc)
|
|
printf "\nGC..." > "/dev/stderr";
|
|
mark(__p0);
|
|
mark(__p1);
|
|
for (__p2 in protected)
|
|
mark(protected[__p2]);
|
|
for (__p2 in stack)
|
|
mark(stack[__p2]);
|
|
for (__p2 in value)
|
|
mark(value[__p2]);
|
|
for (__p2 in property)
|
|
{
|
|
__p3 = index(SUBSEP,__p2);
|
|
mark(substr(__p2,1,(__p3 - 1)));
|
|
mark(substr(__p2,(__p3 + 1)));
|
|
mark(property[__p2]);
|
|
}
|
|
pair_ptr = a_pair;
|
|
while ((pair_ptr in marks))
|
|
{
|
|
delete marks[pair_ptr];
|
|
pair_ptr += 4;
|
|
}
|
|
if ((pair_ptr == pair_limit))
|
|
{
|
|
if (loud_gc)
|
|
printf "Expanding heap..." > "/dev/stderr";
|
|
pair_limit += (4 * heap_increment);
|
|
}
|
|
}
|
|
|
|
function extend_env (__p0, __p1, __p2)
|
|
{
|
|
for (__p1 = frame_ptr; (__p0 != NIL); __p0 = cdr[__p0])
|
|
{
|
|
if ((__p1 == stack_ptr))
|
|
error("Too many arguments to procedure");
|
|
__p2 = value[car[__p0]];
|
|
value[car[__p0]] = stack[__p1];
|
|
stack[__p1] = __p2;
|
|
++(__p1);
|
|
}
|
|
if ((__p1 != stack_ptr))
|
|
error("Not enough arguments to procedure");
|
|
}
|
|
|
|
function is_atom (__p0)
|
|
{
|
|
return ((__p0 % 4) != 1);
|
|
}
|
|
|
|
function is_pair (__p0)
|
|
{
|
|
return ((__p0 % 4) == 1);
|
|
}
|
|
|
|
function eval (__p0, __p1)
|
|
{
|
|
if (is_atom(__p0))
|
|
if (is_symbol(__p0))
|
|
{
|
|
if ((!((__p0 in value))))
|
|
error(("Unbound variable: " printname[__p0]));
|
|
return value[__p0];
|
|
}
|
|
else
|
|
return __p0;
|
|
op = car[__p0];
|
|
if ((!((op in is_special))))
|
|
{
|
|
__p1 = frame_ptr;
|
|
frame_ptr = stack_ptr;
|
|
eval_rands(cdr[__p0]);
|
|
protect(proc = eval(car[__p0]));
|
|
result = apply(proc);
|
|
unprotect();
|
|
stack_ptr = frame_ptr;
|
|
frame_ptr = __p1;
|
|
return result;
|
|
}
|
|
if ((op == QUOTE))
|
|
return car[cdr[__p0]];
|
|
if ((op == LAMBDA))
|
|
return __p0;
|
|
if ((op == IF))
|
|
return ((eval(car[cdr[__p0]]) != NIL))?eval(car[cdr[cdr[__p0]]]):eval(car[cdr[cdr[cdr[__p0]]]]);
|
|
if ((op == PROGN))
|
|
return progn(cdr[__p0]);
|
|
if ((op == SETQ))
|
|
{
|
|
if ((!((car[cdr[__p0]] in value))))
|
|
error(("Unbound variable: " printname[car[cdr[__p0]]]));
|
|
return value[car[cdr[__p0]]] = eval(car[cdr[cdr[__p0]]]);
|
|
}
|
|
if ((op == WHILE))
|
|
{
|
|
while ((eval(car[cdr[__p0]]) != NIL))
|
|
progn(cdr[cdr[__p0]]);
|
|
return NIL;
|
|
}
|
|
if ((op == DEFINE))
|
|
{
|
|
value[car[cdr[__p0]]] = eval(car[cdr[cdr[__p0]]]);
|
|
return car[cdr[__p0]];
|
|
}
|
|
error("BUG: Unknown special form");
|
|
}
|
|
|
|
function is (__p0, __p1)
|
|
{
|
|
if (((__p1 % 4) != __p0))
|
|
error(((("Expected a " type_name[__p0]) ", not a ") type_name[(__p1 % 4)]));
|
|
return __p1;
|
|
}
|
|
|
|
function unwind_env (__p0, __p1)
|
|
{
|
|
for (__p1 = frame_ptr; (__p0 != NIL); __p0 = cdr[__p0])
|
|
{
|
|
if ((stack[__p1] == ""))
|
|
delete value[car[__p0]];
|
|
else
|
|
value[car[__p0]] = stack[__p1];
|
|
++(__p1);
|
|
}
|
|
}
|
|
|
|
function nreverse (__p0, __p1, __p2)
|
|
{
|
|
while (is_pair(__p0))
|
|
{
|
|
__p2 = cdr[__p0];
|
|
cdr[__p0] = __p1;
|
|
__p1 = __p0;
|
|
__p0 = __p2;
|
|
}
|
|
if ((__p0 != NIL))
|
|
error("Not a proper list - reverse!");
|
|
return __p1;
|
|
}
|
|
|
|
function advance ()
|
|
{
|
|
if ((token == eof))
|
|
return eof;
|
|
if ((token == ""))
|
|
{
|
|
if (((getline line) <= 0))
|
|
{
|
|
token = eof;
|
|
return;
|
|
}
|
|
}
|
|
if (((match(line,"^[()'.]") || match(line,"^[_A-Za-z0-9=!@$%&*<>?+\\-*/:]+")) || match(line,"^[ \\t]+")))
|
|
{
|
|
token = substr(line,RSTART,RLENGTH);
|
|
line = substr(line,(RLENGTH + 1));
|
|
}
|
|
else
|
|
if (((line == "") || (substr(line,1,1) == ";")))
|
|
token = "";
|
|
else
|
|
error(("Lexical error starting at " line));
|
|
}
|
|
|
|
function do_apply (__p0, __p1, __p2)
|
|
{
|
|
__p2 = frame_ptr;
|
|
frame_ptr = stack_ptr;
|
|
for (; is_pair(__p1); __p1 = cdr[__p1])
|
|
stack[(stack_ptr)++] = car[__p1];
|
|
if ((__p1 != NIL))
|
|
error("Bad argument to APPLY: not a proper list");
|
|
result = apply(__p0);
|
|
stack_ptr = frame_ptr;
|
|
frame_ptr = __p2;
|
|
return result;
|
|
}
|
|
|
|
function unprotect ()
|
|
{
|
|
--(protected_ptr);
|
|
}
|
|
|
|
BEGIN {
|
|
a_number = 0;
|
|
pair_ptr = a_pair = 1;
|
|
symbol_ptr = a_symbol = 2;
|
|
type_name[a_number] = "number";
|
|
type_name[a_pair] = "pair";
|
|
type_name[a_symbol] = "symbol";
|
|
}
|
|
|
|
BEGIN {
|
|
srand();
|
|
frame_ptr = stack_ptr = 0;
|
|
if ((heap_increment == ""))
|
|
heap_increment = 1500;
|
|
pair_limit = (a_pair + (4 * heap_increment));
|
|
NIL = string_to_symbol("nil");
|
|
T = string_to_symbol("t");
|
|
value[NIL] = NIL;
|
|
value[T] = T;
|
|
car[NIL] = cdr[NIL] = NIL;
|
|
THE_EOF_OBJECT = string_to_symbol("#eof");
|
|
value[string_to_symbol("the-eof-object")] = THE_EOF_OBJECT;
|
|
eof = "(eof)";
|
|
QUOTE = string_to_symbol("quote");
|
|
is_special[QUOTE] = 1;
|
|
LAMBDA = string_to_symbol("lambda");
|
|
is_special[LAMBDA] = 1;
|
|
IF = string_to_symbol("if");
|
|
is_special[IF] = 1;
|
|
SETQ = string_to_symbol("set!");
|
|
is_special[SETQ] = 1;
|
|
DEFINE = string_to_symbol("define");
|
|
is_special[DEFINE] = 1;
|
|
PROGN = string_to_symbol("begin");
|
|
is_special[PROGN] = 1;
|
|
WHILE = string_to_symbol("while");
|
|
is_special[WHILE] = 1;
|
|
EQ = def_prim("eq?",2);
|
|
NULL = def_prim("null?",1);
|
|
CAR = def_prim("car",1);
|
|
CDR = def_prim("cdr",1);
|
|
CADR = def_prim("cadr",1);
|
|
CDDR = def_prim("cddr",1);
|
|
CONS = def_prim("cons",2);
|
|
LIST = def_prim("list");
|
|
EVAL = def_prim("eval",1);
|
|
APPLY = def_prim("apply",2);
|
|
READ = def_prim("read",0);
|
|
WRITE = def_prim("write",1);
|
|
NEWLINE = def_prim("newline",0);
|
|
ADD = def_prim("+",2);
|
|
SUB = def_prim("-",2);
|
|
MUL = def_prim("*",2);
|
|
DIV = def_prim("quotient",2);
|
|
MOD = def_prim("remainder",2);
|
|
LT = def_prim("<",2);
|
|
GET = def_prim("get",2);
|
|
PUT = def_prim("put",3);
|
|
ATOMP = def_prim("atom?",1);
|
|
PAIRP = def_prim("pair?",1);
|
|
SYMBOLP = def_prim("symbol?",1);
|
|
NUMBERP = def_prim("number?",1);
|
|
SETCAR = def_prim("set-car!",2);
|
|
SETCDR = def_prim("set-cdr!",2);
|
|
NREV = def_prim("reverse!",1);
|
|
GENSYM = def_prim("gensym",0);
|
|
RANDOM = def_prim("random",1);
|
|
ERROR = def_prim("error");
|
|
DRIVER = string_to_symbol("top-level-driver");
|
|
}
|
|
|
|
BEGIN {
|
|
for (; ; )
|
|
{
|
|
if (((DRIVER in value) && (value[DRIVER] != NIL)))
|
|
apply(value[DRIVER]);
|
|
else
|
|
{
|
|
expr = read();
|
|
if ((expr == THE_EOF_OBJECT))
|
|
break;
|
|
protect(expr);
|
|
print_expr(eval(expr));
|
|
unprotect();
|
|
}
|
|
}
|
|
if (profiling)
|
|
for (proc in call_count)
|
|
{
|
|
printf ("%5d ",call_count[proc]);
|
|
print_expr(proc);
|
|
}
|
|
}
|
|
|
|
--------------------------------------------------------------------------------
|
|
[CMD] qseawk -d- -f lisp/awklisp lisp/startup lisp/numbers lisp/numbers.dat </dev/stdin 2>&1
|
|
--------------------------------------------------------------------------------
|
|
function eval_rands (__p0)
|
|
{
|
|
for (; (__p0 != NIL); __p0 = cdr[__p0])
|
|
stack[(stack_ptr)++] = eval(car[__p0]);
|
|
}
|
|
|
|
function def_prim (__p0, __p1, __p2)
|
|
{
|
|
__p2 = string_to_symbol(__p0);
|
|
value[__p2] = string_to_symbol(sprintf("#<Primitive %s>",__p0));
|
|
if ((__p1 != ""))
|
|
num_params[value[__p2]] = __p1;
|
|
return value[__p2];
|
|
}
|
|
|
|
function is_symbol (__p0)
|
|
{
|
|
return ((__p0 % 4) == 2);
|
|
}
|
|
|
|
function is_number (__p0)
|
|
{
|
|
return ((__p0 % 4) == 0);
|
|
}
|
|
|
|
function read (__p0, __p1)
|
|
{
|
|
skip_blanks();
|
|
if ((token == eof))
|
|
if (__p0)
|
|
error("Unexpected EOF");
|
|
else
|
|
return THE_EOF_OBJECT;
|
|
if ((token == "("))
|
|
{
|
|
advance();
|
|
__p1 = NIL;
|
|
for (; ; )
|
|
{
|
|
skip_blanks();
|
|
if ((token == "."))
|
|
{
|
|
advance();
|
|
after_dot = read(1);
|
|
skip_blanks();
|
|
if ((token != ")"))
|
|
error("')' expected");
|
|
advance();
|
|
return nreverse(__p1,after_dot);
|
|
}
|
|
else
|
|
if ((token == ")"))
|
|
{
|
|
advance();
|
|
return nreverse(__p1,NIL);
|
|
}
|
|
else
|
|
{
|
|
protect(__p1);
|
|
__p1 = cons(read(1),__p1);
|
|
unprotect();
|
|
}
|
|
}
|
|
}
|
|
else
|
|
if ((token == "'"))
|
|
{
|
|
advance();
|
|
return cons(QUOTE,cons(read(1),NIL));
|
|
}
|
|
else
|
|
if ((token ~ /^-?[0-9]+$/))
|
|
{
|
|
__p1 = make_number(token);
|
|
advance();
|
|
return __p1;
|
|
}
|
|
else
|
|
{
|
|
__p1 = string_to_symbol(token);
|
|
advance();
|
|
return __p1;
|
|
}
|
|
}
|
|
|
|
function protect (__p0)
|
|
{
|
|
protected[++(protected_ptr)] = __p0;
|
|
}
|
|
|
|
function mark (__p0)
|
|
{
|
|
while ((is_pair(__p0) && (!((__p0 in marks)))))
|
|
{
|
|
marks[__p0] = 1;
|
|
mark(car[__p0]);
|
|
__p0 = cdr[__p0];
|
|
}
|
|
}
|
|
|
|
function write_expr (__p0)
|
|
{
|
|
if (is_atom(__p0))
|
|
{
|
|
if ((!(is_symbol(__p0))))
|
|
printf ("%d",numeric_value(__p0));
|
|
else
|
|
{
|
|
if ((!((__p0 in printname))))
|
|
error((("BUG: " __p0) " has no printname"));
|
|
printf ("%s",printname[__p0]);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
printf "(";
|
|
write_expr(car[__p0]);
|
|
for (__p0 = cdr[__p0]; is_pair(__p0); __p0 = cdr[__p0])
|
|
{
|
|
printf " ";
|
|
write_expr(car[__p0]);
|
|
}
|
|
if ((__p0 != NIL))
|
|
{
|
|
printf " . ";
|
|
write_expr(__p0);
|
|
}
|
|
printf ")";
|
|
}
|
|
}
|
|
|
|
function make_number (__p0)
|
|
{
|
|
return (__p0 * 4);
|
|
}
|
|
|
|
function print_expr (__p0)
|
|
{
|
|
write_expr(__p0);
|
|
print "";
|
|
}
|
|
|
|
function progn (__p0)
|
|
{
|
|
for (; (cdr[__p0] != NIL); __p0 = cdr[__p0])
|
|
eval(car[__p0]);
|
|
return eval(car[__p0]);
|
|
}
|
|
|
|
function string_to_symbol (__p0)
|
|
{
|
|
if ((__p0 in intern))
|
|
return intern[__p0];
|
|
symbol_ptr += 4;
|
|
intern[__p0] = symbol_ptr;
|
|
printname[symbol_ptr] = __p0;
|
|
return symbol_ptr;
|
|
}
|
|
|
|
function cons (__p0, __p1)
|
|
{
|
|
while ((pair_ptr in marks))
|
|
{
|
|
delete marks[pair_ptr];
|
|
pair_ptr += 4;
|
|
}
|
|
if ((pair_ptr == pair_limit))
|
|
gc(__p0,__p1);
|
|
car[pair_ptr] = __p0;
|
|
cdr[pair_ptr] = __p1;
|
|
pair_ptr += 4;
|
|
return (pair_ptr - 4);
|
|
}
|
|
|
|
function listify_args (__p0, __p1)
|
|
{
|
|
__p1 = NIL;
|
|
for (__p0 = (stack_ptr - 1); (frame_ptr <= __p0); --(__p0))
|
|
__p1 = cons(stack[__p0],__p1);
|
|
return __p1;
|
|
}
|
|
|
|
function numeric_value (__p0)
|
|
{
|
|
if (((__p0 % 4) != 0))
|
|
error("Not a number");
|
|
return (__p0 / 4);
|
|
}
|
|
|
|
function skip_blanks ()
|
|
{
|
|
while ((token ~ /^[ ]*$/))
|
|
advance();
|
|
}
|
|
|
|
function apply (__p0)
|
|
{
|
|
if (profiling)
|
|
++(call_count[__p0]);
|
|
if ((car[__p0] == LAMBDA))
|
|
{
|
|
extend_env(car[cdr[__p0]]);
|
|
result = progn(cdr[cdr[__p0]]);
|
|
unwind_env(car[cdr[__p0]]);
|
|
return result;
|
|
}
|
|
if (((__p0 in num_params) && (num_params[__p0] != (stack_ptr - frame_ptr))))
|
|
error(("Wrong number of arguments to " printname[cdr[__p0]]));
|
|
if ((__p0 == CAR))
|
|
return car[is(a_pair,stack[frame_ptr])];
|
|
if ((__p0 == CDR))
|
|
return cdr[is(a_pair,stack[frame_ptr])];
|
|
if ((__p0 == CONS))
|
|
return cons(stack[frame_ptr],stack[(frame_ptr + 1)]);
|
|
if ((__p0 == NULL))
|
|
return ((stack[frame_ptr] == NIL))?T:NIL;
|
|
if ((__p0 == EQ))
|
|
return ((stack[frame_ptr] == stack[(frame_ptr + 1)]))?T:NIL;
|
|
if ((__p0 == ATOMP))
|
|
return (is_atom(stack[frame_ptr]))?T:NIL;
|
|
if ((__p0 == ADD))
|
|
return (is(a_number,stack[frame_ptr]) + is(a_number,stack[(frame_ptr + 1)]));
|
|
if ((__p0 == SUB))
|
|
return (is(a_number,stack[frame_ptr]) - is(a_number,stack[(frame_ptr + 1)]));
|
|
if ((__p0 == MUL))
|
|
return make_number((numeric_value(stack[frame_ptr]) * numeric_value(stack[(frame_ptr + 1)])));
|
|
if ((__p0 == DIV))
|
|
return make_number(int((numeric_value(stack[frame_ptr]) / numeric_value(stack[(frame_ptr + 1)]))));
|
|
if ((__p0 == MOD))
|
|
return make_number((numeric_value(stack[frame_ptr]) % numeric_value(stack[(frame_ptr + 1)])));
|
|
if ((__p0 == LT))
|
|
return (((stack[frame_ptr] + 0) < (stack[(frame_ptr + 1)] + 0)))?T:NIL;
|
|
if ((__p0 == GET))
|
|
return (((stack[frame_ptr],stack[(frame_ptr + 1)]) in property))?property[stack[frame_ptr],stack[(frame_ptr + 1)]]:NIL;
|
|
if ((__p0 == PUT))
|
|
return property[stack[frame_ptr],stack[(frame_ptr + 1)]] = stack[(frame_ptr + 2)];
|
|
if ((__p0 == CADR))
|
|
return car[is(a_pair,cdr[is(a_pair,stack[frame_ptr])])];
|
|
if ((__p0 == CDDR))
|
|
return cdr[is(a_pair,cdr[is(a_pair,stack[frame_ptr])])];
|
|
if ((__p0 == LIST))
|
|
return listify_args();
|
|
if ((__p0 == SYMBOLP))
|
|
return (is_symbol(stack[frame_ptr]))?T:NIL;
|
|
if ((__p0 == PAIRP))
|
|
return (is_pair(stack[frame_ptr]))?T:NIL;
|
|
if ((__p0 == NUMBERP))
|
|
return (is_number(stack[frame_ptr]))?T:NIL;
|
|
if ((__p0 == SETCAR))
|
|
return car[is(a_pair,stack[frame_ptr])] = stack[(frame_ptr + 1)];
|
|
if ((__p0 == SETCDR))
|
|
return cdr[is(a_pair,stack[frame_ptr])] = stack[(frame_ptr + 1)];
|
|
if ((__p0 == APPLY))
|
|
return do_apply(stack[frame_ptr],stack[(frame_ptr + 1)]);
|
|
if ((__p0 == EVAL))
|
|
return eval(stack[frame_ptr]);
|
|
if ((__p0 == NREV))
|
|
return nreverse(stack[frame_ptr],NIL);
|
|
if ((__p0 == WRITE))
|
|
{
|
|
write_expr(stack[frame_ptr]);
|
|
printf " ";
|
|
return NIL;
|
|
}
|
|
if ((__p0 == NEWLINE))
|
|
{
|
|
printf "\n";
|
|
return NIL;
|
|
}
|
|
if ((__p0 == READ))
|
|
return read();
|
|
if ((__p0 == RANDOM))
|
|
return make_number(int((rand() * numeric_value(stack[frame_ptr]))));
|
|
if ((__p0 == GENSYM))
|
|
return string_to_symbol(("#G" ++(gensym_counter)));
|
|
if ((__p0 == ERROR))
|
|
{
|
|
printf "Error!\n";
|
|
print_expr(listify_args());
|
|
exit 1;
|
|
}
|
|
error("Unknown procedure type");
|
|
}
|
|
|
|
function error (__p0)
|
|
{
|
|
print ("ERROR: " __p0) > "/dev/stderr";
|
|
exit 1;
|
|
}
|
|
|
|
function gc (__p0, __p1, __p2, __p3)
|
|
{
|
|
if (loud_gc)
|
|
printf "\nGC..." > "/dev/stderr";
|
|
mark(__p0);
|
|
mark(__p1);
|
|
for (__p2 in protected)
|
|
mark(protected[__p2]);
|
|
for (__p2 in stack)
|
|
mark(stack[__p2]);
|
|
for (__p2 in value)
|
|
mark(value[__p2]);
|
|
for (__p2 in property)
|
|
{
|
|
__p3 = index(SUBSEP,__p2);
|
|
mark(substr(__p2,1,(__p3 - 1)));
|
|
mark(substr(__p2,(__p3 + 1)));
|
|
mark(property[__p2]);
|
|
}
|
|
pair_ptr = a_pair;
|
|
while ((pair_ptr in marks))
|
|
{
|
|
delete marks[pair_ptr];
|
|
pair_ptr += 4;
|
|
}
|
|
if ((pair_ptr == pair_limit))
|
|
{
|
|
if (loud_gc)
|
|
printf "Expanding heap..." > "/dev/stderr";
|
|
pair_limit += (4 * heap_increment);
|
|
}
|
|
}
|
|
|
|
function extend_env (__p0, __p1, __p2)
|
|
{
|
|
for (__p1 = frame_ptr; (__p0 != NIL); __p0 = cdr[__p0])
|
|
{
|
|
if ((__p1 == stack_ptr))
|
|
error("Too many arguments to procedure");
|
|
__p2 = value[car[__p0]];
|
|
value[car[__p0]] = stack[__p1];
|
|
stack[__p1] = __p2;
|
|
++(__p1);
|
|
}
|
|
if ((__p1 != stack_ptr))
|
|
error("Not enough arguments to procedure");
|
|
}
|
|
|
|
function is_atom (__p0)
|
|
{
|
|
return ((__p0 % 4) != 1);
|
|
}
|
|
|
|
function is_pair (__p0)
|
|
{
|
|
return ((__p0 % 4) == 1);
|
|
}
|
|
|
|
function eval (__p0, __p1)
|
|
{
|
|
if (is_atom(__p0))
|
|
if (is_symbol(__p0))
|
|
{
|
|
if ((!((__p0 in value))))
|
|
error(("Unbound variable: " printname[__p0]));
|
|
return value[__p0];
|
|
}
|
|
else
|
|
return __p0;
|
|
op = car[__p0];
|
|
if ((!((op in is_special))))
|
|
{
|
|
__p1 = frame_ptr;
|
|
frame_ptr = stack_ptr;
|
|
eval_rands(cdr[__p0]);
|
|
protect(proc = eval(car[__p0]));
|
|
result = apply(proc);
|
|
unprotect();
|
|
stack_ptr = frame_ptr;
|
|
frame_ptr = __p1;
|
|
return result;
|
|
}
|
|
if ((op == QUOTE))
|
|
return car[cdr[__p0]];
|
|
if ((op == LAMBDA))
|
|
return __p0;
|
|
if ((op == IF))
|
|
return ((eval(car[cdr[__p0]]) != NIL))?eval(car[cdr[cdr[__p0]]]):eval(car[cdr[cdr[cdr[__p0]]]]);
|
|
if ((op == PROGN))
|
|
return progn(cdr[__p0]);
|
|
if ((op == SETQ))
|
|
{
|
|
if ((!((car[cdr[__p0]] in value))))
|
|
error(("Unbound variable: " printname[car[cdr[__p0]]]));
|
|
return value[car[cdr[__p0]]] = eval(car[cdr[cdr[__p0]]]);
|
|
}
|
|
if ((op == WHILE))
|
|
{
|
|
while ((eval(car[cdr[__p0]]) != NIL))
|
|
progn(cdr[cdr[__p0]]);
|
|
return NIL;
|
|
}
|
|
if ((op == DEFINE))
|
|
{
|
|
value[car[cdr[__p0]]] = eval(car[cdr[cdr[__p0]]]);
|
|
return car[cdr[__p0]];
|
|
}
|
|
error("BUG: Unknown special form");
|
|
}
|
|
|
|
function is (__p0, __p1)
|
|
{
|
|
if (((__p1 % 4) != __p0))
|
|
error(((("Expected a " type_name[__p0]) ", not a ") type_name[(__p1 % 4)]));
|
|
return __p1;
|
|
}
|
|
|
|
function unwind_env (__p0, __p1)
|
|
{
|
|
for (__p1 = frame_ptr; (__p0 != NIL); __p0 = cdr[__p0])
|
|
{
|
|
if ((stack[__p1] == ""))
|
|
delete value[car[__p0]];
|
|
else
|
|
value[car[__p0]] = stack[__p1];
|
|
++(__p1);
|
|
}
|
|
}
|
|
|
|
function nreverse (__p0, __p1, __p2)
|
|
{
|
|
while (is_pair(__p0))
|
|
{
|
|
__p2 = cdr[__p0];
|
|
cdr[__p0] = __p1;
|
|
__p1 = __p0;
|
|
__p0 = __p2;
|
|
}
|
|
if ((__p0 != NIL))
|
|
error("Not a proper list - reverse!");
|
|
return __p1;
|
|
}
|
|
|
|
function advance ()
|
|
{
|
|
if ((token == eof))
|
|
return eof;
|
|
if ((token == ""))
|
|
{
|
|
if (((getline line) <= 0))
|
|
{
|
|
token = eof;
|
|
return;
|
|
}
|
|
}
|
|
if (((match(line,"^[()'.]") || match(line,"^[_A-Za-z0-9=!@$%&*<>?+\\-*/:]+")) || match(line,"^[ \\t]+")))
|
|
{
|
|
token = substr(line,RSTART,RLENGTH);
|
|
line = substr(line,(RLENGTH + 1));
|
|
}
|
|
else
|
|
if (((line == "") || (substr(line,1,1) == ";")))
|
|
token = "";
|
|
else
|
|
error(("Lexical error starting at " line));
|
|
}
|
|
|
|
function do_apply (__p0, __p1, __p2)
|
|
{
|
|
__p2 = frame_ptr;
|
|
frame_ptr = stack_ptr;
|
|
for (; is_pair(__p1); __p1 = cdr[__p1])
|
|
stack[(stack_ptr)++] = car[__p1];
|
|
if ((__p1 != NIL))
|
|
error("Bad argument to APPLY: not a proper list");
|
|
result = apply(__p0);
|
|
stack_ptr = frame_ptr;
|
|
frame_ptr = __p2;
|
|
return result;
|
|
}
|
|
|
|
function unprotect ()
|
|
{
|
|
--(protected_ptr);
|
|
}
|
|
|
|
BEGIN {
|
|
a_number = 0;
|
|
pair_ptr = a_pair = 1;
|
|
symbol_ptr = a_symbol = 2;
|
|
type_name[a_number] = "number";
|
|
type_name[a_pair] = "pair";
|
|
type_name[a_symbol] = "symbol";
|
|
}
|
|
|
|
BEGIN {
|
|
srand();
|
|
frame_ptr = stack_ptr = 0;
|
|
if ((heap_increment == ""))
|
|
heap_increment = 1500;
|
|
pair_limit = (a_pair + (4 * heap_increment));
|
|
NIL = string_to_symbol("nil");
|
|
T = string_to_symbol("t");
|
|
value[NIL] = NIL;
|
|
value[T] = T;
|
|
car[NIL] = cdr[NIL] = NIL;
|
|
THE_EOF_OBJECT = string_to_symbol("#eof");
|
|
value[string_to_symbol("the-eof-object")] = THE_EOF_OBJECT;
|
|
eof = "(eof)";
|
|
QUOTE = string_to_symbol("quote");
|
|
is_special[QUOTE] = 1;
|
|
LAMBDA = string_to_symbol("lambda");
|
|
is_special[LAMBDA] = 1;
|
|
IF = string_to_symbol("if");
|
|
is_special[IF] = 1;
|
|
SETQ = string_to_symbol("set!");
|
|
is_special[SETQ] = 1;
|
|
DEFINE = string_to_symbol("define");
|
|
is_special[DEFINE] = 1;
|
|
PROGN = string_to_symbol("begin");
|
|
is_special[PROGN] = 1;
|
|
WHILE = string_to_symbol("while");
|
|
is_special[WHILE] = 1;
|
|
EQ = def_prim("eq?",2);
|
|
NULL = def_prim("null?",1);
|
|
CAR = def_prim("car",1);
|
|
CDR = def_prim("cdr",1);
|
|
CADR = def_prim("cadr",1);
|
|
CDDR = def_prim("cddr",1);
|
|
CONS = def_prim("cons",2);
|
|
LIST = def_prim("list");
|
|
EVAL = def_prim("eval",1);
|
|
APPLY = def_prim("apply",2);
|
|
READ = def_prim("read",0);
|
|
WRITE = def_prim("write",1);
|
|
NEWLINE = def_prim("newline",0);
|
|
ADD = def_prim("+",2);
|
|
SUB = def_prim("-",2);
|
|
MUL = def_prim("*",2);
|
|
DIV = def_prim("quotient",2);
|
|
MOD = def_prim("remainder",2);
|
|
LT = def_prim("<",2);
|
|
GET = def_prim("get",2);
|
|
PUT = def_prim("put",3);
|
|
ATOMP = def_prim("atom?",1);
|
|
PAIRP = def_prim("pair?",1);
|
|
SYMBOLP = def_prim("symbol?",1);
|
|
NUMBERP = def_prim("number?",1);
|
|
SETCAR = def_prim("set-car!",2);
|
|
SETCDR = def_prim("set-cdr!",2);
|
|
NREV = def_prim("reverse!",1);
|
|
GENSYM = def_prim("gensym",0);
|
|
RANDOM = def_prim("random",1);
|
|
ERROR = def_prim("error");
|
|
DRIVER = string_to_symbol("top-level-driver");
|
|
}
|
|
|
|
BEGIN {
|
|
for (; ; )
|
|
{
|
|
if (((DRIVER in value) && (value[DRIVER] != NIL)))
|
|
apply(value[DRIVER]);
|
|
else
|
|
{
|
|
expr = read();
|
|
if ((expr == THE_EOF_OBJECT))
|
|
break;
|
|
protect(expr);
|
|
print_expr(eval(expr));
|
|
unprotect();
|
|
}
|
|
}
|
|
if (profiling)
|
|
for (proc in call_count)
|
|
{
|
|
printf ("%5d ",call_count[proc]);
|
|
print_expr(proc);
|
|
}
|
|
}
|
|
|
|
--------------------------------------------------------------------------------
|
|
[CMD] qseawk -d- -f lisp/awklisp lisp/startup lisp/scmhelp.lsp lisp/tail.lsp </dev/stdin 2>&1
|
|
--------------------------------------------------------------------------------
|
|
function eval_rands (__p0)
|
|
{
|
|
for (; (__p0 != NIL); __p0 = cdr[__p0])
|
|
stack[(stack_ptr)++] = eval(car[__p0]);
|
|
}
|
|
|
|
function def_prim (__p0, __p1, __p2)
|
|
{
|
|
__p2 = string_to_symbol(__p0);
|
|
value[__p2] = string_to_symbol(sprintf("#<Primitive %s>",__p0));
|
|
if ((__p1 != ""))
|
|
num_params[value[__p2]] = __p1;
|
|
return value[__p2];
|
|
}
|
|
|
|
function is_symbol (__p0)
|
|
{
|
|
return ((__p0 % 4) == 2);
|
|
}
|
|
|
|
function is_number (__p0)
|
|
{
|
|
return ((__p0 % 4) == 0);
|
|
}
|
|
|
|
function read (__p0, __p1)
|
|
{
|
|
skip_blanks();
|
|
if ((token == eof))
|
|
if (__p0)
|
|
error("Unexpected EOF");
|
|
else
|
|
return THE_EOF_OBJECT;
|
|
if ((token == "("))
|
|
{
|
|
advance();
|
|
__p1 = NIL;
|
|
for (; ; )
|
|
{
|
|
skip_blanks();
|
|
if ((token == "."))
|
|
{
|
|
advance();
|
|
after_dot = read(1);
|
|
skip_blanks();
|
|
if ((token != ")"))
|
|
error("')' expected");
|
|
advance();
|
|
return nreverse(__p1,after_dot);
|
|
}
|
|
else
|
|
if ((token == ")"))
|
|
{
|
|
advance();
|
|
return nreverse(__p1,NIL);
|
|
}
|
|
else
|
|
{
|
|
protect(__p1);
|
|
__p1 = cons(read(1),__p1);
|
|
unprotect();
|
|
}
|
|
}
|
|
}
|
|
else
|
|
if ((token == "'"))
|
|
{
|
|
advance();
|
|
return cons(QUOTE,cons(read(1),NIL));
|
|
}
|
|
else
|
|
if ((token ~ /^-?[0-9]+$/))
|
|
{
|
|
__p1 = make_number(token);
|
|
advance();
|
|
return __p1;
|
|
}
|
|
else
|
|
{
|
|
__p1 = string_to_symbol(token);
|
|
advance();
|
|
return __p1;
|
|
}
|
|
}
|
|
|
|
function protect (__p0)
|
|
{
|
|
protected[++(protected_ptr)] = __p0;
|
|
}
|
|
|
|
function mark (__p0)
|
|
{
|
|
while ((is_pair(__p0) && (!((__p0 in marks)))))
|
|
{
|
|
marks[__p0] = 1;
|
|
mark(car[__p0]);
|
|
__p0 = cdr[__p0];
|
|
}
|
|
}
|
|
|
|
function write_expr (__p0)
|
|
{
|
|
if (is_atom(__p0))
|
|
{
|
|
if ((!(is_symbol(__p0))))
|
|
printf ("%d",numeric_value(__p0));
|
|
else
|
|
{
|
|
if ((!((__p0 in printname))))
|
|
error((("BUG: " __p0) " has no printname"));
|
|
printf ("%s",printname[__p0]);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
printf "(";
|
|
write_expr(car[__p0]);
|
|
for (__p0 = cdr[__p0]; is_pair(__p0); __p0 = cdr[__p0])
|
|
{
|
|
printf " ";
|
|
write_expr(car[__p0]);
|
|
}
|
|
if ((__p0 != NIL))
|
|
{
|
|
printf " . ";
|
|
write_expr(__p0);
|
|
}
|
|
printf ")";
|
|
}
|
|
}
|
|
|
|
function make_number (__p0)
|
|
{
|
|
return (__p0 * 4);
|
|
}
|
|
|
|
function print_expr (__p0)
|
|
{
|
|
write_expr(__p0);
|
|
print "";
|
|
}
|
|
|
|
function progn (__p0)
|
|
{
|
|
for (; (cdr[__p0] != NIL); __p0 = cdr[__p0])
|
|
eval(car[__p0]);
|
|
return eval(car[__p0]);
|
|
}
|
|
|
|
function string_to_symbol (__p0)
|
|
{
|
|
if ((__p0 in intern))
|
|
return intern[__p0];
|
|
symbol_ptr += 4;
|
|
intern[__p0] = symbol_ptr;
|
|
printname[symbol_ptr] = __p0;
|
|
return symbol_ptr;
|
|
}
|
|
|
|
function cons (__p0, __p1)
|
|
{
|
|
while ((pair_ptr in marks))
|
|
{
|
|
delete marks[pair_ptr];
|
|
pair_ptr += 4;
|
|
}
|
|
if ((pair_ptr == pair_limit))
|
|
gc(__p0,__p1);
|
|
car[pair_ptr] = __p0;
|
|
cdr[pair_ptr] = __p1;
|
|
pair_ptr += 4;
|
|
return (pair_ptr - 4);
|
|
}
|
|
|
|
function listify_args (__p0, __p1)
|
|
{
|
|
__p1 = NIL;
|
|
for (__p0 = (stack_ptr - 1); (frame_ptr <= __p0); --(__p0))
|
|
__p1 = cons(stack[__p0],__p1);
|
|
return __p1;
|
|
}
|
|
|
|
function numeric_value (__p0)
|
|
{
|
|
if (((__p0 % 4) != 0))
|
|
error("Not a number");
|
|
return (__p0 / 4);
|
|
}
|
|
|
|
function skip_blanks ()
|
|
{
|
|
while ((token ~ /^[ ]*$/))
|
|
advance();
|
|
}
|
|
|
|
function apply (__p0)
|
|
{
|
|
if (profiling)
|
|
++(call_count[__p0]);
|
|
if ((car[__p0] == LAMBDA))
|
|
{
|
|
extend_env(car[cdr[__p0]]);
|
|
result = progn(cdr[cdr[__p0]]);
|
|
unwind_env(car[cdr[__p0]]);
|
|
return result;
|
|
}
|
|
if (((__p0 in num_params) && (num_params[__p0] != (stack_ptr - frame_ptr))))
|
|
error(("Wrong number of arguments to " printname[cdr[__p0]]));
|
|
if ((__p0 == CAR))
|
|
return car[is(a_pair,stack[frame_ptr])];
|
|
if ((__p0 == CDR))
|
|
return cdr[is(a_pair,stack[frame_ptr])];
|
|
if ((__p0 == CONS))
|
|
return cons(stack[frame_ptr],stack[(frame_ptr + 1)]);
|
|
if ((__p0 == NULL))
|
|
return ((stack[frame_ptr] == NIL))?T:NIL;
|
|
if ((__p0 == EQ))
|
|
return ((stack[frame_ptr] == stack[(frame_ptr + 1)]))?T:NIL;
|
|
if ((__p0 == ATOMP))
|
|
return (is_atom(stack[frame_ptr]))?T:NIL;
|
|
if ((__p0 == ADD))
|
|
return (is(a_number,stack[frame_ptr]) + is(a_number,stack[(frame_ptr + 1)]));
|
|
if ((__p0 == SUB))
|
|
return (is(a_number,stack[frame_ptr]) - is(a_number,stack[(frame_ptr + 1)]));
|
|
if ((__p0 == MUL))
|
|
return make_number((numeric_value(stack[frame_ptr]) * numeric_value(stack[(frame_ptr + 1)])));
|
|
if ((__p0 == DIV))
|
|
return make_number(int((numeric_value(stack[frame_ptr]) / numeric_value(stack[(frame_ptr + 1)]))));
|
|
if ((__p0 == MOD))
|
|
return make_number((numeric_value(stack[frame_ptr]) % numeric_value(stack[(frame_ptr + 1)])));
|
|
if ((__p0 == LT))
|
|
return (((stack[frame_ptr] + 0) < (stack[(frame_ptr + 1)] + 0)))?T:NIL;
|
|
if ((__p0 == GET))
|
|
return (((stack[frame_ptr],stack[(frame_ptr + 1)]) in property))?property[stack[frame_ptr],stack[(frame_ptr + 1)]]:NIL;
|
|
if ((__p0 == PUT))
|
|
return property[stack[frame_ptr],stack[(frame_ptr + 1)]] = stack[(frame_ptr + 2)];
|
|
if ((__p0 == CADR))
|
|
return car[is(a_pair,cdr[is(a_pair,stack[frame_ptr])])];
|
|
if ((__p0 == CDDR))
|
|
return cdr[is(a_pair,cdr[is(a_pair,stack[frame_ptr])])];
|
|
if ((__p0 == LIST))
|
|
return listify_args();
|
|
if ((__p0 == SYMBOLP))
|
|
return (is_symbol(stack[frame_ptr]))?T:NIL;
|
|
if ((__p0 == PAIRP))
|
|
return (is_pair(stack[frame_ptr]))?T:NIL;
|
|
if ((__p0 == NUMBERP))
|
|
return (is_number(stack[frame_ptr]))?T:NIL;
|
|
if ((__p0 == SETCAR))
|
|
return car[is(a_pair,stack[frame_ptr])] = stack[(frame_ptr + 1)];
|
|
if ((__p0 == SETCDR))
|
|
return cdr[is(a_pair,stack[frame_ptr])] = stack[(frame_ptr + 1)];
|
|
if ((__p0 == APPLY))
|
|
return do_apply(stack[frame_ptr],stack[(frame_ptr + 1)]);
|
|
if ((__p0 == EVAL))
|
|
return eval(stack[frame_ptr]);
|
|
if ((__p0 == NREV))
|
|
return nreverse(stack[frame_ptr],NIL);
|
|
if ((__p0 == WRITE))
|
|
{
|
|
write_expr(stack[frame_ptr]);
|
|
printf " ";
|
|
return NIL;
|
|
}
|
|
if ((__p0 == NEWLINE))
|
|
{
|
|
printf "\n";
|
|
return NIL;
|
|
}
|
|
if ((__p0 == READ))
|
|
return read();
|
|
if ((__p0 == RANDOM))
|
|
return make_number(int((rand() * numeric_value(stack[frame_ptr]))));
|
|
if ((__p0 == GENSYM))
|
|
return string_to_symbol(("#G" ++(gensym_counter)));
|
|
if ((__p0 == ERROR))
|
|
{
|
|
printf "Error!\n";
|
|
print_expr(listify_args());
|
|
exit 1;
|
|
}
|
|
error("Unknown procedure type");
|
|
}
|
|
|
|
function error (__p0)
|
|
{
|
|
print ("ERROR: " __p0) > "/dev/stderr";
|
|
exit 1;
|
|
}
|
|
|
|
function gc (__p0, __p1, __p2, __p3)
|
|
{
|
|
if (loud_gc)
|
|
printf "\nGC..." > "/dev/stderr";
|
|
mark(__p0);
|
|
mark(__p1);
|
|
for (__p2 in protected)
|
|
mark(protected[__p2]);
|
|
for (__p2 in stack)
|
|
mark(stack[__p2]);
|
|
for (__p2 in value)
|
|
mark(value[__p2]);
|
|
for (__p2 in property)
|
|
{
|
|
__p3 = index(SUBSEP,__p2);
|
|
mark(substr(__p2,1,(__p3 - 1)));
|
|
mark(substr(__p2,(__p3 + 1)));
|
|
mark(property[__p2]);
|
|
}
|
|
pair_ptr = a_pair;
|
|
while ((pair_ptr in marks))
|
|
{
|
|
delete marks[pair_ptr];
|
|
pair_ptr += 4;
|
|
}
|
|
if ((pair_ptr == pair_limit))
|
|
{
|
|
if (loud_gc)
|
|
printf "Expanding heap..." > "/dev/stderr";
|
|
pair_limit += (4 * heap_increment);
|
|
}
|
|
}
|
|
|
|
function extend_env (__p0, __p1, __p2)
|
|
{
|
|
for (__p1 = frame_ptr; (__p0 != NIL); __p0 = cdr[__p0])
|
|
{
|
|
if ((__p1 == stack_ptr))
|
|
error("Too many arguments to procedure");
|
|
__p2 = value[car[__p0]];
|
|
value[car[__p0]] = stack[__p1];
|
|
stack[__p1] = __p2;
|
|
++(__p1);
|
|
}
|
|
if ((__p1 != stack_ptr))
|
|
error("Not enough arguments to procedure");
|
|
}
|
|
|
|
function is_atom (__p0)
|
|
{
|
|
return ((__p0 % 4) != 1);
|
|
}
|
|
|
|
function is_pair (__p0)
|
|
{
|
|
return ((__p0 % 4) == 1);
|
|
}
|
|
|
|
function eval (__p0, __p1)
|
|
{
|
|
if (is_atom(__p0))
|
|
if (is_symbol(__p0))
|
|
{
|
|
if ((!((__p0 in value))))
|
|
error(("Unbound variable: " printname[__p0]));
|
|
return value[__p0];
|
|
}
|
|
else
|
|
return __p0;
|
|
op = car[__p0];
|
|
if ((!((op in is_special))))
|
|
{
|
|
__p1 = frame_ptr;
|
|
frame_ptr = stack_ptr;
|
|
eval_rands(cdr[__p0]);
|
|
protect(proc = eval(car[__p0]));
|
|
result = apply(proc);
|
|
unprotect();
|
|
stack_ptr = frame_ptr;
|
|
frame_ptr = __p1;
|
|
return result;
|
|
}
|
|
if ((op == QUOTE))
|
|
return car[cdr[__p0]];
|
|
if ((op == LAMBDA))
|
|
return __p0;
|
|
if ((op == IF))
|
|
return ((eval(car[cdr[__p0]]) != NIL))?eval(car[cdr[cdr[__p0]]]):eval(car[cdr[cdr[cdr[__p0]]]]);
|
|
if ((op == PROGN))
|
|
return progn(cdr[__p0]);
|
|
if ((op == SETQ))
|
|
{
|
|
if ((!((car[cdr[__p0]] in value))))
|
|
error(("Unbound variable: " printname[car[cdr[__p0]]]));
|
|
return value[car[cdr[__p0]]] = eval(car[cdr[cdr[__p0]]]);
|
|
}
|
|
if ((op == WHILE))
|
|
{
|
|
while ((eval(car[cdr[__p0]]) != NIL))
|
|
progn(cdr[cdr[__p0]]);
|
|
return NIL;
|
|
}
|
|
if ((op == DEFINE))
|
|
{
|
|
value[car[cdr[__p0]]] = eval(car[cdr[cdr[__p0]]]);
|
|
return car[cdr[__p0]];
|
|
}
|
|
error("BUG: Unknown special form");
|
|
}
|
|
|
|
function is (__p0, __p1)
|
|
{
|
|
if (((__p1 % 4) != __p0))
|
|
error(((("Expected a " type_name[__p0]) ", not a ") type_name[(__p1 % 4)]));
|
|
return __p1;
|
|
}
|
|
|
|
function unwind_env (__p0, __p1)
|
|
{
|
|
for (__p1 = frame_ptr; (__p0 != NIL); __p0 = cdr[__p0])
|
|
{
|
|
if ((stack[__p1] == ""))
|
|
delete value[car[__p0]];
|
|
else
|
|
value[car[__p0]] = stack[__p1];
|
|
++(__p1);
|
|
}
|
|
}
|
|
|
|
function nreverse (__p0, __p1, __p2)
|
|
{
|
|
while (is_pair(__p0))
|
|
{
|
|
__p2 = cdr[__p0];
|
|
cdr[__p0] = __p1;
|
|
__p1 = __p0;
|
|
__p0 = __p2;
|
|
}
|
|
if ((__p0 != NIL))
|
|
error("Not a proper list - reverse!");
|
|
return __p1;
|
|
}
|
|
|
|
function advance ()
|
|
{
|
|
if ((token == eof))
|
|
return eof;
|
|
if ((token == ""))
|
|
{
|
|
if (((getline line) <= 0))
|
|
{
|
|
token = eof;
|
|
return;
|
|
}
|
|
}
|
|
if (((match(line,"^[()'.]") || match(line,"^[_A-Za-z0-9=!@$%&*<>?+\\-*/:]+")) || match(line,"^[ \\t]+")))
|
|
{
|
|
token = substr(line,RSTART,RLENGTH);
|
|
line = substr(line,(RLENGTH + 1));
|
|
}
|
|
else
|
|
if (((line == "") || (substr(line,1,1) == ";")))
|
|
token = "";
|
|
else
|
|
error(("Lexical error starting at " line));
|
|
}
|
|
|
|
function do_apply (__p0, __p1, __p2)
|
|
{
|
|
__p2 = frame_ptr;
|
|
frame_ptr = stack_ptr;
|
|
for (; is_pair(__p1); __p1 = cdr[__p1])
|
|
stack[(stack_ptr)++] = car[__p1];
|
|
if ((__p1 != NIL))
|
|
error("Bad argument to APPLY: not a proper list");
|
|
result = apply(__p0);
|
|
stack_ptr = frame_ptr;
|
|
frame_ptr = __p2;
|
|
return result;
|
|
}
|
|
|
|
function unprotect ()
|
|
{
|
|
--(protected_ptr);
|
|
}
|
|
|
|
BEGIN {
|
|
a_number = 0;
|
|
pair_ptr = a_pair = 1;
|
|
symbol_ptr = a_symbol = 2;
|
|
type_name[a_number] = "number";
|
|
type_name[a_pair] = "pair";
|
|
type_name[a_symbol] = "symbol";
|
|
}
|
|
|
|
BEGIN {
|
|
srand();
|
|
frame_ptr = stack_ptr = 0;
|
|
if ((heap_increment == ""))
|
|
heap_increment = 1500;
|
|
pair_limit = (a_pair + (4 * heap_increment));
|
|
NIL = string_to_symbol("nil");
|
|
T = string_to_symbol("t");
|
|
value[NIL] = NIL;
|
|
value[T] = T;
|
|
car[NIL] = cdr[NIL] = NIL;
|
|
THE_EOF_OBJECT = string_to_symbol("#eof");
|
|
value[string_to_symbol("the-eof-object")] = THE_EOF_OBJECT;
|
|
eof = "(eof)";
|
|
QUOTE = string_to_symbol("quote");
|
|
is_special[QUOTE] = 1;
|
|
LAMBDA = string_to_symbol("lambda");
|
|
is_special[LAMBDA] = 1;
|
|
IF = string_to_symbol("if");
|
|
is_special[IF] = 1;
|
|
SETQ = string_to_symbol("set!");
|
|
is_special[SETQ] = 1;
|
|
DEFINE = string_to_symbol("define");
|
|
is_special[DEFINE] = 1;
|
|
PROGN = string_to_symbol("begin");
|
|
is_special[PROGN] = 1;
|
|
WHILE = string_to_symbol("while");
|
|
is_special[WHILE] = 1;
|
|
EQ = def_prim("eq?",2);
|
|
NULL = def_prim("null?",1);
|
|
CAR = def_prim("car",1);
|
|
CDR = def_prim("cdr",1);
|
|
CADR = def_prim("cadr",1);
|
|
CDDR = def_prim("cddr",1);
|
|
CONS = def_prim("cons",2);
|
|
LIST = def_prim("list");
|
|
EVAL = def_prim("eval",1);
|
|
APPLY = def_prim("apply",2);
|
|
READ = def_prim("read",0);
|
|
WRITE = def_prim("write",1);
|
|
NEWLINE = def_prim("newline",0);
|
|
ADD = def_prim("+",2);
|
|
SUB = def_prim("-",2);
|
|
MUL = def_prim("*",2);
|
|
DIV = def_prim("quotient",2);
|
|
MOD = def_prim("remainder",2);
|
|
LT = def_prim("<",2);
|
|
GET = def_prim("get",2);
|
|
PUT = def_prim("put",3);
|
|
ATOMP = def_prim("atom?",1);
|
|
PAIRP = def_prim("pair?",1);
|
|
SYMBOLP = def_prim("symbol?",1);
|
|
NUMBERP = def_prim("number?",1);
|
|
SETCAR = def_prim("set-car!",2);
|
|
SETCDR = def_prim("set-cdr!",2);
|
|
NREV = def_prim("reverse!",1);
|
|
GENSYM = def_prim("gensym",0);
|
|
RANDOM = def_prim("random",1);
|
|
ERROR = def_prim("error");
|
|
DRIVER = string_to_symbol("top-level-driver");
|
|
}
|
|
|
|
BEGIN {
|
|
for (; ; )
|
|
{
|
|
if (((DRIVER in value) && (value[DRIVER] != NIL)))
|
|
apply(value[DRIVER]);
|
|
else
|
|
{
|
|
expr = read();
|
|
if ((expr == THE_EOF_OBJECT))
|
|
break;
|
|
protect(expr);
|
|
print_expr(eval(expr));
|
|
unprotect();
|
|
}
|
|
}
|
|
if (profiling)
|
|
for (proc in call_count)
|
|
{
|
|
printf ("%5d ",call_count[proc]);
|
|
print_expr(proc);
|
|
}
|
|
}
|
|
|
|
--------------------------------------------------------------------------------
|
|
[CMD] qseawk -d- -f lisp/awklisp lisp/startup lisp/scmhelp.lsp lisp/scheme.lsp </dev/stdin 2>&1
|
|
--------------------------------------------------------------------------------
|
|
function eval_rands (__p0)
|
|
{
|
|
for (; (__p0 != NIL); __p0 = cdr[__p0])
|
|
stack[(stack_ptr)++] = eval(car[__p0]);
|
|
}
|
|
|
|
function def_prim (__p0, __p1, __p2)
|
|
{
|
|
__p2 = string_to_symbol(__p0);
|
|
value[__p2] = string_to_symbol(sprintf("#<Primitive %s>",__p0));
|
|
if ((__p1 != ""))
|
|
num_params[value[__p2]] = __p1;
|
|
return value[__p2];
|
|
}
|
|
|
|
function is_symbol (__p0)
|
|
{
|
|
return ((__p0 % 4) == 2);
|
|
}
|
|
|
|
function is_number (__p0)
|
|
{
|
|
return ((__p0 % 4) == 0);
|
|
}
|
|
|
|
function read (__p0, __p1)
|
|
{
|
|
skip_blanks();
|
|
if ((token == eof))
|
|
if (__p0)
|
|
error("Unexpected EOF");
|
|
else
|
|
return THE_EOF_OBJECT;
|
|
if ((token == "("))
|
|
{
|
|
advance();
|
|
__p1 = NIL;
|
|
for (; ; )
|
|
{
|
|
skip_blanks();
|
|
if ((token == "."))
|
|
{
|
|
advance();
|
|
after_dot = read(1);
|
|
skip_blanks();
|
|
if ((token != ")"))
|
|
error("')' expected");
|
|
advance();
|
|
return nreverse(__p1,after_dot);
|
|
}
|
|
else
|
|
if ((token == ")"))
|
|
{
|
|
advance();
|
|
return nreverse(__p1,NIL);
|
|
}
|
|
else
|
|
{
|
|
protect(__p1);
|
|
__p1 = cons(read(1),__p1);
|
|
unprotect();
|
|
}
|
|
}
|
|
}
|
|
else
|
|
if ((token == "'"))
|
|
{
|
|
advance();
|
|
return cons(QUOTE,cons(read(1),NIL));
|
|
}
|
|
else
|
|
if ((token ~ /^-?[0-9]+$/))
|
|
{
|
|
__p1 = make_number(token);
|
|
advance();
|
|
return __p1;
|
|
}
|
|
else
|
|
{
|
|
__p1 = string_to_symbol(token);
|
|
advance();
|
|
return __p1;
|
|
}
|
|
}
|
|
|
|
function protect (__p0)
|
|
{
|
|
protected[++(protected_ptr)] = __p0;
|
|
}
|
|
|
|
function mark (__p0)
|
|
{
|
|
while ((is_pair(__p0) && (!((__p0 in marks)))))
|
|
{
|
|
marks[__p0] = 1;
|
|
mark(car[__p0]);
|
|
__p0 = cdr[__p0];
|
|
}
|
|
}
|
|
|
|
function write_expr (__p0)
|
|
{
|
|
if (is_atom(__p0))
|
|
{
|
|
if ((!(is_symbol(__p0))))
|
|
printf ("%d",numeric_value(__p0));
|
|
else
|
|
{
|
|
if ((!((__p0 in printname))))
|
|
error((("BUG: " __p0) " has no printname"));
|
|
printf ("%s",printname[__p0]);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
printf "(";
|
|
write_expr(car[__p0]);
|
|
for (__p0 = cdr[__p0]; is_pair(__p0); __p0 = cdr[__p0])
|
|
{
|
|
printf " ";
|
|
write_expr(car[__p0]);
|
|
}
|
|
if ((__p0 != NIL))
|
|
{
|
|
printf " . ";
|
|
write_expr(__p0);
|
|
}
|
|
printf ")";
|
|
}
|
|
}
|
|
|
|
function make_number (__p0)
|
|
{
|
|
return (__p0 * 4);
|
|
}
|
|
|
|
function print_expr (__p0)
|
|
{
|
|
write_expr(__p0);
|
|
print "";
|
|
}
|
|
|
|
function progn (__p0)
|
|
{
|
|
for (; (cdr[__p0] != NIL); __p0 = cdr[__p0])
|
|
eval(car[__p0]);
|
|
return eval(car[__p0]);
|
|
}
|
|
|
|
function string_to_symbol (__p0)
|
|
{
|
|
if ((__p0 in intern))
|
|
return intern[__p0];
|
|
symbol_ptr += 4;
|
|
intern[__p0] = symbol_ptr;
|
|
printname[symbol_ptr] = __p0;
|
|
return symbol_ptr;
|
|
}
|
|
|
|
function cons (__p0, __p1)
|
|
{
|
|
while ((pair_ptr in marks))
|
|
{
|
|
delete marks[pair_ptr];
|
|
pair_ptr += 4;
|
|
}
|
|
if ((pair_ptr == pair_limit))
|
|
gc(__p0,__p1);
|
|
car[pair_ptr] = __p0;
|
|
cdr[pair_ptr] = __p1;
|
|
pair_ptr += 4;
|
|
return (pair_ptr - 4);
|
|
}
|
|
|
|
function listify_args (__p0, __p1)
|
|
{
|
|
__p1 = NIL;
|
|
for (__p0 = (stack_ptr - 1); (frame_ptr <= __p0); --(__p0))
|
|
__p1 = cons(stack[__p0],__p1);
|
|
return __p1;
|
|
}
|
|
|
|
function numeric_value (__p0)
|
|
{
|
|
if (((__p0 % 4) != 0))
|
|
error("Not a number");
|
|
return (__p0 / 4);
|
|
}
|
|
|
|
function skip_blanks ()
|
|
{
|
|
while ((token ~ /^[ ]*$/))
|
|
advance();
|
|
}
|
|
|
|
function apply (__p0)
|
|
{
|
|
if (profiling)
|
|
++(call_count[__p0]);
|
|
if ((car[__p0] == LAMBDA))
|
|
{
|
|
extend_env(car[cdr[__p0]]);
|
|
result = progn(cdr[cdr[__p0]]);
|
|
unwind_env(car[cdr[__p0]]);
|
|
return result;
|
|
}
|
|
if (((__p0 in num_params) && (num_params[__p0] != (stack_ptr - frame_ptr))))
|
|
error(("Wrong number of arguments to " printname[cdr[__p0]]));
|
|
if ((__p0 == CAR))
|
|
return car[is(a_pair,stack[frame_ptr])];
|
|
if ((__p0 == CDR))
|
|
return cdr[is(a_pair,stack[frame_ptr])];
|
|
if ((__p0 == CONS))
|
|
return cons(stack[frame_ptr],stack[(frame_ptr + 1)]);
|
|
if ((__p0 == NULL))
|
|
return ((stack[frame_ptr] == NIL))?T:NIL;
|
|
if ((__p0 == EQ))
|
|
return ((stack[frame_ptr] == stack[(frame_ptr + 1)]))?T:NIL;
|
|
if ((__p0 == ATOMP))
|
|
return (is_atom(stack[frame_ptr]))?T:NIL;
|
|
if ((__p0 == ADD))
|
|
return (is(a_number,stack[frame_ptr]) + is(a_number,stack[(frame_ptr + 1)]));
|
|
if ((__p0 == SUB))
|
|
return (is(a_number,stack[frame_ptr]) - is(a_number,stack[(frame_ptr + 1)]));
|
|
if ((__p0 == MUL))
|
|
return make_number((numeric_value(stack[frame_ptr]) * numeric_value(stack[(frame_ptr + 1)])));
|
|
if ((__p0 == DIV))
|
|
return make_number(int((numeric_value(stack[frame_ptr]) / numeric_value(stack[(frame_ptr + 1)]))));
|
|
if ((__p0 == MOD))
|
|
return make_number((numeric_value(stack[frame_ptr]) % numeric_value(stack[(frame_ptr + 1)])));
|
|
if ((__p0 == LT))
|
|
return (((stack[frame_ptr] + 0) < (stack[(frame_ptr + 1)] + 0)))?T:NIL;
|
|
if ((__p0 == GET))
|
|
return (((stack[frame_ptr],stack[(frame_ptr + 1)]) in property))?property[stack[frame_ptr],stack[(frame_ptr + 1)]]:NIL;
|
|
if ((__p0 == PUT))
|
|
return property[stack[frame_ptr],stack[(frame_ptr + 1)]] = stack[(frame_ptr + 2)];
|
|
if ((__p0 == CADR))
|
|
return car[is(a_pair,cdr[is(a_pair,stack[frame_ptr])])];
|
|
if ((__p0 == CDDR))
|
|
return cdr[is(a_pair,cdr[is(a_pair,stack[frame_ptr])])];
|
|
if ((__p0 == LIST))
|
|
return listify_args();
|
|
if ((__p0 == SYMBOLP))
|
|
return (is_symbol(stack[frame_ptr]))?T:NIL;
|
|
if ((__p0 == PAIRP))
|
|
return (is_pair(stack[frame_ptr]))?T:NIL;
|
|
if ((__p0 == NUMBERP))
|
|
return (is_number(stack[frame_ptr]))?T:NIL;
|
|
if ((__p0 == SETCAR))
|
|
return car[is(a_pair,stack[frame_ptr])] = stack[(frame_ptr + 1)];
|
|
if ((__p0 == SETCDR))
|
|
return cdr[is(a_pair,stack[frame_ptr])] = stack[(frame_ptr + 1)];
|
|
if ((__p0 == APPLY))
|
|
return do_apply(stack[frame_ptr],stack[(frame_ptr + 1)]);
|
|
if ((__p0 == EVAL))
|
|
return eval(stack[frame_ptr]);
|
|
if ((__p0 == NREV))
|
|
return nreverse(stack[frame_ptr],NIL);
|
|
if ((__p0 == WRITE))
|
|
{
|
|
write_expr(stack[frame_ptr]);
|
|
printf " ";
|
|
return NIL;
|
|
}
|
|
if ((__p0 == NEWLINE))
|
|
{
|
|
printf "\n";
|
|
return NIL;
|
|
}
|
|
if ((__p0 == READ))
|
|
return read();
|
|
if ((__p0 == RANDOM))
|
|
return make_number(int((rand() * numeric_value(stack[frame_ptr]))));
|
|
if ((__p0 == GENSYM))
|
|
return string_to_symbol(("#G" ++(gensym_counter)));
|
|
if ((__p0 == ERROR))
|
|
{
|
|
printf "Error!\n";
|
|
print_expr(listify_args());
|
|
exit 1;
|
|
}
|
|
error("Unknown procedure type");
|
|
}
|
|
|
|
function error (__p0)
|
|
{
|
|
print ("ERROR: " __p0) > "/dev/stderr";
|
|
exit 1;
|
|
}
|
|
|
|
function gc (__p0, __p1, __p2, __p3)
|
|
{
|
|
if (loud_gc)
|
|
printf "\nGC..." > "/dev/stderr";
|
|
mark(__p0);
|
|
mark(__p1);
|
|
for (__p2 in protected)
|
|
mark(protected[__p2]);
|
|
for (__p2 in stack)
|
|
mark(stack[__p2]);
|
|
for (__p2 in value)
|
|
mark(value[__p2]);
|
|
for (__p2 in property)
|
|
{
|
|
__p3 = index(SUBSEP,__p2);
|
|
mark(substr(__p2,1,(__p3 - 1)));
|
|
mark(substr(__p2,(__p3 + 1)));
|
|
mark(property[__p2]);
|
|
}
|
|
pair_ptr = a_pair;
|
|
while ((pair_ptr in marks))
|
|
{
|
|
delete marks[pair_ptr];
|
|
pair_ptr += 4;
|
|
}
|
|
if ((pair_ptr == pair_limit))
|
|
{
|
|
if (loud_gc)
|
|
printf "Expanding heap..." > "/dev/stderr";
|
|
pair_limit += (4 * heap_increment);
|
|
}
|
|
}
|
|
|
|
function extend_env (__p0, __p1, __p2)
|
|
{
|
|
for (__p1 = frame_ptr; (__p0 != NIL); __p0 = cdr[__p0])
|
|
{
|
|
if ((__p1 == stack_ptr))
|
|
error("Too many arguments to procedure");
|
|
__p2 = value[car[__p0]];
|
|
value[car[__p0]] = stack[__p1];
|
|
stack[__p1] = __p2;
|
|
++(__p1);
|
|
}
|
|
if ((__p1 != stack_ptr))
|
|
error("Not enough arguments to procedure");
|
|
}
|
|
|
|
function is_atom (__p0)
|
|
{
|
|
return ((__p0 % 4) != 1);
|
|
}
|
|
|
|
function is_pair (__p0)
|
|
{
|
|
return ((__p0 % 4) == 1);
|
|
}
|
|
|
|
function eval (__p0, __p1)
|
|
{
|
|
if (is_atom(__p0))
|
|
if (is_symbol(__p0))
|
|
{
|
|
if ((!((__p0 in value))))
|
|
error(("Unbound variable: " printname[__p0]));
|
|
return value[__p0];
|
|
}
|
|
else
|
|
return __p0;
|
|
op = car[__p0];
|
|
if ((!((op in is_special))))
|
|
{
|
|
__p1 = frame_ptr;
|
|
frame_ptr = stack_ptr;
|
|
eval_rands(cdr[__p0]);
|
|
protect(proc = eval(car[__p0]));
|
|
result = apply(proc);
|
|
unprotect();
|
|
stack_ptr = frame_ptr;
|
|
frame_ptr = __p1;
|
|
return result;
|
|
}
|
|
if ((op == QUOTE))
|
|
return car[cdr[__p0]];
|
|
if ((op == LAMBDA))
|
|
return __p0;
|
|
if ((op == IF))
|
|
return ((eval(car[cdr[__p0]]) != NIL))?eval(car[cdr[cdr[__p0]]]):eval(car[cdr[cdr[cdr[__p0]]]]);
|
|
if ((op == PROGN))
|
|
return progn(cdr[__p0]);
|
|
if ((op == SETQ))
|
|
{
|
|
if ((!((car[cdr[__p0]] in value))))
|
|
error(("Unbound variable: " printname[car[cdr[__p0]]]));
|
|
return value[car[cdr[__p0]]] = eval(car[cdr[cdr[__p0]]]);
|
|
}
|
|
if ((op == WHILE))
|
|
{
|
|
while ((eval(car[cdr[__p0]]) != NIL))
|
|
progn(cdr[cdr[__p0]]);
|
|
return NIL;
|
|
}
|
|
if ((op == DEFINE))
|
|
{
|
|
value[car[cdr[__p0]]] = eval(car[cdr[cdr[__p0]]]);
|
|
return car[cdr[__p0]];
|
|
}
|
|
error("BUG: Unknown special form");
|
|
}
|
|
|
|
function is (__p0, __p1)
|
|
{
|
|
if (((__p1 % 4) != __p0))
|
|
error(((("Expected a " type_name[__p0]) ", not a ") type_name[(__p1 % 4)]));
|
|
return __p1;
|
|
}
|
|
|
|
function unwind_env (__p0, __p1)
|
|
{
|
|
for (__p1 = frame_ptr; (__p0 != NIL); __p0 = cdr[__p0])
|
|
{
|
|
if ((stack[__p1] == ""))
|
|
delete value[car[__p0]];
|
|
else
|
|
value[car[__p0]] = stack[__p1];
|
|
++(__p1);
|
|
}
|
|
}
|
|
|
|
function nreverse (__p0, __p1, __p2)
|
|
{
|
|
while (is_pair(__p0))
|
|
{
|
|
__p2 = cdr[__p0];
|
|
cdr[__p0] = __p1;
|
|
__p1 = __p0;
|
|
__p0 = __p2;
|
|
}
|
|
if ((__p0 != NIL))
|
|
error("Not a proper list - reverse!");
|
|
return __p1;
|
|
}
|
|
|
|
function advance ()
|
|
{
|
|
if ((token == eof))
|
|
return eof;
|
|
if ((token == ""))
|
|
{
|
|
if (((getline line) <= 0))
|
|
{
|
|
token = eof;
|
|
return;
|
|
}
|
|
}
|
|
if (((match(line,"^[()'.]") || match(line,"^[_A-Za-z0-9=!@$%&*<>?+\\-*/:]+")) || match(line,"^[ \\t]+")))
|
|
{
|
|
token = substr(line,RSTART,RLENGTH);
|
|
line = substr(line,(RLENGTH + 1));
|
|
}
|
|
else
|
|
if (((line == "") || (substr(line,1,1) == ";")))
|
|
token = "";
|
|
else
|
|
error(("Lexical error starting at " line));
|
|
}
|
|
|
|
function do_apply (__p0, __p1, __p2)
|
|
{
|
|
__p2 = frame_ptr;
|
|
frame_ptr = stack_ptr;
|
|
for (; is_pair(__p1); __p1 = cdr[__p1])
|
|
stack[(stack_ptr)++] = car[__p1];
|
|
if ((__p1 != NIL))
|
|
error("Bad argument to APPLY: not a proper list");
|
|
result = apply(__p0);
|
|
stack_ptr = frame_ptr;
|
|
frame_ptr = __p2;
|
|
return result;
|
|
}
|
|
|
|
function unprotect ()
|
|
{
|
|
--(protected_ptr);
|
|
}
|
|
|
|
BEGIN {
|
|
a_number = 0;
|
|
pair_ptr = a_pair = 1;
|
|
symbol_ptr = a_symbol = 2;
|
|
type_name[a_number] = "number";
|
|
type_name[a_pair] = "pair";
|
|
type_name[a_symbol] = "symbol";
|
|
}
|
|
|
|
BEGIN {
|
|
srand();
|
|
frame_ptr = stack_ptr = 0;
|
|
if ((heap_increment == ""))
|
|
heap_increment = 1500;
|
|
pair_limit = (a_pair + (4 * heap_increment));
|
|
NIL = string_to_symbol("nil");
|
|
T = string_to_symbol("t");
|
|
value[NIL] = NIL;
|
|
value[T] = T;
|
|
car[NIL] = cdr[NIL] = NIL;
|
|
THE_EOF_OBJECT = string_to_symbol("#eof");
|
|
value[string_to_symbol("the-eof-object")] = THE_EOF_OBJECT;
|
|
eof = "(eof)";
|
|
QUOTE = string_to_symbol("quote");
|
|
is_special[QUOTE] = 1;
|
|
LAMBDA = string_to_symbol("lambda");
|
|
is_special[LAMBDA] = 1;
|
|
IF = string_to_symbol("if");
|
|
is_special[IF] = 1;
|
|
SETQ = string_to_symbol("set!");
|
|
is_special[SETQ] = 1;
|
|
DEFINE = string_to_symbol("define");
|
|
is_special[DEFINE] = 1;
|
|
PROGN = string_to_symbol("begin");
|
|
is_special[PROGN] = 1;
|
|
WHILE = string_to_symbol("while");
|
|
is_special[WHILE] = 1;
|
|
EQ = def_prim("eq?",2);
|
|
NULL = def_prim("null?",1);
|
|
CAR = def_prim("car",1);
|
|
CDR = def_prim("cdr",1);
|
|
CADR = def_prim("cadr",1);
|
|
CDDR = def_prim("cddr",1);
|
|
CONS = def_prim("cons",2);
|
|
LIST = def_prim("list");
|
|
EVAL = def_prim("eval",1);
|
|
APPLY = def_prim("apply",2);
|
|
READ = def_prim("read",0);
|
|
WRITE = def_prim("write",1);
|
|
NEWLINE = def_prim("newline",0);
|
|
ADD = def_prim("+",2);
|
|
SUB = def_prim("-",2);
|
|
MUL = def_prim("*",2);
|
|
DIV = def_prim("quotient",2);
|
|
MOD = def_prim("remainder",2);
|
|
LT = def_prim("<",2);
|
|
GET = def_prim("get",2);
|
|
PUT = def_prim("put",3);
|
|
ATOMP = def_prim("atom?",1);
|
|
PAIRP = def_prim("pair?",1);
|
|
SYMBOLP = def_prim("symbol?",1);
|
|
NUMBERP = def_prim("number?",1);
|
|
SETCAR = def_prim("set-car!",2);
|
|
SETCDR = def_prim("set-cdr!",2);
|
|
NREV = def_prim("reverse!",1);
|
|
GENSYM = def_prim("gensym",0);
|
|
RANDOM = def_prim("random",1);
|
|
ERROR = def_prim("error");
|
|
DRIVER = string_to_symbol("top-level-driver");
|
|
}
|
|
|
|
BEGIN {
|
|
for (; ; )
|
|
{
|
|
if (((DRIVER in value) && (value[DRIVER] != NIL)))
|
|
apply(value[DRIVER]);
|
|
else
|
|
{
|
|
expr = read();
|
|
if ((expr == THE_EOF_OBJECT))
|
|
break;
|
|
protect(expr);
|
|
print_expr(eval(expr));
|
|
unprotect();
|
|
}
|
|
}
|
|
if (profiling)
|
|
for (proc in call_count)
|
|
{
|
|
printf ("%5d ",call_count[proc]);
|
|
print_expr(proc);
|
|
}
|
|
}
|
|
|