Index: ossp-pkg/cfg/00TODO RCS File: /v/ossp/cvs/ossp-pkg/cfg/Attic/00TODO,v co -q -kk -p'1.10' '/v/ossp/cvs/ossp-pkg/cfg/Attic/00TODO,v' | diff -u /dev/null - -L'ossp-pkg/cfg/00TODO' 2>/dev/null --- ossp-pkg/cfg/00TODO +++ - 2024-05-16 10:05:22.531234097 +0200 @@ -0,0 +1,210 @@ + +- destroy haengt in Endlosschleife +- in scanner: use an combination of dynamic buffer and atomic symbol/token sub-library + to allow first tokens of mostly arbitrary size and then to store the tokens + redundancy-free. +- Problem: \x00 oder \x{00} wird zu NUL-terminator -> use ptr+len instead +- caStr/cpStr durch yyless/yymore?? +- syntax verification +- command line query tool +- error checking in scanner? +- OSSP ex support +- wieso geht sample.cfg nicht als Arg bei "make check"? + +- newline in error message +$ ./cfg_test sample2.cfg +ERROR: quu'> + +- cfg_t + +rewrite-uri { } +rewrite-uri ^/(.*) /path/$1 --redirect=permanent q{ + %{SOURCE} != "x" +}; + + +Directory [--foo=A] + +Argument: + - type: + - keyword ("foo") via name + - option ("--foo=BAR") via name & regex + - argument ("foo") via regex + - amount: + - 1 + - 0/1 ? + - 0..n * + - 1..n + + - location: + - by position + - by name + - lookup via: + - name + - position + - regex match + +foo * bar +foo = bar|quux|... +foo (bar baz quux) + +foo ::= bar* ; kleene closure +foo ::= bar|baz|quux ; union +foo ::= bar baz quux ; concatenation + +foo ::= {foo;...} ; sequence of ... +foo ::= (...) ; grouping +foo ::= "bar" ; fixed terminal +foo ::= /bar/ ; regex terminal +foo ::= ; arbitrary argument +foo ::= ; arbitrary option + +SEQ ::= "{" DIR DIR* "}" +DIR ::= TOK (" " TOK)* ";" +TOK ::= ... + +SEQ ::= DIR* SEQ(dir,dir,...) +DIR ::= TOK+ DIR(tok,tok,...) +TOK ::= string "..." + +config ::= SEQ(directory|user|rewrite|access) +directory ::= DIR("directory",*,) +dir_options ::= +user ::= DIR("user",/^[a-z]$/) +rewrite ::= +access ::= "access" ("allow"|"deny"):action SEQ(access_list):acl +access_list ::= m/^!?%{ID}$/ + +acl ::= "acl" TOK:name acl_list +acl_list ::= SEQ(acl_entry) +acl_entry ::= acl_action "from" net-addr:src "to" net-addr:dst +acl_action ::= "allow"|"deny" +net_addr ::= net_hostname | net_ipv4addr | net_ipv6addr + +sequence all { + directive --class 1; +}; +directive --class 1 "foo" { + option "bar" --occur=1 +}; + +--------------------------------------------------------------------------- + +foo on; +bar /bla { + foo off; + baz --fuck { + b1; b2 --nase=baer; b3; b4; b5; + } --fuck2; +}; +quux a1 a2 a3 a4; +quux; + +--------------------------------------------------------------------------- + +sequence ROOT { + directive foo; + directive bar; + directive quux --count=1:oo; +}; +sequence bar-seq { + directive foo --count=0:1; + directive baz --count=1:oo; +}; +directive foo { + token - on|off|yes|no; +}; +directive bar { + token path /.*; + sequence bar-seq; +}; +directive baz { + option fuck; + option fuck2; + sequence { + directive foo { + option nase (baer|hugo); + option foo [0-9]; + token ip-address; + }; + }; +}; +directive quux { + token --count=0:oo a.*; +}; +token ip-address b1|b2|b3|b4|b5; + +------------------------------------------------------------------------------- + + ::= "sequence" ? ; + | "sequence" ? ? "{" * "}"; + ::= "directive" ? ; + | "directive" ? ? "{" ; arbitrary argument +foo ::= ; arbitrary option + +SEQ ::= "{" DIR DIR* "}" +DIR ::= TOK (" " TOK)* ";" +TOK ::= ... + +SEQ ::= DIR* SEQ(dir,dir,...) +DIR ::= TOK+ DIR(tok,tok,...) +TOK ::= string "..." + +config ::= SEQ(directory|user|rewrite|access) +directory ::= DIR("directory",*,) +dir_options ::= +user ::= DIR("user",/^[a-z]$/) +rewrite ::= +access ::= "access" ("allow"|"deny"):action SEQ(access_list):acl +access_list ::= m/^!?%{ID}$/ + +acl ::= "acl" TOK:name acl_list +acl_list ::= SEQ(acl_entry) +acl_entry ::= acl_action "from" net-addr:src "to" net-addr:dst +acl_action ::= "allow"|"deny" +net_addr ::= net_hostname | net_ipv4addr | net_ipv6addr + +sequence all { + directive --class 1; +}; +directive --class 1 "foo" { + option "bar" --occur=1 +}; + +--------------------------------------------------------------------------- + +foo on; +bar /bla { + foo off; + baz --fuck { + b1; b2 --nase=baer; b3; b4; b5; + } --fuck2; +}; +quux a1 a2 a3 a4; +quux; + +--------------------------------------------------------------------------- + +sequence ROOT { + directive foo; + directive bar; + directive quux --count=1:oo; +}; +sequence bar-seq { + directive foo --count=0:1; + directive baz --count=1:oo; +}; +directive foo { + token - on|off|yes|no; +}; +directive bar { + token path /.*; + sequence bar-seq; +}; +directive baz { + option fuck; + option fuck2; + sequence { + directive foo { + option nase (baer|hugo); + option foo [0-9]; + token ip-address; + }; + }; +}; +directive quux { + token --count=0:oo a.*; +}; +token ip-address b1|b2|b3|b4|b5; + +------------------------------------------------------------------------------- + + ::= "sequence" ? ; + | "sequence" ? ? "{" * "}"; + ::= "directive" ? ; + | "directive" ? ? "{"