* USEFUL PRIMITIVES
*************************************************************************)
-let eol = Util.eol
-let spc = Util.del_ws_spc
-let comment = Util.comment
-let empty = Util.empty
+let eol = Util.eol
+let spc = Util.del_ws_spc
+let comment = Util.comment
+let empty = Util.empty
-let sep_eq = del /=/ "="
-let sto_to_eol = store /([^ \t\n].*[^ \t\n]|[^ \t\n])/
+let sep_eq = Sep.equal
+let sto_to_eol = store /([^ \t\n].*[^ \t\n]|[^ \t\n])/
+
+let slash = Util.del_str "/"
+let sto_no_slash = store /([^\/ \t\n]+)/
+let domains = slash . [ label "domain" . sto_no_slash . slash ]+
(************************************************************************
- * ENTRIES
+ * SIMPLE ENTRIES
*************************************************************************)
-let entry_re = /[A-Za-z0-9._-]+/
+let entry_re = Rx.word - /(address|server)/
let entry = [ key entry_re . (sep_eq . sto_to_eol)? . eol ]
(************************************************************************
+ * STRUCTURED ENTRIES
+ *************************************************************************)
+
+let address = [ key "address" . sep_eq . domains . sto_no_slash . eol ]
+
+let server =
+ let port = [ Build.xchgs "#" "port" . store Rx.integer ]
+ in let source = [ Build.xchgs "@" "source" . store /[^#\/ \t\n]+/ . port? ]
+ in let srv_spec = store /(#|([^#@\/ \t\n]+))/ . port? . source?
+ in [ key "server" . sep_eq . domains? . srv_spec? . eol ]
+
+(************************************************************************
* LENS
*************************************************************************)
-let lns = (comment|empty|entry) *
+let lns = (comment|empty|address|server|entry) *
let filter = incl "/etc/dnsmasq.conf"
. incl "/etc/dnsmasq.d/*"