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