forked from KolibriOS/kolibrios
09488af869
git-svn-id: svn://kolibrios.org@4867 a494cfbc-eb01-0410-851d-a64ba20cac60
140 lines
4.4 KiB
Forth
140 lines
4.4 KiB
Forth
( ” ©«®¢ë© ¢¢®¤-¢ë¢®¤.
|
||
)
|
||
|
||
CREATE LT 0xD C, 0xA C, 0xD C, 0xA C, \ line terminator
|
||
CREATE LTL 2 , \ line terminator length
|
||
|
||
|
||
: DOS-LINES ( -- )
|
||
0xA0D LT ! 2 LTL !
|
||
;
|
||
: UNIX-LINES ( -- )
|
||
0xA0A LT ! 1 LTL !
|
||
;
|
||
|
||
|
||
: READ-FILE ( c-addr u1 fileid -- u2 ior ) \ 94 FILE
|
||
\ <20>à®ç¥áâì u1 ᨬ¢®«®¢ ¢ c-addr ¨§ ⥪ã饩 ¯®§¨æ¨¨ ä ©« ,
|
||
\ ¨¤¥â¨ä¨æ¨à㥬®£® fileid.
|
||
\ …᫨ u1 ᨬ¢®«®¢ ¯à®ç¨â ® ¡¥§ ¨áª«î票©, ior ®«ì ¨ u2 à ¢¥ u1.
|
||
\ …᫨ ª®¥æ ä ©« ¤®á⨣ãâ ¤® ¯à®ç⥨ï u1 ᨬ¢®«®¢, ior ®«ì
|
||
\ ¨ u2 - ª®«¨ç¥á⢮ ॠ«ì® ¯à®ç¨â ëå ᨬ¢®«®¢.
|
||
\ …᫨ ®¯¥à æ¨ï ¯à®¨§¢®¤¨âáï ª®£¤ § 票¥, ¢®§¢à é ¥¬®¥
|
||
\ FILE-POSITION à ¢® § 票î, ¢®§¢à é ¥¬®¬ã FILE-SIZE ¤«ï ä ©«
|
||
\ ¨¤¥â¨ä¨æ¨à㥬®£® fileid, ior ¨ u2 㫨.
|
||
\ …᫨ ¢®§¨ª« ¨áª«îç¨â¥«ì ï á¨âã æ¨ï, â® ior - ®¯à¥¤¥«¥ë© ॠ«¨§ 樥©
|
||
\ ª®¤ १ã«ìâ â ¢¢®¤ /¢ë¢®¤ , ¨ u2 - ª®«¨ç¥á⢮ ®à¬ «ì® ¯¥à¥¤ ëå ¢
|
||
\ c-addr ᨬ¢®«®¢.
|
||
\ <20>¥®¯à¥¤¥«¥ ï á¨âã æ¨ï ¢®§¨ª ¥â, ¥á«¨ ®¯¥à æ¨ï ¢ë¯®«ï¥âáï, ª®£¤
|
||
\ § 票¥, ¢®§¢à é ¥¬®¥ FILE-POSITION ¡®«ìè¥ ç¥¬ § 票¥, ¢®§¢à é ¥¬®¥
|
||
\ FILE-SIZE ¤«ï ä ©« , ¨¤¥â¨ä¨æ¨à㥬®£® fileid, ¨«¨ âॡ㥬 ï ®¯¥à æ¨ï
|
||
\ ¯ëâ ¥âáï ¯à®ç¥áâì ¥§ ¯¨á ãî ç áâì ä ©« .
|
||
\ <20>®á«¥ § ¢¥àè¥¨ï ®¯¥à 樨 FILE-POSITION ¢®§¢à â¨â á«¥¤ãîéãî ¯®§¨æ¨î
|
||
\ ¢ ä ©«¥ ¯®á«¥ ¯®á«¥¤¥£® ¯à®ç¨â ®£® ᨬ¢®« .
|
||
DUP >R .CODE 0!
|
||
R@ .SIZE !
|
||
R@ .DATA !
|
||
R@ 70 SYS2
|
||
EBX@ SWAP
|
||
DUP 6 = IF DROP 0 THEN
|
||
DUP 0=
|
||
IF R@ .FIRST D@
|
||
R@ .SIZE @ 0 D+
|
||
R@ .FIRST D!
|
||
THEN
|
||
RDROP
|
||
;
|
||
|
||
22 CONSTANT MAX_OPEN_FILES
|
||
|
||
CREATE FILE_STR_BUF FILE_STR 1+ MAX_OPEN_FILES * ALLOT
|
||
|
||
: FALLOC ( -- 0|fid )
|
||
FILE_STR_BUF FILE_STR MAX_OPEN_FILES * BOUNDS
|
||
BEGIN DUP .NAME @ 0=
|
||
IF NIP EXIT THEN
|
||
FILE_STR + 2DUP U<
|
||
UNTIL 2DROP 0
|
||
;
|
||
|
||
: OPEN-FILE ( c-addr u fam -- fileid ior )
|
||
\ Žâªàëâì ä ©« á ¨¬¥¥¬, § ¤ ë¬ áâப®© c-addr u, á ¬¥â®¤®¬ ¤®áâ㯠fam.
|
||
\ ‘¬ëá« § 票ï fam ®¯à¥¤¥«¥ ॠ«¨§ 樥©.
|
||
\ …᫨ ä ©« ãá¯¥è® ®âªàëâ, ior ®«ì, fileid ¥£® ¨¤¥â¨ä¨ª â®à, ¨ ä ©«
|
||
\ ¯®§¨æ¨®¨à®¢ ç «®.
|
||
\ ˆ ç¥ ior - ®¯à¥¤¥«¥ë© ॠ«¨§ 樥© ª®¤ १ã«ìâ â ¢¢®¤ /¢ë¢®¤ ,
|
||
\ ¨ fileid ¥®¯à¥¤¥«¥.
|
||
DROP
|
||
\ FILE_STR
|
||
FALLOC DUP
|
||
IF
|
||
>R
|
||
R@ FILE_STR ERASE
|
||
R@ .NAME SWAP MOVE
|
||
R> 0 EXIT
|
||
THEN -1
|
||
;
|
||
|
||
: CLOSE-FILE ( fileid -- ior ) \ 94 FILE
|
||
\ ‡ ªàëâì ä ©«, § ¤ ë© fileid.
|
||
.NAME 0! 0
|
||
;
|
||
|
||
|
||
USER _fp1
|
||
USER _fp2
|
||
USER _addr
|
||
|
||
|
||
: READ-LINE ( c-addr u1 fileid -- u2 flag ior ) \ 94 FILE
|
||
\ <20>à®ç¥áâì á«¥¤ãîéãî áâப㠨§ ä ©« , § ¤ ®£® fileid, ¢ ¯ ¬ïâì
|
||
\ ¯® ¤à¥áã c-addr. —¨â ¥âáï ¥ ¡®«ìè¥ u1 ᨬ¢®«®¢. „® ¤¢ãå
|
||
\ ®¯à¥¤¥«¥ëå ॠ«¨§ 樥© ᨬ¢®«®¢ "ª®¥æ áâப¨" ¬®£ãâ ¡ëâì
|
||
\ ¯à®ç¨â ë ¢ ¯ ¬ïâì § ª®æ®¬ áâப¨, ® ¥ ¢ª«îç¥ë ¢ áç¥â稪 u2.
|
||
\ <20>ãä¥à áâப¨ c-addr ¤®«¦¥ ¨¬¥âì à §¬¥à ª ª ¬¨¨¬ã¬ u1+2 ᨬ¢®« .
|
||
\ …᫨ ®¯¥à æ¨ï ãᯥè , flag "¨á⨠" ¨ ior ®«ì. …᫨ ª®¥æ áâப¨
|
||
\ ¯®«ãç¥ ¤® ⮣® ª ª ¯à®ç¨â ë u1 ᨬ¢®«®¢, â® u2 - ç¨á«® ॠ«ì®
|
||
\ ¯à®ç¨â ëå ᨬ¢®«®¢ (0<=u2<=u1), ¥ áç¨â ï ᨬ¢®«®¢ "ª®¥æ áâப¨".
|
||
\ Š®£¤ u1=u2 ª®¥æ áâப¨ 㦥 ¯®«ãç¥.
|
||
\ …᫨ ®¯¥à æ¨ï ¯à®¨§¢®¤¨âáï, ª®£¤ § 票¥, ¢®§¢à é ¥¬®¥
|
||
\ FILE-POSITION à ¢® § 票î, ¢®§¢à é ¥¬®¬ã FILE-SIZE ¤«ï ä ©« ,
|
||
\ ¨¤¥â¨ä¨æ¨à㥬®£® fileid, flag "«®¦ì", ior ®«ì, ¨ u2 ®«ì.
|
||
\ …᫨ ior ¥ ®«ì, â® ¯à®¨§®è« ¨áª«îç¨â¥«ì ï á¨âã æ¨ï ¨ ior -
|
||
\ ®¯à¥¤¥«¥ë© ॠ«¨§ 樥© ª®¤ १ã«ìâ â ¢¢®¤ -¢ë¢®¤ .
|
||
\ <20>¥®¯à¥¤¥«¥ ï á¨âã æ¨ï ¢®§¨ª ¥â, ¥á«¨ ®¯¥à æ¨ï ¢ë¯®«ï¥âáï, ª®£¤
|
||
\ § 票¥, ¢®§¢à é ¥¬®¥ FILE-POSITION ¡®«ìè¥ ç¥¬ § 票¥, ¢®§¢à é ¥¬®¥
|
||
\ FILE-SIZE ¤«ï ä ©« , ¨¤¥â¨ä¨æ¨à㥬®£® fileid, ¨«¨ âॡ㥬 ï ®¯¥à æ¨ï
|
||
\ ¯ëâ ¥âáï ¯à®ç¥áâì ¥§ ¯¨á ãî ç áâì ä ©« .
|
||
\ <20>®á«¥ § ¢¥àè¥¨ï ®¯¥à 樨 FILE-POSITION ¢®§¢à â¨â á«¥¤ãîéãî ¯®§¨æ¨î
|
||
\ ¢ ä ©«¥ ¯®á«¥ ¯®á«¥¤¥£® ¯à®ç¨â ®£® ᨬ¢®« .
|
||
DUP >R
|
||
FILE-POSITION IF 2DROP 0 0 THEN _fp1 ! _fp2 !
|
||
1+
|
||
OVER _addr !
|
||
|
||
R@ READ-FILE ?DUP IF NIP RDROP 0 0 ROT EXIT THEN
|
||
|
||
DUP >R 0= IF RDROP RDROP 0 0 0 EXIT THEN \ ¡ë«¨ ¢ ª®æ¥ ä ©«
|
||
_addr @ R@ LT 1+ 1 SEARCH
|
||
IF \ ©¤¥ à §¤¥«¨â¥«ì áâப
|
||
DROP _addr @ -
|
||
DUP 1+ S>D _fp2 @ _fp1 @ D+ RDROP R> REPOSITION-FILE DROP
|
||
DUP _addr @ + 1- C@ 0xD = IF 1- THEN
|
||
ELSE \ ¥ ©¤¥ à §¤¥«¨â¥«ì áâப
|
||
2DROP
|
||
R> RDROP \ ¥á«¨ áâப ¯à®ç¨â ¥ ¯®«®áâìî - ¡ã¤¥â à §à¥§
|
||
THEN
|
||
TRUE 0
|
||
;
|
||
|
||
: FILE-POSITION ( fileid -- ud ior ) \ 94 FILE
|
||
\ ud - ⥪ãé ï ¯®§¨æ¨ï ¢ ä ©«¥, ¨¤¥â¨ä¨æ¨à㥬®¬ fileid.
|
||
.FIRST D@ 0
|
||
;
|
||
|
||
: REPOSITION-FILE ( ud fileid -- ior ) \ 94 FILE
|
||
\ <20>¥à¥¯®§¨æ¨®¨à®¢ âì ä ©«, ¨¤¥â¨ä¨æ¨àã¥¬ë© fileid, ud.
|
||
.FIRST D! 0
|
||
;
|
||
|