Initial revision
[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 #include "xx_ident.h"
20 #undef XX_USER
21 #undef XX_INTERNAL
22
23 set *id_set;
24
25
26 ident *
27 new_id_derived (const char *pfx, ident *id)
28 {
29   int pfx_len = strlen (pfx);
30   int len = pfx_len + ID_TO_STRLEN (id);
31   char *str = alloca (len);
32
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));
36 }
37
38
39 ident *
40 new_id_internal (void)
41 {
42   static char str[] = "_0000000";
43   int i;
44
45   i = sizeof (str) - 2;
46   while (++str[i] == '9'+1) {
47     str[i--] = '0';
48     /* if following assertion fails, we get called far too often ;-) */
49     assert (i >= 0);
50   }
51   assert (('0' <= str[i]) && (str[i] <= '9'));
52
53   return ID_FROM_STR (str, sizeof (str) - 1);
54 }
55
56
57 bool
58 id_is_internal (ident *id)
59 {
60   assert (ID_TO_STRLEN (id));
61   return !!ispunct (ID_TO_STR(id)[0]);
62 }
63
64
65 #ifndef NDEBUG
66
67 void
68 ids_vrfy (ident **id)
69 {
70   int i;
71
72   for (i = 0;  i < ARR_LEN (id);  ++i) {
73     ID_VRFY (id[i]);
74   }
75 }
76
77 #endif
78
79 int
80 ident_print (XP_PAR1, const xprintf_info *info ATTRIBUTE((unused)), XP_PARN)
81 {
82   ident *id = XP_GETARG (ident *, 0);
83   return XPMR (ID_TO_STR (id), ID_TO_STRLEN (id));
84 }
85
86
87 void
88 id_init (void)
89 {
90   id_set = new_set (memcmp, TUNE_NIDENTS);
91
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);
94 #include "xx_ident.h"
95 #undef XX_USER
96 #undef XX_INTERNAL
97 }