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