From:	SMTP%"MX-List@WKUVX1.WKU.EDU"  9-MAR-1994 17:08:54.73
To:	EVERHART
CC:	
Subj:	External Mime encoding/decoding

X-ListName: Message Exchange Discussion List <MX-List@WKUVX1.WKU.EDU>
Warnings-To: <>
Errors-To: List-Mgr@WKUVX1.WKU.EDU
Sender: List-Mgr@WKUVX1.WKU.EDU
Date: Wed, 09 Mar 1994 13:26:38 EST
From: "Brian Tillman" <tillman@swdev.si.com>
Reply-To: MX-List@WKUVX1.WKU.EDU
To: mx-list@wku.edu
Message-ID: <0097B2D8.6669D140.16202@swdev.si.com>
Subject: External Mime encoding/decoding

Several people have asked about a MIME (BASE64 or Quoted-Printable) decoder that 
can be used outside of MX to encode/decode.  Below you will find the sources for 
such a decoder.  I obtained it from Pete Sivia on DECUServe, who in turn 
obtained it from the MIME base distribution.  I've packaged it up as a VMS_SHARE 
collection.  It compiles with VAX C V3.2.  The form of the command is:

$ mmencode [-u] [-b] [-q] [-p] [-o outfile] [infile]

If -u is absent, the infile is encoded.  If -u is specified, infile is decoded.
If -b is specified, the encoding/decoding is BASE64
If -q is specified, the encoding/decoding is Quoted-Printable
If -p is specified, newlines are passed back to the encoding/decoding process 
(I'm not sure what this used for).
If -o outfile is specified, the encoding/decoding is placed in outfile

There is also a READ_MIME.COM procedure included to provide an interactive front 
end to MMENCODE.

$! ------------------ CUT HERE -----------------------
$ v='f$verify(f$trnlnm("SHARE_UNPACK_VERIFY"))'
$!
$! This archive created:
$!  Name : MMENCODE
$!  By   : tillman@swdev.si.com
$!  Date :  9-MAR-1994 13:23:10.79
$!  Using: VMS_SHARE 8.4, (C) 1993 Andy Harper, Kings College London UK
$!
$! Credit is due to these people for their original ideas:
$!    James Gray, Michael Bednarek 
$!
$! TO UNPACK THIS SHARE FILE, CONCATENATE ALL PARTS IN ORDER
$! AND EXECUTE AS A COMMAND PROCEDURE  (  @name  )
$!
$! THE FOLLOWING FILE(S) WILL BE CREATED AFTER UNPACKING:
$!       1. MMENCODE.C;1
$!       2. CODES.C;1
$!       3. CONFIG.H;1
$!       4. READ_MIME.COM;1
$!
$ set="set"
$ set symbol/scope=(nolocal,noglobal)
$ f=f$parse("SHARE_UNPACK_TEMP","SYS$SCRATCH:."+f$getjpi("","PID"))
$ e="write sys$error  ""%UNPACK"", "
$ w="write sys$output ""%UNPACK"", "
$ if .not. f$trnlnm("SHARE_UNPACK_LOG") then $ w = "!"
$ if f$getsyi("CPU") .gt. 127 then $ goto start
$ ve=f$getsyi("version")
$ if ve-f$extract(0,1,ve) .ges. "4.4" then $ goto start
$ e "-E-OLDVER, Must run at least VMS 4.4"
$ v=f$verify(v)
$ exit 44
$unpack: subroutine ! P1=filename, P2=checksum, P3=attributes,P4=size
$ if f$parse(P1) .nes. "" then $ goto dirok
$ dn=f$parse(P1,,,"DIRECTORY")
$ w "-I-CREDIR, Creating directory ''dn'"
$ create/dir 'dn'
$ if $status then $ goto dirok
$ e "-E-CREDIRFAIL, Unable to create ''dn' File skipped"
$ delete 'f'*
$ exit
$dirok:
$ x=f$search(P1)
$ if x .eqs. "" then $ goto file_absent
$ e "-W-EXISTS, File ''P1' exists. Skipped"
$ delete 'f'*
$ exit
$file_absent:
$ w "-I-UNPACK, Unpacking ", P5, " of ", P6, " - ", P1, " - ", P4, " Blocks"
$ n=P1
$ if P3 .nes. "" then $ n=f
$ if .not. f$verify() then $ define/user sys$output nl:
$ EDIT/TPU/NOSEC/NODIS/COM=SYS$INPUT/NOJOURNAL 'f'/OUT='n'
PROCEDURE GetHex(s,p)LOCAL x1,x2;x1:=INDEX(t,SUBSTR(s,p,1))-1;x2:=INDEX(t,
SUBSTR(s,p+1,1))-1;RETURN 16*x1+x2;ENDPROCEDURE;PROCEDURE SkipPartsep LOCAL m;
LOOP m:=MARK(NONE);EXITIF m=END_OF(b);DELETE(m);EXITIF INDEX(ERASE_LINE,
"-+-+-+-+-+-+-+-+")=1;ENDLOOP;ENDPROCEDURE;PROCEDURE ProcessLine LOCAL c,s,l,b,
n,p;c := ERASE_CHARACTER(1);s := ERASE_LINE;IF c = "X" THEN SPLIT_LINE; ENDIF;
MOVE_HORIZONTAL(-1);l := LENGTH(s);p := 1;LOOP EXITIF p > l;c := SUBSTR(s,p,1);
p := p+1;CASE c FROM ' ' TO '`' ['`']: COPY_TEXT(ASCII(GetHex(s,p))); p:=p+2;[
' ']: p:=p+1;[INRANGE,OUTRANGE]: COPY_TEXT(c);ENDCASE;ENDLOOP;ENDPROCEDURE;
PROCEDURE Decode LOCAL m;POSITION(BEGINNING_OF(b));LOOP m:=MARK(NONE);EXITIF m=
END_OF(b);DELETE(m);IF INDEX(CURRENT_LINE,"+-+-+-+-+-+-+-+-")=
1 THEN SkipPartSep;ELSE ProcessLine;MOVE_HORIZONTAL(1);ENDIF;ENDLOOP;
ENDPROCEDURE;SET(FACILITY_NAME,"UNPACK");SET(SUCCESS,OFF);SET(INFORMATIONAL,
OFF);t:="0123456789ABCDEF";f:=GET_INFO(COMMAND_LINE,"file_name");b:=
CREATE_BUFFER(f,f);Decode;WRITE_FILE(b,GET_INFO(COMMAND_LINE,"output_file"));
QUIT;
$ if p3 .eqs. "" then $ goto dl
$ open/write fdl &f
$ write fdl "RECORD"
$ write fdl P3
$ close fdl
$ w "-I-CONVRFM, Converting record format to ", P3
$ convert/fdl=&f &f-1 &P1
$dl: delete 'f'*
$ checksum 'P1'
$ if checksum$checksum .nes. P2 then $ -
  e "-E-CHKSMFAIL, Checksum of ''P1' failed."
$ exit
$ endsubroutine
$start:
$!
$ create 'f'
X/*
XCopyright`20(c)`201991`20Bell`20Communications`20Research,`20Inc.`20(Bellcore)
V
X
XPermission`20to`20use,`20copy,`20modify,`20and`20distribute`20this`20material
V`20
Xfor`20any`20purpose`20and`20without`20fee`20is`20hereby`20granted,`20provided
V`20
Xthat`20the`20above`20copyright`20notice`20and`20this`20permission`20notice`20
V
Xappear`20in`20all`20copies,`20and`20that`20the`20name`20of`20Bellcore`20not`20
Vbe`20
Xused`20in`20advertising`20or`20publicity`20pertaining`20to`20this`20
Xmaterial`20without`20the`20specific,`20prior`20written`20permission`20
Xof`20an`20authorized`20representative`20of`20Bellcore.`20`20BELLCORE`20
XMAKES`20NO`20REPRESENTATIONS`20ABOUT`20THE`20ACCURACY`20OR`20SUITABILITY`20
XOF`20THIS`20MATERIAL`20FOR`20ANY`20PURPOSE.`20`20IT`20IS`20PROVIDED`20"AS`20IS
V",`20
XWITHOUT`20ANY`20EXPRESS`20OR`20IMPLIED`20WARRANTIES.
X*/
X#include`20<stdio.h>
X#include`20<config.h>
X#ifdef`20MSDOS
X#include`20<fcntl.h>
X#endif
X
X#define`20BASE64`201
X#define`20QP`202`20/*`20quoted-printable`20*/
X
Xmain(argc,`20argv)
Xint`20argc;
Xchar`20**argv;
X`7B
X`20`20`20`20int`20encode`20=`201,`20which`20=`20BASE64,`20i,`20portablenewline
Vs`20=`200;
X`20`20`20`20FILE`20*fp`20=`20stdin;
X`20`20`20`20FILE`20*fpo`20=`20stdout;
X
X`20`20`20`20for`20(i=1;`20i<argc;`20++i)`20`7B
X`20`20`20`20`20`20`20`20if`20(argv`5Bi`5D`5B0`5D`20==`20'-')`20`7B
X`09`20`20`20`20switch`20(argv`5Bi`5D`5B1`5D)`20`7B
X`09`09case`20'o':
X`09`09`20`20`20`20if`20(++i`20>=`20argc)`20`7B
X`09`09`09fprintf(stderr,`20"mimencode:`20-o`20requires`20a`20file`20name.`5Cn"
V);
X`09`09`09exit(-1);
X`09`09`20`20`20`20`7D
X`09`09`20`20`20`20fpo`20=`20fopen(argv`5Bi`5D,`20"w");
X`09`09`20`20`20`20if`20(!fpo)`20`7B
X`09`09`09perror(argv`5Bi`5D);
X`09`09`09exit(-1);
X`09`09`20`20`20`20`7D
X`09`09`20`20`20`20break;
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20case`20'u':
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20encode`20=`200;
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20break;
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20case`20'q':
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20which`20=`20QP;
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20break;
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20case`20'p':
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20portablenewlines
V`20=`201;
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20break;
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20case`20'b':
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20which`20=`20BASE64
V;
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20break;
X`09`09default:
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20fprintf(stderr,
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20"Usage:
V`20mmencode`20`5B-u`5D`20`5B-q`5D`20`5B-b`5D`20`5B-p`5D`20`5B-o`20outputfile
V`5D`20`5Bfile`20name`5D`5Cn");
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20exit(-1);
X`20`20`20`20`20`20`20`20`20`20`20`20`7D
X`20`20`20`20`20`20`20`20`7D`20else`20`7B
X#ifdef`20MSDOS
X`20`20`20`20`20`20`20`20`20`20`20`20if`20(encode)
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20fp`20=`20fopen(argv`5Bi`5D,`20
V"rb");
X`20`20`20`20`20`20`20`20`20`20`20`20else
X`20`20`20`20`20`20`20`20`20`20`20`20`7B
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20fp`20=`20fopen(argv`5Bi`5D,`20
V"rt");
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20setmode(fileno(fpo),`20O_BINAR
VY);
X`20`20`20`20`20`20`20`20`20`20`20`20`7D`20/*`20else`20*/
X#else
X`20`20`20`20`20`20`20`20`20`20`20`20fp`20=`20fopen(argv`5Bi`5D,`20"r");
X#endif`20/*`20MSDOS`20*/
X`20`20`20`20`20`20`20`20`20`20`20`20if`20(!fp)`20`7B
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20perror(argv`5Bi`5D);
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20exit(-1);
X`20`20`20`20`20`20`20`20`20`20`20`20`7D
X`20`20`20`20`20`20`20`20`7D
X`20`20`20`20`7D
X#ifdef`20MSDOS
X`20`20`20`20if`20(fp`20==`20stdin)`20setmode(fileno(fp),`20O_BINARY);
X#endif`20/*`20MSDOS`20*/
X`20`20`20`20if`20(which`20==`20BASE64)`20`7B
X`20`20`20`20`20`20`20`20if`20(encode)`20`7B
X`20`20`20`20`20`20`20`20`20`20`20`20to64(fp,`20fpo,`20portablenewlines);
X`20`20`20`20`20`20`20`20`7D`20else`20`7B
X`20`20`20`20`20`20`20`20`20`20`20`20from64(fp,fpo,`20(char`20**)`20NULL,`20(in
Vt`20*)`200,`20portablenewlines);
X`20`20`20`20`20`20`20`20`7D
X`20`20`20`20`7D`20else`20`7B
X`20`20`20`20`20`20`20`20if`20(encode)`20toqp(fp,`20fpo);`20else`20fromqp(fp,
V`20fpo,`20NULL,`200);
X`20`20`20`20`7D
X`20`20`20`20return(0);
X`7D
X
$ call unpack MMENCODE.C;1 861275605 "" 6 1 4 
$!
$ create 'f'
X/*
XCopyright`20(c)`201991`20Bell`20Communications`20Research,`20Inc.`20(Bellcore)
V
X
XPermission`20to`20use,`20copy,`20modify,`20and`20distribute`20this`20material
V`20
Xfor`20any`20purpose`20and`20without`20fee`20is`20hereby`20granted,`20provided
V`20
Xthat`20the`20above`20copyright`20notice`20and`20this`20permission`20notice`20
V
Xappear`20in`20all`20copies,`20and`20that`20the`20name`20of`20Bellcore`20not`20
Vbe`20
Xused`20in`20advertising`20or`20publicity`20pertaining`20to`20this`20
Xmaterial`20without`20the`20specific,`20prior`20written`20permission`20
Xof`20an`20authorized`20representative`20of`20Bellcore.`20`20BELLCORE`20
XMAKES`20NO`20REPRESENTATIONS`20ABOUT`20THE`20ACCURACY`20OR`20SUITABILITY`20
XOF`20THIS`20MATERIAL`20FOR`20ANY`20PURPOSE.`20`20IT`20IS`20PROVIDED`20"AS`20IS
V",`20
XWITHOUT`20ANY`20EXPRESS`20OR`20IMPLIED`20WARRANTIES.
X*/
X#include`20<stdio.h>
X#include`20<ctype.h>
X#include`20<config.h>
X
Xextern`20char`20*index();
Xstatic`20char`20basis_64`5B`5D`20=
X`20`20`20"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
X
Xstatic`20char`20index_64`5B128`5D`20=`20`7B
X`20`20`20`20-1,-1,-1,-1,`20-1,-1,-1,-1,`20-1,-1,-1,-1,`20-1,-1,-1,-1,
X`20`20`20`20-1,-1,-1,-1,`20-1,-1,-1,-1,`20-1,-1,-1,-1,`20-1,-1,-1,-1,
X`20`20`20`20-1,-1,-1,-1,`20-1,-1,-1,-1,`20-1,-1,-1,62,`20-1,-1,-1,63,
X`20`20`20`2052,53,54,55,`2056,57,58,59,`2060,61,-1,-1,`20-1,-1,-1,-1,
X`20`20`20`20-1,`200,`201,`202,`20`203,`204,`205,`206,`20`207,`208,`209,10,`201
V1,12,13,14,
X`20`20`20`2015,16,17,18,`2019,20,21,22,`2023,24,25,-1,`20-1,-1,-1,-1,
X`20`20`20`20-1,26,27,28,`2029,30,31,32,`2033,34,35,36,`2037,38,39,40,
X`20`20`20`2041,42,43,44,`2045,46,47,48,`2049,50,51,-1,`20-1,-1,-1,-1
X`7D;
X
X#define`20char64(c)`20`20(((c)`20<`200`20`7C`7C`20(c)`20>`20127)`20?`20-1`20:
V`20index_64`5B(c)`5D)
X
X/*
Xchar64(c)
Xchar`20c;
X`7B
X`20`20`20`20char`20*s`20=`20(char`20*)`20index(basis_64,`20c);
X`20`20`20`20if`20(s)`20return(s-basis_64);
X`20`20`20`20return(-1);
X`7D
X*/
X
X/*`20the`20following`20gets`20a`20character,`20but`20fakes`20it`20properly`20i
Vnto`20two`20chars`20if`20there's`20a`20newline`20character`20*/
Xstatic`20int`20InNewline=0;
X
Xint`20nextcharin(infile,`20PortableNewlines)
XFILE`20*infile;
Xint`20PortableNewlines;
X`7B
X`20`20`20`20int`20c;
X
X#ifndef`20NEWLINE_CHAR
X`20`20`20`20return(getc(infile));
X#else
X`20`20`20`20if`20(!PortableNewlines)`20return(getc(infile));
X`20`20`20`20if`20(InNewline)`20`7B
X`20`20`20`20`20`20`20`20InNewline`20=`200;
X`20`20`20`20`20`20`20`20return(10);`20/*`20LF`20*/
X`20`20`20`20`7D
X`20`20`20`20c`20=`20getc(infile);
X`20`20`20`20if`20(c`20==`20NEWLINE_CHAR)`20`7B
X`20`20`20`20`20`20`20`20InNewline`20=`201;
X`20`20`20`20`20`20`20`20return(13);`20/*`20CR`20*/
X`20`20`20`20`7D
X`20`20`20`20return(c);
X#endif
X`7D
X
Xto64(infile,`20outfile,`20PortableNewlines)`20
XFILE`20*infile,`20*outfile;
Xint`20PortableNewlines;
X`7B
X`20`20`20`20int`20c1,`20c2,`20c3,`20ct=0;
X`20`20`20`20InNewline`20=`200;`20/*`20always`20reset`20it`20*/
X`20`20`20`20while`20((c1`20=`20nextcharin(infile,`20PortableNewlines))`20!=`20
VEOF)`20`7B
X`20`20`20`20`20`20`20`20c2`20=`20nextcharin(infile,`20PortableNewlines);
X`20`20`20`20`20`20`20`20if`20(c2`20==`20EOF)`20`7B
X`20`20`20`20`20`20`20`20`20`20`20`20output64chunk(c1,`200,`200,`202,`20outfile
V);
X`20`20`20`20`20`20`20`20`7D`20else`20`7B
X`20`20`20`20`20`20`20`20`20`20`20`20c3`20=`20nextcharin(infile,`20PortableNewl
Vines);
X`20`20`20`20`20`20`20`20`20`20`20`20if`20(c3`20==`20EOF)`20`7B
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20output64chunk(c1,`20c2,`200,
V`201,`20outfile);
X`20`20`20`20`20`20`20`20`20`20`20`20`7D`20else`20`7B
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20output64chunk(c1,`20c2,`20c3,
V`200,`20outfile);
X`20`20`20`20`20`20`20`20`20`20`20`20`7D
X`20`20`20`20`20`20`20`20`7D
X`20`20`20`20`20`20`20`20ct`20+=`204;
X`20`20`20`20`20`20`20`20if`20(ct`20>`2071)`20`7B
X`20`20`20`20`20`20`20`20`20`20`20`20putc('`5Cn',`20outfile);
X`20`20`20`20`20`20`20`20`20`20`20`20ct`20=`200;
X`20`20`20`20`20`20`20`20`7D
X`20`20`20`20`7D
X`20`20`20`20if`20(ct)`20putc('`5Cn',`20outfile);
X`20`20`20`20fflush(outfile);
X`7D
X
Xoutput64chunk(c1,`20c2,`20c3,`20pads,`20outfile)
XFILE`20*outfile;
X`7B
X`20`20`20`20putc(basis_64`5Bc1>>2`5D,`20outfile);
X`20`20`20`20putc(basis_64`5B((c1`20`26`200x3)<<`204)`20`7C`20((c2`20`26`200xF0
V)`20>>`204)`5D,`20outfile);
X`20`20`20`20if`20(pads`20==`202)`20`7B
X`20`20`20`20`20`20`20`20putc('=',`20outfile);
X`20`20`20`20`20`20`20`20putc('=',`20outfile);
X`20`20`20`20`7D`20else`20if`20(pads)`20`7B
X`20`20`20`20`20`20`20`20putc(basis_64`5B((c2`20`26`200xF)`20<<`202)`20`7C`20((
Vc3`20`26`200xC0)`20>>6)`5D,`20outfile);
X`20`20`20`20`20`20`20`20putc('=',`20outfile);
X`20`20`20`20`7D`20else`20`7B
X`20`20`20`20`20`20`20`20putc(basis_64`5B((c2`20`26`200xF)`20<<`202)`20`7C`20((
Vc3`20`26`200xC0)`20>>6)`5D,`20outfile);
X`20`20`20`20`20`20`20`20putc(basis_64`5Bc3`20`26`200x3F`5D,`20outfile);
X`20`20`20`20`7D
X`7D
X
XPendingBoundary(s,`20Boundaries,`20BoundaryCt)
Xchar`20*s;
Xchar`20**Boundaries;
Xint`20*BoundaryCt;
X`7B
X`20`20`20`20int`20i,`20len;
X
X`20`20`20`20if`20(s`5B0`5D`20!=`20'-'`20`7C`7C`20s`5B1`5D`20!=`20'-')`20return
V(0);
X
X
X`20`20`20`20for`20(i=0;`20i`20<`20*BoundaryCt;`20++i)`20`7B
X`09len`20=`20strlen(Boundaries`5Bi`5D);
X`20`20`20`20`20`20`20`20if`20(!strncmp(s,`20Boundaries`5Bi`5D,`20len))`20`7B
X`20`20`20`20`20`20`20`20`20`20`20`20if`20(s`5Blen`5D`20==`20'-'`20`26`26`20s
V`5Blen+1`5D`20==`20'-')`20*BoundaryCt`20=`20i;
X`20`20`20`20`20`20`20`20`20`20`20`20return(1);
X`20`20`20`20`20`20`20`20`7D
X`20`20`20`20`7D
X`20`20`20`20return(0);
X`7D
X
X/*`20If`20we're`20in`20portable`20newline`20mode,`20we`20have`20to`20convert
V`20CRLF`20to`20the`20
X`20`20`20`20local`20newline`20convention`20on`20output`20*/
X
Xstatic`20int`20CRpending`20=`200;
X
X#ifdef`20NEWLINE_CHAR
Xalmostputc(c,`20outfile,`20PortableNewlines)
Xint`20c;
XFILE`20*outfile;
Xint`20PortableNewlines;
X`7B
X`20`20`20`20if`20(CRpending)`20`7B
X`20`20`20`20`20`20`20`20if`20(c`20==`2010)`20`7B
X`20`20`20`20`20`20`20`20`20`20`20`20putc(NEWLINE_CHAR,`20outfile);
X`20`20`20`20`20`20`20`20`20`20`20`20CRpending`20=`200;
X`20`20`20`20`20`20`20`20`7D`20else`20`7B
X`20`20`20`20`20`20`20`20`20`20`20`20putc(13,`20outfile);
X`09`20`20`20`20if`20(c`20!=`2013)`20`7B
X`20`20`20`20`20`20`20`20`20`20`20`20`09putc(c,`20outfile);
X`09`09CRpending`20=`200;
X`09`20`20`20`20`7D
X`20`20`20`20`20`20`20`20`7D
X`20`20`20`20`7D`20else`20`7B
X`20`20`20`20`20`20`20`20if`20(PortableNewlines`20`26`26`20c`20==`2013)`20`7B
X`20`20`20`20`20`20`20`20`20`20`20`20CRpending`20=`201;
X`20`20`20`20`20`20`20`20`7D`20else`20`7B
X`20`20`20`20`20`20`20`20`20`20`20`20putc(c,`20outfile);
X`20`20`20`20`20`20`20`20`7D
X`20`20`20`20`7D
X`7D
X#else
Xalmostputc(c,`20outfile,`20PortableNewlines)
Xint`20c;
XFILE`20*outfile;
Xint`20PortableNewlines;
X`7B
X`20`20`20`20putc(c,`20outfile);
X`7D
X#endif
X
Xfrom64(infile,`20outfile,`20boundaries,`20boundaryct,`20PortableNewlines)`20
XFILE`20*infile,`20*outfile;
Xchar`20**boundaries;
Xint`20*boundaryct;
Xint`20PortableNewlines;
X`7B
X`20`20`20`20int`20c1,`20c2,`20c3,`20c4;
X`20`20`20`20int`20newline`20=`201,`20DataDone`20=`200;
X
X`20`20`20`20/*`20always`20reinitialize`20*/
X`20`20`20`20CRpending`20=`200;
X`20`20`20`20while`20((c1`20=`20getc(infile))`20!=`20EOF)`20`7B
X`20`20`20`20`20`20`20`20if`20(isspace(c1))`20`7B
X`20`20`20`20`20`20`20`20`20`20`20`20if`20(c1`20==`20'`5Cn')`20`7B
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20newline`20=`201;
X`20`20`20`20`20`20`20`20`20`20`20`20`7D`20else`20`7B
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20newline`20=`200;
X`20`20`20`20`20`20`20`20`20`20`20`20`7D
X`20`20`20`20`20`20`20`20`20`20`20`20continue;
X`20`20`20`20`20`20`20`20`7D
X`20`20`20`20`20`20`20`20if`20(newline`20`26`26`20boundaries`20`26`26`20c1`20==
V`20'-')`20`7B
X`20`20`20`20`20`20`20`20`20`20`20`20char`20Buf`5B200`5D;
X`20`20`20`20`20`20`20`20`20`20`20`20/*`20a`20dash`20is`20NOT`20base`2064,`20so
V`20all`20bets`20are`20off`20if`20NOT`20a`20boundary`20*/
X`20`20`20`20`20`20`20`20`20`20`20`20ungetc(c1,`20infile);
X`20`20`20`20`20`20`20`20`20`20`20`20fgets(Buf,`20sizeof(Buf),`20infile);
X`20`20`20`20`20`20`20`20`20`20`20`20if`20(boundaries
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`26`26`20(Buf`5B0`5D`20==
V`20'-')
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`26`26`20(Buf`5B1`5D`20==
V`20'-')
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`26`26`20PendingBoundary(Bu
Vf,`20boundaries,`20boundaryct))`20`7B
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20return;
X`20`20`20`20`20`20`20`20`20`20`20`20`7D
X`20`20`20`20`20`20`20`20`20`20`20`20fprintf(stderr,`20"Ignoring`20unrecognized
V`20boundary`20line:`20%s`5Cn",`20Buf);
X`20`20`20`20`20`20`20`20`20`20`20`20continue;
X`20`20`20`20`20`20`20`20`7D
X`20`20`20`20`20`20`20`20if`20(DataDone)`20continue;
X`20`20`20`20`20`20`20`20newline`20=`200;
X`20`20`20`20`20`20`20`20do`20`7B
X`20`20`20`20`20`20`20`20`20`20`20`20c2`20=`20getc(infile);
X`20`20`20`20`20`20`20`20`7D`20while`20(c2`20!=`20EOF`20`26`26`20isspace(c2));
V
X`20`20`20`20`20`20`20`20do`20`7B
X`20`20`20`20`20`20`20`20`20`20`20`20c3`20=`20getc(infile);
X`20`20`20`20`20`20`20`20`7D`20while`20(c3`20!=`20EOF`20`26`26`20isspace(c3));
V
X`20`20`20`20`20`20`20`20do`20`7B
X`20`20`20`20`20`20`20`20`20`20`20`20c4`20=`20getc(infile);
X`20`20`20`20`20`20`20`20`7D`20while`20(c4`20!=`20EOF`20`26`26`20isspace(c4));
V
X`20`20`20`20`20`20`20`20if`20(c2`20==`20EOF`20`7C`7C`20c3`20==`20EOF`20`7C`7C
V`20c4`20==`20EOF)`20`7B
X`20`20`20`20`20`20`20`20`20`20`20`20fprintf(stderr,`20"Warning:`20base64`20dec
Voder`20saw`20premature`20EOF!`5Cn");
X`20`20`20`20`20`20`20`20`20`20`20`20return;
X`20`20`20`20`20`20`20`20`7D
X`20`20`20`20`20`20`20`20if`20(c1`20==`20'='`20`7C`7C`20c2`20==`20'=')`20`7B
X`20`20`20`20`20`20`20`20`20`20`20`20DataDone=1;
X`20`20`20`20`20`20`20`20`20`20`20`20continue;
X`20`20`20`20`20`20`20`20`7D
X`20`20`20`20`20`20`20`20c1`20=`20char64(c1);
X`20`20`20`20`20`20`20`20c2`20=`20char64(c2);
X`20`20`20`20`20`20`20`20almostputc(((c1<<2)`20`7C`20((c2`260x30)>>4)),`20outfi
Vle,`20PortableNewlines);
X`20`20`20`20`20`20`20`20if`20(c3`20==`20'=')`20`7B
X`20`20`20`20`20`20`20`20`20`20`20`20DataDone`20=`201;
X`20`20`20`20`20`20`20`20`7D`20else`20`7B
X`20`20`20`20`20`20`20`20`20`20`20`20c3`20=`20char64(c3);
X`20`20`20`20`20`20`20`20`20`20`20`20almostputc((((c2`260XF)`20<<`204)`20`7C`20
V((c3`260x3C)`20>>`202)),`20outfile,`20PortableNewlines);
X`20`20`20`20`20`20`20`20`20`20`20`20if`20(c4`20==`20'=')`20`7B
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20DataDone`20=`201;
X`20`20`20`20`20`20`20`20`20`20`20`20`7D`20else`20`7B
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20c4`20=`20char64(c4);
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20almostputc((((c3`260x03)`20<<6
V)`20`7C`20c4),`20outfile,`20PortableNewlines);
X`20`20`20`20`20`20`20`20`20`20`20`20`7D
X`20`20`20`20`20`20`20`20`7D
X`20`20`20`20`7D
X`20`20`20`20if`20(CRpending)`20putc(13,`20outfile);`20/*`20Don't`20drop`20a`20
Vlone`20trailing`20char`2013`20*/
X`7D
X
Xstatic`20char`20basis_hex`5B`5D`20=`20"0123456789ABCDEF";
Xstatic`20char`20index_hex`5B128`5D`20=`20`7B
X`20`20`20`20-1,-1,-1,-1,`20-1,-1,-1,-1,`20-1,-1,-1,-1,`20-1,-1,-1,-1,
X`20`20`20`20-1,-1,-1,-1,`20-1,-1,-1,-1,`20-1,-1,-1,-1,`20-1,-1,-1,-1,
X`20`20`20`20-1,-1,-1,-1,`20-1,-1,-1,-1,`20-1,-1,-1,-1,`20-1,-1,-1,-1,
X`20`20`20`20`200,`201,`202,`203,`20`204,`205,`206,`207,`20`208,`209,-1,-1,`20-
V1,-1,-1,-1,
X`20`20`20`20-1,10,11,12,`2013,14,15,-1,`20-1,-1,-1,-1,`20-1,-1,-1,-1,
X`20`20`20`20-1,-1,-1,-1,`20-1,-1,-1,-1,`20-1,-1,-1,-1,`20-1,-1,-1,-1,
X`20`20`20`20-1,10,11,12,`2013,14,15,-1,`20-1,-1,-1,-1,`20-1,-1,-1,-1,
X`20`20`20`20-1,-1,-1,-1,`20-1,-1,-1,-1,`20-1,-1,-1,-1,`20-1,-1,-1,-1
X`7D;
X
X/*`20The`20following`20version`20generated`20complaints`20on`20Solaris.`20*/
X/*`20#define`20hexchar(c)`20`20(((c)`20<`200`20`7C`7C`20(c)`20>`20127)`20?`20-
V1`20:`20index_hex`5B(c)`5D)`20`20*/
X/*`20`20Since`20we're`20no`20longer`20ever`20calling`20it`20with`20anything`20
Vsigned,`20this`20should`20work:`20*/
X#define`20hexchar(c)`20`20(((c)`20>`20127)`20?`20-1`20:`20index_hex`5B(c)`5D)
V
X
X/*
Xhexchar(c)
Xchar`20c;
X`7B
X`20`20`20`20char`20*s;
X`20`20`20`20if`20(islower(c))`20c`20=`20toupper(c);
X`20`20`20`20s`20=`20(char`20*)`20index(basis_hex,`20c);
X`20`20`20`20if`20(s)`20return(s-basis_hex);
X`20`20`20`20return(-1);
X`7D
X*/
X
Xtoqp(infile,`20outfile)`20
XFILE`20*infile,`20*outfile;
X`7B
X`20`20`20`20int`20c,`20ct=0,`20prevc=255;
X`20`20`20`20while`20((c`20=`20getc(infile))`20!=`20EOF)`20`7B
X`20`20`20`20`20`20`20`20if`20((c`20<`2032`20`26`26`20(c`20!=`20'`5Cn'`20`26`26
V`20c`20!=`20'`5Ct'))
X`20`20`20`20`20`20`20`20`20`20`20`20`20`7C`7C`20(c`20==`20'=')
X`20`20`20`20`20`20`20`20`20`20`20`20`20`7C`7C`20(c`20>=`20127)
X`20`20`20`20`20`20`20`20`20`20`20`20`20/*`20Following`20line`20is`20to`20avoid
V`20single`20periods`20alone`20on`20lines,
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20which`20messes`20up`20some`20dumb
V`20smtp`20implementations,`20sigh...`20*/
X`20`20`20`20`20`20`20`20`20`20`20`20`20`7C`7C`20(ct`20==`200`20`26`26`20c`20==
V`20'.'))`20`7B
X`20`20`20`20`20`20`20`20`20`20`20`20putc('=',`20outfile);
X`20`20`20`20`20`20`20`20`20`20`20`20putc(basis_hex`5Bc>>4`5D,`20outfile);
X`20`20`20`20`20`20`20`20`20`20`20`20putc(basis_hex`5Bc`260xF`5D,`20outfile);
X`20`20`20`20`20`20`20`20`20`20`20`20ct`20+=`203;
X`20`20`20`20`20`20`20`20`20`20`20`20prevc`20=`20'A';`20/*`20close`20enough`20*
V/
X`20`20`20`20`20`20`20`20`7D`20else`20if`20(c`20==`20'`5Cn')`20`7B
X`20`20`20`20`20`20`20`20`20`20`20`20if`20(prevc`20==`20'`20'`20`7C`7C`20prevc
V`20==`20'`5Ct')`20`7B
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20putc('=',`20outfile);`20/*`20s
Voft`20`26`20hard`20lines`20*/
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20putc(c,`20outfile);
X`20`20`20`20`20`20`20`20`20`20`20`20`7D
X`20`20`20`20`20`20`20`20`20`20`20`20putc(c,`20outfile);
X`20`20`20`20`20`20`20`20`20`20`20`20ct`20=`200;
X`20`20`20`20`20`20`20`20`20`20`20`20prevc`20=`20c;
X`20`20`20`20`20`20`20`20`7D`20else`20`7B
X`20`20`20`20`20`20`20`20`20`20`20`20if`20(c`20==`20'F'`20`26`26`20prevc`20==
V`20'`5Cn')`20`7B
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20/*`20HORRIBLE`20but`20clever
V`20hack`20suggested`20by`20MTR`20for`20sendmail-avoidance`20*/
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20c`20=`20getc(infile);
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20if`20(c`20==`20'r')`20`7B
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20c`20=`20getc(infil
Ve);
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20if`20(c`20==`20'o'
V)`20`7B
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20c`20=
V`20getc(infile);
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20if`20(
Vc`20==`20'm')`20`7B
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20
V`20`20c`20=`20getc(infile);
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20
V`20`20if`20(c`20==`20'`20')`20`7B
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20
V`20`20`20`20`20`20/*`20This`20is`20the`20case`20we`20are`20looking`20for`20*/
V
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20
V`20`20`20`20`20`20fputs("=46rom",`20outfile);
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20
V`20`20`20`20`20`20ct`20+=`206;
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20
V`20`20`7D`20else`20`7B
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20
V`20`20`20`20`20`20fputs("From",`20outfile);
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20
V`20`20`20`20`20`20ct`20+=`204;
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20
V`20`20`7D
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`7D`20
Velse`20`7B
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20
V`20`20fputs("Fro",`20outfile);
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20
V`20`20ct`20+=`203;
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`7D
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`7D`20else`20`7B
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20fputs(
V"Fr",`20outfile);
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20ct`20+
V=`202;
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`7D
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`7D`20else`20`7B
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20putc('F',`20outfil
Ve);
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20++ct;
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`7D
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20ungetc(c,`20infile);
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20prevc`20=`20'x';`20/*`20close
V`20enough`20--`20printable`20*/
X`20`20`20`20`20`20`20`20`20`20`20`20`7D`20else`20`7B`20/*`20END`20horrible`20h
Vack`20*/
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20putc(c,`20outfile);
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20++ct;
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20prevc`20=`20c;
X`20`20`20`20`20`20`20`20`20`20`20`20`7D
X`20`20`20`20`20`20`20`20`7D
X`20`20`20`20`20`20`20`20if`20(ct`20>`2072)`20`7B
X`20`20`20`20`20`20`20`20`20`20`20`20putc('=',`20outfile);
X`20`20`20`20`20`20`20`20`20`20`20`20putc('`5Cn',`20outfile);
X`20`20`20`20`20`20`20`20`20`20`20`20ct`20=`200;
X`20`20`20`20`20`20`20`20`20`20`20`20prevc`20=`20'`5Cn';
X`20`20`20`20`20`20`20`20`7D
X`20`20`20`20`7D
X`20`20`20`20if`20(ct)`20`7B
X`20`20`20`20`20`20`20`20putc('=',`20outfile);
X`20`20`20`20`20`20`20`20putc('`5Cn',`20outfile);
X`20`20`20`20`7D
X`7D
X
Xfromqp(infile,`20outfile,`20boundaries,`20boundaryct)`20
XFILE`20*infile,`20*outfile;
Xchar`20**boundaries;
Xint`20*boundaryct;
X`7B
X`20`20`20`20unsigned`20int`20c1,`20c2;
X`20`20`20`20int`20sawnewline`20=`201,`20neednewline`20=`200;
X`20`20`20`20/*`20The`20neednewline`20hack`20is`20necessary`20because`20the`20n
Vewline`20leading`20into`20
X`20`20`20`20`20`20a`20multipart`20boundary`20is`20part`20of`20the`20boundary,
V`20not`20the`20data`20*/
X
X`20`20`20`20while`20((c1`20=`20getc(infile))`20!=`20EOF)`20`7B
X`20`20`20`20`20`20`20`20if`20(sawnewline`20`26`26`20boundaries`20`26`26`20(c1
V`20==`20'-'))`20`7B
X`20`20`20`20`20`20`20`20`20`20`20`20char`20Buf`5B200`5D;
X`20`20`20`20`20`20`20`20`20`20`20`20unsigned`20char`20*s;
X
X`20`20`20`20`20`20`20`20`20`20`20`20ungetc(c1,`20infile);
X`20`20`20`20`20`20`20`20`20`20`20`20fgets(Buf,`20sizeof(Buf),`20infile);
X`20`20`20`20`20`20`20`20`20`20`20`20if`20(boundaries
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`26`26`20(Buf`5B0`5D`20==
V`20'-')
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`26`26`20(Buf`5B1`5D`20==
V`20'-')
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`26`26`20PendingBoundary(Bu
Vf,`20boundaries,`20boundaryct))`20`7B
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20return;
X`20`20`20`20`20`20`20`20`20`20`20`20`7D
X`20`20`20`20`20`20`20`20`20`20`20`20/*`20Not`20a`20boundary,`20now`20we`20must
V`20treat`20THIS`20line`20as`20q-p,`20sigh`20*/
X`20`20`20`20`20`20`20`20`20`20`20`20if`20(neednewline)`20`7B
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20putc('`5Cn',`20outfile);
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20neednewline`20=`200;
X`20`20`20`20`20`20`20`20`20`20`20`20`7D
X`20`20`20`20`20`20`20`20`20`20`20`20for`20(s=(unsigned`20char`20*)`20Buf;`20*s
V;`20++s)`20`7B
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20if`20(*s`20==`20'=')`20`7B
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20if`20(!*++s)`20bre
Vak;
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20if`20(*s`20==`20'
V`5Cn')`20`7B
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20/*`20i
Vgnore`20it`20*/
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20sawnew
Vline`20=`201;
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`7D`20else`20`7B
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20c1`20=
V`20hexchar(*s);
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20if`20(
V!*++s)`20break;
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20c2`20=
V`20hexchar(*s);
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20putc(c
V1<<4`20`7C`20c2,`20outfile);
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`7D
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`7D`20else`20`7B
X#ifdef`20MSDOS
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20if`20(*s`20==`20'
V`5Cn')
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20putc('
V`5Cr',`20outfile);`09/*`20insert`20CR`20for`20binary-mode`20write`20*/
X#endif
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20putc(*s,`20outfile
V);
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`7D
X`20`20`20`20`20`20`20`20`20`20`20`20`7D
X`20`20`20`20`20`20`20`20`7D`20else`20`7B
X`20`20`20`20`20`20`20`20`20`20`20`20if`20(neednewline)`20`7B
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20putc('`5Cn',`20outfile);
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20neednewline`20=`200;
X`20`20`20`20`20`20`20`20`20`20`20`20`7D
X`20`20`20`20`20`20`20`20`20`20`20`20if`20(c1`20==`20'=')`20`7B
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20sawnewline`20=`200;
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20c1`20=`20getc(infile);
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20if`20(c1`20==`20'`5Cn')`20`7B
V
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20/*`20ignore`20it
V`20*/
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20sawnewline`20=`201
V;
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`7D`20else`20`7B
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20c2`20=`20getc(infi
Vle);
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20c1`20=`20hexchar(c
V1);
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20c2`20=`20hexchar(c
V2);
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20putc(c1<<4`20`7C
V`20c2,`20outfile);
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20if`20(c2`20==`20'
V`5Cn')`20sawnewline`20=`201;
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`7D
X`20`20`20`20`20`20`20`20`20`20`20`20`7D`20else`20`7B
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20if`20(c1`20==`20'`5Cn')`20`7B
V
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20sawnewline`20=`201
V;
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20neednewline`20=`20
V1;
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`7D`20else`20`7B
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20sawnewline`20=`200
V;
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20putc(c1,`20outfile
V);
X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`7D
X`20`20`20`20`20`20`20`20`20`20`20`20`7D
X`20`20`20`20`20`20`20`20`7D
X`20`20`20`20`7D
X`20`20`20`20if`20(neednewline)`20`7B
X`20`20`20`20`20`20`20`20putc('`5Cn',`20outfile);
X`20`20`20`20`20`20`20`20neednewline`20=`200;
X`20`20`20`20`7D`20`20`20`20
X`7D
$ call unpack CODES.C;1 268628869 "" 25 2 4 
$!
$ create 'f'
X/*
XCopyright`20(c)`201991`20Bell`20Communications`20Research,`20Inc.`20(Bellcore)
V
X
XPermission`20to`20use,`20copy,`20modify,`20and`20distribute`20this`20material
V`20
Xfor`20any`20purpose`20and`20without`20fee`20is`20hereby`20granted,`20provided
V`20
Xthat`20the`20above`20copyright`20notice`20and`20this`20permission`20notice`20
V
Xappear`20in`20all`20copies,`20and`20that`20the`20name`20of`20Bellcore`20not`20
Vbe`20
Xused`20in`20advertising`20or`20publicity`20pertaining`20to`20this`20
Xmaterial`20without`20the`20specific,`20prior`20written`20permission`20
Xof`20an`20authorized`20representative`20of`20Bellcore.`20`20BELLCORE`20
XMAKES`20NO`20REPRESENTATIONS`20ABOUT`20THE`20ACCURACY`20OR`20SUITABILITY`20
XOF`20THIS`20MATERIAL`20FOR`20ANY`20PURPOSE.`20`20IT`20IS`20PROVIDED`20"AS`20IS
V",`20
XWITHOUT`20ANY`20EXPRESS`20OR`20IMPLIED`20WARRANTIES.
X*/
X
X/*`20This`20is`20the`20top-level`20configuration`20file`20for`20the`20metamail
V`20distribution.`20*/
X/*`20If`20your`20compiler`20does`20not`20automatically`20do`20so,`20you`20may
V`20wish`20to`20
X`20`20`20`20`20`20add`20a`20#define`20here`20that`20defines`20your`20system`20
Vtype,`20e.g.
X`20`20`20`20`20`20#define`20LINUX
X`20`20`20`20`20`20#define`20SYSV`20
X`20`20`20`20`20`20#define`20MSDOS
X`20`20`20`20`20`20#define`20AMIGA
X*/
X
X#ifdef`20AIX
X#define`20SYSV
X#endif
X#ifdef`20_AIX
X#define`20SYSV
X#endif
X
X#ifdef`20__svr4__
X#ifndef`20SYSV
X/*`20Stupid`20Solaris`202.0`20machines`20define`20__svr4__`20but`20not`20SYSV
V`20*/
X#define`20SYSV
X#endif
X#endif
X
X#ifdef`20LINUX
X#define`20SYSV`20/*`20Linux`20is`20SysV`20*/
X#endif
X
X#ifdef`20SVR3
X#ifndef`20SYSV
X/*`20Stupid`20SGI`20machines`20define`20SVR3`20but`20not`20SYSV`20*/
X#define`20SYSV
X#endif
X#endif
X
X#ifdef`20__MSDOS__`09/*`20Defined`20if`20using`20Borland`20C`20compiler?`20*/
V
X#ifndef`20BORLAND
X#define`20BORLAND`09`09/*`20Make`20sure`20BORLAND`20gets`20defined`20*/
X#endif
X#ifndef`20MSDOS
X#define`20MSDOS`20`20`20/*`20A`20common`20symbol`20we`20can`20use`20for`20all
V`20DOS`20compilers`20*/
X#endif
X#endif
X
X#ifdef`20_MSC_VER`09`09/*`20Using`20Microsoft`20C`20compiler`20*/
X#ifndef`20MICROSOFT
X#define`20MICROSOFT`09/*`20Make`20sure`20MICROSOFT`20gets`20defined`20*/
X#endif
X#ifndef`20MSDOS
X#define`20MSDOS`20`20`20/*`20A`20common`20symbol`20we`20can`20use`20for`20all
V`20DOS`20compilers`20*/
X#endif
X#endif
X
X/*`20NOTE:`20`20The`20RESET_PROGRAM`20resets`20the`20terminal`20to`20a`20"norm
Val"`20state`20
X`20`20`20If`20you`20comment`20out`20the`20definition,`20all`20will`20be`20well
V`20except`20that`20metamail's
X`20`20`20-R`20switch`20won't`20work,`20and`20metamail-called`20programs`20migh
Vt`20be`20more`20likely
X`20`20`20to`20screw`20up`20your`20terminal`20state`20*/
X
X#ifdef`20SYSV
X#define`20RESET_PROGRAM`20"tput`20clear"
X#else
X#ifdef`20__BSD_4_4__
X#define`20RESET_PROGRAM`20"/usr/bin/reset"
X#else
X#define`20RESET_PROGRAM`20"/usr/ucb/reset"
X#endif
X#endif
X
X#ifdef`20__hpux
X/*`20Basically`20SYSV`20*/
X#define`20SYSV
X#define`20NO_RLIMITS`201
X/*`20I've`20gotten`20conflicting`20reports`20about`20the`20best`20way`20to`20r
Veset`20the`20terminal`20
X`20`20state`20under`20hpux.`20`20I'm`20now`20using`20"/usr/bin/reset"`20as`20t
Vhe`20default,`20but`20there`20
X`20`20have`20been`20two`20other`20suggestions`20as`20well.`20`20Your`20mileage
V`20may`20vary!`20--`20NSB`20*/
X#undef`20RESET_PROGRAM
X#define`20RESET_PROGRAM`20"/usr/bin/reset"
X/*`20#define`20RESET_PROGRAM`20"tput`20clear"`20*/
X/*`20#define`20RESET_PROGRAM`20"/bin/reset"`20*/
X/*`20#define`20RESET_PROGRAM`20"/usr/ucb/reset"`20*/
X#endif
X
X#ifdef`20NeXT
X#undef`20RESET_PROGRAM
X#define`20RESET_PROGRAM`20"/usr/ucb/reset"
X#endif
X
X#ifdef`20SYSV
X#define`20killpg(a,`20b)`20kill(-(a),`20(b))
X#define`20bcopy(a,`20b,`20c)`20memcpy(b,`20a,`20c)
X#define`20bzero(a,`20b)`20memset(a,`200,`20b)
X#define`20bcmp`20memcmp
X#define`20index`20strchr
X#define`20rindex`20strrchr
X#define`20initstate`20srand
X#define`20random`20rand
X#define`20NO_RLIMITS`201
X#define`20sigtype`20void
X#endif
X
X/*`20Solaris,`20at`20least,`20has`20better`20versions`20of`20some`20functions
V`20*/
X#ifdef`20__svr4__
X#define`20bcopy(a,`20b,`20c)`20memmove(b,`20a,`20c)
X#define`20initstate`20srand48
X#define`20random`20lrand48
X#endif
X
X/*`20This`20constant`20should`20define`20the`20ASCII`20code`20for`20newlines
V`20on`20systems`20where`20
X`20`20`20the`20newline`20convention`20is`20other`20than`20CRLF.`20`20On`20UNIX
V,`20it`20is`20`5EJ,`20ASCII`2010.`20
X`20`20`20`20Here`20we`20define`20it`20as`20'`5Cn'`20which`20should`20be`20righ
Vt`20on`20MOST`20systems...`20*/
X#define`20NEWLINE_CHAR`20'`5Cn'
X
X#ifdef`20MSDOS
X#undef`20NEWLINE_CHAR`20/*`20DOS`20uses`20CRLF`20*/
X#undef`20RESET_PROGRAM
X#include`20<string.h>
X#define`20index`20`20strchr
X#define`20rindex`20strrchr
X#define`20popen`20`20fopen
X#define`20pclose`20fclose
X#define`20NO_RLIMITS`201
X#endif
X
X#ifdef`20AMIGA
X#undef`20RESET_PROGRAM
X#define`20index`20`20strchr
X#define`20rindex`20strrchr
X#define`20NO_RLIMITS`201
X#define`20DEFAULT_SPLIT_SIZE`2095000
X#endif
X
X/*`20The`20following`20defines`20the`20default`20size`20at`20which`20long
X`20`20`20`20messages`20will`20be`20split`20into`20multiple`20messages`20of`20t
Vype
X`20`20`20`20"message/partial"`20by`20the`20mailto`20and`20splitmail`20commands
V,
X`20`20`20`20at`20least.`20*/
X#ifndef`20DEFAULT_SPLIT_SIZE
X#define`20DEFAULT_SPLIT_SIZE`20250000
X#endif
X
X#ifndef`20sigtype
X#ifdef`20NeXT
X#define`20sigtype`20void
X#else
X#define`20sigtype`20int
X#endif
X#endif
X
X#ifdef`20MSDOS
X#define`20PATH_SEPARATOR`20';'
X#ifndef`20STDPATH
X#define`20STDPATH`20".`5C`5Cmailcap;`5C`5Cmailcap"
X#endif
X#else
X#ifdef`20AMIGA
X#define`20PATH_SEPARATOR`20'`20'
X#ifndef`20STDPATH
X#define`20STDPATH`20"uulib:mailcap"
X#endif
X#else
X#define`20PATH_SEPARATOR`20':'
X#ifndef`20STDPATH
X#define`20STDPATH`20"/.mailcap:/usr/local/etc/mailcap:/usr/etc/mailcap:/etc/ma
Vilcap:/etc/mail/mailcap:/usr/public/lib/mailcap"
X#endif
X#endif
X#endif
X
X/*`20The`20following`20can`20be`20set`20to`20a`20directory`20or`20colon-separa
Vted`20list`20of`20
X`20`20directories`20that`20will`20be`20prepended`20to`20the`20user's`20search
V`20path`20before`20
X`20`20executing`20any`20mailcap-derived`20commands.`20
X
X`20`20It`20should`20be`20set`20to`20NULL`20if`20there`20are`20no`20directories
V`20to`20prepend.`20`20
X*/
X
X#define`20AUXPATH`20NULL
$ call unpack CONFIG.H;1 1278233841 "" 10 3 4 
$!
$ create 'f'
X$MMENCODE:=$USR_SCRATCH:`5BSIVIA`5DMMENCODE
X$!
X$!`20READ_MIME.COM
X$!
X$!`20Run`20either`20by`20prompts`20or`20by`20@READ_MINE`20inputfile`20outputfi
Vle`201or2
X$!`20(1or2`20means`201=BASE64,`202=QUOTE-PRINTABLE`20encoding)`20
X$!
X$WRITE`20SYS$OUTPUT`20"This`20routine`20converts`20a`20MIME-encoded`20message
V`20into
X$WRITE`20SYS$OUTPUT`20"something`20readable.`20`20Two`20formats`20are`20suppor
Vted`20--"
X$WRITE`20SYS$OUTPUT`20"BASE64`20and`20QUOTE-PRINTABLE.`20`20Determine`20which
V`20is`20used"
X$WRITE`20SYS$OUTPUT`20"by`20reading`20the`20header`20line`20entitled:
X$WRITE`20SYS$OUTPUT`20"Content-Transfer-Encoding"
X$WRITE`20SYS$OUTPUT`20""
X$IF`20("''P1'"`20.EQS.`20"")`20THEN`20READ/PROMPT="Input`20file?`20"`20SYS$COM
VMAND`20P1
X$IF`20("''P1'"`20.EQS.`20"")`20THEN`20EXIT
X$IF`20("''P2'"`20.EQS.`20"")`20THEN`20READ/PROMPT="Output`20file?`20"`20SYS$CO
VMMAND`20P2
X$IF`20("''P2'"`20.EQS.`20"")`20THEN`20EXIT
X$!
X$SEARCH`20'P1'`20"Content-Transfer-Encoding"
X$!
X$IF`20("''P3'"`20.EQS.`20"1"`20.OR.`20"''P3'"`20.EQS.`20"2")`20THEN`20GOTO`20D
VO_IT
X$!
X$WRITE`20SYS$OUTPUT`20"Is`20this`20BASE64`20(1)`20or`20QUOTE-PRINTABLE`20(2)"
V
X$READ/PROMPT="Enter`201`20or`202`20(D=2)`20"`20SYS$COMMAND`20X
X$IF`20("''X'"`20.EQS.`20"")`20THEN`20X=2
X$IF`20("''X'"`20.NES.`20"1"`20.AND.`20"''X'"`20.NES.`20"2")`20THEN`20EXIT
X$!
X$DO_IT:
X$IF`20("''X'"`20.EQS.`20"1")
X`09$THEN
X`09`09$ASSIGN/USER`20NL:`20SYS$ERROR
X`09`09$ASSIGN/USER`20'P2'`20SYS$OUTPUT
X`09`09$MMENCODE`20-u`20-b`20'P1'
X`09$ELSE
X`09`09$ASSIGN/USER`20NL:`20SYS$ERROR
X`09`09$ASSIGN/USER`20'P2'`20SYS$OUTPUT
X`09`09$MMENCODE`20-u`20-q`20'P1'
X$ENDIF
X$!
X$WRITE`20SYS$OUTPUT`20"Done.`20`20Original`20file`20''P1';`20Converted`20file
V`20''P2'"
X$EXIT
$ call unpack READ_MIME.COM;1 1174430164 "" 3 4 4 
$ v=f$verify(v)
$ exit

