From b532dc82299d1a11b5bdbbbee17f614dd87e8307 Mon Sep 17 00:00:00 2001 From: Klaus Schmidinger Date: Sat, 16 Jun 2007 10:41:21 +0200 Subject: [PATCH] Replaced strncpy() and strn0cpy() with Utf8Strn0Cpy() where necessary --- HISTORY | 1 + config.c | 14 +++++++------- device.c | 4 ++-- menu.c | 12 ++++++------ recording.c | 4 ++-- timers.c | 8 ++++---- tools.c | 21 ++++++++++++++++++++- tools.h | 7 ++++++- 8 files changed, 48 insertions(+), 23 deletions(-) diff --git a/HISTORY b/HISTORY index e6f1da1b..1ec64568 100644 --- a/HISTORY +++ b/HISTORY @@ -5240,3 +5240,4 @@ Video Disk Recorder Revision History Thomas Günther). The codeset names in 'libsi/si.c' have been changed to the canonical spelling with '-' (thanks to Ludwig Nussel for pointing this out). - Modified handling invalid characters in VFAT mode. +- Replaced strn0cpy() with Utf8Strn0Cpy() where necessary. diff --git a/config.c b/config.c index 1c8ad1f1..2c86fa38 100644 --- a/config.c +++ b/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.151 2007/06/02 11:21:40 kls Exp $ + * $Id: config.c 1.152 2007/06/16 09:30:22 kls Exp $ */ #include "config.h" @@ -385,8 +385,8 @@ bool cSetup::ParseLanguages(const char *Value, int *Values) bool cSetup::Parse(const char *Name, const char *Value) { if (!strcasecmp(Name, "OSDLanguage")) OSDLanguage = atoi(Value); - else if (!strcasecmp(Name, "OSDSkin")) strn0cpy(OSDSkin, Value, MaxSkinName); - else if (!strcasecmp(Name, "OSDTheme")) strn0cpy(OSDTheme, Value, MaxThemeName); + else if (!strcasecmp(Name, "OSDSkin")) Utf8Strn0Cpy(OSDSkin, Value, MaxSkinName); + else if (!strcasecmp(Name, "OSDTheme")) Utf8Strn0Cpy(OSDTheme, Value, MaxThemeName); else if (!strcasecmp(Name, "PrimaryDVB")) PrimaryDVB = atoi(Value); else if (!strcasecmp(Name, "ShowInfoOnChSwitch")) ShowInfoOnChSwitch = atoi(Value); else if (!strcasecmp(Name, "TimeoutRequChInfo")) TimeoutRequChInfo = atoi(Value); @@ -394,7 +394,7 @@ bool cSetup::Parse(const char *Name, const char *Value) else if (!strcasecmp(Name, "MenuScrollWrap")) MenuScrollWrap = atoi(Value); else if (!strcasecmp(Name, "MenuKeyCloses")) MenuKeyCloses = atoi(Value); else if (!strcasecmp(Name, "MarkInstantRecord")) MarkInstantRecord = atoi(Value); - else if (!strcasecmp(Name, "NameInstantRecord")) strn0cpy(NameInstantRecord, Value, MaxFileName); + else if (!strcasecmp(Name, "NameInstantRecord")) Utf8Strn0Cpy(NameInstantRecord, Value, MaxFileName); else if (!strcasecmp(Name, "InstantRecordTime")) InstantRecordTime = atoi(Value); else if (!strcasecmp(Name, "LnbSLOF")) LnbSLOF = atoi(Value); else if (!strcasecmp(Name, "LnbFrequLo")) LnbFrequLo = atoi(Value); @@ -435,9 +435,9 @@ bool cSetup::Parse(const char *Name, const char *Value) else if (!strcasecmp(Name, "OSDMessageTime")) OSDMessageTime = atoi(Value); else if (!strcasecmp(Name, "UseSmallFont")) UseSmallFont = atoi(Value); else if (!strcasecmp(Name, "AntiAlias")) AntiAlias = atoi(Value); - else if (!strcasecmp(Name, "FontOsd")) strn0cpy(FontOsd, Value, MAXFONTNAME); - else if (!strcasecmp(Name, "FontSml")) strn0cpy(FontSml, Value, MAXFONTNAME); - else if (!strcasecmp(Name, "FontFix")) strn0cpy(FontFix, Value, MAXFONTNAME); + else if (!strcasecmp(Name, "FontOsd")) Utf8Strn0Cpy(FontOsd, Value, MAXFONTNAME); + else if (!strcasecmp(Name, "FontSml")) Utf8Strn0Cpy(FontSml, Value, MAXFONTNAME); + else if (!strcasecmp(Name, "FontFix")) Utf8Strn0Cpy(FontFix, Value, MAXFONTNAME); else if (!strcasecmp(Name, "FontOsdSize")) FontOsdSize = atoi(Value); else if (!strcasecmp(Name, "FontSmlSize")) FontSmlSize = atoi(Value); else if (!strcasecmp(Name, "FontFixSize")) FontFixSize = atoi(Value); diff --git a/device.c b/device.c index b859124e..ae9e15e8 100644 --- a/device.c +++ b/device.c @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: device.c 1.140 2007/04/30 09:34:00 kls Exp $ + * $Id: device.c 1.141 2007/06/16 09:31:32 kls Exp $ */ #include "device.h" @@ -859,7 +859,7 @@ bool cDevice::SetAvailableTrack(eTrackType Type, int Index, uint16_t Id, const c if (Language) strn0cpy(availableTracks[t].language, Language, sizeof(availableTracks[t].language)); if (Description) - strn0cpy(availableTracks[t].description, Description, sizeof(availableTracks[t].description)); + Utf8Strn0Cpy(availableTracks[t].description, Description, sizeof(availableTracks[t].description)); if (Id) { availableTracks[t].id = Id; // setting 'id' last to avoid the need for extensive locking int numAudioTracks = NumAudioTracks(); diff --git a/menu.c b/menu.c index 47e9c3d9..f86414ae 100644 --- a/menu.c +++ b/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.451 2007/06/09 14:36:46 kls Exp $ + * $Id: menu.c 1.452 2007/06/16 09:33:21 kls Exp $ */ #include "menu.h" @@ -2239,14 +2239,14 @@ eOSState cMenuSetupOSD::ProcessKey(eKeys Key) if (skinIndex != originalSkinIndex) { cSkin *Skin = Skins.Get(skinIndex); if (Skin) { - strn0cpy(data.OSDSkin, Skin->Name(), sizeof(data.OSDSkin)); + Utf8Strn0Cpy(data.OSDSkin, Skin->Name(), sizeof(data.OSDSkin)); Skins.SetCurrent(Skin->Name()); ModifiedApperance = true; } } if (themes.NumThemes() && Skins.Current()->Theme()) { Skins.Current()->Theme()->Load(themes.FileName(themeIndex)); - strn0cpy(data.OSDTheme, themes.Name(themeIndex), sizeof(data.OSDTheme)); + Utf8Strn0Cpy(data.OSDTheme, themes.Name(themeIndex), sizeof(data.OSDTheme)); ModifiedApperance |= themeIndex != originalThemeIndex; } if (data.OSDLeft != Setup.OSDLeft || data.OSDTop != Setup.OSDTop || data.OSDWidth != Setup.OSDWidth || data.OSDHeight != Setup.OSDHeight) { @@ -2256,9 +2256,9 @@ eOSState cMenuSetupOSD::ProcessKey(eKeys Key) if (data.UseSmallFont != Setup.UseSmallFont || data.AntiAlias != Setup.AntiAlias) ModifiedApperance = true; if (fontNames.Size()) { - strn0cpy(data.FontOsd, fontNames[fontOsdIndex], sizeof(data.FontOsd)); - strn0cpy(data.FontSml, fontNames[fontSmlIndex], sizeof(data.FontSml)); - strn0cpy(data.FontFix, fontNames[fontFixIndex], sizeof(data.FontFix)); + Utf8Strn0Cpy(data.FontOsd, fontNames[fontOsdIndex], sizeof(data.FontOsd)); + Utf8Strn0Cpy(data.FontSml, fontNames[fontSmlIndex], sizeof(data.FontSml)); + Utf8Strn0Cpy(data.FontFix, fontNames[fontFixIndex], sizeof(data.FontFix)); } if (strcmp(data.FontOsd, Setup.FontOsd) || data.FontOsdSize != Setup.FontOsdSize) { cFont::SetFont(fontOsd, data.FontOsd, data.FontOsdSize); diff --git a/recording.c b/recording.c index cce99a44..f2a617f2 100644 --- a/recording.c +++ b/recording.c @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: recording.c 1.152 2007/06/16 08:57:22 kls Exp $ + * $Id: recording.c 1.153 2007/06/16 09:36:08 kls Exp $ */ #include "recording.h" @@ -480,7 +480,7 @@ cRecording::cRecording(cTimer *Timer, const cEvent *Event) Subtitle = " "; else if (strlen(Subtitle) > MAX_SUBTITLE_LENGTH) { // let's make sure the Subtitle doesn't produce too long a file name: - strn0cpy(SubtitleBuffer, Subtitle, MAX_SUBTITLE_LENGTH); + Utf8Strn0Cpy(SubtitleBuffer, Subtitle, MAX_SUBTITLE_LENGTH); Subtitle = SubtitleBuffer; } char *macroTITLE = strstr(Timer->File(), TIMERMACRO_TITLE); diff --git a/timers.c b/timers.c index 40791d06..febf12eb 100644 --- a/timers.c +++ b/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.66 2007/06/03 13:48:57 kls Exp $ + * $Id: timers.c 1.67 2007/06/16 10:41:21 kls Exp $ */ #include "timers.h" @@ -78,7 +78,7 @@ cTimer::cTimer(const cEvent *Event) *file = 0; const char *Title = Event->Title(); if (!isempty(Title)) - strn0cpy(file, Event->Title(), sizeof(file)); + Utf8Strn0Cpy(file, Event->Title(), sizeof(file)); aux = NULL; event = NULL; // let SetEvent() be called to get a log message } @@ -286,7 +286,7 @@ bool cTimer::Parse(const char *s) } //TODO add more plausibility checks result = ParseDay(daybuffer, day, weekdays); - strn0cpy(file, filebuffer, MaxFileName); + Utf8Strn0Cpy(file, filebuffer, MaxFileName); strreplace(file, '|', ':'); if (isnumber(channelbuffer)) channel = Channels.GetByNumber(atoi(channelbuffer)); @@ -358,7 +358,7 @@ time_t cTimer::SetTime(time_t t, int SecondsFromMidnight) char *cTimer::SetFile(const char *File) { if (!isempty(File)) - strn0cpy(file, File, sizeof(file)); + Utf8Strn0Cpy(file, File, sizeof(file)); return file; } diff --git a/tools.c b/tools.c index b44a4bb0..0faf1ea2 100644 --- a/tools.c +++ b/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.127 2007/06/16 09:05:11 kls Exp $ + * $Id: tools.c 1.128 2007/06/16 09:22:40 kls Exp $ */ #include "tools.h" @@ -661,6 +661,25 @@ int Utf8StrLen(const char *s) return n; } +char *Utf8Strn0Cpy(char *Dest, const char *Src, int n) +{ + if (cCharSetConv::SystemCharacterTable()) + return strn0cpy(Dest, Src, n); + char *d = Dest; + while (*Src) { + int sl = Utf8CharLen(Src); + n -= sl; + if (n > 0) { + while (sl--) + *d++ = *Src++; + } + else + break; + } + *d = 0; + return Dest; +} + int Utf8ToArray(const char *s, uint *a, int Size) { int n = 0; diff --git a/tools.h b/tools.h index 005c9228..6feda29f 100644 --- a/tools.h +++ b/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.100 2007/06/16 09:05:22 kls Exp $ + * $Id: tools.h 1.101 2007/06/16 09:15:40 kls Exp $ */ #ifndef __TOOLS_H @@ -96,6 +96,11 @@ int Utf8SymChars(const char *s, int Symbols); int Utf8StrLen(const char *s); ///< Returns the number of UTF-8 symbols formed by the given string of ///< character bytes. +char *Utf8Strn0Cpy(char *Dest, const char *Src, int n); + ///< Copies at most n character bytes from Src to Dst, making sure that the + ///< resulting copy ends with a complete UTF-8 symbol. The copy is guaranteed + ///< to be zero terminated. + ///< Returns a pointer to Dest. int Utf8ToArray(const char *s, uint *a, int Size); ///< Converts the given character bytes (including the terminating 0) into an ///< array of UTF-8 symbols of the given Size. Returns the number of symbols