3 /* Rely on vasprintf (GNU extension) instead of vsnprintf if
25 struct atom_map { int name; xcb_atom_t value; };
28 define(`DO', `$1,define(`COUNT', incr(COUNT))COUNT')dnl
29 include(atomlist.m4)`'dnl
32 static const char atom_names[] =
33 define(`DO', ` "$1\0"')dnl
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
42 xcb_atom_t xcb_atom_get_predefined(uint16_t name_len, const char *name)
44 const struct atom_map *value = in_word_set(name, name_len);
45 xcb_atom_t ret = XCB_NONE;
51 const char *xcb_atom_get_name_predefined(xcb_atom_t atom)
53 if(atom <= 0 || atom > (sizeof(atom_name_offsets) / sizeof(*atom_name_offsets)))
55 return atom_names + atom_name_offsets[atom - 1];
58 static char *makename(const char *fmt, ...)
64 #ifndef HAVE_VASPRINTF
68 /* First allocate 'size' bytes, should be enough usually */
69 if((ret = malloc(size)) == NULL)
75 n = vsnprintf(ret, size, fmt, ap);
85 if((np = realloc(ret, size)) == NULL)
95 n = vasprintf(&ret, fmt, ap);
105 char *xcb_atom_name_by_screen(const char *base, uint8_t screen)
107 return makename("%s_S%u", base, screen);
110 char *xcb_atom_name_by_resource(const char *base, uint32_t resource)
112 return makename("%s_R%08X", base, resource);
115 char *xcb_atom_name_unique(const char *base, uint32_t id)
118 return makename("%s_U%lu", base, id);
120 return makename("U%lu", id);