static void _XkbInitAtoms(void) { tableLength = InitialTableSize; nodeTable = (NodePtr *) _XkbAlloc(InitialTableSize * sizeof(NodePtr)); nodeTable[None] = (NodePtr) NULL; }
XkbColorPtr XkbAddGeomColor(XkbGeometryPtr geom,char *spec,unsigned int pixel) { register int i; register XkbColorPtr color; if ((!geom)||(!spec)) return NULL; for (i=0,color=geom->colors;i<geom->num_colors;i++,color++) { if ((color->spec)&&(strcmp(color->spec,spec)==0)) { color->pixel= pixel; return color; } } if ((geom->num_colors>=geom->sz_colors)&& (_XkbAllocColors(geom,1)!=Success)) { return NULL; } color= &geom->colors[geom->num_colors]; color->pixel= pixel; color->spec= (char *)_XkbAlloc(strlen(spec)+1); if (!color->spec) return NULL; strcpy(color->spec,spec); geom->num_colors++; return color; }
XkbPropertyPtr XkbAddGeomProperty(XkbGeometryPtr geom,char *name,char *value) { register int i; register XkbPropertyPtr prop; if ((!geom)||(!name)||(!value)) return NULL; for (i=0,prop=geom->properties;i<geom->num_properties;i++,prop++) { if ((prop->name)&&(strcmp(name,prop->name)==0)) { if (prop->value) _XkbFree(prop->value); prop->value= (char *)_XkbAlloc(strlen(value)+1); if (prop->value) strcpy(prop->value,value); return prop; } } if ((geom->num_properties>=geom->sz_properties)&& (_XkbAllocProps(geom,1)!=Success)) { return NULL; } prop= &geom->properties[geom->num_properties]; prop->name= (char *)_XkbAlloc(strlen(name)+1); if (!name) return NULL; strcpy(prop->name,name); prop->value= (char *)_XkbAlloc(strlen(value)+1); if (!value) { _XkbFree(prop->name); prop->name= NULL; return NULL; } strcpy(prop->value,value); geom->num_properties++; return prop; }
static int InputLineAddChar(InputLine *line,int ch) { if (line->num_line>=line->sz_line) { if (line->line==line->buf) { line->line= (char *)_XkbAlloc(line->sz_line*2); memcpy(line->line,line->buf,line->sz_line); } else { line->line=(char *)_XkbRealloc((char *)line->line,line->sz_line*2); } line->sz_line*= 2; } line->line[line->num_line++]= ch; return ch; }
char * _XkbGetCharset(void) { /* * PAGE USAGE TUNING: explicitly initialize to move these to data * instead of bss */ static char buf[100] = { 0 }; char lang[256]; char *start,*tmp,*end,*next,*set; char *country,*charset; char *locale; tmp = getenv( "_XKB_CHARSET" ); if ( tmp ) return tmp; locale = setlocale(LC_CTYPE,NULL); if ( locale == NULL ) return NULL; if (strlen(locale) >= sizeof(lang)) return NULL; for (tmp = lang; *tmp = *locale++; tmp++) { if (isupper(*tmp)) *tmp = tolower(*tmp); } country = strchr( lang, '_'); if ( country ) { *country++ = '\0'; charset = strchr( country, '.' ); if ( charset ) *charset++ = '\0'; if ( charset ) { strncpy(buf,charset,99); buf[99] = '\0'; return buf; } } else { charset = NULL; } if ((tmp = getenv("_XKB_LOCALE_CHARSETS"))!=NULL) { start = _XkbAlloc(strlen(tmp) + 1); strcpy(start, tmp); tmp = start; } else { struct stat sbuf; FILE *file; #ifndef __UNIXOS2__ char *cf = CHARSET_FILE; #else char *cf = __XOS2RedirRoot(CHARSET_FILE); #endif #ifndef S_ISREG # define S_ISREG(mode) (((mode) & S_IFMT) == S_IFREG) #endif if ( (stat(cf,&sbuf)==0) && S_ISREG(sbuf.st_mode) && (file = fopen(cf,"r")) ) { tmp = _XkbAlloc(sbuf.st_size+1); if (tmp!=NULL) { sbuf.st_size = (long)fread(tmp,1,sbuf.st_size,file); tmp[sbuf.st_size] = '\0'; } fclose(file); } } if ( tmp == NULL ) { tmp = _XkbAlloc(strlen(_XkbKnownLanguages) + 1); if (!tmp) return NULL; strcpy(tmp, _XkbKnownLanguages); } start = tmp; do { if ( (set=strchr(tmp,'=')) == NULL ) break; *set++ = '\0'; if ( (next=strchr(set,':')) != NULL ) *next++ = '\0'; while ( tmp && *tmp ) { if ( (end=strchr(tmp,',')) != NULL ) *end++ = '\0'; if ( Strcmp( tmp, lang ) == 0 ) { strncpy(buf,set,100); buf[99] = '\0'; Xfree(start); return buf; } tmp = end; } tmp = next; } while ( tmp && *tmp ); Xfree(start); return NULL; }
static Atom _XkbMakeAtom(const char *string, unsigned len, Bool makeit) { register NodePtr *np; unsigned i; int comp; register unsigned int fp = 0; np = &atomRoot; for (i = 0; i < (len + 1) / 2; i++) { fp = fp * 27 + string[i]; fp = fp * 27 + string[len - 1 - i]; } while (*np != (NodePtr) NULL) { if (fp < (*np)->fingerPrint) np = &((*np)->left); else if (fp > (*np)->fingerPrint) np = &((*np)->right); else { /* now start testing the strings */ comp = strncmp(string, (*np)->string, (int) len); if ((comp < 0) || ((comp == 0) && (len < strlen((*np)->string)))) np = &((*np)->left); else if (comp > 0) np = &((*np)->right); else return (*np)->a; } } if (makeit) { register NodePtr nd; nd = (NodePtr) _XkbAlloc(sizeof(NodeRec)); if (!nd) return BAD_RESOURCE; nd->string = (char *) _XkbAlloc(len + 1); if (!nd->string) { _XkbFree(nd); return BAD_RESOURCE; } strncpy(nd->string, string, (int) len); nd->string[len] = 0; if ((lastAtom + 1) >= tableLength) { NodePtr *table; table = (NodePtr *) _XkbRealloc(nodeTable, tableLength * (2 * sizeof(NodePtr))); if (!table) { if (nd->string != string) _XkbFree(nd->string); _XkbFree(nd); return BAD_RESOURCE; } tableLength <<= 1; nodeTable = table; } *np = nd; nd->left = nd->right = (NodePtr) NULL; nd->fingerPrint = fp; nd->a = (++lastAtom); *(nodeTable + lastAtom) = nd; return nd->a; } else return None; }
static char * XkbRF_SubstituteVars(char *name, XkbRF_MultiDefsPtr mdefs) { char *str, *outstr, *orig, *var; int len, ndx; orig= name; str= index(name,'%'); if (str==NULL) return name; len= strlen(name); while (str!=NULL) { char pfx= str[1]; int extra_len= 0; if ((pfx=='+')||(pfx=='|')||(pfx=='_')||(pfx=='-')) { extra_len= 1; str++; } else if (pfx=='(') { extra_len= 2; str++; } var = str + 1; str = get_index(var + 1, &ndx); if (ndx == -1) { str = index(str,'%'); continue; } if ((*var=='l') && mdefs->layout[ndx] && *mdefs->layout[ndx]) len+= strlen(mdefs->layout[ndx])+extra_len; else if ((*var=='m')&&mdefs->model) len+= strlen(mdefs->model)+extra_len; else if ((*var=='v') && mdefs->variant[ndx] && *mdefs->variant[ndx]) len+= strlen(mdefs->variant[ndx])+extra_len; if ((pfx=='(')&&(*str==')')) { str++; } str= index(&str[0],'%'); } name= (char *)_XkbAlloc(len+1); str= orig; outstr= name; while (*str!='\0') { if (str[0]=='%') { char pfx,sfx; str++; pfx= str[0]; sfx= '\0'; if ((pfx=='+')||(pfx=='|')||(pfx=='_')||(pfx=='-')) { str++; } else if (pfx=='(') { sfx= ')'; str++; } else pfx= '\0'; var = str; str = get_index(var + 1, &ndx); if (ndx == -1) { continue; } if ((*var=='l') && mdefs->layout[ndx] && *mdefs->layout[ndx]) { if (pfx) *outstr++= pfx; strcpy(outstr,mdefs->layout[ndx]); outstr+= strlen(mdefs->layout[ndx]); if (sfx) *outstr++= sfx; } else if ((*var=='m')&&(mdefs->model)) { if (pfx) *outstr++= pfx; strcpy(outstr,mdefs->model); outstr+= strlen(mdefs->model); if (sfx) *outstr++= sfx; } else if ((*var=='v') && mdefs->variant[ndx] && *mdefs->variant[ndx]) { if (pfx) *outstr++= pfx; strcpy(outstr,mdefs->variant[ndx]); outstr+= strlen(mdefs->variant[ndx]); if (sfx) *outstr++= sfx; } if ((pfx=='(')&&(*str==')')) str++; } else { *outstr++= *str++; } } *outstr++= '\0'; if (orig!=name) _XkbFree(orig); return name; }