home *** CD-ROM | disk | FTP | other *** search
- /*
- * COMPRESS.C
- *
- * Compress/UNCompress/ZCat
- */
-
- #include <exec/types.h>
- #include <exec/nodes.h>
- #include <exec/lists.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include "config.h"
- #include "version.h"
- #include "OwnDevUnit.h"
-
- struct Library *OwnDevUnitBase = NULL;
- typedef struct List List;
- typedef struct Node Node;
-
- List FileList;
- short CompressOpt;
- short VerboseOpt;
- short ForceOpt;
- short ZCatOpt;
- short Bits = 14;
-
- IDENT (".04");
-
- Node *MakeNode (char *, char);
- int suffix (char *, char *);
-
- int
- _bufsiz = 8192;
-
- void
- myexit (void)
- {
- if (OwnDevUnitBase) {
- CloseLibrary (OwnDevUnitBase);
- OwnDevUnitBase = NULL;
- }
- }
-
- int
- main (int ac, char **av)
- {
- int error = 0;
-
- NewList(&FileList);
-
- {
- char *ptr;
-
- if (ptr = av[0]) {
- char *p2;
-
- if (p2 = strrchr(ptr, '/'))
- ptr = p2 + 1;
-
- switch(ptr[0]) {
- case 'u':
- case 'U':
- CompressOpt = 0;
- break;
- case 'z':
- case 'Z':
- ZCatOpt = 1;
- CompressOpt = 0;
- break;
- default:
- CompressOpt = 1;
- break;
- }
- }
- }
-
- {
- short i;
- char *ptr;
-
- for (i = 1; i < ac; ++i) {
- ptr = av[i];
-
- if (*ptr != '-') {
- AddTail(&FileList, MakeNode(ptr, 0));
- continue;
- }
- ptr += 2;
- switch(ptr[-1]) {
- case 'f': /* force compression */
- ForceOpt = 1;
- break;
- case 'c': /* write to stdout */
- ZCatOpt = 1;
- break;
- case 'b': /* bits, default 14 */
- Bits = strtol(((*ptr) ? ptr : av[++i]), NULL, 0);
- if (Bits < 12 || Bits > 16) {
- fprintf(stderr, "Illegal number of bits specified: %d\n", Bits);
- exit(20);
- }
- break;
- case 'v':
- fprintf(stderr, "AmigaUUCP Compress V5.1.A01\n");
- VerboseOpt = 1;
- break;
- case 'd': /* decompress */
- CompressOpt = 0;
- break;
- case 'V':
- fprintf(stderr, "AmigaUUCP Compress V5.1.A01\n");
- break;
- }
- }
- }
-
- atexit(myexit);
- OwnDevUnitBase = OpenLibrary (ODU_NAME, 0);
- if (OwnDevUnitBase == 0) {
- fprintf (stderr, "Unable to open " ODU_NAME "\n");
- exit (20);
- }
- /*
- * Run through file list. If no files specified used stdin
- */
-
- if (FileList.lh_Head == (Node *)&FileList.lh_Tail) {
- AddTail(&FileList, MakeNode("", 1));
- }
-
- {
- Node *node;
- FILE *fi;
- FILE *fo;
-
- while (node = RemHead(&FileList)) {
- char *srcFileName = malloc(strlen(node->ln_Name) + 16);
- char *dstFileName = malloc(strlen(node->ln_Name) + 16);
- long fi_size;
- long fo_size;
- int r = -1;
- short stdinOpt = 0;
- short destCreate = 0;
- short verboseOpt = VerboseOpt;
-
-
- /*
- * Handle compress/decompress from stdin. Output is to
- * stdout.
- */
-
- if (node->ln_Type == 1) {
- stdinOpt = 1;
- ZCatOpt = 1;
-
- strcpy(srcFileName, "<stdin>");
- strcpy(dstFileName, "<stdout>");
- } else {
- /*
- * Add .Z suffix to srcFileName, remove .Z suffix from
- * dstFileName. If compressing, exchange the pointers
- */
-
- strcpy(srcFileName, node->ln_Name);
- strcpy(dstFileName, node->ln_Name);
-
- if (suffix(srcFileName, ".Z") != 0)
- strcat(srcFileName, ".Z");
-
- if (suffix(dstFileName, ".Z") == 0)
- dstFileName[strlen(dstFileName)-2] = 0;
- }
-
- /*
- * Exchange source/destination if compressing
- */
-
- if (stdinOpt == 0 && CompressOpt) {
- char *tmp = srcFileName;
- srcFileName = dstFileName;
- dstFileName = tmp;
- }
-
- if (VerboseOpt) {
- fprintf(stderr, "%-15s -> %-15s ", srcFileName, dstFileName);
- fflush(stderr);
- }
-
- if (stdinOpt)
- fi = stdin;
- else
- fi = fopen(srcFileName, "r");
-
- if (fi) {
- if (ZCatOpt)
- fo = stdout;
- else
- fo = fopen(dstFileName, "w");
-
- if (fo) {
- destCreate = 1;
-
- if (CompressOpt)
- r = unix_compress_from_fp(fi, fo, Bits);
- else
- r = unix_uncompress_to_fp(fi, fo, &Bits);
- fo_size = ftell(fo);
- if (ZCatOpt == 0)
- fclose(fo);
- } else {
- fprintf(stderr, "(can't open %s)", dstFileName);
- verboseOpt = 1;
- }
- fi_size = ftell(fi);
- if (stdinOpt == 0)
- fclose(fi);
- } else {
- fprintf(stderr, "(can't open %s)", srcFileName);
- verboseOpt = 1;
- }
-
- /*
- * If compressing and not ForceOpt, check result size
- */
-
- if (r == 0) {
- if (VerboseOpt) {
- long factor = 10000 - fo_size * 10000 / fi_size;
-
- fprintf(stderr, "%6d->%-6d B=%d %d.%02d%% ",
- fi_size,
- fo_size,
- Bits,
- factor / 100,
- (factor < 0) ? -(factor % 100) : (factor % 100)
- );
- }
- if (ZCatOpt == 0 && CompressOpt && ForceOpt == 0 && fi_size < fo_size) {
- if (VerboseOpt)
- fprintf(stderr, "(did not comp)");
- remove(dstFileName);
- } else if (ZCatOpt == 0) {
- remove(srcFileName);
- }
- } else if (ZCatOpt == 0) {
- if (destCreate)
- remove(dstFileName);
- }
- if (verboseOpt)
- fprintf(stderr, "\n");
-
- free(dstFileName);
- free(srcFileName);
- free(node);
- if (r)
- error = 1;
- }
- }
- return(error);
- }
-
- Node *
- MakeNode(char *str, char type)
- {
- Node *node;
-
- if (node = malloc(sizeof(Node))) {
- node->ln_Name = str;
- node->ln_Type = type;
- } else {
- fprintf(stderr, "no memory!\n");
- exit(20);
- }
- return(node);
- }
-
- int
- suffix(char *str, char *suf)
- {
- short l1 = strlen(str);
- short l2 = strlen(suf);
-
- if (l1 < l2)
- return(-1);
- }
-