1 #ifndef PRIVATE_SLINT_H_
2 # define PRIVATE_SLINT_H_
3 
4 /* This file defines macros and types for ints of various types.
5  * Eventually it will make use of stdint.h.
6  */
7 
8 /* If long or short are ints, then map the slang types to ints.  This is
9  * done because slang has some optimizations for ints.
10  */
11 #define LONG_IS_INT (SIZEOF_INT == SIZEOF_LONG)
12 #define LONG_IS_NOT_INT (SIZEOF_INT != SIZEOF_LONG)
13 #define SHORT_IS_INT (SIZEOF_INT == SIZEOF_SHORT)
14 #define SHORT_IS_NOT_INT (SIZEOF_INT != SIZEOF_SHORT)
15 #define LLONG_IS_LONG (SIZEOF_LONG == SIZEOF_LONG_LONG)
16 #define LLONG_IS_NOT_LONG (SIZEOF_LONG != SIZEOF_LONG_LONG)
17 
18 #if LONG_IS_INT
19 # define _pSLANG_LONG_TYPE SLANG_INT_TYPE
20 # define _pSLANG_ULONG_TYPE SLANG_UINT_TYPE
21 #else
22 # define _pSLANG_LONG_TYPE SLANG_LONG_TYPE
23 # define _pSLANG_ULONG_TYPE SLANG_ULONG_TYPE
24 #endif
25 #if SHORT_IS_INT
26 # define _pSLANG_SHORT_TYPE SLANG_INT_TYPE
27 # define _pSLANG_USHORT_TYPE SLANG_UINT_TYPE
28 #else
29 # define _pSLANG_SHORT_TYPE SLANG_SHORT_TYPE
30 # define _pSLANG_USHORT_TYPE SLANG_USHORT_TYPE
31 #endif
32 #if LLONG_IS_LONG
33 # define _pSLANG_LLONG_TYPE _pSLANG_LONG_TYPE
34 # define _pSLANG_ULLONG_TYPE _pSLANG_ULONG_TYPE
35 #else
36 # define _pSLANG_LLONG_TYPE SLANG_LLONG_TYPE
37 # define _pSLANG_ULLONG_TYPE SLANG_ULLONG_TYPE
38 #endif
39 
40 /* Map off_t to a slang type */
41 #if defined(HAVE_LONG_LONG) && (SIZEOF_OFF_T == SIZEOF_LONG_LONG) && (SIZEOF_LONG_LONG > SIZEOF_LONG)
42 # define SLANG_C_OFF_T_TYPE _pSLANG_LLONG_TYPE
43 typedef long long _pSLc_off_t_Type;
44 # define SLANG_PUSH_OFF_T SLang_push_long_long
45 #else
46 # if (SIZEOF_OFF_T == SIZEOF_INT)
47 #  define SLANG_C_OFF_T_TYPE SLANG_INT_TYPE
48 #  define SLANG_PUSH_OFF_T SLang_push_int
49 typedef int _pSLc_off_t_Type;
50 # else
51 #  define SLANG_C_OFF_T_TYPE _pSLANG_LONG_TYPE
52 #  define SLANG_PUSH_OFF_T SLang_push_long
53 typedef long _pSLc_off_t_Type;
54 # endif
55 #endif
56 
57 #if SIZEOF_INT == 2
58 # define _pSLANG_INT16_TYPE	SLANG_INT_TYPE
59 # define _pSLANG_UINT16_TYPE	SLANG_UINT_TYPE
60 typedef int _pSLint16_Type;
61 typedef unsigned int _pSLuint16_Type;
62 #else
63 # if SIZEOF_SHORT == 2
64 #  define _pSLANG_INT16_TYPE	SLANG_SHORT_TYPE
65 #  define _pSLANG_UINT16_TYPE	SLANG_USHORT_TYPE
66 typedef short _pSLint16_Type;
67 typedef unsigned short _pSLuint16_Type;
68 # else
69 #  if SIZEOF_LONG == 2
70 #   define _pSLANG_INT16_TYPE	SLANG_LONG_TYPE
71 #   define _pSLANG_UINT16_TYPE	SLANG_ULONG_TYPE
72 typedef long _pSLInt16_Type;
73 typedef unsigned long _pSLuint16_Type;
74 #  else
75 #   define _pSLANG_INT16_TYPE	0
76 #   define _pSLANG_UINT16_TYPE	0
77 #  endif
78 # endif
79 #endif
80 
81 #if SIZEOF_INT == 4
82 # define _pSLANG_INT32_TYPE	SLANG_INT_TYPE
83 # define _pSLANG_UINT32_TYPE	SLANG_UINT_TYPE
84 typedef int _pSLint32_Type;
85 typedef unsigned int _pSLuint32_Type;
86 #else
87 # if SIZEOF_SHORT == 4
88 #  define _pSLANG_INT32_TYPE	SLANG_SHORT_TYPE
89 #  define _pSLANG_UINT32_TYPE	SLANG_USHORT_TYPE
90 typedef short _pSLInt32_Type;
91 typedef unsigned short _pSLuint32_Type;
92 # else
93 #  if SIZEOF_LONG == 4
94 #   define _pSLANG_INT32_TYPE	SLANG_LONG_TYPE
95 #   define _pSLANG_UINT32_TYPE	SLANG_ULONG_TYPE
96 typedef long _pSLInt32_Type;
97 typedef unsigned long _pSLuint32_Type;
98 #  else
99 #   define _pSLANG_INT32_TYPE	0
100 #   define _pSLANG_UINT32_TYPE	0
101 #  endif
102 # endif
103 #endif
104 
105 #if SIZEOF_INT == 8
106 # define _pSLANG_INT64_TYPE	SLANG_INT_TYPE
107 # define _pSLANG_UINT64_TYPE	SLANG_UINT_TYPE
108 typedef int _pSLint64_Type;
109 typedef unsigned int _pSLuint64_Type;
110 #else
111 # if SIZEOF_SHORT == 8
112 #  define _pSLANG_INT64_TYPE	SLANG_SHORT_TYPE
113 #  define _pSLANG_UINT64_TYPE	SLANG_USHORT_TYPE
114 typedef int _pSLint64_Type;
115 typedef unsigned int _pSLuint64_Type;
116 # else
117 #  if SIZEOF_LONG == 8
118 #   define _pSLANG_INT64_TYPE	SLANG_LONG_TYPE
119 #   define _pSLANG_UINT64_TYPE	SLANG_ULONG_TYPE
120 typedef long _pSLint64_Type;
121 typedef unsigned long _pSLuint64_Type;
122 #  else
123 #   if SIZEOF_LONG_LONG == 8
124 #    define _pSLANG_INT64_TYPE	SLANG_LLONG_TYPE
125 #    define _pSLANG_UINT64_TYPE	SLANG_ULLONG_TYPE
126 typedef long long _pSLint64_Type;
127 typedef unsigned long long _pSLuint64_Type;
128 #   else
129 #    define _pSLANG_INT64_TYPE	0
130 #    define _pSLANG_UINT64_TYPE	0
131 #   endif
132 #  endif
133 # endif
134 #endif
135 
136 /* The following are commented out because they are not used by the library */
137 /* extern int _pSLang_pop_int16 (_pSLint16_Type *); */
138 /* extern int _pSLang_pop_uint16 (_pSLuint16_Type *); */
139 /* extern int _pSLang_pop_int32 (_pSLint32_Type *); */
140 /* extern int _pSLang_pop_uint32 (_pSLuint32_Type *); */
141 #if _pSLANG_INT64_TYPE
142 extern int _pSLang_pop_int64(_pSLint64_Type *);
143 extern int _pSLang_pop_uint64 (_pSLuint64_Type *);
144 #endif
145 /* extern int _pSLang_push_int16 (_pSLint16_Type); */
146 /* extern int _pSLang_push_uint16 (_pSLuint16_Type); */
147 /* extern int _pSLang_push_int32 (_pSLint32_Type); */
148 /* extern int _pSLang_push_uint32 (_pSLuint32_Type); */
149 #if _pSLANG_INT64_TYPE
150 /* extern int _pSLang_push_int64(_pSLint64_Type); */
151 /* extern int _pSLang_push_uint64 (_pSLuint64_Type); */
152 #endif
153 
154 #ifdef HAVE_LONG_LONG
155 # ifdef __WIN32__
156 #  define SLFMT_LLD  "%I64d"
157 #  define SLFMT_LLU  "%I64u"
158 # else
159 #  define SLFMT_LLD  "%lld"
160 #  define SLFMT_LLU  "%llu"
161 # endif
162 #endif
163 
164 #endif				       /* PRIVATE_SLINT_H_ */
165