D | |
database | |
dayofmonth, Cron | |
dayofweek, Cron | |
debctrl | |
default_depth, Xorg | |
default_type, Sudoers | |
defaults | |
DEFAULTS, Sudoers | |
DEFAULTS SECTION, Mke2fs | |
defaults_entry, Mke2fs | |
defaults_title, Mke2fs | |
Define comment and defaults, IniFile | |
del_negate, Sudoers | |
del_opt_ws, Util | |
del_str, Util | |
del_ws, Util | |
del_ws_spc, Util | |
del_ws_tab, Util | |
Description | |
device, Xorg | |
Dhcpd | |
display, Xorg | |
DISPLAY SUBSECTION, Xorg | |
display_entry, Xorg | |
display_modes, Xorg | |
domain, Resolv | |
dot, Syslog | |
Dpkg | |
driver, Xorg | |
E | |
email, Keepalived | |
email_addr, Rx | |
empty | |
empty line, Access | |
empty_c_style, Util | |
empty_generic, Util | |
entries, Syslog | |
ENTRIES | |
ENTRIES AND OPTIONS, Xorg | |
entries_re, Xorg | |
entry | |
Entry, Syslog | |
ENTRY | |
entry includes comments, IniFile | |
ENTRY LINE, Access | |
entry_generic, Xorg | |
entry_int, Xorg | |
entry_re | |
entry_rgb, Xorg | |
entry_sto, Mke2fs | |
entry_str, Xorg | |
entry_xy, Xorg | |
eol | |
except, Access | |
Exclusions, Util | |
Exports |
let database = let database_kw = "aliases" | "automount" | "bootparams" | "ethers" | "group" | "hosts" | "netgroup" | "netmasks" | "networks" | "passwd" | "protocols" | "publickey" | "rpc" | "sendmailvars" | "services" | "shadow" in [ label "database" . store database_kw . sep_colon . (Build.opt_list (service|reaction) Sep.space) . Util.eol ]
TODO: support for quoted strings
let database = comma_sep_list "database"
let dayofmonth = [ label "dayofmonth" . store num ]
let dayofweek = [ label "dayofweek" . store alphanum ]
let default_depth = entry_int "DefaultDepth" /[dD]efault[dD]epth/
Type definition for defaults
let default_type = let value = store /[@:>][^ \t\n\\\\]+/ in [ label "type" . value ]
A defaults section
let defaults = IniFile.record defaults_title ( (Util.indent . (defaults_entry|common_entry)) | comment )
A Defaults entry
let defaults = [ indent . key "Defaults" . default_type? . sep_cont . parameter_list . eol ]
Possible entries under the defaults section
let defaults_entry = entry_sto "force_undo" ( "true"|"false" ) | entry_sto "fs_type" Rx.word | entry_sto "undo_dir" Rx.fspath
Title for the defaults section
let defaults_title = IniFile.title "defaults"
Delete an even number of ‘!’
let del_negate = del /( !! )*/ ""
Delete optional whitespace
let del_opt_ws = del /[ \t]*/
Delete a string and default to it
let del_str ( s:string ) = del s s
Delete mandatory whitespace
let del_ws = del /[ \t]+/
Delete mandatory whitespace, default to single space
let del_ws_spc = del_ws " "
Delete mandatory whitespace, default to single tab
let del_ws_tab = del_ws "\t"
let device = entry_str "Device" /[dD]evice/
let display = [ indent . del "SubSection" "SubSection" . sep_spc . sep_dquote . key "Display" . sep_dquote . eol . display_entry* . indent . del "EndSubSection" "EndSubSection" . eol ]
Known values for entries in the Display subsection
let display_entry = entry_int "Depth" /[dD]epth/ | entry_int "FbBpp" /[fF]b[bB]pp/ | entry_rgb "Weight" /[wW]eight/ | entry_xy "Virtual" /[vV]irtual/ | entry_xy "ViewPort" /[vV]iew[pP]ort/ | display_modes | entry_str "Visual" /[vV]isual/ | entry_rgb "Black" /[bB]lack/ | entry_rgb "White" /[wW]hite/ | entry_str "Options" /[oO]ptions/ | empty | comment
let display_modes = [ indent . del /[mM]odes/ "Modes" . label "Modes" . [ label "mode" . sep_spc . quoted_string_val ]+ . eol ]
let domain = Build.key_value_line "domain" Sep.space ( store Rx.word )
Deletes a dot and default to it
let dot = Util.del_str "."
let driver = entry_str "Driver" /[dD]river/
A simple email address entry
let email = [ indent . label "email" . sto_email_addr . comment_or_eol ]
To be refined
let email_addr = /[A-Za-z0-9_\+\.-]+@[A-Za-z0-9_\.-]+/
let empty = Util.empty
let empty = Util.empty
let empty = Util.empty
Empty line, an eol subnode
let empty = [ eol ]
Map empty lines
let empty = Util.empty
let empty = IniFile.empty
let empty = Util.empty
let empty = Util.empty
Map empty lines, including empty asterisk comments
let empty = [ del /[ \t]*\*?[ \t]*\n/ "\n" ]
Map empty lines
let empty = [ del /[ \t]*#?[ \t]*\n/ "\n" ]
let empty = Util.empty
Map empty lines, including empty comments
let empty = empty_generic /[ \t]*#?[ \t]*/
let empty = Util.empty
Map empty lines, including C-style empty comment
let empty_c_style = empty_generic /[ \t]*( (\/\/)|(\/\*[ \t]*\*\/) )?[ \t]*/
A generic definition of empty Map empty lines, including empty comments
let empty_generic ( r:regexp ) = [ del r "" . del_str "\n" ]
entries are either comments/empty lines or entries
let entries = ( empty | comment | entry )*
This is a list of all patterns which have specific handlers, and should therefore not be matched by the generic handler
let entries_re = /( [oO]ption|[sS]creen|[iI]nput[dD]evice|[dD]river|[sS]ub[sS]ection|[dD]isplay|[iI]dentifier|[vV]ideo[rR]am|[dD]efault[dD]epth|[dD]evice )/
let entry = [ Util.del_opt_ws "" . key entry_re . Util.del_ws_spc . store /[^# \n\t]+/ . eol ] | comment
A valid entry line Definition:
let entry = [ access . colon . user_list . (except user_list)? . colon . origin_list . (except origin_list)? . Util.eol ]
A crontab entry
let entry = [ label "entry" . indent . ( time | schedule ) . sep_spc . user . sep_spc . store Rx.space_in . eol ]
Generic INI File entry
let entry ( kw:regexp ) (sep:lens) (comment:lens) = [ key kw . sep . sto_to_comment? . (comment|eol) ] | comment
A generic entry for lens lns
let entry ( kw:regexp ) (lns:lens) = Build.key_value_line kw sep lns
let entry = nameserver | domain | search | sortlist | options
an entry contains selectors and an action
let entry = [ label "entry" . selectors . sep_tab . [ label "action" . action ] . eol ]
An entry without a specific handler.
let entry_generic = [ indent . key generic_entry_re . sep_spc . store to_eol . eol ]
This matches an entry which takes a single integer for an argument
let entry_int ( canon:string ) (re:regexp) = [ indent . del re canon . label canon . sep_spc . store int . eol ]
Regexp for possible entry keyword (path, allow, deny)
let entry_re = /path|allow|deny/
Default regexp for entry keyword
let entry_re = ( /[A-Za-z][A-Za-z0-9\._-]+/ )
This matches an entry which takes 3 integers as arguments representing red, green and blue components
let entry_rgb ( canon:string ) (re:regexp) = [ indent . del re canon . label canon . [ label "red" . sep_spc . store int ] . [ label "green" . sep_spc . store int ] . [ label "blue" . sep_spc . store int ] . eol ]
Store a regexp as entry value
let entry_sto ( kw:regexp ) (val:regexp) = entry kw (store val)
This matches an entry which takes a single quoted string
let entry_str ( canon:string ) (re:regexp) = [ indent . del re canon . label canon . sep_spc . quoted_string_val . eol ]
This matches an entry which takes 2 integers as arguments representing X and Y coordinates
let entry_xy ( canon:string ) (re:regexp) = [ indent . del re canon . label canon . [ label "x" . sep_spc . store int ] . [ label "y" . sep_spc . store int ] . eol ]
let eol = Util.eol
let eol = Util.eol
let eol = Util.eol
End of line, inherited from Util.eol
let eol = Util.eol
let eol = Util.eol
let eol = del /[ \t]*( # )?[ \t]*\n/ "\n"
let eol = del /[ \t]*\n/ "\n"
let eol = Util.eol
Delete end of line, including optional trailing whitespace
let eol = del /[ \t]*\n/ "\n"
let eol = Util.eol
The except operator makes it possible to write very compact rules.
let except ( lns:lens ) = [ label "except" . Sep.space . del /[Ee][Xx][Cc][Ee][Pp][Tt]/ "EXCEPT" . Sep.space . lns ]