#ifndef _NONZSTRING_H
#define _NONZSTRING_H
/* nonzstring.h */
/*****************************************************************************/
/* SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only                     */
/*                                                                           */
/* AS-Port                                                                   */
/*                                                                           */
/* Handling of strings without NUL termination                               */
/*                                                                           */
/*****************************************************************************/

#include <stddef.h>

struct as_nonz_dynstr
{
  size_t len, capacity;
  char *p_str;
};
typedef struct as_nonz_dynstr as_nonz_dynstr_t;

#define as_nonz_dynstr_roundup_len(len)  \
        (((len) + 127) & ~127)

extern void as_nonz_dynstr_ini(as_nonz_dynstr_t *p_str, size_t ini_capacity);

extern void as_nonz_dynstr_ini_c_str(as_nonz_dynstr_t *p_str, const char *p_src);

extern void as_nonz_dynstr_realloc(as_nonz_dynstr_t *p_str, size_t new_capacity);

extern void as_nonz_dynstr_free(as_nonz_dynstr_t *p_str);

extern size_t as_nonz_dynstr_to_c_str(char *p_dest, const as_nonz_dynstr_t *p_src, size_t dest_len);

extern size_t as_nonz_dynstr_copy(as_nonz_dynstr_t *p_dest, const as_nonz_dynstr_t *p_src);

extern void as_nonz_dynstr_swap(as_nonz_dynstr_t *p_str1, as_nonz_dynstr_t *p_str2);

extern size_t as_nonz_dynstr_append_char(as_nonz_dynstr_t *p_dest, char src);

extern size_t as_nonz_dynstr_append_raw(as_nonz_dynstr_t *p_dest, const char *p_src, int src_len); /* -1 -> strlen */

extern size_t as_nonz_dynstr_copy_c_str(as_nonz_dynstr_t *p_dest, const char *p_src);

extern size_t as_nonz_dynstr_append(as_nonz_dynstr_t *p_dest, const as_nonz_dynstr_t *p_src);

extern int as_nonz_dynstr_cmp(const as_nonz_dynstr_t *p_str1, const as_nonz_dynstr_t *p_str2);

extern int as_nonz_dynstr_find(const as_nonz_dynstr_t *p_haystack, const as_nonz_dynstr_t *p_needle);

extern void as_nonz_dynstr_dump_hex(FILE *p_file, const as_nonz_dynstr_t *p_str);

#endif /* _NONZSTRING_H */
