Blame view

scripts/tags.sh 9.49 KB
93209d65c   Michal Marek   tags: Unify emacs...
1
  #!/bin/bash
a680eedc6   Sam Ravnborg   tags and cscope s...
2
3
4
5
6
7
  # Generate tags or cscope files
  # Usage tags.sh <mode>
  #
  # mode may be any of: tags, TAGS, cscope
  #
  # Uses the following environment variables:
a8bac511c   Michal Marek   tags: Use $SRCARCH
8
  # ARCH, SUBARCH, SRCARCH, srctree, src, obj
a680eedc6   Sam Ravnborg   tags and cscope s...
9

a6ba0cb35   Jiri Slaby   kbuild: fix strin...
10
  if [ "$KBUILD_VERBOSE" = "1" ]; then
a680eedc6   Sam Ravnborg   tags and cscope s...
11
12
  	set -x
  fi
ae63b2d7b   Prarit Bhargava   scripts/tags.sh: ...
13
14
15
16
  # RCS_FIND_IGNORE has escaped ()s -- remove them.
  ignore="$(echo "$RCS_FIND_IGNORE" | sed 's|\\||g' )"
  # tags and cscope files should also ignore MODVERSION *.mod.c files
  ignore="$ignore ( -name *.mod.c ) -prune -o"
a680eedc6   Sam Ravnborg   tags and cscope s...
17

4431d4ce9   John Kacur   tags: Fix spellin...
18
  # Do not use full path if we do not use O=.. builds
e93bc1a0c   Michal Marek   Revert "kbuild: s...
19
20
  # Use make O=. {tags|cscope}
  # to force full paths for a non-O= build
a6ba0cb35   Jiri Slaby   kbuild: fix strin...
21
  if [ "${KBUILD_SRC}" = "" ]; then
a680eedc6   Sam Ravnborg   tags and cscope s...
22
23
  	tree=
  else
709cc372c   Jiri Slaby   kbuild: fix make ...
24
  	tree=${srctree}/
a680eedc6   Sam Ravnborg   tags and cscope s...
25
  fi
8c38a5328   Konstantin Khlebnikov   scripts/tags.sh: ...
26
27
  # ignore userspace tools
  ignore="$ignore ( -path ${tree}tools ) -prune -o"
