home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
OS/2 Shareware BBS: 6 File
/
06-File.zip
/
FILES202.ZIP
/
GETFILE.C
< prev
next >
Wrap
C/C++ Source or Header
|
1989-02-28
|
7KB
|
279 lines
/* getfile.c
**
** Copyright (c) 1988-89, Christopher Laforet
** All Rights Reserved
**
** (v1.xx) for Turbo-C
** (v2.xx) for OS/2 - CML 2-89
**
*/
#include <stdio.h>
#include <stdlib.h>
#include <os2.h>
#include <string.h>
#include "files.h"
int compare(arg1,arg2)
struct file **arg1;
struct file **arg2;
{
return(strcmp((*arg1)->file_name,(*arg2)->file_name));
}
void getfile(path_name,file_mask)
unsigned char *path_name;
unsigned char *file_mask;
{
struct file **file_info = NULL;
unsigned short cur_alloc = 0;
unsigned short max_alloc = 0;
FILEFINDBUF findbuf;
HDIR hdir;
unsigned char buffer[100];
unsigned char date[15];
unsigned char time[10];
unsigned short rtn;
unsigned short num = 1;
unsigned short count;
hdir = _osmode == OS2_MODE ? 0xffff : 0x1;
if (path_name[0])
{
sprintf(buffer,"%s\\%s",path_name,file_mask);
}
else
{
strcpy(buffer,file_mask);
}
strlwr(path_name);
rtn = DosFindFirst(buffer,&hdir,0x37,(PFILEFINDBUF)&findbuf,sizeof(FILEFINDBUF),&num,0L);
while (!rtn)
{
if (cur_alloc >= max_alloc)
{
if (!(file_info = realloc(file_info,(max_alloc += 6) * sizeof(struct file *))))
{
fprintf(stderr,"Aborting: Out of memory...\n");
exit(-1);
}
}
if (!(file_info[cur_alloc] = calloc(1,sizeof(struct file))))
{
fprintf(stderr,"Aborting: Out of memory...\n");
exit(-1);
}
if (!(file_info[cur_alloc]->file_name = calloc(findbuf.cchName + 1,sizeof(char))))
{
fprintf(stderr,"Aborting: Out of memory...\n");
exit(-1);
}
strcpy(file_info[cur_alloc]->file_name,findbuf.achName);
strlwr(file_info[cur_alloc]->file_name);
file_info[cur_alloc]->file_attr = findbuf.attrFile;
memcpy(&file_info[cur_alloc]->file_date,&findbuf.fdateLastWrite,sizeof(FDATE));
memcpy(&file_info[cur_alloc]->file_time,&findbuf.ftimeLastWrite,sizeof(FTIME));
file_info[cur_alloc]->file_size = findbuf.cbFile;
++cur_alloc;
num = 1;
rtn = DosFindNext(hdir,(PFILEFINDBUF)&findbuf,sizeof(FILEFINDBUF),&num);
}
DosFindClose(hdir);
if (sort_flag)
{
qsort(file_info,cur_alloc,sizeof(struct file *),compare);
}
for (count = 0; count < cur_alloc; count++)
{
convert_date(&file_info[count]->file_date,date);
convert_time(&file_info[count]->file_time,time);
if ((directory_flag == 0) && !(file_info[count]->file_attr & 0x10))
{
++total_files;
total_bytes += file_info[count]->file_size;
if (verbose_flag)
{
if (file_info[count]->file_attr & 0x1)
{
fprintf(stdout,"-r");
}
else
{
fprintf(stdout,"--");
}
if (file_info[count]->file_attr & 0x2)
{
fprintf(stdout,"h");
}
else
{
fprintf(stdout,"-");
}
if (file_info[count]->file_attr & 0x4)
{
fprintf(stdout,"s");
}
else
{
fprintf(stdout,"-");
}
if (file_info[count]->file_attr & 0x8)
{
fprintf(stdout,"v");
}
else
{
fprintf(stdout,"-");
}
if (file_info[count]->file_attr & 0x20)
{
fprintf(stdout,"a");
}
else
{
fprintf(stdout,"-");
}
fprintf(stdout," %7lu %12.12s %5.5s %s%s%s\n",file_info[count]->file_size,date,time,path_name,path_name[0] ? "\\" : "",file_info[count]->file_name);
}
else
{
fprintf(stdout," %7lu %12.12s %5.5s %s%s%s\n",file_info[count]->file_size,date,time,path_name,path_name[0] ? "\\" : "",file_info[count]->file_name);
}
}
else if ((file_info[count]->file_attr & 0x10) && (file_info[count]->file_name[0] != '.'))
{
if (verbose_flag)
{
fprintf(stdout,"d-----");
fprintf(stdout," -DIR- %12.12s %5.5s %s%s%s\n",date,time,path_name,path_name[0] ? "\\" : "",file_info[count]->file_name);
}
else
{
fprintf(stdout," -DIR- %12.12s %5.5s %s%s%s\n",date,time,path_name,path_name[0] ? "\\" : "",file_info[count]->file_name);
}
}
}
if (pattern_flag)
{
unsigned char newbuf[100];
if (cur_alloc)
{
for (count = 0; count < cur_alloc; count++)
{
free(file_info[count]->file_name);
free(file_info[count]);
}
free(file_info);
file_info = NULL;
cur_alloc = max_alloc = 0;
}
if (path_name[0])
{
sprintf(newbuf,"%s\\*.*",path_name);
}
else
{
strcpy(newbuf,"*.*");
}
hdir = _osmode == OS2_MODE ? 0xffff : 0x1;
num = 1;
rtn = DosFindFirst(newbuf,&hdir,0x10,(PFILEFINDBUF)&findbuf,sizeof(FILEFINDBUF),&num,0L);
while (!rtn)
{
if ((findbuf.attrFile & 0x10) && !current_flag && (findbuf.achName[0] != '.'))
{
if (cur_alloc >= max_alloc)
{
if (!(file_info = realloc(file_info,(max_alloc += 6) * sizeof(struct file *))))
{
fprintf(stderr,"Aborting: Out of memory...\n");
exit(-1);
}
}
if (!(file_info[cur_alloc] = calloc(1,sizeof(struct file))))
{
fprintf(stderr,"Aborting: Out of memory...\n");
exit(-1);
}
if (!(file_info[cur_alloc]->file_name = calloc(findbuf.cchName + 1,sizeof(char))))
{
fprintf(stderr,"Aborting: Out of memory...\n");
exit(-1);
}
strcpy(file_info[cur_alloc]->file_name,findbuf.achName);
strlwr(file_info[cur_alloc]->file_name);
file_info[cur_alloc]->file_attr = findbuf.attrFile;
memcpy(&file_info[cur_alloc]->file_date,&findbuf.fdateLastWrite,sizeof(FDATE));
memcpy(&file_info[cur_alloc]->file_time,&findbuf.ftimeLastWrite,sizeof(FTIME));
file_info[cur_alloc]->file_size = findbuf.cbFile;
++cur_alloc;
}
num = 1;
rtn = DosFindNext(hdir,(PFILEFINDBUF)&findbuf,sizeof(FILEFINDBUF),&num);
}
DosFindClose(hdir);
if (cur_alloc)
{
for (count = 0; count < cur_alloc; count)
{
if (path_name[0])
{
sprintf(newbuf,"%s\\%s",path_name,file_info[count]->file_name);
}
else
{
sprintf(newbuf,"%s",file_info[count]->file_name);
}
getfile(newbuf,file_mask);
}
for (count = 0; count < cur_alloc; count++)
{
free(file_info[count]->file_name);
free(file_info[count]);
}
free(file_info);
file_info = NULL;
cur_alloc = max_alloc = 0;
}
if (sort_flag)
{
qsort(file_info,cur_alloc,sizeof(struct file *),compare);
}
}
else if (!current_flag)
{
for (count = 0; count < cur_alloc; count++)
{
if ((file_info[count]->file_attr & 0x10) && (file_info[count]->file_name[0] != '.')) /* directory */
{
if (path_name[0])
{
sprintf(buffer,"%s\\%s",path_name,file_info[count]->file_name);
}
else
{
strcpy(buffer,file_info[count]->file_name);
}
getfile(buffer,file_mask);
free(file_info[count]->file_name);
free(file_info[count]);
}
else
{
free(file_info[count]->file_name);
free(file_info[count]);
}
}
}
if (file_info)
{
free(file_info);
}
}