]> Pileus Git - ~andy/gtk/blob - gtk/maketypes.awk
Updates.
[~andy/gtk] / gtk / maketypes.awk
1
2 BEGIN {
3   type_name = "";       # GtkEnumType
4   type_macro = "";      # GTK_TYPE_ENUM_TYPE
5   type_ident = "";      # _gtk_enum_type
6   type_counter = 0;
7   gen_macros = 0;
8   gen_entries = 0;
9   gen_vars = 0;
10   boxed_copy = "";
11   boxed_free = "";
12   
13   for (i = 2; i < ARGC; i++)
14     {
15       if (ARGV[i] == "macros")
16         gen_macros = 1;
17       else if (ARGV[i] == "entries")
18         gen_entries = 1;
19       else if (ARGV[i] == "variables")
20         gen_vars = 1;
21       ARGV[i] = "";
22     }
23   
24   if (gen_macros)
25     {
26       printf ("/* type macros, generated by maketypes.awk */\n");
27       printf ("\n");
28       printf ("#ifdef G_OS_WIN32\n");
29       printf ("#  ifdef GTK_COMPILATION\n");
30       printf ("#    define GTKTYPEBUILTINS_VAR __declspec(dllexport)\n");
31       printf ("#  else\n");
32       printf ("#    define GTKTYPEBUILTINS_VAR extern __declspec(dllimport)\n");
33       printf ("#  endif\n");
34       printf ("#else\n");
35       printf ("#  define GTKTYPEBUILTINS_VAR extern\n");
36       printf ("#endif\n");
37       printf ("\n");
38     }
39   else if (gen_entries)
40     printf ("/* type entries, generated by maketypes.awk */\n\n");
41   else if (gen_vars)
42     printf ("/* type variables, generated by maketypes.awk */\n\n");
43   else
44     {
45       printf ("hm? what do you want me to do?\n") > "/dev/stderr";
46       exit 1;
47     }
48 }
49
50 function set_type (set_type_1)
51 {
52   type_counter += 1;
53   type_name = set_type_1;
54   type_macro = "GTK_TYPE_";
55   
56   tmp = type_name;
57 # OK, the following is ridiculous, and sed s///g would be far easier
58   gsub ("[A-Z]", "@&", tmp);
59   gsub ("[^A-Z]@", "&_", tmp);
60   gsub ("@", "", tmp);
61   gsub ("[A-Z][A-Z][A-Z][0-9a-z]", "@&", tmp);
62   gsub ("@..", "&_", tmp);
63   gsub ("@", "", tmp);
64   type_macro = type_macro toupper (tmp);
65   type_ident = "_" tolower (tmp);
66
67   sub ("^GTK_TYPE_GTK_", "GTK_TYPE_", type_macro);
68 }
69
70 function generate (generate_what)
71 {
72   if (gen_macros)
73     {
74       printf ("GTKTYPEBUILTINS_VAR GtkType %s;\n", type_macro);
75     }
76   if (gen_entries)
77     {
78       printf ("  { \"%s\", &%s,\n", type_name, type_macro);
79       if (generate_what == "BOXED")
80         printf ("    GTK_TYPE_%s, %s, %s, },\n", generate_what, boxed_copy, boxed_free);
81       else
82         printf ("    GTK_TYPE_%s, %s_values },\n", generate_what, type_ident);
83     }
84   if (gen_vars)
85     {
86       printf ("GTKTYPEBUILTINS_VAR GtkType %s = 0;\n", type_macro);
87     }
88 }
89
90 # skip scheme comments
91 ";" {
92   sub (";.*", "");
93 }
94
95 # parse keywords
96
97 /\(define-enum/ {
98   if ($2 == "")
99     printf ("huh? define-enum keyword without arg?\n") > "/dev/stderr";
100   else
101     {
102       set_type($2);
103       generate("ENUM");
104     }
105 }
106
107 /\(define-flags/ {
108   if ($2 == "")
109     printf ("huh? define-flags keyword without arg?\n") > "/dev/stderr";
110   else
111     {
112       set_type($2);
113       generate("FLAGS");
114     }
115 }
116
117 /\(define-boxed/ {
118   if ($2 == "")
119     printf ("huh? define-boxed keyword without arg?\n") > "/dev/stderr";
120   else
121       {
122           boxed_copy = "NULL";
123           boxed_free = "NULL";
124           set_type($2);
125           do {
126               getline;
127               sub (";.*", "", $0);
128           } while ($0 ~ /^[ \t]*$/);
129           tmp_var1 = $1;
130           if ($0 ~ /\)/) { generate("BOXED"); next; }
131           do {
132               getline;
133               sub (";.*", "", $0);
134           } while ($0 ~ /^[ \t]*$/);
135           tmp_var2 = $1;
136           sub (/\).*/, "", tmp_var2);
137           if (tmp_var1 ~ /^[_A-Za-z][_A-Za-z0-9]*$/ &&
138               tmp_var2 ~ /^[_A-Za-z][_A-Za-z0-9]*$/)
139               {
140                   boxed_copy = tmp_var1;
141                   boxed_free = tmp_var2;
142                   # printf ("read boxed funcs: %s %s\n", boxed_copy, boxed_free) > "/dev/stderr";
143               }
144           generate("BOXED");
145       }
146 }
147
148 END {
149   if (gen_macros)
150     printf("\n#define\tGTK_TYPE_N_BUILTINS\t(%u)\n", type_counter);
151 }