bc75cc6b5   John Kacur   tags: Add the abi...
28
29
30
31
32
33
34
35
  # Find all available archs
  find_all_archs()
  {
  	ALLSOURCE_ARCHS=""
  	for arch in `ls ${tree}arch`; do
  		ALLSOURCE_ARCHS="${ALLSOURCE_ARCHS} "${arch##\/}
  	done
  }
4f628248a   Jike Song   kbuild: reintrodu...
36
37
38
  # Detect if ALLSOURCE_ARCHS is set. If not, we assume SRCARCH
  if [ "${ALLSOURCE_ARCHS}" = "" ]; then
  	ALLSOURCE_ARCHS=${SRCARCH}
bc75cc6b5   John Kacur   tags: Add the abi...
39
40
  elif [ "${ALLSOURCE_ARCHS}" = "all" ]; then
  	find_all_archs
4f628248a   Jike Song   kbuild: reintrodu...
41
  fi
a680eedc6   Sam Ravnborg   tags and cscope s...
42
43
44
  # find sources in arch/$ARCH
  find_arch_sources()
  {
f81b1be40   Guennadi Liakhovetski   tags: include hea...
45
46
47
  	for i in $archincludedir; do
  		prune="$prune -wholename $i -prune -o"
  	done
9b24a15d8   Yann Droneaud   scripts/tags.sh: ...
48
49
  	find ${tree}arch/$1 $ignore $subarchprune $prune -name "$2" \
  		-not -type l -print;
a680eedc6   Sam Ravnborg   tags and cscope s...
50
51
52
53
54
  }
  
  # find sources in arch/$1/include
  find_arch_include_sources()
  {
596585090   Joonsoo Kim   scripts/tags.sh: ...
55
56
  	include=$(find ${tree}arch/$1/ $subarchprune \
  					-name include -type d -print);
f81b1be40   Guennadi Liakhovetski   tags: include hea...
57
58
  	if [ -n "$include" ]; then
  		archincludedir="$archincludedir $include"
9b24a15d8   Yann Droneaud   scripts/tags.sh: ...
59
  		find $include $ignore -name "$2" -not -type l -print;
f81b1be40   Guennadi Liakhovetski   tags: include hea...
60
  	fi
a680eedc6   Sam Ravnborg   tags and cscope s...
61
62
63
64
65
  }
  
  # find sources in include/
  find_include_sources()
  {
9b24a15d8   Yann Droneaud   scripts/tags.sh: ...
66
67
  	find ${tree}include $ignore -name config -prune -o -name "$1" \
  		-not -type l -print;
a680eedc6   Sam Ravnborg   tags and cscope s...
68
69
70
71
72
73
74
75
  }
  
  # find sources in rest of tree
  # we could benefit from a list of dirs to search in here
  find_other_sources()
  {
  	find ${tree}* $ignore \
  	     \( -name include -o -name arch -o -name '.tmp_*' \) -prune -o \
9b24a15d8   Yann Droneaud   scripts/tags.sh: ...
76
  	       -name "$1" -not -type l -print;
a680eedc6   Sam Ravnborg   tags and cscope s...
77
78
79
80
  }
  
  find_sources()
  {
709cc372c   Jiri Slaby   kbuild: fix make ...
81
  	find_arch_sources $1 "$2"
a680eedc6   Sam Ravnborg   tags and cscope s...
82
83
84
85
  }
  
  all_sources()
  {
a8bac511c   Michal Marek   tags: Use $SRCARCH
86
  	find_arch_include_sources ${SRCARCH} '*.[chS]'
a680eedc6   Sam Ravnborg   tags and cscope s...
87
  	if [ ! -z "$archinclude" ]; then
709cc372c   Jiri Slaby   kbuild: fix make ...
88
  		find_arch_include_sources $archinclude '*.[chS]'
a680eedc6   Sam Ravnborg   tags and cscope s...
89
  	fi
4f628248a   Jike Song   kbuild: reintrodu...
90
  	find_include_sources '*.[chS]'
f81b1be40   Guennadi Liakhovetski   tags: include hea...
91
92
93
94
  	for arch in $ALLSOURCE_ARCHS
  	do
  		find_sources $arch '*.[chS]'
  	done
4f628248a   Jike Song   kbuild: reintrodu...
95
  	find_other_sources '*.[chS]'
a680eedc6   Sam Ravnborg   tags and cscope s...
96
  }
923e02ecf   Joonsoo Kim   scripts/tags.sh: ...
97
98
99
100
101
102
  all_compiled_sources()
  {
  	for i in $(all_sources); do
  		case "$i" in
  			*.[cS])
  				j=${i/\.[cS]/\.o}
cbf52a3e6   Robert Jarzmik   tags: honor COMPI...
103
  				j="${j#$tree}"
923e02ecf   Joonsoo Kim   scripts/tags.sh: ...
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
  				if [ -e $j ]; then
  					echo $i
  				fi
  				;;
  			*)
  				echo $i
  				;;
  		esac
  	done
  }
  
  all_target_sources()
  {
  	if [ -n "$COMPILED_SOURCE" ]; then
  		all_compiled_sources
  	else
  		all_sources
  	fi
  }
a680eedc6   Sam Ravnborg   tags and cscope s...
123
124
  all_kconfigs()
  {
7659c655b   Hou Tao   scripts/tags.sh: ...
125
126
  	find ${tree}arch/ -maxdepth 1 $ignore \
  	       -name "Kconfig*" -not -type l -print;
953fae66d   Alexey Dobriyan   kbuild: fix tags ...
127
128
129
130
  	for arch in $ALLSOURCE_ARCHS; do
  		find_sources $arch 'Kconfig*'
  	done
  	find_other_sources 'Kconfig*'
a680eedc6   Sam Ravnborg   tags and cscope s...
131
  }
a680eedc6   Sam Ravnborg   tags and cscope s...
132
133
  docscope()
  {
923e02ecf   Joonsoo Kim   scripts/tags.sh: ...
134
  	(echo \-k; echo \-q; all_target_sources) > cscope.files
a680eedc6   Sam Ravnborg   tags and cscope s...
135
136
  	cscope -b -f cscope.out
  }
