Logo Search packages:      
Sourcecode: zoo version File versions  Download package

zoofilt.c

/* derived from: zoofilt.c 1.8 88/01/30 23:47:05 */

#ifndef LINT
static char sccsid[]="@(#) $Id: zoofilt.c,v 1.5 91/07/09 01:54:15 dhesi Exp $";
#endif

/*
(C) Copyright 1988 Rahul Dhesi -- All rights reserved
(C) Copyright 1991 Rahul Dhesi -- All rights reserved

Filter mode -- compress or decompress standard input and write
to standard output.
*/

#include "options.h"

#ifdef FILTER

#include "zooio.h"
#include "errors.i"
#include "zoofns.h"

/* action */
#define COMPRESS        0
#define UNCOMPRESS      1

#define FTAG      ((unsigned int) 0x5a32) /* magic number */

extern unsigned int crccode;

int rdint PARMS((unsigned int *));  /* read an unsigned int */
int wrint PARMS((unsigned int));    /* write an unsigned int */

/* global variable used to pass two bytes (CRC value) back from lzd to here */
unsigned int filt_lzd_word;

void zoofilt (option)
char *option;
{
      int choice;                                                             /* what to do -- [de]compress */
      unsigned int filetag;                                       /* tag stored in input */
      int stat1, stat2, stat3;                                    /* status codes */
      int use_lzh = 0;                                                  /* use lzh instead */
      extern lzc(), lzh_encode();                           /* possible encoders */
      extern lzd(), lzh_decode();                           /* and decoders */

      while (*++option) {
            switch (*option) {
                  case 'c':   choice = COMPRESS;    break;
                  case 'u':   choice = UNCOMPRESS;  break;
                  case 'h':   use_lzh = 1; break;
                  default:
            prterror ('f', inv_option, *option);      /* fatal error -- abort */
      }
      }

      crccode = 0;      /* needed whether compressing or uncompressing */

      switch (choice) {
            case COMPRESS:
                  stat1 = wrint (FTAG);
                  stat2 = (use_lzh ? lzh_encode : lzc) (STDIN, STDOUT);
                  stat3 = wrint (crccode);
                  if (stat1 == 0 && stat2 == 0 && stat3 == 0)
                        zooexit (0);
                  else {
                        fprintf (stderr, "Zoo: FATAL: Compression error.\n");
                        zooexit (1);
                  }
                  break;
            case UNCOMPRESS:
                  stat1 = rdint (&filetag);
                  if (stat1 != 0 || filetag != FTAG)
                        zooexit (1);
                  stat2 = (use_lzh ? lzh_decode : lzd) (STDIN, STDOUT);
                  if (stat2 == 0 && filt_lzd_word == crccode)
                        zooexit (0);
                  else {
                        fprintf (stderr, "Zoo: FATAL: Uncompression error.\n");
                        zooexit (1);
                  }
                  break;
      }
} /* zoofilt */

#endif /* FILTER */

Generated by  Doxygen 1.6.0   Back to index