P99
p99_classification.h
Go to the documentation of this file.
1 /* This may look like nonsense, but it really is -*- mode: C; coding: utf-8 -*- */
2 /* */
3 /* Except for parts copied from previous work and as explicitly stated below, */
4 /* the authors and copyright holders for this work are as follows: */
5 /* (C) copyright 2010-2011 Jens Gustedt, INRIA, France */
6 /* (C) copyright 2012 William Morris */
7 /* */
8 /* This file is free software; it is part of the P99 project. */
9 /* */
10 /* Licensed under the Apache License, Version 2.0 (the "License"); */
11 /* you may not use this file except in compliance with the License. */
12 /* You may obtain a copy of the License at */
13 /* */
14 /* http://www.apache.org/licenses/LICENSE-2.0 */
15 /* */
16 /* Unless required by applicable law or agreed to in writing, software */
17 /* distributed under the License is distributed on an "AS IS" BASIS, */
18 /* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. */
19 /* See the License for the specific language governing permissions and */
20 /* limitations under the License. */
21 /* */
22 #ifndef P99_CLASSIFICATION_H_
23 # define P99_CLASSIFICATION_H_
24 
25 #include "p99_map.h"
26 
47 #define P00_BUILTIN_TYPE_V P00_BUILTIN_TYPE_v
48 #define P00_BUILTIN_TYPE_B P00_BUILTIN_TYPE_b
49 #define P00_BUILTIN_TYPE_C P00_BUILTIN_TYPE_c
50 #define P00_BUILTIN_TYPE_D P00_BUILTIN_TYPE_d
51 #define P00_BUILTIN_TYPE_DC P00_BUILTIN_TYPE_dc
52 #define P00_BUILTIN_TYPE_DI P00_BUILTIN_TYPE_di
53 #define P00_BUILTIN_TYPE_Dc P00_BUILTIN_TYPE_dc
54 /* #define P00_BUILTIN_TYPE_Di P00_BUILTIN_TYPE_di */
55 #define P00_BUILTIN_TYPE_F P00_BUILTIN_TYPE_f
56 #define P00_BUILTIN_TYPE_FC P00_BUILTIN_TYPE_fc
57 #define P00_BUILTIN_TYPE_FI P00_BUILTIN_TYPE_fi
58 #define P00_BUILTIN_TYPE_Fc P00_BUILTIN_TYPE_fc
59 /* #define P00_BUILTIN_TYPE_Fi P00_BUILTIN_TYPE_fi */
60 #define P00_BUILTIN_TYPE_H P00_BUILTIN_TYPE_h
61 #define P00_BUILTIN_TYPE_HH P00_BUILTIN_TYPE_hh
62 #define P00_BUILTIN_TYPE_Hh P00_BUILTIN_TYPE_hh
63 #define P00_BUILTIN_TYPE_I P00_BUILTIN_TYPE_i
64 #define P00_BUILTIN_TYPE_L P00_BUILTIN_TYPE_l
65 #define P00_BUILTIN_TYPE_LD P00_BUILTIN_TYPE_ld
66 #define P00_BUILTIN_TYPE_LDC P00_BUILTIN_TYPE_ldc
67 #define P00_BUILTIN_TYPE_LDI P00_BUILTIN_TYPE_ldi
68 #define P00_BUILTIN_TYPE_LDc P00_BUILTIN_TYPE_ldc
69 /* #define P00_BUILTIN_TYPE_LDi P00_BUILTIN_TYPE_ldi */
70 #define P00_BUILTIN_TYPE_LL P00_BUILTIN_TYPE_ll
71 #define P00_BUILTIN_TYPE_Ld P00_BUILTIN_TYPE_ld
72 #define P00_BUILTIN_TYPE_LdC P00_BUILTIN_TYPE_ldc
73 /* #define P00_BUILTIN_TYPE_LdI P00_BUILTIN_TYPE_ldi */
74 #define P00_BUILTIN_TYPE_Ldc P00_BUILTIN_TYPE_ldc
75 /* #define P00_BUILTIN_TYPE_Ldi P00_BUILTIN_TYPE_ldi */
76 #define P00_BUILTIN_TYPE_Ll P00_BUILTIN_TYPE_ll
77 #define P00_BUILTIN_TYPE_U P00_BUILTIN_TYPE_u
78 #define P00_BUILTIN_TYPE_UH P00_BUILTIN_TYPE_uh
79 #define P00_BUILTIN_TYPE_UHH P00_BUILTIN_TYPE_uhh
80 #define P00_BUILTIN_TYPE_UHh P00_BUILTIN_TYPE_uhh
81 #define P00_BUILTIN_TYPE_UL P00_BUILTIN_TYPE_ul
82 #define P00_BUILTIN_TYPE_ULL P00_BUILTIN_TYPE_ull
83 #define P00_BUILTIN_TYPE_ULl P00_BUILTIN_TYPE_ull
84 #define P00_BUILTIN_TYPE_Uh P00_BUILTIN_TYPE_uh
85 #define P00_BUILTIN_TYPE_UhH P00_BUILTIN_TYPE_uhh
86 #define P00_BUILTIN_TYPE_Uhh P00_BUILTIN_TYPE_uhh
87 #define P00_BUILTIN_TYPE_Ul P00_BUILTIN_TYPE_ul
88 #define P00_BUILTIN_TYPE_UlL P00_BUILTIN_TYPE_ull
89 #define P00_BUILTIN_TYPE_Ull P00_BUILTIN_TYPE_ull
90 #define P00_BUILTIN_TYPE_dC P00_BUILTIN_TYPE_dc
91 /* #define P00_BUILTIN_TYPE_dI P00_BUILTIN_TYPE_di */
92 #define P00_BUILTIN_TYPE_fC P00_BUILTIN_TYPE_fc
93 /* #define P00_BUILTIN_TYPE_fI P00_BUILTIN_TYPE_fi */
94 #define P00_BUILTIN_TYPE_hH P00_BUILTIN_TYPE_hh
95 #define P00_BUILTIN_TYPE_lD P00_BUILTIN_TYPE_ld
96 #define P00_BUILTIN_TYPE_lDC P00_BUILTIN_TYPE_ldc
97 /* #define P00_BUILTIN_TYPE_lDI P00_BUILTIN_TYPE_ldi */
98 #define P00_BUILTIN_TYPE_lDc P00_BUILTIN_TYPE_ldc
99 /* #define P00_BUILTIN_TYPE_lDi P00_BUILTIN_TYPE_ldi */
100 #define P00_BUILTIN_TYPE_lL P00_BUILTIN_TYPE_ll
101 #define P00_BUILTIN_TYPE_ldC P00_BUILTIN_TYPE_ldc
102 /* #define P00_BUILTIN_TYPE_ldI P00_BUILTIN_TYPE_ldi */
103 #define P00_BUILTIN_TYPE_uH P00_BUILTIN_TYPE_uh
104 #define P00_BUILTIN_TYPE_uHH P00_BUILTIN_TYPE_uhh
105 #define P00_BUILTIN_TYPE_uHh P00_BUILTIN_TYPE_uhh
106 #define P00_BUILTIN_TYPE_uL P00_BUILTIN_TYPE_ul
107 #define P00_BUILTIN_TYPE_uLL P00_BUILTIN_TYPE_ull
108 #define P00_BUILTIN_TYPE_uLl P00_BUILTIN_TYPE_ull
109 #define P00_BUILTIN_TYPE_uhH P00_BUILTIN_TYPE_uhh
110 #define P00_BUILTIN_TYPE_ulL P00_BUILTIN_TYPE_ull
111 
112 
113 #define P00_DETECT_PAREN(...) ,
114 
118 #define P99_HAS_NO_PAREN(...) \
119  /* Use of P00_NARG is important to avoid false trigger when __VA_ARGS__ is empty */ \
120 P99_IS_EQ(P00_NARG(__VA_ARGS__), P00_NARG(P00_DETECT_PAREN __VA_ARGS__))
121 #define P00_REMOVE_PAREN_(...) __VA_ARGS__
122 
123 #define P00_REMOVE_PAREN(ARG) P00_REMOVE_PAREN_ ARG
124 
128 #define P99_REMOVE_PAREN(...) \
129  P99_IF_ELSE(P99_HAS_NO_PAREN(__VA_ARGS__))(__VA_ARGS__)(P00_REMOVE_PAREN(__VA_ARGS__))
130 
131 #define P00_TYPE_NORMALIZE_(CODE, CONS, VOLA, SEQ) \
132 P99_IF_EMPTY(CODE) \
133  (P99_IF_EMPTY(SEQ)(void)(SEQ)) \
134  (P99_BUILTIN_TYPE(CODE) \
135  CONS \
136  VOLA \
137  )
138 
139 #define P00_TYPE_NORMALIZE(N, CODE, SEQ) \
140 P00_TYPE_NORMALIZE_(CODE, \
141  P00_CONST_CLASSIFY_(N, SEQ), \
142  P00_VOLATILE_CLASSIFY_(N, SEQ), \
143  SEQ \
144  )
145 
152 #define P99_VOID_NORMALIZE(SEQ) \
153  P00_TYPE_NORMALIZE(P99_VOID_QUAL_LEN(SEQ), P00_VOID_CLASSIFY(SEQ), SEQ)
154 
162 #define P99_BOOL_NORMALIZE(SEQ) \
163  P00_TYPE_NORMALIZE(P99_BOOL_QUAL_LEN(SEQ), P00_BOOL_CLASSIFY(SEQ), SEQ)
164 
175 #define P99_INTEGER_NORMALIZE(SEQ) \
176  P00_TYPE_NORMALIZE(P99_INTEGER_QUAL_LEN(SEQ), P00_INTEGER_CLASSIFY(SEQ), SEQ)
177 
189 #define P99_FLOAT_NORMALIZE(SEQ) \
190  P00_TYPE_NORMALIZE(P99_FLOAT_QUAL_LEN(SEQ), P00_FLOAT_CLASSIFY(SEQ), SEQ)
191 
192 
199 #endif /* !P99_CLASSIFICATION_H_ */
p99_map.h
macros to produce lists of statements or declarations.