1 /* Ident --- unique handles for identifiers
2 Copyright (C) 1995, 1996 Markus Armbruster
3 All rights reserved. */
17 #define XX_USER(name) ident *id_##name;
18 #define XX_INTERNAL(name, str) XX_USER(name)
26 new_id_derived (const char *pfx, ident *id)
28 int pfx_len = strlen (pfx);
29 int len = pfx_len + ID_TO_STRLEN (id);
30 char *str = alloca (len);
32 memcpy (str, pfx, pfx_len);
33 memcpy (str+pfx_len, ID_TO_STR (id), ID_TO_STRLEN (id));
34 return ID_FROM_STR (str, pfx_len + ID_TO_STRLEN (id));
39 new_id_internal (void)
41 static char str[] = "_0000000";
45 while (++str[i] == '9'+1) {
47 /* if following assertion fails, we get called far too often ;-) */
50 assert (('0' <= str[i]) && (str[i] <= '9'));
52 return ID_FROM_STR (str, sizeof (str) - 1);
57 id_is_internal (ident *id)
59 assert (ID_TO_STRLEN (id));
60 return !!ispunct (ID_TO_STR(id)[0]);
71 for (i = 0; i < ARR_LEN (id); ++i) {
79 ident_print (XP_PAR1, const xprintf_info *info ATTRIBUTE((unused)), XP_PARN)
81 ident *id = XP_GETARG (ident *, 0);
82 return XPMR (ID_TO_STR (id), ID_TO_STRLEN (id));
89 id_set = new_set (memcmp, TUNE_NIDENTS);
91 #define XX_USER(name) id_##name = ID_FROM_STR(#name, sizeof(#name)- 1);
92 #define XX_INTERNAL(name, str) id_##name = ID_FROM_STR((str), sizeof((str))-1);