home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
C/C++ Interactive Guide
/
c-cplusplus-interactive-guide.iso
/
c_ref
/
csource3
/
192_01
/
kilarutl.c
< prev
next >
Wrap
Text File
|
1979-12-31
|
16KB
|
681 lines
/* -- DECLARE VARIABLES -- */
char fat[1050];
char directry[4096];
unsigned int offset, cluster, nxtclust, direntry, noncontig=0;
unsigned int i,j,cl,numin,tot,sector, bytedata, *pint, nsects, svcluster;
char *cfrom, drive, resp, chgflag;
char file[11], cmpflag, evenflag, col, foundflag;
char ds=0;
/* -- GLOBAL VARIABLES FOR SCREEN CONTROL -- */
char scr_cols;
char scr_rows;
char scr_mode;
char scr_page;
char scr_attr;
/* ---- EXECUTABLE CODE BEGINS HERE --- */
/* -- MAIN ROUTINE -- */
main()
{
char c, s[10];
int i,j,sectindx;
/* SET SCREEN TO WHITE CHARS ON BLUE */
scr_setup();
scr_setmode(3);
scr_mode = 3;
scr_attr = 0x17;
scr_clr();
scr_rowcol(1,1);
/* PRINT WELCOME */
printf("WELCOME to the Kilar Utilities. These programs give you \n");
printf("various operations on DS/DD (360K) diskettes with no subdirs.\n");
/* GET DRIVE DESIGNATION */
printf("Enter letter of drive to be accessed/used: ");
scanf("%c",&drive);
/* CONVERT DRIVE FROM ASCII TO BINARY */
drive = drive - 0x41;
if (drive > 26)
drive = drive - 0x20;
printf(" \n");
/* GET FAT AND DIRECTORY FROM DISKETTE */
printf("\nGetting FAT and directory from diskette ..... \n");
getsect(fat,drive,1);
getsect(&fat[512],drive,2);
for (i = 0; i < 7; i++)
getsect(&directry[(i*512)],drive,(i+5));
/* DETERMINE AMOUNT OF FRAGMENTATION,
NON-CONTIGUOUS CLUSTERS IN FILES */
sectindx = sectriz();
printf("\n\nFragmentation index for diskette is: %d\n",sectindx);
printf("\n");
if (sectindx == 0)
printf("No file fragmentation on diskette.\n");
else if (sectindx < 8)
printf("Only some file fragmentation on diskette.\n");
else if (sectindx < 15)
printf("Moderate file fragmentation on diskette.\n");
else if (sectindx < 22)
printf("File fragmentation high, COPY *.* to new disk recommended.\n");
else
printf("Excessive file fragmentation, COPY *.* to new disk urged.\n");
printf("\nHit any key to continue\n");
getchar();
/* MAIN MENU LOOP */
again:
scr_clr();
scr_rowcol(1,1);
printf("WELCOME to the Kilar Utilities. These programs give you \n");
printf("various operations on double sided, double density diskettes.\n");
scr_rowcol(4,10);
printf("Please make your selection:\n");
scr_rowcol(6,13);
printf("1 - Display/Modify data in specific diskette sector\n");
scr_rowcol(8,13);
printf("2 - Display use (file belongs to or free) of sector\n");
scr_rowcol(10,13);
printf("3 - Display map showing use of all clusters on disk\n");
scr_rowcol(12,13);
printf("4 - Display all sectors used by a specific file\n");
scr_rowcol(14,13);
printf("5 - Save a sector (and associated cluster) as a new file\n");
scr_rowcol(16,13);
printf("6 - Return to DOS\n");
scr_rowcol(18,10);
printf("Strike appropriate digit followed by ENTER key: \n");
gets(s);
c = s[0];
switch(c)
{
case '1': sect(); /* DISPLAY/MODIFY SECTOR */
break;
case '2': sectuse(); /* USE OF SPECIFIED SECTOR */
break;
case '3': clustmap(); /* CLUSTER MAP */
break;
case '4': fileallo(); /* SECTORS ALLOCATED TO SPECIFIED FILE */
break;
case '5': filesect(); /* SAVE SECTOR AS A FILE */
break;
case '6': exit(); /* RETURN TO DOS */
break;
default: printf("Illegal option - try again \n");
}
printf("\n Type any key to continue \n");
c = getchar();
goto again; /* WHEN DONE, RETURN TO MAIN MENU */
}
/* --- clustmap routine - displays a cluster map of diskette */
clustmap()
{
nsects = chgflag = 0;
printf("Cluster map routine. \n");
printf("Displays use of all data clusters on diskette.\n");
printf("Cluster map: \n");
col = 1;
/* For each of the data cluster */
for (cluster = 2; cluster < 356; cluster++)
{
printf(" %3d=",cluster);
col += 5;
/* Check if cluster is part of file */
if (next(cluster) == 0)
{
printf("free ");
col += 12;
checkcol();
continue;
}
/* Check directory if cluster is beginning of a file */
foundflag = 0;
for (i = 0; i < 112; i++) /* check each directory entry */
{
direntry = 32 * i;
pint = &directry[direntry + 26]; /* check first cluster value */
if (cluster == *pint)
{
directry[direntry+11] = 0; /* if checks, get file name */
for (j = 0; j < 8; j++)
putchar(directry[direntry+j]);
putchar('.');
for (j = 8; j < 11; j++)
putchar(directry[direntry+j]);
putchar(' ');
col += 12; /* 12 chars displayed */
checkcol(); /* check for end of line */
foundflag = 1;
break;
}
if (foundflag)
continue;
}
if (foundflag)
continue;
/* Check FAT for reference to cluster */
svcluster = cluster;
while (cl = prev(svcluster))
svcluster = cl;
/* Check directory for reference to cluster */
for (i = 0; i < 112; i++)
{
direntry = 32 * i;
pint = &directry[direntry + 26];
if (svcluster == *pint)
{
directry[direntry+11] = 0;
for (j = 0; j < 8; j++)
putchar(directry[direntry+j]);
putchar('.');
for (j = 8; j < 11; j++)
putchar(directry[direntry+j]);
putchar(' ');
col += 12;
checkcol();
break;
}
}
}
}
/* -- checkcol routine - checks for near end of line -- */
checkcol()
{
if (col > 66)
{
putchar('\n');
col = 1;
}
return;
}
/* -- next - use FAT to get no. of the next cluster in file -- */
next(clust)
unsigned int clust;
{
unsigned int nxtclust, *pint, offset;
char evenflag;
/* see PC-DOS Technical Reference Manual for explanation */
if ((clust & 0xfffe) == clust)
evenflag = 1;
else
evenflag = 0;
nxtclust = clust + clust/2;
pint = fat + nxtclust;
offset = *pint;
if (evenflag)
offset = offset & 0x0fff;
else
offset = offset >> 4;
return(offset);
}
/* -- prev - Check thru FAT to find entry pointing to current
cluster. That is the previous cluster. --- */
prev(clust)
unsigned int clust;
{
unsigned int nxtclust, *pint, offset;
char evenflag;
for (i = 2; i < 356; i++) /* check each FAT entry */
{
if ((i & 0xfffe) == i)
evenflag = 1;
else
evenflag = 0; /* determine next cluster */
nxtclust = i + i/2;
pint = fat + nxtclust;
offset = *pint;
if (evenflag)
offset = offset & 0x0fff;
else
offset = offset >> 4;
if (offset == clust) /* if equal to current, have the previous */
return(i);
}
return(0);
}
/* --- fileallo routine - displays sectors belonging to specified file */
fileallo()
{
noncontig = 0;
nsects = chgflag = 0;
printf("File allocation routine.\n");
printf("Displays the logical numbers of sectors the file occupies \n");
printf("for double sided/double density diskette. \n \n");
printf("Enter 8 letter basename of file in CAPS, spaces after end: ");
for (i = 0; i < 8; i++)
file[i] = getchar();
printf("\nEnter 3 letter suffix of file in CAPS, spaces after end: ");
for (i = 0; i < 3; i++)
file[(i+8)] = getchar();
/* Loop to find file name in directory */
i = cmpflag = 0;
while (!cmpflag)
{
direntry = i * 32; /* Find file entry in directory */
if (!strncmp(&directry[direntry],file,11))
cmpflag = 1;
else if (i > 112) /* If not found, return to DOS */
{
printf("File not found, terminating to DOS \n");
return;
}
else
i++;
}
pint = &directry[(direntry+26)]; /* Get first no. of first cluster */
cluster = *pint;
col = 1;
printf("\n \nFile is on sectors: \n");
prtsect(cluster);
next1: /* Get next cluster number */
if ((cluster & 0xfffe) == cluster)
evenflag = 1;