⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 xlcaccess.c

📁 早期freebsd实现
💻 C
字号:
/* * $XConsortium: XlcAccess.c,v 1.21 91/09/18 16:29:59 rws Exp $ *//* * Copyright 1990, 1991 by OMRON Corporation, NTT Software Corporation, *                      and Nippon Telegraph and Telephone Corporation * Copyright 1991 by the Massachusetts Institute of Technology * * Permission to use, copy, modify, distribute, and sell this software and its * documentation for any purpose is hereby granted without fee, provided that * the above copyright notice appear in all copies and that both that * copyright notice and this permission notice appear in supporting * documentation, and that the names of OMRON, NTT Software, NTT, and M.I.T. * not be used in advertising or publicity pertaining to distribution of the * software without specific, written prior permission. OMRON, NTT Software, * NTT, and M.I.T. make no representations about the suitability of this * software for any purpose.  It is provided "as is" without express or * implied warranty. * * OMRON, NTT SOFTWARE, NTT, AND M.I.T. DISCLAIM ALL WARRANTIES WITH REGARD * TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS, IN NO EVENT SHALL OMRON, NTT SOFTWARE, NTT, OR M.I.T. BE * LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * *	Authors: Li Yuhong		OMRON Corporation *		 Hiroshi Kuribayashi	OMRON Corporation *    */#include "Xlibint.h"#include <X11/Xos.h>#include "Xlocaleint.h"#define SO                      0x0E#define SI                      0x0F#define SS2                     0x8E#define SS3                     0x8F#define ESC                     0x1B#define NotInvokeOrEsc(c)       (c != SO && c != SI &&                      \                                 c != SS2 && c != SS3 && c != ESC)int_Xmbmsbon(xlocale)    XLocale xlocale;{    if (!xlocale) xlocale = _XFallBackConvert();    return (xlocale->xlc_db->lc_codeset->cds_msbon);}_CSID_Xmbctid(xlocale, csid)    XLocale	xlocale;    _CSID	csid;{    Fontset    *flist;    if (!xlocale) xlocale = _XFallBackConvert();    flist = xlocale->xlc_db->lc_fontset;    return ((int)csid >= flist->fs_num) ? ND:	       flist->fs_cset[csid]->cs_id;}_CSID_Xmbctidtocsid(xlocale, ctid)    XLocale	xlocale;    _CSID	ctid;{    _CSID	csid;    int		fs_num;    Fontset	*fontset;    if (!xlocale) xlocale = _XFallBackConvert();    fontset = xlocale->xlc_db->lc_fontset;    fs_num = fontset->fs_num;    for (csid = 0; (int)csid < fs_num; csid++) {	if (fontset->fs_cset[csid]->cs_id == ctid)	return (csid);    }    return (ND);}_CSID_Xmbcsid(xlocale, mbstr)    XLocale	   	xlocale;    unsigned char      *mbstr;{    register Codeset        *codeset;    register char           *dsg;    register unsigned char  c;    _CSID                   numcs;    _CSID		    i;    if (!xlocale) xlocale = _XFallBackConvert();    /*     * set initial state for state-dependent codeset.     */    if (!mbstr) {	_Xmbinit(xlocale);        return (mbGetid(xlocale));    }    codeset = xlocale->xlc_db->lc_codeset;    /*     * state-independent codeset     */    if (codeset->cds_type == CDS_STATELESS) {        return (xlocale->mb_state = codeset->cds_map[*mbstr]);    }    /*     * state-dependent codeset.     */    c = *mbstr;                                     /* for macro parameter */    /*      * DEL(0x7F), not 0xFF, is control character.     */    if (!iscntrl(c & 0x7f) || (c == 0xFF)) {	if ((c & 0x80) != mbGetGLorGR(xlocale)) {	    mbSetGLorGR(xlocale, c & 0x80);	}        return (mbGetid(xlocale));    }    /*     * control characters     */    if (NotInvokeOrEsc(c))        return ((c & 0x80) == 0)? C0 : C1;    /*     * invoker or escape means a possible designation sequence.     */    numcs = codeset->cds_num;    for (i = CODESET0; i < numcs; i++) {        dsg = codeset->cds_dsg[i];        if (!strncmp((char *)mbstr, dsg, strlen(dsg))) {	    if (_XctisGLdsg(dsg)) {		mbSetGLorGR(xlocale, GL);	    } else {		mbSetGLorGR(xlocale, GR);	    }	    mbSetid(xlocale, i);            return i;        }    }    return ND;}void_XmbSetCsid(xlocale, csid)    XLocale	 xlocale;    _CSID	 csid;{    Codeset *codeset;    if (!xlocale) xlocale = _XFallBackConvert();    codeset = xlocale->xlc_db->lc_codeset;    if (codeset->cds_type == CDS_STATEFUL) {	if (_XctisGLdsg(codeset->cds_dsg[csid])) {	    mbSetGLorGR(xlocale, GL);	} else {	    mbSetGLorGR(xlocale, GR);	}    }    mbSetid(xlocale, csid);}_CSID_XmbctGLorGR(xlocale)    XLocale	xlocale;{    Fontset    *flist;    _CSID	csid;    if (!xlocale) xlocale = _XFallBackConvert();    flist = xlocale->xlc_db->lc_fontset;    csid = mbGetid(xlocale);    return ((int)csid >= flist->fs_num) ? -1:           flist->fs_cset[csid]->cs_GLorGR;}Charset *_Xmbfscs(xlocale, csid)    XLocale    xlocale;    _CSID      csid;{    Fontset *flist;    if (!xlocale) xlocale = _XFallBackConvert();    flist = xlocale->xlc_db->lc_fontset;    return ((int)csid >= flist->fs_num) ? (Charset *)0:           flist->fs_cset[csid];}char *_Xmbfsname(xlocale)    XLocale	xlocale;{    Fontset	*flist;    _CSID	csid;    if (!xlocale) xlocale = _XFallBackConvert();    flist = xlocale->xlc_db->lc_fontset;    csid = mbGetid(xlocale);    return ((int)csid >= flist->fs_num) ? (char *)0:            flist->fs_cset[csid]->cs_name;}int_Xmblen(xlocale)    XLocale	xlocale;{    _CSID	csid;    Codeset	*codeset;    if (!xlocale) xlocale = _XFallBackConvert();    csid = mbGetid(xlocale);    codeset = xlocale->xlc_db->lc_codeset;    return (csid >= codeset->cds_num)? 1:           codeset->cds_mblen[csid];}int_Xmbfslen(xlocale)    XLocale  	xlocale;{    Fontset    *flist;    _CSID 	csid;    if (!xlocale) xlocale = _XFallBackConvert();    flist = xlocale->xlc_db->lc_fontset;    csid = mbGetid(xlocale);    return ((int)csid >= flist->fs_num)? 0 :           flist->fs_cset[csid]->cs_len;}int_Xmbctocsc(xlocale, mbstr, cscode)    XLocale		xlocale;    unsigned char      *mbstr;    int                *cscode;{    register Range     *cds_cnvlist;    int		       *cds_cnvindex;    register int	i;    Codeset	       *codeset;    register unsigned	code;    register unsigned	c;    register int	len;    int			start, stop;    _CSID		csid;    codeset = xlocale->xlc_db->lc_codeset;    if (xlocale->mb_state & 0xff0000)	/* GR */	csid = (xlocale->mb_state & 0xff00) >> 8;    else				/* GL */	csid = xlocale->mb_state & 0xff;    if (csid >= codeset->cds_num)	return (BadEncoding);    cds_cnvindex = codeset->cds_cnvindex;    cds_cnvlist = codeset->cds_cnvlist;    start = cds_cnvindex[csid];    stop = cds_cnvindex[csid + 1];    len = codeset->cds_mblen[csid];    if (len == 1) {	code = *mbstr;    } else if (len == 2) {	code = (*mbstr << 8) | *(mbstr+1);	if (!(*(mbstr+1))) {	    *cscode = codeset->cds_cnvlist[start].cs_start;	    return (BadEncoding);	}    } else  {	code = 0;	while ((len > 0) && ((c = *mbstr++))) {	    code = (code << 8) | c; 	    len--;	}	/* recover codepoint if expect more bytes from mbstr. */	if (len > 0) {	    *cscode = codeset->cds_cnvlist[start].cs_start;	    return (BadEncoding);	}    }    for (i = start; i < stop; i++) {	if (code < cds_cnvlist[i].mb_start)	    break;    }    /*     * recover wrong code always with the first codepoint of the     * charset id.     */    if (i == start || code > cds_cnvlist[i - 1].mb_end) {	*cscode = cds_cnvlist[start].cs_start;	return (BadEncoding);    } else {	*cscode = (cds_cnvlist[i - 1].cs_start + 		code - cds_cnvlist[i - 1].mb_start);	return (Success);    }}int_Xcsctombc(xlocale, cscode, code)    XLocale		xlocale;    int			cscode;    int	       	       *code;{    register int        start, stop, i;    register Codeset   *codeset;    _CSID		csid;    codeset = xlocale->xlc_db->lc_codeset;    csid = mbGetid(xlocale);    if (csid >= codeset->cds_num)	return (BadEncoding);    cscode |= codeset->cs_offset[csid];    start = codeset->cds_cnvindex[csid];    stop = codeset->cds_cnvindex[csid + 1];    for (i = start; i < stop; i++) {        if (cscode >= codeset->cds_cnvlist[i].cs_start &&	    cscode <= codeset->cds_cnvlist[i].cs_end)            break;    }    if (i == stop)	return BadEncoding;    *code = codeset->cds_cnvlist[i].mb_start +	    cscode - codeset->cds_cnvlist[i].cs_start;    return Success;}/* * get the designation sequence of state-dependent codeset. * any error should be controlled by caller. */char *_Xmbdsg(xlocale)    XLocale	xlocale;{    _CSID	csid;    Codeset    *codeset;    if (!xlocale) xlocale = _XFallBackConvert();    codeset = xlocale->xlc_db->lc_codeset;    csid = mbGetid(xlocale);    return (csid >= codeset->cds_num)? (char *)0:           codeset->cds_dsg[csid];}/* * get the designation sequence of the font charset which  * is registered by X in CT encoding. * any error should be controlled by caller. */char *_Xmbfsdsg(xlocale)    XLocale  	xlocale;{    Fontset    *flist;    _CSID	csid;    if (!xlocale) xlocale = _XFallBackConvert();    flist = xlocale->xlc_db->lc_fontset;    csid = mbGetid(xlocale);    return ((int)csid >= flist->fs_num)? (char *)0:           flist->fs_cset[csid]->cs_des;}/* * return the woffset of the font charset. */wchar_Xmbfswf(xlocale, csid)    XLocale    xlocale;    _CSID	csid;{    Fontset    *flist;    if (!xlocale) xlocale = _XFallBackConvert();    flist = xlocale->xlc_db->lc_fontset;    return ((int)csid >= flist->fs_num) ? (~0L):           flist->fs_cset[csid]->cs_woff;}/* * if the mbstr points to the designation sequence, return the length * of the designation, otherwise return 0; */int _Xmbdlen(xlocale, mbstr)    XLocale		xlocale;    unsigned char      *mbstr;{    register int	len;    _CSID		csid;    Codeset 	       *codeset;    if (!xlocale) xlocale = _XFallBackConvert();    codeset = xlocale->xlc_db->lc_codeset;    csid = mbGetid(xlocale);    if (csid >= codeset->cds_num || 	codeset->cds_type != CDS_STATEFUL)        return 0;    len = strlen(codeset->cds_dsg[csid]);    if (!strncmp((char *)mbstr, codeset->cds_dsg[csid], len))        return (len);    else        return (0);}Bool_XmbCheck(xlocale)    XLocale	xlocale;{    Codeset    *codeset;    if (!xlocale) xlocale = _XFallBackConvert();    codeset = xlocale->xlc_db->lc_codeset;    if (mbGetGLid(xlocale) >= codeset->cds_num ||	mbGetGRid(xlocale) >= codeset->cds_num)	return (False);    return (True);}void_XmbGetDefaultEncoding(xlocale, dsg)    XLocale	xlocale;    char       *dsg;{    _CSID	id;    _CSID	gl, gr;    _State	mb_init;    Codeset    *codeset;    if (!xlocale) xlocale = _XFallBackConvert();    codeset = xlocale->xlc_db->lc_codeset;    *dsg = 0;    if (codeset->cds_type != CDS_STATEFUL)	return;    mb_init = _XmbDefaultState(xlocale);    gl = mb_init & 0xff;    gr = (mb_init & 0xff00) >> 8;    id = mbGetGLid(xlocale);    if (id != gl && id < codeset->cds_num)	strcpy(dsg, codeset->cds_dsg[gl]);    id = mbGetGRid(xlocale);    if (gl != gr && id != gr && 	id < codeset->cds_num)	strcat(dsg, codeset->cds_dsg[gr]);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -