/* * LibHTP (http://www.libhtp.org) * Copyright 2009,2010 Ivan Ristic * * LibHTP is an open source product, released under terms of the General Public Licence * version 2 (GPLv2). Please refer to the file LICENSE, which contains the complete text * of the license. * * In addition, there is a special exception that allows LibHTP to be freely * used with any OSI-approved open source licence. Please refer to the file * LIBHTP_LICENSING_EXCEPTION for the full text of the exception. * */ #ifndef _BSTR_H #define _BSTR_H #include #include #include // IMPORTANT This binary string library is used internally by the parser and you should // not rely on it in your code. The implementation may change. // // TODO // - Add a function that wraps an existing data // - Support Unicode bstrings typedef void * bstr; bstr *bstr_alloc(size_t newsize); void bstr_free(bstr *s); bstr *bstr_expand(bstr *s, size_t newsize); bstr *bstr_cstrdup(char *); bstr *bstr_memdup(char *data, size_t len); bstr *bstr_strdup(bstr *b); bstr *bstr_strdup_ex(bstr *b, size_t offset, size_t len); char *bstr_tocstr(bstr *); int bstr_chr(bstr *, int); int bstr_rchr(bstr *, int); int bstr_cmpc(bstr *, char *); int bstr_cmp(bstr *, bstr *); bstr *bstr_dup_lower(bstr *); bstr *bstr_tolowercase(bstr *); bstr *bstr_add_mem(bstr *, char *, size_t); bstr *bstr_add_str(bstr *, bstr *); bstr *bstr_add_cstr(bstr *, char *); bstr *bstr_add_mem_noex(bstr *, char *, size_t); bstr *bstr_add_str_noex(bstr *, bstr *); bstr *bstr_add_cstr_noex(bstr *, char *); int bstr_util_memtoip(char *data, size_t len, int base, size_t *lastlen); char *bstr_memtocstr(char *data, size_t len); int bstr_indexof(bstr *haystack, bstr *needle); int bstr_indexofc(bstr *haystack, char *needle); int bstr_indexof_nocase(bstr *haystack, bstr *needle); int bstr_indexofc_nocase(bstr *haystack, char *needle); int bstr_indexofmem(bstr *haystack, char *data, size_t len); int bstr_indexofmem_nocase(bstr *haystack, char *data, size_t len); void bstr_chop(bstr *b); void bstr_len_adjust(bstr *s, size_t newlen); char bstr_char_at(bstr *s, size_t pos); typedef struct bstr_t bstr_t; struct bstr_t { /** The length of the string stored in the buffer. */ size_t len; /** The current size of the buffer. If the buffer is bigger than the * string then it will be able to expand without having to reallocate. */ size_t size; /** Optional buffer pointer. If this pointer is NUL (as it currently is * in virtually all cases, the string buffer will immediatelly follow * this structure. If the pointer is not NUL, it points to the actual * buffer used, and there's no data following this structure. */ char *ptr; }; #define bstr_len(X) ((*(bstr_t *)(X)).len) #define bstr_size(X) ((*(bstr_t *)(X)).size) #define bstr_ptr(X) ( ((*(bstr_t *)(X)).ptr == NULL) ? (char *)((char *)(X) + sizeof(bstr_t)) : (char *)(*(bstr_t *)(X)).ptr ) #endif /* _BSTR_H */