Mercurial > freewnn
diff Xwnmo/xwnmo/xlc_util.c @ 0:bbc77ca4def5
initial import
author | Yoshiki Yazawa <yaz@cc.rim.or.jp> |
---|---|
date | Thu, 13 Dec 2007 04:30:14 +0900 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Xwnmo/xwnmo/xlc_util.c Thu Dec 13 04:30:14 2007 +0900 @@ -0,0 +1,748 @@ +/* + * $Id: xlc_util.c,v 1.2 2001/06/14 18:16:18 ura Exp $ + */ + +/* + * FreeWnn is a network-extensible Kana-to-Kanji conversion system. + * This file is part of FreeWnn. + * + * Copyright OMRON Corporation. 1987, 1988, 1989, 1990, 1991, 1992, 1999 + * Copyright 1991, 1992 by Massachusetts Institute of Technology + * + * Author: OMRON SOFTWARE Co., Ltd. <freewnn@rd.kyoto.omronsoft.co.jp> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GNU Emacs; see the file COPYING. If not, write to the + * Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * + * Commentary: + * + * Change log: + * + * Last modified date: 8,Feb.1999 + * + * Code: + * + */ +/* Version 4.0 + */ +#include <stdio.h> +#include <string.h> +#include "commonhd.h" +#include "sdefine.h" +#ifdef XJUTIL +#include "xjutil.h" +#include "sxheader.h" +#include "xext.h" +#else /* XJUTIL */ +#include "xim.h" +#include "sheader.h" +#include "ext.h" +#endif /* XJUTIL */ + +#ifdef X11R5 +extern int _XConvertMBToWC (), _XConvertMBToCT (), _XConvertWCToCT (); +#ifndef X_WCHAR +extern int _XConvertWCToMB (); +#endif +#else +#include "Xlibint.h" +#include "XlcPubI.h" + +#define BadBuffer (-1) + +static int +_XConvertWCToMB (lcd, wstr, wc_len, str, mb_bytes, scanned_len) + XLCd lcd; + wchar *wstr; + int wc_len; + unsigned char *str; + int *mb_bytes; + int *scanned_len; +{ + /* modified from _Xlcwcstombs in lcStd.c */ + XlcConv conv; + XPointer from, to; + int from_left, to_left, ret; + int len = *mb_bytes; + + if (lcd == NULL) + { + lcd = _XlcCurrentLC (); + if (lcd == NULL) + return -1; + } + + conv = _XlcOpenConverter (lcd, XlcNWideChar, lcd, XlcNMultiByte); + if (conv == NULL) + return -1; + + from = (XPointer) wstr; + from_left = wc_len; + to = (XPointer) str; + to_left = len; + + if (_XlcConvert (conv, &from, &from_left, &to, &to_left, NULL, 0) < 0) + ret = -1; + else + { + ret = len - to_left; + if (str && to_left > 0) + str[ret] = '\0'; + } + + _XlcCloseConverter (conv); + + *mb_bytes = ret; + if (scanned_len) + *scanned_len = wc_len - from_left; + return ret; + +} + +/* ARGSUSED */ +static int +_XConvertMBToWC (lcd, str, mb_bytes, wstr, wc_len, scanned_bytes, state) + XLCd lcd; + unsigned char *str; + int mb_bytes; + wchar *wstr; + int *wc_len; + int *scanned_bytes; + int *state; +{ + /* modified from _Xlcmbstowcs in lcStd.c */ + XlcConv conv; + XPointer from, to; + int from_left, to_left, ret; + int len = *wc_len; + + if (lcd == NULL) + { + lcd = _XlcCurrentLC (); + if (lcd == NULL) + return -1; + } + + conv = _XlcOpenConverter (lcd, XlcNMultiByte, lcd, XlcNWideChar); + if (conv == NULL) + return -1; + + from = (XPointer) str; + from_left = mb_bytes; + to = (XPointer) wstr; + to_left = len; + + if (_XlcConvert (conv, &from, &from_left, &to, &to_left, NULL, 0) < 0) + ret = -1; + else + { + ret = len - to_left; + if (wstr && to_left > 0) + wstr[ret] = (wchar_t) 0; + } + + _XlcCloseConverter (conv); + + *wc_len = ret; + if (scanned_bytes) + *scanned_bytes = mb_bytes - from_left; + return 0; +} + +/* ARGSUSED */ +static int +_XConvertMBToCT (lcd, str, mb_bytes, ctstr, ct_bytes, scanned_bytes, state) + XLCd lcd; + unsigned char *str; + int mb_bytes; + unsigned char *ctstr; + int *ct_bytes; + int *scanned_bytes; + int *state; +{ + /* modified from _Xlcmbstowcs in lcStd.c */ + XlcConv conv; + XPointer from, to; + int from_left, to_left, ret; + int len = *ct_bytes; + + if (lcd == NULL) + { + lcd = _XlcCurrentLC (); + if (lcd == NULL) + return -1; + } + + conv = _XlcOpenConverter (lcd, XlcNMultiByte, lcd, XlcNCompoundText); + if (conv == NULL) + return -1; + + from = (XPointer) str; + from_left = mb_bytes; + to = (XPointer) ctstr; + to_left = len; + + if (_XlcConvert (conv, &from, &from_left, &to, &to_left, NULL, 0) < 0) + ret = -1; + else + { + ret = len - to_left; + if (ctstr && to_left > 0) + ctstr[ret] = '\0'; + } + + _XlcCloseConverter (conv); + + *ct_bytes = ret; + if (scanned_bytes) + *scanned_bytes = mb_bytes - from_left; + return 0; +} + +static int +_XConvertWCToCT (lcd, wstr, wc_len, str, ct_bytes, scanned_len) + XLCd lcd; + wchar *wstr; + int wc_len; + unsigned char *str; + int *ct_bytes; + int *scanned_len; +{ + /* modified from _Xlcwcstombs in lcStd.c */ + XlcConv conv; + XPointer from, to; + int from_left, to_left, ret; + int len = *ct_bytes; + + if (lcd == NULL) + { + lcd = _XlcCurrentLC (); + if (lcd == NULL) + return -1; + } + + conv = _XlcOpenConverter (lcd, XlcNWideChar, lcd, XlcNCompoundText); + if (conv == NULL) + return -1; + + from = (XPointer) wstr; + from_left = wc_len; + to = (XPointer) str; + to_left = len; + + if (_XlcConvert (conv, &from, &from_left, &to, &to_left, NULL, 0) < 0) + ret = -1; + else + { + ret = len - to_left; + if (str && to_left > 0) + str[ret] = '\0'; + } + + _XlcCloseConverter (conv); + + *ct_bytes = ret; + if (scanned_len) + *scanned_len = wc_len - from_left; + return ret; + +} + +#endif /* X11R5 */ + +int +alloc_all_buf () +{ + char *wc, *ct, *c; +#ifndef X_WCHAR + char *w; +#endif /* !X_WCHAR */ + if (((wc = Malloc (sizeof (wchar) * BUF_ALLOC_SIZE)) == NULL) || ((ct = Malloc (sizeof (unsigned char) * BUF_ALLOC_SIZE)) == NULL) || ((c = Malloc (sizeof (unsigned char) * BUF_ALLOC_SIZE)) == NULL) +#ifndef X_WCHAR + || ((w = Malloc (sizeof (wchar_t) * BUF_ALLOC_SIZE)) == NULL) +#endif /* !X_WCHAR */ + ) + { + malloc_error ("allocation of temporary buffer"); + return (-1); + } + wc_buf = (wchar *) wc; + ct_buf = (unsigned char *) ct; + c_buf = (unsigned char *) c; + wc_buf_max = ct_buf_max = c_buf_max = BUF_ALLOC_SIZE; +#ifndef X_WCHAR + wt_buf = (wchar_t *) w; + wt_buf_max = BUF_ALLOC_SIZE; +#endif /* !X_WCHAR */ + return (0); +} + +int +realloc_wc_buf () +{ + register char *p; + + if ((p = Malloc (sizeof (wchar) * (wc_buf_max + BUF_ALLOC_SIZE))) == NULL) + { + malloc_error ("re-allocation of temporary buffer"); + return (-1); + } + Free ((char *) wc_buf); + wc_buf = (wchar *) p; + wc_buf_max += BUF_ALLOC_SIZE; + return (0); +} + +int +realloc_ct_buf () +{ + register char *p; + if ((p = Malloc (sizeof (unsigned char) * (ct_buf_max + BUF_ALLOC_SIZE))) == NULL) + { + malloc_error ("re-allocation of temporary buffer"); + return (-1); + } + Free ((char *) ct_buf); + ct_buf = (unsigned char *) p; + ct_buf_max += BUF_ALLOC_SIZE; + return (0); +} + +int +realloc_c_buf () +{ + register char *p; + + if ((p = Malloc (sizeof (unsigned char) * (c_buf_max + BUF_ALLOC_SIZE))) == NULL) + { + malloc_error ("re-allocation of temporary buffer"); + return (-1); + } + Free ((char *) c_buf); + c_buf = (unsigned char *) p; + c_buf_max += BUF_ALLOC_SIZE; + return (0); +} + +#ifndef X_WCHAR +int +realloc_wt_buf () +{ + register char *p; + + if ((p = Malloc (sizeof (wchar_t) * (wt_buf_max + BUF_ALLOC_SIZE))) == NULL) + { + malloc_error ("re-allocation of temporary buffer"); + return (-1); + } + Free ((char *) wt_buf); + wt_buf = (wchar_t *) p; + wt_buf_max += BUF_ALLOC_SIZE; + return (0); +} +#endif /* !X_WCHAR */ + +int +get_columns_wchar (from) + register wchar *from; +{ + register wchar *wc = from; + + while (*wc == PENDING_WCHAR) + wc++; + if (*wc) + wc++; + return (wc - from); +} + +#ifndef X11R5 +/* + * wchar encoding is for EUC in X11R6. + * WARNING: This is rough alorithm, unless we can call ANSI C function. + */ +static int +_XcwGetLength (wc) + wchar wc; +{ + if (!(wc & ~0xFF)) + return 1; + else + return 2; +} +#endif /* !X11R5 */ + +int +XwcGetColumn (wc) + wchar wc; +{ + if (wc == PENDING_WCHAR) + return (0); +#if defined(__STDC__) && defined(_I18N_) + return wcwidth (wc); +#else + return _XcwGetLength (wc); +#endif /* defined(__STDC__) && defined(_I18N_) */ +} + +int +check_mb (buf, x) + register wchar *buf; + register int x; +{ + if (*(buf + x) == PENDING_WCHAR) + return (1); + if (XwcGetColumn (*(buf + x)) > 1) + return (2); + return (0); +} + +int +w_char_to_char (w, c, n) + register w_char *w; + register char *c; + register int n; +{ +#ifndef XJUTIL + set_cswidth (cur_lang->cswidth_id); +#endif /* !XJUTIL */ + return (ieuc_to_eeuc (c, w, (n * sizeof (w_char)))); +} + +int +skip_pending_wchar (to, from) + register wchar *to, *from; +{ + register wchar *wc = to; + for (; *from;) + { + if (*from == PENDING_WCHAR) + from++; + *wc++ = *from++; + } + *wc = 0; + return (wc - to); +} + +int +put_pending_wchar_and_flg (wc, buf, att, flg) + register wchar wc; + wchar *buf; + unsigned char *att, flg; +{ + register wchar *p = buf; + register unsigned char *f = att; + register int mb_len, i; + + mb_len = XwcGetColumn (wc); + for (i = 1; i < mb_len; i++) + { + *p++ = PENDING_WCHAR; + *f++ = flg; + } + *p++ = wc;; + *f++ = flg; + return (mb_len); +} + +#ifdef CALLBACKS +int +XwcGetChars (wc, end, left) + register wchar *wc; + int end; + int *left; +{ + register int i, cnt; + + *left = 0; + for (i = 0, cnt = 0; i < end && *wc; i++, cnt++, wc++) + { + if (*wc == PENDING_WCHAR) + { + wc++; + i++; + if (!(i < end)) + { + for (*left = 1; *wc == PENDING_WCHAR; wc++) + *left += 1; + cnt++; + return (cnt); + } + } + } + return (cnt); +} +#endif /* CALLBACKS */ + +int +char_to_wchar (xlc, c, wc, len, wc_len) +#ifdef X11R5 + XLocale xlc; +#else + XLCd xlc; +#endif /* X11R5 */ + unsigned char *c; + wchar *wc; + int len; + int wc_len; +{ + int wc_str_len = wc_len; + int scanned_byte = 0; + int ret; + + ret = _XConvertMBToWC (xlc, c, len, wc, &wc_str_len, &scanned_byte, NULL); + if (ret < 0) + { + if (ret == BadBuffer) + { + return (-1); + } + else + { + return (-2); + } + } + return (wc_str_len); +} + +int +w_char_to_wchar (xlc, w, wc, len, wc_len) +#ifdef X11R5 + XLocale xlc; +#else + XLCd xlc; +#endif /* X11R5 */ + w_char *w; + wchar *wc; + int len; + int wc_len; +{ + int ret; + + while (c_buf_max < (len * 2)) + { + if (realloc_c_buf () < 0) + return (0); + } + ret = w_char_to_char (w, c_buf, len); + if (ret <= 0) + return (0); + + return (char_to_wchar (xlc, (unsigned char *) c_buf, wc, ret, wc_len)); +} + +int +w_char_to_ct (xlc, w, ct, len, ct_len) +#ifdef X11R5 + XLocale xlc; +#else + XLCd xlc; +#endif /* X11R5 */ + w_char *w; + unsigned char *ct; + int len; + int ct_len; +{ + int ret; + int ct_str_len = ct_len; + int scanned_byte = 0; + + while (c_buf_max < (len * 2)) + { + if (realloc_c_buf () < 0) + return (0); + } + ret = w_char_to_char (w, c_buf, len); + if (ret <= 0) + return (0); + + ret = _XConvertMBToCT (xlc, c_buf, ret, ct, &ct_str_len, &scanned_byte, NULL); + if (ret < 0) + { + if (ret == BadBuffer) + { + return (-1); + } + else + { + return (-2); + } + } + return (ct_str_len); +} + +int +wchar_to_ct (xlc, w, ct, len, ct_len) +#ifdef X11R5 + XLocale xlc; +#else + XLCd xlc; +#endif /* X11R5 */ + wchar *w; + unsigned char *ct; + int len; + int ct_len; +{ + int scanned_byte; + int ct_str_len = ct_len; + int ret; + + ret = _XConvertWCToCT (xlc, w, len, ct, &ct_str_len, &scanned_byte, NULL); + if (ret < 0) + { + if (ret == BadBuffer) + { + return (-1); + } + else + { + return (-2); + } + } + return (ct_str_len); +} + +void +JWOutput (w, fs, gc, start_col, col, flg, offset_x, offset_y, cs, text, text_len) + Window w; + XFontSet fs; + GC gc; + short start_col, col; + unsigned char flg; + short offset_x, offset_y; + XCharStruct *cs; + wchar *text; + int text_len; +{ + register int start_x, start_y; + wchar_t *w_text; + int w_text_len; +#ifndef X_WCHAR + int mb_buf_len; + int scanned_byte; + int ret; +#endif /* !X_WCHAR */ + +#ifdef X_WCHAR + w_text = (wchar_t *) text; + w_text_len = text_len; +#else /* X_WCHAR */ + while (1) + { + mb_buf_len = c_buf_max; + ret = _XConvertWCToMB ( +#ifdef XJUTIL + NULL, +#else + cur_p->cur_xl->xlc, +#endif + text, text_len, c_buf, &mb_buf_len, &scanned_byte, NULL); + if (ret < 0) + { + if (ret == BadBuffer) + { + if (realloc_c_buf () < 0) + return; + } + else + { + return; + } + } + else + { + break; + } + } + w_text = wt_buf; + while (1) + { + w_text_len = mbstowcs (wt_buf, (char *) c_buf, wt_buf_max); + if (w_text_len == wt_buf_max) + { + if (realloc_wt_buf () < 0) + return; + } + else + { + break; + } + } +#endif /* X_WCHAR */ + + start_x = (cs->width * start_col) + offset_x; + start_y = cs->ascent + offset_y; + if (flg & REV_FLAG) + { + XwcDrawImageString (dpy, w, fs, gc, start_x, start_y, w_text, w_text_len); + } + else + { + XClearArea (dpy, w, start_x, offset_y, (cs->width * col), (cs->ascent + cs->descent), False); + XwcDrawString (dpy, w, fs, gc, start_x, start_y, w_text, w_text_len); + } + if (flg & BOLD_FLAG) + XwcDrawString (dpy, w, fs, gc, (start_x + 1), start_y, w_text, w_text_len); + if (flg & UNDER_FLAG) + XDrawLine (dpy, w, gc, start_x, (start_y + 1), (start_x + cs->width * col), start_y + 1); + return; +} + +XCharStruct * +get_base_char (fs) + XFontSet fs; +{ + XCharStruct *cs; + XFontStruct **fs_list; + char **fn_list; + + if (XFontsOfFontSet (fs, &fs_list, &fn_list) < 1) + { + print_out ("I could not get base char struct."); + return (NULL); + } + if (!(cs = (XCharStruct *) Malloc (sizeof (XCharStruct)))) + { + malloc_error ("allocation of base char struct"); + return (NULL); + } + cs->width = fs_list[0]->max_bounds.width; + cs->ascent = fs_list[0]->ascent; + cs->descent = fs_list[0]->descent; + return ((XCharStruct *) cs); +} + +/* *INDENT-OFF* */ +XFontSet +create_font_set (s) + char *s; +/* *INDENT-ON* */ + +{ + XFontSet xfontset; + char **missing_charset_list; + int missing_charset_count; + char *def_string; + + xfontset = XCreateFontSet (dpy, s, &missing_charset_list, &missing_charset_count, &def_string); + if ((xfontset == NULL) /* || (missing_charset_count > 0) */ ) + { + print_out ("Can not create FontSet\n"); + return ((XFontSet) NULL); + } + if (missing_charset_count > 0) + { + XFreeStringList (missing_charset_list); + } + return ((XFontSet) xfontset); +}