From 0546ea048ceb1c75a6013622c89f0181b69d359e Mon Sep 17 00:00:00 2001 From: leitner Date: Wed, 23 Apr 2003 20:17:57 +0000 Subject: [PATCH] add html encoders add vd (mldonkey support program) as test for socket API --- CHANGES | 1 + test/vd.c | 36 ++++++++++++++++++++++++++++++++++++ textcode.h | 3 +++ textcode/fmt_html.c | 24 ++++++++++++++++++++++++ textcode/scan_html.c | 36 ++++++++++++++++++++++++++++++++++++ 5 files changed, 100 insertions(+) create mode 100644 test/vd.c create mode 100644 textcode/fmt_html.c create mode 100644 textcode/scan_html.c diff --git a/CHANGES b/CHANGES index 6a983c4..dd9800f 100644 --- a/CHANGES +++ b/CHANGES @@ -10,6 +10,7 @@ make install forgot to install ndelay.h fix typos in several man pages (Hynek Schlawack) add stralloc versions of textcode API (Kai Ruemmler) + add html to textcode ('<' to '<' etc) 0.14: avoid bus errors in byte_copy diff --git a/test/vd.c b/test/vd.c new file mode 100644 index 0000000..8fe4142 --- /dev/null +++ b/test/vd.c @@ -0,0 +1,36 @@ +#include "socket.h" +#include "buffer.h" +#include +#include + +main() { + int s=socket_tcp4(); + char line[1024]; + char buf[4096]; + int l; + int header=1; + buffer filein; + buffer_init(&filein,read,s,buf,sizeof buf); + if (socket_connect4(s,"\x7f\x00\x00\x01",4000)) { + perror("connect"); + return 1; + } + write(s,"vd\nq\n",5); + for (;;) { + line[0]=0; + if ((l=buffer_getline(&filein,line,(sizeof line)-1))==0 && line[l]!='\n') + break; + else { + line[l+1]=0; + if (!header) { + if (strcmp(line,"\e[7mMLdonkey command-line:\e[2;37;0m\n") && + strcmp(line,"\e[2;37;0m\e[7mMLdonkey command-line:\e[2;37;0m\n") && + strncmp(line,"> ",2)) + buffer_put(buffer_1,line,l+1); + } + if (!strcmp(line,"Use \e[31m?\e[2;37;0m for help\n")) header=0; + if (!strcmp(line,"Use ? for help\n")) header=0; + } + } + buffer_flush(buffer_1); +} diff --git a/textcode.h b/textcode.h index 1fb6ad2..955eacf 100644 --- a/textcode.h +++ b/textcode.h @@ -9,6 +9,8 @@ unsigned int fmt_quotedprintable(char* dest,const char* src,unsigned int len); unsigned int fmt_urlencoded(char* dest,const char* src,unsigned int len); unsigned int fmt_yenc(char* dest,const char* src,unsigned int len); unsigned int fmt_hexdump(char* dest,const char* src,unsigned int len); +/* this changes '<' to '<' and '&' to '&' */ +unsigned int fmt_html(char* dest,const char* src,unsigned int len); /* These read one line from src, decoded it, and write the result to * dest. The number of decoded bytes is written to destlen. dest @@ -19,6 +21,7 @@ unsigned int scan_quotedprintable(const char *src,char *dest,unsigned int *destl unsigned int scan_urlencoded(const char *src,char *dest,unsigned int *destlen); unsigned int scan_yenc(const char *src,char *dest,unsigned int *destlen); unsigned int scan_hexdump(const char *src,char *dest,unsigned int *destlen); +unsigned int scan_html(const char *src,char *dest,unsigned int *destlen); #ifdef STRALLOC_H /* These take len bytes from src and write them in encoded form to sa. diff --git a/textcode/fmt_html.c b/textcode/fmt_html.c new file mode 100644 index 0000000..ed1e5b2 --- /dev/null +++ b/textcode/fmt_html.c @@ -0,0 +1,24 @@ +#include "fmt.h" +#include "textcode.h" +#include "str.h" +#include "haveinline.h" + +unsigned int fmt_html(char* dest,const char* src,unsigned int len) { + register const unsigned char* s=(const unsigned char*) src; + unsigned long written=0,i; + const char* seq; + for (i=0; i': seq=">"; goto doit; + case '\n': + seq="
"; + doit: + written+=fmt_str(dest?dest+written:0,">"); + break; + default: if (dest) dest[written]=s[i]; ++written; break; + } + } + return written; +} diff --git a/textcode/scan_html.c b/textcode/scan_html.c new file mode 100644 index 0000000..0860c89 --- /dev/null +++ b/textcode/scan_html.c @@ -0,0 +1,36 @@ +#include "fmt.h" +#include "textcode.h" +#include "haveinline.h" +#include "case.h" + +unsigned int scan_html(const char *src,char *dest,unsigned int *destlen) { + register const unsigned char* s=(const unsigned char*) src; + unsigned long written=0,i; + for (i=0; s[i]; ++i) { + if (s[i]=='&') { + if (case_starts(s+i+1,"amp;")) { + dest[written]='&'; + i+=4; + } else if (case_starts(s+i+1,"lt;")) { + dest[written]='<'; + i+=3; + } else if (case_starts(s+i+1,"gt;")) { + dest[written]='>'; + i+=3; + } + } else if (s[i]=='<') { + if (case_starts(s+i+1,"br>")) { + dest[written]='\n'; + i+=3; + } else if (case_starts(s+i+1,"p>")) { + dest[written]='\n'; ++written; + dest[written]='\n'; + i+=3; + } + } else + dest[written]=s[i]; + ++written; + } + *destlen=written; + return i; +}