[comp.binaries.ibm.pc] v02INF3: starter.kit, CBIP Starter's Kit

boneill@hawk.ulowell.edu (Brian O'Neill) (03/20/89)

Checksum: 2344066532  (Verify with "brik", report brik bugs to me -- R.D.)
Posting-number: Volume 02 Issue INF3
Originally-from: boneill@hawk.ulowell.edu (Brian O'Neill)
Submitted-by: boneill@hawk.ulowell.edu (Brian O'Neill)
Archive-name: v02info/starter.kit

[Date of last change 1/1/89 Release 1.0]

[This file is available via FTP from swan.ulowell.edu (129.63.224.1), file
ibmpc/General/starter.kit -B]

                     UseNet CBIP Starter's Kit

 The files contained herein are public domain, with the exception of
 ARC-E, (c) Copyrighted by Wayne Chin and Vernon D. Buerg. ALL RIGHTS
 RESERVED.

   This kit contains what you will need to begin downloading files from
comp.binaries.ibm.pc, or from various archive sites. This kit contains:

		1) Instructions
		2) BASIC source for UUDECODE
		3) Pascal source for UUDECODE
		4) C source for UUDECODE
		5) ARC-E 3.1C, in uuencoded form

You will need:

		1) Pascal or C compiler or BASIC Interpreter
		2) File editor

What to do:

You will need to split this file into 5 parts. Each part is separated by a
line stating "---CUT HERE---" and a short description. Using a text editor,
separate the parts for the Pascal source, the C source, and the UUEncoded 
ARC-E program. Then compile one of the sources to create an executable
version of uudecode, and then run it on the ARC-E file. If you called the
ARC-E file arce.uue, then type:

			uudecode arce.uue

This will give you ARC-E.COM, an executable ARC file extractor. Type 'arc-e'
for options. This file will allow you to extract all other ARC files.

NOTE: This file is for the purpose of ease of use on any system. Although
other formats (such as shar files) are easier to handle, they present a
problem on the portability between systems.

