mkinit.sh

来自「Android 一些工具」· Shell 代码 · 共 198 行

SH
198
字号
#! /bin/sh#	$NetBSD: mkinit.sh,v 1.2 2004/06/15 23:09:54 dsl Exp $# Copyright (c) 2003 The NetBSD Foundation, Inc.# All rights reserved.## This code is derived from software contributed to The NetBSD Foundation# by David Laight.## Redistribution and use in source and binary forms, with or without# modification, are permitted provided that the following conditions# are met:# 1. Redistributions of source code must retain the above copyright#    notice, this list of conditions and the following disclaimer.# 2. Redistributions in binary form must reproduce the above copyright#    notice, this list of conditions and the following disclaimer in the#    documentation and/or other materials provided with the distribution.# 3. Neither the name of The NetBSD Foundation nor the names of its#    contributors may be used to endorse or promote products derived#    from this software without specific prior written permission.## THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR# PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE# POSSIBILITY OF SUCH DAMAGE.srcs="$*"nl=''openparen='('backslash='\'includes=' "shell.h" "mystring.h" "init.h" 'defines=decles=event_init=event_reset=event_shellproc=for src in $srcs; do	exec <$src	decnl="$nl"	while IFS=; read -r line; do		[ "$line" = x ]		case "$line " in		INIT["{ 	"]* ) event=init;;		RESET["{ 	"]* ) event=reset;;		SHELLPROC["{ 	"]* ) event=shellproc;;		INCLUDE[\ \	]* )			IFS=' 	'			set -- $line			# ignore duplicates			[ "${includes}" != "${includes%* $2 }" ] && continue			includes="$includes$2 "			continue			;;		MKINIT\  )			# struct declaration			decles="$decles$nl"			while				read -r line				decles="${decles}${line}${nl}"				[ "$line" != "};" ]			do				:			done			decnl="$nl"			continue			;;		MKINIT["{ 	"]* )			# strip initialiser			def=${line#MKINIT}			comment="${def#*;}"			def="${def%;$comment}"			def="${def%%=*}"			def="${def% }"			decles="${decles}${decnl}extern${def};${comment}${nl}"			decnl=			continue			;;		\#define[\ \	]* )			IFS=' 	'			set -- $line			# Ignore those with arguments			[ "$2" = "${2##*$openparen}" ] || continue			# and multiline definitions			[ "$line" = "${line%$backslash}" ] || continue			defines="${defines}#undef  $2${nl}${line}${nl}"			continue			;;		* ) continue;;		esac		# code for events		ev="${nl}      /* from $src: */${nl}      {${nl}"		while			read -r line			[ "$line" != "}" ]		do			# The C program indented by an extra 6 chars using			# tabs then spaces. I need to compare the output :-(			indent=6			while				l=${line#	}				[ "$l" != "$line" ]			do				indent=$(($indent + 8))				line="$l"			done			while				l=${line# }				[ "$l" != "$line" ]			do				indent=$(($indent + 1))				line="$l"			done			[ -z "$line" -o "$line" != "${line###}" ] && indent=0			while				[ $indent -ge 8 ]			do				ev="$ev	"				indent="$(($indent - 8))"			done			while				[ $indent -gt 0 ]			do				ev="$ev "				indent="$(($indent - 1))"			done			ev="${ev}${line}${nl}"		done		ev="${ev}      }${nl}"		eval event_$event=\"\$event_$event\$ev\"	donedoneexec >init.c.tmpecho "/*"echo " * This file was generated by the mkinit program."echo " */"echoIFS=' 'for f in $includes; do	echo "#include $f"doneechoechoechoecho "$defines"echoecho "$decles"echoechoecho "/*"echo " * Initialization code."echo " */"echoecho "void"echo "init() {"echo "${event_init%$nl}"echo "}"echoechoechoecho "/*"echo " * This routine is called when an error or an interrupt occurs in an"echo " * interactive shell and control is returned to the main command loop."echo " */"echoecho "void"echo "reset() {"echo "${event_reset%$nl}"echo "}"echoechoechoecho "/*"echo " * This routine is called to initialize the shell to run a shell procedure."echo " */"echoecho "void"echo "initshellproc() {"echo "${event_shellproc%$nl}"echo "}"exec >&-mv init.c.tmp init.c

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?