summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorjan.nijtmans <nijtmans@users.sourceforge.net>2015-10-25 22:32:41 (GMT)
committerjan.nijtmans <nijtmans@users.sourceforge.net>2015-10-25 22:32:41 (GMT)
commitbd597e95d63490d6c9668a27f18d8c4e7e975c10 (patch)
tree16b5653a385b8259c573d8c1ee9ca6391a10bcf1
parent5ad0c4f5c60539e665a660b4b1b457a9e8d99169 (diff)
parent820c13e4bd18805cf590e0fa0e1627e7ecf92ec4 (diff)
downloadtk-bd597e95d63490d6c9668a27f18d8c4e7e975c10.zip
tk-bd597e95d63490d6c9668a27f18d8c4e7e975c10.tar.gz
tk-bd597e95d63490d6c9668a27f18d8c4e7e975c10.tar.bz2
Fix [477949]: option readfile cannot use multibytes.
Implementation adopted from AndroWish, but added support for UTF-8 BOM and added test-case.
-rw-r--r--generic/tkOption.c13
-rwxr-xr-xtests/option.file318
-rw-r--r--tests/option.test12
3 files changed, 36 insertions, 7 deletions
diff --git a/generic/tkOption.c b/generic/tkOption.c
index 75dc3b9..d758b6f 100644
--- a/generic/tkOption.c
+++ b/generic/tkOption.c
@@ -1083,7 +1083,7 @@ ReadOptionFile(
char *buffer;
int result, bufferSize;
Tcl_Channel chan;
- Tcl_DString newName;
+ Tcl_DString newName, optString;
/*
* Prevent file system access in a safe interpreter.
@@ -1135,7 +1135,16 @@ ReadOptionFile(
}
Tcl_Close(NULL, chan);
buffer[bufferSize] = 0;
- result = AddFromString(interp, tkwin, buffer, priority);
+ if ((bufferSize>2) && !memcmp(buffer, "\357\273\277", 3)) {
+ /* File starts with UTF-8 BOM */
+ result = AddFromString(interp, tkwin, buffer+3, priority);
+ } else {
+ Tcl_DStringInit(&optString);
+ Tcl_ExternalToUtfDString(NULL, buffer, bufferSize, &optString);
+ result = AddFromString(interp, tkwin, Tcl_DStringValue(&optString),
+ priority);
+ Tcl_DStringFree(&optString);
+ }
ckfree(buffer);
return result;
}
diff --git a/tests/option.file3 b/tests/option.file3
new file mode 100755
index 0000000..87f41ae
--- /dev/null
+++ b/tests/option.file3
@@ -0,0 +1,18 @@
+! This file is a sample option (resource) database used to test
+! Tk's option-handling capabilities.
+
+! Comment line \
+ with a backslash-newline sequence embedded in it.
+
+*x1: blue
+ tktest.x2 : green
+*\
+x3 \
+ : pur\
+ple
+*x 4: brówn
+# More comments, this time delimited by hash-marks.
+ # Comment-line with space.
+*x6:
+*x9: \ \ \\\101\n
+# comment line as last line of file.
diff --git a/tests/option.test b/tests/option.test
index 23866d7..ea5b5d1 100644
--- a/tests/option.test
+++ b/tests/option.test
@@ -399,18 +399,20 @@ test option-15.10 {database files} -body {
set option2 [file join [testsDirectory] option.file2]
option read $option2
} -returnCodes error -result {missing colon on line 2}
-
+set option3 [file join [testsDirectory] option.file3]
+option read $option3
+test option-15.11 {database files} {option get . {x 4} color} br\xf3wn
test option-16.1 {ReadOptionFile} -body {
- set option3 [makeFile {} option.file3]
- set file [open $option3 w]
+ set option4 [makeFile {} option.file3]
+ set file [open $option4 w]
fconfigure $file -translation crlf
puts $file "*x7: true\n*x8: false"
close $file
- option read $option3 userDefault
+ option read $option4 userDefault
list [option get . x7 color] [option get . x8 color]
} -cleanup {
- removeFile $option3
+ removeFile $option4
} -result {true false}
deleteWindows