---CUT HERE--- Save following as UUDECODE.BAS and run under BASIC Interp.
1000 KEY OFF
1001 DEFINT A-Z
1010 REM Trap error opening input file
1020 ON ERROR GOTO 1600
1030 CLS
1040 LOCATE 5,11
1050 PRINT STRING$(40," ")
1060 LOCATE 5,11
1070 INPUT "Enter name of input file: ", INFILE$
1080 OPEN INFILE$ FOR INPUT AS #1
1090 LOCATE 8,10
1100 PRINT STRING$(40," ")
1110 REM Trap error opening output file
1120 ON ERROR GOTO 1640
1130 LOCATE 8,10
1140 INPUT "Enter name of output file: ", OUTFILE$
1150 OPEN "R", #2,OUTFILE$, 1
1160 FIELD #2, 1 AS N$
1170 REM Trap error at end of file
1180 ON ERROR GOTO 1680
1190 REM Search for header line
1200 LINE INPUT #1,A$
1210 IF LEFT$(A$,5) <>"begin" THEN 1200
1220 LOCATE 11,10
1230 PRINT "Header = ";A$
1240 SP = ASC(" ")
1250 DIM BUF(100)
1260 RECNO# = 1
1270 REM Main loop
1280 LINE INPUT #1, A$
1290 P = 0
1300 BYTES = ASC(LEFT$(A$,1)) - SP
1310 IF BYTES = 64 THEN BYTES = 0
1320 IF BYTES = 0 THEN 1560
1330 COUNT% = INT(BYTES/3+.9): COUNT%=COUNT%*4
1340 FOR I = 2 TO COUNT% STEP 4
1350    X1 = ASC(MID$(A$,I,I)) - SP
1360    IF X1 = 64 THEN X1 = 0
1370    X2 = ASC(MID$(A$,I+1,I+1)) - SP
1380    IF X2 = 64 THEN X2 = 0
1390    X3 = ASC(MID$(A$,I+2,I+2)) - SP
1400    IF X3 = 64 THEN X3 = 0
1410    X4 = ASC(MID$(A$,I+3,I+3)) - SP
1420    IF X4 = 64 THEN X4 = 0
1440    IF P<BYTES THEN P = P + 1: BUF(P) = (X2\16) + (X1*4)
1460    IF P<BYTES THEN P = P + 1: BUF(P) = (X3\4) + ((X2 MOD 16) * 16)
1480    IF P<BYTES THEN P = P + 1: BUF(P) = X4 + ((X3 MOD 4) * 64)
1490 NEXT I
1500 FOR I = 1 TO P
1510   LSET N$ = CHR$(BUF(I))
1520   PUT #2, RECNO#
1530   RECNO# = RECNO# + 1
1540 NEXT I
1550 GOTO 1280
1560 END
1570 REM
1580 REM Error trapping routines
1590 REM
1600 LOCATE 22,20
1610 PRINT "Can't open input file"
1620 GOSUB 1740
1630 RESUME 1020
1640 LOCATE 22,20
1650 PRINT "Can't open output file"
1660 GOSUB 1740
1670 RESUME 1090
1680 LOCATE 22,20
1690 PRINT "Header line not found"
1700 GOSUB 1740
1710 LOCATE 24,1
1720 END
1740 FOR I = 1 TO 5000: NEXT I
1750 LOCATE 22,20
1760 PRINT STRING$(30," ")
1770 RETURN
---CUT HERE--- Save following as UUDECODE.PAS, compile, and run
program uudecode;

  CONST defaultSuffix = '.uue';
        offset = 32;

  TYPE string80 = string[80];

  VAR infile: text;
      fi    : file of byte;
      outfile: file of byte;
      lineNum: integer;
      line: string80;
      size,remaining :real;

  procedure Abort(message: string80);

    begin {abort}
      writeln;
      if lineNum > 0 then write('Line ', lineNum, ': ');
      writeln(message);
      halt
    end; {Abort}

  procedure NextLine(var s: string80);

    begin {NextLine}
      LineNum := succ(LineNum);
      {write('.');}
      readln(infile, s);
      remaining:=remaining-length(s)-2;  {-2 is for CR/LF}
      write('bytes remaining: ',remaining:7:0,' (',
            remaining/size*100.0:3:0,'%)',chr(13));
    end; {NextLine}

  procedure Init;

    procedure GetInFile;

      VAR infilename: string80;

      begin {GetInFile}
        if ParamCount = 0 then abort ('Usage: uudecode <filename>');
        infilename := ParamStr(1);
        if pos('.', infilename) = 0
          then infilename := concat(infilename, defaultSuffix);
        assign(infile, infilename);
        {$i-}
        reset(infile);
        {$i+}
        if IOresult > 0 then abort (concat('Can''t open ', infilename));
        writeln ('Decoding ', infilename);
        assign(fi,infilename); reset(fi);
        size:=FileSize(fi); close(fi);
        if size < 0 then size:=size+65536.0;
        remaining:=size;
      end; {GetInFile}

    procedure GetOutFile;

      var header, mode, outfilename: string80;
          ch: char;

      procedure ParseHeader;

        VAR index: integer;

        Procedure NextWord(var word:string80; var index: integer);

          begin {nextword}
            word := '';
            while header[index] = ' ' do
              begin
                index := succ(index);
                if index > length(header) then abort ('Incomplete header')
              end;
            while header[index] <> ' ' do
              begin
                word := concat(word, header[index]);
                index := succ(index)
              end
          end; {NextWord}

        begin {ParseHeader}
          header := concat(header, ' ');
          index := 7;
          NextWord(mode, index);
          NextWord(outfilename, index)
        end; {ParseHeader}

      begin {GetOutFile}
        if eof(infile) then abort('Nothing to decode.');
        NextLine (header);
        while not ((copy(header, 1, 6) = 'begin ') or eof(infile)) do
          NextLine(header);
        writeln;
        if eof(infile) then abort('Nothing to decode.');
        ParseHeader;
        assign(outfile, outfilename);
        writeln ('Destination is ', outfilename);
        {$i-}
        reset(outfile);
        {$i+}
        if IOresult = 0 then
          begin
            write ('Overwrite current ', outfilename, '? [Y/N] ');
            repeat
              read (kbd, ch);
              ch := UpCase(ch)
            until ch in ['Y', 'N'];
            writeln(ch);
            if ch = 'N' then abort ('Overwrite cancelled.')
          end;
        rewrite (outfile);
      end; {GetOutFile}

    begin {init}
      lineNum := 0;
      GetInFile;
      GetOutFile;
    end; { init}

  Function CheckLine: boolean;

    begin {CheckLine}
      if line = '' then abort ('Blank line in file');
      CheckLine := not (line[1] in [' ', '`'])
    end; {CheckLine}


  procedure DecodeLine;

    VAR lineIndex, byteNum, count, i: integer;
        chars: array [0..3] of byte;
        hunk: array [0..2] of byte;