f4ed1009f   Jianbin Kang   kbuild: add GNU G...
137
138
  dogtags()
  {
923e02ecf   Joonsoo Kim   scripts/tags.sh: ...
139
  	all_target_sources | gtags -i -f -
f4ed1009f   Jianbin Kang   kbuild: add GNU G...
140
  }
93209d65c   Michal Marek   tags: Unify emacs...
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
  # Basic regular expressions with an optional /kind-spec/ for ctags and
  # the following limitations:
  # - No regex modifiers
  # - Use \{0,1\} instead of \?, because etags expects an unescaped ?
  # - \s is not working with etags, use a space or [ \t]
  # - \w works, but does not match underscores in etags
  # - etags regular expressions have to match at the start of a line;
  #   a ^[^#] is prepended by setup_regex unless an anchor is already present
  regex_asm=(
  	'/^\(ENTRY\|_GLOBAL\)(\([[:alnum:]_\\]*\)).*/\2/'
  )
  regex_c=(
  	'/^SYSCALL_DEFINE[0-9](\([[:alnum:]_]*\).*/sys_\1/'
  	'/^COMPAT_SYSCALL_DEFINE[0-9](\([[:alnum:]_]*\).*/compat_sys_\1/'
  	'/^TRACE_EVENT(\([[:alnum:]_]*\).*/trace_\1/'
  	'/^TRACE_EVENT(\([[:alnum:]_]*\).*/trace_\1_rcuidle/'
  	'/^DEFINE_EVENT([^,)]*, *\([[:alnum:]_]*\).*/trace_\1/'
  	'/^DEFINE_EVENT([^,)]*, *\([[:alnum:]_]*\).*/trace_\1_rcuidle/'
0a9e7da66   Naveen N. Rao   scripts/tags.sh: ...
159
160
  	'/^DEFINE_INSN_CACHE_OPS(\([[:alnum:]_]*\).*/get_\1_slot/'
  	'/^DEFINE_INSN_CACHE_OPS(\([[:alnum:]_]*\).*/free_\1_slot/'
93209d65c   Michal Marek   tags: Unify emacs...
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
  	'/^PAGEFLAG(\([[:alnum:]_]*\).*/Page\1/'
  	'/^PAGEFLAG(\([[:alnum:]_]*\).*/SetPage\1/'
  	'/^PAGEFLAG(\([[:alnum:]_]*\).*/ClearPage\1/'
  	'/^TESTSETFLAG(\([[:alnum:]_]*\).*/TestSetPage\1/'
  	'/^TESTPAGEFLAG(\([[:alnum:]_]*\).*/Page\1/'
  	'/^SETPAGEFLAG(\([[:alnum:]_]*\).*/SetPage\1/'
  	'/\<__SETPAGEFLAG(\([[:alnum:]_]*\).*/__SetPage\1/'
  	'/\<TESTCLEARFLAG(\([[:alnum:]_]*\).*/TestClearPage\1/'
  	'/\<__TESTCLEARFLAG(\([[:alnum:]_]*\).*/TestClearPage\1/'
  	'/\<CLEARPAGEFLAG(\([[:alnum:]_]*\).*/ClearPage\1/'
  	'/\<__CLEARPAGEFLAG(\([[:alnum:]_]*\).*/__ClearPage\1/'
  	'/^__PAGEFLAG(\([[:alnum:]_]*\).*/__SetPage\1/'
  	'/^__PAGEFLAG(\([[:alnum:]_]*\).*/__ClearPage\1/'
  	'/^PAGEFLAG_FALSE(\([[:alnum:]_]*\).*/Page\1/'
  	'/\<TESTSCFLAG(\([[:alnum:]_]*\).*/TestSetPage\1/'
  	'/\<TESTSCFLAG(\([[:alnum:]_]*\).*/TestClearPage\1/'
  	'/\<SETPAGEFLAG_NOOP(\([[:alnum:]_]*\).*/SetPage\1/'
  	'/\<CLEARPAGEFLAG_NOOP(\([[:alnum:]_]*\).*/ClearPage\1/'
  	'/\<__CLEARPAGEFLAG_NOOP(\([[:alnum:]_]*\).*/__ClearPage\1/'
  	'/\<TESTCLEARFLAG_FALSE(\([[:alnum:]_]*\).*/TestClearPage\1/'
632c0a1af   Vladimir Davydov   mm: clean up non-...
181
182
183
  	'/^PAGE_MAPCOUNT_OPS(\([[:alnum:]_]*\).*/Page\1/'
  	'/^PAGE_MAPCOUNT_OPS(\([[:alnum:]_]*\).*/__SetPage\1/'
  	'/^PAGE_MAPCOUNT_OPS(\([[:alnum:]_]*\).*/__ClearPage\1/'
93209d65c   Michal Marek   tags: Unify emacs...
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
  	'/^TASK_PFA_TEST([^,]*, *\([[:alnum:]_]*\))/task_\1/'
  	'/^TASK_PFA_SET([^,]*, *\([[:alnum:]_]*\))/task_set_\1/'
  	'/^TASK_PFA_CLEAR([^,]*, *\([[:alnum:]_]*\))/task_clear_\1/'
  	'/^DEF_MMIO_\(IN\|OUT\)_[XD](\([[:alnum:]_]*\),[^)]*)/\2/'
  	'/^DEBUGGER_BOILERPLATE(\([[:alnum:]_]*\))/\1/'
  	'/^DEF_PCI_AC_\(\|NO\)RET(\([[:alnum:]_]*\).*/\2/'
  	'/^PCI_OP_READ(\(\w*\).*[1-4])/pci_bus_read_config_\1/'
  	'/^PCI_OP_WRITE(\(\w*\).*[1-4])/pci_bus_write_config_\1/'
  	'/\<DEFINE_\(MUTEX\|SEMAPHORE\|SPINLOCK\)(\([[:alnum:]_]*\)/\2/v/'
  	'/\<DEFINE_\(RAW_SPINLOCK\|RWLOCK\|SEQLOCK\)(\([[:alnum:]_]*\)/\2/v/'
  	'/\<DECLARE_\(RWSEM\|COMPLETION\)(\([[:alnum:]_]\+\)/\2/v/'
  	'/\<DECLARE_BITMAP(\([[:alnum:]_]*\)/\1/v/'
  	'/\(^\|\s\)\(\|L\|H\)LIST_HEAD(\([[:alnum:]_]*\)/\3/v/'
  	'/\(^\|\s\)RADIX_TREE(\([[:alnum:]_]*\)/\2/v/'
  	'/\<DEFINE_PER_CPU([^,]*, *\([[:alnum:]_]*\)/\1/v/'
  	'/\<DEFINE_PER_CPU_SHARED_ALIGNED([^,]*, *\([[:alnum:]_]*\)/\1/v/'
  	'/\<DECLARE_WAIT_QUEUE_HEAD(\([[:alnum:]_]*\)/\1/v/'
  	'/\<DECLARE_\(TASKLET\|WORK\|DELAYED_WORK\)(\([[:alnum:]_]*\)/\2/v/'
93209d65c   Michal Marek   tags: Unify emacs...
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
  	'/\(^\s\)OFFSET(\([[:alnum:]_]*\)/\2/v/'
  	'/\(^\s\)DEFINE(\([[:alnum:]_]*\)/\2/v/'
  	'/\<DEFINE_HASHTABLE(\([[:alnum:]_]*\)/\1/v/'
  )
  regex_kconfig=(
  	'/^[[:blank:]]*\(menu\|\)config[[:blank:]]\+\([[:alnum:]_]\+\)/\2/'
  	'/^[[:blank:]]*\(menu\|\)config[[:blank:]]\+\([[:alnum:]_]\+\)/CONFIG_\2/'
  )
  setup_regex()
  {
  	local mode=$1 lang tmp=() r
  	shift
  
  	regex=()
  	for lang; do
  		case "$lang" in
  		asm)       tmp=("${regex_asm[@]}") ;;
  		c)         tmp=("${regex_c[@]}") ;;
  		kconfig)   tmp=("${regex_kconfig[@]}") ;;
  		esac
  		for r in "${tmp[@]}"; do
  			if test "$mode" = "exuberant"; then
  				regex[${#regex[@]}]="--regex-$lang=${r}b"
  			else
  				# Remove ctags /kind-spec/
  				case "$r" in
  				/*/*/?/)
  					r=${r%?/}
  				esac
  				# Prepend ^[^#] unless already anchored
  				case "$r" in
  				/^*) ;;
  				*)
  					r="/^[^#]*${r#/}"
  				esac
  				regex[${#regex[@]}]="--regex=$r"
  			fi
  		done
  	done
  }
a680eedc6   Sam Ravnborg   tags and cscope s...
242
243
  exuberant()
  {
93209d65c   Michal Marek   tags: Unify emacs...
244
  	setup_regex exuberant asm c
923e02ecf   Joonsoo Kim   scripts/tags.sh: ...
245
  	all_target_sources | xargs $1 -a                        \
6cf3a6eff   Michael Opdenacker   scripts/tags.sh: ...
246
  	-I __initdata,__exitdata,__initconst,			\
22c1587ad   Paul Gortmaker   init: delete the ...
247
  	-I __initdata_memblock					\
f5a82137a   Kirill Tkhai   scripts/tags.sh: ...
248
  	-I __refdata,__attribute,__maybe_unused,__always_unused \
1b2643f0d   Kirill Tkhai   scripts/tags.sh: ...
249
250
  	-I __acquires,__releases,__deprecated			\
  	-I __read_mostly,__aligned,____cacheline_aligned        \
a680eedc6   Sam Ravnborg   tags and cscope s...
251
  	-I ____cacheline_aligned_in_smp                         \
f5a82137a   Kirill Tkhai   scripts/tags.sh: ...
252
  	-I __cacheline_aligned,__cacheline_aligned_in_smp	\
a680eedc6   Sam Ravnborg   tags and cscope s...
253
  	-I ____cacheline_internodealigned_in_smp                \
1b2643f0d   Kirill Tkhai   scripts/tags.sh: ...
254
  	-I __used,__packed,__packed2__,__must_check,__must_hold	\
f5a82137a   Kirill Tkhai   scripts/tags.sh: ...
255
  	-I EXPORT_SYMBOL,EXPORT_SYMBOL_GPL,ACPI_EXPORT_SYMBOL   \
7db86dc97   Stefani Seibold   ctags: usability fix
256
  	-I DEFINE_TRACE,EXPORT_TRACEPOINT_SYMBOL,EXPORT_TRACEPOINT_SYMBOL_GPL \
1b2643f0d   Kirill Tkhai   scripts/tags.sh: ...
257
  	-I static,const						\
d0c75f33f   Mathieu Maret   scripts/tags.sh: ...
258
259
  	--extra=+fq --c-kinds=+px --fields=+iaS --langmap=c:+.h \
  	"${regex[@]}"
a680eedc6   Sam Ravnborg   tags and cscope s...
260

93209d65c   Michal Marek   tags: Unify emacs...
261
  	setup_regex exuberant kconfig
a680eedc6   Sam Ravnborg   tags and cscope s...
262
  	all_kconfigs | xargs $1 -a                              \
93209d65c   Michal Marek   tags: Unify emacs...
263
  	--langdef=kconfig --language-force=kconfig "${regex[@]}"
a680eedc6   Sam Ravnborg   tags and cscope s...
264

a680eedc6   Sam Ravnborg   tags and cscope s...
265
266
267
268
  }
  
  emacs()
  {
93209d65c   Michal Marek   tags: Unify emacs...
269
270
  	setup_regex emacs asm c
  	all_target_sources | xargs $1 -a "${regex[@]}"
a680eedc6   Sam Ravnborg   tags and cscope s...
271

93209d65c   Michal Marek   tags: Unify emacs...
272
273
  	setup_regex emacs kconfig
  	all_kconfigs | xargs $1 -a "${regex[@]}"
a680eedc6   Sam Ravnborg   tags and cscope s...
274
275
276
277
278
279
280
281
282
  }
  
  xtags()
  {
  	if $1 --version 2>&1 | grep -iq exuberant; then
  		exuberant $1
  	elif $1 --version 2>&1 | grep -iq emacs; then
  		emacs $1
  	else
923e02ecf   Joonsoo Kim   scripts/tags.sh: ...
283
  		all_target_sources | xargs $1 -a
bb66fc671   Masahiro Yamada   kbuild: trivial -...
284
  	fi
a680eedc6   Sam Ravnborg   tags and cscope s...
285
  }
a680eedc6   Sam Ravnborg   tags and cscope s...
286
  # Support um (which uses SUBARCH)
a6ba0cb35   Jiri Slaby   kbuild: fix strin...
287
288
  if [ "${ARCH}" = "um" ]; then
  	if [ "$SUBARCH" = "i386" ]; then
a680eedc6   Sam Ravnborg   tags and cscope s...
289
  		archinclude=x86
a6ba0cb35   Jiri Slaby   kbuild: fix strin...
290
  	elif [ "$SUBARCH" = "x86_64" ]; then
a680eedc6   Sam Ravnborg   tags and cscope s...
291
292
293
294
  		archinclude=x86
  	else
  		archinclude=${SUBARCH}
  	fi
596585090   Joonsoo Kim   scripts/tags.sh: ...
295
296
297
  elif [ "${SRCARCH}" = "arm" -a "${SUBARCH}" != "" ]; then
  	subarchdir=$(find ${tree}arch/$SRCARCH/ -name "mach-*" -type d -o \
  							-name "plat-*" -type d);
779d5eb37   Sam Protsenko   scripts/tags.sh: ...
298
299
300
301
302
303
304
305
306
307
308
309
310
311
  	mach_suffix=$SUBARCH
  	plat_suffix=$SUBARCH
  
  	# Special cases when $plat_suffix != $mach_suffix
  	case $mach_suffix in
  		"omap1" | "omap2")
  			plat_suffix="omap"
  			;;
  	esac
  
  	if [ ! -d ${tree}arch/$SRCARCH/mach-$mach_suffix ]; then
  		echo "Warning: arch/arm/mach-$mach_suffix/ not found." >&2
  		echo "         Fix your \$SUBARCH appropriately" >&2
  	fi
