mirror of /home/gitosis/repositories/libowfat.git
parent
daf5111d43
commit
c51187748f
4 changed files with 45 additions and 28 deletions
@ -0,0 +1,34 @@ |
||||
#include "textcode.h" |
||||
#include "haveinline.h" |
||||
|
||||
static inline int dec(unsigned char x) { |
||||
if (x>='A' && x<='Z') return x-'A'; |
||||
if (x>='a' && x<='z') return x-'a'+26; |
||||
if (x>='0' && x<='9') return x-'0'+26+26; |
||||
switch (x) { |
||||
case '+': return 62; |
||||
case '/': return 63; |
||||
default: return -1; |
||||
} |
||||
} |
||||
|
||||
unsigned int scan_base64(const char *src,char *dest,unsigned int *destlen) { |
||||
unsigned short tmp=0,bits=0; |
||||
register const unsigned char* s=(const unsigned char*) src; |
||||
const char* orig=dest; |
||||
for (;;) { |
||||
int a=dec(*s); |
||||
if (a<0) { |
||||
while (*s=='=') ++s; |
||||
break; |
||||
} |
||||
tmp=(tmp<<6)|a; bits+=6; |
||||
++s; |
||||
if (bits>=8) { |
||||
*dest=(tmp>>(bits-=8)); |
||||
++dest; |
||||
} |
||||
} |
||||
*destlen=dest-orig; |
||||
return (const char*)s-src; |
||||
} |
Loading…
Reference in new issue