home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
CP/M
/
CPM_CDROM.iso
/
simtel
/
sigm
/
vols000
/
vol074
/
verify.c
< prev
next >
Wrap
C/C++ Source or Header
|
1984-04-29
|
9KB
|
508 lines
/*******************************************************\
* *
* VERIFY: by Steve de Plater *
* *
* 66 Priam St. *
* Chester Hill NSW, 2224, Australia *
* Phone (02) 644 4009 *
* *
\*******************************************************/
#include bdscio.h
#define VERSION "1.1"
#define STACKSPACE 0x1000
#define DATE "28 Sep 81"
#define TIME "17:37"
char mask [50]; /* File match mask */
char work_mask [16];
int masks;
int matched;
char mask2 [36]; /* to expand masks into */
int not_mask; /* flag for '!' */
char fcb1 [36]; /* used for bdos calls */
char fn [14];
char fnp [12]; /* fn for display */
int code;
int files;
int copies;
char *dir; /* Where the DIR goes */
char *dbuf1; /* First Buffer pointer */
char *dbuf2; /* 2nd Buffer pointer */
unsigned stackspace;
int sectors; /* buffer size */
char id; /* assorted disk drive */
char od; /* specifiers.. */
char ld;
char fn1 [16];
char fn2 [16];
char temp [20];
int errors;
int ctr_z;
int no_wait;
int debug;
int dummy; /* not used - just to stay the */
/* same as backup.c (getclp()) */
char found_eof;
int total_found;
int total_copied;
int no_questions;
main (argc,argv)
char **argv;
{
int x;
int p,z;
char *y;
y = 0x501; *y = 0x20;
stackspace = STACKSPACE;
dir = endext ();
printf ("\nVERIFY, ver %s, ",VERSION);
printf ("1981, by Steve de Plater\n\n");
if (argc < 2)
getmask ();
else
strcpy (mask,argv[1]);
ld=bdos(25) + 'A';
getclp (argc,argv,
&id,&od,&dummy,&ctr_z,&no_wait,&debug);
total_found = total_copied = matched = copies = 0;
no_questions = TRUE;
do_it ();
}
getmask ()
{
int x;
printf ("Which files? ");
gets (mask);
for (x=0; *(mask+x); x++)
*(mask+x) = toupper (*(mask+x));
no_questions = FALSE;
}
getdir (fcb)
char *fcb;
{
int x,y,z;
char *s;
y=files<<4;
s=0x80+(code<<5);
if (*(s+12)) return;
files++;
for (x=0; x<16; x++)
{
dir[y]=*(s+x);
y++;
}
}
match_mask (s)
char *s;
{
int x,y;
y=TRUE;
for (x=1; x<12; x++)
if (((*(s+x)&0x7f) != mask2[x]) &&
(mask2[x] != '?' ))
y=FALSE;
if (not_mask)
return !y;
else
return y;
}
does_exist (s)
char *s;
{
char fcb [36];
setfcb (fcb,s);
if (bdos (17,fcb) > 3)
return FALSE;
else
return TRUE;
}
check (s1,s2)
char *s1,*s2;
{
int fd1,fd2;
int x,y,z,size_err;
int records;
errors =0;
records=0;
found_eof = size_err = FALSE;
if ((fd1=open (s1,0)) == ERROR)
{
printf (" FATAL ERROR: Can't find '%s'\n",s1);
quit (1);
}
if ((fd2=open (s2,0)) == ERROR)
{
printf (" FATAL ERROR: Can't find '%s'\n",s2);
quit (1);
}
while (TRUE)
{
x = read (fd1,dbuf1,sectors);
if (!x)
break;
y = read (fd2,dbuf2,sectors);
if (!y)
break;
if (y != x)
size_err = TRUE;
records += compare (dbuf1,dbuf2,x);
if (x < sectors) break;
if (found_eof) break;
}
fabort (fd1);
fabort (fd2);
if (!errors)
{
printf ("%5d records checked (OK)\n",records);
copies++;
}
else
if ((size_err) && (!found_eof))
printf (" SIZE ERROR\n");
else
printf ("%5d ERRORS FOUND (BYTES)\n",errors);
}
quit (a)
int a;
{
if (!a)
{
printf ("%d file",matched);
if (matched != 1)
putch ('s');
printf (" checked, %d verified\n",copies);
}
total_found += matched; matched = 0;
total_copied += copies; copies = 0;
if (!no_wait)
{
printf ("\nMore ? ");
if (toupper (getchar ()) == 'Y')
{
printf ("\n\n");
getmask ();
id = od = FALSE;
do_it ();
}
printf ("\n\nTotal Matched %d, Total verified %d",
total_found,total_copied);
printf ("\nMount system disk on drive '%c'\n",ld);
printf (" press <CR> to continue: ");
bios (3); putch ('\n');
}
exit (0);
}
trim_mask (s)
char *s;
{
char *x;
char t[16];
x=s;
if (*(x+1) == ':')
x+=2;
strcpy (t,x);
strcpy (s,t);
}
compare (s1,s2,a)
char *s1;
char *s2;
int a;
{
int x,y;
y=a<<7; /* y = a * 128 */
if (ctr_z)
for (x=0; x<y; x++)
{
if ((*(s1+x) == CPMEOF) ||
(*(s2+x) == CPMEOF))
{
found_eof = TRUE;
return ((x>>7)+1);
}
if (*(s1+x) != *(s2+x))
errors++;
}
else
for (x=0; x<y; x++)
if (*(s1+x) != *(s2+x))
errors++;
return a;
}
getclp (argc,argv,i,o,v,z,n,d)
int argc;
char **argv;
char *i; /* source disk */
char *o; /* destination disk */
int *v; /* verify flag */
int *z; /* CP/M EOF (^Z) flag */
int *n; /* no stop for disk change flag */
int *d; /* debug flag */
{
char line [50];
int x;
*i=*o=*v=*z=*n=*d=FALSE;
if (argc<3) return;
strcpy (line,argv[2]);
for (x=3; x<argc; x++)
strcat (line,argv[x]);
for (x=0; x<strlen(line); x++)
switch (line[x])
{
case '<': { *i=line[x+1]; x++; break; }
case '>': { *o=line[x+1]; x++; break; }
case '(': { *i=line[x+1]; x++; break; }
case ')': { *o=line[x+1]; x++; break; }
case 'V': { *v=TRUE; break; }
case 'Z': { *z=TRUE; break; }
case 'N': { *n=TRUE; break; }
case 'D': { *d=TRUE; break; }
}
}
block_check (s)
char *s;
{
int x,z,p;
char *y;
int block_size;
printf ("Matching mask '%s'\n\n",s);
block_size=0;
for (x=0; x<files; x++)
{
y=dir+(x<<4);
if (!match_mask (y))
continue;
if (*y == 0xe5)
continue;
block_size++;
*y = 0xe5;
for (z=0; z<20; z++) temp[z]=NULL;
for (z=1,p=0; z<9; z++,p++)
temp[p] = *(y+z);
while (temp[strlen(temp)-1]==0x20)
temp[strlen(temp)-1]=NULL;
strcat (temp,"."); p=strlen (temp);
for (z=9; z<12; z++,p++)
temp[p] = *(y+z)&0x7f;
fn1[0]=id; fn2[0]=od;
fn1[1]=':'; fn2[1]=':';
fn1[2]=0; fn2[2]=0;
strcpy (fnp,temp);
for (z=0; z<12; z++)
fnp[z]=fnp[z]&0x7f;
strcat (fn1,temp);
strcat (fn2,temp);
if (does_exist (fn2))
{
printf ("Verifying %-12.12s - ",fnp);
check (fn1,fn2);
matched++;
}
}
if (!block_size)
printf ("NO FILE\n");
printf ("\n");
}
mask_num (a)
int a;
{
int x,y,z;
y=z=0;
for (x=0; x<16; x++)
work_mask[x] = NULL;
for (x=0; x<strlen(mask); x++)
{
if (mask[x] == ',')
y++;
if (y==a)
break;
}
if (x >= strlen (mask))
return;
if (x)
x++;
for (y=x; y<strlen(mask); y++,z++)
{
if (mask[y] == ',')
break;
work_mask[z] = mask[y];
}
trim_mask (work_mask);
if (work_mask[0]=='!')
{
for (x=0; x<13; x++)
work_mask[x]=work_mask[x+1];
not_mask=TRUE;
}
else
not_mask=FALSE;
setfcb (mask2,work_mask);
}
do_it ()
{
int x,p,z;
char *y;
if (!id)
{
printf ("First Drive: ");
id = toupper (bios (3));
if (id != '\r')
putch (id);
putch ('\n');
no_questions = FALSE;
}
if (!od)
{
printf ("Second Drive: ");
od = toupper (bios (3));
if (od != '\r')
putch (od);
putch ('\n');
no_questions = FALSE;
}
if (id == '\r') id=ld;
if (od == '\r') od=ld;
if (id == od)
{
printf ("FIRST & SECOND DRIVES MUST DIFFER!\n");
exit (1);
}
if ((id < 'A') || (id > 'P') ||
(od < 'A') || (od > 'P'))
{
printf ("INVALID DRIVE NAME!\n");
exit (1);
}
if (!no_questions)
printf ("\n");
if (!no_wait)
{
printf ("Mount disks, <CR> to continue: ");
bios (3);
printf ("\n\n");
bdos (13);
}
files = 0;
temp[0]=id; temp[1]=':'; temp[2]=0;
strcat (temp,"*.*");
setfcb (fcb1,temp);
code = bdos (17,fcb1); /* search for first */
if (code > 3)
{
printf ("NO FILE\n");
quit (1);
}
getdir (fcb1);
while (TRUE)
{
code = bdos (18);
if (code > 3)
break;
getdir (fcb1);
}
config2();
masks=0;
mask_num (0);
while (strlen(work_mask))
{
block_check (work_mask);
masks++;
mask_num (masks);
}
quit (0);
}
config2 ()
{
unsigned x,p,z;
char *y,*top,*mid;
x = 16*files;
p = (dir + x +0x101);
dbuf1 = z = p & 0xff00;
p = (topofmem() - stackspace) & 0xff00;
sectors = (p - z) >> 8;
dbuf2 = dbuf1 + (sectors << 7);
sectors--; /* for safety!! */
if (sectors < 8)
{
printf ("NOT ENOUGH RAM FOR THIS PROGRAMME!\n");
quit (1);
}
if (debug)
{
printf ("Compiled on %s, at %s\n\n",DATE,TIME);
printf ("Directory assigned at: %04x\n",dir);
printf ("Entries found: %4d\n", files);
printf ("Buffer 1 assigned at: %04x\n",dbuf1);
printf ("Buffer 2 assigned at: %04x\n",dbuf2);
printf ("Max. Records Buffered: %4d\n", sectors);
printf ("Stackspace reserved: %04x\n",stackspace);
printf ("Top of Buffers at: %04x\n\n",p);
}
}