diff --git a/tar.tal b/tar.tal index e306951..c9a022a 100644 --- a/tar.tal +++ b/tar.tal @@ -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