| #!/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. |
| # |
| # Garrett 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 "$@" |
| } |