1#! /bin/sh 2# $NetBSD: mkinit.sh,v 1.7 2016/03/27 14:34:46 christos Exp $ 3 4# Copyright (c) 2003 The NetBSD Foundation, Inc. 5# All rights reserved. 6# 7# This code is derived from software contributed to The NetBSD Foundation 8# by David Laight. 9# 10# Redistribution and use in source and binary forms, with or without 11# modification, are permitted provided that the following conditions 12# are met: 13# 1. Redistributions of source code must retain the above copyright 14# notice, this list of conditions and the following disclaimer. 15# 2. Redistributions in binary form must reproduce the above copyright 16# notice, this list of conditions and the following disclaimer in the 17# documentation and/or other materials provided with the distribution. 18# 19# THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 20# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 21# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 22# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 23# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 24# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 25# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 26# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 27# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 28# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 29# POSSIBILITY OF SUCH DAMAGE. 30 31srcs="$*" 32 33nl=' 34' 35openparen='(' 36backslash='\' 37 38includes=' "shell.h" "mystring.h" "init.h" ' 39defines= 40decles= 41event_init= 42event_reset= 43event_shellproc= 44 45for src in $srcs; do 46 exec <$src 47 decnl="$nl" 48 while IFS=; read -r line; do 49 [ "$line" = x ] 50 case "$line " in 51 INIT["{ "]* ) event=init;; 52 RESET["{ "]* ) event=reset;; 53 SHELLPROC["{ "]* ) event=shellproc;; 54 INCLUDE[\ \ ]* ) 55 IFS=' ' 56 set -- $line 57 # ignore duplicates 58 [ "${includes}" != "${includes% $2 *}" ] && continue 59 includes="$includes$2 " 60 continue 61 ;; 62 MKINIT\ ) 63 # struct declaration 64 decles="$decles$nl" 65 while 66 read -r line 67 decles="${decles}${line}${nl}" 68 [ "$line" != "};" ] 69 do 70 : 71 done 72 decnl="$nl" 73 continue 74 ;; 75 MKINIT["{ "]* ) 76 # strip initialiser 77 def=${line#MKINIT} 78 comment="${def#*;}" 79 def="${def%;$comment}" 80 def="${def%%=*}" 81 def="${def% }" 82 decles="${decles}${decnl}extern${def};${comment}${nl}" 83 decnl= 84 continue 85 ;; 86 \#define[\ \ ]* ) 87 IFS=' ' 88 set -- $line 89 # Ignore those with arguments 90 [ "$2" = "${2##*$openparen}" ] || continue 91 # and multiline definitions 92 [ "$line" = "${line%$backslash}" ] || continue 93 defines="${defines}#undef $2${nl}${line}${nl}" 94 continue 95 ;; 96 * ) continue;; 97 esac 98 # code for events 99 ev="${nl} /* from $src: */${nl} {${nl}" 100 # Indent the text by an extra <tab> 101 while 102 read -r line 103 [ "$line" != "}" ] 104 do 105 [ -n "$line" -a "$line" = "${line###}" ] && 106 line=" $line" 107 ev="${ev}${line}${nl}" 108 done 109 ev="${ev} }${nl}" 110 eval event_$event=\"\$event_$event\$ev\" 111 done 112done 113 114exec >init.c.tmp 115 116echo "/*" 117echo " * This file was generated by the mkinit program." 118echo " */" 119echo 120 121IFS=' ' 122for f in $includes; do 123 echo "#include $f" 124done 125 126echo 127echo 128echo 129echo "$defines" 130echo 131echo "$decles" 132echo 133echo 134echo "/*" 135echo " * Initialization code." 136echo " */" 137echo 138echo "void" 139echo "init(void)" 140echo "{" 141echo "${event_init}" 142echo "}" 143echo 144echo 145echo 146echo "/*" 147echo " * This routine is called when an error or an interrupt occurs in an" 148echo " * interactive shell and control is returned to the main command loop." 149echo " */" 150echo 151echo "void" 152echo "reset(void)" 153echo "{" 154echo "${event_reset}" 155echo "}" 156echo 157echo 158echo 159echo "/*" 160echo " * This routine is called to initialize the shell to run a shell procedure." 161echo " */" 162echo 163echo "void" 164echo "initshellproc(void)" 165echo "{" 166echo "${event_shellproc}" 167echo "}" 168 169exec >&- 170mv init.c.tmp init.c 171