Cc
Bcc: [EMAIL PROTECTED]
Subject: 
Reply-To: 

tags 324935 + patch
tags 324929 + patch
thanks

Hello,

the attached patch fixes the problem (it simply stopped reading the
output on the first = char, ie. on the first chunk though there were
multiple in the stream) and also adds buffering to make the thing four
times faster.

Eduard.

-- 
<mrvn> Jemand hier der buffy als DVD hat oder haben wird?
* mrvn outet sich mal als Buffy fan.
* weaselTM steht auf und setzt sich so weit wie moeglich von mrvn weg.
* nobse ist auch buffy fan :)
* nobse laeuft hinter weasel her
<weaselTM> was ist denn heutzutage alles maintainer. schrecklich. wir
        haben kein nivea^Wlevel mehr
--- vm-7.19/base64-decode.c
+++ vm-7.19/base64-decode.c
@@ -21,7 +21,7 @@
 main()
 {
     static char inalphabet[256], decoder[256];
-    int i, bits, c, char_count, errors = 0;
+    int i, bits, char_count, errors = 0;
 
 #ifdef WIN32
     _setmode( _fileno(stdout), _O_BINARY);
@@ -34,43 +34,60 @@
 
-    char_count = 0;
-    bits = 0;
-    while ((c = getchar()) != EOF) {
-       if (c == '=')
-         break;
-       if (c > 255 || ! inalphabet[c])
-         continue;
-       bits += decoder[c];
-       char_count++;
-       if (char_count == 4) {
-           putchar((bits >> 16));
-           putchar(((bits >> 8) & 0xff));
-           putchar((bits & 0xff));
-           bits = 0;
-           char_count = 0;
-       } else {
-           bits <<= 6;
-       }
-    }
-    if (c == EOF) {
-       if (char_count) {
-           fprintf(stderr, "base64-decode: base64 encoding incomplete: at 
least %d bits truncated",
-                   ((4 - char_count) * 6));
-           errors++;
-       }
-    } else { /* c == '=' */
-       switch (char_count) {
-         case 1:
-           fprintf(stderr, "base64-decode: base64 encoding incomplete: at 
least 2 bits missing");
-           errors++;
-           break;
-         case 2:
-           putchar((bits >> 10));
-           break;
-         case 3:
-           putchar((bits >> 16));
-           putchar(((bits >> 8) & 0xff));
-           break;
-       }
+#define BUFLEN 72*500 // must be multiple of 4
+
+    int len;
+    char buf[BUFLEN];
+    char outbuf[BUFLEN];
+
+    while(!feof(stdin)) {
+        unsigned char c;
+
+        int pos=0;
+        char *out=outbuf;
+        len=fread(buf, sizeof(c), BUFLEN, stdin);
+        if(!len) continue;
+
+cont_buffer:
+        char_count = 0;
+        bits = 0;
+        while(pos<len) {
+            c=buf[pos++];
+            if (c == '=')
+                break;
+            if (! inalphabet[c])
+                continue;
+            bits += decoder[c];
+            char_count++;
+            if (char_count == 4) {
+                *out++ = ((bits >> 16));
+                *out++ = (((bits >> 8) & 0xff));
+                *out++ = ((bits & 0xff));
+                bits = 0;
+                char_count = 0;
+            } else {
+                bits <<= 6;
+            }
+        }
+        switch (char_count) {
+            case 1:
+                fprintf(stderr, "base64-decode: base64 encoding incomplete: at 
least 2 bits missing");
+                errors++;
+                break;
+            case 2:
+                *out++ = ((bits >> 10));
+                break;
+            case 3:
+                *out++ = ((bits >> 16));
+                *out++ = (((bits >> 8) & 0xff));
+                break;
+            case 0:
+                break;
+            default:
+                fprintf(stderr, "base64-decode: base64 encoding incomplete: at 
least %d bits truncated",
+                        ((4 - char_count) * 6));
+        }
+        if(pos<len) // did not proceed the whole thing, continue
+            goto cont_buffer;
+        fwrite(outbuf, sizeof(char), (out-outbuf), stdout);
     }
-    exit(errors ? 1 : 0);
+    return (errors ? 1 : 0);
 }

Reply via email to