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