+ private static ArrayList<String> DEFINE_INFO_STRUCT(String interfaceName,
+ FunctionHeader funcDecl) {
+ ArrayList<String> code = new ArrayList<String>();
+ code.add("typedef struct " + interfaceName + "_info {");
+ code.add(DECLARE(funcDecl.returnType, MACRO_RETURN));
+ for (int i = 0; i < funcDecl.args.size(); i++) {
+ code.add(DECLARE(funcDecl.args.get(i)));
+ }
+ code.add("} " + interfaceName + "_info {");
+ return code;
+ }
+
+ private static ArrayList<String> DEFINE_ID_FUNC(String interfaceName,
+ String idCode) {
+ ArrayList<String> code = new ArrayList<String>();
+ code.add("static " + IDType + " " + interfaceName + "_id() {");
+ if (!idCode.equals("")) {
+ code.add(DECLARE_DEFINE(IDType, MACRO_ID, idCode));
+ } else {
+ code.add(DECLARE_DEFINE(IDType, MACRO_ID, DEFAULT_ID));
+ }
+ code.add("return " + MACRO_ID + ";");
+ code.add("}");
+ return code;
+ }
+
+ private static ArrayList<String> DEFINE_CHECK_ACTION_FUNC(
+ InterfaceConstruct construct, FunctionHeader header) {
+ String interfaceName = construct.name;
+ ArrayList<String> code = new ArrayList<String>();
+ code.add("static bool " + interfaceName + "_check_action(void *info, "
+ + IDType + " " + MACRO_ID + ") {");
+ code.add(DECLARE("bool", "check_passed"));
+ String infoStructType = interfaceName + "_info", infoStructName = "theInfo";
+ code.add(DECLARE_DEFINE(infoStructType + "*", infoStructName,
+ BRACE(infoStructType) + "info"));
+ code.add((DECLARE_DEFINE(header.returnType, MACRO_RETURN,
+ GET_FIELD_BY_PTR(infoStructName, MACRO_RETURN))));
+ for (int i = 0; i < header.args.size(); i++) {
+ String type = header.args.get(i).type, var = header.args.get(i).name;
+ code.add((DECLARE_DEFINE(type, var,
+ GET_FIELD_BY_PTR(infoStructName, var))));
+ }
+ code.add("");
+ // __COND_SAT
+ if (!construct.condition.equals("")) {
+ code.add(DECLARE_DEFINE("bool", MACRO_COND, construct.condition));
+ }
+ // Check
+ if (!construct.check.equals("")) {
+ code.add(ASSIGN("check_passed", construct.check));
+ code.add("if (!check_passed) return false;");
+ }
+ // Action
+ if (construct.action.size() > 0) {
+ code.addAll(construct.action);
+ }
+ // Post_check
+ if (!construct.postCheck.equals("")) {
+ code.add(ASSIGN("check_passed", construct.postCheck));
+ code.add("if (!check_passed) return false;");
+ }
+ // Post_action
+ if (construct.postAction.size() > 0) {
+ code.addAll(construct.postAction);
+ }
+
+ code.add("}");
+
+ return code;
+ }
+