#ifndef STRINGS_H #define STRINGS_H #define str8_lit(s) str8((U8 *)(s), sizeof(s)-1) String8 str8(U8 *str, U64 size) { String8 result = { str, size }; return(result); } B32 str8_char_is_slash(U8 c) { return((c == '/') || (c == '\\')); } U8 str8_char_uppercase(U8 c) { if (c >= 'a' && c <= 'z') { c += 'A'-'a'; } return(c); } U8 str8_char_lowercase(U8 c) { if (c >= 'A' && c <= 'Z') { c -= 'A'-'a'; } return(c); } String8 str8_range(U8 *first, U8 *second) { String8 result = { first, (U64)(second-first) }; return(result); } String8 str8_cstring(U8 *cstr) { U8 *ptr = cstr; for (; *ptr != 0; ++ptr); String8 result = str8_range(cstr, ptr); return(result); } String8 str8_prefix(String8 str, U64 size) { U64 clamped = ClampTop(size, str.size); String8 result = { str.str, clamped }; return(result); } String8 str8_chop(String8 str, U64 amount) { U64 clamped = ClampTop(amount, str.size); U64 remaining = str.size-clamped; String8 result = { str.str, remaining }; return(result); } String8 str8_posfix(String8 str, U64 size) { U64 clamped = ClampTop(size, str.size); U64 skip = str.size-clamped; String8 result = { str.str+skip, clamped }; return(result); } String8 str8_skip(String8 str, U64 amount) { U64 clamped = ClampTop(amount, str.size); String8 result = { str.str+clamped, str.size-clamped }; return(result); } String8 str8_substr_pos(String8 str, U64 start, U64 end) { U64 start_clamped = ClampTop(start, str.size); U64 end_clamped = ClampTop(end, str.size); String8 result = { str.str+start_clamped, end_clamped-start_clamped }; return(result); } String8 str8_substr_size(String8 str, U64 start, U64 size) { String8 result = str8_substr_pos(str, start, start+size); return(result); } #endif /* STRINGS_H */