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