home *** CD-ROM | disk | FTP | other *** search
- \ STRING SUPPORT LIBRARY PART 2
- \ Contents Copyright (C) 1986 by Thomas Almy
-
- \ Permission is granted to registered users of ForthCMP to sell or distribute
- \ computer programs incorporating the compiled contents of this file.
-
- \ Load this before FORTHLIB
-
- .( Loading STRINGS ) CR
- 10 DECIMAL DSEG
-
- U: STRXTR >R DUP >R - 0 MAX SWAP R> + SWAP R> MIN ;
- U: STRCPY OVER C@ 1+ CMOVE ;
- U: ASCIIZ COUNT DUP >R 1+ +STRBUF
- STRBUF R@ CMOVE 0 STRBUF R> + C! STRBUF ;
- U: -ASCIIZ DUP 255 0 SCAN DROP OVER - DUP 1+ +STRBUF
- DUP STRBUF C! STRBUF 1+ SWAP CMOVE STRBUF ;
- U: -EXT COUNT 2DUP -PATH
- ASCII . SCAN 0= IF DROP ELSE NIP OVER - THEN
- STRPCK ;
- U: +EXT OVER COUNT -PATH
- ASCII . SCAN 0<> IF 2DROP EXIT THEN
- DROP SWAP COUNT ROT COUNT STRCAT STRPCK ;
- U: -PATH BEGIN 2DUP ASCII \ SCAN DUP WHILE
- 2SWAP 2DROP ASCII \ SKIP REPEAT 2DROP ;
- U: STRCMP >R >R ?DS: -ROT ?DS: R> R> STRCMPL ;
- U: STRCMPL
- >R ROT R@ OVER >R MIN cmpl ?DUP IF R> DROP R> DROP EXIT THEN
- R> R> 2DUP > IF 2DROP 1 EXIT THEN
- < ;
- SEPDSEG? #IF
- : argc 1 128 STR>DSEG COUNT
- BEGIN BL SKIP DUP WHILE BL SCAN ROT 1+ -ROT REPEAT 2DROP ;
- #ELSE
- : argc 1 128 COUNT BEGIN BL SKIP DUP WHILE BL SCAN ROT 1+ -ROT REPEAT 2DROP ;
- #THEN
-
- ?DEFINE argv #IF
- VARIABLE argvM 1 argvM ! \ constant value
- SEPDSEG? #IF
- : argv DUP 1 < IF DROP 44 CS: @ DUP 0 1024 ?DS: argvM 2 STRNDXL
- DUP 0< IF 2DROP 0 0 STRPCK EXIT THEN
- 2+ -ASCIIZL EXIT THEN
- 128 STR>DSEG
- COUNT BL SKIP ROT 1- 0 ?DO BL SCAN BL SKIP LOOP
- 2DUP BL SCAN DROP NIP OVER - STRPCK ;
- #ELSE
- : argv DUP 1 < IF DROP 44 @ DUP 0 1024 ?DS: argvM 2 STRNDXL
- DUP 0< IF 2DROP 0 0 STRPCK EXIT THEN
- 2+ -ASCIIZL EXIT THEN
- 128 COUNT BL SKIP ROT 1- 0 ?DO BL SCAN BL SKIP LOOP
- 2DUP BL SCAN DROP NIP OVER - STRPCK ;
- #THEN #THEN
- SEPDSEG? #IF
- : getenv
- COUNT " =" STR>DSEG COUNT STRCAT STRPCK >R
- 44 CS: @ 0 BEGIN 2DUP C@L WHILE
- 2DUP ?DS: R@ COUNT cmpl 0= IF R> COUNT NIP + -ASCIIZL EXIT THEN
- BEGIN 1+ 2DUP C@L 0= UNTIL 1+ REPEAT
- R> DROP 2DROP 0 0 STRPCK ;
- #ELSE
- : getenv
- COUNT " =" COUNT STRCAT STRPCK >R
- 44 @ 0 BEGIN 2DUP C@L WHILE
- 2DUP ?DS: R@ COUNT cmpl 0= IF R> COUNT NIP + -ASCIIZL EXIT THEN
- BEGIN 1+ 2DUP C@L 0= UNTIL 1+ REPEAT
- R> DROP 2DROP 0 0 STRPCK ;
- #THEN
- U: STRCAT DUP 3 PICK + DUP >R +STRBUF
- 2 PICK STRBUF + SWAP CMOVE
- STRBUF SWAP CMOVE STRBUF R> ;
- U: STRPCK DUP >R 1+ +STRBUF STRBUF 1+ R@ CMOVE R> STRBUF C! STRBUF ;
- U: -ASCIIZL
- 2DUP BEGIN 2DUP C@L WHILE 1+ REPEAT
- NIP OVER - DUP >R 1+ +STRBUF
- ?DS: STRBUF 1+ R@ CMOVEL R> STRBUF C! STRBUF ;
- SEPDSEG? #IF
- U: STR>DSEG
- DUP CS: C@ 1+ DUP >R +STRBUF
- ?CS: SWAP ?DS: STRBUF R> CMOVEL STRBUF ; #ELSE
- U: STR>DSEG ( DUMMY ) ;
- #THEN
- U: +STRBUF DUP strend + strbufr StringSize + U> IF
- strbufr + EQU strend strbufr @ EQU STRBUF
- ELSE
- strend DUP EQU STRBUF + EQU strend THEN ;
- ?DEFINE STRNDX ?DEFINE STRNDXL OR #IF
- VARIABLE strndX 4 ALLOT #THEN
- U: STRNDX TUCK strndX 2!
- - DUP 0< IF 2DROP -1 EXIT THEN
- -1 -ROT ( save answer )
- 1+ 0 DO ?DS: OVER ?DS: strndX 2@ cmpl 0= IF DROP I SWAP LEAVE THEN 1+ LOOP
- DROP ;
- U: STRNDXL
- strndX ! strndX 2+ 2!
- strndX @ - DUP 0< IF 2DROP DROP -1 EXIT THEN
- >R -1 -ROT R>
- 1+ 0 DO 2DUP strndX 2+ 2@ strndX @ cmpl 0= IF DROP I -ROT LEAVE THEN 1+ LOOP
- 2DROP ;
- UNDEF cmpl
- CODE cmpl
- BX POP DX DS <SEG CX POP DI POP ES POPSEG SI POP DS POPSEG
- REPZ BYTE CMPS DX DS >SEG 0 # AX MOV =0 ~ IF, <0 IF,
- AX DEC ELSE, AX INC THEN, THEN, AX PUSH BX JMP END-CODE #THEN
- 16 = #IF HEX #THEN
-