summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--generic/tkIcu.c89
-rw-r--r--generic/tkInt.h2
-rw-r--r--library/tk.tcl9
-rw-r--r--unix/Makefile.in8
-rw-r--r--win/Makefile.in3
-rw-r--r--win/makefile.vc3
-rw-r--r--win/tkWinInit.c1
7 files changed, 93 insertions, 22 deletions
diff --git a/generic/tkIcu.c b/generic/tkIcu.c
index 23ccbaa..8fdd8df 100644
--- a/generic/tkIcu.c
+++ b/generic/tkIcu.c
@@ -11,6 +11,13 @@
*/
#include "tkInt.h"
+#ifdef HAVE_STDLIB_H
+#include <stdlib.h>
+#endif
+
+#ifdef HAVE_STDINT_H
+#include <stdint.h>
+#endif
/*
* Runtime linking of libicu.
@@ -41,6 +48,9 @@ static struct {
0, NULL, NULL, NULL, NULL, NULL
};
+#define FLAG_WORD 1
+#define FLAG_FOLLOWING 4
+
#define icu_open icu_fns.open
#define icu_close icu_fns.close
#define icu_preceding icu_fns.preceding
@@ -48,19 +58,77 @@ static struct {
TCL_DECLARE_MUTEX(icu_mutex);
-int
+static int
+startEndOfCmd(
+ ClientData clientData,
+ Tcl_Interp *interp,
+ int objc,
+ Tcl_Obj *const objv[])
+{
+ Tcl_DString ds;
+ TkSizeT len;
+ const char *str;
+ UErrorCodex errorCode;
+ void *it;
+ TkSizeT idx;
+ int flags = PTR2INT(clientData);
+
+ if (objc != 3) {
+ Tcl_WrongNumArgs(interp, 1 , objv, "str start");
+ return TCL_ERROR;
+ }
+ Tcl_DStringInit(&ds);
+ str = Tcl_GetStringFromObj(objv[1], &len);
+ Tcl_UtfToChar16DString(str, len, &ds);
+ if (TkGetIntForIndex(objv[2], Tcl_DStringLength(&ds)/2-1, 1, &idx) != TCL_OK) {
+ Tcl_DStringFree(&ds);
+ Tcl_SetObjResult(interp, Tcl_ObjPrintf("bad index \"%s\"", Tcl_GetString(objv[2])));
+ Tcl_SetErrorCode(interp, "TK", "ICU", "INDEX", NULL);
+ return TCL_ERROR;
+ }
+
+ it = icu_open((UBreakIteratorTypex)(PTR2INT(clientData)&3), "C",
+ (const uint16_t *)Tcl_DStringValue(&ds), -1, &errorCode);
+ if (flags & FLAG_FOLLOWING) {
+ idx = icu_following(it, idx);
+ } else {
+ idx = icu_preceding(it, idx);
+ }
+ Tcl_SetObjResult(interp, TkNewIndexObj(idx));
+ icu_close(it);
+ Tcl_DStringFree(&ds);
+ return TCL_OK;
+}
+
+void
Icu_Init(
Tcl_Interp *interp)
{
Tcl_MutexLock(&icu_mutex);
+
if (icu_fns.nopen == 0) {
int i = 0;
Tcl_Obj *nameobj;
static const char *iculibs[] = {
- "libicuuc68.so",
+#if defined(_WIN32)
+ "cygicuuc68.dll",
+ "icuuc68.dll",
+#elif defined(__CYGWIN__)
+ "cygicuuc68.dll",
+#elif defined(MAC_OSX_TCL)
+ "libicuuc68.dylib",
+#else
+ "libicuuc.so.68",
+#endif
NULL
};
+#if defined(_WIN32) && !defined(STATIC_BUILD)
+ if (!tclStubsPtr->tcl_CreateFileHandler) {
+ /* Not running on Cygwin, so don't try to load the cygwin icu dll */
+ i++;
+ }
+#endif
while (iculibs[i] != NULL) {
Tcl_ResetResult(interp);
nameobj = Tcl_NewStringObj(iculibs[i], -1);
@@ -76,7 +144,7 @@ Icu_Init(
if (icu_fns.lib != NULL) {
#define ICU_SYM(name) \
icu_fns.name = (fn_icu_ ## name) \
- Tcl_FindSymbol(NULL, icu_fns.lib, "ubrk_" #name "_86")
+ Tcl_FindSymbol(NULL, icu_fns.lib, "ubrk_" #name "_68")
ICU_SYM(open);
ICU_SYM(close);
ICU_SYM(preceding);
@@ -87,9 +155,18 @@ Icu_Init(
icu_fns.nopen++;
Tcl_MutexUnlock(&icu_mutex);
- //Tcl_CreateObjCommand(interp, "::tk::endOfCluster", endOfClusterCmd,
- // interp, NULL);
- return TCL_OK;
+ if (icu_fns.lib != NULL) {
+ Tcl_CreateObjCommand(interp, "::tk::startOfCluster", startEndOfCmd,
+ INT2PTR(0), NULL);
+ Tcl_CreateObjCommand(interp, "::tk::startOfNextWord", startEndOfCmd,
+ INT2PTR(FLAG_WORD|FLAG_FOLLOWING), NULL);
+ Tcl_CreateObjCommand(interp, "::tk::startOfPreviousWord", startEndOfCmd,
+ INT2PTR(FLAG_WORD), NULL);
+ Tcl_CreateObjCommand(interp, "::tk::endOfCluster", startEndOfCmd,
+ INT2PTR(FLAG_FOLLOWING), NULL);
+ Tcl_CreateObjCommand(interp, "::tk::endOfWord", startEndOfCmd,
+ INT2PTR(FLAG_WORD|FLAG_FOLLOWING), NULL);
+ }
}
/*
diff --git a/generic/tkInt.h b/generic/tkInt.h
index 1b608df..fb43ef5 100644
--- a/generic/tkInt.h
+++ b/generic/tkInt.h
@@ -1431,7 +1431,7 @@ MODULE_SCOPE void TkUnixSetXftClipRegion(Region clipRegion);
# define tcl_CreateFileHandler reserved9
#endif
-MODULE_SCOPE int Icu_Init(Tcl_Interp* interp);
+MODULE_SCOPE void Icu_Init(Tcl_Interp* interp);
/*
* Unsupported commands.
diff --git a/library/tk.tcl b/library/tk.tcl
index dd16793..6828465 100644
--- a/library/tk.tcl
+++ b/library/tk.tcl
@@ -725,9 +725,6 @@ if {[info commands ::tk::endOfCluster] eq ""} {
set start [expr {$start+1}]
}
set start [expr {$start+1}]
- if {[string index $str $start] eq {^}} {
- set start [expr {$start+1}];# For demo purposes only
- }
return $start
}
}
@@ -739,12 +736,6 @@ if {[info commands ::tk::startOfCluster] eq ""} {
if {$start < 0} {
return -1;
}
- if {[string index $str $start] eq {^}} {
- set start [expr {$start-1}];# For demo purposes only
- }
- if {[string length [string index $str [expr {$start-1}]]] > 1} {
- return [expr {$start-1}]
- }
return $start
}
}
diff --git a/unix/Makefile.in b/unix/Makefile.in
index 6626a66..3314c20 100644
--- a/unix/Makefile.in
+++ b/unix/Makefile.in
@@ -333,7 +333,7 @@ CC_SWITCHES_NO_STUBS = -I${UNIX_DIR} -I${GENERIC_DIR} -I${BMAP_DIR} \
${@TK_WINDOWINGSYSTEM@_INCLUDES} ${CFLAGS} ${CFLAGS_WARNING} \
${SHLIB_CFLAGS} -I${TCL_GENERIC_DIR} -I${TCL_PLATFORM_DIR} ${AC_FLAGS} \
${PROTO_FLAGS} ${SECURITY_FLAGS} ${MEM_DEBUG_FLAGS} ${KEYSYM_FLAGS} \
-${NO_DEPRECATED_FLAGS} @EXTRA_CC_SWITCHES@
+${NO_DEPRECATED_FLAGS} -DTCL_UTF_MAX=3 @EXTRA_CC_SWITCHES@
CC_SWITCHES = $(CC_SWITCHES_NO_STUBS) @TCL_STUB_FLAGS@
@@ -1200,6 +1200,9 @@ tkRectOval.o: $(GENERIC_DIR)/tkRectOval.c
tkTrig.o: $(GENERIC_DIR)/tkTrig.c
$(CC) -c $(CC_SWITCHES) $(GENERIC_DIR)/tkTrig.c
+tkIcu.o: $(GENERIC_DIR)/tkIcu.c
+ $(CC) -c $(CC_SWITCHES) $(GENERIC_DIR)/tkIcu.c
+
tkImage.o: $(GENERIC_DIR)/tkImage.c
$(CC) -c $(CC_SWITCHES) $(GENERIC_DIR)/tkImage.c
@@ -1296,9 +1299,6 @@ tkUnixEmbed.o: $(UNIX_DIR)/tkUnixEmbed.c
tkUnixEvent.o: $(UNIX_DIR)/tkUnixEvent.c
$(CC) -c $(CC_SWITCHES) $(UNIX_DIR)/tkUnixEvent.c
-tkIcu.o: $(GENERIC_DIR)/tkIcu.c
- $(CC) -c $(CC_SWITCHES) $(GENERIC_DIR)/tkIcu.c
-
tkUnixFocus.o: $(UNIX_DIR)/tkUnixFocus.c
$(CC) -c $(CC_SWITCHES) $(UNIX_DIR)/tkUnixFocus.c
diff --git a/win/Makefile.in b/win/Makefile.in
index 76b2958..9d16cdb 100644
--- a/win/Makefile.in
+++ b/win/Makefile.in
@@ -260,7 +260,7 @@ CC_SWITCHES = ${CFLAGS} ${CFLAGS_WARNING} ${SHLIB_CFLAGS} \
-I"${GENERIC_DIR_NATIVE}" -I"${WIN_DIR_NATIVE}" \
-I"${XLIB_DIR_NATIVE}" -I"${BITMAP_DIR_NATIVE}" \
-I"${TCL_GENERIC_NATIVE}" -I"${TCL_PLATFORM_NATIVE}" \
-${AC_FLAGS} $(NO_DEPRECATED_FLAGS) -DUSE_TCL_STUBS
+${AC_FLAGS} $(NO_DEPRECATED_FLAGS) -DTCL_UTF_MAX=3 -DUSE_TCL_STUBS
CC_OBJNAME = @CC_OBJNAME@
CC_EXENAME = @CC_EXENAME@
@@ -356,6 +356,7 @@ TK_OBJS = \
tkGet.$(OBJEXT) \
tkGrab.$(OBJEXT) \
tkGrid.$(OBJEXT) \
+ tkIcu.$(OBJEXT) \
tkImage.$(OBJEXT) \
tkImgBmap.$(OBJEXT) \
tkImgListFormat.$(OBJEXT) \
diff --git a/win/makefile.vc b/win/makefile.vc
index 912f781..73a9830 100644
--- a/win/makefile.vc
+++ b/win/makefile.vc
@@ -228,6 +228,7 @@ TKOBJS = \
$(TMP_DIR)\tkGet.obj \
$(TMP_DIR)\tkGrab.obj \
$(TMP_DIR)\tkGrid.obj \
+ $(TMP_DIR)\tkIcu.obj \
$(TMP_DIR)\tkImage.obj \
$(TMP_DIR)\tkImgBmap.obj \
$(TMP_DIR)\tkImgListFormat.obj \
@@ -335,7 +336,7 @@ PRJ_INCLUDES = -I"$(BITMAPDIR)" -I"$(XLIBDIR)"
CONFIG_DEFS =/DHAVE_SYS_TYPES_H=1 /DHAVE_SYS_STAT_H=1 \
/DHAVE_STRING_H=1 /DHAVE_MEMORY_H=1 \
- /DHAVE_STRINGS_H=1 \
+ /DHAVE_STRINGS_H=1 /DTCL_UTF_MAX=3 \
!if $(HAVE_UXTHEME_H)
/DHAVE_UXTHEME_H=1 \
!endif
diff --git a/win/tkWinInit.c b/win/tkWinInit.c
index 1f630e4..1140ff2 100644
--- a/win/tkWinInit.c
+++ b/win/tkWinInit.c
@@ -44,6 +44,7 @@ TkpInit(
WinIcoInit(interp);
TkWinXInit(Tk_GetHINSTANCE());
+ Icu_Init(interp);
return TCL_OK;
}