xref: /titanic_50/usr/src/cmd/ast/msgcc/msgcc.sh (revision da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968)
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