diff options
-rw-r--r-- | generic/tkIcu.c | 89 | ||||
-rw-r--r-- | generic/tkInt.h | 2 | ||||
-rw-r--r-- | library/tk.tcl | 9 | ||||
-rw-r--r-- | unix/Makefile.in | 8 | ||||
-rw-r--r-- | win/Makefile.in | 3 | ||||
-rw-r--r-- | win/makefile.vc | 3 | ||||
-rw-r--r-- | win/tkWinInit.c | 1 |
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; } |