dynamically allocate globalcss and sitecss, update TODO - surf-adblock - Surf adblock web extension
 (HTM) git clone git://git.codemadness.org/surf-adblock
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit 2b4dbc8301f9bc4f3ee3ea807563de705af22c13
 (DIR) parent cb128e7fe7db0319770a0e6d7ccd691385b700ad
 (HTM) Author: Hiltjo Posthuma <hiltjo@codemadness.org>
       Date:   Sat, 16 Jul 2016 11:53:33 +0200
       
       dynamically allocate globalcss and sitecss, update TODO
       
       the matching behaviour will be rewritten, it is too inefficient
       
       Diffstat:
         M TODO                                |       5 +++++
         M surf-adblock.c                      |      66 ++++++++++++++++++++++++++-----
       
       2 files changed, 61 insertions(+), 10 deletions(-)
       ---
 (DIR) diff --git a/TODO b/TODO
       @@ -2,10 +2,15 @@ Docs:
        - https://adblockplus.org/en/filter-cheatsheet
        - https://adblockplus.org/filters
        
       +- CSS blocking: don't allow sites to override the appended global and
       +  site-specific stylesheet.
        - separate between site-specific and global block rules.
        - optimize matching:
                ? hashtable per domain for specific rules?
                - separate general block rules into a separate list.
       +        - test: just use a simple strstr/strcasestr for patterns with no wildcards
       +          and no matchbegin/matchend. Use strncmp/strcasecmp for patterns with no wildcards
       +          and matchbegin or matchend set.
        - optimize memory allocation.
        - optimize: pregenerate one global stylesheet that applies to all sites?
        ? support exception rules #@#
 (DIR) diff --git a/surf-adblock.c b/surf-adblock.c
       @@ -14,6 +14,13 @@
        #include <webkit2/webkit-web-extension.h>
        #include <webkitdom/webkitdom.h>
        
       +/* String data / memory pool */
       +typedef struct string {
       +        char   *data;   /* data */
       +        size_t  len;    /* string length */
       +        size_t  bufsiz; /* allocated size */
       +} String;
       +
        typedef struct Page {
                guint64 id;
                WebKitWebPage *webpage;
       @@ -100,9 +107,37 @@ struct filtertype filtertypes[] = {
        };
        
        static Page *pages;
       -static char globalcss[5000000]; /* TEST: dynamic allocate later */
       +static String globalcss;
        static struct filterrule *rules;
        
       +static void
       +string_buffer_realloc(String *s, size_t newlen)
       +{
       +        size_t alloclen;
       +
       +        for (alloclen = 64; alloclen <= newlen; alloclen *= 2)
       +                ;
       +        if (!(s->data = realloc(s->data, alloclen))) {
       +                fprintf(stderr, "realloc: %s\n", strerror(errno));
       +                exit(1);
       +        }
       +        s->bufsiz = alloclen;
       +}
       +
       +static void
       +string_append(String *s, const char *data, size_t len)
       +{
       +        if (!len)
       +                return;
       +        /* check if allocation is necesary, don't shrink buffer,
       +         * should be more than bufsiz ofcourse. */
       +        if (s->len + len >= s->bufsiz)
       +                string_buffer_realloc(s, s->len + len + 1);
       +        memcpy(s->data + s->len, data, len);
       +        s->len += len;
       +        s->data[s->len] = '\0';
       +}
       +
        void *
        ecalloc(size_t nmemb, size_t size)
        {
       @@ -471,14 +506,18 @@ matchrule(struct filterrule *f, const char *uri, const char *type, const char *d
                }
        
                if (r && !match(pat, uri, (f->block & FilterTypeMatchCase) ? 0 : 1)) {
       +#if 0
                        for (; *type; type++) {
                                for (i = 0; blockstr[i]; i++) {
                                        if (blockstr[i] == *type &&
       -                                    f->block & (1 << i)) {
       +                                    f->block & (1 << i))
                                                printf("block type '%c'\n", blockstr[i]);
       +                                        return 1;
                                        }
                                }
                        }
       +                return 0;
       +#endif
                        return 1;
                }
                return 0;
       @@ -649,7 +688,7 @@ documentloaded(WebKitWebPage *wp, Page *p)
                WebKitDOMDocument *doc = webkit_web_page_get_dom_document(wp);
                WebKitDOMHTMLElement *body = webkit_dom_document_get_body(doc);
                WebKitDOMElement *el;
       -        char sitecss[1000000] = ""; /* TODO: dynamic allocate */
       +        String sitecss;
                struct filterrule *r;
                char *uri = estrdup((char *)webkit_web_page_get_uri(p->webpage));
                char *domain, *s;
       @@ -666,28 +705,34 @@ documentloaded(WebKitWebPage *wp, Page *p)
                printf("uri: %s\n", uri);
                printf("domain: %s\n", domain);
        
       +#if 1
                /* site-specific CSS */
       +        memset(&sitecss, 0, sizeof(sitecss));
                for (r = rules; r; r = r->next) {
                        if (!r->css || !r->domains || !matchrule(r, "", "", domain))
                                continue;
       -                strlcat(sitecss, r->css, sizeof(sitecss));
       -                strlcat(sitecss, "{display:none;}", sizeof(sitecss));
       +                string_append(&sitecss, r->css, strlen(r->css));
       +                string_append(&sitecss, STRP("{display:none;}"));
                }
       -        printf("sitecss: %s\n", sitecss);
       +        printf("sitecss: %s\n", sitecss.data ? sitecss.data : "<empty>");
       +#endif
        
                p->view = webkit_dom_document_get_default_view(doc);
        
       +#if 1
                el = webkit_dom_document_create_element(doc, "style", NULL);
                webkit_dom_element_set_attribute(el, "type", "text/css", NULL);
       -        webkit_dom_element_set_inner_html(el, globalcss, NULL);
       +        webkit_dom_element_set_inner_html(el, globalcss.data, NULL);
                webkit_dom_node_append_child(WEBKIT_DOM_NODE(body), WEBKIT_DOM_NODE(el), NULL);
        
                el = webkit_dom_document_create_element(doc, "style", NULL);
                webkit_dom_element_set_attribute(el, "type", "text/css", NULL);
       -        webkit_dom_element_set_inner_html(el, sitecss, NULL);
       +        webkit_dom_element_set_inner_html(el, sitecss.data, NULL);
                webkit_dom_node_append_child(WEBKIT_DOM_NODE(body), WEBKIT_DOM_NODE(el), NULL);
       +#endif
        
                free(uri);
       +        free(sitecss.data);
        }
        
        static gboolean
       @@ -761,8 +806,9 @@ webkit_web_extension_initialize(WebKitWebExtension *e)
                for (r = rules; r; r = r->next) {
                        if (!r->css || r->domains)
                                continue;
       -                strlcat(globalcss, r->css, sizeof(globalcss));
       -                strlcat(globalcss, "{display:none;}", sizeof(globalcss));
       +
       +                string_append(&globalcss, r->css, strlen(r->css));
       +                string_append(&globalcss, STRP("{display:none;}"));
                }
        
                g_signal_connect(e, "page-created",