1 /*-------------------------------------------------------------------------
4 * Functions for the built-in type "char".
5 * Functions for the built-in type "cid".
6 * Functions for the built-in type "char2".
7 * Functions for the built-in type "char4".
8 * Functions for the built-in type "char8".
9 * Functions for the built-in type "char16".
11 * Copyright (c) 1994, Regents of the University of California
15 * $Header: /cvsroot/pgsql/src/backend/utils/adt/char.c,v 1.13 1997/10/25 05:12:38 thomas Exp $
17 *-------------------------------------------------------------------------
19 #include <stdio.h> /* for sprintf() */
22 #include "utils/palloc.h"
23 #include "utils/builtins.h" /* where the declarations go */
25 /*****************************************************************************
27 *****************************************************************************/
30 * charin - converts "x" to 'x'
36 return ((int32) NULL);
41 * charout - converts 'x' to "x"
46 char *result = (char *) palloc(2);
48 result[0] = (char) ch;
54 * cidin - converts "..." to internal representation.
56 * NOTE: we must not use 'charin' because cid might be a non
57 * printable character...
73 * cidout - converts a cid to "..."
75 * NOTE: we must no use 'charout' because cid might be a non
76 * printable character...
85 * cid is a number between 0 .. 2^16-1, therefore we need at most 6
86 * chars for the string (5 digits + '\0') NOTE: print it as an
91 sprintf(result, "%u", (unsigned) (c2));
96 * char16in - converts "..." to internal reprsentation
99 * Currently if strlen(s) < 14, the extra chars are nulls
108 result = (char *) palloc(16);
109 strncpy(result, s, 16);
114 * char16out - converts internal reprsentation to "..."
119 char *result = (char *) palloc(17);
127 StrNCpy(result, s, 17);
132 /*****************************************************************************
134 *****************************************************************************/
137 chareq(int8 arg1, int8 arg2)
139 return (arg1 == arg2);
143 charne(int8 arg1, int8 arg2)
145 return (arg1 != arg2);
149 charlt(int8 arg1, int8 arg2)
151 return ((uint8) arg1 < (uint8) arg2);
155 charle(int8 arg1, int8 arg2)
157 return ((uint8) arg1 <= (uint8) arg2);
161 chargt(int8 arg1, int8 arg2)
163 return ((uint8) arg1 > (uint8) arg2);
167 charge(int8 arg1, int8 arg2)
169 return ((uint8) arg1 >= (uint8) arg2);
173 charpl(int8 arg1, int8 arg2)
175 return (arg1 + arg2);
179 charmi(int8 arg1, int8 arg2)
181 return (arg1 - arg2);
185 charmul(int8 arg1, int8 arg2)
187 return (arg1 * arg2);
191 chardiv(int8 arg1, int8 arg2)
193 return (arg1 / arg2);
197 cideq(int8 arg1, int8 arg2)
199 return (arg1 == arg2);
203 * char16eq - returns 1 iff arguments are equal
204 * char16ne - returns 1 iff arguments are not equal
207 * Assumes that "xy\0\0a" should be equal to "xy\0b".
208 * If not, can do the comparison backwards for efficiency.
210 * char16lt - returns 1 iff a < b
211 * char16le - returns 1 iff a <= b
212 * char16gt - returns 1 iff a < b
213 * char16ge - returns 1 iff a <= b
217 char16eq(char *arg1, char *arg2)
219 if (arg1 == NULL || arg2 == NULL)
221 return (strncmp(arg1, arg2, 16) == 0);
225 char16ne(char *arg1, char *arg2)
227 if (arg1 == NULL || arg2 == NULL)
229 return (strncmp(arg1, arg2, 16) != 0);
233 char16lt(char *arg1, char *arg2)
235 if (arg1 == NULL || arg2 == NULL)
237 return (strncmp(arg1, arg2, 16) < 0);
241 char16le(char *arg1, char *arg2)
243 if (arg1 == NULL || arg2 == NULL)
245 return (strncmp(arg1, arg2, 16) <= 0);
249 char16gt(char *arg1, char *arg2)
251 if (arg1 == NULL || arg2 == NULL)
254 return (strncmp(arg1, arg2, 16) > 0);
258 char16ge(char *arg1, char *arg2)
260 if (arg1 == NULL || arg2 == NULL)
263 return (strncmp(arg1, arg2, 16) >= 0);
267 /* ============================== char2 ============================== */
276 strncpy((char *) &res, s, 2);
283 char *result = (char *) palloc(3);
285 StrNCpy(result, (char *) &s, 3);
291 char2eq(uint16 a, uint16 b)
293 return (strncmp((char *) &a, (char *) &b, 2) == 0);
297 char2ne(uint16 a, uint16 b)
299 return (strncmp((char *) &a, (char *) &b, 2) != 0);
303 char2lt(uint16 a, uint16 b)
305 return (strncmp((char *) &a, (char *) &b, 2) < 0);
309 char2le(uint16 a, uint16 b)
311 return (strncmp((char *) &a, (char *) &b, 2) <= 0);
315 char2gt(uint16 a, uint16 b)
317 return (strncmp((char *) &a, (char *) &b, 2) > 0);
321 char2ge(uint16 a, uint16 b)
323 return (strncmp((char *) &a, (char *) &b, 2) >= 0);
327 char2cmp(uint16 a, uint16 b)
329 return (strncmp((char *) &a, (char *) &b, 2));
332 /* ============================== char4 ============================== */
341 strncpy((char *) &res, s, 4);
350 char *result = (char *) palloc(5);
352 StrNCpy(result, (char *) &s, 5);
358 char4eq(uint32 a, uint32 b)
360 return (strncmp((char *) &a, (char *) &b, 4) == 0);
364 char4ne(uint32 a, uint32 b)
366 return (strncmp((char *) &a, (char *) &b, 4) != 0);
370 char4lt(uint32 a, uint32 b)
372 return (strncmp((char *) &a, (char *) &b, 4) < 0);
376 char4le(uint32 a, uint32 b)
378 return (strncmp((char *) &a, (char *) &b, 4) <= 0);
382 char4gt(uint32 a, uint32 b)
384 return (strncmp((char *) &a, (char *) &b, 4) > 0);
388 char4ge(uint32 a, uint32 b)
390 return (strncmp((char *) &a, (char *) &b, 4) >= 0);
394 char4cmp(uint32 a, uint32 b)
396 return (strncmp((char *) &a, (char *) &b, 4));
399 /* ============================== char8 ============================== */
406 return ((char *) NULL);
408 result = (char *) palloc(8);
409 strncpy(result, s, 8);
416 char *result = (char *) palloc(9);
424 StrNCpy(result, s, 9);
429 char8eq(char *arg1, char *arg2)
431 if (arg1 == NULL || arg2 == NULL)
433 return (strncmp(arg1, arg2, 8) == 0);
437 char8ne(char *arg1, char *arg2)
439 if (arg1 == NULL || arg2 == NULL)
441 return (strncmp(arg1, arg2, 8) != 0);
445 char8lt(char *arg1, char *arg2)
447 if (arg1 == NULL || arg2 == NULL)
449 return (strncmp(arg1, arg2, 8) < 0);
453 char8le(char *arg1, char *arg2)
455 if (arg1 == NULL || arg2 == NULL)
457 return (strncmp(arg1, arg2, 8) <= 0);
461 char8gt(char *arg1, char *arg2)
463 if (arg1 == NULL || arg2 == NULL)
465 return (strncmp(arg1, arg2, 8) > 0);
469 char8ge(char *arg1, char *arg2)
471 if (arg1 == NULL || arg2 == NULL)
473 return (strncmp(arg1, arg2, 8) >= 0);
477 char8cmp(char *arg1, char *arg2)
479 return (strncmp(arg1, arg2, 8));