1 /* Copyright (C) 2002 by Red Hat, Incorporated. All rights reserved.
3 * Permission to use, copy, modify, and distribute this software
4 * is freely granted, provided that this notice is preserved.
13 #include "buf_findstr.h"
16 argz_replace (char **argz
,
20 unsigned *replace_count
)
22 const int str_len
= strlen(str
);
23 const int with_len
= strlen(with
);
24 const int len_diff
= with_len
- str_len
;
26 char *buf_iter
= *argz
;
27 size_t buf_len
= *argz_len
;
28 char *last_iter
= NULL
;
29 char *new_argz
= NULL
;
30 size_t new_argz_len
= 0;
31 char *new_argz_iter
= NULL
;
32 char *argz_realloc
= NULL
;
35 new_argz_len
= *argz_len
;
39 if(_buf_findstr(str
, &buf_iter
, &buf_len
))
42 new_argz_len
+= len_diff
;
48 if (!(new_argz
= (char *)malloc(new_argz_len
)))
54 new_argz_iter
= new_argz
;
58 if (_buf_findstr(str
, &buf_iter
, &buf_len
))
60 /* copy everything up to, but not including str, from old argz to
62 memcpy(new_argz_iter
, last_iter
, buf_iter
- last_iter
- str_len
);
63 new_argz_iter
+= (buf_iter
- last_iter
- str_len
);
64 /* copy replacement string. */
65 memcpy(new_argz_iter
, with
, with_len
);
66 new_argz_iter
+= with_len
;
70 /* copy everything after last occurrence of str. */
71 memcpy(new_argz_iter
, last_iter
, *argz
+ *argz_len
- last_iter
);
73 /* reallocate argz, and copy over the new value. */
74 if(!(argz_realloc
= (char *)realloc(*argz
, new_argz_len
)))
81 memcpy(*argz
, new_argz
, new_argz_len
);
82 *argz_len
= new_argz_len
;