summaryrefslogtreecommitdiff
path: root/str.c
diff options
context:
space:
mode:
Diffstat (limited to 'str.c')
-rw-r--r--str.c75
1 files changed, 69 insertions, 6 deletions
diff --git a/str.c b/str.c
index 6521fa6..5b4522f 100644
--- a/str.c
+++ b/str.c
@@ -28,20 +28,43 @@
* POSSIBILITY OF SUCH DAMAGE.
*/
+#include <stdarg.h>
#include <stdlib.h>
#include <string.h>
char *
-str_split(const char *str, char c)
+str_head(const char *str, char c)
+{
+ char *occ, *result;
+ size_t head_len;
+
+ occ = strrchr(str, c);
+ if (!occ || (occ == str && *occ != c))
+ return NULL;
+
+ /* copy head to new buffer */
+ head_len = occ - str + 1;
+ result = malloc(sizeof(char) * head_len);
+ if (result == NULL)
+ return NULL;
+ if (strlcpy(result, str, head_len) < head_len) {
+ free(result);
+ return NULL;
+ }
+ return result;
+}
+
+char *
+str_tail(const char *str, char c)
{
char *right, *result;
size_t right_len;
right = strrchr(str, c);
- if (!right || right == str)
+ if (!right || (right == str && *right != c))
return NULL;
- /* move right part to new buffer */
+ /* copy right part to new buffer */
right_len = strlen(right);
result = malloc(sizeof(char) * right_len);
if (result == NULL)
@@ -51,9 +74,6 @@ str_split(const char *str, char c)
free(result);
return NULL;
}
- /* remove right part from src buffer */
- *right = '\0';
-
return result;
}
@@ -70,3 +90,46 @@ str_replace(char *str, char a, char b)
tmp++;
}
}
+
+size_t
+str_concat(char **dst,...)
+{
+ va_list str_list;
+ const char *str;
+ char *concat;
+ size_t cur_size, dst_size, w_size;
+
+ /* first compute required size */
+ dst_size = 0;
+ va_start(str_list, dst);
+ while ((str = va_arg(str_list, char *)) != NULL) {
+ dst_size += strlen(str);
+ }
+ va_end(str_list);
+ dst_size++;
+
+ /* alloc result string */
+ *dst = malloc(sizeof(char) * dst_size);
+ if (*dst == NULL)
+ return 0;
+
+ /* concatenate now */
+ concat = *dst;
+ concat[0] = '\0';
+ w_size = 0;
+ va_start(str_list, dst);
+ while ((str = va_arg(str_list, char *)) != NULL) {
+ cur_size = strlen(str);
+ if (strlcpy(concat, str, dst_size) >= dst_size) {
+ w_size = 0;
+ free(dst);
+ break;
+ }
+ w_size += cur_size;
+ concat += cur_size;
+ dst_size -= cur_size;
+ }
+ va_end(str_list);
+
+ return w_size;
+}