mirror of
https://github.com/SEPPDROID/Digital-Research-Source-Code.git
synced 2025-10-24 08:54:17 +00:00
198 lines
3.0 KiB
C
198 lines
3.0 KiB
C
#include "tp.h"
|
||
|
||
main(argc,argv)
|
||
char **argv;
|
||
{
|
||
register char c,*ptr;
|
||
extern cmd(), cmr(),cmx(), cmt();
|
||
|
||
tname = tc;
|
||
command = cmr;
|
||
if ((narg = rnarg = argc) < 2) narg = 2;
|
||
else {
|
||
ptr = argv[1]; /* get first argument */
|
||
parg = &argv[2]; /* pointer to second argument */
|
||
while (c = *ptr++) switch(c) {
|
||
case '0':
|
||
case '1':
|
||
case '2':
|
||
case '3':
|
||
case '4':
|
||
case '5':
|
||
case '6':
|
||
case '7':
|
||
tc[8] = c;
|
||
mt[8] = c;
|
||
continue;
|
||
|
||
case 'f':
|
||
tname = *parg++;
|
||
flags |= flm;
|
||
narg--; rnarg--;
|
||
continue;
|
||
case 'c':
|
||
flags |= flc; continue;
|
||
case 'd':
|
||
setcom(cmd); continue;
|
||
case 'i':
|
||
flags |= fli; continue;
|
||
case 'm':
|
||
tname = mt;
|
||
flags |= flm;
|
||
continue;
|
||
case 'r':
|
||
flags &= ~flu; setcom(cmr); continue;
|
||
case 's':
|
||
flags |= fls; continue;
|
||
case 't':
|
||
setcom(cmt); continue;
|
||
case 'u':
|
||
flags |= flu; setcom(cmr); continue;
|
||
case 'v':
|
||
flags |= flv; continue;
|
||
case 'w':
|
||
flags |= flw; continue;
|
||
case 'x':
|
||
setcom(cmx); continue;
|
||
default:
|
||
useerr();
|
||
}
|
||
}
|
||
optap();
|
||
top = nptr = nameblk = sbrk(0);
|
||
(*command)();
|
||
}
|
||
|
||
optap()
|
||
{
|
||
extern cmr();
|
||
|
||
if ((flags & flm) == 0) { /* DECTAPE */
|
||
tapsiz = TCSIZ;
|
||
ndirent = TCDIRS;
|
||
fio =open(tc,2);
|
||
} else { /* MAGTAPE */
|
||
tapsiz = MTSIZ;
|
||
ndirent = MDIRENT;
|
||
if(command == cmr) {
|
||
fio = open(tname,1);
|
||
if (fio < 0) fio = creat(tname,0666);
|
||
} else
|
||
fio = open(tname,0);
|
||
}
|
||
if (fio < 0) {
|
||
printf("Tape open error\n");
|
||
done();
|
||
}
|
||
ndentb = ndirent/TPB;
|
||
edir = &dir[ndirent];
|
||
}
|
||
|
||
setcom(newcom)
|
||
int (*newcom)();
|
||
{
|
||
extern cmr();
|
||
|
||
if (command != cmr) useerr();
|
||
command = newcom;
|
||
}
|
||
|
||
useerr()
|
||
{
|
||
printf("Bad usage\n");
|
||
done();
|
||
}
|
||
|
||
/*/* COMMANDS */
|
||
|
||
cmd()
|
||
{
|
||
extern delete();
|
||
|
||
if (flags & (flm|flc)) useerr();
|
||
if (narg <= 2) useerr();
|
||
rddir();
|
||
gettape(delete);
|
||
wrdir();
|
||
check();
|
||
}
|
||
|
||
cmr()
|
||
{
|
||
if (flags & (flc|flm)) clrdir();
|
||
else rddir();
|
||
getfiles();
|
||
update();
|
||
check();
|
||
}
|
||
|
||
cmt()
|
||
{
|
||
extern taboc();
|
||
|
||
if (flags & (flc|flw)) useerr();
|
||
rddir();
|
||
if (flags & flv)
|
||
printf(" mode uid gid tapa size date time name\n");
|
||
gettape(taboc);
|
||
check();
|
||
}
|
||
|
||
cmx()
|
||
{
|
||
extern extract();
|
||
|
||
if (flags & (flc)) useerr();
|
||
rddir();
|
||
gettape(extract);
|
||
done();
|
||
}
|
||
|
||
check()
|
||
{
|
||
usage();
|
||
done();
|
||
}
|
||
|
||
done()
|
||
{
|
||
printf("End\n");
|
||
exit(0);
|
||
}
|
||
|
||
encode(pname,dptr) /* pname points to the pathname
|
||
* nptr points to next location in nameblk
|
||
* dptr points to the dir entry */
|
||
char *pname;
|
||
struct dent *dptr;
|
||
{
|
||
register char *np;
|
||
register n;
|
||
|
||
dptr->d_namep = np = nptr;
|
||
if (np > top - NAMELEN) {
|
||
if(sbrk(BRKINCR) == (char *)-1) {
|
||
printf("Out of core\n");
|
||
done();
|
||
} else
|
||
top += BRKINCR;
|
||
}
|
||
if((n=strlen(pname)) > NAMELEN) {
|
||
printf("Pathname too long - %s\nFile ignored\n",pname);
|
||
clrent(dptr);
|
||
}
|
||
else {
|
||
nptr += n+1;
|
||
strcpy(np, pname);
|
||
}
|
||
}
|
||
|
||
decode(pname,dptr) /* dptr points to the dir entry
|
||
* name is placed in pname[] */
|
||
char *pname;
|
||
struct dent *dptr;
|
||
{
|
||
|
||
strcpy(pname, dptr->d_namep);
|
||
}
|