1 /*-------------------------------------------------------------------------
4 * Functions for the built-in integer types.
6 * Copyright (c) 1994, Regents of the University of California
10 * $Header: /cvsroot/pgsql/src/backend/utils/adt/int.c,v 1.16 1998/09/01 03:26:03 momjian Exp $
12 *-------------------------------------------------------------------------
17 * int2in, int2out, int28in, int28out, int4in, int4out
18 * Conversion routines:
19 * itoi, int2_text, int4_text
21 * inteq, intne, intlt, intle, intgt, intge
22 * Arithmetic operators:
23 * intpl, intmi, int4mul, intdiv
25 * Arithmetic operators:
28 * XXX makes massive and possibly unwarranted type promotion assumptions.
29 * fix me when we figure out what we want to do about ANSIfication...
39 #include "utils/builtins.h" /* where the declarations go */
42 #define SHRT_MAX (0x7FFF)
45 #define SHRT_MIN (-0x8000)
48 /*****************************************************************************
50 *****************************************************************************/
53 * int2in - converts "num" to short
58 return (int32) pg_atoi(num, sizeof(int16), '\0');
62 * int2out - converts short to "num"
69 result = (char *) palloc(7);/* assumes sign, 5 digits, '\0' */
70 itoa((int) sh, result);
75 * int28in - converts "num num ..." to internal form
78 * Fills any nonexistent digits with NULLs.
88 result = (int16 **) palloc(sizeof(int16[8]));
89 if ((nums = sscanf(shs, "%hd%hd%hd%hd%hd%hd%hd%hd",
100 (*result)[nums++] = 0;
103 return (int16 *) result;
107 * int28out - converts internal form to "num num ..."
110 int28out(int16 **shs)
119 result = (char *) palloc(2);
124 rp = result = (char *) palloc(8 * 7); /* assumes sign, 5 digits,
127 for (num = 8; num != 0; num--)
130 while (*++rp != '\0')
139 * int28in - converts "num num ..." to internal form
142 * Fills any nonexistent digits with NULLs.
145 int44in(char *input_string)
147 int32 *foo = (int32 *) palloc(4 * sizeof(int32));
150 i = sscanf(input_string,
163 * int28out - converts internal form to "num num ..."
166 int44out(int32 *an_array)
169 char *output_string = NULL;
176 output_string = (char *) palloc(16 * temp); /* assume 15 digits +
178 walk = output_string;
179 for (i = 0; i < temp; i++)
181 itoa(an_array[i], walk);
182 while (*++walk != '\0')
188 return output_string;
192 /*****************************************************************************
194 *****************************************************************************/
197 * int4in - converts "num" to int4
202 return pg_atoi(num, sizeof(int32), '\0');
206 * int4out - converts int4 to "num"
213 result = (char *) palloc(12); /* assumes sign, 10 digits, '\0' */
220 * ===================
221 * CONVERSION ROUTINES
222 * ===================
235 elog(ERROR, "i4toi2: '%d' causes int2 underflow", arg1);
237 elog(ERROR, "i4toi2: '%d' causes int2 overflow", arg1);
243 int2_text(int16 arg1)
251 len = (strlen(str) + VARHDRSZ);
253 result = palloc(len);
255 VARSIZE(result) = len;
256 memmove(VARDATA(result), str, (len - VARHDRSZ));
264 text_int2(text *string)
271 len = (VARSIZE(string) - VARHDRSZ);
273 str = palloc(len + 1);
274 memmove(str, VARDATA(string), len);
277 result = int2in(str);
284 int4_text(int32 arg1)
292 len = (strlen(str) + VARHDRSZ);
294 result = palloc(len);
296 VARSIZE(result) = len;
297 memmove(VARDATA(result), str, (len - VARHDRSZ));
305 text_int4(text *string)
312 len = (VARSIZE(string) - VARHDRSZ);
314 str = palloc(len + 1);
315 memmove(str, VARDATA(string), len);
318 result = int4in(str);
326 * =========================
327 * BOOLEAN OPERATOR ROUTINES
328 * =========================
332 * inteq - returns 1 iff arg1 == arg2
333 * intne - returns 1 iff arg1 != arg2
334 * intlt - returns 1 iff arg1 < arg2
335 * intle - returns 1 iff arg1 <= arg2
336 * intgt - returns 1 iff arg1 > arg2
337 * intge - returns 1 iff arg1 >= arg2
340 int4eq(int32 arg1, int32 arg2)
346 int4ne(int32 arg1, int32 arg2)
352 int4lt(int32 arg1, int32 arg2)
358 int4le(int32 arg1, int32 arg2)
364 int4gt(int32 arg1, int32 arg2)
370 int4ge(int32 arg1, int32 arg2)
376 int2eq(int16 arg1, int16 arg2)
382 int2ne(int16 arg1, int16 arg2)
388 int2lt(int16 arg1, int16 arg2)
394 int2le(int16 arg1, int16 arg2)
400 int2gt(int16 arg1, int16 arg2)
406 int2ge(int16 arg1, int16 arg2)
412 int24eq(int32 arg1, int32 arg2)
418 int24ne(int32 arg1, int32 arg2)
424 int24lt(int32 arg1, int32 arg2)
430 int24le(int32 arg1, int32 arg2)
436 int24gt(int32 arg1, int32 arg2)
442 int24ge(int32 arg1, int32 arg2)
448 int42eq(int32 arg1, int32 arg2)
454 int42ne(int32 arg1, int32 arg2)
460 int42lt(int32 arg1, int32 arg2)
466 int42le(int32 arg1, int32 arg2)
472 int42gt(int32 arg1, int32 arg2)
478 int42ge(int32 arg1, int32 arg2)
485 keyfirsteq(int16 *arg1, int16 arg2)
487 return *arg1 == arg2;
491 * int[24]pl - returns arg1 + arg2
492 * int[24]mi - returns arg1 - arg2
493 * int[24]mul - returns arg1 * arg2
494 * int[24]div - returns arg1 / arg2
503 int4pl(int32 arg1, int32 arg2)
509 int4mi(int32 arg1, int32 arg2)
515 int4mul(int32 arg1, int32 arg2)
521 int4div(int32 arg1, int32 arg2)
529 return arg + (int32) 1;
539 int2pl(int16 arg1, int16 arg2)
545 int2mi(int16 arg1, int16 arg2)
551 int2mul(int16 arg1, int16 arg2)
557 int2div(int16 arg1, int16 arg2)
565 return arg + (int16) 1;
569 int24pl(int32 arg1, int32 arg2)
575 int24mi(int32 arg1, int32 arg2)
581 int24mul(int32 arg1, int32 arg2)
587 int24div(int32 arg1, int32 arg2)
593 int42pl(int32 arg1, int32 arg2)
599 int42mi(int32 arg1, int32 arg2)
605 int42mul(int32 arg1, int32 arg2)
611 int42div(int32 arg1, int32 arg2)
617 * int[24]mod - returns arg1 mod arg2
620 int4mod(int32 arg1, int32 arg2)
626 int2mod(int16 arg1, int16 arg2)
632 int24mod(int32 arg1, int32 arg2)
638 int42mod(int32 arg1, int32 arg2)
644 * int[24]fac - returns arg1!
654 for (result = 1; arg1 > 0; --arg1)
667 for (result = 1; arg1 > 0; --arg1)
673 int2larger(int16 arg1, int16 arg2)
675 return (arg1 > arg2) ? arg1 : arg2;
679 int2smaller(int16 arg1, int16 arg2)
681 return (arg1 < arg2) ? arg1 : arg2;
685 int4larger(int32 arg1, int32 arg2)
687 return (arg1 > arg2) ? arg1 : arg2;
691 int4smaller(int32 arg1, int32 arg2)
693 return (arg1 < arg2) ? arg1 : arg2;