Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
Comment: | first attempt at fixing bug-3466099 |
---|---|
Downloads: | Tarball | ZIP archive | SQL archive |
Timelines: | family | ancestors | descendants | both | bug-3466099 |
Files: | files | file ages | folders |
SHA1: |
625e54fc087a551cf275d04d1a158cf2 |
User & Date: | jan.nijtmans 2011-12-28 23:29:26 |
Context
2012-02-08
| ||
20:22 | merge trunk Closed-Leaf check-in: 66f3affcbc user: jan.nijtmans tags: bug-3466099 | |
2011-12-28
| ||
23:29 | first attempt at fixing bug-3466099 check-in: 625e54fc08 user: jan.nijtmans tags: bug-3466099 | |
2011-12-24
| ||
00:30 | [Bug 3464428] string is graph \u0120 is wrong check-in: 0c1ac83954 user: jan.nijtmans tags: trunk | |
Changes
Changes to doc/FileSystem.3.
︙ | ︙ | |||
414 415 416 417 418 419 420 | accumulates the return values in a list which is returned to the caller (with a reference count of 0). .PP \fBTcl_FSEvalFileEx\fR reads the file given by \fIpathPtr\fR using the encoding identified by \fIencodingName\fR and evaluates its contents as a Tcl script. It returns the same information as \fBTcl_EvalObjEx\fR. | > > > | | | 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 | accumulates the return values in a list which is returned to the caller (with a reference count of 0). .PP \fBTcl_FSEvalFileEx\fR reads the file given by \fIpathPtr\fR using the encoding identified by \fIencodingName\fR and evaluates its contents as a Tcl script. It returns the same information as \fBTcl_EvalObjEx\fR. If the first 3 bytes of the file form the BOM in utf-8 encoding, then the \fIencodingName\fR parameter is ignored and utf-8 encoding is used for reading the remaining of the file. Otherwise, if \fIencodingName\fR is NULL, the system encoding is used for re-reading the full file contents. If the file could not be read then a Tcl error is returned to describe why the file could not be read. The eofchar for files is .QW \e32 (^Z) for all platforms. If you require a .QW ^Z |
︙ | ︙ |
Changes to generic/tclIOUtil.c.
︙ | ︙ | |||
1666 1667 1668 1669 1670 1671 1672 | Tcl_Interp *interp, /* Interpreter in which to process file. */ Tcl_Obj *pathPtr) /* Path of file to process. Tilde-substitution * will be performed on this name. */ { return Tcl_FSEvalFileEx(interp, pathPtr, NULL); } | < | | | | | | < < | | < | | > | | > | < > > | > > | < > > > > > > > > > | > > | | | | > | > > > > | | | < > | > | < < < | > > > > > > > > > > > > > > > > > > > > > > > < < | | < | < < | | < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < | < < < < < < < < < < < < < < < < < < < < | 1666 1667 1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 1678 1679 1680 1681 1682 1683 1684 1685 1686 1687 1688 1689 1690 1691 1692 1693 1694 1695 1696 1697 1698 1699 1700 1701 1702 1703 1704 1705 1706 1707 1708 1709 1710 1711 1712 1713 1714 1715 1716 1717 1718 1719 1720 1721 1722 1723 1724 1725 1726 1727 1728 1729 1730 1731 1732 1733 1734 1735 1736 1737 1738 1739 1740 1741 1742 1743 1744 1745 1746 1747 1748 1749 1750 1751 1752 1753 1754 1755 1756 1757 1758 1759 1760 1761 1762 1763 1764 1765 1766 1767 1768 1769 1770 1771 1772 1773 1774 1775 1776 1777 1778 1779 1780 1781 1782 1783 1784 1785 1786 1787 1788 1789 1790 1791 1792 1793 1794 1795 1796 1797 1798 1799 1800 1801 1802 1803 1804 1805 1806 1807 1808 1809 1810 1811 1812 1813 1814 1815 1816 1817 1818 1819 1820 1821 1822 1823 1824 1825 1826 1827 1828 1829 1830 1831 1832 1833 1834 1835 1836 1837 1838 1839 1840 1841 1842 1843 1844 1845 | Tcl_Interp *interp, /* Interpreter in which to process file. */ Tcl_Obj *pathPtr) /* Path of file to process. Tilde-substitution * will be performed on this name. */ { return Tcl_FSEvalFileEx(interp, pathPtr, NULL); } static Tcl_Obj *OpenFileForEval( Tcl_Interp *interp, /* Interpreter in which to process file. */ Tcl_Obj *pathPtr, /* Path of file to process. Tilde-substitution * will be performed on this name. */ const char *encodingName) /* If non-NULL, then use this encoding for the * file. NULL means use the system encoding. */ { Tcl_Obj *objPtr; Interp *iPtr = (Interp *) interp; Tcl_Channel chan; Tcl_StatBuf statBuf; const char *str; if (Tcl_FSGetNormalizedPath(interp, pathPtr) == NULL) { return NULL; } if (Tcl_FSStat(pathPtr, &statBuf) == -1) { Tcl_SetErrno(errno); Tcl_AppendResult(interp, "couldn't read file \"", Tcl_GetString(pathPtr), "\": ", Tcl_PosixError(interp), NULL); return NULL; } chan = Tcl_FSOpenFileChannel(interp, pathPtr, "r", 0644); if (chan == NULL) { Tcl_ResetResult(interp); Tcl_AppendResult(interp, "couldn't read file \"", Tcl_GetString(pathPtr), "\": ", Tcl_PosixError(interp), NULL); return NULL; } /* * The eofchar is \32 (^Z). This is the usual on Windows, but we effect * this cross-platform to allow for scripted documents. [Bug: 2040] */ Tcl_SetChannelOption(interp, chan, "-eofchar", "\32"); if (Tcl_SetChannelOption(interp, chan, "-encoding", "utf-8") != TCL_OK) { Tcl_Close(interp, chan); return NULL; } objPtr = Tcl_NewObj(); Tcl_IncrRefCount(objPtr); /* Try to read utf-8 BOM, if available */ if (Tcl_ReadChars(chan, objPtr, 1, 0) < 0) { Tcl_Close(interp, chan); Tcl_AppendResult(interp, "couldn't read file \"", Tcl_GetString(pathPtr), "\": ", Tcl_PosixError(interp), NULL); Tcl_DecrRefCount(objPtr); return NULL; } str = Tcl_GetString(objPtr); if (memcmp(str, "\xef\xbf\xbe", 3)) { /* No BOM, so set encoding and re-read channel*/ if (Tcl_SetChannelOption(interp, chan, "-encoding", encodingName ? encodingName : "") != TCL_OK) { Tcl_Close(interp, chan); Tcl_DecrRefCount(objPtr); return NULL; } if (Tcl_Seek(chan, 0, SEEK_SET) == -1) { Tcl_Close(interp, chan); Tcl_DecrRefCount(objPtr); return NULL; } } if (Tcl_ReadChars(chan, objPtr, -1, 0) < 0) { Tcl_Close(interp, chan); Tcl_AppendResult(interp, "couldn't read file \"", Tcl_GetString(pathPtr), "\": ", Tcl_PosixError(interp), NULL); Tcl_DecrRefCount(objPtr); return NULL; } if (Tcl_Close(interp, chan) != TCL_OK) { Tcl_DecrRefCount(objPtr); return NULL; } iPtr->scriptFile = pathPtr; Tcl_IncrRefCount(iPtr->scriptFile); /* * TIP #280: Force the evaluator to open a frame for a sourced file. */ iPtr->evalFlags |= TCL_EVAL_FILE; return objPtr; } int Tcl_FSEvalFileEx( Tcl_Interp *interp, /* Interpreter in which to process file. */ Tcl_Obj *pathPtr, /* Path of file to process. Tilde-substitution * will be performed on this name. */ const char *encodingName) /* If non-NULL, then use this encoding for the * file. NULL means use the system encoding. */ { int length, result = TCL_ERROR; Interp *iPtr = (Interp *) interp; Tcl_Obj *oldScriptFile = iPtr->scriptFile; const char *string; Tcl_Obj *objPtr; objPtr = OpenFileForEval(interp, pathPtr, encodingName); if (!objPtr) { return TCL_ERROR; } string = Tcl_GetStringFromObj(objPtr, &length); result = Tcl_EvalEx(interp, string, length, 0); /* * Now we have to be careful; the script may have changed the * iPtr->scriptFile value, so we must reset it without assuming it still * points to 'pathPtr'. */ if (iPtr->scriptFile != NULL) { Tcl_DecrRefCount(iPtr->scriptFile); } iPtr->scriptFile = oldScriptFile; if (result == TCL_RETURN) { result = TclUpdateReturnInfo(iPtr); } else if (result == TCL_ERROR) { /* * Record information telling where the error occurred. */ int length; const char *pathString = Tcl_GetStringFromObj(pathPtr, &length); int limit = 150; int overflow = (length > limit); Tcl_AppendObjToErrorInfo(interp, Tcl_ObjPrintf( "\n (file \"%.*s%s\" line %d)", (overflow ? limit : length), pathString, (overflow ? "..." : ""), Tcl_GetErrorLine(interp))); } Tcl_DecrRefCount(objPtr); return result; } int TclNREvalFile( Tcl_Interp *interp, /* Interpreter in which to process file. */ Tcl_Obj *pathPtr, /* Path of file to process. Tilde-substitution * will be performed on this name. */ const char *encodingName) /* If non-NULL, then use this encoding for the * file. NULL means use the system encoding. */ { Tcl_Obj *objPtr; Interp *iPtr = (Interp *) interp; Tcl_Obj *oldScriptFile = iPtr->scriptFile; objPtr = OpenFileForEval(interp, pathPtr, encodingName); if (!objPtr) { return TCL_ERROR; } TclNRAddCallback(interp, EvalFileCallback, oldScriptFile, pathPtr, objPtr, NULL); return TclNREvalObjEx(interp, objPtr, 0, NULL, INT_MIN); } static int EvalFileCallback( |
︙ | ︙ |
Changes to tests/source.test.
︙ | ︙ | |||
103 104 105 106 107 108 109 110 111 112 113 114 115 116 | set sourcefile [makeFile {} _non_existent_] removeFile _non_existent_ } -body { list [catch {source $sourcefile} msg] $msg $::errorCode } -match listGlob -result [list 1 \ {couldn't read file "*_non_existent_": no such file or directory} \ {POSIX ENOENT {no such file or directory}}] test source-3.1 {return in middle of source file} -setup { set sourcefile [makeFile { set x new-x return allDone set y new-y } source.file] | > > > > > > > > > > > > > | 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 | set sourcefile [makeFile {} _non_existent_] removeFile _non_existent_ } -body { list [catch {source $sourcefile} msg] $msg $::errorCode } -match listGlob -result [list 1 \ {couldn't read file "*_non_existent_": no such file or directory} \ {POSIX ENOENT {no such file or directory}}] test source-2.7 {utf-8 with BOM} -setup { set sourcefile [makeFile {} source.file] set out [open $sourcefile w] chan configure $out -encoding utf-8 -translation lf chan puts $out "\ufffeset y new-y" chan close $out } -body { set y old-y source $sourcefile set y } -cleanup { removeFile source.file } -result {new-y} test source-3.1 {return in middle of source file} -setup { set sourcefile [makeFile { set x new-x return allDone set y new-y } source.file] |
︙ | ︙ |