Annotation of gforth/archive.fs, revision 1.1

1.1     ! pazsan      1: \ very simple archive format                          29jul2012py
        !             2: 
        !             3: \ Copyright (C) 2012 Free Software Foundation, Inc.
        !             4: 
        !             5: \ This file is part of Gforth.
        !             6: 
        !             7: \ Gforth is free software; you can redistribute it and/or
        !             8: \ modify it under the terms of the GNU General Public License
        !             9: \ as published by the Free Software Foundation, either version 3
        !            10: \ of the License, or (at your option) any later version.
        !            11: 
        !            12: \ This program is distributed in the hope that it will be useful,
        !            13: \ but WITHOUT ANY WARRANTY; without even the implied warranty of
        !            14: \ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
        !            15: \ GNU General Public License for more details.
        !            16: 
        !            17: \ You should have received a copy of the GNU General Public License
        !            18: \ along with this program. If not, see http://www.gnu.org/licenses/.
        !            19: 
        !            20: \ the intention for this format is to ship Gforth's files to
        !            21: \ limited systems in a very simple format (simpler than tar)
        !            22: \ so that unpacking is totally trivial.
        !            23: \ File system capabilities expected are similar to vfat
        !            24: \ no date stamp is given
        !            25: \ the file is supposed to be compressed with zlib afterwards
        !            26: 
        !            27: \ Format of each file:
        !            28: \ 32 bit len type filename\0 - counted+zero-terminated, aligned to 4 bytes
        !            29: \ 32 bit size, little endian, aligend to 4 bytes
        !            30: \ file contents, plus alignment to 4 bytes
        !            31: \ type is:
        !            32: \ 'f' for file,
        !            33: \ 'd' for directory,
        !            34: \ 's' for symlink,
        !            35: \ 'h' for hardlink
        !            36: \ rules for directories are: Specify each before first use
        !            37: 
        !            38: 4 buffer: fsize
        !            39: 
        !            40: : >align ( n -- ) dup sfaligned swap - spaces ;
        !            41: : .len ( n -- )  fsize le-l! fsize 4 type ;
        !            42: : .z ( -- )  0 .len ;
        !            43: : .entry ( addr u char -- addr u )
        !            44:     >r dup 2 + .len r> emit 2dup type 0 emit dup 2 + >align ;
        !            45: 
        !            46: : -scan ( addr u char -- addr' u' )
        !            47:   >r  BEGIN  dup  WHILE  1- 2dup + c@ r@ =  UNTIL  THEN
        !            48:   rdrop ;
        !            49: 
        !            50: wordlist constant dirs
        !            51: 
        !            52: : :dir ( addr u -- )
        !            53:     get-current >r dirs set-current nextname create r> set-current ;
        !            54: 
        !            55: "." :dir
        !            56: 
        !            57: : ?dir ( addr u -- )
        !            58:     '/' -scan dup 0= IF  2drop  EXIT  THEN
        !            59:     2dup dirs search-wordlist 0= IF
        !            60:        2dup recurse
        !            61:        'd' .entry .z :dir
        !            62:     ELSE
        !            63:        drop 2drop
        !            64:     THEN ;
        !            65: 
        !            66: : dump-a-file ( addr u -- )
        !            67:     2dup ?dir
        !            68:     'f' .entry
        !            69:     slurp-file dup .len 2dup type dup >align
        !            70:     drop free throw ;
        !            71: 
        !            72: : dump-files ( -- )
        !            73:     BEGIN  argc @ 1 >  WHILE
        !            74:            next-arg dump-a-file
        !            75:     REPEAT ;
        !            76: 
        !            77: script? [IF]
        !            78:     argc @ 1 = [IF]
        !            79:        ." call archive.fs <file list> >output" cr bye
        !            80:     [ELSE]
        !            81:        dump-files bye
        !            82:     [THEN]
        !            83: [THEN]

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>