#!/bin/sh -
#	$NetBSD: makelintstub,v 1.1 1996/12/22 11:38:34 cgd Exp $
#
# Copyright (c) 1996 Christopher G. Demetriou.  All rights reserved.
#
# 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. All advertising materials mentioning features or use of this software
#    must display the following acknowledgement:
#      This product includes software developed for the NetBSD Project
#      by Christopher G. Demetriou.
# 4. The name of the author may not be used to endorse or promote products
#    derived from this software without specific prior written permission
#
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.

if [ $# -lt 1 ] || [ $# -gt 2 ]; then
	echo "usage: $0 syscallname [funcname]"
	exit 1
fi

syscallname="$1"
if [ $# -eq 1 ]; then
	funcname="$syscallname"
else
	funcname="$2"
fi

arglist="`printf '#include <sys/syscall.h>' | cpp -C | \
    grep '^/\* syscall: "'"$syscallname"'" ' | \
    sed -e 's,^/\* syscall: ,,;s, \*/$,,'`"

eval set -f -- "$arglist"

if [ $# -lt 4 ]; then
	echo syscall $syscallname not found! 1>&2
	exit 1
fi

syscallname=$1
shift 2			# kill name and "ret:"
returntype=$1
shift 2			# kill return type and "args:"

cat << __EOF__
#include <sys/param.h>
#include <sys/time.h>
#include <sys/mount.h>
#include <sys/stat.h>
#include <ufs/lfs/lfs.h>
#include <sys/resource.h>
#include <sys/poll.h>
#include <sys/uio.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <sys/sem.h>
#include <sys/shm.h>
#include <sys/timex.h>
#include <sys/socket.h>
#ifdef __STDC__
#include <stdarg.h>
#else
#include <varargs.h>
#endif

/*ARGSUSED*/
$returntype
__EOF__

if [ "`eval echo -n \\$$#`" = "..." ]; then
	varargs=YES
	nargs=$(($# - 1))
else
	varargs=NO
	nargs=$#
fi
nargswithva=$#

# do ANSI C function header
echo	"#ifdef __STDC__"

echo -n	"$funcname("
i=1
while [ $i -le $nargs ]; do
	eval echo -n \""\$$i"\"
	echo -n	" arg$i"
	if [ $i -lt $nargswithva ]; then
		echo -n	", "
	fi
	i=$(($i + 1))
done
if [ $varargs = YES ]; then
	echo -n "..."
fi
echo	")"

# do K&R C function header
echo	"#else"

echo -n	"$funcname("
i=1
while [ $i -le $nargs ]; do
	echo -n	"arg$i"
	if [ $i -lt $nargswithva ]; then
		echo -n	", "
	fi
	i=$(($i + 1))
done
if [ $varargs = YES ]; then
	echo -n "va_alist"
fi
echo	")"
i=1
while [ $i -le $nargs ]; do
	eval echo -n \""        \$$i"\"
	echo	" arg$i;"
	i=$(($i + 1))
done
if [ $varargs = YES ]; then
	echo	"        va_dcl"
fi

# do function body
echo	"#endif"
echo	"{"
if [ "$returntype" != "void" ]; then
	echo "        return (($returntype)0);"
fi
echo	"}"

exit 0
