Subversion Repositories Kolibri OS

Rev

Rev 5191 | Go to most recent revision | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 5191 Rev 6324
1
/* Symbol concatenation utilities.
1
/* Symbol concatenation utilities.
2
 
2
 
3
   Copyright (C) 1998, 2000, 2010 Free Software Foundation, Inc.
3
   Copyright (C) 1998-2015 Free Software Foundation, Inc.
4
 
4
 
5
   This program is free software; you can redistribute it and/or modify
5
   This program is free software; you can redistribute it and/or modify
6
   it under the terms of the GNU General Public License as published by
6
   it under the terms of the GNU General Public License as published by
7
   the Free Software Foundation; either version 2 of the License, or
7
   the Free Software Foundation; either version 2 of the License, or
8
   (at your option) any later version.
8
   (at your option) any later version.
9
 
9
 
10
   This program is distributed in the hope that it will be useful,
10
   This program is distributed in the hope that it will be useful,
11
   but WITHOUT ANY WARRANTY; without even the implied warranty of
11
   but WITHOUT ANY WARRANTY; without even the implied warranty of
12
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13
   GNU General Public License for more details.
13
   GNU General Public License for more details.
14
 
14
 
15
   You should have received a copy of the GNU General Public License along
15
   You should have received a copy of the GNU General Public License along
16
   with this program; if not, write to the Free Software Foundation, Inc.,
16
   with this program; if not, write to the Free Software Foundation, Inc.,
17
   51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.  */
17
   51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.  */
18
 
18
 
19
#ifndef SYM_CAT_H
19
#ifndef SYM_CAT_H
20
#define SYM_CAT_H
20
#define SYM_CAT_H
21
 
21
 
22
#if defined (__STDC__) || defined (ALMOST_STDC) || defined (HAVE_STRINGIZE)
22
#if defined (__STDC__) || defined (ALMOST_STDC) || defined (HAVE_STRINGIZE)
23
#define CONCAT2(a,b)	 a##b
23
#define CONCAT2(a,b)	 a##b
24
#define CONCAT3(a,b,c)	 a##b##c
24
#define CONCAT3(a,b,c)	 a##b##c
25
#define CONCAT4(a,b,c,d) a##b##c##d
25
#define CONCAT4(a,b,c,d) a##b##c##d
26
#define CONCAT5(a,b,c,d,e) a##b##c##d##e
26
#define CONCAT5(a,b,c,d,e) a##b##c##d##e
27
#define CONCAT6(a,b,c,d,e,f) a##b##c##d##e##f
27
#define CONCAT6(a,b,c,d,e,f) a##b##c##d##e##f
28
#define STRINGX(s) #s
28
#define STRINGX(s) #s
29
#else
29
#else
30
/* Note one should never pass extra whitespace to the CONCATn macros,
30
/* Note one should never pass extra whitespace to the CONCATn macros,
31
   e.g. CONCAT2(foo, bar) because traditonal C will keep the space between
31
   e.g. CONCAT2(foo, bar) because traditonal C will keep the space between
32
   the two labels instead of concatenating them.  Instead, make sure to
32
   the two labels instead of concatenating them.  Instead, make sure to
33
   write CONCAT2(foo,bar).  */
33
   write CONCAT2(foo,bar).  */
34
#define CONCAT2(a,b)	 a/**/b
34
#define CONCAT2(a,b)	 a/**/b
35
#define CONCAT3(a,b,c)	 a/**/b/**/c
35
#define CONCAT3(a,b,c)	 a/**/b/**/c
36
#define CONCAT4(a,b,c,d) a/**/b/**/c/**/d
36
#define CONCAT4(a,b,c,d) a/**/b/**/c/**/d
37
#define CONCAT5(a,b,c,d,e) a/**/b/**/c/**/d/**/e
37
#define CONCAT5(a,b,c,d,e) a/**/b/**/c/**/d/**/e
38
#define CONCAT6(a,b,c,d,e,f) a/**/b/**/c/**/d/**/e/**/f
38
#define CONCAT6(a,b,c,d,e,f) a/**/b/**/c/**/d/**/e/**/f
39
#define STRINGX(s) "s"
39
#define STRINGX(s) "s"
40
#endif
40
#endif
41
 
41
 
42
#define XCONCAT2(a,b)     CONCAT2(a,b)
42
#define XCONCAT2(a,b)     CONCAT2(a,b)
43
#define XCONCAT3(a,b,c)   CONCAT3(a,b,c)
43
#define XCONCAT3(a,b,c)   CONCAT3(a,b,c)
44
#define XCONCAT4(a,b,c,d) CONCAT4(a,b,c,d)
44
#define XCONCAT4(a,b,c,d) CONCAT4(a,b,c,d)
45
#define XCONCAT5(a,b,c,d,e) CONCAT5(a,b,c,d,e)
45
#define XCONCAT5(a,b,c,d,e) CONCAT5(a,b,c,d,e)
46
#define XCONCAT6(a,b,c,d,e,f) CONCAT6(a,b,c,d,e,f)
46
#define XCONCAT6(a,b,c,d,e,f) CONCAT6(a,b,c,d,e,f)
47
 
47
 
48
/* Note the layer of indirection here is typically used to allow
48
/* Note the layer of indirection here is typically used to allow
49
   stringification of the expansion of macros.  I.e. "#define foo
49
   stringification of the expansion of macros.  I.e. "#define foo
50
   bar", "XSTRING(foo)", to yield "bar".  Be aware that this only
50
   bar", "XSTRING(foo)", to yield "bar".  Be aware that this only
51
   works for __STDC__, not for traditional C which will still resolve
51
   works for __STDC__, not for traditional C which will still resolve
52
   to "foo".  */
52
   to "foo".  */
53
#define XSTRING(s) STRINGX(s) 
53
#define XSTRING(s) STRINGX(s) 
54
 
54
 
55
#endif /* SYM_CAT_H */
55
#endif /* SYM_CAT_H */