xref: /openbsd/usr.bin/lorder/lorder.sh (revision 264ca280)
1#!/bin/sh -
2#	$OpenBSD: lorder.sh,v 1.15 2015/07/03 11:43:55 jca Exp $
3#	$NetBSD: lorder.sh.gnm,v 1.3 1995/12/20 04:45:11 cgd Exp $
4#
5# Copyright (c) 1990, 1993
6#	The Regents of the University of California.  All rights reserved.
7#
8# Redistribution and use in source and binary forms, with or without
9# modification, are permitted provided that the following conditions
10# are met:
11# 1. Redistributions of source code must retain the above copyright
12#    notice, this list of conditions and the following disclaimer.
13# 2. Redistributions in binary form must reproduce the above copyright
14#    notice, this list of conditions and the following disclaimer in the
15#    documentation and/or other materials provided with the distribution.
16# 3. Neither the name of the University nor the names of its contributors
17#    may be used to endorse or promote products derived from this software
18#    without specific prior written permission.
19#
20# THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
21# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23# ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
24# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
26# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
27# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
28# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
29# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
30# SUCH DAMAGE.
31#
32#	@(#)lorder.sh	8.1 (Berkeley) 6/6/93
33#
34
35# one argument can be optimized: put out the filename twice
36case $# in
37	0)
38		echo "usage: lorder file ...";
39		exit ;;
40	1)
41		echo $1 $1;
42		exit ;;
43esac
44
45# temporary files
46R=`mktemp /tmp/_referenceXXXXXXXXXX` || exit 1
47S=`mktemp /tmp/_symbolXXXXXXXXXX` || {
48	rm -f ${R}
49	exit 1
50}
51
52# remove temporary files on HUP, INT, QUIT, PIPE, TERM
53trap "rm -f $R $S; exit 0" 0
54trap "rm -f $R $S; exit 1" 1 2 3 13 15
55
56# make sure files depend on themselves
57for file in "$@"; do echo "$file $file" ; done
58# if the line has " T ", " D ", " G ", " R ",  it's a globally defined
59# symbol, put it into the symbol file.
60#
61# if the line has " U " it's a globally undefined symbol, put it into
62# the reference file.
63${NM:-nm} -go "$@" | sed "
64	/ [TDGR] / {
65		s/:.* [TDGR] / /
66		w $S
67		d
68	}
69	/ U / {
70		s/:.* U / /
71		w $R
72	}
73	d
74"
75
76# sort symbols and references on the first field (the symbol)
77# join on that field, and print out the file names (dependencies).
78sort -k 2 -o $R $R
79sort -k 2 -o $S $S
80join -j 2 -o 1.1,2.1 $R $S
81rm -f $R $S
82