/* * 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 #include #include #include #include #include #include #include #include #include #include #include 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 inline T min(T a, T b) { return a <= b ? a : b; } template inline T max(T a, T b) { return a >= b ? a : b; } template inline int sgn(T a) { return a < 0 ? -1 : a > 0 ? 1 : 0; } template 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 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 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