URI:
       thtml.c - plan9port - [fork] Plan 9 from user space
  HTML git clone git://src.adamsgaard.dk/plan9port
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
       thtml.c (1363B)
       ---
            1 #include <u.h>
            2 #include <libc.h>
            3 #include <bio.h>
            4 #include <thread.h>
            5 #include <ctype.h>
            6 #include <plumb.h>
            7 #include <9pclient.h>
            8 #include "dat.h"
            9 
           10 char*
           11 formathtml(char *body, int *np)
           12 {
           13         int i, j, p[2], q[2];
           14         Exec *e;
           15         char buf[1024];
           16         Channel *sync;
           17 
           18         e = emalloc(sizeof(struct Exec));
           19         if(pipe(p) < 0 || pipe(q) < 0)
           20                 error("can't create pipe: %r");
           21 
           22         e->p[0] = p[0];
           23         e->p[1] = p[1];
           24         e->q[0] = q[0];
           25         e->q[1] = q[1];
           26         e->argv = emalloc(3*sizeof(char*));
           27         e->argv[0] = estrdup("htmlfmt");
           28         e->argv[1] = estrdup("-cutf-8");
           29         e->argv[2] = nil;
           30         e->prog = "htmlfmt";
           31         sync = chancreate(sizeof(int), 0);
           32         e->sync = sync;
           33         proccreate(execproc, e, EXECSTACK);
           34         recvul(sync);
           35         close(p[0]);
           36         close(q[1]);
           37 
           38         if((i=write(p[1], body, *np)) != *np){
           39                 fprint(2, "Mail: warning: htmlfmt failed: wrote %d of %d: %r\n", i, *np);
           40                 close(p[1]);
           41                 close(q[0]);
           42                 return body;
           43         }
           44         close(p[1]);
           45 
           46         free(body);
           47         body = nil;
           48         i = 0;
           49         for(;;){
           50                 j = read(q[0], buf, sizeof buf);
           51                 if(j <= 0)
           52                         break;
           53                 body = realloc(body, i+j+1);
           54                 if(body == nil)
           55                         error("realloc failed: %r");
           56                 memmove(body+i, buf, j);
           57                 i += j;
           58                 body[i] = '\0';
           59         }
           60         close(q[0]);
           61 
           62         *np = i;
           63         return body;
           64 }
           65 
           66 char*
           67 readbody(char *type, char *dir, int *np)
           68 {
           69         char *body;
           70 
           71         body = readfile(dir, "body", np);
           72         if(body != nil && strcmp(type, "text/html") == 0)
           73                 return formathtml(body, np);
           74         return body;
           75 }