mirror of
https://github.com/tuxbox-neutrino/neutrino.git
synced 2025-08-26 23:13:13 +02:00
git-svn-id: file:///home/bas/coolstream_public_svn/THIRDPARTY/applications/neutrino-experimental@104 e54a6e83-5905-42d5-8d5c-058d10e6a962
194 lines
5.1 KiB
C++
194 lines
5.1 KiB
C++
/*
|
|
* tools.h: Various tools
|
|
*
|
|
* See the main source file 'vdr.c' for copyright information and
|
|
* how to reach the author.
|
|
*
|
|
* $Id: tools.h,v 1.1 2009/02/23 19:46:44 rhabarber1848 Exp $
|
|
*/
|
|
|
|
#ifndef __TOOLS_H
|
|
#define __TOOLS_H
|
|
|
|
#include <dirent.h>
|
|
#include <errno.h>
|
|
#include <fcntl.h>
|
|
#include <iconv.h>
|
|
#include <poll.h>
|
|
#include <stddef.h>
|
|
#include <stdint.h>
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include <syslog.h>
|
|
#include <sys/stat.h>
|
|
#include <sys/types.h>
|
|
|
|
typedef unsigned char uchar;
|
|
|
|
extern int SysLogLevel;
|
|
|
|
#if 0
|
|
#define esyslog(a...) void( (SysLogLevel > 0) ? syslog_with_tid(LOG_ERR, a) : void() )
|
|
#define isyslog(a...) void( (SysLogLevel > 1) ? syslog_with_tid(LOG_ERR, a) : void() )
|
|
#define dsyslog(a...) void( (SysLogLevel > 2) ? syslog_with_tid(LOG_ERR, a) : void() )
|
|
#else
|
|
#define esyslog printf
|
|
#define isyslog printf
|
|
#define dsyslog printf
|
|
#endif
|
|
|
|
#define LOG_ERROR esyslog("ERROR (%s,%d): %m", __FILE__, __LINE__)
|
|
#define LOG_ERROR_STR(s) esyslog("ERROR: %s: %m", s)
|
|
|
|
#define SECSINDAY 86400
|
|
|
|
#define KILOBYTE(n) ((n) * 1024)
|
|
#define MEGABYTE(n) ((n) * 1024 * 1024)
|
|
|
|
#define MALLOC(type, size) (type *)malloc(sizeof(type) * (size))
|
|
|
|
#define DELETENULL(p) (delete (p), p = NULL)
|
|
|
|
#define CHECK(s) { if ((s) < 0) LOG_ERROR; } // used for 'ioctl()' calls
|
|
#define FATALERRNO (errno && errno != EAGAIN && errno != EINTR)
|
|
|
|
#ifndef __STL_CONFIG_H // in case some plugin needs to use the STL
|
|
template<class T> inline T min(T a, T b) { return a <= b ? a : b; }
|
|
template<class T> inline T max(T a, T b) { return a >= b ? a : b; }
|
|
template<class T> inline int sgn(T a) { return a < 0 ? -1 : a > 0 ? 1 : 0; }
|
|
template<class T> inline void swap(T &a, T &b) { T t = a; a = b; b = t; }
|
|
#endif
|
|
|
|
class cTimeMs {
|
|
private:
|
|
uint64_t begin;
|
|
public:
|
|
cTimeMs(int Ms = 0);
|
|
///< Creates a timer with ms resolution and an initial timeout of Ms.
|
|
static uint64_t Now(void);
|
|
void Set(int Ms = 0);
|
|
bool TimedOut(void);
|
|
uint64_t Elapsed(void);
|
|
};
|
|
|
|
class cListObject {
|
|
private:
|
|
cListObject *prev, *next;
|
|
public:
|
|
cListObject(void);
|
|
virtual ~cListObject();
|
|
virtual int Compare(const cListObject /*&ListObject*/) const { return 0; }
|
|
///< Must return 0 if this object is equal to ListObject, a positive value
|
|
///< if it is "greater", and a negative value if it is "smaller".
|
|
void Append(cListObject *Object);
|
|
void Insert(cListObject *Object);
|
|
void Unlink(void);
|
|
int Index(void) const;
|
|
cListObject *Prev(void) const { return prev; }
|
|
cListObject *Next(void) const { return next; }
|
|
};
|
|
|
|
class cListBase {
|
|
protected:
|
|
cListObject *objects, *lastObject;
|
|
cListBase(void);
|
|
int count;
|
|
public:
|
|
virtual ~cListBase();
|
|
void Add(cListObject *Object, cListObject *After = NULL);
|
|
void Ins(cListObject *Object, cListObject *Before = NULL);
|
|
void Del(cListObject *Object, bool DeleteObject = true);
|
|
virtual void Move(int From, int To);
|
|
void Move(cListObject *From, cListObject *To);
|
|
virtual void Clear(void);
|
|
cListObject *Get(int Index) const;
|
|
int Count(void) const { return count; }
|
|
void Sort(void);
|
|
};
|
|
|
|
template<class T> class cList : public cListBase {
|
|
public:
|
|
T *Get(int Index) const { return (T *)cListBase::Get(Index); }
|
|
T *First(void) const { return (T *)objects; }
|
|
T *Last(void) const { return (T *)lastObject; }
|
|
T *Prev(const T *object) const { return (T *)object->cListObject::Prev(); } // need to call cListObject's members to
|
|
T *Next(const T *object) const { return (T *)object->cListObject::Next(); } // avoid ambiguities in case of a "list of lists"
|
|
};
|
|
|
|
template<class T> class cVector {
|
|
private:
|
|
mutable int allocated;
|
|
mutable int size;
|
|
mutable T *data;
|
|
cVector(const cVector &Vector) {} // don't copy...
|
|
cVector &operator=(const cVector &Vector) { return *this; } // ...or assign this!
|
|
void Realloc(int Index) const
|
|
{
|
|
if (++Index > allocated) {
|
|
data = (T *)realloc(data, Index * sizeof(T));
|
|
for (int i = allocated; i < Index; i++)
|
|
data[i] = T(0);
|
|
allocated = Index;
|
|
}
|
|
}
|
|
public:
|
|
cVector(int Allocated = 10)
|
|
{
|
|
allocated = 0;
|
|
size = 0;
|
|
data = NULL;
|
|
Realloc(Allocated);
|
|
}
|
|
virtual ~cVector() { free(data); }
|
|
T& At(int Index) const
|
|
{
|
|
Realloc(Index);
|
|
if (Index >= size)
|
|
size = Index + 1;
|
|
return data[Index];
|
|
}
|
|
const T& operator[](int Index) const
|
|
{
|
|
return At(Index);
|
|
}
|
|
T& operator[](int Index)
|
|
{
|
|
return At(Index);
|
|
}
|
|
int Size(void) const { return size; }
|
|
virtual void Insert(T Data, int Before = 0)
|
|
{
|
|
if (Before < size) {
|
|
Realloc(size);
|
|
memmove(&data[Before + 1], &data[Before], (size - Before) * sizeof(T));
|
|
size++;
|
|
data[Before] = Data;
|
|
}
|
|
else
|
|
Append(Data);
|
|
}
|
|
virtual void Append(T Data)
|
|
{
|
|
if (size >= allocated)
|
|
Realloc(allocated * 4 / 2); // increase size by 50%
|
|
data[size++] = Data;
|
|
}
|
|
virtual void Remove(int Index)
|
|
{
|
|
if (Index < size - 1)
|
|
memmove(&data[Index], &data[Index + 1], (size - Index) * sizeof(T));
|
|
size--;
|
|
}
|
|
virtual void Clear(void)
|
|
{
|
|
size = 0;
|
|
}
|
|
void Sort(__compar_fn_t Compare)
|
|
{
|
|
qsort(data, size, sizeof(T), Compare);
|
|
}
|
|
};
|
|
|
|
#endif //__TOOLS_H
|