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)
27 new_id_derived (const char *pfx, ident *id)
29 int pfx_len = strlen (pfx);
30 int len = pfx_len + ID_TO_STRLEN (id);
31 char *str = alloca (len);
33 memcpy (str, pfx, pfx_len);
34 memcpy (str+pfx_len, ID_TO_STR (id), ID_TO_STRLEN (id));
35 return ID_FROM_STR (str, pfx_len + ID_TO_STRLEN (id));
40 new_id_internal (void)
42 static char str[] = "_0000000";
46 while (++str[i] == '9'+1) {
48 /* if following assertion fails, we get called far too often ;-) */
51 assert (('0' <= str[i]) && (str[i] <= '9'));
53 return ID_FROM_STR (str, sizeof (str) - 1);
58 id_is_internal (ident *id)
60 assert (ID_TO_STRLEN (id));
61 return !!ispunct (ID_TO_STR(id)[0]);
72 for (i = 0; i < ARR_LEN (id); ++i) {
80 ident_print (XP_PAR1, const xprintf_info *info ATTRIBUTE((unused)), XP_PARN)
82 ident *id = XP_GETARG (ident *, 0);
83 return XPMR (ID_TO_STR (id), ID_TO_STRLEN (id));
90 id_set = new_set (memcmp, TUNE_NIDENTS);
92 #define XX_USER(name) id_##name = ID_FROM_STR(#name, sizeof(#name)- 1);
93 #define XX_INTERNAL(name, str) id_##name = ID_FROM_STR((str), sizeof((str))-1);