/* src is UTF-8 encoded */ size_t fmt_jsonescape(char* dest,const char* src,size_t len) { register const unsigned char* s=(const unsigned char*) src; size_t written=0,i; for (i=0; i<len; ++i) { switch (s[i]) { case '\\': case '"': if (dest) { dest[written]='\\'; dest[written+1]=s[i]; } written+=2; break; default: if (s[i]<' ') { if (dest) { dest[written]='\\'; dest[written+1]='u'; dest[written+2]='0'; dest[written+3]='0'; dest[written+4]=fmt_tohex(s[i]>>4); dest[written+5]=fmt_tohex(s[i]&0xf); } written+=6; } else { if (dest) dest[written]=s[i]; ++written; } break; } /* in case someone gives us malicious input */ if (written>((size_t)-1)/2) return (size_t)-1; }
unsigned long fmt_hexdump(char* dest,const char* src,unsigned long len) { register const unsigned char* s=(const unsigned char*) src; unsigned long written=0,i; for (i=0; i<len; ++i) { dest[written]=fmt_tohex(s[i]>>4); dest[written+1]=fmt_tohex(s[i]&15); written+=2; } return written; }
size_t fmt_hexdump(char* dest,const char* src,size_t len) { register const unsigned char* s=(const unsigned char*) src; size_t written=0,i; if (!dest) return (len>((size_t)-1)/2)?(size_t)-1:len*2; for (i=0; i<len; ++i) { dest[written]=fmt_tohex(s[i]>>4); dest[written+1]=fmt_tohex(s[i]&15); written+=2; } return written; }
size_t fmt_quotedprintable2(char* dest,const char* src,size_t len,const char* escapeme) { register const unsigned char* s=(const unsigned char*) src; size_t written=0,i; for (i=0; i<len; ++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); dest[written+2]=fmt_tohex(s[i]&15); } written+=3; } else { if (dest) dest[written]=s[i]; ++written; } /* in case someone gives us malicious input */ if (written>((size_t)-1)/2) return (size_t)-1; }
size_t fmt_ldapescape(char* dest,const char* src,size_t len) { register const unsigned char* s=(const unsigned char*) src; size_t written=0,i; for (i=0; i<len; ++i) { if (s[i]=='*' || s[i]=='(' || s[i]==')' || s[i]==0 || s[i]=='\\' || s[i]<' ') { if (dest) { dest[written]='\\'; dest[written+1]=fmt_tohex(s[i]>>4); dest[written+2]=fmt_tohex(s[i]&15); } written+=3; } else { if (dest) dest[written]=s[i]; ++written; } /* in case someone gives us malicious input */ if (written>((size_t)-1)/2) return (size_t)-1; }
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; for (i=0; i<len; ++i) { switch (s[i]) { case '\a': c='a'; goto doescape; case '\b': c='b'; goto doescape; case 0x1b: c='e'; goto doescape; case '\f': c='f'; goto doescape; case '\n': c='n'; goto doescape; case '\r': c='r'; goto doescape; case '\t': c='t'; goto doescape; case '\v': c='v'; goto doescape; case '\\': c='\\'; doescape: if (dest) { dest[written]='\\'; dest[written+1]=c; } written+=2; break; default: if (s[i]<' ' || escapeme[str_chr(escapeme,s[i])]==s[i]) { if (dest) { dest[written]='\\'; dest[written+1]='x'; dest[written+2]=fmt_tohex(s[i]>>4); dest[written+3]=fmt_tohex(s[i]&0xf); } written+=4; } else { if (dest) dest[written]=s[i]; ++written; } break; } }
/* src is UTF-8 encoded */ size_t fmt_jsonescape(char* dest,const char* src,size_t len) { register const unsigned char* s=(const unsigned char*) src; size_t written=0,i; char c; for (i=0; i<len; ++i) { switch (s[i]) { case '\\': case '"': c=s[i]; escape: if (dest) { dest[written]='\\'; dest[written+1]=c; } written+=2; break; case '\n': c='n'; goto escape; case '\r': c='r'; goto escape; case '\b': c='b'; goto escape; case '\t': c='t'; goto escape; case '\f': c='f'; goto escape; default: if (s[i]<' ') { if (dest) { dest[written]='\\'; dest[written+1]='u'; dest[written+2]='0'; dest[written+3]='0'; dest[written+4]=fmt_tohex(s[i]>>4); dest[written+5]=fmt_tohex(s[i]&0xf); } written+=6; } else if (s[i]>0x7f) { /* UTF-8! Convert to surrogate pair if needed. */ uint32_t u; size_t j=scan_utf8_sem((const char*)s+i,len-i,&u); if (j==0) { /* Invalid UTF-8! Try to limp on! */ written+=fmt_utf8(dest?dest+written:0,s[i]); break; } /* It turns out we are not required to escape these. * So we won't. */ #if 0 if (u>0xffff) { if (dest) { dest[written ]='\\'; dest[written+1]='u'; fmt_xlong(dest+written+2,0xd800 + ((u>>10) & 0x3bf)); dest[written+6]='\\'; dest[written+7]='u'; fmt_xlong(dest+written+8,0xdc00 + (u & 0x3ff)); } written+=12; } else #endif { if (dest) memcpy(dest+written,s+i,j); written+=j; } i+=j-1; /* -1 because the for loop will also add 1 */ break; } else {