1275970Scy#!/bin/sh
2275970Scy# $FreeBSD: releng/10.2/sys/kern/genassym.sh 175449 2008-01-18 17:02:14Z julian $
3275970Scy
4275970Scyusage()
5275970Scy{
6275970Scy	echo "usage: genassym [-o outfile] objfile"
7275970Scy	exit 1
8275970Scy}
9275970Scy
10275970Scy
11275970Scywork()
12275970Scy{
13275970Scy	${NM:='nm'} "$1" | ${AWK:='awk'} '
14275970Scy	/ C .*sign$/ {
15275970Scy		sign = substr($1, length($1) - 3, 4)
16275970Scy		sub("^0*", "", sign)
17275970Scy		if (sign != "")
18275970Scy			sign = "-"
19275970Scy	}
20275970Scy	/ C .*w0$/ {
21275970Scy		w0 = substr($1, length($1) - 3, 4)
22275970Scy	}
23275970Scy	/ C .*w1$/ {
24275970Scy		w1 = substr($1, length($1) - 3, 4)
25275970Scy	}
26275970Scy	/ C .*w2$/ {
27275970Scy		w2 = substr($1, length($1) - 3, 4)
28275970Scy	}
29275970Scy	/ C .*w3$/ {
30275970Scy		w3 = substr($1, length($1) - 3, 4)
31275970Scy		w = w3 w2 w1 w0
32275970Scy		sub("^0*", "", w)
33275970Scy		if (w == "")
34275970Scy			w = "0"
35275970Scy		sub("w3$", "", $3)
36275970Scy		# This still has minor problems representing INT_MIN, etc. 
37275970Scy		# E.g.,
38275970Scy		# with 32-bit 2''s complement ints, this prints -0x80000000,
39275970Scy		# which has the wrong type (unsigned int).
40275970Scy		printf("#define\t%s\t%s0x%s\n", $3, sign, w)
41275970Scy	} '
42275970Scy}
43275970Scy
44275970Scy
45275970Scy#
46275970Scy#MAIN PROGGRAM
47275970Scy#
48275970Scyuse_outfile="no"
49275970Scywhile getopts "o:" option
50275970Scydo
51275970Scy	case "$option" in
52275970Scy	o)	outfile="$OPTARG"
53275970Scy		use_outfile="yes";;
54275970Scy	*)	usage;;
55275970Scy	esac
56275970Scydone
57275970Scyshift $(($OPTIND - 1))
58275970Scycase $# in
59275970Scy1)	;;
60275970Scy*)	usage;;
61275970Scyesac
62275970Scy
63275970Scyif [ "$use_outfile" = "yes" ]
64275970Scythen
65275970Scy	work $1  3>"$outfile" >&3 3>&-
66275970Scyelse
67275970Scy	work $1
68275970Scyfi
69275970Scy
70275970Scy