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
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.