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