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.7 1997/08/12 20:39:16 momjian 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'
32 int32 charin(char *ch)
40 * charout - converts 'x' to "x"
42 char *charout(int32 ch)
44 char *result = (char *) palloc(2);
46 result[0] = (char) ch;
52 * cidin - converts "..." to internal representation.
54 * NOTE: we must not use 'charin' because cid might be a non
55 * printable character...
70 * cidout - converts a cid to "..."
72 * NOTE: we must no use 'charout' because cid might be a non
73 * printable character...
81 * cid is a number between 0 .. 2^16-1, therefore we need at most
82 * 6 chars for the string (5 digits + '\0')
83 * NOTE: print it as an UNSIGNED int!
87 sprintf(result, "%u", (unsigned)(c2));
92 * char16in - converts "..." to internal reprsentation
95 * Currently if strlen(s) < 14, the extra chars are nulls
97 char *char16in(char *s)
103 result = (char *) palloc(16);
104 strncpy(result, s, 16);
109 * char16out - converts internal reprsentation to "..."
111 char *char16out(char *s)
113 char *result = (char *) palloc(17);
119 strNcpy(result, s, 16);
124 /*****************************************************************************
126 *****************************************************************************/
128 bool chareq(int8 arg1, int8 arg2) { return(arg1 == arg2); }
129 bool charne(int8 arg1, int8 arg2) { return(arg1 != arg2); }
130 bool charlt(int8 arg1, int8 arg2) { return((uint8)arg1 < (uint8)arg2); }
131 bool charle(int8 arg1, int8 arg2) { return((uint8)arg1 <= (uint8)arg2); }
132 bool chargt(int8 arg1, int8 arg2) { return((uint8)arg1 > (uint8)arg2); }
133 bool charge(int8 arg1, int8 arg2) { return((uint8)arg1 >= (uint8)arg2); }
134 int8 charpl(int8 arg1, int8 arg2) { return(arg1 + arg2); }
135 int8 charmi(int8 arg1, int8 arg2) { return(arg1 - arg2); }
136 int8 charmul(int8 arg1, int8 arg2) { return(arg1 * arg2); }
137 int8 chardiv(int8 arg1, int8 arg2) { return(arg1 / arg2); }
139 bool cideq(int8 arg1, int8 arg2) { return(arg1 == arg2); }
142 * char16eq - returns 1 iff arguments are equal
143 * char16ne - returns 1 iff arguments are not equal
146 * Assumes that "xy\0\0a" should be equal to "xy\0b".
147 * If not, can do the comparison backwards for efficiency.
149 * char16lt - returns 1 iff a < b
150 * char16le - returns 1 iff a <= b
151 * char16gt - returns 1 iff a < b
152 * char16ge - returns 1 iff a <= b
155 bool char16eq(char *arg1, char *arg2)
157 if (arg1 == NULL || arg2 == NULL)
159 return(strncmp(arg1, arg2, 16) == 0);
162 bool char16ne(char *arg1, char *arg2)
164 if (arg1 == NULL || arg2 == NULL)
166 return(strncmp(arg1, arg2, 16) != 0);
169 bool char16lt(char *arg1, char *arg2)
171 if (arg1 == NULL || arg2 == NULL)
173 return(strncmp(arg1, arg2, 16) < 0);
176 bool char16le(char *arg1, char *arg2)
178 if (arg1 == NULL || arg2 == NULL)
180 return(strncmp(arg1, arg2, 16) <= 0);
183 bool char16gt(char *arg1, char *arg2)
185 if (arg1 == NULL || arg2 == NULL)
188 return(strncmp(arg1, arg2, 16) > 0);
191 bool char16ge(char *arg1, char *arg2)
193 if (arg1 == NULL || arg2 == NULL)
196 return(strncmp(arg1, arg2, 16) >= 0);
200 /* ============================== char2 ============================== */
201 uint16 char2in(char *s)
208 strncpy((char *) &res, s, 2);
212 char *char2out(uint16 s)
214 char *result = (char *) palloc(3);
216 strNcpy(result, (char *) &s, 2);
221 bool char2eq(uint16 a, uint16 b)
223 return(strncmp((char *) &a, (char *) &b, 2) == 0);
226 bool char2ne(uint16 a, uint16 b)
228 return(strncmp((char *) &a, (char *) &b, 2) != 0);
231 bool char2lt(uint16 a, uint16 b)
233 return(strncmp((char *) &a, (char *) &b, 2) < 0);
236 bool char2le(uint16 a, uint16 b)
238 return(strncmp((char *) &a, (char *) &b, 2) <= 0);
241 bool char2gt(uint16 a, uint16 b)
243 return(strncmp((char *) &a, (char *) &b, 2) > 0);
246 bool char2ge(uint16 a, uint16 b)
248 return(strncmp((char *) &a, (char *) &b, 2) >= 0);
251 int32 char2cmp(uint16 a, uint16 b)
253 return (strncmp((char *) &a, (char *) &b, 2));
256 /* ============================== char4 ============================== */
257 uint32 char4in(char *s)
264 strncpy((char *) &res, s, 4);
272 char *result = (char *) palloc(5);
274 strNcpy(result, (char *) &s, 4);
279 bool char4eq(uint32 a, uint32 b)
281 return(strncmp((char *) &a, (char *) &b, 4) == 0);
284 bool char4ne(uint32 a, uint32 b)
286 return(strncmp((char *) &a, (char *) &b, 4) != 0);
289 bool char4lt(uint32 a, uint32 b)
291 return(strncmp((char *) &a, (char *) &b, 4) < 0);
294 bool char4le(uint32 a, uint32 b)
296 return(strncmp((char *) &a, (char *) &b, 4) <= 0);
299 bool char4gt(uint32 a, uint32 b)
301 return(strncmp((char *) &a, (char *) &b, 4) > 0);
304 bool char4ge(uint32 a, uint32 b)
306 return(strncmp((char *) &a, (char *) &b, 4) >= 0);
309 int32 char4cmp(uint32 a, uint32 b)
311 return(strncmp((char *) &a, (char *) &b, 4));
314 /* ============================== char8 ============================== */
315 char *char8in(char *s)
320 return((char *) NULL);
322 result = (char *) palloc(8);
323 strncpy(result, s, 8);
327 char *char8out(char *s)
329 char *result = (char *) palloc(9);
335 strNcpy(result, s, 8);
339 bool char8eq(char *arg1, char *arg2)
341 if (arg1 == NULL || arg2 == NULL)
343 return(strncmp(arg1, arg2, 8) == 0);
346 bool char8ne(char *arg1, char *arg2)
348 if (arg1 == NULL || arg2 == NULL)
350 return(strncmp(arg1, arg2, 8) != 0);
353 bool char8lt(char *arg1, char *arg2)
355 if (arg1 == NULL || arg2 == NULL)
357 return(strncmp(arg1, arg2, 8) < 0);
360 bool char8le(char *arg1, char *arg2)
362 if (arg1 == NULL || arg2 == NULL)
364 return(strncmp(arg1, arg2, 8) <= 0);
367 bool char8gt(char *arg1, char *arg2)
369 if (arg1 == NULL || arg2 == NULL)
371 return(strncmp(arg1, arg2, 8) > 0);
374 bool char8ge(char *arg1, char *arg2)
376 if (arg1 == NULL || arg2 == NULL)
378 return(strncmp(arg1, arg2, 8) >= 0);
381 int32 char8cmp(char *arg1, char *arg2)
383 return(strncmp(arg1, arg2, 8));