Age Owner Branch data TLA Line data Source code
1 : : /* src/interfaces/ecpg/pgtypeslib/common.c */
2 : :
3 : : #include "postgres_fe.h"
4 : :
5 : : #include "pgtypes.h"
6 : : #include "pgtypeslib_extern.h"
7 : :
8 : : /* Return value is zero-filled. */
9 : : char *
8206 meskes@postgresql.or 10 :GIC 39760 : pgtypes_alloc(long size)
11 : : {
8069 bruce@momjian.us 12 : 39760 : char *new = (char *) calloc(1L, size);
13 : :
8206 meskes@postgresql.or 14 [ - + ]: 39760 : if (!new)
8206 meskes@postgresql.or 15 :UIC 0 : errno = ENOMEM;
2942 peter_e@gmx.net 16 :GIC 39760 : return new;
17 : : }
18 : :
19 : : char *
5011 meskes@postgresql.or 20 : 391 : pgtypes_strdup(const char *str)
21 : : {
206 peter@eisentraut.org 22 : 391 : char *new = strdup(str);
23 : :
8206 meskes@postgresql.or 24 [ - + ]: 391 : if (!new)
8206 meskes@postgresql.or 25 :UIC 0 : errno = ENOMEM;
2942 peter_e@gmx.net 26 :GIC 391 : return new;
27 : : }
28 : :
29 : : int
8069 bruce@momjian.us 30 : 19 : pgtypes_fmt_replace(union un_fmt_comb replace_val, int replace_type, char **output, int *pstr_len)
31 : : {
32 : : /*
33 : : * general purpose variable, set to 0 in order to fix compiler warning
34 : : */
35 : 19 : int i = 0;
36 : :
37 [ + + + + : 19 : switch (replace_type)
- ]
38 : : {
8072 meskes@postgresql.or 39 : 2 : case PGTYPES_TYPE_NOTHING:
8194 40 : 2 : break;
8072 41 : 4 : case PGTYPES_TYPE_STRING_CONSTANT:
42 : : case PGTYPES_TYPE_STRING_MALLOCED:
43 : 4 : i = strlen(replace_val.str_val);
8069 bruce@momjian.us 44 [ + - ]: 4 : if (i + 1 <= *pstr_len)
45 : : {
46 : : /* include trailing terminator in what we copy */
2639 tgl@sss.pgh.pa.us 47 : 4 : memcpy(*output, replace_val.str_val, i + 1);
8194 meskes@postgresql.or 48 : 4 : *pstr_len -= i;
49 : 4 : *output += i;
8069 bruce@momjian.us 50 [ - + ]: 4 : if (replace_type == PGTYPES_TYPE_STRING_MALLOCED)
8072 meskes@postgresql.or 51 :UIC 0 : free(replace_val.str_val);
8194 meskes@postgresql.or 52 :GIC 4 : return 0;
53 : : }
54 : : else
8069 bruce@momjian.us 55 :UIC 0 : return -1;
56 : : break;
8072 meskes@postgresql.or 57 :GIC 1 : case PGTYPES_TYPE_CHAR:
8069 bruce@momjian.us 58 [ + - ]: 1 : if (*pstr_len >= 2)
59 : : {
8072 meskes@postgresql.or 60 : 1 : (*output)[0] = replace_val.char_val;
8194 61 : 1 : (*output)[1] = '\0';
62 : 1 : (*pstr_len)--;
63 : 1 : (*output)++;
64 : 1 : return 0;
65 : : }
66 : : else
8069 bruce@momjian.us 67 :UIC 0 : return -1;
68 : : break;
8072 meskes@postgresql.or 69 :GIC 12 : case PGTYPES_TYPE_DOUBLE_NF:
70 : : case PGTYPES_TYPE_INT64:
71 : : case PGTYPES_TYPE_UINT:
72 : : case PGTYPES_TYPE_UINT_2_LZ:
73 : : case PGTYPES_TYPE_UINT_2_LS:
74 : : case PGTYPES_TYPE_UINT_3_LZ:
75 : : case PGTYPES_TYPE_UINT_4_LZ:
76 : : {
8069 bruce@momjian.us 77 : 12 : char *t = pgtypes_alloc(PGTYPES_FMT_NUM_MAX_DIGITS);
78 : :
79 [ - + ]: 12 : if (!t)
8194 meskes@postgresql.or 80 :UIC 0 : return ENOMEM;
8069 bruce@momjian.us 81 [ - - + + :GIC 12 : switch (replace_type)
- + - - ]
82 : : {
8072 meskes@postgresql.or 83 :UIC 0 : case PGTYPES_TYPE_DOUBLE_NF:
8194 84 : 0 : i = snprintf(t, PGTYPES_FMT_NUM_MAX_DIGITS,
85 : : "%0.0g", replace_val.double_val);
86 : 0 : break;
8072 87 : 0 : case PGTYPES_TYPE_INT64:
8194 88 : 0 : i = snprintf(t, PGTYPES_FMT_NUM_MAX_DIGITS,
89 : : INT64_FORMAT, replace_val.int64_val);
90 : 0 : break;
8072 meskes@postgresql.or 91 :GIC 3 : case PGTYPES_TYPE_UINT:
8069 bruce@momjian.us 92 : 3 : i = snprintf(t, PGTYPES_FMT_NUM_MAX_DIGITS,
93 : : "%u", replace_val.uint_val);
8194 meskes@postgresql.or 94 : 3 : break;
8072 95 : 8 : case PGTYPES_TYPE_UINT_2_LZ:
8069 bruce@momjian.us 96 : 8 : i = snprintf(t, PGTYPES_FMT_NUM_MAX_DIGITS,
97 : : "%02u", replace_val.uint_val);
8194 meskes@postgresql.or 98 : 8 : break;
8072 meskes@postgresql.or 99 :UIC 0 : case PGTYPES_TYPE_UINT_2_LS:
8069 bruce@momjian.us 100 : 0 : i = snprintf(t, PGTYPES_FMT_NUM_MAX_DIGITS,
101 : : "%2u", replace_val.uint_val);
8194 meskes@postgresql.or 102 : 0 : break;
8072 meskes@postgresql.or 103 :GIC 1 : case PGTYPES_TYPE_UINT_3_LZ:
8069 bruce@momjian.us 104 : 1 : i = snprintf(t, PGTYPES_FMT_NUM_MAX_DIGITS,
105 : : "%03u", replace_val.uint_val);
8194 meskes@postgresql.or 106 : 1 : break;
8072 meskes@postgresql.or 107 :UIC 0 : case PGTYPES_TYPE_UINT_4_LZ:
8069 bruce@momjian.us 108 : 0 : i = snprintf(t, PGTYPES_FMT_NUM_MAX_DIGITS,
109 : : "%04u", replace_val.uint_val);
8194 meskes@postgresql.or 110 : 0 : break;
111 : : }
112 : :
2579 tgl@sss.pgh.pa.us 113 [ + - - + ]:GIC 12 : if (i < 0 || i >= PGTYPES_FMT_NUM_MAX_DIGITS)
114 : : {
8194 meskes@postgresql.or 115 :UIC 0 : free(t);
116 : 0 : return -1;
117 : : }
8194 meskes@postgresql.or 118 :GIC 12 : i = strlen(t);
119 : 12 : *pstr_len -= i;
120 : :
121 : : /*
122 : : * if *pstr_len == 0, we don't have enough space for the
123 : : * terminator and the conversion fails
124 : : */
8069 bruce@momjian.us 125 [ - + ]: 12 : if (*pstr_len <= 0)
126 : : {
8194 meskes@postgresql.or 127 :UIC 0 : free(t);
128 : 0 : return -1;
129 : : }
8194 meskes@postgresql.or 130 :GIC 12 : strcpy(*output, t);
131 : 12 : *output += i;
132 : 12 : free(t);
133 : : }
134 : 12 : break;
8194 meskes@postgresql.or 135 :UIC 0 : default:
136 : 0 : break;
137 : : }
8194 meskes@postgresql.or 138 :GIC 14 : return 0;
139 : : }
140 : :
141 : : /* Functions declared in pgtypes.h. */
142 : :
143 : : /* Just frees memory (mostly needed for Windows) */
144 : : void
2637 tmunro@postgresql.or 145 : 1190 : PGTYPESchar_free(char *ptr)
146 : : {
147 : 1190 : free(ptr);
148 : 1190 : }
|