#include #include #include #include static const uint8_t s_base16_dec[256] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 0, 0, 0, 0, 0, /* 0 - 9 */ 0,10,11,12,13,14,15, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* A - F */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,10,11,12,13,14,15, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* a - f */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; size_t hls_base16_decode(void* target, const char* source, size_t bytes) { size_t i; uint8_t* p; p = (uint8_t*)target; assert(0 == bytes % 2); for (i = 0; i < bytes / 2; i++) { p[i] = s_base16_dec[(unsigned char)source[i * 2]] << 4; p[i] |= s_base16_dec[(unsigned char)source[i * 2 + 1]]; } return i; } const char* hls_strtrim(const char* s, size_t* n, const char* prefix, const char* suffix) { while (s && *n > 0 && prefix && strchr(prefix, *s)) { --* n; ++s; } while (s && *n > 0 && suffix && strchr(suffix, s[*n - 1])) --* n; return s; }; size_t hls_strsplit(const char* ptr, const char* end, const char* delimiters, const char* quotes, const char** ppnext) { char q; const char* p; assert(end && delimiters); q = 0; for (p = ptr; p && *p && p < end; p++) { if (q) { // find QUOTES first if (q == *p) { q = 0; continue; } } else { if (strchr(delimiters, *p)) { break; } else if (quotes && strchr(quotes, *p)) { q = *p; } } } if (ppnext) { *ppnext = p; while (*ppnext && *ppnext < end && strchr(delimiters, **ppnext)) ++* ppnext; } return p - ptr; }