Browse Source

allow specifying more characters to encode for subset encoders (for

example, you can say that fmt_quotedprintable should also escape ':', if
you want to use ':' as separator in a data file.
master
Felix von Leitner 15 years ago
parent
commit
1fc8c534a7
5 changed files with 48 additions and 6 deletions
  1. +13
    -0
      t.c
  2. +16
    -0
      textcode.h
  3. +6
    -2
      textcode/fmt_cescape.c
  4. +7
    -2
      textcode/fmt_quotedprintable.c
  5. +6
    -2
      textcode/fmt_urlencoded.c

+ 13
- 0
t.c View File

@@ -37,11 +37,13 @@ int64 writecb(int64 fd,const void* buf,uint64 n) {
}

int main(int argc,char* argv[]) {
#if 0
io_batch* b=iob_new(1234);
int64 fd=open("t.c",0);
iob_addbuf(b,"fnord",5);
iob_addfile_close(b,fd,0,7365);
iob_write(1,b,writecb);
#endif
#if 0
char dest[1024];
unsigned long len;
@@ -310,5 +312,16 @@ int main(int argc,char* argv[]) {
rdtscl(c);
printf("%lu %lu\n",b-a,c-b);
#endif
#if 1
unsigned long size;
char* buf=mmap_read(argv[1],&size);
if (buf) {
unsigned int x=fmt_urlencoded2(0,buf,size,"x");
unsigned int y;
char* tmp=malloc(x+1);
y=fmt_urlencoded2(tmp,buf,size,"x");
write(1,tmp,x);
}
#endif
}


+ 16
- 0
textcode.h View File

@@ -6,13 +6,16 @@
unsigned long fmt_uuencoded(char* dest,const char* src,unsigned long len);
unsigned long fmt_base64(char* dest,const char* src,unsigned long len);
unsigned long fmt_quotedprintable(char* dest,const char* src,unsigned long len);
unsigned long fmt_quotedprintable2(char* dest,const char* src,unsigned long len,const char* escapeme);
unsigned long fmt_urlencoded(char* dest,const char* src,unsigned long len);
unsigned long fmt_urlencoded2(char* dest,const char* src,unsigned long len,const char* escapeme);
unsigned long fmt_yenc(char* dest,const char* src,unsigned long len);
unsigned long fmt_hexdump(char* dest,const char* src,unsigned long len);
/* this changes '<' to '&lt;' and '&' to '&amp;' */
unsigned long fmt_html(char* dest,const char* src,unsigned long len);
/* change '\' to "\\", '\n' to "\n", ^A to "\x01" etc */
unsigned long fmt_cescape(char* dest,const char* src,unsigned long len);
unsigned long fmt_cescape2(char* dest,const char* src,unsigned long len,const char* escapeme);
/* fold awk whitespace to '_'; this is great for writing fields with
* white spaces to a log file and still allow awk to do log analysis */
unsigned long fmt_foldwhitespace(char* dest,const char* src,unsigned long len);
@@ -37,6 +40,9 @@ unsigned long scan_cescape(const char *src,char *dest,unsigned long *destlen);
int fmt_to_sa(unsigned long (*func)(char*,const char*,unsigned long),
stralloc* sa,const char* src,unsigned long len);

int fmt_to_sa2(unsigned long (*func)(char*,const char*,unsigned long,const char*),
stralloc* sa,const char* src,unsigned long len,const char* escapeme);

/* arg 1 is one of the scan_* functions from above */
/* return number of bytes scanned */
unsigned long scan_to_sa(unsigned long (*func)(const char*,char*,unsigned long*),
@@ -51,6 +57,10 @@ unsigned long scan_to_sa(unsigned long (*func)(const char*,char*,unsigned long*)
#define fmt_html_sa(sa,src,len) fmt_to_sa(fmt_html,sa,src,len)
#define fmt_cescape_sa(sa,src,len) fmt_to_sa(fmt_cescape,sa,src,len)

#define fmt_quotedprintable2_sa(sa,src,len,escapeme) fmt_to_sa2(fmt_quotedprintable2,sa,src,len,escapeme)
#define fmt_urlencoded2_sa(sa,src,len,escapeme) fmt_to_sa2(fmt_urlencoded2,sa,src,len,escapeme)
#define fmt_cescape2_sa(sa,src,len,escapeme) fmt_to_sa2(fmt_cescape2,sa,src,len,escapeme)

#define scan_uuencoded_sa(src,sa) scan_to_sa(scan_uuencoded,src,sa)
#define scan_base64_sa(src,sa) scan_to_sa(scan_base64,src,sa)
#define scan_quotedprintable_sa(src,sa) scan_to_sa(scan_quotedprintable,src,sa)
@@ -68,6 +78,12 @@ void fmt_to_array(unsigned long (*func)(char*,const char*,unsigned long),
void fmt_tofrom_array(unsigned long (*func)(char*,const char*,unsigned long),
array* dest,array* src);

void fmt_to_array2(unsigned long (*func)(char*,const char*,unsigned long,const char*),
array* a,const char* src,unsigned long len,const char* escapeme);

void fmt_tofrom_array2(unsigned long (*func)(char*,const char*,unsigned long,const char*),
array* dest,array* src,const char* escapeme);

unsigned long scan_to_array(unsigned long (*func)(const char*,char*,unsigned long*),
const char* src,array* dest);



+ 6
- 2
textcode/fmt_cescape.c View File

@@ -3,7 +3,7 @@
#include "str.h"
#include "haveinline.h"

unsigned long fmt_cescape(char* dest,const char* src,unsigned long len) {
unsigned long fmt_cescape2(char* dest,const char* src,unsigned long len,const char* escapeme) {
register const unsigned char* s=(const unsigned char*) src;
unsigned long written=0,i;
char c;
@@ -27,7 +27,7 @@ unsigned long fmt_cescape(char* dest,const char* src,unsigned long len) {
written+=2;
break;
default:
if (s[i]<' ') {
if (s[i]<' ' || escapeme[str_chr(escapeme,s[i])]==s[i]) {
if (dest) {
dest[written]='\\';
dest[written+1]='x';
@@ -44,3 +44,7 @@ unsigned long fmt_cescape(char* dest,const char* src,unsigned long len) {
}
return written;
}

unsigned long fmt_cescape(char* dest,const char* src,unsigned long len) {
return fmt_cescape2(dest,src,len,"");
}

+ 7
- 2
textcode/fmt_quotedprintable.c View File

@@ -1,12 +1,13 @@
#include "fmt.h"
#include "textcode.h"
#include "haveinline.h"
#include "str.h"

unsigned long fmt_quotedprintable(char* dest,const char* src,unsigned long len) {
unsigned long fmt_quotedprintable2(char* dest,const char* src,unsigned long len,const char* escapeme) {
register const unsigned char* s=(const unsigned char*) src;
unsigned long written=0,i;
for (i=0; i<len; ++i) {
if (s[i]&0x80 || s[i]=='=') {
if (s[i]&0x80 || s[i]<' ' || s[i]=='=' || escapeme[str_chr(escapeme,s[i])]==s[i]) {
if (dest) {
dest[written]='=';
dest[written+1]=fmt_tohex(s[i]>>4);
@@ -19,3 +20,7 @@ unsigned long fmt_quotedprintable(char* dest,const char* src,unsigned long len)
}
return written;
}

unsigned long fmt_quotedprintable(char* dest,const char* src,unsigned long len) {
return fmt_quotedprintable2(dest,src,len,"");
}

+ 6
- 2
textcode/fmt_urlencoded.c View File

@@ -11,11 +11,11 @@ static inline int issafe(unsigned char c) {
safe[str_chr(safe,c)]);
}

unsigned long fmt_urlencoded(char* dest,const char* src,unsigned long len) {
unsigned long fmt_urlencoded2(char* dest,const char* src,unsigned long len,const char* escapeme) {
register const unsigned char* s=(const unsigned char*) src;
unsigned long written=0,i;
for (i=0; i<len; ++i) {
if (!issafe(s[i])) {
if (!issafe(s[i]) || escapeme[str_chr(escapeme,s[i])]==s[i]) {
if (dest) {
dest[written]='%';
dest[written+1]=fmt_tohex(s[i]>>4);
@@ -28,3 +28,7 @@ unsigned long fmt_urlencoded(char* dest,const char* src,unsigned long len) {
}
return written;
}

unsigned long fmt_urlencoded(char* dest,const char* src,unsigned long len) {
return fmt_urlencoded2(dest,src,len,"");
}

Loading…
Cancel
Save