We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Use gcc to compile the following code and run it with command ./a.out -t, decode_85() goes to: say1("invalid base85 alphabet (%c)\n",ch); return -1;
./a.out -t
decode_85()
#include <string.h> #include <stdio.h> //#undef DEBUG_85 #define DEBUG_85 #ifdef DEBUG_85 #define say(a) fprintf(stderr, a) #define say1(a,b) fprintf(stderr, a, b) #define say2(a,b,c) fprintf(stderr, a, b, c) #else #define say(a) do { /* nothing */ } while (0) #define say1(a,b) do { /* nothing */ } while (0) #define say2(a,b,c) do { /* nothing */ } while (0) #endif static const char en85[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '!', '#', '$', '%', '&', '(', ')', '*', '+', '-', ';', '<', '=', '>', '?', '@', '^', '_', '`', '{', '|', '}', '~' }; static char de85[256]; static void prep_base85(void) { if (de85['Z']) return; int i; for (i = 0; i < sizeof(en85); i++) { int ch = en85[i]; de85[ch] = i + 1; } } int decode_85(char *dst, const char *buffer, int len) { const char *start=buffer; prep_base85(); say2("decoding=>(given len=%d,converted len=%d)",len,len/4*5); say2(" decoding str:(%.*s)", len/4*5, buffer); while (len) { say1("\n(loop len=%d) ",len); unsigned acc = 0; int de, cnt = 4; unsigned char ch; do { ch = *buffer++; say1("%c",ch); de = de85[ch]; if (--de < 0){ //return error("invalid base85 alphabet %c", ch); say1("invalid base85 alphabet (%c)\n",ch); return -1; } acc = acc * 85 + de; } while (--cnt); ch = *buffer++; say1("%c",ch); de = de85[ch]; if (--de < 0){ //return error("invalid base85 alphabet %c", ch); say("error -2\n"); return -2; } /* Detect overflow. */ if (0xffffffff / 85 < acc || 0xffffffff - de < (acc *= 85)){ //return error("invalid base85 sequence %.5s", buffer-5); say("error -3\n"); return -3; } acc += de; say1(" %08X", acc); cnt = (len < 4) ? len : 4; len -= cnt; do { acc = (acc << 8) | (acc >> 24); *dst++ = acc; } while (--cnt); } say1("\n",len); //return 0; return buffer-start; } //#ifdef DEBUG_85 int main(int ac, char **av) { char buf[1024]; if (!strcmp(av[1], "-e")) { int len = strlen(av[2]); encode_85(buf, av[2], len); if (len <= 26) len = len + 'A' - 1; else len = len + 'a' - 26 - 1; printf("encoded:%c%s\n", len, buf); return 0; } if (!strcmp(av[1], "-d")) { int len = *av[2]; if ('A' <= len && len <= 'Z') len = len - 'A' + 1; else len = len - 'a' + 26 + 1; decode_85(buf, av[2]+1, len); printf("decoded:%.*s\n", len, buf); return 0; } if (!strcmp(av[1], "-t")) { /* char t[4] = { -1,-1,-1,-1 }; encode_85(buf, t, 4); printf("encoded: D%s\n", buf); return 0; */ char encoded[1024]; char decoded[1024]; const char instring[]="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZa"; int encoded_len=encode_85(encoded,instring,strlen(instring)); decode_85(decoded,encoded,encoded_len); say2("inlen=%d,outlen=%d",strlen(instring),encoded_len); say1("\n%s\n",decoded); return 0; } } //#endif
The text was updated successfully, but these errors were encountered:
No branches or pull requests
Use gcc to compile the following code and run it with command
./a.out -t
,decode_85()
goes to:say1("invalid base85 alphabet (%c)\n",ch); return -1;
The text was updated successfully, but these errors were encountered: