|
Registered User
Join Date: Aug 2005
Posts: 15
OS: XP
|
/* FL.C -- FILE LOCATOR by Michael P. Kelly
There are five icons on the unzipped file. None of which is what you are looking for. The first is: /* FL.C -- FILE LOCATOR by Michael P. KellyThe second is the window with the blue banner on top that relaunches the same system again, followed by Fl PRJ file, Fl Dat File, Fl Obj file. I must be missing something. Can you direct me please. Jim
Just in case it is the first one you wanted here it is: * FL.C -- FILE LOCATOR by Michael P. Kelly
This program was written in Turbo C v2.0 and will search your current
disk drive (hard or floppy) for the file(s) that you request.
*/
#include <stdio.h>
#include <dos.h>
#include <dir.h>
#include <string.h>
#include <conio.h>
#include <alloc.h>
#include <stdlib.h>
#include <ctype.h>
#include <bios.h>
#include <flash.h>
#define DIRS 50 /* max number of subdirectories */
#define SIZE 13 /* filename.ext length */
#define PATHLEN 67 /* max length of path name */
struct ffblk info; /* holds file find information */
char original[PATHLEN]; /* users original directory */
char filespec[SIZE]; /* filespec user is looking for */
int matches = 0; /* matches of filespec found */
char *months[] = { "JAN","FEB","MAR","APR","MAY","JUN",
"JUL","AUG","SEP","OCT","NOV","DEC" };
char *location;
char drive[MAXDRIVE];
char dir[MAXDIR];
char file[MAXFILE];
char ext[MAXEXT];
char test[PATHLEN];
void traverse(char *subname);
int getsubdirs(char (*mike)[SIZE]);
void look(char *lostfile);
char *str_2_lower(char *str);
void file_time(unsigned t);
void file_date(unsigned t);
char *justify(char *name);
void userwait(void);
int read_key(void);
int wbuffer;
main(int argc, char *argv[])
{
/* make <filespec> global and get the original directory */
strcpy(filespec,argv[1]);
getcwd(original,PATHLEN-1);
/* if there are no arguments, display the instructions and quit. */
if(argc < 2) {
location = searchpath("FL.DAT");
fnsplit(location,drive,dir,file,ext);
if(strcmp("\\",dir) != 0)
dir[strlen(dir)-1] = '\0';
chdir(dir);
if(win_lib("FL.DAT")) {
printf("\nNo help available since FL.DAT cannot be found.\n");
printf("\nHINT: Place FL.EXE and FL.DAT in any of your PATH directories!\n");
return(0);
}
wbuffer = open_win("title",WE_CENTER_OUT,3);
read_key();
close_win(wbuffer,WE_SLIDE_DOWN,1);
wbuffer = open_win("instruct",WE_SLIDE_UP,1);
read_key();
close_win(wbuffer,WE_CURTAIN,1);
wbuffer = open_win("final",WE_CENTER_OUT,1);
chdir(original);
return(0);
}
clrscr();
printf("\nFL - File Locator by 2LT Michael P. Kelly, (c) 1988-1989.\n");
/* start at users request or the root directory */
if(argc == 3)
traverse(argv[2]);
else
traverse("\\");
/* return user to the same directory that he started in. */
chdir(original);
printf("\n\n%d files found meeting the %s criteria.\n",matches,filespec);
return(0);
}
void traverse(char *subname)
{
char (*dir)[SIZE]; /* pointer to an array of SIZE chars */
register int total; /* number of directories found */
register int index; /* counter */
char (*tmp)[SIZE];
/* allocate enough memory and initialize the pointer to it. */
dir = malloc(DIRS * SIZE + 1);
if(dir == NULL) {
printf("\nERROR: Failed memory allocation.\n");
chdir(original);
exit(1);
}
tmp = dir;
/* check to be sure that the directory change worked. */
if(chdir(subname) != 0) {
printf("\n ERROR: Directory %s does not exist.\n",subname);
chdir(original);
exit(1);
}
/* get the number & names of subdirectories and check out each one */
total = getsubdirs(dir);
for(index = 0;index < total;dir++,index++)
traverse((char *)dir);
/* check for <filespec>, free memory, go to previous subdirectory */
look(filespec);
free(tmp);
chdir("..");
}
/*
Accepts a pointer to an array of SIZE characters, fills the arrays with
the names of any subdirectories it finds and returns the number found
to the calling routine.
*/
getsubdirs(char (*ptr)[SIZE])
{
register int count = 0;
findfirst("*.*", &info, FA_DIREC); /* start looking */
if(info.ff_name[0] == '.') { /* do we have the . subdir? */
findnext(&info); /* yes, get the .. subdir too */
if(findnext(&info) != 0) /* is there another dir? */
return(0); /* no, so return 0 subdirs here */
}
if(info.ff_attrib == FA_DIREC) { /* is this a subdir? */
strcpy(*ptr++,info.ff_name); /* yes, place in array */
count++; /* increment counter */
}
while(findnext(&info) == 0) { /* go thru the rest */
if(info.ff_attrib == FA_DIREC) { /* is this a subdir? */
strcpy(*ptr++,info.ff_name); /* yes, place in array */
count++; /* increment counter */
}
}
return(count); /* return number of directories */
}
/*
Check for any file(s) that meet the <filespec> criteria in this
directory. If found, print directory, file names and increment
matches counter.
*/
void look(char *lostfile)
{
char here[PATHLEN]; /* used to hold pathname */
if(findfirst(lostfile,&info,0x00) == 0) {
getcwd(here,PATHLEN-1);
printf("\n\n%s",here);
printf("\n\t%s",justify(str_2_lower(info.ff_name)));
printf("\t%7ld bytes ",info.ff_fsize);
file_time(info.ff_ftime);
file_date(info.ff_fdate);
matches++;
while(findnext(&info) == 0) {
printf("\n\t%s",justify(str_2_lower(info.ff_name)));
printf("\t%7ld bytes ",info.ff_fsize);
file_time(info.ff_ftime);
file_date(info.ff_fdate);
matches++;
}
}
}
/*
When passed a pointer to a character string, it will convert the string
to all uppercase. It also returns a pointer to that string as well.
*/
char *str_2_lower(char *str)
{
char *tmp;
tmp = str;
while(*str != '\0')
*str++ = tolower(*str);
return(tmp);
}
/*
The unsigned number from the ffblk structure is coded as follows:
HHHHHMMM MMMSSSSS -- as unsigned int
c[1] c[0] -- as two unsigned characters
*/
void file_time(unsigned t)
{
union twobytes {
unsigned char c[2];
unsigned u;
} f;
unsigned hours;
unsigned mins;
char zone[3] = "am";
f.u = t;
hours = f.c[1] >> 3;
mins = ((f.c[1] & 7) << 3) + (f.c[0] >> 5);
if(hours > 11) {
strcpy(zone,"pm");
if(hours > 12)
hours -= 12;
}
if(hours == 0)
hours = 12;
printf(" %2u:%02u %s ",hours,mins,zone);
}
/*
The unsigned number from the ffblk structure is coded as follows:
YYYYYYYM MMMDDDDD -- as unsigned int
c[1] c[0] -- as two unsigned characters
*/
void file_date(unsigned t)
{
union twobytes {
unsigned char c[2];
unsigned u;
} f;
unsigned day;
unsigned month;
unsigned year;
f.u = t;
day = (f.c[0] & 31);
month = ((f.c[1] & 1) * 8) + (f.c[0] >> 5);
year = 1980 + (f.c[1] >> 1);
printf(" %s %2u %4u ",months[month-1],day,year);
}
/*
When passed a pointer to an array of SIZE characters, it will left-
justify the filename and extension by padding with blank spaces. It
returns a pointer to the changed array.
*/
char *justify(char *name)
{
char *tmp;
char work[SIZE];
int index;
int count;
tmp = work;
for(index = 0;index < 13;index++)
*(tmp + index) = ' ';
*(tmp + 12) = '\0';
for(index = 0;*(name + index) != '.';index++)
*(tmp + index) = *(name + index);
*(tmp + 8) = '.';
index++;
for(count = 9;*(name + index) != '\0';count++,index++)
*(tmp + count) = *(name + index);
strcpy(name,tmp);
userwait(); /* best place to check for a pause!!! */
return(name);
}
/*
This function checks for any keystroke. If found it pauses and waits
for another keystroke before returning to the caller.
*/
void userwait(void)
{
if(bioskey(1) != 0) {
bioskey(0);
while(bioskey(1) == 0);
bioskey(0);
}
Let me know where I am screwing up. Jim
|