]> granicus.if.org Git - postgresql/blob - src/backend/utils/adt/oid.c
Final cleanup.
[postgresql] / src / backend / utils / adt / oid.c
1 /*-------------------------------------------------------------------------
2  *
3  * oid.c
4  *        Functions for the built-in type Oid.
5  *
6  * Copyright (c) 1994, Regents of the University of California
7  *
8  *
9  * IDENTIFICATION
10  *        $Header: /cvsroot/pgsql/src/backend/utils/adt/oid.c,v 1.27 1999/07/16 05:00:21 momjian Exp $
11  *
12  *-------------------------------------------------------------------------
13  */
14
15 #include <stdio.h>
16 #include <string.h>
17
18 #include "postgres.h"
19 #include "utils/builtins.h"
20
21 /*****************************************************************************
22  *       USER I/O ROUTINES                                                                                                               *
23  *****************************************************************************/
24
25 /*
26  *              oid8in                  - converts "num num ..." to internal form
27  *
28  *              Note:
29  *                              Fills any nonexistent digits with NULL oids.
30  */
31 Oid *
32 oid8in(char *oidString)
33 {
34         Oid                *result;
35         int                     nums;
36
37         if (oidString == NULL)
38                 return NULL;
39
40         result = (Oid *) palloc(sizeof(Oid[8]));
41         if ((nums = sscanf(oidString, "%u%u%u%u%u%u%u%u",
42                                            &result[0],
43                                            &result[1],
44                                            &result[2],
45                                            &result[3],
46                                            &result[4],
47                                            &result[5],
48                                            &result[6],
49                                            &result[7])) != 8)
50         {
51                 do
52                         result[nums++] = 0;
53                 while (nums < 8);
54         }
55         return result;
56 }
57
58 /*
59  *              oid8out - converts internal form to "num num ..."
60  */
61 char *
62 oid8out(Oid *oidArray)
63 {
64         int                     num;
65         Oid                *sp;
66         char       *rp;
67         char       *result;
68
69         if (oidArray == NULL)
70         {
71                 result = (char *) palloc(2);
72                 result[0] = '-';
73                 result[1] = '\0';
74                 return result;
75         }
76
77         /* assumes sign, 10 digits, ' ' */
78         rp = result = (char *) palloc(8 * 12);
79         sp = oidArray;
80         for (num = 8; num != 0; num--)
81         {
82                 ltoa(*sp++, rp);
83                 while (*++rp != '\0')
84                         ;
85                 *rp++ = ' ';
86         }
87         *--rp = '\0';
88         return result;
89 }
90
91 Oid
92 oidin(char *s)
93 {
94         return int4in(s);
95 }
96
97 char *
98 oidout(Oid o)
99 {
100         return int4out(o);
101 }
102
103 /*****************************************************************************
104  *       PUBLIC ROUTINES                                                                                                                 *
105  *****************************************************************************/
106
107 /*
108  * If you change this function, change heap_keytest()
109  * because we have hardcoded this in there as an optimization
110  */
111 bool
112 oideq(Oid arg1, Oid arg2)
113 {
114         return arg1 == arg2;
115 }
116
117 bool
118 oidne(Oid arg1, Oid arg2)
119 {
120         return arg1 != arg2;
121 }
122
123 bool
124 oid8eq(Oid *arg1, Oid *arg2)
125 {
126         return (bool) (memcmp(arg1, arg2, 8 * sizeof(Oid)) == 0);
127 }
128
129 bool
130 oid8ne(Oid *arg1, Oid *arg2)
131 {
132         return (bool) (memcmp(arg1, arg2, 8 * sizeof(Oid)) != 0);
133 }
134
135 bool
136 oid8lt(Oid *arg1, Oid *arg2)
137 {
138         int                     i;
139
140         for (i = 0; i < 8; i++)
141                 if (!int4eq(arg1[i], arg2[i]))
142                         return int4lt(arg1[i], arg2[i]);
143         return false;
144 }
145
146 bool
147 oid8le(Oid *arg1, Oid *arg2)
148 {
149         int                     i;
150
151         for (i = 0; i < 8; i++)
152                 if (!int4eq(arg1[i], arg2[i]))
153                         return int4le(arg1[i], arg2[i]);
154         return true;
155 }
156
157 bool
158 oid8ge(Oid *arg1, Oid *arg2)
159 {
160         int                     i;
161
162         for (i = 0; i < 8; i++)
163                 if (!int4eq(arg1[i], arg2[i]))
164                         return int4ge(arg1[i], arg2[i]);
165         return true;
166 }
167
168 bool
169 oid8gt(Oid *arg1, Oid *arg2)
170 {
171         int                     i;
172
173         for (i = 0; i < 8; i++)
174                 if (!int4eq(arg1[i], arg2[i]))
175                         return int4gt(arg1[i], arg2[i]);
176         return false;
177 }
178
179 bool
180 oideqint4(Oid arg1, int32 arg2)
181 {
182 /* oid is unsigned, but int4 is signed */
183         return arg2 >= 0 && arg1 == arg2;
184 }
185
186 bool
187 int4eqoid(int32 arg1, Oid arg2)
188 {
189 /* oid is unsigned, but int4 is signed */
190         return arg1 >= 0 && arg1 == arg2;
191 }
192
193 text *
194 oid_text(Oid oid)
195 {
196         text       *result;
197
198         int                     len;
199         char       *str;
200
201         str = oidout(oid);
202         len = (strlen(str) + VARHDRSZ);
203
204         result = palloc(len);
205
206         VARSIZE(result) = len;
207         memmove(VARDATA(result), str, (len - VARHDRSZ));
208         pfree(str);
209
210         return result;
211 }       /* oid_text() */
212
213 Oid
214 text_oid(text *string)
215 {
216         Oid                     result;
217
218         int                     len;
219         char       *str;
220
221         len = (VARSIZE(string) - VARHDRSZ);
222
223         str = palloc(len + 1);
224         memmove(str, VARDATA(string), len);
225         *(str + len) = '\0';
226
227         result = oidin(str);
228         pfree(str);
229
230         return result;
231 }       /* oid_text() */