summaryrefslogtreecommitdiff
path: root/rb_str.h
blob: bebca5e97a8eff8a4190f184433e6367720d66b7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#ifndef RB_STR_H
#define RB_STR_H

#include <string.h>
#include <stdarg.h>

#include "rb.h"

/*
 * locate in the ring buffer pointed to by rb the first string ending by the
 * string pointed to by string and return it. the string returned is
 * allocated using malloc and should be freed by the developer.
 * if no such delimiter can be found, NULL is returned and the ring buffer
 * is left unmodified. Otherwise, the string is removed from it.
 * nb: the delimiter is discarded in the returned string
 *
 * common use case:
 *      request = rb_gets(rb, "\r\n")
 */
char *rb_gets(rb_t *rb, const char *delim);

/*
 * same as the above function but takes a null terminated array of delimiters
 * the function will return the shortest string matching the criteria.
 * if two or more delimiters are found at the same place in the ring buffer,
 * the longest will be discarded
 *
 * common use case:
 *      request = rb_gets(rb, (const char *[]){"\n", "\r", "\r\n", NULL})
 *  which will return a request disregarding whether netcat or telnet is used
 */
char *rb_gets2(rb_t *rb, const char *const *delim);

/*
 * this functions writes str to the ring buffer pointed by rb. If the ring
 * buffer is not large enough to contain all the data, the beginning will be
 * overriden. However, a buffer overflow is not susceptible to happen.
 */
static inline rb_t *rb_puts(rb_t *rb, const char *str)
{
    return rb_put(rb, str, strlen(str));
}

rb_t *rb_vprintf(rb_t *rb, const char *fmt, va_list list);

/*
 * function which behaves like sprintf but which writes into a ring buffer
 * if the ring buffer is not large enough to contain all the data,
 * the beginning will be overriden. However, a buffer overflow will not occur
 */
    __attribute__((format(printf, 2, 3)))
rb_t *rb_printf(rb_t *rb, const char *fmt, ...);

#endif /* RB_STR_H */