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