Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | Download | RSS feed

  1. CR .( UTILS_.F)
  2. REQUIRE [IF] ~MAK\CompIF.f
  3. \ WINAPI: GetCurrentDirectoryA         KERNEL32.DLL
  4. \ WINAPI: MoveFileA                    KERNEL32.DLL
  5.  
  6. : DEFER VECT ;
  7.  
  8. 80 CONSTANT MAXSTRING
  9.  
  10. C" PLACE" FIND NIP 0=
  11. [IF]
  12.  
  13. 255 CONSTANT MAXCOUNTED   \ maximum length of contents of a counted string
  14.  
  15.  
  16. : "CLIP"        ( a1 n1 -- a1 n1' )   \ clip a string to between 0 and MAXCOUNTED
  17.                MAXCOUNTED MIN 0 MAX ;
  18.  
  19. : PLACE         ( addr len dest -- )
  20.                SWAP "CLIP" SWAP
  21.                2DUP 2>R
  22.                CHAR+ SWAP MOVE
  23.                2R> C! ;
  24.  
  25. : +PLACE        ( addr len dest -- ) \ append string addr,len to counted
  26.                                     \ string dest
  27.                >R "CLIP" MAXCOUNTED  R@ C@ -  MIN R>
  28.                                        \ clip total to MAXCOUNTED string
  29.                2DUP 2>R
  30.  
  31.                COUNT CHARS + SWAP MOVE
  32.                2R> +! ;
  33.  
  34. : C+PLACE       ( c1 a1 -- )    \ append char c1 to the counted string at a1
  35.                DUP 1+! COUNT + 1- C! ;
  36. [THEN]
  37. : OFF     0! ;
  38.  
  39. : BLANK         ( addr len -- )     \ fill addr for len with spaces (blanks)
  40.                BL FILL ;
  41.  
  42. : START/STOP   ( -- )
  43.                KEY?
  44.                IF KEY  27 = IF ABORT THEN
  45.                THEN ;
  46.  
  47. : .S            ( -- )
  48.     S0 @ SP@ CELL+ 2DUP =
  49.     IF  ." EMPTY"  2DROP
  50.     ELSE DO I @ . START/STOP 1 CELLS +LOOP
  51.     THEN ;
  52.  
  53. C" TUCK" FIND NIP 0=
  54. [IF]
  55. : TUCK       ( n1 n2 -- n2 n1 n2 ) \ copy top data stack to under second item
  56.   SWAP OVER ;
  57. [THEN]
  58.  
  59.  
  60. 128 CONSTANT SPCS-MAX  ( optimization for SPACES )
  61.  
  62. CREATE SPCS
  63.       SPCS-MAX ALLOT
  64. SPCS  SPCS-MAX BLANK
  65.  
  66. : (D.)          ( d -- addr len )       TUCK DABS  <# #S ROT SIGN #> ;
  67.  
  68. C" WITHIN" FIND NIP 0=
  69. [IF]
  70. : WITHIN  ( n1 low high -- f1 ) \ f1=true if ((n1 >= low) & (n1 < high))
  71.  OVER - >R - R> U< ;
  72. [THEN]
  73. : BETWEEN 1+ WITHIN ;
  74.  
  75. 80 VALUE COLS
  76.  
  77. : H.R           ( n1 n2 -- )    \ display n1 as a hex number right
  78.                                \ justified in a field of n2 characters
  79.                BASE @ >R HEX >R
  80.                0 <# #S #> R> OVER - SPACES TYPE
  81.                R> BASE ! ;
  82.  
  83. : H.N           ( n1 n2 -- )    \ display n1 as a HEX number of n2 digits
  84.                BASE @ >R HEX >R
  85.                0 <# R> 0 ?DO # LOOP #> TYPE
  86.                R> BASE ! ;
  87. : COL ( N -- )
  88.      DROP 9 EMIT ;
  89.  
  90. : UPC [ CHAR A CHAR a XOR INVERT ] LITERAL AND ;
  91.  
  92. : 2,  ( D -- )
  93.  HERE 2! 2 CELLS ALLOT ;
  94.  
  95. : VOC-STATE,
  96.   CONTEXT @ ,
  97.   CONTEXT @ @ ,
  98.  VOC-LIST @ VOC-LIST 2,
  99.   CURRENT @  CURRENT 2,
  100.      LAST @     LAST 2,
  101.  VOC-LIST @
  102.  BEGIN  ?DUP
  103.  WHILE  DUP CELL+ DUP @ SWAP 2, @
  104.  REPEAT
  105. ;
  106. : INCLUDE BL WORD COUNT INCLUDED ;
  107.  
  108. : CELLS+ CELLS + ;
  109.  
  110. : ? @ . ;
  111. : DEFINED       ( -- str 0 | cfa flag )
  112.                BL WORD FIND ;
  113.                
  114. : [IFUNDEF] DEFINED NIP 0= POSTPONE [IF] ;
  115. \ C" CELL-"  FIND NIP 0=
  116. 1
  117. [IF] : CELL- 1 CELLS - ;
  118. [THEN]
  119.  
  120. \ C" LCOUNT" FIND NIP 0=
  121. 1
  122. [IF] : LCOUNT   CELL+ DUP CELL- @ ;
  123. [THEN]
  124. : INCR   1 SWAP +! ;
  125. : FIELD+ -- ;
  126. 0 [IF]
  127. : CUR_DIR PAD 256 GetCurrentDirectoryA PAD SWAP  ;
  128. CREATE FIRST-PATH-BUF CUR_DIR NIP 1+ ALLOT
  129. CUR_DIR  FIRST-PATH-BUF PLACE
  130. : FIRST-PATH" FIRST-PATH-BUF COUNT ;
  131. : RENAME-FILE ( adr1 len adr2 len -- ior )
  132.   4DUP + DUP @ 2>R + DUP @ 2>R
  133.   4DUP + 0! + 0!
  134.   DROP NIP SWAP MoveFileA
  135.   2R> SWAP !  2R> SWAP !
  136. ;
  137.  
  138. [THEN]
  139. : FILE-APPEND   ( fileid -- ior )
  140.     DUP >R  FILE-SIZE DROP
  141.          R> RESIZE-FILE  ;
  142.  
  143. C" U>" FIND NIP 0=
  144. [IF]
  145. : U> ( U1 U2  -- FLAG )
  146.     SWAP U< ;
  147. [THEN]
  148.  
  149. C" FOLLOWER" FIND NIP
  150. [IF]
  151. : 2,  ( D -- )
  152.  HERE 2! 2 CELLS ALLOT ;
  153.  
  154. : VOC-STATE,
  155.   CONTEXT @ ,
  156.   CONTEXT @ @ ,
  157.  VOC-LIST @ VOC-LIST 2,
  158.   CURRENT @  CURRENT 2,
  159.      LAST @     LAST 2,
  160.  VOC-LIST @
  161.  BEGIN  ?DUP
  162.  WHILE  DUP CELL+ DUP @ SWAP 2, @
  163.  REPEAT
  164. ;
  165.  
  166. : MARKER, ( -- ADDR )
  167.  HERE
  168.  VOC-STATE,
  169.  FOLLOWER @ FOLLOWER 2,
  170.  HERE  4 CELLS + DP 2,  0. 2,
  171. ;
  172. : MARKER! ( ADDR -- )
  173.   DUP @ CONTEXT ! CELL+
  174.   DUP @ CONTEXT @ ! CELL+
  175.   BEGIN  DUP 2@  DUP
  176.   WHILE ! 2 CELLS +
  177.   REPEAT 2DROP DROP ;
  178. [ELSE]
  179. : MARKER ( "<spaces>name" -- ) \ 94 CORE EXT
  180. \ Ïðîïóñòèòü âåäóùèå ïðîáåëû. Âûäåëèòü name, îãðàíè÷åííîå ïðîáåëàìè.
  181. \ Ñîçäàòü îïðåäåëåíèå ñ ñåìàíòèêîé âûïîëíåíèÿ, îïèñàííîé íèæå.
  182. \ name Âûïîëíåíèå: ( -- )
  183. \ Âîññòàíîâèòü ðàñïðåäåëåíèå ïàìÿòè ñëîâàðÿ è óêàçàòåëè ïîðÿäêà ïîèñêà
  184. \ ê ñîñòîÿíèþ, êîòîðîå îíè èìåëè ïåðåä îïðåäåëåíèåì name. Óáðàòü
  185. \ îïðåäåëåíèå name è âñå ïîñëåäóþùèå îïðåäåëåíèÿ. Íå òðåáóåòñÿ
  186. \ îáÿçàòåëüíî âîññòàíàâëèâàòü ëþáûå îñòàâøèåñÿ ñòðóêòóðû, êîòîðûå
  187. \ ìîãóò áûòü ñâÿçàíû ñ óäàëåííûìè îïðåäåëåíèÿìè èëè îñâîáîæäåííûì
  188. \ ïðîñòðàíñòâîì äàííûõ. Íèêàêàÿ äðóãàÿ êîíòåêñòóàëüíàÿ èíôîðìàöèÿ,
  189. \ êàê îñíîâàíèå ñèñòåìû ñ÷èñëåíèÿ, íå èçìåíÿåòñÿ.
  190.  HERE
  191. \ [C]HERE , [E]HERE ,
  192.  GET-CURRENT ,
  193.  GET-ORDER DUP , 0 ?DO DUP , @ , LOOP
  194.  CREATE ,
  195.  DOES> @ DUP \ ONLY
  196. \ DUP @ [C]DP ! CELL+
  197. \ DUP @ [E]DP ! CELL+
  198.  DUP @ SET-CURRENT CELL+
  199.  DUP @ >R R@ CELLS 2* + 1 CELLS - R@ 0
  200.  ?DO DUP DUP @ SWAP CELL+ @ OVER ! SWAP 2 CELLS - LOOP
  201.  DROP R> SET-ORDER
  202.  DP !
  203. ;
  204.  
  205. [THEN]
  206.  
  207. C" BODY>" FIND NIP 0=
  208. [IF] : BODY> 5 - ;
  209. [THEN]
  210.  
  211. C" >NAME" FIND NIP 0=
  212. [IF] : >NAME  4 - DUP BEGIN 1- 2DUP COUNT + U< 0= UNTIL NIP ;
  213. [THEN]
  214.  
  215. C" CELL/" FIND NIP 0=
  216.  [IF] : CELL/ ( N - N1 )  2 RSHIFT ;
  217.  [THEN]
  218.  
  219. C" IMAGE-BEGIN" FIND NIP
  220. [IF]
  221. : ?NAME ( ADDR - FLAG )
  222.        DUP IMAGE-BEGIN U>
  223.        OVER HERE       U< AND
  224.        IF  DUP >NAME COUNT + CELL+ =
  225.        ELSE DROP FALSE
  226.        THEN ;
  227. [THEN]
  228.  
  229. H-STDOUT CONSTANT FORTH-OUT
  230.  
  231. : FORTH-IO
  232.   FORTH-OUT H-STDOUT <>
  233.   IF  H-STDOUT CLOSE-FILE DROP
  234.       FORTH-OUT TO H-STDOUT
  235.   THEN
  236. ;
  237. : H. BASE @ HEX SWAP U. BASE ! ;
  238. : 3DROP DROP 2DROP ;
  239. : 4DUP 2OVER 2OVER ;
  240. : 0.0 0 DUP ;
  241. : IS POSTPONE TO ; IMMEDIATE
  242.  
  243. C" -ROT" FIND NIP 0=
  244. [IF] : -ROT ROT ROT ;
  245. [THEN]
  246.  
  247.  
  248. : SCAN ( adr len char -- adr' len' )
  249. \ Scan for char through addr for len, returning addr' and len' of char.
  250.        >R 2DUP R> -ROT
  251.        OVER + SWAP
  252.        ?DO DUP I C@ =
  253.                IF LEAVE
  254.                ELSE >R 1 -1 D+ R>
  255.                THEN
  256.        LOOP DROP ;
  257.  
  258. : SSKIP ( adr len char -- adr' len' )
  259. \ Skip char through addr for len, returning addr' and len' of char+1.
  260.        >R 2DUP R> -ROT
  261.        OVER + SWAP
  262.        ?DO DUP I C@ <>
  263.                IF LEAVE
  264.                ELSE >R 1 -1 D+ R>
  265.                THEN
  266.        LOOP DROP ;
  267.  
  268. 1 CELLS CONSTANT CELL
  269.  
  270. C" LSCAN" FIND NIP 0=
  271. [IF]
  272. : LSCAN ( adr len long -- adr' len' )
  273. \ Scan for char through addr for len, returning addr' and len' of char.
  274.        >R 2DUP CELLS R> -ROT   \ adr len long adr len
  275.        OVER + SWAP       \ adr len long adr+len adr
  276.        ?DO DUP I @ =
  277.                IF LEAVE
  278.                ELSE >R 1- >R CELL+ R> R>
  279.                THEN CELL
  280.       +LOOP DROP ;
  281. [THEN]
  282.  
  283. C" /STRING" FIND NIP 0=
  284. [IF] : /STRING DUP >R - SWAP R> + SWAP ;
  285. [THEN]
  286.  
  287. : "TO-PATHEND"  ( a1 n1 --- a2 n2 )     \ return a2 and count=n1 of filename
  288.                OVER 1+ C@ [CHAR] : =   \ second char is ':'
  289.                OVER 2 > AND            \ and name is longer than two characters
  290.                IF      2 /STRING       \ then remove first two characters
  291.                THEN                    \ now scan to end of last '\' in filename
  292.                BEGIN   2DUP [CHAR] \ SCAN ?DUP
  293.                WHILE   2SWAP 2DROP 1 /STRING
  294.                REPEAT  DROP ;
  295.  
  296. : ON TRUE SWAP ! ;
  297. C" -ROT" FIND NIP 0=
  298. [IF] : -ROT ROT ROT ;
  299. [THEN]
  300.  
  301. C" BOUNDS" FIND NIP 0=
  302. [IF] : BOUNDS OVER + SWAP ;
  303. [THEN]
  304. : >= < INVERT ;
  305. : 4DROP 2DROP 2DROP ;
  306.  
  307. C" RECURSE" FIND NIP 0=
  308. [IF]
  309. : RECURSE       ( -- )          \ cause current definition to execute itself
  310.                ?COMP  LAST @ NAME> COMPILE, ; IMMEDIATE
  311. [THEN]
  312. C" DUP>R" FIND NIP 0=
  313. [IF] : DUP>R POSTPONE DUP POSTPONE >R ; IMMEDIATE
  314. [THEN]
  315.  
  316. C" PICK" FIND NIP 0=
  317. [IF]
  318. : PICK ( n -- n' )
  319.   1+ CELLS SP@ + @ ;
  320. [THEN]
  321.  
  322. C" ROLL" FIND NIP 0=
  323. [IF]
  324.  
  325. : ROLL          ( n1 n2 .. nk k -- n2 n3 .. nk n1 )
  326. \  Rotate k values on the stack, bringing the deepest to the top.
  327. \   ?DUP IF 1- SWAP >R RECURSE R> SWAP THEN ;
  328.      DUP>R PICK SP@ DUP CELL+ R> 1+ CELLS MOVE DROP  ;
  329. [THEN]
  330.  
  331. C" AHEAD" FIND NIP 0=
  332. [IF]
  333. : AHEAD POSTPONE FALSE POSTPONE IF ; IMMEDIATE
  334. [THEN]
  335.  
  336. C" NOT" FIND NIP 0=
  337. [IF] : NOT 0= ;
  338. [THEN]
  339.  
  340. C" ?EXIT" FIND NIP 0=
  341. [IF]
  342.  : ?EXIT POSTPONE IF
  343.          POSTPONE EXIT
  344.          POSTPONE THEN ; IMMEDIATE
  345. \ : ?EXIT  IF RDROP THEN ;
  346. [THEN]
  347.  
  348. : BEEP 7 EMIT ;
  349.  
  350. 16 CONSTANT #VOCS
  351. -1 CELLS CONSTANT -CELL
  352. C" D2*" FIND NIP 0=
  353. [IF] : D2* 2DUP D+ ;
  354. [THEN]
  355. : ,"  [CHAR] " WORD C@ 1+ ALLOT 0 C, ;
  356. : TAB 9 EMIT ;
  357.  
  358. : (D.)          ( d -- addr len )       TUCK DABS  <# #S ROT SIGN #> ;
  359. : D.R           ( d w -- )              >R (D.) R> OVER - SPACES TYPE ;
  360. : U.R           ( u w -- )              0 SWAP D.R ;
  361. : $  SOURCE TYPE CR ; IMMEDIATE
  362. : +NULL         ( a1 -- )       \ append a NULL just beyond the counted chars
  363.                 COUNT + 0 SWAP C! ;
  364.  
  365. C" CELLS+" FIND NIP 0=
  366. [IF]
  367. : CELLS+  CELLS + ;
  368. [THEN]
  369.  
  370. C" +CELLS" FIND NIP 0=
  371. [IF]
  372. : +CELLS  SWAP CELLS+ ;
  373. [THEN]
  374. C" PERFORM" FIND NIP 0=
  375. [IF]
  376. : PERFORM @ EXECUTE ;
  377. [THEN]
  378.  
  379. C" UPPER" FIND NIP 0=
  380. [IF]
  381. : UPPER ( A L -- )
  382.         OVER + SWAP
  383.         ?DO I C@ DUP [CHAR] Z U>
  384.            IF  0xDF AND
  385.            THEN  I C!
  386.         LOOP ;
  387. [THEN]
  388.  
  389. C" RESET-STACKS" FIND NIP 0=
  390. [IF]
  391. : RESET-STACKS  S0 @ SP! ;
  392. [THEN]
  393. C" D-" FIND NIP 0=
  394. [IF]
  395. : D- ( D1 D2  -- FLAG )
  396.       DNEGATE D+ ;
  397. [THEN]
  398.  
  399. C" D=" FIND NIP 0=
  400. [IF]
  401. : D= ( D1 D2  -- FLAG )
  402.        D- D0= ;
  403. [THEN]
  404.  
  405. C" D<>" FIND NIP 0=
  406. [IF]
  407. : D<> ( D1 D2  -- FLAG )
  408.        D= INVERT ;
  409. [THEN]
  410.  
  411. C" <=" FIND NIP 0=
  412. [IF]
  413. : <= ( D1 D2  -- FLAG )
  414.       > INVERT ;
  415. [THEN]
  416.  
  417. C" UMAX" FIND NIP 0=
  418. [IF]
  419. : UMAX ( D1 D2  -- FLAG )
  420.    2DUP U< IF NIP ELSE DROP THEN ;
  421. [THEN]
  422.  
  423. C" D2/" FIND NIP 0=
  424. [IF]
  425. : D2/        ( d1 -- d2 ) \ divide the double number d1 by two
  426.    DUP 1 AND 0x1F RSHIFT ROT 2/ OR SWAP 2/ ;
  427. [THEN]
  428.  
  429. C" D0<" FIND NIP 0=
  430. [IF]
  431. : D0<        ( d1 -- f1 )
  432. \ Signed compare d1 double number with zero.  If d1 < 0, RETNurn TRUE.
  433.  0< NIP ;
  434. [THEN]
  435. C" \S" FIND NIP 0=
  436. [IF]
  437. : \S            \ comment to end of file
  438.   BEGIN REFILL 0= UNTIL
  439.  
  440. \     SOURCE-ID FILE-SIZE DROP
  441. \     SOURCE-ID REPOSITION-FILE DROP
  442.      [COMPILE] \ ; IMMEDIATE
  443. [THEN]
  444.  
  445. \ C" NEEDS" FIND NIP 0=
  446. 0
  447. [IF]
  448. : NEEDS
  449.   BL WORD FIND NIP
  450.   BL WORD SWAP 0=
  451.   IF COUNT INCLUDED
  452.   ELSE  DROP
  453.   THEN
  454. ;
  455. [THEN]
  456. C" 0MIN" FIND NIP 0=
  457. [IF] : 0MIN 0 MIN ;
  458. [THEN]
  459. C" 0MAX" FIND NIP 0=
  460. [IF] : 0MAX 0 MIN ;
  461. [THEN]
  462.  
  463. C" H." FIND NIP 0=
  464. [IF] : H. BASE @ SWAP HEX U. BASE ! ;
  465. [THEN]
  466.  
  467. C" .HS" FIND NIP 0=
  468. [IF]
  469. : .HS ( N -- N1 )
  470.   BASE @ >R HEX .S R> BASE ! ;
  471. [THEN]
  472.  
  473.  
  474. C" MS" FIND NIP 0=
  475. [IF]
  476. C" PAUSE" FIND NIP
  477.   [IF] : MS ( N -- ) PAUSE ;
  478.   [THEN]
  479. [THEN]
  480.  
  481. C" 0>" FIND NIP 0=
  482. [IF]
  483. : 0> ( N -- ) NEGATE 0< ;
  484. [THEN]
  485. C" CS-DUP" FIND NIP 0=
  486. [IF] : CS-DUP 2DUP ;
  487. [THEN]
  488. C" M_WL" FIND NIP 0=
  489. [IF] : M_WL  CS-DUP POSTPONE WHILE ; IMMEDIATE
  490. [THEN]
  491.  
  492. C" AHEAD" FIND NIP 0=
  493. [IF] : AHEAD  ?COMP HERE BRANCH, >MARK 1 ; IMMEDIATE
  494. [THEN]
  495.  
  496. C" CS-DUP" FIND NIP 0=
  497. [IF] : CS-DUP 2DUP ;
  498. [THEN]
  499.  
  500. C" CS-!" FIND NIP 0=
  501. [IF] : CS-! 2! ;
  502. [THEN]
  503.  
  504. C" CS-@" FIND NIP 0=
  505. [IF] : CS-@ 2@ ;
  506. [THEN]
  507.  
  508. C" CS-CELLS" FIND NIP 0=
  509. [IF] : CS-CELLS CELLS 2* ;
  510. [THEN]
  511.