str: Add converting cmdline args vector to str module
[netsniff-ng.git] / str.c
blobf4cb09968d29664baa7563382d524446e5e65845
1 /*
2 * netsniff-ng - the packet sniffing beast
3 * Copyright 2009, 2010 Daniel Borkmann.
4 * Subject to the GPL, version 2.
5 */
7 #include <stdio.h>
8 #include <string.h>
9 #include <stdarg.h>
11 #include "str.h"
12 #include "die.h"
13 #include "xmalloc.h"
15 size_t strlcpy(char *dest, const char *src, size_t size)
17 size_t ret = strlen(src);
19 if (size) {
20 size_t len = (ret >= size) ? size - 1 : ret;
22 memcpy(dest, src, len);
23 dest[len] = '\0';
26 return ret;
29 static inline int vslprintf(char *dst, size_t size, const char *fmt, va_list ap)
31 int ret;
33 ret = vsnprintf(dst, size, fmt, ap);
34 dst[size - 1] = '\0';
36 return ret;
39 int slprintf(char *dst, size_t size, const char *fmt, ...)
41 int ret;
42 va_list ap;
44 va_start(ap, fmt);
45 ret = vslprintf(dst, size, fmt, ap);
46 va_end(ap);
48 return ret;
51 int slprintf_nocheck(char *dst, size_t size, const char *fmt, ...)
53 int ret;
54 va_list ap;
56 va_start(ap, fmt);
57 ret = vslprintf(dst, size, fmt, ap);
58 va_end(ap);
60 return ret;
63 noinline void *xmemset(void *s, int c, size_t n)
65 size_t i;
66 uint8_t *ptr = s;
68 for (i = 0; i < n; ++i)
69 ptr[i] = (uint8_t) c;
71 return ptr;
74 char *strtrim_right(char *p, char c)
76 char *end;
77 size_t len;
79 len = strlen(p);
80 while (*p && len) {
81 end = p + len - 1;
82 if (c == *end)
83 *end = 0;
84 else
85 break;
86 len = strlen(p);
89 return p;
92 char *argv2str(int startind, int argc, char **argv)
94 off_t offset = 0;
95 char *str = NULL;
96 int ret, i;
98 for (i = startind; i < argc; ++i) {
99 size_t alen = strlen(argv[i]) + 2;
100 size_t slen = str ? strlen(str) : 0;
102 str = xrealloc(str, slen + alen);
103 ret = slprintf(str + offset, strlen(argv[i]) + 2, "%s ", argv[i]);
104 if (ret < 0)
105 panic("Cannot concatenate string!\n");
106 else
107 offset += ret;
110 return str;