From f688af068bcc445e1c31d221ec3cc4054302ab76 Mon Sep 17 00:00:00 2001 From: leitner Date: Tue, 30 Apr 2002 18:39:37 +0000 Subject: [PATCH] add url encoding --- CHANGES | 1 + Makefile | 3 +-- t.c | 4 ++-- textcode.h | 4 ++-- textcode/fmt_urlencoded.c | 27 +++++++++++++++++++++++++++ textcode/scan_urlencoded.c | 31 +++++++++++++++++++++++++++++++ 6 files changed, 64 insertions(+), 6 deletions(-) create mode 100644 textcode/fmt_urlencoded.c create mode 100644 textcode/scan_urlencoded.c diff --git a/CHANGES b/CHANGES index acfed10..fb12860 100644 --- a/CHANGES +++ b/CHANGES @@ -4,6 +4,7 @@ implement fmt_uuencoded and scan_uuencoded. implement fmt_base64, scan_base64. implement fmt_quotedprintable, scan_quotedprintable + implement fmt_urlencoded, scan_urlencoded 0.11: fix fmt_long (didn't count the '-'), which in turn broke diff --git a/Makefile b/Makefile index 4fc93c9..14569df 100644 --- a/Makefile +++ b/Makefile @@ -62,8 +62,7 @@ $(BUFFER_OBJS) $(MMAP_OBJS) $(TEXTCODE_OBJS) ar cr $@ $^ -ranlib $@ -t: t.o socket.a stralloc.a buffer.a scan.a uint.a mmap.a open.a fmt.a \ -str.a byte.a textcode.a +t: t.o libowfat.a $(DIET) $(CC) -g -o $@ $^ .PHONY: clean tar install rename diff --git a/t.c b/t.c index 4c42abd..5f39e6b 100644 --- a/t.c +++ b/t.c @@ -20,10 +20,10 @@ int main(int argc,char* argv[]) { char buf[100]; char buf2[100]; unsigned int len,len2; - buf[fmt_quotedprintable(buf,"zunächst einmal vielen Dank für die MUTT FAQ",44)]=0; + buf[fmt_urlencoded(buf,"http://localhost/~fefe",22)]=0; buffer_puts(buffer_1,buf); buffer_putsflush(buffer_1,"\n"); - if ((buf[len2=scan_quotedprintable(buf,buf2,&len)])!=0) { + if ((buf[len2=scan_urlencoded(buf,buf2,&len)])!=0) { buffer_putsflush(buffer_2,"parse error!\n"); return 1; } diff --git a/textcode.h b/textcode.h index 15e9c07..2896440 100644 --- a/textcode.h +++ b/textcode.h @@ -6,7 +6,7 @@ unsigned int fmt_uuencoded(char* dest,const char* src,unsigned int len); unsigned int fmt_base64(char* dest,const char* src,unsigned int len); unsigned int fmt_quotedprintable(char* dest,const char* src,unsigned int len); -unsigned int fmt_urlencode(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); /* These read one line from src, decoded it, and write the result to @@ -15,7 +15,7 @@ unsigned int fmt_yenc(char* dest,const char* src,unsigned int len); unsigned int scan_uuencoded(const char *src,char *dest,unsigned int *destlen); unsigned int scan_base64(const char *src,char *dest,unsigned int *destlen); unsigned int scan_quotedprintable(const char *src,char *dest,unsigned int *destlen); -unsigned int scan_urlencode(const char *src,char *dest,unsigned int *destlen); +unsigned int scan_urlencoded(const char *src,char *dest,unsigned int *destlen); unsigned int scan_yenc(const char *src,char *dest,unsigned int *destlen); extern const char base64[64]; diff --git a/textcode/fmt_urlencoded.c b/textcode/fmt_urlencoded.c new file mode 100644 index 0000000..88109f7 --- /dev/null +++ b/textcode/fmt_urlencoded.c @@ -0,0 +1,27 @@ +#include "fmt.h" +#include "textcode.h" +#include "str.h" +#include "haveinline.h" + +static inline int tohex(char c) { + return c>9?c-10+'A':c+'0'; +} + +unsigned int fmt_urlencoded(char* dest,const char* src,unsigned int len) { + const char unsafe[]=" %<>\"#{}|\\^~[]`;/?:@=&"; + register const unsigned char* s=(const unsigned char*) src; + unsigned long written=0,i; + for (i=0; i>4); + dest[written+2]=tohex(s[i]&15); + } + written+=3; + } else { + if (dest) dest[written]=s[i]; ++written; + } + } + return written; +} diff --git a/textcode/scan_urlencoded.c b/textcode/scan_urlencoded.c new file mode 100644 index 0000000..b29d835 --- /dev/null +++ b/textcode/scan_urlencoded.c @@ -0,0 +1,31 @@ +#include "fmt.h" +#include "textcode.h" +#include "haveinline.h" + +static inline int fromhex(char c) { + if (c>='0' && c<='9') return c-'0'; + if (c>='A' && c<='F') return c-'A'+10; + if (c>='a' && c<='f') return c-'a'+10; + return -1; +} + +unsigned int scan_urlencoded(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]=='%') { + int j=fromhex(s[i+1]); + if (j<0) break; + dest[written]=j<<4; + j=fromhex(s[i+2]); + if (j<0) break; + dest[written]|=j; + i+=2; + } else { + dest[written]=s[i]; + } + ++written; + } + *destlen=written; + return i; +}