FSWrap.c revision 3233502e
1
2/*
3 * Copyright 1991 by the Open Software Foundation
4 * Copyright 1993 by the TOSHIBA Corp.
5 *
6 * Permission to use, copy, modify, distribute, and sell this software and its
7 * documentation for any purpose is hereby granted without fee, provided that
8 * the above copyright notice appear in all copies and that both that
9 * copyright notice and this permission notice appear in supporting
10 * documentation, and that the name Open Software Foundation
11 * not be used in advertising or publicity pertaining to distribution of the
12 * software without specific, written prior permission.  Open Software
13 * Foundation makes no representations about the suitability of this
14 * software for any purpose.  It is provided "as is" without express or
15 * implied warranty.
16 *
17 * OPEN SOFTWARE FOUNDATION DISCLAIMS ALL WARRANTIES WITH REGARD TO
18 * THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
19 * FITNESS, IN NO EVENT SHALL OPEN SOFTWARE FOUNDATIONN BE
20 * LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
21 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
22 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
23 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
24 *
25 *		 M. Collins		OSF
26 *
27 *		 Katsuhisa Yano		TOSHIBA Corp.
28 */
29
30/*
31
32Copyright 1991, 1998  The Open Group
33
34Permission to use, copy, modify, distribute, and sell this software and its
35documentation for any purpose is hereby granted without fee, provided that
36the above copyright notice appear in all copies and that both that
37copyright notice and this permission notice appear in supporting
38documentation.
39
40The above copyright notice and this permission notice shall be included
41in all copies or substantial portions of the Software.
42
43THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
44OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
45MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
46IN NO EVENT SHALL THE OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR
47OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
48ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
49OTHER DEALINGS IN THE SOFTWARE.
50
51Except as contained in this notice, the name of The Open Group shall
52not be used in advertising or otherwise to promote the sale, use or
53other dealings in this Software without prior written authorization
54from The Open Group.
55
56*/
57
58
59#ifdef HAVE_CONFIG_H
60#include <config.h>
61#endif
62#include "Xlibint.h"
63#include "Xlcint.h"
64#include <ctype.h>
65#include <X11/Xos.h>
66
67
68#define	XMAXLIST	256
69
70char **
71_XParseBaseFontNameList(
72    char           *str,
73    int            *num)
74{
75    char           *plist[XMAXLIST];
76    char          **list;
77    char           *ptr, *psave;
78
79    *num = 0;
80    if (!str || !*str) {
81	return (char **)NULL;
82    }
83    while (*str && isspace(*str))
84	str++;
85    if (!*str)
86	return (char **)NULL;
87
88    if (!(ptr = strdup(str))) {
89	return (char **)NULL;
90    }
91
92    psave = ptr;
93    /* somebody who specifies more than XMAXLIST basefontnames will lose */
94    while (*num < (sizeof plist / sizeof plist[0])) {
95	char	*back;
96
97	plist[*num] = ptr;
98	if ((ptr = strchr(ptr, ','))) {
99	    back = ptr;
100	} else {
101	    back = plist[*num] + strlen(plist[*num]);
102	}
103	while (isspace(*(back - 1)))
104	    back--;
105	*back = '\0';
106	(*num)++;
107	if (!ptr)
108	    break;
109	ptr++;
110	while (*ptr && isspace(*ptr))
111	    ptr++;
112	if (!*ptr)
113	    break;
114    }
115    if (!(list = Xmalloc(sizeof(char *) * (*num + 1)))) {
116	Xfree(psave);
117	return (char **)NULL;
118    }
119    memcpy((char *)list, (char *)plist, sizeof(char *) * (*num));
120    *(list + *num) = NULL;
121
122    return list;
123}
124
125static char **
126copy_string_list(
127    char **string_list,
128    int list_count)
129{
130    char **string_list_ret, **list_src, **list_dst, *dst;
131    int length, count;
132
133    if (string_list == NULL || list_count <= 0)
134	return (char **) NULL;
135
136    string_list_ret = Xmalloc(sizeof(char *) * list_count);
137    if (string_list_ret == NULL)
138	return (char **) NULL;
139
140    list_src = string_list;
141    count = list_count;
142    for (length = 0; count-- > 0; list_src++)
143	length += strlen(*list_src) + 1;
144
145    dst = Xmalloc(length);
146    if (dst == NULL) {
147	Xfree(string_list_ret);
148	return (char **) NULL;
149    }
150
151    list_src = string_list;
152    count = list_count;
153    list_dst = string_list_ret;
154    for ( ;  count-- > 0; list_src++) {
155	strcpy(dst, *list_src);
156	*list_dst++ = dst;
157	dst += strlen(dst) + 1;
158    }
159
160    return string_list_ret;
161}
162
163XFontSet
164XCreateFontSet (
165    Display        *dpy,
166    _Xconst char   *base_font_name_list,
167    char         ***missing_charset_list,
168    int            *missing_charset_count,
169    char          **def_string)
170{
171    XOM om;
172    XOC oc;
173    XOMCharSetList *list;
174
175    *missing_charset_list = NULL;
176    *missing_charset_count = 0;
177
178    om = XOpenOM(dpy, NULL, NULL, NULL);
179    if (om == NULL)
180	return (XFontSet) NULL;
181
182    if ((oc = XCreateOC(om, XNBaseFontName, base_font_name_list, NULL))) {
183	list = &oc->core.missing_list;
184	oc->core.om_automatic = True;
185    } else
186	list = &om->core.required_charset;
187
188    *missing_charset_list = copy_string_list(list->charset_list,
189					     list->charset_count);
190    *missing_charset_count = list->charset_count;
191
192    if (list->charset_list && *missing_charset_list == NULL)
193	oc = NULL;
194
195    if (oc && def_string) {
196	*def_string = oc->core.default_string;
197	if (!*def_string)
198	    *def_string = (char *)"";
199    }
200
201    if (oc == NULL)
202	XCloseOM(om);
203
204    return (XFontSet) oc;
205}
206
207int
208XFontsOfFontSet(
209    XFontSet        font_set,
210    XFontStruct  ***font_struct_list,
211    char         ***font_name_list)
212{
213    *font_name_list   = font_set->core.font_info.font_name_list;
214    *font_struct_list = font_set->core.font_info.font_struct_list;
215    return font_set->core.font_info.num_font;
216}
217
218char *
219XBaseFontNameListOfFontSet(XFontSet font_set)
220{
221    return font_set->core.base_name_list;
222}
223
224char *
225XLocaleOfFontSet(XFontSet font_set)
226{
227    return font_set->core.om->core.lcd->core->name;
228}
229
230Bool
231XContextDependentDrawing(XFontSet font_set)
232{
233    return font_set->core.om->core.context_dependent;
234}
235
236Bool
237XDirectionalDependentDrawing(XFontSet font_set)
238{
239    return font_set->core.om->core.directional_dependent;
240}
241
242Bool
243XContextualDrawing(XFontSet font_set)
244{
245    return font_set->core.om->core.contextual_drawing;
246}
247
248XFontSetExtents *
249XExtentsOfFontSet(XFontSet font_set)
250{
251    if (!font_set)
252	return NULL;
253    return &font_set->core.font_set_extents;
254}
255
256void
257XFreeFontSet(
258    Display        *dpy,
259    XFontSet        font_set)
260{
261    XCloseOM(font_set->core.om);
262}
263