base32/64: decode in-place
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
parent
c8b3d9a145
commit
cdab3c4fac
@ -286,13 +286,19 @@ int baseNUM_main(int argc UNUSED_PARAM, char **argv)
|
|||||||
} else {
|
} else {
|
||||||
enum {
|
enum {
|
||||||
SRC_BUF_SIZE = 3 * 5 * 32, /* this *MUST* be a multiple of 3 and 5 */
|
SRC_BUF_SIZE = 3 * 5 * 32, /* this *MUST* be a multiple of 3 and 5 */
|
||||||
DST_BUF_SIZE = 4 * ((SRC_BUF_SIZE + 2) / 3),
|
DST_BUF_SIZE = 8 * ((SRC_BUF_SIZE + 4) / 5), /* max growth on decode (base32 case) */
|
||||||
};
|
};
|
||||||
char src_buf[SRC_BUF_SIZE];
|
/* Use one buffer for both input and output:
|
||||||
char dst_buf[DST_BUF_SIZE + 1];
|
* decoding reads input "left-to-right",
|
||||||
int src_fd = fileno(src_stream);
|
* it's safe to place source at the end of the buffer and
|
||||||
int rem = 0;
|
* overwrite it while decoding, just be careful to have a gap.
|
||||||
|
*/
|
||||||
|
char dst_buf[((DST_BUF_SIZE + /*gap:*/ 16) /*round up to 16:*/ | 0xf) + 1];
|
||||||
|
#define src_buf (dst_buf + sizeof(dst_buf) - SRC_BUF_SIZE)
|
||||||
|
int src_fd, rem;
|
||||||
|
|
||||||
|
src_fd = fileno(src_stream);
|
||||||
|
rem = 0;
|
||||||
while (1) {
|
while (1) {
|
||||||
size_t size = full_read(src_fd, src_buf, SRC_BUF_SIZE);
|
size_t size = full_read(src_fd, src_buf, SRC_BUF_SIZE);
|
||||||
if ((ssize_t)size < 0)
|
if ((ssize_t)size < 0)
|
||||||
@ -331,6 +337,7 @@ int baseNUM_main(int argc UNUSED_PARAM, char **argv)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#undef src_buf
|
||||||
}
|
}
|
||||||
|
|
||||||
fflush_stdout_and_exit(EXIT_SUCCESS);
|
fflush_stdout_and_exit(EXIT_SUCCESS);
|
||||||
|
Loading…
Reference in New Issue
Block a user