1#!/bin/sh - 2# $NetBSD: mkbuiltins,v 1.17 2002/11/24 22:35:41 christos Exp $ 3# 4# Copyright (c) 1991, 1993 5# The Regents of the University of California. All rights reserved. 6# Copyright (c) 1997-2005 7# Herbert Xu <herbert@gondor.apana.org.au>. All rights reserved. 8# 9# This code is derived from software contributed to Berkeley by 10# Kenneth Almquist. 11# 12# Redistribution and use in source and binary forms, with or without 13# modification, are permitted provided that the following conditions 14# are met: 15# 1. Redistributions of source code must retain the above copyright 16# notice, this list of conditions and the following disclaimer. 17# 2. Redistributions in binary form must reproduce the above copyright 18# notice, this list of conditions and the following disclaimer in the 19# documentation and/or other materials provided with the distribution. 20# 3. Neither the name of the University nor the names of its contributors 21# may be used to endorse or promote products derived from this software 22# without specific prior written permission. 23# 24# THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 25# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 26# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 27# ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 28# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 29# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 30# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 31# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 32# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 33# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 34# SUCH DAMAGE. 35# 36# @(#)mkbuiltins 8.2 (Berkeley) 5/4/95 37 38tempfile=tempfile 39if ! type tempfile > /dev/null 2>&1 && ! type mktemp > /dev/null 2>&1; then 40 _my_tempfile() 41 { 42 local index=0 43 while test -f "${TMPDIR:-/tmp}/builtin.$$.$index"; do 44 index=`expr $index + 1` 45 done 46 47 touch "${TMPDIR:-/tmp}/builtin.$$.$index" 48 echo "${TMPDIR:-/tmp}/builtin.$$.$index" 49 } 50 51 tempfile="_my_tempfile" 52elif ! type tempfile > /dev/null 2>&1; then 53 tempfile="mktemp ${TMPDIR:-/tmp}/builtin.XXXXXX" 54fi 55 56trap 'rm -f $temp $temp2' EXIT 57temp=$($tempfile) 58temp2=$($tempfile) 59 60builtins=$1 61 62exec > builtins.c 63cat <<\! 64/* 65 * This file was generated by the mkbuiltins program. 66 */ 67 68#include "shell.h" 69#include "builtins.h" 70 71! 72< $builtins sed '/^#/d; /^ *$/d' > $temp 73awk '{ printf "int %s(int, char **);\n", $1}' $temp 74echo ' 75const struct builtincmd builtincmd[] = {' 76awk '{ for (i = 2 ; i <= NF ; i++) { 77 line = $i "\t" $1 78 if ($i ~ /^-/) 79 line = $(++i) "\t" line 80 print line 81 }}' $temp | LC_ALL= LC_COLLATE=C sort -k 1,1 | tee $temp2 | awk '{ 82 opt = "" 83 if (NF > 2) { 84 opt = substr($2, 2) 85 $2 = $3 86 } 87 mask = 0 88 cmd = $2 89 if (opt ~ /n/) { cmd = "NULL" } 90 if (opt ~ /s/) { mask += 1 } 91 if (opt ~ /[su]/) { mask += 2 } 92 if (opt ~ /a/) { mask += 4 } 93 if (opt ~ /w/) { mask += 8 } 94 printf "\t{ \"%s\", %s, %d },\n", $1, cmd, mask 95 }' 96echo '};' 97 98exec > builtins.h 99cat <<\! 100/* 101 * This file was generated by the mkbuiltins program. 102 */ 103 104! 105sed 's/ -[a-z]*//' $temp2 | nl -ba -v0 | 106 LC_ALL= LC_COLLATE=C sort -u -k 3,3 | 107 tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ | 108 awk '{ printf "#define %s (builtincmd + %d)\n", $3, $1}' 109printf '\n#define NUMBUILTINS %d\n' $(wc -l < $temp2) 110echo ' 111#define BUILTIN_SPECIAL 0x1 112#define BUILTIN_REGULAR 0x2 113#define BUILTIN_ASSIGN 0x4 114#define BUILTIN_WEAK 0x8 115 116struct builtincmd { 117 const char *name; 118 int (*builtin)(int, char **); 119 unsigned flags; 120}; 121 122extern const struct builtincmd builtincmd[];' 123