home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
rtsi.com
/
2014.01.www.rtsi.com.tar
/
www.rtsi.com
/
OS9
/
OSK
/
APPS
/
dm14.lzh
/
diskmaster.c
< prev
next >
Wrap
C/C++ Source or Header
|
1996-08-31
|
20KB
|
522 lines
/* DISKMASTER v1.0 */
/* copyright (c) 1995 by Bob Devries */
/* email: bdevries@gil.ipswichcity.qld.gov.au */
#include <stdio.h>
#include <dir.h>
#include <sgstat.h>
#include "screen.h"
#include "diskmaster.h"
/* added mouse here */
#ifdef MM1
#include <mouse.h>
#else
#include "mspak.h"
#endif
int mouse; /* global mouse var */
/* end mouse here */
int clsflag;
struct sgbuf buff;
char orig_echo;
char orig_eofch;
char orig_kbich;
char orig_kbach;
char orig_xon;
char orig_xoff;
char orig_pause;
main(argc,argv)
int argc;
char *argv[];
{
int useflag = 0;
int tdly, filecount, success;
int filepos, startpos, newpos;
char dirname[80];
char userdir[256];
char newdir[256];
char *getcwd();
extern char **nameptr;
extern char *buffer;
extern short *attrptr;
FILE *fp, *freopen();
int c;
int ch;
int quit = 0;
int tagged = 0;
extern char *optarg;
extern int optind;
clsflag = 0;
filepos = 0;
startpos = 0;
stdout->_flag |= _UNBUF;
stdin->_flag |= _UNBUF;
strcpy(dirname,".");
while ((c = getopt(argc, argv, "h?cd:")) != EOF)
switch (c) {
case 'h':
case '?':
useflag++;
break;
case 'd':
strcpy(dirname,optarg);
break;
case 'c':
clsflag++;
break;
default:
useflag++;
break;
}
if (useflag) {
usage();
exit(0);
}
/* start main programme here */
fp = freopen("/nil","w",stderr); /* to subvert those pesky '+8' */
/* messages from shell */
foreground(WHITE);
background(BLUE);
clearscreen();
opts();
/* mouse added here */
#ifndef MM1
mouse = MsOpen("/mouse"); /* returns 0 on SUCCESS */
if(!mouse) {
MsMnMxX(1,80);
MsMnMxY(1,24);
MsSetPos(40,12);
MsSetSns(20,20);
MsSetPol(1,-1);
MsSetDbl(200,200);
}
#else
mouse = 0;
CurOff(1);
#endif
/* end mouse here */
if(mouse) {
box_doub(30,10,21,5);
} else {
box_doub(30,10,21,6);
}
gotoxy(31,11);
printf(" DiskMaster v%d.%d ",VER,REV);
gotoxy(31,12);
printf(" Copyright(c) 1995 ");
gotoxy(31,13);
printf(" by Bob Devries ");
if(!mouse) {
gotoxy(31,14);
printf(" Mouse Detected ");
}
gotoxy(1,24);
getcwd(userdir,255);
chdir(dirname);
getcwd(newdir,255);
mainscreen(newdir);
filecount = dirread(dirname);
showfiles(filecount,startpos,filepos,REDO);
while (!quit) {
/* added mouse here */
ch = 0;
do {
if(_gs_rdy(STDIN) > 0) {
ch = getchar();
flush_kbd();
} else {
if(!mouse) {
newpos = filepos - startpos;
readmouse(&newpos,&ch);
if(newpos + startpos != filepos) {
filepos = newpos + startpos;
showfiles(filecount,startpos,filepos,REDO);
}
}
}
} while (ch == 0);
/* end mouse here */
switch (ch) {
case '\n':
success = changedir(dirname,filepos);
if(success == FAIL) break;
getcwd(newdir,255);
horiz_doub(2,23,78);
gotoxy(48,23);
putc(DBOT_TEE,stdout);
gotoxy(3,23);
printf(" %s ",newdir);
freeram();
filecount = dirread(dirname);
clearwin(2,3,28,20);
filepos = 0;
startpos = 0;
tagged = 0;
showfiles(filecount,startpos,filepos,REDO);
break;
case 'c':
if(tagged) {
multicopy(filecount);
showfiles(filecount,startpos,filepos,REDO);
tagged = 0;
break;
}
success = copy(filepos);
if(success == PASS) {
freeram();
freedev();
filecount = dirread(dirname);
showfiles(filecount,startpos,filepos,REDO);
}
break;
case 'd':
if(tagged) {
multidel(filecount);
filecount = dirread(dirname);
if(filepos > filecount) {
filepos = filecount;
startpos = (filecount/MAXCNT)*MAXCNT;
}
clearwin(2,3,28,20);
showfiles(filecount,startpos,filepos,REDO);
tagged = 0;
freedev();
break;
}
success = delete(filepos);
if(success == PASS) {
freeram();
freedev();
filecount = dirread(dirname);
if(filepos > filecount) {
filepos = filecount;
startpos = (filecount/MAXCNT)*MAXCNT;
}
clearwin(2,3,28,20);
showfiles(filecount,startpos,filepos,REDO);
}
break;
case 'm':
success = makedir();
if(success == PASS) {
freeram();
freedev();
filecount = dirread(dirname);
showfiles(filecount,startpos,filepos,REDO);
}
break;
case 'o':
if(tagged) {
multimove(filecount);
filecount = dirread(dirname);
if(filepos > filecount) {
filepos = filecount;
startpos = (filecount/MAXCNT)*MAXCNT;
}
clearwin(2,3,28,20);
showfiles(filecount,startpos,filepos,REDO);
tagged = 0;
break;
}
success = move(filepos,NULL);
if(success == PASS) {
freeram();
freedev();
filecount = dirread(dirname);
if(filepos > filecount) {
filepos = filecount;
startpos = (filecount/MAXCNT)*MAXCNT;
}
clearwin(2,3,28,20);
showfiles(filecount,startpos,filepos,REDO);
}
break;
case 'a':
if(tagged) {
multiattr(filecount);
showfiles(filecount,startpos,filepos,REDO);
tagged = 0;
break;
}
attr(filepos);
break;
case 'r':
success = renfile(filepos);
if(success == PASS) {
clearwin(2,3,28,20);
showfiles(filecount,startpos,filepos,REDO);
}
break;
case 't':
tagfile(filepos,&tagged);
showfiles(filecount,startpos,filepos,TAG);
if(++filepos > filecount) {
filepos--;
break;
}
if(filepos - startpos < MAXCNT) {
showfiles(filecount,startpos,filepos,DOWN);
} else {
startpos += MAXCNT;
clearwin(2,3,28,20);
showfiles(filecount,startpos,filepos,REDO);
}
break;
case '\x14': /* CTRL-T tags ALL files */
multitag(filecount, &tagged);
showfiles(filecount,startpos,filepos,REDO);
break;
case 'l':
gotoxy(48,2);
putc(DHORZ_BAR,stdout);
clearwin(2,3,78,20);
gotoxy(48,23);
putc(DHORZ_BAR,stdout);
gotoxy(80,15);
putc(DVERT_BAR,stdout);
list(filepos);
mainscreen(newdir);
freedev();
showfiles(filecount,startpos,filepos,REDO);
break;
case 'q':
quit++;
break;
case 'h':
gotoxy(48,2);
putc(DHORZ_BAR,stdout);
clearwin(2,3,78,20);
gotoxy(48,23);
putc(DHORZ_BAR,stdout);
gotoxy(80,15);
putc(DVERT_BAR,stdout);
list(HELP);
mainscreen(newdir);
showfiles(filecount,startpos,filepos,REDO);
break;
case 'n':
if(logdev(dirname) == FAIL) break;
success = changedir(dirname,-1);
if(success == FAIL) break;
getcwd(newdir,255);
gotoxy(2,23);
horiz_doub(2,23,78);
gotoxy(48,23);
putc(DBOT_TEE,stdout);
gotoxy(3,23);
printf(" %s ",newdir);
freeram();
freedev();
filecount = dirread(dirname);
clearwin(2,3,28,20);
filepos = 0;
startpos = 0;
tagged = 0;
showfiles(filecount,startpos,filepos,REDO);
break;
case 'u':
success = unarc(filepos);
if(success == PASS) {
freeram();
freedev();
filecount = dirread(dirname);
showfiles(filecount,startpos,filepos,REDO);
}
break;
case 's':
clearscreen();
cleanup();
printf("Type 'logout' to return to DiskMaster\n");
system("-p=DM:");
opts();
foreground(WHITE);
background(BLUE);
#ifdef MM1
CurOff(1);
#endif
mainscreen(newdir);
showfiles(filecount,startpos,filepos,REDO);
break;
case ' ':
filepos = filecount - MAXCNT + 1;
startpos = filepos;
showfiles(filecount,startpos,filepos,REDO);
break;
case DA:
if(++filepos > filecount) {
filepos--;
break;
}
if(filepos - startpos < MAXCNT) {
showfiles(filecount,startpos,filepos,DOWN);
} else {
startpos += MAXCNT;
clearwin(2,3,28,20);
showfiles(filecount,startpos,filepos,REDO);
}
break;
case BS:
filepos = 0;
startpos = 0;
showfiles(filecount,startpos,filepos,REDO);
break;
case UA: /* also Ctrl-P */
if(filepos - startpos > MINCNT) {
filepos--;
showfiles(filecount,startpos,filepos,UP);
} else {
if(startpos > 0) {
startpos -= MAXCNT;
filepos--;
showfiles(filecount,startpos,filepos,REDO);
}
}
break;
case HOME: /* also Ctrl-A */
filepos = startpos;
showfiles(filecount,startpos,filepos,REDO);
break;
case END: /* also Ctrl-E */
filepos = startpos + MAXCNT - 1;
if(filepos > filecount) filepos = filecount;
showfiles(filecount,startpos,filepos,REDO);
break;
case PgUp: /* also Ctrl-Z */
filepos = startpos - MAXCNT;
startpos -= MAXCNT;
if(filepos < MINCNT) {
filepos = MINCNT;
startpos = MINCNT;
}
showfiles(filecount,startpos,filepos,REDO);
break;
case PgDn: /* also Ctrl-V */
filepos = startpos + MAXCNT;
startpos += MAXCNT;
if(filepos > filecount) {
filepos = filecount;
startpos -= MAXCNT;
}
clearwin(2,3,28,20);
showfiles(filecount,startpos,filepos,REDO);
break;
}
}
free(nameptr);
free(attrptr);
free(buffer);
chdir(userdir);
cleanup();
}
mainscreen(newdir)
char *newdir;
{
clearscreen();
gotoxy(32,1);
printf("Disk Master v%d.%d",VER,REV);
box_doub(1,2,80,22);
info_screen();
gotoxy(48,15);
putc(DLFT_TEE,stdout);
gotoxy(80,15);
putc(DRIT_TEE,stdout);
horiz_doub(49,15,31);
gotoxy(56,17);
printf("Current disk info");
freedev();
commands();
gotoxy(3,23);
printf(" %s ",newdir);
}
usage()
{
fprintf(stderr,"Usage: DiskMaster [-c] [-d<dir name>]\n");
fprintf(stderr," -c don't clear screen on exit\n");
fprintf(stderr," dir name is initial directory\n");
}
echo(state) /* change the echo state */
char state;
{
buff.sg_echo = (char) state;
_ss_opt(STDOUT,&buff);
}
freeram()
{
extern char *buffer;
extern char **nameptr;
extern short *attrptr;
extern char *fildesbuf;
extern char **fildesptr;
free(buffer);
free(nameptr);
free(attrptr);
free(fildesbuf);
free(fildesptr);
}
opts()
{
_gs_opt(STDOUT,&buff);
orig_echo = buff.sg_echo;
orig_eofch = buff.sg_eofch;
orig_kbich = buff.sg_kbich;
orig_kbach = buff.sg_kbach;
orig_xon = buff.sg_xon; /* gets MM1 foreground PRN */
orig_xoff = buff.sg_xoff; /* gets MM1 background PRN */
orig_pause = buff.sg_pause;
buff.sg_eofch = (char)0;
buff.sg_kbich = (char)0;
buff.sg_kbach = (char)0;
buff.sg_pause = (char)0;
_ss_opt(STDOUT,&buff);
echo(OFF);
}
cleanup()
{
foreground(WHITE);
background(BLACK);
echo(orig_echo);
buff.sg_eofch = orig_eofch;
buff.sg_kbich = orig_kbich;
buff.sg_kbach = orig_kbach;
buff.sg_xon = orig_xon;
buff.sg_xoff = orig_xoff;
buff.sg_pause = orig_pause;
_ss_opt(STDOUT,&buff);
#ifdef MM1
FColor(1,(int)orig_xon);
BColor(1,(int)orig_xoff);
CurOn(1);
#endif
if(!clsflag) {
clearscreen();
} else {
gotoxy(1,24);
}
}
flush_kbd()
{
int ch;
while(_gs_rdy(STDIN) > 0) {
ch = getchar();
}
}
/* EOF diskmaster.c */