Menu

[r376]: / LIBHDR  Maximize  Restore  History

Download this file

315 lines (238 with data), 8.2 kB

##LIBMPX

////////////////////////////////////////////////////////////////////////////////

.NIL      : 0
.FALSE    : 0
.TRUE     : 1
.EOF      : -1
.INT.MIN  : -32768
.INT.MAX  : 32767
.LONG     : 2
.REAL     : 4
.STRING   : 64
.STR127   : 64

////////////////////////////////////////////////////////////////////////////////

ISQR=.ISQR IABS=.IABS IMIN=.IMIN IMAX=.IMAX

IRND.SEED=0
IRND() IRND.SEED=IRND.SEED*41965+7473

////////////////////////////////////////////////////////////////////////////////

MSET=.MSET MCPY=.MCPY MREV=.MREV

MCLR(D,L)     MSET(D,0,L)
MMOD(D,S,L,F) [ >L-- @ D%L=F(S%L); D ]

////////////////////////////////////////////////////////////////////////////////

VCPY(D,S,L)   MCPY(D,S,<<L)
VCLR(D,L)     MCLR(D,<<L)
VSET(D,S,L)   [ >L-- @ D!L=S; D ]
VMOD(D,S,L,F) [ >L-- @ D!L=F(S!L); D ]

VNEW(L;D,S) >=L ? [ L=<<L+2;
  S=TOM; !S @ [
    >!S @ S+=!S; D=S; <!S @ S-=!S;
    <((!D=D-S)+L) ? [ !(D+L)=!D+L; !D++=L; =D ]
  ];
  !(TOM-=L)=L; TOM+2
]

VEND(D) D-- ? >!D ? !D=-!D
VLEN(D) D-- ? >!D ? >>!D-1

VOLD(S,L;D) ==S ? VNEW(L) : L==VLEN(S) ? S : [
  D=VCPY(VNEW(L)?:=0,S,IMIN(L,VLEN(S))); VEND(S); D
]

VUSE(;S,L) [ L=0; S=TOM; !S @ >!S ? [ L+=!S; S+=!S ] : S-=!S; L ]

WEND(V;L) [ L=VLEN(V); >L-- @ VEND(V!L); VEND(V) ]

GETVEC(M)  VNEW(M+1)
FREEVEC(V) VEND(V)

////////////////////////////////////////////////////////////////////////////////

TOLOWER=.CLWR TOUPPER=.CUPR

ISCNTRL(C) >=C ? C<=31 ?: C==127
ISSPACE(C) C==32 ?: C>=9 ? C<=13
ISDIGIT(C) C>=48 ? C<=57
ISUPPER(C) C>=65 ? C<=90
ISLOWER(C) C>=97 ? C<=122
ISGRAPH(C) C>=33 ? C<=126
ISPRINT(C) C>=32 ? C<=126
ISALPHA(C) ISUPPER(C)?:ISLOWER(C)
ISALNUM(C) ISALPHA(C)?:ISDIGIT(C)

TOASCII(C) C&127

////////////////////////////////////////////////////////////////////////////////

SADD=.SADD SCHR=.SCHR SCPY=.SCPY SDEL=.SDEL
SFIX=.SFIX SINS=.SINS SMID=.SMID SSTR=.SSTR

SLEN(S)   %S
SREV(S)   MREV(S+1,%S)-1
SDUP(S)   SCPY(VNEW(>>%S+1)?:=0,S)
SUPR(D,S) MMOD(D+1,S+1,%D=%S,TOUPPER)-1
SLWR(D,S) MMOD(D+1,S+1,%D=%S,TOLOWER)-1

SCMP(S1,S2;L,D) [
  L=<(D=%S1-%S2)?%S1:%S2;
  >L-- @ (TMP=%S1++-%S2++) ? =TMP;
  D
]

SDIF(S1,S2;L,D) [
  L=<(D=%S1-%S2)?%S1:%S2;
  >L-- @ (TMP=TOUPPER(%S1++)-TOUPPER(%S2++)) ? =TMP;
  D
]

ITOA(I,S;N) [
  N=<I?I=-I;
  %S=0; @ [ S%(%S+=1)=I\10+'0'; I/=10 ];
  N ? S%(%S+=1)='-';
  SREV(S)
]

VSPRINTF(S,F,P;FF,N%10) [
  FF=%S=0; FF<%F @ (AUX=F%++FF)<>'%' ? S%(%S+=1)=AUX : [
    AUX=TOUPPER(F%++FF);
    ?'S' ? SADD(S,!P) : ?'C' ? S%(%S+=1)=!P :
    ?'I'||?'D' ? SADD(S,ITOA(!P,N$)) : [ S%(%S+=1)=AUX; !P-- ]; !P++];
  S
]

SPRINTF(STR,FMT;ARGS!10) VSPRINTF(STR,FMT,ARGS$)

////////////////////////////////////////////////////////////////////////////////

