xref: /freebsd/sys/kern/genassym.sh (revision 5956d97f4b3204318ceb6aa9c77bd0bc6ea87a41)
1#!/bin/sh
2# $FreeBSD$
3
4usage()
5{
6	echo "usage: genassym [-o outfile] objfile"
7	exit 1
8}
9
10
11work()
12{
13	${NM:='nm'} ${NMFLAGS} "$1" | ${AWK:='awk'} '
14	/ C .*sign$/ {
15		sign = substr($1, length($1) - 3, 4)
16		sub("^0*", "", sign)
17		if (sign != "")
18			sign = "-"
19	}
20	/ C .*w0$/ {
21		w0 = substr($1, length($1) - 3, 4)
22	}
23	/ C .*w1$/ {
24		w1 = substr($1, length($1) - 3, 4)
25	}
26	/ C .*w2$/ {
27		w2 = substr($1, length($1) - 3, 4)
28	}
29	/ C .*w3$/ {
30		w3 = substr($1, length($1) - 3, 4)
31		w = w3 w2 w1 w0
32		sub("^0*", "", w)
33		if (w == "")
34			w = "0"
35		hex = ""
36		if (w != "0")
37			hex = "0x"
38		sub("w3$", "", $3)
39		# This still has minor problems representing INT_MIN, etc.
40		# E.g.,
41		# with 32-bit 2''s complement ints, this prints -0x80000000,
42		# which has the wrong type (unsigned int).
43		printf("#define\t%s\t%s%s%s\n", $3, sign, hex, w)
44	} '
45}
46
47
48#
49#MAIN PROGGRAM
50#
51use_outfile="no"
52while getopts "o:" option
53do
54	case "$option" in
55	o)	outfile="$OPTARG"
56		use_outfile="yes";;
57	*)	usage;;
58	esac
59done
60shift $((OPTIND - 1))
61case $# in
621)	;;
63*)	usage;;
64esac
65
66if [ "$use_outfile" = "yes" ]
67then
68	work "$1"  3>"$outfile" >&3 3>&-
69else
70	work "$1"
71fi
72
73