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