Annotation of embedaddon/rsync/daemon-parm.awk, revision 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>