commit 74e466ac34596d5a9a8624a1ca5275d1a8a39cf0
parent e4cffa81c4333fd387da6f6c420154435974cb54
Author: Alexander Burger <abu@software-lab.de>
Date: Mon, 23 Apr 2012 10:46:32 +0200
Native 'struct' function (64-bit)
Diffstat:
10 files changed, 444 insertions(+), 344 deletions(-)
diff --git a/CHANGES b/CHANGES
@@ -1,5 +1,6 @@
* DDmmm12 picoLisp-3.1.1
- double/float in 'native' structures
+ Native 'struct' function (64-bit)
+ double/float in 'native' structures (64-bit)
Allow 'zap' protected symbols outside 'pico' namespace (64-bit)
Bug in 'who'
diff --git a/doc/refN.html b/doc/refN.html
@@ -128,7 +128,7 @@ NIL
-> T
</code></pre>
-<dt><a name="native"><code>(native 'cnt1|sym1 'cnt2|sym2 'sym|lst 'any ..) -> any</code></a>
+<dt><a name="native"><code>(native 'cnt1|sym1 'cnt2|sym2 'any 'any ..) -> any</code></a>
<dd>(64-bit version only) Calls a native C function. The first argument should
specify a shared object library, either <code>"@"</code> (the current main
program), <code>sym1</code> (a library path name), or <code>cnt1</code> (a
@@ -137,10 +137,11 @@ symbol name <code>sym2</code>, or a function pointer <code>cnt2</code> obtained
by a previous call). Practically, the first two arguments will be always passed
as transient symbols, which will get the library handle and function pointer
assigned as values to be cached and used in subsequent calls. The third
-<code>sym|lst</code> argument is a return value specification, while all
-following arguments are the arguments to the native function.
+argument <code>any</code> is a result specification, while all following
+arguments are the arguments to the native function.
-<p>The return value specification may either be one of the atoms
+<p><a name="natResult">The result specification</a> may either be one of the
+atoms
<pre><code>
NIL void
@@ -173,10 +174,10 @@ structures, e.g.
<ul>
<li>a variable in the CAR (to recieve the returned structure data, ignored
when the CAR is <code>NIL</code>)
- <li>a cons pair for the size and value specification in the CADR (see above),
- and
- <li>an optional sequence of initialization items in the CDDR, where each
- may be
+ <li>a cons pair for the size and result specification in the CADR (see
+ above), and
+ <li>an optional sequence of <a name="natItem">initialization items</a> in the
+ CDDR, where each may be
<ul>
<li>a positive number, stored as an unsigned byte value
<li>a negative number, whose absolute value is stored as an unsigned
diff --git a/doc/refS.html b/doc/refS.html
@@ -759,6 +759,24 @@ href="refS.html#sym">sym</a></code>.
-> (a "*" 3 "+" b "*" 4)
</code></pre>
+<dt><a name="str?"><code>(str? 'any) -> sym | NIL</code></a>
+<dd>Returns the argument <code>any</code> when it is a transient symbol
+(string), otherwise <code>NIL</code>. See also <code><a
+href="refS.html#sym?">sym?</a></code>, <code><a
+href="refB.html#box?">box?</a></code> and <code><a
+href="refE.html#ext?">ext?</a></code>.
+
+<pre><code>
+: (str? 123)
+-> NIL
+: (str? '{ABC})
+-> NIL
+: (str? 'abc)
+-> NIL
+: (str? "abc")
+-> "abc"
+</code></pre>
+
<dt><a name="strDat"><code>(strDat 'sym) -> dat</code></a>
<dd>Converts a string <code>sym</code> in the date format of the current
<code><a href="refL.html#locale">locale</a></code> to a <code><a
@@ -792,22 +810,49 @@ href="refD.html#datStr">datStr</a></code>.
-> (a b c)
</code></pre>
-<dt><a name="str?"><code>(str? 'any) -> sym | NIL</code></a>
-<dd>Returns the argument <code>any</code> when it is a transient symbol
-(string), otherwise <code>NIL</code>. See also <code><a
-href="refS.html#sym?">sym?</a></code>, <code><a
-href="refB.html#box?">box?</a></code> and <code><a
-href="refE.html#ext?">ext?</a></code>.
+<dt><a name="struct"><code>(struct 'num 'any 'any ..) -> any</code></a>
+<dd>Creates or extracts data structures, suitable to be passed to or returned
+from <code><a href="refN.html#native">native</a></code> C functions. The first
+<code>num</code> argument should be a native value, either a scalar, or a
+pointer obtained by calling functions like <code>malloc()</code>. The second
+argument <code>any</code> is a <a href="refN.html#natResult">result
+specification</a>, while all following <a
+href="refN.html#natItem">initialization items</a> are data items are stored in
+the structure pointed to by the first argument.
<pre><code>
-: (str? 123)
--> NIL
-: (str? '{ABC})
--> NIL
-: (str? 'abc)
+: (scl 2)
+-> 2
+
+## /* We assume the following C structure */
+## typedef struct value {
+## int x, y;
+## double a, b, c;
+## long z;
+## char nm[4];
+## } value;
+
+# Allocate structure
+: (setq P (native "@" "malloc" 'N 44))
+-> 9204032
+
+# Store to integers, three doubles, a long, and four characters
+: (struct P 'N -7 -4 (1.0 0.11 0.22 0.33) (7 . 8) 65 66 67 0)
+-> 9204032
+
+# Extract the structure
+: (struct P '((I . 2) (1.0 . 3) N (C . 4)))
+-> ((7 4) (11 22 33) 7 ("A" "B" "C" NIL))
+
+# Do both in a single call (allows conversions of data types)
+: (struct P
+ '((I . 2) (1.0 . 3) N (C . 4))
+ -7 -4 (1.0 0.11 0.22 0.33) (7 . 8) 65 66 67 0 )
+-> ((7 4) (11 22 33) 7 ("A" "B" "C" NIL))
+
+# De-allocate structure
+: (native "@" "free" NIL P)
-> NIL
-: (str? "abc")
--> "abc"
</code></pre>
<dt><a name="sub?"><code>(sub? 'any1 'any2) -> any2 | NIL</code></a>
diff --git a/ersatz/picolisp.jar b/ersatz/picolisp.jar
Binary files differ.
diff --git a/lib/map b/lib/map
@@ -32,9 +32,9 @@ and (1613 . "@src64/flow.l")
any (3965 . "@src64/io.l")
append (1338 . "@src64/subr.l")
apply (713 . "@src64/apply.l")
-arg (2323 . "@src64/main.l")
-args (2299 . "@src64/main.l")
-argv (2943 . "@src64/main.l")
+arg (2372 . "@src64/main.l")
+args (2348 . "@src64/main.l")
+argv (2992 . "@src64/main.l")
as (139 . "@src64/flow.l")
asoq (3008 . "@src64/subr.l")
assoc (2973 . "@src64/subr.l")
@@ -65,7 +65,7 @@ call (3079 . "@src64/flow.l")
car (5 . "@src64/subr.l")
case (1954 . "@src64/flow.l")
catch (2456 . "@src64/flow.l")
-cd (2698 . "@src64/main.l")
+cd (2747 . "@src64/main.l")
cdaaar (464 . "@src64/subr.l")
cdaadr (487 . "@src64/subr.l")
cdaar (179 . "@src64/subr.l")
@@ -88,7 +88,7 @@ circ (816 . "@src64/subr.l")
circ? (2402 . "@src64/subr.l")
clip (1799 . "@src64/subr.l")
close (4381 . "@src64/io.l")
-cmd (2925 . "@src64/main.l")
+cmd (2974 . "@src64/main.l")
cnt (1413 . "@src64/apply.l")
co (2537 . "@src64/flow.l")
commit (1498 . "@src64/db.l")
@@ -99,9 +99,9 @@ connect (224 . "@src64/net.l")
cons (747 . "@src64/subr.l")
copy (1225 . "@src64/subr.l")
ctl (4254 . "@src64/io.l")
-ctty (2723 . "@src64/main.l")
+ctty (2772 . "@src64/main.l")
cut (1922 . "@src64/sym.l")
-date (2437 . "@src64/main.l")
+date (2486 . "@src64/main.l")
dbck (2113 . "@src64/db.l")
de (532 . "@src64/flow.l")
dec (2323 . "@src64/big.l")
@@ -111,7 +111,7 @@ del (1977 . "@src64/sym.l")
delete (1401 . "@src64/subr.l")
delq (1452 . "@src64/subr.l")
diff (2589 . "@src64/subr.l")
-dir (2856 . "@src64/main.l")
+dir (2905 . "@src64/main.l")
dm (545 . "@src64/flow.l")
do (2130 . "@src64/flow.l")
e (2911 . "@src64/flow.l")
@@ -128,7 +128,7 @@ extern (1023 . "@src64/sym.l")
extra (1258 . "@src64/flow.l")
extract (1218 . "@src64/apply.l")
fifo (2088 . "@src64/sym.l")
-file (2803 . "@src64/main.l")
+file (2852 . "@src64/main.l")
fill (3243 . "@src64/subr.l")
filter (1161 . "@src64/apply.l")
fin (2033 . "@src64/subr.l")
@@ -166,7 +166,7 @@ ifn (1854 . "@src64/flow.l")
in (4194 . "@src64/io.l")
inc (2256 . "@src64/big.l")
index (2637 . "@src64/subr.l")
-info (2760 . "@src64/main.l")
+info (2809 . "@src64/main.l")
intern (998 . "@src64/sym.l")
ipid (3198 . "@src64/flow.l")
isa (961 . "@src64/flow.l")
@@ -183,7 +183,7 @@ lieu (1157 . "@src64/db.l")
line (3699 . "@src64/io.l")
lines (3852 . "@src64/io.l")
link (1172 . "@src64/subr.l")
-lisp (1995 . "@src64/main.l")
+lisp (2044 . "@src64/main.l")
list (887 . "@src64/subr.l")
listen (157 . "@src64/net.l")
lit (150 . "@src64/flow.l")
@@ -225,7 +225,7 @@ nand (1648 . "@src64/flow.l")
native (1376 . "@src64/main.l")
need (919 . "@src64/subr.l")
new (835 . "@src64/flow.l")
-next (2306 . "@src64/main.l")
+next (2355 . "@src64/main.l")
nil (1731 . "@src64/flow.l")
nond (1931 . "@src64/flow.l")
nor (1669 . "@src64/flow.l")
@@ -239,7 +239,7 @@ onOff (1738 . "@src64/sym.l")
one (1771 . "@src64/sym.l")
open (4338 . "@src64/io.l")
opid (3214 . "@src64/flow.l")
-opt (3046 . "@src64/main.l")
+opt (3095 . "@src64/main.l")
or (1629 . "@src64/flow.l")
out (4214 . "@src64/io.l")
pack (1270 . "@src64/sym.l")
@@ -272,7 +272,7 @@ push (1813 . "@src64/sym.l")
push1 (1849 . "@src64/sym.l")
put (2835 . "@src64/sym.l")
putl (3113 . "@src64/sym.l")
-pwd (2687 . "@src64/main.l")
+pwd (2736 . "@src64/main.l")
queue (2045 . "@src64/sym.l")
quit (1083 . "@src64/main.l")
quote (134 . "@src64/flow.l")
@@ -283,7 +283,7 @@ raw (449 . "@src64/main.l")
rd (5163 . "@src64/io.l")
read (2656 . "@src64/io.l")
replace (1499 . "@src64/subr.l")
-rest (2352 . "@src64/main.l")
+rest (2401 . "@src64/main.l")
reverse (1678 . "@src64/subr.l")
rewind (5129 . "@src64/io.l")
rollback (1898 . "@src64/db.l")
@@ -309,6 +309,7 @@ stem (1989 . "@src64/subr.l")
str (4019 . "@src64/io.l")
str? (1136 . "@src64/sym.l")
strip (1576 . "@src64/subr.l")
+struct (1835 . "@src64/main.l")
sub? (1569 . "@src64/sym.l")
sum (1460 . "@src64/apply.l")
super (1214 . "@src64/flow.l")
@@ -324,7 +325,7 @@ text (1398 . "@src64/sym.l")
throw (2482 . "@src64/flow.l")
tick (3166 . "@src64/flow.l")
till (3610 . "@src64/io.l")
-time (2570 . "@src64/main.l")
+time (2619 . "@src64/main.l")
touch (1172 . "@src64/sym.l")
trim (1759 . "@src64/subr.l")
try (1168 . "@src64/flow.l")
@@ -337,9 +338,9 @@ up (691 . "@src64/main.l")
upp? (3393 . "@src64/sym.l")
uppc (3460 . "@src64/sym.l")
use (1562 . "@src64/flow.l")
-usec (2675 . "@src64/main.l")
+usec (2724 . "@src64/main.l")
val (1588 . "@src64/sym.l")
-version (3060 . "@src64/main.l")
+version (3109 . "@src64/main.l")
wait (3150 . "@src64/io.l")
when (1873 . "@src64/flow.l")
while (2050 . "@src64/flow.l")
diff --git a/src/vers.h b/src/vers.h
@@ -1 +1 @@
-static byte Version[4] = {3,1,0,2};
+static byte Version[4] = {3,1,0,3};
diff --git a/src64/glob.l b/src64/glob.l
@@ -1,4 +1,4 @@
-# 20oct11abu
+# 22apr12abu
# (c) Software Lab. Alexander Burger
(data 'Data)
@@ -192,6 +192,7 @@
initFun NIL "quit" doQuit
initFun NIL "errno" doErrno
initFun NIL "native" doNative
+ initFun NIL "struct" doStruct
initFun NIL "lisp" doLisp
initFun NIL "args" doArgs
initFun NIL "next" doNext
diff --git a/src64/main.l b/src64/main.l
@@ -1,4 +1,4 @@
-# 16apr12abu
+# 23apr12abu
# (c) Software Lab. Alexander Burger
(code 'Code)
@@ -1372,7 +1372,7 @@
or E CNT
ret
-# (native 'cnt1|sym1 'cnt2|sym2 'sym|lst 'any ..) -> any
+# (native 'cnt1|sym1 'cnt2|sym2 'any 'any ..) -> any
(code 'doNative 2)
push X
push Y
@@ -1525,102 +1525,8 @@
atom E # Fill structure?
while z # Yes
ld A (E) # Next value
- atom A # Byte or unsigned?
- if nz # Yes
- shr A 4 # Byte?
- if nc # Yes
- ld (Z) B # Store byte in buffer
- inc Z # Increment buffer pointer
- dec C # Buffer full?
- else
- st4 (Z) # Store unsigned in buffer
- add Z 4 # Size of unsigned
- sub C 4 # Buffer full?
- end
- else # (num|sym . cnt) or ([-]1.0 . lst)
- push X
- ld X (A CDR) # 'cnt' or 'lst'
- ld A (A) # 'num', 'sym' or [-]1.0
- cnt X # 'cnt'?
- if nz # Yes
- push Y
- ld Y Z # Y on buffer
- shr X 4 # Normalize length
- add Z X # Field width
- sub C X # New buffer size
- num A # (num . cnt)?
- if nz # Yes
- cnt A # Short?
- if nz # Yes
- shr A 4 # Normalize
- if c # Sign?
- neg A # Yes
- end
- else
- test A SIGN # Sign?
- if z # No
- ld A (A DIG)
- else
- ld A (A (- DIG SIGN))
- neg A # Negate
- end
- end
- ? *LittleEndian
- do
- ld (Y) B # Store byte
- inc Y # Increment pointer
- shr A 8
- dec X # Done?
- until z # Yes
- =
- ? (not *LittleEndian)
- ld Y Z
- do
- dec Y # Decrement pointer
- ld (Y) B # Store byte
- shr A 8
- dec X # Done?
- until z # Yes
- =
- else
- sym A # (sym . cnt)?
- if nz # Yes
- push C
- ld X (A TAIL) # Get name
- call nameX_X
- ld C 0
- do
- call symByteCX_FACX # Next byte
- while nz
- ld (Y) B # Store it
- inc Y # Increment pointer
- loop
- set (Y) 0 # Null byte
- pop C
- end
- end
- pop Y
- else # ([-]1.0 . lst)
- do
- atom X # More fixpoint numbers?
- while z # Yes
- float # Convert to floating point
- test A SIGN # Scale negative?
- if z # No
- std # Store double value
- add Z 8 # Size of double
- sub C 8 # Decrement buffer size
- else
- stf # Store float value
- add Z 4 # Size of float
- sub C 4 # Decrement buffer size
- end
- ld X (X CDR)
- loop
- end
- pop X
- null C # Buffer full?
- end
+ call natBufACZ_CZ # Store in buffer
+ null C # Buffer full?
until z # Yes
pop Z
end
@@ -1678,6 +1584,105 @@
pop X
ret
+(code 'natBufACZ_CZ 0)
+ atom A # Byte or unsigned?
+ if nz # Yes
+ shr A 4 # Byte?
+ if nc # Yes
+ ld (Z) B # Store byte in buffer
+ inc Z # Increment buffer pointer
+ dec C # Decrement size
+ ret
+ end
+ st4 (Z) # Store unsigned in buffer
+ add Z 4 # Size of unsigned
+ sub C 4 # Decrement size
+ ret
+ end
+ # (num|sym . cnt) or ([-]1.0 . lst)
+ push X
+ ld X (A CDR) # 'cnt' or 'lst'
+ ld A (A) # 'num', 'sym' or [-]1.0
+ cnt X # 'cnt'?
+ if nz # Yes
+ push Y
+ ld Y Z # Y on buffer
+ shr X 4 # Normalize length
+ add Z X # Field width
+ sub C X # New buffer size
+ num A # (num . cnt)?
+ if nz # Yes
+ cnt A # Short?
+ if nz # Yes
+ shr A 4 # Normalize
+ if c # Sign?
+ neg A # Yes
+ end
+ else
+ test A SIGN # Sign?
+ if z # No
+ ld A (A DIG)
+ else
+ ld A (A (- DIG SIGN))
+ neg A # Negate
+ end
+ end
+ ? *LittleEndian
+ do
+ ld (Y) B # Store byte
+ inc Y # Increment pointer
+ shr A 8
+ dec X # Done?
+ until z # Yes
+ =
+ ? (not *LittleEndian)
+ ld Y Z
+ do
+ dec Y # Decrement pointer
+ ld (Y) B # Store byte
+ shr A 8
+ dec X # Done?
+ until z # Yes
+ =
+ else
+ sym A # (sym . cnt)?
+ if nz # Yes
+ push C
+ ld X (A TAIL) # Get name
+ call nameX_X
+ ld C 0
+ do
+ call symByteCX_FACX # Next byte
+ while nz
+ ld (Y) B # Store it
+ inc Y # Increment pointer
+ loop
+ set (Y) 0 # Null byte
+ pop C
+ end
+ end
+ pop Y
+ else # ([-]1.0 . lst)
+ do
+ atom X # More fixpoint numbers?
+ while z # Yes
+ float # Convert to floating point
+ test A SIGN # Scale negative?
+ if z # No
+ std # Store double value
+ add Z 8 # Size of double
+ sub C 8 # Decrement buffer size
+ else
+ stf # Store float value
+ add Z 4 # Size of float
+ sub C 4 # Decrement buffer size
+ end
+ ld X (X CDR)
+ loop
+ end
+ pop X
+ ret
+
(code 'natRetACE_CE 0)
cmp E Nil # NIL?
if ne
@@ -1826,6 +1831,50 @@
end
ret
+# (struct 'num 'any 'any ..) -> any
+(code 'doStruct 2)
+ push X
+ push Y
+ push Z
+ ld X E
+ ld Y (E CDR) # Y on args
+ ld E (Y) # Eval native value (pointer or scalar)
+ eval
+ num E # Number?
+ jz numErrEX # No
+ cnt E # Short?
+ if nz # Yes
+ shr E 4 # Normalize
+ ld Z E # Native value in Z
+ else
+ ld Z (E DIG) # Native value in Z
+ end
+ ld Y (Y CDR) # Next arg
+ ld E (Y)
+ eval # Eval 'any'
+ link
+ push E # <L I> Result specification
+ link
+ push Z # Save native value
+ do
+ ld Y (Y CDR) # Arguments?
+ atom Y
+ while z # Yes
+ ld E (Y) # Eval next struct element
+ eval
+ ld A E # in A (unused C)
+ call natBufACZ_CZ # Store in buffer
+ loop
+ pop A # Get native value
+ ld C 0 # No pointer yet
+ ld E (L I) # Result specification
+ call natRetACE_CE # Extract return value
+ drop
+ pop Z
+ pop Y
+ pop X
+ ret
+
(code 'fetchCharC_AC 0)
ld B (C) # Fetch first byte
zxt
diff --git a/src64/tags b/src64/tags
@@ -16,16 +16,16 @@ AI_NEXT sys/x86-64.linux.defs.l 148
AI_SOCKTYPE sys/x86-64.linux.defs.l 145
AV glob.l 7
AV0 glob.l 8
-Addr glob.l 616
+Addr glob.l 617
Adr glob.l 178
Alarm glob.l 77
-AllocErr glob.l 1159
-ArgErr glob.l 1188
-Arrow glob.l 1175
+AllocErr glob.l 1160
+ArgErr glob.l 1189
+Arrow glob.l 1176
At glob.l 158
At2 glob.l 159
At3 glob.l 160
-AtomErr glob.l 1194
+AtomErr glob.l 1195
Avail glob.l 11
BEG defs.l 44
BIG defs.l 35
@@ -34,15 +34,15 @@ BLKSIZE defs.l 54
BLKTAG defs.l 55
BSym glob.l 154
BUFSIZ sys/x86-64.linux.defs.l 26
-BadChain glob.l 1180
-BadCount glob.l 1181
-BadDot glob.l 1214
-BadFdErr glob.l 1209
-BadInput glob.l 1213
+BadChain glob.l 1181
+BadCount glob.l 1182
+BadDot glob.l 1215
+BadFdErr glob.l 1210
+BadInput glob.l 1214
BlkIndex glob.l 68
BlkLink glob.l 69
Break glob.l 50
-BrkErr glob.l 1203
+BrkErr glob.l 1204
Buf glob.l 12
BufEnd glob.l 54
Bye glob.l 180
@@ -57,20 +57,20 @@ CSym glob.l 153
C_CC sys/x86-64.linux.defs.l 73
C_IFLAG sys/x86-64.linux.defs.l 71
C_LFLAG sys/x86-64.linux.defs.l 72
-CaseBlocks glob.l 623
-CaseData glob.l 753
-CaseLower glob.l 1114
-CaseUpper glob.l 1090
+CaseBlocks glob.l 624
+CaseData glob.l 754
+CaseLower glob.l 1115
+CaseUpper glob.l 1091
Catch glob.l 20
-CbErr glob.l 1162
-CellErr glob.l 1193
+CbErr glob.l 1163
+CellErr glob.l 1194
Child glob.l 44
Children glob.l 43
-Chr glob.l 584
-CircFree glob.l 1179
+Chr glob.l 585
+CircFree glob.l 1180
Class glob.l 167
-CloseErr glob.l 1205
-CntErr glob.l 1190
+CloseErr glob.l 1206
+CntErr glob.l 1191
Code main.l 4
DB glob.l 144
DB1 defs.l 11
@@ -78,24 +78,24 @@ DBs glob.l 63
DIG defs.l 36
DOT defs.l 45
D_NAME sys/x86-64.linux.defs.l 122
-Dashes glob.l 1184
+Dashes glob.l 1185
Data glob.l 4
-Db1 glob.l 563
+Db1 glob.l 564
DbBlock glob.l 66
DbFile glob.l 64
DbFiles glob.l 65
DbJnl glob.l 70
DbLog glob.l 71
-DbRdErr glob.l 1228
-DbSizErr glob.l 1230
-DbSyncErr glob.l 1222
-DbWrErr glob.l 1229
-DbfErr glob.l 1225
+DbRdErr glob.l 1229
+DbSizErr glob.l 1231
+DbSyncErr glob.l 1223
+DbWrErr glob.l 1230
+DbfErr glob.l 1226
Dbg glob.l 163
-Delim glob.l 1173
-DelimEnd glob.l 1174
-DivErr glob.l 1197
-DlErr glob.l 1240
+Delim glob.l 1174
+DelimEnd glob.l 1175
+DivErr glob.l 1198
+DlErr glob.l 1241
EACCES sys/x86-64.linux.defs.l 9
EAGAIN sys/x86-64.linux.defs.l 8
EBADF sys/x86-64.linux.defs.l 7
@@ -105,40 +105,40 @@ END defs.l 46
ENOENT sys/x86-64.linux.defs.l 5
EPIPE sys/x86-64.linux.defs.l 10
EXTERN defs.l 50
-Env glob.l 589
-EnvApply glob.l 600
-EnvArgs glob.l 596
-EnvBind glob.l 590
-EnvCls glob.l 598
-EnvCo glob.l 583
-EnvCo7 glob.l 607
-EnvCtlFrames glob.l 594
-EnvEnd glob.l 611
-EnvErrFrames glob.l 593
-EnvInFrames glob.l 591
-EnvIntern glob.l 595
-EnvKey glob.l 599
-EnvMake glob.l 601
-EnvMid glob.l 606
-EnvNext glob.l 597
-EnvOutFrames glob.l 592
-EnvParseC glob.l 604
-EnvParseEOF glob.l 605
-EnvParseX glob.l 603
-EnvProtect glob.l 609
-EnvTask glob.l 608
-EnvTrace glob.l 610
-EnvYoke glob.l 602
-EofErr glob.l 1211
+Env glob.l 590
+EnvApply glob.l 601
+EnvArgs glob.l 597
+EnvBind glob.l 591
+EnvCls glob.l 599
+EnvCo glob.l 584
+EnvCo7 glob.l 608
+EnvCtlFrames glob.l 595
+EnvEnd glob.l 612
+EnvErrFrames glob.l 594
+EnvInFrames glob.l 592
+EnvIntern glob.l 596
+EnvKey glob.l 600
+EnvMake glob.l 602
+EnvMid glob.l 607
+EnvNext glob.l 598
+EnvOutFrames glob.l 593
+EnvParseC glob.l 605
+EnvParseEOF glob.l 606
+EnvParseX glob.l 604
+EnvProtect glob.l 610
+EnvTask glob.l 609
+EnvTrace glob.l 611
+EnvYoke glob.l 603
+EofErr glob.l 1212
Err glob.l 173
-ErrTok glob.l 1183
-ExecErr glob.l 1158
+ErrTok glob.l 1184
+ExecErr glob.l 1159
Ext glob.l 165
-ExtErr glob.l 1192
+ExtErr glob.l 1193
ExtN glob.l 45
-Extern glob.l 565
+Extern glob.l 566
Extn glob.l 46
-ExtraErr glob.l 1167
+ExtraErr glob.l 1168
FD_CLOEXEC sys/x86-64.linux.defs.l 23
FD_SET sys/x86-64.linux.defs.l 111
FLOCK sys/x86-64.linux.defs.l 36
@@ -153,18 +153,18 @@ F_SETLKW sys/x86-64.linux.defs.l 51
F_SETOWN sys/x86-64.linux.defs.l 52
F_UNLCK sys/x86-64.linux.defs.l 46
F_WRLCK sys/x86-64.linux.defs.l 45
-Flock glob.l 614
+Flock glob.l 615
Fork glob.l 179
-ForkErr glob.l 1207
+ForkErr glob.l 1208
GcCount glob.l 51
GcMark glob.l 74
GcMarkEnd glob.l 129
-GcSymEnd glob.l 569
+GcSymEnd glob.l 570
GetBinZ_FB glob.l 30
-Get_A glob.l 586
-Giveup glob.l 1157
+Get_A glob.l 587
+Giveup glob.l 1158
HEAP defs.l 5
-HashBlank glob.l 1164
+HashBlank glob.l 1165
Heaps glob.l 10
Hear glob.l 39
Home glob.l 9
@@ -180,20 +180,20 @@ ISIG sys/x86-64.linux.defs.l 74
ISym glob.l 150
IV defs.l 17
IX defs.l 22
-IdErr glob.l 1227
-IgnLog glob.l 1178
-InBye glob.l 1144
+IdErr glob.l 1228
+IgnLog glob.l 1179
+InBye glob.l 1145
InFDs glob.l 25
-InFile glob.l 587
+InFile glob.l 588
InFiles glob.l 26
-IpBindErr glob.l 1236
-IpGetsocknameErr glob.l 1233
-IpListenErr glob.l 1237
-IpReuseaddrErr glob.l 1235
-IpSocketErr glob.l 1232
-IpV6onlyErr glob.l 1234
-Jam glob.l 1143
-JnlErr glob.l 1226
+IpBindErr glob.l 1237
+IpGetsocknameErr glob.l 1234
+IpListenErr glob.l 1238
+IpReuseaddrErr glob.l 1236
+IpSocketErr glob.l 1233
+IpV6onlyErr glob.l 1235
+Jam glob.l 1144
+JnlErr glob.l 1227
L_LEN sys/x86-64.linux.defs.l 40
L_PID sys/x86-64.linux.defs.l 41
L_START sys/x86-64.linux.defs.l 39
@@ -205,25 +205,25 @@ LineX glob.l 79
Link glob.l 19
Lisp glob.l 80
LispEnd glob.l 128
-LockErr glob.l 1224
-LstErr glob.l 1195
+LockErr glob.l 1225
+LstErr glob.l 1196
MAXPATHLEN sys/x86-64.linux.defs.l 29
-MakeErr glob.l 1199
+MakeErr glob.l 1200
MaxBlkSize glob.l 67
Meth glob.l 145
Mic glob.l 37
-Month glob.l 1146
+Month glob.l 1147
Msg glob.l 174
-MsgErr glob.l 1202
+MsgErr glob.l 1203
NIX defs.l 43
NI_MAXHOST sys/x86-64.linux.defs.l 135
NI_NAMEREQD sys/x86-64.linux.defs.l 136
NSym glob.l 151
NUMBER defs.l 47
Nil glob.l 134
-NoFdErr glob.l 1210
+NoFdErr glob.l 1211
NoMemory main.l 211
-NumErr glob.l 1189
+NumErr glob.l 1190
ONE defs.l 9
OS glob.l 143
O_APPEND sys/x86-64.linux.defs.l 20
@@ -235,32 +235,32 @@ O_RDONLY sys/x86-64.linux.defs.l 14
O_RDWR sys/x86-64.linux.defs.l 16
O_TRUNC sys/x86-64.linux.defs.l 19
O_WRONLY sys/x86-64.linux.defs.l 15
-OpenErr glob.l 1204
-OrgTermio glob.l 613
+OpenErr glob.l 1205
+OrgTermio glob.l 614
OutFDs glob.l 27
-OutFile glob.l 588
+OutFile glob.l 589
OutFiles glob.l 28
PIPE_BUF sys/x86-64.linux.defs.l 27
PPid glob.l 156
-PRepl glob.l 1142
+PRepl glob.l 1143
Penv glob.l 56
Pico glob.l 137
Pid glob.l 157
-PidSigMsg glob.l 1160
-PipeErr glob.l 1206
+PidSigMsg glob.l 1161
+PipeErr glob.l 1207
Pnl glob.l 57
Prompt glob.l 162
-ProtErr glob.l 1185
-PutB glob.l 585
+ProtErr glob.l 1186
+PutB glob.l 586
PutBinBZ glob.l 29
-QuitMsg glob.l 1161
+QuitMsg glob.l 1162
Quote glob.l 146
RTLD_GLOBAL sys/x86-64.linux.defs.l 33
RTLD_LAZY sys/x86-64.linux.defs.l 32
-Redefined glob.l 1165
-ReentErr glob.l 1200
-RenErr glob.l 1198
-Repl glob.l 1141
+Redefined glob.l 1166
+ReentErr glob.l 1201
+RenErr glob.l 1199
+Repl glob.l 1142
Ret main.l 8
RetE_E main.l 28
RetNil main.l 22
@@ -269,7 +269,7 @@ Retc main.l 10
Retnc main.l 13
Retnz main.l 19
Retz main.l 16
-RolbLog glob.l 1177
+RolbLog glob.l 1178
Run glob.l 168
SA_FLAGS sys/x86-64.linux.defs.l 84
SA_HANDLER sys/x86-64.linux.defs.l 82
@@ -316,10 +316,10 @@ S_IFDIR sys/x86-64.linux.defs.l 62
S_IFMT sys/x86-64.linux.defs.l 61
Scl glob.l 166
Seed glob.l 31
-SelectErr glob.l 1215
+SelectErr glob.l 1216
Sep0 glob.l 52
Sep3 glob.l 53
-SetFD glob.l 1172
+SetFD glob.l 1173
Sig1 glob.l 170
Sig2 glob.l 171
Sigio glob.l 78
@@ -330,20 +330,20 @@ SpMiPipe glob.l 38
Spkr glob.l 36
Stack0 glob.l 15
Stacks glob.l 16
-StkErr glob.l 1187
+StkErr glob.l 1188
StkLimit glob.l 18
StkSize glob.l 17
StrC glob.l 48
StrX glob.l 47
-SuparErr glob.l 1212
-SuperErr glob.l 1166
-SymErr glob.l 1191
-SymNsErr glob.l 1186
+SuparErr glob.l 1213
+SuperErr glob.l 1167
+SymErr glob.l 1192
+SymNsErr glob.l 1187
SymTab glob.l 133
-SymTabEnd glob.l 556
-Sync glob.l 1145
+SymTabEnd glob.l 557
+Sync glob.l 1146
TAIL defs.l 40
-TBuf glob.l 618
+TBuf glob.l 619
TCSADRAIN sys/x86-64.linux.defs.l 77
TERMIOS sys/x86-64.linux.defs.l 70
TMS sys/x86-64.linux.defs.l 65
@@ -361,27 +361,27 @@ TSym glob.l 147
Talking glob.l 42
Tell glob.l 40
TellBuf glob.l 41
-TellErr glob.l 1231
+TellErr glob.l 1232
Termio glob.l 21
-TgOS glob.l 559
+TgOS glob.l 560
This glob.l 161
-ThrowErr glob.l 1168
+ThrowErr glob.l 1169
TickS glob.l 34
TickU glob.l 33
Time glob.l 22
-Tio glob.l 1139
-Tms glob.l 615
-TrSyncErr glob.l 1223
+Tio glob.l 1140
+Tms glob.l 616
+TrSyncErr glob.l 1224
Transient glob.l 75
-Trc1 glob.l 1169
-Trc2 glob.l 1170
-TruncErr glob.l 1221
+Trc1 glob.l 1170
+Trc2 glob.l 1171
+TruncErr glob.l 1222
Tsm glob.l 177
TtyPid glob.l 24
UDPMAX defs.l 58
USec glob.l 23
-UdpOvflErr glob.l 1238
-UndefErr glob.l 1239
+UdpOvflErr glob.l 1239
+UndefErr glob.l 1240
Uni glob.l 175
Up glob.l 172
V defs.l 18
@@ -390,24 +390,24 @@ VII defs.l 20
VIII defs.l 21
VMIN sys/x86-64.linux.defs.l 75
VTIME sys/x86-64.linux.defs.l 76
-VarErr glob.l 1196
-Version glob.l 572
+VarErr glob.l 1197
+Version glob.l 573
WNOHANG sys/x86-64.linux.defs.l 107
WUNTRACED sys/x86-64.linux.defs.l 108
-WaitPidErr glob.l 1208
-WrBytesErr glob.l 1216
-WrChildErr glob.l 1217
-WrJnlErr glob.l 1219
-WrLogErr glob.l 1220
-WrSyncErr glob.l 1218
-YieldErr glob.l 1201
+WaitPidErr glob.l 1209
+WrBytesErr glob.l 1217
+WrChildErr glob.l 1218
+WrJnlErr glob.l 1220
+WrLogErr glob.l 1221
+WrSyncErr glob.l 1219
+YieldErr glob.l 1202
ZERO defs.l 8
Zap glob.l 164
-_a_ glob.l 1151
-_ap_ glob.l 1152
-_dot_ glob.l 1153
-_r_ glob.l 1149
-_w_ glob.l 1150
+_a_ glob.l 1152
+_ap_ glob.l 1153
+_dot_ glob.l 1154
+_r_ glob.l 1150
+_w_ glob.l 1151
addAE_A big.l 1517
adduAE_A big.l 540
allocAE_A main.l 207
@@ -425,12 +425,12 @@ badFdErrEX err.l 525
badInputErrB err.l 545
balanceCEY sym.l 910
balanceXY sym.l 892
-begString main.l 2261
+begString main.l 2310
binPrintEZ io.l 730
binReadZ_FE io.l 519
blkPeekCEZ db.l 392
blkPokeCEZ db.l 403
-boxE_E main.l 2229
+boxE_E main.l 2278
boxNumA_A gc.l 872
boxNumE_E gc.l 886
boxNum_A gc.l 824
@@ -446,31 +446,31 @@ byteNumBCX_CX io.l 463
byteSymBCX_CX io.l 1291
caseDataA_AC sym.l 3366
caught flow.l 2472
-cbl main.l 1864
-cbl1 main.l 1897
-cbl10 main.l 1933
-cbl11 main.l 1937
-cbl12 main.l 1941
-cbl13 main.l 1945
-cbl14 main.l 1949
-cbl15 main.l 1953
-cbl16 main.l 1957
-cbl17 main.l 1961
-cbl18 main.l 1965
-cbl19 main.l 1969
-cbl2 main.l 1901
-cbl20 main.l 1973
-cbl21 main.l 1977
-cbl22 main.l 1981
-cbl23 main.l 1985
-cbl24 main.l 1989
-cbl3 main.l 1905
-cbl4 main.l 1909
-cbl5 main.l 1913
-cbl6 main.l 1917
-cbl7 main.l 1921
-cbl8 main.l 1925
-cbl9 main.l 1929
+cbl main.l 1913
+cbl1 main.l 1946
+cbl10 main.l 1982
+cbl11 main.l 1986
+cbl12 main.l 1990
+cbl13 main.l 1994
+cbl14 main.l 1998
+cbl15 main.l 2002
+cbl16 main.l 2006
+cbl17 main.l 2010
+cbl18 main.l 2014
+cbl19 main.l 2018
+cbl2 main.l 1950
+cbl20 main.l 2022
+cbl21 main.l 2026
+cbl22 main.l 2030
+cbl23 main.l 2034
+cbl24 main.l 2038
+cbl3 main.l 1954
+cbl4 main.l 1958
+cbl5 main.l 1962
+cbl6 main.l 1966
+cbl7 main.l 1970
+cbl8 main.l 1974
+cbl9 main.l 1978
cellErrAX err.l 438
cellErrEX err.l 440
charSymACX_CX io.l 1256
@@ -534,7 +534,7 @@ ctOpenEXY io.l 1670
currFdX_C io.l 1333
currFd_C io.l 1337
cutLocalCX flow.l 2824
-dateXYZ_E main.l 2376
+dateXYZ_E main.l 2425
dbAEX db.l 1331
dbFetchEX db.l 1319
dbFileBlkY_AC db.l 246
@@ -564,9 +564,9 @@ doAnd flow.l 1613
doAny io.l 3965
doAppend subr.l 1338
doApply apply.l 713
-doArg main.l 2323
-doArgs main.l 2299
-doArgv main.l 2943
+doArg main.l 2372
+doArgs main.l 2348
+doArgv main.l 2992
doArrow subr.l 3916
doAs flow.l 139
doAsoq subr.l 3008
@@ -602,7 +602,7 @@ doCall flow.l 3079
doCar subr.l 5
doCase flow.l 1954
doCatch flow.l 2456
-doCd main.l 2698
+doCd main.l 2747
doCdaaar subr.l 464
doCdaadr subr.l 487
doCdaar subr.l 179
@@ -625,7 +625,7 @@ doCirc subr.l 816
doCircQ subr.l 2402
doClip subr.l 1799
doClose io.l 4381
-doCmd main.l 2925
+doCmd main.l 2974
doCnt apply.l 1413
doCo flow.l 2537
doCol sym.l 3051
@@ -637,9 +637,9 @@ doConnect net.l 224
doCons subr.l 747
doCopy subr.l 1225
doCtl io.l 4254
-doCtty main.l 2723
+doCtty main.l 2772
doCut sym.l 1922
-doDate main.l 2437
+doDate main.l 2486
doDbck db.l 2113
doDe flow.l 532
doDec big.l 2323
@@ -649,7 +649,7 @@ doDel sym.l 1977
doDelete subr.l 1401
doDelq subr.l 1452
doDiff subr.l 2589
-doDir main.l 2856
+doDir main.l 2905
doDiv big.l 2513
doDm flow.l 545
doDo flow.l 2130
@@ -671,7 +671,7 @@ doExtern sym.l 1023
doExtra flow.l 1258
doExtract apply.l 1218
doFifo sym.l 2088
-doFile main.l 2803
+doFile main.l 2852
doFill subr.l 3243
doFilter apply.l 1161
doFin subr.l 2033
@@ -712,7 +712,7 @@ doIfn flow.l 1854
doIn io.l 4194
doInc big.l 2256
doIndex subr.l 2637
-doInfo main.l 2760
+doInfo main.l 2809
doIntern sym.l 998
doIpid flow.l 3198
doIsa flow.l 961
@@ -730,7 +730,7 @@ doLieu db.l 1157
doLine io.l 3699
doLines io.l 3852
doLink subr.l 1172
-doLisp main.l 1995
+doLisp main.l 2044
doList subr.l 887
doListen net.l 157
doLit flow.l 150
@@ -776,7 +776,7 @@ doNand flow.l 1648
doNative main.l 1376
doNeed subr.l 919
doNew flow.l 835
-doNext main.l 2306
+doNext main.l 2355
doNil flow.l 1731
doNond flow.l 1931
doNor flow.l 1669
@@ -790,7 +790,7 @@ doOnOff sym.l 1738
doOne sym.l 1771
doOpen io.l 4338
doOpid flow.l 3214
-doOpt main.l 3046
+doOpt main.l 3095
doOr flow.l 1629
doOut io.l 4214
doPack sym.l 1270
@@ -824,7 +824,7 @@ doPush sym.l 1813
doPush1 sym.l 1849
doPut sym.l 2835
doPutl sym.l 3113
-doPwd main.l 2687
+doPwd main.l 2736
doQueue sym.l 2045
doQuit main.l 1083
doQuote flow.l 134
@@ -836,7 +836,7 @@ doRd io.l 5163
doRead io.l 2656
doRem big.l 2572
doReplace subr.l 1499
-doRest main.l 2352
+doRest main.l 2401
doReverse subr.l 1678
doRewind io.l 5129
doRollback db.l 1898
@@ -865,6 +865,7 @@ doStem subr.l 1989
doStr io.l 4019
doStrQ sym.l 1136
doStrip subr.l 1576
+doStruct main.l 1835
doSub big.l 2209
doSubQ sym.l 1569
doSum apply.l 1460
@@ -881,7 +882,7 @@ doText sym.l 1398
doThrow flow.l 2482
doTick flow.l 3166
doTill io.l 3610
-doTime main.l 2570
+doTime main.l 2619
doTouch sym.l 1172
doTrace flow.l 2950
doTrim subr.l 1759
@@ -895,9 +896,9 @@ doUp main.l 691
doUppQ sym.l 3393
doUppc sym.l 3460
doUse flow.l 1562
-doUsec main.l 2675
+doUsec main.l 2724
doVal sym.l 1588
-doVersion main.l 3060
+doVersion main.l 3109
doWait io.l 3150
doWhen flow.l 1873
doWhile flow.l 2050
@@ -910,7 +911,7 @@ doYield flow.l 2706
doYoke subr.l 1196
doZap sym.l 1186
doZero sym.l 1756
-endString_E main.l 2272
+endString_E main.l 2321
eofErr err.l 534
eolA_F io.l 3684
equalAE_F main.l 770
@@ -919,15 +920,15 @@ errEXYZ err.l 33
errnoC sys/x86-64.linux.code.l 10
errnoEXY err.l 24
errno_A sys/x86-64.linux.code.l 5
-evCntEX_FE main.l 2200
-evCntXY_FE main.l 2198
+evCntEX_FE main.l 2249
+evCntXY_FE main.l 2247
evExprCE_E main.l 1101
evListE_E main.l 1245
evMethodACXYZ_E flow.l 645
-evSymE_E main.l 2175
-evSymX_E main.l 2170
-evSymY_E main.l 2173
-execE main.l 2084
+evSymE_E main.l 2224
+evSymX_E main.l 2219
+evSymY_E main.l 2222
+execE main.l 2133
execErrS main.l 187
extErrEX err.l 434
extNmCE_X db.l 64
@@ -937,7 +938,7 @@ fdRdSetCZL io.l 2718
fdSetCL_X io.l 2706
fdSetC_Y io.l 3309
fdWrSetCZL io.l 2725
-fetchCharC_AC main.l 1829
+fetchCharC_AC main.l 1878
fileObjE_AC db.l 237
fileObjX_AC db.l 211
fillE_FE subr.l 3261
@@ -955,7 +956,7 @@ fmtWordACX_CX big.l 2046
forkErrX err.l 515
forkLispX_FE flow.l 3266
fsyncDB db.l 932
-funqE_FE main.l 2108
+funqE_FE main.l 2157
gc gc.l 65
getAdrZ_A db.l 6
getBinaryZ_FB io.l 447
@@ -997,7 +998,7 @@ isaCE_F flow.l 1012
jnlErrX err.l 618
jnlFileno_A db.l 344
joinLocalCX flow.l 2837
-lisp main.l 2038
+lisp main.l 2087
loadAllX_E main.l 162
loadBEX_E io.l 4072
lockErr err.l 607
@@ -1021,7 +1022,7 @@ methodEY_FCYZ flow.l 791
mkCharA_A sym.l 573
mkStrEZ_A sym.l 650
mkStrE_E sym.l 623
-msec_A main.l 2286
+msec_A main.l 2335
msgErrAX err.l 488
msgErrEX err.l 490
msgErrYX err.l 486
@@ -1030,7 +1031,8 @@ nameA_A sym.l 469
nameE_E sym.l 477
nameX_X sym.l 485
nameY_Y sym.l 493
-natRetACE_CE main.l 1681
+natBufACZ_CZ main.l 1587
+natRetACE_CE main.l 1686
needC gc.l 54
needSymAX err.l 323
needSymEX err.l 335
@@ -1086,7 +1088,7 @@ putACE sym.l 2491
putBlockBZ db.l 612
putSrcEC_E flow.l 25
putStdoutB io.l 4625
-putStringB main.l 2249
+putStringB main.l 2298
putTellBZ io.l 996
putUdpBZ net.l 377
rdAtomBY_E io.l 2117
@@ -1123,7 +1125,7 @@ retnc err.l 710
retnz err.l 716
retz err.l 713
rewindLog db.l 928
-runE_E main.l 2096
+runE_E main.l 2145
rwUnlockDbA db.l 269
s_isdirS_F sys/x86-64.linux.code.l 16
selectErrX err.l 558
@@ -1173,8 +1175,8 @@ tellErr err.l 646
tenfoldA_A big.l 157
testEscA_F io.l 2050
throwErrZX flow.l 2507
-tmDateC_E main.l 2366
-tmTimeY_E main.l 2553
+tmDateC_E main.l 2415
+tmTimeY_E main.l 2602
tokenCE_E io.l 2522
trSyncErrX err.l 602
traceCY flow.l 3022
@@ -1215,10 +1217,10 @@ wrOpenEXY io.l 1495
wrSetCL_F io.l 2737
wrSyncErrX err.l 575
wtermsigS_A sys/x86-64.linux.code.l 34
-xCntAX_FA main.l 2220
-xCntCX_FC main.l 2211
-xCntEX_FE main.l 2202
-xSymE_E main.l 2177
+xCntAX_FA main.l 2269
+xCntCX_FC main.l 2260
+xCntEX_FE main.l 2251
+xSymE_E main.l 2226
xoruAE_A big.l 465
yieldErrEX err.l 482
yieldErrX err.l 480
diff --git a/src64/version.l b/src64/version.l
@@ -1,6 +1,6 @@
-# 17apr12abu
+# 23apr12abu
# (c) Software Lab. Alexander Burger
-(de *Version 3 1 0 2)
+(de *Version 3 1 0 3)
# vi:et:ts=3:sw=3