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