earlybrowserreborn - Blame information for rev 1

Subversion Repositories:
Rev:
Rev Author Line No. Line
1 roytam 1 /* Copyright 1990,91 GROUPE BULL -- See licence conditions in file COPYRIGHT */
2 /*****************************************************************************\
3 * parse.c:                                                                    *
4 *                                                                             *
5 *  XPM library                                                                *
6 *  Parse an XPM file or array and store the found informations                *
7 *  in an an xpmInternAttrib structure which is returned.                      *
8 *                                                                             *
9 *  Developed by Arnaud Le Hors                                                *
10 \*****************************************************************************/
11  
12  
13 #include "xpmP.h"
14  
15 char *xpmColorKeys[] =
16 {
17  "s",                                   /* key #1: symbol */
18  "m",                                   /* key #2: mono visual */
19  "g4",                                  /* key #3: 4 grays visual */
20  "g",                                   /* key #4: gray visual */
21  "c",                                   /* key #5: color visual */
22 };
23  
24  
25 /* function call in case of error, frees only localy allocated variables */
26 #undef RETURN
27 #define RETURN(status) \
28   { if (colorTable) xpmFreeColorTable(colorTable, ncolors); \
29     if (chars) free(chars); \
30     if (pixelindex) free(pixelindex); \
31     if (hints_cmt)  free(hints_cmt); \
32     if (colors_cmt) free(colors_cmt); \
33     if (pixels_cmt) free(pixels_cmt); \
34     return(status); }
35  
36 /*
37  * This function parses an Xpm file or data and store the found informations
38  * in an an xpmInternAttrib structure which is returned.
39  */
40 int
41 xpmParseData(data, attrib_return, attributes)
42     xpmData *data;
43     xpmInternAttrib *attrib_return;
44     XpmAttributes *attributes;
45 {
46     /* variables to return */
47     unsigned int width, height;
48     unsigned int ncolors = 0;
49     unsigned int cpp;
50     unsigned int x_hotspot, y_hotspot, hotspot = 0;
51     char ***colorTable = NULL;
52     unsigned int *pixelindex = NULL;
53     char *hints_cmt = NULL;
54     char *colors_cmt = NULL;
55     char *pixels_cmt = NULL;
56  
57     /* calculation variables */
58     unsigned int rncolors = 0;          /* read number of colors, it is
59                                          * different to ncolors to avoid
60                                          * problem when freeing the
61                                          * colorTable in case an error
62                                          * occurs while reading the hints
63                                          * line */
64     unsigned int key;                   /* color key */
65     char *chars = NULL, buf[BUFSIZ];
66     unsigned int *iptr;
67     unsigned int a, b, x, y, l;
68  
69     /*
70      * read hints: width, height, ncolors, chars_per_pixel
71      */
72     if (!(xpmNextUI(data, &width) && xpmNextUI(data, &height)
73           && xpmNextUI(data, &rncolors) && xpmNextUI(data, &cpp)))
74         RETURN(XpmFileInvalid);
75  
76     ncolors = rncolors;
77  
78     /*
79      * read hotspot coordinates if any
80      */
81     hotspot = xpmNextUI(data, &x_hotspot) && xpmNextUI(data, &y_hotspot);
82  
83     /*
84      * store the hints comment line
85      */
86     if (attributes && (attributes->valuemask & XpmReturnInfos))
87         xpmGetCmt(data, &hints_cmt);
88  
89     /*
90      * read colors
91      */
92     colorTable = (char ***) calloc(ncolors, sizeof(char **));
93     if (!colorTable)
94         RETURN(XpmNoMemory);
95  
96     for (a = 0; a < ncolors; a++) {
97         xpmNextString(data);            /* skip the line */
98         colorTable[a] = (char **) calloc((NKEYS + 1), sizeof(char *));
99         if (!colorTable[a])
100             RETURN(XpmNoMemory);
101  
102         /*
103          * read pixel value
104          */
105         *colorTable[a] = (char *) malloc(cpp);
106         if (!*colorTable[a])
107             RETURN(XpmNoMemory);
108         for (b = 0; b < cpp; b++)
109             colorTable[a][0][b] = xpmGetC(data);
110  
111         /*
112          * read color keys and values
113          */
114         while (l = xpmNextWord(data, buf)) {
115             for (key = 1; key < NKEYS + 1; key++)
116                 if (!strncmp(xpmColorKeys[key - 1], buf, l))
117                     break;
118             if (key <= NKEYS && (l = xpmNextWord(data, buf))) {
119                 colorTable[a][key] = (char *) malloc(l + 1);
120                 if (!colorTable[a][key])
121                     RETURN(XpmNoMemory);
122                 strncpy(colorTable[a][key], buf, l);
123                 colorTable[a][key][l] = '\0';
124             } else
125                 RETURN(XpmFileInvalid); /* key without value */
126         }
127     }
128  
129     /*
130      * store the colors comment line
131      */
132     if (attributes && (attributes->valuemask & XpmReturnInfos))
133         xpmGetCmt(data, &colors_cmt);
134  
135     /*
136      * read pixels and index them on color number
137      */
138     pixelindex =
139         (unsigned int *) malloc(sizeof(unsigned int) * width * height);
140     if (!pixelindex)
141         RETURN(XpmNoMemory);
142  
143     iptr = pixelindex;
144  
145     chars = (char *) malloc(cpp);
146     if (!chars)
147         RETURN(XpmNoMemory);
148  
149     for (y = 0; y < height; y++) {
150         xpmNextString(data);
151         for (x = 0; x < width; x++, iptr++) {
152             for (a = 0; a < cpp; a++)
153                 chars[a] = xpmGetC(data);
154             for (a = 0; a < ncolors; a++)
155                 if (!strncmp(colorTable[a][0], chars, cpp))
156                     break;
157             if (a == ncolors)
158                 RETURN(XpmFileInvalid); /* no color matches */
159             *iptr = a;
160         }
161     }
162  
163     /*
164      * store the pixels comment line
165      */
166     if (attributes && (attributes->valuemask & XpmReturnInfos))
167         xpmGetCmt(data, &pixels_cmt);
168  
169     free(chars);
170  
171     /*
172      * store found informations in the xpmInternAttrib structure
173      */
174     attrib_return->width = width;
175     attrib_return->height = height;
176     attrib_return->cpp = cpp;
177     attrib_return->ncolors = ncolors;
178     attrib_return->colorTable = colorTable;
179     attrib_return->pixelindex = pixelindex;
180  
181     if (attributes) {
182         if (attributes->valuemask & XpmReturnInfos) {
183             attributes->hints_cmt = hints_cmt;
184             attributes->colors_cmt = colors_cmt;
185             attributes->pixels_cmt = pixels_cmt;
186         }
187         if (hotspot) {
188             attributes->x_hotspot = x_hotspot;
189             attributes->y_hotspot = y_hotspot;
190             attributes->valuemask |= XpmHotspot;
191         }
192     }
193     return (XpmSuccess);
194 }