remove unneeded code, handle   - grabtitle - stupid HTML title grabber
 (HTM) git clone git://git.codemadness.org/grabtitle
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit 16cc59c155068e6de1fd5cfa8720d6d765db6548
 (DIR) parent 16dfed456fd96d1c483eb515594019d7a5febc86
 (HTM) Author: Hiltjo Posthuma <hiltjo@codemadness.org>
       Date:   Sun, 22 Sep 2019 19:50:21 +0200
       
       remove unneeded code, handle &nbsp;
       
       Diffstat:
         M xml.c                               |     136 ++++---------------------------
         M xml.h                               |      19 -------------------
       
       2 files changed, 18 insertions(+), 137 deletions(-)
       ---
 (DIR) diff --git a/xml.c b/xml.c
       @@ -12,7 +12,7 @@
        static void
        xml_parseattrs(XMLParser *x)
        {
       -        size_t namelen = 0, valuelen;
       +        size_t namelen = 0;
                int c, endsep, endname = 0, valuestart = 0;
        
                while ((c = x->getnext()) != EOF) {
       @@ -23,94 +23,33 @@ xml_parseattrs(XMLParser *x)
                        } else if (c == '?')
                                ; /* ignore */
                        else if (c == '=') {
       -                        x->name[namelen] = '\0';
                                valuestart = 1;
                                endname = 1;
                        } else if (namelen && ((endname && !valuestart && isalpha(c)) || (c == '>' || c == '/'))) {
       -                        /* attribute without value */
       -                        x->name[namelen] = '\0';
       -                        if (x->xmlattrstart)
       -                                x->xmlattrstart(x, x->tag, x->taglen, x->name, namelen);
       -                        if (x->xmlattr)
       -                                x->xmlattr(x, x->tag, x->taglen, x->name, namelen, "", 0);
       -                        if (x->xmlattrend)
       -                                x->xmlattrend(x, x->tag, x->taglen, x->name, namelen);
                                endname = 0;
       -                        x->name[0] = c;
                                namelen = 1;
                        } else if (namelen && valuestart) {
                                /* attribute with value */
       -                        if (x->xmlattrstart)
       -                                x->xmlattrstart(x, x->tag, x->taglen, x->name, namelen);
       -
       -                        valuelen = 0;
                                if (c == '\'' || c == '"') {
                                        endsep = c;
       -                        } else {
       -                                endsep = ' '; /* isspace() */
       -                                goto startvalue;
       -                        }
       -
       -                        while ((c = x->getnext()) != EOF) {
       -startvalue:
       -                                if (c == '&') { /* entities */
       -                                        x->data[valuelen] = '\0';
       -                                        /* call data function with data before entity if there is data */
       -                                        if (valuelen && x->xmlattr)
       -                                                x->xmlattr(x, x->tag, x->taglen, x->name, namelen, x->data, valuelen);
       -                                        x->data[0] = c;
       -                                        valuelen = 1;
       -                                        while ((c = x->getnext()) != EOF) {
       -                                                if (c == endsep || (endsep == ' ' && (c == '>' || isspace(c))))
       -                                                        break;
       -                                                if (valuelen < sizeof(x->data) - 1)
       -                                                        x->data[valuelen++] = c;
       -                                                else {
       -                                                        /* entity too long for buffer, handle as normal data */
       -                                                        x->data[valuelen] = '\0';
       -                                                        if (x->xmlattr)
       -                                                                x->xmlattr(x, x->tag, x->taglen, x->name, namelen, x->data, valuelen);
       -                                                        x->data[0] = c;
       -                                                        valuelen = 1;
       -                                                        break;
       -                                                }
       -                                                if (c == ';') {
       -                                                        x->data[valuelen] = '\0';
       -                                                        if (x->xmlattrentity)
       -                                                                x->xmlattrentity(x, x->tag, x->taglen, x->name, namelen, x->data, valuelen);
       -                                                        valuelen = 0;
       -                                                        break;
       -                                                }
       -                                        }
       -                                } else if (c != endsep && !(endsep == ' ' && (c == '>' || isspace(c)))) {
       -                                        if (valuelen < sizeof(x->data) - 1) {
       -                                                x->data[valuelen++] = c;
       -                                        } else {
       -                                                x->data[valuelen] = '\0';
       -                                                if (x->xmlattr)
       -                                                        x->xmlattr(x, x->tag, x->taglen, x->name, namelen, x->data, valuelen);
       -                                                x->data[0] = c;
       -                                                valuelen = 1;
       -                                        }
       +                                while ((c = x->getnext()) != EOF) {
       +                                        if (c == endsep)
       +                                                break;
                                        }
       -                                if (c == endsep || (endsep == ' ' && (c == '>' || isspace(c)))) {
       -                                        x->data[valuelen] = '\0';
       -                                        if (x->xmlattr)
       -                                                x->xmlattr(x, x->tag, x->taglen, x->name, namelen, x->data, valuelen);
       -                                        if (x->xmlattrend)
       -                                                x->xmlattrend(x, x->tag, x->taglen, x->name, namelen);
       -                                        break;
       +                        } else {
       +                                while ((c = x->getnext()) != EOF) {
       +                                        if (c == '>' || isspace(c))
       +                                                break;
                                        }
                                }
                                namelen = endname = valuestart = 0;
       -                } else if (namelen < sizeof(x->name) - 1) {
       -                        x->name[namelen++] = c;
       +                } else {
       +                        namelen = 1;
                        }
                        if (c == '>') {
                                break;
                        } else if (c == '/') {
                                x->isshorttag = 1;
       -                        x->name[0] = '\0';
                                namelen = 0;
                        }
                }
       @@ -119,48 +58,17 @@ startvalue:
        static void
        xml_parsecomment(XMLParser *x)
        {
       -        size_t datalen = 0, i = 0;
       +        size_t i = 0;
                int c;
        
       -        if (x->xmlcommentstart)
       -                x->xmlcommentstart(x);
                while ((c = x->getnext()) != EOF) {
       -                if (c == '-' || c == '>') {
       -                        if (x->xmlcomment) {
       -                                x->data[datalen] = '\0';
       -                                x->xmlcomment(x, x->data, datalen);
       -                                datalen = 0;
       -                        }
       -                }
       -
                        if (c == '-') {
       -                        if (++i > 2) {
       -                                if (x->xmlcomment)
       -                                        for (; i > 2; i--)
       -                                                x->xmlcomment(x, "-", 1);
       -                                i = 2;
       -                        }
       -                        continue;
       +                        if (i < 2)
       +                                i++;
                        } else if (c == '>' && i == 2) {
       -                        if (x->xmlcommentend)
       -                                x->xmlcommentend(x);
                                return;
       -                } else if (i) {
       -                        if (x->xmlcomment) {
       -                                for (; i > 0; i--)
       -                                        x->xmlcomment(x, "-", 1);
       -                        }
       -                        i = 0;
       -                }
       -
       -                if (datalen < sizeof(x->data) - 1) {
       -                        x->data[datalen++] = c;
                        } else {
       -                        x->data[datalen] = '\0';
       -                        if (x->xmlcomment)
       -                                x->xmlcomment(x, x->data, datalen);
       -                        x->data[0] = c;
       -                        datalen = 1;
       +                        i = 0;
                        }
                }
        }
       @@ -171,8 +79,6 @@ xml_parsecdata(XMLParser *x)
                size_t datalen = 0, i = 0;
                int c;
        
       -        if (x->xmlcdatastart)
       -                x->xmlcdatastart(x);
                while ((c = x->getnext()) != EOF) {
                        if (c == ']' || c == '>') {
                                if (x->xmlcdata) {
       @@ -191,10 +97,8 @@ xml_parsecdata(XMLParser *x)
                                }
                                continue;
                        } else if (c == '>' && i == 2) {
       -                        if (x->xmlcdataend)
       -                                x->xmlcdataend(x);
                                return;
       -                } else if (i) {
       +                } else {
                                if (x->xmlcdata)
                                        for (; i > 0; i--)
                                                x->xmlcdata(x, "]", 1);
       @@ -255,11 +159,13 @@ namedentitytostr(const char *e, char *buf, size_t bufsiz)
                        { "&gt;",   '>'  },
                        { "&apos;", '\'' },
                        { "&quot;", '"'  },
       +                { "&nbsp;", ' '  },
                        { "&AMP;",  '&'  },
                        { "&LT;",   '<'  },
                        { "&GT;",   '>'  },
                        { "&APOS;", '\'' },
       -                { "&QUOT;", '"'  }
       +                { "&QUOT;", '"'  },
       +                { "&NBSP;", ' '  },
                };
                size_t i;
        
       @@ -398,8 +304,6 @@ xml_parse(XMLParser *x)
                                                                        x->xmltagstart(x, x->tag, x->taglen);
                                                                if (isspace(c))
                                                                        xml_parseattrs(x);
       -                                                        if (x->xmltagstartparsed)
       -                                                                x->xmltagstartparsed(x, x->tag, x->taglen, x->isshorttag);
                                                        }
                                                        /* call tagend for shortform or processing instruction */
                                                        if (x->isshorttag) {
       @@ -416,8 +320,6 @@ xml_parse(XMLParser *x)
                        } else {
                                /* parse tag data */
                                datalen = 0;
       -                        if (x->xmldatastart)
       -                                x->xmldatastart(x);
                                while ((c = x->getnext()) != EOF) {
                                        if (c == '&') {
                                                if (datalen) {
       @@ -464,8 +366,6 @@ xml_parse(XMLParser *x)
                                                x->data[datalen] = '\0';
                                                if (x->xmldata && datalen)
                                                        x->xmldata(x, x->data, datalen);
       -                                        if (x->xmldataend)
       -                                                x->xmldataend(x);
                                                break;
                                        }
                                }
 (DIR) diff --git a/xml.h b/xml.h
       @@ -1,27 +1,10 @@
        typedef struct xmlparser {
                /* handlers */
       -        void (*xmlattr)(struct xmlparser *, const char *, size_t,
       -              const char *, size_t, const char *, size_t);
       -        void (*xmlattrend)(struct xmlparser *, const char *, size_t,
       -              const char *, size_t);
       -        void (*xmlattrstart)(struct xmlparser *, const char *, size_t,
       -              const char *, size_t);
       -        void (*xmlattrentity)(struct xmlparser *, const char *, size_t,
       -              const char *, size_t, const char *, size_t);
       -        void (*xmlcdatastart)(struct xmlparser *);
                void (*xmlcdata)(struct xmlparser *, const char *, size_t);
       -        void (*xmlcdataend)(struct xmlparser *);
       -        void (*xmlcommentstart)(struct xmlparser *);
       -        void (*xmlcomment)(struct xmlparser *, const char *, size_t);
       -        void (*xmlcommentend)(struct xmlparser *);
                void (*xmldata)(struct xmlparser *, const char *, size_t);
       -        void (*xmldataend)(struct xmlparser *);
                void (*xmldataentity)(struct xmlparser *, const char *, size_t);
       -        void (*xmldatastart)(struct xmlparser *);
                void (*xmltagend)(struct xmlparser *, const char *, size_t, int);
                void (*xmltagstart)(struct xmlparser *, const char *, size_t);
       -        void (*xmltagstartparsed)(struct xmlparser *, const char *,
       -              size_t, int);
        
                int (*getnext)(void);
        
       @@ -30,8 +13,6 @@ typedef struct xmlparser {
                size_t taglen;
                /* current tag is in short form ? <tag /> */
                int isshorttag;
       -        /* current attribute name */
       -        char name[1024];
                /* data buffer used for tag data, cdata and attribute data */
                char data[BUFSIZ];
        } XMLParser;