00001 #include <string.h>
00002 #include <stdlib.h>
00003 #include <grass/dbmi.h>
00004
00011 void
00012 db_init_string (dbString *x)
00013
00014 {
00015 x->string = "";
00016 x->nalloc = 0;
00017 }
00018
00019
00020
00027
00028
00029
00030
00031
00032
00033 static int set_string();
00034
00035 int
00036 db_set_string (dbString *x, char *s)
00037
00038 {
00039 return set_string (x, s, 1);
00040 }
00041
00048 int
00049 db_set_string_no_copy (dbString *x, char *s)
00050
00051 {
00052 return set_string (x, s, 0);
00053 }
00054
00061 unsigned int
00062 db_sizeof_string (dbString *x)
00063
00064 {
00065 if (x->nalloc < 0) return 0;
00066 return (unsigned int) x->nalloc;
00067 }
00068
00075 void
00076 db_zero_string (dbString *x)
00077
00078 {
00079 db_zero ((void *)db_get_string(x), db_sizeof_string(x));
00080 }
00081
00088 static int
00089 set_string (dbString *x, char *s, int copy)
00090
00091 {
00092 int len;
00093 int stat;
00094
00095 if (s == NULL)
00096 {
00097 s = "";
00098 copy = 1;
00099 }
00100
00101 len = strlen(s)+1;
00102
00103 if (copy)
00104 {
00105 stat = db_enlarge_string (x, len);
00106 if (stat != DB_OK)
00107 return stat;
00108 strcpy (x->string, s);
00109 }
00110 else
00111 {
00112 db_free_string(x);
00113 x->string = s;
00114 x->nalloc = -1;
00115 }
00116 return DB_OK;
00117 }
00118
00125 int
00126 db_enlarge_string (dbString *x, int len)
00127
00128 {
00129 if (x->nalloc < len)
00130 {
00131 if (x->nalloc <= 0)
00132 x->string = db_store("");
00133 x->string = db_realloc ((void *)x->string, len);
00134 if (x->string == NULL)
00135 return DB_MEMORY_ERR;
00136 x->nalloc = len;
00137 }
00138 return DB_OK;
00139 }
00140
00141 char *
00142 db_get_string (dbString *x)
00143
00144 {
00145 return x->string;
00146 }
00147
00154 void
00155 db_free_string (dbString *x)
00156
00157 {
00158 if (x->nalloc > 0)
00159 free(x->string);
00160 db_init_string (x);
00161 }
00162
00169 void
00170 db_free_string_array (dbString *a, int n)
00171
00172 {
00173 int i;
00174
00175 if (a)
00176 {
00177 for (i = 0; i<n; i++)
00178 db_free_string(&a[i]);
00179 free (a);
00180 }
00181 }
00182
00189 dbString *
00190 db_alloc_string_array (int count)
00191
00192 {
00193 int i;
00194 dbString *a;
00195
00196 if (count < 0) count = 0;
00197 a = (dbString *) db_calloc (count, sizeof(dbString));
00198 if (a)
00199 {
00200 for (i = 0; i < count; i++)
00201 db_init_string(&a[i]);
00202 }
00203 return a;
00204 }
00205
00212 int
00213 db_append_string (dbString *x, char *s)
00214
00215 {
00216 int len;
00217 int stat;
00218
00219 len = strlen (db_get_string(x)) + strlen(s) + 1;
00220 stat = db_enlarge_string (x, len);
00221 if (stat != DB_OK)
00222 return stat;
00223 strcat (db_get_string(x), s);
00224 return DB_OK;
00225 }
00226
00233 int
00234 db_copy_string (dbString *dst, dbString *src)
00235
00236 {
00237 return db_set_string (dst, db_get_string(src));
00238 }
00239
00246 void
00247 db_double_quote_string (dbString *src)
00248
00249 {
00250 char *ptra, *ptrb, buf[2];
00251 dbString tmp;
00252
00253 db_init_string (&tmp);
00254 buf[1] = 0;
00255
00256 ptrb = db_get_string(src);
00257 while ( (ptra = strchr( ptrb, '\'') ) != NULL ) {
00258 for ( ; ptrb <= ptra; ptrb++ ) { buf[0] = ptrb[0]; db_append_string (&tmp, buf); }
00259 db_append_string (&tmp, "'");
00260 }
00261 db_append_string (&tmp, ptrb );
00262 db_set_string ( src, db_get_string(&tmp));
00263 db_free_string( &tmp );
00264 }
00265