Tizen 2.0 Release
[framework/uifw/xorg/xcb/xcb-util.git] / src / atoms.gperf.m4
1 %{
2
3 /* Rely on vasprintf (GNU extension) instead of vsnprintf if
4    possible... */
5 #ifdef HAVE_VASPRINTF
6 #define _GNU_SOURCE
7 #include <stdio.h>
8 #endif
9
10 #include <xcb/xcb.h>
11 #include <stdlib.h>
12 #include <stdarg.h>
13 #include "xcb_atom.h"
14
15 %}
16
17 %readonly-tables
18 %pic
19 %null-strings
20 %enum
21 %includes
22 %compare-strncmp
23
24 %struct-type
25 struct atom_map { int name; xcb_atom_t value; };
26 %%
27 define(`COUNT', 0)dnl
28 define(`DO', `$1,define(`COUNT', incr(COUNT))COUNT')dnl
29 include(atomlist.m4)`'dnl
30 %%
31
32 static const char atom_names[] =
33 define(`DO', `  "$1\0"')dnl
34 include(atomlist.m4);
35
36 static const uint16_t atom_name_offsets[] = {
37 define(`OFFSET', 0)dnl
38 define(`DO', `  OFFSET,define(`OFFSET', eval(OFFSET+1+len($1)))')dnl
39 include(atomlist.m4)`'dnl
40 };
41
42 xcb_atom_t xcb_atom_get_predefined(uint16_t name_len, const char *name)
43 {
44         const struct atom_map *value = in_word_set(name, name_len);
45         xcb_atom_t ret = XCB_NONE;
46         if(value)
47                 ret = value->value;
48         return ret;
49 }
50
51 const char *xcb_atom_get_name_predefined(xcb_atom_t atom)
52 {
53         if(atom <= 0 || atom > (sizeof(atom_name_offsets) / sizeof(*atom_name_offsets)))
54                 return 0;
55         return atom_names + atom_name_offsets[atom - 1];
56 }
57
58 static char *makename(const char *fmt, ...)
59 {
60         char *ret;
61         int n;
62         va_list ap;
63
64 #ifndef HAVE_VASPRINTF
65         char *np;
66         int size = 64;
67
68         /* First allocate 'size' bytes, should be enough usually */
69         if((ret = malloc(size)) == NULL)
70                 return NULL;
71
72         while(1)
73         {
74                 va_start(ap, fmt);
75                 n = vsnprintf(ret, size, fmt, ap);
76                 va_end(ap);
77
78                 if(n < 0)
79                         return NULL;
80
81                 if(n < size)
82                         return ret;
83
84                 size = n + 1;
85                 if((np = realloc(ret, size)) == NULL)
86                 {
87                         free(ret);
88                         return NULL;
89                 }
90
91                 ret = np;
92         }
93 #else
94         va_start(ap, fmt);
95         n = vasprintf(&ret, fmt, ap);
96         va_end(ap);
97
98         if(n < 0)
99                 return NULL;
100
101         return ret;
102 #endif
103 }
104
105 char *xcb_atom_name_by_screen(const char *base, uint8_t screen)
106 {
107         return makename("%s_S%u", base, screen);
108 }
109
110 char *xcb_atom_name_by_resource(const char *base, uint32_t resource)
111 {
112         return makename("%s_R%08X", base, resource);
113 }
114
115 char *xcb_atom_name_unique(const char *base, uint32_t id)
116 {
117         if(base)
118                 return makename("%s_U%lu", base, id);
119         else
120                 return makename("U%lu", id);
121 }