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 _DEFUN (argz_replace
, (argz
, argz_len
, str
, with
, replace_count
),
21 unsigned *replace_count
)
23 const int str_len
= strlen(str
);
24 const int with_len
= strlen(with
);
25 const int len_diff
= with_len
- str_len
;
27 char *buf_iter
= *argz
;
28 size_t buf_len
= *argz_len
;
29 char *last_iter
= NULL
;
30 char *new_argz
= NULL
;
31 size_t new_argz_len
= 0;
32 char *new_argz_iter
= NULL
;
35 new_argz_len
= *argz_len
;
39 if(_buf_findstr(str
, &buf_iter
, &buf_len
))
42 new_argz_len
+= len_diff
;
48 new_argz
= (char *)malloc(new_argz_len
);
53 new_argz_iter
= new_argz
;
57 if (_buf_findstr(str
, &buf_iter
, &buf_len
))
59 /* copy everything up to, but not including str, from old argz to
61 memcpy(new_argz_iter
, last_iter
, buf_iter
- last_iter
- str_len
);
62 new_argz_iter
+= (buf_iter
- last_iter
- str_len
);
63 /* copy replacement string. */
64 memcpy(new_argz_iter
, with
, with_len
);
65 new_argz_iter
+= with_len
;
69 /* copy everything after last occurrence of str. */
70 memcpy(new_argz_iter
, last_iter
, *argz
+ *argz_len
- last_iter
);
72 /* reallocate argz, and copy over the new value. */
73 if(!(*argz
= (char *)realloc(*argz
, new_argz_len
)))
76 memcpy(*argz
, new_argz
, new_argz_len
);
77 *argz_len
= new_argz_len
;