/**
* ======================== legal notice ======================
*
* File: util.cc
* Created: 4. Juli 2012, 05
* Author: Geronimo
* Project: libutil - base classes used by other libraries
*
* CMP - compound media player
*
* is a client/server mediaplayer intended to play any media from any workstation
* without the need to export or mount shares. cmps is an easy to use backend
* with a (ready to use) HTML-interface. Additionally the backend supports
* authentication via HTTP-digest authorization.
* cmpc is a client with vdr-like osd-menues.
*
* Copyright (c) 2012 Reinhard Mantey, some rights reserved!
* published under Creative Commons by-sa
* For details see http://creativecommons.org/licenses/by-sa/3.0/
*
* The cmp project's homepage is at http://projects.vdr-developer.org/projects/cmp
*
* --------------------------------------------------------------
*/
#include
#include
#include
const char * skipWhitespace(const char *Buffer)
{
while (*Buffer && isspace(*Buffer)) ++Buffer;
return Buffer;
}
const char *getWord(char *buf, int bufSize, const char *src)
{
const char *s = src;
char *d = buf;
if (!strncmp(src, "\n\n", 2) || !strncmp(src, "\r\n\r\n", 4))
return src;
while (*s && isspace(*s)) ++s;
while (*s && ((d - buf) < bufSize) && !isspace(*s)) *d++ = *s++;
*d = 0;
return *s ? s : NULL;
}
const char *restOfLine(char *buf, int bufSize, const char *src)
{
const char *s = src;
char *d = buf;
while (*s && isspace(*s)) ++s;
while (*s && ((d - buf) < bufSize) && *s != '\n' && *s != '\r') *d++ = *s++;
*d = 0;
return *s ? s : NULL;
}
double parseAspect(const std::string &input, const char **next)
{
return parseAspect(input.c_str(), next);
}
double parseAspect(const char *input, const char **next)
{
enum { Double, TwoInt, OneInt } mode = OneInt;
char buf[32];
char *pd, *pmd, *nextBuf;
const char *ps, *pms;
for (pd = buf, pmd = buf + sizeof(buf) - 1, ps=input, pms = input + strlen(input); ps < pms && pd < pmd; ++ps) {
switch (*ps) {
case ' ':
case '\t':
continue;
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
*pd++ = *ps;
break;
case '.':
mode = Double;
pms = ps;
break;
case ':':
mode = TwoInt;
pms = ps;
break;
default:
pms = --ps;
break;
}
}
*pd = 0;
if (mode == OneInt) {
if (next) *next = ps;
return strtod(buf, NULL);
}
nextBuf = mode == TwoInt ? pd + 1 : pd;
for (pd = nextBuf; ps < pms && pd < pmd; ++ps) {
switch (*ps) {
case ' ':
case '\t':
continue;
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
*pd++ = *ps;
break;
case '.':
mode = Double;
pms = ps;
break;
case ':':
mode = TwoInt;
pms = ps;
break;
default:
pms = --ps;
break;
}
}
*pd = 0;
if (next) *next = ps;
if (mode == Double) return strtod(buf, NULL);
long a = atol(buf);
long b = atol(nextBuf);
return (double)a / (double)b;
}
long parseInt(const std::string &input, const char **next)
{
return parseInt(input.c_str(), next);
}
long parseInt(const char *input, const char **next)
{
char buf[32];
char *pd, *pmd;
const char *ps, *pms;
for (pd = buf, pmd = buf + sizeof(buf) - 1, ps=input, pms = input + strlen(input); ps < pms && pd < pmd; ++ps) {
switch (*ps) {
case ' ':
case '\t':
continue;
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
*pd++ = *ps;
break;
default:
pms = --ps;
break;
}
}
*pd = 0;
if (next) *next = ps;
return atol(buf);
}