home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Club Amiga de Montreal - CAM
/
CAM_CD_1.iso
/
files
/
182.lha
/
CShell_v3.0a
/
comm3.c
< prev
next >
Wrap
C/C++ Source or Header
|
1988-04-28
|
9KB
|
508 lines
/*
* COMM3.C
*
* Version 3.00A by Carlo Borreo & Cesare Dieni 30-Oct-88
*
*/
do_assign() {
switch(ac) {
case 1: assignlist();
break;
case 2: doassign(av[1], NULL);
break;
case 3: doassign(av[1], av[2]);
break;
default: ierror(NULL, 500);
break;
}
return 0;
}
char *assign_errors[4]={
"",
"Name %s is not valid\n",
"Weird error\n",
"Can't cancel %s\n"
};
doassign(log, phy)
char *log, *phy;
{
int last=strlen(log) - 1;
if (log[last] != ':') fprintf(stderr, "Bad name %s\n", log);
else {
log[last] = 0;
fprintf(stderr,assign_errors[Assign(log, phy)],log);
}
}
assignlist()
{
struct DirectoryEntry *de_head=NULL, *de;
char buf[256];
BPTR lock;
int ctr=0;
AddDADevs(&de_head, DLF_DEVICES | DLF_VOLUMES | DLF_DIRS);
printf("Devices:\n");
for (de=de_head; de && de->de_Type==DLX_DEVICE; de=de->de_Next) {
printf("%-8s",de->de_Name);
if (ctr++ == 5) { ctr=0; printf("\n"); }
}
printf("\n\nVolumes:\n");
for ( ;
de && (de->de_Type==DLX_VOLUME || de->de_Type==DLX_UNMOUNTED);
de=de->de_Next
)
printf( "%-16s %s\n",
de->de_Name,
de->de_Type == DLX_VOLUME ? "[Mounted]" : ""
);
printf("\nDirectories:\n");
for (; de && de->de_Type==DLX_ASSIGN; de=de->de_Next) {
if (lock=Lock(de->de_Name, ACCESS_READ)) {
PathName(lock, buf, 256L);
UnLock(lock);
}
else
strcpy(buf,"Unexisting lock");
printf("%-20s%s\n",de->de_Name,buf);
}
FreeDAList(&de_head);
}
do_join()
{
BPTR sou, dest;
char *buffer;
unsigned int i;
long n;
char *namedest=av[--ac];
get_opt("r", &i);
if (options==0 && exists(namedest)) { ierror(namedest,203); return 20; }
if ( (buffer=malloc(8192)) == NULL ) { ierror(NULL,103); return 20; }
if ( (dest=Open(namedest, MODE_NEWFILE)) == NULL )
{ pError(namedest); goto fail1; }
for (i=1; i<ac; i++) {
if ( (sou=Open(av[i], MODE_OLDFILE)) == NULL ) pError(av[i]);
else
while( (n=Read(sou, buffer, 8192L)) > 0 )
if (Write(dest, buffer, n) != n)
{ pError(namedest); Close(sou); goto fail2; }
Close(sou);
}
fail2:
Close(dest);
fail1:
free(buffer);
return 0;
}
#define BUFDIM 512L
#define MAXSTR 256
int minstr;
strings_in_file(s)
char *s;
{
char c;
char readbuf[BUFDIM+1], strbuf[MAXSTR+1];
register unsigned int i, strctr=0;
BPTR fh;
int out, n;
if ( fh=Open(s, MODE_OLDFILE) ) {
fprintf(stderr, "Strings in %s (len>=%d):\n",s,minstr);
while ( (n=(int)Read(fh, readbuf, BUFDIM)) > 0 && !CHECKBREAK() )
for (i=0; i<n; i++) {
c=readbuf[i];
if (c<0x20 || c>0x7f) {
out=(strctr>minstr);
if (!out) strctr=0;
}
else {
strbuf[strctr++]=c;
out=(strctr>=BUFDIM);
}
if (out) {
strbuf[strctr]='\0';
puts(strbuf);
strctr=0;
}
}
Close(fh);
}
else pError(s);
}
do_strings()
{
minstr=atoi(av[--ac]);
all_args("r", strings_in_file, 0);
return 0;
}
BPTR myfile[MAXMYFILES];
do_open()
{
long mode;
unsigned int n;
switch (av[2][0]) {
case 'r': mode=MODE_OLDFILE; break;
case 'w': mode=MODE_NEWFILE; break;
default : ierror(NULL,500); return;
}
Errno=0;
n=(unsigned int)myatol(av[3]);
if (Errno) return 20;
if (n<0 || n>MAXMYFILES) { ierror(av[3],500); return 20; }
myfile[n]=Open(av[1],mode);
return (myfile[n]==NULL);
}
do_close()
{
register unsigned int i;
int n;
for (i=1; i<ac; i++) {
Errno=0;
n=(int)myatol(av[i]);
if (Errno) return 20;
if (n<0 || n>MAXMYFILES) { ierror(av[i],500); return 20; }
myclose(n);
}
return 0;
}
myclose(n)
{
if (myfile[n]) { Close(myfile[n]); myfile[n]=NULL; }
}
do_fileslist()
{
register unsigned short i;
int flag=0;
printf("Open files:");
for (i=0; i<MAXMYFILES; i++)
if (myfile[i]) { printf(" %d",i); flag=1; }
if (!flag) printf(" None!");
printf("\n");
}
BPTR extOpen(name,mode)
char *name;
long mode;
{
if (name[0]=='.') return myfile[atoi(name+1)];
return Open(name,mode);
}
extClose(fh)
BPTR fh;
{
register unsigned short i;
for (i=0; i<MAXMYFILES; i++)
if (myfile[i]==fh) return;
Close(fh);
}
do_resident(avline)
char *avline;
{
unsigned int i;
BPTR seg;
struct ResidentPrgNode *p;
char *args;
get_opt("ar", &i);
switch (options) {
case 0:
ObtainSemaphore (& (ArpBase->ResPrgProtection) );
if (p=ArpBase->ResidentPrgList) {
printf("Name Users\n");
for (; p; p=p->rpn_Next)
printf("%-16s %-3ld\n",p->rpn_Name,p->rpn_Usage);
}
else printf("No resident program(s)\n");
ReleaseSemaphore(& (ArpBase->ResPrgProtection) );
break;
case 1:
for (; i<ac; i++)
if ( (seg=(BPTR)LoadPrg(av[i])) && AddResidentPrg(seg,av[i]) )
printf("OK! %s is now resident\n", BaseName(av[i]));
else pError(av[i]);
break;
case 2:
for (; i<ac; i++)
if (RemResidentPrg(av[i])) ierror(av[i],202);
else printf("Removed %s\n",av[i]);
break;
default:
ierror(NULL,500);
break;
}
}
struct ProcessControlBlock pcb={
4000, /* pcb_StackSize */
0, /* pcb_Pri */
};
/* remaining field are NULL */
do_truerun(avline, backflag)
char *avline;
{
char name[200];
char *FindIt();
if (backflag) {
pcb.pcb_Control=NULL;
pcb.pcb_Input=pcb.p_Output=Open("NIL:",MODE_OLDFILE);
}
else {
pcb.pcb_Control=PRB_SAVEIO;
pcb.pcb_Input=pcb.p_Output =NULL;
}
if (FindIt(av[1], "", name))
ASyncRun(name,next_word(next_word(avline)),&pcb);
else
ierror(av[1],205);
return 0;
}
int exists(name)
char *name;
{
BPTR lock;
if (lock=Lock(name,ACCESS_READ)) {
UnLock(lock);
return 1;
}
return 0;
}
do_aset()
{
Setenv(av[1],av[2]);
return 0;
}
#define HTYPELINE 16L
htype_a_file(s)
char *s;
{
BPTR fh;
long n, filesize=0;
char buf[HTYPELINE+1];
register unsigned int i;
if ( (fh=Open(s,MODE_OLDFILE))==NULL ) { pError(s); return 20; }
while ( (n=Read(fh,buf,HTYPELINE))>0 && !dobreak()) {
printf("%06lx: ",filesize);
filesize+=n;
for (i=0; i<n; i++) {
printf( (i&3) ? "%02x" : " %02x",(int)(unsigned char)buf[i]);
if (buf[i]<=0x20) buf[i]='.';
}
for ( ; i<HTYPELINE; i++) printf( (i&3) ? " " : " ");
buf[i]=0;
printf(" %s\n",buf);
}
Close(fh);
return 0;
}
do_htype()
{
all_args("", htype_a_file, 0);
return 0;
}
do_stack()
{
long n;
if (ac>1) {
n=myatol(av[1]);
if (!Errno) Mycli->cli_DefaultStack=(long)(n >> 2L);
}
else printf("current stack size is %ld bytes\n",
(long)Mycli->cli_DefaultStack << 2L);
}
long myatol(s)
char *s;
{
long n;
Errno=0;
n=Atol(s);
if (Errno==ERRBADINT) ierror(s,511);
else Errno=0;
return n;
}
do_fault()
{
struct PERROR *p;
register unsigned int i;
int n;
for (i=1; i<ac; i++) {
n=(int)myatol(av[i]);
if (!Errno) {
for (p=Perror; p->errnum && p->errnum!=n; p++);
if (p->errnum)
printf("Fault %d: %s\n",n,p->errstr);
else
printf("Fault %d not recognized\n",n);
}
}
return 0;
}
struct rpncommand {
char *str;
int parsin, parsout;
};
struct rpncommand rpn[]={
"+", 2, 1,
"-", 2, 1,
"*", 2, 1,
"/", 2, 1,
"%", 2, 1,
"&", 2, 1,
"|", 2, 1,
"~", 1, 1,
">", 2, 1,
"<", 2, 1,
"==", 2, 1,
"!", 1, 1,
".", 1, 0,
"CR", 0, 0,
"EXISTS", 1, 1,
"STR", 0, 1,
"PRINT",1, 0,
"$", 1, 1,
"HELP", 0, 0,
"LEN", 1, 1,
"STRCMP", 2, 1,
"[]", 2, 1,
"SETVAR", 2, 0,
"DUP", 1, 2,
"DROP", 1, 0,
"SWAP", 2, 2,
"ATOL", 1, 1,
NULL, 0, 1, /* this looks for a number */
};
do_rpn(garbage,ifflag) /* ifflag!=0 if called from if */
char *garbage;
{
register long n0, n1;
long t;
unsigned int i, j;
int sp=0;
long stack[100];
struct rpncommand *temp;
i=1;
if (ifflag) get_opt("rn",&i);
for (; i<ac; i++) {
for (j=0; rpn[j].str && Strcmp(rpn[j].str,av[i]); j++) ;
n0=stack[sp-1];
n1=stack[sp-2];
sp -= (rpn[j].parsin);
if (sp<0) { fprintf(stderr, "Empty stack\n"); return 1; }
switch (j) {
case 0: n0 += n1; break;
case 1: n0 = n1-n0; break;
case 2: n0 *= n1; break;
case 3: n0 = n1/n0; break;
case 4: n0 %= n1; break;
case 5: n0 &= n1; break;
case 6: n0 |= n1; break;
case 7: n0 = ~n0; break;
case 8: n0 = (n1 > n0); break;
case 9: n0 = (n1 < n0); break;
case 10: n0 = (n0 == n1); break;
case 11: n0 = !n0; break;
case 12: printf("%ld", n0); break;
case 13: printf("\n"); break;
case 14: n0=exists(n0); break;
case 15: n0=(long)av[++i];
if (i==ac) { ierror(av[i-1],500); return 20; }
break;
case 16: printf("%s",n0); break;
case 17: n0=(long)get_var(LEVEL_SET,n0); break;
case 18: printf("In Commands Out\n");
for (temp=rpn; temp->str; temp++)
printf(" %d %-10s%d\n",
temp->parsin,temp->str,temp->parsout);
break;
case 19: n0=(long)strlen(n0); break;
case 20: n0=(long)strcmp(n0,n1); break;
case 21: n0=*((char *)(n0+n1)); break;
case 22: set_var(LEVEL_SET,n1,n0); break;
case 23: n1=n0; break;
case 24: t=n0; n0=n1; n1=t; break;
case 25: break;
case 26: n0=atol(n0); break;
default: n0=myatol(av[i]);
if (Errno) ierror(av[i],500);
break;
}
stack[sp]=n0;
stack[sp+1]=n1;
sp += rpn[j].parsout;
}
if (!ifflag) for (i=0;i<sp;i++) printf("stack[%d]: %ld\n", i, stack[i]);
return (sp>0 ? (int)stack[sp-1] : 0);
}
do_path()
{
union { long *lp; long ll; } l;
BPTR lock;
char buf[256];
puts("Current dir");
l.lp = (long *) Mycli->cli_CommandDir;
while (l.ll) {
l.ll <<= 2;
PathName(l.lp[1], buf, 256L);
puts(buf);
l.ll = *l.lp;
}
puts("C:");
return 0;
}
do_pri()
{
long t, pri;
t=myatol(av[1]);
if (Errno) return 20;
if (t<1 || t>20) { ierror(av[1],500); return 20; }
pri=myatol(av[2]);
if (Errno) return 20;
if (pri<-128 || t>127) { ierror(av[2],500); return 20; }
Forbid();
SetTaskPri(FindCLI(t),pri);
return 0;
}