133 lines
4.2 KiB
C
133 lines
4.2 KiB
C
//#define GRAIN_SIZE 0x1000 /* must be power of 2 */
|
|
//#define AKBUF_CTX_HASH_SIZE 0x400000 /* must be power of 2 */
|
|
#define GRAIN_SIZE 0x100
|
|
#define AKBUF_CTX_HASH_SIZE 0x40000
|
|
|
|
#define AKsize_t size_t
|
|
#define AKssize_t ssize_t
|
|
|
|
#define AKbuf_PANIC(f...) akbuf_panic(__FILE__, __LINE__, NULL, 0, ##f)
|
|
#define AKbuf_PANIC_FROM(f...) akbuf_panic(__FILE__, __LINE__, from_file, from_line, ##f)
|
|
#define AKbuf_ASSERT(cond) if (!(cond)) akbuf_panic(__FILE__, __LINE__, NULL, 0, "Assertion (" __STRING(cond) ") failed")
|
|
#ifdef AKBUF_DEBUG
|
|
#define AKbuf_dASSERT(cond) AKbuf_ASSERT(cond)
|
|
#else
|
|
#define AKbuf_dASSERT(cond)
|
|
#endif
|
|
|
|
#define AKfree(ptr) if ((ptr) != NULL) { free(ptr); (ptr) = NULL; }
|
|
|
|
typedef unsigned int akbuf_ctxh;
|
|
|
|
#define AKbuf_INVALID_CTX ((akbuf_ctxh)-1)
|
|
|
|
typedef struct akbuf_s akbuf;
|
|
typedef struct akbuf_ctx_s akbuf_ctx;
|
|
|
|
struct akbuf_s
|
|
{
|
|
unsigned int in_use;
|
|
akbuf *prev;
|
|
akbuf *next;
|
|
unsigned int idx;
|
|
AKsize_t size;
|
|
unsigned char *head;
|
|
};
|
|
|
|
struct akbuf_ctx_s
|
|
{
|
|
akbuf_ctxh hnd;
|
|
akbuf *head;
|
|
akbuf_ctx *prev;
|
|
akbuf_ctx *next;
|
|
};
|
|
|
|
typedef struct akbuf_table_s akbuf_table;
|
|
typedef struct akbuf_table_entry_s akbuf_table_entry;
|
|
|
|
struct akbuf_table_s
|
|
{
|
|
akbuf_ctxh ctxh;
|
|
unsigned int type;
|
|
akbuf_table_entry *head;
|
|
akbuf_table_entry *tail;
|
|
};
|
|
|
|
struct akbuf_table_entry_s
|
|
{
|
|
akbuf *key;
|
|
akbuf *data;
|
|
akbuf_table_entry *prev;
|
|
akbuf_table_entry *next;
|
|
};
|
|
|
|
enum { AKBUF_TABLE_NOCASE, AKBUF_TABLE_CASE, AKBUF_TABLE_BIN };
|
|
|
|
void akbuf_panic(unsigned char *, unsigned int, unsigned char *, unsigned int, unsigned char *, ...);
|
|
akbuf_ctxh akbuf_new_ctx(void);
|
|
void akbuf_free(akbuf_ctxh, akbuf *);
|
|
void _akbuf_free_ctx(akbuf_ctxh, unsigned char *, unsigned int);
|
|
void akbuf_consume(akbuf *, AKsize_t);
|
|
unsigned char akbuf_eat_byte(akbuf *);
|
|
int akbuf_chr(akbuf *, unsigned char);
|
|
void akbuf_asciiz(akbuf *);
|
|
|
|
akbuf *akbuf_init(akbuf_ctxh, AKsize_t);
|
|
void akbuf_set_size(akbuf *, AKsize_t);
|
|
void akbuf_set_data(akbuf *, unsigned char *, AKsize_t);
|
|
void akbuf_append_data(akbuf *, unsigned char *, AKsize_t);
|
|
void akbuf_append_byte(akbuf *, unsigned char);
|
|
void akbuf_vsprintf(akbuf *, unsigned char *, va_list);
|
|
void akbuf_sprintf(akbuf *, unsigned char *, ...);
|
|
void akbuf_appendf(akbuf *, unsigned char *, ...);
|
|
|
|
akbuf_table *akbuf_table_init(akbuf_ctxh, unsigned int);
|
|
akbuf_table_entry *akbuf_table_entry_add(akbuf_ctxh, akbuf_table *, unsigned char *, akbuf *);
|
|
akbuf_table_entry *akbuf_table_entry_add_buf(akbuf_ctxh, akbuf_table *, akbuf *, akbuf *);
|
|
akbuf_table_entry *akbuf_table_entry_add_str(akbuf_ctxh, akbuf_table *, unsigned char *, unsigned char *);
|
|
akbuf_table_entry *akbuf_table_entry_find(akbuf_table *, unsigned char *);
|
|
akbuf *akbuf_table_entry_get(akbuf_table *, unsigned char *);
|
|
unsigned char *akbuf_table_entry_get_str(akbuf_table *, unsigned char *);
|
|
|
|
void akbuf_urlencode_data(unsigned char *, AKsize_t, akbuf *);
|
|
void akbuf_base64encode_data(unsigned char *, AKsize_t, akbuf *);
|
|
|
|
#define akbuf_free_ctx(ctx) _akbuf_free_ctx((ctx), __FILE__, __LINE__)
|
|
#define akbuf_idx(buf) ((buf)->idx)
|
|
#define akbuf_size(buf) ((buf)->size)
|
|
#define akbuf_data(buf) ((buf)->head)
|
|
#define akbuf_empty(buf) (akbuf_idx(buf) == 0)
|
|
|
|
#define akbuf_strcpy(buf, str) akbuf_set_data((buf), (str), strlen(str))
|
|
#define akbuf_append_str(buf, str) akbuf_append_data((buf), (str), strlen(str))
|
|
#define akbuf_clone(buf, src) akbuf_set_data((buf), akbuf_data(src), akbuf_idx(src))
|
|
#define akbuf_append_buf(buf, src) akbuf_append_data((buf), akbuf_data(src), akbuf_idx(src))
|
|
|
|
#define akbuf_urlencode(buf, out) akbuf_urlencode(akbuf_data(buf), akbuf_idx(buf), (out))
|
|
|
|
#define akbuf_split(buf, dest, idx)\
|
|
{\
|
|
akbuf_set_data((dest), akbuf_data((buf)), (idx));\
|
|
akbuf_consume((buf), (idx) + 1);\
|
|
}
|
|
|
|
#define akbuf_set_byte(buf, idx, byte)\
|
|
{\
|
|
AKbuf_ASSERT((unsigned int)(idx) < akbuf_idx(buf) && (unsigned int)(idx) < akbuf_size(buf));\
|
|
*(akbuf_data(buf) + (idx)) = (byte);\
|
|
}
|
|
#define akbuf_consume_end(buf, len)\
|
|
{\
|
|
AKbuf_ASSERT((unsigned int)(len) <= akbuf_idx(buf));\
|
|
akbuf_idx(buf) -= (len);\
|
|
}
|
|
#define akbuf_set_idx(buf, idx)\
|
|
{\
|
|
AKbuf_ASSERT((unsigned int)(idx) <= akbuf_size(buf));\
|
|
akbuf_idx(buf) = (idx);\
|
|
}
|
|
#define akbuf_get_byte(buf, idx, byte)\
|
|
{\
|
|
AKbuf_ASSERT((unsigned int)(idx) < akbuf_idx(buf));\
|
|
(byte) = *(akbuf_data(buf) + (idx));\
|
|
}
|