Menu

[r321]: / LIBHDR.MPL  Maximize  Restore  History

Download this file

292 lines (221 with data), 7.7 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)
VSET(D,S,L)   MSET(D,S,<<L)
VCLR(D,L)     MCLR(D,<<L)
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+2 ]
  ];
  !(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),S,IMIN(L,VLEN(S))); VEND(S); D
]

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

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

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

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

TOLOWER=.CTOL TOUPPER=.CTOU

ISCNTRL(C) >=C ? C<=31 ? 1 : C==127
ISSPACE(C) C==32 ? 1 : 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),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,R) [
  L=<(D=%S1-%S2)?%S1:%S2;
  >L-- @ (R=%S1++-%S2++) ? =R;
  D
]

SDIF(S1,S2;L,D,R) [
  L=<(D=%S1-%S2)?%S1:%S2;
  >L-- @ (R=TOUPPER(%S1++)-TOUPPER(%S2++)) ? =R;
  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)
]

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

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    = .VCLR
CLRSCR    = .VCLS
CPUTS     = .VWRS
DELLINE   = .VDEL
GETCH     = .VRDC
GOTOXY    = .VGXY
INSLINE   = .VINS
KEYPRESSED= .VKEY
PUTCH     = .VWRC
READKEY   = .VRDK

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,T) L<R ? [
  MM=>>((LL=L)+(RR=R))&-2;
  @ [
    T=!MM; <FN(!LL,T) @ !LL++; >FN(!RR,T) @ !RR--;
    LL<=RR ? [ T=!LL; !LL++=!RR; !RR--=T; LL<RR ]
  ];
  QSORT(L,RR,FN); QSORT(LL,R,FN)
]

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

SNODE.INIT(NODE) [ !NODE=0; NODE ]
SLIST.PUSH(LIST,NODE) [ !NODE=!LIST; !LIST=NODE; LIST]
SLIST.PULL(LIST;NODE) [ NODE=!LIST; !LIST=!NODE; !NODE=0; NODE ]

.DNODE.NEXT : 0
.DNODE.PREV : 1
.DNODE      : 2

.DLIST.HEAD : 0
.DLIST.TAIL : 3
.DLIST      : 4

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

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

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

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

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

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

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.