85 lines
1.7 KiB
C++
85 lines
1.7 KiB
C++
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include <stdint.h>
|
|
#include <assert.h>
|
|
|
|
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;
|
|
}
|