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