From e004340f715743e16f599bd0be3e9dad4c53bf2d Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Tue, 21 Dec 1999 02:15:53 +0000 Subject: Fix based on code from monyo@home.monyo.com to fix multibyte continuation issues. Jeremy. (This used to be commit 023f90e7664d358ddf73272597e75041f5413e9f) --- source3/param/params.c | 48 +++++++++++++++++++++++++++++++----------------- 1 file changed, 31 insertions(+), 17 deletions(-) (limited to 'source3/param/params.c') diff --git a/source3/param/params.c b/source3/param/params.c index 74dd3d7a25..944bc3d1b4 100644 --- a/source3/param/params.c +++ b/source3/param/params.c @@ -157,28 +157,42 @@ static int EatComment( FILE *InFile ) return( c ); } /* EatComment */ +/***************************************************************************** + * Scan backards within a string to discover if the last non-whitespace + * character is a line-continuation character ('\\'). + * + * Input: line - A pointer to a buffer containing the string to be + * scanned. + * pos - This is taken to be the offset of the end of the + * string. This position is *not* scanned. + * + * Output: The offset of the '\\' character if it was found, or -1 to + * indicate that it was not. + * + *****************************************************************************/ + static int Continuation( char *line, int pos ) - /* ------------------------------------------------------------------------ ** - * Scan backards within a string to discover if the last non-whitespace - * character is a line-continuation character ('\\'). - * - * Input: line - A pointer to a buffer containing the string to be - * scanned. - * pos - This is taken to be the offset of the end of the - * string. This position is *not* scanned. - * - * Output: The offset of the '\\' character if it was found, or -1 to - * indicate that it was not. - * - * ------------------------------------------------------------------------ ** - */ - { +{ + int pos2 = 0; + pos--; while( (pos >= 0) && isspace(line[pos]) ) pos--; - return( ((pos >= 0) && ('\\' == line[pos])) ? pos : -1 ); - } /* Continuation */ + /* we should recognize if `\` is part of a multibyte character or not. */ + while(pos2 <= pos) { + size_t skip = 0; + skip = skip_multibyte_char(line[pos2]); + if (skip) { + pos2 += skip; + } else if (pos == pos2) { + return( ((pos >= 0) && ('\\' == line[pos])) ? pos : -1 ); + } else { + pos2++; + } + } + return (-1); +} static BOOL Section( FILE *InFile, BOOL (*sfunc)(char *) ) -- cgit