diff options
| -rw-r--r-- | elymas/lib/sys.ey | 23 | ||||
| -rw-r--r-- | elymas/lib/sys/linux.ey | 63 | ||||
| -rw-r--r-- | elymas/lib/txt.ey | 8 | ||||
| -rw-r--r-- | elymas/lib/util.ey | 13 | ||||
| -rw-r--r-- | elymas/lib/xml.ey | 20 | ||||
| -rw-r--r-- | elymas/loaded.ey | 2 | ||||
| -rw-r--r-- | elymas/shared.ey | 2 | ||||
| -rw-r--r-- | examples/working-loaded/xml.test | 20 |
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 |
