triez 0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,75 @@
1
+ /*
2
+ * This file is part of hat-trie
3
+ *
4
+ * Copyright (c) 2011 by Daniel C. Jones <dcjones@cs.washington.edu>
5
+ *
6
+ *
7
+ * This is an implementation of the HAT-trie data structure described in,
8
+ *
9
+ * Askitis, N., & Sinha, R. (2007). HAT-trie: a cache-conscious trie-based data
10
+ * structure for strings. Proceedings of the thirtieth Australasian conference on
11
+ * Computer science-Volume 62 (pp. 97–105). Australian Computer Society, Inc.
12
+ *
13
+ * The HAT-trie is in essence a hybrid data structure, combining tries and hash
14
+ * tables in a clever way to try to get the best of both worlds.
15
+ *
16
+ */
17
+
18
+ #ifndef HATTRIE_HATTRIE_H
19
+ #define HATTRIE_HATTRIE_H
20
+
21
+ #ifdef __cplusplus
22
+ extern "C" {
23
+ #endif
24
+
25
+ #include "common.h"
26
+ #include <stdlib.h>
27
+ #include <stdbool.h>
28
+
29
+ typedef struct hattrie_t_ hattrie_t;
30
+
31
+ hattrie_t* hattrie_create (void); //< Create an empty hat-trie.
32
+ void hattrie_free (hattrie_t*); //< Free all memory used by a trie.
33
+ hattrie_t* hattrie_dup (const hattrie_t*); //< Duplicate an existing trie.
34
+ void hattrie_clear (hattrie_t*); //< Remove all entries.
35
+
36
+ /** number of inserted keys
37
+ */
38
+ size_t hattrie_size (hattrie_t*);
39
+
40
+ /** Find the given key in the trie, inserting it if it does not exist, and
41
+ * returning a pointer to it's key.
42
+ *
43
+ * This pointer is not guaranteed to be valid after additional calls to
44
+ * hattrie_get, hattrie_del, hattrie_clear, or other functions that modifies the
45
+ * trie.
46
+ */
47
+ value_t* hattrie_get (hattrie_t*, const char* key, size_t len);
48
+
49
+
50
+ /** Find a given key in the table, returning a NULL pointer if it does not
51
+ * exist. */
52
+ value_t* hattrie_tryget (hattrie_t*, const char* key, size_t len);
53
+
54
+ /** Delete a given key from trie. Returns 0 if successful or -1 if not found.
55
+ */
56
+ int hattrie_del(hattrie_t* T, const char* key, size_t len);
57
+
58
+ typedef struct hattrie_iter_t_ hattrie_iter_t;
59
+
60
+ hattrie_iter_t* hattrie_iter_begin (const hattrie_t*, bool sorted);
61
+ void hattrie_iter_next (hattrie_iter_t*);
62
+ bool hattrie_iter_finished (hattrie_iter_t*);
63
+ void hattrie_iter_free (hattrie_iter_t*);
64
+ const char* hattrie_iter_key (hattrie_iter_t*, size_t* len);
65
+ value_t* hattrie_iter_val (hattrie_iter_t*);
66
+
67
+ hattrie_iter_t* hattrie_iter_with_prefix(const hattrie_t*, bool sorted, const char* prefix, size_t prefix_len);
68
+
69
+ #ifdef __cplusplus
70
+ }
71
+ #endif
72
+
73
+ #endif
74
+
75
+
@@ -0,0 +1,22 @@
1
+ /*
2
+ * This file is part of hat-trie.
3
+ *
4
+ * Copyright (c) 2011 by Daniel C. Jones <dcjones@cs.washington.edu>
5
+ *
6
+ * misc :
7
+ * miscelaneous functions.
8
+ *
9
+ */
10
+
11
+ #ifndef LINESET_MISC_H
12
+ #define LINESET_MISC_H
13
+
14
+ #include <stdio.h>
15
+
16
+ void* malloc_or_die(size_t);
17
+ void* realloc_or_die(void*, size_t);
18
+ FILE* fopen_or_die(const char*, const char*);
19
+
20
+ #endif
21
+
22
+
@@ -0,0 +1,77 @@
1
+ /* This is MurmurHash3. The original C++ code was placed in the public domain
2
+ * by its author, Austin Appleby. */
3
+
4
+ #include "murmurhash3.h"
5
+
6
+ static inline uint32_t fmix(uint32_t h)
7
+ {
8
+ h ^= h >> 16;
9
+ h *= 0x85ebca6b;
10
+ h ^= h >> 13;
11
+ h *= 0xc2b2ae35;
12
+ h ^= h >> 16;
13
+
14
+ return h;
15
+ }
16
+
17
+
18
+ static inline uint32_t rotl32(uint32_t x, int8_t r)
19
+ {
20
+ return (x << r) | (x >> (32 - r));
21
+ }
22
+
23
+
24
+ uint32_t hash(const char* data, size_t len_)
25
+ {
26
+ const int len = (int) len_;
27
+ const int nblocks = len / 4;
28
+
29
+ uint32_t h1 = 0xc062fb4a;
30
+
31
+ uint32_t c1 = 0xcc9e2d51;
32
+ uint32_t c2 = 0x1b873593;
33
+
34
+ //----------
35
+ // body
36
+
37
+ const uint32_t * blocks = (const uint32_t*) (data + nblocks * 4);
38
+
39
+ int i;
40
+ for(i = -nblocks; i; i++)
41
+ {
42
+ uint32_t k1 = blocks[i];
43
+
44
+ k1 *= c1;
45
+ k1 = rotl32(k1, 15);
46
+ k1 *= c2;
47
+
48
+ h1 ^= k1;
49
+ h1 = rotl32(h1, 13);
50
+ h1 = h1*5+0xe6546b64;
51
+ }
52
+
53
+ //----------
54
+ // tail
55
+
56
+ const uint8_t * tail = (const uint8_t*)(data + nblocks*4);
57
+
58
+ uint32_t k1 = 0;
59
+
60
+ switch(len & 3)
61
+ {
62
+ case 3: k1 ^= tail[2] << 16;
63
+ case 2: k1 ^= tail[1] << 8;
64
+ case 1: k1 ^= tail[0];
65
+ k1 *= c1; k1 = rotl32(k1,15); k1 *= c2; h1 ^= k1;
66
+ }
67
+
68
+ //----------
69
+ // finalization
70
+
71
+ h1 ^= len;
72
+
73
+ h1 = fmix(h1);
74
+
75
+ return h1;
76
+ }
77
+
@@ -0,0 +1,12 @@
1
+
2
+ #ifndef MURMURHASH3_H
3
+ #define MURMURHASH3_H
4
+
5
+ #include <stdlib.h>
6
+
7
+ #include "pstdint.h"
8
+
9
+ uint32_t hash(const char* data, size_t len);
10
+
11
+ #endif
12
+
@@ -0,0 +1,800 @@
1
+ /* A portable stdint.h
2
+ ****************************************************************************
3
+ * BSD License:
4
+ ****************************************************************************
5
+ *
6
+ * Copyright (c) 2005-2011 Paul Hsieh
7
+ * All rights reserved.
8
+ *
9
+ * Redistribution and use in source and binary forms, with or without
10
+ * modification, are permitted provided that the following conditions
11
+ * are met:
12
+ *
13
+ * 1. Redistributions of source code must retain the above copyright
14
+ * notice, this list of conditions and the following disclaimer.
15
+ * 2. Redistributions in binary form must reproduce the above copyright
16
+ * notice, this list of conditions and the following disclaimer in the
17
+ * documentation and/or other materials provided with the distribution.
18
+ * 3. The name of the author may not be used to endorse or promote products
19
+ * derived from this software without specific prior written permission.
20
+ *
21
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
22
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
23
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
24
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
25
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
26
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
27
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
28
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
30
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31
+ *
32
+ ****************************************************************************
33
+ *
34
+ * Version 0.1.12
35
+ *
36
+ * The ANSI C standard committee, for the C99 standard, specified the
37
+ * inclusion of a new standard include file called stdint.h. This is
38
+ * a very useful and long desired include file which contains several
39
+ * very precise definitions for integer scalar types that is
40
+ * critically important for making portable several classes of
41
+ * applications including cryptography, hashing, variable length
42
+ * integer libraries and so on. But for most developers its likely
43
+ * useful just for programming sanity.
44
+ *
45
+ * The problem is that most compiler vendors have decided not to
46
+ * implement the C99 standard, and the next C++ language standard
47
+ * (which has a lot more mindshare these days) will be a long time in
48
+ * coming and its unknown whether or not it will include stdint.h or
49
+ * how much adoption it will have. Either way, it will be a long time
50
+ * before all compilers come with a stdint.h and it also does nothing
51
+ * for the extremely large number of compilers available today which
52
+ * do not include this file, or anything comparable to it.
53
+ *
54
+ * So that's what this file is all about. Its an attempt to build a
55
+ * single universal include file that works on as many platforms as
56
+ * possible to deliver what stdint.h is supposed to. A few things
57
+ * that should be noted about this file:
58
+ *
59
+ * 1) It is not guaranteed to be portable and/or present an identical
60
+ * interface on all platforms. The extreme variability of the
61
+ * ANSI C standard makes this an impossibility right from the
62
+ * very get go. Its really only meant to be useful for the vast
63
+ * majority of platforms that possess the capability of
64
+ * implementing usefully and precisely defined, standard sized
65
+ * integer scalars. Systems which are not intrinsically 2s
66
+ * complement may produce invalid constants.
67
+ *
68
+ * 2) There is an unavoidable use of non-reserved symbols.
69
+ *
70
+ * 3) Other standard include files are invoked.
71
+ *
72
+ * 4) This file may come in conflict with future platforms that do
73
+ * include stdint.h. The hope is that one or the other can be
74
+ * used with no real difference.
75
+ *
76
+ * 5) In the current verison, if your platform can't represent
77
+ * int32_t, int16_t and int8_t, it just dumps out with a compiler
78
+ * error.
79
+ *
80
+ * 6) 64 bit integers may or may not be defined. Test for their
81
+ * presence with the test: #ifdef INT64_MAX or #ifdef UINT64_MAX.
82
+ * Note that this is different from the C99 specification which
83
+ * requires the existence of 64 bit support in the compiler. If
84
+ * this is not defined for your platform, yet it is capable of
85
+ * dealing with 64 bits then it is because this file has not yet
86
+ * been extended to cover all of your system's capabilities.
87
+ *
88
+ * 7) (u)intptr_t may or may not be defined. Test for its presence
89
+ * with the test: #ifdef PTRDIFF_MAX. If this is not defined
90
+ * for your platform, then it is because this file has not yet
91
+ * been extended to cover all of your system's capabilities, not
92
+ * because its optional.
93
+ *
94
+ * 8) The following might not been defined even if your platform is
95
+ * capable of defining it:
96
+ *
97
+ * WCHAR_MIN
98
+ * WCHAR_MAX
99
+ * (u)int64_t
100
+ * PTRDIFF_MIN
101
+ * PTRDIFF_MAX
102
+ * (u)intptr_t
103
+ *
104
+ * 9) The following have not been defined:
105
+ *
106
+ * WINT_MIN
107
+ * WINT_MAX
108
+ *
109
+ * 10) The criteria for defining (u)int_least(*)_t isn't clear,
110
+ * except for systems which don't have a type that precisely
111
+ * defined 8, 16, or 32 bit types (which this include file does
112
+ * not support anyways). Default definitions have been given.
113
+ *
114
+ * 11) The criteria for defining (u)int_fast(*)_t isn't something I
115
+ * would trust to any particular compiler vendor or the ANSI C
116
+ * committee. It is well known that "compatible systems" are
117
+ * commonly created that have very different performance
118
+ * characteristics from the systems they are compatible with,
119
+ * especially those whose vendors make both the compiler and the
120
+ * system. Default definitions have been given, but its strongly
121
+ * recommended that users never use these definitions for any
122
+ * reason (they do *NOT* deliver any serious guarantee of
123
+ * improved performance -- not in this file, nor any vendor's
124
+ * stdint.h).
125
+ *
126
+ * 12) The following macros:
127
+ *
128
+ * PRINTF_INTMAX_MODIFIER
129
+ * PRINTF_INT64_MODIFIER
130
+ * PRINTF_INT32_MODIFIER
131
+ * PRINTF_INT16_MODIFIER
132
+ * PRINTF_LEAST64_MODIFIER
133
+ * PRINTF_LEAST32_MODIFIER
134
+ * PRINTF_LEAST16_MODIFIER
135
+ * PRINTF_INTPTR_MODIFIER
136
+ *
137
+ * are strings which have been defined as the modifiers required
138
+ * for the "d", "u" and "x" printf formats to correctly output
139
+ * (u)intmax_t, (u)int64_t, (u)int32_t, (u)int16_t, (u)least64_t,
140
+ * (u)least32_t, (u)least16_t and (u)intptr_t types respectively.
141
+ * PRINTF_INTPTR_MODIFIER is not defined for some systems which
142
+ * provide their own stdint.h. PRINTF_INT64_MODIFIER is not
143
+ * defined if INT64_MAX is not defined. These are an extension
144
+ * beyond what C99 specifies must be in stdint.h.
145
+ *
146
+ * In addition, the following macros are defined:
147
+ *
148
+ * PRINTF_INTMAX_HEX_WIDTH
149
+ * PRINTF_INT64_HEX_WIDTH
150
+ * PRINTF_INT32_HEX_WIDTH
151
+ * PRINTF_INT16_HEX_WIDTH
152
+ * PRINTF_INT8_HEX_WIDTH
153
+ * PRINTF_INTMAX_DEC_WIDTH
154
+ * PRINTF_INT64_DEC_WIDTH
155
+ * PRINTF_INT32_DEC_WIDTH
156
+ * PRINTF_INT16_DEC_WIDTH
157
+ * PRINTF_INT8_DEC_WIDTH
158
+ *
159
+ * Which specifies the maximum number of characters required to
160
+ * print the number of that type in either hexadecimal or decimal.
161
+ * These are an extension beyond what C99 specifies must be in
162
+ * stdint.h.
163
+ *
164
+ * Compilers tested (all with 0 warnings at their highest respective
165
+ * settings): Borland Turbo C 2.0, WATCOM C/C++ 11.0 (16 bits and 32
166
+ * bits), Microsoft Visual C++ 6.0 (32 bit), Microsoft Visual Studio
167
+ * .net (VC7), Intel C++ 4.0, GNU gcc v3.3.3
168
+ *
169
+ * This file should be considered a work in progress. Suggestions for
170
+ * improvements, especially those which increase coverage are strongly
171
+ * encouraged.
172
+ *
173
+ * Acknowledgements
174
+ *
175
+ * The following people have made significant contributions to the
176
+ * development and testing of this file:
177
+ *
178
+ * Chris Howie
179
+ * John Steele Scott
180
+ * Dave Thorup
181
+ * John Dill
182
+ *
183
+ */
184
+
185
+ #include <stddef.h>
186
+ #include <limits.h>
187
+ #include <signal.h>
188
+
189
+ /*
190
+ * For gcc with _STDINT_H, fill in the PRINTF_INT*_MODIFIER macros, and
191
+ * do nothing else. On the Mac OS X version of gcc this is _STDINT_H_.
192
+ */
193
+
194
+ #if ((defined(__STDC__) && __STDC__ && __STDC_VERSION__ >= 199901L) || (defined (__WATCOMC__) && (defined (_STDINT_H_INCLUDED) || __WATCOMC__ >= 1250)) || (defined(__GNUC__) && (defined(_STDINT_H) || defined(_STDINT_H_) || defined (__UINT_FAST64_TYPE__)) )) && !defined (_PSTDINT_H_INCLUDED)
195
+ #include <stdint.h>
196
+ #define _PSTDINT_H_INCLUDED
197
+ # ifndef PRINTF_INT64_MODIFIER
198
+ # define PRINTF_INT64_MODIFIER "ll"
199
+ # endif
200
+ # ifndef PRINTF_INT32_MODIFIER
201
+ # define PRINTF_INT32_MODIFIER "l"
202
+ # endif
203
+ # ifndef PRINTF_INT16_MODIFIER
204
+ # define PRINTF_INT16_MODIFIER "h"
205
+ # endif
206
+ # ifndef PRINTF_INTMAX_MODIFIER
207
+ # define PRINTF_INTMAX_MODIFIER PRINTF_INT64_MODIFIER
208
+ # endif
209
+ # ifndef PRINTF_INT64_HEX_WIDTH
210
+ # define PRINTF_INT64_HEX_WIDTH "16"
211
+ # endif
212
+ # ifndef PRINTF_INT32_HEX_WIDTH
213
+ # define PRINTF_INT32_HEX_WIDTH "8"
214
+ # endif
215
+ # ifndef PRINTF_INT16_HEX_WIDTH
216
+ # define PRINTF_INT16_HEX_WIDTH "4"
217
+ # endif
218
+ # ifndef PRINTF_INT8_HEX_WIDTH
219
+ # define PRINTF_INT8_HEX_WIDTH "2"
220
+ # endif
221
+ # ifndef PRINTF_INT64_DEC_WIDTH
222
+ # define PRINTF_INT64_DEC_WIDTH "20"
223
+ # endif
224
+ # ifndef PRINTF_INT32_DEC_WIDTH
225
+ # define PRINTF_INT32_DEC_WIDTH "10"
226
+ # endif
227
+ # ifndef PRINTF_INT16_DEC_WIDTH
228
+ # define PRINTF_INT16_DEC_WIDTH "5"
229
+ # endif
230
+ # ifndef PRINTF_INT8_DEC_WIDTH
231
+ # define PRINTF_INT8_DEC_WIDTH "3"
232
+ # endif
233
+ # ifndef PRINTF_INTMAX_HEX_WIDTH
234
+ # define PRINTF_INTMAX_HEX_WIDTH PRINTF_INT64_HEX_WIDTH
235
+ # endif
236
+ # ifndef PRINTF_INTMAX_DEC_WIDTH
237
+ # define PRINTF_INTMAX_DEC_WIDTH PRINTF_INT64_DEC_WIDTH
238
+ # endif
239
+
240
+ /*
241
+ * Something really weird is going on with Open Watcom. Just pull some of
242
+ * these duplicated definitions from Open Watcom's stdint.h file for now.
243
+ */
244
+
245
+ # if defined (__WATCOMC__) && __WATCOMC__ >= 1250
246
+ # if !defined (INT64_C)
247
+ # define INT64_C(x) (x + (INT64_MAX - INT64_MAX))
248
+ # endif
249
+ # if !defined (UINT64_C)
250
+ # define UINT64_C(x) (x + (UINT64_MAX - UINT64_MAX))
251
+ # endif
252
+ # if !defined (INT32_C)
253
+ # define INT32_C(x) (x + (INT32_MAX - INT32_MAX))
254
+ # endif
255
+ # if !defined (UINT32_C)
256
+ # define UINT32_C(x) (x + (UINT32_MAX - UINT32_MAX))
257
+ # endif
258
+ # if !defined (INT16_C)
259
+ # define INT16_C(x) (x)
260
+ # endif
261
+ # if !defined (UINT16_C)
262
+ # define UINT16_C(x) (x)
263
+ # endif
264
+ # if !defined (INT8_C)
265
+ # define INT8_C(x) (x)
266
+ # endif
267
+ # if !defined (UINT8_C)
268
+ # define UINT8_C(x) (x)
269
+ # endif
270
+ # if !defined (UINT64_MAX)
271
+ # define UINT64_MAX 18446744073709551615ULL
272
+ # endif
273
+ # if !defined (INT64_MAX)
274
+ # define INT64_MAX 9223372036854775807LL
275
+ # endif
276
+ # if !defined (UINT32_MAX)
277
+ # define UINT32_MAX 4294967295UL
278
+ # endif
279
+ # if !defined (INT32_MAX)
280
+ # define INT32_MAX 2147483647L
281
+ # endif
282
+ # if !defined (INTMAX_MAX)
283
+ # define INTMAX_MAX INT64_MAX
284
+ # endif
285
+ # if !defined (INTMAX_MIN)
286
+ # define INTMAX_MIN INT64_MIN
287
+ # endif
288
+ # endif
289
+ #endif
290
+
291
+ #ifndef _PSTDINT_H_INCLUDED
292
+ #define _PSTDINT_H_INCLUDED
293
+
294
+ #ifndef SIZE_MAX
295
+ # define SIZE_MAX (~(size_t)0)
296
+ #endif
297
+
298
+ /*
299
+ * Deduce the type assignments from limits.h under the assumption that
300
+ * integer sizes in bits are powers of 2, and follow the ANSI
301
+ * definitions.
302
+ */
303
+
304
+ #ifndef UINT8_MAX
305
+ # define UINT8_MAX 0xff
306
+ #endif
307
+ #ifndef uint8_t
308
+ # if (UCHAR_MAX == UINT8_MAX) || defined (S_SPLINT_S)
309
+ typedef unsigned char uint8_t;
310
+ # define UINT8_C(v) ((uint8_t) v)
311
+ # else
312
+ # error "Platform not supported"
313
+ # endif
314
+ #endif
315
+
316
+ #ifndef INT8_MAX
317
+ # define INT8_MAX 0x7f
318
+ #endif
319
+ #ifndef INT8_MIN
320
+ # define INT8_MIN INT8_C(0x80)
321
+ #endif
322
+ #ifndef int8_t
323
+ # if (SCHAR_MAX == INT8_MAX) || defined (S_SPLINT_S)
324
+ typedef signed char int8_t;
325
+ # define INT8_C(v) ((int8_t) v)
326
+ # else
327
+ # error "Platform not supported"
328
+ # endif
329
+ #endif
330
+
331
+ #ifndef UINT16_MAX
332
+ # define UINT16_MAX 0xffff
333
+ #endif
334
+ #ifndef uint16_t
335
+ #if (UINT_MAX == UINT16_MAX) || defined (S_SPLINT_S)
336
+ typedef unsigned int uint16_t;
337
+ # ifndef PRINTF_INT16_MODIFIER
338
+ # define PRINTF_INT16_MODIFIER ""
339
+ # endif
340
+ # define UINT16_C(v) ((uint16_t) (v))
341
+ #elif (USHRT_MAX == UINT16_MAX)
342
+ typedef unsigned short uint16_t;
343
+ # define UINT16_C(v) ((uint16_t) (v))
344
+ # ifndef PRINTF_INT16_MODIFIER
345
+ # define PRINTF_INT16_MODIFIER "h"
346
+ # endif
347
+ #else
348
+ #error "Platform not supported"
349
+ #endif
350
+ #endif
351
+
352
+ #ifndef INT16_MAX
353
+ # define INT16_MAX 0x7fff
354
+ #endif
355
+ #ifndef INT16_MIN
356
+ # define INT16_MIN INT16_C(0x8000)
357
+ #endif
358
+ #ifndef int16_t
359
+ #if (INT_MAX == INT16_MAX) || defined (S_SPLINT_S)
360
+ typedef signed int int16_t;
361
+ # define INT16_C(v) ((int16_t) (v))
362
+ # ifndef PRINTF_INT16_MODIFIER
363
+ # define PRINTF_INT16_MODIFIER ""
364
+ # endif
365
+ #elif (SHRT_MAX == INT16_MAX)
366
+ typedef signed short int16_t;
367
+ # define INT16_C(v) ((int16_t) (v))
368
+ # ifndef PRINTF_INT16_MODIFIER
369
+ # define PRINTF_INT16_MODIFIER "h"
370
+ # endif
371
+ #else
372
+ #error "Platform not supported"
373
+ #endif
374
+ #endif
375
+
376
+ #ifndef UINT32_MAX
377
+ # define UINT32_MAX (0xffffffffUL)
378
+ #endif
379
+ #ifndef uint32_t
380
+ #if (ULONG_MAX == UINT32_MAX) || defined (S_SPLINT_S)
381
+ typedef unsigned long uint32_t;
382
+ # define UINT32_C(v) v ## UL
383
+ # ifndef PRINTF_INT32_MODIFIER
384
+ # define PRINTF_INT32_MODIFIER "l"
385
+ # endif
386
+ #elif (UINT_MAX == UINT32_MAX)
387
+ typedef unsigned int uint32_t;
388
+ # ifndef PRINTF_INT32_MODIFIER
389
+ # define PRINTF_INT32_MODIFIER ""
390
+ # endif
391
+ # define UINT32_C(v) v ## U
392
+ #elif (USHRT_MAX == UINT32_MAX)
393
+ typedef unsigned short uint32_t;
394
+ # define UINT32_C(v) ((unsigned short) (v))
395
+ # ifndef PRINTF_INT32_MODIFIER
396
+ # define PRINTF_INT32_MODIFIER ""
397
+ # endif
398
+ #else
399
+ #error "Platform not supported"
400
+ #endif
401
+ #endif
402
+
403
+ #ifndef INT32_MAX
404
+ # define INT32_MAX (0x7fffffffL)
405
+ #endif
406
+ #ifndef INT32_MIN
407
+ # define INT32_MIN INT32_C(0x80000000)
408
+ #endif
409
+ #ifndef int32_t
410
+ #if (LONG_MAX == INT32_MAX) || defined (S_SPLINT_S)
411
+ typedef signed long int32_t;
412
+ # define INT32_C(v) v ## L
413
+ # ifndef PRINTF_INT32_MODIFIER
414
+ # define PRINTF_INT32_MODIFIER "l"
415
+ # endif
416
+ #elif (INT_MAX == INT32_MAX)
417
+ typedef signed int int32_t;
418
+ # define INT32_C(v) v
419
+ # ifndef PRINTF_INT32_MODIFIER
420
+ # define PRINTF_INT32_MODIFIER ""
421
+ # endif
422
+ #elif (SHRT_MAX == INT32_MAX)
423
+ typedef signed short int32_t;
424
+ # define INT32_C(v) ((short) (v))
425
+ # ifndef PRINTF_INT32_MODIFIER
426
+ # define PRINTF_INT32_MODIFIER ""
427
+ # endif
428
+ #else
429
+ #error "Platform not supported"
430
+ #endif
431
+ #endif
432
+
433
+ /*
434
+ * The macro stdint_int64_defined is temporarily used to record
435
+ * whether or not 64 integer support is available. It must be
436
+ * defined for any 64 integer extensions for new platforms that are
437
+ * added.
438
+ */
439
+
440
+ #undef stdint_int64_defined
441
+ #if (defined(__STDC__) && defined(__STDC_VERSION__)) || defined (S_SPLINT_S)
442
+ # if (__STDC__ && __STDC_VERSION__ >= 199901L) || defined (S_SPLINT_S)
443
+ # define stdint_int64_defined
444
+ typedef long long int64_t;
445
+ typedef unsigned long long uint64_t;
446
+ # define UINT64_C(v) v ## ULL
447
+ # define INT64_C(v) v ## LL
448
+ # ifndef PRINTF_INT64_MODIFIER
449
+ # define PRINTF_INT64_MODIFIER "ll"
450
+ # endif
451
+ # endif
452
+ #endif
453
+
454
+ #if !defined (stdint_int64_defined)
455
+ # if defined(__GNUC__)
456
+ # define stdint_int64_defined
457
+ __extension__ typedef long long int64_t;
458
+ __extension__ typedef unsigned long long uint64_t;
459
+ # define UINT64_C(v) v ## ULL
460
+ # define INT64_C(v) v ## LL
461
+ # ifndef PRINTF_INT64_MODIFIER
462
+ # define PRINTF_INT64_MODIFIER "ll"
463
+ # endif
464
+ # elif defined(__MWERKS__) || defined (__SUNPRO_C) || defined (__SUNPRO_CC) || defined (__APPLE_CC__) || defined (_LONG_LONG) || defined (_CRAYC) || defined (S_SPLINT_S)
465
+ # define stdint_int64_defined
466
+ typedef long long int64_t;
467
+ typedef unsigned long long uint64_t;
468
+ # define UINT64_C(v) v ## ULL
469
+ # define INT64_C(v) v ## LL
470
+ # ifndef PRINTF_INT64_MODIFIER
471
+ # define PRINTF_INT64_MODIFIER "ll"
472
+ # endif
473
+ # elif (defined(__WATCOMC__) && defined(__WATCOM_INT64__)) || (defined(_MSC_VER) && _INTEGRAL_MAX_BITS >= 64) || (defined (__BORLANDC__) && __BORLANDC__ > 0x460) || defined (__alpha) || defined (__DECC)
474
+ # define stdint_int64_defined
475
+ typedef __int64 int64_t;
476
+ typedef unsigned __int64 uint64_t;
477
+ # define UINT64_C(v) v ## UI64
478
+ # define INT64_C(v) v ## I64
479
+ # ifndef PRINTF_INT64_MODIFIER
480
+ # define PRINTF_INT64_MODIFIER "I64"
481
+ # endif
482
+ # endif
483
+ #endif
484
+
485
+ #if !defined (LONG_LONG_MAX) && defined (INT64_C)
486
+ # define LONG_LONG_MAX INT64_C (9223372036854775807)
487
+ #endif
488
+ #ifndef ULONG_LONG_MAX
489
+ # define ULONG_LONG_MAX UINT64_C (18446744073709551615)
490
+ #endif
491
+
492
+ #if !defined (INT64_MAX) && defined (INT64_C)
493
+ # define INT64_MAX INT64_C (9223372036854775807)
494
+ #endif
495
+ #if !defined (INT64_MIN) && defined (INT64_C)
496
+ # define INT64_MIN INT64_C (-9223372036854775808)
497
+ #endif
498
+ #if !defined (UINT64_MAX) && defined (INT64_C)
499
+ # define UINT64_MAX UINT64_C (18446744073709551615)
500
+ #endif
501
+
502
+ /*
503
+ * Width of hexadecimal for number field.
504
+ */
505
+
506
+ #ifndef PRINTF_INT64_HEX_WIDTH
507
+ # define PRINTF_INT64_HEX_WIDTH "16"
508
+ #endif
509
+ #ifndef PRINTF_INT32_HEX_WIDTH
510
+ # define PRINTF_INT32_HEX_WIDTH "8"
511
+ #endif
512
+ #ifndef PRINTF_INT16_HEX_WIDTH
513
+ # define PRINTF_INT16_HEX_WIDTH "4"
514
+ #endif
515
+ #ifndef PRINTF_INT8_HEX_WIDTH
516
+ # define PRINTF_INT8_HEX_WIDTH "2"
517
+ #endif
518
+
519
+ #ifndef PRINTF_INT64_DEC_WIDTH
520
+ # define PRINTF_INT64_DEC_WIDTH "20"
521
+ #endif
522
+ #ifndef PRINTF_INT32_DEC_WIDTH
523
+ # define PRINTF_INT32_DEC_WIDTH "10"
524
+ #endif
525
+ #ifndef PRINTF_INT16_DEC_WIDTH
526
+ # define PRINTF_INT16_DEC_WIDTH "5"
527
+ #endif
528
+ #ifndef PRINTF_INT8_DEC_WIDTH
529
+ # define PRINTF_INT8_DEC_WIDTH "3"
530
+ #endif
531
+
532
+ /*
533
+ * Ok, lets not worry about 128 bit integers for now. Moore's law says
534
+ * we don't need to worry about that until about 2040 at which point
535
+ * we'll have bigger things to worry about.
536
+ */
537
+
538
+ #ifdef stdint_int64_defined
539
+ typedef int64_t intmax_t;
540
+ typedef uint64_t uintmax_t;
541
+ # define INTMAX_MAX INT64_MAX
542
+ # define INTMAX_MIN INT64_MIN
543
+ # define UINTMAX_MAX UINT64_MAX
544
+ # define UINTMAX_C(v) UINT64_C(v)
545
+ # define INTMAX_C(v) INT64_C(v)
546
+ # ifndef PRINTF_INTMAX_MODIFIER
547
+ # define PRINTF_INTMAX_MODIFIER PRINTF_INT64_MODIFIER
548
+ # endif
549
+ # ifndef PRINTF_INTMAX_HEX_WIDTH
550
+ # define PRINTF_INTMAX_HEX_WIDTH PRINTF_INT64_HEX_WIDTH
551
+ # endif
552
+ # ifndef PRINTF_INTMAX_DEC_WIDTH
553
+ # define PRINTF_INTMAX_DEC_WIDTH PRINTF_INT64_DEC_WIDTH
554
+ # endif
555
+ #else
556
+ typedef int32_t intmax_t;
557
+ typedef uint32_t uintmax_t;
558
+ # define INTMAX_MAX INT32_MAX
559
+ # define UINTMAX_MAX UINT32_MAX
560
+ # define UINTMAX_C(v) UINT32_C(v)
561
+ # define INTMAX_C(v) INT32_C(v)
562
+ # ifndef PRINTF_INTMAX_MODIFIER
563
+ # define PRINTF_INTMAX_MODIFIER PRINTF_INT32_MODIFIER
564
+ # endif
565
+ # ifndef PRINTF_INTMAX_HEX_WIDTH
566
+ # define PRINTF_INTMAX_HEX_WIDTH PRINTF_INT32_HEX_WIDTH
567
+ # endif
568
+ # ifndef PRINTF_INTMAX_DEC_WIDTH
569
+ # define PRINTF_INTMAX_DEC_WIDTH PRINTF_INT32_DEC_WIDTH
570
+ # endif
571
+ #endif
572
+
573
+ /*
574
+ * Because this file currently only supports platforms which have
575
+ * precise powers of 2 as bit sizes for the default integers, the
576
+ * least definitions are all trivial. Its possible that a future
577
+ * version of this file could have different definitions.
578
+ */
579
+
580
+ #ifndef stdint_least_defined
581
+ typedef int8_t int_least8_t;
582
+ typedef uint8_t uint_least8_t;
583
+ typedef int16_t int_least16_t;
584
+ typedef uint16_t uint_least16_t;
585
+ typedef int32_t int_least32_t;
586
+ typedef uint32_t uint_least32_t;
587
+ # define PRINTF_LEAST32_MODIFIER PRINTF_INT32_MODIFIER
588
+ # define PRINTF_LEAST16_MODIFIER PRINTF_INT16_MODIFIER
589
+ # define UINT_LEAST8_MAX UINT8_MAX
590
+ # define INT_LEAST8_MAX INT8_MAX
591
+ # define UINT_LEAST16_MAX UINT16_MAX
592
+ # define INT_LEAST16_MAX INT16_MAX
593
+ # define UINT_LEAST32_MAX UINT32_MAX
594
+ # define INT_LEAST32_MAX INT32_MAX
595
+ # define INT_LEAST8_MIN INT8_MIN
596
+ # define INT_LEAST16_MIN INT16_MIN
597
+ # define INT_LEAST32_MIN INT32_MIN
598
+ # ifdef stdint_int64_defined
599
+ typedef int64_t int_least64_t;
600
+ typedef uint64_t uint_least64_t;
601
+ # define PRINTF_LEAST64_MODIFIER PRINTF_INT64_MODIFIER
602
+ # define UINT_LEAST64_MAX UINT64_MAX
603
+ # define INT_LEAST64_MAX INT64_MAX
604
+ # define INT_LEAST64_MIN INT64_MIN
605
+ # endif
606
+ #endif
607
+ #undef stdint_least_defined
608
+
609
+ /*
610
+ * The ANSI C committee pretending to know or specify anything about
611
+ * performance is the epitome of misguided arrogance. The mandate of
612
+ * this file is to *ONLY* ever support that absolute minimum
613
+ * definition of the fast integer types, for compatibility purposes.
614
+ * No extensions, and no attempt to suggest what may or may not be a
615
+ * faster integer type will ever be made in this file. Developers are
616
+ * warned to stay away from these types when using this or any other
617
+ * stdint.h.
618
+ */
619
+
620
+ typedef int_least8_t int_fast8_t;
621
+ typedef uint_least8_t uint_fast8_t;
622
+ typedef int_least16_t int_fast16_t;
623
+ typedef uint_least16_t uint_fast16_t;
624
+ typedef int_least32_t int_fast32_t;
625
+ typedef uint_least32_t uint_fast32_t;
626
+ #define UINT_FAST8_MAX UINT_LEAST8_MAX
627
+ #define INT_FAST8_MAX INT_LEAST8_MAX
628
+ #define UINT_FAST16_MAX UINT_LEAST16_MAX
629
+ #define INT_FAST16_MAX INT_LEAST16_MAX
630
+ #define UINT_FAST32_MAX UINT_LEAST32_MAX
631
+ #define INT_FAST32_MAX INT_LEAST32_MAX
632
+ #define INT_FAST8_MIN INT_LEAST8_MIN
633
+ #define INT_FAST16_MIN INT_LEAST16_MIN
634
+ #define INT_FAST32_MIN INT_LEAST32_MIN
635
+ #ifdef stdint_int64_defined
636
+ typedef int_least64_t int_fast64_t;
637
+ typedef uint_least64_t uint_fast64_t;
638
+ # define UINT_FAST64_MAX UINT_LEAST64_MAX
639
+ # define INT_FAST64_MAX INT_LEAST64_MAX
640
+ # define INT_FAST64_MIN INT_LEAST64_MIN
641
+ #endif
642
+
643
+ #undef stdint_int64_defined
644
+
645
+ /*
646
+ * Whatever piecemeal, per compiler thing we can do about the wchar_t
647
+ * type limits.
648
+ */
649
+
650
+ #if defined(__WATCOMC__) || defined(_MSC_VER) || defined (__GNUC__)
651
+ # include <wchar.h>
652
+ # ifndef WCHAR_MIN
653
+ # define WCHAR_MIN 0
654
+ # endif
655
+ # ifndef WCHAR_MAX
656
+ # define WCHAR_MAX ((wchar_t)-1)
657
+ # endif
658
+ #endif
659
+
660
+ /*
661
+ * Whatever piecemeal, per compiler/platform thing we can do about the
662
+ * (u)intptr_t types and limits.
663
+ */
664
+
665
+ #if defined (_MSC_VER) && defined (_UINTPTR_T_DEFINED)
666
+ # define STDINT_H_UINTPTR_T_DEFINED
667
+ #endif
668
+
669
+ #ifndef STDINT_H_UINTPTR_T_DEFINED
670
+ # if defined (__alpha__) || defined (__ia64__) || defined (__x86_64__) || defined (_WIN64)
671
+ # define stdint_intptr_bits 64
672
+ # elif defined (__WATCOMC__) || defined (__TURBOC__)
673
+ # if defined(__TINY__) || defined(__SMALL__) || defined(__MEDIUM__)
674
+ # define stdint_intptr_bits 16
675
+ # else
676
+ # define stdint_intptr_bits 32
677
+ # endif
678
+ # elif defined (__i386__) || defined (_WIN32) || defined (WIN32)
679
+ # define stdint_intptr_bits 32
680
+ # elif defined (__INTEL_COMPILER)
681
+ /* TODO -- what did Intel do about x86-64? */
682
+ # endif
683
+
684
+ # ifdef stdint_intptr_bits
685
+ # define stdint_intptr_glue3_i(a,b,c) a##b##c
686
+ # define stdint_intptr_glue3(a,b,c) stdint_intptr_glue3_i(a,b,c)
687
+ # ifndef PRINTF_INTPTR_MODIFIER
688
+ # define PRINTF_INTPTR_MODIFIER stdint_intptr_glue3(PRINTF_INT,stdint_intptr_bits,_MODIFIER)
689
+ # endif
690
+ # ifndef PTRDIFF_MAX
691
+ # define PTRDIFF_MAX stdint_intptr_glue3(INT,stdint_intptr_bits,_MAX)
692
+ # endif
693
+ # ifndef PTRDIFF_MIN
694
+ # define PTRDIFF_MIN stdint_intptr_glue3(INT,stdint_intptr_bits,_MIN)
695
+ # endif
696
+ # ifndef UINTPTR_MAX
697
+ # define UINTPTR_MAX stdint_intptr_glue3(UINT,stdint_intptr_bits,_MAX)
698
+ # endif
699
+ # ifndef INTPTR_MAX
700
+ # define INTPTR_MAX stdint_intptr_glue3(INT,stdint_intptr_bits,_MAX)
701
+ # endif
702
+ # ifndef INTPTR_MIN
703
+ # define INTPTR_MIN stdint_intptr_glue3(INT,stdint_intptr_bits,_MIN)
704
+ # endif
705
+ # ifndef INTPTR_C
706
+ # define INTPTR_C(x) stdint_intptr_glue3(INT,stdint_intptr_bits,_C)(x)
707
+ # endif
708
+ # ifndef UINTPTR_C
709
+ # define UINTPTR_C(x) stdint_intptr_glue3(UINT,stdint_intptr_bits,_C)(x)
710
+ # endif
711
+ typedef stdint_intptr_glue3(uint,stdint_intptr_bits,_t) uintptr_t;
712
+ typedef stdint_intptr_glue3( int,stdint_intptr_bits,_t) intptr_t;
713
+ # else
714
+ /* TODO -- This following is likely wrong for some platforms, and does
715
+ nothing for the definition of uintptr_t. */
716
+ typedef ptrdiff_t intptr_t;
717
+ # endif
718
+ # define STDINT_H_UINTPTR_T_DEFINED
719
+ #endif
720
+
721
+ /*
722
+ * Assumes sig_atomic_t is signed and we have a 2s complement machine.
723
+ */
724
+
725
+ #ifndef SIG_ATOMIC_MAX
726
+ # define SIG_ATOMIC_MAX ((((sig_atomic_t) 1) << (sizeof (sig_atomic_t)*CHAR_BIT-1)) - 1)
727
+ #endif
728
+
729
+ #endif
730
+
731
+ #if defined (__TEST_PSTDINT_FOR_CORRECTNESS)
732
+
733
+ /*
734
+ * Please compile with the maximum warning settings to make sure macros are not
735
+ * defined more than once.
736
+ */
737
+
738
+ #include <stdlib.h>
739
+ #include <stdio.h>
740
+ #include <string.h>
741
+
742
+ #define glue3_aux(x,y,z) x ## y ## z
743
+ #define glue3(x,y,z) glue3_aux(x,y,z)
744
+
745
+ #define DECLU(bits) glue3(uint,bits,_t) glue3(u,bits,=) glue3(UINT,bits,_C) (0);
746
+ #define DECLI(bits) glue3(int,bits,_t) glue3(i,bits,=) glue3(INT,bits,_C) (0);
747
+
748
+ #define DECL(us,bits) glue3(DECL,us,) (bits)
749
+
750
+ #define TESTUMAX(bits) glue3(u,bits,=) glue3(~,u,bits); if (glue3(UINT,bits,_MAX) glue3(!=,u,bits)) printf ("Something wrong with UINT%d_MAX\n", bits)
751
+
752
+ int main () {
753
+ DECL(I,8)
754
+ DECL(U,8)
755
+ DECL(I,16)
756
+ DECL(U,16)
757
+ DECL(I,32)
758
+ DECL(U,32)
759
+ #ifdef INT64_MAX
760
+ DECL(I,64)
761
+ DECL(U,64)
762
+ #endif
763
+ intmax_t imax = INTMAX_C(0);
764
+ uintmax_t umax = UINTMAX_C(0);
765
+ char str0[256], str1[256];
766
+
767
+ sprintf (str0, "%d %x\n", 0, ~0);
768
+
769
+ sprintf (str1, "%d %x\n", i8, ~0);
770
+ if (0 != strcmp (str0, str1)) printf ("Something wrong with i8 : %s\n", str1);
771
+ sprintf (str1, "%u %x\n", u8, ~0);
772
+ if (0 != strcmp (str0, str1)) printf ("Something wrong with u8 : %s\n", str1);
773
+ sprintf (str1, "%d %x\n", i16, ~0);
774
+ if (0 != strcmp (str0, str1)) printf ("Something wrong with i16 : %s\n", str1);
775
+ sprintf (str1, "%u %x\n", u16, ~0);
776
+ if (0 != strcmp (str0, str1)) printf ("Something wrong with u16 : %s\n", str1);
777
+ sprintf (str1, "%" PRINTF_INT32_MODIFIER "d %x\n", i32, ~0);
778
+ if (0 != strcmp (str0, str1)) printf ("Something wrong with i32 : %s\n", str1);
779
+ sprintf (str1, "%" PRINTF_INT32_MODIFIER "u %x\n", u32, ~0);
780
+ if (0 != strcmp (str0, str1)) printf ("Something wrong with u32 : %s\n", str1);
781
+ #ifdef INT64_MAX
782
+ sprintf (str1, "%" PRINTF_INT64_MODIFIER "d %x\n", i64, ~0);
783
+ if (0 != strcmp (str0, str1)) printf ("Something wrong with i64 : %s\n", str1);
784
+ #endif
785
+ sprintf (str1, "%" PRINTF_INTMAX_MODIFIER "d %x\n", imax, ~0);
786
+ if (0 != strcmp (str0, str1)) printf ("Something wrong with imax : %s\n", str1);
787
+ sprintf (str1, "%" PRINTF_INTMAX_MODIFIER "u %x\n", umax, ~0);
788
+ if (0 != strcmp (str0, str1)) printf ("Something wrong with umax : %s\n", str1);
789
+
790
+ TESTUMAX(8);
791
+ TESTUMAX(16);
792
+ TESTUMAX(32);
793
+ #ifdef INT64_MAX
794
+ TESTUMAX(64);
795
+ #endif
796
+
797
+ return EXIT_SUCCESS;
798
+ }
799
+
800
+ #endif