{    procedure debug;

      var i: integer;

      procedure writebin(x: byte);

        var i: integer;

        begin
          for i := 1 to 8 do
            begin
              write ((x and $80) shr 7);
              x := x shl 1
            end;
          write (' ')
        end;

      begin
        writeln;
        for i := 0 to 3 do writebin(chars[i]);
        writeln;
        for i := 0 to 2 do writebin(hunk[i]);
        writeln
      end;      }

    function nextch: char;

      begin {nextch}
        lineIndex := succ(lineIndex);
        if lineIndex > length(line) then abort('Line too short.');
        if not (line[lineindex] in [' '..'`'])
          then abort('Illegal character in line.');
{        write(line[lineindex]:2);}
        if line[lineindex] = '`' then nextch := ' '
                                 else nextch := line[lineIndex]
      end; {nextch}

    procedure DecodeByte;

      procedure GetNextHunk;

        VAR i: integer;

        begin {GetNextHunk}
          for i := 0 to 3 do chars[i] := ord(nextch) - offset;
          hunk[0] := (chars[0] shl 2) + (chars[1] shr 4);
          hunk[1] := (chars[1] shl 4) + (chars[2] shr 2);
          hunk[2] := (chars[2] shl 6) + chars[3];
          byteNum := 0  {;
          debug          }
        end; {GetNextHunk}

      begin {DecodeByte}
        if byteNum = 3 then GetNextHunk;
        write (outfile, hunk[byteNum]);
        {writeln(bytenum, ' ', hunk[byteNum]);}
        byteNum := succ(byteNum)
      end; {DecodeByte}

    begin {DecodeLine}
      lineIndex := 0;
      byteNum := 3;
      count := (ord(nextch) - offset);
      for i := 1 to count do DecodeByte
    end; {DecodeLine}

  procedure terminate;

    var trailer: string80;

    begin {terminate}
      if eof(infile) then abort ('Abnormal end.');
      NextLine (trailer);
      if length (trailer) < 3 then abort ('Abnormal end.');
      if copy (trailer, 1, 3) <> 'end' then abort ('Abnormal end.');
      close (infile);
      close (outfile)
    end;

  begin {uudecode}
    init;
    NextLine(line);
    while CheckLine do
      begin
        DecodeLine;
        NextLine(line)
      end;
    terminate
  end.

---CUT HERE--- Save the following as UUDECODE.C, compile, then run
/* uudecode.c */

#ifndef lint
static char sccsid[] = "@(#)uudecode.c	5.1 (Berkeley) 7/2/83";
#endif

/*
 * uudecode [input]
 *
 * create the specified file, decoding as you go.
 * used with uuencode.
 */
#include <stdio.h>
#ifndef MSDOS
#include <pwd.h>
#endif
#include <sys/types.h>
#include <sys/stat.h>

/* single character decode */
#define DEC(c)	(((c) - ' ') & 077)

main(argc, argv)
char **argv;
{
	FILE *in, *out;
	struct stat sbuf;
	int mode;
	char dest[128];
	char buf[80];

	/* optional input arg */
	if (argc > 1) {
		if ((in = fopen(argv[1], "r")) == NULL) {
			perror(argv[1]);
			exit(1);
		}
		argv++; argc--;
	} else
		in = stdin;

	if (argc != 1) {
		printf("Usage: uudecode [infile]\n");
		exit(2);
	}

	/* search for header line */
	for (;;) {
		if (fgets(buf, sizeof buf, in) == NULL) {
			fprintf(stderr, "No begin line\n");
			exit(3);
		}
		if (strncmp(buf, "begin ", 6) == 0)
			break;
	}
	sscanf(buf, "begin %o %s", &mode, dest);

	/* handle ~user/file format */
#ifndef MSDOS
	if (dest[0] == '~') {
		char *sl;
		struct passwd *getpwnam();
		char *index();
		struct passwd *user;
		char dnbuf[100];

		sl = index(dest, '/');
		if (sl == NULL) {
			fprintf(stderr, "Illegal ~user\n");
			exit(3);
		}
		*sl++ = 0;
		user = getpwnam(dest+1);
		if (user == NULL) {
			fprintf(stderr, "No such user as %s\n", dest);
			exit(4);
		}
		strcpy(dnbuf, user->pw_dir);
		strcat(dnbuf, "/");
		strcat(dnbuf, sl);
		strcpy(dest, dnbuf);
	}
#endif

	/* create output file */
#ifdef MSDOS
	/* binary output file */
	out = fopen(dest, "wb");
#else
	out = fopen(dest, "w");
#endif
	if (out == NULL) {
		perror(dest);
		exit(4);
	}
	chmod(dest, mode);

	decode(in, out);

	if (fgets(buf, sizeof buf, in) == NULL || strcmp(buf, "end\n")) {
		fprintf(stderr, "No end line\n");
		exit(5);
	}
	exit(0);
}

