Path: utzoo!utgpu!news-server.csri.toronto.edu!cs.utexas.edu!sdd.hp.com!uakari.primate.wisc.edu!abcfd20.larc.nasa.gov!amiga-request From: amiga-request@abcfd20.larc.nasa.gov (Amiga Sources/Binaries Moderator) Newsgroups: comp.sources.amiga Subject: v90i273: UUJoin - filter and merge usenet binaries, Part01/01 Message-ID: Date: 10 Oct 90 01:39:41 GMT Reply-To: mrr@mrsoft.Newport.RI.US (Mark Rinfret) Lines: 1013 Approved: tadguy@uunet.UU.NET (Tad Guy) X-Mail-Submissions-To: amiga@uunet.uu.net X-Post-Discussions-To: comp.sys.amiga Submitted-by: mrr@mrsoft.Newport.RI.US (Mark Rinfret) Posting-number: Volume 90, Issue 273 Archive-name: util/uujoin/part01 [ uuencoded executable enclosed ...tad ] enclosed are source and binaries for a small utility, named uujoin, which will filter and merge Usenet binaries from comp.binaries.{amiga | macintosh | ibm.pc} newsgroups. It also performs a uudecode on the Amiga and PC offerings (I intend to add a de-binhexer for Macintosh binaries, later). See the UUJoin.ReadMe file for more details. #!/bin/sh # This is a shell archive. Remove anything before this line, then unpack # it by saving it into a file and typing "sh file". To overwrite existing # files, type "sh file -c". You can also feed this as standard input via # unshar, or by typing "sh 'FileScan.c' <<'END_OF_FILE' X#ifdef AZTEC_C X X/* Build an expanded list of filenames from a filename argument list. */ X X#include X#include X#include X#include X X/* The ListInfo structure tracks our filename list building process. */ X Xtypedef struct ListInfo { X char **theList; X int slotCount; /* number of slots in the list. */ X int entryCount; /* number of slots filled */ X } ListInfo; X X/* FUNCTION X * AddFile - add a filename to the filename list. X * X * SYNOPSIS X * static int AddFile(ListInfo *fileList, const char *theFile); X * X * DESCRIPTION X * AddFile attempts to add to the filename list. The list will be X * expanded if necessary. X * X * AddFile returns zero if successful or 1 on error. X */ X Xstatic int XAddFile(ListInfo *fileList, char *theFile) X{ X char *fName; /* for a copy of theFile */ X char **newList; X int newCount; X size_t newSize; X X if (fileList->entryCount >= fileList->slotCount) { /* Expand the list? */ X newCount = fileList->slotCount + 50; X /* Note that malloc is used rather than realloc, since I think realloc is X * broken. X */ X newSize = sizeof(char *) * newCount; X newList = malloc(newSize); X if (newList == NULL) return 1; /* Error! */ X fileList->slotCount = newCount; X if (fileList->theList) { X /* Copy old stuff to new list. */ X memcpy(newList, fileList->theList, newSize); X /* Dispose of the old list. */ X free(fileList->theList); X } X fileList->theList = newList; X } X X fName = malloc(strlen(theFile)+1); X if (! fName) return 1; X strcpy(fName, theFile); X fileList->theList[fileList->entryCount++] = fName; X return 0; X} X X/* FUNCTION X * TestWild - test a file specification for wildcard content. X * X * SYNOPSIS X * static int TestWild(const char *fileName); X * X * DESCRIPTION X * TestWild scans , looking for wildcard characters (?, *). If found, X * TestWild returns 1. If not found, TestWild returns 0. X * X * TestWild is provided to prevent unnecessary calls to scdir(). X */ X Xstatic int XTestWild(char *fileName) X{ X char *p, c; X X for (p = fileName; c = *p++;) X if (c == '?' || c == '*') return 1; X return 0; X} X X/* Note: Lattice users can replace this with stricmp, but this is small enough to X * just leave it in here. X */ X X/* FUNCTION X scmpi - perform a case-insensitive string compare. X X SYNOPSIS X int scmpi(const char *s1, const char *s2); X X DESCRIPTION X Strings and are compared, ignoring differences in case. X A result code is returned according to the following: X 0 => strings match X <0 => s1 < s2 X >0 => s1 > s2 X*/ X Xstatic int Xscmpi(const char *s1, const char *s2) X{ X int c1, c2, cd; X X do { X c1 = tolower(*s1++); X c2 = tolower(*s2++); X if (cd = (c1 - c2)) break; X } while (c1 && c2); X X return cd; X} X X/* FUNCTION X * Compare - perform case-insensitive compare of two filename strings. X * X * SYNOPSIS X * static int Compare(const void *a, const void *b); X * X * DESCRIPTION X * Compare simply provides an interface between qsort() and a string X * comparison routine. It returns the result of the string comparison. X */ X Xstatic int XCompare(const void *a, const void *b) X{ X return scmpi(*(char **)a, *(char **)b); X} X X/* FUNCTION X * FileScan - scan, expand and optionally sort a file specification list. X * X * SYNOPSIS X * char **FileScan(char **rawList, int rawCount, int *newCount; X * int sortFiles); X * X * DESCRIPTION X * FileScan treats each entry in as a file specification and X * attempts to expand it into multiple filenames. The number of entries X * in is defined by . If successful, FileScan will X * return a pointer to a new list of filenames, passing the number of entries X * via . If is non-zero, the list will be sorted. X * X * If FileScan is unable to perform an allocation, NULL is returned. X */ X Xchar ** XFileScan(char **rawList, int rawCount, int *newCount, int sortFiles) X{ X ListInfo fileList; /* Stack-based for reentrancy. */ X int rawIndex = 0; X char *rawName; X char *theName; X X fileList.theList = NULL; /* Initialize the list structure. */ X fileList.slotCount = 0; X fileList.entryCount = 0; X X while (rawIndex < rawCount) { X rawName = rawList[rawIndex++]; X if (TestWild(rawName)) { X while (theName = scdir(rawName)) /* scdir() is not reentrant... */ X if (AddFile(&fileList, theName)) return NULL; X } X else X if (AddFile(&fileList, rawName)) return NULL; X } X X *newCount = fileList.entryCount; X if (fileList.theList && sortFiles) { X qsort(fileList.theList, fileList.entryCount, sizeof(char *), Compare); X } X return fileList.theList; X} X#else X#include X#endif END_OF_FILE if test 5181 -ne `wc -c <'FileScan.c'`; then echo shar: \"'FileScan.c'\" unpacked with wrong size! fi # end of 'FileScan.c' fi if test -f 'FileScan.h' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'FileScan.h'\" else echo shar: Extracting \"'FileScan.h'\" \(95 characters\) sed "s/^X//" >'FileScan.h' <<'END_OF_FILE' X/* FileScan.h */ Xchar **FileScan(char **rawList, int rawCount, int *newCount, int sortFiles); END_OF_FILE if test 95 -ne `wc -c <'FileScan.h'`; then echo shar: \"'FileScan.h'\" unpacked with wrong size! fi # end of 'FileScan.h' fi if test -f 'UUJoin.ReadMe' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'UUJoin.ReadMe'\" else echo shar: Extracting \"'UUJoin.ReadMe'\" \(1243 characters\) sed "s/^X//" >'UUJoin.ReadMe' <<'END_OF_FILE' X XProgram: UUJoin - join and decode Usenet binary files XAuthor: Mark R. Rinfret XStatus: Public Domain X XI found myself spending too much time editing, merging and decoding Xuuencoded binaries offloaded from the net, so I whipped up this crude Xlittle filter/decoder. It's quite simple and probably could have been done Xwith awk, but I chose to do it in C. The program, in its current state, is Xhardwired for various machine types but is easily altered. See the source Xfor documentation. X XUUJoin is accessed from the CLI and has the following command format: X X UUJoin [options] filespecs... X X -amiga - Amiga format X -mac - Macintosh BinHex format (files are not currently decoded) X -pc - PC-Clown format X -r - remove original files when done. X X File specifications may be individual filenames or Un*x wildcard X specifications. When using wildcards, be sure to name your files X in such a way that they will sort into the correct sequence, e.g. X program.01 program.02 program.03, etc. X XIf UUJoin is invoked without options, it's usage info is displayed. X XUUJoin was implemented using Manx Aztec C V5.0b, but should be easily Xported to other C environments. X END_OF_FILE if test 1243 -ne `wc -c <'UUJoin.ReadMe'`; then echo shar: \"'UUJoin.ReadMe'\" unpacked with wrong size! fi # end of 'UUJoin.ReadMe' fi if test -f 'UUJoin.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'UUJoin.c'\" else echo shar: Extracting \"'UUJoin.c'\" \(8260 characters\) sed "s/^X//" >'UUJoin.c' <<'END_OF_FILE' X/* X * uujoin [ -r ] [ {-amiga | -mac | -pc} ] file(s)... X * join and decode Usenet encoded binary files. X * X * Author: Mark R. Rinfret X * Date: 08-15-90 X * X * Public Domain - Use as you wish. X * X * Notes: The uudecode portion was adapted from uudecode.c, packaged X * with Matt Dillon's UUCP implementation. X * X * The Macintosh mode simply filters and joins the files. It X * doesn't decode the BinHex format (got a de-binhexer I can X * have?). X * X * The delimiter strings used to extract the encoded segments X * may change over time. Just edit the assignments to the X * string variables "start" and "stop", as appropriate. X */ X X#include X#include X#include X#include X Xextern int unlink(const char *fileName); X Xextern int errno; X X/* single character decode */ X#define DEC(c) (((c) - ' ') & 077) X Xint decode(FILE *in, FILE *out); Xint outdec(char *p, FILE *f, int n); Xint fr(FILE *fd, char *buf, int cnt); X X#define AMI 0 X#define MAC 1 X#define PC 2 X Xint fileCount; /* set by FileScan() */ Xchar **fileNames; /* allocated by FileScan() */ Xint fileNumber; /* index into fileNames */ Xchar line[256]; /* allows for long Usenet lines */ Xint machine; /* machine type */ Xint removeFiles = 0; /* 1 => remove originals */ Xchar tempName[L_tmpnam]; /* temporary file name */ X Xint XDecodeMergedFile(void) X{ X char dest[128]; X X FILE *in = NULL, *out = NULL; X int mode; /* file protection */ X X in = fopen(tempName, "r"); X if (! in ) { X fprintf(stderr,"Could not reopen merged file: '%s'\n", tempName); X exit(1); X } X X /* Search for header line */ X for (;;) { X if (fgets(line, sizeof line, in) == NULL) { X fprintf(stderr, "No begin line\n"); X exit(1); X } X if (strncmp(line, "begin ", 6) == 0) X break; X } X X sscanf(line, "begin %o %s", &mode, dest); X X /* create output file */ X out = fopen(dest, "w"); X if (out == NULL) { X perror(dest); X exit(1); X } X X decode(in, out); X X if (fgets(line, sizeof line, in) == NULL || strcmp(line, "end\n")) { X fprintf(stderr, "No end line\n"); X exit(5); X } X fclose(in); X X return 0; X} X Xint XJoinFiles(void) X{ X char *fName; /* current file name */ X FILE *inFile = NULL; X char *p; /* adjusted line pointer */ X char *start, *stop; /* pattern matching strings */ X int startLeng, stopLeng; /* pattern lengths */ X int status = 0; X FILE *tempFile = NULL; X X tmpnam(tempName); X tempFile = fopen(tempName, "w"); X if (!tempFile) { X perror(tempName); X status = errno; X goto done; X } X X /* Set up pattern strings according to machine type. Patterns are X * matched from beginning of line through number of chars in pattern. X */ X X if (machine == MAC) { X start = "---"; X stop = "--- end"; X } X else if (machine == PC) { X start = "BEGIN"; X stop = "END--"; X } X else { /* AMIGA */ X start = "sed"; X stop = "SHAR_EOF"; X } X X /* Compute the lengths of the match strings. */ X X startLeng = strlen(start); X stopLeng = strlen(stop); X X /* The Amiga binaries are packaged as shar files and therefore have a X * leading 'X' which must be tossed. Other formats (so far) are not X * packed as shar files and thus, the whole line is used. X */ X p = (machine == AMI ? (line + 1) : line); X X while (fileNumber < fileCount) { X fName = fileNames[fileNumber]; /* For programming convenience. */ X inFile = fopen(fName, "r"); X if (! inFile) { X perror(fName); X status = errno; X goto done; X } X X /* Attempt to find the start of this file. */ X X if (startLeng) { X while (1) { X fgets(line, sizeof(line), inFile); X if ( feof(inFile) ) { Xeof_err: X fprintf(stderr,"uujoin: unexpected EOF in file '%s'!\n", fName); X status = EOF; X goto done; X } X if (strncmp(start, line, startLeng) == 0) X break; /* We found the beginning. */ X } X } X X while (1) { X fgets(line, sizeof(line), inFile); X if ( feof(inFile) ) { X if (stopLeng == 0) X break; X else X goto eof_err; X } X X if ( (*line != '\n') && (strncmp(stop, line, stopLeng) == 0) ) X break; /* We found the end. */ X X if ( fputs(p, tempFile) ) { /* Write the _adjusted_ line. */ X status = EOF; X fprintf(stderr,"uujoin: error writing to temp file '%s'\n", X tempName); X exit(1); X } X } X fclose(inFile); X ++fileNumber; X } X Xdone: X if (tempFile) fclose(tempFile); X if (inFile) fclose(inFile); X return status; X} X Xmain(int argc, char **argv) X{ X X if (argc < 2) { Xusage: X puts("Program: uujoin - join and decode Usenet encoded binary files."); X puts("Usage: uujoin [options] file1 [... filen]"); X puts("Where [options] may be:"); X puts("\t-amiga -> uuencoded files wrapped with shar"); X puts("\t-mac -> Macintosh binhex files (not decoded in this release)"); X puts("\t-pc -> uuencoded files enclosed in BEGIN/END pairs"); X puts("\t-r -> remove original files when done"); X puts("\n\tUnix-style wildcards may be used in file specifications."); X puts("\n\tExample: uujoin -amiga -r program.??"); X puts("\n\tMark R. Rinfret, August 1990."); X puts("\tContributed to the public domain."); X exit(1); X } X X --argc; /* Skip over program name. */ X ++argv; X X while (**argv == '-') { X if (strcmp(*argv,"-mac") == 0) { X machine = MAC; Xbump: X --argc; /* Skip this arg. */ X ++argv; X } X else if (strcmp(*argv, "-pc") == 0) { X machine = PC; X goto bump; X } X else if (strcmp(*argv,"-amiga") == 0) { X machine = AMI; X goto bump; X } X else if (strcmp(*argv,"-r") == 0) { X removeFiles = 1; X goto bump; X } X else X goto usage; X } X X fileNames = FileScan(argv, argc, &fileCount, 1); X if (! fileNames) { X printf("Filename expansion failed - abort!\n"); X exit(1); X } X X if (JoinFiles()) exit(1); /* Attempt to join files. */ X X if (DecodeMergedFile()) exit(1); X X unlink(tempName); X if (removeFiles) { X while (--fileCount >= 0) { X unlink(fileNames[fileCount]); X } X } X exit(0); X} X X/* X * copy from in to out, decoding as you go along. X */ Xdecode(in, out) XFILE *in; XFILE *out; X{ X char buf[80]; X char *bp; X int n; X X for (;;) { X /* for each input line */ X if (fgets(buf, sizeof buf, in) == NULL) { X printf("Short file\n"); X exit(10); X } X n = DEC(buf[0]); X if (n <= 0) X break; X X bp = &buf[1]; X while (n > 0) { X outdec(bp, out, n); X bp += 4; X n -= 3; X } X } X} X X/* X * output a group of 3 bytes (4 input characters). X * the input chars are pointed to by p, they are to X * be output to file f. n is used to tell us not to X * output all of them at the end of the file. X */ Xoutdec(p, f, n) Xchar *p; XFILE *f; X{ X int c1, c2, c3; X X c1 = DEC(*p) << 2 | DEC(p[1]) >> 4; X c2 = DEC(p[1]) << 4 | DEC(p[2]) >> 2; X c3 = DEC(p[2]) << 6 | DEC(p[3]); X if (n >= 1) X fputc(c1, f); X if (n >= 2) X fputc(c2, f); X if (n >= 3) X fputc(c3, f); X} X X X/* fr: like read but stdio */ Xint Xfr(fd, buf, cnt) XFILE *fd; Xchar *buf; Xint cnt; X{ X int c, i; X X for (i=0; i'UUJoin.uu' <<'END_OF_FILE' Xbegin 644 UUJoin XM```#\P`````````#``````````(```SP```!;0````$```/I```,\$[Z&'A.T XM5?]\2.<`,)7*E\M(>@762&R$($ZZ(;0D0"`*4$]F'$ALA"!(>@7`2&R!MDZZ# XM"]Q(>``!3KHQG$_O`!`O"DAX`0!(;(1(3KH+8$J`3^\`#&882'H%MDAL@;9.` XMN@NN2'@``4ZZ,6Y/[P`,2'@`!DAZ!:E(;(1(3KH7JDJ`3^\`#&<"8+A(;?^`M XM2&W_?$AZ!9)(;(1(3KH-+DAZ!9)(;?^`3KHA*"9`(`M/[P`89A)(;?^`3KH+0 XM?$AX``%.NC$64$\O"R\*3KH#E"\*2'@!`$ALA$A.N@K42H!/[P`49Q)(>@5.' XM2&R$2$ZZ%8Q*@%!/9QA(>@5!2&R!MDZZ"Q!(>``%3KHPT$_O``PO"DZZ*\1P> XM`%A/3-\,`$Y=3G5(YS\RE@3^2&R$($ZZ()0L0"`.= XM3^\`#&822&R$($ZZ"N@D+(5(6$]@``%H#*P````!A4QF#D'Z!.`H"$'Z!-XJU XM"&`D#*P````"A4QF#D'Z!-0H"$'Z!-0J"&`,0?H$TB@(0?H$T"H(+P1.NBDF+ XM+``O!4ZZ*1XF`$JLA4Q03V8(0>R$22`(8`9![(1((`@N`"`LA5"PK(54;```" XM^"`LA5#E@"!LA5@F<`@`2'H$$"\+3KH?\"1`(`I03V80+PM.N@I()"R%2%A/G XM8```R$J&9T@O"DAX`0!(;(1(3KH)I`@J``$`#4_O``QG&"\+2'H$3TAL@;9.G XMN@GL=/]/[P`,8```DB\&2&R$2"\$3KH5[DJ`3^\`#&<"8+@O"DAX`0!(;(1(@ XM3KH)7`@J``$`#4_O``QG!DJ#9TQ@L@PL``J$2&<4+P-(;(1(+P5.NA6P2H!/+ XM[P`,9RXO#B\'3KH*7$J`4$]G'G3_2&R$($AZ`_E(;(&V3KH)<$AX``%.NB\P\ XM3^\`$&"6+PI.NBHB4JR%4%A/8`#_`"`.9P@O#DZZ*@Y83R`*9P@O"DZZ*@)8) XM3R`"3-],_$YU2.<@("0O``PD;P`0#((````";&1(>@/$3KH*6DAZ`_M.N@I21 XM2'H$'TZZ"DI(>@0O3KH*0DAZ!%5.N@HZ2'H$CDZZ"C)(>@2^3KH**DAZ!.)._ XMN@HB2'H%%4ZZ"AI(>@4T3KH*$DAZ!4Q.N@H*2'@``4ZZ+H9/[P`P4X)8BB!20 XM#!``+69N2'H%3R\23KH3#DJ`4$]F#BE\`````85,4X)8BF!.2'H%-B\23KH2N XM\$J`4$]F"BE\`````H5,8.!(>@4@+Q).NA+62H!03V8&0JR%3&#*2'H%$2\2P XM3KH2P$J`4$]F"BE\`````8`"8+!@`/\F8(I(>``!2&R%5"\"+PI.N@;**4"%8 XM6$JLA5A/[P`09A)(>@363KH).$AX``%.NBW:4$].NOT<2H!G"DAX``%.NBW(? XM6$].NOOP2H!G"DAX``%.NBVV6$](;(0@3KHL6$JL@`)83V<<4ZR%5&T6("R%: XM5.6`(&R%6"\P"`!.NBPX6$]@Y$*G3KHM@EA/3-\$!$YU3E7_L$CG(#`F;0`,- XM+RT`"$AX`%!(;?^P3KH'-$J`3^\`#&822'H$9DZZ"*1(>``*3KHM1E!/$"W_G XML$B`2,`$@````"`D``*"````/TJ";R!![?^Q)$A*@F\4+P(O"R\*819%Z@`$- XM5X)/[P`,8.A@G$S?#`1.74YU2.<\,"1O`!PF;P`@)"\`)!`22(!(P`2`````\ XM(`*`````/^6`$BH``4B!2,$$@0```"`"@0```#_H@28`AH$0*@`!2(!(P`2`A XM````(`*`````/^F`$BH``DB!2,$$@0```"`"@0```#_D@2@`B($0*@`"2(!(C XMP`2`````(`*`````/^V`$BH``TB!2,$$@0```"`"@0```#\J`(J!#((````!. XM;0HO"R\#3KH'(%!/#((````";0HO"R\$3KH'#E!/#((````#;0HO"R\%3KH&E XM_%!/3-\,/$YU2.'!E8W1E9"!%3T8@:6X@9FELR XM92`G)7,G(0H`=75J;VEN.B!E2!B92!UI03TJ`9P``#'``; XM3-\``$Y=3G5@SF```!HO+?_L2&W_]$ZZ_<903TJ`9P``!G``8-I@@"!M`!`@8 XMK?_\2JW_]&<``")*K0`49P``&DAZ_RQ(>``$+RW__"\M__1.N@GJ3^\`$"`M4 XM__1@HDCG`"`D;P`((`IG!DIJ``QF"'#_3-\$`$YU(%*QZ@`$9`H@4E*2<``0: XM$&#H+PI.NA506$]@WDCG,#(L;P`8)B\`'"1O`"`F3E.#;T8@4K'J``1D"B!2[ XM4I)P`!`08`@O"DZZ%1Y83R0`#(#_____9PX6@E*+#((````*9LQ@%+?.9P@(' XM*@`!``UF"'``3-],#$YU0A,@#F#T2.<@($'O`!0D2"\*+R\`%"\O`!1.NAFBR XM)``@`D_O``Q,WP0$3G5(YP`@)&\`""`*9QY*$F<:2&R!MB\*3KH`EDAL@;9(Q XM>@!(3KH`BD_O`!`O+(5(3KH*."1`2H!83V2&R!MDAX``I.N@`03^\`$$S?!`!.=3H@``!(YR`@)"\`#"1O`!`@- XM"F<&2FH`#&8(>%!/8-9(YR`P)F\`$"1O`!1@-"!2L>H`!&0,(%)2DA""<``0`F`.<``0K XM`B\`+PI.NAY&4$\,@/____]F"'#_3-\,!$YU4HL4$V;(<`!@\$CG("!![P`0Y XM)$@O"B\O`!!(;(&@3KH8A"0`(`)/[P`,3-\$!$YU2.<@,"9O`!!![(&@)$A@0 XM+"!2L>H`!&0,(%)2DA""<``0`F`.<``0`B\`+PI.NAW44$\,@/____]G.%*++ XM%!-FT"!2L>H`!&0.(%)2DA"\``IP`'`*8`Q(>``*+PI.NAVD4$\,@/____]G\ XM"'``3-\,!$YU``;1/_R?'\,$P`J9@A2BQM\``'_\Q`32(!(P"0`0>R`B1`P"`!(@`@```)GO XM-GP`(`8B`.6(T('CB-""+``$A@```#!2BQ`32(!(P"0`0>R`B1`P"`!(@`@`= XM``)FTAM\``'_\@R"````;&<0#((```!H9P@,@@```$QF!!@"4HL0&TB`2,`KZ XM0/_T8``$,G0E8``$WGH*8`QZ`&`(>@A@!'AL>A!2@R!2L>H`!&0*(%)2DG``D XM$!!@""\*3KH1^%A/'@!(@$'L@(D0,```2(`(```$9P)@SE.#+PH0!TB`2,`OE XM`$ZZ!;P,@/____]03V<`!+Y*AF\`!+@K0__N<``;0/_I2(!(P"M`__Q2@R!2? XML>H`!&0*(%)2DG``$!!@""\*3KH1DEA/)``,@````"UG"`R"````*V8L#((`+ XM```M9@8;?``!_^E2@R!2L>H`!&0*(%)2DG``$!!@""\*3KH15EA/)``@!6!>1 XM0>R`B1`P*`!(@`@```)G``0V0>R`B1`P*`!(@`@```)G$B`"!(`````P#(``< XM```';@`$%&`X0>R`B1`P*`!(@`@```)G``0`8"1![(")$#`H`$B`"````V<`< XM`^Q@$$J`9]11@&>:58!GS%V`9]P@`Y"M_^Y2@+"&;&H,A0```!!G!$J%9EX,T XM@@```#!F5E*#(%*QZ@`$9`H@4E*2<``0$&`(+PI.NA"F6$\D`"\`3KH/3`R`P XM````>%A/9B92@R!2L>H`!&0*(%)2DG``$!!@""\*3KH0>%A/)`!*A68">A!@" XM`GH(2H5F`GH*4X,O"B\"3KH$1D*M_^H,A0````I03V8(*WP````,_^H,A0``^ XM``AF""M\````#O_J8&Q2@R!2L>H`!&0*(%)2DG``$!!@""\*3KH0&%A/)``OE XM`$'L@`8B;?_JT\@O"4ZZ#LXL0$J`4$]F#E.#+PHO`DZZ`]Q03V`P(@4@+?_\P XM3KH4CBM`__Q![(`&(`Z0B$'L@!T0,`@`2(!(P-&M__P@`Y"M_^ZPAFV*2BW_4 XMZ6<$1*W__$HM__-F1`P$`&AF$EBM`!`@;0`0(&C__#"M__Y@*`P$`&QF$EBM3 XM`!`@;0`0(&C__""M__Q@$%BM`!`@;0`0(&C__""M__Q2K?_X8``!OBM#__Q3V XMK?_X8*A2@R!2L>H`!&0*(%)2DG``$!!@""\*3KH/0%A/'@!(@$'L@(D0,```A XM2(`(```$9P)@SE.#+PH0!TB`2,`O`$ZZ`P0,@/____]03V<``@9X`F`^2BW_# XM\F8"?`%X`V`R>``,$P!>9@12BW@!0>W_9RQ(#!,`768"'-L0&TB`2,`D`&<,. XM#((```!=9P0R`B1`P*`!(@`@```1G#E.#+PHO`DZZ`E!03V!(8#0,!``";"XO`DAM_V=.B XMN@T:2H!03V<$<`%@`G``$@1(@4C!L(%F#E.#+PHO`DZZ`AI03V`22BW_\V8"+ XM',(;?``!__)@`/]F2BW_\F<``0I*+?_S9A`,K0```&/_]&<"0A92K?_X8%`$? XM@````"5G`/O(!(`````S9P#[TE>`9P#^Y%&`9P#^TE.`9P#[LEN`9P#[L%N`1 XM9P#^9%.`9P#[J%.`9P#[IE>`9P#^7%6`9P#[CE>`9P#[EF```)I![(")$#`H% XM`$B`"```!&=.4H,@4K'J``1D"B!24I)P`!`08`@O"DZZ#7I83QX`2(!![(")V XM$#```$B`"```!&<"8,Y3@R\*$`=(@$C`+P!.N@$^#(#_____4$]G0&`Z4H,@T XM4K'J``1D"B!24I)P`!`08`@O"DZZ#2Q83QX`2(!(P+""9Q13@R\*$`=(@$C`? XM+P!.N@#\4$]@!&``^CI*K?_X9D!2@R!2L>H`!&0*(%)2DG``$!!@""\*3KH,- XMZ%A/'@`,``#_9@IP_TS?3/Q.74YU4X,O"A`'2(!(P"\`3KH`L%!/("W_^&#@X XM2.R#3B1(2'H`BB\*3KH;+%!/,"R#=E)L@W8V`'0`<``P_ XM`W(*3KH97`:`````,'('DH(5@!@`2,.'_``*4H(,@@````5MV$(J``A(>@!*P XM+PI.N@TT)D!*@%!/9B1(>@`Z+PI.N@TB)D!*@%!/9Q`O"TZZ&!HO"DZZ"R!0] XM3V`,8`@O"TZZ&`A83V"((`I,WPP,3G5435``<@!W`$CG("`D+P`,)&\`$`R"= XM_____V<2(`IG#DIJ``QG"`@J``(`#&<(H`"&80(&H`!+'J``ABV%*2)5(`!$'J``P(J``!``%!Z@`,"-``!%.2% XM(%(0@G``$`)@MDY5_X!(YS\R+BT`#"0M`!`F+0`42H=F"$S?3/Q.74YU*"T`" XM"$'M_X`L""("(`=3@$ZZ$!PJ`-J$(@(@!9"$3KH87.*((@).NA`&+$#=Q"1$] XM)D6USF<2+PXO"B!#3I!*@%!/;`35PF#JO+7.3^\`#&8$+$M@!K?.9@(L2K7+8@C5PB`"= XM1(#7P+7+8Z`@"Y"$(@62BK"!;!2UQ60,($8@BB!&(44`!%"&*@M@$KB+9`P@K XM1B"$($8A2P`$4(8H"KB%90#_4$'M_X"QQF00488@1B@0($8J*``$8`#_.&``Y XM_Q1,[P,```0@""(O``Q@`A#940!&:6QE(&5X:7-TR#3K7)9@XR/`"9:PAT`"+"4``$*4Z%$ XM8$CG@(`(+@`$`2EG$$OZ``A.KO_B8`9"I_-?3G-#^@`@3J[^:"E`A61F#"X\C XM``.`!TZN_Y1@!$ZZ`!I03TYU9&]S+FQI8G)AH`7$ZN_H`L7R\.+&R%8$'J+ XM`%Q.KOZ,+%\I0(5T(&R%=$JH`"1G(B\.+&R%9"!LA70@:``D(A!.KO^"+%\O+ XM+(5T+PI.N@7Z4$\I;(5TA7@O#BQLA61.KO_*+%\@;(5H((`O#BQLA61.KO_$S XM+%\@;(5H(4``!DJJ`*1G)$CG(`(L;(5D)#P```/M0?H`,"((3J[_XDS?0`0@Q XM;(5H(4``#"\LA7@O+(5\3KKH:E!/+P!.NA=:6$],WPP`3G4J`$CG.#(F+P`

