cout.c revision 4cd6a3ae
18c9fbc29Smrg/************************************************************
28c9fbc29Smrg Copyright (c) 1994 by Silicon Graphics Computer Systems, Inc.
38c9fbc29Smrg
48c9fbc29Smrg Permission to use, copy, modify, and distribute this
58c9fbc29Smrg software and its documentation for any purpose and without
68c9fbc29Smrg fee is hereby granted, provided that the above copyright
78c9fbc29Smrg notice appear in all copies and that both that copyright
88c9fbc29Smrg notice and this permission notice appear in supporting
94cd6a3aeSmrg documentation, and that the name of Silicon Graphics not be
104cd6a3aeSmrg used in advertising or publicity pertaining to distribution
118c9fbc29Smrg of the software without specific prior written permission.
124cd6a3aeSmrg Silicon Graphics makes no representation about the suitability
138c9fbc29Smrg of this software for any purpose. It is provided "as is"
148c9fbc29Smrg without any express or implied warranty.
154cd6a3aeSmrg
164cd6a3aeSmrg SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
174cd6a3aeSmrg SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
188c9fbc29Smrg AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON
194cd6a3aeSmrg GRAPHICS BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
204cd6a3aeSmrg DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
214cd6a3aeSmrg DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
228c9fbc29Smrg OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION  WITH
238c9fbc29Smrg THE USE OR PERFORMANCE OF THIS SOFTWARE.
248c9fbc29Smrg
258c9fbc29Smrg ********************************************************/
268c9fbc29Smrg
278c9fbc29Smrg#ifdef HAVE_CONFIG_H
288c9fbc29Smrg#include <config.h>
298c9fbc29Smrg#endif
308c9fbc29Smrg#include <stdio.h>
318c9fbc29Smrg#include <ctype.h>
328c9fbc29Smrg#include <stdlib.h>
338c9fbc29Smrg#include <X11/Xos.h>
348c9fbc29Smrg#include <X11/Xlib.h>
358c9fbc29Smrg#include <X11/XKBlib.h>
368c9fbc29Smrg#include <X11/extensions/XKBgeom.h>
378c9fbc29Smrg
388c9fbc29Smrg#include "XKMformat.h"
398c9fbc29Smrg#include "XKBfileInt.h"
408c9fbc29Smrg
418c9fbc29Smrg#define	lowbit(x)	((x) & (-(x)))
428c9fbc29Smrg
438c9fbc29Smrgstatic Bool
448c9fbc29SmrgWriteCHdrVMods(FILE *file,Display *dpy,XkbDescPtr xkb)
458c9fbc29Smrg{
468c9fbc29Smrgregister int i,nOut;
478c9fbc29Smrg
488c9fbc29Smrg    if ((!xkb)||(!xkb->names)||(!xkb->names->vmods))
498c9fbc29Smrg	return False;
508c9fbc29Smrg    for (i=nOut=0;i<XkbNumVirtualMods;i++) {
518c9fbc29Smrg	if (xkb->names->vmods[i]!=None) {
528c9fbc29Smrg	    fprintf(file,"%s#define	vmod_%s	%d\n",(nOut<1?"\n":""),
538c9fbc29Smrg				XkbAtomText(dpy,xkb->names->vmods[i],XkbCFile),
548c9fbc29Smrg				i);
558c9fbc29Smrg	    nOut++;
568c9fbc29Smrg	}
578c9fbc29Smrg    }
588c9fbc29Smrg    for (i=nOut=0;i<XkbNumVirtualMods;i++) {
598c9fbc29Smrg	if (xkb->names->vmods[i]!=None) {
608c9fbc29Smrg	    fprintf(file,"%s#define	vmod_%sMask	(1<<%d)\n",
618c9fbc29Smrg				(nOut<1?"\n":""),
628c9fbc29Smrg				XkbAtomText(dpy,xkb->names->vmods[i],XkbCFile)
638c9fbc29Smrg				,i);
648c9fbc29Smrg	    nOut++;
658c9fbc29Smrg	}
668c9fbc29Smrg    }
678c9fbc29Smrg    if (nOut>0)
688c9fbc29Smrg	fprintf(file,"\n");
698c9fbc29Smrg    return True;
708c9fbc29Smrg}
718c9fbc29Smrg
728c9fbc29Smrgstatic Bool
738c9fbc29SmrgWriteCHdrKeycodes(FILE *file,XkbDescPtr xkb)
748c9fbc29Smrg{
758c9fbc29SmrgAtom			kcName;
768c9fbc29Smrgregister unsigned 	i;
778c9fbc29Smrgchar 			buf[8];
788c9fbc29Smrg
798c9fbc29Smrg    if ((!xkb)||(!xkb->names)||(!xkb->names->keys)) {
808c9fbc29Smrg	_XkbLibError(_XkbErrMissingNames,"WriteCHdrKeycodes",0);
818c9fbc29Smrg	return False;
828c9fbc29Smrg    }
838c9fbc29Smrg    kcName= xkb->names->keycodes;
848c9fbc29Smrg    buf[4]= '\0';
858c9fbc29Smrg    if (xkb->names->keycodes!=None)
868c9fbc29Smrg	 fprintf(file,"/* keycodes name is \"%s\" */\n",
878c9fbc29Smrg 				XkbAtomText(xkb->dpy,kcName,XkbMessage));
888c9fbc29Smrg    fprintf(file,"static XkbKeyNameRec	keyNames[NUM_KEYS]= {\n");
898c9fbc29Smrg    for (i=0;i<=xkb->max_key_code;i++) {
908c9fbc29Smrg	sprintf(buf,"\"%s\"",XkbKeyNameText(xkb->names->keys[i].name,XkbCFile));
918c9fbc29Smrg	if (i!=xkb->max_key_code)  {
928c9fbc29Smrg	    fprintf(file,"    {  %6s  },",buf);
938c9fbc29Smrg	    if ((i&3)==3)
948c9fbc29Smrg		fprintf(file,"\n");
958c9fbc29Smrg	}
968c9fbc29Smrg	else {
978c9fbc29Smrg	    fprintf(file,"    {  %6s  }\n",buf);
988c9fbc29Smrg	}
998c9fbc29Smrg    }
1008c9fbc29Smrg    fprintf(file,"};\n");
1018c9fbc29Smrg    return True;
1028c9fbc29Smrg}
1038c9fbc29Smrg
1048c9fbc29Smrgstatic void
1058c9fbc29SmrgWriteTypePreserve(	FILE *		file,
1068c9fbc29Smrg			Display *	dpy,
1078c9fbc29Smrg			char *		prefix,
1088c9fbc29Smrg			XkbDescPtr	xkb,
1098c9fbc29Smrg			XkbKeyTypePtr	type)
1108c9fbc29Smrg{
1118c9fbc29Smrgregister unsigned	i;
1128c9fbc29SmrgXkbModsPtr		pre;
1138c9fbc29Smrg
1148c9fbc29Smrg    fprintf(file,"static XkbModsRec preserve_%s[%d]= {\n",prefix,
1158c9fbc29Smrg							type->map_count);
1168c9fbc29Smrg    for (i=0,pre=type->preserve;i<type->map_count;i++,pre++) {
1178c9fbc29Smrg	if (i!=0)
1188c9fbc29Smrg	    fprintf(file,",\n");
1198c9fbc29Smrg	fprintf(file,"    {   %15s, ",XkbModMaskText(pre->mask,XkbCFile));
1208c9fbc29Smrg	fprintf(file,"%15s, ",XkbModMaskText(pre->real_mods,XkbCFile));
1218c9fbc29Smrg	fprintf(file,"%15s }",XkbVModMaskText(dpy,xkb,0,pre->vmods,XkbCFile));
1228c9fbc29Smrg    }
1238c9fbc29Smrg    fprintf(file,"\n};\n");
1248c9fbc29Smrg    return;
1258c9fbc29Smrg}
1268c9fbc29Smrg
1278c9fbc29Smrgstatic void
1288c9fbc29SmrgWriteTypeInitFunc(FILE *file,Display *dpy,XkbDescPtr xkb)
1298c9fbc29Smrg{
1308c9fbc29Smrgregister unsigned 	i,n;
1318c9fbc29SmrgXkbKeyTypePtr		type;
1328c9fbc29SmrgAtom *			names;
1334e411241Smrgchar *			prefix = NULL;
1348c9fbc29Smrg
1358c9fbc29Smrg    fprintf(file,"\n\nstatic void\n");
1368c9fbc29Smrg    fprintf(file,"initTypeNames(DPYTYPE dpy)\n");
1378c9fbc29Smrg    fprintf(file,"{\n");
1388c9fbc29Smrg    for (i=0,type=xkb->map->types;i<xkb->map->num_types;i++,type++) {
1394e411241Smrg	if (!(prefix = strdup(XkbAtomText(dpy,type->name,XkbCFile)))) {
1404e411241Smrg		_XkbLibError(_XkbErrBadAlloc,"WriteTypeInitFunc",0);
1414e411241Smrg		fprintf(file,"#error XkbErrBadAlloc WriteTypeInitFunc\n");
1424e411241Smrg		break;
1434e411241Smrg	}
1448c9fbc29Smrg	if (type->name!=None)
1458c9fbc29Smrg	    fprintf(file,"    dflt_types[%d].name= GET_ATOM(dpy,\"%s\");\n",i,
1468c9fbc29Smrg					XkbAtomText(dpy,type->name,XkbCFile));
1478c9fbc29Smrg	names= type->level_names;
1488c9fbc29Smrg	if (names!=NULL) {
1498c9fbc29Smrg	    char *tmp;
1508c9fbc29Smrg	    for (n=0;n<type->num_levels;n++) {
1518c9fbc29Smrg		if (names[n]==None)
1528c9fbc29Smrg		    continue;
1538c9fbc29Smrg		tmp= XkbAtomText(dpy,names[n],XkbCFile);
1548c9fbc29Smrg		if (tmp==NULL)
1558c9fbc29Smrg		    continue;
1568c9fbc29Smrg		fprintf(file,"    lnames_%s[%d]=	",prefix,n);
1578c9fbc29Smrg		fprintf(file,"GET_ATOM(dpy,\"%s\");\n",tmp);
1588c9fbc29Smrg	    }
1598c9fbc29Smrg	}
1604e411241Smrg	free(prefix);
1614e411241Smrg	prefix = NULL;
1628c9fbc29Smrg    }
1638c9fbc29Smrg    fprintf(file,"}\n");
1648c9fbc29Smrg    return;
1658c9fbc29Smrg}
1668c9fbc29Smrg
1678c9fbc29Smrgstatic Bool
1688c9fbc29SmrgWriteCHdrKeyTypes(FILE *file,Display *dpy,XkbDescPtr xkb)
1698c9fbc29Smrg{
1708c9fbc29Smrgregister unsigned	i,n;
1718c9fbc29SmrgXkbClientMapPtr		map;
1728c9fbc29SmrgXkbKeyTypePtr		type;
1734e411241Smrgchar * 			prefix = NULL;
1748c9fbc29Smrg
1758c9fbc29Smrg    if ((!xkb)||(!xkb->map)||(!xkb->map->types)) {
1768c9fbc29Smrg	_XkbLibError(_XkbErrMissingTypes,"WriteCHdrKeyTypes",0);
1778c9fbc29Smrg	return False;
1788c9fbc29Smrg    }
1798c9fbc29Smrg    if (xkb->map->num_types<XkbNumRequiredTypes) {
1808c9fbc29Smrg	_XkbLibError(_XkbErrMissingReqTypes,"WriteCHdrKeyTypes",0);
1818c9fbc29Smrg	return 0;
1828c9fbc29Smrg    }
1838c9fbc29Smrg    map= xkb->map;
1848c9fbc29Smrg    if ((xkb->names!=NULL)&&(xkb->names->types!=None)) {
1858c9fbc29Smrg	fprintf(file,"/* types name is \"%s\" */\n",
1868c9fbc29Smrg				XkbAtomText(dpy,xkb->names->types,XkbCFile));
1878c9fbc29Smrg    }
1888c9fbc29Smrg    for (i=0,type=map->types;i<map->num_types;i++,type++) {
1894e411241Smrg	if (!(prefix = strdup(XkbAtomText(dpy,type->name,XkbCFile)))) {
1904e411241Smrg		_XkbLibError(_XkbErrBadAlloc,"WriteCHdrKeyTypes",0);
1914e411241Smrg		return False;
1924e411241Smrg	}
1938c9fbc29Smrg
1948c9fbc29Smrg	if (type->map_count>0) {
1958c9fbc29Smrg	    XkbKTMapEntryPtr	entry;
1968c9fbc29Smrg	    entry= type->map;
1978c9fbc29Smrg	    fprintf(file,"static XkbKTMapEntryRec map_%s[%d]= {\n",prefix,
1988c9fbc29Smrg							type->map_count);
1998c9fbc29Smrg	    for (n=0;n<(unsigned)type->map_count;n++,entry++) {
2008c9fbc29Smrg		if (n!=0)
2018c9fbc29Smrg		    fprintf(file,",\n");
2028c9fbc29Smrg		fprintf(file,"    { %d, %6d, { %15s, %15s, %15s } }",
2038c9fbc29Smrg			entry->active,
2048c9fbc29Smrg			entry->level,
2058c9fbc29Smrg			XkbModMaskText(entry->mods.mask,XkbCFile),
2068c9fbc29Smrg			XkbModMaskText(entry->mods.real_mods,XkbCFile),
2078c9fbc29Smrg			XkbVModMaskText(dpy,xkb,0,entry->mods.vmods,XkbCFile));
2088c9fbc29Smrg	    }
2098c9fbc29Smrg	    fprintf(file,"\n};\n");
2108c9fbc29Smrg
2118c9fbc29Smrg	    if (type->preserve)
2128c9fbc29Smrg		WriteTypePreserve(file,dpy,prefix,xkb,type);
2138c9fbc29Smrg	}
2148c9fbc29Smrg	if (type->level_names!=NULL) {
2158c9fbc29Smrg	    fprintf(file,"static Atom lnames_%s[%d];\n",prefix,
2168c9fbc29Smrg							 type->num_levels);
2178c9fbc29Smrg	}
2188c9fbc29Smrg	fprintf(file,"\n");
2194e411241Smrg	free(prefix);
2204e411241Smrg	prefix = NULL;
2218c9fbc29Smrg    }
2228c9fbc29Smrg    fprintf(file,"static XkbKeyTypeRec dflt_types[]= {\n");
2238c9fbc29Smrg    for (i=0,type=map->types;i<(unsigned)map->num_types;i++,type++) {
2244e411241Smrg	if (!(prefix = strdup(XkbAtomText(dpy,type->name,XkbCFile)))) {
2254e411241Smrg		_XkbLibError(_XkbErrBadAlloc,"WriteCHdrKeyTypes",0);
2264e411241Smrg		return False;
2274e411241Smrg	}
2288c9fbc29Smrg	if (i!=0)	fprintf(file,",\n");
2298c9fbc29Smrg	fprintf(file,"    {\n	{ %15s, %15s, %15s },\n",
2308c9fbc29Smrg			XkbModMaskText(type->mods.mask,XkbCFile),
2318c9fbc29Smrg			XkbModMaskText(type->mods.real_mods,XkbCFile),
2328c9fbc29Smrg			XkbVModMaskText(dpy,xkb,0,type->mods.vmods,XkbCFile));
2338c9fbc29Smrg	fprintf(file,"	%d,\n",type->num_levels);
2348c9fbc29Smrg	fprintf(file,"	%d,",type->map_count);
2358c9fbc29Smrg	if (type->map_count>0)
2368c9fbc29Smrg	     fprintf(file,"	map_%s,",prefix);
2378c9fbc29Smrg	else fprintf(file,"	NULL,");
2388c9fbc29Smrg	if (type->preserve)
2398c9fbc29Smrg	     fprintf(file,"	preserve_%s,\n",prefix);
2408c9fbc29Smrg	else fprintf(file,"	NULL,\n");
2418c9fbc29Smrg	if (type->level_names!=NULL)
2428c9fbc29Smrg	     fprintf(file,"	None,	lnames_%s\n    }",prefix);
2438c9fbc29Smrg	else fprintf(file,"	None,	NULL\n    }");
2444e411241Smrg	free(prefix);
2454e411241Smrg	prefix = NULL;
2468c9fbc29Smrg    }
2478c9fbc29Smrg    fprintf(file,"\n};\n");
2488c9fbc29Smrg    fprintf(file,"#define num_dflt_types (sizeof(dflt_types)/sizeof(XkbKeyTypeRec))\n");
2498c9fbc29Smrg    WriteTypeInitFunc(file,dpy,xkb);
2508c9fbc29Smrg    return True;
2518c9fbc29Smrg}
2528c9fbc29Smrg
2538c9fbc29Smrgstatic Bool
2548c9fbc29SmrgWriteCHdrCompatMap(FILE *file,Display *dpy,XkbDescPtr xkb)
2558c9fbc29Smrg{
2568c9fbc29Smrgregister unsigned	i;
2578c9fbc29SmrgXkbCompatMapPtr		compat;
2588c9fbc29SmrgXkbSymInterpretPtr	interp;
2598c9fbc29Smrg
2608c9fbc29Smrg    if ((!xkb)||(!xkb->compat)||(!xkb->compat->sym_interpret)) {
2618c9fbc29Smrg	_XkbLibError(_XkbErrMissingSymInterps,"WriteCHdrInterp",0);
2628c9fbc29Smrg	return False;
2638c9fbc29Smrg    }
2648c9fbc29Smrg    compat= xkb->compat;
2658c9fbc29Smrg    if ((xkb->names!=NULL)&&(xkb->names->compat!=None)) {
2668c9fbc29Smrg	fprintf(file,"/* compat name is \"%s\" */\n",
2678c9fbc29Smrg				XkbAtomText(dpy,xkb->names->compat,XkbCFile));
2688c9fbc29Smrg    }
2698c9fbc29Smrg    fprintf(file,"static XkbSymInterpretRec dfltSI[%d]= {\n",
2708c9fbc29Smrg						compat->num_si);
2718c9fbc29Smrg    interp= compat->sym_interpret;
2728c9fbc29Smrg    for (i=0;i<compat->num_si;i++,interp++) {
2738c9fbc29Smrg	XkbAction *act;
2748c9fbc29Smrg	act= (XkbAction *)&interp->act;
2758c9fbc29Smrg	if (i!=0)	fprintf(file,",\n");
2768c9fbc29Smrg	fprintf(file,"    {    %s, ",XkbKeysymText(interp->sym,XkbCFile));
2778c9fbc29Smrg	fprintf(file,"0x%04x,\n",interp->flags);
2788c9fbc29Smrg	fprintf(file,"         %s, ",XkbSIMatchText(interp->match,XkbCFile));
2798c9fbc29Smrg	fprintf(file,"%s,\n",XkbModMaskText(interp->mods,XkbCFile));
2808c9fbc29Smrg	fprintf(file,"         %d,\n",interp->virtual_mod);
2818c9fbc29Smrg	fprintf(file,"       %s }",XkbActionText(dpy,xkb,act,XkbCFile));
2828c9fbc29Smrg    }
2838c9fbc29Smrg    fprintf(file,"\n};\n");
2848c9fbc29Smrg    fprintf(file,
2858c9fbc29Smrg	   "#define num_dfltSI (sizeof(dfltSI)/sizeof(XkbSymInterpretRec))\n");
2868c9fbc29Smrg    fprintf(file,"\nstatic XkbCompatMapRec compatMap= {\n");
2878c9fbc29Smrg    fprintf(file,"    dfltSI,\n");
2888c9fbc29Smrg    fprintf(file,"    {   /* group compatibility */\n        ");
2898c9fbc29Smrg    for (i=0;i<XkbNumKbdGroups;i++) {
2908c9fbc29Smrg	XkbModsPtr gc;
2918c9fbc29Smrg	gc= &xkb->compat->groups[i];
2928c9fbc29Smrg	fprintf(file,"%s{ %12s, %12s, %12s }",
2938c9fbc29Smrg			((i==0)?"":",\n        "),
2948c9fbc29Smrg			XkbModMaskText(gc->mask,XkbCFile),
2958c9fbc29Smrg			XkbModMaskText(gc->real_mods,XkbCFile),
2968c9fbc29Smrg			XkbVModMaskText(xkb->dpy,xkb,0,gc->vmods,XkbCFile));
2978c9fbc29Smrg    }
2988c9fbc29Smrg    fprintf(file,"\n    },\n");
2998c9fbc29Smrg    fprintf(file,"    num_dfltSI, num_dfltSI\n");
3008c9fbc29Smrg    fprintf(file,"};\n\n");
3018c9fbc29Smrg    return True;
3028c9fbc29Smrg}
3038c9fbc29Smrg
3048c9fbc29Smrgstatic Bool
3058c9fbc29SmrgWriteCHdrSymbols(FILE *file,XkbDescPtr xkb)
3068c9fbc29Smrg{
3078c9fbc29Smrgregister unsigned i;
3088c9fbc29Smrg
3098c9fbc29Smrg    if ((!xkb)||(!xkb->map)||(!xkb->map->syms)||(!xkb->map->key_sym_map)) {
3108c9fbc29Smrg	_XkbLibError(_XkbErrMissingSymbols,"WriteCHdrSymbols",0);
3118c9fbc29Smrg	return False;
3128c9fbc29Smrg    }
3138c9fbc29Smrg    fprintf(file,"#define NUM_SYMBOLS	%d\n",xkb->map->num_syms);
3148c9fbc29Smrg    if (xkb->map->num_syms>0) {
3158c9fbc29Smrg	register KeySym *sym;
3168c9fbc29Smrg	sym= xkb->map->syms;
3178c9fbc29Smrg	fprintf(file,"static KeySym	symCache[NUM_SYMBOLS]= {\n");
3188c9fbc29Smrg	for (i=0;i<xkb->map->num_syms;i++,sym++) {
3198c9fbc29Smrg	    if (i==0)		fprintf(file,"    ");
3208c9fbc29Smrg	    else if (i%4==0)	fprintf(file,",\n    ");
3218c9fbc29Smrg	    else		fprintf(file,", ");
3228c9fbc29Smrg	    fprintf(file,"%15s",XkbKeysymText(*sym,XkbCFile));
3238c9fbc29Smrg	}
3248c9fbc29Smrg	fprintf(file,"\n};\n");
3258c9fbc29Smrg    }
3268c9fbc29Smrg    if (xkb->max_key_code>0) {
3278c9fbc29Smrg	register XkbSymMapPtr	map;
3288c9fbc29Smrg	map= xkb->map->key_sym_map;
3298c9fbc29Smrg	fprintf(file,"static XkbSymMapRec	symMap[NUM_KEYS]= {\n");
3308c9fbc29Smrg	for (i=0;i<=xkb->max_key_code;i++,map++) {
3318c9fbc29Smrg	    if (i==0)		fprintf(file,"    ");
3328c9fbc29Smrg	    else if ((i&3)==0)	fprintf(file,",\n    ");
3338c9fbc29Smrg	    else			fprintf(file,", ");
3348c9fbc29Smrg	    fprintf(file, "{ %2d, 0x%x, %3d }",
3358c9fbc29Smrg		    map->kt_index[0], map->group_info, map->offset);
3368c9fbc29Smrg	}
3378c9fbc29Smrg	fprintf(file,"\n};\n");
3388c9fbc29Smrg    }
3398c9fbc29Smrg    return True;
3408c9fbc29Smrg}
3418c9fbc29Smrg
3428c9fbc29Smrgstatic Bool
3438c9fbc29SmrgWriteCHdrClientMap(FILE *file,Display *dpy,XkbDescPtr xkb)
3448c9fbc29Smrg{
3458c9fbc29Smrg    if ((!xkb)||(!xkb->map)||(!xkb->map->syms)||(!xkb->map->key_sym_map)) {
3468c9fbc29Smrg	_XkbLibError(_XkbErrMissingSymbols,"WriteCHdrClientMap",0);
3478c9fbc29Smrg	return False;
3488c9fbc29Smrg    }
3498c9fbc29Smrg    if (!WriteCHdrKeyTypes(file,dpy,xkb))
3508c9fbc29Smrg	return False;
3518c9fbc29Smrg    if (!WriteCHdrSymbols(file,xkb))
3528c9fbc29Smrg	return False;
3538c9fbc29Smrg    fprintf(file,"static XkbClientMapRec clientMap= {\n");
3548c9fbc29Smrg    fprintf(file,"    NUM_TYPES,   NUM_TYPES,   types, \n");
3558c9fbc29Smrg    fprintf(file,"    NUM_SYMBOLS, NUM_SYMBOLS, symCache, symMap\n");
3568c9fbc29Smrg    fprintf(file,"};\n\n");
3578c9fbc29Smrg    return True;
3588c9fbc29Smrg}
3598c9fbc29Smrg
3608c9fbc29Smrgstatic Bool
3618c9fbc29SmrgWriteCHdrServerMap(FILE *file,Display *dpy,XkbDescPtr xkb)
3628c9fbc29Smrg{
3638c9fbc29Smrgregister unsigned i;
3648c9fbc29Smrg
3658c9fbc29Smrg    if ((!xkb)||(!xkb->map)||(!xkb->map->syms)||(!xkb->map->key_sym_map)) {
3668c9fbc29Smrg	_XkbLibError(_XkbErrMissingSymbols,"WriteCHdrServerMap",0);
3678c9fbc29Smrg	return False;
3688c9fbc29Smrg    }
3698c9fbc29Smrg    if (xkb->server->num_acts>0) {
3708c9fbc29Smrg	register XkbAnyAction *act;
3718c9fbc29Smrg	act= (XkbAnyAction *)xkb->server->acts;
3728c9fbc29Smrg	fprintf(file,"#define NUM_ACTIONS	%d\n",xkb->server->num_acts);
3738c9fbc29Smrg	fprintf(file,"static XkbAnyAction 	actionCache[NUM_ACTIONS]= {\n");
3748c9fbc29Smrg	for (i=0;i<xkb->server->num_acts;i++,act++) {
3758c9fbc29Smrg	    if (i==0)	fprintf(file,"    ");
3768c9fbc29Smrg	    else	fprintf(file,",\n    ");
3778c9fbc29Smrg	    fprintf(file,"%s",XkbActionText(dpy,xkb,(XkbAction *)act,XkbCFile));
3788c9fbc29Smrg	}
3798c9fbc29Smrg	fprintf(file,"\n};\n");
3808c9fbc29Smrg    }
3818c9fbc29Smrg    fprintf(file,"static unsigned short	keyActions[NUM_KEYS]= {\n");
3828c9fbc29Smrg    for (i=0;i<=xkb->max_key_code;i++) {
3838c9fbc29Smrg	if (i==0)		fprintf(file,"    ");
3848c9fbc29Smrg	else if ((i&0xf)==0)	fprintf(file,",\n    ");
3858c9fbc29Smrg	else			fprintf(file,", ");
3868c9fbc29Smrg	fprintf(file,"%2d",xkb->server->key_acts[i]);
3878c9fbc29Smrg    }
3888c9fbc29Smrg    fprintf(file,"\n};\n");
3898c9fbc29Smrg    fprintf(file,"static XkbBehavior behaviors[NUM_KEYS]= {\n");
3908c9fbc29Smrg    for (i=0;i<=xkb->max_key_code;i++) {
3918c9fbc29Smrg	if (i==0)		fprintf(file,"    ");
3928c9fbc29Smrg	else if ((i&0x3)==0)	fprintf(file,",\n    ");
3938c9fbc29Smrg	else			fprintf(file,", ");
3948c9fbc29Smrg	if (xkb->server->behaviors) {
3958c9fbc29Smrg	     fprintf(file,"%s",
3968c9fbc29Smrg		XkbBehaviorText(xkb,&xkb->server->behaviors[i],XkbCFile));
3978c9fbc29Smrg	}
3988c9fbc29Smrg	else fprintf(file,"{    0,    0 }");
3998c9fbc29Smrg    }
4008c9fbc29Smrg    fprintf(file,"\n};\n");
4018c9fbc29Smrg    fprintf(file,"static unsigned char explicit_parts[NUM_KEYS]= {\n");
4028c9fbc29Smrg    for (i=0;i<=xkb->max_key_code;i++) {
4038c9fbc29Smrg	if (i==0)		fprintf(file,"    ");
4048c9fbc29Smrg	else if ((i&0x7)==0)	fprintf(file,",\n    ");
4058c9fbc29Smrg	else			fprintf(file,", ");
4068c9fbc29Smrg	if ((xkb->server->explicit==NULL)||(xkb->server->explicit[i]==0))
4078c9fbc29Smrg	     fprintf(file,"   0");
4088c9fbc29Smrg	else fprintf(file,"0x%02x",xkb->server->explicit[i]);
4098c9fbc29Smrg    }
4108c9fbc29Smrg    fprintf(file,"\n};\n");
4118c9fbc29Smrg    fprintf(file,"static unsigned short vmodmap[NUM_KEYS]= {\n");
4128c9fbc29Smrg    for (i=0;i<xkb->max_key_code;i++) {
4138c9fbc29Smrg	if (i==0)		fprintf(file,"    ");
4148c9fbc29Smrg	else if ((i&0x7)==0)	fprintf(file,",\n    ");
4158c9fbc29Smrg	else			fprintf(file,", ");
4168c9fbc29Smrg	if ((xkb->server->vmodmap==NULL)||(xkb->server->vmodmap[i]==0))
4178c9fbc29Smrg	     fprintf(file,"     0");
4188c9fbc29Smrg	else fprintf(file,"0x%04x",xkb->server->vmodmap[i]);
4198c9fbc29Smrg    }
4208c9fbc29Smrg    fprintf(file,"};\n");
4218c9fbc29Smrg    fprintf(file,"static XkbServerMapRec serverMap= {\n");
4228c9fbc29Smrg    fprintf(file,"    %d, %d, (XkbAction *)actionCache,\n",
4238c9fbc29Smrg				xkb->server->num_acts,xkb->server->num_acts);
4248c9fbc29Smrg    fprintf(file,"    behaviors, keyActions, explicit_parts,\n");
4258c9fbc29Smrg    for (i=0;i<XkbNumVirtualMods;i++) {
4268c9fbc29Smrg	if (i==0)	fprintf(file,"    { ");
4278c9fbc29Smrg	else if (i==8)	fprintf(file,",\n      ");
4288c9fbc29Smrg	else		fprintf(file,", ");
4298c9fbc29Smrg	fprintf(file,"%3d",xkb->server->vmods[i]);
4308c9fbc29Smrg    }
4318c9fbc29Smrg    fprintf(file," },\n");
4328c9fbc29Smrg    fprintf(file,"    vmodmap\n");
4338c9fbc29Smrg    fprintf(file,"};\n\n");
4348c9fbc29Smrg    return True;
4358c9fbc29Smrg}
4368c9fbc29Smrg
4378c9fbc29Smrgstatic Bool
4388c9fbc29SmrgWriteCHdrIndicators(FILE *file,Display *dpy,XkbDescPtr xkb)
4398c9fbc29Smrg{
4408c9fbc29Smrgregister int 		i,nNames;
4418c9fbc29SmrgXkbIndicatorMapPtr	imap;
4428c9fbc29Smrg
4438c9fbc29Smrg    if (xkb->indicators==NULL)
4448c9fbc29Smrg	return True;
4458c9fbc29Smrg    fprintf(file, "static XkbIndicatorRec indicators= {\n");
4468c9fbc29Smrg    fprintf(file, "    0x%lx,\n    {\n",
4478c9fbc29Smrg	    (long)xkb->indicators->phys_indicators);
4488c9fbc29Smrg    for (imap=xkb->indicators->maps,i=nNames=0;i<XkbNumIndicators;i++,imap++) {
4498c9fbc29Smrg	fprintf(file,"%s        { 0x%02x, %s, 0x%02x, %s, { %s, ",
4508c9fbc29Smrg			(i!=0?",\n":""),
4518c9fbc29Smrg			imap->flags,
4528c9fbc29Smrg			XkbIMWhichStateMaskText(imap->which_groups,XkbCFile),
4538c9fbc29Smrg			imap->groups,
4548c9fbc29Smrg			XkbIMWhichStateMaskText(imap->which_mods,XkbCFile),
4558c9fbc29Smrg			XkbModMaskText(imap->mods.mask,XkbCFile));
4568c9fbc29Smrg	fprintf(file," %s, %s }, %s }",
4578c9fbc29Smrg			XkbModMaskText(imap->mods.real_mods,XkbCFile),
4588c9fbc29Smrg			XkbVModMaskText(dpy,xkb,0,imap->mods.vmods,XkbCFile),
4598c9fbc29Smrg			XkbControlsMaskText(imap->ctrls,XkbCFile));
4608c9fbc29Smrg	if (xkb->names && (xkb->names->indicators[i]!=None))
4618c9fbc29Smrg	    nNames++;
4628c9fbc29Smrg    }
4638c9fbc29Smrg    fprintf(file,"\n    }\n};\n");
4648c9fbc29Smrg    if (nNames>0) {
4658c9fbc29Smrg	fprintf(file,"static void\n");
4668c9fbc29Smrg	fprintf(file,"initIndicatorNames(DPYTYPE dpy,XkbDescPtr xkb)\n");
4678c9fbc29Smrg	fprintf(file,"{\n");
4688c9fbc29Smrg	for (i=0;i<XkbNumIndicators;i++) {
4698c9fbc29Smrg	    Atom name;
4708c9fbc29Smrg	    if (xkb->names->indicators[i]==None)
4718c9fbc29Smrg		continue;
4728c9fbc29Smrg	    name= xkb->names->indicators[i];
4738c9fbc29Smrg	    fprintf(file,"    xkb->names->indicators[%2d]=	",i);
4748c9fbc29Smrg	    fprintf(file,"GET_ATOM(dpy,\"%s\");\n",
4758c9fbc29Smrg						XkbAtomText(dpy,name,XkbCFile));
4768c9fbc29Smrg	}
4778c9fbc29Smrg	fprintf(file,"}\n");
4788c9fbc29Smrg    }
4798c9fbc29Smrg    return True;
4808c9fbc29Smrg}
4818c9fbc29Smrg
4828c9fbc29Smrgstatic Bool
4838c9fbc29SmrgWriteCHdrGeomProps(FILE *file,XkbDescPtr xkb,XkbGeometryPtr geom)
4848c9fbc29Smrg{
4858c9fbc29Smrg    if (geom->num_properties>0) {
4868c9fbc29Smrg	register int i;
4878c9fbc29Smrg	fprintf(file,"\nstatic XkbPropertyRec g_props[%d]= {\n",
4888c9fbc29Smrg							geom->num_properties);
4898c9fbc29Smrg	for (i=0;i<geom->num_properties;i++) {
4908c9fbc29Smrg	    fprintf(file,"%s	{	\"%s\", \"%s\"	}",(i==0?"":",\n"),
4918c9fbc29Smrg			XkbStringText(geom->properties[i].name,XkbCFile),
4928c9fbc29Smrg			XkbStringText(geom->properties[i].value,XkbCFile));
4938c9fbc29Smrg	}
4948c9fbc29Smrg	fprintf(file,"\n};\n");
4958c9fbc29Smrg    }
4968c9fbc29Smrg    return True;
4978c9fbc29Smrg}
4988c9fbc29Smrg
4998c9fbc29Smrgstatic Bool
5008c9fbc29SmrgWriteCHdrGeomColors(FILE *file,XkbDescPtr xkb,XkbGeometryPtr geom)
5018c9fbc29Smrg{
5028c9fbc29Smrg    if (geom->num_colors>0) {
5038c9fbc29Smrg	register int i;
5048c9fbc29Smrg	fprintf(file,"\nstatic XkbColorRec g_colors[%d]= {\n",geom->num_colors);
5058c9fbc29Smrg	for (i=0;i<geom->num_colors;i++) {
5068c9fbc29Smrg	    fprintf(file,"%s	{	%3d, \"%s\"	}",(i==0?"":",\n"),
5078c9fbc29Smrg			geom->colors[i].pixel,
5088c9fbc29Smrg			XkbStringText(geom->colors[i].spec,XkbCFile));
5098c9fbc29Smrg	}
5108c9fbc29Smrg	fprintf(file,"\n};\n");
5118c9fbc29Smrg    }
5128c9fbc29Smrg    return True;
5138c9fbc29Smrg}
5148c9fbc29Smrg
5158c9fbc29Smrgstatic Bool
5168c9fbc29SmrgWriteCHdrGeomOutlines(FILE *file,int nOL,XkbOutlinePtr ol,int shapeNdx)
5178c9fbc29Smrg{
5188c9fbc29Smrgregister int o,p;
5198c9fbc29Smrg
5208c9fbc29Smrg
5218c9fbc29Smrg    for (o=0;o<nOL;o++) {
5228c9fbc29Smrg	fprintf(file,"\nstatic XkbPointRec pts_sh%02do%02d[]= {\n",shapeNdx,o);
5238c9fbc29Smrg	for (p=0;p<ol[o].num_points;p++) {
5248c9fbc29Smrg	    if (p==0)			fprintf(file,"	");
5258c9fbc29Smrg	    else if ((p&0x3)==0)	fprintf(file,",\n	");
5268c9fbc29Smrg	    else 			fprintf(file,", ");
5278c9fbc29Smrg	    fprintf(file,"{ %4d, %4d }",
5288c9fbc29Smrg				ol[o].points[p].x,ol[o].points[p].y);
5298c9fbc29Smrg	}
5308c9fbc29Smrg	fprintf(file,"\n};");
5318c9fbc29Smrg    }
5328c9fbc29Smrg    fprintf(file,"\n\nstatic XkbOutlineRec ol_sh%02d[]= {\n",shapeNdx);
5338c9fbc29Smrg    for (o=0;o<nOL;o++) {
5348c9fbc29Smrg	fprintf(file,"%s	{ %d,	%d,	%d,	pts_sh%02do%02d	}",
5358c9fbc29Smrg					(o==0?"":",\n"),
5368c9fbc29Smrg					ol[o].num_points,ol[o].num_points,
5378c9fbc29Smrg					ol[o].corner_radius,shapeNdx,o);
5388c9fbc29Smrg    }
5398c9fbc29Smrg    fprintf(file,"\n};\n");
5408c9fbc29Smrg    return True;
5418c9fbc29Smrg}
5428c9fbc29Smrg
5438c9fbc29Smrgstatic Bool
5448c9fbc29SmrgWriteCHdrGeomShapes(FILE *file,XkbDescPtr xkb,XkbGeometryPtr geom)
5458c9fbc29Smrg{
5468c9fbc29Smrgregister int 		s;
5478c9fbc29Smrgregister XkbShapePtr	shape;
5488c9fbc29Smrg
5498c9fbc29Smrg    for (s=0,shape=geom->shapes;s<geom->num_shapes;s++,shape++) {
5508c9fbc29Smrg	WriteCHdrGeomOutlines(file,shape->num_outlines,shape->outlines,s);
5518c9fbc29Smrg    }
5528c9fbc29Smrg    fprintf(file,"\n\nstatic XkbShapeRec g_shapes[%d]= {\n",geom->num_shapes);
5538c9fbc29Smrg    for (s=0,shape=geom->shapes;s<geom->num_shapes;s++,shape++) {
5548c9fbc29Smrg	fprintf(file,"%s	{ None, %3d, %3d, ol_sh%02d, ",
5558c9fbc29Smrg					(s==0?"":",\n"),shape->num_outlines,
5568c9fbc29Smrg					shape->num_outlines,s);
5578c9fbc29Smrg	if (shape->approx) {
5588c9fbc29Smrg	    fprintf(file,"&ol_sh%02d[%2d],	",s,
5598c9fbc29Smrg					XkbOutlineIndex(shape,shape->approx));
5608c9fbc29Smrg	}
5618c9fbc29Smrg	else fprintf(file,"        NULL,	");
5628c9fbc29Smrg	if (shape->primary) {
5638c9fbc29Smrg	    fprintf(file,"&ol_sh%02d[%2d],\n",s,
5648c9fbc29Smrg					XkbOutlineIndex(shape,shape->primary));
5658c9fbc29Smrg	}
5668c9fbc29Smrg	else fprintf(file,"        NULL,\n");
5678c9fbc29Smrg	fprintf(file,"					{ %4d, %4d, %4d, %4d } }",
5688c9fbc29Smrg					shape->bounds.x1,shape->bounds.y1,
5698c9fbc29Smrg					shape->bounds.x2,shape->bounds.y2);
5708c9fbc29Smrg    }
5718c9fbc29Smrg    fprintf(file,"\n};\n");
5728c9fbc29Smrg    return True;
5738c9fbc29Smrg}
5748c9fbc29Smrg
5758c9fbc29Smrgstatic Bool
5768c9fbc29SmrgWriteCHdrGeomDoodads(	FILE *		file,
5778c9fbc29Smrg			XkbDescPtr	xkb,
5788c9fbc29Smrg			XkbGeometryPtr	geom,
5798c9fbc29Smrg			XkbSectionPtr	section,
5808c9fbc29Smrg			int		section_num)
5818c9fbc29Smrg{
5828c9fbc29Smrgint		nd,d;
5838c9fbc29SmrgXkbDoodadPtr	doodad;
5848c9fbc29SmrgDisplay *	dpy;
5858c9fbc29Smrg
5868c9fbc29Smrg    dpy= xkb->dpy;
5878c9fbc29Smrg    if (section==NULL) {
5888c9fbc29Smrg	if (geom->num_doodads>0) {
5898c9fbc29Smrg	    fprintf(file,"static XkbDoodadRec g_doodads[%d];\n",
5908c9fbc29Smrg							geom->num_doodads);
5918c9fbc29Smrg	}
5928c9fbc29Smrg	fprintf(file,"static void\n");
5938c9fbc29Smrg	fprintf(file,"_InitGeomDoodads(DPYTYPE dpy,XkbGeometryPtr geom)\n");
5948c9fbc29Smrg	fprintf(file,"{\n");
5958c9fbc29Smrg	fprintf(file,"register XkbDoodadPtr doodads;\n\n");
5968c9fbc29Smrg	fprintf(file,"    doodads= geom->doodads;\n");
5978c9fbc29Smrg	nd= geom->num_doodads;
5988c9fbc29Smrg	doodad= geom->doodads;
5998c9fbc29Smrg    }
6008c9fbc29Smrg    else {
6018c9fbc29Smrg	if (section->num_doodads>0) {
6028c9fbc29Smrg	    fprintf(file,"static XkbDoodadRec doodads_s%02d[%d];\n",
6038c9fbc29Smrg					section_num,section->num_doodads);
6048c9fbc29Smrg	}
6058c9fbc29Smrg	fprintf(file,"static void\n");
6068c9fbc29Smrg	fprintf(file,"_InitS%02dDoodads(",section_num);
6078c9fbc29Smrg	fprintf(file,"    DPYTYPE		dpy,\n");
6088c9fbc29Smrg	fprintf(file,"    XkbGeometryPtr 	geom,\n");
6098c9fbc29Smrg	fprintf(file,"    XkbSectionPtr 	section)\n");
6108c9fbc29Smrg	fprintf(file,"{\n");
6118c9fbc29Smrg	fprintf(file,"register XkbDoodadPtr doodads;\n\n");
6128c9fbc29Smrg	fprintf(file,"    doodads= section->doodads;\n");
6138c9fbc29Smrg	nd= geom->num_doodads;
6148c9fbc29Smrg	doodad= geom->doodads;
6158c9fbc29Smrg    }
6168c9fbc29Smrg    for (d=0;d<nd;d++,doodad++) {
6178c9fbc29Smrg	if (d!=0)	fprintf(file,"\n");
6188c9fbc29Smrg	fprintf(file,"    doodads[%d].any.name= GET_ATOM(dpy,\"%s\");\n",d,
6198c9fbc29Smrg			XkbAtomText(dpy,doodad->any.name,XkbCFile));
6208c9fbc29Smrg	fprintf(file,"    doodads[%d].any.type= %s;\n",d,
6218c9fbc29Smrg			XkbDoodadTypeText(doodad->any.type,XkbCFile));
6228c9fbc29Smrg	fprintf(file,"    doodads[%d].any.priority= %d;\n",d,
6238c9fbc29Smrg			doodad->any.priority);
6248c9fbc29Smrg	fprintf(file,"    doodads[%d].any.top= %d;\n",d,doodad->any.top);
6258c9fbc29Smrg	fprintf(file,"    doodads[%d].any.left= %d;\n",d,doodad->any.left);
6268c9fbc29Smrg	fprintf(file,"    doodads[%d].any.angle= %d;\n",d,doodad->any.angle);
6278c9fbc29Smrg	switch (doodad->any.type) {
6288c9fbc29Smrg	    case XkbOutlineDoodad:
6298c9fbc29Smrg	    case XkbSolidDoodad:
6308c9fbc29Smrg		fprintf(file,"    doodads[%d].shape.color_ndx= %d;\n",d,
6318c9fbc29Smrg					doodad->shape.color_ndx);
6328c9fbc29Smrg		fprintf(file,"    doodads[%d].shape.shape_ndx= %d;\n",d,
6338c9fbc29Smrg					doodad->shape.shape_ndx);
6348c9fbc29Smrg		break;
6358c9fbc29Smrg	    case XkbTextDoodad:
6368c9fbc29Smrg		fprintf(file,"    doodads[%d].text.width= %d;\n",d,
6378c9fbc29Smrg					doodad->text.width);
6388c9fbc29Smrg		fprintf(file,"    doodads[%d].text.height= %d;\n",d,
6398c9fbc29Smrg					doodad->text.height);
6408c9fbc29Smrg		fprintf(file,"    doodads[%d].text.color_ndx= %d;\n",d,
6418c9fbc29Smrg					doodad->text.color_ndx);
6428c9fbc29Smrg		fprintf(file,"    doodads[%d].text.text= \"%s\";\n",d,
6438c9fbc29Smrg				XkbStringText(doodad->text.text,XkbCFile));
6448c9fbc29Smrg		fprintf(file,"    doodads[%d].text.font= \"%s\";\n",d,
6458c9fbc29Smrg				XkbStringText(doodad->text.font,XkbCFile));
6468c9fbc29Smrg		break;
6478c9fbc29Smrg	    case XkbIndicatorDoodad:
6488c9fbc29Smrg		fprintf(file,"    doodads[%d].indicator.shape_ndx= %d;\n",d,
6498c9fbc29Smrg					doodad->indicator.shape_ndx);
6508c9fbc29Smrg		fprintf(file,"    doodads[%d].indicator.on_color_ndx= %d;\n",d,
6518c9fbc29Smrg					doodad->indicator.on_color_ndx);
6528c9fbc29Smrg		fprintf(file,"    doodads[%d].indicator.off_color_ndx= %d;\n",d,
6538c9fbc29Smrg					doodad->indicator.off_color_ndx);
6548c9fbc29Smrg		break;
6558c9fbc29Smrg	    case XkbLogoDoodad:
6568c9fbc29Smrg		fprintf(file,"    doodads[%d].logo.color_ndx= %d;\n",d,
6578c9fbc29Smrg					doodad->logo.color_ndx);
6588c9fbc29Smrg		fprintf(file,"    doodads[%d].logo.shape_ndx= %d;\n",d,
6598c9fbc29Smrg					doodad->logo.shape_ndx);
6608c9fbc29Smrg		fprintf(file,"    doodads[%d].logo.logo_name= \"%s\";\n",d,
6618c9fbc29Smrg				XkbStringText(doodad->logo.logo_name,XkbCFile));
6628c9fbc29Smrg		break;
6638c9fbc29Smrg	}
6648c9fbc29Smrg    }
6658c9fbc29Smrg    fprintf(file,"}\n");
6668c9fbc29Smrg    return True;
6678c9fbc29Smrg}
6688c9fbc29Smrg
6698c9fbc29Smrgstatic Bool
6708c9fbc29SmrgWriteCHdrGeomOverlays(	FILE *		file,
6718c9fbc29Smrg			XkbDescPtr	xkb,
6728c9fbc29Smrg			XkbSectionPtr	section,
6738c9fbc29Smrg			int		section_num)
6748c9fbc29Smrg{
6758c9fbc29Smrgregister int		o,r,k;
6768c9fbc29SmrgXkbOverlayPtr		ol;
6778c9fbc29SmrgXkbOverlayRowPtr	row;
6788c9fbc29SmrgXkbOverlayKeyPtr	key;
6798c9fbc29Smrg
6808c9fbc29Smrg    if (section->num_overlays<1)
6818c9fbc29Smrg	return True;
6828c9fbc29Smrg    for (o=0,ol=section->overlays;o<section->num_overlays;o++,ol++) {
6838c9fbc29Smrg	for (r=0,row=ol->rows;r<ol->num_rows;r++,row++) {
6848c9fbc29Smrg	    fprintf(file,"static XkbOverlayKeyRec olkeys_s%02dr%02d[%d]= {\n",
6858c9fbc29Smrg						section_num,r,row->num_keys);
6868c9fbc29Smrg	    for (k=0,key=row->keys;k<row->num_keys;k++,key++) {
6878c9fbc29Smrg		fprintf(file,"%s	{ {\"%s\"},	{\"%s\"}	}",
6888c9fbc29Smrg				(k==0?"":",\n"),
6898c9fbc29Smrg				XkbKeyNameText(key->over.name,XkbCFile),
6908c9fbc29Smrg				XkbKeyNameText(key->under.name,XkbCFile));
6918c9fbc29Smrg	    }
6928c9fbc29Smrg	    fprintf(file,"\n};\n");
6938c9fbc29Smrg	}
6948c9fbc29Smrg	fprintf(file,"static XkbOverlayRowRec olrows_s%02d[%d]= {\n",
6958c9fbc29Smrg						section_num,section->num_rows);
6968c9fbc29Smrg	for (r=0,row=ol->rows;r<ol->num_rows;r++,row++) {
6978c9fbc29Smrg	    fprintf(file,"%s	{ %4d, %4d, %4d, olkeys_s%02dr%02d }",
6988c9fbc29Smrg				(r==0?"":",\n"),
6998c9fbc29Smrg				row->row_under,row->num_keys,row->num_keys,
7008c9fbc29Smrg				section_num,r);
7018c9fbc29Smrg	}
7028c9fbc29Smrg	fprintf(file,"\n};\n");
7038c9fbc29Smrg    }
7048c9fbc29Smrg    fprintf(file,"static XkbOverlayRec overlays_s%02d[%d]= {\n",section_num,
7058c9fbc29Smrg							section->num_overlays);
7068c9fbc29Smrg    for (o=0,ol=section->overlays;o<section->num_overlays;o++,ol++) {
7078c9fbc29Smrg	fprintf(file,"%s	{\n",(o==0?"":",\n"));
7088c9fbc29Smrg	fprintf(file,"	    None, 	/* name */\n");
7098c9fbc29Smrg	fprintf(file,"	    NULL,	/* section_under */\n");
7108c9fbc29Smrg	fprintf(file,"	    %4d,	/* num_rows */\n",ol->num_rows);
7118c9fbc29Smrg	fprintf(file,"	    %4d,	/* sz_rows */\n",ol->num_rows);
7128c9fbc29Smrg	fprintf(file,"	    olrows_s%02d,\n",section_num);
7138c9fbc29Smrg	fprintf(file,"	    NULL	/* bounds */\n");
7148c9fbc29Smrg	fprintf(file,"	}");
7158c9fbc29Smrg    }
7168c9fbc29Smrg    fprintf(file,"\n};\n");
7178c9fbc29Smrg    fprintf(file,"static void\n");
7188c9fbc29Smrg    fprintf(file,"_InitS%02dOverlay(",section_num);
7198c9fbc29Smrg    fprintf(file,"    DPYTYPE		dpy,\n");
7208c9fbc29Smrg    fprintf(file,"    XkbGeometryPtr 	geom,\n");
7218c9fbc29Smrg    fprintf(file,"    XkbSectionPtr 	section)\n");
7228c9fbc29Smrg    fprintf(file,"{\n");
7238c9fbc29Smrg    fprintf(file,"XkbOverlayPtr	ol;\n\n");
7248c9fbc29Smrg    fprintf(file,"    ol= section->overlays;\n");
7258c9fbc29Smrg    for (o=0,ol=section->overlays;o<section->num_overlays;o++,ol++) {
7268c9fbc29Smrg	fprintf(file,"    ol[%2d].name= GET_ATOM(dpy,\"%s\");\n",o,
7278c9fbc29Smrg				XkbAtomText(xkb->dpy,ol->name,XkbCFile));
7288c9fbc29Smrg	fprintf(file,"    ol[%2d].section_under= section;\n",o);
7298c9fbc29Smrg    }
7308c9fbc29Smrg    fprintf(file,"}\n");
7318c9fbc29Smrg    return True;
7328c9fbc29Smrg}
7338c9fbc29Smrg
7348c9fbc29Smrgstatic Bool
7358c9fbc29SmrgWriteCHdrGeomRows(	FILE *		file,
7368c9fbc29Smrg			XkbDescPtr	xkb,
7378c9fbc29Smrg			XkbSectionPtr	section,
7388c9fbc29Smrg			int		section_num)
7398c9fbc29Smrg{
7408c9fbc29Smrgregister int 		k,r;
7418c9fbc29Smrgregister XkbRowPtr	row;
7428c9fbc29Smrgregister XkbKeyPtr	key;
7438c9fbc29Smrg
7448c9fbc29Smrg    for (r=0,row=section->rows;r<section->num_rows;r++,row++) {
7458c9fbc29Smrg	fprintf(file,"static XkbKeyRec keys_s%02dr%02d[]= {\n",section_num,r);
7468c9fbc29Smrg	for (k=0,key=row->keys;k<row->num_keys;k++,key++) {
7478c9fbc29Smrg	    fprintf(file,"%s	{ { \"%s\" },	%4d, %4d, %4d }",
7488c9fbc29Smrg				(k==0?"":",\n"),
7498c9fbc29Smrg				XkbKeyNameText(key->name.name,XkbCFile),
7508c9fbc29Smrg				key->gap,key->shape_ndx,key->color_ndx);
7518c9fbc29Smrg	}
7528c9fbc29Smrg	fprintf(file,"\n};\n");
7538c9fbc29Smrg    }
7548c9fbc29Smrg    fprintf(file,"static XkbRowRec rows_s%02d[]= {\n",section_num);
7558c9fbc29Smrg    for (r=0,row=section->rows;r<section->num_rows;r++,row++) {
7568c9fbc29Smrg	fprintf(file,"%s	{ %4d, %4d, %2d, %2d, %1d, keys_s%02dr%02d, ",
7578c9fbc29Smrg				(r==0?"":",\n"),
7588c9fbc29Smrg				row->top,row->left,row->num_keys,row->num_keys,
7598c9fbc29Smrg				(row->vertical!=0),
7608c9fbc29Smrg				section_num,r);
7618c9fbc29Smrg	fprintf(file," { %4d, %4d, %4d, %4d } }",
7628c9fbc29Smrg				row->bounds.x1,row->bounds.y1,
7638c9fbc29Smrg				row->bounds.x2,row->bounds.y2);
7648c9fbc29Smrg    }
7658c9fbc29Smrg    fprintf(file,"\n};\n");
7668c9fbc29Smrg    return True;
7678c9fbc29Smrg}
7688c9fbc29Smrg
7698c9fbc29Smrgstatic Bool
7708c9fbc29SmrgWriteCHdrGeomSections(FILE *file,XkbDescPtr xkb,XkbGeometryPtr geom)
7718c9fbc29Smrg{
7728c9fbc29Smrgregister int		s;
7738c9fbc29Smrgregister XkbSectionPtr	section;
7748c9fbc29Smrg
7758c9fbc29Smrg    for (s=0,section=geom->sections;s<geom->num_sections;s++,section++) {
7768c9fbc29Smrg	WriteCHdrGeomRows(file,xkb,section,s);
7778c9fbc29Smrg#ifdef NOTYET
7788c9fbc29Smrg	if (section->num_doodads>0)
7798c9fbc29Smrg	    WriteCHdrGeomDoodads(file,xkb,geom,section,s);
7808c9fbc29Smrg#endif
7818c9fbc29Smrg	if (section->num_overlays>0)
7828c9fbc29Smrg	    WriteCHdrGeomOverlays(file,xkb,section,s);
7838c9fbc29Smrg    }
7848c9fbc29Smrg    fprintf(file,"\nstatic XkbSectionRec g_sections[%d]= {\n",
7858c9fbc29Smrg							geom->num_sections);
7868c9fbc29Smrg    for (s=0,section=geom->sections;s<geom->num_sections;s++,section++) {
7878c9fbc29Smrg	if (s!=0) fprintf(file,",\n");
7888c9fbc29Smrg	fprintf(file,"	{\n	    None, /* name */\n");
7898c9fbc29Smrg	fprintf(file,"	    %4d, /* priority */\n",section->priority);
7908c9fbc29Smrg	fprintf(file,"	    %4d, /* top */\n",section->top);
7918c9fbc29Smrg	fprintf(file,"	    %4d, /* left */\n",section->left);
7928c9fbc29Smrg	fprintf(file,"	    %4d, /* width */\n",section->width);
7938c9fbc29Smrg	fprintf(file,"	    %4d, /* height */\n",section->height);
7948c9fbc29Smrg	fprintf(file,"	    %4d, /* angle */\n",section->angle);
7958c9fbc29Smrg	fprintf(file,"	    %4d, /* num_rows */\n",section->num_rows);
7968c9fbc29Smrg	fprintf(file,"	    %4d, /* num_doodads */\n",section->num_doodads);
7978c9fbc29Smrg	fprintf(file,"	    %4d, /* num_overlays */\n",section->num_overlays);
7988c9fbc29Smrg	fprintf(file,"	    %4d, /* sz_rows */\n",section->num_rows);
7998c9fbc29Smrg	fprintf(file,"	    %4d, /* sz_doodads */\n",section->num_doodads);
8008c9fbc29Smrg	fprintf(file,"	    %4d, /* sz_overlays */\n",section->num_overlays);
8018c9fbc29Smrg	if (section->num_rows>0)
8028c9fbc29Smrg	     fprintf(file,"	    rows_s%02d,\n",s);
8038c9fbc29Smrg	else fprintf(file,"	    NULL, /* rows */\n");
8048c9fbc29Smrg	if (section->num_doodads>0)
8058c9fbc29Smrg	     fprintf(file,"	    doodads_s%02d,\n",s);
8068c9fbc29Smrg	else fprintf(file,"	    NULL, /* doodads */\n");
8078c9fbc29Smrg	fprintf(file,"	    { %4d, %4d, %4d, %4d }, /* bounds */\n",
8088c9fbc29Smrg					section->bounds.x1,section->bounds.y1,
8098c9fbc29Smrg					section->bounds.x2,section->bounds.y2);
8108c9fbc29Smrg	if (section->num_overlays>0)
8118c9fbc29Smrg	     fprintf(file,"	    overlays_s%02d\n",s);
8128c9fbc29Smrg	else fprintf(file,"	    NULL /* overlays */\n");
8138c9fbc29Smrg	fprintf(file,"	}");
8148c9fbc29Smrg    }
8158c9fbc29Smrg    fprintf(file,"\n};\n");
8168c9fbc29Smrg    fprintf(file,"\nstatic Bool\n");
8178c9fbc29Smrg    fprintf(file,"_InitSections(DPYTYPE dpy,XkbGeometryPtr geom)\n");
8188c9fbc29Smrg    fprintf(file,"{\nXkbSectionPtr	sections;\n\n");
8198c9fbc29Smrg    fprintf(file,"    sections= geom->sections;\n");
8208c9fbc29Smrg    for (s=0,section=geom->sections;s<geom->num_sections;s++,section++) {
8218c9fbc29Smrg	if (section->num_doodads>0) {
8228c9fbc29Smrg	    fprintf(file,"    _InitS%02dDoodads(dpy,geom,&sections[%d]);\n",
8238c9fbc29Smrg									s,s);
8248c9fbc29Smrg	}
8258c9fbc29Smrg	if (section->num_overlays>0) {
8268c9fbc29Smrg	    fprintf(file,"    _InitS%02dOverlays(dpy,geom,&sections[%d]);\n",
8278c9fbc29Smrg									s,s);
8288c9fbc29Smrg	}
8298c9fbc29Smrg    }
8308c9fbc29Smrg    fprintf(file,"}\n");
8318c9fbc29Smrg    return True;
8328c9fbc29Smrg}
8338c9fbc29Smrg
8348c9fbc29Smrgstatic Bool
8358c9fbc29SmrgWriteCHdrGeomAliases(FILE *file,XkbDescPtr xkb,XkbGeometryPtr geom)
8368c9fbc29Smrg{
8378c9fbc29Smrg    if (geom->num_key_aliases>0) {
8388c9fbc29Smrg	register int i;
8398c9fbc29Smrg	fprintf(file,"\nstatic XkbKeyAliasRec g_aliases[%d]= {\n",
8408c9fbc29Smrg						geom->num_key_aliases);
8418c9fbc29Smrg	for (i=0;i<geom->num_key_aliases;i++) {
8428c9fbc29Smrg	    fprintf(file,"%s	{	\"%s\", \"%s\"	}",(i==0?"":",\n"),
8438c9fbc29Smrg			XkbKeyNameText(geom->key_aliases[i].real,XkbCFile),
8448c9fbc29Smrg			XkbKeyNameText(geom->key_aliases[i].alias,XkbCFile));
8458c9fbc29Smrg	}
8468c9fbc29Smrg	fprintf(file,"\n};\n");
8478c9fbc29Smrg    }
8488c9fbc29Smrg    return True;
8498c9fbc29Smrg}
8508c9fbc29Smrg
8518c9fbc29Smrgstatic Bool
8528c9fbc29SmrgWriteCHdrGeometry(FILE *file,XkbDescPtr xkb)
8538c9fbc29Smrg{
8548c9fbc29SmrgXkbGeometryPtr	geom;
8558c9fbc29Smrgregister int	i;
8568c9fbc29Smrg
8578c9fbc29Smrg    if ((!xkb)||(!xkb->geom)) {
8588c9fbc29Smrg	_XkbLibError(_XkbErrMissingGeometry,"WriteCHdrGeometry",0);
8598c9fbc29Smrg	return False;
8608c9fbc29Smrg    }
8618c9fbc29Smrg    geom= xkb->geom;
8628c9fbc29Smrg    WriteCHdrGeomProps(file,xkb,geom);
8638c9fbc29Smrg    WriteCHdrGeomColors(file,xkb,geom);
8648c9fbc29Smrg    WriteCHdrGeomShapes(file,xkb,geom);
8658c9fbc29Smrg    WriteCHdrGeomSections(file,xkb,geom);
8668c9fbc29Smrg    WriteCHdrGeomDoodads(file,xkb,geom,NULL,0);
8678c9fbc29Smrg    WriteCHdrGeomAliases(file,xkb,geom);
8688c9fbc29Smrg    fprintf(file,"\nstatic XkbGeometryRec	geom= {\n");
8698c9fbc29Smrg    fprintf(file,"	None,			/* name */\n");
8708c9fbc29Smrg    fprintf(file,"	%d, %d,		/* width, height */\n",geom->width_mm,
8718c9fbc29Smrg							geom->height_mm);
8728c9fbc29Smrg    if (geom->label_font) {
8738c9fbc29Smrg	 fprintf(file,"	\"%s\",/* label font */\n",
8748c9fbc29Smrg				XkbStringText(geom->label_font,XkbCFile));
8758c9fbc29Smrg    }
8768c9fbc29Smrg    else fprintf(file,"	NULL,		/* label font */\n");
8778c9fbc29Smrg    if (geom->label_color) {
8788c9fbc29Smrg	fprintf(file,"	&g_colors[%d],		/* label color */\n",
8798c9fbc29Smrg				XkbGeomColorIndex(geom,geom->label_color));
8808c9fbc29Smrg    }
8818c9fbc29Smrg    else fprintf(file,"	NULL,			/* label color */\n");
8828c9fbc29Smrg    if (geom->base_color) {
8838c9fbc29Smrg	fprintf(file,"	&g_colors[%d],		/* base color */\n",
8848c9fbc29Smrg				XkbGeomColorIndex(geom,geom->base_color));
8858c9fbc29Smrg    }
8868c9fbc29Smrg    else fprintf(file,"	NULL,			/* base color */\n");
8878c9fbc29Smrg    fprintf(file,"	%d,	%d,	%d,	/*  sz: props, colors, shapes */\n",
8888c9fbc29Smrg				geom->num_properties,geom->num_colors,
8898c9fbc29Smrg				geom->num_shapes);
8908c9fbc29Smrg    fprintf(file,"	%d,	%d,	%d,	/*  sz: sections, doodads, aliases */\n",
8918c9fbc29Smrg				geom->num_sections,geom->num_doodads,
8928c9fbc29Smrg				geom->num_key_aliases);
8938c9fbc29Smrg    fprintf(file,"	%d,	%d,	%d,	/* num: props, colors, shapes */\n",
8948c9fbc29Smrg				geom->num_properties,geom->num_colors,
8958c9fbc29Smrg				geom->num_shapes);
8968c9fbc29Smrg    fprintf(file,"	%d,	%d,	%d,	/* num: sections, doodads, aliases */\n",
8978c9fbc29Smrg				geom->num_sections,geom->num_doodads,
8988c9fbc29Smrg				geom->num_key_aliases);
8998c9fbc29Smrg    fprintf(file,"	%s,	%s,	%s,\n",
9008c9fbc29Smrg				(geom->num_properties>0?"g_props":"NULL"),
9018c9fbc29Smrg				(geom->num_colors>0?"g_colors":"NULL"),
9028c9fbc29Smrg				(geom->num_shapes>0?"g_shapes":"NULL"));
9038c9fbc29Smrg    fprintf(file,"	%s,	%s,	%s\n",
9048c9fbc29Smrg				(geom->num_sections>0?"g_sections":"NULL"),
9058c9fbc29Smrg				(geom->num_doodads>0?"g_doodads":"NULL"),
9068c9fbc29Smrg				(geom->num_key_aliases>0?"g_aliases":"NULL"));
9078c9fbc29Smrg    fprintf(file,"};\n\n");
9088c9fbc29Smrg    fprintf(file,"static Bool\n");
9098c9fbc29Smrg    fprintf(file,"_InitHdrGeom(DPYTYPE dpy,XkbGeometryPtr geom)\n");
9108c9fbc29Smrg    fprintf(file,"{\n");
9118c9fbc29Smrg    if (geom->name!=None) {
9128c9fbc29Smrg	fprintf(file,"    geom->name= GET_ATOM(dpy,\"%s\");\n",
9138c9fbc29Smrg				XkbAtomText(xkb->dpy,geom->name,XkbCFile));
9148c9fbc29Smrg    }
9158c9fbc29Smrg    for (i=0;i<geom->num_shapes;i++) {
9168c9fbc29Smrg	fprintf(file,"    geom->shapes[%2d].name= GET_ATOM(dpy,\"%s\");\n",i,
9178c9fbc29Smrg			XkbAtomText(xkb->dpy,geom->shapes[i].name,XkbCFile));
9188c9fbc29Smrg    }
9198c9fbc29Smrg    if (geom->num_doodads>0)
9208c9fbc29Smrg	fprintf(file,"    _InitGeomDoodads(dpy,geom);\n");
9218c9fbc29Smrg    fprintf(file,"    _InitSections(dpy,geom);\n");
9228c9fbc29Smrg    fprintf(file,"}\n\n");
9238c9fbc29Smrg    return True;
9248c9fbc29Smrg}
9258c9fbc29Smrg
9268c9fbc29Smrgstatic Bool
9278c9fbc29SmrgWriteCHdrGeomFile(FILE *file,XkbFileInfo *result)
9288c9fbc29Smrg{
9298c9fbc29SmrgBool		ok;
9308c9fbc29Smrg
9318c9fbc29Smrg    ok= WriteCHdrGeometry(file,result->xkb);
9328c9fbc29Smrg    return ok;
9338c9fbc29Smrg}
9348c9fbc29Smrg
9358c9fbc29Smrgstatic Bool
9368c9fbc29SmrgWriteCHdrLayout(FILE *file,XkbFileInfo *result)
9378c9fbc29Smrg{
9388c9fbc29SmrgBool		ok;
9398c9fbc29SmrgXkbDescPtr	xkb;
9408c9fbc29Smrg
9418c9fbc29Smrg    xkb= result->xkb;
9428c9fbc29Smrg    ok= WriteCHdrVMods(file,xkb->dpy,xkb);
9438c9fbc29Smrg    ok= WriteCHdrKeycodes(file,xkb)&&ok;
9448c9fbc29Smrg    ok= WriteCHdrSymbols(file,xkb)&&ok;
9458c9fbc29Smrg    ok= WriteCHdrGeometry(file,xkb)&&ok;
9468c9fbc29Smrg    return ok;
9478c9fbc29Smrg}
9488c9fbc29Smrg
9498c9fbc29Smrgstatic Bool
9508c9fbc29SmrgWriteCHdrSemantics(FILE *file,XkbFileInfo *result)
9518c9fbc29Smrg{
9528c9fbc29SmrgBool		ok;
9538c9fbc29SmrgXkbDescPtr	xkb;
9548c9fbc29Smrg
9558c9fbc29Smrg    xkb= result->xkb;
9568c9fbc29Smrg    ok= WriteCHdrVMods(file,xkb->dpy,xkb);
9578c9fbc29Smrg    ok= WriteCHdrKeyTypes(file,xkb->dpy,xkb)&&ok;
9588c9fbc29Smrg    ok= WriteCHdrCompatMap(file,xkb->dpy,xkb)&&ok;
9598c9fbc29Smrg    ok= WriteCHdrIndicators(file,xkb->dpy,xkb)&&ok;
9608c9fbc29Smrg    return ok;
9618c9fbc29Smrg}
9628c9fbc29Smrg
9638c9fbc29Smrgstatic Bool
9648c9fbc29SmrgWriteCHdrKeymap(FILE *file,XkbFileInfo *result)
9658c9fbc29Smrg{
9668c9fbc29SmrgBool		ok;
9678c9fbc29SmrgXkbDescPtr	xkb;
9688c9fbc29Smrg
9698c9fbc29Smrg    xkb= result->xkb;
9708c9fbc29Smrg    ok= WriteCHdrVMods(file,xkb->dpy,xkb);
9718c9fbc29Smrg    ok= ok&&WriteCHdrKeycodes(file,xkb);
9728c9fbc29Smrg    ok= ok&&WriteCHdrClientMap(file,xkb->dpy,xkb);
9738c9fbc29Smrg    ok= ok&&WriteCHdrServerMap(file,xkb->dpy,xkb);
9748c9fbc29Smrg    ok= ok&&WriteCHdrCompatMap(file,xkb->dpy,xkb);
9758c9fbc29Smrg    ok= WriteCHdrIndicators(file,xkb->dpy,xkb)&&ok;
9768c9fbc29Smrg    ok= ok&&WriteCHdrGeometry(file,xkb);
9778c9fbc29Smrg    return ok;
9788c9fbc29Smrg}
9798c9fbc29Smrg
9808c9fbc29SmrgBool
9818c9fbc29SmrgXkbWriteCFile(FILE *out,char *name,XkbFileInfo *result)
9828c9fbc29Smrg{
9838c9fbc29SmrgBool	 		ok;
9848c9fbc29SmrgXkbDescPtr		xkb;
9858c9fbc29SmrgBool			(*func)(
9868c9fbc29Smrg	FILE *		/* file*/,
9878c9fbc29Smrg	XkbFileInfo *	/* result */
9888c9fbc29Smrg);
9898c9fbc29Smrg
9908c9fbc29Smrg    switch (result->type) {
9918c9fbc29Smrg	case XkmSemanticsFile:
9928c9fbc29Smrg	    func= WriteCHdrSemantics;
9938c9fbc29Smrg	    break;
9948c9fbc29Smrg	case XkmLayoutFile:
9958c9fbc29Smrg	    func= WriteCHdrLayout;
9968c9fbc29Smrg	    break;
9978c9fbc29Smrg	case XkmKeymapFile:
9988c9fbc29Smrg	    func= WriteCHdrKeymap;
9998c9fbc29Smrg	    break;
10008c9fbc29Smrg        case XkmGeometryIndex:
10018c9fbc29Smrg        case XkmGeometryFile:
10028c9fbc29Smrg	    func= WriteCHdrGeomFile;
10038c9fbc29Smrg	    break;
10048c9fbc29Smrg	default:
10058c9fbc29Smrg	    _XkbLibError(_XkbErrIllegalContents,"XkbWriteCFile",result->type);
10068c9fbc29Smrg	    return False;
10078c9fbc29Smrg    }
10088c9fbc29Smrg    xkb= result->xkb;
10098c9fbc29Smrg    if (out==NULL) {
10108c9fbc29Smrg	_XkbLibError(_XkbErrFileCannotOpen,"XkbWriteCFile",0);
10118c9fbc29Smrg	ok= False;
10128c9fbc29Smrg    }
10138c9fbc29Smrg    else {
10148c9fbc29Smrg	char *tmp,*hdrdef;
10158c9fbc29Smrg	tmp= (char *)strrchr(name,'/');
10168c9fbc29Smrg	if (tmp==NULL)
10178c9fbc29Smrg	     tmp= name;
10188c9fbc29Smrg	else tmp++;
10198c9fbc29Smrg	hdrdef= (char *)_XkbCalloc(strlen(tmp)+1,sizeof(char));
10208c9fbc29Smrg	if (hdrdef) {
10218c9fbc29Smrg	    strcpy(hdrdef,tmp);
10228c9fbc29Smrg	    tmp= hdrdef;
10238c9fbc29Smrg	    while (*tmp) {
10248c9fbc29Smrg		if (islower(*tmp))		*tmp= toupper(*tmp);
10258c9fbc29Smrg		else if (!isalnum(*tmp))	*tmp= '_';
10268c9fbc29Smrg		tmp++;
10278c9fbc29Smrg	    }
10288c9fbc29Smrg	    fprintf(out,"/* This file generated automatically by xkbcomp */\n");
10298c9fbc29Smrg	    fprintf(out,"/* DO  NOT EDIT */\n");
10308c9fbc29Smrg	    fprintf(out,"#ifndef %s\n",hdrdef);
10318c9fbc29Smrg	    fprintf(out,"#define %s 1\n\n",hdrdef);
10328c9fbc29Smrg	}
10338c9fbc29Smrg	fprintf(out,"#ifndef XKB_IN_SERVER\n");
10348c9fbc29Smrg	fprintf(out,"#define GET_ATOM(d,s)	XInternAtom(d,s,0)\n");
10358c9fbc29Smrg	fprintf(out,"#define DPYTYPE	Display *\n");
10368c9fbc29Smrg	fprintf(out,"#else\n");
10378c9fbc29Smrg	fprintf(out,"#define GET_ATOM(d,s)	MakeAtom(s,strlen(s),1)\n");
10388c9fbc29Smrg	fprintf(out,"#define DPYTYPE	char *\n");
10398c9fbc29Smrg	fprintf(out,"#endif\n");
10408c9fbc29Smrg	fprintf(out,"#define NUM_KEYS	%d\n",xkb->max_key_code+1);
10418c9fbc29Smrg	ok= (*func)(out,result);
10428c9fbc29Smrg	if (hdrdef)
10438c9fbc29Smrg	    fprintf(out,"#endif /* %s */\n",hdrdef);
10448c9fbc29Smrg    }
10458c9fbc29Smrg
10468c9fbc29Smrg    if (!ok) {
10478c9fbc29Smrg	return False;
10488c9fbc29Smrg    }
10498c9fbc29Smrg    return True;
10508c9fbc29Smrg}
1051