binpackages binsizes bzip2 bzip2recover cal calendar \
cat cawf cd cdprobe checkhier chmem \
chmod chown chroot ci cksum cleantmp clear cmp co \
- comm compress cp crc cron crontab cut datasizes date \
+ comm compress cp crc cron crontab cut date \
dd de decomp16 DESCRIBE dev2name devsize df dhcpd \
dhrystone diff dirname dis88 du dumpcore easypack \
ed eject elle elvis env expand factor file \
+++ /dev/null
-#!/bin/sh
-
-if [ $# -ne 1 ]
-then echo "Usage: $0 <executable>"
- exit 1
-fi
-
-if file $1 | grep NSYM >/dev/null 2>&1; then
- NM="gnm --radix=d"
-else
- NM="acknm -d"
-fi
-
-$NM -n $1 | grep ' [bBdD] [^.]' | awk '{ if (lastpos) printf "%10ld kB %s\n", ($1-lastpos)/1024, lastname; lastpos=$1; lastname=$3 }' | sort -n
#!/bin/sh
+# Look at /usr/pkg/bin first in case there is an old nm in /usr/bin
+PATH=/usr/pkg/bin:$PATH:/usr/gnu/bin
+
+# Check usage
if [ $# -lt 1 ]
-then echo "Usage: $0 <executable> [0x... [0x... ] ]"
+then echo "Usage: unstack <executable> [0x... [0x... ] ]"
+ echo " datasizes <executable>"
exit 1
fi
-PATH=$PATH:/usr/gnu/bin:/usr/pkg/bin
-
-if file $1 | grep NSYM >/dev/null 2>&1; then
- NM="gnm --radix=d"
-else
- NM="acknm -d"
-fi
+# Check invocation mode
+case "`basename $0`" in
+ datasizes)
+ mode=data
+ ;;
+ unstack)
+ mode=stack
+ ;;
+ *)
+ echo "Invoked as $0?"
+ exit 1
+ ;;
+esac
+# Get executable name
executable=$1
shift
-while [ $# -gt 0 ]
-do dec="`printf %d $1`"
- $NM -n $executable | grep ' [Tt] [^.]' | awk '
- { if($1 > '$dec') { printf "%s+0x%x\n", name, '$dec'-offset; exit }
- name=$3; offset=$1
- }'
- shift
-done
+# gnu nm can be gnm or nm
+if which gnm >/dev/null 2>&1
+then GNM=gnm
+else GNM=nm
+fi
+
+# Invoke gnu nm or ack nm?
+if file $executable | grep NSYM >/dev/null 2>&1
+then NM="$GNM --radix=d"
+else NM="acknm -d"
+fi
+
+# Invoked as unstack?
+if [ $mode = stack ]
+then
+ while [ $# -gt 0 ]
+ do dec="`printf %d $1`"
+ $NM -n $executable | grep ' [Tt] [^.]' | awk '
+ { if($1 > '$dec') { printf "%s+0x%x\n", name, '$dec'-offset; exit }
+ name=$3; offset=$1
+ }'
+ shift
+ done
+
+ exit 0
+fi
+
+# Invoked as datasizes?
+if [ $mode = data ]
+then
+ $NM -n $executable |
+ grep ' [bBdD] [^.]' | awk '{ if (lastpos) printf "%10ld kB %s\n", ($1-lastpos)/1024, lastname; lastpos=$1; lastname=$3 }' | sort -n
+
+ exit 0
+fi
+
+# Can't happen.
+echo "Impossible invocation."
+
+exit 1
+