596585090   Joonsoo Kim   scripts/tags.sh: ...
312
313
  	for i in $subarchdir; do
  		case "$i" in
779d5eb37   Sam Protsenko   scripts/tags.sh: ...
314
  			*"mach-"${mach_suffix})
596585090   Joonsoo Kim   scripts/tags.sh: ...
315
  				;;
779d5eb37   Sam Protsenko   scripts/tags.sh: ...
316
  			*"plat-"${plat_suffix})
596585090   Joonsoo Kim   scripts/tags.sh: ...
317
318
319
320
321
322
323
  				;;
  			*)
  				subarchprune="$subarchprune \
  						-wholename $i -prune -o"
  				;;
  		esac
  	done
a680eedc6   Sam Ravnborg   tags and cscope s...
324
  fi
66979224c   Yang Bai   scripts: refactor...
325
  remove_structs=
a680eedc6   Sam Ravnborg   tags and cscope s...
326
327
328
329
  case "$1" in
  	"cscope")
  		docscope
  		;;
f4ed1009f   Jianbin Kang   kbuild: add GNU G...
330
331
332
  	"gtags")
  		dogtags
  		;;
a680eedc6   Sam Ravnborg   tags and cscope s...
333
  	"tags")
2e6cb8b0d   Matt Kraai   kbuild: remove a ...
334
  		rm -f tags
a680eedc6   Sam Ravnborg   tags and cscope s...
335
  		xtags ctags
66979224c   Yang Bai   scripts: refactor...
336
  		remove_structs=y
a680eedc6   Sam Ravnborg   tags and cscope s...
337
338
339
  		;;
  
  	"TAGS")
2e6cb8b0d   Matt Kraai   kbuild: remove a ...
340
  		rm -f TAGS
a680eedc6   Sam Ravnborg   tags and cscope s...
341
  		xtags etags
66979224c   Yang Bai   scripts: refactor...
342
  		remove_structs=y
a680eedc6   Sam Ravnborg   tags and cscope s...
343
344
  		;;
  esac
66979224c   Yang Bai   scripts: refactor...
345
346
  
  # Remove structure forward declarations.
0eb043d0e   Stephen Boyd   Subject: [PATCH] ...
347
  if [ -n "$remove_structs" ]; then
66979224c   Yang Bai   scripts: refactor...
348
349
      LANG=C sed -i -e '/^\([a-zA-Z_][a-zA-Z0-9_]*\)\t.*\t\/\^struct \1;.*\$\/;"\tx$/d' $1
  fi