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