bintrans: make mmencode.c compilable
Also remove MSDOS code, base64 code and commented out code.
This commit is contained in:
parent
8a65b02dac
commit
9d68da4ee8
@ -13,108 +13,11 @@ OF THIS MATERIAL FOR ANY PURPOSE. IT IS PROVIDED "AS IS",
|
||||
WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES.
|
||||
*/
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <ctype.h>
|
||||
#include <config.h>
|
||||
|
||||
extern char *index();
|
||||
static char basis_64[] =
|
||||
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
|
||||
|
||||
static char index_64[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,62, -1,-1,-1,63,
|
||||
52,53,54,55, 56,57,58,59, 60,61,-1,-1, -1,-1,-1,-1,
|
||||
-1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10, 11,12,13,14,
|
||||
15,16,17,18, 19,20,21,22, 23,24,25,-1, -1,-1,-1,-1,
|
||||
-1,26,27,28, 29,30,31,32, 33,34,35,36, 37,38,39,40,
|
||||
41,42,43,44, 45,46,47,48, 49,50,51,-1, -1,-1,-1,-1
|
||||
};
|
||||
|
||||
#define char64(c) (((c) < 0 || (c) > 127) ? -1 : index_64[(c)])
|
||||
|
||||
/*
|
||||
char64(c)
|
||||
char c;
|
||||
{
|
||||
char *s = (char *) index(basis_64, c);
|
||||
if (s) return(s-basis_64);
|
||||
return(-1);
|
||||
}
|
||||
*/
|
||||
|
||||
/* the following gets a character, but fakes it properly into two chars if there's a newline character */
|
||||
static int InNewline=0;
|
||||
|
||||
int nextcharin(infile, PortableNewlines)
|
||||
FILE *infile;
|
||||
int PortableNewlines;
|
||||
{
|
||||
int c;
|
||||
|
||||
#ifndef NEWLINE_CHAR
|
||||
return(getc(infile));
|
||||
#else
|
||||
if (!PortableNewlines) return(getc(infile));
|
||||
if (InNewline) {
|
||||
InNewline = 0;
|
||||
return(10); /* LF */
|
||||
}
|
||||
c = getc(infile);
|
||||
if (c == NEWLINE_CHAR) {
|
||||
InNewline = 1;
|
||||
return(13); /* CR */
|
||||
}
|
||||
return(c);
|
||||
#endif
|
||||
}
|
||||
|
||||
to64(infile, outfile, PortableNewlines)
|
||||
FILE *infile, *outfile;
|
||||
int PortableNewlines;
|
||||
{
|
||||
int c1, c2, c3, ct=0;
|
||||
InNewline = 0; /* always reset it */
|
||||
while ((c1 = nextcharin(infile, PortableNewlines)) != EOF) {
|
||||
c2 = nextcharin(infile, PortableNewlines);
|
||||
if (c2 == EOF) {
|
||||
output64chunk(c1, 0, 0, 2, outfile);
|
||||
} else {
|
||||
c3 = nextcharin(infile, PortableNewlines);
|
||||
if (c3 == EOF) {
|
||||
output64chunk(c1, c2, 0, 1, outfile);
|
||||
} else {
|
||||
output64chunk(c1, c2, c3, 0, outfile);
|
||||
}
|
||||
}
|
||||
ct += 4;
|
||||
if (ct > 71) {
|
||||
putc('\n', outfile);
|
||||
ct = 0;
|
||||
}
|
||||
}
|
||||
if (ct) putc('\n', outfile);
|
||||
fflush(outfile);
|
||||
}
|
||||
|
||||
output64chunk(c1, c2, c3, pads, outfile)
|
||||
FILE *outfile;
|
||||
{
|
||||
putc(basis_64[c1>>2], outfile);
|
||||
putc(basis_64[((c1 & 0x3)<< 4) | ((c2 & 0xF0) >> 4)], outfile);
|
||||
if (pads == 2) {
|
||||
putc('=', outfile);
|
||||
putc('=', outfile);
|
||||
} else if (pads) {
|
||||
putc(basis_64[((c2 & 0xF) << 2) | ((c3 & 0xC0) >>6)], outfile);
|
||||
putc('=', outfile);
|
||||
} else {
|
||||
putc(basis_64[((c2 & 0xF) << 2) | ((c3 & 0xC0) >>6)], outfile);
|
||||
putc(basis_64[c3 & 0x3F], outfile);
|
||||
}
|
||||
}
|
||||
|
||||
PendingBoundary(s, Boundaries, BoundaryCt)
|
||||
int PendingBoundary(s, Boundaries, BoundaryCt)
|
||||
char *s;
|
||||
char **Boundaries;
|
||||
int *BoundaryCt;
|
||||
@ -134,118 +37,6 @@ int *BoundaryCt;
|
||||
return(0);
|
||||
}
|
||||
|
||||
/* If we're in portable newline mode, we have to convert CRLF to the
|
||||
local newline convention on output */
|
||||
|
||||
static int CRpending = 0;
|
||||
|
||||
#ifdef NEWLINE_CHAR
|
||||
almostputc(c, outfile, PortableNewlines)
|
||||
int c;
|
||||
FILE *outfile;
|
||||
int PortableNewlines;
|
||||
{
|
||||
if (CRpending) {
|
||||
if (c == 10) {
|
||||
putc(NEWLINE_CHAR, outfile);
|
||||
CRpending = 0;
|
||||
} else {
|
||||
putc(13, outfile);
|
||||
if (c != 13) {
|
||||
putc(c, outfile);
|
||||
CRpending = 0;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (PortableNewlines && c == 13) {
|
||||
CRpending = 1;
|
||||
} else {
|
||||
putc(c, outfile);
|
||||
}
|
||||
}
|
||||
}
|
||||
#else
|
||||
almostputc(c, outfile, PortableNewlines)
|
||||
int c;
|
||||
FILE *outfile;
|
||||
int PortableNewlines;
|
||||
{
|
||||
putc(c, outfile);
|
||||
}
|
||||
#endif
|
||||
|
||||
from64(infile, outfile, boundaries, boundaryct, PortableNewlines)
|
||||
FILE *infile, *outfile;
|
||||
char **boundaries;
|
||||
int *boundaryct;
|
||||
int PortableNewlines;
|
||||
{
|
||||
int c1, c2, c3, c4;
|
||||
int newline = 1, DataDone = 0;
|
||||
|
||||
/* always reinitialize */
|
||||
CRpending = 0;
|
||||
while ((c1 = getc(infile)) != EOF) {
|
||||
if (isspace(c1)) {
|
||||
if (c1 == '\n') {
|
||||
newline = 1;
|
||||
} else {
|
||||
newline = 0;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
if (newline && boundaries && c1 == '-') {
|
||||
char Buf[200];
|
||||
/* a dash is NOT base 64, so all bets are off if NOT a boundary */
|
||||
ungetc(c1, infile);
|
||||
fgets(Buf, sizeof(Buf), infile);
|
||||
if (boundaries
|
||||
&& (Buf[0] == '-')
|
||||
&& (Buf[1] == '-')
|
||||
&& PendingBoundary(Buf, boundaries, boundaryct)) {
|
||||
return;
|
||||
}
|
||||
fprintf(stderr, "Ignoring unrecognized boundary line: %s\n", Buf);
|
||||
continue;
|
||||
}
|
||||
if (DataDone) continue;
|
||||
newline = 0;
|
||||
do {
|
||||
c2 = getc(infile);
|
||||
} while (c2 != EOF && isspace(c2));
|
||||
do {
|
||||
c3 = getc(infile);
|
||||
} while (c3 != EOF && isspace(c3));
|
||||
do {
|
||||
c4 = getc(infile);
|
||||
} while (c4 != EOF && isspace(c4));
|
||||
if (c2 == EOF || c3 == EOF || c4 == EOF) {
|
||||
fprintf(stderr, "Warning: base64 decoder saw premature EOF!\n");
|
||||
return;
|
||||
}
|
||||
if (c1 == '=' || c2 == '=') {
|
||||
DataDone=1;
|
||||
continue;
|
||||
}
|
||||
c1 = char64(c1);
|
||||
c2 = char64(c2);
|
||||
almostputc(((c1<<2) | ((c2&0x30)>>4)), outfile, PortableNewlines);
|
||||
if (c3 == '=') {
|
||||
DataDone = 1;
|
||||
} else {
|
||||
c3 = char64(c3);
|
||||
almostputc((((c2&0XF) << 4) | ((c3&0x3C) >> 2)), outfile, PortableNewlines);
|
||||
if (c4 == '=') {
|
||||
DataDone = 1;
|
||||
} else {
|
||||
c4 = char64(c4);
|
||||
almostputc((((c3&0x03) <<6) | c4), outfile, PortableNewlines);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (CRpending) putc(13, outfile); /* Don't drop a lone trailing char 13 */
|
||||
}
|
||||
|
||||
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,
|
||||
@ -263,19 +54,7 @@ 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)])
|
||||
|
||||
/*
|
||||
hexchar(c)
|
||||
char c;
|
||||
{
|
||||
char *s;
|
||||
if (islower(c)) c = toupper(c);
|
||||
s = (char *) index(basis_hex, c);
|
||||
if (s) return(s-basis_hex);
|
||||
return(-1);
|
||||
}
|
||||
*/
|
||||
|
||||
toqp(infile, outfile)
|
||||
void toqp(infile, outfile)
|
||||
FILE *infile, *outfile;
|
||||
{
|
||||
int c, ct=0, prevc=255;
|
||||
@ -350,7 +129,7 @@ FILE *infile, *outfile;
|
||||
}
|
||||
}
|
||||
|
||||
fromqp(infile, outfile, boundaries, boundaryct)
|
||||
void fromqp(infile, outfile, boundaries, boundaryct)
|
||||
FILE *infile, *outfile;
|
||||
char **boundaries;
|
||||
int *boundaryct;
|
||||
@ -391,10 +170,6 @@ int *boundaryct;
|
||||
putc(c1<<4 | c2, outfile);
|
||||
}
|
||||
} else {
|
||||
#ifdef MSDOS
|
||||
if (*s == '\n')
|
||||
putc('\r', outfile); /* insert CR for binary-mode write */
|
||||
#endif
|
||||
putc(*s, outfile);
|
||||
}
|
||||
}
|
||||
@ -433,34 +208,13 @@ int *boundaryct;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
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",
|
||||
WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES.
|
||||
*/
|
||||
#include <stdio.h>
|
||||
#include <config.h>
|
||||
#ifdef MSDOS
|
||||
#include <fcntl.h>
|
||||
#endif
|
||||
|
||||
#define BASE64 1
|
||||
#define QP 2 /* quoted-printable */
|
||||
|
||||
main(argc, argv)
|
||||
int main(argc, argv)
|
||||
int argc;
|
||||
char **argv;
|
||||
{
|
||||
int encode = 1, which = BASE64, i, portablenewlines = 0;
|
||||
int encode = 1, i;
|
||||
FILE *fp = stdin;
|
||||
FILE *fpo = stdout;
|
||||
|
||||
@ -481,50 +235,20 @@ char **argv;
|
||||
case 'u':
|
||||
encode = 0;
|
||||
break;
|
||||
case 'q':
|
||||
which = QP;
|
||||
break;
|
||||
case 'p':
|
||||
portablenewlines = 1;
|
||||
break;
|
||||
case 'b':
|
||||
which = BASE64;
|
||||
break;
|
||||
default:
|
||||
fprintf(stderr,
|
||||
"Usage: mmencode [-u] [-q] [-b] [-p] [-o outputfile] [file name]\n");
|
||||
"Usage: mmencode [-u] [-o outputfile] [file name]\n");
|
||||
exit(-1);
|
||||
}
|
||||
} else {
|
||||
#ifdef MSDOS
|
||||
if (encode)
|
||||
fp = fopen(argv[i], "rb");
|
||||
else
|
||||
{
|
||||
fp = fopen(argv[i], "rt");
|
||||
setmode(fileno(fpo), O_BINARY);
|
||||
} /* else */
|
||||
#else
|
||||
fp = fopen(argv[i], "r");
|
||||
#endif /* MSDOS */
|
||||
if (!fp) {
|
||||
perror(argv[i]);
|
||||
exit(-1);
|
||||
}
|
||||
}
|
||||
}
|
||||
#ifdef MSDOS
|
||||
if (fp == stdin) setmode(fileno(fp), O_BINARY);
|
||||
#endif /* MSDOS */
|
||||
if (which == BASE64) {
|
||||
if (encode) {
|
||||
to64(fp, fpo, portablenewlines);
|
||||
} else {
|
||||
from64(fp,fpo, (char **) NULL, (int *) 0, portablenewlines);
|
||||
}
|
||||
} else {
|
||||
if (encode) toqp(fp, fpo); else fromqp(fp, fpo, NULL, 0);
|
||||
}
|
||||
if (encode) toqp(fp, fpo); else fromqp(fp, fpo, NULL, 0);
|
||||
return(0);
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user