00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031 #ifdef HAVE_CONFIG_H
00032 #include "config.h"
00033 #endif
00034
00035 #include <stdio.h>
00036
00037 #ifdef HAVE_STRING_H
00038 #include <string.h>
00039 #endif
00040
00041 #ifdef HAVE_STDLIB_H
00042 #include <stdlib.h>
00043 #endif
00044
00045 #include "libiberty.h"
00046 #include "dyn-string.h"
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058 int
00059 dyn_string_init (ds_struct_ptr, space)
00060 struct dyn_string *ds_struct_ptr;
00061 int space;
00062 {
00063
00064 if (space == 0)
00065 space = 1;
00066
00067 #ifdef RETURN_ON_ALLOCATION_FAILURE
00068 ds_struct_ptr->s = (char *) malloc (space);
00069 if (ds_struct_ptr->s == NULL)
00070 return 0;
00071 #else
00072 ds_struct_ptr->s = (char *) xmalloc (space);
00073 #endif
00074 ds_struct_ptr->allocated = space;
00075 ds_struct_ptr->length = 0;
00076 ds_struct_ptr->s[0] = '\0';
00077
00078 return 1;
00079 }
00080
00081
00082
00083
00084
00085
00086
00087 dyn_string_t
00088 dyn_string_new (space)
00089 int space;
00090 {
00091 dyn_string_t result;
00092 #ifdef RETURN_ON_ALLOCATION_FAILURE
00093 result = (dyn_string_t) malloc (sizeof (struct dyn_string));
00094 if (result == NULL)
00095 return NULL;
00096 if (!dyn_string_init (result, space))
00097 {
00098 free (result);
00099 return NULL;
00100 }
00101 #else
00102 result = (dyn_string_t) xmalloc (sizeof (struct dyn_string));
00103 dyn_string_init (result, space);
00104 #endif
00105 return result;
00106 }
00107
00108
00109
00110 void
00111 dyn_string_delete (ds)
00112 dyn_string_t ds;
00113 {
00114 free (ds->s);
00115 free (ds);
00116 }
00117
00118
00119
00120
00121
00122 char*
00123 dyn_string_release (ds)
00124 dyn_string_t ds;
00125 {
00126
00127 char* result = ds->s;
00128
00129 ds->s = NULL;
00130
00131 free (ds);
00132
00133 return result;
00134 }
00135
00136
00137
00138
00139
00140
00141
00142
00143 dyn_string_t
00144 dyn_string_resize (ds, space)
00145 dyn_string_t ds;
00146 int space;
00147 {
00148 int new_allocated = ds->allocated;
00149
00150
00151 ++space;
00152
00153
00154 while (space > new_allocated)
00155 new_allocated *= 2;
00156
00157 if (new_allocated != ds->allocated)
00158 {
00159 ds->allocated = new_allocated;
00160
00161 #ifdef RETURN_ON_ALLOCATION_FAILURE
00162 ds->s = (char *) realloc (ds->s, ds->allocated);
00163 if (ds->s == NULL)
00164 {
00165 free (ds);
00166 return NULL;
00167 }
00168 #else
00169 ds->s = (char *) xrealloc (ds->s, ds->allocated);
00170 #endif
00171 }
00172
00173 return ds;
00174 }
00175
00176
00177
00178 void
00179 dyn_string_clear (ds)
00180 dyn_string_t ds;
00181 {
00182
00183 ds->s[0] = '\0';
00184 ds->length = 0;
00185 }
00186
00187
00188
00189
00190
00191 int
00192 dyn_string_copy (dest, src)
00193 dyn_string_t dest;
00194 dyn_string_t src;
00195 {
00196 if (dest == src)
00197 abort ();
00198
00199
00200 if (dyn_string_resize (dest, src->length) == NULL)
00201 return 0;
00202
00203 strcpy (dest->s, src->s);
00204
00205 dest->length = src->length;
00206 return 1;
00207 }
00208
00209
00210
00211
00212
00213 int
00214 dyn_string_copy_cstr (dest, src)
00215 dyn_string_t dest;
00216 const char *src;
00217 {
00218 int length = strlen (src);
00219
00220 if (dyn_string_resize (dest, length) == NULL)
00221 return 0;
00222
00223 strcpy (dest->s, src);
00224
00225 dest->length = length;
00226 return 1;
00227 }
00228
00229
00230
00231
00232
00233
00234 int
00235 dyn_string_prepend (dest, src)
00236 dyn_string_t dest;
00237 dyn_string_t src;
00238 {
00239 return dyn_string_insert (dest, 0, src);
00240 }
00241
00242
00243
00244
00245
00246 int
00247 dyn_string_prepend_cstr (dest, src)
00248 dyn_string_t dest;
00249 const char *src;
00250 {
00251 return dyn_string_insert_cstr (dest, 0, src);
00252 }
00253
00254
00255
00256
00257
00258
00259 int
00260 dyn_string_insert (dest, pos, src)
00261 dyn_string_t dest;
00262 int pos;
00263 dyn_string_t src;
00264 {
00265 int i;
00266
00267 if (src == dest)
00268 abort ();
00269
00270 if (dyn_string_resize (dest, dest->length + src->length) == NULL)
00271 return 0;
00272
00273 for (i = dest->length; i >= pos; --i)
00274 dest->s[i + src->length] = dest->s[i];
00275
00276 strncpy (dest->s + pos, src->s, src->length);
00277
00278 dest->length += src->length;
00279 return 1;
00280 }
00281
00282
00283
00284
00285
00286
00287 int
00288 dyn_string_insert_cstr (dest, pos, src)
00289 dyn_string_t dest;
00290 int pos;
00291 const char *src;
00292 {
00293 int i;
00294 int length = strlen (src);
00295
00296 if (dyn_string_resize (dest, dest->length + length) == NULL)
00297 return 0;
00298
00299 for (i = dest->length; i >= pos; --i)
00300 dest->s[i + length] = dest->s[i];
00301
00302 strncpy (dest->s + pos, src, length);
00303
00304 dest->length += length;
00305 return 1;
00306 }
00307
00308
00309
00310
00311
00312 int
00313 dyn_string_insert_char (dest, pos, c)
00314 dyn_string_t dest;
00315 int pos;
00316 int c;
00317 {
00318 int i;
00319
00320 if (dyn_string_resize (dest, dest->length + 1) == NULL)
00321 return 0;
00322
00323 for (i = dest->length; i >= pos; --i)
00324 dest->s[i + 1] = dest->s[i];
00325
00326 dest->s[pos] = c;
00327
00328 ++dest->length;
00329 return 1;
00330 }
00331
00332
00333
00334
00335
00336 int
00337 dyn_string_append (dest, s)
00338 dyn_string_t dest;
00339 dyn_string_t s;
00340 {
00341 if (dyn_string_resize (dest, dest->length + s->length) == 0)
00342 return 0;
00343 strcpy (dest->s + dest->length, s->s);
00344 dest->length += s->length;
00345 return 1;
00346 }
00347
00348
00349
00350
00351
00352 int
00353 dyn_string_append_cstr (dest, s)
00354 dyn_string_t dest;
00355 const char *s;
00356 {
00357 int len = strlen (s);
00358
00359
00360
00361 if (dyn_string_resize (dest, dest->length + len) == NULL)
00362 return 0;
00363 strcpy (dest->s + dest->length, s);
00364 dest->length += len;
00365 return 1;
00366 }
00367
00368
00369
00370
00371 int
00372 dyn_string_append_char (dest, c)
00373 dyn_string_t dest;
00374 int c;
00375 {
00376
00377 if (dyn_string_resize (dest, dest->length + 1) == NULL)
00378 return 0;
00379
00380 dest->s[dest->length] = c;
00381
00382 dest->s[dest->length + 1] = '\0';
00383
00384 ++(dest->length);
00385 return 1;
00386 }
00387
00388
00389
00390
00391
00392
00393
00394 int
00395 dyn_string_substring (dest, src, start, end)
00396 dyn_string_t dest;
00397 dyn_string_t src;
00398 int start;
00399 int end;
00400 {
00401 int i;
00402 int length = end - start;
00403
00404 if (start > end || start > src->length || end > src->length)
00405 abort ();
00406
00407
00408 if (dyn_string_resize (dest, length) == NULL)
00409 return 0;
00410
00411 for (i = length; --i >= 0; )
00412 dest->s[i] = src->s[start + i];
00413
00414 dest->s[length] = '\0';
00415
00416 dest->length = length;
00417
00418 return 1;
00419 }
00420
00421
00422
00423 int
00424 dyn_string_eq (ds1, ds2)
00425 dyn_string_t ds1;
00426 dyn_string_t ds2;
00427 {
00428
00429 if (ds1->length != ds2->length)
00430 return 0;
00431 else
00432 return !strcmp (ds1->s, ds2->s);
00433 }