1*906afcb8SAndy Fiddaman######################################################################## 2*906afcb8SAndy Fiddaman# # 3*906afcb8SAndy Fiddaman# This software is part of the ast package # 4*906afcb8SAndy Fiddaman# Copyright (c) 2000-2011 AT&T Intellectual Property # 5*906afcb8SAndy Fiddaman# and is licensed under the # 6*906afcb8SAndy Fiddaman# Eclipse Public License, Version 1.0 # 7*906afcb8SAndy Fiddaman# by AT&T Intellectual Property # 8*906afcb8SAndy Fiddaman# # 9*906afcb8SAndy Fiddaman# A copy of the License is available at # 10*906afcb8SAndy Fiddaman# http://www.eclipse.org/org/documents/epl-v10.html # 11*906afcb8SAndy Fiddaman# (with md5 checksum b35adb5213ca9657e911e9befb180842) # 12*906afcb8SAndy Fiddaman# # 13*906afcb8SAndy Fiddaman# Information and Software Systems Research # 14*906afcb8SAndy Fiddaman# AT&T Research # 15*906afcb8SAndy Fiddaman# Florham Park NJ # 16*906afcb8SAndy Fiddaman# # 17*906afcb8SAndy Fiddaman# Glenn Fowler <gsf@research.att.com> # 18*906afcb8SAndy Fiddaman# # 19*906afcb8SAndy Fiddaman######################################################################## 20*906afcb8SAndy Fiddaman: C language message catalog compiler 21*906afcb8SAndy Fiddaman 22*906afcb8SAndy Fiddaman# NOTE: all variable names match __*__ to avoid clash with msgcpp def vars 23*906afcb8SAndy Fiddaman 24*906afcb8SAndy Fiddaman__command__=msgcc 25*906afcb8SAndy Fiddamaninteger __similar__=30 26*906afcb8SAndy Fiddaman 27*906afcb8SAndy Fiddamancase `(getopts '[-][123:xyz]' opt --xyz; echo 0$opt) 2>/dev/null` in 28*906afcb8SAndy Fiddaman0123) ARGV0="-a $__command__" 29*906afcb8SAndy Fiddaman USAGE=$' 30*906afcb8SAndy Fiddaman[-? 31*906afcb8SAndy Fiddaman@(#)$Id: msgcc (AT&T Labs Research) 2010-10-20 $ 32*906afcb8SAndy Fiddaman] 33*906afcb8SAndy Fiddaman'$USAGE_LICENSE$' 34*906afcb8SAndy Fiddaman[+NAME?msgcc - C language message catalog compiler] 35*906afcb8SAndy Fiddaman[+DESCRIPTION?\bmsgcc\b is a C language message catalog compiler. It accepts 36*906afcb8SAndy Fiddaman \bcc\b(1) style options and arguments. A \bmsgcpp\b(1) \b.mso\b file 37*906afcb8SAndy Fiddaman is generated for each input \b.c\b file. If the \b-c\b option is not 38*906afcb8SAndy Fiddaman specified then a \bgencat\b(1) format \b.msg\b file is generated from 39*906afcb8SAndy Fiddaman the input \b.mso\b and \b.msg\b files. If \b-c\b is not specified then 40*906afcb8SAndy Fiddaman a \b.msg\b suffix is appended to the \b-o\b \afile\a if it doesn\'t 41*906afcb8SAndy Fiddaman already have a suffix. The default output is \ba.out.msg\b if \b-c\b 42*906afcb8SAndy Fiddaman and \b-o\b are not specified.] 43*906afcb8SAndy Fiddaman[+?If \b-M-new\b is not specified then messages are merged with those in the 44*906afcb8SAndy Fiddaman pre-existing \b-o\b file.] 45*906afcb8SAndy Fiddaman[M?Set a \bmsgcc\b specific \aoption\a. \aoption\a may be:]:[-option]{ 46*906afcb8SAndy Fiddaman [+mkmsgs?The \b-o\b file is assumed to be in \bmkmsgs\b(1) format.] 47*906afcb8SAndy Fiddaman [+new?Create a new \b-o\b file.] 48*906afcb8SAndy Fiddaman [+preserve?Messages in the \b-o\b file that are not in new 49*906afcb8SAndy Fiddaman \b.msg\b file arguments are preserved. The default is to 50*906afcb8SAndy Fiddaman either reuse the message numbers with new message text that 51*906afcb8SAndy Fiddaman is similar to the old or to delete the message text, leaving 52*906afcb8SAndy Fiddaman an unused message number.] 53*906afcb8SAndy Fiddaman [+set=\anumber\a?Set the message set number to \anumber\a. The default 54*906afcb8SAndy Fiddaman is \b1\b.] 55*906afcb8SAndy Fiddaman [+similar=\anumber\a?The message text similarity measure threshold. 56*906afcb8SAndy Fiddaman The similarity measure between \aold\a and \anew\a message 57*906afcb8SAndy Fiddaman text is 100*(2*gzip(\aold\a+\anew\a)/(gzip(\aold\a)+gzip(\anew\a))-1), 58*906afcb8SAndy Fiddaman where gzip(\ax\a) is the size of text \ax\a when compressed by 59*906afcb8SAndy Fiddaman \bgzip\b(1). The default threshold is '$__similar__$'. A 60*906afcb8SAndy Fiddaman threshold of \b0\b turns off message replacement, but unused 61*906afcb8SAndy Fiddaman old messages are still deleted. Use \b-M-preserve\b to preserve 62*906afcb8SAndy Fiddaman all old messages.] 63*906afcb8SAndy Fiddaman [+verbose?Trace similar message replacements on the standard error.] 64*906afcb8SAndy Fiddaman} 65*906afcb8SAndy Fiddaman 66*906afcb8SAndy Fiddamanfile ... 67*906afcb8SAndy Fiddaman 68*906afcb8SAndy Fiddaman[+SEE ALSO?\bcc\b(1), \bcpp\b(1), \bgencat\b(1), \bmsggen\b(1), 69*906afcb8SAndy Fiddaman \bmsgcpp\b(1), \bmsgcvt\b(1)] 70*906afcb8SAndy Fiddaman' 71*906afcb8SAndy Fiddaman ;; 72*906afcb8SAndy Fiddaman*) ARGV0="" 73*906afcb8SAndy Fiddaman USAGE="M:[-option] [ cc-options ] file ..." 74*906afcb8SAndy Fiddaman ;; 75*906afcb8SAndy Fiddamanesac 76*906afcb8SAndy Fiddaman 77*906afcb8SAndy Fiddamanusage() 78*906afcb8SAndy Fiddaman{ 79*906afcb8SAndy Fiddaman OPTIND=0 80*906afcb8SAndy Fiddaman getopts $ARGV0 "$USAGE" OPT '-?' 81*906afcb8SAndy Fiddaman exit 2 82*906afcb8SAndy Fiddaman} 83*906afcb8SAndy Fiddaman 84*906afcb8SAndy Fiddamankeys() 85*906afcb8SAndy Fiddaman{ 86*906afcb8SAndy Fiddaman $1 --??keys -- 2>&1 | grep '^".*"$' 87*906afcb8SAndy Fiddaman} 88*906afcb8SAndy Fiddaman 89*906afcb8SAndy Fiddamantypeset -A __index__ 90*906afcb8SAndy Fiddamantypeset __keep__ __text__ __drop__ __oz__ __nz__ __z__ __hit__ __hit_i__ 91*906afcb8SAndy Fiddamantypeset __compile__ __debug__ __mkmsgs__ __preprocess__ 92*906afcb8SAndy Fiddamantypeset __merge__=1 __preserve__ __verbose__ 93*906afcb8SAndy Fiddamaninteger __i__=0 __args__=0 __code__=0 __files__=0 __max__=0 __num__=0 __skip__=0 94*906afcb8SAndy Fiddamaninteger __set__=1 __sources__=0 __cmds__=0 __ndrop__=0 __new__=0 __old__=0 95*906afcb8SAndy Fiddaman__out__=a.out.msg 96*906afcb8SAndy Fiddaman__OUT__= 97*906afcb8SAndy Fiddaman 98*906afcb8SAndy Fiddamancase " $* " in 99*906afcb8SAndy Fiddaman*" --"*|*" -?"*) 100*906afcb8SAndy Fiddaman while getopts $ARGV0 "$USAGE" OPT 101*906afcb8SAndy Fiddaman do case $OPT in 102*906afcb8SAndy Fiddaman *) break ;; 103*906afcb8SAndy Fiddaman esac 104*906afcb8SAndy Fiddaman done 105*906afcb8SAndy Fiddaman ;; 106*906afcb8SAndy Fiddamanesac 107*906afcb8SAndy Fiddamanwhile : 108*906afcb8SAndy Fiddamando case $# in 109*906afcb8SAndy Fiddaman 0) break ;; 110*906afcb8SAndy Fiddaman esac 111*906afcb8SAndy Fiddaman __arg__=$1 112*906afcb8SAndy Fiddaman case $__arg__ in 113*906afcb8SAndy Fiddaman -c) __compile__=1 114*906afcb8SAndy Fiddaman ;; 115*906afcb8SAndy Fiddaman -[DIU]*)__argv__[__args__]=$__arg__ 116*906afcb8SAndy Fiddaman (( __args__++ )) 117*906afcb8SAndy Fiddaman ;; 118*906afcb8SAndy Fiddaman -E) __preprocess__=1 119*906afcb8SAndy Fiddaman ;; 120*906afcb8SAndy Fiddaman -M-debug) 121*906afcb8SAndy Fiddaman __debug__=1 122*906afcb8SAndy Fiddaman ;; 123*906afcb8SAndy Fiddaman -M-mkmsgs) 124*906afcb8SAndy Fiddaman __mkmsgs__=1 125*906afcb8SAndy Fiddaman ;; 126*906afcb8SAndy Fiddaman -M-new) __merge__= 127*906afcb8SAndy Fiddaman ;; 128*906afcb8SAndy Fiddaman -M-perserve) 129*906afcb8SAndy Fiddaman __preserve__=1 130*906afcb8SAndy Fiddaman ;; 131*906afcb8SAndy Fiddaman -M-set=*) 132*906afcb8SAndy Fiddaman __set__=$(msggen -s ${__arg__#*=}.1) 133*906afcb8SAndy Fiddaman ;; 134*906afcb8SAndy Fiddaman -M-similar=*) 135*906afcb8SAndy Fiddaman __similar__=${__arg__#*=} 136*906afcb8SAndy Fiddaman ;; 137*906afcb8SAndy Fiddaman -M-verbose) 138*906afcb8SAndy Fiddaman __verbose__=1 139*906afcb8SAndy Fiddaman ;; 140*906afcb8SAndy Fiddaman -o) case $# in 141*906afcb8SAndy Fiddaman 1) print -u2 $"$__command__: output argument expected" 142*906afcb8SAndy Fiddaman exit 1 143*906afcb8SAndy Fiddaman ;; 144*906afcb8SAndy Fiddaman esac 145*906afcb8SAndy Fiddaman shift 146*906afcb8SAndy Fiddaman __out__=${1%.*}.msg 147*906afcb8SAndy Fiddaman __OUT__=$1 148*906afcb8SAndy Fiddaman ;; 149*906afcb8SAndy Fiddaman [-+]*|*.[aAlLsS]*) 150*906afcb8SAndy Fiddaman ;; 151*906afcb8SAndy Fiddaman *.[cCiI]*|*.[oO]*) 152*906afcb8SAndy Fiddaman case $__arg__ in 153*906afcb8SAndy Fiddaman *.[oO]*);; 154*906afcb8SAndy Fiddaman *) __srcv__[__files__]=$__arg__ 155*906afcb8SAndy Fiddaman (( __sources__++ )) 156*906afcb8SAndy Fiddaman ;; 157*906afcb8SAndy Fiddaman esac 158*906afcb8SAndy Fiddaman __arg__=${__arg__##*/} 159*906afcb8SAndy Fiddaman __arg__=${__arg__%.*}.mso 160*906afcb8SAndy Fiddaman __objv__[__files__]=$__arg__ 161*906afcb8SAndy Fiddaman (( __files__++ )) 162*906afcb8SAndy Fiddaman ;; 163*906afcb8SAndy Fiddaman *.ms[go]) 164*906afcb8SAndy Fiddaman __objv__[__files__]=$__arg__ 165*906afcb8SAndy Fiddaman (( __files__++ )) 166*906afcb8SAndy Fiddaman ;; 167*906afcb8SAndy Fiddaman *) __cmdv__[__cmds__]=$__arg__ 168*906afcb8SAndy Fiddaman (( __cmds__++ )) 169*906afcb8SAndy Fiddaman ;; 170*906afcb8SAndy Fiddaman esac 171*906afcb8SAndy Fiddaman shift 172*906afcb8SAndy Fiddamandone 173*906afcb8SAndy Fiddaman__arg__=${__out__##*/} 174*906afcb8SAndy Fiddaman__arg__=${__arg__%.msg} 175*906afcb8SAndy Fiddamanif [[ -x $__arg__ ]] 176*906afcb8SAndy Fiddamanthen __cmdv__[__cmds__]=$__arg__ 177*906afcb8SAndy Fiddaman (( __cmds__++ )) 178*906afcb8SAndy Fiddamanfi 179*906afcb8SAndy Fiddaman 180*906afcb8SAndy Fiddaman# generate the .mso files 181*906afcb8SAndy Fiddaman 182*906afcb8SAndy Fiddamanif [[ $__OUT__ && $__compile__ ]] 183*906afcb8SAndy Fiddamanthen __objv__[0]=$__OUT__ 184*906afcb8SAndy Fiddamanfi 185*906afcb8SAndy Fiddaman 186*906afcb8SAndy Fiddamanif (( __sources__ )) 187*906afcb8SAndy Fiddamanthen for (( __i__=0; __i__<=__files__; __i__++ )) 188*906afcb8SAndy Fiddaman do if [[ ${__srcv__[__i__]} ]] 189*906afcb8SAndy Fiddaman then if (( __sources__ > 1 )) 190*906afcb8SAndy Fiddaman then print "${__srcv__[__i__]}:" 191*906afcb8SAndy Fiddaman fi 192*906afcb8SAndy Fiddaman if [[ $__preprocess__ ]] 193*906afcb8SAndy Fiddaman then msgcpp "${__argv__[@]}" "${__srcv__[__i__]}" 194*906afcb8SAndy Fiddaman else msgcpp "${__argv__[@]}" "${__srcv__[__i__]}" > "${__objv__[__i__]}" 195*906afcb8SAndy Fiddaman fi 196*906afcb8SAndy Fiddaman fi 197*906afcb8SAndy Fiddaman done 198*906afcb8SAndy Fiddamanfi 199*906afcb8SAndy Fiddaman 200*906afcb8SAndy Fiddaman# combine the .mso and .msg files 201*906afcb8SAndy Fiddaman 202*906afcb8SAndy Fiddamanif [[ ! $__compile__ && ! $__preprocess__ ]] 203*906afcb8SAndy Fiddamanthen if [[ $__merge__ && -r $__out__ ]] 204*906afcb8SAndy Fiddaman then __tmp__=$__out__.tmp 205*906afcb8SAndy Fiddaman trap '__code__=$?; rm -f ${__tmp__}*; exit $__code__' 0 1 2 206*906afcb8SAndy Fiddaman while read -r __line__ 207*906afcb8SAndy Fiddaman do if (( $__skip__ )) 208*906afcb8SAndy Fiddaman then if [[ $__line__ == '%}'* ]] 209*906afcb8SAndy Fiddaman then __skip__=0 210*906afcb8SAndy Fiddaman fi 211*906afcb8SAndy Fiddaman continue 212*906afcb8SAndy Fiddaman fi 213*906afcb8SAndy Fiddaman if [[ $__mkmsgs__ && $__line__ == '%{'* ]] 214*906afcb8SAndy Fiddaman then __skip__=1 215*906afcb8SAndy Fiddaman continue 216*906afcb8SAndy Fiddaman fi 217*906afcb8SAndy Fiddaman if [[ $__mkmsgs__ ]] 218*906afcb8SAndy Fiddaman then if [[ $__line__ == '%#'*';;'* ]] 219*906afcb8SAndy Fiddaman then __line__=${__line__#'%#'} 220*906afcb8SAndy Fiddaman __num__=${__line__%';;'*} 221*906afcb8SAndy Fiddaman read -r __line__ 222*906afcb8SAndy Fiddaman elif [[ $__line__ == %* ]] 223*906afcb8SAndy Fiddaman then continue 224*906afcb8SAndy Fiddaman else print -u2 $"$__command__: unrecognized line=$__line__" 225*906afcb8SAndy Fiddaman __code__=1 226*906afcb8SAndy Fiddaman fi 227*906afcb8SAndy Fiddaman else case $__line__ in 228*906afcb8SAndy Fiddaman +([0-9])' '*) 229*906afcb8SAndy Fiddaman __num__=${__line__%%' '*} 230*906afcb8SAndy Fiddaman __line__=${__line__#*'"'} 231*906afcb8SAndy Fiddaman __line__=${__line__%'"'} 232*906afcb8SAndy Fiddaman ;; 233*906afcb8SAndy Fiddaman *) continue 234*906afcb8SAndy Fiddaman ;; 235*906afcb8SAndy Fiddaman esac 236*906afcb8SAndy Fiddaman fi 237*906afcb8SAndy Fiddaman __index__["$__line__"]=$__num__ 238*906afcb8SAndy Fiddaman __text__[$__num__]=$__line__ 239*906afcb8SAndy Fiddaman if (( __max__ < __num__ )) 240*906afcb8SAndy Fiddaman then (( __max__=__num__ )) 241*906afcb8SAndy Fiddaman fi 242*906afcb8SAndy Fiddaman done < $__out__ 243*906afcb8SAndy Fiddaman (( __new__=__max__+1 )) 244*906afcb8SAndy Fiddaman else __tmp__=$__out__ 245*906afcb8SAndy Fiddaman (( __new__=1 )) 246*906afcb8SAndy Fiddaman fi 247*906afcb8SAndy Fiddaman if (( __code__ )) 248*906afcb8SAndy Fiddaman then exit $__code__ 249*906afcb8SAndy Fiddaman fi 250*906afcb8SAndy Fiddaman exec 1>$__tmp__ 9>&1 251*906afcb8SAndy Fiddaman print -r -- '$'" ${__out__%.msg} message catalog" 252*906afcb8SAndy Fiddaman print -r -- '$translation'" $__command__ $(date +%Y-%m-%d)" 253*906afcb8SAndy Fiddaman print -r -- '$set'" $__set__" 254*906afcb8SAndy Fiddaman print -r -- '$quote "' 255*906afcb8SAndy Fiddaman sort -u "${__objv__[@]}" | { 256*906afcb8SAndy Fiddaman __raw__= 257*906afcb8SAndy Fiddaman while read -r __line__ 258*906afcb8SAndy Fiddaman do __op__=${__line__%% *} 259*906afcb8SAndy Fiddaman __line__=${__line__#* } 260*906afcb8SAndy Fiddaman case $__op__ in 261*906afcb8SAndy Fiddaman cmd) __a1__=${__line__%% *} 262*906afcb8SAndy Fiddaman case $__a1__ in 263*906afcb8SAndy Fiddaman dot_cmd) __a1__=. ;; 264*906afcb8SAndy Fiddaman esac 265*906afcb8SAndy Fiddaman keys $__a1__ 266*906afcb8SAndy Fiddaman ;; 267*906afcb8SAndy Fiddaman def) __a1__=${__line__%% *} 268*906afcb8SAndy Fiddaman __a2__=${__line__#* } 269*906afcb8SAndy Fiddaman eval $__a1__='$'__a2__ 270*906afcb8SAndy Fiddaman ;; 271*906afcb8SAndy Fiddaman str) print -r -- "$__line__" 272*906afcb8SAndy Fiddaman ;; 273*906afcb8SAndy Fiddaman raw) __raw__=$__raw__$'\n'$__line__ 274*906afcb8SAndy Fiddaman ;; 275*906afcb8SAndy Fiddaman var) __a1__=${__line__%% *} 276*906afcb8SAndy Fiddaman __a2__=${__line__#* } 277*906afcb8SAndy Fiddaman case $__a1__ in 278*906afcb8SAndy Fiddaman [[:digit:]]*) 279*906afcb8SAndy Fiddaman eval __v__='$'$__a2__ 280*906afcb8SAndy Fiddaman __v__='"'${__v__:__a1__+1} 281*906afcb8SAndy Fiddaman ;; 282*906afcb8SAndy Fiddaman *) eval __v__='$'$__a1__ 283*906afcb8SAndy Fiddaman ;; 284*906afcb8SAndy Fiddaman esac 285*906afcb8SAndy Fiddaman if [[ $__v__ == '"'*'"' ]] 286*906afcb8SAndy Fiddaman then print -r -- "$__v__" 287*906afcb8SAndy Fiddaman fi 288*906afcb8SAndy Fiddaman ;; 289*906afcb8SAndy Fiddaman [[:digit:]]*) 290*906afcb8SAndy Fiddaman [[ $__preserve__ ]] && print -r -- "$__line__" 291*906afcb8SAndy Fiddaman ;; 292*906afcb8SAndy Fiddaman '$') print -r -u9 $__op__ include $__line__ 293*906afcb8SAndy Fiddaman ;; 294*906afcb8SAndy Fiddaman esac 295*906afcb8SAndy Fiddaman done 296*906afcb8SAndy Fiddaman for (( __i__=0; __i__ < __cmds__; __i__++ )) 297*906afcb8SAndy Fiddaman do keys ${__cmdv__[__i__]} 298*906afcb8SAndy Fiddaman done 299*906afcb8SAndy Fiddaman [[ $__raw__ ]] && print -r "${__raw__#?}" | sed -e 's/^"//' -e 's/"$//' -e 's/\\/&&/g' -e 's/"/\\"/g' -e 's/.*/$RAW$"&"/' 300*906afcb8SAndy Fiddaman } | { 301*906afcb8SAndy Fiddaman __num__=1 302*906afcb8SAndy Fiddaman while read -r __line__ 303*906afcb8SAndy Fiddaman do case $__line__ in 304*906afcb8SAndy Fiddaman '$RAW$'*) 305*906afcb8SAndy Fiddaman ;; 306*906afcb8SAndy Fiddaman '$'[\ \ ]*) 307*906afcb8SAndy Fiddaman print -r -- "$__line__" 308*906afcb8SAndy Fiddaman continue 309*906afcb8SAndy Fiddaman ;; 310*906afcb8SAndy Fiddaman '$'*|*"@(#)"*|*"<"*([[:word:] .-])"@"*([[:word:] .-])">"*([ ])'"'|"http://"*) 311*906afcb8SAndy Fiddaman continue 312*906afcb8SAndy Fiddaman ;; 313*906afcb8SAndy Fiddaman *[[:alpha:]][[:alpha:]]*) 314*906afcb8SAndy Fiddaman ;; 315*906afcb8SAndy Fiddaman *) continue 316*906afcb8SAndy Fiddaman ;; 317*906afcb8SAndy Fiddaman esac 318*906afcb8SAndy Fiddaman __line__=${__line__#*'"'} 319*906afcb8SAndy Fiddaman __line__=${__line__%'"'} 320*906afcb8SAndy Fiddaman if [[ $__line__ ]] 321*906afcb8SAndy Fiddaman then if [[ ${__index__["$__line__"]} ]] 322*906afcb8SAndy Fiddaman then if [[ ! $__preserve__ ]] 323*906afcb8SAndy Fiddaman then __num__=${__index__["$__line__"]} 324*906afcb8SAndy Fiddaman __keep__[$__num__]=1 325*906afcb8SAndy Fiddaman fi 326*906afcb8SAndy Fiddaman else while [[ ${__text__[$__num__]} ]] 327*906afcb8SAndy Fiddaman do (( __num__++ )) 328*906afcb8SAndy Fiddaman done 329*906afcb8SAndy Fiddaman if (( __max__ < __num__ )) 330*906afcb8SAndy Fiddaman then (( __max__=__num__ )) 331*906afcb8SAndy Fiddaman fi 332*906afcb8SAndy Fiddaman if [[ ! $__preserve__ ]] 333*906afcb8SAndy Fiddaman then __keep__[$__num__]=1 334*906afcb8SAndy Fiddaman fi 335*906afcb8SAndy Fiddaman __text__[$__num__]=$__line__ 336*906afcb8SAndy Fiddaman __index__["$__line__"]=$__num__ 337*906afcb8SAndy Fiddaman (( __num__++ )) 338*906afcb8SAndy Fiddaman fi 339*906afcb8SAndy Fiddaman fi 340*906afcb8SAndy Fiddaman done 341*906afcb8SAndy Fiddaman if (( __max__ < __num__ )) 342*906afcb8SAndy Fiddaman then (( __max__=__num__ )) 343*906afcb8SAndy Fiddaman fi 344*906afcb8SAndy Fiddaman if [[ $__debug__ ]] 345*906afcb8SAndy Fiddaman then for (( __num__=1; __num__<=__max__; __num__++ )) 346*906afcb8SAndy Fiddaman do if [[ ${__text__[$__num__]} ]] 347*906afcb8SAndy Fiddaman then if (( __num__ > __new__ )) 348*906afcb8SAndy Fiddaman then if [[ ! ${__keep__[$__num__]} ]] 349*906afcb8SAndy Fiddaman then print -r -u2 -- $__num__ HUH '"'"${__text__[$__num__]}"'"' 350*906afcb8SAndy Fiddaman else print -r -u2 -- $__num__ NEW '"'"${__text__[$__num__]}"'"' 351*906afcb8SAndy Fiddaman fi 352*906afcb8SAndy Fiddaman elif [[ ${__keep__[$__num__]} ]] 353*906afcb8SAndy Fiddaman then print -r -u2 -- $__num__ OLD '"'"${__text__[$__num__]}"'"' 354*906afcb8SAndy Fiddaman else print -r -u2 -- $__num__ XXX '"'"${__text__[$__num__]}"'"' 355*906afcb8SAndy Fiddaman fi 356*906afcb8SAndy Fiddaman fi 357*906afcb8SAndy Fiddaman done 358*906afcb8SAndy Fiddaman exit 0 359*906afcb8SAndy Fiddaman fi 360*906afcb8SAndy Fiddaman # check for replacements 361*906afcb8SAndy Fiddaman if [[ ! $__preserve__ ]] 362*906afcb8SAndy Fiddaman then for (( __num__=1; __num__<__new__; __num__++ )) 363*906afcb8SAndy Fiddaman do if [[ ${__text__[$__num__]} && ! ${__keep__[$__num__]} ]] 364*906afcb8SAndy Fiddaman then (( __ndrop__++ )) 365*906afcb8SAndy Fiddaman __drop__[__ndrop__]=$__num__ 366*906afcb8SAndy Fiddaman fi 367*906afcb8SAndy Fiddaman done 368*906afcb8SAndy Fiddaman [[ $__verbose__ ]] && print -u2 $__command__: old:1-$((__new__-1)) new:$__new__-$__max__ drop $__ndrop__ add $((__max__-__new__+1)) 369*906afcb8SAndy Fiddaman if (( __ndrop__ )) 370*906afcb8SAndy Fiddaman then for (( __i__=1; __i__<=__ndrop__; __i__++ )) 371*906afcb8SAndy Fiddaman do (( __old__=${__drop__[$__i__]} )) 372*906afcb8SAndy Fiddaman __oz__[__i__]=$(print -r -- "\"${__text__[$__old__]}\"" | gzip | wc -c) 373*906afcb8SAndy Fiddaman done 374*906afcb8SAndy Fiddaman for (( __num__=__new__; __num__<=__max__; __num__++ )) 375*906afcb8SAndy Fiddaman do [[ ${__text__[$__num__]} ]] || continue 376*906afcb8SAndy Fiddaman __nz__=$(print -r -- "\"${__text__[$__num__]}\"" | gzip | wc -c) 377*906afcb8SAndy Fiddaman __hit__=0 378*906afcb8SAndy Fiddaman (( __bz__=__similar__ )) 379*906afcb8SAndy Fiddaman for (( __i__=1; __i__<=__ndrop__; __i__++ )) 380*906afcb8SAndy Fiddaman do if (( __old__=${__drop__[$__i__]} )) 381*906afcb8SAndy Fiddaman then __z__=$(print -r -- "\"${__text__[$__old__]}\"""\"${__text__[$__num__]}\"" | gzip | wc -c) 382*906afcb8SAndy Fiddaman (( __z__ = (__z__ * 200 / (${__oz__[__i__]} + $__nz__)) - 100 )) 383*906afcb8SAndy Fiddaman if (( __z__ < __bz__ )) 384*906afcb8SAndy Fiddaman then (( __bz__=__z__ )) 385*906afcb8SAndy Fiddaman (( __hit__=__old__ )) 386*906afcb8SAndy Fiddaman (( __hit_i__=__i__ )) 387*906afcb8SAndy Fiddaman fi 388*906afcb8SAndy Fiddaman fi 389*906afcb8SAndy Fiddaman done 390*906afcb8SAndy Fiddaman if (( __hit__ )) 391*906afcb8SAndy Fiddaman then [[ $__verbose__ ]] && print -u2 $__command__: $__hit__ $__num__ $__bz__ 392*906afcb8SAndy Fiddaman __text__[$__hit__]=${__text__[$__num__]} 393*906afcb8SAndy Fiddaman __keep__[$__hit__]=1 394*906afcb8SAndy Fiddaman __drop__[$__hit_i__]=0 395*906afcb8SAndy Fiddaman __text__[$__num__]= 396*906afcb8SAndy Fiddaman __keep__[$__num__]= 397*906afcb8SAndy Fiddaman fi 398*906afcb8SAndy Fiddaman done 399*906afcb8SAndy Fiddaman fi 400*906afcb8SAndy Fiddaman fi 401*906afcb8SAndy Fiddaman # final output 402*906afcb8SAndy Fiddaman for (( __num__=1; __num__<=__max__; __num__++ )) 403*906afcb8SAndy Fiddaman do if [[ ${__text__[$__num__]} && ( $__preserve__ || ${__keep__[$__num__]} ) ]] 404*906afcb8SAndy Fiddaman then print -r -- $__num__ "\"${__text__[$__num__]}\"" 405*906afcb8SAndy Fiddaman fi 406*906afcb8SAndy Fiddaman done 407*906afcb8SAndy Fiddaman } 408*906afcb8SAndy Fiddaman if [[ $__tmp__ != $__out__ ]] 409*906afcb8SAndy Fiddaman then grep -v '^\$' $__tmp__ > ${__tmp__}n 410*906afcb8SAndy Fiddaman [[ -f $__out__ ]] && grep -v '^\$' $__out__ > ${__tmp__}o 411*906afcb8SAndy Fiddaman cmp -s ${__tmp__}n ${__tmp__}o || { 412*906afcb8SAndy Fiddaman [[ -f $__out__ ]] && mv $__out__ $__out__.old 413*906afcb8SAndy Fiddaman mv $__tmp__ $__out__ 414*906afcb8SAndy Fiddaman } 415*906afcb8SAndy Fiddaman fi 416*906afcb8SAndy Fiddamanfi 417*906afcb8SAndy Fiddamanexit $__code__ 418