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