wok annotate xz/stuff/lzma @ rev 9342

lzma, xz: add lzma --size
author Pascal Bellard <pascal.bellard@slitaz.org>
date Sat Mar 19 12:43:20 2011 +0100 (2011-03-19)
parents b07e53f0d08e
children 90ab20b44e0f
rev   line source
pascal@4863 1 #!/bin/sh
pascal@4863 2 #
pascal@4863 3 # Wrapper to accept lzma_alone or lzma_utils arguments
pascal@4863 4 #
pascal@4863 5
pascal@4863 6 usage()
pascal@4863 7 {
gokhlayeh@8114 8 status=$?
pascal@4863 9 cat 1>&2 <<EOT
pascal@4863 10 Usage: LZMA <e|d> inputFile outputFile [<switches>...]
pascal@4863 11 e: encode file
pascal@4863 12 d: decode file
pascal@4863 13 <Switches>
pascal@4863 14 -a{N}: set compression mode - [0, 2], default: 1 (max)
pascal@4863 15 -d{N}: set dictionary - [12,30], default: 23 (8MB)
pascal@4863 16 -fb{N}: set number of fast bytes - [2, 273], default: 64
pascal@4863 17 -mc{N}: set number of cycles for match finder
pascal@4863 18 -lc{N}: set number of literal context bits - [0, 3], default: 3
pascal@4863 19 -lp{N}: set number of literal pos bits - [0, 4], default: 0
pascal@4863 20 -pb{N}: set number of pos bits - [0, 4], default: 2
pascal@4863 21 -mf{MF_ID}: set Match Finder: [bt2, bt3, bt4, hc3, hc4], default: bt4
pascal@4863 22 -eos: write End Of Stream marker
pascal@4863 23 -si: read data from stdin
pascal@4863 24 -so: write data to stdout
pascal@4863 25 EOT
gokhlayeh@8114 26 if [ "$1" = error ]; then
gokhlayeh@8114 27 echo -e "\nError"
gokhlayeh@8114 28 exit $status
gokhlayeh@8114 29 else
gokhlayeh@8114 30 exit 0
gokhlayeh@8114 31 fi
pascal@4863 32 }
pascal@4863 33
pascal@4863 34 # Get lzma_alone arg
pascal@4863 35 getarg()
pascal@4863 36 {
pascal@4863 37 case "$1" in
pascal@4863 38 -a0) mode="lzma1=mode=fast";;
pascal@4863 39 -a1) mode="lzma1=mode=normal";;
pascal@4863 40 -a2) mode="lzma2=mode=normal";;
pascal@4863 41 -d*) extra="$extra,dict=$((2 ** ${1#-d}))";;
pascal@4863 42 -fb*) extra="$extra,fb=${1#-fb}";;
pascal@4863 43 -mc*) extra="$extra,depth=${1#-mc}";;
pascal@4863 44 -lc*) extra="$extra,lc=${1#-lc}";;
pascal@4863 45 -lp*) extra="$extra,lp=${1#-lp}";;
pascal@4863 46 -pb*) extra="$extra,pb=${1#-pb}";;
pascal@4863 47 -mf*) extra="$extra,mf=${1#-mf}";;
pascal@4863 48 -eos|-mt*) ;;
pascal@4863 49 -si) output="> ${input#< }"; input="";;
pascal@4863 50 -so) output="";;
pascal@4863 51 *) return 1;;
pascal@4863 52 esac
pascal@4863 53 return 0
pascal@4863 54 }
pascal@4863 55
pascal@4863 56 lzma_utils()
pascal@4863 57 {
pascal@4863 58 args="--format=lzma"
pascal@4863 59 files=""
pascal@4863 60 suffix=lzma
pascal@4863 61 while [ -n "$1" ]; do
pascal@4863 62 case "$1" in
pascal@4863 63 -e) args="$args -z";;
pascal@4863 64 -d|-k|-[0-9]) args="$args $1";;
pascal@4863 65 --fast) args="$args -1";;
pascal@4863 66 --best) args="$args -9";;
pascal@4863 67 -c|--stdout|--to-stdout) args="$args -c";;
pascal@4863 68 -S) suffix=${2#.}; shift;;
pascal@4863 69 -*);;
pascal@4863 70 *) files="$files $1";;
pascal@4863 71 esac
pascal@4863 72 shift
pascal@4863 73 done
pascal@4863 74 for i in $files; do
gokhlayeh@8114 75 xz $args $i || usage error
pascal@4863 76 [ "lzma" == "$suffix" ] || mv ${i%.*}.lzma ${i%.*}.$suffix
pascal@4863 77 done
pascal@4863 78 exit
pascal@4863 79 }
pascal@4863 80
pascal@7616 81 case "$0" in
pascal@7616 82 *unlzma) lzma_utils -d $@ ;;
pascal@7616 83 *lzcat) lzma_utils -c -d $@ ;;
pascal@7616 84 esac
pascal@7616 85
gokhlayeh@8114 86 # First look if help is needed.
gokhlayeh@8114 87 case "$1" in
pascal@9342 88 --version|-V|--help|-h|-\?|'') usage;;
pascal@9342 89 --size) size=$(dd if=$2 bs=1 skip=5 count=8 2> /dev/null | od -t d8 | awk '{ print $2; exit }')
pascal@9342 90 if [ $size -eq -1 ]; then
pascal@9342 91 size=$(unlzma -c $2 | wc -c)
pascal@9342 92 n=$size
pascal@9342 93 for i in $(seq 1 8); do
pascal@9342 94 printf '\\\\x%02X' $(($n & 255))
pascal@9342 95 n=$(($n >> 8))
pascal@9342 96 done | xargs echo -en | dd of=$2 conv=notrunc bs=1 seek=5 2> /dev/null
pascal@9342 97 fi
pascal@9342 98 echo $size
pascal@9342 99 exit ;;
gokhlayeh@8114 100 esac
gokhlayeh@8114 101
pascal@4863 102 # lzma_utils or lzma_alone ?
pascal@4863 103 [ -n "$3" ] || lzma_utils $@
pascal@4863 104 case "$1" in
pascal@4863 105 d) args="-d";;
pascal@4863 106 e) args="-z";;
pascal@4863 107 *) lzma_utils $@;;
pascal@4863 108 esac
pascal@4863 109
pascal@4863 110 # it's lzma_alone
pascal@4863 111 # get filenames
pascal@4863 112 input="< $2"
pascal@4863 113 output="> $2"
pascal@4863 114 shift
pascal@4863 115 if ! getarg "$1"; then
pascal@4863 116 output="> $2"
pascal@4863 117 getarg "$2"
pascal@4863 118 shift
pascal@4863 119 fi
pascal@4863 120
pascal@4863 121 # get arguments
pascal@4863 122 extra=""
pascal@4863 123 mode="lzma1=mode=normal"
pascal@4863 124 while [ -n "$2" ]; do
gokhlayeh@8114 125 getarg "$2" || usage error
pascal@4863 126 shift
pascal@4863 127 done
pascal@4863 128
pascal@4863 129 # fake lzma_alone (-eos -mt1)
gokhlayeh@8114 130 eval xz $args --format=lzma --$mode$extra --stdout $input $output || usage error
pascal@5062 131 if [ -n "$input" -a -n "$output" ]; then
pascal@5062 132 size=$(stat -c "%s" ${input#< })
pascal@5062 133 ascii="00000 "
pascal@5062 134 for i in 1 2 3 4 5 6 7 8; do
pascal@5062 135 ascii="$ascii $(printf "%02x" $((size % 256)) )"
pascal@5062 136 size=$(( $size / 256 ))
pascal@5062 137 done
pascal@5062 138 echo "$ascii | .." | hexdump -R | \
pascal@5062 139 dd of=${output#> } seek=5 bs=1 conv=notrunc 2> /dev/null
pascal@5062 140 fi
gokhlayeh@8114 141 exit 0