diff options
author | Matthias Hopf <mhopf@suse.de> | 2006-06-09 18:24:02 +0200 |
---|---|---|
committer | Donnie Berkholz <spyderous@gentoo.org> | 2006-06-22 15:27:10 -0700 |
commit | f506aaf8ac9aae1ee8daaef6cde34ee85aecd641 (patch) | |
tree | f8bbc846ab8c840c24710e1626ece9fa50e4554f | |
parent | 0e6d5e979aacb0c295ce79369ecc5f22ffa7922c (diff) | |
download | xorg-lib-libX11-f506aaf8ac9aae1ee8daaef6cde34ee85aecd641.tar.gz |
Bug #3104: Compose table cache for faster X11 application starts. Part 1: Pointerless compose data structure, using indices instead of pointers, needed for mmap()ing data structure.
(cherry picked from 9354351fcb8baeaab85250d14409cfb4fa50f3e9 commit)
-rw-r--r-- | include/X11/Xlibint.h | 7 | ||||
-rw-r--r-- | modules/im/ximcp/imLcFlt.c | 22 | ||||
-rw-r--r-- | modules/im/ximcp/imLcIc.c | 5 | ||||
-rw-r--r-- | modules/im/ximcp/imLcIm.c | 31 | ||||
-rw-r--r-- | modules/im/ximcp/imLcLkup.c | 26 | ||||
-rw-r--r-- | modules/im/ximcp/imLcPrs.c | 107 | ||||
-rw-r--r-- | modules/im/ximcp/imThaiFlt.c | 45 | ||||
-rw-r--r-- | modules/im/ximcp/imThaiIc.c | 59 | ||||
-rw-r--r-- | src/XlibInt.c | 20 | ||||
-rw-r--r-- | src/xlibi18n/XimintL.h | 39 |
10 files changed, 219 insertions, 142 deletions
diff --git a/include/X11/Xlibint.h b/include/X11/Xlibint.h index 8517f653..6b1e0c91 100644 --- a/include/X11/Xlibint.h +++ b/include/X11/Xlibint.h @@ -1255,6 +1255,12 @@ extern int _XOpenFile( int /* flags */ ); +extern int _XOpenFileMode( + _Xconst char* /* path */, + int /* flags */, + mode_t /* mode */ +); + extern void* _XFopenFile( _Xconst char* /* path */, _Xconst char* /* mode */ @@ -1265,6 +1271,7 @@ extern int _XAccessFile( ); #else #define _XOpenFile(path,flags) open(path,flags) +#define _XOpenFileMode(path,flags,mode) open(path,flags,mode) #define _XFopenFile(path,mode) fopen(path,mode) #endif diff --git a/modules/im/ximcp/imLcFlt.c b/modules/im/ximcp/imLcFlt.c index 1ca19df8..3b8f69e7 100644 --- a/modules/im/ximcp/imLcFlt.c +++ b/modules/im/ximcp/imLcFlt.c @@ -49,7 +49,8 @@ _XimLocalFilter(d, w, ev, client_data) Xic ic = (Xic)client_data; KeySym keysym; static char buf[256]; - DefTree *p; + DefTree *b = ic->private.local.base.tree; + DTIndex t; if(ev->xkey.keycode == 0) return (False); @@ -74,7 +75,7 @@ _XimLocalFilter(d, w, ev, client_data) if(ic->private.local.brl_committing) { ic->private.local.brl_committed = ic->private.local.brl_committing; - ic->private.local.composed = NULL; + ic->private.local.composed = 0; ev->type = KeyPress; ev->xkey.keycode = 0; _XPutBackEvent(d, ev); @@ -85,22 +86,21 @@ _XimLocalFilter(d, w, ev, client_data) } if( (ev->type != KeyPress) - || (((Xim)ic->core.im)->private.local.top == (DefTree *)NULL) ) + || (((Xim)ic->core.im)->private.local.top == 0 ) ) return(False); - for(p = ic->private.local.context; p; p = p->next) { - if(((ev->xkey.state & p->modifier_mask) == p->modifier) && - (keysym == p->keysym)) { + for(t = ic->private.local.context; t; t = b[t].next) { + if(((ev->xkey.state & b[t].modifier_mask) == b[t].modifier) && + (keysym == b[t].keysym)) break; - } } - if(p) { /* Matched */ - if(p->succession) { /* Intermediate */ - ic->private.local.context = p->succession; + if(t) { /* Matched */ + if(b[t].succession) { /* Intermediate */ + ic->private.local.context = b[t].succession; return(True); } else { /* Terminate (reached to leaf) */ - ic->private.local.composed = p; + ic->private.local.composed = t; ic->private.local.brl_committed = 0; /* return back to client KeyPressEvent keycode == 0 */ ev->xkey.keycode = 0; diff --git a/modules/im/ximcp/imLcIc.c b/modules/im/ximcp/imLcIc.c index ddf7c69e..fd6a4e1f 100644 --- a/modules/im/ximcp/imLcIc.c +++ b/modules/im/ximcp/imLcIc.c @@ -97,7 +97,7 @@ _XimLocalReset( XIC xic) { Xic ic = (Xic)xic; - ic->private.local.composed = (DefTree *)NULL; + ic->private.local.composed = 0; ic->private.local.context = ((Xim)ic->core.im)->private.local.top; ic->private.local.brl_pressed = 0; ic->private.local.brl_committing = 0; @@ -152,8 +152,9 @@ _XimLocalCreateIC( ic->methods = &Local_ic_methods; ic->core.im = im; + ic->private.local.base = ((Xim)im)->private.local.base; ic->private.local.context = ((Xim)im)->private.local.top; - ic->private.local.composed = (DefTree *)NULL; + ic->private.local.composed = 0; ic->private.local.brl_pressed = 0; ic->private.local.brl_committing = 0; ic->private.local.brl_committed = 0; diff --git a/modules/im/ximcp/imLcIm.c b/modules/im/ximcp/imLcIm.c index 675b4822..37271ae4 100644 --- a/modules/im/ximcp/imLcIm.c +++ b/modules/im/ximcp/imLcIm.c @@ -78,23 +78,29 @@ _XimCheckIfLocalProcessing(im) Private void XimFreeDefaultTree( - DefTree *top) + DefTreeBase *b) { - if (!top) return; - if (top->succession) XimFreeDefaultTree(top->succession); - if (top->next) XimFreeDefaultTree(top->next); - if (top->mb) Xfree(top->mb); - if (top->wc) Xfree(top->wc); - if (top->utf8) Xfree(top->utf8); - Xfree(top); + if (!b) return; + if (b->tree) Xfree (b->tree); + if (b->mb) Xfree (b->mb); + if (b->wc) Xfree (b->wc); + if (b->utf8) Xfree (b->utf8); + b->tree = NULL; + b->mb = NULL; + b->wc = NULL; + b->utf8 = NULL; + b->treeused = b->treesize = 0; + b->mbused = b->mbsize = 0; + b->wcused = b->wcsize = 0; + b->utf8used = b->utf8size = 0; } Public void _XimLocalIMFree( Xim im) { - XimFreeDefaultTree(im->private.local.top); - im->private.local.top = NULL; + XimFreeDefaultTree(&im->private.local.base); + im->private.local.top = 0; if(im->core.im_resources) { Xfree(im->core.im_resources); @@ -327,6 +333,11 @@ _XimLocalOpenIM( goto Open_Error; private->ucstoutf8_conv = conv; + private->base.treeused = 1; + private->base.mbused = 1; + private->base.wcused = 1; + private->base.utf8used = 1; + _XimCreateDefaultTree(im); im->methods = &Xim_im_local_methods; diff --git a/modules/im/ximcp/imLcLkup.c b/modules/im/ximcp/imLcLkup.c index f99cd831..b6a6ff60 100644 --- a/modules/im/ximcp/imLcLkup.c +++ b/modules/im/ximcp/imLcLkup.c @@ -56,13 +56,15 @@ _XimLocalMbLookupString(xic, ev, buffer, bytes, keysym, status) { Xic ic = (Xic)xic; int ret; + DefTree *b = ic->private.local.base.tree; + char *mb = ic->private.local.base.mb; if(ev->type != KeyPress) { if(status) *status = XLookupNone; return(0); } if(ev->keycode == 0 && - ( (ic->private.local.composed != NULL) + ( (ic->private.local.composed != 0) ||(ic->private.local.brl_committed != 0))) { if (ic->private.local.brl_committed != 0) { /* Braille Event */ unsigned char pattern = ic->private.local.brl_committed; @@ -79,13 +81,13 @@ _XimLocalMbLookupString(xic, ev, buffer, bytes, keysym, status) if(status) *status = XLookupChars; memcpy(buffer, mb, ret); } else { /* Composed Event */ - ret = strlen(ic->private.local.composed->mb); + ret = strlen(&mb[b[ic->private.local.composed].mb]); if(ret > bytes) { if(status) *status = XBufferOverflow; return(ret); } - memcpy(buffer, ic->private.local.composed->mb, ret); - if(keysym) *keysym = ic->private.local.composed->ks; + memcpy(buffer, &mb[b[ic->private.local.composed].mb], ret); + if(keysym) *keysym = b[ic->private.local.composed].ks; if (ret > 0) { if (keysym && *keysym != NoSymbol) { if(status) *status = XLookupBoth; @@ -133,6 +135,8 @@ _XimLocalWcLookupString(xic, ev, buffer, wlen, keysym, status) { Xic ic = (Xic)xic; int ret; + DefTree *b = ic->private.local.base.tree; + wchar_t *wc = ic->private.local.base.wc; if(ev->type != KeyPress) { if(status) *status = XLookupNone; @@ -153,14 +157,14 @@ _XimLocalWcLookupString(xic, ev, buffer, wlen, keysym, status) } else if(status) *status = XLookupChars; } else { /* Composed Event */ - ret = _Xwcslen(ic->private.local.composed->wc); + ret = _Xwcslen(&wc[b[ic->private.local.composed].wc]); if(ret > wlen) { if(status) *status = XBufferOverflow; return (ret); } - memcpy((char *)buffer, (char *)ic->private.local.composed->wc, + memcpy((char *)buffer, (char *)&wc[b[ic->private.local.composed].wc], ret * sizeof(wchar_t)); - if(keysym) *keysym = ic->private.local.composed->ks; + if(keysym) *keysym = b[ic->private.local.composed].ks; if (ret > 0) { if (keysym && *keysym != NoSymbol) { if(status) *status = XLookupBoth; @@ -208,6 +212,8 @@ _XimLocalUtf8LookupString(xic, ev, buffer, bytes, keysym, status) { Xic ic = (Xic)xic; int ret; + DefTree *b = ic->private.local.base.tree; + char *utf8 = ic->private.local.base.utf8; if(ev->type != KeyPress) { if(status) *status = XLookupNone; @@ -225,13 +231,13 @@ _XimLocalUtf8LookupString(xic, ev, buffer, bytes, keysym, status) buffer[1] = 0x80 | ((BRL_UC_ROW >> 8) & 0x30) | (pattern >> 6); buffer[2] = 0x80 | (pattern & 0x3f); } else { /* Composed Event */ - ret = strlen(ic->private.local.composed->utf8); + ret = strlen(&utf8[b[ic->private.local.composed].utf8]); if(ret > bytes) { if(status) *status = XBufferOverflow; return (ret); } - memcpy(buffer, ic->private.local.composed->utf8, ret); - if(keysym) *keysym = ic->private.local.composed->ks; + memcpy(buffer, &utf8[b[ic->private.local.composed].utf8], ret); + if(keysym) *keysym = b[ic->private.local.composed].ks; if (ret > 0) { if (keysym && *keysym != NoSymbol) { if(status) *status = XLookupBoth; diff --git a/modules/im/ximcp/imLcPrs.c b/modules/im/ximcp/imLcPrs.c index fbad5a22..18147e9f 100644 --- a/modules/im/ximcp/imLcPrs.c +++ b/modules/im/ximcp/imLcPrs.c @@ -422,11 +422,13 @@ parseline( char* tokenbuf) { int token; - unsigned modifier_mask; - unsigned modifier; - unsigned tmp; + DTModifier modifier_mask; + DTModifier modifier; + DTModifier tmp; KeySym keysym = NoSymbol; - DefTree **top = &im->private.local.top; + DTIndex *top = &im->private.local.top; + DefTreeBase *b = &im->private.local.base; + DTIndex t; DefTree *p = NULL; Bool exclam, tilde; KeySym rhs_keysym = 0; @@ -438,8 +440,8 @@ parseline( char local_utf8_buf[LOCAL_UTF8_BUFSIZE], *rhs_string_utf8; struct DefBuffer { - unsigned modifier_mask; - unsigned modifier; + DTModifier modifier_mask; + DTModifier modifier; KeySym keysym; }; @@ -536,20 +538,24 @@ parseline( token = nexttoken(fp, tokenbuf, &lastch); if (token == STRING) { - if( (rhs_string_mb = Xmalloc(strlen(tokenbuf) + 1)) == NULL ) - goto error; + l = strlen(tokenbuf) + 1; + while (b->mbused + l > b->mbsize) { + b->mbsize = b->mbsize ? b->mbsize * 1.5 : 1024; + if (! (b->mb = Xrealloc (b->mb, b->mbsize)) ) + goto error; + } + rhs_string_mb = &b->mb[b->mbused]; + b->mbused += l; strcpy(rhs_string_mb, tokenbuf); token = nexttoken(fp, tokenbuf, &lastch); if (token == KEY) { rhs_keysym = XStringToKeysym(tokenbuf); if (rhs_keysym == NoSymbol) { - Xfree(rhs_string_mb); goto error; } token = nexttoken(fp, tokenbuf, &lastch); } if (token != ENDOFLINE && token != ENDOFFILE) { - Xfree(rhs_string_mb); goto error; } } else if (token == KEY) { @@ -563,14 +569,13 @@ parseline( } l = get_mb_string(im, local_mb_buf, rhs_keysym); - if (l == 0) { - rhs_string_mb = Xmalloc(1); - } else { - rhs_string_mb = Xmalloc(l + 1); - } - if( rhs_string_mb == NULL ) { - goto error; + while (b->mbused + l + 1 > b->mbsize) { + b->mbsize = b->mbsize ? b->mbsize * 1.5 : 1024; + if (! (b->mb = Xrealloc (b->mb, b->mbsize)) ) + goto error; } + rhs_string_mb = &b->mb[b->mbused]; + b->mbused += l + 1; memcpy(rhs_string_mb, local_mb_buf, l); rhs_string_mb[l] = '\0'; } else { @@ -581,62 +586,70 @@ parseline( if (l == LOCAL_WC_BUFSIZE - 1) { local_wc_buf[l] = (wchar_t)'\0'; } - if( (rhs_string_wc = (wchar_t *)Xmalloc((l + 1) * sizeof(wchar_t))) == NULL ) { - Xfree( rhs_string_mb ); - return( 0 ); + while (b->wcused + l + 1 > b->wcsize) { + b->wcsize = b->wcsize ? b->wcsize * 1.5 : 512; + if (! (b->wc = Xrealloc (b->wc, sizeof(wchar_t) * b->wcsize)) ) + goto error; } + rhs_string_wc = &b->wc[b->wcused]; + b->wcused += l + 1; memcpy((char *)rhs_string_wc, (char *)local_wc_buf, (l + 1) * sizeof(wchar_t) ); l = _Xmbstoutf8(local_utf8_buf, rhs_string_mb, LOCAL_UTF8_BUFSIZE - 1); if (l == LOCAL_UTF8_BUFSIZE - 1) { local_wc_buf[l] = '\0'; } - if( (rhs_string_utf8 = (char *)Xmalloc(l + 1)) == NULL ) { - Xfree( rhs_string_wc ); - Xfree( rhs_string_mb ); - return( 0 ); + while (b->utf8used + l + 1 > b->utf8size) { + b->utf8size = b->utf8size ? b->utf8size * 1.5 : 1024; + if (! (b->utf8 = Xrealloc (b->utf8, b->utf8size)) ) + goto error; } + rhs_string_utf8 = &b->utf8[b->utf8used]; + b->utf8used += l + 1; memcpy(rhs_string_utf8, local_utf8_buf, l + 1); for (i = 0; i < n; i++) { - for (p = *top; p; p = p->next) { - if (buf[i].keysym == p->keysym && - buf[i].modifier == p->modifier && - buf[i].modifier_mask == p->modifier_mask) { + for (t = *top; t; t = b->tree[t].next) { + if (buf[i].keysym == b->tree[t].keysym && + buf[i].modifier == b->tree[t].modifier && + buf[i].modifier_mask == b->tree[t].modifier_mask) { break; } } - if (p) { + if (t) { + p = &b->tree[t]; top = &p->succession; } else { - if( (p = (DefTree*)Xmalloc(sizeof(DefTree))) == NULL ) { - Xfree( rhs_string_mb ); - goto error; + while (b->treeused >= b->treesize) { + DefTree *old = b->tree; + int oldsize = b->treesize; + b->treesize = b->treesize ? b->treesize * 1.5 : 256; + if (! (b->tree = Xrealloc (b->tree, sizeof(DefTree) * b->treesize)) ) + goto error; + if (top >= (DTIndex *) old && top < (DTIndex *) &old[oldsize]) + top = (DTIndex *) (((char *) top) + (((char *)b->tree)-(char *)old)); } + p = &b->tree[b->treeused]; p->keysym = buf[i].keysym; p->modifier = buf[i].modifier; p->modifier_mask = buf[i].modifier_mask; - p->succession = NULL; + p->succession = 0; p->next = *top; - p->mb = NULL; - p->wc = NULL; - p->utf8 = NULL; + p->mb = 0; + p->wc = 0; + p->utf8 = 0; p->ks = NoSymbol; - *top = p; + *top = b->treeused; top = &p->succession; + b->treeused++; } } - if( p->mb != NULL ) - Xfree( p->mb ); - p->mb = rhs_string_mb; - if( p->wc != NULL ) - Xfree( p->wc ); - p->wc = rhs_string_wc; - if( p->utf8 != NULL ) - Xfree( p->utf8 ); - p->utf8 = rhs_string_utf8; - p->ks = rhs_keysym; + /* old entries no longer freed... */ + p->mb = rhs_string_mb - b->mb; + p->wc = rhs_string_wc - b->wc; + p->utf8 = rhs_string_utf8 - b->utf8; + p->ks = rhs_keysym; return(n); error: while (token != ENDOFLINE && token != ENDOFFILE) { diff --git a/modules/im/ximcp/imThaiFlt.c b/modules/im/ximcp/imThaiFlt.c index 18df0e1f..ac851963 100644 --- a/modules/im/ximcp/imThaiFlt.c +++ b/modules/im/ximcp/imThaiFlt.c @@ -522,9 +522,9 @@ Private Bool ThaiComposeConvert( * Macros to save and recall last input character in XIC */ #define IC_SavePreviousChar(ic,ch) \ - (*((ic)->private.local.context->mb) = (char) (ch)) + ((ic)->private.local.base.mb[(ic)->private.local.base.tree[(ic)->private.local.context].mb] = (char) (ch)) #define IC_ClearPreviousChar(ic) \ - (*((ic)->private.local.context->mb) = 0) + ((ic)->private.local.base.mb[(ic)->private.local.base.tree[(ic)->private.local.context].mb] = 0) #define IC_GetPreviousChar(ic) \ (IC_RealGetPreviousChar(ic,1)) #define IC_GetContextChar(ic) \ @@ -536,6 +536,7 @@ Private unsigned char IC_RealGetPreviousChar(Xic ic, unsigned short pos) { XICCallback* cb = &ic->core.string_conversion_callback; + DefTreeBase *b = &ic->private.local.base; if (cb && cb->callback) { XIMStringConversionCallbackStruct screc; @@ -552,7 +553,7 @@ IC_RealGetPreviousChar(Xic ic, unsigned short pos) (cb->callback)((XIC)ic, cb->client_data, (XPointer)&screc); if (!screc.text) - return (unsigned char) *((ic)->private.local.context->mb); + return (unsigned char) b->mb[b->tree[(ic)->private.local.context].mb]; if ((screc.text->feedback && *screc.text->feedback == XIMStringConversionLeftEdge) || screc.text->length < 1) @@ -570,7 +571,7 @@ IC_RealGetPreviousChar(Xic ic, unsigned short pos) XFree(screc.text); return c; } else { - return (unsigned char) *((ic)->private.local.context->mb); + return (unsigned char) b->mb[b->tree[(ic)->private.local.context].mb]; } } @@ -1193,13 +1194,14 @@ Private void InitIscMode(Xic ic) Private Bool ThaiFltAcceptInput(Xic ic, unsigned char new_char, KeySym symbol) { - ic->private.local.composed->wc[0] = tis2ucs(new_char); - ic->private.local.composed->wc[1] = '\0'; + DefTreeBase *b = &ic->private.local.base; + b->wc[b->tree[ic->private.local.composed].wc+0] = tis2ucs(new_char); + b->wc[b->tree[ic->private.local.composed].wc+1] = '\0'; if ((new_char <= 0x1f) || (new_char == 0x7f)) - ic->private.local.composed->keysym = symbol; + b->tree[ic->private.local.composed].keysym = symbol; else - ic->private.local.composed->keysym = NoSymbol; + b->tree[ic->private.local.composed].keysym = NoSymbol; return True; } @@ -1207,12 +1209,13 @@ ThaiFltAcceptInput(Xic ic, unsigned char new_char, KeySym symbol) Private Bool ThaiFltReorderInput(Xic ic, unsigned char previous_char, unsigned char new_char) { + DefTreeBase *b = &ic->private.local.base; if (!IC_DeletePreviousChar(ic)) return False; - ic->private.local.composed->wc[0] = tis2ucs(new_char); - ic->private.local.composed->wc[1] = tis2ucs(previous_char); - ic->private.local.composed->wc[2] = '\0'; + b->wc[b->tree[ic->private.local.composed].wc+0] = tis2ucs(new_char); + b->wc[b->tree[ic->private.local.composed].wc+1] = tis2ucs(previous_char); + b->wc[b->tree[ic->private.local.composed].wc+2] = '\0'; - ic->private.local.composed->keysym = NoSymbol; + b->tree[ic->private.local.composed].keysym = NoSymbol; return True; } @@ -1220,14 +1223,15 @@ ThaiFltReorderInput(Xic ic, unsigned char previous_char, unsigned char new_char) Private Bool ThaiFltReplaceInput(Xic ic, unsigned char new_char, KeySym symbol) { + DefTreeBase *b = &ic->private.local.base; if (!IC_DeletePreviousChar(ic)) return False; - ic->private.local.composed->wc[0] = tis2ucs(new_char); - ic->private.local.composed->wc[1] = '\0'; + b->wc[b->tree[ic->private.local.composed].wc+0] = tis2ucs(new_char); + b->wc[b->tree[ic->private.local.composed].wc+1] = '\0'; if ((new_char <= 0x1f) || (new_char == 0x7f)) - ic->private.local.composed->keysym = symbol; + b->tree[ic->private.local.composed].keysym = symbol; else - ic->private.local.composed->keysym = NoSymbol; + b->tree[ic->private.local.composed].keysym = NoSymbol; return True; } @@ -1256,6 +1260,7 @@ XPointer client_data; #endif wchar_t wbuf[10]; Bool isReject; + DefTreeBase *b = &ic->private.local.base; if ((ev->type != KeyPress) || (ev->xkey.keycode == 0)) @@ -1358,11 +1363,11 @@ XPointer client_data; return True; } - _Xlcwcstombs(ic->core.im->core.lcd, ic->private.local.composed->mb, - ic->private.local.composed->wc, 10); + _Xlcwcstombs(ic->core.im->core.lcd, &b->mb[b->tree[ic->private.local.composed].mb], + &b->wc[b->tree[ic->private.local.composed].wc], 10); - _Xlcmbstoutf8(ic->core.im->core.lcd, ic->private.local.composed->utf8, - ic->private.local.composed->mb, 10); + _Xlcmbstoutf8(ic->core.im->core.lcd, &b->utf8[b->tree[ic->private.local.composed].utf8], + &b->mb[b->tree[ic->private.local.composed].mb], 10); /* Remember the last character inputted * (as fallback in case StringConversionCallback is not provided) diff --git a/modules/im/ximcp/imThaiIc.c b/modules/im/ximcp/imThaiIc.c index 67d7cc26..73cf7f1e 100644 --- a/modules/im/ximcp/imThaiIc.c +++ b/modules/im/ximcp/imThaiIc.c @@ -62,6 +62,8 @@ _XimThaiDestroyIC( XIC xic) { Xic ic = (Xic)xic; + DefTreeBase *b = &ic->private.local.base; + if(((Xim)ic->core.im)->private.local.current_ic == (XIC)ic) { _XimThaiUnSetFocus(xic); } @@ -70,14 +72,14 @@ _XimThaiDestroyIC( ic->private.local.ic_resources = NULL; } - Xfree(ic->private.local.context->mb); - Xfree(ic->private.local.context->wc); - Xfree(ic->private.local.context->utf8); - Xfree(ic->private.local.context); - Xfree(ic->private.local.composed->mb); - Xfree(ic->private.local.composed->wc); - Xfree(ic->private.local.composed->utf8); - Xfree(ic->private.local.composed); + if (b->tree) Xfree (b->tree); + if (b->mb) Xfree (b->mb); + if (b->wc) Xfree (b->wc); + if (b->utf8) Xfree (b->utf8); + b->tree = NULL; + b->mb = NULL; + b->wc = NULL; + b->utf8 = NULL; return; } @@ -107,11 +109,12 @@ _XimThaiReset( XIC xic) { Xic ic = (Xic)xic; + DefTreeBase *b = &ic->private.local.base; ic->private.local.thai.comp_state = 0; ic->private.local.thai.keysym = 0; - ic->private.local.composed->mb[0] = '\0'; - ic->private.local.composed->wc[0] = 0; - ic->private.local.composed->utf8[0] = '\0'; + b->mb[b->tree[ic->private.local.composed].mb] = '\0'; + b->wc[b->tree[ic->private.local.composed].wc] = '\0'; + b->utf8[b->tree[ic->private.local.composed].utf8] = '\0'; } Private char * @@ -154,6 +157,7 @@ _XimThaiCreateIC( XIMResourceList res; unsigned int num; int len; + DefTree *tree; if((ic = (Xic)Xmalloc(sizeof(XicRec))) == (Xic)NULL) { return ((XIC)NULL); @@ -163,30 +167,23 @@ _XimThaiCreateIC( ic->methods = &Thai_ic_methods; ic->core.im = im; ic->core.filter_events = KeyPressMask; - if ((ic->private.local.context = (DefTree *)Xmalloc(sizeof(DefTree))) - == (DefTree *)NULL) - goto Set_Error; - if ((ic->private.local.context->mb = (char *)Xmalloc(10)) - == (char *)NULL) - goto Set_Error; - if ((ic->private.local.context->wc = (wchar_t *)Xmalloc(10*sizeof(wchar_t))) - == (wchar_t *)NULL) - goto Set_Error; - if ((ic->private.local.context->utf8 = (char *)Xmalloc(10)) - == (char *)NULL) - goto Set_Error; - if ((ic->private.local.composed = (DefTree *)Xmalloc(sizeof(DefTree))) - == (DefTree *)NULL) + + if (! (ic->private.local.base.tree = tree = (DefTree *)Xmalloc(sizeof(DefTree)*3)) ) goto Set_Error; - if ((ic->private.local.composed->mb = (char *)Xmalloc(10)) - == (char *)NULL) + if (! (ic->private.local.base.mb = (char *)Xmalloc(21)) ) goto Set_Error; - if ((ic->private.local.composed->wc = (wchar_t *)Xmalloc(10*sizeof(wchar_t))) - == (wchar_t *)NULL) + if (! (ic->private.local.base.wc = (wchar_t*)Xmalloc(sizeof(wchar_t)*21)) ) goto Set_Error; - if ((ic->private.local.composed->utf8 = (char *)Xmalloc(10)) - == (char *)NULL) + if (! (ic->private.local.base.utf8 = (char *)Xmalloc(21)) ) goto Set_Error; + ic->private.local.context = 1; + tree[1].mb = 1; + tree[1].wc = 1; + tree[1].utf8 = 1; + ic->private.local.composed = 2; + tree[2].mb = 11; + tree[2].wc = 11; + tree[2].utf8 = 11; ic->private.local.thai.comp_state = 0; ic->private.local.thai.keysym = 0; diff --git a/src/XlibInt.c b/src/XlibInt.c index 1d2f5ead..1f6230cd 100644 --- a/src/XlibInt.c +++ b/src/XlibInt.c @@ -3371,6 +3371,26 @@ int _XOpenFile(path, flags) return ret; } +int _XOpenFileMode(path, flags, mode) + _Xconst char* path; + int flags; + mode_t mode; +{ + char buf[MAX_PATH]; + char* bufp = NULL; + int ret = -1; + UINT olderror = SetErrorMode (SEM_FAILCRITICALERRORS); + + if (AccessFile (path, buf, MAX_PATH, &bufp)) + ret = open (bufp, flags, mode); + + (void) SetErrorMode (olderror); + + if (bufp != buf) Xfree (bufp); + + return ret; +} + void* _XFopenFile(path, mode) _Xconst char* path; _Xconst char* mode; diff --git a/src/xlibi18n/XimintL.h b/src/xlibi18n/XimintL.h index 1036a62b..5eeb21f2 100644 --- a/src/xlibi18n/XimintL.h +++ b/src/xlibi18n/XimintL.h @@ -40,21 +40,36 @@ THIS SOFTWARE. #define COMPOSE_FILE "Compose" /* - * Data Structure for Local Processing + * Data Structures for Local Processing */ +typedef INT32 DTIndex; +typedef INT32 DTCharIndex; +typedef BITS32 DTModifier; + typedef struct _DefTree { - struct _DefTree *next; /* another Key definition */ - struct _DefTree *succession; /* successive Key Sequence */ + DTIndex next; + DTIndex succession; /* successive Key Sequence */ /* Key definitions */ - unsigned modifier_mask; - unsigned modifier; + DTModifier modifier_mask; + DTModifier modifier; KeySym keysym; /* leaf only */ - char *mb; - wchar_t *wc; /* make from mb */ - char *utf8; /* make from mb */ + DTCharIndex mb; + DTCharIndex wc; /* make from mb */ + DTCharIndex utf8; /* make from mb */ KeySym ks; } DefTree; +typedef struct _DefTreeBase { + DefTree *tree; + char *mb; + wchar_t *wc; + char *utf8; + DTIndex treeused, treesize; + DTCharIndex mbused, mbsize; + DTCharIndex wcused, wcsize; + DTCharIndex utf8used, utf8size; +} DefTreeBase; + typedef struct _XimLocalPrivateRec { /* The first fields are identical with XimCommonPrivateRec. */ XlcConv ctom_conv; @@ -67,7 +82,8 @@ typedef struct _XimLocalPrivateRec { XlcConv ucstoutf8_conv; XIC current_ic; - DefTree *top; + DefTreeBase base; + DTIndex top; } XimLocalPrivateRec; typedef struct _XicThaiPart { @@ -78,8 +94,9 @@ typedef struct _XicThaiPart { typedef struct _XicLocalPrivateRec { long value_mask; - DefTree *context; - DefTree *composed; + DefTreeBase base; + DTIndex context; + DTIndex composed; XicThaiPart thai; XIMResourceList ic_resources; |