mirror of
https://github.com/VDR4Arch/vdr.git
synced 2023-10-10 13:36:52 +02:00
Now using qsort() to sort cListBase lists
This commit is contained in:
parent
c88e65b638
commit
0b62aff0e3
6
HISTORY
6
HISTORY
@ -3078,7 +3078,7 @@ Video Disk Recorder Revision History
|
||||
This avoids shortly seeing the wrong events in the channel display when
|
||||
switching to a channel that hasn't been tuned to in a while.
|
||||
|
||||
2004-10-31: Version 1.3.15
|
||||
2004-11-01: Version 1.3.15
|
||||
|
||||
- Fixed some typos in the Makefile's 'font' target (thanks to Uwe Hanke).
|
||||
- Added more checks and polling when getting frontend events (based on a patch
|
||||
@ -3105,3 +3105,7 @@ Video Disk Recorder Revision History
|
||||
swapped (see man vdr(5)).
|
||||
- Added the 'portal name' to cChannels (thanks to Marco Schlüßler).
|
||||
- Fixed handling key codes that start with 0x1B in the KBD remote control code.
|
||||
- Now using qsort() to sort cListBase lists. For this, the virtual function
|
||||
cListObject::operator<() has been replaced with cListObject::Compare().
|
||||
Plugins that implement derived cListObject classes may need to adjust their
|
||||
code.
|
||||
|
12
config.c
12
config.c
@ -4,7 +4,7 @@
|
||||
* See the main source file 'vdr.c' for copyright information and
|
||||
* how to reach the author.
|
||||
*
|
||||
* $Id: config.c 1.127 2004/05/16 12:43:55 kls Exp $
|
||||
* $Id: config.c 1.128 2004/10/31 16:17:39 kls Exp $
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
@ -193,19 +193,19 @@ cSetupLine::~cSetupLine()
|
||||
free(value);
|
||||
}
|
||||
|
||||
bool cSetupLine::operator< (const cListObject &ListObject)
|
||||
int cSetupLine::Compare(const cListObject &ListObject) const
|
||||
{
|
||||
const cSetupLine *sl = (cSetupLine *)&ListObject;
|
||||
if (!plugin && !sl->plugin)
|
||||
return strcasecmp(name, sl->name) < 0;
|
||||
return strcasecmp(name, sl->name);
|
||||
if (!plugin)
|
||||
return true;
|
||||
return -1;
|
||||
if (!sl->plugin)
|
||||
return false;
|
||||
return 1;
|
||||
int result = strcasecmp(plugin, sl->plugin);
|
||||
if (result == 0)
|
||||
result = strcasecmp(name, sl->name);
|
||||
return result < 0;
|
||||
return result;
|
||||
}
|
||||
|
||||
bool cSetupLine::Parse(char *s)
|
||||
|
4
config.h
4
config.h
@ -4,7 +4,7 @@
|
||||
* See the main source file 'vdr.c' for copyright information and
|
||||
* how to reach the author.
|
||||
*
|
||||
* $Id: config.h 1.202 2004/10/30 11:52:41 kls Exp $
|
||||
* $Id: config.h 1.203 2004/10/31 16:17:02 kls Exp $
|
||||
*/
|
||||
|
||||
#ifndef __CONFIG_H
|
||||
@ -185,7 +185,7 @@ public:
|
||||
cSetupLine(void);
|
||||
cSetupLine(const char *Name, const char *Value, const char *Plugin = NULL);
|
||||
virtual ~cSetupLine();
|
||||
virtual bool operator< (const cListObject &ListObject);
|
||||
virtual int Compare(const cListObject &ListObject) const;
|
||||
const char *Plugin(void) { return plugin; }
|
||||
const char *Name(void) { return name; }
|
||||
const char *Value(void) { return value; }
|
||||
|
19
eitscan.c
19
eitscan.c
@ -4,7 +4,7 @@
|
||||
* See the main source file 'vdr.c' for copyright information and
|
||||
* how to reach the author.
|
||||
*
|
||||
* $Id: eitscan.c 1.22 2004/04/16 13:33:34 kls Exp $
|
||||
* $Id: eitscan.c 1.23 2004/10/31 16:19:49 kls Exp $
|
||||
*/
|
||||
|
||||
#include "eitscan.h"
|
||||
@ -20,10 +20,10 @@ private:
|
||||
cChannel channel;
|
||||
public:
|
||||
cScanData(const cChannel *Channel);
|
||||
virtual bool operator< (const cListObject &ListObject);
|
||||
int Source(void) { return channel.Source(); }
|
||||
int Transponder(void) { return channel.Transponder(); }
|
||||
const cChannel *GetChannel(void) { return &channel; }
|
||||
virtual int Compare(const cListObject &ListObject) const;
|
||||
int Source(void) const { return channel.Source(); }
|
||||
int Transponder(void) const { return channel.Transponder(); }
|
||||
const cChannel *GetChannel(void) const { return &channel; }
|
||||
};
|
||||
|
||||
cScanData::cScanData(const cChannel *Channel)
|
||||
@ -31,10 +31,13 @@ cScanData::cScanData(const cChannel *Channel)
|
||||
channel = *Channel;
|
||||
}
|
||||
|
||||
bool cScanData::operator< (const cListObject &ListObject)
|
||||
int cScanData::Compare(const cListObject &ListObject) const
|
||||
{
|
||||
cScanData *sd = (cScanData *)&ListObject;
|
||||
return Source() < sd->Source() || Source() == sd->Source() && Transponder() < sd->Transponder();
|
||||
const cScanData *sd = (const cScanData *)&ListObject;
|
||||
int r = Source() - sd->Source();
|
||||
if (r == 0)
|
||||
r = Transponder() - sd->Transponder();
|
||||
return r;
|
||||
}
|
||||
|
||||
// --- cScanList -------------------------------------------------------------
|
||||
|
6
epg.c
6
epg.c
@ -7,7 +7,7 @@
|
||||
* Original version (as used in VDR before 1.3.0) written by
|
||||
* Robert Schneider <Robert.Schneider@web.de> and Rolf Hakenes <hakenes@hippomi.de>.
|
||||
*
|
||||
* $Id: epg.c 1.20 2004/10/24 15:01:50 kls Exp $
|
||||
* $Id: epg.c 1.21 2004/10/31 16:12:36 kls Exp $
|
||||
*/
|
||||
|
||||
#include "epg.h"
|
||||
@ -40,10 +40,10 @@ cEvent::~cEvent()
|
||||
free(description);
|
||||
}
|
||||
|
||||
bool cEvent::operator< (const cListObject &ListObject)
|
||||
int cEvent::Compare(const cListObject &ListObject) const
|
||||
{
|
||||
cEvent *e = (cEvent *)&ListObject;
|
||||
return startTime < e->startTime;
|
||||
return startTime - e->startTime;
|
||||
}
|
||||
|
||||
void cEvent::SetEventID(u_int16_t EventID)
|
||||
|
4
epg.h
4
epg.h
@ -7,7 +7,7 @@
|
||||
* Original version (as used in VDR before 1.3.0) written by
|
||||
* Robert Schneider <Robert.Schneider@web.de> and Rolf Hakenes <hakenes@hippomi.de>.
|
||||
*
|
||||
* $Id: epg.h 1.16 2004/10/24 13:56:00 kls Exp $
|
||||
* $Id: epg.h 1.17 2004/10/31 16:17:10 kls Exp $
|
||||
*/
|
||||
|
||||
#ifndef __EPG_H
|
||||
@ -40,7 +40,7 @@ private:
|
||||
public:
|
||||
cEvent(tChannelID ChannelID, u_int16_t EventID);
|
||||
~cEvent();
|
||||
virtual bool operator< (const cListObject &ListObject);
|
||||
virtual int Compare(const cListObject &ListObject) const;
|
||||
tChannelID ChannelID(void) const { return channelID; }
|
||||
u_int16_t EventID(void) const { return eventID; }
|
||||
uchar TableID(void) const { return tableID; }
|
||||
|
8
menu.c
8
menu.c
@ -4,7 +4,7 @@
|
||||
* See the main source file 'vdr.c' for copyright information and
|
||||
* how to reach the author.
|
||||
*
|
||||
* $Id: menu.c 1.317 2004/10/31 12:53:00 kls Exp $
|
||||
* $Id: menu.c 1.318 2004/11/01 10:40:38 kls Exp $
|
||||
*/
|
||||
|
||||
#include "menu.h"
|
||||
@ -667,7 +667,7 @@ private:
|
||||
cTimer *timer;
|
||||
public:
|
||||
cMenuTimerItem(cTimer *Timer);
|
||||
virtual bool operator< (const cListObject &ListObject);
|
||||
virtual int Compare(const cListObject &ListObject) const;
|
||||
virtual void Set(void);
|
||||
cTimer *Timer(void) { return timer; }
|
||||
};
|
||||
@ -678,9 +678,9 @@ cMenuTimerItem::cMenuTimerItem(cTimer *Timer)
|
||||
Set();
|
||||
}
|
||||
|
||||
bool cMenuTimerItem::operator< (const cListObject &ListObject)
|
||||
int cMenuTimerItem::Compare(const cListObject &ListObject) const
|
||||
{
|
||||
return *timer < *((cMenuTimerItem *)&ListObject)->timer;
|
||||
return timer->Compare(*((cMenuTimerItem *)&ListObject)->timer);
|
||||
}
|
||||
|
||||
void cMenuTimerItem::Set(void)
|
||||
|
@ -4,7 +4,7 @@
|
||||
* See the main source file 'vdr.c' for copyright information and
|
||||
* how to reach the author.
|
||||
*
|
||||
* $Id: recording.c 1.90 2004/10/31 10:09:36 kls Exp $
|
||||
* $Id: recording.c 1.91 2004/10/31 16:22:33 kls Exp $
|
||||
*/
|
||||
|
||||
#include "recording.h"
|
||||
@ -451,7 +451,7 @@ char *cRecording::StripEpisodeName(char *s)
|
||||
return s;
|
||||
}
|
||||
|
||||
char *cRecording::SortName(void)
|
||||
char *cRecording::SortName(void) const
|
||||
{
|
||||
if (!sortBuffer) {
|
||||
char *s = StripEpisodeName(strdup(FileName() + strlen(VideoDirectory) + 1));
|
||||
@ -472,10 +472,10 @@ int cRecording::GetResume(void) const
|
||||
return resume;
|
||||
}
|
||||
|
||||
bool cRecording::operator< (const cListObject &ListObject)
|
||||
int cRecording::Compare(const cListObject &ListObject) const
|
||||
{
|
||||
cRecording *r = (cRecording *)&ListObject;
|
||||
return strcasecmp(SortName(), r->SortName()) < 0;
|
||||
return strcasecmp(SortName(), r->SortName());
|
||||
}
|
||||
|
||||
const char *cRecording::FileName(void) const
|
||||
|
10
recording.h
10
recording.h
@ -4,7 +4,7 @@
|
||||
* See the main source file 'vdr.c' for copyright information and
|
||||
* how to reach the author.
|
||||
*
|
||||
* $Id: recording.h 1.31 2004/07/17 11:09:49 kls Exp $
|
||||
* $Id: recording.h 1.32 2004/10/31 16:24:38 kls Exp $
|
||||
*/
|
||||
|
||||
#ifndef __RECORDING_H
|
||||
@ -36,12 +36,12 @@ class cRecording : public cListObject {
|
||||
private:
|
||||
mutable int resume;
|
||||
mutable char *titleBuffer;
|
||||
char *sortBuffer;
|
||||
mutable char *sortBuffer;
|
||||
mutable char *fileName;
|
||||
mutable char *name;
|
||||
char *summary;
|
||||
char *StripEpisodeName(char *s);
|
||||
char *SortName(void);
|
||||
static char *StripEpisodeName(char *s);
|
||||
char *SortName(void) const;
|
||||
int GetResume(void) const;
|
||||
public:
|
||||
time_t start;
|
||||
@ -50,7 +50,7 @@ public:
|
||||
cRecording(cTimer *Timer, const char *Title, const char *Subtitle, const char *Summary);
|
||||
cRecording(const char *FileName);
|
||||
~cRecording();
|
||||
virtual bool operator< (const cListObject &ListObject);
|
||||
virtual int Compare(const cListObject &ListObject) const;
|
||||
const char *Name(void) const { return name; }
|
||||
const char *FileName(void) const;
|
||||
const char *Title(char Delimiter = ' ', bool NewIndicator = false, int Level = -1) const;
|
||||
|
27
timers.c
27
timers.c
@ -4,7 +4,7 @@
|
||||
* See the main source file 'vdr.c' for copyright information and
|
||||
* how to reach the author.
|
||||
*
|
||||
* $Id: timers.c 1.15 2004/10/31 10:07:43 kls Exp $
|
||||
* $Id: timers.c 1.16 2004/10/31 16:41:30 kls Exp $
|
||||
*/
|
||||
|
||||
#include "timers.h"
|
||||
@ -95,12 +95,15 @@ cTimer& cTimer::operator= (const cTimer &Timer)
|
||||
return *this;
|
||||
}
|
||||
|
||||
bool cTimer::operator< (const cListObject &ListObject)
|
||||
int cTimer::Compare(const cListObject &ListObject) const
|
||||
{
|
||||
cTimer *ti = (cTimer *)&ListObject;
|
||||
time_t t1 = StartTime();
|
||||
time_t t2 = ti->StartTime();
|
||||
return t1 < t2 || (t1 == t2 && priority > ti->priority);
|
||||
int r = t1 - t2;
|
||||
if (r == 0)
|
||||
r = ti->priority - priority;
|
||||
return r;
|
||||
}
|
||||
|
||||
const char *cTimer::ToText(bool UseChannelID)
|
||||
@ -248,25 +251,25 @@ bool cTimer::Save(FILE *f)
|
||||
return fprintf(f, ToText(true)) > 0;
|
||||
}
|
||||
|
||||
bool cTimer::IsSingleEvent(void)
|
||||
bool cTimer::IsSingleEvent(void) const
|
||||
{
|
||||
return (day & 0x80000000) == 0;
|
||||
}
|
||||
|
||||
int cTimer::GetMDay(time_t t)
|
||||
int cTimer::GetMDay(time_t t) const
|
||||
{
|
||||
struct tm tm_r;
|
||||
return localtime_r(&t, &tm_r)->tm_mday;
|
||||
}
|
||||
|
||||
int cTimer::GetWDay(time_t t)
|
||||
int cTimer::GetWDay(time_t t) const
|
||||
{
|
||||
struct tm tm_r;
|
||||
int weekday = localtime_r(&t, &tm_r)->tm_wday;
|
||||
return weekday == 0 ? 6 : weekday - 1; // we start with monday==0!
|
||||
}
|
||||
|
||||
bool cTimer::DayMatches(time_t t)
|
||||
bool cTimer::DayMatches(time_t t) const
|
||||
{
|
||||
return IsSingleEvent() ? GetMDay(t) == day : (day & (1 << GetWDay(t))) != 0;
|
||||
}
|
||||
@ -301,7 +304,7 @@ char *cTimer::SetFile(const char *File)
|
||||
return file;
|
||||
}
|
||||
|
||||
bool cTimer::Matches(time_t t, bool Directly)
|
||||
bool cTimer::Matches(time_t t, bool Directly) const
|
||||
{
|
||||
startTime = stopTime = 0;
|
||||
if (t == 0)
|
||||
@ -363,14 +366,14 @@ int cTimer::Matches(const cEvent *Event)
|
||||
return tmNone;
|
||||
}
|
||||
|
||||
time_t cTimer::StartTime(void)
|
||||
time_t cTimer::StartTime(void) const
|
||||
{
|
||||
if (!startTime)
|
||||
Matches();
|
||||
return startTime;
|
||||
}
|
||||
|
||||
time_t cTimer::StopTime(void)
|
||||
time_t cTimer::StopTime(void) const
|
||||
{
|
||||
if (!stopTime)
|
||||
Matches();
|
||||
@ -425,7 +428,7 @@ void cTimer::InvFlags(int Flags)
|
||||
flags ^= Flags;
|
||||
}
|
||||
|
||||
bool cTimer::HasFlags(int Flags)
|
||||
bool cTimer::HasFlags(int Flags) const
|
||||
{
|
||||
return (flags & Flags) == Flags;
|
||||
}
|
||||
@ -506,7 +509,7 @@ cTimer *cTimers::GetNextActiveTimer(void)
|
||||
{
|
||||
cTimer *t0 = NULL;
|
||||
for (cTimer *ti = First(); ti; ti = Next(ti)) {
|
||||
if ((ti->HasFlags(tfActive)) && (!t0 || *ti < *t0))
|
||||
if ((ti->HasFlags(tfActive)) && (!t0 || ti->Compare(*t0) < 0))
|
||||
t0 = ti;
|
||||
}
|
||||
return t0;
|
||||
|
24
timers.h
24
timers.h
@ -4,7 +4,7 @@
|
||||
* See the main source file 'vdr.c' for copyright information and
|
||||
* how to reach the author.
|
||||
*
|
||||
* $Id: timers.h 1.9 2004/10/31 10:06:54 kls Exp $
|
||||
* $Id: timers.h 1.10 2004/10/31 16:41:17 kls Exp $
|
||||
*/
|
||||
|
||||
#ifndef __TIMERS_H
|
||||
@ -26,7 +26,7 @@ enum eTimerMatch { tmNone, tmPartial, tmFull };
|
||||
class cTimer : public cListObject {
|
||||
friend class cMenuEditTimer;
|
||||
private:
|
||||
time_t startTime, stopTime;
|
||||
mutable time_t startTime, stopTime;
|
||||
static char *buffer;
|
||||
bool recording, pending, inVpsMargin;
|
||||
int flags;
|
||||
@ -37,7 +37,7 @@ private:
|
||||
int priority;
|
||||
int lifetime;
|
||||
char file[MaxFileName];
|
||||
time_t firstday;
|
||||
mutable time_t firstday;
|
||||
char *summary;
|
||||
const cEvent *event;
|
||||
public:
|
||||
@ -45,7 +45,7 @@ public:
|
||||
cTimer(const cEvent *Event);
|
||||
virtual ~cTimer();
|
||||
cTimer& operator= (const cTimer &Timer);
|
||||
virtual bool operator< (const cListObject &ListObject);
|
||||
virtual int Compare(const cListObject &ListObject) const;
|
||||
bool Recording(void) { return recording; }
|
||||
bool Pending(void) { return pending; }
|
||||
bool InVpsMargin(void) { return inVpsMargin; }
|
||||
@ -63,17 +63,17 @@ public:
|
||||
const cEvent *Event(void) { return event; }
|
||||
bool Parse(const char *s);
|
||||
bool Save(FILE *f);
|
||||
bool IsSingleEvent(void);
|
||||
int GetMDay(time_t t);
|
||||
int GetWDay(time_t t);
|
||||
bool DayMatches(time_t t);
|
||||
bool IsSingleEvent(void) const;
|
||||
int GetMDay(time_t t) const;
|
||||
int GetWDay(time_t t) const;
|
||||
bool DayMatches(time_t t) const;
|
||||
static time_t IncDay(time_t t, int Days);
|
||||
static time_t SetTime(time_t t, int SecondsFromMidnight);
|
||||
char *SetFile(const char *File);
|
||||
bool Matches(time_t t = 0, bool Directly = false);
|
||||
bool Matches(time_t t = 0, bool Directly = false) const;
|
||||
int Matches(const cEvent *Event);
|
||||
time_t StartTime(void);
|
||||
time_t StopTime(void);
|
||||
time_t StartTime(void) const;
|
||||
time_t StopTime(void) const;
|
||||
void SetEvent(const cEvent *Event);
|
||||
void SetRecording(bool Recording);
|
||||
void SetPending(bool Pending);
|
||||
@ -81,7 +81,7 @@ public:
|
||||
void SetFlags(int Flags);
|
||||
void ClrFlags(int Flags);
|
||||
void InvFlags(int Flags);
|
||||
bool HasFlags(int Flags);
|
||||
bool HasFlags(int Flags) const;
|
||||
void Skip(void);
|
||||
void OnOff(void);
|
||||
const char *PrintFirstDay(void);
|
||||
|
37
tools.c
37
tools.c
@ -4,7 +4,7 @@
|
||||
* See the main source file 'vdr.c' for copyright information and
|
||||
* how to reach the author.
|
||||
*
|
||||
* $Id: tools.c 1.80 2004/06/13 14:36:41 kls Exp $
|
||||
* $Id: tools.c 1.81 2004/10/31 16:42:36 kls Exp $
|
||||
*/
|
||||
|
||||
#include "tools.h"
|
||||
@ -939,19 +939,28 @@ int cListBase::Count(void) const
|
||||
return n;
|
||||
}
|
||||
|
||||
void cListBase::Sort(void)
|
||||
static int CompareListObjects(const void *a, const void *b)
|
||||
{
|
||||
bool swapped;
|
||||
do {
|
||||
swapped = false;
|
||||
cListObject *object = objects;
|
||||
while (object) {
|
||||
if (object->Next() && *object->Next() < *object) {
|
||||
Move(object->Next(), object);
|
||||
swapped = true;
|
||||
}
|
||||
object = object->Next();
|
||||
}
|
||||
} while (swapped);
|
||||
const cListObject *la = *(const cListObject **)a;
|
||||
const cListObject *lb = *(const cListObject **)b;
|
||||
return la->Compare(*lb);
|
||||
}
|
||||
|
||||
void cListBase::Sort(void)
|
||||
{
|
||||
int n = Count();
|
||||
cListObject *a[n];
|
||||
cListObject *object = objects;
|
||||
int i = 0;
|
||||
while (object && i < n) {
|
||||
a[i++] = object;
|
||||
object = object->Next();
|
||||
}
|
||||
qsort(a, n, sizeof(cListObject *), CompareListObjects);
|
||||
objects = lastObject = NULL;
|
||||
for (i = 0; i < n; i++) {
|
||||
a[i]->Unlink();
|
||||
Add(a[i]);
|
||||
}
|
||||
}
|
||||
|
||||
|
6
tools.h
6
tools.h
@ -4,7 +4,7 @@
|
||||
* See the main source file 'vdr.c' for copyright information and
|
||||
* how to reach the author.
|
||||
*
|
||||
* $Id: tools.h 1.57 2004/06/13 14:13:26 kls Exp $
|
||||
* $Id: tools.h 1.58 2004/10/31 16:16:37 kls Exp $
|
||||
*/
|
||||
|
||||
#ifndef __TOOLS_H
|
||||
@ -148,7 +148,9 @@ private:
|
||||
public:
|
||||
cListObject(void);
|
||||
virtual ~cListObject();
|
||||
virtual bool operator< (const cListObject &ListObject) { return false; }
|
||||
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);
|
||||
|
Loading…
Reference in New Issue
Block a user