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