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