161174Sbde#!/bin/sh
261174Sbde# $FreeBSD$
361174Sbde
488547Salfredusage()
588547Salfred{
661174Sbde	echo "usage: genassym [-o outfile] objfile"
761174Sbde	exit 1
861174Sbde}
961174Sbde
10175449Sjulian
11175449Sjulianwork()
12175449Sjulian{
13286793Srpaulo	${NM:='nm'} ${NMFLAGS} "$1" | ${AWK:='awk'} '
14175449Sjulian	/ C .*sign$/ {
15175449Sjulian		sign = substr($1, length($1) - 3, 4)
16175449Sjulian		sub("^0*", "", sign)
17175449Sjulian		if (sign != "")
18175449Sjulian			sign = "-"
19175449Sjulian	}
20175449Sjulian	/ C .*w0$/ {
21175449Sjulian		w0 = substr($1, length($1) - 3, 4)
22175449Sjulian	}
23175449Sjulian	/ C .*w1$/ {
24175449Sjulian		w1 = substr($1, length($1) - 3, 4)
25175449Sjulian	}
26175449Sjulian	/ C .*w2$/ {
27175449Sjulian		w2 = substr($1, length($1) - 3, 4)
28175449Sjulian	}
29175449Sjulian	/ C .*w3$/ {
30175449Sjulian		w3 = substr($1, length($1) - 3, 4)
31175449Sjulian		w = w3 w2 w1 w0
32175449Sjulian		sub("^0*", "", w)
33175449Sjulian		if (w == "")
34175449Sjulian			w = "0"
35175449Sjulian		sub("w3$", "", $3)
36175449Sjulian		# This still has minor problems representing INT_MIN, etc. 
37175449Sjulian		# E.g.,
38175449Sjulian		# with 32-bit 2''s complement ints, this prints -0x80000000,
39175449Sjulian		# which has the wrong type (unsigned int).
40175449Sjulian		printf("#define\t%s\t%s0x%s\n", $3, sign, w)
41175449Sjulian	} '
42175449Sjulian}
43175449Sjulian
44175449Sjulian
45175449Sjulian#
46175449Sjulian#MAIN PROGGRAM
47175449Sjulian#
48175449Sjulianuse_outfile="no"
4961174Sbdewhile getopts "o:" option
5061174Sbdedo
5161174Sbde	case "$option" in
52175449Sjulian	o)	outfile="$OPTARG"
53175449Sjulian		use_outfile="yes";;
5461174Sbde	*)	usage;;
5561174Sbde	esac
5661174Sbdedone
5761174Sbdeshift $(($OPTIND - 1))
5861174Sbdecase $# in
5961174Sbde1)	;;
6061174Sbde*)	usage;;
6161174Sbdeesac
6261174Sbde
63175449Sjulianif [ "$use_outfile" = "yes" ]
64175449Sjulianthen
65175449Sjulian	work $1  3>"$outfile" >&3 3>&-
66175449Sjulianelse
67175449Sjulian	work $1
68175449Sjulianfi
69175449Sjulian
70