This is plzip.c in view mode; [Download] [Up]
#ifndef __NeXT__
#include <malloc.h>
#endif
#include <stdio.h>
#include <strings.h>
#ifdef SYSV
#include <getopt.h>
#else
extern int getopt(int argc, char **argv, char *optstring);
extern char *optarg;
extern int optind, opterr;
#endif
#define putlong(l,f) {putc(l,f); putc(l>>8,f); putc(l>>16,f); putc(l>>24,f);}
#define getlong(l,f) {l=getc(f)&0xff; l|=(getc(f)&0xff)<<8; l|=(getc(f)&0xff)<<16; l|=(getc(f)&0xff)<<24;}
main(int argc, char *argv[])
{
char *ibuf, *obuf, *wrk_mem;
int ilen,olen,rlen;
int is=0, os=0;
int bsize = 100;
int compress_flag = 1, index_flag = 0, verbose=0;
struct compress_identity *cid;
char *pname = argv[0];
FILE *infile, *outfile;
int i;
extern int level;
int nindex;
long *index;
int *keypos, *keylen;
char **keys;
int rsize, insize, outsize, rnum, bnum, r, b;
int c,err=0;
if (rindex(pname,'/')) pname = rindex(pname,'/')+1;
while ((c = getopt(argc, argv, "r:l:cdiv")) != -1) {
switch (c) {
case 'c': compress_flag = 1;
break;
case 'd': compress_flag = 0;
break;
case 'i': index_flag = 1;
break;
case 'v': verbose = 1;
break;
case 'r': bsize = atoi(optarg);
break;
case 'l': level = atoi(optarg);
break;
case '?': err=1;
}
}
if (err || argc-(optind-1) < 3) {
fprintf(stderr,"usage: plzip [-cdv] [-l level] [-r recs] infile outfile [ keypos keylen [ keypos keylen ] ... ] \n");
exit(1);
}
argc -= optind-1;
argv += optind-1;
if (!index_flag) {
if ((infile = fopen(argv[1],compress_flag?"r":"rb")) == NULL) {
fprintf(stderr,"Can't open input file %s:",argv[1]);
perror(NULL);
exit(1);
}
}
if ((outfile = fopen(argv[2],index_flag?"r+b":(compress_flag?"wb":"w"))) == NULL) {
fprintf(stderr,"Can't open output file %s:",argv[2]);
perror(NULL);
exit(1);
}
argc -= 2;
argv += 2;
if (index_flag || compress_flag) {
nindex = (argc-1)/2;
keys = (char**) malloc(nindex*sizeof(char*));
keypos = (int*) malloc(nindex*sizeof(int));
keylen = (int*) malloc(nindex*sizeof(int));
for(i=0; i<nindex; i++) {
keypos[i] = atoi(*(++argv))-1;
keylen[i] = atoi(*(++argv));
}
}
if (index_flag) {
extern char* outptr;
extern char* outbuf;
outbuf=malloc(2048+1);
infile = outfile;
fseek(infile,0,0);
getlong(rsize,infile);
getlong(bsize,infile);
getlong(rnum ,infile);
fseek(outfile,ftell(infile),0);
putlong(nindex,outfile);
fseek(infile,ftell(outfile),0);
getlong(i ,infile);
fseek(infile, i, 0);
bnum = (rnum+bsize-1)/bsize;
ibuf = malloc(bsize*rsize);
obuf = malloc(bsize*rsize);
index = (long*) malloc((bnum+1)*sizeof(long));
for(i=0; i<nindex; i++)
keys[i] = (char*) malloc((bnum+1)*keylen[i]*sizeof(char));
for(i=0; i<bnum+1; i++)
getlong(index[i],infile);
for(b=r=0; r<rnum; r+=bsize,b++) {
outsize = (rnum-r)*rsize;
if (outsize > rsize*bsize) outsize = rsize*bsize;
fseek(infile, index[b], 0);
ilen = fread(ibuf, 1, index[b+1]-index[b], infile);
is += ilen;
if (ilen != index[b+1]-index[b]) {
fprintf(stderr,"b=%d bnum=%d r=%d rnum=%d outsize=%d ilen=%d %d\n",b,bnum,r,rnum,outsize,ilen,index[b+1]-index[b]);
perror("short input file"); exit(1);
}
outptr = obuf;
memextract(obuf,outsize,ibuf,ilen);
os += outsize;
/* if (verbose) fprintf(stderr,"%8d => %8d\n",ilen,outsize); /**/
for(i=0; i<nindex; i++)
strncpy(keys[i]+b*keylen[i],obuf+keypos[i],keylen[i]);
}
for(i=0; i<nindex; i++)
strncpy(keys[i]+b*keylen[i],obuf + outsize-rsize + keypos[i],keylen[i]);
/* write new indices */
fseek(outfile,ftell(infile),0);
for(i=0; i<bnum+1; i++)
putlong(index[i],outfile);
for(i=0; i<nindex; i++) {
putlong(keypos[i],outfile);
putlong(keylen[i],outfile);
fwrite(keys[i], 1, (bnum+1)*keylen[i], outfile);
}
ftruncate(fileno(outfile),ftell(outfile));
fclose(outfile);
if (verbose) fprintf(stderr,"input: %9u => output: %9u (ratio %5.3f)\n",is,os,(os+0.0)/is); /**/
}
else if (compress_flag) {
for (rsize=1; getc (infile) != '\n'; rsize++);
fseek(infile, 0L, 2);
insize = ftell(infile);
fseek(infile, 0L, 0);
rnum = insize/rsize;
bnum = (rnum+bsize-1)/bsize;
printf("rsize = %d\n",rsize);
printf("insize = %d\n",insize);
printf("recs = %d\n",rnum);
printf("blocks = %d\n",bnum);
if (insize%rsize) {
fprintf(stderr,"Warning: input file size is no integer multiple of record size %d\nLast %d bytes are skipped.\n",rsize,insize%rsize);
}
putlong(rsize,outfile);
putlong(bsize,outfile);
putlong(rnum ,outfile);
putlong(nindex,outfile);
putlong(0 ,outfile);
ibuf = malloc(bsize*rsize);
obuf = malloc(bsize*rsize);
index = (long*) malloc((bnum+1)*sizeof(long));
for(i=0; i<nindex; i++)
keys[i] = (char*) malloc((bnum+1)*keylen[i]*sizeof(char));
for(b=r=0; r<rnum; r+=bsize,b++) {
insize = (rnum-r)*rsize;
if (insize > rsize*bsize) insize = rsize*bsize;
ilen = fread(ibuf, 1, insize, infile);
is += ilen;
if (ilen != insize) {
fprintf(stderr,"b=%d bnum=%d r=%d rnum=%d insize=%d ilen=%d\n",b,bnum,r,rnum,insize,ilen);
perror("short input file"); exit(1);
}
olen=memcompress(obuf,bsize*rsize,ibuf,insize);
os += olen;
/* if (verbose) fprintf(stderr,"%8d => %8d\n",ilen,olen); /**/
index[b] = ftell(outfile);
for(i=0; i<nindex; i++)
strncpy(keys[i]+b*keylen[i],ibuf+keypos[i],keylen[i]);
fwrite(obuf,1,olen,outfile);
}
index[b] = ftell(outfile);
for(i=0; i<nindex; i++)
strncpy(keys[i]+b*keylen[i],ibuf + insize-rsize + keypos[i],keylen[i]);
fseek(outfile, index[0]-4, 0);
putlong(index[b],outfile);
fseek(outfile, index[b], 0);
for(i=0; i<bnum+1; i++)
putlong(index[i],outfile);
for(i=0; i<nindex; i++) {
putlong(keypos[i],outfile);
putlong(keylen[i],outfile);
fwrite(keys[i], 1, (bnum+1)*keylen[i], outfile);
}
if (verbose) fprintf(stderr,"input: %9u => output: %9u (ratio %5.3f)\n",is,os,(is+0.0)/os); /**/
}
else {
extern char* outptr;
extern char* outbuf;
outbuf=malloc(2048+1);
getlong(rsize,infile);
getlong(bsize,infile);
getlong(rnum ,infile);
getlong(nindex,infile);
getlong(i ,infile);
fseek(infile, i, 0);
bnum = (rnum+bsize-1)/bsize;
ibuf = malloc(bsize*rsize);
obuf = malloc(bsize*rsize);
keys = (char**) malloc(nindex*sizeof(char*));
keypos = (int*) malloc(nindex*sizeof(int));
keylen = (int*) malloc(nindex*sizeof(int));
index = (long*) malloc((bnum+1)*sizeof(long));
for(i=0; i<bnum+1; i++)
getlong(index[i],infile);
for(i=0; i<nindex; i++) {
getlong(keypos[i],infile);
getlong(keylen[i],infile);
keys[i] = (char*) malloc((bnum+1)*keylen[i]*sizeof(char));
fread(keys[i], 1, (bnum+1)*keylen[i], infile);
}
for(b=r=0; r<rnum; r+=bsize,b++) {
outsize = (rnum-r)*rsize;
if (outsize > rsize*bsize) outsize = rsize*bsize;
fseek(infile, index[b], 0);
ilen = fread(ibuf, 1, index[b+1]-index[b], infile);
is += ilen;
if (ilen != index[b+1]-index[b]) {
fprintf(stderr,"b=%d bnum=%d r=%d rnum=%d outsize=%d ilen=%d %d\n",b,bnum,r,rnum,outsize,ilen,index[b+1]-index[b]);
perror("short input file"); exit(1);
}
outptr = obuf;
memextract(obuf,outsize,ibuf,ilen);
os += outsize;
/* if (verbose) fprintf(stderr,"%8d => %8d\n",ilen,outsize); /**/
fwrite(obuf,1,outsize,outfile);
}
if (verbose) fprintf(stderr,"input: %9u => output: %9u (ratio %5.3f)\n",is,os,(os+0.0)/is); /**/
}
}
void error(h)
char *h;
{
fprintf(stderr,"%s\n", h);
}
void warn(a, b)
char *a, *b; /* message strings juxtaposed in output */
/* Print a warning message to stderr and return. */
{
fprintf(stderr, "zip warning: %s%s\n", a, b);
}
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.