R%A"\(3KH4>"\$+PLO+(6$3KH!8 XM,"!LA81","@`*7P````!A7PD0M7LA812BB9*3^\`(!`22(!(P"0`#(`````@B XM9R`,@@````EG&`R"````#&<0#((````-9P@,@@````IF!%**8,P,$@`@;78,O XM$@`B9BI2BA`:2(!(P"0`9QP6P@R"````(F80#!(`(F8$4HI@!D(K__]@`F#:R XM8#@0&DB`2,`D`&&8(0JR%?&``_M1T`"1LA81@&B`"Y8`@;(5X(8H(`"\*3KH.. XMFM7`4HI83U*"M*R%?&W@(`+E@"!LA7A"L`@`8`#^G"``3.\#```$(`@B+P`,? XM2AAF_%.($-E7R?_\!($``0``:O)"($YU2.<`,BQO`!!.NA3R2JR`A&8``/Q(H XM>``J+PY.N@,\2H!03V8@2'@`/R\.3KH#+$J`4$]F$"E\`````H"$(`Y,WTP`W XM3G4I?`````&`A"\.2&R#>$ZZ$L1(>``O2&R#>$ZZ`R(D0$J`3^\`$&=&0>R#; XM>+7(8P@,*@`O__]G2D'L@WBUR&="0A)(;(-X3KH`["9`%/P`+R\*2&R#\$ZZ& XM$GQ"$DAL@WA(;(/(3KH2;D_O`!1@6DAX`#I(;(-X3KH"QB1`2H!03V$AL9 XM@_!.NA(>0BR#R$AL@\AAL`""\(2&R#>$ZZ!3!/[P`08`1@`/Z<0>R#>"`(8`#^R$CG,#(F( XM+P`8G`$$3KH1*"9`@ XM2H!83V8(<`!,WTP,3G5(YR`"+&R%9'3^(@-.KO^L3-]`!"0`9WA(YR`"+&R%% XM9"0+(A=.KO^:3-]`!$JK``1O4$CG(`(L;(5D)`LB%TZN_Y1,WT`$2H!G+DJK4 XM``1NXDAX`0A.NA#`)$!*@%A/9QA!Z@`$(DMP0"#94 XM_____UA/8!H0%K`29A(O"B\.3KK_<$J`4$]F!'``8)I3CKW+9.)P`6"0("\`& XM!`R`````0&,.#(````!:8@8&@````"!.=2!O``1P`!(O``L0&+`!5\C_^F<$C XM<`!.=5-((`A.=2\O``1.NA"<6$].=2!O``0B2$H89OP0+P`+L\AG"+`@9O@@\ XM"$YU<`!.=4CG.#(F;P`<*"\`("\.+&R%8'``0_H`P$ZN_=@L7RE`A8AF!DS?/ XM3!Q.=2\.+&R%B"!$(&@`)"!H``1.KO^R+%\D0$J`9W@O#BQLA8A#^@"5(&H`L XM-DZN_Z`L7RQ`2H!G4$CG(`(L;(5D)#P```/M(B\`!$ZN_^),WT`$)@!G,B`#N XMY8`D`"!")V@`"`"D)T,`G$CG(`(L;(5D)#P```/M0?H`2B((3J[_XDS?0`0GP XM0`"@+PXL;(6(($I.KO^F+%\O#BQLA6`B;(6(3J[^8BQ?0JR%B&``_U!I8V]NG XM+FQI8G)AB0`3^\`#&X

`,!+R\`#&$&3^\`#$YU2.<^,B9O# XM`"0J+P`H3KH.!"1LA6AV`&`2(`,B`..(T('CB$JR"`!G$%*#,&R#0K'#;N9X! XM"&```2H(!0`)9U!(YR`"+&R%9'3_(@M.KO^L3-]`!"P`9S@O#BQLA60B!DZN5 XM_Z8L7R\.+&R%9"(+3J[_N"Q?2H!F&"\.+&R%9$ZN_WPL7R@`#(````#-9@``( XMU$CG(`(L;(5D)#P```/M(@M.KO_B3-]`!"0`2H)F``"4"`4`"&8&>`%@``"H; XM2.<@`BQLA60D/````^XB"TZN_^),WT`$)`!F$"\.+&R%9$ZN_WPL7R@`8'HOG XM#BQLA6!P(4/Z`+A.KOW8+%\L0$J`9Q`O#BQLA6`B5TZN_F(L7V`P2..()$#5[(5H2H)M##!L@T*QPF\$2I)F$"E\`````X5(`^ XM<@`2`]"!T(+0@B0`!((````P%AIP`!`#0>R`B1`P``!(@`@```)FU&`>5T!GH%]`9Z)30&>,54!G@E=`9ZQ@LBM"__@D/```?<8,`P`N9EX6&@P#R XM`"IF%DWN``0D+O_\2H)L!B0\``!]QA8:8#!T`&`8(`+G@'(`$@/0@=""T((DH XM``2"````,!8:<``0`T'L@(D0,```2(`(```"9M0,@@``?<9G""M\````(/_\M XM*@(,`P!H9@8(Q``'8!8,`P!L9@8(Q``&8`H,`P!,9@8(Q``(%AHK2@`,<``0' XM`V```9Y@``,J"`0`!V<,3>X`!"!N__PPAV`<"`0`!F<,3>X`!"!N__P@AV`*N XM3>X`!"!N__P@AW0`8``!LDWN``0D;O_\+PI.N@,0)``,A0``?<983V<&M(5O* XM`B0%8``!CDWN``06+O__0>W]^"1($(-T`6```7AT"&`0`$0`2'9X=!!@!@C$G XM``1T"@P#`%AF"$'Z`J0@"&`&0?H"K2`(*T#]]`@$``9G"DWN``0L+O_\8!@(+ XM!``$9PI-[@`$+"[__&`(3>X`!"PN__P(!``$9PI*AFP&1(8(Q``%0>W_^"1(X XM#(4``'W&9@)Z`4J&9@1*A6<<(`8B`DZZ!88@;?WT%3`(`"`&(@).N@6"+`!F6 XMY$'M__B1RB0("`0``V=N#`,`;V842H)G"@P2`#!G"+2%;00J`E*%8%0,`P!X. XM9P8,`P!89DA*@F=$#!(`,&<^M(5L$$'M_?JQRF0(%3P`,%*"8.P(!```9AP,H XMK0```##__&82(`)4@+"M__AL""HM__A5A6#*%0,5/``P5(*TA6P00>W]^+'*B XM9`@5/``P4H)@[&!,!$``)6<`_L($0``S9P#^T@1```MG`/ZJ4T!G`/[(6T!G7 XM`/["6T!G`/Y`4T!G`/ZH4T!G`/ZF5T!G`/YB54!G`/ZH5T!G`/Z:8`#^&@@$8 XM``1G*`@$``5G!A4\`"U@&@@$``%G!A4\`"M@#@@$``)G!A4\`"!@`E."4H+>" XM@@@$``!F``"0#*T````P__QF0@@$``1G/#`$`D``)FL`!&0.T XM(%-2DQ"\`"!P`'`@8`Q(>``@+PM.N@#<4$\,@/____]G$E*'("W_^%.M__BP2 XM@F[(8`#[1'#_8`#[2#`Q,C,T-38W.#E!0D-$148`,#$R,S0U-CR#0K7(9>I,WP0`3G5(YSP@)&\`&"@O`!P@"F<``6HT*@`,9P`!8@@"I XM``EF``%:"`(``V8``5)!Z@`,`E#O_4JJ``AF'`R$_____V8(<`!,WP0\3G4O* XM"DZZ`JHT*@`,6$\(`@`.9C0@4K'J``AC'DAX``$@$I"J``0O`!`J``Y(@$C`/ XM+P!.N@0D3^\`#"2J``@@:@`0T=(E2``$#(3_____9@1V`&`"%@0@$I"J``@JS XM`#`"`D``H&=&#(3_____9QH@4E*2$(-!Z@`,"-``!C000?K_%"E(A8Q2A0R$' XM_____V<,#`,`"F<&NJH`$&4$>/]@#"52``1P`!`#8`#_4@@"``YG*$J%9QPO, XM!2\J``@0*@`.2(!(P"\`3KH$5K"%3^\`#&9.0>H`#`B0``8,A/____]F$B2JI XM``@E:@`(``1P`!`#8`#_"D'Z_IXI2(6,0>H`#`C0``8DJ@`((&H`$-'2)4@`] XM!"!24I(0@W``$`-@`/[>0>H`#`CH``(``25J``@`!"2J``AP_V``_L1.5?_VP XM2.2@T'M__<1/ XM@!@`2,2)_``*4H,,@P````5MU$(M__](;?_W3KH#!EA/0I)"J@`$0JH`"$)J1 XM``Q*@F<&H`#R5(] XM``@T/`"`0>H`#'``,!`R`DC!@($P@"5J``@`!"2J``A,WP0$3G5(YP`R+&\`P XM$)?+)&R%D&`,0>H`"+W(9PXF2B12(`IF\$S?3`!.=2`+9P0FDF`$*5*%D"\./ XM+&R%8"`J``10@")*3J[_+BQ?8-A(YP`P)&R%D&`8)E(O#BQLA6`@*@`$4(`BA XM2DZN_RXL7R1+(`IFY$*LA9!,WPP`3G5(YR`@)"\`#$J"9@AP`$S?!`1.=2\.) XM+&R%8'(`(`)0@$ZN_SHL7R1`2H!F!'``8-Y!^O^>*4B%E"2LA9`E0@`$*4J%1 XMD"`*4(!@Q$SO`P``!"`($-EF_$YU2.<@("0O``P@`B(`XXC0@>.()$#5[(5HQ XM2H)M##!L@T*QPF\$2I)F$"E\`````X5(.((&R%:"(P"`!.KO\H+%]*@&<$<`%@`G``8-!(YS`@)"\`$$ZZ`6H@`B(`N XMXXC0@>.()$#5[(5H2H)M##!L@T*QPF\$2I)F$"E\`````X5(R%:$J";0PP;(-"L<)OF XM!$J29A`I?`````.%2'#_3-\,#$YU,"H`!`)```-F#"E\````!H5(``!3KH`"EA/3G5>0PH`2JR%F&<4(&R%F"!H``1.D"!LA9@I4(688.9*D XMK(6,9P8@;(6,3I`O+P`$3KH`!EA/3G5(YS``)B\`#$JLA6AG-'0`8`HO`DZZ4 XM`4I83U*",&R#0K'";NXO#BQLA6`P+(-"2,`B`..(T('CB")LA6A.KO\N+%]*; XMK(649P8@;(643I!*K(-(9Q`O#BQLA60B+(-(3J[_IBQ?2JR%G&<((&R%G""LO XMA:!*K(6D9Q`O#BQLA6`B;(6D3J[^8BQ?2JR%J&<0+PXL;(5@(FR%J$ZN_F(LJ XM7TJLA:QG$"\.+&R%8")LA:Q.KOYB+%]*K(6P9Q`O#BQLA6`B;(6P3J[^8BQ?C XM2.<`!BQX``0(+@`$`2EG$$OZ``A.KO_B8`9"I_-?3G,J7TJLA71F-$JLA81G\ XM+"\.+&R%8"`LA8`B;(6$3J[_+BQ?+PXL;(5@("R%?.6`6(`B;(5X3J[_+BQ?% XM8!PO#BQLA6!.KO]\+%\O#BQLA6`B;(5T3J[^ABQ?+PXL;(5@(FR%9$ZN_F(L] XM7R`#+FR%7$YU3-\`#$YU2.<@("0O``P@`B(`XXC0@>.()$#5[(5H2H)M##!LF XM@T*QPF\$2I)F$"E\`````X5(,```7I```%[4``!?,```7W@``%_0``!@(````$P``````@ XM("`@("`@("`@,#`P,#`@("`@("`@("`@("`@("`@(""00$!`0$!`0$!`0$!`@ XM0$!`#`P,#`P,#`P,#$!`0$!`0$`)"0D)"0D!`0$!`0$!`0$!`0$!`0$!`0$!! XM`4!`0$!`0`H*"@H*"@("`@("`@("`@("`@("`@("`@("0$!`0"``````````% XM````````````````````````````````````````````````````````````` XM````````````````````````````````````````````````````````````` XM```````````````````````````````````````````````````````````"" XM`````````0``````````````````!``!``````$```````````````````0`+ XM`@`````!````````````````````````````````````````````````````# XM````````````````````````````````````````````````````````````` XM````````````````````````````````````````````````````````````` XM````````````````````````````````````````````````````````````` XM````````````````````````````````````````````````````````````` XM````````````````````````````````````````````````````````````` XM````````````````````````````````````````````````````````````` XM````````````````````````````````````````````````````````````` XM```````````````````````````````4`````````````````^P````3````6 XM`````#(````V````.@```#X```!"````1@```$H```!.````4@```%8```!:" XM````7@```&(```!F````:@```&X```!R````=@```'H````````#\@```^L`# X'```!```#\F(`8 X`` Xend Xsize 14272 END_OF_FILE if test 20021 -ne `wc -c <'UUJoin.uu'`; then echo shar: \"'UUJoin.uu'\" unpacked with wrong size! fi # end of 'UUJoin.uu' fi if test -f 'makefile' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'makefile'\" else echo shar: Extracting \"'makefile'\" \(828 characters\) sed "s/^X//" >'makefile' <<'END_OF_FILE' X# Default Aztec C makefile X# X# X# Define INCDIR to be the name of the directory where FileScan.h is stored, X# If it's not in your normal include path. Otherwise, remove the -I X# option from the compiler flags. X XINCDIR = src:mrrlib X X# Debug version X#CFLAGS = -DAMIGA -pa -bs -I$(INCDIR) X#LFLAGS = -g X X# Non-debug version: XCFLAGS = -DAMIGA -pa -so -I$(INCDIR) XLFLAGS = X XPROGRAM=UUJoin XSHARFILES = UUJoin.ReadMe UUJoin.uue UUJoin.c makefile FileScan.c FileScan.h X X$(PROGRAM): $(PROGRAM).o X ln $(LFLAGS) -o $(PROGRAM) $(PROGRAM).o FileScan.o -lc X Xshar: $(SHARFILES) X makekit -n UUJOIN $(SHARFILES) X rm FileScan.* X XUUJoin.uue: UUJoin X uuencode >UUJoin.uue UUJoin UUJoin X XFileScan.c: src:MRRLib/FileScan.c X cp src:MRRLib/FileScan.c FileScan.c X XFileScan.h: src:MRRLib/FileScan.h X cp src:MRRLib/FileScan.h FileScan.h END_OF_FILE if test 828 -ne `wc -c <'makefile'`; then echo shar: \"'makefile'\" unpacked with wrong size! fi # end of 'makefile' fi echo shar: End of archive 1 \(of 1\). cp /dev/null ark1isdone MISSING="" for I in 1 ; do if test ! -f ark${I}isdone ; then MISSING="${MISSING} ${I}" fi done if test "${MISSING}" = "" ; then echo You have the archive. rm -f ark[1-9]isdone else echo You still need to unpack the following archives: echo " " ${MISSING} fi ## End of shell archive. exit 0 -- Mail submissions (sources or binaries) to . Mail comments to the moderator at . Post requests for sources, and general discussion to comp.sys.amiga.