SWHILE(S,L,IS)   [ (L<=%S?<>IS(S%L)) @ ++L; L ]
SUNTIL(S,L,IS)   [ (L<=%S?==IS(S%L)) @ ++L; L ]
STOKEN(D,S,L,IS) [ SMID(D,S,L=SWHILE(S,L,IS),(D=SUNTIL(S,L,IS))-L); D ]
SPARSE(D,S,L)    [ STOKEN(D,S,L,ISSPACE) ]

////////////////////////////////////////////////////////////////////////////////

CIS=.FINP COS=.FOUT .DIGITS="0123456789ABCDEF"

FINDINPUT=0 FINDOUTPUT=0 ENDSTREAM=0 [
  .STREAMS=%.FINP
  NEWSTREAM(;F)   [ F=.FMIN; F<=.FMAX @ ==.STREAMS%F ? =F ]
::ENDSTREAM(F) F ? [ .STREAMS%F=0; .FEND(F)]
::FINDINPUT(FN;F) (F=NEWSTREAM()) ? .FOLD(F,FN) ? .STREAMS%F=F
::FINDOUTPUT(FN;F)(F=NEWSTREAM()) ? .FNEW(F,FN) ? .STREAMS%F=F
]

SELECTINPUT (F) F ? [ TMP=CIS; CIS=F; TMP ]
SELECTOUTPUT(F) F ? [ TMP=COS; COS=F; TMP ]
ENDREAD()   ENDSTREAM(CIS)
ENDWRITE()  ENDSTREAM(COS)

GETBYTE(P,I)   P%I
PUTBYTE(P,I,V) P%I=V

RDCH( ) AUX=.FRDC(CIS,TMP$) ? %(TMP$) : .EOF
WRCH(C) AUX=.FWRC(COS,C) ? C : .EOF

NEWLINE() WRCH('*N')

READS(S) .FRDS(CIS,S)

READN(;SUM,NEG) [
  SUM=NEG=0; @ ISSPACE(RDCH()); (NEG=?'-')||?'+' ? RDCH();
  ISDIGIT(AUX) @ [ SUM=SUM*10+AUX-'0'; RDCH() ];
  NEG ? -SUM : SUM
]

WRITES(S) .FWRS(COS,S)
WRITET(S,W) WRITES(S) ? [ W-=%S; >W-- @ WRCH('*S') ]

WRITEBIN(I,W) [ >--W ? WRITEBIN(I>>1,W); WRCH((I&1)+'0') ]
WRITEOCT(I,W) [ >--W ? WRITEOCT(I>>3,W); WRCH((I&7)+'0') ]
WRITEDEC(I,W) [ >--W ? WRITEDEC(I/10,W); WRCH(.DIGITS%((I\10)+1)) ]
WRITEHEX(I,W) [ >--W ? WRITEHEX(I>>4,W); WRCH(.DIGITS%((I&15)+1)) ]

WRITED(I,W;S%16) [
  .SOFI(S$,I,0);
  W-=%(S$); >W-- @ WRCH('*S');
  WRITES(S$)
]

WRITEN(I) WRITED(I,0)

WRITEU(I,W;J) [
  (J=>>I/5) ? [ WRITED(J,W-1); W=1 ];
  WRITED(I-J*10,W)
]

STR2NUMB(S;A,I,DIG) [
  A=I=0; ++I<=%S @ [
    DIG=S%I-'0';
    (>=DIG)&&(DIG<=9) ? A=A*10+DIG
  ];
  S%1=='-' ? -A : A
]

CAPITALCH  : TOUPPER$
COMPSTRING : SDIF$

COMPCH(C1,C2) CAPITALCH(C1)-CAPITALCH(C2)

DECVAL(C) C-(C>=97?87:C>=65?55:48)

WRITEF(S;ARGS!10,P,A,E) [
  P=ARGS$; E=S+%S;
  S<E @ (AUX=%++S)=='%' ? [
    AUX=CAPITALCH(%++S); A=!P++;
    ?'S' ? WRITES(A) :
    ?'N' ? WRITEN(A) :
    ?'C' ? WRCH(A) :
    ?'I' ? WRITED  (A,DECVAL(%++S)) :
    ?'U' ? WRITEU  (A,DECVAL(%++S)) :
    ?'B' ? WRITEBIN(A,DECVAL(%++S)) :
    ?'O' ? WRITEOCT(A,DECVAL(%++S)) :
    ?'X' ? WRITEHEX(A,DECVAL(%++S)) :
    ?'D' ? WRITEDEC(A,DECVAL(%++S)) :
    ?'T' ? WRITET  (A,DECVAL(%++S)) :
    [ WRCH(AUX); !P-- ] ] : WRCH(AUX)
]

VGET(FN;V,F,S!.STR127) (F=SELECTINPUT(FINDINPUT(FN))) ? [
  V=0; READS(S$) @ [ V=VOLD(V,VLEN(V)+1); V!(VLEN(V)-1)=SDUP(S$) ];
  ENDREAD(); SELECTINPUT(F);
  V
]

