summaryrefslogtreecommitdiff
path: root/eel/maketypes.awk
diff options
context:
space:
mode:
Diffstat (limited to 'eel/maketypes.awk')
-rwxr-xr-xeel/maketypes.awk155
1 files changed, 155 insertions, 0 deletions
diff --git a/eel/maketypes.awk b/eel/maketypes.awk
new file mode 100755
index 00000000..4284eddd
--- /dev/null
+++ b/eel/maketypes.awk
@@ -0,0 +1,155 @@
+
+BEGIN {
+ type_name = ""; # GtkEnumType
+ type_macro = ""; # GTK_TYPE_ENUM_TYPE
+ type_ident = ""; # _gtk_enum_type
+ type_counter = 0;
+ gen_macros = 0;
+ gen_entries = 0;
+ gen_vars = 0;
+ boxed_copy = "";
+ boxed_free = "";
+
+ for (i = 2; i < ARGC; i++)
+ {
+ if (ARGV[i] == "macros")
+ gen_macros = 1;
+ else if (ARGV[i] == "entries")
+ gen_entries = 1;
+ else if (ARGV[i] == "variables")
+ gen_vars = 1;
+ ARGV[i] = "";
+ }
+
+ if (gen_macros)
+ {
+ printf ("/* type macros, generated by maketypes.awk */\n");
+ printf ("\n");
+ printf ("#ifdef G_OS_WIN32\n");
+ printf ("# ifdef EEL_COMPILATION\n");
+ printf ("# define EELTYPEBUILTINS_VAR __declspec(dllexport)\n");
+ printf ("# else\n");
+ printf ("# define EELTYPEBUILTINS_VAR extern __declspec(dllimport)\n");
+ printf ("# endif\n");
+ printf ("#else\n");
+ printf ("# ifdef EEL_COMPILATION\n");
+ printf ("# define EELTYPEBUILTINS_VAR\n");
+ printf ("# else\n");
+ printf ("# define EELTYPEBUILTINS_VAR extern\n");
+ printf ("# endif\n");
+ printf ("#endif\n");
+ printf ("\n");
+ }
+ else if (gen_entries)
+ printf ("/* type entries, generated by maketypes.awk */\n\n");
+ else if (gen_vars)
+ printf ("/* type variables, generated by maketypes.awk */\n\n");
+ else
+ {
+ printf ("hm? what do you want me to do?\n") > "/dev/stderr";
+ exit 1;
+ }
+}
+
+function set_type (set_type_1)
+{
+ type_counter += 1;
+ type_name = set_type_1;
+ type_macro = "EEL_TYPE_";
+
+ tmp = type_name;
+# OK, the following is ridiculous, and sed s///g would be far easier
+ gsub ("[A-Z]", "@&", tmp);
+ gsub ("[^A-Z]@", "&_", tmp);
+ gsub ("@", "", tmp);
+ gsub ("[A-Z][A-Z][A-Z][0-9a-z]", "@&", tmp);
+ gsub ("@..", "&_", tmp);
+ gsub ("@", "", tmp);
+ type_macro = type_macro toupper (tmp);
+ type_ident = "_" tolower (tmp);
+
+ sub ("^EEL_TYPE_EEL_", "EEL_TYPE_", type_macro);
+}
+
+function generate (generate_what)
+{
+ if (gen_macros)
+ {
+ printf ("EELTYPEBUILTINS_VAR GType %s;\n", type_macro);
+ }
+ if (gen_entries)
+ {
+ printf (" { \"%s\", &%s,\n", type_name, type_macro);
+ if (generate_what == "BOXED")
+ printf (" G_TYPE_%s, %s, %s, },\n", generate_what, boxed_copy, boxed_free);
+ else
+ printf (" G_TYPE_%s, %s_values },\n", generate_what, type_ident);
+ }
+ if (gen_vars)
+ {
+ printf ("EELTYPEBUILTINS_VAR GType %s = 0;\n", type_macro);
+ }
+}
+
+# skip scheme comments
+";" {
+ sub (";.*", "");
+}
+
+# parse keywords
+
+/\(define-enum/ {
+ if ($2 == "")
+ printf ("huh? define-enum keyword without arg?\n") > "/dev/stderr";
+ else
+ {
+ set_type($2);
+ generate("ENUM");
+ }
+}
+
+/\(define-flags/ {
+ if ($2 == "")
+ printf ("huh? define-flags keyword without arg?\n") > "/dev/stderr";
+ else
+ {
+ set_type($2);
+ generate("FLAGS");
+ }
+}
+
+/\(define-boxed/ {
+ if ($2 == "")
+ printf ("huh? define-boxed keyword without arg?\n") > "/dev/stderr";
+ else
+ {
+ boxed_copy = "NULL";
+ boxed_free = "NULL";
+ set_type($2);
+ do {
+ getline;
+ sub (";.*", "", $0);
+ } while ($0 ~ /^[ \t]*$/);
+ tmp_var1 = $1;
+ if ($0 ~ /\)/) { generate("BOXED"); next; }
+ do {
+ getline;
+ sub (";.*", "", $0);
+ } while ($0 ~ /^[ \t]*$/);
+ tmp_var2 = $1;
+ sub (/\).*/, "", tmp_var2);
+ if (tmp_var1 ~ /^[_A-Za-z][_A-Za-z0-9]*$/ &&
+ tmp_var2 ~ /^[_A-Za-z][_A-Za-z0-9]*$/)
+ {
+ boxed_copy = tmp_var1;
+ boxed_free = tmp_var2;
+ # printf ("read boxed funcs: %s %s\n", boxed_copy, boxed_free) > "/dev/stderr";
+ }
+ generate("BOXED");
+ }
+}
+
+END {
+ if (gen_macros)
+ printf("\n#define\tEEL_TYPE_N_BUILTINS\t(%u)\n", type_counter);
+}