aboutsummaryrefslogtreecommitdiff
path: root/usr.bin/bintrans
diff options
context:
space:
mode:
authorPiotr Pawel Stefaniak <pstef@FreeBSD.org>2022-04-15 13:00:36 +0000
committerPiotr Pawel Stefaniak <pstef@FreeBSD.org>2022-04-24 06:19:49 +0000
commitff2b1ffbb0454e23de374b0054b4bc06c81336a6 (patch)
treec1eda23ada8b88465934bd323f3e40befc6050c2 /usr.bin/bintrans
parent9d68da4ee8555824ed6b9b042a253b4008ee77d2 (diff)
downloadsrc-ff2b1ffbb0454e23de374b0054b4bc06c81336a6.tar.gz
src-ff2b1ffbb0454e23de374b0054b4bc06c81336a6.zip
Diffstat (limited to 'usr.bin/bintrans')
-rw-r--r--usr.bin/bintrans/mmencode.c445
1 files changed, 224 insertions, 221 deletions
diff --git a/usr.bin/bintrans/mmencode.c b/usr.bin/bintrans/mmencode.c
index 511e470150bb..a391f4d7e1d4 100644
--- a/usr.bin/bintrans/mmencode.c
+++ b/usr.bin/bintrans/mmencode.c
@@ -1,52 +1,53 @@
/*
Copyright (c) 1991 Bell Communications Research, Inc. (Bellcore)
-Permission to use, copy, modify, and distribute this material
-for any purpose and without fee is hereby granted, provided
-that the above copyright notice and this permission notice
-appear in all copies, and that the name of Bellcore not be
-used in advertising or publicity pertaining to this
-material without the specific, prior written permission
-of an authorized representative of Bellcore. BELLCORE
-MAKES NO REPRESENTATIONS ABOUT THE ACCURACY OR SUITABILITY
-OF THIS MATERIAL FOR ANY PURPOSE. IT IS PROVIDED "AS IS",
+Permission to use, copy, modify, and distribute this material
+for any purpose and without fee is hereby granted, provided
+that the above copyright notice and this permission notice
+appear in all copies, and that the name of Bellcore not be
+used in advertising or publicity pertaining to this
+material without the specific, prior written permission
+of an authorized representative of Bellcore. BELLCORE
+MAKES NO REPRESENTATIONS ABOUT THE ACCURACY OR SUITABILITY
+OF THIS MATERIAL FOR ANY PURPOSE. IT IS PROVIDED "AS IS",
WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES.
*/
+#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
-int PendingBoundary(s, Boundaries, BoundaryCt)
-char *s;
-char **Boundaries;
-int *BoundaryCt;
+static int
+PendingBoundary(char *s, char **Boundaries, int *BoundaryCt)
{
- int i, len;
+ int i;
+ size_t len;
- if (s[0] != '-' || s[1] != '-') return(0);
+ if (s[0] != '-' || s[1] != '-')
+ return (0);
-
- for (i=0; i < *BoundaryCt; ++i) {
- len = strlen(Boundaries[i]);
- if (!strncmp(s, Boundaries[i], len)) {
- if (s[len] == '-' && s[len+1] == '-') *BoundaryCt = i;
- return(1);
- }
- }
- return(0);
+ for (i = 0; i < *BoundaryCt; ++i) {
+ len = strlen(Boundaries[i]);
+ if (strncmp(s, Boundaries[i], len) == 0) {
+ if (s[len] == '-' && s[len + 1] == '-')
+ *BoundaryCt = i;
+ return (1);
+ }
+ }
+ return (0);
}
-static char basis_hex[] = "0123456789ABCDEF";
-static char index_hex[128] = {
- -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1,
- -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1,
- -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1,
- 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,-1,-1, -1,-1,-1,-1,
- -1,10,11,12, 13,14,15,-1, -1,-1,-1,-1, -1,-1,-1,-1,
- -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1,
- -1,10,11,12, 13,14,15,-1, -1,-1,-1,-1, -1,-1,-1,-1,
- -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1
+#define basis_hex "0123456789ABCDEF"
+static const char index_hex[128] = {
+ -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1,
+ -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1,
+ -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1,
+ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,-1,-1, -1,-1,-1,-1,
+ -1,10,11,12, 13,14,15,-1, -1,-1,-1,-1, -1,-1,-1,-1,
+ -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1,
+ -1,10,11,12, 13,14,15,-1, -1,-1,-1,-1, -1,-1,-1,-1,
+ -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1
};
/* The following version generated complaints on Solaris. */
@@ -54,201 +55,203 @@ static char index_hex[128] = {
/* Since we're no longer ever calling it with anything signed, this should work: */
#define hexchar(c) (((c) > 127) ? -1 : index_hex[(c)])
-void toqp(infile, outfile)
-FILE *infile, *outfile;
+static void
+toqp(FILE *infile, FILE *outfile)
{
- int c, ct=0, prevc=255;
- while ((c = getc(infile)) != EOF) {
- if ((c < 32 && (c != '\n' && c != '\t'))
- || (c == '=')
- || (c >= 127)
- /* Following line is to avoid single periods alone on lines,
- which messes up some dumb smtp implementations, sigh... */
- || (ct == 0 && c == '.')) {
- putc('=', outfile);
- putc(basis_hex[c>>4], outfile);
- putc(basis_hex[c&0xF], outfile);
- ct += 3;
- prevc = 'A'; /* close enough */
- } else if (c == '\n') {
- if (prevc == ' ' || prevc == '\t') {
- putc('=', outfile); /* soft & hard lines */
- putc(c, outfile);
- }
- putc(c, outfile);
- ct = 0;
- prevc = c;
- } else {
- if (c == 'F' && prevc == '\n') {
- /* HORRIBLE but clever hack suggested by MTR for sendmail-avoidance */
- c = getc(infile);
- if (c == 'r') {
- c = getc(infile);
- if (c == 'o') {
- c = getc(infile);
- if (c == 'm') {
- c = getc(infile);
- if (c == ' ') {
- /* This is the case we are looking for */
- fputs("=46rom", outfile);
- ct += 6;
- } else {
- fputs("From", outfile);
- ct += 4;
- }
- } else {
- fputs("Fro", outfile);
- ct += 3;
- }
- } else {
- fputs("Fr", outfile);
- ct += 2;
- }
- } else {
- putc('F', outfile);
- ++ct;
- }
- ungetc(c, infile);
- prevc = 'x'; /* close enough -- printable */
- } else { /* END horrible hack */
- putc(c, outfile);
- ++ct;
- prevc = c;
- }
- }
- if (ct > 72) {
- putc('=', outfile);
- putc('\n', outfile);
- ct = 0;
- prevc = '\n';
- }
- }
- if (ct) {
- putc('=', outfile);
- putc('\n', outfile);
- }
+ int c, ct = 0, prevc = 255;
+
+ while ((c = getc(infile)) != EOF) {
+ if ((c < 32 && (c != '\n' && c != '\t'))
+ || (c == '=')
+ || (c >= 127)
+ /* Following line is to avoid single periods alone on lines,
+ which messes up some dumb smtp implementations, sigh... */
+ || (ct == 0 && c == '.')) {
+ putc('=', outfile);
+ putc(basis_hex[c >> 4], outfile);
+ putc(basis_hex[c & 0xF], outfile);
+ ct += 3;
+ prevc = 'A'; /* close enough */
+ } else if (c == '\n') {
+ if (prevc == ' ' || prevc == '\t') {
+ putc('=', outfile); /* soft & hard lines */
+ putc(c, outfile);
+ }
+ putc(c, outfile);
+ ct = 0;
+ prevc = c;
+ } else {
+ if (c == 'F' && prevc == '\n') {
+ /* HORRIBLE but clever hack suggested by MTR for sendmail-avoidance */
+ c = getc(infile);
+ if (c == 'r') {
+ c = getc(infile);
+ if (c == 'o') {
+ c = getc(infile);
+ if (c == 'm') {
+ c = getc(infile);
+ if (c == ' ') {
+ /* This is the case we are looking for */
+ fputs("=46rom", outfile);
+ ct += 6;
+ } else {
+ fputs("From", outfile);
+ ct += 4;
+ }
+ } else {
+ fputs("Fro", outfile);
+ ct += 3;
+ }
+ } else {
+ fputs("Fr", outfile);
+ ct += 2;
+ }
+ } else {
+ putc('F', outfile);
+ ++ct;
+ }
+ ungetc(c, infile);
+ prevc = 'x'; /* close enough -- printable */
+ } else { /* END horrible hack */
+ putc(c, outfile);
+ ++ct;
+ prevc = c;
+ }
+ }
+ if (ct > 72) {
+ putc('=', outfile);
+ putc('\n', outfile);
+ ct = 0;
+ prevc = '\n';
+ }
+ }
+ if (ct) {
+ putc('=', outfile);
+ putc('\n', outfile);
+ }
}
-void fromqp(infile, outfile, boundaries, boundaryct)
-FILE *infile, *outfile;
-char **boundaries;
-int *boundaryct;
+static void
+fromqp(FILE *infile, FILE *outfile, char **boundaries, int *boundaryct)
{
- unsigned int c1, c2;
- int sawnewline = 1, neednewline = 0;
- /* The neednewline hack is necessary because the newline leading into
- a multipart boundary is part of the boundary, not the data */
+ int c1, c2;
+ bool sawnewline = true, neednewline = false;
+ /* The neednewline hack is necessary because the newline leading into
+ a multipart boundary is part of the boundary, not the data */
- while ((c1 = getc(infile)) != EOF) {
- if (sawnewline && boundaries && (c1 == '-')) {
- char Buf[200];
- unsigned char *s;
+ while ((c1 = getc(infile)) != EOF) {
+ if (sawnewline && boundaries && c1 == '-') {
+ char Buf[200];
+ unsigned char *s;
- ungetc(c1, infile);
- fgets(Buf, sizeof(Buf), infile);
- if (boundaries
- && (Buf[0] == '-')
- && (Buf[1] == '-')
- && PendingBoundary(Buf, boundaries, boundaryct)) {
- return;
- }
- /* Not a boundary, now we must treat THIS line as q-p, sigh */
- if (neednewline) {
- putc('\n', outfile);
- neednewline = 0;
- }
- for (s=(unsigned char *) Buf; *s; ++s) {
- if (*s == '=') {
- if (!*++s) break;
- if (*s == '\n') {
- /* ignore it */
- sawnewline = 1;
- } else {
- c1 = hexchar(*s);
- if (!*++s) break;
- c2 = hexchar(*s);
- putc(c1<<4 | c2, outfile);
- }
- } else {
- putc(*s, outfile);
- }
- }
- } else {
- if (neednewline) {
- putc('\n', outfile);
- neednewline = 0;
- }
- if (c1 == '=') {
- sawnewline = 0;
- c1 = getc(infile);
- if (c1 == '\n') {
- /* ignore it */
- sawnewline = 1;
- } else {
- c2 = getc(infile);
- c1 = hexchar(c1);
- c2 = hexchar(c2);
- putc(c1<<4 | c2, outfile);
- if (c2 == '\n') sawnewline = 1;
- }
- } else {
- if (c1 == '\n') {
- sawnewline = 1;
- neednewline = 1;
- } else {
- sawnewline = 0;
- putc(c1, outfile);
- }
- }
- }
- }
- if (neednewline) {
- putc('\n', outfile);
- neednewline = 0;
- }
+ ungetc(c1, infile);
+ fgets(Buf, sizeof(Buf), infile);
+ if (boundaries
+ && Buf[0] == '-'
+ && Buf[1] == '-'
+ && PendingBoundary(Buf, boundaries, boundaryct)) {
+ return;
+ }
+ /* Not a boundary, now we must treat THIS line as q-p, sigh */
+ if (neednewline) {
+ putc('\n', outfile);
+ neednewline = false;
+ }
+ for (s = (unsigned char *)Buf; *s; ++s) {
+ if (*s == '=') {
+ if (*++s == 0)
+ break;
+ if (*s == '\n') {
+ /* ignore it */
+ sawnewline = true;
+ } else {
+ c1 = hexchar(*s);
+ if (*++s == 0)
+ break;
+ c2 = hexchar(*s);
+ putc(c1 << 4 | c2, outfile);
+ }
+ } else {
+ putc(*s, outfile);
+ }
+ }
+ } else {
+ if (neednewline) {
+ putc('\n', outfile);
+ neednewline = false;
+ }
+ if (c1 == '=') {
+ sawnewline = false;
+ c1 = getc(infile);
+ if (c1 == '\n') {
+ /* ignore it */
+ sawnewline = true;
+ } else {
+ c2 = getc(infile);
+ c1 = hexchar(c1);
+ c2 = hexchar(c2);
+ putc(c1 << 4 | c2, outfile);
+ if (c2 == '\n')
+ sawnewline = true;
+ }
+ } else {
+ if (c1 == '\n') {
+ sawnewline = true;
+ neednewline = true;
+ } else {
+ sawnewline = false;
+ putc(c1, outfile);
+ }
+ }
+ }
+ }
+ if (neednewline) {
+ putc('\n', outfile);
+ neednewline = false;
+ }
}
-#define QP 2 /* quoted-printable */
-
-int main(argc, argv)
-int argc;
-char **argv;
+int
+main(int argc, char *argv[])
{
- int encode = 1, i;
- FILE *fp = stdin;
- FILE *fpo = stdout;
+ int i;
+ bool encode = true;
+ FILE *fp = stdin;
+ FILE *fpo = stdout;
- for (i=1; i<argc; ++i) {
- if (argv[i][0] == '-') {
- switch (argv[i][1]) {
- case 'o':
- if (++i >= argc) {
- fprintf(stderr, "mimencode: -o requires a file name.\n");
- exit(-1);
- }
- fpo = fopen(argv[i], "w");
- if (!fpo) {
- perror(argv[i]);
- exit(-1);
- }
- break;
- case 'u':
- encode = 0;
- break;
- default:
- fprintf(stderr,
- "Usage: mmencode [-u] [-o outputfile] [file name]\n");
- exit(-1);
- }
- } else {
- fp = fopen(argv[i], "r");
- if (!fp) {
- perror(argv[i]);
- exit(-1);
- }
- }
- }
- if (encode) toqp(fp, fpo); else fromqp(fp, fpo, NULL, 0);
- return(0);
+ for (i = 1; i < argc; ++i) {
+ if (argv[i][0] == '-') {
+ switch (argv[i][1]) {
+ case 'o':
+ if (++i >= argc) {
+ fprintf(stderr, "mimencode: -o requires a file name.\n");
+ exit(EXIT_FAILURE);
+ }
+ fpo = fopen(argv[i], "w");
+ if (fpo == NULL) {
+ perror(argv[i]);
+ exit(EXIT_FAILURE);
+ }
+ break;
+ case 'u':
+ encode = false;
+ break;
+ default:
+ fprintf(stderr,
+ "Usage: mmencode [-u] [-o outputfile] [file name]\n");
+ exit(EXIT_FAILURE);
+ }
+ } else {
+ fp = fopen(argv[i], "r");
+ if (fp == NULL) {
+ perror(argv[i]);
+ exit(EXIT_FAILURE);
+ }
+ }
+ }
+ if (encode)
+ toqp(fp, fpo);
+ else
+ fromqp(fp, fpo, NULL, 0);
+ return (0);
}
-