earlybrowserreborn - Rev 1

Subversion Repositories:
Rev:
/* Copyright 1990,91 GROUPE BULL -- See licence conditions in file COPYRIGHT */
/*****************************************************************************\
* XpmRdFToI.c:                                                                *
*                                                                             *
*  XPM library                                                                *
*  Parse an XPM file and create the image and possibly its mask               *
*                                                                             *
*  Developed by Arnaud Le Hors                                                *
\*****************************************************************************/


#include "xpmP.h"

xpmDataType xpmDataTypes[] =
{
 "", "!", "\n", '\0', '\n', "", "", "", "",     /* Natural type */
 "C", "/*", "*/", '"', '"', ",\n", "static char *", "[] = {\n", "};\n",
 "Lisp", ";", "\n", '"', '"', "\n", "(setq ", " '(\n", "))\n",
#ifdef VMS
 NULL
#else
 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
#endif
};

int
XpmReadFileToImage(display, filename, image_return,
                   shapeimage_return, attributes)
    Display *display;
    char *filename;
    XImage **image_return;
    XImage **shapeimage_return;
    XpmAttributes *attributes;
{
    xpmData mdata;
    char buf[BUFSIZ];
    int l, n = 0;
    int ErrorStatus;
    xpmInternAttrib attrib;

    /*
     * initialize return values
     */

    if (image_return)
        *image_return = NULL;
    if (shapeimage_return)
        *shapeimage_return = NULL;

    if ((ErrorStatus = xpmReadFile(filename, &mdata)) != XpmSuccess)
        return (ErrorStatus);

    xpmInitInternAttrib(&attrib);

    /*
     * parse the header file
     */

    mdata.Bos = '\0';
    mdata.Eos = '\n';
    mdata.Bcmt = mdata.Ecmt = NULL;
    xpmNextWord(&mdata, buf);           /* skip the first word */
    l = xpmNextWord(&mdata, buf);       /* then get the second word */
    if ((l == 3 && !strncmp("XPM", buf, 3)) ||
        (l == 4 && !strncmp("XPM2", buf, 4))) {
        if (l == 3)
            n = 1;                      /* handle XPM as XPM2 C */
        else {
            l = xpmNextWord(&mdata, buf);       /* get the type key word */

            /*
             * get infos about this type
             */

            while (xpmDataTypes[n].type
                   && strncmp(xpmDataTypes[n].type, buf, l))
                n++;
        }
        if (xpmDataTypes[n].type) {
            if (n == 0) {               /* natural type */
                mdata.Bcmt = xpmDataTypes[n].Bcmt;
                mdata.Ecmt = xpmDataTypes[n].Ecmt;
                xpmNextString(&mdata);  /* skip the end of headerline */
                mdata.Bos = xpmDataTypes[n].Bos;
            } else {
                xpmNextString(&mdata);  /* skip the end of headerline */
                mdata.Bcmt = xpmDataTypes[n].Bcmt;
                mdata.Ecmt = xpmDataTypes[n].Ecmt;
                mdata.Bos = xpmDataTypes[n].Bos;
                mdata.Eos = '\0';
                xpmNextString(&mdata);  /* skip the assignment line */
                mdata.InsideString = 1;
            }
            mdata.Eos = xpmDataTypes[n].Eos;

            ErrorStatus = xpmParseData(&mdata, &attrib, attributes);

            if (ErrorStatus == XpmSuccess)
                ErrorStatus = xpmCreateImage(display, &attrib, image_return,
                                             shapeimage_return, attributes);
        } else
            ErrorStatus = XpmFileInvalid;
    } else
        ErrorStatus = XpmFileInvalid;

    if (ErrorStatus >= 0)
        xpmSetAttributes(&attrib, attributes);
    else if (attributes)
        XpmFreeAttributes(attributes);

    xpmFreeInternAttrib(&attrib);
    XpmDataClose(&mdata);

    return (ErrorStatus);
}