CVS: libraries/mspgcc escape_decode.c,1.1,1.2 escape_encode.c,1.1,1.2
Chris Liechti <[email protected]>
| Newsgroups | gmane.comp.hardware.texas-instruments.msp430.gcc.cvs |
|---|---|
| Message-ID | <[email protected]> |
Update of /cvsroot/mspgcc/libraries/mspgcc
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv10012/libraries/mspgcc
Modified Files:
escape_decode.c escape_encode.c
Log Message:
- support \e
- encoder code size optimized
Index: escape_decode.c
===================================================================
RCS file: /cvsroot/mspgcc/libraries/mspgcc/escape_decode.c,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -w -d -r1.1 -r1.2
--- escape_decode.c 13 Sep 2005 14:09:43 -0000 1.1
+++ escape_decode.c 16 Sep 2005 13:28:39 -0000 1.2
@@ -3,6 +3,7 @@
unsigned int escape_decode(void *dst, unsigned int maxsize, const char *src) {
unsigned int output_size = 0;
enum {M_PRINT, M_ESCAPE, M_HEX_DIGIT_1, M_HEX_DIGIT_0} mode = M_PRINT;
+
for (unsigned int pos = 0; ((unsigned char*)src)[pos] && output_size < maxsize; pos++) {
unsigned character = ((unsigned char*)src)[pos];
switch (mode) {
@@ -18,21 +19,24 @@
case '0':
((unsigned char *)dst)[output_size++] = '\0';
break;
+ case 'a':
+ ((unsigned char *)dst)[output_size++] = '\a';
+ break;
+ case 'b':
+ ((unsigned char *)dst)[output_size++] = '\b';
+ break;
+ case 'e':
+ ((unsigned char *)dst)[output_size++] = '\e';
+ break;
case 'n':
((unsigned char *)dst)[output_size++] = '\n';
break;
case 'r':
((unsigned char *)dst)[output_size++] = '\r';
break;
- case 'a':
- ((unsigned char *)dst)[output_size++] = '\a';
- break;
case 't':
((unsigned char *)dst)[output_size++] = '\t';
break;
- case 'b':
- ((unsigned char *)dst)[output_size++] = '\b';
- break;
case '\\':
((unsigned char *)dst)[output_size++] = '\\';
break;
Index: escape_encode.c
===================================================================
RCS file: /cvsroot/mspgcc/libraries/mspgcc/escape_encode.c,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -w -d -r1.1 -r1.2
--- escape_encode.c 13 Sep 2005 14:09:43 -0000 1.1
+++ escape_encode.c 16 Sep 2005 13:28:39 -0000 1.2
@@ -2,58 +2,42 @@
unsigned int escape_encode(char *dst, unsigned int maxsize, const void *src, unsigned int size) {
unsigned int output_size = 0;
+
+ //write a character in the output buffer
+ void out(char c) {
+ if (output_size < maxsize) {
+ ((unsigned char *)dst)[output_size++] = c;
+ }
+ }
+ //internal helper function, append a escaped character ('\\' prefixed)
+ void escape(char c) {
+ out('\\');
+ out(c);
+ }
+
for (unsigned int pos = 0; pos < size && output_size < maxsize; pos++) {
switch (((unsigned char*)src)[pos]) {
- case '\0':
- if (2+output_size >= maxsize) break;
- ((unsigned char *)dst)[output_size++] = '\\';
- ((unsigned char *)dst)[output_size++] = '0';
- break;
- case '\n':
- if (2+output_size >= maxsize) break;
- ((unsigned char *)dst)[output_size++] = '\\';
- ((unsigned char *)dst)[output_size++] = 'n';
- break;
- case '\r':
- if (2+output_size >= maxsize) break;
- ((unsigned char *)dst)[output_size++] = '\\';
- ((unsigned char *)dst)[output_size++] = 'r';
- break;
- case '\a':
- if (2+output_size >= maxsize) break;
- ((unsigned char *)dst)[output_size++] = '\\';
- ((unsigned char *)dst)[output_size++] = 'a';
- break;
- case '\t':
- if (2+output_size >= maxsize) break;
- ((unsigned char *)dst)[output_size++] = '\\';
- ((unsigned char *)dst)[output_size++] = 't';
- break;
- case '\b':
- if (2+output_size >= maxsize) break;
- ((unsigned char *)dst)[output_size++] = '\\';
- ((unsigned char *)dst)[output_size++] = 'b';
- break;
- case '\\':
- if (2+output_size >= maxsize) break;
- ((unsigned char *)dst)[output_size++] = '\\';
- ((unsigned char *)dst)[output_size++] = '\\';
- break;
+ case '\0': escape('0'); break;
+ case '\a': escape('a'); break;
+ case '\b': escape('b'); break;
+ case '\e': escape('e'); break;
+ case '\n': escape('n'); break;
+ case '\r': escape('r'); break;
+ case '\t': escape('t'); break;
+ case '\\': escape('\\'); break;
default:
if (((unsigned char*)src)[pos] < 0x1f //other control characters
|| ((unsigned char*)src)[pos] == 127) { //DEL
- if (4+output_size >= maxsize) break;
- ((unsigned char *)dst)[output_size++] = '\\';
- ((unsigned char *)dst)[output_size++] = 'x';
- ((unsigned char *)dst)[output_size++] = HEX_DIGITS[((unsigned char*)src)[pos] >> 4];
- ((unsigned char *)dst)[output_size++] = HEX_DIGITS[((unsigned char*)src)[pos] & 0xf];
+ escape('x');
+ out(HEX_DIGITS[((unsigned char*)src)[pos] >> 4]);
+ out(HEX_DIGITS[((unsigned char*)src)[pos] & 0xf]);
} else {
- ((unsigned char *)dst)[output_size++] = ((unsigned char*)src)[pos];
+ out(((unsigned char*)src)[pos]);
}
break;
}
}
- if (output_size < maxsize) ((unsigned char *)dst)[output_size++] = '\0';
+ out('\0');
return output_size;
}
-------------------------------------------------------
SF.Net email is sponsored by:
Tame your development challenges with Apache's Geronimo App Server. Download
it for free - -and be entered to win a 42" plasma tv or your very own
Sony(tm)PSP. Click here to play: http://sourceforge.net/geronimo.php