RosettaCodeData/Task/Truncate-a-file/Action-/truncate-a-file.action
2023-07-01 13:44:08 -04:00

102 lines
1.6 KiB
Text

INCLUDE "D2:IO.ACT" ;from the Action! Tool Kit
PROC Dir(CHAR ARRAY filter)
BYTE dev=[1]
CHAR ARRAY line(255)
Close(dev)
Open(dev,filter,6)
DO
InputSD(dev,line)
PrintE(line)
IF line(0)=0 THEN
EXIT
FI
OD
Close(dev)
RETURN
BYTE FUNC Find(CHAR ARRAY text CHAR c)
BYTE i
i=1
WHILE i<=text(0)
DO
IF text(i)=c THEN
RETURN (i)
FI
i==+1
OD
RETURN (0)
PROC MakeRenameCommand(CHAR ARRAY left,right,result)
BYTE i,len,pos
SCopy(result,left)
len=left(0)+1
result(len)=32
pos=Find(right,':)
FOR i=pos+1 TO right(0)
DO
len==+1
result(len)=right(i)
OD
result(0)=len
RETURN
PROC DeleteFile(CHAR ARRAY fname)
BYTE dev=[1]
Close(dev)
Xio(dev,0,33,0,0,fname)
RETURN
PROC TruncateFile(CHAR ARRAY fname CARD maxlen)
DEFINE BUF_LEN="100"
CHAR ARRAY tmp="D:TEMP.TMP",cmd(255)
BYTE in=[1], out=[2]
BYTE ARRAY buff(BUF_LEN)
CARD len,size
Close(in)
Close(out)
Open(in,fname,4)
Open(out,tmp,8)
DO
IF maxlen>BUF_LEN THEN
size=BUF_LEN
ELSE
size=maxlen
FI
len=Bget(in,buff,size)
maxlen==-len
IF len>0 THEN
Bput(out,buff,len)
FI
UNTIL len#BUF_LEN
OD
Close(in)
Close(out)
MakeRenameCommand(tmp,fname,cmd)
DeleteFile(fname)
Rename(cmd)
RETURN
PROC Main()
CHAR ARRAY filter="D:*.*", fname="D:INPUT.TXT"
CARD len=[400]
Put(125) PutE() ;clear screen
PrintF("Dir ""%S""%E",filter)
Dir(filter)
PrintF("Truncate ""%S"" to %U bytes.%E%E",fname,len)
TruncateFile(fname,len)
PrintF("Dir ""%S""%E",filter)
Dir(filter)
RETURN