1#!/bin/sh 2# 3# MAKESHAR.sh: Make a shar file for the sources 4# 5 6AWK=/usr/bin/nawk # Must be nawk or gawk cause of 2D arrays 7WC=/usr/ucb/wc 8GREP=/usr/bin/egrep 9SORT=/usr/bin/sort 10SH=/bin/sh 11 12dirs= 13name=kit 14files= 15verbose=0 16size=45000 17 18for i 19do 20 case $i in 21 -n) 22 name=;; 23 -v) 24 verbose=1;; 25 -d) 26 SH=/bin/cat;; 27 -s) 28 size=$1;; 29 *) 30 if [ -z "$name" ] 31 then 32 name=$i 33 elif [ -d $i ] 34 then 35 dirs="$dirs $i" 36 elif [ -f $i ] 37 then 38 files="$files $i" 39 else 40 echo "$0: File `$i' not found." 1>&2 41 exit 1 42 fi;; 43 esac 44done 45 46if [ \( -z "$files" \) -a \( -z "$dirs" \) ] 47then 48 echo "Usage: $0 [-n name] [-s size] [-vd] <files>." 1>&2 49 exit 1 50fi 51 52$WC $files | $GREP -v total | $SORT +2 | $AWK ' 53 BEGIN { 54 i = 0; 55 seq = 1; 56 size = 0; 57 name = 1; 58 used = 2; 59 verbose='"$verbose"'; 60 tty = "/dev/tty"; 61 maxsize = '"$size"'; 62 dirs = "'"$dirs"'"; 63 }; 64 { 65 a[i, size] = $3; 66 a[i, name] = $4; 67 a[i, used] = 0; 68 i++; 69 }; 70 END { 71 for (maxi = i--; i >= 0; i--) { 72 idx = 0; 73 if (a[i, used] == 0) { 74 if (verbose && a[i, size] > maxsize) 75 printf("Warning: File %s is %d > %d\n", 76 a[i, name], a[i, size], maxsize) > tty; 77 s = a[i, size]; 78 a[i, used] = 1; 79 kit[seq, idx++] = i; 80 j = 0; 81 while (j < maxi) { 82 # Find the greatest file we can add 83 j = maxi; 84 for (k = 0; k < maxi; k++) 85 if (a[k, used] == 0 && a[k, size] + s < maxsize) 86 j = k; 87 if (j < maxi) { 88 s += a[j, size]; 89 a[j, used] = 1; 90 kit[seq, idx++] = j; 91 } 92 } 93 sizes[seq] = s; 94 kit[seq++, idx] = -1; 95 } 96 } 97 for (i = 1; i < seq; i++) { 98 printf("shar -n%d -e%d %s ", i, seq - 1, dirs); 99 if (verbose) { 100 printf("%3d of %3d: ", i, seq - 1) > tty; 101 len = 12; 102 } 103 for (j = 0; kit[i, j] != -1; j++) { 104 s = a[kit[i, j], name]; 105 if (verbose) { 106 clen = length(s) + 1; 107 len += clen; 108 if (len > 70) { 109 printf("\n ") > tty; 110 len = 12 + clen; 111 } 112 printf("%s ", s) > tty; 113 } 114 printf("%s ", s); 115 } 116 printf("> '"$name"'-%d.shar;", i); 117 if (verbose) 118 printf("= %5d\n", sizes[i]) > tty; 119 } 120 }' | $SH 121