home *** CD-ROM | disk | FTP | other *** search
/ The World of Computer Software / World_Of_Computer_Software-02-387-Vol-3of3.iso / d / dshar116.zip / UNDSHAR.SH < prev   
Text File  |  1993-03-11  |  5KB  |  203 lines

  1. :
  2. #!/bin/sh
  3.  
  4. # undshar.sh (bundled with dshar V1.16)        by nide@nara-wu.ac.jp
  5. #    Shell script on UNIX to extract dshar'ed files
  6.  
  7. #### Configuration part
  8. Touch=0
  9.  # If you have SystemV-like touch command, you can set it to 1
  10.  # If you have it in /usr/5bin, you'd better set it to 2
  11. FROMSJIS_def="nkf -e"
  12.  # Default command to convert KANJI from SJIS
  13.  # Note that nkf can't handle 1byte kana characters!
  14. #### End of config
  15.  
  16. # main
  17. Overwrite=0
  18. Notexec=0
  19. Textmode=0
  20. ConvSJIS=0
  21. FromSJIS_use="${FROMSJIS-$FROMSJIS_def}"
  22. # Old sh doesn't know ':-' substitution
  23. TrimCR="tr -d '\015\032'"
  24. LC_CTYPE=C; export LC_CTYPE # to make locale void
  25.  
  26. while :; do
  27.     case "$1" in
  28.      # Options must be specified separately
  29.     -c)    Overwrite=1; shift;;
  30.     -n)    Notexec=1; shift;;
  31.     -t)    Textmode=1; shift;;
  32.     -k)    ConvSJIS=1; shift;;
  33.     -v)    FromSJIS_use="$2"; shift 2;;
  34.     -v*)    FromSJIS_use="`expr X\"$1\" : '...\\(.*\\)'`"; shift;;
  35.     --)    shift; break;;
  36.     -)    break;;
  37.     -*)
  38.         echo Illegal option: "$1" 1>&2
  39.         exit 1;;
  40.     *)
  41.         break;;
  42.     esac
  43. done
  44.  
  45. cat "$@" | tr -d '\015\032' | awk '# old awk will do
  46.     BEGIN{
  47.         overwrite = 0'$Overwrite'
  48.         textmode = 0'$Textmode'
  49.         convsjis = 0'$ConvSJIS'
  50.         fromsjis = "'"$FromSJIS_use"'"
  51.         trimcr = "'"$TrimCR"'"
  52.         eofmark = "~EOF"
  53.         tmpname = "'/usr/tmp/_tmp.$$XXX'"
  54.         for(i = 0; i <= 16; i++)
  55.             ctoi[substr("0123456789ABCDEF", i + 1, 1)] = i
  56.         for(i = 0; i <= 6; i++)
  57.             ctoi[substr("abcdef", i + 1, 1)] = i + 10
  58.         # stoi["other string"] is 0
  59.         print ":\n#!/bin/sh\nLC_CTYPE=C; export LC_CTYPE"
  60.         printf "rm -f %s\n", tmpname
  61.         if(convsjis){
  62.             printf "echo Kanji conversion command: "
  63.             printf "'\''\"%s\"'\''\n", fromsjis
  64.         }
  65.     }
  66.     NR == 1, /^echo off[\t ]*$/{
  67.         next
  68.     }
  69.  
  70.     okflg == 0{
  71.         if($0 ~ /^:\*$/){
  72.             okflg = 1; next
  73.         }
  74.         if($0 !~ /^(:|[\t ]*$)/){
  75.             cannot = 1; exit
  76.         }
  77.     }
  78.  
  79.     /^:end~of~arc/{
  80.         endflg = 1; next
  81.     }
  82.     /^:[\t ]*\(You may put/, 1 == 0{
  83.         if($0 !~ /^(:|[\t ]*$)/) igextflg = 1
  84.         next
  85.     }
  86.  
  87.     /^echo extracting/{
  88.         if(catlevel) print eofmark; catlevel = 0
  89.         for(; iflevel > 0; iflevel--) print "fi"
  90.         filename = $3
  91.         if(overwrite == 0){
  92.             printf "if [ -f '\''%s'\'' ]; then\n", filename
  93.             printf "\techo File already exists: "
  94.             printf "skipping '\''%s'\''\n", filename
  95.             printf "else\n"
  96.             iflevel++
  97.         }
  98.         printf "echo extracting %s\n", filename
  99.         next
  100.     }
  101.     /^if NOT EXIST/ && $5 == "%2"{
  102.         dir = substr(filename, 1, length($6))
  103.         printf "[ -d '\''%s'\'' ] ||\n", dir
  104.         printf "\tmkdir '\''%s'\''\n", dir
  105.         next
  106.     }
  107.     /^:\|$/{
  108.         if(decodeflg == 0){
  109.             decodeflg = 1
  110.             printf "uudecode << '\''%s'\''\nbegin 644 ", eofmark
  111.             catlevel++
  112.             if(textmode || convsjis) print tmpname; \
  113.              else print filename
  114.         } else {
  115.             decodeflg = 0
  116.             printf "`\nend\n%s\n", eofmark; catlevel = 0
  117.             if(textmode || convsjis){
  118.                 if(textmode){ # includes text&&conv
  119.                     printf "%s", trimcr
  120.                 } else {
  121.                     printf "%s", fromsjis
  122.                 }
  123.                 printf " < '\''%s'\''", tmpname
  124.                 if(convsjis && textmode){
  125.                     printf " | %s", fromsjis
  126.                 }
  127.                 printf " > '\''%s'\'' &&\n", filename
  128.                 printf "\trm '\''%s'\'' ||\n\techo ", tmpname
  129.                 if(convsjis){
  130.                     printf "converting from ShiftJIS"
  131.                 } else {            
  132.                     printf "trailing '\''CR & ^Z'\''"
  133.                 }
  134.                 printf " of '\''%s'\'' failed\n", filename
  135.             }
  136.             printf "chmod u+r '\''%s'\'' 2>/dev/null\n", filename
  137.             printf "[ -f '\''%s'\'' ] ||\n", filename
  138.             printf "\techo failed extracting '\''%s'\''\n", \
  139.               filename
  140.         }
  141.         next
  142.     }
  143.     decodeflg != 0{
  144.         if($0 !~ /^:/){
  145.             cannot = 1; exit
  146.         }
  147.         printf "%c%s\n", 32 + int((length($0) - 1) * 3 / 4), \
  148.           substr($0, 2)
  149.         next
  150.     }
  151.     /^if NOT ERR/ && $6 ~ /:[0-9A-Za-z]*[13579BDFbdf]\//{
  152.         printf "chmod a-w '\''%s'\'' ||\n", filename
  153.         printf "\techo restore attribute of '\''%s'\'' failed\n", \
  154.           filename
  155.         next
  156.     }
  157.     /^if NOT ERR/ && $6 ~ /:[0-9A-Za-z]+\.$/{
  158.         datestr = sprintf("%10s", $6)
  159.         year = (int((ctoi[substr(datestr, 6, 1)] * 16 + \
  160.                  ctoi[substr(datestr, 7, 1)]) / 2) + 1980) % 100
  161.         mon  = (int((ctoi[substr(datestr, 7, 1)] * 16 + \
  162.                  ctoi[substr(datestr, 8, 1)]) / 2)) % 16
  163.         day  = (int((ctoi[substr(datestr, 8, 1)] * 16 + \
  164.                  ctoi[substr(datestr, 9, 1)]))) % 32
  165.         hour = (int((ctoi[substr(datestr, 2, 1)] * 16 + \
  166.                  ctoi[substr(datestr, 3, 1)]) / 8)) % 32
  167.         minu = (int((ctoi[substr(datestr, 3, 1)] * 16 + \
  168.                  ctoi[substr(datestr, 4, 1)]) / 2)) % 64
  169.         seco = (int((ctoi[substr(datestr, 4, 1)] * 32 + \
  170.                  ctoi[substr(datestr, 5, 1)]) * 2)) % 64
  171.         if(0'$Touch' == 0) printf ": "
  172.         if(0'$Touch' == 2) printf "/usr/5bin/"
  173.         printf "touch %02d%02d%02d%02d%02d '\''%s'\'' ||\n", \
  174.           mon, day, hour, minu, year, filename
  175.         printf "\techo restore time-stamp of '\''%s'\'' failed\n", \
  176.           filename
  177.         next
  178.     }
  179.     END{
  180.         if(catlevel) print eofmark; catlevel = 0
  181.         for(; iflevel > 0; iflevel--) print "fi"
  182.         if(cannot){
  183.             print "echo This archive cannot be unbundled by " \
  184.                 "this version of undshar.; exit 1"
  185.             exit
  186.         }
  187.         if(!okflg){
  188.             print "echo Archive not found '\''!?'\''; exit 1"
  189.             exit
  190.         }
  191.         if(!endflg){
  192.             print "echo Short archive'\''?!?'\''; exit 1"
  193.             exit
  194.         }
  195.         if(igextflg){ # only warning
  196.             print "echo Ignoring extra commands near EOF..."
  197.         }
  198.         print "exit 0 # Just in case..."
  199.     }
  200. ' | {
  201.     [ "$Notexec" = 1 ] && cat || sh
  202. }
  203.