#ifndef LIBA_STR_H
#define LIBA_STR_H
#include "a.h"
#include <stdarg.h>
#include <string.h>
#define A_STR_INIT {A_NULL, 0, 0}
typedef struct a_str
{
char *ptr_;
a_size num_;
a_size mem_;
} a_str;
A_INTERN char *a_str_ptr(a_str const *ctx) { return ctx->ptr_; }
A_INTERN a_size a_str_len(a_str const *ctx) { return ctx->num_; }
A_INTERN a_size a_str_mem(a_str const *ctx) { return ctx->mem_; }
A_INTERN char a_str_at_(a_str const *ctx, a_size idx) { return ctx->ptr_[idx]; }
A_INTERN char a_str_at(a_str const *ctx, a_size idx)
{
return idx < ctx->num_ ? ctx->ptr_[idx] : 0;
}
A_INTERN char a_str_idx(a_str const *ctx, a_diff idx)
{
a_size const num = idx >= 0 ? a_size_c(idx) : a_size_c(idx) + ctx->num_;
return num < ctx->num_ ? ctx->ptr_[num] : 0;
}
A_INTERN void a_str_setlen_(a_str *ctx, a_size num) { ctx->num_ = num; }
A_INTERN int a_str_setlen(a_str *ctx, a_size num)
{
return num < ctx->mem_ ? ((void)(ctx->num_ = num), A_SUCCESS) : A_FAILURE;
}
A_INTERN void a_str_drop(a_str *ctx) { ctx->num_ = 0; }
#if defined(__cplusplus)
extern "C" {
#endif
A_EXTERN a_str *a_str_new(void);
A_EXTERN void a_str_die(a_str *ctx);
A_EXTERN void a_str_ctor(a_str *ctx);
A_EXTERN void a_str_dtor(a_str *ctx);
A_EXTERN int a_str_copy(a_str *ctx, a_str const *obj);
A_EXTERN void a_str_move(a_str *ctx, a_str *obj);
A_EXTERN char *a_str_exit(a_str *ctx);
A_EXTERN int a_str_alloc(a_str *ctx, a_size mem);
A_EXTERN int a_str_alloc_(a_str *ctx, a_size mem);
A_EXTERN int a_str_cmp_(void const *p0, a_size n0, void const *p1, a_size n1);
A_EXTERN int a_str_cmp(a_str const *lhs, a_str const *rhs);
A_EXTERN int a_str_cmpn(a_str const *ctx, void const *pdata, a_size nbyte);
A_EXTERN int a_str_cmps(a_str const *ctx, void const *str);
A_EXTERN int a_str_getc(a_str *ctx);
A_EXTERN int a_str_getc_(a_str *ctx);
A_EXTERN int a_str_putc(a_str *ctx, int c);
A_EXTERN int a_str_putc_(a_str *ctx, int c);
A_EXTERN a_size a_str_getn(a_str *ctx, void *pdata, a_size nbyte);
A_EXTERN a_size a_str_getn_(a_str *ctx, void *pdata, a_size nbyte);
A_EXTERN int a_str_setn(a_str *ctx, void const *pdata, a_size nbyte);
A_EXTERN int a_str_setn_(a_str *ctx, void const *pdata, a_size nbyte);
A_EXTERN int a_str_putn(a_str *ctx, void const *pdata, a_size nbyte);
A_EXTERN int a_str_putn_(a_str *ctx, void const *pdata, a_size nbyte);
A_EXTERN int a_str_sets(a_str *ctx, void const *str);
A_EXTERN int a_str_sets_(a_str *ctx, void const *str);
A_EXTERN int a_str_puts(a_str *ctx, void const *str);
A_EXTERN int a_str_puts_(a_str *ctx, void const *str);
A_EXTERN A_FORMAT(__printf__, 2, 0) int a_str_setv(a_str *ctx, char const *fmt, va_list va);
A_EXTERN A_FORMAT(__printf__, 2, 0) int a_str_putv(a_str *ctx, char const *fmt, va_list va);
A_EXTERN A_FORMAT(__printf__, 2, 3) int a_str_setf(a_str *ctx, char const *fmt, ...);
A_EXTERN A_FORMAT(__printf__, 2, 3) int a_str_putf(a_str *ctx, char const *fmt, ...);
A_EXTERN int a_str_set(a_str *ctx, a_str const *obj);
A_EXTERN int a_str_set_(a_str *ctx, a_str const *obj);
A_EXTERN int a_str_put(a_str *ctx, a_str const *obj);
A_EXTERN int a_str_put_(a_str *ctx, a_str const *obj);
A_EXTERN a_size a_str_utflen(a_str const *ctx);
#if defined(__cplusplus)
}
#endif
#endif