1 /***********************************************************************
2   This file is part of HA, a general purpose file archiver.
3   Copyright (C) 1995 Harri Hirvola
4 
5   This program is free software; you can redistribute it and/or modify
6   it under the terms of the GNU General Public License as published by
7   the Free Software Foundation; either version 2 of the License, or
8   (at your option) any later version.
9 
10   This program is distributed in the hope that it will be useful,
11   but WITHOUT ANY WARRANTY; without even the implied warranty of
12   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13   GNU General Public License for more details.
14 
15   You should have received a copy of the GNU General Public License
16   along with this program; if not, write to the Free Software
17   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18 ************************************************************************
19        HA I/O routines
20 ***********************************************************************/
21 
22 #include <stdio.h>
23 #include "ha.h"
24 #include "haio.h"
25 #include "error.h"
26 #include "haio.h"
27 
28 #define uppdcrc(_crc,_c) _crc=(crctab[((int)(_crc)^(_c))&0xff]^((_crc)>>8))
29 #define CRCMASK		0xffffffffUL
30 #define CRCP		0xEDB88320UL
31 
32 int infile,outfile;
33 U32B crc;
34 U32B crctab[256];
35 unsigned char ib[BLOCKLEN],ob[BLOCKLEN];
36 int ibl,ibf,obl;
37 U32B icnt,ocnt,totalsize;
38 unsigned char r_crc,w_crc,r_progdisp,w_progdisp;
39 static int write_on,crctabok=0;
40 static char *outname=NULL,*inname=NULL;
41 
42 void (*outspecial)(unsigned char *obuf, unsigned oblen);
43 unsigned (*inspecial)(unsigned char *ibuf, unsigned iblen);
44 
makecrctab(void)45 static void makecrctab(void) {
46 
47     U16B i,j;
48     U32B tv;
49 
50     for (i=0;i<256;i++) {
51 	tv=i;
52 	for (j=8;j>0;j--) {
53 	    if (tv&1) tv=(tv>>1)^CRCP;
54 	    else tv>>=1;
55 	}
56 	crctab[i]=tv;
57     }
58 }
59 
setoutput(int fh,int mode,char * name)60 void setoutput(int fh, int mode, char *name) {
61 
62     outname=name;
63     outspecial=NULL;
64     if (fh>=0) write_on=1;
65     else write_on=0;
66     obl=0;
67     ocnt=0;
68     outfile=fh;
69     w_crc=mode&CRCCALC;
70     if (w_crc) {
71 	if (!crctabok) makecrctab();
72 	crc=CRCMASK;
73     }
74     w_progdisp=mode&PROGDISP;
75 }
76 
77 
setinput(int fh,int mode,char * name)78 void setinput(int fh, int mode, char *name) {
79 
80     inname=name;
81     inspecial=NULL;
82     ibl=0;
83     icnt=0;
84     infile=fh;
85     r_crc=mode&CRCCALC;
86     if (r_crc) {
87 	if (!crctabok) makecrctab();
88 	crc=CRCMASK;
89     }
90     r_progdisp=mode&PROGDISP;
91 }
92 
93 
getcrc(void)94 U32B getcrc(void) {
95 
96     return crc^CRCMASK;
97 }
98 
clearcrc(void)99 void clearcrc(void) {
100 
101     crc=CRCMASK;
102 }
103 
bread(void)104 void bread(void) {
105 
106     register S16B i;
107     register unsigned char *ptr;
108 
109     if (inspecial!=NULL) {
110 	ibl=(*inspecial)(ib,BLOCKLEN);
111 	ibf=0;
112 	return;
113     }
114     else {
115 	ibl=read(infile,ib,BLOCKLEN);
116 	if (ibl<0) error(1,ERR_READ,inname);
117 	ibf=0;
118     }
119     if (ibl) {
120 	icnt+=ibl;
121 	if (r_progdisp) {
122 	    printf("%3d %%\b\b\b\b\b",
123 		   (int)(icnt*100/(totalsize==0?1:totalsize)));
124 	    fflush(stdout);
125 	}
126 	if (r_crc) {
127 	    for (i=0,ptr=ib;i<ibl;++i) {
128 		uppdcrc(crc,*(ptr++));
129 	    }
130 	}
131     }
132 }
133 
bwrite(void)134 void bwrite(void) {
135 
136     register S16B i;
137     register unsigned char *ptr;
138 
139     if (obl) {
140 	if (outspecial!=NULL) {
141 	    (*outspecial)(ob,obl);
142 	}
143 	else {
144 	    if (write_on && write(outfile,ob,obl)!=obl)
145 	      error(1,ERR_WRITE,outname);
146 	    ocnt+=obl;
147 	    if (w_progdisp) {
148 		printf("%3d %%\b\b\b\b\b",
149 		       (int)(ocnt*100/(totalsize==0?1:totalsize)));
150 		fflush(stdout);
151 	    }
152 	    if (w_crc) {
153 		for (i=0,ptr=ob;i<obl;++i) {
154 		    uppdcrc(crc,*(ptr++));
155 		}
156 	    }
157 	}
158 	obl=0;
159     }
160 }
161 
162 
163 
164