/* NOTE(pryazha): Null-terminated strings */ /* TODO(pryazha): Move to another file specific to OS you're in */ void sys_vprintf(const char *fmt, va_list args) { vprintf(fmt, args); } void sys_printf(const char *fmt, ...) { va_list args; va_start(args, fmt); sys_vprintf(fmt, args); va_end(args); } /* NOTE(pryazha): Fixed-length strings */ FLS fls(U8 *p, U64 len) { FLS r; r.p = p; r.len = len; return r; } FLS flsfromcstr(const char *cstr) { U8 *p; FLS r; p = (U8 *)cstr; for (; *p; ++p); r = flsrange((U8 *)cstr, p); return r; } char *flstocstr(Arena *a, FLS s) { U64 len; char *cstr; len = s.len+1; cstr = push_arena(a, len*sizeof(U8)); MEMCPY(cstr, s.p, len*sizeof(U8)); *(cstr+s.len) = 0; return cstr; } FLS flsrange(U8 *st_arenat, U8 *end) { FLS r; r.p = st_arenat; r.len = end-st_arenat; return r; } FLS flschopend(FLS s, U64 cnt) { U64 len; FLS r; len = s.len-CLAMPTOP(cnt, s.len); r = fls(s.p, len); return r; } FLS flschopstart(FLS s, U64 cnt) { U64 clamped, len; FLS r; clamped = CLAMPTOP(cnt, s.len); len = s.len-CLAMPTOP(cnt, s.len); r = fls(s.p+clamped, len); return r; } FLS flspushfv(Arena *a, const char *fmt, va_list args) { ASSERT(a); char tmp[1024]; S32 n; FLS r; n = vsnprintf(tmp, 1024, fmt, args); MEM0(&r, sizeof(FLS)); if (n > 0) { r.p = push_arena(a, n); MEMCPY(r.p, tmp, n); r.len = n; } return r; } FLS flspushf(Arena *a, const char *fmt, ...) { va_list args; FLS r; va_start(args, fmt); r = flspushfv(a, fmt, args); va_end(args); return r; } void flsprint(FLS s) { ASSERT(s.p); ASSERT(s.len); fwrite(s.p, sizeof(U8), s.len, stdout); } FLSList *flslist(Arena *a) { FLSList *l; l = push_arena(a, sizeof(FLSList)); MEM0(l, sizeof(FLSList)); return l; } void flslistpush(Arena *a, FLSList *l, FLS s, B32 front) { ASSERT(a); ASSERT(l); FLSNode *n; n = push_arena(a, sizeof(FLSNode)); n->str = s; if (front) DLLPUSHFRONT(l->first, l->last, n); else DLLPUSHBACK(l->first, l->last, n); l->len += s.len; l->ncnt++; } void flslistpushf(Arena *a, FLSList *l, B32 front, const char *fmt, ...) { va_list args; FLS str; va_start(args, fmt); str = flspushfv(a, fmt, args); va_end(args); flslistpush(a, l, str, front); } void flslistprint(FLSList *l) { FLSNode *n; for (n = l->first; n; n = n->next) flsprint(n->str); }