def read_cmd_def()

in rts/engine/compile_cmds.py [0:0]


def read_cmd_def(def_filename, content, classes):
    idx = None
    for line in open(def_filename, "r"):
        line = line.strip()
        # Simply parse the line and construct the Cmd definition.
        m = re.match(r"CMD_(.*?)\((.*?)\);", line)
        if not m: continue

        if m.group(1) == "DURATIVE":
            baseclass = "CmdDurative"
            override_run = "    bool run(const GameEnv& env, CmdReceiver *) override;"

        elif m.group(1) == "IMMEDIATE":
            baseclass = "CmdImmediate"
            override_run = "    bool run(GameEnv* env, CmdReceiver *) override;"

        elif m.group(1) == "START":
            idx = int(m.group(2))
            continue
        else:
            continue

        items = [v.strip() for v in m.group(2).split(",")]
        classname, enum_name = get_class_and_enum_name(items[0])
        classes[classname] = dict(bases=["CmdBase", baseclass], enum=enum_name)
        types = items[1::2]
        names = items[2::2]

        # Check default argument.
        defaults = map(lambda x: x.split("=")[1].strip() if len(x.split("=")) == 2 else None, names)
        names = [ n.split("=")[0].strip() for n in names ]

        s_name = "SERIALIZER_DERIVED"
        if len(names) == 0: s_name += "0"
        serializer = "    " + s_name + "(%s, %s" % (classname, baseclass) + "".join(", _%s" % n for n in names) + ");"

        # Compute the variable declaration and variable assignments.
        symbols = dict(
            idx = str(idx),
            baseclass = baseclass,
            override_run = override_run,
            enum_name = enum_name,
            classname = classname,
            var_decl = "\n".join("    %s _%s;" % (t, n) for t, n in zip(types, names)) + "\n",
            var_init_list = "".join(", " + init_modifier(t, n, d) for t, n, d in zip(types, names, defaults)),
            serializer = serializer,
            var_initializer = "".join(", _%s(%s)" % (n, n) for n in names),
            var_ostream = " ".join("<< \" [%s]: \" << _%s" % (n, n) for n in names),
            accessors = "\n".join("    %s %s() const { return _%s; }" % (type_modifier(t), n, n) for t, n in zip(types, names))
        )
        text = template
        for k, v in symbols.items():
            text = text.replace("$" + k, v)

        content.append(text)
        idx += 1