Annotation of embedaddon/rsync/daemon-parm.awk, revision 1.1.1.1

1.1       misho       1: #!/usr/bin/awk -f
                      2: 
                      3: # The caller must pass arg: daemon-parm.txt
                      4: # The resulting code is output into daemon-parm.h
                      5: 
                      6: BEGIN {
                      7:     heading = "/* DO NOT EDIT THIS FILE!  It is auto-generated from a list of values in " ARGV[1] "! */\n\n"
                      8:     sect = psect = defines = accessors = prior_ptype = ""
                      9:     parms = "\nstatic struct parm_struct parm_table[] = {"
                     10:     comment_fmt = "\n/********** %s **********/\n"
                     11:     tdstruct = "typedef struct {"
                     12: }
                     13: 
                     14: /^\s*$/ { next }
                     15: /^#/ { next }
                     16: 
                     17: /^Globals:/ {
                     18:     if (defines != "") {
                     19:        print "The Globals section must come first!"
                     20:        defines = ""
                     21:        exit
                     22:     }
                     23:     defines = tdstruct
                     24:     values = "\nstatic const all_vars Defaults = {\n    { /* Globals: */\n"
                     25:     exps = exp_values = sprintf(comment_fmt, "EXP")
                     26:     sect = "GLOBAL"
                     27:     psect = ", P_GLOBAL, &Vars.g."
                     28:     next
                     29: }
                     30: 
                     31: /^Locals:/ {
                     32:     if (sect == "") {
                     33:        print "The Locals section must come after the Globals!"
                     34:        exit
                     35:     }
                     36:     defines = defines exps "} global_vars;\n\n" tdstruct
                     37:     values = values exp_values "\n    }, { /* Locals: */\n"
                     38:     exps = exp_values = sprintf(comment_fmt, "EXP")
                     39:     sect = "LOCAL"
                     40:     psect = ", P_LOCAL, &Vars.l."
                     41:     next
                     42: }
                     43: 
                     44: /^(STRING|CHAR|PATH|INTEGER|ENUM|OCTAL|BOOL|BOOLREV|BOOL3)[ \t]/ {
                     45:     ptype = $1
                     46:     name = $2
                     47:     $1 = $2 = ""
                     48:     sub(/^[ \t]+/, "")
                     49: 
                     50:     if (ptype != prior_ptype) {
                     51:        comment = sprintf(comment_fmt, ptype)
                     52:        defines = defines comment
                     53:        values = values comment
                     54:        parms = parms "\n"
                     55:        accessors = accessors "\n"
                     56:        prior_ptype = ptype
                     57:     }
                     58: 
                     59:     if (ptype == "STRING" || ptype == "PATH") {
                     60:        atype = "STRING"
                     61:        vtype = "char*"
                     62:     } else if (ptype ~ /BOOL/) {
                     63:        atype = vtype = "BOOL"
                     64:     } else if (ptype == "CHAR") {
                     65:        atype = "CHAR"
                     66:        vtype = "char"
                     67:     } else {
                     68:        atype = "INTEGER"
                     69:        vtype = "int"
                     70:     }
                     71: 
                     72:     # The name might be var_name|public_name
                     73:     pubname = name
                     74:     sub(/\|.*/, "", name)
                     75:     sub(/.*\|/, "", pubname)
                     76:     gsub(/_/, " ", pubname)
                     77:     gsub(/-/, "", name)
                     78: 
                     79:     if (ptype == "ENUM")
                     80:        enum = "enum_" name
                     81:     else
                     82:        enum = "NULL"
                     83: 
                     84:     defines = defines "\t" vtype " " name ";\n"
                     85:     values = values "\t" $0 ", /* " name " */\n"
                     86:     parms = parms " {\"" pubname "\", P_" ptype psect name ", " enum ", 0},\n"
                     87:     accessors = accessors "FN_" sect "_" atype "(lp_" name ", " name ")\n"
                     88: 
                     89:     if (vtype == "char*") {
                     90:        exps = exps "\tBOOL " name "_EXP;\n"
                     91:        exp_values = exp_values "\tFalse, /* " name "_EXP */\n"
                     92:     }
                     93: 
                     94:     next
                     95: }
                     96: 
                     97: /./ {
                     98:     print "Extraneous line:" $0
                     99:     defines = ""
                    100:     exit
                    101: }
                    102: 
                    103: END {
                    104:     if (sect != "" && defines != "") {
                    105:        defines = defines exps "} local_vars;\n\n"
                    106:        defines = defines tdstruct "\n\tglobal_vars g;\n\tlocal_vars l;\n} all_vars;\n"
                    107:        values = values exp_values "\n    }\n};\n\nstatic all_vars Vars;\n"
                    108:        parms = parms "\n {NULL, P_BOOL, P_NONE, NULL, NULL, 0}\n};\n"
                    109:        print heading defines values parms accessors > "daemon-parm.h"
                    110:     } else {
                    111:        print "Failed to parse the data in " ARGV[1]
                    112:        exit 1
                    113:     }
                    114: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>