/contrib/tcsh/MAKESHAR

https://bitbucket.org/freebsd/freebsd-head/ · Shell · 121 lines · 112 code · 3 blank · 6 comment · 20 complexity · e57650c8226845503a1b46a1b28db1fb MD5 · raw file

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