tv: Remove mul_table[][][] and simply use * and <<.
[libfirm] / ir / ident / mangle.c
1 /*
2  * Copyright (C) 1995-2010 University of Karlsruhe.  All right reserved.
3  *
4  * This file is part of libFirm.
5  *
6  * This file may be distributed and/or modified under the terms of the
7  * GNU General Public License version 2 as published by the Free Software
8  * Foundation and appearing in the file LICENSE.GPL included in the
9  * packaging of this file.
10  *
11  * Licensees holding valid libFirm Professional Edition licenses may use
12  * this file in accordance with the libFirm Commercial License.
13  * Agreement provided with the Software.
14  *
15  * This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
16  * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR
17  * PURPOSE.
18  */
19
20 /**
21  * @file
22  * @brief   Methods to manipulate names.
23  * @author  Martin Trapp, Christian Schaefer, Goetz Lindenmaier, Michael Beck
24  */
25 #include "config.h"
26
27 #include <stdio.h>
28
29 #include "ident_t.h"
30 #include "obst.h"
31 #include "irprintf.h"
32
33 /* Make types visible to allow most efficient access */
34 #include "entity_t.h"
35 #include "type_t.h"
36 #include "tpop_t.h"
37
38 /** An obstack used for temporary space */
39 static struct obstack mangle_obst;
40
41 /** returned a mangled type name, currently no mangling */
42 static inline ident *mangle_type(const ir_type *tp)
43 {
44         assert(tp->kind == k_type);
45         return tp->name;
46 }
47
48 /* Returns a new ident that represents 'firstscnd'. */
49 ident *id_mangle(ident *first, ident *scnd)
50 {
51         char *cp;
52         int len;
53         ident *res;
54
55         obstack_grow(&mangle_obst, get_id_str(first), get_id_strlen(first));
56         obstack_grow(&mangle_obst, get_id_str(scnd), get_id_strlen(scnd));
57         len = obstack_object_size(&mangle_obst);
58         cp = (char*)obstack_finish(&mangle_obst);
59         res = new_id_from_chars(cp, len);
60         obstack_free(&mangle_obst, cp);
61         return res;
62 }
63
64 /** Returns a new ident that represents 'prefixscndsuffix'. */
65 ident *id_mangle3(const char *prefix, ident *scnd, const char *suffix)
66 {
67         char *cp;
68         int len;
69         ident *res;
70
71         obstack_grow(&mangle_obst, prefix, strlen(prefix));
72         obstack_grow(&mangle_obst, get_id_str(scnd), get_id_strlen(scnd));
73         obstack_grow(&mangle_obst, suffix, strlen(suffix));
74         len = obstack_object_size(&mangle_obst);
75         cp  = (char*)obstack_finish(&mangle_obst);
76         res = new_id_from_chars(cp, len);
77         obstack_free(&mangle_obst, cp);
78         return res;
79 }
80
81 /** Returns a new ident that represents first<c>scnd. */
82 static ident *id_mangle_3(ident *first, char c, ident *scnd)
83 {
84         char *cp;
85         int len;
86         ident *res;
87
88         obstack_grow(&mangle_obst, get_id_str(first), get_id_strlen(first));
89         obstack_1grow(&mangle_obst, c);
90         obstack_grow(&mangle_obst,get_id_str(scnd),get_id_strlen(scnd));
91         len = obstack_object_size(&mangle_obst);
92         cp = (char*)obstack_finish(&mangle_obst);
93         res = new_id_from_chars(cp, len);
94         obstack_free(&mangle_obst, cp);
95         return res;
96 }
97
98 /* Returns a new ident that represents first_scnd. */
99 ident *id_mangle_u(ident *first, ident* scnd)
100 {
101         return id_mangle_3(first, '_', scnd);
102 }
103
104 /* Returns a new ident that represents first.scnd. */
105 ident *id_mangle_dot(ident *first, ident *scnd)
106 {
107         return id_mangle_3(first, '.', scnd);
108 }
109
110 void firm_init_mangle(void)
111 {
112         obstack_init(&mangle_obst);
113 }
114
115 void firm_finish_mangle(void)
116 {
117         obstack_free(&mangle_obst, NULL);
118 }