int error;
};
+#define BUFTEST
#include "../textbuf.c"
#define assert(x) if (!(x)) { \
buf_append_base64(buf, testbytes, -1, 0);
assert(buf_error(buf) == -EINVAL);
+ buf->error = 0;
+ buf_truncate(buf);
+
+ int ll;
+
+ for (ll = 0; ll < 128; ll += 4) {
+ for (len = 0; len < 16384; len++) {
+ buf_truncate(buf);
+ buf_append_base64(buf, testbytes, len, ll);
+ assert(!buf_error(buf));
+ if (len > 128)
+ len += len/2;
+ }
+ }
buf_free(buf);
return 0;
}
if (!buf || buf->error)
return;
- if (len < 0 || line_len < 0 || (line_len % 3)) {
+ if (len < 0 || line_len < 0 || (line_len & 3)) {
buf->error = -EINVAL;
return;
}
- unsigned int needed = ((len + 2u) / 3) * 4 + 1;
- if (line_len)
- needed += needed / line_len;
+ unsigned int needed = ((len + 2u) / 3) * 4;
+
+ /* Line endings, but not for the last line if it reaches line_len */
+ if (line_len && needed)
+ needed += (needed - 1) / line_len;
+ needed++; /* Allow for the trailing NUL */
if (needed >= (unsigned)(OC_BUF_MAX - buf->pos)) {
buf->error = -E2BIG;
if (buf_ensure_space(buf, needed))
return;
+#ifdef BUFTEST
+ int orig_len = len, orig_pos = buf->pos;
+#endif
int ll = 0;
while (len > 0) {
if (line_len) {
in += 3;
len -= 3;
}
+#ifdef BUFTEST
+ if (buf->pos != orig_pos + needed - 1) {
+ printf("Used %d instead of calculated %d for %d bytes at line len %d\n",
+ buf->pos - orig_pos, needed, orig_len, line_len);
+ buf->error = -EIO;
+ }
+#endif
buf->data[buf->pos] = 0;
}