////////////////////////////////////////////////////////////////////////////////

STDIN=.FINP STDOUT=.FOUT

FOPEN(FN,FM) [
  AUX=%FM ? TOUPPER(FM%1); ?'R' ? FINDINPUT (FN) : ?'W' ? FINDOUTPUT(FN)
]

FCLOSE(F) ENDSTREAM(F)
FEOF(F) .FEOF(F)
FPUTC(C,F) .FWRC(F,C) ? C : .EOF
FGETC(F) .FRDC(F,TMP$) ? %(TMP$) : .EOF
FPUTS(S,F;SS) [ SS=0; (SS+=1)<=%S @ FPUTC(S%SS,F); S ]
FGETS(S,F;C) ==FEOF(F) ? [ %S=0; (C=FGETC(F))<>.EOF&&C<>'*N' @ S%(%S+=1)=C; S ]
GETS(S) FGETS(S,STDIN) ? [ S%%S=='*N' ? %S-=1; S ]
PUTS(S) [ FPUTS(S,STDOUT); FPUTC('*N',STDOUT); S ]
PRINTF(FMT,ARGS!10;STR!.STR127) FPUTS(VSPRINTF(STR$,FMT,ARGS$),STDOUT)
FPRINTF(F,FMT,ARGS!10;STR!.STR127) FPUTS(VSPRINTF(STR$,FMT,ARGS$),F)
PUTI(A%10) PUTS(ITOA(A,A$))

////////////////////////////////////////////////////////////////////////////////

.VK.LEFT  : 19200
.VK.RIGHT : 19712

CLREOL    = .TCLR
CLRSCR    = .TCLS
CPUTS     = .TWRS
DELLINE   = .TDEL
GETCH     = .TRDC
GOTOXY    = .TGXY
INSLINE   = .TINS
KEYPRESSED= .TKEY
PUTCH     = .TWRC
READKEY   = .TRDK

CPUTSXY(S,X,Y) [ GOTOXY(X,Y); CPUTS(S) ]
CPRINTF(F,A!10;S!.STR127) CPUTS(VSPRINTF(S$,F,A$))

////////////////////////////////////////////////////////////////////////////////

QSORT(L,R,FN;LL,RR,MM) L<R ? [
  MM=>>((LL=L)+(RR=R))&-2;
  @ [
    <FN(!LL,!MM) @ !LL++; >FN(!RR,!MM) @ !RR--;
    LL<=RR ? [ TMP=!LL; !LL++=!RR; !RR--=TMP; LL<RR ]
  ];
  QSORT(L,RR,FN); QSORT(LL,R,FN)
]

////////////////////////////////////////////////////////////////////////////////

NODE.INIT(A) [ !A=0; A ]
LIFO.PUSH(A,B) [ !B=!A; !A=B; A]
LIFO.PULL(A;B) [ B=!A; !A=!B; !B=0; B ]

////////////////////////////////////////////////////////////////////////////////

.CARD.NEXT : 0
.CARD.PREV : 1
.CARD      : 2

.DECK.HEAD : 0
.DECK.TAIL : 3
.DECK      : 4

CARD.INIT(A) [ A!0=A!1=0; A ]

CARD.JOIN(A,B) [
  A ? [ A!0 ? A!0!1=0; A!0=B ];
  B ? [ B!1 ? B!1!0=0; B!1=A ]
]

CARD.PULL(A) [ CARD.JOIN(A!1,A!0); A ]

////////////////////////////////////////////////////////////////////////////////

DECK.INIT(A) [ CARD.JOIN(CARD.INIT(A),CARD.INIT(A!.CARD$)); A ]
DECK.EMPTY(A) !A==A!.CARD$
DECK.PUSHHEAD(A,B) [ CARD.JOIN(B,A!0); CARD.JOIN(A+0,B) ]
DECK.PUSHTAIL(A,B) [ CARD.JOIN(A!3,B); CARD.JOIN(B,A!.CARD$) ]
DECK.PULLHEAD(A) CARD.PULL(A!.DECK.HEAD)
DECK.PULLTAIL(A) CARD.PULL(A!.DECK.TAIL)

////////////////////////////////////////////////////////////////////////////////
// THIS CODE MAY/WILL CHANGE
////////////////////////////////////////////////////////////////////////////////

.OBJECT=0,0,0,0

.BASE:0
.SIZE:1
.INIT:2
.DONE:3

INVOKE(O,M) [ !O!M(O) ]
CREATE(T;O) [ (O=VNEW(T!.SIZE)) ? [ !O=T; INVOKE(O,.INIT) ]; O ]
FINISH(O)   [ O ]

////////////////////////////////////////////////////////////////////////////////

Want the latest updates on software, tech news, and AI?
Get latest updates about software, tech news, and AI from SourceForge directly in your inbox once a month.