diff options
author | Jeremy Allison <jra@samba.org> | 1999-12-21 02:15:53 +0000 |
---|---|---|
committer | Jeremy Allison <jra@samba.org> | 1999-12-21 02:15:53 +0000 |
commit | e004340f715743e16f599bd0be3e9dad4c53bf2d (patch) | |
tree | c73890f2a99e9bfe2add539fd05f31f109235418 /source3 | |
parent | 7b39ef295073847b29af3220e0566131e503b0a0 (diff) | |
download | samba-e004340f715743e16f599bd0be3e9dad4c53bf2d.tar.gz samba-e004340f715743e16f599bd0be3e9dad4c53bf2d.tar.bz2 samba-e004340f715743e16f599bd0be3e9dad4c53bf2d.zip |
Fix based on code from monyo@home.monyo.com to fix multibyte continuation
issues.
Jeremy.
(This used to be commit 023f90e7664d358ddf73272597e75041f5413e9f)
Diffstat (limited to 'source3')
-rw-r--r-- | source3/param/params.c | 48 |
1 files changed, 31 insertions, 17 deletions
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 *) ) |