/*
 * copy from in to out, decoding as you go along.
 */
decode(in, out)
FILE *in;
FILE *out;
{
	char buf[80];
	char *bp;
	int n;

	for (;;) {
		/* for each input line */
		if (fgets(buf, sizeof buf, in) == NULL) {
			printf("Short file\n");
			exit(10);
		}
		n = DEC(buf[0]);
		if (n <= 0)
			break;

		bp = &buf[1];
		while (n > 0) {
			outdec(bp, out, n);
			bp += 4;
			n -= 3;
		}
	}
}

/*
 * output a group of 3 bytes (4 input characters).
 * the input chars are pointed to by p, they are to
 * be output to file f.  n is used to tell us not to
 * output all of them at the end of the file.
 */
outdec(p, f, n)
char *p;
FILE *f;
{
	int c1, c2, c3;

	c1 = DEC(*p) << 2 | DEC(p[1]) >> 4;
	c2 = DEC(p[1]) << 4 | DEC(p[2]) >> 2;
	c3 = DEC(p[2]) << 6 | DEC(p[3]);
	if (n >= 1)
		putc(c1, f);
	if (n >= 2)
		putc(c2, f);
	if (n >= 3)
		putc(c3, f);
}


/* fr: like read but stdio */
int
fr(fd, buf, cnt)
FILE *fd;
char *buf;
int cnt;
{
	int c, i;

	for (i=0; i<cnt; i++) {
		c = getc(fd);
		if (c == EOF)
			return(i);
		buf[i] = c;
	}
	return (cnt);
}

/*
 * Return the ptr in sp at which the character c appears;
 * NULL if not found
 */

#define	NULL	0

char *
index(sp, c)
register char *sp, c;
{
	do {
		if (*sp == c)
			return(sp);
	} while (*sp++);
	return(NULL);
}

---CUT HERE--- Save the following as ARCE.UUE, and the use UUDECODE
begin 600 arce.com
MB28(`>G.`I``````````````````D`````#_________________________
M____________________________________________________________
M________________?AE^&54'50>%!QT(!`D$"><*Y0T7"P``````````````
M```````-"B`@("`@("`@:6YG(#X@``````````````````#__R!E>'1R86-T
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
M8G5T960@3TY,62!I;B!I=',@;W)I9VEN86PL('5N;6]D:69I960@<W1A=&4N
M#0H-"DEF('EO=2!L:6ME('1H:7,@<')O9W)A;2!A;F0@9FEN9"!I="!O9B!U
M<V4L('1H96X@>6]U<B!C;VYT<FEB=71I;VX@=&\@4T5!('=I;&P-"F)E(&%P
M<')E8VEA=&5D+B`@268@>6]U(&%R92!U<VEN9R!T:&ES('!R;V1U8W0@:6X@
M82!C;VUM97)C:6%L(&5N=FER;VYM96YT+`T*=&AE;B!T:&4@8V]N=')I8G5T
M:6]N(&ES(&YO="!V;VQU;G1A<GDN#0H-"E5S86=E.B`@87)C92!D.G!A=&A<
M9FEL96YA;64N97AT("!;9FEL97-P96-S+BXN72!;9#I<;W5T<&%T:%T-"@D)
M"0D@(%LO4EU;+U!=6R]175LO5%T@6R]'<'-W9%T-"B`-"B`@9#H@("!D<FEV
M92!A;F0@<&%T:"!A<F4@;W!T:6]N86P@("`@(&5X="`@9&5F875L=',@=&\@
M+D%20PT*("`O4B`@('-P96-I9FEE<R!R975S92!E>&ES=&EN9R!F:6QE<R`@
M+U`@("!E>'1R86-T<R!F:6QE<R!T;R!S=&%N9&%R9"!O=71P=70-"B`@+U$@
M("!S=7!P<F5S<V5S(&)E97!S(&%N9"!B96QL<R`@("`@("]4("`@=&5S="!A
M<F-H:79E(&EN=&5G<FET>2!O;FQY#0H@("]'("`@<W5P<&QI97,@96YC<GEP
M=&EO;B!P87-S=V]R9"P@92YG+B`O1W!S=V0-"O]9;W4@;75S="!U<V4@1$]3
:('9E<G-I;VX@,BXP(&]R(&AI9VAE<BX-"O\-
`
end
---CUT HERE--- End of CBIP Starter's Kit