• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1#!/bin/sh
2#
3# File functions utilized as part of abspath.sh, realpath.sh, etc.
4#
5#    Copyright (C) 2010, Cisco Systems Inc.
6#
7#    This program is free software; you can redistribute it and/or modify
8#    it under the terms of the GNU General Public License as published by
9#    the Free Software Foundation; either version 2 of the License, or
10#    (at your option) any later version.
11#
12#    This program is distributed in the hope that it will be useful,
13#    but WITHOUT ANY WARRANTY; without even the implied warranty of
14#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15#    GNU General Public License for more details.
16#
17#    You should have received a copy of the GNU General Public License along
18#    with this program; if not, write to the Free Software Foundation, Inc.,
19#    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
20#
21# Ngie Cooper, January 2010
22#
23# POSIX compliant bourne shell functions for performing make 3.81
24# compliancy in 3.80 with a minimal set of external commands
25# [awk(1) // readlink(1) only required].
26#
27
28# 0. Strip all heading and leading space.
29# Paths:
30# 1. Empty string - print out $PWD.
31# 2. Not empty string...
32#    i. Prefix all relative paths with $PWD.
33#    ii. Replace /+ with /.
34#    iii. Replace a/b/../c with a/c
35#    iv. Replace /./ with /
36#    v. Replace trailing /. with /
37#    vi. Replace heading ./ with /
38#    vii. Replace /. with "".
39
40# testcases/kernel/controllers/libcontrollers/../../../..
41_abspath() {
42	echo "$@" | awk -v PWD=$(pwd) '{
43	sub(/^[[:space:]]+/, ""); sub(/[[:space:]]+$/, ""); # 1.
44	if ($0 == "") {
45		print PWD
46	} else {
47		if (!($0 ~ /^\//)) { # i.
48			$0 = PWD "/" $0
49		}
50		while (gsub(/\/\//, "/")) { }; # ii.
51		while (sub(/\/[^\/]+\/\.\.\/?/, "/")) { }; # iii.
52		while (sub(/\/\.\//, "/")) { }; # iv.
53		sub(/(\/\.)?\/$/, "");
54		sub(/^\.\//, "/");
55		sub(/\/\.$/, "");
56		if ($0 == "") {
57			print "/"
58		} else {
59			if ($0 == ".") {
60				print PWD
61			} else {
62				print
63			}
64		}
65	}
66}'
67}
68
69_realpath() {
70	readlink -f "$@"
71}
72