xref: /freebsd/sys/kern/genassym.sh (revision aea3463e3460e556d41edddd7c3af2aa3be84970)
1f47f0eddSBruce Evans#!/bin/sh
2f47f0eddSBruce Evans# $FreeBSD$
3f47f0eddSBruce Evans
458e5d669SAlfred Perlsteinusage()
558e5d669SAlfred Perlstein{
6f47f0eddSBruce Evans	echo "usage: genassym [-o outfile] objfile"
7f47f0eddSBruce Evans	exit 1
8f47f0eddSBruce Evans}
9f47f0eddSBruce Evans
10f47f0eddSBruce Evans
11ce3b9e3aSJulian Elischerwork()
12ce3b9e3aSJulian Elischer{
13*aea3463eSRui Paulo	${NM:='nm'} ${NMFLAGS} "$1" | ${AWK:='awk'} '
14f47f0eddSBruce Evans	/ C .*sign$/ {
15f47f0eddSBruce Evans		sign = substr($1, length($1) - 3, 4)
16f47f0eddSBruce Evans		sub("^0*", "", sign)
17f47f0eddSBruce Evans		if (sign != "")
18f47f0eddSBruce Evans			sign = "-"
19f47f0eddSBruce Evans	}
20f47f0eddSBruce Evans	/ C .*w0$/ {
21f47f0eddSBruce Evans		w0 = substr($1, length($1) - 3, 4)
22f47f0eddSBruce Evans	}
23f47f0eddSBruce Evans	/ C .*w1$/ {
24f47f0eddSBruce Evans		w1 = substr($1, length($1) - 3, 4)
25f47f0eddSBruce Evans	}
26f47f0eddSBruce Evans	/ C .*w2$/ {
27f47f0eddSBruce Evans		w2 = substr($1, length($1) - 3, 4)
28f47f0eddSBruce Evans	}
29f47f0eddSBruce Evans	/ C .*w3$/ {
30f47f0eddSBruce Evans		w3 = substr($1, length($1) - 3, 4)
31f47f0eddSBruce Evans		w = w3 w2 w1 w0
32f47f0eddSBruce Evans		sub("^0*", "", w)
33f47f0eddSBruce Evans		if (w == "")
34f47f0eddSBruce Evans			w = "0"
35f47f0eddSBruce Evans		sub("w3$", "", $3)
36ce3b9e3aSJulian Elischer		# This still has minor problems representing INT_MIN, etc.
37ce3b9e3aSJulian Elischer		# E.g.,
38ce3b9e3aSJulian Elischer		# with 32-bit 2''s complement ints, this prints -0x80000000,
39ce3b9e3aSJulian Elischer		# which has the wrong type (unsigned int).
40f47f0eddSBruce Evans		printf("#define\t%s\t%s0x%s\n", $3, sign, w)
41ce3b9e3aSJulian Elischer	} '
42f47f0eddSBruce Evans}
43ce3b9e3aSJulian Elischer
44ce3b9e3aSJulian Elischer
45ce3b9e3aSJulian Elischer#
46ce3b9e3aSJulian Elischer#MAIN PROGGRAM
47ce3b9e3aSJulian Elischer#
48ce3b9e3aSJulian Elischeruse_outfile="no"
49ce3b9e3aSJulian Elischerwhile getopts "o:" option
50ce3b9e3aSJulian Elischerdo
51ce3b9e3aSJulian Elischer	case "$option" in
52ce3b9e3aSJulian Elischer	o)	outfile="$OPTARG"
53ce3b9e3aSJulian Elischer		use_outfile="yes";;
54ce3b9e3aSJulian Elischer	*)	usage;;
55ce3b9e3aSJulian Elischer	esac
56ce3b9e3aSJulian Elischerdone
57ce3b9e3aSJulian Elischershift $(($OPTIND - 1))
58ce3b9e3aSJulian Elischercase $# in
59ce3b9e3aSJulian Elischer1)	;;
60ce3b9e3aSJulian Elischer*)	usage;;
61ce3b9e3aSJulian Elischeresac
62ce3b9e3aSJulian Elischer
63ce3b9e3aSJulian Elischerif [ "$use_outfile" = "yes" ]
64ce3b9e3aSJulian Elischerthen
65ce3b9e3aSJulian Elischer	work $1  3>"$outfile" >&3 3>&-
66ce3b9e3aSJulian Elischerelse
67ce3b9e3aSJulian Elischer	work $1
68ce3b9e3aSJulian Elischerfi
69ce3b9e3aSJulian Elischer
70