+void Yaz_Proxy::base64_decode(const char *base64, char *buf, int buf_len)
+{
+ const char *base64_chars =
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
+ int len = strlen(base64);
+ int buf_pos = 0;
+ int index = 1;
+
+ for (int pos = 0; pos <= len; pos++)
+ {
+ if (base64[pos] == '=' || buf_pos + 1 >= buf_len)
+ break;
+
+ const char *ch_ptr = strchr(base64_chars, base64[pos]);
+ if (!ch_ptr)
+ break;
+ char ch = (char) (ch_ptr - base64_chars);
+ switch (index)
+ {
+ case 1:
+ buf[buf_pos] = ch << 2;
+ break;
+ case 2:
+ buf[buf_pos++] += (ch & 0x30) >> 4;
+ buf[buf_pos] = (ch & 0x0f) << 4;
+ break;
+ case 3:
+ buf[buf_pos++] += (ch & 0x3c) >> 2;
+ buf[buf_pos] = (ch & 0x03) << 6;
+ break;
+ case 4:
+ buf[buf_pos++] += ch;
+ }
+ if (index < 4)
+ index++;
+ else
+ index = 1;
+ }
+ buf[buf_pos] = '\0';
+}
+