genassym.sh revision 259065
1153323Srodrigc#!/bin/sh
2153323Srodrigc# $FreeBSD: releng/10.0/sys/kern/genassym.sh 175449 2008-01-18 17:02:14Z julian $
3153323Srodrigc
4153323Srodrigcusage()
5153323Srodrigc{
6153323Srodrigc	echo "usage: genassym [-o outfile] objfile"
7153323Srodrigc	exit 1
8153323Srodrigc}
9153323Srodrigc
10153323Srodrigc
11153323Srodrigcwork()
12153323Srodrigc{
13153323Srodrigc	${NM:='nm'} "$1" | ${AWK:='awk'} '
14153323Srodrigc	/ C .*sign$/ {
15153323Srodrigc		sign = substr($1, length($1) - 3, 4)
16153323Srodrigc		sub("^0*", "", sign)
17153323Srodrigc		if (sign != "")
18153323Srodrigc			sign = "-"
19153323Srodrigc	}
20153323Srodrigc	/ C .*w0$/ {
21153323Srodrigc		w0 = substr($1, length($1) - 3, 4)
22153323Srodrigc	}
23153323Srodrigc	/ C .*w1$/ {
24153323Srodrigc		w1 = substr($1, length($1) - 3, 4)
25153323Srodrigc	}
26153323Srodrigc	/ C .*w2$/ {
27153323Srodrigc		w2 = substr($1, length($1) - 3, 4)
28153323Srodrigc	}
29153323Srodrigc	/ C .*w3$/ {
30153323Srodrigc		w3 = substr($1, length($1) - 3, 4)
31153323Srodrigc		w = w3 w2 w1 w0
32153323Srodrigc		sub("^0*", "", w)
33153323Srodrigc		if (w == "")
34153323Srodrigc			w = "0"
35153323Srodrigc		sub("w3$", "", $3)
36153323Srodrigc		# This still has minor problems representing INT_MIN, etc. 
37153323Srodrigc		# E.g.,
38153323Srodrigc		# with 32-bit 2''s complement ints, this prints -0x80000000,
39153323Srodrigc		# which has the wrong type (unsigned int).
40153323Srodrigc		printf("#define\t%s\t%s0x%s\n", $3, sign, w)
41153323Srodrigc	} '
42153323Srodrigc}
43153323Srodrigc
44153323Srodrigc
45153323Srodrigc#
46153323Srodrigc#MAIN PROGGRAM
47153323Srodrigc#
48153323Srodrigcuse_outfile="no"
49153323Srodrigcwhile getopts "o:" option
50153323Srodrigcdo
51153323Srodrigc	case "$option" in
52153323Srodrigc	o)	outfile="$OPTARG"
53153323Srodrigc		use_outfile="yes";;
54153323Srodrigc	*)	usage;;
55153323Srodrigc	esac
56153323Srodrigcdone
57153323Srodrigcshift $(($OPTIND - 1))
58153323Srodrigccase $# in
59153323Srodrigc1)	;;
60153323Srodrigc*)	usage;;
61153323Srodrigcesac
62153323Srodrigc
63153323Srodrigcif [ "$use_outfile" = "yes" ]
64153323Srodrigcthen
65153323Srodrigc	work $1  3>"$outfile" >&3 3>&-
66153323Srodrigcelse
67153323Srodrigc	work $1
68153323Srodrigcfi
69153323Srodrigc
70153323Srodrigc