Blame include/symcat.h

Packit bbfece
/* Symbol concatenation utilities.
Packit bbfece
Packit bbfece
   Copyright (C) 1998-2018 Free Software Foundation, Inc.
Packit bbfece
Packit bbfece
   This program is free software; you can redistribute it and/or modify
Packit bbfece
   it under the terms of the GNU General Public License as published by
Packit bbfece
   the Free Software Foundation; either version 2 of the License, or
Packit bbfece
   (at your option) any later version.
Packit bbfece
Packit bbfece
   This program is distributed in the hope that it will be useful,
Packit bbfece
   but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit bbfece
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit bbfece
   GNU General Public License for more details.
Packit bbfece
 
Packit bbfece
   You should have received a copy of the GNU General Public License along
Packit bbfece
   with this program; if not, write to the Free Software Foundation, Inc.,
Packit bbfece
   51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.  */
Packit bbfece
Packit bbfece
#ifndef SYM_CAT_H
Packit bbfece
#define SYM_CAT_H
Packit bbfece
Packit bbfece
#if defined (__STDC__) || defined (ALMOST_STDC) || defined (HAVE_STRINGIZE)
Packit bbfece
#define CONCAT2(a,b)	 a##b
Packit bbfece
#define CONCAT3(a,b,c)	 a##b##c
Packit bbfece
#define CONCAT4(a,b,c,d) a##b##c##d
Packit bbfece
#define CONCAT5(a,b,c,d,e) a##b##c##d##e
Packit bbfece
#define CONCAT6(a,b,c,d,e,f) a##b##c##d##e##f
Packit bbfece
#define STRINGX(s) #s
Packit bbfece
#else
Packit bbfece
/* Note one should never pass extra whitespace to the CONCATn macros,
Packit bbfece
   e.g. CONCAT2(foo, bar) because traditonal C will keep the space between
Packit bbfece
   the two labels instead of concatenating them.  Instead, make sure to
Packit bbfece
   write CONCAT2(foo,bar).  */
Packit bbfece
#define CONCAT2(a,b)	 a/**/b
Packit bbfece
#define CONCAT3(a,b,c)	 a/**/b/**/c
Packit bbfece
#define CONCAT4(a,b,c,d) a/**/b/**/c/**/d
Packit bbfece
#define CONCAT5(a,b,c,d,e) a/**/b/**/c/**/d/**/e
Packit bbfece
#define CONCAT6(a,b,c,d,e,f) a/**/b/**/c/**/d/**/e/**/f
Packit bbfece
#define STRINGX(s) "s"
Packit bbfece
#endif
Packit bbfece
Packit bbfece
#define XCONCAT2(a,b)     CONCAT2(a,b)
Packit bbfece
#define XCONCAT3(a,b,c)   CONCAT3(a,b,c)
Packit bbfece
#define XCONCAT4(a,b,c,d) CONCAT4(a,b,c,d)
Packit bbfece
#define XCONCAT5(a,b,c,d,e) CONCAT5(a,b,c,d,e)
Packit bbfece
#define XCONCAT6(a,b,c,d,e,f) CONCAT6(a,b,c,d,e,f)
Packit bbfece
Packit bbfece
/* Note the layer of indirection here is typically used to allow
Packit bbfece
   stringification of the expansion of macros.  I.e. "#define foo
Packit bbfece
   bar", "XSTRING(foo)", to yield "bar".  Be aware that this only
Packit bbfece
   works for __STDC__, not for traditional C which will still resolve
Packit bbfece
   to "foo".  */
Packit bbfece
#define XSTRING(s) STRINGX(s) 
Packit bbfece
Packit bbfece
#endif /* SYM_CAT_H */