/* * COMM3.C * * Version 3.02A by Carlo Borreo & Cesare Dieni 20-Dec-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 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; i0x7f) { 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=myatoi(av[--ac],1,255); 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)myatoi(av[3],0,MAXMYFILES); if (Errno) return 20; myfile[n]=Open(av[1],mode); return (myfile[n]==NULL); } do_close() { register unsigned int i; int n; for (i=1; iResPrgProtection) ); 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 (; i0 && !dobreak()) { printf("%06lx: ",filesize); filesize+=n; for (i=0; i1) { Errno=0; n=Atol(av[1]); if (!Errno) Mycli->cli_DefaultStack=(long)(n >> 2L); } else printf("current stack size is %ld bytes\n", (long)Mycli->cli_DefaultStack << 2L); return 0; } do_fault() { struct PERROR *p; register unsigned int i; int n; for (i=1; ierrnum && 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, "DUP", 1, 2, "DROP", 1, 0, "SWAP", 2, 2, "HELP", 0, 0, 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 n0); break; case 9: n0 = (n1 < n0); break; case 10: n0 = (n0 == n1); break; case 11: n0 = !n0; break; case 12: n1=n0; break; case 13: t=n0; n0=n1; n1=t; break; case 14: break; case 15: printf("In Commands Out\n"); for (temp=rpn; temp->str; temp++) printf(" %d %-10s%d\n", temp->parsin,temp->str,temp->parsout); break; default: Errno=0; n0=Atol(av[i]); if (Errno) { fprintf(stderr, "Bad RPN cmd: %s\n",av[i]); return 20; } break; } stack[sp]=n0; stack[sp+1]=n1; sp += rpn[j].parsout; } if (ifflag) return (int)(stack[sp-1]); /* called from if: return top value */ for (i=sp-1;(int)i>=0;i--) printf("%ld\n", stack[i]); /* else print stack */ return 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() { int t, pri; struct Process *proc; t=myatoi(av[1],0,20); if (Errno) return 20; pri=myatoi(av[2],-128,127); if (Errno) return 20; Forbid(); proc=(t==0 ? Myprocess : FindCLI((long)t)); if (proc==NULL) fprintf(stderr, "process not found\n"); else SetTaskPri(proc, (long)pri); Permit(); return 0; } do_strleft() { char buf[256]; int n; strcpy(buf,av[2]); n=myatoi(av[3],1,strlen(buf)); if (Errno) return 20; buf[n]='\0'; set_var(LEVEL_SET, av[1], buf); return 0; } do_strright() { char buf[256]; int n; strcpy(buf, av[2]); n=myatoi(av[3],1,strlen(buf)); if (Errno) return 20; set_var(LEVEL_SET, av[1], buf+strlen(buf)-n); return 0; } do_strmid() { char buf[256]; int n1, n2; strcpy(buf, av[2]); n1=myatoi(av[3],1,strlen(buf))-1; if (Errno) return 20; if (ac>4) { n2=myatoi(av[4],1,strlen(buf)-n1); if (Errno) return 20; buf[n1+n2]='\0'; } set_var(LEVEL_SET, av[1], buf+n1); return 0; } do_strlen() { char buf[16]; sprintf(buf,"%d",strlen(av[2])); set_var(LEVEL_SET, av[1], buf); return 0; } myatoi(s,min,max) char *s; { long n; Errno=0; n=Atol(s); if (Errno==ERRBADINT) ierror(s,511); else if (nmax) { Errno=ERRBADINT; printf("%s not in (%d,%d)\n",s,min,max); } return (int)n; }