xref: /freebsd/usr.bin/lorder/lorder.sh (revision 1de7b4b805ddbf2429da511c053686ac4591ed89)
1#!/bin/sh -
2#
3# SPDX-License-Identifier: BSD-3-Clause
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# $FreeBSD$
35#
36
37# only one argument is a special case, just output the name twice
38case $# in
39	0)
40		echo "usage: lorder file ...";
41		exit ;;
42	1)
43		echo $1 $1;
44		exit ;;
45esac
46
47# temporary files
48R=$(mktemp -t _reference_)
49S=$(mktemp -t _symbol_)
50NM=${NM:-nm}
51
52# remove temporary files on HUP, INT, QUIT, PIPE, TERM
53trap "rm -f $R $S $T; exit 1" 1 2 3 13 15
54
55# make sure all the files get into the output
56for i in $*; do
57	echo $i $i
58done
59
60# if the line has " [TDW] " it's a globally defined symbol, put it
61# into the symbol file.
62#
63# if the line has " U " it's a globally undefined symbol, put it into
64# the reference file.
65${NM} ${NMFLAGS} -go $* | sed "
66	/ [TDW] / {
67		s/:.* [TDW] / /
68		w $S
69		d
70	}
71	/ U / {
72		s/:.* U / /
73		w $R
74	}
75	d
76"
77
78export LC_ALL=C
79# eliminate references that can be resolved by the same library.
80if [ $(expr "$*" : '.*\.a[[:>:]]') -ne 0 ]; then
81	sort -u -o $S $S
82	sort -u -o $R $R
83	T=$(mktemp -t _temp_)
84	comm -23 $R $S >$T
85	mv $T $R
86fi
87
88# sort references and symbols on the second field (the symbol),
89# join on that field, and print out the file names.
90sort -k 2 -o $R $R
91sort -k 2 -o $S $S
92join -j 2 -o 1.1 2.1 $R $S
93rm -f $R $S
94