home *** CD-ROM | disk | FTP | other *** search
/ Skunkware 98 / Skunkware 98.iso / osr5 / sco / scripts / uudec < prev    next >
Encoding:
Korn shell script  |  1997-08-26  |  3.2 KB  |  142 lines

  1. #!/bin/ksh
  2. # @(#) uudec.ksh 1.2 94/09/20
  3. # 92/08/04 john@armory.com (John H. DuBois III)
  4. # 93/11/22 Added help.
  5. # 94/08/24 added d and p options.
  6. # 94/09/20 Added stats and n & q options.
  7.  
  8. name=${0##*/}
  9. Usage="Usage: $name [-hpn] [-d<dirname>] [file ...]"
  10. NoPath=false
  11. Debug=false
  12. Stats=true
  13. Quiet=false
  14. OrigDir=$PWD
  15.  
  16. while getopts :hpd:xqn opt; do
  17.     case $opt in
  18.     h)
  19.     echo \
  20. "$name: process uuencoded files.
  21. $Usage
  22. If no filenames are given, the input is read for names.  More than one name
  23. may be given on a line.  Each file is uudecoded individually.
  24. Options:
  25. -h: Print this help.
  26. -p: Do not skip files that have a directory component.
  27. -d<dirname>: extract files into directory <dirname>.
  28. -n: Do not print uudecoding success statistics, as is normally done if more
  29.     than one file is processed.
  30. -q: Print single-character abbreviations for per-file error messages."
  31.     exit 0
  32.     ;;
  33.     p)    NoPath=false;;
  34.     n)    Stats=false;;
  35.     q)    Quiet=true;;
  36.     d)    cd "$OPTARG";;
  37.     x)    Debug=true;;
  38.     +?)
  39.     print -u2 "$name: options should not be preceded by a '+'."
  40.     exit 1
  41.     ;;
  42.     :) 
  43.     print -r -u2 -- \
  44.     "$name: Option '$OPTARG' requires a value.  Use -h for help."
  45.     exit 1
  46.     ;;
  47.     ?) 
  48.     print -u2 "$name: $OPTARG: bad option.  Use -h for help."
  49.     exit 1
  50.     ;;
  51.     esac
  52. done
  53.  
  54. DecodeFiles() {
  55.     for f in "$@"; do
  56.     $Quiet || print -u2 -n "$f: "
  57.     [[ "$f" != /* ]] && InFile="$OrigDir/$f" || InFile=$f
  58.     FoundBegin=false
  59.     egrep '^(begin |end)' "$InFile" |
  60.     while read b mode filename; do
  61.         if $FoundBegin; then
  62.         [ "$b" = end ] && break
  63.         elif [ "$b" = begin ]; then
  64.         FoundBegin=true
  65.         if $NoPath && [[ "$filename" = */* ]]; then
  66.             $Quiet && print -nu2 / || print -u2 \
  67.             "Output filename '$filename' contains '/'; not written."
  68.             ((BadNameCt+=1))
  69.             continue 2
  70.         elif [ -f "$filename" ]; then
  71.             $Quiet && print -nu2 x || 
  72.             print -u2 "Output file '$filename' exists; not written."
  73.             ((FileExistsCt+=1))
  74.             continue 2
  75.         else 
  76.             $Debug && print -u2 "Output filename: $filename"
  77.         fi
  78.         File=$filename
  79.         fi
  80.     done
  81.     if $FoundBegin && [ "$b" = end ]; then
  82.         if uudecode "$InFile"; then
  83.         $Quiet && print -nu2 + || print -u2 "Done."
  84.         ((DecodeCt+=1))
  85.         else
  86.         $Quiet && print -nu2 ! || print -u2 "uudecode failed."
  87.         ((FailCt+=1))
  88.         fi
  89.     else
  90.         if $FoundBegin; then
  91.         $Quiet && print -nu2 e || print -u2 "No end line."
  92.         ((NoEndCt+=1))
  93.         else
  94.         $Quiet && print -nu2 b || print -u2 "No begin line."
  95.         ((NoBeginCt+=1))
  96.         fi
  97.     fi
  98.     done
  99. }
  100.  
  101. function Finish {
  102.     $FinishDone && return
  103.  
  104.     typeset -i Tot=0
  105.  
  106.     $Quiet && print -u2 ""
  107.  
  108.     if $Stats; then
  109.     set -- "No begin line" "No end line" "File exists" "Bad filename" \
  110.     Successful "Decode failed"
  111.     for StatName in $StatNames; do
  112.         eval "[ $StatName -gt 0 ] && print \"$1:\t\$$StatName\";
  113.         let Tot+=$StatName"
  114.         shift
  115.     done
  116.     print "Total:\t\t$Tot"
  117.     fi
  118.     FinishDone=true
  119. }
  120.  
  121. # remove args that were options
  122. let OPTIND=OPTIND-1
  123. shift $OPTIND
  124.  
  125. StatNames="NoBeginCt NoEndCt FileExistsCt BadNameCt DecodeCt FailCt"
  126. for StatName in $StatNames; do
  127.     eval typeset -i $StatName
  128. done
  129.  
  130. FinishDone=false
  131. trap Finish INT
  132.  
  133. if [ $# -gt 0 ]; then
  134.     DecodeFiles "$@"
  135. else
  136.     while read line; do
  137.     DecodeFiles $line
  138.     done
  139. fi
  140.  
  141. Finish
  142.