diff options
author | Jun-ichiro itojun Hagino <itojun@FreeBSD.org> | 1998-05-10 08:11:44 +0000 |
---|---|---|
committer | Jun-ichiro itojun Hagino <itojun@FreeBSD.org> | 1998-05-10 08:11:44 +0000 |
commit | 2655fa7a696b993968c8b69e049d9f6115be93d8 (patch) | |
tree | eccd7dbf46b175e428918d1d20795b2a31d9c4e6 /japanese/tk80/files | |
parent | 9022b1972ecd263abca31e3904ffb7ebf87a12ca (diff) | |
download | ports-2655fa7a696b993968c8b69e049d9f6115be93d8.tar.gz ports-2655fa7a696b993968c8b69e049d9f6115be93d8.zip |
Notes
Diffstat (limited to 'japanese/tk80/files')
-rw-r--r-- | japanese/tk80/files/README.FreeBSD.in | 48 | ||||
-rw-r--r-- | japanese/tk80/files/patch-aa | 41 | ||||
-rw-r--r-- | japanese/tk80/files/patch-ab | 177 | ||||
-rw-r--r-- | japanese/tk80/files/patch-ac | 790 |
4 files changed, 1056 insertions, 0 deletions
diff --git a/japanese/tk80/files/README.FreeBSD.in b/japanese/tk80/files/README.FreeBSD.in new file mode 100644 index 000000000000..1a2b79fa2c48 --- /dev/null +++ b/japanese/tk80/files/README.FreeBSD.in @@ -0,0 +1,48 @@ +FreeBSDにおける,Tk の ports/packages について + 田口 毅 taguchi@tohoku.iij.ad.jp + +本文章では,FreeBSD環境におけるTkの特徴的な部分をまとめる. + +1. インストールされるファイルについて. +FreeBSD 上では,数多くのプログラムが標準配布に組み込まれており,それに +加えて1200を越えるプログラムが,ports/packagesの仕組みを用いて提供され +ている. + +そこでのリリースエンジニアリング的問題に付いては,Tcl8.0のドキュメント +で述べたので,そちらを参照されたい.ここでは,実際に注意しなければなら +ない事柄を述べるのみとする. + +FreeBSDのports/packagesでインストールされるTk8.0においても,標準の +Tcl/Tkとは,インストールされるディレクトリ階層が異なるファイルが存在す +る. + +相違があるファイルで重要なものは以下の2個であり,それぞれ以下の場所に +インストールされる. + +ファイル名 インストール場所 デフォルトの場所 +tkConfig.sh @prefix@/lib/tk@TK_VERSION@ @exec_prefix@/lib +tk.h @prefix@/include/tk@TK_VERSION@ @prefix@/include + +なお,Tkのソースに含まれるヘッダファイル群は,すべて, + @prefix@/include/tk@TK_VERSION@ +以下の階層にインストールするようにしているのは,Tclと同様である. + +また,これは日本語版に限った話であるが,日本語版tk8.0でも,オンラインマ +ニュアルページ(manファイル群)のインストールを行わないことにしている. +その理由はTcl8.0でのそれと同じである. + +2. その他の相違点 +Tcl/Tk は,Scriptics社によって保守されているが,インターネット上でも +comp.lang.tclを中心に保守が行われている.そして,そこでは,正式なバー +ジョンではまだ修正されていないバグのfixも行われている.こうしたバグ報 +告は, + http://www.cs.uoregon.edu/research/tcl/patch/ +にまとめられている.いずれ,本家にも反映されることが期待されるfixであ +るが,とりあえずja-tk-8.0 でも,これらのfixも一部独自に反映させること +にした.従って,FreeBSDのports/packages版は,より安定して動作すること +が期待できるかもしれない. + +また,オリジナルのTk8.0のports/packagesでは,TkMan-2.0のため?,Tom +Phelps氏のElide patchが含まれている.そのため,日本語化Tkに対する +Elide patchをオリジナルのpatchをもとに作成して添付した.textウィジェッ +トのtagのオプションに-elideの指定を行えるはずである. diff --git a/japanese/tk80/files/patch-aa b/japanese/tk80/files/patch-aa new file mode 100644 index 000000000000..13628c5a62f7 --- /dev/null +++ b/japanese/tk80/files/patch-aa @@ -0,0 +1,41 @@ +--- configure.in.ORIG Tue Jan 6 13:23:19 1998 ++++ configure.in Tue Jan 6 13:24:45 1998 +@@ -9,6 +9,7 @@ + TK_MINOR_VERSION=0 + TK_PATCH_LEVEL="p2" + VERSION=${TK_VERSION} ++TCL_L10N=jp + + if test "${prefix}" = "NONE"; then + prefix=/usr/local +@@ -40,8 +41,8 @@ + if test ! -d $TCL_BIN_DIR; then + AC_MSG_ERROR(Tcl directory $TCL_BIN_DIR doesn't exist) + fi +-if test ! -f $TCL_BIN_DIR/Makefile; then +- AC_MSG_ERROR(There's no Makefile in $TCL_BIN_DIR; perhaps you didn't specify the Tcl *build* directory (not the toplevel Tcl directory) or you forgot to configure Tcl?) ++if test ! -f $TCL_BIN_DIR/tclConfig.sh; then ++ AC_MSG_ERROR(There's no tclConfig.sh in $TCL_BIN_DIR; perhaps you didn't specify the Tcl *build* directory (not the toplevel Tcl directory) or you forgot to configure Tcl?) + fi + + #-------------------------------------------------------------------- +@@ -60,6 +61,8 @@ + DL_LIBS=$TCL_DL_LIBS + LD_FLAGS=$TCL_LD_FLAGS + ++TCL_SRC_DIR=${prefix}/include/tcl${TCL_VERSION} ++ + LIB_RUNTIME_DIR='${LIB_RUNTIME_DIR}' + + # If Tcl and Tk are installed in different places, adjust the library +@@ -387,8 +390,10 @@ + AC_SUBST(SHLIB_VERSION) + AC_SUBST(TCL_BIN_DIR) + AC_SUBST(TCL_BUILD_LIB_SPEC) ++AC_SUBST(TCL_LIB_SPEC) + AC_SUBST(TCL_SRC_DIR) + AC_SUBST(TCL_VERSION) ++AC_SUBST(TCL_L10N) + AC_SUBST(TK_BUILD_LIB_SPEC) + AC_SUBST(TK_CC_SEARCH_FLAGS) + AC_SUBST(TK_LD_SEARCH_FLAGS) diff --git a/japanese/tk80/files/patch-ab b/japanese/tk80/files/patch-ab new file mode 100644 index 000000000000..ba3bdfd3e6a4 --- /dev/null +++ b/japanese/tk80/files/patch-ab @@ -0,0 +1,177 @@ +--- Makefile.in.ORIG Tue Jan 6 13:23:29 1998 ++++ Makefile.in Tue Jan 6 13:25:40 1998 +@@ -56,7 +56,9 @@ + BIN_DIR = $(exec_prefix)/bin + + # Directory in which to install the include file tk.h: +-INCLUDE_INSTALL_DIR = $(INSTALL_ROOT)$(prefix)/include ++INCLUDE_INSTALL_DIR = $(INSTALL_ROOT)$(prefix)/include/tk$(VERSION) ++GENERIC_INCLUDE_INSTALL_DIR = $(INCLUDE_INSTALL_DIR)/generic ++UNIX_INCLUDE_INSTALL_DIR = $(INCLUDE_INSTALL_DIR)/unix + + # Top-level directory for manual entries: + MAN_INSTALL_DIR = $(INSTALL_ROOT)$(prefix)/man +@@ -72,6 +74,9 @@ + # Tcl commands implemented by Tk: + MANN_INSTALL_DIR = $(MAN_INSTALL_DIR)/mann + ++# Directory in which to install sharedable other documents: ++DOC_INSTALL_DIR = $(INSTALL_ROOT)$(prefix)/share/doc/tk$(VERSION) ++ + # The directory containing the Tcl sources and headers appropriate + # for this version of Tk ("srcdir" will be replaced or has already + # been replaced by the configure script): +@@ -94,7 +99,7 @@ + + # Libraries to use when linking. This definition is determined by the + # configure script. +-LIBS = @TCL_BUILD_LIB_SPEC@ @LIBS@ $(X11_LIB_SWITCHES) @DL_LIBS@ @MATH_LIBS@ -lc ++LIBS = @TCL_LIB_SPEC@ @LIBS@ $(X11_LIB_SWITCHES) @DL_LIBS@ @MATH_LIBS@ -lc + + # To change the compiler switches, for example to change from -O + # to -g, change the following line: +@@ -135,7 +140,7 @@ + # "install" around; better to use the install-sh script that comes + # with the distribution, which is slower but guaranteed to work. + +-INSTALL = @srcdir@/install-sh -c ++INSTALL = install -c + INSTALL_PROGRAM = ${INSTALL} + INSTALL_DATA = ${INSTALL} -m 644 + +@@ -148,6 +153,8 @@ + TK_SHLIB_CFLAGS = @TK_SHLIB_CFLAGS@ + + TK_LIB_FILE = @TK_LIB_FILE@ ++TCL_L10N = @TCL_L10N@ ++TK_STATIC_LIB_FILE = libtk80$(TCL_L10N).a + #TK_LIB_FILE = libtk.a + + # The symbol below provides support for dynamic loading and shared +@@ -300,6 +307,10 @@ + + DEMOPROGS = browse hello ixset rmt rolodex square tcolor timer widget + ++DOCS = $(TOP_DIR)/README $(TOP_DIR)/changes $(TOP_DIR)/README.JP \ ++ $(TOP_DIR)/Incompat80jp $(TOP_DIR)/changes.JP \ ++ $(UNIX_DIR)/README.FreeBSD ++ + all: wish + + # The following target is configured by autoconf to generate either +@@ -309,6 +320,11 @@ + @MAKE_LIB@ + $(RANLIB) @TK_LIB_FILE@ + ++$(TK_STATIC_LIB_FILE): $(OBJS) ++ rm -f $(TK_STATIC_LIB_FILE) ++ ar cr $(TK_STATIC_LIB_FILE) $(OBJS) ++ $(RANLIB) $(TK_STATIC_LIB_FILE) ++ + # Make target which outputs the list of the .o contained in the Tk lib + # usefull to build a single big shared library containing Tcl/Tk and other + # extensions. used for the Tcl Plugin. -- dl +@@ -353,13 +369,13 @@ + TK_LIBRARY=$(TOP_DIR)/library; export TK_LIBRARY; \ + ./tktest + +-install: install-binaries install-libraries install-demos install-man ++install: install-binaries install-libraries install-demos + + # Note: before running ranlib below, must cd to target directory because + # some ranlibs write to current directory, and this might not always be + # possible (e.g. if installing as root). + +-install-binaries: $(TK_LIB_FILE) wish ++install-binaries: $(TK_LIB_FILE) $(TK_STATIC_LIB_FILE) wish + @for i in $(LIB_INSTALL_DIR) $(BIN_INSTALL_DIR) ; \ + do \ + if [ ! -d $$i ] ; then \ +@@ -373,13 +389,19 @@ + @$(INSTALL_DATA) $(TK_LIB_FILE) $(LIB_INSTALL_DIR)/$(TK_LIB_FILE) + @(cd $(LIB_INSTALL_DIR); $(RANLIB) $(TK_LIB_FILE)) + @chmod 555 $(LIB_INSTALL_DIR)/$(TK_LIB_FILE) ++ @echo "Installing $(TK_STATIC_LIB_FILE)" ++ @$(INSTALL_DATA) $(TK_STATIC_LIB_FILE) $(LIB_INSTALL_DIR)/$(TK_STATIC_LIB_FILE) ++ @(cd $(LIB_INSTALL_DIR); $(RANLIB) $(TK_STATIC_LIB_FILE)) ++ @chmod 555 $(LIB_INSTALL_DIR)/$(TK_STATIC_LIB_FILE) + @echo "Installing wish" + @$(INSTALL_PROGRAM) wish $(BIN_INSTALL_DIR)/wish$(VERSION) + @echo "Installing tkConfig.sh" +- @$(INSTALL_DATA) tkConfig.sh $(LIB_INSTALL_DIR)/tkConfig.sh ++ @mkdir -p $(LIB_INSTALL_DIR)/tk$(VERSION) ++ @$(INSTALL_DATA) tkConfig.sh $(LIB_INSTALL_DIR)/tk$(VERSION)/tkConfig.sh + + install-libraries: + @for i in $(INSTALL_ROOT)$(prefix)/lib $(INCLUDE_INSTALL_DIR) \ ++ $(GENERIC_INCLUDE_INSTALL_DIR) $(UNIX_INCLUDE_INSTALL_DIR) \ + $(SCRIPT_INSTALL_DIR) $(SCRIPT_INSTALL_DIR)/images; \ + do \ + if [ ! -d $$i ] ; then \ +@@ -389,8 +411,18 @@ + else true; \ + fi; \ + done; +- @echo "Installing tk.h" +- @$(INSTALL_DATA) $(GENERIC_DIR)/tk.h $(INCLUDE_INSTALL_DIR)/tk.h ++ @echo "Installing headers" ++ @for i in $(GENERIC_DIR)/*.h ; \ ++ do \ ++ echo "Installing $$i"; \ ++ $(INSTALL_DATA) $$i $(GENERIC_INCLUDE_INSTALL_DIR); \ ++ done; ++ @for i in $(UNIX_DIR)/*.h ; \ ++ do \ ++ echo "Installing $$i"; \ ++ $(INSTALL_DATA) $$i $(UNIX_INCLUDE_INSTALL_DIR); \ ++ done; ++ @ln -sf $(GENERIC_INCLUDE_INSTALL_DIR)/tk.h $(INCLUDE_INSTALL_DIR)/tk.h + for i in $(SRC_DIR)/library/*.tcl $(SRC_DIR)/library/tclIndex $(SRC_DIR)/library/prolog.ps $(UNIX_DIR)/tkAppInit.c; \ + do \ + echo "Installing $$i"; \ +@@ -449,10 +481,10 @@ + @cd $(SRC_DIR)/doc; for i in *.1; \ + do \ + echo "Installing doc/$$i"; \ +- rm -f $(MAN1_INSTALL_DIR)/$$i; \ ++ rm -f $(MAN1_INSTALL_DIR)/$$i $(MAN1_INSTALL_DIR)/$$i.gz; \ + sed -e '/man\.macros/r man.macros' -e '/man\.macros/d' \ +- $$i > $(MAN1_INSTALL_DIR)/$$i; \ +- chmod 444 $(MAN1_INSTALL_DIR)/$$i; \ ++ $$i | gzip -c > $(MAN1_INSTALL_DIR)/$$i.gz; \ ++ chmod 444 $(MAN1_INSTALL_DIR)/$$i.gz; \ + done; + $(UNIX_DIR)/mkLinks $(MAN1_INSTALL_DIR) + @cd $(SRC_DIR)/doc; for i in *.3; \ +@@ -460,19 +492,26 @@ + echo "Installing doc/$$i"; \ + rm -f $(MAN3_INSTALL_DIR)/$$i; \ + sed -e '/man\.macros/r man.macros' -e '/man\.macros/d' \ +- $$i > $(MAN3_INSTALL_DIR)/$$i; \ +- chmod 444 $(MAN3_INSTALL_DIR)/$$i; \ ++ $$i |gzip -c > $(MAN3_INSTALL_DIR)/$$i.gz; \ ++ chmod 444 $(MAN3_INSTALL_DIR)/$$i.gz; \ + done; + $(UNIX_DIR)/mkLinks $(MAN3_INSTALL_DIR) + @cd $(SRC_DIR)/doc; for i in *.n; \ + do \ + echo "Installing doc/$$i"; \ +- rm -f $(MANN_INSTALL_DIR)/$$i; \ ++ rm -f $(MANN_INSTALL_DIR)/$$i $(MANN_INSTALL_DIR)/$$i.gz; \ + sed -e '/man\.macros/r man.macros' -e '/man\.macros/d' \ +- $$i > $(MANN_INSTALL_DIR)/$$i; \ +- chmod 444 $(MANN_INSTALL_DIR)/$$i; \ ++ $$i | gzip -c > $(MANN_INSTALL_DIR)/$$i.gz; \ ++ chmod 444 $(MANN_INSTALL_DIR)/$$i.gz; \ + done; + $(UNIX_DIR)/mkLinks $(MANN_INSTALL_DIR) ++ @echo "**********" ++ @echo "IMPORTANT:" ++ @echo "**********" ++ @echo "tkConfig.sh in $(SCRIPT_INSTALL_DIR)/tkConfig.sh" ++ @echo "tk.h in $(INCLUDE_INSTALL_DIR)/tk.h" ++ @echo "There are NOT default place, but good place to avoid" ++ @echo "conflicting with another version of Tcl/Tks." + + Makefile: $(UNIX_DIR)/Makefile.in + $(SHELL) config.status diff --git a/japanese/tk80/files/patch-ac b/japanese/tk80/files/patch-ac new file mode 100644 index 000000000000..91fc56a203d9 --- /dev/null +++ b/japanese/tk80/files/patch-ac @@ -0,0 +1,790 @@ +diff -urN tk8.0.ORIG/generic/tkText.c ../generic/tkText.c +--- tk8.0.ORIG/generic/tkText.c Mon Jan 5 12:35:50 1998 ++++ ../generic/tkText.c Mon Jan 5 16:03:17 1998 +@@ -946,6 +946,7 @@ + || (textPtr->selTagPtr->spacing2String != NULL) + || (textPtr->selTagPtr->spacing3String != NULL) + || (textPtr->selTagPtr->tabString != NULL) ++ || (textPtr->selTagPtr->elideString != NULL) + || (textPtr->selTagPtr->underlineString != NULL) + || (textPtr->selTagPtr->wrapMode != NULL)) { + textPtr->selTagPtr->affectsDisplay = 1; +@@ -1520,7 +1521,7 @@ + } + } + } +- if (segPtr->typePtr == &tkTextCharType) { ++ if (segPtr->typePtr == &tkTextCharType && !TkTextIsElided(textPtr, &textPtr->selIndex)) { + #ifdef TK_KANJI_OK + memcpy((VOID *) buffer, (VOID *) (str + offset), (size_t) numBytes); + offset = 0; +@@ -1828,7 +1829,7 @@ + int argc; /* Number of arguments. */ + char **argv; /* Argument strings. */ + { +- int backwards, exact, c, i, argsLeft, noCase, leftToScan; ++ int backwards, exact, searchElide, c, i, argsLeft, noCase, leftToScan; + size_t length; + int numLines, startingLine, startingChar, lineNum, firstChar, lastChar; + int code, matchLength, matchChar, passes, stopLine, searchWholeText; +@@ -1839,6 +1840,7 @@ + Tcl_DString line, patDString; + TkTextSegment *segPtr; + TkTextLine *linePtr; ++ TkTextIndex curIndex; + Tcl_RegExp regexp = NULL; /* Initialization needed only to + * prevent compiler warning. */ + +@@ -1847,6 +1849,8 @@ + */ + + exact = 1; ++ searchElide = 0; ++ curIndex.tree = textPtr->tree; + backwards = 0; + noCase = 0; + varName = NULL; +@@ -1860,7 +1864,7 @@ + badSwitch: + Tcl_AppendResult(interp, "bad switch \"", arg, + "\": must be -forward, -backward, -exact, -regexp, ", +- "-nocase, -count, or --", (char *) NULL); ++ "-nocase, -count, -elide, or --", (char *) NULL); + return TCL_ERROR; + } + c = arg[1]; +@@ -1881,6 +1885,8 @@ + noCase = 1; + } else if ((c == 'r') && (strncmp(argv[i], "-regexp", length) == 0)) { + exact = 0; ++ } else if ((c == 'e') && (strncmp(argv[i], "-elide", length) == 0)) { ++ searchElide = 1; + } else if ((c == '-') && (strncmp(argv[i], "--", length) == 0)) { + i++; + break; +@@ -1976,13 +1982,14 @@ + */ + + linePtr = TkBTreeFindLine(textPtr->tree, lineNum); ++ curIndex.linePtr = linePtr; curIndex.charIndex = 0; + for (segPtr = linePtr->segPtr; segPtr != NULL; +- segPtr = segPtr->nextPtr) { ++ curIndex.charIndex += segPtr->size, segPtr = segPtr->nextPtr) { + #ifdef TK_KANJI_OK + int i; + char *str; + #endif /* TK_KANJI_OK */ +- if (segPtr->typePtr != &tkTextCharType) { ++ if (segPtr->typePtr != &tkTextCharType || (!searchElide && TkTextIsElided(textPtr, &curIndex))) { + continue; + } + #ifdef TK_KANJI_OK +@@ -2210,7 +2217,7 @@ + int argc; /* Number of arguments. */ + char **argv; /* Argument strings. */ + { +- int backwards, exact, c, i, argsLeft, noCase, leftToScan; ++ int backwards, exact, searchElide, c, i, argsLeft, noCase, leftToScan; + size_t length; + int numLines, startingLine, startingChar, lineNum, firstChar, lastChar; + int code, matchLength, matchChar, passes, stopLine, searchWholeText; +@@ -2230,6 +2237,7 @@ + #endif /* TK_KANJI_OK */ + TkTextSegment *segPtr; + TkTextLine *linePtr; ++ TkTextIndex curIndex; + #ifndef TK_KANJI_OK + Tcl_RegExp regexp = NULL; /* Initialization needed only to + * prevent compiler warning. */ +@@ -2240,6 +2248,8 @@ + */ + + exact = 1; ++ searchElide = 0; ++ curIndex.tree = textPtr->tree; + backwards = 0; + noCase = 0; + varName = NULL; +@@ -2253,7 +2263,7 @@ + badSwitch: + Tcl_AppendResult(interp, "bad switch \"", arg, + "\": must be -forward, -backward, -exact, -regexp, ", +- "-nocase, -count, or --", (char *) NULL); ++ "-nocase, -count, -elide, or --", (char *) NULL); + return TCL_ERROR; + } + c = arg[1]; +@@ -2278,6 +2288,8 @@ + noCase = 1; + } else if ((c == 'r') && (strncmp(argv[i], "-regexp", length) == 0)) { + exact = 0; ++ } else if ((c == 'e') && (strncmp(argv[i], "-elide", length) == 0)) { ++ searchElide = 1; + } else if ((c == '-') && (strncmp(argv[i], "--", length) == 0)) { + i++; + break; +@@ -2405,9 +2417,10 @@ + */ + + linePtr = TkBTreeFindLine(textPtr->tree, lineNum); ++ curIndex.linePtr = linePtr; curIndex.charIndex = 0; + for (segPtr = linePtr->segPtr; segPtr != NULL; +- segPtr = segPtr->nextPtr) { +- if (segPtr->typePtr != &tkTextCharType) { ++ curIndex.charIndex += segPtr->size, segPtr = segPtr->nextPtr) { ++ if (segPtr->typePtr != &tkTextCharType || (!searchElide && TkTextIsElided(textPtr, &curIndex))) { + continue; + } + #ifdef TK_KANJI_OK +diff -urN tk8.0.ORIG/generic/tkText.h ../generic/tkText.h +--- tk8.0.ORIG/generic/tkText.h Mon Jan 5 12:35:52 1998 ++++ ../generic/tkText.h Mon Jan 5 14:10:20 1998 +@@ -378,6 +378,10 @@ + * Must be tkTextCharUid, tkTextNoneUid, + * tkTextWordUid, or NULL to use wrapMode + * for whole widget. */ ++ char *elideString; /* -elide option string (malloc-ed). ++ * NULL means option not specified. */ ++ int elide; /* Non-zero means text is elided. ++ * Only valid if elideString is non-NULL. */ + int affectsDisplay; /* Non-zero means that this tag affects the + * way information is displayed on the screen + * (so need to redisplay if tag changes). */ +@@ -808,6 +812,8 @@ + ClientData clientData)); + extern TkTextIndex * TkTextMakeIndex _ANSI_ARGS_((TkTextBTree tree, + int lineIndex, int charIndex, ++ TkTextIndex *indexPtr)); ++extern int TkTextIsElided _ANSI_ARGS_((TkText *textPtr, + TkTextIndex *indexPtr)); + extern int TkTextMarkCmd _ANSI_ARGS_((TkText *textPtr, + Tcl_Interp *interp, int argc, char **argv)); +diff -urN tk8.0.ORIG/generic/tkTextBTree.c ../generic/tkTextBTree.c +--- tk8.0.ORIG/generic/tkTextBTree.c Mon Jan 5 12:35:50 1998 ++++ ../generic/tkTextBTree.c Mon Jan 5 14:10:20 1998 +@@ -2447,6 +2447,132 @@ + } + return tagInfo.tagPtrs; + } ++ ++ ++/* ++ special case to just return information about elided attribute ++ specialized from TkBTreeGetTags(indexPtr, numTagsPtr) and GetStyle(textPtr, indexPtr) ++ just need to keep track of invisibility settings for each priority, pick highest one active at end ++*/ ++int ++TkTextIsElided(textPtr, indexPtr) ++ TkText *textPtr; /* Overall information about text widget. */ ++ TkTextIndex *indexPtr; /* The character in the text for which ++ * display information is wanted. */ ++{ ++#define LOTSA_TAGS 1000 ++ int elide = 0; /* if nobody says otherwise, it's visible */ ++ ++ int deftagCnts[LOTSA_TAGS]; ++ int *tagCnts = deftagCnts; ++ TkTextTag *deftagPtrs[LOTSA_TAGS]; ++ TkTextTag **tagPtrs = deftagPtrs; ++ int numTags = textPtr->numTags; ++ register Node *nodePtr; ++ register TkTextLine *siblingLinePtr; ++ register TkTextSegment *segPtr; ++ register TkTextTag *tagPtr; ++ register int i, index; ++ ++ /* almost always avoid malloc, so stay out of system calls */ ++ if (LOTSA_TAGS < numTags) { ++ tagCnts = (int *)ckalloc((unsigned)sizeof(int) * numTags); ++ tagPtrs = (TkTextTag **)ckalloc((unsigned)sizeof(TkTextTag *) * numTags); ++ } ++ ++ for (i=0; i<numTags; i++) tagCnts[i]=0; ++ ++ ++ /* ++ * Record tag toggles within the line of indexPtr but preceding ++ * indexPtr. ++ */ ++ ++ for (index = 0, segPtr = indexPtr->linePtr->segPtr; ++ (index + segPtr->size) <= indexPtr->charIndex; ++ index += segPtr->size, segPtr = segPtr->nextPtr) { ++ if ((segPtr->typePtr == &tkTextToggleOnType) ++ || (segPtr->typePtr == &tkTextToggleOffType)) { ++ tagPtr = segPtr->body.toggle.tagPtr; ++ if (tagPtr->elideString != NULL) { ++ tagPtrs[tagPtr->priority] = tagPtr; ++ tagCnts[tagPtr->priority]++; ++ } ++ } ++ } ++ ++ /* ++ * Record toggles for tags in lines that are predecessors of ++ * indexPtr->linePtr but under the same level-0 node. ++ */ ++ ++ for (siblingLinePtr = indexPtr->linePtr->parentPtr->children.linePtr; ++ siblingLinePtr != indexPtr->linePtr; ++ siblingLinePtr = siblingLinePtr->nextPtr) { ++ for (segPtr = siblingLinePtr->segPtr; segPtr != NULL; ++ segPtr = segPtr->nextPtr) { ++ if ((segPtr->typePtr == &tkTextToggleOnType) ++ || (segPtr->typePtr == &tkTextToggleOffType)) { ++ tagPtr = segPtr->body.toggle.tagPtr; ++ if (tagPtr->elideString != NULL) { ++ tagPtrs[tagPtr->priority] = tagPtr; ++ tagCnts[tagPtr->priority]++; ++ } ++ } ++ } ++ } ++ ++ /* ++ * For each node in the ancestry of this line, record tag toggles ++ * for all siblings that precede that node. ++ */ ++ ++ for (nodePtr = indexPtr->linePtr->parentPtr; nodePtr->parentPtr != NULL; ++ nodePtr = nodePtr->parentPtr) { ++ register Node *siblingPtr; ++ register Summary *summaryPtr; ++ ++ for (siblingPtr = nodePtr->parentPtr->children.nodePtr; ++ siblingPtr != nodePtr; siblingPtr = siblingPtr->nextPtr) { ++ for (summaryPtr = siblingPtr->summaryPtr; summaryPtr != NULL; ++ summaryPtr = summaryPtr->nextPtr) { ++ if (summaryPtr->toggleCount & 1) { ++ tagPtr = summaryPtr->tagPtr; ++ if (tagPtr->elideString != NULL) { ++ tagPtrs[tagPtr->priority] = tagPtr; ++ tagCnts[tagPtr->priority] += summaryPtr->toggleCount; ++ } ++ } ++ } ++ } ++ } ++ ++ ++ /* ++ * Now traverse from highest priority to lowest, ++ * take elided value from first odd count (= on) ++ */ ++ ++ for (i = numTags-1; i >=0; i--) { ++ if (tagCnts[i] & 1) { ++#ifndef ALWAYS_SHOW_SELECTION ++ /* who would make the selection elided? */ ++ if ((tagPtr == textPtr->selTagPtr) && !(textPtr->flags & GOT_FOCUS)) { ++ continue; ++ } ++#endif ++ elide = tagPtrs[i]->elide; ++ break; ++ } ++ } ++ ++ if (LOTSA_TAGS < numTags) { ++ ckfree((char *) tagCnts); ++ ckfree((char *) tagPtrs); ++ } ++ ++ return elide; ++} + + /* + *---------------------------------------------------------------------- +diff -urN tk8.0.ORIG/generic/tkTextDisp.c ../generic/tkTextDisp.c +--- tk8.0.ORIG/generic/tkTextDisp.c Mon Jan 5 12:35:50 1998 ++++ ../generic/tkTextDisp.c Mon Jan 5 14:10:21 1998 +@@ -59,6 +59,7 @@ + * be NULL). */ + int underline; /* Non-zero means draw underline underneath + * text. */ ++ int elide; /* Non-zero means draw text */ + Tk_Uid wrapMode; /* How to handle wrap-around for this tag. + * One of tkTextCharUid, tkTextNoneUid, + * or tkTextWordUid. */ +@@ -321,6 +322,21 @@ + int x)); + static void CharUndisplayProc _ANSI_ARGS_((TkText *textPtr, + TkTextDispChunk *chunkPtr)); ++ ++/* ++ Definitions of elided procs. ++ Compiler can't inline these since we use pointers to these functions. ++ ElideDisplayProc, ElideUndisplayProc special-cased for speed, ++ as potentially many elided DLine chunks if large, tag toggle-filled ++ elided region. ++*/ ++static void ElideBboxProc _ANSI_ARGS_((TkTextDispChunk *chunkPtr, ++ int index, int y, int lineHeight, int baseline, ++ int *xPtr, int *yPtr, int *widthPtr, ++ int *heightPtr)); ++static int ElideMeasureProc _ANSI_ARGS_((TkTextDispChunk *chunkPtr, ++ int x)); ++ + static void DisplayDLine _ANSI_ARGS_((TkText *textPtr, + DLine *dlPtr, DLine *prevPtr, Pixmap pixmap)); + static void DisplayLineBackground _ANSI_ARGS_((TkText *textPtr, +@@ -495,7 +511,7 @@ + + int borderPrio, borderWidthPrio, reliefPrio, bgStipplePrio; + int fgPrio, fontPrio, fgStipplePrio; +- int underlinePrio, justifyPrio, offsetPrio; ++ int underlinePrio, elidePrio, justifyPrio, offsetPrio; + int lMargin1Prio, lMargin2Prio, rMarginPrio; + int spacing1Prio, spacing2Prio, spacing3Prio; + int overstrikePrio, tabPrio, wrapPrio; +@@ -510,7 +526,7 @@ + tagPtrs = TkBTreeGetTags(indexPtr, &numTags); + borderPrio = borderWidthPrio = reliefPrio = bgStipplePrio = -1; + fgPrio = fontPrio = fgStipplePrio = -1; +- underlinePrio = justifyPrio = offsetPrio = -1; ++ underlinePrio = elidePrio = justifyPrio = offsetPrio = -1; + lMargin1Prio = lMargin2Prio = rMarginPrio = -1; + spacing1Prio = spacing2Prio = spacing3Prio = -1; + overstrikePrio = tabPrio = wrapPrio = -1; +@@ -628,6 +644,11 @@ + styleValues.underline = tagPtr->underline; + underlinePrio = tagPtr->priority; + } ++ if ((tagPtr->elideString != NULL) ++ && (tagPtr->priority > elidePrio)) { ++ styleValues.elide = tagPtr->elide; ++ elidePrio = tagPtr->priority; ++ } + if ((tagPtr->wrapMode != NULL) + && (tagPtr->priority > wrapPrio)) { + styleValues.wrapMode = tagPtr->wrapMode; +@@ -784,7 +805,7 @@ + * lines with numChars > 0. Used to + * drop 0-sized chunks from the end + * of the line. */ +- int offset, ascent, descent, code; ++ int offset, ascent, descent, code, elide, elidesize; + StyleValues *sValuePtr; + + /* +@@ -802,6 +823,34 @@ + dlPtr->nextPtr = NULL; + dlPtr->flags = NEW_LAYOUT; + ++ ++ /* ++ * special case entirely elide line as there may be 1000s or more ++ */ ++ elide = TkTextIsElided(textPtr, indexPtr); /* save a malloc */ ++ if (elide && indexPtr->charIndex==0) { ++ maxChars = 0; ++ for (segPtr = indexPtr->linePtr->segPtr; elide && segPtr!=NULL; segPtr = segPtr->nextPtr) { ++ if ((elidesize = segPtr->size) > 0) { ++ maxChars += elidesize; ++ ++ /* if have tag toggle, chance that invisibility state changed, so bail out */ ++ } else if (segPtr->typePtr == &tkTextToggleOffType || segPtr->typePtr == &tkTextToggleOnType) { ++ if (segPtr->body.toggle.tagPtr->elideString!=NULL) { ++ elide = (segPtr->typePtr == &tkTextToggleOffType) ^ (segPtr->body.toggle.tagPtr->elide==1); ++ } ++ } ++ } ++ ++ if (elide) { ++ dlPtr->count = maxChars; ++ dlPtr->spaceAbove = dlPtr->spaceBelow = dlPtr->length = 0; ++ return dlPtr; ++ } ++ } ++ ++ ++ + /* + * Each iteration of the loop below creates one TkTextDispChunk for + * the new display line. The line will always have at least one +@@ -813,6 +862,7 @@ + lastChunkPtr = NULL; + chunkPtr = NULL; + noCharsYet = 1; ++ elide = 0; + breakChunkPtr = NULL; + breakCharOffset = 0; + justify = TK_JUSTIFY_LEFT; +@@ -837,6 +887,31 @@ + } + + while (segPtr != NULL) { ++ ++ /* every line still gets at least one chunk due to expectations in rest of code, ++ but able to skip elided portions of line quickly */ ++ /* if current chunk elided and last chunk was too, coalese */ ++ if (elide && lastChunkPtr!=NULL && lastChunkPtr->displayProc == NULL/*ElideDisplayProc*/) { ++ if ((elidesize = segPtr->size - offset) > 0) { ++ curIndex.charIndex += elidesize; ++ lastChunkPtr->numChars += elidesize; ++ breakCharOffset = lastChunkPtr->breakIndex = lastChunkPtr->numChars; ++ ++ /* if have tag toggle, chance that invisibility state changed */ ++ } else if (segPtr->typePtr == &tkTextToggleOffType || segPtr->typePtr == &tkTextToggleOnType) { ++ if (segPtr->body.toggle.tagPtr->elideString!=NULL) { ++ elide = (segPtr->typePtr == &tkTextToggleOffType) ^ (segPtr->body.toggle.tagPtr->elide==1); ++ } ++ } ++ ++ offset = 0; ++ segPtr = segPtr->nextPtr; ++ if (segPtr == NULL && chunkPtr != NULL) ckfree((char *) chunkPtr); ++ ++ continue; ++ } ++ ++ + if (segPtr->typePtr->layoutProc == NULL) { + segPtr = segPtr->nextPtr; + offset = 0; +@@ -847,6 +922,7 @@ + chunkPtr->nextPtr = NULL; + } + chunkPtr->stylePtr = GetStyle(textPtr, &curIndex); ++ elide = chunkPtr->stylePtr->sValuePtr->elide; + + /* + * Save style information such as justification and indentation, +@@ -880,7 +956,7 @@ + + gotTab = 0; + maxChars = segPtr->size - offset; +- if (justify == TK_JUSTIFY_LEFT) { ++ if (!elide && justify == TK_JUSTIFY_LEFT) { + if (segPtr->typePtr == &tkTextCharType) { + #ifdef TK_KANJI_OK + wchar *p; +@@ -896,8 +972,21 @@ + } + } + } +- + chunkPtr->x = x; ++ if (elide && maxChars) { ++ /* don't free style here, as other code expects to be able to do that */ ++ /*breakCharOffset =*/ chunkPtr->breakIndex = chunkPtr->numChars = maxChars; ++ chunkPtr->width = 0; ++ chunkPtr->minAscent = chunkPtr->minDescent = chunkPtr->minHeight = 0; ++ ++ /* would just like to point to canonical empty chunk */ ++ chunkPtr->displayProc = (Tk_ChunkDisplayProc *) NULL; ++ chunkPtr->undisplayProc = (Tk_ChunkUndisplayProc *) NULL; ++ chunkPtr->measureProc = ElideMeasureProc; ++ chunkPtr->bboxProc = ElideBboxProc; ++ ++ code = 1; ++ } else + code = (*segPtr->typePtr->layoutProc)(textPtr, &curIndex, segPtr, + offset, maxX-tabSize, maxChars, noCharsYet, wrapMode, + chunkPtr); +@@ -969,6 +1058,7 @@ + offset = 0; + segPtr = segPtr->nextPtr; + } ++ + chunkPtr = NULL; + } + if (noCharsYet) { +@@ -1017,6 +1107,7 @@ + wholeLine = 0; + } + ++ + /* + * Make tab adjustments for the last tab stop, if there is one. + */ +@@ -1340,6 +1431,7 @@ + index.linePtr = TkBTreeFindLine(textPtr->tree, lineNum); + index.charIndex = 0; + lowestPtr = NULL; ++ + do { + dlPtr = LayoutDLine(textPtr, &index); + dlPtr->nextPtr = lowestPtr; +@@ -1573,6 +1665,8 @@ + Display *display; + int height, x; + ++ if (dlPtr->chunkPtr == NULL) return; ++ + /* + * First, clear the area of the line to the background color for the + * text widget. +@@ -1639,12 +1733,16 @@ + * something is off to the right). + */ + ++ if (chunkPtr->displayProc != NULL) + (*chunkPtr->displayProc)(chunkPtr, -chunkPtr->width, + dlPtr->spaceAbove, + dlPtr->height - dlPtr->spaceAbove - dlPtr->spaceBelow, + dlPtr->baseline - dlPtr->spaceAbove, display, pixmap, + dlPtr->y + dlPtr->spaceAbove); + } else { ++ /* don't call if elide. This tax ok since not very many visible DLine's in ++ an area, but potentially many elide ones */ ++ if (chunkPtr->displayProc != NULL) + (*chunkPtr->displayProc)(chunkPtr, x, dlPtr->spaceAbove, + dlPtr->height - dlPtr->spaceAbove - dlPtr->spaceBelow, + dlPtr->baseline - dlPtr->spaceAbove, display, pixmap, +@@ -1733,6 +1831,7 @@ + StyleValues *sValuePtr; + Display *display; + ++ + /* + * Pass 1: scan through dlPtr from left to right. For each range of + * chunks with the same style, draw the main background for the style +@@ -1806,7 +1905,7 @@ + rightX = maxX; + } + chunkPtr2 = NULL; +- if (prevPtr != NULL) { ++ if (prevPtr != NULL && prevPtr->chunkPtr != NULL) { + /* + * Find the chunk in the previous line that covers leftX. + */ +@@ -1927,7 +2026,8 @@ + rightX = maxX; + } + chunkPtr2 = NULL; +- if (dlPtr->nextPtr != NULL) { ++/* for (dlPtr2 = dlPtr; dlPtr2->nextPtr != NULL && dlPtr2->nextPtr->chunkPtr == NULL; dlPtr2 = dlPtr2->nextPtr) {}*/ ++ if (dlPtr->nextPtr != NULL && dlPtr->nextPtr->chunkPtr != NULL) { + /* + * Find the chunk in the previous line that covers leftX. + */ +@@ -2318,6 +2418,7 @@ + for (prevPtr = NULL, dlPtr = textPtr->dInfoPtr->dLinePtr; + (dlPtr != NULL) && (dlPtr->y < dInfoPtr->maxY); + prevPtr = dlPtr, dlPtr = dlPtr->nextPtr) { ++ if (dlPtr->chunkPtr == NULL) continue; + if (dlPtr->oldY != dlPtr->y) { + if (tkTextDebug) { + char string[TK_POS_CHARS]; +@@ -2334,6 +2435,7 @@ + dlPtr->oldY = dlPtr->y; + dlPtr->flags &= ~NEW_LAYOUT; + } ++ /*prevPtr = dlPtr;*/ + } + Tk_FreePixmap(Tk_Display(textPtr->tkwin), pixmap); + } +@@ -3388,6 +3490,7 @@ + dlPtr = LayoutDLine(textPtr, &index); + dlPtr->nextPtr = lowestPtr; + lowestPtr = dlPtr; ++ if (dlPtr->length == 0 && dlPtr->height == 0) { offset--; break; } /* elide */ + TkTextIndexForwChars(&index, dlPtr->count, &index); + charsToCount -= dlPtr->count; + } while ((charsToCount > 0) +@@ -3400,7 +3503,7 @@ + break; + } + } +- ++ + /* + * Discard the display lines, then either return or prepare + * for the next display line to lay out. +@@ -3429,12 +3532,14 @@ + TkBTreeNumLines(textPtr->tree)); + for (i = 0; i < offset; i++) { + dlPtr = LayoutDLine(textPtr, &textPtr->topIndex); ++ if (dlPtr->length == 0 && dlPtr->height == 0) offset++; + dlPtr->nextPtr = NULL; + TkTextIndexForwChars(&textPtr->topIndex, dlPtr->count, &new); + FreeDLines(textPtr, dlPtr, (DLine *) NULL, 0); + if (new.linePtr == lastLinePtr) { + break; + } ++ + textPtr->topIndex = new; + } + } +@@ -3968,7 +4073,7 @@ + * index of the character nearest to (x,y). */ + { + TextDInfo *dInfoPtr = textPtr->dInfoPtr; +- register DLine *dlPtr; ++ register DLine *dlPtr, *validdlPtr; + register TkTextDispChunk *chunkPtr; + + /* +@@ -4001,8 +4106,9 @@ + * Find the display line containing the desired y-coordinate. + */ + +- for (dlPtr = dInfoPtr->dLinePtr; y >= (dlPtr->y + dlPtr->height); ++ for (dlPtr = validdlPtr = dInfoPtr->dLinePtr; y >= (dlPtr->y + dlPtr->height); + dlPtr = dlPtr->nextPtr) { ++ if (dlPtr->chunkPtr !=NULL) validdlPtr = dlPtr; + if (dlPtr->nextPtr == NULL) { + /* + * Y-coordinate is off the bottom of the displayed text. +@@ -4013,6 +4119,8 @@ + break; + } + } ++ if (dlPtr->chunkPtr == NULL) dlPtr = validdlPtr; ++ + + /* + * Scan through the line's chunks to find the one that contains +@@ -4024,12 +4132,12 @@ + *indexPtr = dlPtr->index; + x = x - dInfoPtr->x + dInfoPtr->curPixelOffset; + for (chunkPtr = dlPtr->chunkPtr; x >= (chunkPtr->x + chunkPtr->width); +- indexPtr->charIndex += chunkPtr->numChars, +- chunkPtr = chunkPtr->nextPtr) { ++ indexPtr->charIndex += chunkPtr->numChars, ++ chunkPtr = chunkPtr->nextPtr) { + if (chunkPtr->nextPtr == NULL) { + indexPtr->charIndex += chunkPtr->numChars - 1; + return; +- } ++ } + } + + /* +@@ -4185,6 +4293,7 @@ + { + TextDInfo *dInfoPtr = textPtr->dInfoPtr; + DLine *dlPtr; ++ int dlx; + + /* + * Make sure that all of the screen layout information is up to date. +@@ -4203,8 +4312,9 @@ + return -1; + } + +- *xPtr = dInfoPtr->x - dInfoPtr->curPixelOffset + dlPtr->chunkPtr->x; +- *widthPtr = dlPtr->length - dlPtr->chunkPtr->x; ++ dlx = (dlPtr->chunkPtr != NULL? dlPtr->chunkPtr->x: 0); ++ *xPtr = dInfoPtr->x - dInfoPtr->curPixelOffset + dlx; ++ *widthPtr = dlPtr->length - dlx; + *yPtr = dlPtr->y; + if ((dlPtr->y + dlPtr->height) > dInfoPtr->maxY) { + *heightPtr = dInfoPtr->maxY - dlPtr->y; +@@ -4215,6 +4325,41 @@ + return 0; + } + ++static void ++ElideBboxProc(chunkPtr, index, y, lineHeight, baseline, xPtr, yPtr, ++ widthPtr, heightPtr) ++ TkTextDispChunk *chunkPtr; /* Chunk containing desired char. */ ++ int index; /* Index of desired character within ++ * the chunk. */ ++ int y; /* Topmost pixel in area allocated ++ * for this line. */ ++ int lineHeight; /* Height of line, in pixels. */ ++ int baseline; /* Location of line's baseline, in ++ * pixels measured down from y. */ ++ int *xPtr, *yPtr; /* Gets filled in with coords of ++ * character's upper-left pixel. ++ * X-coord is in same coordinate ++ * system as chunkPtr->x. */ ++ int *widthPtr; /* Gets filled in with width of ++ * character, in pixels. */ ++ int *heightPtr; /* Gets filled in with height of ++ * character, in pixels. */ ++{ ++ *xPtr = chunkPtr->x; ++ *yPtr = y; ++ *widthPtr = *heightPtr = 0; ++} ++ ++ ++static int ++ElideMeasureProc(chunkPtr, x) ++ TkTextDispChunk *chunkPtr; /* Chunk containing desired coord. */ ++ int x; /* X-coordinate, in same coordinate ++ * system as chunkPtr->x. */ ++{ ++ return 0 /*chunkPtr->numChars - 1*/; ++} ++ + /* + *-------------------------------------------------------------- + * +@@ -4457,7 +4602,7 @@ + * Draw the text, underline, and overstrike for this chunk. + */ + +- if (ciPtr->numChars > offsetChars) { ++ if (!sValuePtr->elide && ciPtr->numChars > offsetChars) { + int numChars = ciPtr->numChars - offsetChars; + #ifdef TK_KANJI_OK + wchar *string = ciPtr->chars + offsetChars; +diff -urN tk8.0.ORIG/generic/tkTextTag.c ../generic/tkTextTag.c +--- tk8.0.ORIG/generic/tkTextTag.c Mon Jan 5 12:35:51 1998 ++++ ../generic/tkTextTag.c Mon Jan 5 14:10:21 1998 +@@ -63,6 +63,9 @@ + {TK_CONFIG_STRING, "-underline", (char *) NULL, (char *) NULL, + (char *) NULL, Tk_Offset(TkTextTag, underlineString), + TK_CONFIG_NULL_OK}, ++ {TK_CONFIG_STRING, "-elide", (char *) NULL, (char *) NULL, ++ (char *) NULL, Tk_Offset(TkTextTag, elideString), ++ TK_CONFIG_NULL_OK}, + {TK_CONFIG_UID, "-wrap", (char *) NULL, (char *) NULL, + (char *) NULL, Tk_Offset(TkTextTag, wrapMode), + TK_CONFIG_NULL_OK}, +@@ -378,6 +381,12 @@ + return TCL_ERROR; + } + } ++ if (tagPtr->elideString != NULL) { ++ if (Tcl_GetBoolean(interp, tagPtr->elideString, ++ &tagPtr->elide) != TCL_OK) { ++ return TCL_ERROR; ++ } ++ } + if ((tagPtr->wrapMode != NULL) + && (tagPtr->wrapMode != tkTextCharUid) + && (tagPtr->wrapMode != tkTextNoneUid) +@@ -419,6 +428,7 @@ + || (tagPtr->spacing3String != NULL) + || (tagPtr->tabString != NULL) + || (tagPtr->underlineString != NULL) ++ || (tagPtr->elideString != NULL) + || (tagPtr->wrapMode != NULL)) { + tagPtr->affectsDisplay = 1; + } +@@ -811,6 +821,8 @@ + tagPtr->tabArrayPtr = NULL; + tagPtr->underlineString = NULL; + tagPtr->underline = 0; ++ tagPtr->elideString = NULL; ++ tagPtr->elide = 0; + tagPtr->wrapMode = NULL; + tagPtr->affectsDisplay = 0; + textPtr->numTags++; +@@ -934,6 +946,9 @@ + } + if (tagPtr->underlineString != NULL) { + ckfree(tagPtr->underlineString); ++ } ++ if (tagPtr->elideString != NULL) { ++ ckfree(tagPtr->elideString); + } + ckfree((char *) tagPtr); + } +diff -urN tk8.0.ORIG/tests/text.test ../tests/text.test +--- tk8.0.ORIG/tests/text.test Mon Jan 5 12:35:27 1998 ++++ ../tests/text.test Mon Jan 5 15:06:05 1998 +@@ -866,7 +866,7 @@ + .t insert end "xxyz xyz x. the\nfoo -forward bar xxxxx BaR foo\nxyz xxyzx" + test text-20.1 {TextSearchCmd procedure, argument parsing} { + list [catch {.t search -} msg] $msg +-} {1 {bad switch "-": must be -forward, -backward, -exact, -regexp, -nocase, -count, or --}} ++} {1 {bad switch "-": must be -forward, -backward, -exact, -regexp, -nocase, -count, -elide, or --}} + test text-20.2 {TextSearchCmd procedure, -backwards option} { + .t search -backwards xyz 1.4 + } {1.1} |