1*61046927SAndroid Build Coastguard Worker /*
2*61046927SAndroid Build Coastguard Worker * Copyright © 2010-2011 Marcin Kościelnicki <[email protected]>
3*61046927SAndroid Build Coastguard Worker * Copyright © 2010 Francisco Jerez <[email protected]>
4*61046927SAndroid Build Coastguard Worker * All Rights Reserved.
5*61046927SAndroid Build Coastguard Worker * SPDX-License-Identifier: MIT
6*61046927SAndroid Build Coastguard Worker */
7*61046927SAndroid Build Coastguard Worker
8*61046927SAndroid Build Coastguard Worker #ifndef UTIL_H
9*61046927SAndroid Build Coastguard Worker #define UTIL_H
10*61046927SAndroid Build Coastguard Worker
11*61046927SAndroid Build Coastguard Worker #include <stdlib.h>
12*61046927SAndroid Build Coastguard Worker #include <stdio.h>
13*61046927SAndroid Build Coastguard Worker #include <inttypes.h>
14*61046927SAndroid Build Coastguard Worker
15*61046927SAndroid Build Coastguard Worker #define ADDARRAY(a, e) \
16*61046927SAndroid Build Coastguard Worker do { \
17*61046927SAndroid Build Coastguard Worker if ((a ## num) >= (a ## max)) { \
18*61046927SAndroid Build Coastguard Worker if (!(a ## max)) \
19*61046927SAndroid Build Coastguard Worker (a ## max) = 16; \
20*61046927SAndroid Build Coastguard Worker else \
21*61046927SAndroid Build Coastguard Worker (a ## max) *= 2; \
22*61046927SAndroid Build Coastguard Worker (a) = realloc((a), (a ## max)*sizeof(*(a))); \
23*61046927SAndroid Build Coastguard Worker } \
24*61046927SAndroid Build Coastguard Worker (a)[(a ## num)++] = (e); \
25*61046927SAndroid Build Coastguard Worker } while(0)
26*61046927SAndroid Build Coastguard Worker
27*61046927SAndroid Build Coastguard Worker #define FINDARRAY(a, tmp, pred) \
28*61046927SAndroid Build Coastguard Worker ({ \
29*61046927SAndroid Build Coastguard Worker int __i; \
30*61046927SAndroid Build Coastguard Worker \
31*61046927SAndroid Build Coastguard Worker for (__i = 0; __i < (a ## num); __i++) { \
32*61046927SAndroid Build Coastguard Worker tmp = (a)[__i]; \
33*61046927SAndroid Build Coastguard Worker if (pred) \
34*61046927SAndroid Build Coastguard Worker break; \
35*61046927SAndroid Build Coastguard Worker } \
36*61046927SAndroid Build Coastguard Worker \
37*61046927SAndroid Build Coastguard Worker tmp = ((pred) ? tmp : NULL); \
38*61046927SAndroid Build Coastguard Worker })
39*61046927SAndroid Build Coastguard Worker
40*61046927SAndroid Build Coastguard Worker /* ceil(log2(x)) */
clog2(uint64_t x)41*61046927SAndroid Build Coastguard Worker static inline int clog2(uint64_t x) {
42*61046927SAndroid Build Coastguard Worker if (!x)
43*61046927SAndroid Build Coastguard Worker return x;
44*61046927SAndroid Build Coastguard Worker int r = 0;
45*61046927SAndroid Build Coastguard Worker while (x - 1 > (1ull << r) - 1)
46*61046927SAndroid Build Coastguard Worker r++;
47*61046927SAndroid Build Coastguard Worker return r;
48*61046927SAndroid Build Coastguard Worker }
49*61046927SAndroid Build Coastguard Worker
50*61046927SAndroid Build Coastguard Worker #define ARRAY_SIZE(a) (sizeof (a) / sizeof *(a))
51*61046927SAndroid Build Coastguard Worker
52*61046927SAndroid Build Coastguard Worker #define min(a,b) \
53*61046927SAndroid Build Coastguard Worker ({ \
54*61046927SAndroid Build Coastguard Worker typeof (a) _a = (a); \
55*61046927SAndroid Build Coastguard Worker typeof (b) _b = (b); \
56*61046927SAndroid Build Coastguard Worker _a < _b ? _a : _b; \
57*61046927SAndroid Build Coastguard Worker })
58*61046927SAndroid Build Coastguard Worker
59*61046927SAndroid Build Coastguard Worker #define max(a,b) \
60*61046927SAndroid Build Coastguard Worker ({ \
61*61046927SAndroid Build Coastguard Worker typeof (a) _a = (a); \
62*61046927SAndroid Build Coastguard Worker typeof (b) _b = (b); \
63*61046927SAndroid Build Coastguard Worker _a > _b ? _a : _b; \
64*61046927SAndroid Build Coastguard Worker })
65*61046927SAndroid Build Coastguard Worker
66*61046927SAndroid Build Coastguard Worker #define CEILDIV(a, b) (((a) + (b) - 1)/(b))
67*61046927SAndroid Build Coastguard Worker
68*61046927SAndroid Build Coastguard Worker #define extr(a, b, c) ((uint64_t)(a) << (64 - (b) - (c)) >> (64 - (c)))
69*61046927SAndroid Build Coastguard Worker #define extrs(a, b, c) ((int64_t)(a) << (64 - (b) - (c)) >> (64 - (c)))
70*61046927SAndroid Build Coastguard Worker #define sext(a, b) extrs(a, 0, b+1)
71*61046927SAndroid Build Coastguard Worker #define bflmask(a) ((2ull << ((a)-1)) - 1)
72*61046927SAndroid Build Coastguard Worker #define insrt(a, b, c, d) ((a) = ((a) & ~(bflmask(c) << (b))) | ((d) & bflmask(c)) << (b))
73*61046927SAndroid Build Coastguard Worker
74*61046927SAndroid Build Coastguard Worker struct envy_loc {
75*61046927SAndroid Build Coastguard Worker int lstart;
76*61046927SAndroid Build Coastguard Worker int cstart;
77*61046927SAndroid Build Coastguard Worker int lend;
78*61046927SAndroid Build Coastguard Worker int cend;
79*61046927SAndroid Build Coastguard Worker const char *file;
80*61046927SAndroid Build Coastguard Worker };
81*61046927SAndroid Build Coastguard Worker
82*61046927SAndroid Build Coastguard Worker #define LOC_FORMAT(loc, str) "%s:%d.%d-%d.%d: " str, (loc).file, (loc).lstart, (loc).cstart, (loc).lend, (loc).cend
83*61046927SAndroid Build Coastguard Worker
84*61046927SAndroid Build Coastguard Worker uint32_t elf_hash(const char *str);
85*61046927SAndroid Build Coastguard Worker
86*61046927SAndroid Build Coastguard Worker FILE *find_in_path(const char *name, const char *path, char **pfullname);
87*61046927SAndroid Build Coastguard Worker
88*61046927SAndroid Build Coastguard Worker struct astr {
89*61046927SAndroid Build Coastguard Worker char *str;
90*61046927SAndroid Build Coastguard Worker size_t len;
91*61046927SAndroid Build Coastguard Worker };
92*61046927SAndroid Build Coastguard Worker
93*61046927SAndroid Build Coastguard Worker void print_escaped_astr(FILE *out, struct astr *astr);
94*61046927SAndroid Build Coastguard Worker
95*61046927SAndroid Build Coastguard Worker #endif
96