XKBGAlloc.c revision 5afda2e6
11ab64890Smrg/************************************************************ 21ab64890SmrgCopyright (c) 1993 by Silicon Graphics Computer Systems, Inc. 31ab64890Smrg 41ab64890SmrgPermission to use, copy, modify, and distribute this 51ab64890Smrgsoftware and its documentation for any purpose and without 61ab64890Smrgfee is hereby granted, provided that the above copyright 71ab64890Smrgnotice appear in all copies and that both that copyright 81ab64890Smrgnotice and this permission notice appear in supporting 961b2299dSmrgdocumentation, and that the name of Silicon Graphics not be 1061b2299dSmrgused in advertising or publicity pertaining to distribution 111ab64890Smrgof the software without specific prior written permission. 1261b2299dSmrgSilicon Graphics makes no representation about the suitability 131ab64890Smrgof this software for any purpose. It is provided "as is" 141ab64890Smrgwithout any express or implied warranty. 151ab64890Smrg 1661b2299dSmrgSILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS 1761b2299dSmrgSOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY 181ab64890SmrgAND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON 1961b2299dSmrgGRAPHICS BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL 2061b2299dSmrgDAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, 2161b2299dSmrgDATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE 221ab64890SmrgOR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH 231ab64890SmrgTHE USE OR PERFORMANCE OF THIS SOFTWARE. 241ab64890Smrg 251ab64890Smrg********************************************************/ 261ab64890Smrg 27818534a1Smrg#ifdef HAVE_CONFIG_H 281ab64890Smrg#include <config.h> 291ab64890Smrg#endif 301ab64890Smrg 311ab64890Smrg 321ab64890Smrg#include <stdio.h> 331ab64890Smrg#include "Xlibint.h" 341ab64890Smrg#include "XKBlibint.h" 355afda2e6Smrg#include "X11/extensions/XKBgeom.h" 361ab64890Smrg#include <X11/extensions/XKBproto.h> 371ab64890Smrg 381ab64890Smrg/***====================================================================***/ 391ab64890Smrg 4061b2299dSmrgstatic void 41818534a1Smrg_XkbFreeGeomLeafElems(Bool freeAll, 42818534a1Smrg int first, 43818534a1Smrg int count, 44818534a1Smrg unsigned short *num_inout, 45818534a1Smrg unsigned short *sz_inout, 46818534a1Smrg char **elems, 47818534a1Smrg unsigned int elem_sz) 48818534a1Smrg{ 49818534a1Smrg if ((freeAll) || (*elems == NULL)) { 50818534a1Smrg *num_inout = *sz_inout = 0; 51818534a1Smrg if (*elems != NULL) { 52818534a1Smrg _XkbFree(*elems); 53818534a1Smrg *elems = NULL; 54818534a1Smrg } 55818534a1Smrg return; 56818534a1Smrg } 57818534a1Smrg 58818534a1Smrg if ((first >= (*num_inout)) || (first < 0) || (count < 1)) 59818534a1Smrg return; 60818534a1Smrg 61818534a1Smrg if (first + count >= (*num_inout)) { 62818534a1Smrg /* truncating the array is easy */ 63818534a1Smrg (*num_inout) = first; 641ab64890Smrg } 651ab64890Smrg else { 66818534a1Smrg char *ptr; 67818534a1Smrg int extra; 68818534a1Smrg 69818534a1Smrg ptr = *elems; 70818534a1Smrg extra = ((*num_inout) - (first + count)) * elem_sz; 71818534a1Smrg if (extra > 0) 72818534a1Smrg memmove(&ptr[first * elem_sz], &ptr[(first + count) * elem_sz], 73818534a1Smrg extra); 74818534a1Smrg (*num_inout) -= count; 751ab64890Smrg } 761ab64890Smrg return; 771ab64890Smrg} 781ab64890Smrg 79818534a1Smrgtypedef void (*ContentsClearFunc) ( 80818534a1Smrg char * /* priv */ 811ab64890Smrg); 821ab64890Smrg 8361b2299dSmrgstatic void 84818534a1Smrg_XkbFreeGeomNonLeafElems(Bool freeAll, 85818534a1Smrg int first, 86818534a1Smrg int count, 87818534a1Smrg unsigned short *num_inout, 88818534a1Smrg unsigned short *sz_inout, 89818534a1Smrg char **elems, 90818534a1Smrg unsigned int elem_sz, 91818534a1Smrg ContentsClearFunc freeFunc) 92818534a1Smrg{ 93818534a1Smrg register int i; 94818534a1Smrg register char *ptr; 951ab64890Smrg 961ab64890Smrg if (freeAll) { 97818534a1Smrg first = 0; 98818534a1Smrg count = (*num_inout); 991ab64890Smrg } 100818534a1Smrg else if ((first >= (*num_inout)) || (first < 0) || (count < 1)) 101818534a1Smrg return; 102818534a1Smrg else if (first + count > (*num_inout)) 103818534a1Smrg count = (*num_inout) - first; 104818534a1Smrg if (*elems == NULL) 105818534a1Smrg return; 1061ab64890Smrg 1071ab64890Smrg if (freeFunc) { 108818534a1Smrg ptr = *elems; 109818534a1Smrg ptr += first * elem_sz; 110818534a1Smrg for (i = 0; i < count; i++) { 111818534a1Smrg (*freeFunc) (ptr); 112818534a1Smrg ptr += elem_sz; 113818534a1Smrg } 1141ab64890Smrg } 1151ab64890Smrg if (freeAll) { 116818534a1Smrg (*num_inout) = (*sz_inout) = 0; 117818534a1Smrg if (*elems) { 118818534a1Smrg _XkbFree(*elems); 119818534a1Smrg *elems = NULL; 120818534a1Smrg } 121818534a1Smrg } 122818534a1Smrg else if (first + count >= (*num_inout)) 123818534a1Smrg *num_inout = first; 1241ab64890Smrg else { 125818534a1Smrg i = ((*num_inout) - (first + count)) * elem_sz; 126818534a1Smrg ptr = *elems; 127818534a1Smrg memmove(&ptr[first * elem_sz], &ptr[(first + count) * elem_sz], i); 128818534a1Smrg (*num_inout) -= count; 1291ab64890Smrg } 1301ab64890Smrg return; 1311ab64890Smrg} 1321ab64890Smrg 1331ab64890Smrg/***====================================================================***/ 1341ab64890Smrg 1351ab64890Smrgstatic void 1361ab64890Smrg_XkbClearProperty(char *prop_in) 1371ab64890Smrg{ 138818534a1Smrg XkbPropertyPtr prop = (XkbPropertyPtr) prop_in; 1391ab64890Smrg 1401ab64890Smrg if (prop->name) { 141818534a1Smrg _XkbFree(prop->name); 142818534a1Smrg prop->name = NULL; 1431ab64890Smrg } 1441ab64890Smrg if (prop->value) { 145818534a1Smrg _XkbFree(prop->value); 146818534a1Smrg prop->value = NULL; 1471ab64890Smrg } 1481ab64890Smrg return; 1491ab64890Smrg} 1501ab64890Smrg 1511ab64890Smrgvoid 152818534a1SmrgXkbFreeGeomProperties(XkbGeometryPtr geom, int first, int count, Bool freeAll) 153818534a1Smrg{ 154818534a1Smrg _XkbFreeGeomNonLeafElems(freeAll, first, count, 155818534a1Smrg &geom->num_properties, &geom->sz_properties, 156818534a1Smrg (char **) &geom->properties, 157818534a1Smrg sizeof(XkbPropertyRec), _XkbClearProperty); 1581ab64890Smrg return; 1591ab64890Smrg} 1601ab64890Smrg 1611ab64890Smrg/***====================================================================***/ 1621ab64890Smrg 1631ab64890Smrgvoid 164818534a1SmrgXkbFreeGeomKeyAliases(XkbGeometryPtr geom, int first, int count, Bool freeAll) 165818534a1Smrg{ 166818534a1Smrg _XkbFreeGeomLeafElems(freeAll, first, count, 167818534a1Smrg &geom->num_key_aliases, &geom->sz_key_aliases, 168818534a1Smrg (char **) &geom->key_aliases, 169818534a1Smrg sizeof(XkbKeyAliasRec)); 1701ab64890Smrg return; 1711ab64890Smrg} 1721ab64890Smrg 1731ab64890Smrg/***====================================================================***/ 1741ab64890Smrg 1751ab64890Smrgstatic void 1761ab64890Smrg_XkbClearColor(char *color_in) 1771ab64890Smrg{ 178818534a1Smrg XkbColorPtr color = (XkbColorPtr) color_in; 1791ab64890Smrg 1800f8248bfSmrg _XkbFree(color->spec); 1811ab64890Smrg return; 1821ab64890Smrg} 1831ab64890Smrg 1841ab64890Smrgvoid 185818534a1SmrgXkbFreeGeomColors(XkbGeometryPtr geom, int first, int count, Bool freeAll) 1861ab64890Smrg{ 187818534a1Smrg _XkbFreeGeomNonLeafElems(freeAll, first, count, 188818534a1Smrg &geom->num_colors, &geom->sz_colors, 189818534a1Smrg (char **) &geom->colors, 190818534a1Smrg sizeof(XkbColorRec), _XkbClearColor); 1911ab64890Smrg return; 1921ab64890Smrg} 1931ab64890Smrg 1941ab64890Smrg/***====================================================================***/ 1951ab64890Smrg 1961ab64890Smrgvoid 197818534a1SmrgXkbFreeGeomPoints(XkbOutlinePtr outline, int first, int count, Bool freeAll) 1981ab64890Smrg{ 199818534a1Smrg _XkbFreeGeomLeafElems(freeAll, first, count, 200818534a1Smrg &outline->num_points, &outline->sz_points, 201818534a1Smrg (char **) &outline->points, 202818534a1Smrg sizeof(XkbPointRec)); 2031ab64890Smrg return; 2041ab64890Smrg} 2051ab64890Smrg 2061ab64890Smrg/***====================================================================***/ 2071ab64890Smrg 2081ab64890Smrgstatic void 2091ab64890Smrg_XkbClearOutline(char *outline_in) 2101ab64890Smrg{ 211818534a1Smrg XkbOutlinePtr outline = (XkbOutlinePtr) outline_in; 2121ab64890Smrg 213818534a1Smrg if (outline->points != NULL) 214818534a1Smrg XkbFreeGeomPoints(outline, 0, outline->num_points, True); 2151ab64890Smrg return; 2161ab64890Smrg} 2171ab64890Smrg 2181ab64890Smrgvoid 219818534a1SmrgXkbFreeGeomOutlines(XkbShapePtr shape, int first, int count, Bool freeAll) 2201ab64890Smrg{ 221818534a1Smrg _XkbFreeGeomNonLeafElems(freeAll, first, count, 222818534a1Smrg &shape->num_outlines, &shape->sz_outlines, 223818534a1Smrg (char **) &shape->outlines, 224818534a1Smrg sizeof(XkbOutlineRec), _XkbClearOutline); 22561b2299dSmrg 2261ab64890Smrg return; 2271ab64890Smrg} 2281ab64890Smrg 2291ab64890Smrg/***====================================================================***/ 2301ab64890Smrg 2311ab64890Smrgstatic void 2321ab64890Smrg_XkbClearShape(char *shape_in) 2331ab64890Smrg{ 234818534a1Smrg XkbShapePtr shape = (XkbShapePtr) shape_in; 2351ab64890Smrg 2361ab64890Smrg if (shape->outlines) 237818534a1Smrg XkbFreeGeomOutlines(shape, 0, shape->num_outlines, True); 2381ab64890Smrg return; 2391ab64890Smrg} 2401ab64890Smrg 2411ab64890Smrgvoid 242818534a1SmrgXkbFreeGeomShapes(XkbGeometryPtr geom, int first, int count, Bool freeAll) 2431ab64890Smrg{ 244818534a1Smrg _XkbFreeGeomNonLeafElems(freeAll, first, count, 245818534a1Smrg &geom->num_shapes, &geom->sz_shapes, 246818534a1Smrg (char **) &geom->shapes, 247818534a1Smrg sizeof(XkbShapeRec), _XkbClearShape); 2481ab64890Smrg return; 2491ab64890Smrg} 2501ab64890Smrg 2511ab64890Smrg/***====================================================================***/ 2521ab64890Smrg 25361b2299dSmrgvoid 254818534a1SmrgXkbFreeGeomOverlayKeys(XkbOverlayRowPtr row, int first, int count, Bool freeAll) 2551ab64890Smrg{ 256818534a1Smrg _XkbFreeGeomLeafElems(freeAll, first, count, 257818534a1Smrg &row->num_keys, &row->sz_keys, 258818534a1Smrg (char **) &row->keys, 259818534a1Smrg sizeof(XkbOverlayKeyRec)); 2601ab64890Smrg return; 2611ab64890Smrg} 2621ab64890Smrg 2631ab64890Smrg/***====================================================================***/ 2641ab64890Smrg 2651ab64890Smrgstatic void 2661ab64890Smrg_XkbClearOverlayRow(char *row_in) 2671ab64890Smrg{ 268818534a1Smrg XkbOverlayRowPtr row = (XkbOverlayRowPtr) row_in; 2691ab64890Smrg 270818534a1Smrg if (row->keys != NULL) 271818534a1Smrg XkbFreeGeomOverlayKeys(row, 0, row->num_keys, True); 2721ab64890Smrg return; 2731ab64890Smrg} 2741ab64890Smrg 2751ab64890Smrgvoid 276818534a1SmrgXkbFreeGeomOverlayRows(XkbOverlayPtr overlay, int first, int count, 277818534a1Smrg Bool freeAll) 2781ab64890Smrg{ 279818534a1Smrg _XkbFreeGeomNonLeafElems(freeAll, first, count, 280818534a1Smrg &overlay->num_rows, &overlay->sz_rows, 281818534a1Smrg (char **) &overlay->rows, 282818534a1Smrg sizeof(XkbOverlayRowRec), _XkbClearOverlayRow); 2831ab64890Smrg return; 2841ab64890Smrg} 2851ab64890Smrg 2861ab64890Smrg/***====================================================================***/ 2871ab64890Smrg 2881ab64890Smrgstatic void 2891ab64890Smrg_XkbClearOverlay(char *overlay_in) 2901ab64890Smrg{ 291818534a1Smrg XkbOverlayPtr overlay = (XkbOverlayPtr) overlay_in; 2921ab64890Smrg 293818534a1Smrg if (overlay->rows != NULL) 294818534a1Smrg XkbFreeGeomOverlayRows(overlay, 0, overlay->num_rows, True); 2951ab64890Smrg return; 2961ab64890Smrg} 2971ab64890Smrg 2981ab64890Smrgvoid 299818534a1SmrgXkbFreeGeomOverlays(XkbSectionPtr section, int first, int count, Bool freeAll) 3001ab64890Smrg{ 301818534a1Smrg _XkbFreeGeomNonLeafElems(freeAll, first, count, 302818534a1Smrg §ion->num_overlays, §ion->sz_overlays, 303818534a1Smrg (char **) §ion->overlays, 304818534a1Smrg sizeof(XkbOverlayRec), _XkbClearOverlay); 3051ab64890Smrg return; 3061ab64890Smrg} 3071ab64890Smrg 3081ab64890Smrg/***====================================================================***/ 3091ab64890Smrg 3101ab64890Smrgvoid 311818534a1SmrgXkbFreeGeomKeys(XkbRowPtr row, int first, int count, Bool freeAll) 3121ab64890Smrg{ 313818534a1Smrg _XkbFreeGeomLeafElems(freeAll, first, count, 314818534a1Smrg &row->num_keys, &row->sz_keys, 315818534a1Smrg (char **) &row->keys, 316818534a1Smrg sizeof(XkbKeyRec)); 3171ab64890Smrg return; 3181ab64890Smrg} 3191ab64890Smrg 3201ab64890Smrg/***====================================================================***/ 3211ab64890Smrg 3221ab64890Smrgstatic void 3231ab64890Smrg_XkbClearRow(char *row_in) 3241ab64890Smrg{ 325818534a1Smrg XkbRowPtr row = (XkbRowPtr) row_in; 3261ab64890Smrg 327818534a1Smrg if (row->keys != NULL) 328818534a1Smrg XkbFreeGeomKeys(row, 0, row->num_keys, True); 3291ab64890Smrg return; 3301ab64890Smrg} 3311ab64890Smrg 3321ab64890Smrgvoid 333818534a1SmrgXkbFreeGeomRows(XkbSectionPtr section, int first, int count, Bool freeAll) 3341ab64890Smrg{ 335818534a1Smrg _XkbFreeGeomNonLeafElems(freeAll, first, count, 336818534a1Smrg §ion->num_rows, §ion->sz_rows, 337818534a1Smrg (char **) §ion->rows, 338818534a1Smrg sizeof(XkbRowRec), _XkbClearRow); 3391ab64890Smrg} 3401ab64890Smrg 3411ab64890Smrg/***====================================================================***/ 3421ab64890Smrg 3431ab64890Smrgstatic void 3441ab64890Smrg_XkbClearSection(char *section_in) 3451ab64890Smrg{ 346818534a1Smrg XkbSectionPtr section = (XkbSectionPtr) section_in; 3471ab64890Smrg 348818534a1Smrg if (section->rows != NULL) 349818534a1Smrg XkbFreeGeomRows(section, 0, section->num_rows, True); 350818534a1Smrg if (section->doodads != NULL) { 351818534a1Smrg XkbFreeGeomDoodads(section->doodads, section->num_doodads, True); 352818534a1Smrg section->doodads = NULL; 3531ab64890Smrg } 3541ab64890Smrg return; 3551ab64890Smrg} 3561ab64890Smrg 3571ab64890Smrgvoid 358818534a1SmrgXkbFreeGeomSections(XkbGeometryPtr geom, int first, int count, Bool freeAll) 3591ab64890Smrg{ 360818534a1Smrg _XkbFreeGeomNonLeafElems(freeAll, first, count, 361818534a1Smrg &geom->num_sections, &geom->sz_sections, 362818534a1Smrg (char **) &geom->sections, 363818534a1Smrg sizeof(XkbSectionRec), _XkbClearSection); 3641ab64890Smrg return; 3651ab64890Smrg} 3661ab64890Smrg 3671ab64890Smrg/***====================================================================***/ 3681ab64890Smrg 3691ab64890Smrgstatic void 3701ab64890Smrg_XkbClearDoodad(char *doodad_in) 3711ab64890Smrg{ 372818534a1Smrg XkbDoodadPtr doodad = (XkbDoodadPtr) doodad_in; 3731ab64890Smrg 3741ab64890Smrg switch (doodad->any.type) { 375818534a1Smrg case XkbTextDoodad: 376818534a1Smrg { 377818534a1Smrg if (doodad->text.text != NULL) { 378818534a1Smrg _XkbFree(doodad->text.text); 379818534a1Smrg doodad->text.text = NULL; 380818534a1Smrg } 381818534a1Smrg if (doodad->text.font != NULL) { 382818534a1Smrg _XkbFree(doodad->text.font); 383818534a1Smrg doodad->text.font = NULL; 384818534a1Smrg } 385818534a1Smrg } 386818534a1Smrg break; 387818534a1Smrg case XkbLogoDoodad: 388818534a1Smrg { 389818534a1Smrg if (doodad->logo.logo_name != NULL) { 390818534a1Smrg _XkbFree(doodad->logo.logo_name); 391818534a1Smrg doodad->logo.logo_name = NULL; 392818534a1Smrg } 393818534a1Smrg } 394818534a1Smrg break; 3951ab64890Smrg } 3961ab64890Smrg return; 3971ab64890Smrg} 3981ab64890Smrg 3991ab64890Smrgvoid 400818534a1SmrgXkbFreeGeomDoodads(XkbDoodadPtr doodads, int nDoodads, Bool freeAll) 4011ab64890Smrg{ 402818534a1Smrg register int i; 403818534a1Smrg register XkbDoodadPtr doodad; 4041ab64890Smrg 4051ab64890Smrg if (doodads) { 406818534a1Smrg for (i = 0, doodad = doodads; i < nDoodads; i++, doodad++) { 407818534a1Smrg _XkbClearDoodad((char *) doodad); 408818534a1Smrg } 409818534a1Smrg if (freeAll) 410818534a1Smrg _XkbFree(doodads); 4111ab64890Smrg } 4121ab64890Smrg return; 4131ab64890Smrg} 4141ab64890Smrg 4151ab64890Smrgvoid 416818534a1SmrgXkbFreeGeometry(XkbGeometryPtr geom, unsigned which, Bool freeMap) 4171ab64890Smrg{ 418818534a1Smrg if (geom == NULL) 419818534a1Smrg return; 4201ab64890Smrg if (freeMap) 421818534a1Smrg which = XkbGeomAllMask; 422818534a1Smrg if ((which & XkbGeomPropertiesMask) && (geom->properties != NULL)) 423818534a1Smrg XkbFreeGeomProperties(geom, 0, geom->num_properties, True); 424818534a1Smrg if ((which & XkbGeomColorsMask) && (geom->colors != NULL)) 425818534a1Smrg XkbFreeGeomColors(geom, 0, geom->num_colors, True); 426818534a1Smrg if ((which & XkbGeomShapesMask) && (geom->shapes != NULL)) 427818534a1Smrg XkbFreeGeomShapes(geom, 0, geom->num_shapes, True); 428818534a1Smrg if ((which & XkbGeomSectionsMask) && (geom->sections != NULL)) 429818534a1Smrg XkbFreeGeomSections(geom, 0, geom->num_sections, True); 430818534a1Smrg if ((which & XkbGeomDoodadsMask) && (geom->doodads != NULL)) { 431818534a1Smrg XkbFreeGeomDoodads(geom->doodads, geom->num_doodads, True); 432818534a1Smrg geom->doodads = NULL; 433818534a1Smrg geom->num_doodads = geom->sz_doodads = 0; 434818534a1Smrg } 435818534a1Smrg if ((which & XkbGeomKeyAliasesMask) && (geom->key_aliases != NULL)) 436818534a1Smrg XkbFreeGeomKeyAliases(geom, 0, geom->num_key_aliases, True); 4371ab64890Smrg if (freeMap) { 438818534a1Smrg if (geom->label_font != NULL) { 439818534a1Smrg _XkbFree(geom->label_font); 440818534a1Smrg geom->label_font = NULL; 441818534a1Smrg } 442818534a1Smrg _XkbFree(geom); 4431ab64890Smrg } 4441ab64890Smrg return; 4451ab64890Smrg} 4461ab64890Smrg 4471ab64890Smrg/***====================================================================***/ 4481ab64890Smrg 4491ab64890Smrgstatic Status 450818534a1Smrg_XkbGeomAlloc(XPointer *old, 451818534a1Smrg unsigned short *num, 452818534a1Smrg unsigned short *total, 453818534a1Smrg int num_new, 454818534a1Smrg size_t sz_elem) 455818534a1Smrg{ 456818534a1Smrg if (num_new < 1) 457818534a1Smrg return Success; 458818534a1Smrg if ((*old) == NULL) 459818534a1Smrg *num = *total = 0; 460818534a1Smrg 461818534a1Smrg if ((*num) + num_new <= (*total)) 462818534a1Smrg return Success; 463818534a1Smrg 464818534a1Smrg *total = (*num) + num_new; 465818534a1Smrg if ((*old) != NULL) 466818534a1Smrg (*old) = (XPointer) _XkbRealloc((*old), (*total) * sz_elem); 467818534a1Smrg else 468818534a1Smrg (*old) = (XPointer) _XkbCalloc((*total), sz_elem); 469818534a1Smrg if ((*old) == NULL) { 470818534a1Smrg *total = *num = 0; 471818534a1Smrg return BadAlloc; 472818534a1Smrg } 473818534a1Smrg 474818534a1Smrg if (*num > 0) { 475818534a1Smrg char *tmp = (char *) (*old); 476818534a1Smrg bzero(&tmp[sz_elem * (*num)], (num_new * sz_elem)); 4771ab64890Smrg } 4781ab64890Smrg return Success; 4791ab64890Smrg} 4801ab64890Smrg 481818534a1Smrg#define _XkbAllocProps(g, n) _XkbGeomAlloc((XPointer *)&(g)->properties, \ 482818534a1Smrg &(g)->num_properties, &(g)->sz_properties, \ 483818534a1Smrg (n), sizeof(XkbPropertyRec)) 484818534a1Smrg#define _XkbAllocColors(g, n) _XkbGeomAlloc((XPointer *)&(g)->colors, \ 485818534a1Smrg &(g)->num_colors, &(g)->sz_colors, \ 486818534a1Smrg (n), sizeof(XkbColorRec)) 487818534a1Smrg#define _XkbAllocShapes(g, n) _XkbGeomAlloc((XPointer *)&(g)->shapes, \ 488818534a1Smrg &(g)->num_shapes, &(g)->sz_shapes, \ 489818534a1Smrg (n), sizeof(XkbShapeRec)) 490818534a1Smrg#define _XkbAllocSections(g, n) _XkbGeomAlloc((XPointer *)&(g)->sections, \ 491818534a1Smrg &(g)->num_sections, &(g)->sz_sections, \ 492818534a1Smrg (n), sizeof(XkbSectionRec)) 493818534a1Smrg#define _XkbAllocDoodads(g, n) _XkbGeomAlloc((XPointer *)&(g)->doodads, \ 494818534a1Smrg &(g)->num_doodads, &(g)->sz_doodads, \ 495818534a1Smrg (n), sizeof(XkbDoodadRec)) 496818534a1Smrg#define _XkbAllocKeyAliases(g, n) _XkbGeomAlloc((XPointer *)&(g)->key_aliases, \ 497818534a1Smrg &(g)->num_key_aliases, &(g)->sz_key_aliases, \ 498818534a1Smrg (n), sizeof(XkbKeyAliasRec)) 499818534a1Smrg 500818534a1Smrg#define _XkbAllocOutlines(s, n) _XkbGeomAlloc((XPointer *)&(s)->outlines, \ 501818534a1Smrg &(s)->num_outlines, &(s)->sz_outlines, \ 502818534a1Smrg (n), sizeof(XkbOutlineRec)) 503818534a1Smrg#define _XkbAllocRows(s, n) _XkbGeomAlloc((XPointer *)&(s)->rows, \ 504818534a1Smrg &(s)->num_rows, &(s)->sz_rows, \ 505818534a1Smrg (n), sizeof(XkbRowRec)) 506818534a1Smrg#define _XkbAllocPoints(o, n) _XkbGeomAlloc((XPointer *)&(o)->points, \ 507818534a1Smrg &(o)->num_points, &(o)->sz_points, \ 508818534a1Smrg (n), sizeof(XkbPointRec)) 509818534a1Smrg#define _XkbAllocKeys(r, n) _XkbGeomAlloc((XPointer *)&(r)->keys, \ 510818534a1Smrg &(r)->num_keys, &(r)->sz_keys, \ 511818534a1Smrg (n), sizeof(XkbKeyRec)) 512818534a1Smrg#define _XkbAllocOverlays(s, n) _XkbGeomAlloc((XPointer *)&(s)->overlays, \ 513818534a1Smrg &(s)->num_overlays, &(s)->sz_overlays, \ 514818534a1Smrg (n), sizeof(XkbOverlayRec)) 515818534a1Smrg#define _XkbAllocOverlayRows(o, n) _XkbGeomAlloc((XPointer *)&(o)->rows, \ 516818534a1Smrg &(o)->num_rows, &(o)->sz_rows, \ 517818534a1Smrg (n), sizeof(XkbOverlayRowRec)) 518818534a1Smrg#define _XkbAllocOverlayKeys(r, n) _XkbGeomAlloc((XPointer *)&(r)->keys, \ 519818534a1Smrg &(r)->num_keys, &(r)->sz_keys, \ 520818534a1Smrg (n), sizeof(XkbOverlayKeyRec)) 52161b2299dSmrg 5221ab64890SmrgStatus 523818534a1SmrgXkbAllocGeomProps(XkbGeometryPtr geom, int nProps) 5241ab64890Smrg{ 525818534a1Smrg return _XkbAllocProps(geom, nProps); 5261ab64890Smrg} 5271ab64890Smrg 5281ab64890SmrgStatus 529818534a1SmrgXkbAllocGeomColors(XkbGeometryPtr geom, int nColors) 5301ab64890Smrg{ 531818534a1Smrg return _XkbAllocColors(geom, nColors); 5321ab64890Smrg} 5331ab64890Smrg 5341ab64890SmrgStatus 535818534a1SmrgXkbAllocGeomKeyAliases(XkbGeometryPtr geom, int nKeyAliases) 5361ab64890Smrg{ 537818534a1Smrg return _XkbAllocKeyAliases(geom, nKeyAliases); 5381ab64890Smrg} 5391ab64890Smrg 5401ab64890SmrgStatus 541818534a1SmrgXkbAllocGeomShapes(XkbGeometryPtr geom, int nShapes) 5421ab64890Smrg{ 543818534a1Smrg return _XkbAllocShapes(geom, nShapes); 5441ab64890Smrg} 5451ab64890Smrg 5461ab64890SmrgStatus 547818534a1SmrgXkbAllocGeomSections(XkbGeometryPtr geom, int nSections) 5481ab64890Smrg{ 549818534a1Smrg return _XkbAllocSections(geom, nSections); 5501ab64890Smrg} 5511ab64890Smrg 5521ab64890SmrgStatus 553818534a1SmrgXkbAllocGeomOverlays(XkbSectionPtr section, int nOverlays) 5541ab64890Smrg{ 555818534a1Smrg return _XkbAllocOverlays(section, nOverlays); 5561ab64890Smrg} 5571ab64890Smrg 5581ab64890SmrgStatus 559818534a1SmrgXkbAllocGeomOverlayRows(XkbOverlayPtr overlay, int nRows) 5601ab64890Smrg{ 561818534a1Smrg return _XkbAllocOverlayRows(overlay, nRows); 5621ab64890Smrg} 5631ab64890Smrg 5641ab64890SmrgStatus 565818534a1SmrgXkbAllocGeomOverlayKeys(XkbOverlayRowPtr row, int nKeys) 5661ab64890Smrg{ 567818534a1Smrg return _XkbAllocOverlayKeys(row, nKeys); 5681ab64890Smrg} 5691ab64890Smrg 5701ab64890SmrgStatus 571818534a1SmrgXkbAllocGeomDoodads(XkbGeometryPtr geom, int nDoodads) 5721ab64890Smrg{ 573818534a1Smrg return _XkbAllocDoodads(geom, nDoodads); 5741ab64890Smrg} 5751ab64890Smrg 5761ab64890SmrgStatus 577818534a1SmrgXkbAllocGeomSectionDoodads(XkbSectionPtr section, int nDoodads) 5781ab64890Smrg{ 579818534a1Smrg return _XkbAllocDoodads(section, nDoodads); 5801ab64890Smrg} 5811ab64890Smrg 5821ab64890SmrgStatus 583818534a1SmrgXkbAllocGeomOutlines(XkbShapePtr shape, int nOL) 5841ab64890Smrg{ 585818534a1Smrg return _XkbAllocOutlines(shape, nOL); 5861ab64890Smrg} 5871ab64890Smrg 5881ab64890SmrgStatus 589818534a1SmrgXkbAllocGeomRows(XkbSectionPtr section, int nRows) 5901ab64890Smrg{ 591818534a1Smrg return _XkbAllocRows(section, nRows); 5921ab64890Smrg} 5931ab64890Smrg 5941ab64890SmrgStatus 595818534a1SmrgXkbAllocGeomPoints(XkbOutlinePtr ol, int nPts) 5961ab64890Smrg{ 597818534a1Smrg return _XkbAllocPoints(ol, nPts); 5981ab64890Smrg} 5991ab64890Smrg 6001ab64890SmrgStatus 601818534a1SmrgXkbAllocGeomKeys(XkbRowPtr row, int nKeys) 6021ab64890Smrg{ 603818534a1Smrg return _XkbAllocKeys(row, nKeys); 6041ab64890Smrg} 6051ab64890Smrg 6061ab64890SmrgStatus 607818534a1SmrgXkbAllocGeometry(XkbDescPtr xkb, XkbGeometrySizesPtr sizes) 6081ab64890Smrg{ 609818534a1Smrg XkbGeometryPtr geom; 610818534a1Smrg Status rtrn; 6111ab64890Smrg 612818534a1Smrg if (xkb->geom == NULL) { 613818534a1Smrg xkb->geom = _XkbTypedCalloc(1, XkbGeometryRec); 614818534a1Smrg if (!xkb->geom) 615818534a1Smrg return BadAlloc; 6161ab64890Smrg } 617818534a1Smrg geom = xkb->geom; 618818534a1Smrg if ((sizes->which & XkbGeomPropertiesMask) && 619818534a1Smrg ((rtrn = _XkbAllocProps(geom, sizes->num_properties)) != Success)) { 620818534a1Smrg goto BAIL; 6211ab64890Smrg } 622818534a1Smrg if ((sizes->which & XkbGeomColorsMask) && 623818534a1Smrg ((rtrn = _XkbAllocColors(geom, sizes->num_colors)) != Success)) { 624818534a1Smrg goto BAIL; 6251ab64890Smrg } 626818534a1Smrg if ((sizes->which & XkbGeomShapesMask) && 627818534a1Smrg ((rtrn = _XkbAllocShapes(geom, sizes->num_shapes)) != Success)) { 628818534a1Smrg goto BAIL; 6291ab64890Smrg } 630818534a1Smrg if ((sizes->which & XkbGeomSectionsMask) && 631818534a1Smrg ((rtrn = _XkbAllocSections(geom, sizes->num_sections)) != Success)) { 632818534a1Smrg goto BAIL; 6331ab64890Smrg } 634818534a1Smrg if ((sizes->which & XkbGeomDoodadsMask) && 635818534a1Smrg ((rtrn = _XkbAllocDoodads(geom, sizes->num_doodads)) != Success)) { 636818534a1Smrg goto BAIL; 6371ab64890Smrg } 638818534a1Smrg if ((sizes->which & XkbGeomKeyAliasesMask) && 639818534a1Smrg ((rtrn = _XkbAllocKeyAliases(geom, sizes->num_key_aliases)) 640818534a1Smrg != Success)) { 641818534a1Smrg goto BAIL; 6421ab64890Smrg } 6431ab64890Smrg return Success; 644818534a1Smrg BAIL: 645818534a1Smrg XkbFreeGeometry(geom, XkbGeomAllMask, True); 646818534a1Smrg xkb->geom = NULL; 6471ab64890Smrg return rtrn; 6481ab64890Smrg} 6491ab64890Smrg 6501ab64890Smrg/***====================================================================***/ 6511ab64890Smrg 6521ab64890SmrgXkbPropertyPtr 653818534a1SmrgXkbAddGeomProperty(XkbGeometryPtr geom, char *name, char *value) 654818534a1Smrg{ 655818534a1Smrg register int i; 656818534a1Smrg register XkbPropertyPtr prop; 657818534a1Smrg 658818534a1Smrg if ((!geom) || (!name) || (!value)) 659818534a1Smrg return NULL; 660818534a1Smrg for (i = 0, prop = geom->properties; i < geom->num_properties; i++, prop++) { 661818534a1Smrg if ((prop->name) && (strcmp(name, prop->name) == 0)) { 6620f8248bfSmrg _XkbFree(prop->value); 663818534a1Smrg prop->value = strdup(value); 664818534a1Smrg return prop; 665818534a1Smrg } 666818534a1Smrg } 667818534a1Smrg if ((geom->num_properties >= geom->sz_properties) && 668818534a1Smrg (_XkbAllocProps(geom, 1) != Success)) { 669818534a1Smrg return NULL; 670818534a1Smrg } 671818534a1Smrg prop = &geom->properties[geom->num_properties]; 672818534a1Smrg prop->name = strdup(name); 67357f47464Smrg if (!prop->name) 674818534a1Smrg return NULL; 675818534a1Smrg prop->value = strdup(value); 67657f47464Smrg if (!prop->value) { 677818534a1Smrg _XkbFree(prop->name); 678818534a1Smrg prop->name = NULL; 679818534a1Smrg return NULL; 6801ab64890Smrg } 6811ab64890Smrg geom->num_properties++; 6821ab64890Smrg return prop; 6831ab64890Smrg} 6841ab64890Smrg 6851ab64890SmrgXkbKeyAliasPtr 686818534a1SmrgXkbAddGeomKeyAlias(XkbGeometryPtr geom, char *aliasStr, char *realStr) 687818534a1Smrg{ 688818534a1Smrg register int i; 689818534a1Smrg register XkbKeyAliasPtr alias; 690818534a1Smrg 691818534a1Smrg if ((!geom) || (!aliasStr) || (!realStr) || (!aliasStr[0]) || (!realStr[0])) 692818534a1Smrg return NULL; 693818534a1Smrg for (i = 0, alias = geom->key_aliases; i < geom->num_key_aliases; 694818534a1Smrg i++, alias++) { 695818534a1Smrg if (strncmp(alias->alias, aliasStr, XkbKeyNameLength) == 0) { 696818534a1Smrg bzero(alias->real, XkbKeyNameLength); 697818534a1Smrg strncpy(alias->real, realStr, XkbKeyNameLength); 698818534a1Smrg return alias; 699818534a1Smrg } 700818534a1Smrg } 701818534a1Smrg if ((geom->num_key_aliases >= geom->sz_key_aliases) && 702818534a1Smrg (_XkbAllocKeyAliases(geom, 1) != Success)) { 703818534a1Smrg return NULL; 704818534a1Smrg } 705818534a1Smrg alias = &geom->key_aliases[geom->num_key_aliases]; 706818534a1Smrg bzero(alias, sizeof(XkbKeyAliasRec)); 707818534a1Smrg strncpy(alias->alias, aliasStr, XkbKeyNameLength); 708818534a1Smrg strncpy(alias->real, realStr, XkbKeyNameLength); 7091ab64890Smrg geom->num_key_aliases++; 7101ab64890Smrg return alias; 7111ab64890Smrg} 7121ab64890Smrg 7131ab64890SmrgXkbColorPtr 714818534a1SmrgXkbAddGeomColor(XkbGeometryPtr geom, char *spec, unsigned int pixel) 715818534a1Smrg{ 716818534a1Smrg register int i; 717818534a1Smrg register XkbColorPtr color; 718818534a1Smrg 719818534a1Smrg if ((!geom) || (!spec)) 720818534a1Smrg return NULL; 721818534a1Smrg for (i = 0, color = geom->colors; i < geom->num_colors; i++, color++) { 722818534a1Smrg if ((color->spec) && (strcmp(color->spec, spec) == 0)) { 723818534a1Smrg color->pixel = pixel; 724818534a1Smrg return color; 725818534a1Smrg } 726818534a1Smrg } 727818534a1Smrg if ((geom->num_colors >= geom->sz_colors) && 728818534a1Smrg (_XkbAllocColors(geom, 1) != Success)) { 729818534a1Smrg return NULL; 730818534a1Smrg } 731818534a1Smrg color = &geom->colors[geom->num_colors]; 732818534a1Smrg color->pixel = pixel; 733818534a1Smrg color->spec = strdup(spec); 7341ab64890Smrg if (!color->spec) 735818534a1Smrg return NULL; 7361ab64890Smrg geom->num_colors++; 7371ab64890Smrg return color; 7381ab64890Smrg} 7391ab64890Smrg 7401ab64890SmrgXkbOutlinePtr 741818534a1SmrgXkbAddGeomOutline(XkbShapePtr shape, int sz_points) 7421ab64890Smrg{ 743818534a1Smrg XkbOutlinePtr outline; 7441ab64890Smrg 745818534a1Smrg if ((!shape) || (sz_points < 0)) 746818534a1Smrg return NULL; 747818534a1Smrg if ((shape->num_outlines >= shape->sz_outlines) && 748818534a1Smrg (_XkbAllocOutlines(shape, 1) != Success)) { 749818534a1Smrg return NULL; 7501ab64890Smrg } 751818534a1Smrg outline = &shape->outlines[shape->num_outlines]; 752818534a1Smrg bzero(outline, sizeof(XkbOutlineRec)); 753818534a1Smrg if ((sz_points > 0) && (_XkbAllocPoints(outline, sz_points) != Success)) 754818534a1Smrg return NULL; 7551ab64890Smrg shape->num_outlines++; 7561ab64890Smrg return outline; 7571ab64890Smrg} 7581ab64890Smrg 7591ab64890SmrgXkbShapePtr 760818534a1SmrgXkbAddGeomShape(XkbGeometryPtr geom, Atom name, int sz_outlines) 761818534a1Smrg{ 762818534a1Smrg XkbShapePtr shape; 763818534a1Smrg register int i; 764818534a1Smrg 765818534a1Smrg if ((!geom) || (!name) || (sz_outlines < 0)) 766818534a1Smrg return NULL; 767818534a1Smrg if (geom->num_shapes > 0) { 768818534a1Smrg for (shape = geom->shapes, i = 0; i < geom->num_shapes; i++, shape++) { 769818534a1Smrg if (name == shape->name) 770818534a1Smrg return shape; 771818534a1Smrg } 772818534a1Smrg } 773818534a1Smrg if ((geom->num_shapes >= geom->sz_shapes) && 774818534a1Smrg (_XkbAllocShapes(geom, 1) != Success)) 775818534a1Smrg return NULL; 776818534a1Smrg shape = &geom->shapes[geom->num_shapes]; 777818534a1Smrg bzero(shape, sizeof(XkbShapeRec)); 778818534a1Smrg if ((sz_outlines > 0) && (_XkbAllocOutlines(shape, sz_outlines) != Success)) 779818534a1Smrg return NULL; 780818534a1Smrg shape->name = name; 781818534a1Smrg shape->primary = shape->approx = NULL; 7821ab64890Smrg geom->num_shapes++; 7831ab64890Smrg return shape; 7841ab64890Smrg} 7851ab64890Smrg 7861ab64890SmrgXkbKeyPtr 7871ab64890SmrgXkbAddGeomKey(XkbRowPtr row) 7881ab64890Smrg{ 789818534a1Smrg XkbKeyPtr key; 790818534a1Smrg 7911ab64890Smrg if (!row) 792818534a1Smrg return NULL; 793818534a1Smrg if ((row->num_keys >= row->sz_keys) && (_XkbAllocKeys(row, 1) != Success)) 794818534a1Smrg return NULL; 795818534a1Smrg key = &row->keys[row->num_keys++]; 796818534a1Smrg bzero(key, sizeof(XkbKeyRec)); 7971ab64890Smrg return key; 7981ab64890Smrg} 7991ab64890Smrg 8001ab64890SmrgXkbRowPtr 801818534a1SmrgXkbAddGeomRow(XkbSectionPtr section, int sz_keys) 802818534a1Smrg{ 803818534a1Smrg XkbRowPtr row; 804818534a1Smrg 805818534a1Smrg if ((!section) || (sz_keys < 0)) 806818534a1Smrg return NULL; 807818534a1Smrg if ((section->num_rows >= section->sz_rows) && 808818534a1Smrg (_XkbAllocRows(section, 1) != Success)) 809818534a1Smrg return NULL; 810818534a1Smrg row = §ion->rows[section->num_rows]; 811818534a1Smrg bzero(row, sizeof(XkbRowRec)); 812818534a1Smrg if ((sz_keys > 0) && (_XkbAllocKeys(row, sz_keys) != Success)) 813818534a1Smrg return NULL; 8141ab64890Smrg section->num_rows++; 8151ab64890Smrg return row; 8161ab64890Smrg} 8171ab64890Smrg 8181ab64890SmrgXkbSectionPtr 819818534a1SmrgXkbAddGeomSection(XkbGeometryPtr geom, 820818534a1Smrg Atom name, 821818534a1Smrg int sz_rows, 822818534a1Smrg int sz_doodads, 823818534a1Smrg int sz_over) 824818534a1Smrg{ 825818534a1Smrg register int i; 826818534a1Smrg XkbSectionPtr section; 827818534a1Smrg 828818534a1Smrg if ((!geom) || (name == None) || (sz_rows < 0)) 829818534a1Smrg return NULL; 830818534a1Smrg for (i = 0, section = geom->sections; i < geom->num_sections; 831818534a1Smrg i++, section++) { 832818534a1Smrg if (section->name != name) 833818534a1Smrg continue; 834818534a1Smrg if (((sz_rows > 0) && (_XkbAllocRows(section, sz_rows) != Success)) || 835818534a1Smrg ((sz_doodads > 0) && 836818534a1Smrg (_XkbAllocDoodads(section, sz_doodads) != Success)) || 837818534a1Smrg ((sz_over > 0) && (_XkbAllocOverlays(section, sz_over) != Success))) 838818534a1Smrg return NULL; 839818534a1Smrg return section; 840818534a1Smrg } 841818534a1Smrg if ((geom->num_sections >= geom->sz_sections) && 842818534a1Smrg (_XkbAllocSections(geom, 1) != Success)) 843818534a1Smrg return NULL; 844818534a1Smrg section = &geom->sections[geom->num_sections]; 845818534a1Smrg if ((sz_rows > 0) && (_XkbAllocRows(section, sz_rows) != Success)) 846818534a1Smrg return NULL; 847818534a1Smrg if ((sz_doodads > 0) && (_XkbAllocDoodads(section, sz_doodads) != Success)) { 848818534a1Smrg if (section->rows) { 849818534a1Smrg _XkbFree(section->rows); 850818534a1Smrg section->rows = NULL; 851818534a1Smrg section->sz_rows = section->num_rows = 0; 852818534a1Smrg } 853818534a1Smrg return NULL; 854818534a1Smrg } 855818534a1Smrg section->name = name; 8561ab64890Smrg geom->num_sections++; 8571ab64890Smrg return section; 8581ab64890Smrg} 8591ab64890Smrg 8601ab64890SmrgXkbDoodadPtr 861818534a1SmrgXkbAddGeomDoodad(XkbGeometryPtr geom, XkbSectionPtr section, Atom name) 8621ab64890Smrg{ 863818534a1Smrg XkbDoodadPtr old, doodad; 864818534a1Smrg register int i, nDoodads; 8651ab64890Smrg 866818534a1Smrg if ((!geom) || (name == None)) 867818534a1Smrg return NULL; 868818534a1Smrg if ((section != NULL) && (section->num_doodads > 0)) { 869818534a1Smrg old = section->doodads; 870818534a1Smrg nDoodads = section->num_doodads; 8711ab64890Smrg } 8721ab64890Smrg else { 873818534a1Smrg old = geom->doodads; 874818534a1Smrg nDoodads = geom->num_doodads; 8751ab64890Smrg } 876818534a1Smrg for (i = 0, doodad = old; i < nDoodads; i++, doodad++) { 877818534a1Smrg if (doodad->any.name == name) 878818534a1Smrg return doodad; 8791ab64890Smrg } 8801ab64890Smrg if (section) { 881818534a1Smrg if ((section->num_doodads >= geom->sz_doodads) && 882818534a1Smrg (_XkbAllocDoodads(section, 1) != Success)) { 883818534a1Smrg return NULL; 884818534a1Smrg } 885818534a1Smrg doodad = §ion->doodads[section->num_doodads++]; 8861ab64890Smrg } 8871ab64890Smrg else { 888818534a1Smrg if ((geom->num_doodads >= geom->sz_doodads) && 889818534a1Smrg (_XkbAllocDoodads(geom, 1) != Success)) 890818534a1Smrg return NULL; 891818534a1Smrg doodad = &geom->doodads[geom->num_doodads++]; 8921ab64890Smrg } 893818534a1Smrg bzero(doodad, sizeof(XkbDoodadRec)); 894818534a1Smrg doodad->any.name = name; 8951ab64890Smrg return doodad; 8961ab64890Smrg} 8971ab64890Smrg 8981ab64890SmrgXkbOverlayKeyPtr 899818534a1SmrgXkbAddGeomOverlayKey(XkbOverlayPtr overlay, 900818534a1Smrg XkbOverlayRowPtr row, 901818534a1Smrg char *over, 902818534a1Smrg char *under) 903818534a1Smrg{ 904818534a1Smrg register int i; 905818534a1Smrg XkbOverlayKeyPtr key; 906818534a1Smrg XkbSectionPtr section; 907818534a1Smrg XkbRowPtr row_under; 908818534a1Smrg Bool found; 909818534a1Smrg 910818534a1Smrg if ((!overlay) || (!row) || (!over) || (!under)) 911818534a1Smrg return NULL; 912818534a1Smrg section = overlay->section_under; 913818534a1Smrg if (row->row_under >= section->num_rows) 914818534a1Smrg return NULL; 915818534a1Smrg row_under = §ion->rows[row->row_under]; 916818534a1Smrg for (i = 0, found = False; i < row_under->num_keys; i++) { 917818534a1Smrg if (strncmp(under, row_under->keys[i].name.name, XkbKeyNameLength) == 0) { 918818534a1Smrg found = True; 919818534a1Smrg break; 920818534a1Smrg } 9211ab64890Smrg } 9221ab64890Smrg if (!found) 923818534a1Smrg return NULL; 924818534a1Smrg if ((row->num_keys >= row->sz_keys) && 925818534a1Smrg (_XkbAllocOverlayKeys(row, 1) != Success)) 926818534a1Smrg return NULL; 927818534a1Smrg key = &row->keys[row->num_keys]; 928818534a1Smrg strncpy(key->under.name, under, XkbKeyNameLength); 929818534a1Smrg strncpy(key->over.name, over, XkbKeyNameLength); 9301ab64890Smrg row->num_keys++; 9311ab64890Smrg return key; 9321ab64890Smrg} 9331ab64890Smrg 9341ab64890SmrgXkbOverlayRowPtr 935818534a1SmrgXkbAddGeomOverlayRow(XkbOverlayPtr overlay, int row_under, int sz_keys) 936818534a1Smrg{ 937818534a1Smrg register int i; 938818534a1Smrg XkbOverlayRowPtr row; 939818534a1Smrg 940818534a1Smrg if ((!overlay) || (sz_keys < 0)) 941818534a1Smrg return NULL; 942818534a1Smrg if (row_under >= overlay->section_under->num_rows) 943818534a1Smrg return NULL; 944818534a1Smrg for (i = 0; i < overlay->num_rows; i++) { 945818534a1Smrg if (overlay->rows[i].row_under == row_under) { 946818534a1Smrg row = &overlay->rows[i]; 947818534a1Smrg if ((row->sz_keys < sz_keys) && 948818534a1Smrg (_XkbAllocOverlayKeys(row, sz_keys) != Success)) { 949818534a1Smrg return NULL; 950818534a1Smrg } 951818534a1Smrg return &overlay->rows[i]; 952818534a1Smrg } 953818534a1Smrg } 954818534a1Smrg if ((overlay->num_rows >= overlay->sz_rows) && 955818534a1Smrg (_XkbAllocOverlayRows(overlay, 1) != Success)) 956818534a1Smrg return NULL; 957818534a1Smrg row = &overlay->rows[overlay->num_rows]; 958818534a1Smrg bzero(row, sizeof(XkbOverlayRowRec)); 959818534a1Smrg if ((sz_keys > 0) && (_XkbAllocOverlayKeys(row, sz_keys) != Success)) 960818534a1Smrg return NULL; 961818534a1Smrg row->row_under = row_under; 9621ab64890Smrg overlay->num_rows++; 9631ab64890Smrg return row; 9641ab64890Smrg} 9651ab64890Smrg 9661ab64890SmrgXkbOverlayPtr 967818534a1SmrgXkbAddGeomOverlay(XkbSectionPtr section, Atom name, int sz_rows) 968818534a1Smrg{ 969818534a1Smrg register int i; 970818534a1Smrg XkbOverlayPtr overlay; 971818534a1Smrg 972818534a1Smrg if ((!section) || (name == None) || (sz_rows == 0)) 973818534a1Smrg return NULL; 974818534a1Smrg 975818534a1Smrg for (i = 0, overlay = section->overlays; i < section->num_overlays; 976818534a1Smrg i++, overlay++) { 977818534a1Smrg if (overlay->name == name) { 978818534a1Smrg if ((sz_rows > 0) && 979818534a1Smrg (_XkbAllocOverlayRows(overlay, sz_rows) != Success)) 980818534a1Smrg return NULL; 981818534a1Smrg return overlay; 982818534a1Smrg } 983818534a1Smrg } 984818534a1Smrg if ((section->num_overlays >= section->sz_overlays) && 985818534a1Smrg (_XkbAllocOverlays(section, 1) != Success)) 986818534a1Smrg return NULL; 987818534a1Smrg overlay = §ion->overlays[section->num_overlays]; 988818534a1Smrg if ((sz_rows > 0) && (_XkbAllocOverlayRows(overlay, sz_rows) != Success)) 989818534a1Smrg return NULL; 990818534a1Smrg overlay->name = name; 991818534a1Smrg overlay->section_under = section; 9921ab64890Smrg section->num_overlays++; 9931ab64890Smrg return overlay; 9941ab64890Smrg} 995