diff options
author | cinap_lenrek <cinap_lenrek@gmx.de> | 2013-07-14 18:31:07 +0200 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@gmx.de> | 2013-07-14 18:31:07 +0200 |
commit | 1bc8f697807a8c93bc0903cb6c9879a4b33ea1d3 (patch) | |
tree | 745edc1568b98e7790b1708dce633575523f62b0 /sys/src | |
parent | 1f850cbab17f02eeccaf70332254188101ee8327 (diff) |
abaco: simplify, pipeline html directly thru uhtml
Diffstat (limited to 'sys/src')
-rw-r--r-- | sys/src/cmd/abaco/fns.h | 2 | ||||
-rw-r--r-- | sys/src/cmd/abaco/page.c | 80 | ||||
-rw-r--r-- | sys/src/cmd/abaco/util.c | 14 |
3 files changed, 52 insertions, 44 deletions
diff --git a/sys/src/cmd/abaco/fns.h b/sys/src/cmd/abaco/fns.h index 3e739a7e8..776d156a0 100644 --- a/sys/src/cmd/abaco/fns.h +++ b/sys/src/cmd/abaco/fns.h @@ -65,7 +65,7 @@ int istextfield(Item *); int forceitem(Item *); int xtofchar(Rune *, Font *, long); int istextsel(Page *, Rectangle, int *, int *, Rune *, Font *); -char* convert(Runestr, char *, long *); +int findctype(char *, int, char *, char *); void execproc(void *); void getimage(Cimage *, Rune *); Point getpt(Page *p, Point); diff --git a/sys/src/cmd/abaco/page.c b/sys/src/cmd/abaco/page.c index 6f75f6afb..200419ee2 100644 --- a/sys/src/cmd/abaco/page.c +++ b/sys/src/cmd/abaco/page.c @@ -147,32 +147,13 @@ closeimages(Page *p) } static -Cimage * -loadimg(Rune *src, int x , int y) +int +pipeline(int fd, char *cmd, ...) { Channel *sync; - Cimage *ci; - Runestr rs; Exec *e; - char *filter; - int fd, p[2], q[2]; - - ci = emalloc(sizeof(Cimage)); - rs. r = src; - rs.nr = runestrlen(rs.r); - ci->url = urlalloc(&rs, nil, HGet); - fd = urlopen(ci->url); - if(fd < 0){ - Err1: - return ci; - } - filter = getfilter(ci->url->ctype.r, x, y); - if(filter == nil){ - werrstr("%S unsupported: %S", ci->url->ctype.r, ci->url->act.r); - Err2: - close(fd); - goto Err1; - } + int p[2], q[2]; + va_list a; if(pipe(p)<0 || pipe(q)<0) error("can't create pipe"); @@ -186,7 +167,9 @@ loadimg(Rune *src, int x , int y) e->p[1] = p[1]; e->q[0] = q[0]; e->q[1] = q[1]; - e->cmd = filter; + va_start(a, cmd); + e->cmd = vsmprint(cmd, a); + va_end(a); e->sync = sync; proccreate(execproc, e, STACK); recvul(sync); @@ -194,14 +177,44 @@ loadimg(Rune *src, int x , int y) close(p[0]); close(p[1]); close(q[1]); + return q[0]; +} - ci->mi = readmemimage(q[0]); - close(q[0]); +static +Cimage * +loadimg(Rune *src, int x , int y) +{ + Cimage *ci; + Runestr rs; + char *filter; + int fd; + + ci = emalloc(sizeof(Cimage)); + rs. r = src; + rs.nr = runestrlen(rs.r); + ci->url = urlalloc(&rs, nil, HGet); + fd = urlopen(ci->url); + if(fd < 0){ + Err1: + return ci; + } + filter = getfilter(ci->url->ctype.r, x, y); + if(filter == nil){ + werrstr("%S unsupported: %S", ci->url->ctype.r, ci->url->act.r); + Err2: + close(fd); + goto Err1; + } + fd = pipeline(fd, "%s", filter); + free(filter); + if(fd < 0) + goto Err2; + ci->mi = readmemimage(fd); + close(fd); if(ci->mi == nil){ werrstr("can't read image"); goto Err2; } - free(filter); return ci; } @@ -262,7 +275,7 @@ void pageloadproc(void *v) { Page *p; - char buf[BUFSIZE], *s; + char buf[BUFSIZE], cs[32], *s; long n, l; int fd, i, ctype; @@ -297,6 +310,16 @@ pageloadproc(void *v) goto Err; } addrefresh(p, "loading: %S...", p->url->src.r); + + s = nil; + if(p->url->ctype.nr > 0){ + snprint(buf, sizeof(buf), "%.*S", p->url->ctype.nr, p->url->ctype.r); + if(findctype(cs, sizeof(cs), "charset", buf) == 0) + s = cs; + } + if((fd = pipeline(fd, s != nil ? "uhtml -c %q" : "uhtml", s)) < 0) + goto Err; + s = nil; l = 0; while((n=read(fd, buf, sizeof(buf))) > 0){ @@ -315,7 +338,6 @@ pageloadproc(void *v) close(fd); n = l; if(s){ - s = convert(p->url->ctype, s, &n); p->items = parsehtml((uchar *)s, n, p->url->act.r, ctype, UTF_8, &p->doc); free(s); fixtext(p); diff --git a/sys/src/cmd/abaco/util.c b/sys/src/cmd/abaco/util.c index 7b66888f5..ecdb7c3ed 100644 --- a/sys/src/cmd/abaco/util.c +++ b/sys/src/cmd/abaco/util.c @@ -797,7 +797,6 @@ isspace(char c) return c==' ' || c== '\t' || c=='\r' || c=='\n'; } -static int findctype(char *b, int l, char *keyword, char *s) { @@ -836,19 +835,6 @@ findctype(char *b, int l, char *keyword, char *s) return 0; } -char * -convert(Runestr ctype, char *s, long *np) -{ - char t[25], buf[256]; - - *t = '\0'; - if(ctype.nr){ - snprint(buf, sizeof(buf), "%.*S", ctype.nr, ctype.r); - findctype(t, sizeof(t), "charset", buf); - } - return uhtml(t, s, np); -} - int xtofchar(Rune *s, Font *f, long p) { |