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

📄 xwcprptext.c

📁 早期freebsd实现
💻 C
字号:
/* $XConsortium: XwcPrpText.c,v 1.12 91/11/17 15:31:34 rws Exp $ *//* * Copyright 1991 by OMRON 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 and MIT not be used in * advertising or publicity pertaining to distribution of the software without * specific, written prior permission.  OMRON and MIT make no representations * about the suitability of this software for any purpose.  It is provided * "as is" without express or implied warranty. * * OMRON AND MIT DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO * EVENT SHALL OMRON OR MIT 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 * TORTUOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * PERFORMANCE OF THIS SOFTWARE. * * Author: Hiroshi Kuribayashi    OMRON Corporation * */#include <X11/Xlibint.h>#include <X11/Xatom.h>#include <X11/Xutil.h>#include "Xlocaleint.h"#define XA_COMPOUND_TEXT(d) XInternAtom(d, "COMPOUND_TEXT", False)#if NeedFunctionPrototypesintXwcTextPropertyToTextList(    Display *dpy,    XTextProperty *tp,    wchar_t ***list_return,    int *count_return)#elseintXwcTextPropertyToTextList(dpy, tp, list_return, count_return)    Display *dpy;    XTextProperty *tp;    wchar_t ***list_return;    int *count_return;#endif{    wchar_t **list;    unsigned int nelements;    unsigned char *cp;    wchar_t *start;    int i, j;    int len, scand;    unsigned int datalen = (int) tp->nitems;    int ret, error = 0;#ifndef X_WCHAR    char *mbuf;#endif    XsiLCd lcd = (XsiLCd)_XlcCurrentLC();    if (tp->format != 8 ||	(tp->encoding != XA_STRING &&	 tp->encoding != XA_COMPOUND_TEXT(dpy) &&	 !(lcd &&	   tp->encoding == XInternAtom(dpy, lcd->xlc->xlc_db->lc_encoding,				       False))))	return XConverterNotFound;    if (datalen == 0) {	*list_return = (wchar_t **) Xmalloc(sizeof (wchar_t *));	**list_return = 0;	*count_return = 0;	return Success;    }    nelements = 1;    for (cp = tp->value, i = datalen; i > 0; cp++, i--) {	if (*cp == '\0') nelements++;    }    list = (wchar_t **) Xmalloc (nelements * sizeof (wchar_t *));    if (!list) return XNoMemory;    start = (wchar_t *) Xmalloc ((datalen + 1) * sizeof (wchar_t));    if (!start) {	Xfree ((char *) list);	return XNoMemory;    }    if (tp->encoding == XA_STRING ||	tp->encoding == XA_COMPOUND_TEXT(dpy)) {	cp = tp->value;	for (i = j = 0; i < nelements; i++, j++) {	    list[j] = start;	    if (i == nelements - 1)		scand = datalen;	    else		scand = strlen((char *)cp);#ifdef X_WCHAR	    len = datalen + 1;	    if ((ret = _XConvertCTToWC(0, cp,  scand, start,				&len, &scand, 0)) < 0) {		XwcFreeStringList(list);		return (XConverterNotFound);	    }#else#ifdef macII	    len = 0; ret = 0;#else	    len = scand * 2;	    mbuf = _XAllocScratch(dpy, len);	    if ((ret = _XConvertCTToMB(0, cp, scand, mbuf,				&len, &scand, 0)) < 0) {		XwcFreeStringList(list);		return (XConverterNotFound);	    }	    len = mbstowcs(start, mbuf, datalen + 1);	    if (len == datalen) {		XwcFreeStringList(list);		return (XConverterNotFound);	    }#endif#endif	    error += ret;	    start += len + 1;	    datalen -= len + 1;	    cp += scand + 1;	}    } else {	cp = tp->value;	for (i = j = 0; i < nelements; i++, j++) {	    list[j] = start;#ifdef X_WCHAR	    len = datalen + 1;	    if (i == nelements - 1)		scand = datalen;	    else		scand = strlen((char *)cp);	    if ((ret = _XConvertMBToWC(0, cp, scand, start,				&len, &scand, 0)) < 0) {		XwcFreeStringList(list);		return (XConverterNotFound);	    }	    error += ret;#else#ifdef macII	    len = 0;#else	    len = mbstowcs(start, (char *)cp, datalen);	    if (len == datalen) {		XwcFreeStringList(list);		return (XConverterNotFound);	    }#endif#endif	    start += len + 1;	    datalen -= len + 1;	    cp += scand + 1;	}    }    *list_return = list;    *count_return = nelements;    return error;}void XwcFreeStringList (list)    wchar_t **list;{    if (list) {	if (list[0]) Xfree ((char *)(list[0]));	Xfree ((char *) list);    }}

⌨️ 快捷键说明

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