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