xref: /titanic_54/usr/src/contrib/ast/src/cmd/msgcc/msgcc.sh (revision 906afcb89d0412cc073b95c2d701a804a8cdb62c)
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