# -*- shell-script -*- # Things related to file handling. # # Copyright (C) 2002, 2003, 2004, 2006, 2008, 2009, 2010, 2014 Rocky Bernstein # rocky@gnu.org # # bashdb 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, or (at your option) any later # version. # # bashdb 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 bashdb; see the file COPYING. If not, write to the Free Software # Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA. # Directory search patch for unqualified file names typeset -a _Dbg_dir = '' setglobal _Dbg_dir = '(''\$cdir' '\$cwd' ) # _Dbg_cdir is the directory in which the script is located. [[ -z ${_Dbg_cdir} ]] && typeset _Dbg_cdir = $(_Dbg_source_file%/*) [[ -z ${_Dbg_cdir} ]] && typeset _Dbg_cdir = $[pwd] # Either fill out or strip filename as determined by "basename_only" # and annotate settings proc _Dbg_adjust_filename { typeset -r filename = $1 if sh-expr ' _Dbg_set_annotate == 1 ' { echo $[_Dbg_resolve_expand_filename $filename] } elif sh-expr '_Dbg_set_basename' { echo $(filename##*/) } else { echo $filename } } # Canonicalize $1. For now if _Dbg_set_basename is set we just want # the basename of that. proc _Dbg_file_canonic { if sh-expr ' $# != 1 ' { echo '??' return 1 } typeset filename = $1 sh-expr ' _Dbg_set_basename ' && setglobal filename = $(filename##*/) echo $filename return 0 } # $1 contains the name you want to glob. return 0 if exists and is # readable or 1 if not. # The result will be in variable $filename which is assumed to be # local'd by the caller proc _Dbg_tilde_expand_filename { typeset cmd = ""filename=\$(builtin echo $1)"" eval $cmd [[ -r $filename ]] } # # Resolve $1 to a full file name which exists. First see if filename has been # mentioned in a debugger "file" command. If not and the file name # is a relative name use _Dbg_dir to substitute a relative directory name. # proc _Dbg_resolve_expand_filename { if sh-expr ' $# == 0 ' { _Dbg_errmsg \ "Internal debug error _Dbg_resolve_expand_filename(): null file to find" echo '' return 1 } typeset find_file = $1 # Is this one of the files we've that has been specified in a debugger # "FILE" command? typeset found_file = '' setglobal found_file = $(_Dbg_file2canonic[$find_file]) if [[ -n $found_file ]] { echo $found_file return 0 } if [[ ${find_file:0:1} == '/' ]] { # Absolute file name setglobal full_find_file = $[_Dbg_expand_filename $find_file] echo $full_find_file return 0 } elif [[ ${find_file:0:1} == '.' ]] { # Relative file name setglobal full_find_file = $[_Dbg_expand_filename "$(_Dbg_init_cwd)/$find_file] if [[ -z "$full_find_file" ]] || [[ ! -r $full_find_file ]] { # Try using cwd rather that Dbg_init_cwd setglobal full_find_file = $[_Dbg_expand_filename $find_file] } echo $full_find_file return 0 } else { # Resolve file using _Dbg_dir typeset -i n = $(#_Dbg_dir[@]) typeset -i i = '' for (( i=0 ; i < n; i++ )) ; do typeset basename="${_Dbg_dir[i]}" if [[ $basename == '\$cdir' ]] ; then basename=$_Dbg_cdir elif [[ $basename == '\$cwd' ]] ; then basename=$(pwd) fi if [[ -f "$basename/$find_file" ]] ; then echo "$basename/$find_file" return 0 fi done } echo '' return 1 }