*** empty log message ***
[libfirm] / ir / ident / ident.c
1 /* Ident --- unique handles for identifiers
2    Copyright (C) 1995, 1996 Markus Armbruster
3    All rights reserved. */
4
5 #ifdef HAVE_CONFIG_H
6 # include <config.h>
7 #endif
8
9 #include <assert.h>
10 #include <ctype.h>
11 #include <string.h>
12 #include "array.h"
13 #include "tune.h"
14 #include "ident.h"
15 #include "xprintf.h"
16
17 #define XX_USER(name) ident *id_##name;
18 #define XX_INTERNAL(name, str) XX_USER(name)
19 #undef XX_USER
20 #undef XX_INTERNAL
21
22 set *id_set;
23
24
25 ident *
26 new_id_derived (const char *pfx, ident *id)
27 {
28   int pfx_len = strlen (pfx);
29   int len = pfx_len + ID_TO_STRLEN (id);
30   char *str = alloca (len);
31
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));
35 }
36
37
38 ident *
39 new_id_internal (void)
40 {
41   static char str[] = "_0000000";
42   int i;
43
44   i = sizeof (str) - 2;
45   while (++str[i] == '9'+1) {
46     str[i--] = '0';
47     /* if following assertion fails, we get called far too often ;-) */
48     assert (i >= 0);
49   }
50   assert (('0' <= str[i]) && (str[i] <= '9'));
51
52   return ID_FROM_STR (str, sizeof (str) - 1);
53 }
54
55
56 bool
57 id_is_internal (ident *id)
58 {
59   assert (ID_TO_STRLEN (id));
60   return !!ispunct (ID_TO_STR(id)[0]);
61 }
62
63
64 #ifndef NDEBUG
65
66 void
67 ids_vrfy (ident **id)
68 {
69   int i;
70
71   for (i = 0;  i < ARR_LEN (id);  ++i) {
72     ID_VRFY (id[i]);
73   }
74 }
75
76 #endif
77
78 int
79 ident_print (XP_PAR1, const xprintf_info *info ATTRIBUTE((unused)), XP_PARN)
80 {
81   ident *id = XP_GETARG (ident *, 0);
82   return XPMR (ID_TO_STR (id), ID_TO_STRLEN (id));
83 }
84
85
86 void
87 id_init (void)
88 {
89   id_set = new_set (memcmp, TUNE_NIDENTS);
90
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);
93 #undef XX_USER
94 #undef XX_INTERNAL
95 }