File: | xkmread.c |
Location: | line 1216, column 6 |
Description: | Function call argument is an uninitialized value |
1 | /************************************************************ | ||||
2 | Copyright (c) 1994 by Silicon Graphics Computer Systems, Inc. | ||||
3 | |||||
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. | ||||
15 | |||||
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. | ||||
24 | |||||
25 | ********************************************************/ | ||||
26 | |||||
27 | #ifdef HAVE_DIX_CONFIG_H | ||||
28 | #include <dix-config.h> | ||||
29 | #elif defined(HAVE_CONFIG_H1) | ||||
30 | #include <config.h> | ||||
31 | #endif | ||||
32 | |||||
33 | #include <stdio.h> | ||||
34 | |||||
35 | #include <X11/Xos.h> | ||||
36 | #include <X11/Xfuncs.h> | ||||
37 | |||||
38 | #ifndef XKB_IN_SERVER | ||||
39 | |||||
40 | #include <stdlib.h> | ||||
41 | #include <X11/Xlib.h> | ||||
42 | #include <X11/keysym.h> | ||||
43 | |||||
44 | #include <X11/XKBlib.h> | ||||
45 | |||||
46 | #include <X11/extensions/XKBgeom.h> | ||||
47 | #include "XKMformat.h" | ||||
48 | #include "XKBfileInt.h" | ||||
49 | |||||
50 | #else | ||||
51 | |||||
52 | #include <X11/X.h> | ||||
53 | #include <X11/Xproto.h> | ||||
54 | #include <X11/keysym.h> | ||||
55 | #include "misc.h" | ||||
56 | #include "inputstr.h" | ||||
57 | #include <X11/extensions/XKBstr.h> | ||||
58 | #define XKBSRV_NEED_FILE_FUNCS | ||||
59 | #include <X11/extensions/XKBsrv.h> | ||||
60 | #include <X11/extensions/XKBgeom.h> | ||||
61 | |||||
62 | Atom | ||||
63 | XkbInternAtom(Display *dpy,char *str,Boolint only_if_exists) | ||||
64 | { | ||||
65 | if (str==NULL((void*)0)) | ||||
66 | return None0L; | ||||
67 | return MakeAtom(str,strlen(str),!only_if_exists); | ||||
68 | } | ||||
69 | |||||
70 | #endif | ||||
71 | |||||
72 | #ifndef SEEK_SET0 | ||||
73 | #define SEEK_SET0 0 | ||||
74 | #endif | ||||
75 | |||||
76 | /***====================================================================***/ | ||||
77 | |||||
78 | static XPointer | ||||
79 | XkmInsureSize(XPointer oldPtr,int oldCount,int *newCountRtrn,int elemSize) | ||||
80 | { | ||||
81 | int newCount= *newCountRtrn; | ||||
82 | |||||
83 | if (oldPtr==NULL((void*)0)) { | ||||
84 | if (newCount==0) | ||||
85 | return NULL((void*)0); | ||||
86 | oldPtr= (XPointer)_XkbCalloc(newCount,elemSize)calloc((newCount),(elemSize)); | ||||
87 | } | ||||
88 | else if (oldCount<newCount) { | ||||
89 | oldPtr= (XPointer)_XkbRealloc(oldPtr,newCount*elemSize)realloc((oldPtr),(newCount*elemSize)); | ||||
90 | if (oldPtr!=NULL((void*)0)) { | ||||
91 | char *tmp= (char *)oldPtr; | ||||
92 | bzero(&tmp[oldCount*elemSize],(newCount-oldCount)*elemSize)memset(&tmp[oldCount*elemSize],0,(newCount-oldCount)*elemSize ); | ||||
93 | } | ||||
94 | } | ||||
95 | else if (newCount<oldCount) { | ||||
96 | *newCountRtrn= oldCount; | ||||
97 | } | ||||
98 | return oldPtr; | ||||
99 | } | ||||
100 | |||||
101 | #define XkmInsureTypedSize(p,o,n,t)((p)=((t *)XkmInsureSize((char *)(p),(o),(n),sizeof(t)))) ((p)=((t *)XkmInsureSize((char *)(p),(o),(n),sizeof(t)))) | ||||
102 | |||||
103 | static CARD8 | ||||
104 | XkmGetCARD8(FILE *file,int *pNRead) | ||||
105 | { | ||||
106 | int tmp; | ||||
107 | tmp= getc(file)_IO_getc (file); | ||||
108 | if (pNRead&&(tmp!=EOF(-1))) | ||||
109 | (*pNRead)+= 1; | ||||
110 | return tmp; | ||||
111 | } | ||||
112 | |||||
113 | static CARD16 | ||||
114 | XkmGetCARD16(FILE *file,int *pNRead) | ||||
115 | { | ||||
116 | CARD16 val; | ||||
117 | |||||
118 | if ((fread(&val,2,1,file)==1)&&(pNRead)) | ||||
119 | (*pNRead)+= 2; | ||||
120 | return val; | ||||
121 | } | ||||
122 | |||||
123 | static CARD32 | ||||
124 | XkmGetCARD32(FILE *file,int *pNRead) | ||||
125 | { | ||||
126 | CARD32 val; | ||||
127 | |||||
128 | if ((fread(&val,4,1,file)==1)&&(pNRead)) | ||||
129 | (*pNRead)+= 4; | ||||
130 | return val; | ||||
131 | } | ||||
132 | |||||
133 | static int | ||||
134 | XkmSkipPadding(FILE *file,unsigned pad) | ||||
135 | { | ||||
136 | register int i,nRead=0; | ||||
137 | |||||
138 | for (i=0;i<pad;i++) { | ||||
139 | if (getc(file)_IO_getc (file)!=EOF(-1)) | ||||
140 | nRead++; | ||||
141 | } | ||||
142 | return nRead; | ||||
143 | } | ||||
144 | |||||
145 | static int | ||||
146 | XkmGetCountedString(FILE *file,char *str,int max_len) | ||||
147 | { | ||||
148 | int count,nRead=0; | ||||
149 | |||||
150 | count= XkmGetCARD16(file,&nRead); | ||||
151 | if (count>0) { | ||||
152 | int tmp; | ||||
153 | if (count>max_len) { | ||||
154 | tmp= fread(str,1,max_len,file); | ||||
155 | while (tmp<count) { | ||||
156 | if ((getc(file)_IO_getc (file))!=EOF(-1)) | ||||
157 | tmp++; | ||||
158 | else break; | ||||
159 | } | ||||
160 | } | ||||
161 | else { | ||||
162 | tmp= fread(str,1,count,file); | ||||
163 | } | ||||
164 | nRead+= tmp; | ||||
165 | } | ||||
166 | if (count>=max_len) str[max_len-1]= '\0'; | ||||
167 | else str[count]= '\0'; | ||||
168 | count= XkbPaddedSize(nRead)((((unsigned int)(nRead)+3) >> 2) << 2)-nRead; | ||||
169 | if (count>0) | ||||
170 | nRead+= XkmSkipPadding(file,count); | ||||
171 | return nRead; | ||||
172 | } | ||||
173 | |||||
174 | /***====================================================================***/ | ||||
175 | |||||
176 | static int | ||||
177 | ReadXkmVirtualMods(FILE *file,XkbFileInfo *result,XkbChangesPtr changes) | ||||
178 | { | ||||
179 | register unsigned int i,bit; | ||||
180 | unsigned int bound,named,tmp; | ||||
181 | int nRead=0; | ||||
182 | XkbDescPtr xkb; | ||||
183 | |||||
184 | xkb= result->xkb; | ||||
185 | if (XkbAllocServerMap(xkb,XkbVirtualModsMask(1<<6),0)!=Success0) { | ||||
186 | _XkbLibError(_XkbErrBadAlloc,"ReadXkmVirtualMods",0){ _XkbErrCode= (23); _XkbErrLocation= ("ReadXkmVirtualMods"); _XkbErrData= (0); }; | ||||
187 | return -1; | ||||
188 | } | ||||
189 | bound= XkmGetCARD16(file,&nRead); | ||||
190 | named= XkmGetCARD16(file,&nRead); | ||||
191 | for (i=tmp=0,bit=1;i<XkbNumVirtualMods16;i++,bit<<=1) { | ||||
192 | if (bound&bit) { | ||||
193 | xkb->server->vmods[i]= XkmGetCARD8(file,&nRead); | ||||
194 | if (changes) | ||||
195 | changes->map.vmods|= bit; | ||||
196 | tmp++; | ||||
197 | } | ||||
198 | } | ||||
199 | if ((i= XkbPaddedSize(tmp)((((unsigned int)(tmp)+3) >> 2) << 2)-tmp)>0) | ||||
200 | nRead+= XkmSkipPadding(file,i); | ||||
201 | if (XkbAllocNames(xkb,XkbVirtualModNamesMask(1<<11),0,0)!=Success0) { | ||||
202 | _XkbLibError(_XkbErrBadAlloc,"ReadXkmVirtualMods",0){ _XkbErrCode= (23); _XkbErrLocation= ("ReadXkmVirtualMods"); _XkbErrData= (0); }; | ||||
203 | return -1; | ||||
204 | } | ||||
205 | for (i=0,bit=1;i<XkbNumVirtualMods16;i++,bit<<=1) { | ||||
206 | char name[100]; | ||||
207 | if (named&bit) { | ||||
208 | if (nRead+=XkmGetCountedString(file,name,100)) { | ||||
209 | xkb->names->vmods[i]= XkbInternAtom(xkb->dpy,name,False0); | ||||
210 | if (changes) | ||||
211 | changes->names.changed_vmods|= bit; | ||||
212 | } | ||||
213 | } | ||||
214 | } | ||||
215 | return nRead; | ||||
216 | } | ||||
217 | |||||
218 | /***====================================================================***/ | ||||
219 | |||||
220 | static int | ||||
221 | ReadXkmKeycodes(FILE *file,XkbFileInfo *result,XkbChangesPtr changes) | ||||
222 | { | ||||
223 | register int i; | ||||
224 | unsigned minKC,maxKC,nAl; | ||||
225 | int nRead=0; | ||||
226 | char name[100]; | ||||
227 | XkbKeyNamePtr pN; | ||||
228 | XkbDescPtr xkb; | ||||
229 | |||||
230 | xkb= result->xkb; | ||||
231 | name[0]= '\0'; | ||||
232 | nRead+= XkmGetCountedString(file,name,100); | ||||
233 | minKC= XkmGetCARD8(file,&nRead); | ||||
234 | maxKC= XkmGetCARD8(file,&nRead); | ||||
235 | if (xkb->min_key_code==0) { | ||||
236 | xkb->min_key_code= minKC; | ||||
237 | xkb->max_key_code= maxKC; | ||||
238 | } | ||||
239 | else { | ||||
240 | if (minKC<xkb->min_key_code) | ||||
241 | xkb->min_key_code= minKC; | ||||
242 | if (maxKC>xkb->max_key_code) { | ||||
243 | _XkbLibError(_XkbErrBadValue,"ReadXkmKeycodes",maxKC){ _XkbErrCode= (16); _XkbErrLocation= ("ReadXkmKeycodes"); _XkbErrData = (maxKC); }; | ||||
244 | return -1; | ||||
245 | } | ||||
246 | } | ||||
247 | nAl= XkmGetCARD8(file,&nRead); | ||||
248 | nRead+= XkmSkipPadding(file,1); | ||||
249 | |||||
250 | #define WANTED((1<<0)|(1<<9)|(1<<10)) (XkbKeycodesNameMask(1<<0)|XkbKeyNamesMask(1<<9)|XkbKeyAliasesMask(1<<10)) | ||||
251 | if (XkbAllocNames(xkb,WANTED((1<<0)|(1<<9)|(1<<10)),0,nAl)!=Success0) { | ||||
252 | _XkbLibError(_XkbErrBadAlloc,"ReadXkmKeycodes",0){ _XkbErrCode= (23); _XkbErrLocation= ("ReadXkmKeycodes"); _XkbErrData = (0); }; | ||||
253 | return -1; | ||||
254 | } | ||||
255 | if (name[0]!='\0') { | ||||
256 | xkb->names->keycodes= XkbInternAtom(xkb->dpy,name,False0); | ||||
257 | } | ||||
258 | |||||
259 | for (pN=&xkb->names->keys[minKC],i=minKC;i<=(int)maxKC;i++,pN++) { | ||||
260 | if (fread(pN,1,XkbKeyNameLength4,file)!=XkbKeyNameLength4) { | ||||
261 | _XkbLibError(_XkbErrBadLength,"ReadXkmKeycodes",0){ _XkbErrCode= (24); _XkbErrLocation= ("ReadXkmKeycodes"); _XkbErrData = (0); }; | ||||
262 | return -1; | ||||
263 | } | ||||
264 | nRead+= XkbKeyNameLength4; | ||||
265 | } | ||||
266 | if (nAl>0) { | ||||
267 | XkbKeyAliasPtr pAl; | ||||
268 | for (pAl= xkb->names->key_aliases,i=0;i<nAl;i++,pAl++) { | ||||
269 | int tmp; | ||||
270 | tmp= fread(pAl,1,2*XkbKeyNameLength4,file); | ||||
271 | if (tmp!=2*XkbKeyNameLength4) { | ||||
272 | _XkbLibError(_XkbErrBadLength,"ReadXkmKeycodes",0){ _XkbErrCode= (24); _XkbErrLocation= ("ReadXkmKeycodes"); _XkbErrData = (0); }; | ||||
273 | return -1; | ||||
274 | } | ||||
275 | nRead+= 2*XkbKeyNameLength4; | ||||
276 | } | ||||
277 | if (changes) | ||||
278 | changes->names.changed|= XkbKeyAliasesMask(1<<10); | ||||
279 | } | ||||
280 | if (changes) | ||||
281 | changes->names.changed|= XkbKeyNamesMask(1<<9); | ||||
282 | return nRead; | ||||
283 | } | ||||
284 | |||||
285 | /***====================================================================***/ | ||||
286 | |||||
287 | static int | ||||
288 | ReadXkmKeyTypes(FILE *file,XkbFileInfo *result,XkbChangesPtr changes) | ||||
289 | { | ||||
290 | register unsigned i,n; | ||||
291 | unsigned num_types; | ||||
292 | int nRead=0; | ||||
293 | int tmp; | ||||
294 | XkbKeyTypePtr type; | ||||
295 | xkmKeyTypeDesc wire; | ||||
296 | XkbKTMapEntryPtr entry; | ||||
297 | xkmKTMapEntryDesc wire_entry; | ||||
298 | char buf[100]; | ||||
299 | XkbDescPtr xkb; | ||||
300 | |||||
301 | xkb= result->xkb; | ||||
302 | if ((tmp= XkmGetCountedString(file,buf,100))<1) { | ||||
303 | _XkbLibError(_XkbErrBadLength,"ReadXkmKeyTypes",0){ _XkbErrCode= (24); _XkbErrLocation= ("ReadXkmKeyTypes"); _XkbErrData = (0); }; | ||||
304 | return -1; | ||||
305 | } | ||||
306 | nRead+= tmp; | ||||
307 | if (buf[0]!='\0') { | ||||
308 | if (XkbAllocNames(xkb,XkbTypesNameMask(1<<4),0,0)!=Success0) { | ||||
309 | _XkbLibError(_XkbErrBadAlloc,"ReadXkmKeyTypes",0){ _XkbErrCode= (23); _XkbErrLocation= ("ReadXkmKeyTypes"); _XkbErrData = (0); }; | ||||
310 | return -1; | ||||
311 | } | ||||
312 | xkb->names->types= XkbInternAtom(xkb->dpy,buf,False0); | ||||
313 | } | ||||
314 | num_types= XkmGetCARD16(file,&nRead); | ||||
315 | nRead+= XkmSkipPadding(file,2); | ||||
316 | if (num_types<1) | ||||
317 | return nRead; | ||||
318 | if (XkbAllocClientMap(xkb,XkbKeyTypesMask(1<<0),num_types)!=Success0) { | ||||
319 | _XkbLibError(_XkbErrBadAlloc,"ReadXkmKeyTypes",0){ _XkbErrCode= (23); _XkbErrLocation= ("ReadXkmKeyTypes"); _XkbErrData = (0); }; | ||||
320 | return nRead; | ||||
321 | } | ||||
322 | xkb->map->num_types= num_types; | ||||
323 | if (num_types<XkbNumRequiredTypes(3 +1)) { | ||||
324 | _XkbLibError(_XkbErrMissingReqTypes,"ReadXkmKeyTypes",0){ _XkbErrCode= (3); _XkbErrLocation= ("ReadXkmKeyTypes"); _XkbErrData = (0); }; | ||||
325 | return -1; | ||||
326 | } | ||||
327 | type= xkb->map->types; | ||||
328 | for (i=0;i<num_types;i++,type++) { | ||||
329 | if ((int)fread(&wire,SIZEOF(xkmKeyTypeDesc)8,1,file)<1) { | ||||
330 | _XkbLibError(_XkbErrBadLength,"ReadXkmKeyTypes",0){ _XkbErrCode= (24); _XkbErrLocation= ("ReadXkmKeyTypes"); _XkbErrData = (0); }; | ||||
331 | return -1; | ||||
332 | } | ||||
333 | nRead+= SIZEOF(xkmKeyTypeDesc)8; | ||||
334 | if (((i==XkbOneLevelIndex0)&&(wire.numLevels!=1))|| | ||||
335 | (((i==XkbTwoLevelIndex1)||(i==XkbAlphabeticIndex2)|| | ||||
336 | ((i)==XkbKeypadIndex3))&&(wire.numLevels!=2))) { | ||||
337 | _XkbLibError(_XkbErrBadTypeWidth,"ReadXkmKeyTypes",i){ _XkbErrCode= (19); _XkbErrLocation= ("ReadXkmKeyTypes"); _XkbErrData = (i); }; | ||||
338 | return -1; | ||||
339 | } | ||||
340 | tmp= wire.nMapEntries; | ||||
341 | XkmInsureTypedSize(type->map,type->map_count,&tmp,XkbKTMapEntryRec)((type->map)=((XkbKTMapEntryRec *)XkmInsureSize((char *)(type ->map),(type->map_count),(&tmp),sizeof(XkbKTMapEntryRec )))); | ||||
342 | if ((wire.nMapEntries>0)&&(type->map==NULL((void*)0))) { | ||||
343 | _XkbLibError(_XkbErrBadValue,"ReadXkmKeyTypes",wire.nMapEntries){ _XkbErrCode= (16); _XkbErrLocation= ("ReadXkmKeyTypes"); _XkbErrData = (wire.nMapEntries); }; | ||||
344 | return -1; | ||||
345 | } | ||||
346 | for (n=0,entry= type->map;n<wire.nMapEntries;n++,entry++) { | ||||
347 | if (fread(&wire_entry,SIZEOF(xkmKTMapEntryDesc)4,1,file)<(int)1) { | ||||
348 | _XkbLibError(_XkbErrBadLength,"ReadXkmKeyTypes",0){ _XkbErrCode= (24); _XkbErrLocation= ("ReadXkmKeyTypes"); _XkbErrData = (0); }; | ||||
349 | return -1; | ||||
350 | } | ||||
351 | nRead+= SIZEOF(xkmKTMapEntryDesc)4; | ||||
352 | entry->active= (wire_entry.virtualMods==0); | ||||
353 | entry->level= wire_entry.level; | ||||
354 | entry->mods.mask= wire_entry.realMods; | ||||
355 | entry->mods.real_mods= wire_entry.realMods; | ||||
356 | entry->mods.vmods= wire_entry.virtualMods; | ||||
357 | } | ||||
358 | nRead+= XkmGetCountedString(file,buf,100); | ||||
359 | if (((i==XkbOneLevelIndex0)&&(strcmp(buf,"ONE_LEVEL")!=0))|| | ||||
360 | ((i==XkbTwoLevelIndex1)&&(strcmp(buf,"TWO_LEVEL")!=0))|| | ||||
361 | ((i==XkbAlphabeticIndex2)&&(strcmp(buf,"ALPHABETIC")!=0))|| | ||||
362 | ((i==XkbKeypadIndex3)&&(strcmp(buf,"KEYPAD")!=0))) { | ||||
363 | _XkbLibError(_XkbErrBadTypeName,"ReadXkmKeyTypes",0){ _XkbErrCode= (18); _XkbErrLocation= ("ReadXkmKeyTypes"); _XkbErrData = (0); }; | ||||
364 | return -1; | ||||
365 | } | ||||
366 | if (buf[0]!='\0') { | ||||
367 | type->name= XkbInternAtom(xkb->dpy,buf,False0); | ||||
368 | } | ||||
369 | else type->name= None0L; | ||||
370 | |||||
371 | if (wire.preserve) { | ||||
372 | xkmModsDesc p_entry; | ||||
373 | XkbModsPtr pre; | ||||
374 | XkmInsureTypedSize(type->preserve,type->map_count,&tmp,((type->preserve)=((XkbModsRec *)XkmInsureSize((char *)(type ->preserve),(type->map_count),(&tmp),sizeof(XkbModsRec )))) | ||||
375 | XkbModsRec)((type->preserve)=((XkbModsRec *)XkmInsureSize((char *)(type ->preserve),(type->map_count),(&tmp),sizeof(XkbModsRec )))); | ||||
376 | if (type->preserve==NULL((void*)0)) { | ||||
377 | _XkbLibError(_XkbErrBadMatch,"ReadXkmKeycodes",0){ _XkbErrCode= (17); _XkbErrLocation= ("ReadXkmKeycodes"); _XkbErrData = (0); }; | ||||
378 | return -1; | ||||
379 | } | ||||
380 | for (n=0,pre=type->preserve;n<wire.nMapEntries;n++,pre++) { | ||||
381 | if (fread(&p_entry,SIZEOF(xkmModsDesc)4,1,file)<1) { | ||||
382 | _XkbLibError(_XkbErrBadLength,"ReadXkmKeycodes",0){ _XkbErrCode= (24); _XkbErrLocation= ("ReadXkmKeycodes"); _XkbErrData = (0); }; | ||||
383 | return -1; | ||||
384 | } | ||||
385 | nRead+= SIZEOF(xkmModsDesc)4; | ||||
386 | pre->mask= p_entry.realMods; | ||||
387 | pre->real_mods= p_entry.realMods; | ||||
388 | pre->vmods= p_entry.virtualMods; | ||||
389 | } | ||||
390 | } | ||||
391 | if (wire.nLevelNames>0) { | ||||
392 | int width= wire.numLevels; | ||||
393 | if (wire.nLevelNames>(unsigned)width) { | ||||
394 | _XkbLibError(_XkbErrBadMatch,"ReadXkmKeycodes",0){ _XkbErrCode= (17); _XkbErrLocation= ("ReadXkmKeycodes"); _XkbErrData = (0); }; | ||||
395 | return -1; | ||||
396 | } | ||||
397 | XkmInsureTypedSize(type->level_names,type->num_levels,&width,Atom)((type->level_names)=((Atom *)XkmInsureSize((char *)(type-> level_names),(type->num_levels),(&width),sizeof(Atom)) )); | ||||
398 | if (type->level_names!=NULL((void*)0)) { | ||||
399 | for (n=0;n<wire.nLevelNames;n++) { | ||||
400 | if ((tmp=XkmGetCountedString(file,buf,100))<1) | ||||
401 | return -1; | ||||
402 | nRead+= tmp; | ||||
403 | if (strlen(buf)==0) | ||||
404 | type->level_names[n]= None0L; | ||||
405 | else type->level_names[n]= XkbInternAtom(xkb->dpy,buf,0); | ||||
406 | } | ||||
407 | } | ||||
408 | } | ||||
409 | type->mods.mask= wire.realMods; | ||||
410 | type->mods.real_mods= wire.realMods; | ||||
411 | type->mods.vmods= wire.virtualMods; | ||||
412 | type->num_levels= wire.numLevels; | ||||
413 | type->map_count= wire.nMapEntries; | ||||
414 | } | ||||
415 | if (changes) { | ||||
416 | changes->map.changed|= XkbKeyTypesMask(1<<0); | ||||
417 | changes->map.first_type= 0; | ||||
418 | changes->map.num_types= xkb->map->num_types; | ||||
419 | } | ||||
420 | return nRead; | ||||
421 | } | ||||
422 | |||||
423 | /***====================================================================***/ | ||||
424 | |||||
425 | static int | ||||
426 | ReadXkmCompatMap(FILE *file,XkbFileInfo *result,XkbChangesPtr changes) | ||||
427 | { | ||||
428 | register int i; | ||||
429 | unsigned num_si,groups; | ||||
430 | char name[100]; | ||||
431 | XkbSymInterpretPtr interp; | ||||
432 | xkmSymInterpretDesc wire; | ||||
433 | unsigned tmp; | ||||
434 | int nRead=0; | ||||
435 | XkbDescPtr xkb; | ||||
436 | XkbCompatMapPtr compat; | ||||
437 | |||||
438 | xkb= result->xkb; | ||||
439 | if ((tmp= XkmGetCountedString(file,name,100))<1) { | ||||
440 | _XkbLibError(_XkbErrBadLength,"ReadXkmCompatMap",0){ _XkbErrCode= (24); _XkbErrLocation= ("ReadXkmCompatMap"); _XkbErrData = (0); }; | ||||
441 | return -1; | ||||
442 | } | ||||
443 | nRead+= tmp; | ||||
444 | if (name[0]!='\0') { | ||||
445 | if (XkbAllocNames(xkb,XkbCompatNameMask(1<<5),0,0)!=Success0) { | ||||
446 | _XkbLibError(_XkbErrBadAlloc,"ReadXkmCompatMap",0){ _XkbErrCode= (23); _XkbErrLocation= ("ReadXkmCompatMap"); _XkbErrData = (0); }; | ||||
447 | return -1; | ||||
448 | } | ||||
449 | xkb->names->compat= XkbInternAtom(xkb->dpy,name,False0); | ||||
450 | } | ||||
451 | num_si= XkmGetCARD16(file,&nRead); | ||||
452 | groups= XkmGetCARD8(file,&nRead); | ||||
453 | nRead+= XkmSkipPadding(file,1); | ||||
454 | if (XkbAllocCompatMap(xkb,XkbAllCompatMask(0x3),num_si)!=Success0) | ||||
455 | return -1; | ||||
456 | compat= xkb->compat; | ||||
457 | compat->num_si= num_si; | ||||
458 | interp= compat->sym_interpret; | ||||
459 | for (i=0;i<num_si;i++,interp++) { | ||||
460 | tmp= fread(&wire,SIZEOF(xkmSymInterpretDesc)16,1,file); | ||||
461 | nRead+= tmp*SIZEOF(xkmSymInterpretDesc)16; | ||||
462 | interp->sym= wire.sym; | ||||
463 | interp->mods= wire.mods; | ||||
464 | interp->match= wire.match; | ||||
465 | interp->virtual_mod= wire.virtualMod; | ||||
466 | interp->flags= wire.flags; | ||||
467 | interp->act.type= wire.actionType; | ||||
468 | interp->act.data[0]= wire.actionData[0]; | ||||
469 | interp->act.data[1]= wire.actionData[1]; | ||||
470 | interp->act.data[2]= wire.actionData[2]; | ||||
471 | interp->act.data[3]= wire.actionData[3]; | ||||
472 | interp->act.data[4]= wire.actionData[4]; | ||||
473 | interp->act.data[5]= wire.actionData[5]; | ||||
474 | interp->act.data[6]= wire.actionData[6]; | ||||
475 | } | ||||
476 | if ((num_si>0)&&(changes)) { | ||||
477 | changes->compat.first_si= 0; | ||||
478 | changes->compat.num_si= num_si; | ||||
479 | } | ||||
480 | if (groups) { | ||||
481 | register unsigned bit; | ||||
482 | for (i=0,bit=1;i<XkbNumKbdGroups4;i++,bit<<=1) { | ||||
483 | xkmModsDesc md; | ||||
484 | if (groups&bit) { | ||||
485 | tmp= fread(&md,SIZEOF(xkmModsDesc)4,1,file); | ||||
486 | nRead+= tmp*SIZEOF(xkmModsDesc)4; | ||||
487 | xkb->compat->groups[i].real_mods= md.realMods; | ||||
488 | xkb->compat->groups[i].vmods= md.virtualMods; | ||||
489 | if (md.virtualMods != 0) { | ||||
490 | unsigned mask; | ||||
491 | if (XkbVirtualModsToReal(xkb,md.virtualMods,&mask)) | ||||
492 | xkb->compat->groups[i].mask= md.realMods|mask; | ||||
493 | } | ||||
494 | else xkb->compat->groups[i].mask= md.realMods; | ||||
495 | } | ||||
496 | } | ||||
497 | if (changes) | ||||
498 | changes->compat.changed_groups|= groups; | ||||
499 | } | ||||
500 | return nRead; | ||||
501 | } | ||||
502 | |||||
503 | static int | ||||
504 | ReadXkmIndicators(FILE *file,XkbFileInfo *result,XkbChangesPtr changes) | ||||
505 | { | ||||
506 | register unsigned nLEDs; | ||||
507 | xkmIndicatorMapDesc wire; | ||||
508 | char buf[100]; | ||||
509 | unsigned tmp; | ||||
510 | int nRead=0; | ||||
511 | XkbDescPtr xkb; | ||||
512 | |||||
513 | xkb= result->xkb; | ||||
514 | if ((xkb->indicators==NULL((void*)0))&&(XkbAllocIndicatorMaps(xkb)!=Success0)) { | ||||
515 | _XkbLibError(_XkbErrBadAlloc,"indicator rec",0){ _XkbErrCode= (23); _XkbErrLocation= ("indicator rec"); _XkbErrData = (0); }; | ||||
516 | return -1; | ||||
517 | } | ||||
518 | if (XkbAllocNames(xkb,XkbIndicatorNamesMask(1<<8),0,0)!=Success0) { | ||||
519 | _XkbLibError(_XkbErrBadAlloc,"indicator names",0){ _XkbErrCode= (23); _XkbErrLocation= ("indicator names"); _XkbErrData = (0); }; | ||||
520 | return -1; | ||||
521 | } | ||||
522 | nLEDs= XkmGetCARD8(file,&nRead); | ||||
523 | nRead+= XkmSkipPadding(file,3); | ||||
524 | xkb->indicators->phys_indicators= XkmGetCARD32(file,&nRead); | ||||
525 | while (nLEDs-->0) { | ||||
526 | Atom name; | ||||
527 | XkbIndicatorMapPtr map; | ||||
528 | |||||
529 | if ((tmp=XkmGetCountedString(file,buf,100))<1) { | ||||
530 | _XkbLibError(_XkbErrBadLength,"ReadXkmIndicators",0){ _XkbErrCode= (24); _XkbErrLocation= ("ReadXkmIndicators"); _XkbErrData = (0); }; | ||||
531 | return -1; | ||||
532 | } | ||||
533 | nRead+= tmp; | ||||
534 | if (buf[0]!='\0') | ||||
535 | name= XkbInternAtom(xkb->dpy,buf,False0); | ||||
536 | else name= None0L; | ||||
537 | if ((tmp=fread(&wire,SIZEOF(xkmIndicatorMapDesc)12,1,file))<1) { | ||||
538 | _XkbLibError(_XkbErrBadLength,"ReadXkmIndicators",0){ _XkbErrCode= (24); _XkbErrLocation= ("ReadXkmIndicators"); _XkbErrData = (0); }; | ||||
539 | return -1; | ||||
540 | } | ||||
541 | nRead+= tmp*SIZEOF(xkmIndicatorMapDesc)12; | ||||
542 | if (xkb->names) { | ||||
543 | xkb->names->indicators[wire.indicator-1]= name; | ||||
544 | if (changes) | ||||
545 | changes->names.changed_indicators|= (1<<(wire.indicator-1)); | ||||
546 | } | ||||
547 | map= &xkb->indicators->maps[wire.indicator-1]; | ||||
548 | map->flags= wire.flags; | ||||
549 | map->which_groups= wire.which_groups; | ||||
550 | map->groups= wire.groups; | ||||
551 | map->which_mods= wire.which_mods; | ||||
552 | map->mods.mask= wire.real_mods; | ||||
553 | map->mods.real_mods= wire.real_mods; | ||||
554 | map->mods.vmods= wire.vmods; | ||||
555 | map->ctrls= wire.ctrls; | ||||
556 | } | ||||
557 | return nRead; | ||||
558 | } | ||||
559 | |||||
560 | static XkbKeyTypePtr | ||||
561 | FindTypeForKey(XkbDescPtr xkb,Atom name,unsigned width,KeySym *syms) | ||||
562 | { | ||||
563 | if ((!xkb)||(!xkb->map)) | ||||
564 | return NULL((void*)0); | ||||
565 | if (name!=None0L) { | ||||
566 | register unsigned i; | ||||
567 | for (i=0;i<xkb->map->num_types;i++) { | ||||
568 | if (xkb->map->types[i].name==name) { | ||||
569 | #ifdef DEBUG | ||||
570 | if (xkb->map->types[i].num_levels!=width) | ||||
571 | fprintf(stderrstderr,"Group width mismatch between key and type\n"); | ||||
572 | #endif | ||||
573 | return &xkb->map->types[i]; | ||||
574 | } | ||||
575 | } | ||||
576 | } | ||||
577 | if ((width<2)||((syms!=NULL((void*)0))&&(syms[1]==NoSymbol0L))) | ||||
578 | return &xkb->map->types[XkbOneLevelIndex0]; | ||||
579 | if (syms!=NULL((void*)0)) { | ||||
580 | if (XkbKSIsLower(syms[0])(_XkbKSCheckCase(syms[0])&(1<<0))&&XkbKSIsUpper(syms[1])(_XkbKSCheckCase(syms[1])&(1<<1))) | ||||
581 | return &xkb->map->types[XkbAlphabeticIndex2]; | ||||
582 | else if (XkbKSIsKeypad(syms[0])(((syms[0])>=0xff80)&&((syms[0])<=0xffbd))||XkbKSIsKeypad(syms[1])(((syms[1])>=0xff80)&&((syms[1])<=0xffbd))) | ||||
583 | return &xkb->map->types[XkbKeypadIndex3]; | ||||
584 | } | ||||
585 | return &xkb->map->types[XkbTwoLevelIndex1]; | ||||
586 | } | ||||
587 | |||||
588 | static int | ||||
589 | ReadXkmSymbols(FILE *file,XkbFileInfo *result) | ||||
590 | { | ||||
591 | register int i,g,s,totalVModMaps; | ||||
592 | xkmKeySymMapDesc wireMap; | ||||
593 | char buf[100]; | ||||
594 | unsigned minKC,maxKC,groupNames,tmp; | ||||
595 | int nRead=0; | ||||
596 | XkbDescPtr xkb; | ||||
597 | |||||
598 | xkb= result->xkb; | ||||
599 | if ((tmp=XkmGetCountedString(file,buf,100))<1) | ||||
600 | return -1; | ||||
601 | nRead+= tmp; | ||||
602 | minKC= XkmGetCARD8(file,&nRead); | ||||
603 | maxKC= XkmGetCARD8(file,&nRead); | ||||
604 | groupNames= XkmGetCARD8(file,&nRead); | ||||
605 | totalVModMaps= XkmGetCARD8(file,&nRead); | ||||
606 | if (XkbAllocNames(xkb, | ||||
607 | XkbSymbolsNameMask(1<<2)|XkbPhysSymbolsNameMask(1<<3)|XkbGroupNamesMask(1<<12), | ||||
608 | 0,0)!=Success0) { | ||||
609 | _XkbLibError(_XkbErrBadAlloc,"physical names",0){ _XkbErrCode= (23); _XkbErrLocation= ("physical names"); _XkbErrData = (0); }; | ||||
610 | return -1; | ||||
611 | } | ||||
612 | if ((buf[0]!='\0')&&(xkb->names)) { | ||||
613 | Atom name; | ||||
614 | name= XkbInternAtom(xkb->dpy,buf,0); | ||||
615 | xkb->names->symbols= name; | ||||
616 | xkb->names->phys_symbols= name; | ||||
617 | } | ||||
618 | for (i=0,g=1;i<XkbNumKbdGroups4;i++,g<<=1) { | ||||
619 | if (groupNames&g) { | ||||
620 | if ((tmp=XkmGetCountedString(file,buf,100))<1) | ||||
621 | return -1; | ||||
622 | nRead+= tmp; | ||||
623 | if ((buf[0]!='\0')&&(xkb->names)) { | ||||
624 | Atom name; | ||||
625 | name= XkbInternAtom(xkb->dpy,buf,0); | ||||
626 | xkb->names->groups[i]= name; | ||||
627 | } | ||||
628 | else xkb->names->groups[i]= None0L; | ||||
629 | } | ||||
630 | } | ||||
631 | if (XkbAllocServerMap(xkb,XkbAllServerInfoMask((1<<3)|(1<<4)|(1<<5)|(1<<6)|(1<< 7)),0)!=Success0) { | ||||
632 | _XkbLibError(_XkbErrBadAlloc,"server map",0){ _XkbErrCode= (23); _XkbErrLocation= ("server map"); _XkbErrData = (0); }; | ||||
633 | return -1; | ||||
634 | } | ||||
635 | if (XkbAllocClientMap(xkb,XkbAllClientInfoMask((1<<0)|(1<<1)|(1<<2)),0)!=Success0) { | ||||
636 | _XkbLibError(_XkbErrBadAlloc,"client map",0){ _XkbErrCode= (23); _XkbErrLocation= ("client map"); _XkbErrData = (0); }; | ||||
637 | return -1; | ||||
638 | } | ||||
639 | if (XkbAllocControls(xkb,XkbAllControlsMask(0xF8001FFF))!=Success0) { | ||||
640 | _XkbLibError(_XkbErrBadAlloc,"controls",0){ _XkbErrCode= (23); _XkbErrLocation= ("controls"); _XkbErrData = (0); }; | ||||
641 | return -1; | ||||
642 | } | ||||
643 | if ((xkb->map==NULL((void*)0))||(xkb->server==NULL((void*)0))) | ||||
644 | return -1; | ||||
645 | if (xkb->min_key_code<8) xkb->min_key_code= minKC; | ||||
646 | if (xkb->max_key_code<8) xkb->max_key_code= maxKC; | ||||
647 | if ((minKC>=8)&&(minKC<xkb->min_key_code)) | ||||
648 | xkb->min_key_code= minKC; | ||||
649 | if ((maxKC>=8)&&(maxKC>xkb->max_key_code)) { | ||||
650 | _XkbLibError(_XkbErrBadValue,"keys in symbol map",maxKC){ _XkbErrCode= (16); _XkbErrLocation= ("keys in symbol map"); _XkbErrData= (maxKC); }; | ||||
651 | return -1; | ||||
652 | } | ||||
653 | for (i=minKC;i<=(int)maxKC;i++) { | ||||
654 | Atom typeName[XkbNumKbdGroups4]; | ||||
655 | XkbKeyTypePtr type[XkbNumKbdGroups4]; | ||||
656 | if ((tmp=fread(&wireMap,SIZEOF(xkmKeySymMapDesc)4,1,file))<1) { | ||||
657 | _XkbLibError(_XkbErrBadLength,"ReadXkmSymbols",0){ _XkbErrCode= (24); _XkbErrLocation= ("ReadXkmSymbols"); _XkbErrData = (0); }; | ||||
658 | return -1; | ||||
659 | } | ||||
660 | nRead+= tmp*SIZEOF(xkmKeySymMapDesc)4; | ||||
661 | bzero((char *)typeName,XkbNumKbdGroups*sizeof(Atom))memset((char *)typeName,0,4*sizeof(Atom)); | ||||
662 | bzero((char *)type,XkbNumKbdGroups*sizeof(XkbKeyTypePtr))memset((char *)type,0,4*sizeof(XkbKeyTypePtr)); | ||||
663 | if (wireMap.flags&XkmKeyHasTypes(0x0f)) { | ||||
664 | register int g; | ||||
665 | for (g=0;g<XkbNumKbdGroups4;g++) { | ||||
666 | if ((wireMap.flags&(1<<g))&& | ||||
667 | ((tmp=XkmGetCountedString(file,buf,100))>0)) { | ||||
668 | typeName[g]= XkbInternAtom(xkb->dpy,buf,1); | ||||
669 | nRead+= tmp; | ||||
670 | } | ||||
671 | type[g]=FindTypeForKey(xkb,typeName[g],wireMap.width,NULL((void*)0)); | ||||
672 | if (type[g]==NULL((void*)0)) { | ||||
673 | _XkbLibError(_XkbErrMissingTypes,"ReadXkmSymbols",0){ _XkbErrCode= (2); _XkbErrLocation= ("ReadXkmSymbols"); _XkbErrData = (0); }; | ||||
674 | return -1; | ||||
675 | } | ||||
676 | if (typeName[g]==type[g]->name) | ||||
677 | xkb->server->explicit[i]|= (1<<g); | ||||
678 | } | ||||
679 | } | ||||
680 | if (wireMap.flags&XkmRepeatingKey(1<<6)) { | ||||
681 | xkb->ctrls->per_key_repeat[i/8]|= (1<<(i%8)); | ||||
682 | xkb->server->explicit[i]|= XkbExplicitAutoRepeatMask(1<<5); | ||||
683 | } | ||||
684 | else if (wireMap.flags&XkmNonRepeatingKey(1<<7)) { | ||||
685 | xkb->ctrls->per_key_repeat[i/8]&= ~(1<<(i%8)); | ||||
686 | xkb->server->explicit[i]|= XkbExplicitAutoRepeatMask(1<<5); | ||||
687 | } | ||||
688 | xkb->map->modmap[i]= wireMap.modifier_map; | ||||
689 | if (XkbNumGroups(wireMap.num_groups)((wireMap.num_groups)&0x0f)>0) { | ||||
690 | KeySym *sym; | ||||
691 | int nSyms; | ||||
692 | |||||
693 | if (XkbNumGroups(wireMap.num_groups)((wireMap.num_groups)&0x0f)>xkb->ctrls->num_groups) | ||||
694 | xkb->ctrls->num_groups= wireMap.num_groups; | ||||
695 | nSyms= XkbNumGroups(wireMap.num_groups)((wireMap.num_groups)&0x0f)*wireMap.width; | ||||
696 | sym= XkbResizeKeySyms(xkb,i,nSyms); | ||||
697 | if (!sym) | ||||
698 | return -1; | ||||
699 | for (s=0;s<nSyms;s++) { | ||||
700 | *sym++= XkmGetCARD32(file,&nRead); | ||||
701 | } | ||||
702 | if (wireMap.flags&XkmKeyHasActions(1<<4)) { | ||||
703 | XkbAction * act; | ||||
704 | act= XkbResizeKeyActions(xkb,i,nSyms); | ||||
705 | for (s=0;s<nSyms;s++,act++) { | ||||
706 | tmp=fread(act,SIZEOF(xkmActionDesc)8,1,file); | ||||
707 | nRead+= tmp*SIZEOF(xkmActionDesc)8; | ||||
708 | } | ||||
709 | xkb->server->explicit[i]|= XkbExplicitInterpretMask(1<<4); | ||||
710 | } | ||||
711 | } | ||||
712 | for (g=0;g<XkbNumGroups(wireMap.num_groups)((wireMap.num_groups)&0x0f);g++) { | ||||
713 | if (((xkb->server->explicit[i]&(1<<g))==0)||(type[g]==NULL((void*)0))) { | ||||
714 | KeySym *tmpSyms; | ||||
715 | tmpSyms= XkbKeySymsPtr(xkb,i)((&((xkb)->map)->syms[(((xkb)->map)->key_sym_map [(i)].offset)]))+(wireMap.width*g); | ||||
716 | type[g]= FindTypeForKey(xkb,None0L,wireMap.width,tmpSyms); | ||||
717 | } | ||||
718 | xkb->map->key_sym_map[i].kt_index[g]= type[g]-(&xkb->map->types[0]); | ||||
719 | } | ||||
720 | xkb->map->key_sym_map[i].group_info= wireMap.num_groups; | ||||
721 | xkb->map->key_sym_map[i].width= wireMap.width; | ||||
722 | if (wireMap.flags&XkmKeyHasBehavior(1<<5)) { | ||||
723 | xkmBehaviorDesc b; | ||||
724 | tmp= fread(&b,SIZEOF(xkmBehaviorDesc)4,1,file); | ||||
725 | nRead+= tmp*SIZEOF(xkmBehaviorDesc)4; | ||||
726 | xkb->server->behaviors[i].type= b.type; | ||||
727 | xkb->server->behaviors[i].data= b.data; | ||||
728 | xkb->server->explicit[i]|= XkbExplicitBehaviorMask(1<<6); | ||||
729 | } | ||||
730 | } | ||||
731 | if (totalVModMaps>0) { | ||||
732 | xkmVModMapDesc v; | ||||
733 | for (i=0;i<totalVModMaps;i++) { | ||||
734 | tmp= fread(&v,SIZEOF(xkmVModMapDesc)4,1,file); | ||||
735 | nRead+= tmp*SIZEOF(xkmVModMapDesc)4; | ||||
736 | if (tmp>0) | ||||
737 | xkb->server->vmodmap[v.key]= v.vmods; | ||||
738 | } | ||||
739 | } | ||||
740 | return nRead; | ||||
741 | } | ||||
742 | |||||
743 | static int | ||||
744 | ReadXkmGeomDoodad( | ||||
745 | FILE * file, | ||||
746 | Display * dpy, | ||||
747 | XkbGeometryPtr geom, | ||||
748 | XkbSectionPtr section) | ||||
749 | { | ||||
750 | XkbDoodadPtr doodad; | ||||
751 | xkmDoodadDesc doodadWire; | ||||
752 | char buf[100]; | ||||
753 | unsigned tmp; | ||||
754 | int nRead=0; | ||||
755 | |||||
756 | nRead+= XkmGetCountedString(file,buf,100); | ||||
757 | tmp= fread(&doodadWire,SIZEOF(xkmDoodadDesc)16,1,file); | ||||
758 | nRead+= SIZEOF(xkmDoodadDesc)16*tmp; | ||||
759 | doodad= XkbAddGeomDoodad(geom,section,XkbInternAtom(dpy,buf,False0)); | ||||
760 | if (!doodad) | ||||
761 | return nRead; | ||||
762 | doodad->any.type= doodadWire.any.type; | ||||
763 | doodad->any.priority= doodadWire.any.priority; | ||||
764 | doodad->any.top= doodadWire.any.top; | ||||
765 | doodad->any.left= doodadWire.any.left; | ||||
766 | switch (doodadWire.any.type) { | ||||
767 | case XkbOutlineDoodad1: | ||||
768 | case XkbSolidDoodad2: | ||||
769 | doodad->shape.angle= doodadWire.shape.angle; | ||||
770 | doodad->shape.color_ndx= doodadWire.shape.color_ndx; | ||||
771 | doodad->shape.shape_ndx= doodadWire.shape.shape_ndx; | ||||
772 | break; | ||||
773 | case XkbTextDoodad3: | ||||
774 | doodad->text.angle= doodadWire.text.angle; | ||||
775 | doodad->text.width= doodadWire.text.width; | ||||
776 | doodad->text.height= doodadWire.text.height; | ||||
777 | doodad->text.color_ndx= doodadWire.text.color_ndx; | ||||
778 | nRead+= XkmGetCountedString(file,buf,100); | ||||
779 | doodad->text.text= _XkbDupString(buf); | ||||
780 | nRead+= XkmGetCountedString(file,buf,100); | ||||
781 | doodad->text.font= _XkbDupString(buf); | ||||
782 | break; | ||||
783 | case XkbIndicatorDoodad4: | ||||
784 | doodad->indicator.shape_ndx= doodadWire.indicator.shape_ndx; | ||||
785 | doodad->indicator.on_color_ndx= doodadWire.indicator.on_color_ndx; | ||||
786 | doodad->indicator.off_color_ndx= doodadWire.indicator.off_color_ndx; | ||||
787 | break; | ||||
788 | case XkbLogoDoodad5: | ||||
789 | doodad->logo.angle= doodadWire.logo.angle; | ||||
790 | doodad->logo.color_ndx= doodadWire.logo.color_ndx; | ||||
791 | doodad->logo.shape_ndx= doodadWire.logo.shape_ndx; | ||||
792 | nRead+= XkmGetCountedString(file,buf,100); | ||||
793 | doodad->logo.logo_name= _XkbDupString(buf); | ||||
794 | break; | ||||
795 | default: | ||||
796 | /* report error? */ | ||||
797 | return nRead; | ||||
798 | } | ||||
799 | return nRead; | ||||
800 | } | ||||
801 | |||||
802 | static int | ||||
803 | ReadXkmGeomOverlay( FILE * file, | ||||
804 | Display * dpy, | ||||
805 | XkbGeometryPtr geom, | ||||
806 | XkbSectionPtr section) | ||||
807 | { | ||||
808 | char buf[100]; | ||||
809 | unsigned tmp; | ||||
810 | int nRead=0; | ||||
811 | XkbOverlayPtr ol; | ||||
812 | XkbOverlayRowPtr row; | ||||
813 | xkmOverlayDesc olWire; | ||||
814 | xkmOverlayRowDesc rowWire; | ||||
815 | register int r; | ||||
816 | |||||
817 | nRead+= XkmGetCountedString(file,buf,100); | ||||
818 | tmp= fread(&olWire,SIZEOF(xkmOverlayDesc)4,1,file); | ||||
819 | nRead+= tmp*SIZEOF(xkmOverlayDesc)4; | ||||
820 | ol= XkbAddGeomOverlay(section,XkbInternAtom(dpy,buf,False0), | ||||
821 | olWire.num_rows); | ||||
822 | if (!ol) | ||||
823 | return nRead; | ||||
824 | for (r=0;r<olWire.num_rows;r++) { | ||||
825 | int k; | ||||
826 | xkmOverlayKeyDesc keyWire; | ||||
827 | tmp= fread(&rowWire,SIZEOF(xkmOverlayRowDesc)4,1,file); | ||||
828 | nRead+= tmp*SIZEOF(xkmOverlayRowDesc)4; | ||||
829 | row= XkbAddGeomOverlayRow(ol,rowWire.row_under,rowWire.num_keys); | ||||
830 | if (!row) { | ||||
831 | _XkbLibError(_XkbErrBadAlloc,"ReadXkmGeomOverlay",0){ _XkbErrCode= (23); _XkbErrLocation= ("ReadXkmGeomOverlay"); _XkbErrData= (0); }; | ||||
832 | return nRead; | ||||
833 | } | ||||
834 | for (k=0;k<rowWire.num_keys;k++) { | ||||
835 | tmp= fread(&keyWire,SIZEOF(xkmOverlayKeyDesc)8,1,file); | ||||
836 | nRead+= tmp*SIZEOF(xkmOverlayKeyDesc)8; | ||||
837 | memcpy(row->keys[k].over.name,keyWire.over,XkbKeyNameLength4); | ||||
838 | memcpy(row->keys[k].under.name,keyWire.under,XkbKeyNameLength4); | ||||
839 | } | ||||
840 | row->num_keys= rowWire.num_keys; | ||||
841 | } | ||||
842 | return nRead; | ||||
843 | } | ||||
844 | |||||
845 | static int | ||||
846 | ReadXkmGeomSection( FILE * file, | ||||
847 | Display * dpy, | ||||
848 | XkbGeometryPtr geom) | ||||
849 | { | ||||
850 | register int i; | ||||
851 | XkbSectionPtr section; | ||||
852 | xkmSectionDesc sectionWire; | ||||
853 | unsigned tmp; | ||||
854 | int nRead= 0; | ||||
855 | char buf[100]; | ||||
856 | Atom nameAtom; | ||||
857 | |||||
858 | nRead+= XkmGetCountedString(file,buf,100); | ||||
859 | nameAtom= XkbInternAtom(dpy,buf,False0); | ||||
860 | tmp= fread(§ionWire,SIZEOF(xkmSectionDesc)16,1,file); | ||||
861 | nRead+= SIZEOF(xkmSectionDesc)16*tmp; | ||||
862 | section= XkbAddGeomSection(geom,nameAtom,sectionWire.num_rows, | ||||
863 | sectionWire.num_doodads, | ||||
864 | sectionWire.num_overlays); | ||||
865 | if (!section) { | ||||
866 | _XkbLibError(_XkbErrBadAlloc,"ReadXkmGeomSection",0){ _XkbErrCode= (23); _XkbErrLocation= ("ReadXkmGeomSection"); _XkbErrData= (0); }; | ||||
867 | return nRead; | ||||
868 | } | ||||
869 | section->top= sectionWire.top; | ||||
870 | section->left= sectionWire.left; | ||||
871 | section->width= sectionWire.width; | ||||
872 | section->height= sectionWire.height; | ||||
873 | section->angle= sectionWire.angle; | ||||
874 | section->priority= sectionWire.priority; | ||||
875 | if (sectionWire.num_rows>0) { | ||||
876 | register int k; | ||||
877 | XkbRowPtr row; | ||||
878 | xkmRowDesc rowWire; | ||||
879 | XkbKeyPtr key; | ||||
880 | xkmKeyDesc keyWire; | ||||
881 | |||||
882 | for (i=0;i<sectionWire.num_rows;i++) { | ||||
883 | tmp= fread(&rowWire,SIZEOF(xkmRowDesc)8,1,file); | ||||
884 | nRead+= SIZEOF(xkmRowDesc)8*tmp; | ||||
885 | row= XkbAddGeomRow(section,rowWire.num_keys); | ||||
886 | if (!row) { | ||||
887 | _XkbLibError(_XkbErrBadAlloc,"ReadXkmKeycodes",0){ _XkbErrCode= (23); _XkbErrLocation= ("ReadXkmKeycodes"); _XkbErrData = (0); }; | ||||
888 | return nRead; | ||||
889 | } | ||||
890 | row->top= rowWire.top; | ||||
891 | row->left= rowWire.left; | ||||
892 | row->vertical= rowWire.vertical; | ||||
893 | for (k=0;k<rowWire.num_keys;k++) { | ||||
894 | tmp= fread(&keyWire,SIZEOF(xkmKeyDesc)8,1,file); | ||||
895 | nRead+= SIZEOF(xkmKeyDesc)8*tmp; | ||||
896 | key= XkbAddGeomKey(row); | ||||
897 | if (!key) { | ||||
898 | _XkbLibError(_XkbErrBadAlloc,"ReadXkmGeomSection",0){ _XkbErrCode= (23); _XkbErrLocation= ("ReadXkmGeomSection"); _XkbErrData= (0); }; | ||||
899 | return nRead; | ||||
900 | } | ||||
901 | memcpy(key->name.name,keyWire.name,XkbKeyNameLength4); | ||||
902 | key->gap= keyWire.gap; | ||||
903 | key->shape_ndx= keyWire.shape_ndx; | ||||
904 | key->color_ndx= keyWire.color_ndx; | ||||
905 | } | ||||
906 | } | ||||
907 | } | ||||
908 | if (sectionWire.num_doodads>0) { | ||||
909 | for (i=0;i<sectionWire.num_doodads;i++) { | ||||
910 | tmp= ReadXkmGeomDoodad(file,dpy,geom,section); | ||||
911 | nRead+= tmp; | ||||
912 | if (tmp<1) | ||||
913 | return nRead; | ||||
914 | } | ||||
915 | } | ||||
916 | if (sectionWire.num_overlays>0) { | ||||
917 | for (i=0;i<sectionWire.num_overlays;i++) { | ||||
918 | tmp= ReadXkmGeomOverlay(file,dpy,geom,section); | ||||
919 | nRead+= tmp; | ||||
920 | if (tmp<1) | ||||
921 | return nRead; | ||||
922 | } | ||||
923 | } | ||||
924 | return nRead; | ||||
925 | } | ||||
926 | |||||
927 | static int | ||||
928 | ReadXkmGeometry(FILE *file,XkbFileInfo *result) | ||||
929 | { | ||||
930 | register int i; | ||||
931 | char buf[100]; | ||||
932 | unsigned tmp; | ||||
933 | int nRead= 0; | ||||
934 | xkmGeometryDesc wireGeom; | ||||
935 | XkbGeometryPtr geom; | ||||
936 | XkbGeometrySizesRec sizes; | ||||
937 | |||||
938 | nRead+= XkmGetCountedString(file,buf,100); | ||||
939 | tmp= fread(&wireGeom,SIZEOF(xkmGeometryDesc)20,1,file); | ||||
940 | nRead+= tmp*SIZEOF(xkmGeometryDesc)20; | ||||
941 | sizes.which= XkbGeomAllMask(0x3f); | ||||
942 | sizes.num_properties= wireGeom.num_properties; | ||||
943 | sizes.num_colors= wireGeom.num_colors; | ||||
944 | sizes.num_shapes= wireGeom.num_shapes; | ||||
945 | sizes.num_sections= wireGeom.num_sections; | ||||
946 | sizes.num_doodads= wireGeom.num_doodads; | ||||
947 | sizes.num_key_aliases= wireGeom.num_key_aliases; | ||||
948 | if (XkbAllocGeometry(result->xkb,&sizes)!=Success0) { | ||||
949 | _XkbLibError(_XkbErrBadAlloc,"ReadXkmGeometry",0){ _XkbErrCode= (23); _XkbErrLocation= ("ReadXkmGeometry"); _XkbErrData = (0); }; | ||||
950 | return nRead; | ||||
951 | } | ||||
952 | geom= result->xkb->geom; | ||||
953 | geom->name= XkbInternAtom(result->xkb->dpy,buf,False0); | ||||
954 | geom->width_mm= wireGeom.width_mm; | ||||
955 | geom->height_mm= wireGeom.height_mm; | ||||
956 | nRead+= XkmGetCountedString(file,buf,100); | ||||
957 | geom->label_font= _XkbDupString(buf); | ||||
958 | if (wireGeom.num_properties>0) { | ||||
959 | char val[1024]; | ||||
960 | for (i=0;i<wireGeom.num_properties;i++) { | ||||
961 | nRead+= XkmGetCountedString(file,buf,100); | ||||
962 | nRead+= XkmGetCountedString(file,val,1024); | ||||
963 | if (XkbAddGeomProperty(geom,buf,val)==NULL((void*)0)) { | ||||
964 | _XkbLibError(_XkbErrBadAlloc,"ReadXkmGeometry",0){ _XkbErrCode= (23); _XkbErrLocation= ("ReadXkmGeometry"); _XkbErrData = (0); }; | ||||
965 | return nRead; | ||||
966 | } | ||||
967 | } | ||||
968 | } | ||||
969 | if (wireGeom.num_colors>0) { | ||||
970 | for (i=0;i<wireGeom.num_colors;i++) { | ||||
971 | nRead+= XkmGetCountedString(file,buf,100); | ||||
972 | if (XkbAddGeomColor(geom,buf,i)==NULL((void*)0)) { | ||||
973 | _XkbLibError(_XkbErrBadAlloc,"ReadXkmGeometry",0){ _XkbErrCode= (23); _XkbErrLocation= ("ReadXkmGeometry"); _XkbErrData = (0); }; | ||||
974 | return nRead; | ||||
975 | } | ||||
976 | } | ||||
977 | } | ||||
978 | geom->base_color= &geom->colors[wireGeom.base_color_ndx]; | ||||
979 | geom->label_color= &geom->colors[wireGeom.label_color_ndx]; | ||||
980 | if (wireGeom.num_shapes>0) { | ||||
981 | XkbShapePtr shape; | ||||
982 | xkmShapeDesc shapeWire; | ||||
983 | Atom nameAtom; | ||||
984 | for (i=0;i<wireGeom.num_shapes;i++) { | ||||
985 | register int n; | ||||
986 | XkbOutlinePtr ol; | ||||
987 | xkmOutlineDesc olWire; | ||||
988 | nRead+= XkmGetCountedString(file,buf,100); | ||||
989 | nameAtom= XkbInternAtom(result->xkb->dpy,buf,False0); | ||||
990 | tmp= fread(&shapeWire,SIZEOF(xkmShapeDesc)4,1,file); | ||||
991 | nRead+= tmp*SIZEOF(xkmShapeDesc)4; | ||||
992 | shape= XkbAddGeomShape(geom,nameAtom,shapeWire.num_outlines); | ||||
993 | if (!shape) { | ||||
994 | _XkbLibError(_XkbErrBadAlloc,"ReadXkmGeometry",0){ _XkbErrCode= (23); _XkbErrLocation= ("ReadXkmGeometry"); _XkbErrData = (0); }; | ||||
995 | return nRead; | ||||
996 | } | ||||
997 | for (n=0;n<shapeWire.num_outlines;n++) { | ||||
998 | register int p; | ||||
999 | xkmPointDesc ptWire; | ||||
1000 | tmp= fread(&olWire,SIZEOF(xkmOutlineDesc)4,1,file); | ||||
1001 | nRead+= tmp*SIZEOF(xkmOutlineDesc)4; | ||||
1002 | ol= XkbAddGeomOutline(shape,olWire.num_points); | ||||
1003 | if (!ol) { | ||||
1004 | _XkbLibError(_XkbErrBadAlloc,"ReadXkmGeometry",0){ _XkbErrCode= (23); _XkbErrLocation= ("ReadXkmGeometry"); _XkbErrData = (0); }; | ||||
1005 | return nRead; | ||||
1006 | } | ||||
1007 | ol->num_points= olWire.num_points; | ||||
1008 | ol->corner_radius= olWire.corner_radius; | ||||
1009 | for (p=0;p<olWire.num_points;p++) { | ||||
1010 | tmp= fread(&ptWire,SIZEOF(xkmPointDesc)4,1,file); | ||||
1011 | nRead+= tmp*SIZEOF(xkmPointDesc)4; | ||||
1012 | ol->points[p].x= ptWire.x; | ||||
1013 | ol->points[p].y= ptWire.y; | ||||
1014 | if (ptWire.x<shape->bounds.x1) shape->bounds.x1= ptWire.x; | ||||
1015 | if (ptWire.x>shape->bounds.x2) shape->bounds.x2= ptWire.x; | ||||
1016 | if (ptWire.y<shape->bounds.y1) shape->bounds.y1= ptWire.y; | ||||
1017 | if (ptWire.y>shape->bounds.y2) shape->bounds.y2= ptWire.y; | ||||
1018 | } | ||||
1019 | } | ||||
1020 | if (shapeWire.primary_ndx!=XkbNoShape0xff) | ||||
1021 | shape->primary= &shape->outlines[shapeWire.primary_ndx]; | ||||
1022 | if (shapeWire.approx_ndx!=XkbNoShape0xff) | ||||
1023 | shape->approx= &shape->outlines[shapeWire.approx_ndx]; | ||||
1024 | } | ||||
1025 | } | ||||
1026 | if (wireGeom.num_sections>0) { | ||||
1027 | for (i=0;i<wireGeom.num_sections;i++) { | ||||
1028 | tmp= ReadXkmGeomSection(file,result->xkb->dpy,geom); | ||||
1029 | nRead+= tmp; | ||||
1030 | if (tmp==0) | ||||
1031 | return nRead; | ||||
1032 | } | ||||
1033 | } | ||||
1034 | if (wireGeom.num_doodads>0) { | ||||
1035 | for (i=0;i<wireGeom.num_doodads;i++) { | ||||
1036 | tmp= ReadXkmGeomDoodad(file,result->xkb->dpy,geom,NULL((void*)0)); | ||||
1037 | nRead+= tmp; | ||||
1038 | if (tmp==0) | ||||
1039 | return nRead; | ||||
1040 | } | ||||
1041 | } | ||||
1042 | if ((wireGeom.num_key_aliases>0)&&(geom->key_aliases)) { | ||||
1043 | int sz= XkbKeyNameLength4*2; | ||||
1044 | int num= wireGeom.num_key_aliases; | ||||
1045 | if (fread(geom->key_aliases,sz,num,file)!=num) { | ||||
1046 | _XkbLibError(_XkbErrBadLength,"ReadXkmGeometry",0){ _XkbErrCode= (24); _XkbErrLocation= ("ReadXkmGeometry"); _XkbErrData = (0); }; | ||||
1047 | return -1; | ||||
1048 | } | ||||
1049 | nRead+= (num*sz); | ||||
1050 | geom->num_key_aliases= num; | ||||
1051 | } | ||||
1052 | return nRead; | ||||
1053 | } | ||||
1054 | |||||
1055 | Boolint | ||||
1056 | XkmProbe(FILE *file) | ||||
1057 | { | ||||
1058 | unsigned hdr,tmp; | ||||
1059 | int nRead=0; | ||||
1060 | |||||
1061 | hdr= (('x'<<24)|('k'<<16)|('m'<<8)|XkmFileVersion15); | ||||
1062 | tmp= XkmGetCARD32(file,&nRead); | ||||
1063 | if (tmp!=hdr) { | ||||
1064 | if ((tmp&(~0xff))==(hdr&(~0xff))) { | ||||
1065 | _XkbLibError(_XkbErrBadFileVersion,"XkmProbe",tmp&0xff){ _XkbErrCode= (21); _XkbErrLocation= ("XkmProbe"); _XkbErrData = (tmp&0xff); }; | ||||
1066 | } | ||||
1067 | return 0; | ||||
1068 | } | ||||
1069 | return 1; | ||||
1070 | } | ||||
1071 | |||||
1072 | Boolint | ||||
1073 | XkmReadTOC(FILE *file,xkmFileInfo* file_info,int max_toc,xkmSectionInfo *toc) | ||||
1074 | { | ||||
1075 | unsigned hdr,tmp; | ||||
1076 | int nRead=0; | ||||
1077 | unsigned i,size_toc; | ||||
1078 | |||||
1079 | hdr= (('x'<<24)|('k'<<16)|('m'<<8)|XkmFileVersion15); | ||||
1080 | tmp= XkmGetCARD32(file,&nRead); | ||||
1081 | if (tmp!=hdr) { | ||||
1082 | if ((tmp&(~0xff))==(hdr&(~0xff))) { | ||||
1083 | _XkbLibError(_XkbErrBadFileVersion,"XkmReadTOC",tmp&0xff){ _XkbErrCode= (21); _XkbErrLocation= ("XkmReadTOC"); _XkbErrData = (tmp&0xff); }; | ||||
1084 | } | ||||
1085 | else { | ||||
1086 | _XkbLibError(_XkbErrBadFileType,"XkmReadTOC",tmp){ _XkbErrCode= (20); _XkbErrLocation= ("XkmReadTOC"); _XkbErrData = (tmp); }; | ||||
1087 | } | ||||
1088 | return 0; | ||||
1089 | } | ||||
1090 | fread(file_info,SIZEOF(xkmFileInfo)8,1,file); | ||||
1091 | size_toc= file_info->num_toc; | ||||
1092 | if (size_toc>max_toc) { | ||||
1093 | #ifdef DEBUG | ||||
1094 | fprintf(stderrstderr,"Warning! Too many TOC entries; last %d ignored\n", | ||||
1095 | size_toc-max_toc); | ||||
1096 | #endif | ||||
1097 | size_toc= max_toc; | ||||
1098 | } | ||||
1099 | for (i=0;i<size_toc;i++) { | ||||
1100 | fread(&toc[i],SIZEOF(xkmSectionInfo)8,1,file); | ||||
1101 | } | ||||
1102 | return 1; | ||||
1103 | } | ||||
1104 | |||||
1105 | xkmSectionInfo * | ||||
1106 | XkmFindTOCEntry(xkmFileInfo *finfo,xkmSectionInfo *toc,unsigned type) | ||||
1107 | { | ||||
1108 | register int i; | ||||
1109 | |||||
1110 | for (i=0;i<finfo->num_toc;i++) { | ||||
1111 | if (toc[i].type==type) | ||||
1112 | return &toc[i]; | ||||
1113 | } | ||||
1114 | return NULL((void*)0); | ||||
1115 | } | ||||
1116 | |||||
1117 | Boolint | ||||
1118 | XkmReadFileSection( FILE * file, | ||||
1119 | xkmSectionInfo * toc, | ||||
1120 | XkbFileInfo * result, | ||||
1121 | unsigned * loaded_rtrn) | ||||
1122 | { | ||||
1123 | xkmSectionInfo tmpTOC; | ||||
1124 | int nRead; | ||||
1125 | |||||
1126 | if ((!result)||(!result->xkb)) { | ||||
1127 | _XkbLibError(_XkbErrBadMatch,"XkmReadFileSection",0){ _XkbErrCode= (17); _XkbErrLocation= ("XkmReadFileSection"); _XkbErrData= (0); }; | ||||
1128 | return 0; | ||||
1129 | } | ||||
1130 | fseek(file,toc->offset,SEEK_SET0); | ||||
1131 | fread(&tmpTOC,SIZEOF(xkmSectionInfo)8,1,file); | ||||
1132 | nRead= SIZEOF(xkmSectionInfo)8; | ||||
1133 | if ((tmpTOC.type!=toc->type)||(tmpTOC.format!=toc->format)|| | ||||
1134 | (tmpTOC.size!=toc->size)||(tmpTOC.offset!=toc->offset)) { | ||||
1135 | _XkbLibError(_XkbErrIllegalContents,"XkmReadFileSection",0){ _XkbErrCode= (12); _XkbErrLocation= ("XkmReadFileSection"); _XkbErrData= (0); }; | ||||
1136 | return 0; | ||||
1137 | } | ||||
1138 | switch (tmpTOC.type) { | ||||
1139 | case XkmVirtualModsIndex6: | ||||
1140 | nRead+= ReadXkmVirtualMods(file,result,NULL((void*)0)); | ||||
1141 | if ((loaded_rtrn)&&(nRead>=0)) | ||||
1142 | *loaded_rtrn|= XkmVirtualModsMask(1<<6); | ||||
1143 | break; | ||||
1144 | case XkmTypesIndex0: | ||||
1145 | nRead+= ReadXkmKeyTypes(file,result,NULL((void*)0)); | ||||
1146 | if ((loaded_rtrn)&&(nRead>=0)) | ||||
1147 | *loaded_rtrn|= XkmTypesMask(1<<0); | ||||
1148 | break; | ||||
1149 | case XkmCompatMapIndex1: | ||||
1150 | nRead+= ReadXkmCompatMap(file,result,NULL((void*)0)); | ||||
1151 | if ((loaded_rtrn)&&(nRead>=0)) | ||||
1152 | *loaded_rtrn|= XkmCompatMapMask(1<<1); | ||||
1153 | break; | ||||
1154 | case XkmKeyNamesIndex4: | ||||
1155 | nRead+= ReadXkmKeycodes(file,result,NULL((void*)0)); | ||||
1156 | if ((loaded_rtrn)&&(nRead>=0)) | ||||
1157 | *loaded_rtrn|= XkmKeyNamesMask(1<<4); | ||||
1158 | break; | ||||
1159 | case XkmSymbolsIndex2: | ||||
1160 | nRead+= ReadXkmSymbols(file,result); | ||||
1161 | if ((loaded_rtrn)&&(nRead>=0)) | ||||
1162 | *loaded_rtrn|= XkmSymbolsMask(1<<2); | ||||
1163 | break; | ||||
1164 | case XkmIndicatorsIndex3: | ||||
1165 | nRead+= ReadXkmIndicators(file,result,NULL((void*)0)); | ||||
1166 | if ((loaded_rtrn)&&(nRead>=0)) | ||||
1167 | *loaded_rtrn|= XkmIndicatorsMask(1<<3); | ||||
1168 | break; | ||||
1169 | case XkmGeometryIndex5: | ||||
1170 | nRead+= ReadXkmGeometry(file,result); | ||||
1171 | if ((loaded_rtrn)&&(nRead>=0)) | ||||
1172 | *loaded_rtrn|= XkmGeometryMask(1<<5); | ||||
1173 | break; | ||||
1174 | default: | ||||
1175 | _XkbLibError(_XkbErrBadImplementation,{ _XkbErrCode= (26); _XkbErrLocation= (XkbConfigText(tmpTOC.type ,3)); _XkbErrData= (0); } | ||||
1176 | XkbConfigText(tmpTOC.type,XkbMessage),0){ _XkbErrCode= (26); _XkbErrLocation= (XkbConfigText(tmpTOC.type ,3)); _XkbErrData= (0); }; | ||||
1177 | nRead= 0; | ||||
1178 | break; | ||||
1179 | } | ||||
1180 | if (nRead!=tmpTOC.size) { | ||||
1181 | _XkbLibError(_XkbErrBadLength,XkbConfigText(tmpTOC.type,XkbMessage),{ _XkbErrCode= (24); _XkbErrLocation= (XkbConfigText(tmpTOC.type ,3)); _XkbErrData= (nRead-tmpTOC.size); } | ||||
1182 | nRead-tmpTOC.size){ _XkbErrCode= (24); _XkbErrLocation= (XkbConfigText(tmpTOC.type ,3)); _XkbErrData= (nRead-tmpTOC.size); }; | ||||
1183 | return 0; | ||||
1184 | } | ||||
1185 | return (nRead>=0); | ||||
1186 | } | ||||
1187 | |||||
1188 | char * | ||||
1189 | XkmReadFileSectionName(FILE *file,xkmSectionInfo *toc) | ||||
1190 | { | ||||
1191 | xkmSectionInfo tmpTOC; | ||||
1192 | char name[100]; | ||||
1193 | |||||
1194 | if ((!file)||(!toc)) | ||||
| |||||
| |||||
| |||||
1195 | return NULL((void*)0); | ||||
1196 | switch (toc->type) { | ||||
| |||||
1197 | case XkmVirtualModsIndex6: | ||||
1198 | case XkmIndicatorsIndex3: | ||||
1199 | break; | ||||
1200 | case XkmTypesIndex0: | ||||
1201 | case XkmCompatMapIndex1: | ||||
1202 | case XkmKeyNamesIndex4: | ||||
1203 | case XkmSymbolsIndex2: | ||||
1204 | case XkmGeometryIndex5: | ||||
1205 | fseek(file,toc->offset,SEEK_SET0); | ||||
1206 | fread(&tmpTOC,SIZEOF(xkmSectionInfo)8,1,file); | ||||
1207 | if ((tmpTOC.type!=toc->type)||(tmpTOC.format!=toc->format)|| | ||||
1208 | (tmpTOC.size!=toc->size)||(tmpTOC.offset!=toc->offset)) { | ||||
1209 | _XkbLibError(_XkbErrIllegalContents,"XkmReadFileSectionName",0){ _XkbErrCode= (12); _XkbErrLocation= ("XkmReadFileSectionName" ); _XkbErrData= (0); }; | ||||
1210 | return NULL((void*)0); | ||||
1211 | } | ||||
1212 | if (XkmGetCountedString(file,name,100)>0) | ||||
1213 | return _XkbDupString(name); | ||||
1214 | break; | ||||
1215 | default: | ||||
1216 | _XkbLibError(_XkbErrBadImplementation,{ _XkbErrCode= (26); _XkbErrLocation= (XkbConfigText(tmpTOC.type ,3)); _XkbErrData= (0); } | ||||
| |||||
1217 | XkbConfigText(tmpTOC.type,XkbMessage),0){ _XkbErrCode= (26); _XkbErrLocation= (XkbConfigText(tmpTOC.type ,3)); _XkbErrData= (0); }; | ||||
1218 | break; | ||||
1219 | } | ||||
1220 | return NULL((void*)0); | ||||
1221 | } | ||||
1222 | |||||
1223 | /***====================================================================***/ | ||||
1224 | |||||
1225 | #define MAX_TOC16 16 | ||||
1226 | unsigned | ||||
1227 | XkmReadFile(FILE *file,unsigned need,unsigned want,XkbFileInfo *result) | ||||
1228 | { | ||||
1229 | register unsigned i; | ||||
1230 | xkmSectionInfo toc[MAX_TOC16],tmpTOC; | ||||
1231 | xkmFileInfo fileInfo; | ||||
1232 | unsigned tmp,nRead=0; | ||||
1233 | unsigned which= need|want; | ||||
1234 | |||||
1235 | if (!XkmReadTOC(file,&fileInfo,MAX_TOC16,toc)) | ||||
1236 | return which; | ||||
1237 | if ((fileInfo.present&need)!=need) { | ||||
1238 | _XkbLibError(_XkbErrIllegalContents,"XkmReadFile",{ _XkbErrCode= (12); _XkbErrLocation= ("XkmReadFile"); _XkbErrData = (need&(~fileInfo.present)); } | ||||
1239 | need&(~fileInfo.present)){ _XkbErrCode= (12); _XkbErrLocation= ("XkmReadFile"); _XkbErrData = (need&(~fileInfo.present)); }; | ||||
1240 | return which; | ||||
1241 | } | ||||
1242 | result->type= fileInfo.type; | ||||
1243 | if (result->xkb==NULL((void*)0)) | ||||
1244 | result->xkb= XkbAllocKeyboard(); | ||||
1245 | for (i=0;i<fileInfo.num_toc;i++) { | ||||
1246 | #ifdef SEEK_SET0 | ||||
1247 | fseek(file,toc[i].offset,SEEK_SET0); | ||||
1248 | #else | ||||
1249 | fseek(file,toc[i].offset,0); | ||||
1250 | #endif | ||||
1251 | tmp= fread(&tmpTOC,SIZEOF(xkmSectionInfo)8,1,file); | ||||
1252 | nRead= tmp*SIZEOF(xkmSectionInfo)8; | ||||
1253 | if ((tmpTOC.type!=toc[i].type)||(tmpTOC.format!=toc[i].format)|| | ||||
1254 | (tmpTOC.size!=toc[i].size)||(tmpTOC.offset!=toc[i].offset)) { | ||||
1255 | return which; | ||||
1256 | } | ||||
1257 | if ((which&(1<<tmpTOC.type))==0) { | ||||
1258 | continue; | ||||
1259 | } | ||||
1260 | switch (tmpTOC.type) { | ||||
1261 | case XkmVirtualModsIndex6: | ||||
1262 | tmp= ReadXkmVirtualMods(file,result,NULL((void*)0)); | ||||
1263 | break; | ||||
1264 | case XkmTypesIndex0: | ||||
1265 | tmp= ReadXkmKeyTypes(file,result,NULL((void*)0)); | ||||
1266 | break; | ||||
1267 | case XkmCompatMapIndex1: | ||||
1268 | tmp= ReadXkmCompatMap(file,result,NULL((void*)0)); | ||||
1269 | break; | ||||
1270 | case XkmKeyNamesIndex4: | ||||
1271 | tmp= ReadXkmKeycodes(file,result,NULL((void*)0)); | ||||
1272 | break; | ||||
1273 | case XkmIndicatorsIndex3: | ||||
1274 | tmp= ReadXkmIndicators(file,result,NULL((void*)0)); | ||||
1275 | break; | ||||
1276 | case XkmSymbolsIndex2: | ||||
1277 | tmp= ReadXkmSymbols(file,result); | ||||
1278 | break; | ||||
1279 | case XkmGeometryIndex5: | ||||
1280 | tmp= ReadXkmGeometry(file,result); | ||||
1281 | break; | ||||
1282 | default: | ||||
1283 | _XkbLibError(_XkbErrBadImplementation,{ _XkbErrCode= (26); _XkbErrLocation= (XkbConfigText(tmpTOC.type ,3)); _XkbErrData= (0); } | ||||
1284 | XkbConfigText(tmpTOC.type,XkbMessage),0){ _XkbErrCode= (26); _XkbErrLocation= (XkbConfigText(tmpTOC.type ,3)); _XkbErrData= (0); }; | ||||
1285 | tmp= 0; | ||||
1286 | break; | ||||
1287 | } | ||||
1288 | if (tmp>0) { | ||||
1289 | nRead+= tmp; | ||||
1290 | which&= ~(1<<toc[i].type); | ||||
1291 | result->defined|= (1<<toc[i].type); | ||||
1292 | } | ||||
1293 | if (nRead!=tmpTOC.size) { | ||||
1294 | _XkbLibError(_XkbErrBadLength,XkbConfigText(tmpTOC.type,XkbMessage),{ _XkbErrCode= (24); _XkbErrLocation= (XkbConfigText(tmpTOC.type ,3)); _XkbErrData= (nRead-tmpTOC.size); } | ||||
1295 | nRead-tmpTOC.size){ _XkbErrCode= (24); _XkbErrLocation= (XkbConfigText(tmpTOC.type ,3)); _XkbErrData= (nRead-tmpTOC.size); }; | ||||
1296 | } | ||||
1297 | } | ||||
1298 | return which; | ||||
1299 | } |