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