159243Sobrien#!/bin/sh
259243Sobrien#
359243Sobrien# MAKESHAR.sh: Make a shar file for the sources
459243Sobrien#
559243Sobrien
659243SobrienAWK=/usr/bin/nawk	# Must be nawk or gawk cause of 2D arrays
759243SobrienWC=/usr/ucb/wc		
859243SobrienGREP=/usr/bin/egrep
959243SobrienSORT=/usr/bin/sort
1059243SobrienSH=/bin/sh
1159243Sobrien
1259243Sobriendirs=
1359243Sobrienname=kit
1459243Sobrienfiles=
1559243Sobrienverbose=0
1659243Sobriensize=45000
1759243Sobrien
1859243Sobrienfor i 
1959243Sobriendo
2059243Sobrien    case $i in
2159243Sobrien    -n)	
2259243Sobrien	name=;;
2359243Sobrien    -v)
2459243Sobrien	verbose=1;;
2559243Sobrien    -d)
2659243Sobrien	SH=/bin/cat;;
2759243Sobrien    -s)
2859243Sobrien	size=$1;;
2959243Sobrien    *)
3059243Sobrien	if [ -z "$name" ]
3159243Sobrien	then
3259243Sobrien	    name=$i
3359243Sobrien	elif [ -d $i ]
3459243Sobrien	then
3559243Sobrien	    dirs="$dirs $i"
3659243Sobrien	elif [ -f $i ]
3759243Sobrien	then
3859243Sobrien	    files="$files $i"
3959243Sobrien	else
4059243Sobrien	    echo "$0: File `$i' not found." 1>&2
4159243Sobrien	    exit 1
4259243Sobrien	fi;;
4359243Sobrien    esac
4459243Sobriendone
4559243Sobrien	
4659243Sobrienif [ \( -z "$files" \) -a \( -z "$dirs" \) ]
4759243Sobrienthen
4859243Sobrien    echo "Usage: $0 [-n name] [-s size] [-vd] <files>."	1>&2
4959243Sobrien    exit 1
5059243Sobrienfi
5159243Sobrien
5259243Sobrien$WC $files | $GREP -v total | $SORT +2 | $AWK '
5359243Sobrien    BEGIN {
5459243Sobrien	i = 0;
5559243Sobrien	seq = 1;
5659243Sobrien	size = 0;
5759243Sobrien	name = 1;
5859243Sobrien	used = 2;
5959243Sobrien	verbose='"$verbose"';
6059243Sobrien	tty = "/dev/tty";
6159243Sobrien	maxsize = '"$size"';
6259243Sobrien	dirs = "'"$dirs"'";
6359243Sobrien    };
6459243Sobrien    {
6559243Sobrien	a[i, size] = $3;
6659243Sobrien	a[i, name] = $4;
6759243Sobrien	a[i, used] = 0;
6859243Sobrien	i++;
6959243Sobrien    };
7059243Sobrien    END {
7159243Sobrien	for (maxi = i--; i >= 0; i--) {
7259243Sobrien	    idx = 0;
7359243Sobrien	    if (a[i, used] == 0) {
7459243Sobrien		if (verbose && a[i, size] > maxsize) 
7559243Sobrien		    printf("Warning: File %s is %d > %d\n",
7659243Sobrien			   a[i, name], a[i, size], maxsize) > tty;
7759243Sobrien		s = a[i, size];
7859243Sobrien		a[i, used] = 1;
7959243Sobrien		kit[seq, idx++] = i; 
8059243Sobrien		j = 0;
8159243Sobrien		while (j < maxi) {
8259243Sobrien		    # Find the greatest file we can add
8359243Sobrien		    j = maxi;
8459243Sobrien		    for (k = 0; k < maxi; k++)
8559243Sobrien			if (a[k, used] == 0 && a[k, size] + s < maxsize)
8659243Sobrien			    j = k;
8759243Sobrien		    if (j < maxi) {
8859243Sobrien			s += a[j, size];
8959243Sobrien			a[j, used] = 1;
9059243Sobrien			kit[seq, idx++] = j; 
9159243Sobrien		    }
9259243Sobrien		}
9359243Sobrien		sizes[seq] = s;
9459243Sobrien		kit[seq++, idx] = -1; 
9559243Sobrien	    }
9659243Sobrien	}
9759243Sobrien	for (i = 1; i < seq; i++) {
9859243Sobrien	    printf("shar -n%d -e%d %s ", i, seq - 1, dirs);
9959243Sobrien	    if (verbose) {
10059243Sobrien		printf("%3d of %3d: ", i, seq - 1) > tty;
10159243Sobrien		len = 12;
10259243Sobrien	    }
10359243Sobrien	    for (j = 0; kit[i, j] != -1; j++) {
10459243Sobrien		s = a[kit[i, j], name];
10559243Sobrien		if (verbose) {
10659243Sobrien		    clen = length(s) + 1;
10759243Sobrien		    len += clen;
10859243Sobrien		    if (len > 70) {
10959243Sobrien			printf("\n            ") > tty;
11059243Sobrien			len = 12 + clen;
11159243Sobrien		    }
11259243Sobrien		    printf("%s ", s) > tty;
11359243Sobrien		}
11459243Sobrien		printf("%s ", s);
11559243Sobrien	    }
11659243Sobrien	    printf("> '"$name"'-%d.shar;", i);
11759243Sobrien	    if (verbose)
11859243Sobrien		printf("= %5d\n", sizes[i]) > tty;
11959243Sobrien	}
12059243Sobrien    }' | $SH
121