Check nsl library for gethostbyname_r() on all platforms (HP-UX uses it
[PostgreSQL.git] / contrib / intarray / _int_tool.c
blob9351028b1f0f16bf2e8485644c42c5d91f1e6325
1 /*
2 * $PostgreSQL:$
3 */
4 #include "postgres.h"
6 #include "catalog/pg_type.h"
8 #include "_int.h"
11 bool
12 inner_int_contains(ArrayType *a, ArrayType *b)
14 int na,
15 nb;
16 int i,
19 int *da,
20 *db;
22 CHECKARRVALID(a);
23 CHECKARRVALID(b);
25 if (ARRISVOID(a) || ARRISVOID(b))
26 return FALSE;
28 na = ARRNELEMS(a);
29 nb = ARRNELEMS(b);
30 da = ARRPTR(a);
31 db = ARRPTR(b);
33 i = j = n = 0;
34 while (i < na && j < nb)
35 if (da[i] < db[j])
36 i++;
37 else if (da[i] == db[j])
39 n++;
40 i++;
41 j++;
43 else
44 break;
46 return (n == nb) ? TRUE : FALSE;
49 bool
50 inner_int_overlap(ArrayType *a, ArrayType *b)
52 int na,
53 nb;
54 int i,
56 int *da,
57 *db;
59 CHECKARRVALID(a);
60 CHECKARRVALID(b);
62 if (ARRISVOID(a) || ARRISVOID(b))
63 return FALSE;
65 na = ARRNELEMS(a);
66 nb = ARRNELEMS(b);
67 da = ARRPTR(a);
68 db = ARRPTR(b);
70 i = j = 0;
71 while (i < na && j < nb)
72 if (da[i] < db[j])
73 i++;
74 else if (da[i] == db[j])
75 return TRUE;
76 else
77 j++;
79 return FALSE;
82 ArrayType *
83 inner_int_union(ArrayType *a, ArrayType *b)
85 ArrayType *r = NULL;
87 CHECKARRVALID(a);
88 CHECKARRVALID(b);
90 if (ARRISVOID(a) && ARRISVOID(b))
91 return new_intArrayType(0);
92 if (ARRISVOID(a))
93 r = copy_intArrayType(b);
94 if (ARRISVOID(b))
95 r = copy_intArrayType(a);
97 if (!r)
99 int na = ARRNELEMS(a),
100 nb = ARRNELEMS(b);
101 int *da = ARRPTR(a),
102 *db = ARRPTR(b);
103 int i,
105 *dr;
107 r = new_intArrayType(na + nb);
108 dr = ARRPTR(r);
110 /* union */
111 i = j = 0;
112 while (i < na && j < nb)
114 if (da[i] == db[j])
116 *dr++ = da[i++];
117 j++;
119 else if (da[i] < db[j])
120 *dr++ = da[i++];
121 else
122 *dr++ = db[j++];
125 while (i < na)
126 *dr++ = da[i++];
127 while (j < nb)
128 *dr++ = db[j++];
130 r = resize_intArrayType(r, dr - ARRPTR(r));
133 if (ARRNELEMS(r) > 1)
134 r = _int_unique(r);
136 return r;
139 ArrayType *
140 inner_int_inter(ArrayType *a, ArrayType *b)
142 ArrayType *r;
143 int na,
145 int *da,
146 *db,
147 *dr;
148 int i,
151 CHECKARRVALID(a);
152 CHECKARRVALID(b);
154 if (ARRISVOID(a) || ARRISVOID(b))
155 return new_intArrayType(0);
157 na = ARRNELEMS(a);
158 nb = ARRNELEMS(b);
159 da = ARRPTR(a);
160 db = ARRPTR(b);
161 r = new_intArrayType(Min(na, nb));
162 dr = ARRPTR(r);
164 i = j = 0;
165 while (i < na && j < nb)
166 if (da[i] < db[j])
167 i++;
168 else if (da[i] == db[j])
170 if (i + j == 0 || (i + j > 0 && *(dr - 1) != db[j]))
171 *dr++ = db[j];
172 i++;
173 j++;
175 else
176 j++;
178 if ((dr - ARRPTR(r)) == 0)
180 pfree(r);
181 return new_intArrayType(0);
183 else
184 return resize_intArrayType(r, dr - ARRPTR(r));
187 void
188 rt__int_size(ArrayType *a, float *size)
190 *size = (float) ARRNELEMS(a);
192 return;
196 /* len >= 2 */
197 bool
198 isort(int4 *a, int len)
200 int4 tmp,
201 index;
202 int4 *cur,
203 *end;
204 bool r = FALSE;
206 end = a + len;
209 index = 0;
210 cur = a + 1;
211 while (cur < end)
213 if (*(cur - 1) > *cur)
215 tmp = *(cur - 1);
216 *(cur - 1) = *cur;
217 *cur = tmp;
218 index = 1;
220 else if (!r && *(cur - 1) == *cur)
221 r = TRUE;
222 cur++;
224 } while (index);
225 return r;
228 ArrayType *
229 new_intArrayType(int num)
231 ArrayType *r;
232 int nbytes = ARR_OVERHEAD_NONULLS(NDIM) + sizeof(int) * num;
234 r = (ArrayType *) palloc0(nbytes);
236 SET_VARSIZE(r, nbytes);
237 ARR_NDIM(r) = NDIM;
238 r->dataoffset = 0; /* marker for no null bitmap */
239 ARR_ELEMTYPE(r) = INT4OID;
240 *((int *) ARR_DIMS(r)) = num;
241 *((int *) ARR_LBOUND(r)) = 1;
243 return r;
246 ArrayType *
247 resize_intArrayType(ArrayType *a, int num)
249 int nbytes = ARR_OVERHEAD_NONULLS(NDIM) + sizeof(int) * num;
251 if (num == ARRNELEMS(a))
252 return a;
254 a = (ArrayType *) repalloc(a, nbytes);
256 SET_VARSIZE(a, nbytes);
257 *((int *) ARR_DIMS(a)) = num;
258 return a;
261 ArrayType *
262 copy_intArrayType(ArrayType *a)
264 ArrayType *r;
266 r = new_intArrayType(ARRNELEMS(a));
267 memmove(r, a, VARSIZE(r));
268 return r;
271 /* num for compressed key */
273 internal_size(int *a, int len)
275 int i,
276 size = 0;
278 for (i = 0; i < len; i += 2)
279 if (!i || a[i] != a[i - 1]) /* do not count repeated range */
280 size += a[i + 1] - a[i] + 1;
282 return size;
285 /* r is sorted and size of r > 1 */
286 ArrayType *
287 _int_unique(ArrayType *r)
289 int *tmp,
290 *dr,
291 *data;
292 int num = ARRNELEMS(r);
294 CHECKARRVALID(r);
296 if (num < 2)
297 return r;
299 data = tmp = dr = ARRPTR(r);
300 while (tmp - data < num)
301 if (*tmp != *dr)
302 *(++dr) = *tmp++;
303 else
304 tmp++;
305 return resize_intArrayType(r, dr + 1 - ARRPTR(r));
308 void
309 gensign(BITVEC sign, int *a, int len)
311 int i;
313 /* we assume that the sign vector is previously zeroed */
314 for (i = 0; i < len; i++)
316 HASH(sign, *a);
317 a++;
321 int32
322 intarray_match_first(ArrayType *a, int32 elem)
324 int32 *aa,
328 CHECKARRVALID(a);
329 if (ARRISVOID(a))
330 return 0;
331 c = ARRNELEMS(a);
332 aa = ARRPTR(a);
333 for (i = 0; i < c; i++)
334 if (aa[i] == elem)
335 return (i + 1);
336 return 0;
339 ArrayType *
340 intarray_add_elem(ArrayType *a, int32 elem)
342 ArrayType *result;
343 int32 *r;
344 int32 c;
346 CHECKARRVALID(a);
347 c = (ARRISVOID(a)) ? 0 : ARRNELEMS(a);
348 result = new_intArrayType(c + 1);
349 r = ARRPTR(result);
350 if (c > 0)
351 memcpy(r, ARRPTR(a), c * sizeof(int32));
352 r[c] = elem;
353 return result;
356 ArrayType *
357 intarray_concat_arrays(ArrayType *a, ArrayType *b)
359 ArrayType *result;
360 int32 ac = (ARRISVOID(a)) ? 0 : ARRNELEMS(a);
361 int32 bc = (ARRISVOID(b)) ? 0 : ARRNELEMS(b);
363 CHECKARRVALID(a);
364 CHECKARRVALID(b);
365 result = new_intArrayType(ac + bc);
366 if (ac)
367 memcpy(ARRPTR(result), ARRPTR(a), ac * sizeof(int32));
368 if (bc)
369 memcpy(ARRPTR(result) + ac, ARRPTR(b), bc * sizeof(int32));
370 return result;
373 ArrayType *
374 int_to_intset(int32 n)
376 ArrayType *result;
377 int32 *aa;
379 result = new_intArrayType(1);
380 aa = ARRPTR(result);
381 aa[0] = n;
382 return result;
386 compASC(const void *a, const void *b)
388 if (*(int4 *) a == *(int4 *) b)
389 return 0;
390 return (*(int4 *) a > *(int4 *) b) ? 1 : -1;
394 compDESC(const void *a, const void *b)
396 if (*(int4 *) a == *(int4 *) b)
397 return 0;
398 return (*(int4 *) a < *(int4 *) b) ? 1 : -1;