1*5a4f3cb3SJunchao Zhang########################################################################### 2*5a4f3cb3SJunchao Zhang# A module with functions to handle paths 3*5a4f3cb3SJunchao Zhang# 4*5a4f3cb3SJunchao Zhang# Copyright (C) 2017-2018 Andrey Ponomarenko's ABI Laboratory 5*5a4f3cb3SJunchao Zhang# 6*5a4f3cb3SJunchao Zhang# Written by Andrey Ponomarenko 7*5a4f3cb3SJunchao Zhang# 8*5a4f3cb3SJunchao Zhang# This library is free software; you can redistribute it and/or 9*5a4f3cb3SJunchao Zhang# modify it under the terms of the GNU Lesser General Public 10*5a4f3cb3SJunchao Zhang# License as published by the Free Software Foundation; either 11*5a4f3cb3SJunchao Zhang# version 2.1 of the License, or (at your option) any later version. 12*5a4f3cb3SJunchao Zhang# 13*5a4f3cb3SJunchao Zhang# This library is distributed in the hope that it will be useful, 14*5a4f3cb3SJunchao Zhang# but WITHOUT ANY WARRANTY; without even the implied warranty of 15*5a4f3cb3SJunchao Zhang# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 16*5a4f3cb3SJunchao Zhang# Lesser General Public License for more details. 17*5a4f3cb3SJunchao Zhang# 18*5a4f3cb3SJunchao Zhang# You should have received a copy of the GNU Lesser General Public 19*5a4f3cb3SJunchao Zhang# License along with this library; if not, write to the Free Software 20*5a4f3cb3SJunchao Zhang# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, 21*5a4f3cb3SJunchao Zhang# MA 02110-1301 USA 22*5a4f3cb3SJunchao Zhang########################################################################### 23*5a4f3cb3SJunchao Zhanguse strict; 24*5a4f3cb3SJunchao Zhanguse Cwd qw(realpath); 25*5a4f3cb3SJunchao Zhang 26*5a4f3cb3SJunchao Zhangsub pathFmt(@) 27*5a4f3cb3SJunchao Zhang{ 28*5a4f3cb3SJunchao Zhang my $Path = shift(@_); 29*5a4f3cb3SJunchao Zhang my $Fmt = $In::Opt{"OS"}; 30*5a4f3cb3SJunchao Zhang if(@_) { 31*5a4f3cb3SJunchao Zhang $Fmt = shift(@_); 32*5a4f3cb3SJunchao Zhang } 33*5a4f3cb3SJunchao Zhang 34*5a4f3cb3SJunchao Zhang $Path=~s/[\/\\]+\.?\Z//g; 35*5a4f3cb3SJunchao Zhang if($Fmt eq "windows") 36*5a4f3cb3SJunchao Zhang { 37*5a4f3cb3SJunchao Zhang $Path=~s/\//\\/g; 38*5a4f3cb3SJunchao Zhang $Path = lc($Path); 39*5a4f3cb3SJunchao Zhang } 40*5a4f3cb3SJunchao Zhang else 41*5a4f3cb3SJunchao Zhang { # forward slash to pass into MinGW GCC 42*5a4f3cb3SJunchao Zhang $Path=~s/\\/\//g; 43*5a4f3cb3SJunchao Zhang } 44*5a4f3cb3SJunchao Zhang 45*5a4f3cb3SJunchao Zhang $Path=~s/[\/\\]+\Z//g; 46*5a4f3cb3SJunchao Zhang 47*5a4f3cb3SJunchao Zhang return $Path; 48*5a4f3cb3SJunchao Zhang} 49*5a4f3cb3SJunchao Zhang 50*5a4f3cb3SJunchao Zhangsub getAbsPath($) 51*5a4f3cb3SJunchao Zhang{ # abs_path() should NOT be called for absolute inputs 52*5a4f3cb3SJunchao Zhang # because it can change them 53*5a4f3cb3SJunchao Zhang my $Path = $_[0]; 54*5a4f3cb3SJunchao Zhang if(not isAbsPath($Path)) { 55*5a4f3cb3SJunchao Zhang $Path = abs_path($Path); 56*5a4f3cb3SJunchao Zhang } 57*5a4f3cb3SJunchao Zhang return pathFmt($Path); 58*5a4f3cb3SJunchao Zhang} 59*5a4f3cb3SJunchao Zhang 60*5a4f3cb3SJunchao Zhangsub realpath_F($) 61*5a4f3cb3SJunchao Zhang{ 62*5a4f3cb3SJunchao Zhang my $Path = $_[0]; 63*5a4f3cb3SJunchao Zhang return pathFmt(realpath($Path)); 64*5a4f3cb3SJunchao Zhang} 65*5a4f3cb3SJunchao Zhang 66*5a4f3cb3SJunchao Zhangsub classifyPath($) 67*5a4f3cb3SJunchao Zhang{ 68*5a4f3cb3SJunchao Zhang my $Path = $_[0]; 69*5a4f3cb3SJunchao Zhang if($Path=~/[\*\+\(\[\|]/) 70*5a4f3cb3SJunchao Zhang { # pattern 71*5a4f3cb3SJunchao Zhang return ($Path, "Pattern"); 72*5a4f3cb3SJunchao Zhang } 73*5a4f3cb3SJunchao Zhang elsif($Path=~/[\/\\]/) 74*5a4f3cb3SJunchao Zhang { # directory or relative path 75*5a4f3cb3SJunchao Zhang return (pathFmt($Path), "Path"); 76*5a4f3cb3SJunchao Zhang } 77*5a4f3cb3SJunchao Zhang else { 78*5a4f3cb3SJunchao Zhang return ($Path, "Name"); 79*5a4f3cb3SJunchao Zhang } 80*5a4f3cb3SJunchao Zhang} 81*5a4f3cb3SJunchao Zhang 82*5a4f3cb3SJunchao Zhangsub join_P($$) 83*5a4f3cb3SJunchao Zhang{ 84*5a4f3cb3SJunchao Zhang my $S = "/"; 85*5a4f3cb3SJunchao Zhang if($In::Opt{"OS"} eq "windows") { 86*5a4f3cb3SJunchao Zhang $S = "\\"; 87*5a4f3cb3SJunchao Zhang } 88*5a4f3cb3SJunchao Zhang return join($S, @_); 89*5a4f3cb3SJunchao Zhang} 90*5a4f3cb3SJunchao Zhang 91*5a4f3cb3SJunchao Zhangreturn 1; 92