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