git » swiftpm » main » tree

[main] / Sources / c_snikket / iinclude / hx / GenMacro.hx

/*
  This file is used to generate Macros.h and DynamicImpl.h.
  To change the number of "fast" args, you will also need to change numbers in the tpl files.
  Usage: haxe -x GenMacro.hx
*/

import haxe.Template;
#if haxe3
import sys.io.File;
import sys.io.FileOutput;
#else
import neko.io.File;
import neko.io.FileOutput;
#end

class GenMacro
{
   static var warning =
    "//   ##  ##  ##   ##   ####   ##  ## ## ##  ##  ####    ##\n" +
    "//   ##  ##  ## ##  ## ##  ## ### ## ## ### ## ##       ##\n" +
    "//    ## ## ##  ###### ###### ###### ## ###### ## ###   ##\n" +
    "//    ## ## ##  ##  ## ## ##  ## ### ## ## ### ##  ##     \n" +
    "//     ## ##    ##  ## ##  ## ##  ## ## ##  ##  ####    ##\n\n" +
    "// DO NOT EDIT\n// This file is generated from the .tpl file\n";

   public function new()
   {
      var context = { };
      var params = new Array<Dynamic>();
      var arr_list = new Array<String>();
      var arg_list = new Array<String>();
      var dynamic_arg_list = new Array<String>();
      var dynamic_in_args = new Array<String>();
      var dynamic_var_args = new Array<String>();
      var dynamic_adds = new Array<String>();

      for(arg in 0...27)
      {
         if (arg>0)
         {
            arr_list.push( "inArgs[" + (arg-1) + "]");
            arg_list.push( "inArg" + (arg-1));
            dynamic_arg_list.push("const Dynamic &inArg" + (arg-1) );
            dynamic_adds.push( "->init(" + (arg-1) + ",inArg" + (arg-1) + ")" );
         }

         params.push( {
             ARG : arg,
             ARR_LIST : arr_list.join(","),
             DYNAMIC_ARG_LIST : dynamic_arg_list.join(","),
             ARG_LIST : arg_list.join(","),
             DYNAMIC_ADDS : dynamic_adds.join("")
            } );
      }

      var locals = new Array<Dynamic>();
      var jumboLocals = new Array<Dynamic>();
      var marks = new Array<String>();
      var visits = new Array<String>();
      var type_vars = new Array<String>();
      var type_args = new Array<String>();
      var construct_args = new Array<String>();
      var construct_vars = new Array<String>();
      for(arg in 1...62)
      {
         var vid = arg-1;
         if (vid>=0)
         {
            marks.push( "HX_MARK_MEMBER(v" + vid +");" );
            visits.push( "HX_VISIT_MEMBER(v" + vid +");" );
            type_args.push( "t" + vid +",v" + vid  );
            type_vars.push( "t" + vid +" v" + vid  );
            construct_args.push( "t" + vid +" __" + vid  );
            construct_vars.push( "v" + vid +"(__" + vid + ")"  );
         }

         var local = {
             ARG : arg,
             MARKS : marks.join(" "),
             VISITS : visits.join(" "),
             TYPE_VARS : type_vars.join(","),
             TYPE_ARGS : type_args.join(","),
             TYPE_DECL : type_vars.join(";"),
             CONSTRUCT_VARS : construct_vars.join(","),
             CONSTRUCT_ARGS : construct_args.join(",")
            };
         if (arg<20)
            locals.push(local);
         else
            jumboLocals.push(local);
      }

      Reflect.setField(context, "PARAMS", params);
      Reflect.setField(context, "LOCALS", locals);
      Reflect.setField(context, "NS", "::");
      Reflect.setField(context, "hxNS", " ::hx::");

      var fixed = File.getContent("MacrosFixed.h");
      fixed = fixed.split("
").join("");
      var fileContents:String = File.getContent("Macros.tpl");
      fileContents = fileContents.split("
").join("");

      var template:Template = new Template(fileContents);
      var result:String = template.execute(context);
      var fileOutput:FileOutput = File.write("Macros.h", true);
      fileOutput.writeString(warning);
      fileOutput.writeString(fixed);
      fileOutput.writeString(result);
      fileOutput.close();

      var fileContents:String = File.getContent("MacrosJumbo.tpl");
      fileContents = fileContents.split("
").join("");
      var template:Template = new Template(fileContents);
      Reflect.setField(context, "LOCALS", jumboLocals);
      var result:String = template.execute(context);
      var fileOutput:FileOutput = File.write("MacrosJumbo.h", true);
      fileOutput.writeString(warning);
      fileOutput.writeString(result);
      fileOutput.close();



      var fileContents:String = File.getContent("DynamicImpl.tpl");
      fileContents = fileContents.split("
").join("");
      var template:Template = new Template(fileContents);
      var result:String = template.execute(context);
      var fileOutput:FileOutput = File.write("DynamicImpl.h", true);
      fileOutput.writeString(warning);
      fileOutput.writeString(result);
      fileOutput.close();

   }

   public static function main() { new GenMacro(); }
}