aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--elymas/lib/sys.ey23
-rw-r--r--elymas/lib/sys/linux.ey63
-rw-r--r--elymas/lib/txt.ey8
-rw-r--r--elymas/lib/util.ey13
-rw-r--r--elymas/lib/xml.ey20
-rw-r--r--elymas/loaded.ey2
-rw-r--r--elymas/shared.ey2
-rw-r--r--examples/working-loaded/xml.test20
8 files changed, 115 insertions, 36 deletions
diff --git a/elymas/lib/sys.ey b/elymas/lib/sys.ey
new file mode 100644
index 0000000..85d5c5f
--- /dev/null
+++ b/elymas/lib/sys.ey
@@ -0,0 +1,23 @@
+# abstract system io layer
+
+{ # ==directory
+ "\0" cat 511 sys .linux .mkdir 0 neq { ??io.dir.mk } rep
+} /mkdir sys .deff
+
+{ # ==directory
+ "\0" cat sys .linux .ORDONLY sys .linux .ODIRECTORY bor 0 sys .linux .open ==fd
+ fd 0 lt { ??io.dir.ls.open } {
+ [ [ { fd sys .linux .getdents64 _ 0 lt { ??io.dir.ls.getdents } rep } { _ len dearray } loop ] { .dname } each ]
+ fd sys .linux .close 0 lt { ??io.dir.ls.close } rep
+ } ? *
+} /readdir sys .deff
+
+{ # ==directory
+ sys .readdir { 0 -01 * 0 "." * neq } grep
+} /ls sys .deff
+
+{
+ "\0" cat -01 "\0" cat -01 sys .linux .rename 0 neq { ??io.rename } rep
+} /rename sys .deff
+
+# vim: syn=elymas
diff --git a/elymas/lib/sys/linux.ey b/elymas/lib/sys/linux.ey
index 127f76f..d81995d 100644
--- a/elymas/lib/sys/linux.ey
+++ b/elymas/lib/sys/linux.ey
@@ -75,7 +75,7 @@
# 211 ==:GETTHREADAREA
# 79 ==:GETCWD
# 78 ==:GETDENTS
- # 217 ==:GETDENTS64
+ 217 ==:GETDENTS64
# 108 ==:GETEGID
# 107 ==:GETEUID
# 104 ==:GETGID
@@ -133,7 +133,7 @@
# 237 ==:MBIND
# 256 ==:MIGRATEPAGES
# 27 ==:MINCORE
- # 83 ==:MKDIR
+ 83 ==:MKDIR
# 258 ==:MKDIRAT
# 133 ==:MKNOD
# 259 ==:MKNODAT
@@ -194,7 +194,7 @@
# 47 ==:RECVMSG
# 216 ==:REMAPFILEPAGES
# 197 ==:REMOVEXATTR
- # 82 ==:RENAME
+ 82 ==:RENAME
# 264 ==:RENAMEAT
# 249 ==:REQUESTKEY
# 219 ==:RESTARTSYSCALL
@@ -339,6 +339,31 @@
{ 0 0 0 0 0 0 GETPID } /getpid defStdSyscall
+ # 0 -> open directory file descriptor
+ # 0 <- raw return value
+ # 1 <- an array of scopes resembling linux_dirent structures (unless return value zero or less)
+ # actually only defines members d_ino, d_name, and d_type (because all others just help decoding the result buffer)
+ {
+ 8192 str .alloc ==buf
+ buf 8192 0 0 0 GETDENTS64 sys .asm .syscall =errno _ ==ret ==toparse
+ 0 ==doff 0 ==dreclen
+ toparse 0 gt { [
+ { toparse 0 gt } {
+ <
+ buf ->u64 ==dino
+ ->u64 =doff # this is essentially garbage (man 2 getdents is just not very clear about this)
+ ->u16 =dreclen
+ ->u8 ==dtype
+ --
+ 0 19 dreclen 2 sub buf str .infix "\0" str .split * ==dname
+ dreclen buf str .postfix =buf
+ toparse dreclen sub =toparse
+ >
+ } loop
+ ] } rep
+ ret
+ } /getdents64 deffd
+
# 0 <- raw return value
# 1 <- seconds since 1970
# 2 <- microseconds since 1970
@@ -440,6 +465,8 @@
{ 0 0 0 0 LISTEN } /listen defStdSyscall
+ { 0 0 0 0 MKDIR } /mkdir defStdSyscall
+
1 ==:PROTREAD
2 ==:PROTWRITE
4 ==:PROTEXEC
@@ -463,6 +490,8 @@
# 5 -> address
{ MMAP } /mmap defStdSyscall
+ { 0 0 0 0 RENAME } /rename defStdSyscall
+
1 ==:AFUNIX
1 ==:AFLOCAL
2 ==:AFINET
@@ -504,20 +533,20 @@
0 ==:ORDONLY
1 ==:OWRONLY
2 ==:ORDWR
- 256 ==:OCREAT
- 512 ==:OEXCL
- 1024 ==:ONOCTTY
- 8192 ==:OAPPEND
- 4096 ==:OTRUNC
- 16384 ==:ONONBLOCK
- 131072 ==:OASYNC
- 262144 ==:ODIRECT
- 1048576 ==:OLARGEFILE
- 2097152 ==:ODIRECTORY
- 4194304 ==:ONOFOLLOW
- 16777216 ==:ONOATIME
- 33554432 ==:OCLOEXEC
- 67174400 ==:OSYNC
+ 64 ==:OCREAT
+ 128 ==:OEXCL
+ 256 ==:ONOCTTY
+ 512 ==:OTRUNC
+ 1024 ==:OAPPEND
+ 2048 ==:ONONBLOCK
+ 8192 ==:OASYNC
+ 16384 ==:ODIRECT
+ 32768 ==:OLARGEFILE
+ 65536 ==:ODIRECTORY
+ 131072 ==:ONOFOLLOW
+ 262144 ==:ONOATIME
+ 524288 ==:OCLOEXEC
+ 1052672 ==:OSYNC
{ 0 0 0 OPEN } /open defStdSyscall
diff --git a/elymas/lib/txt.ey b/elymas/lib/txt.ey
index 914f0d7..2a51f28 100644
--- a/elymas/lib/txt.ey
+++ b/elymas/lib/txt.ey
@@ -4,7 +4,7 @@
# 0 <- leading digits converted to int (0, if none)
{ "^(\\d*)" regex -- ==n
[ n { 48 sub } each ] reverse 10 math .unbase
- } [ "" ] [ 0 ] '' /u deffd
+ } [ 0 ] [ 0 ] '' /u deffd
# 0 -> string
# 0 <- leading hexadecimal digits converted to int (0, if none)
@@ -18,7 +18,7 @@
{ "^([0-9A-Fa-f]*)" regex -- ==n
[ n { 48 sub hexDigitsReverse } each ] reverse 16 math .unbase
- } [ "" ] [ 0 ] '' /hu deffd
+ } [ 0 ] [ 0 ] '' /hu deffd
> /consume defvd
<
@@ -26,13 +26,13 @@
# 0 <- decimal representation as string
{
_ { [ -01 10 math .base reverse "0123456789" each ] str .fromArray } { -- "0" } ? *
- } [ 0 ] [ "" ] '' /u deffd
+ } [ 0 ] [ 0 ] '' /u deffd
# 0 -> positive integer (or zero)
# 0 <- hexadecimal representation as string
{
_ { [ -01 16 math .base reverse "0123456789ABCDEF" each ] str .fromArray } { -- "0" } ? *
- } [ 0 ] [ "" ] '' /hu deffd
+ } [ 0 ] [ 0 ] '' /hu deffd
> /produce defvd
> /txt defvd
diff --git a/elymas/lib/util.ey b/elymas/lib/util.ey
new file mode 100644
index 0000000..e202d73
--- /dev/null
+++ b/elymas/lib/util.ey
@@ -0,0 +1,13 @@
+{ ==spec
+ [ spec { ==c
+ [
+ { c 48 ge c 57 le and }' { c 48 sub }
+ { c 46 eq }' { ] [ }
+ { 1 }' { "invalid ' spec: " spec cat die }
+ ] conds
+ } each ] ''
+} "'" deffd
+
+"'" | "*" | ; "'*" deffd
+
+# vim: syn=elymas
diff --git a/elymas/lib/xml.ey b/elymas/lib/xml.ey
index b947ff1..3f34b5e 100644
--- a/elymas/lib/xml.ey
+++ b/elymas/lib/xml.ey
@@ -2,8 +2,9 @@
<
txt .consume .|hu "%" defq
{ "2120" "-" | |le "021" "-" | |ge |and } /in defq
+ map ==defaultEnts [ { "&" /amp } { "<" /lt } { ">" /gt } { "'" /apos } { "\"" /quot } ] { * defaultEnts =[] } each
{ "Unconfigured npeek/take/get/set/noErr/snip" die } -000000 =*npeek =*take =*get =*set =*noErr =*snip
- { 0 npeek } =*peek
+ { 0 npeek } =*peek map ==ents
# parser generator
{ _ sys .typed .type 1 eq { ==str { 1 ==r str { peek eq r and =r take } each r _ |noErr rep } } { } ? * } /lit deffd
@@ -43,10 +44,11 @@
{ { peek [ %20 %9 %D %A ] eq any take } ,+ }==S
{ "<![CDATA[" Char "]]>" upto "]]>" }==CDSect
- { "[^<&]" | "]]>" upto }==CharData
- { CharData ,? ,[ [ element Reference CDSect PI Comment ] ",|" | fold CharData ,? ,] ,* }==content
- { ,[ "&#" "[0-9]" | ,+ ";" ,] ,[ "&#x" "[0-9a-fA-F]" | ,+ ";" ,] ,| }==CharRef
- { "&" Name ";" }==EntityRef
+ { ( get ) "[^<&]" | "]]>" upto ( get snip text ) }==CharData
+ { CharData ,? ,[ [ element Reference CDSect PI Comment ] ",|" | fold CharData ,? ,] ,* }==content
+ { ,[ "&#" ( get ) "[0-9]" | ,+ ( get snip txt .consume .u [ -01 ] str .fromArray text ) ";" ,]
+ ,[ "&#x" ( get ) "[0-9a-fA-F]" | ,+ ( get snip txt .consume .hu [ -01 ] str .fromArray text ) ";" ,] ,| }==CharRef
+ { "&" ( get ) Name ( get snip ) ";" ( _ ents .has { ents * text } { ??parse.xml.undeclared-entity } ? * ) }==EntityRef
{ EntityRef CharRef ,| }==Reference
{ ,[ "\"" ( get ) "[^<&\"]" | Reference ,| ,* ( get snip ) "\"" ,]
,[ "'" ( get ) "[^<&']" | Reference ,| ,* ( get snip ) "'" ,] ,| }==AttValue
@@ -77,12 +79,12 @@
{ _ =*s len ==LEN 0 ==i 0 ==last
{ i add LEN lt { i s } { 1 neg } ? * } =npeek { i 1 add =i } =take { i } =get { =i } =set { i =last } =noErr
- { |s str .infix } =snip
- document * {
- i LEN neq { < last |s str .postfix ==remaining > ???parse.xml.trailing-garbage } rep
- } { < last |s str .postfix ==remaining > ???parse.xml } ? *
+ { |s str .infix } =snip defaultEnts .clone =ents
+ { document * { i LEN neq { ??parse.xml.trailing-garbage } rep } { ??parse.xml } ? * }
+ { -- < last |s str .postfix ==remaining > ??!' } ?!parse.xml
}
+ { < "" ==name ==text > } /text deffd
{ < -01 ==name
map ==attr _ len _ ==l dearray l 2 div { -01 attr =[] } rep
[ ] ==children { =children } =*setChildren
diff --git a/elymas/loaded.ey b/elymas/loaded.ey
index 19cbc05..a433002 100644
--- a/elymas/loaded.ey
+++ b/elymas/loaded.ey
@@ -1,9 +1,11 @@
#!/usr/bin/env elymas
[
+ "lib/util.ey"
"lib/err.ey"
"lib/bin.ey"
"lib/sys/linux.ey"
+ "lib/sys.ey"
"lib/net.ey"
"lib/net/tcp.ey"
"lib/net/udp.ey"
diff --git a/elymas/shared.ey b/elymas/shared.ey
index 8131e16..df3ae4a 100644
--- a/elymas/shared.ey
+++ b/elymas/shared.ey
@@ -1,10 +1,12 @@
#!/usr/bin/env elymas
[
+ "lib/util.ey"
"lib/err.ey"
"lib/bin.ey"
"lib/sys/linux.ey"
"lib/sys/so.ey"
+ "lib/sys.ey"
"lib/net.ey"
"lib/net/tcp.ey"
"lib/net/udp.ey"
diff --git a/examples/working-loaded/xml.test b/examples/working-loaded/xml.test
index 8375638..000697f 100644
--- a/examples/working-loaded/xml.test
+++ b/examples/working-loaded/xml.test
@@ -2,10 +2,14 @@
{ ==indent ==elem
indent { " " sys .out .writeall } rep
- elem .name sys .out .writeall "\n" sys .out .writeall
- elem .children {
- indent 2 add dumpTree
- } each
+ elem .name "" eq {
+ elem .text sys .out .writeall "\n" sys .out .writeall
+ } {
+ elem .name sys .out .writeall "\n" sys .out .writeall
+ elem .children {
+ indent 2 add dumpTree
+ } each
+ } ? *
} /dumpTree deffst
sys .file ":" via
@@ -13,11 +17,15 @@ sys .file ":" via
65536 :read ==content
:close
+1 ==success
{
- content xml .parse 0 dumpTree
+ content xml .parse
} {
- "Error during parse: " dump
+ "Error during parse, remaining content: " dump
.remaining dump
+ 0 =success
} ?!parse
+success { 0 dumpTree } rep
+
# vim: syn=elymas