xref: /freebsd/sys/kern/genassym.sh (revision f0adf7f5cdd241db2f2c817683191a6ef64a4e95)
1#!/bin/sh
2# $FreeBSD$
3
4# Grrr, this should use stdin and stdout, but is encrufted for compatibility.
5
6usage()
7{
8	echo "usage: genassym [-o outfile] objfile"
9	exit 1
10}
11
12outfile=/dev/stdout
13while getopts "o:" option
14do
15	case "$option" in
16	o)	outfile="$OPTARG";;
17	*)	usage;;
18	esac
19done
20shift $(($OPTIND - 1))
21case $# in
221)	;;
23*)	usage;;
24esac
25
26${NM:='nm'} "$1" | ${AWK:='awk'} '
27/ C .*sign$/ {
28	sign = substr($1, length($1) - 3, 4)
29	sub("^0*", "", sign)
30	if (sign != "")
31		sign = "-"
32}
33/ C .*w0$/ {
34	w0 = substr($1, length($1) - 3, 4)
35}
36/ C .*w1$/ {
37	w1 = substr($1, length($1) - 3, 4)
38}
39/ C .*w2$/ {
40	w2 = substr($1, length($1) - 3, 4)
41}
42/ C .*w3$/ {
43	w3 = substr($1, length($1) - 3, 4)
44	w = w3 w2 w1 w0
45	sub("^0*", "", w)
46	if (w == "")
47		w = "0"
48	sub("w3$", "", $3)
49	# This still has minor problems representing INT_MIN, etc.  E.g.,
50	# with 32-bit 2''s complement ints, this prints -0x80000000, which
51	# has the wrong type (unsigned int).
52	printf("#define\t%s\t%s0x%s\n", $3, sign, w)
53}
54' 3>"$outfile" >&3 3>&-
55