summaryrefslogtreecommitdiff
path: root/sys/src/cmd/abaco
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@gmx.de>2013-07-14 18:31:07 +0200
committercinap_lenrek <cinap_lenrek@gmx.de>2013-07-14 18:31:07 +0200
commit1bc8f697807a8c93bc0903cb6c9879a4b33ea1d3 (patch)
tree745edc1568b98e7790b1708dce633575523f62b0 /sys/src/cmd/abaco
parent1f850cbab17f02eeccaf70332254188101ee8327 (diff)
abaco: simplify, pipeline html directly thru uhtml
Diffstat (limited to 'sys/src/cmd/abaco')
-rw-r--r--sys/src/cmd/abaco/fns.h2
-rw-r--r--sys/src/cmd/abaco/page.c80
-rw-r--r--sys/src/cmd/abaco/util.c14
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)
{