home *** CD-ROM | disk | FTP | other *** search
/ ftp.cs.arizona.edu / ftp.cs.arizona.edu.tar / ftp.cs.arizona.edu / icon / historic / v941.tgz / icon.v941src.tar / icon.v941src / ipl / progs / diskpack.icn < prev    next >
Text File  |  2000-07-29  |  3KB  |  96 lines

  1. ############################################################################
  2. #
  3. #    File:     diskpack.icn
  4. #
  5. #    Subject:  Program to produce packing list for diskettes
  6. #
  7. #    Author:   Ralph E. Griswold
  8. #
  9. #    Date:     June 10, 1994
  10. #
  11. ############################################################################
  12. #
  13. #   This file is in the public domain.
  14. #
  15. ############################################################################
  16. #
  17. #   This program is designed to produce a list of files to fit onto
  18. #   diskettes.  It can be adapted to other uses.
  19. #
  20. #   This program uses a straightforward, first-fit algorithm.
  21. #
  22. #   The options supported are:
  23. #
  24. #    -s i    diskette capacity, default 360000
  25. #    -r i    space to reserve on first diskettes, default 0
  26. #    -n s    UNIX-style file name specification for files to
  27. #        be packed, default "*.lzh"
  28. #
  29. ############################################################################
  30. #
  31. #  Requires:  UNIX
  32. #
  33. ############################################################################
  34. #
  35. #  Links:  options
  36. #
  37. ############################################################################
  38.  
  39. link options
  40.  
  41. procedure main(argl)
  42.    local files, disksize, reserve, firstsize, thissize, file, size, flist
  43.    local disk, left, opts, spec, wc, used, number
  44.  
  45.  
  46.    files := table()                # table of files
  47.  
  48.    opts := options(argl, "s+r+n:")
  49.    disksize := \opts["s"] | 360000        # diskette size
  50.    reserve := \opts["r"] | 0            # reserved space on 1st
  51.    firstsize := disksize - reserve        # available space on 1st
  52.    spec := \opts["n"] | "*.lzh"            # files to pack
  53.  
  54.    wc := open("wc " || spec, "p")        # pipe to get sizes
  55.  
  56.    every !wc ? {                # analyze wc output
  57.       tab(upto(&digits))
  58.       tab(many(&digits))
  59.       tab(upto(&digits))
  60.       tab(many(&digits))
  61.       tab(upto(&digits))
  62.       size := integer(tab(many(&digits)))    # 3rd field has bytes
  63.       tab(many(' '))
  64.       file := tab(0)                # file name
  65.       if file == "total" then break        # exit on summary line
  66.       files[file] := size            # add information to table
  67.       }
  68.  
  69.    number := 0                    # diskette number
  70.    thissize := firstsize            # space on this diskette
  71.  
  72.    while *files > 0 do {            # while files remain
  73.       number +:= 1                # next diskette
  74.       flist := sort(files, 4)            # list of files and sizes
  75.       disk := []                # empty diskette
  76.       left := thissize                # space left
  77.       used := 0                    # space used
  78.       while size := pull(flist) do {        # get largest remaining size
  79.          file := pull(flist)            # file name
  80.          if size < left then {            # if it fits
  81.             put(disk, file)            # put it on disk
  82.             left -:= size            # decrement remaining space
  83.             used +:= size            # increment space used
  84.             delete(files, file)            # delete file from table
  85.             }
  86.          }
  87.                         # if nothing on disk, can't do
  88.       if *disk = 0 then stop("*** can't fit on disks")
  89.                         # write heading information
  90.       write("\ndiskette ", number, ": ", used, "/", disksize - thissize + left)
  91.       every write(!disk)            # write file names
  92.       thissize := disksize            # space on next diskette
  93.       }
  94.  
  95. end
  96.