1#!/bin/sh 2# $FreeBSD$ 3 4usage() 5{ 6 echo "usage: genassym [-o outfile] objfile" 7 exit 1 8} 9 10 11work() 12{ 13 ${NM:='nm'} ${NMFLAGS} "$1" | ${AWK:='awk'} ' 14 / C .*sign$/ { 15 sign = substr($1, length($1) - 3, 4) 16 sub("^0*", "", sign) 17 if (sign != "") 18 sign = "-" 19 } 20 / C .*w0$/ { 21 w0 = substr($1, length($1) - 3, 4) 22 } 23 / C .*w1$/ { 24 w1 = substr($1, length($1) - 3, 4) 25 } 26 / C .*w2$/ { 27 w2 = substr($1, length($1) - 3, 4) 28 } 29 / C .*w3$/ { 30 w3 = substr($1, length($1) - 3, 4) 31 w = w3 w2 w1 w0 32 sub("^0*", "", w) 33 if (w == "") 34 w = "0" 35 hex = "" 36 if (w != "0") 37 hex = "0x" 38 sub("w3$", "", $3) 39 # This still has minor problems representing INT_MIN, etc. 40 # E.g., 41 # with 32-bit 2''s complement ints, this prints -0x80000000, 42 # which has the wrong type (unsigned int). 43 printf("#define\t%s\t%s%s%s\n", $3, sign, hex, w) 44 } ' 45} 46 47 48# 49#MAIN PROGGRAM 50# 51use_outfile="no" 52while getopts "o:" option 53do 54 case "$option" in 55 o) outfile="$OPTARG" 56 use_outfile="yes";; 57 *) usage;; 58 esac 59done 60shift $(($OPTIND - 1)) 61case $# in 621) ;; 63*) usage;; 64esac 65 66if [ "$use_outfile" = "yes" ] 67then 68 work $1 3>"$outfile" >&3 3>&- 69else 70 work $1 71fi 72 73