add url encoding
This commit is contained in:
parent
5a9a7e6f1a
commit
f688af068b
1
CHANGES
1
CHANGES
@ -4,6 +4,7 @@
|
|||||||
implement fmt_uuencoded and scan_uuencoded.
|
implement fmt_uuencoded and scan_uuencoded.
|
||||||
implement fmt_base64, scan_base64.
|
implement fmt_base64, scan_base64.
|
||||||
implement fmt_quotedprintable, scan_quotedprintable
|
implement fmt_quotedprintable, scan_quotedprintable
|
||||||
|
implement fmt_urlencoded, scan_urlencoded
|
||||||
|
|
||||||
0.11:
|
0.11:
|
||||||
fix fmt_long (didn't count the '-'), which in turn broke
|
fix fmt_long (didn't count the '-'), which in turn broke
|
||||||
|
3
Makefile
3
Makefile
@ -62,8 +62,7 @@ $(BUFFER_OBJS) $(MMAP_OBJS) $(TEXTCODE_OBJS)
|
|||||||
ar cr $@ $^
|
ar cr $@ $^
|
||||||
-ranlib $@
|
-ranlib $@
|
||||||
|
|
||||||
t: t.o socket.a stralloc.a buffer.a scan.a uint.a mmap.a open.a fmt.a \
|
t: t.o libowfat.a
|
||||||
str.a byte.a textcode.a
|
|
||||||
$(DIET) $(CC) -g -o $@ $^
|
$(DIET) $(CC) -g -o $@ $^
|
||||||
|
|
||||||
.PHONY: clean tar install rename
|
.PHONY: clean tar install rename
|
||||||
|
4
t.c
4
t.c
@ -20,10 +20,10 @@ int main(int argc,char* argv[]) {
|
|||||||
char buf[100];
|
char buf[100];
|
||||||
char buf2[100];
|
char buf2[100];
|
||||||
unsigned int len,len2;
|
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_puts(buffer_1,buf);
|
||||||
buffer_putsflush(buffer_1,"\n");
|
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");
|
buffer_putsflush(buffer_2,"parse error!\n");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
unsigned int fmt_uuencoded(char* dest,const char* src,unsigned int len);
|
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_base64(char* dest,const char* src,unsigned int len);
|
||||||
unsigned int fmt_quotedprintable(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);
|
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
|
/* 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_uuencoded(const char *src,char *dest,unsigned int *destlen);
|
||||||
unsigned int scan_base64(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_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);
|
unsigned int scan_yenc(const char *src,char *dest,unsigned int *destlen);
|
||||||
|
|
||||||
extern const char base64[64];
|
extern const char base64[64];
|
||||||
|
27
textcode/fmt_urlencoded.c
Normal file
27
textcode/fmt_urlencoded.c
Normal file
@ -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<len; ++i) {
|
||||||
|
if (s[i]&0x80 || unsafe[str_chr(unsafe,s[i])]==s[i]) {
|
||||||
|
if (dest) {
|
||||||
|
dest[written]='%';
|
||||||
|
dest[written+1]=tohex(s[i]>>4);
|
||||||
|
dest[written+2]=tohex(s[i]&15);
|
||||||
|
}
|
||||||
|
written+=3;
|
||||||
|
} else {
|
||||||
|
if (dest) dest[written]=s[i]; ++written;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return written;
|
||||||
|
}
|
31
textcode/scan_urlencoded.c
Normal file
31
textcode/scan_urlencoded.c
Normal file
@ -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;
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user