From 1e63fa4174c73d8ea4d257b883a9ac926a87311d Mon Sep 17 00:00:00 2001 From: Klaus Schmidinger Date: Sat, 28 May 2005 14:19:16 +0200 Subject: [PATCH] Avoiding unnecessary calls to getLength() in libsi/si.c, and avoiding the '& 0xff' in CRC32::crc32() of libsi/util.c --- CONTRIBUTORS | 2 ++ HISTORY | 2 ++ libsi/si.c | 35 +++++++++++++++++++++-------------- libsi/util.c | 5 +++-- 4 files changed, 28 insertions(+), 16 deletions(-) diff --git a/CONTRIBUTORS b/CONTRIBUTORS index 7e1a22d0..96d21c65 100644 --- a/CONTRIBUTORS +++ b/CONTRIBUTORS @@ -1362,3 +1362,5 @@ Georg Acher for making tChannelID::operator==() inline for better performance for introducing cListBase::count for better performance for a patch that was used to implement hash tables to speed up cSchedule::GetEvent() + for avoiding unnecessary calls to getLength() in libsi/si.c, and avoiding the + '& 0xff' in CRC32::crc32() of libsi/util.c diff --git a/HISTORY b/HISTORY index 1bca9213..c2ebcaa7 100644 --- a/HISTORY +++ b/HISTORY @@ -3570,3 +3570,5 @@ Video Disk Recorder Revision History the schedule it is in. - Now using hash tables to speed up cSchedule::GetEvent() (partially based on a patch from Georg Acher). +- Avoiding unnecessary calls to getLength() in libsi/si.c, and avoiding the + '& 0xff' in CRC32::crc32() of libsi/util.c (thanks to Georg Acher). diff --git a/libsi/si.c b/libsi/si.c index ba97c6e9..90d40303 100644 --- a/libsi/si.c +++ b/libsi/si.c @@ -6,7 +6,7 @@ * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * - * $Id: si.c 1.13 2004/10/16 15:12:57 kls Exp $ + * $Id: si.c 1.14 2005/05/28 14:11:16 kls Exp $ * * ***************************************************************************/ @@ -114,9 +114,10 @@ Descriptor *DescriptorLoop::getNext(Iterator &it) { Descriptor *DescriptorLoop::getNext(Iterator &it, DescriptorTag tag, bool returnUnimplemetedDescriptor) { Descriptor *d=0; - if (isValid() && it.i4095) + int len=getLength(); + if (len < 0 || len > 4095) return strdup("text error"); // caller will delete it! - char *data=new char(getLength()+1); - decodeText(data, getLength()+1); + char *data=new char(len+1); + decodeText(data, len+1); return data; } char *String::getText(char *buffer, int size) { - if (getLength() < 0 || getLength() >= size) { + int len=getLength(); + if (len < 0 || len >= size) { strncpy(buffer, "text error", size); buffer[size-1] = 0; return buffer; @@ -230,7 +234,8 @@ char *String::getText(char *buffer, int size) { //taken from VDR, Copyright Klaus Schmidinger char *String::getText(char *buffer, char *shortVersion, int sizeBuffer, int sizeShortVersion) { - if (getLength() < 0 || getLength() >= sizeBuffer) { + int len=getLength(); + if (len < 0 || len >= sizeBuffer) { strncpy(buffer, "text error", sizeBuffer); buffer[sizeBuffer-1] = 0; *shortVersion = 0; @@ -254,7 +259,8 @@ void String::decodeText(char *buffer, int size) { if (*from == 0x10) from += 3; // skips code table info - for (int i = 0; i < getLength(); i++) { + int len=getLength(); + for (int i = 0; i < len; i++) { if (*from == 0) break; if ( ((' ' <= *from) && (*from <= '~')) @@ -281,9 +287,8 @@ void String::decodeText(char *buffer, char *shortVersion, int sizeBuffer, int si if (*from == 0x10) from += 3; // skips code table info - for (int i = 0; i < getLength(); i++) { - if (*from == 0) - break; + int len=getLength(); + for (int i = 0; i < len; i++) { if ( ((' ' <= *from) && (*from <= '~')) || (*from == '\n') || (0xA0 <= *from) @@ -299,6 +304,8 @@ void String::decodeText(char *buffer, char *shortVersion, int sizeBuffer, int si IsShortName++; else if (*from == 0x87) IsShortName--; + else if (*from == 0) + break; from++; if (to - buffer >= sizeBuffer - 1 || toShort - shortVersion >= sizeShortVersion - 1) break; diff --git a/libsi/util.c b/libsi/util.c index c6ad234a..34657948 100644 --- a/libsi/util.c +++ b/libsi/util.c @@ -6,7 +6,7 @@ * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * - * $Id: util.c 1.4 2004/10/16 09:58:41 kls Exp $ + * $Id: util.c 1.5 2005/05/28 14:15:29 kls Exp $ * * ***************************************************************************/ @@ -263,9 +263,10 @@ u_int32_t CRC32::crc_table[256] = { u_int32_t CRC32::crc32 (const char *d, int len, u_int32_t crc) { register int i; + const unsigned char *u=(unsigned char*)d; // Saves '& 0xff' for (i=0; i> 24) ^ *d++) & 0xff]; + crc = (crc << 8) ^ crc_table[((crc >> 24) ^ *u++)]; return crc; }