* Bugs: the spec doesn't mention anything about "`\n`\n" prior to the
* "end" line
*/
+//config:config UUDECODE
+//config: bool "uudecode (5.9 kb)"
+//config: default y
+//config: help
+//config: uudecode is used to decode a uuencoded file.
+
+//applet:IF_UUDECODE(APPLET(uudecode, BB_DIR_USR_BIN, BB_SUID_DROP))
+
+//kbuild:lib-$(CONFIG_UUDECODE) += uudecode.o
//usage:#define uudecode_trivial_usage
//usage: "[-o OUTFILE] [INFILE]"
{
char *line;
- while ((line = xmalloc_fgetline(src_stream)) != NULL) {
+ for (;;) {
int encoded_len, str_len;
char *line_ptr, *dst;
+ size_t line_len;
+
+ line_len = 64 * 1024;
+ line = xmalloc_fgets_str_len(src_stream, "\n", &line_len);
+ if (!line)
+ break;
+ /* Handle both Unix and MSDOS text.
+ * Note: space should not be trimmed, some encoders use it instead of "`"
+ * for padding of last incomplete 4-char block.
+ */
+ str_len = line_len;
+ while (--str_len >= 0
+ && (line[str_len] == '\n' || line[str_len] == '\r')
+ ) {
+ line[str_len] = '\0';
+ }
if (strcmp(line, "end") == 0) {
return; /* the only non-error exit */
encoded_len = line[0] * 4 / 3;
/* Check that line is not too short. (we tolerate
- * overly _long_ line to accomodate possible extra '`').
+ * overly _long_ line to accommodate possible extra "`").
* Empty line case is also caught here. */
if (str_len <= encoded_len) {
break; /* go to bb_error_msg_and_die("short file"); */
char *outname = NULL;
char *line;
- opt_complementary = "?1"; /* 1 argument max */
- getopt32(argv, "o:", &outname);
+ getopt32(argv, "^" "o:" "\0" "?1"/* 1 arg max*/, &outname);
argv += optind;
if (!argv[0])
if (!outname)
break;
outname++;
+ trim(outname); /* remove trailing space (and '\r' for DOS text) */
if (!outname[0])
break;
}
//kbuild:lib-$(CONFIG_BASE64) += uudecode.o
//config:config BASE64
-//config: bool "base64"
+//config: bool "base64 (5 kb)"
//config: default y
//config: help
-//config: Base64 encode and decode
+//config: Base64 encode and decode
//usage:#define base64_trivial_usage
//usage: "[-d] [FILE]"
FILE *src_stream;
unsigned opts;
- opt_complementary = "?1"; /* 1 argument max */
- opts = getopt32(argv, "d");
+ opts = getopt32(argv, "^" "d" "\0" "?1"/* 1 arg max*/);
argv += optind;
if (!argv[0])