home *** CD-ROM | disk | FTP | other *** search
- /* ----------------------------------------------------------------------- */
- /* J-Source Version 6.2 - COPYRIGHT 1992 Iverson Software Inc. */
- /* 33 Major Street, Toronto, Ontario, Canada, M5S 2K9, (416) 925 6096 */
- /* */
- /* J-Source is provided "as is" without warranty of any kind. */
- /* */
- /* J-Source Version 6.2 license agreement: You may use, copy, and */
- /* modify the source. You have a non-exclusive, royalty-free right */
- /* to redistribute source and executable files. */
- /* ----------------------------------------------------------------------- */
- /* */
- /* Input/Output */
-
- #include "j.h"
-
-
- static void sesmexit();
-
- C ibuf[2+NIBUF];
- I jbrk=0;
- C obuf[NOBUF];
-
-
- A inpl(e,n,s)B e;I n;C*s;{A z;C c;
- jbrk=0;
- if(n&&(c=*(s+n-1),CLF==c||CCR==c))--n;
- if(n&&COFF==*(s+n-1))joff(zero);
- ASSERT(5!=n||memcmp(s,"o\010u\010t",n),EVINPRUPT);
- RZ(z=str(n,s)); s=(C*)AV(z);
- if(e){jputs(qprompt); jputs(s); jputc(CNL);}
- else if(outfile){fputs(s,outfile); fputc(CNL,outfile);}
- R z;
- }
-
- F1(joff){if(outfile&&outfile!=stdout)fclose(outfile); sesmexit(); exit(0);}
-
- void jouts(s)C*s;{if(outfile)fputc(COUT,outfile); jputs(s);}
-
- static void sigint(k)int k;{++jbrk; signal(SIGINT,sigint);}
-
-
- /* --------------------- Special Session Manager ------------------------- */
-
- #if (!LINKJ && SYS & SYS_SESM)
-
-
- #if (SYS & SYS_PC386)
- C*edbuf;
- #endif
-
- C breaker(){if(sesm)jstpoll(); if(jbrk){jbrk=0; jsignal(EVBREAK);} R!jerr;}
-
- A jgets(){
- if (sesm) { jsti( (SI) NIBUF,ibuf);
- } else { RZ(fgets(ibuf,NIBUF,stdin));
- }
- R inpl(0,(I)strlen(ibuf),ibuf);
- }
-
- void jputc(c)C c;{
- if(tostdout){if(sesm)jsto(MTYOUT,(SI)1,&c); else fputc(c,stdout);}
- if(outfile)fputc(c,outfile);
- }
-
- void jputs(s)C*s;{
- if(tostdout){if(sesm)jsto(MTYOUT,(SI)strlen(s),s); else fputs(s,stdout);}
- if(outfile)fputs(s,outfile);
- }
-
- void prompt(s)C*s;{
- if(tostdout){if(sesm)jsto(MTYOIN,(SI)strlen(s),s); else fputs(s,stdout);}
- if(outfile)fputs(s,outfile);
- }
-
- static void sesmexit(){if(sesm)jststop();}
-
- C sesminit(){
- if(sesm){A t;I j,mask=0xfffffff0L;
- struct{Ptr vlog;SI nlog;Ptr vinb;SI ninb;Ptr vfkd;SI nfkd;Ptr vedb;SI nedb;}in;
- #if (SYS & SYS_PC+SYS_PC386)
- /* The 15+ and &0xfffffff0 are because addresses must be segment aligned */
- GA(t,CHAR,15+NLOG,1,0); j=(I)(15+(C*)AV(t)); j&=mask; in.vlog=(Ptr)j; in.nlog=NLOG;
- GA(t,CHAR,15+NTA ,1,0); j=(I)(15+(C*)AV(t)); j&=mask; in.vinb=(Ptr)j; in.ninb=NTA ;
- GA(t,CHAR,15+NFKD,1,0); j=(I)(15+(C*)AV(t)); j&=mask; in.vfkd=(Ptr)j; in.nfkd=NFKD;
- GA(t,CHAR,15+NEDB,1,0); j=(I)(15+(C*)AV(t)); j&=mask; in.vedb=(Ptr)j; in.nedb=NEDB;
- #endif
- #if (SYS & SYS_PC386)
- edbuf=in.vedb;
- #endif
- jstinit((Ptr)&in);
- }
- #if (SYS & SYS_PC386)
- else jstsbrk();
- #else
- signal(SIGINT,sigint);
- #endif
- R 1;
- }
-
- C*wr(n,v)I n;C*v;{I k=0,m;
- if(tostdout){
- if(sesm)while(n>k&&!jerr){m=MIN(3000,n-k); jsto(MTYOUT,(SI)m,v+k); k+=m;}
- else while(n>k&&!jerr)k+=fwrite(v+k,sizeof(C),(size_t)(n-k),stdout);
- }
- if(outfile){
- fputc(COUT,outfile);
- k=0; while(n>k&&!jerr)k+=fwrite(v+k,sizeof(C),(size_t)(n-k),outfile);
- }
- jputc(CNL); R v+n;
- }
-
-
- /* --------------------- Others (No Session Manager) --------------------- */
-
- #else
-
- C breaker(){R!jerr;}
-
- /* Import the main routine from the EDITLINE library */
- extern char *readline (const char *prompt);
- extern void add_history(char *string);
- char *luxptr = NULL;
-
- A jgets(){
- char *p;
- /* RZ(fgets(ibuf,NIBUF,stdin)); R inpl(0,(I)strlen(ibuf),ibuf); */
- p = readline(qprompt);
- if ((strncmp(p, ")off", 4) == 0) /* Hack in the classic APL )off command */
- || (strncmp(p, ")OFF", 4) == 0)) {
- free(p); /* Throw away the command */
- p = "\004\n"; /* Replace it... */
- }
- add_history(p);
- strcpy(ibuf,p);
- free(p);
- R inpl(0,(I)strlen(ibuf),ibuf);
- }
-
- void jputc(c)C c;{if(tostdout)fputc(c,stdout); if(outfile)fputc(c,outfile);}
-
- void jputs(s)C*s;{if(tostdout)fputs(s,stdout); if(outfile)fputs(s,outfile);}
-
- void prompt(s)C*s;{jputs(s);}
-
- static void sesmexit(){}
-
- C sesminit(){signal(SIGINT,sigint); R 1;}
-
- C*wr(n,v)I n;C*v;{I k=0;
- if(tostdout)while(n>k&&!jerr)k+=fwrite(v+k,sizeof(C),(size_t)(n-k),stdout);
- if(outfile){
- fputc(COUT,outfile);
- k=0; while(n>k&&!jerr)k+=fwrite(v+k,sizeof(C),(size_t)(n-k),outfile);
- }
- jputc(CNL); R v+n;
- }
-
- #endif
-