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