-/* $Id: Base64.xs,v 1.37 2003/05/13 18:20:18 gisle Exp $
+/* $Id: Base64.xs,v 1.38 2003/10/09 11:26:12 gisle Exp $
Copyright 1997-2003 Gisle Aas
chunk = 0;
}
c1 = *str++;
- c2 = *str++;
+ c2 = len > 1 ? *str++ : '\0';
*r++ = basis_64[c1>>2];
*r++ = basis_64[((c1 & 0x3)<< 4) | ((c2 & 0xF0) >> 4)];
if (len > 2) {
while (p < end && qp_isplain(*p)) {
p++;
}
- if (*p == '\n' || p == end) {
+ if (p == end || *p == '\n') {
/* whitespace at end of line must be encoded */
while (p > p_beg && (*(p - 1) == '\t' || *(p - 1) == ' '))
p--;
if (p_len) {
/* output plain text (with line breaks) */
if (eol_len) {
- STRLEN max_last_line = (*p == '\n' || p == end)
+ STRLEN max_last_line = (p == end || *p == '\n')
? MAX_LINE /* .......\n */
- : (*(p + 1) == '\n' || (p + 1) == end)
+ : ((p + 1) == end || *(p + 1) == '\n')
? MAX_LINE - 3 /* ....=XX\n */
: MAX_LINE - 4; /* ...=XX=\n */
while (p_len + linelen > max_last_line) {
}
}
- if (*p == '\n' && eol_len) {
+ if (p == end) {
+ break;
+ }
+ else if (*p == '\n' && eol_len) {
sv_catpvn(RETVAL, eol, eol_len);
p++;
linelen = 0;
}
- else if (p < end) {
+ else {
/* output escaped char (with line breaks) */
+ assert(p < end)
if (eol_len && linelen > MAX_LINE - 4) {
sv_catpvn(RETVAL, "=", 1);
sv_catpvn(RETVAL, eol, eol_len);
p++;
linelen += 3;
}
- else {
- assert(p == end);
- break;
- }
/* optimize reallocs a bit */
if (SvLEN(RETVAL) > 80 && SvLEN(RETVAL) - SvCUR(RETVAL) < 3) {