Main Page | Alphabetical List | Class List | File List | Class Members | File Members

stringexpand.h

Go to the documentation of this file.
00001 #ifndef __STRINGEXPAND_H_
00002 #define __STRINGEXPAND_H_
00003 
00004 #include <nlibc.h>
00005 #include <alloca.h>
00006 #include <string/strlen.h>
00007 
00012 #if !defined(__cflow_processed) || defined(_uses_stringexpand_stringexpand_h)
00013 inline char * stringexpand( const char *str, int len ) { 
00014         int *estr = (int *)alloca((len+1)*16 );
00015         unsigned *p = (unsigned *) str;
00016         int mshift = -8;
00017         int a, c=0, c2=8;
00018 
00019         if( ! (a=*p) ) return 0;
00020         do {
00021                 unsigned mask = 0xff;
00022                 unsigned vshift = 0;
00023                 do { 
00024                         int hi,lo;
00025                         unsigned u = (a & mask);
00026                         u = u>>vshift;
00027                         asm("\tlutcross.L %0 %1\n\tatr.H %0 $ZERO" : "=r" (hi) : "r" (u));
00028                         asm("\tlutmove.L %0 %1\n\tatr.H %0 $ZERO" : "=r" (lo) : "r" (u));
00029                         estr[c++] = lo;
00030                         where( c2 <= len ) {
00031                                 estr[c2++] = hi;
00032                         }
00033                         mask >>= mshift;
00034                         vshift += 8;
00035                 } while( mask );
00036                 c += 8;
00037                 c2 += 8;
00038                 a = *(++p);
00039         } while( a );
00040         return (char *)estr;
00041 }
00042 #endif
00043 
00044 #endif // __STRINGEXPAND_H_

Generated on Fri Jul 14 10:51:32 2006 for nlibc by doxygen 1.3.5