xref: /freebsd/lib/libsysdecode/mklinuxtables (revision bd35e83bcf03a3650b5574f81201e8e55af4cdd7)
1b69ae1a3SDmitry Chagin#!/bin/sh
2b69ae1a3SDmitry Chagin#
3b69ae1a3SDmitry Chagin# Copyright (c) 2006 "David Kirchner" <dpk@dpk.net>. All rights reserved.
4b69ae1a3SDmitry Chagin#
5b69ae1a3SDmitry Chagin# Redistribution and use in source and binary forms, with or without
6b69ae1a3SDmitry Chagin# modification, are permitted provided that the following conditions
7b69ae1a3SDmitry Chagin# are met:
8b69ae1a3SDmitry Chagin# 1. Redistributions of source code must retain the above copyright
9b69ae1a3SDmitry Chagin#    notice, this list of conditions and the following disclaimer.
10b69ae1a3SDmitry Chagin# 2. Redistributions in binary form must reproduce the above copyright
11b69ae1a3SDmitry Chagin#    notice, this list of conditions and the following disclaimer in the
12b69ae1a3SDmitry Chagin#    documentation and/or other materials provided with the distribution.
13b69ae1a3SDmitry Chagin#
14b69ae1a3SDmitry Chagin# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15b69ae1a3SDmitry Chagin# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16b69ae1a3SDmitry Chagin# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17b69ae1a3SDmitry Chagin# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18b69ae1a3SDmitry Chagin# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19b69ae1a3SDmitry Chagin# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20b69ae1a3SDmitry Chagin# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21b69ae1a3SDmitry Chagin# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22b69ae1a3SDmitry Chagin# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23b69ae1a3SDmitry Chagin# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24b69ae1a3SDmitry Chagin# SUCH DAMAGE.
25b69ae1a3SDmitry Chagin#
26b69ae1a3SDmitry Chagin# $FreeBSD$
27b69ae1a3SDmitry Chagin#
28b69ae1a3SDmitry Chagin# Generates tables_linux.h
29b69ae1a3SDmitry Chagin#
30b69ae1a3SDmitry Chagin
31b69ae1a3SDmitry Chaginset -e
32b69ae1a3SDmitry Chagin
33b69ae1a3SDmitry ChaginLC_ALL=C; export LC_ALL
34b69ae1a3SDmitry Chagin
35b69ae1a3SDmitry Chaginif [ -z "$1" ]
36b69ae1a3SDmitry Chaginthen
37b69ae1a3SDmitry Chagin	echo "usage: sh $0 include-dir [output-file]"
38b69ae1a3SDmitry Chagin	exit 1
39b69ae1a3SDmitry Chaginfi
40b69ae1a3SDmitry Chagininclude_dir=$1
41b69ae1a3SDmitry Chaginif [ -n "$2" ]; then
42b69ae1a3SDmitry Chagin	output_file="$2"
43b69ae1a3SDmitry Chagin	output_tmp=$(mktemp -u)
44b69ae1a3SDmitry Chagin	exec > "$output_tmp"
45b69ae1a3SDmitry Chaginfi
46b69ae1a3SDmitry Chagin
47b69ae1a3SDmitry Chaginall_headers=
48b69ae1a3SDmitry Chagin#
49b69ae1a3SDmitry Chagin# Generate a table C #definitions.  The including file can define the
50b69ae1a3SDmitry Chagin# TABLE_NAME(n), TABLE_ENTRY(x), and TABLE_END macros to define what
51b69ae1a3SDmitry Chagin# the tables map to.
52b69ae1a3SDmitry Chagin#
53b69ae1a3SDmitry Chagingen_table()
54b69ae1a3SDmitry Chagin{
55b69ae1a3SDmitry Chagin	local name grep file excl filter
56b69ae1a3SDmitry Chagin	name=$1
57b69ae1a3SDmitry Chagin	grep=$2
58b69ae1a3SDmitry Chagin	file=$3
59b69ae1a3SDmitry Chagin	excl=$4
60b69ae1a3SDmitry Chagin
61b69ae1a3SDmitry Chagin	if [ -z "$excl" ]; then
62b69ae1a3SDmitry Chagin		filter="cat"
63b69ae1a3SDmitry Chagin	else
64b69ae1a3SDmitry Chagin		filter="egrep -v"
65b69ae1a3SDmitry Chagin	fi
66b69ae1a3SDmitry Chagin	cat <<_EOF_
67b69ae1a3SDmitry ChaginTABLE_START(${name})
68b69ae1a3SDmitry Chagin_EOF_
69b69ae1a3SDmitry Chagin	if [ -e "${include_dir}/${file}" ]; then
70b69ae1a3SDmitry Chagin		all_headers="${all_headers:+${all_headers} }${file}"
71b69ae1a3SDmitry Chagin		egrep "^#[[:space:]]*define[[:space:]]+"${grep}"[[:space:]]*" \
72b69ae1a3SDmitry Chagin			$include_dir/$file | ${filter} ${excl} | \
73b69ae1a3SDmitry Chagin		awk '{ for (i = 1; i <= NF; i++) \
74b69ae1a3SDmitry Chagin			if ($i ~ /define/) \
75b69ae1a3SDmitry Chagin				break; \
76b69ae1a3SDmitry Chagin			++i; \
77b69ae1a3SDmitry Chagin			sub(/LINUX_/, "", $i); \
78b69ae1a3SDmitry Chagin			printf "TABLE_ENTRY(LINUX_%s, %s)\n", $i, $i }'
79b69ae1a3SDmitry Chagin	fi
80b69ae1a3SDmitry Chagincat <<_EOF_
81b69ae1a3SDmitry ChaginTABLE_END
82b69ae1a3SDmitry Chagin
83b69ae1a3SDmitry Chagin_EOF_
84b69ae1a3SDmitry Chagin}
85b69ae1a3SDmitry Chagin
86b69ae1a3SDmitry Chagincat <<_EOF_
87b69ae1a3SDmitry Chagin/* This file is auto-generated. */
88b69ae1a3SDmitry Chagin
89b69ae1a3SDmitry Chagin_EOF_
90b69ae1a3SDmitry Chagin
91d2b3237eSDmitry Chagingen_table "atflags"     "LINUX_AT_[A-Z_]+[[:space:]]+[0-9]+"             "compat/linux/linux_file.h"
92c8a79231SDmitry Chagingen_table "clockids"    "LINUX_CLOCK_[A-Z_]+[[:space:]]+[0-9]+"          "compat/linux/linux_time.h"
93c8a79231SDmitry Chagingen_table "clockflags"  "LINUX_TIMER_[A-Z_]+[[:space:]]+0x[0-9]+"        "compat/linux/linux_time.h"
94c8a79231SDmitry Chagingen_table "clockcpuids" "LINUX_CPUCLOCK_[A-Z_]+[[:space:]]+[0-9]+"       "compat/linux/linux_time.h"	"_MASK|_MAX"
95fde775bcSDmitry Chagingen_table "openflags"   "LINUX_O_[A-Z_]+[[:space:]]+[0-9]+"              "compat/linux/linux_file.h"	"O_RDONLY|O_RDWR|O_WRONLY|O_ACCMODE"
96f587a2a7SDmitry Chagingen_table "sigprocmaskhow" "LINUX_SIG_[A-Z]+[[:space:]]+[0-9]+"          "compat/linux/linux.h"
97*bd35e83bSDmitry Chagingen_table "cloneflags"  "LINUX_CLONE_[A-Z_]+[[:space:]]+[[:alnum:]]+"    "compat/linux/linux_fork.h"	"LINUX_CLONE_LEGACY_FLAGS|LINUX_CLONE_CLEAR_SIGHAND|LINUX_CLONE_INTO_CGROUP|LINUX_CLONE_NEWTIME"
98b69ae1a3SDmitry Chagin
99b69ae1a3SDmitry Chagin# Generate a .depend file for our output file
100b69ae1a3SDmitry Chaginif [ -n "$output_file" ]; then
101b69ae1a3SDmitry Chagin	depend_tmp=$(mktemp -u)
102b69ae1a3SDmitry Chagin	{
103b69ae1a3SDmitry Chagin		echo "$output_file: \\"
104b69ae1a3SDmitry Chagin		echo "$all_headers" | tr ' ' '\n' | sort -u |
105b69ae1a3SDmitry Chagin		    sed -e "s,^,	$include_dir/," -e 's,$, \\,'
106b69ae1a3SDmitry Chagin		echo
107b69ae1a3SDmitry Chagin	} > "$depend_tmp"
108b69ae1a3SDmitry Chagin	if cmp -s "$output_tmp" "$output_file"; then
109b69ae1a3SDmitry Chagin		rm -f "$output_tmp" "$depend_tmp"
110b69ae1a3SDmitry Chagin	else
111b69ae1a3SDmitry Chagin		mv -f "$depend_tmp" ".depend.${output_file}"
112b69ae1a3SDmitry Chagin		mv -f "$output_tmp" "$output_file"
113b69ae1a3SDmitry Chagin	fi
114b69ae1a3SDmitry Chaginfi
115