home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FM Towns: Free Software Collection 3
/
FREEWARE.BIN
/
towns_os
/
look
/
source
/
wc.c
< prev
next >
Wrap
Text File
|
1980-01-02
|
4KB
|
193 lines
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <strings.h>
#include <dos.h>
#include <msdos.cf>
#define SHORT short int
#define LONG long int
#define ULONG unsigned long int
#define BOOL short int
#define TRUE 1
#define FALSE 0
#define ERR (-1)
#define MAXWCP 200
typedef struct {
SHORT wb_dsp;
SHORT wb_att;
SHORT wb_time,wb_date;
ULONG wb_size;
char wb_name[14];
} WCBUF;
int wcmax=0;
WCBUF *topwcp=NULL;
char *subname(char *name)
{
static char tmp[14];
int i;
char *p;
if ( *name == '.' ) {
for ( i = 0,p = tmp ; i < 9 ; i++ ) {
if ( *name == '\0' )
*(p++) = ' ';
else
*(p++) = *(name++);
}
} else {
for ( i = 0,p = tmp ; i < 9 ; i++ ) {
if ( *name == '.' || *name == '\0' )
*(p++) = ' ';
else
*(p++) = *(name++);
}
if ( *name == '.' ) name++;
}
for ( ; i < 12 ; i++ ) {
if ( *name == '\0' )
*(p++) = ' ';
else
*(p++) = *(name++);
}
*p = '\0';
return tmp;
}
int cmpname(char *arg,char *str)
{
int i;
char *p,tmp[14];
strcpy(tmp,subname(arg));
p = subname(str);
if ( (i = strcmp(tmp + 9,p + 9)) != 0 )
return i;
tmp[9] = p[9] = '\0';
return strcmp(tmp,p);
}
void sort(int bs,int mx)
{
int i,j;
WCBUF x,w;
i=bs;
j=mx;
memcpy(&x,&(topwcp[bs + (mx - bs) / 2]),sizeof(WCBUF));
do {
while ( cmpname(topwcp[i].wb_name, x.wb_name) < 0 )
i++;
while ( cmpname(topwcp[j].wb_name, x.wb_name) > 0 )
j--;
if ( i <= j ) {
memcpy(&w,&(topwcp[i]),sizeof(WCBUF));
memcpy(&(topwcp[i]),&(topwcp[j]),sizeof(WCBUF));
memcpy(&(topwcp[j]),&w,sizeof(WCBUF));
i++; j--;
}
} while ( i <= j );
if ( bs < j )
sort(bs,j);
if ( i < mx )
sort(i,mx);
}
BOOL subwc(char *arg,int mode,WCBUF *wcp)
{
static BOOL opflg=FALSE;
static struct {
char dd_dmy[22];
SHORT dd_time,dd_date;
LONG dd_size;
char dd_name[13];
} dma;
if ( opflg == FALSE ) {
Registers.AX.R = 0x1A00;
Registers.DX.R = (int)&dma;
Registers.DS.R = getds();
calldos();
Registers.AX.R = 0x4E00;
Registers.CX.R = mode;
Registers.DX.R = (int)arg;
Registers.DS.R = getds();
opflg = TRUE;
}
else
Registers.AX.R = 0x4F00;
calldos();
if ( (Registers.Flags & 0x0001) != 0 ) {
opflg = FALSE;
return FALSE;
}
wcp->wb_dsp = 0;
wcp->wb_att = dma.dd_dmy[21];
wcp->wb_date = dma.dd_date;
wcp->wb_time = dma.dd_time;
wcp->wb_size = dma.dd_size;
strcpy(wcp->wb_name,dma.dd_name);
return TRUE;
}
void chdir(char *name)
{
Registers.AX.R = 0x3B00;
Registers.DX.R = (int)name;
Registers.DS.R = getds();
calldos();
if ( name[1] == ':' ) {
Registers.AX.R = 0x0E00;
Registers.DX.R = (*name & 0xDF) - 'A';
calldos();
}
}
int WC_open(char *dir,char *wild)
{
int i;
if ( dir != NULL )
chdir(dir);
if ( topwcp == NULL &&
(topwcp = (WCBUF *)malloc(sizeof(WCBUF)*MAXWCP)) == NULL )
return 0;
wcmax = 0;
while ( wcmax < MAXWCP && subwc("*.*",0x10,&topwcp[wcmax]) != FALSE ) {
if ( (topwcp[wcmax].wb_att & 0x10) != 0 )
wcmax++;
}
if ( wcmax > 1 ) sort(0,wcmax - 1);
i = wcmax;
while ( wcmax < MAXWCP && subwc(wild,0x21,&topwcp[wcmax]) != FALSE )
wcmax++;
if ( (wcmax - 1) > i ) sort(i,wcmax - 1);
return wcmax;
}
int drvsts(int no)
{
Registers.AX.R = 0x4404;
Registers.BX.R = no + 1;
Registers.CX.R = 0x0000;
calldos();
return (Registers.AX.R & 0x0E);
}
int retdir(char *name)
{
Registers.AX.R = 0x4700;
Registers.DX.R = 0x0000;
Registers.SI.R = (int)name+3;
Registers.DS.R = getds();
calldos();
Registers.AX.R = 0x1900;
calldos();
*(name++) = 'A' + (Registers.AX.R & 0xFF);
*(name++) = ':';
*name = '\\';
return (Registers.AX.R & 0xFF);
}