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