2 Copyright (c) 1993 by Silicon Graphics Computer Systems, Inc.
4 Permission to use, copy, modify, and distribute this
5 software and its documentation for any purpose and without
6 fee is hereby granted, provided that the above copyright
7 notice appear in all copies and that both that copyright
8 notice and this permission notice appear in supporting
9 documentation, and that the name of Silicon Graphics not be
10 used in advertising or publicity pertaining to distribution
11 of the software without specific prior written permission.
12 Silicon Graphics makes no representation about the suitability
13 of this software for any purpose. It is provided "as is"
14 without any express or implied warranty.
16 SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
17 SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
18 AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON
19 GRAPHICS BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
20 DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
21 DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
22 OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH
23 THE USE OR PERFORMANCE OF THIS SOFTWARE.
29 #include "X11/extensions/XKBcommon.h"
30 #include "XKBcommonint.h"
32 #include <X11/Xdefs.h>
33 #include <X11/extensions/XKB.h>
36 _XkbFreeGeomLeafElems( Bool freeAll,
39 unsigned short * num_inout,
40 unsigned short * sz_inout,
44 if ((freeAll)||(*elems==NULL)) {
45 *num_inout= *sz_inout= 0;
53 if ((first>=(*num_inout))||(first<0)||(count<1))
56 if (first+count>=(*num_inout)) {
57 /* truncating the array is easy */
64 extra= ((*num_inout)-(first+count))*elem_sz;
66 memmove(&ptr[first*elem_sz],&ptr[(first+count)*elem_sz],extra);
72 typedef void (*ContentsClearFunc)(
77 _XkbFreeGeomNonLeafElems( Bool freeAll,
80 unsigned short * num_inout,
81 unsigned short * sz_inout,
84 ContentsClearFunc freeFunc)
93 else if ((first>=(*num_inout))||(first<0)||(count<1))
95 else if (first+count>(*num_inout))
96 count= (*num_inout)-first;
103 for (i=0;i<count;i++) {
109 (*num_inout)= (*sz_inout)= 0;
115 else if (first+count>=(*num_inout))
118 i= ((*num_inout)-(first+count))*elem_sz;
120 memmove(&ptr[first*elem_sz],&ptr[(first+count)*elem_sz],i);
121 (*num_inout)-= count;
127 _XkbClearProperty(char *prop_in)
129 XkbPropertyPtr prop= (XkbPropertyPtr)prop_in;
132 _XkbFree(prop->name);
136 _XkbFree(prop->value);
143 XkbcFreeGeomProperties( XkbGeometryPtr geom,
148 _XkbFreeGeomNonLeafElems(freeAll,first,count,
149 &geom->num_properties,&geom->sz_properties,
150 (char **)&geom->properties,
151 sizeof(XkbPropertyRec),_XkbClearProperty);
156 XkbcFreeGeomKeyAliases( XkbGeometryPtr geom,
161 _XkbFreeGeomLeafElems(freeAll,first,count,
162 &geom->num_key_aliases,&geom->sz_key_aliases,
163 (char **)&geom->key_aliases,
164 sizeof(XkbKeyAliasRec));
169 _XkbClearColor(char *color_in)
171 XkbColorPtr color= (XkbColorPtr)color_in;
174 _XkbFree(color->spec);
179 XkbcFreeGeomColors(XkbGeometryPtr geom,int first,int count,Bool freeAll)
181 _XkbFreeGeomNonLeafElems(freeAll,first,count,
182 &geom->num_colors,&geom->sz_colors,
183 (char **)&geom->colors,
184 sizeof(XkbColorRec),_XkbClearColor);
189 XkbcFreeGeomPoints(XkbOutlinePtr outline,int first,int count,Bool freeAll)
191 _XkbFreeGeomLeafElems(freeAll,first,count,
192 &outline->num_points,&outline->sz_points,
193 (char **)&outline->points,
194 sizeof(XkbPointRec));
199 _XkbClearOutline(char *outline_in)
201 XkbOutlinePtr outline= (XkbOutlinePtr)outline_in;
203 if (outline->points!=NULL)
204 XkbcFreeGeomPoints(outline,0,outline->num_points,True);
209 XkbcFreeGeomOutlines(XkbShapePtr shape,int first,int count,Bool freeAll)
211 _XkbFreeGeomNonLeafElems(freeAll,first,count,
212 &shape->num_outlines,&shape->sz_outlines,
213 (char **)&shape->outlines,
214 sizeof(XkbOutlineRec),_XkbClearOutline);
220 _XkbClearShape(char *shape_in)
222 XkbShapePtr shape= (XkbShapePtr)shape_in;
225 XkbcFreeGeomOutlines(shape,0,shape->num_outlines,True);
230 XkbcFreeGeomShapes(XkbGeometryPtr geom,int first,int count,Bool freeAll)
232 _XkbFreeGeomNonLeafElems(freeAll,first,count,
233 &geom->num_shapes,&geom->sz_shapes,
234 (char **)&geom->shapes,
235 sizeof(XkbShapeRec),_XkbClearShape);
240 XkbcFreeGeomOverlayKeys(XkbOverlayRowPtr row,int first,int count,Bool freeAll)
242 _XkbFreeGeomLeafElems(freeAll,first,count,
243 &row->num_keys,&row->sz_keys,
245 sizeof(XkbOverlayKeyRec));
251 _XkbClearOverlayRow(char *row_in)
253 XkbOverlayRowPtr row= (XkbOverlayRowPtr)row_in;
256 XkbcFreeGeomOverlayKeys(row,0,row->num_keys,True);
261 XkbcFreeGeomOverlayRows(XkbOverlayPtr overlay,int first,int count,Bool freeAll)
263 _XkbFreeGeomNonLeafElems(freeAll,first,count,
264 &overlay->num_rows,&overlay->sz_rows,
265 (char **)&overlay->rows,
266 sizeof(XkbOverlayRowRec),_XkbClearOverlayRow);
272 _XkbClearOverlay(char *overlay_in)
274 XkbOverlayPtr overlay= (XkbOverlayPtr)overlay_in;
276 if (overlay->rows!=NULL)
277 XkbcFreeGeomOverlayRows(overlay,0,overlay->num_rows,True);
282 XkbcFreeGeomOverlays(XkbSectionPtr section,int first,int count,Bool freeAll)
284 _XkbFreeGeomNonLeafElems(freeAll,first,count,
285 §ion->num_overlays,§ion->sz_overlays,
286 (char **)§ion->overlays,
287 sizeof(XkbOverlayRec),_XkbClearOverlay);
293 XkbcFreeGeomKeys(XkbRowPtr row,int first,int count,Bool freeAll)
295 _XkbFreeGeomLeafElems(freeAll,first,count,
296 &row->num_keys,&row->sz_keys,
304 _XkbClearRow(char *row_in)
306 XkbRowPtr row= (XkbRowPtr)row_in;
309 XkbcFreeGeomKeys(row,0,row->num_keys,True);
314 XkbcFreeGeomRows(XkbSectionPtr section,int first,int count,Bool freeAll)
316 _XkbFreeGeomNonLeafElems(freeAll,first,count,
317 §ion->num_rows,§ion->sz_rows,
318 (char **)§ion->rows,
319 sizeof(XkbRowRec),_XkbClearRow);
324 _XkbClearSection(char *section_in)
326 XkbSectionPtr section= (XkbSectionPtr)section_in;
328 if (section->rows!=NULL)
329 XkbcFreeGeomRows(section,0,section->num_rows,True);
330 if (section->doodads!=NULL) {
331 XkbcFreeGeomDoodads(section->doodads,section->num_doodads,True);
332 section->doodads= NULL;
338 XkbcFreeGeomSections(XkbGeometryPtr geom,int first,int count,Bool freeAll)
340 _XkbFreeGeomNonLeafElems(freeAll,first,count,
341 &geom->num_sections,&geom->sz_sections,
342 (char **)&geom->sections,
343 sizeof(XkbSectionRec),_XkbClearSection);
349 _XkbClearDoodad(char *doodad_in)
351 XkbDoodadPtr doodad= (XkbDoodadPtr)doodad_in;
353 switch (doodad->any.type) {
356 if (doodad->text.text!=NULL) {
357 _XkbFree(doodad->text.text);
358 doodad->text.text= NULL;
360 if (doodad->text.font!=NULL) {
361 _XkbFree(doodad->text.font);
362 doodad->text.font= NULL;
368 if (doodad->logo.logo_name!=NULL) {
369 _XkbFree(doodad->logo.logo_name);
370 doodad->logo.logo_name= NULL;
379 XkbcFreeGeomDoodads(XkbDoodadPtr doodads,int nDoodads,Bool freeAll)
382 register XkbDoodadPtr doodad;
385 for (i=0,doodad= doodads;i<nDoodads;i++,doodad++) {
386 _XkbClearDoodad((char *)doodad);
395 XkbcFreeGeometry(XkbGeometryPtr geom,unsigned which,Bool freeMap)
400 which= XkbGeomAllMask;
401 if ((which&XkbGeomPropertiesMask)&&(geom->properties!=NULL))
402 XkbcFreeGeomProperties(geom,0,geom->num_properties,True);
403 if ((which&XkbGeomColorsMask)&&(geom->colors!=NULL))
404 XkbcFreeGeomColors(geom,0,geom->num_colors,True);
405 if ((which&XkbGeomShapesMask)&&(geom->shapes!=NULL))
406 XkbcFreeGeomShapes(geom,0,geom->num_shapes,True);
407 if ((which&XkbGeomSectionsMask)&&(geom->sections!=NULL))
408 XkbcFreeGeomSections(geom,0,geom->num_sections,True);
409 if ((which&XkbGeomDoodadsMask)&&(geom->doodads!= NULL)) {
410 XkbcFreeGeomDoodads(geom->doodads,geom->num_doodads,True);
412 geom->num_doodads= geom->sz_doodads= 0;
414 if ((which&XkbGeomKeyAliasesMask)&&(geom->key_aliases!=NULL))
415 XkbcFreeGeomKeyAliases(geom,0,geom->num_key_aliases,True);
417 if (geom->label_font!=NULL) {
418 _XkbFree(geom->label_font);
419 geom->label_font= NULL;
427 _XkbGeomAlloc( char ** old,
428 unsigned short * num,
429 unsigned short * total,
438 if ((*num)+num_new<=(*total))
441 *total= (*num)+num_new;
443 (*old)= (char *)_XkbRealloc((*old),(*total)*sz_elem);
444 else (*old)= (char *)_XkbCalloc((*total),sz_elem);
451 char *tmp= (char *)(*old);
452 bzero(&tmp[sz_elem*(*num)],(num_new*sz_elem));
457 #define _XkbAllocProps(g,n) _XkbGeomAlloc((char **)&(g)->properties,\
458 &(g)->num_properties,&(g)->sz_properties,\
459 (n),sizeof(XkbPropertyRec))
460 #define _XkbAllocColors(g,n) _XkbGeomAlloc((char **)&(g)->colors,\
461 &(g)->num_colors,&(g)->sz_colors,\
462 (n),sizeof(XkbColorRec))
463 #define _XkbAllocShapes(g,n) _XkbGeomAlloc((char **)&(g)->shapes,\
464 &(g)->num_shapes,&(g)->sz_shapes,\
465 (n),sizeof(XkbShapeRec))
466 #define _XkbAllocSections(g,n) _XkbGeomAlloc((char **)&(g)->sections,\
467 &(g)->num_sections,&(g)->sz_sections,\
468 (n),sizeof(XkbSectionRec))
469 #define _XkbAllocDoodads(g,n) _XkbGeomAlloc((char **)&(g)->doodads,\
470 &(g)->num_doodads,&(g)->sz_doodads,\
471 (n),sizeof(XkbDoodadRec))
472 #define _XkbAllocKeyAliases(g,n) _XkbGeomAlloc((char **)&(g)->key_aliases,\
473 &(g)->num_key_aliases,&(g)->sz_key_aliases,\
474 (n),sizeof(XkbKeyAliasRec))
476 #define _XkbAllocOutlines(s,n) _XkbGeomAlloc((char **)&(s)->outlines,\
477 &(s)->num_outlines,&(s)->sz_outlines,\
478 (n),sizeof(XkbOutlineRec))
479 #define _XkbAllocRows(s,n) _XkbGeomAlloc((char **)&(s)->rows,\
480 &(s)->num_rows,&(s)->sz_rows,\
481 (n),sizeof(XkbRowRec))
482 #define _XkbAllocPoints(o,n) _XkbGeomAlloc((char **)&(o)->points,\
483 &(o)->num_points,&(o)->sz_points,\
484 (n),sizeof(XkbPointRec))
485 #define _XkbAllocKeys(r,n) _XkbGeomAlloc((char **)&(r)->keys,\
486 &(r)->num_keys,&(r)->sz_keys,\
487 (n),sizeof(XkbKeyRec))
488 #define _XkbAllocOverlays(s,n) _XkbGeomAlloc((char **)&(s)->overlays,\
489 &(s)->num_overlays,&(s)->sz_overlays,\
490 (n),sizeof(XkbOverlayRec))
491 #define _XkbAllocOverlayRows(o,n) _XkbGeomAlloc((char **)&(o)->rows,\
492 &(o)->num_rows,&(o)->sz_rows,\
493 (n),sizeof(XkbOverlayRowRec))
494 #define _XkbAllocOverlayKeys(r,n) _XkbGeomAlloc((char **)&(r)->keys,\
495 &(r)->num_keys,&(r)->sz_keys,\
496 (n),sizeof(XkbOverlayKeyRec))
499 XkbcAllocGeometry(XkbcDescPtr xkb,XkbGeometrySizesPtr sizes)
504 if (xkb->geom==NULL) {
505 xkb->geom= _XkbTypedCalloc(1,XkbGeometryRec);
510 if ((sizes->which&XkbGeomPropertiesMask)&&
511 ((rtrn=_XkbAllocProps(geom,sizes->num_properties))!=Success)) {
514 if ((sizes->which&XkbGeomColorsMask)&&
515 ((rtrn=_XkbAllocColors(geom,sizes->num_colors))!=Success)) {
518 if ((sizes->which&XkbGeomShapesMask)&&
519 ((rtrn=_XkbAllocShapes(geom,sizes->num_shapes))!=Success)) {
522 if ((sizes->which&XkbGeomSectionsMask)&&
523 ((rtrn=_XkbAllocSections(geom,sizes->num_sections))!=Success)) {
526 if ((sizes->which&XkbGeomDoodadsMask)&&
527 ((rtrn=_XkbAllocDoodads(geom,sizes->num_doodads))!=Success)) {
530 if ((sizes->which&XkbGeomKeyAliasesMask)&&
531 ((rtrn=_XkbAllocKeyAliases(geom,sizes->num_key_aliases))!=Success)) {
536 XkbcFreeGeometry(geom,XkbGeomAllMask,True);