( ©«®¢ë© ¢¢®¤-¢ë¢®¤.
)
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
\ à®ç¥áâì u1 ᨬ¢®«®¢ ¢ c-addr ¨§ ⥪ã饩 ¯®§¨æ¨¨ ä ©« ,
\ ¨¤¥â¨ä¨æ¨à㥬®£® fileid.
\
᫨ u1 ᨬ¢®«®¢ ¯à®ç¨â ® ¡¥§ ¨áª«î票©, ior ®«ì ¨ u2 à ¢¥ u1.
\
᫨ ª®¥æ ä ©« ¤®á⨣ãâ ¤® ¯à®ç⥨ï u1 ᨬ¢®«®¢, ior ®«ì
\ ¨ u2 - ª®«¨ç¥á⢮ ॠ«ì® ¯à®ç¨â ëå ᨬ¢®«®¢.
\
᫨ ®¯¥à æ¨ï ¯à®¨§¢®¤¨âáï ª®£¤ § 票¥, ¢®§¢à é ¥¬®¥
\ FILE-POSITION à ¢® § 票î, ¢®§¢à é ¥¬®¬ã FILE-SIZE ¤«ï ä ©«
\ ¨¤¥â¨ä¨æ¨à㥬®£® fileid, ior ¨ u2 㫨.
\
᫨ ¢®§¨ª« ¨áª«îç¨â¥«ì ï á¨âã æ¨ï, â® ior - ®¯à¥¤¥«¥ë© ॠ«¨§ 樥©
\ ª®¤ १ã«ìâ â ¢¢®¤ /¢ë¢®¤ , ¨ u2 - ª®«¨ç¥á⢮ ®à¬ «ì® ¯¥à¥¤ ëå ¢
\ c-addr ᨬ¢®«®¢.
\ ¥®¯à¥¤¥«¥ ï á¨âã æ¨ï ¢®§¨ª ¥â, ¥á«¨ ®¯¥à æ¨ï ¢ë¯®«ï¥âáï, ª®£¤
\ § 票¥, ¢®§¢à é ¥¬®¥ FILE-POSITION ¡®«ìè¥ ç¥¬ § 票¥, ¢®§¢à é ¥¬®¥
\ FILE-SIZE ¤«ï ä ©« , ¨¤¥â¨ä¨æ¨à㥬®£® fileid, ¨«¨ âॡ㥬 ï ®¯¥à æ¨ï
\ ¯ëâ ¥âáï ¯à®ç¥áâì ¥§ ¯¨á ãî ç áâì ä ©« .
\ ®á«¥ § ¢¥àè¥¨ï ®¯¥à 樨 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
\ à®ç¥áâì á«¥¤ãîéãî áâப㠨§ ä ©« , § ¤ ®£® fileid, ¢ ¯ ¬ïâì
\ ¯® ¤à¥áã c-addr. ¨â ¥âáï ¥ ¡®«ìè¥ u1 ᨬ¢®«®¢. ® ¤¢ãå
\ ®¯à¥¤¥«¥ëå ॠ«¨§ 樥© ᨬ¢®«®¢ "ª®¥æ áâப¨" ¬®£ãâ ¡ëâì
\ ¯à®ç¨â ë ¢ ¯ ¬ïâì § ª®æ®¬ áâப¨, ® ¥ ¢ª«îç¥ë ¢ áç¥â稪 u2.
\ ãä¥à áâப¨ c-addr ¤®«¦¥ ¨¬¥âì à §¬¥à ª ª ¬¨¨¬ã¬ u1+2 ᨬ¢®« .
\
᫨ ®¯¥à æ¨ï ãᯥè , flag "¨á⨠" ¨ ior ®«ì.
᫨ ª®¥æ áâப¨
\ ¯®«ãç¥ ¤® ⮣® ª ª ¯à®ç¨â ë u1 ᨬ¢®«®¢, â® u2 - ç¨á«® ॠ«ì®
\ ¯à®ç¨â ëå ᨬ¢®«®¢ (0<=u2<=u1), ¥ áç¨â ï ᨬ¢®«®¢ "ª®¥æ áâப¨".
\ ®£¤ u1=u2 ª®¥æ áâப¨ 㦥 ¯®«ãç¥.
\
᫨ ®¯¥à æ¨ï ¯à®¨§¢®¤¨âáï, ª®£¤ § 票¥, ¢®§¢à é ¥¬®¥
\ FILE-POSITION à ¢® § 票î, ¢®§¢à é ¥¬®¬ã FILE-SIZE ¤«ï ä ©« ,
\ ¨¤¥â¨ä¨æ¨à㥬®£® fileid, flag "«®¦ì", ior ®«ì, ¨ u2 ®«ì.
\
᫨ ior ¥ ®«ì, â® ¯à®¨§®è« ¨áª«îç¨â¥«ì ï á¨âã æ¨ï ¨ ior -
\ ®¯à¥¤¥«¥ë© ॠ«¨§ 樥© ª®¤ १ã«ìâ â ¢¢®¤ -¢ë¢®¤ .
\ ¥®¯à¥¤¥«¥ ï á¨âã æ¨ï ¢®§¨ª ¥â, ¥á«¨ ®¯¥à æ¨ï ¢ë¯®«ï¥âáï, ª®£¤
\ § 票¥, ¢®§¢à é ¥¬®¥ FILE-POSITION ¡®«ìè¥ ç¥¬ § 票¥, ¢®§¢à é ¥¬®¥
\ FILE-SIZE ¤«ï ä ©« , ¨¤¥â¨ä¨æ¨à㥬®£® fileid, ¨«¨ âॡ㥬 ï ®¯¥à æ¨ï
\ ¯ëâ ¥âáï ¯à®ç¥áâì ¥§ ¯¨á ãî ç áâì ä ©« .
\ ®á«¥ § ¢¥àè¥¨ï ®¯¥à 樨 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
\ ¥à¥¯®§¨æ¨®¨à®¢ âì ä ©«, ¨¤¥â¨ä¨æ¨àã¥¬ë© fileid, ud.
.FIRST D! 0
;