home *** CD-ROM | disk | FTP | other *** search
- /*
- * 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;
- }
-