clean up tar.tal

This commit is contained in:
~d6 2024-09-17 22:44:29 -04:00
parent b9c2a4501f
commit f8c728d331
1 changed files with 14 additions and 52 deletions

66
tar.tal
View File

@ -2,12 +2,18 @@
( )
( by d_m )
( )
( currently only supports listing the contents of tar files )
( )
( see https://en.wikipedia.org/wiki/Tar_(computing)#UStar_format )
( )
( TODO: )
( - support creating archives )
( - arg validation should depend on mode )
( - validate checksums )
( - better error messages on unsupported files, e.g. symlinks )
( - better usage message )
( - support using "-" for stdin/stdout? )
( File1 is used to read the tar file )
( TODO File2 is used to write files and directories )
( File1 is used to read/write the tar file )
( File2 is used to read/write files and directories )
|a0 @File1 [ &vec $2 &ok $2 &stat $2 &del $1 &append $1 &name $2 &len $2 &r $2 &w $2 ]
|b0 @File2 [ &vec $2 &ok $2 &stat $2 &del $1 &append $1 &name $2 &len $2 &r $2 &w $2 ]
@ -132,7 +138,7 @@
@sanitize-path ( s* -> s1* )
LDAk LIT "/ NEQ JMP INC2 JMP2r
@extra-xyz ( n* -> extra* )
@remainder-512 ( n* -> extra* )
#01ff AND2 #0200 SWP2 SUB2 ORAk ?{ POP2 #0000 } JMP2r
@expand-file ( type^ -> )
@ -141,7 +147,7 @@
DUP2 #0064 lprint #0a18 DEO
.File2/name DEO2
;header/size load-octal11 STH2k write
STH2r extra-xyz skip-lo !expand-entries
STH2r remainder-512 skip-lo !expand-entries
@expand-dir ( type^ -> )
POP
@ -149,53 +155,9 @@
DUP2 #0064 lprint #0a18 DEO
.File2/name DEO2
#0004 .File2/len DEO2
;tmp .File2/w DEO2
#0001 .File2/w DEO2
!expand-entries
@tmp "tmp 0a 00
( TODO write data from memory into the tar file )
@z-write-memory ( filename* size* data* -> )
STH2 STH2k z-write-file-header ( [data* size*] )
STH2r STH2r z-write-file-body JMP2r ( )
.File1/len
( TODO write out the file header )
@z-write-file-header ( filename* size* -> )
SWP2 ;header/filename copy JMP2r
z-write-size-2
( TODO: compute checksum )
LIT "0 ;header/type STA
#00 ;header/linkname STA
JMP2r
( TODO write file body into archive )
@z-write-file-body ( size* data* -> )
SWP2 .File1/len DEO2 .File1/w DEO2 JMP2r
( TODO write file size, limited to 64k )
@z-write-size-2 ( size* -> )
;header/size STH2 ( size* [start*] )
LIT2r 000a ADD2r ( size* [start* last*] )
&loop ( size* [start* pos*] )
LTH2kr STHr ?&done ( size* [start* pos*] )
DUP2 #0007 AND2 ( size* size%8* [start* pos*] )
NIP LIT "0 ADD ( size* octal^ [start* pos*] )
STH2kr STA ( size* [start* pos*] )
#03 SFT2 ( size/8* [start* pos*] )
LIT2 0001 SUB2 !&loop ( size/8* [start* pos-1*] )
&done ( zero* [start* pos*] )
POP2 POP2r POP2r JMP2r ( )
( TODO: copy string from src to dst )
( TODO: need a length param too )
@copy ( src* dst* -> )
STH2
&loop
LDAk DUP STH2kr STA2 ?&ok
POP2 POP2r JMP2r
&ok INC2 INC2r !&loop
( writes `n` bytes from File1 to File2 )
( uses a 32k internal buffer )
@write ( carry^ hi* lo* -> )
@ -407,7 +369,7 @@
JMP2r
( some handy string constants )
@usage "usage: 20 "uxncli 20 "tar.rom 20 "c|t|x 20 "FILENAME 0a 00
@usage "usage: 20 "uxncli 20 "tar.rom 20 "t|x 20 "FILENAME 0a 00
@missing-mode "error: 20 "missing 20 "mode 0a 00
@missing-filename "error: 20 "missing 20 "filename 0a 00
@too-many-arguments "error: 20 "too 20 "many 20 "arguments 0a 00