]>
git.saurik.com Git - wxWidgets.git/blob - src/xpm/dataxpm.c
2 * Copyright (C) 1989-95 GROUPE BULL
4 * Permission is hereby granted, free of charge, to any person obtaining a copy
5 * of this software and associated documentation files (the "Software"), to
6 * deal in the Software without restriction, including without limitation the
7 * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
8 * sell copies of the Software, and to permit persons to whom the Software is
9 * furnished to do so, subject to the following conditions:
11 * The above copyright notice and this permission notice shall be included in
12 * all copies or substantial portions of the Software.
14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
17 * GROUPE BULL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
18 * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
19 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
21 * Except as contained in this notice, the name of GROUPE BULL shall not be
22 * used in advertising or otherwise to promote the sale, use or other dealings
23 * in this Software without prior written authorization from GROUPE BULL.
26 /*****************************************************************************\
32 * Developed by Arnaud Le Hors *
33 \*****************************************************************************/
36 /* Official version number */
37 static char *RCS_Version
= "$XpmVersion: 3.4k $";
39 /* Internal version number */
40 static char *RCS_Id
= "$Id$";
47 #define Getc(data, file) getc(file)
48 #define Ungetc(data, c, file) ungetc(c, file)
55 if (data
->type
== XPMBUFFER
) {
57 register unsigned int n
= 0;
64 /* skip the string beginning comment */
71 } while (c
== *s2
&& *s2
!= '\0' && c
);
74 /* this wasn't the beginning of a comment */
79 data
->Comment
[0] = *s
;
85 while (*s
!= *s2
&& c
) {
87 if (n
== XPMMAXCMTLEN
- 1) { /* forget it */
94 data
->CommentLength
= n
;
97 if (n
== XPMMAXCMTLEN
- 1) { /* forget it */
104 } while (c
== *s2
&& *s2
!= '\0' && c
);
106 /* this is the end of the comment */
113 FILE *file
= data
->stream
.file
;
115 register unsigned int n
= 0, a
;
122 /* skip the string beginning comment */
125 c
= Getc(data
, file
);
129 } while (c
== *s2
&& *s2
!= '\0' && c
!= EOF
);
132 /* this wasn't the beginning of a comment */
133 /* put characters back in the order that we got them */
134 for (a
= n
; a
> 0; a
--, s
--)
135 Ungetc(data
, *s
, file
);
139 data
->Comment
[0] = *s
;
145 while (*s
!= *s2
&& c
!= EOF
) {
146 c
= Getc(data
, file
);
147 if (n
== XPMMAXCMTLEN
- 1) { /* forget it */
154 data
->CommentLength
= n
;
156 c
= Getc(data
, file
);
157 if (n
== XPMMAXCMTLEN
- 1) { /* forget it */
164 } while (c
== *s2
&& *s2
!= '\0' && c
!= EOF
);
166 /* this is the end of the comment */
168 Ungetc(data
, *s
, file
);
176 * skip to the end of the current string and the beginning of the next one
183 data
->cptr
= (data
->stream
.data
)[++data
->line
];
184 else if (data
->type
== XPMBUFFER
) {
187 /* get to the end of the current string */
189 while ((c
= *data
->cptr
++) && c
!= data
->Eos
);
192 * then get to the beginning of the next string looking for possible
196 while ((c
= *data
->cptr
++) && c
!= data
->Bos
)
197 if (data
->Bcmt
&& c
== data
->Bcmt
[0])
199 } else if (data
->Bcmt
) { /* XPM2 natural */
200 while ((c
= *data
->cptr
++) == data
->Bcmt
[0])
206 FILE *file
= data
->stream
.file
;
208 /* get to the end of the current string */
210 while ((c
= Getc(data
, file
)) != data
->Eos
&& c
!= EOF
);
213 * then get to the beginning of the next string looking for possible
217 while ((c
= Getc(data
, file
)) != data
->Bos
&& c
!= EOF
)
218 if (data
->Bcmt
&& c
== data
->Bcmt
[0])
221 } else if (data
->Bcmt
) { /* XPM2 natural */
222 while ((c
= Getc(data
, file
)) == data
->Bcmt
[0])
224 Ungetc(data
, c
, file
);
232 * skip whitespace and return the following word
235 xpmNextWord(data
, buf
, buflen
)
240 register unsigned int n
= 0;
243 if (!data
->type
|| data
->type
== XPMBUFFER
) {
244 while (isspace(c
= *data
->cptr
) && c
!= data
->Eos
)
250 } while (!isspace(c
) && c
!= data
->Eos
&& n
< buflen
);
254 FILE *file
= data
->stream
.file
;
256 while ((c
= Getc(data
, file
)) != EOF
&& isspace(c
) && c
!= data
->Eos
);
257 while (!isspace(c
) && c
!= data
->Eos
&& c
!= EOF
&& n
< buflen
) {
260 c
= Getc(data
, file
);
262 Ungetc(data
, c
, file
);
268 * skip whitespace and compute the following unsigned int,
269 * returns 1 if one is found and 0 if not
272 xpmNextUI(data
, ui_return
)
274 unsigned int *ui_return
;
279 l
= xpmNextWord(data
, buf
, BUFSIZ
);
280 return xpmatoui(buf
, l
, ui_return
);
284 * return end of string - WARNING: malloc!
287 xpmGetString(data
, sptr
, l
)
292 unsigned int i
, n
= 0;
294 char *p
= NULL
, *q
, buf
[BUFSIZ
];
296 if (!data
->type
|| data
->type
== XPMBUFFER
) {
298 char *start
= data
->cptr
;
299 while ((c
= *data
->cptr
) && c
!= data
->Eos
)
301 n
= data
->cptr
- start
+ 1;
302 p
= (char *) XpmMalloc(n
);
304 return (XpmNoMemory
);
305 strncpy(p
, start
, n
);
306 if (data
->type
) /* XPMBUFFER */
310 FILE *file
= data
->stream
.file
;
312 if ((c
= Getc(data
, file
)) == EOF
)
313 return (XpmFileInvalid
);
317 p
= (char *) XpmMalloc(1);
318 while (c
!= data
->Eos
&& c
!= EOF
) {
320 /* get to the end of the buffer */
321 /* malloc needed memory */
322 q
= (char *) XpmRealloc(p
, n
+ i
);
325 return (XpmNoMemory
);
329 /* and copy what we already have */
337 c
= Getc(data
, file
);
341 return (XpmFileInvalid
);
344 /* malloc needed memory */
345 q
= (char *) XpmRealloc(p
, n
+ i
+ 1);
348 return (XpmNoMemory
);
352 /* and copy the buffer */
360 Ungetc(data
, c
, file
);
368 * get the current comment line
377 else if (data
->CommentLength
) {
378 *cmt
= (char *) XpmMalloc(data
->CommentLength
+ 1);
379 strncpy(*cmt
, data
->Comment
, data
->CommentLength
);
380 (*cmt
)[data
->CommentLength
] = '\0';
381 data
->CommentLength
= 0;
387 xpmDataType xpmDataTypes
[] =
389 "", "!", "\n", '\0', '\n', "", "", "", "", /* Natural type */
390 "C", "/*", "*/", '"', '"', ",\n", "static char *", "[] = {\n", "};\n",
391 "Lisp", ";", "\n", '"', '"', "\n", "(setq ", " '(\n", "))\n",
395 NULL
, NULL
, NULL
, 0, 0, NULL
, NULL
, NULL
, NULL
412 data
->Bcmt
= data
->Ecmt
= NULL
;
413 l
= xpmNextWord(data
, buf
, BUFSIZ
);
414 if (l
== 7 && !strncmp("#define", buf
, 7)) {
415 /* this maybe an XPM 1 file */
418 l
= xpmNextWord(data
, buf
, BUFSIZ
);
420 return (XpmFileInvalid
);
422 ptr
= rindex(buf
, '_');
423 if (!ptr
|| strncmp("_format", ptr
, l
- (ptr
- buf
)))
424 return XpmFileInvalid
;
425 /* this is definitely an XPM 1 file */
427 n
= 1; /* handle XPM1 as mainly XPM2 C */
431 * skip the first word, get the second one, and see if this is
434 l
= xpmNextWord(data
, buf
, BUFSIZ
);
435 if ((l
== 3 && !strncmp("XPM", buf
, 3)) ||
436 (l
== 4 && !strncmp("XPM2", buf
, 4))) {
438 n
= 1; /* handle XPM as XPM2 C */
440 /* get the type key word */
441 l
= xpmNextWord(data
, buf
, BUFSIZ
);
444 * get infos about this type
446 while (xpmDataTypes
[n
].type
447 && strncmp(xpmDataTypes
[n
].type
, buf
, l
))
452 /* nope this is not an XPM file */
453 return XpmFileInvalid
;
455 if (xpmDataTypes
[n
].type
) {
456 if (n
== 0) { /* natural type */
457 data
->Bcmt
= xpmDataTypes
[n
].Bcmt
;
458 data
->Ecmt
= xpmDataTypes
[n
].Ecmt
;
459 xpmNextString(data
); /* skip the end of the headerline */
460 data
->Bos
= xpmDataTypes
[n
].Bos
;
461 data
->Eos
= xpmDataTypes
[n
].Eos
;
463 data
->Bcmt
= xpmDataTypes
[n
].Bcmt
;
464 data
->Ecmt
= xpmDataTypes
[n
].Ecmt
;
465 if (!data
->format
) { /* XPM 2 or 3 */
466 data
->Bos
= xpmDataTypes
[n
].Bos
;
468 /* get to the beginning of the first string */
470 data
->Eos
= xpmDataTypes
[n
].Eos
;
471 } else /* XPM 1 skip end of line */
475 /* we don't know about that type of XPM file... */
476 return XpmFileInvalid
;