return s;
}
-char *strncpyz(char *dest, const char *src, size_t n)
-{
- char *p = dest;
+char *strncpyz(char *dst, const char *src, size_t n) {
+ char *p = dst;
+
+ while(*src && n--)
+ *dst++ = *src++;
- while (*src && n--)
- *dest++ = *src++;
- *dest = '\0';
+ *dst = '\0';
return p;
}
-int vsnprintfz(char *sout, size_t n, const char *fmt, va_list args)
-{
+int vsnprintfz(char *dst, size_t n, const char *fmt, va_list args) {
int size;
- size = vsnprintf(sout, n, fmt, args);
- sout[size] = '\0';
- return size;
+ size = vsnprintf(dst, n, fmt, args);
+
+ if(unlikely((size_t)size > n)) {
+ // there is bug in vsnprintf() and it returns
+ // a number higher to len, but it does not
+ // overflow the buffer.
+ size = n;
+ }
+
+ dst[size] = '\0';
+ return size;
}
-int snprintfz(char *sout, size_t n, const char *fmt, ...)
-{
+int snprintfz(char *dst, size_t n, const char *fmt, ...) {
va_list args;
va_start(args, fmt);
- return vsnprintfz(sout, n, fmt, args);
- // args will vanish!
+ return vsnprintfz(dst, n, fmt, args);
+ va_end(args);
}
extern void strreverse(char* begin, char* end);
extern char *mystrsep(char **ptr, char *s);
extern char *trim(char *s);
-extern char *strncpyz(char *dest, const char *src, size_t n);
-extern int vsnprintfz(char *sout, size_t n, const char *fmt, va_list args);
-extern int snprintfz(char *sout, size_t n, const char *fmt, ...);
+
+extern char *strncpyz(char *dst, const char *src, size_t n);
+extern int vsnprintfz(char *dst, size_t n, const char *fmt, va_list args);
+extern int snprintfz(char *dst, size_t n, const char *fmt, ...);
extern void *mymmap(const char *filename, size_t size, int flags, int ksm);
extern int savememory(const char *filename, void *mem, unsigned long size);
buffer_need_bytes(wb, 1);
- char *s = &wb->buffer[wb->len], *end = &wb->buffer[wb->size];
+ char *s = &wb->buffer[wb->len], *start, *end = &wb->buffer[wb->size];
long len = wb->len;
- while(*txt && s != end) {
+ start = s;
+ while(*txt && s != end)
*s++ = *txt++;
- len++;
- }
+
+ len += s - start;
wb->len = len;
buffer_overflow_check(wb);
{
if(unlikely(!fmt || !*fmt)) return;
- buffer_need_bytes(wb, len+1);
+ buffer_need_bytes(wb, len + 1);
va_list args;
va_start(args, fmt);
{
if(unlikely(!fmt || !*fmt)) return;
- buffer_need_bytes(wb, 1);
+ buffer_need_bytes(wb, 2);
- size_t len = wb->size - wb->len;
+ size_t len = wb->size - wb->len - 1;
wb->len += vsnprintfz(&wb->buffer[wb->len], len, fmt, args);
{
if(unlikely(!fmt || !*fmt)) return;
- buffer_need_bytes(wb, 1);
+ buffer_need_bytes(wb, 2);
- size_t len = wb->size - wb->len, wrote;
+ size_t len = wb->size - wb->len - 1;
+ size_t wrote;
va_list args;
va_start(args, fmt);
#define buffer_need_bytes(buffer, needed_free_size) do { if(unlikely((buffer)->size - (buffer)->len < (size_t)(needed_free_size))) buffer_increase((buffer), (size_t)(needed_free_size)); } while(0)
-#define buffer_flush(wb) wb->buffer[wb->len = 0] = '\0'
+#define buffer_flush(wb) wb->buffer[(wb)->len = 0] = '\0'
extern void buffer_reset(BUFFER *wb);
extern void buffer_strcat(BUFFER *wb, const char *txt);
/* avoid "address already in use" */
setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (void*)&sockopt, sizeof(sockopt));
- struct sockaddr_in name = { .sin_family = AF_INET, .sin_port = htons(port) };
+ struct sockaddr_in name;
+ memset(&name, 0, sizeof(struct sockaddr_in));
+ name.sin_family = AF_INET;
+ name.sin_port = htons (port);
if(is_ip_anything(ip)) {
name.sin_addr.s_addr = htonl(INADDR_ANY);
/* avoid "address already in use" */
setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (void*)&sockopt, sizeof(sockopt));
- struct sockaddr_in6 name = { .sin6_family = AF_INET6, .sin6_port = htons((uint16_t)port) };
+ struct sockaddr_in6 name;
+ memset(&name, 0, sizeof(struct sockaddr_in6));
+ name.sin6_family = AF_INET6;
+ name.sin6_port = htons ((uint16_t) port);
if(is_ip_anything(ip)) {
name.sin6_addr = in6addr_any;