diff options
-rw-r--r-- | bin2c.c | 28 |
1 files changed, 17 insertions, 11 deletions
@@ -16,21 +16,22 @@ void usage(){ } // Returns serialised string length -// Keeps state on the previous few characters to aid compression +// Keeps state on the previous few characters to aid compression and prevent +// trigraphs int serialisechar(char *dst,unsigned char c){ static bool lastwasoctal=false; - static unsigned char prevc; // Only used if lastwasoctal==true + static unsigned char prevc; switch(c){ - case '\a': lastwasoctal=false; dst[0]='\\'; dst[1]='a'; return 2; - case '\b': lastwasoctal=false; dst[0]='\\'; dst[1]='b'; return 2; - case '\f': lastwasoctal=false; dst[0]='\\'; dst[1]='f'; return 2; - case '\n': lastwasoctal=false; dst[0]='\\'; dst[1]='n'; return 2; - case '\r': lastwasoctal=false; dst[0]='\\'; dst[1]='r'; return 2; - case '\t': lastwasoctal=false; dst[0]='\\'; dst[1]='t'; return 2; - case '\v': lastwasoctal=false; dst[0]='\\'; dst[1]='v'; return 2; - case '"': lastwasoctal=false; dst[0]='\\'; dst[1]='"'; return 2; - case '\\': lastwasoctal=false; dst[0]='\\'; dst[1]='\\'; return 2; + case '\a': lastwasoctal=false; prevc=c; dst[0]='\\'; dst[1]='a'; return 2; + case '\b': lastwasoctal=false; prevc=c; dst[0]='\\'; dst[1]='b'; return 2; + case '\f': lastwasoctal=false; prevc=c; dst[0]='\\'; dst[1]='f'; return 2; + case '\n': lastwasoctal=false; prevc=c; dst[0]='\\'; dst[1]='n'; return 2; + case '\r': lastwasoctal=false; prevc=c; dst[0]='\\'; dst[1]='r'; return 2; + case '\t': lastwasoctal=false; prevc=c; dst[0]='\\'; dst[1]='t'; return 2; + case '\v': lastwasoctal=false; prevc=c; dst[0]='\\'; dst[1]='v'; return 2; + case '"': lastwasoctal=false; prevc=c; dst[0]='\\'; dst[1]='"'; return 2; + case '\\': lastwasoctal=false; prevc=c; dst[0]='\\'; dst[1]='\\'; return 2; default: if(c<32||c>=127){ lastwasoctal=true; @@ -39,9 +40,14 @@ int serialisechar(char *dst,unsigned char c){ } else if(isdigit(c)&&lastwasoctal&&prevc<'\100'){ prevc=c; return sprintf(dst,"\\%o",(int)c); + } else if(c=='?'&&prevc=='?'){ + lastwasoctal=false; + dst[0]='\\'; dst[1]='?'; + return 2; } else { lastwasoctal=false; dst[0]=c; + prevc=c; return 1; } } |