// // "$Id: filename_expand.cxx 6986 2010-01-01 18:30:49Z greg.ercolano $" // // Filename expansion routines for the Fast Light Tool Kit (FLTK). // // Copyright 1998-2009 by Bill Spitzak and others. // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Library General Public // License as published by the Free Software Foundation; either // version 2 of the License, or (at your option) any later version. // // This library 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 // Library General Public License for more details. // // You should have received a copy of the GNU Library General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA. // // Please report all bugs and problems on the following page: // // http://www.fltk.org/str.php // /* expand a file name by substuting environment variables and home directories. Returns true if any changes were made. to & from may be the same buffer. */ #include #include #include #include "flstring.h" #if defined(WIN32) && !defined(__CYGWIN__) #include #else # include # include #endif #if defined(WIN32) || defined(__EMX__) && !defined(__CYGWIN__) static inline int isdirsep(char c) {return c=='/' || c=='\\';} #else #define isdirsep(c) ((c)=='/') #endif /** Expands a filename containing shell variables and tilde (~). Currently handles these variants: \code "~username" // if 'username' does not exist, result will be unchanged "~/file" "$VARNAME" // does NOT handle ${VARNAME} \endcode \b Examples: \code #include [..] putenv("TMPDIR=/var/tmp"); fl_filename_expand(out, sizeof(out), "~fred/.cshrc"); // out="/usr/fred/.cshrc" fl_filename_expand(out, sizeof(out), "~/.cshrc"); // out="/usr//.cshrc" fl_filename_expand(out, sizeof(out), "$TMPDIR/foo.txt"); // out="/var/tmp/foo.txt" \endcode \param[out] to resulting expanded filename \param[in] tolen size of the expanded filename buffer \param[in] from filename containing shell variables \return 0 if no change, non zero otherwise */ int fl_filename_expand(char *to,int tolen, const char *from) { char *temp = new char[tolen]; strlcpy(temp,from, tolen); char *start = temp; char *end = temp+strlen(temp); int ret = 0; for (char *a=temp; apw_dir; #endif } break; case '$': /* an environment variable */ {char t = *e; *(char *)e = 0; value = fl_getenv(a+1); *(char *)e = t;} break; } if (value) { // substitutions that start with slash delete everything before them: if (isdirsep(value[0])) start = a; #if defined(WIN32) || defined(__EMX__) && !defined(__CYGWIN__) // also if it starts with "A:" if (value[0] && value[1]==':') start = a; #endif int t = strlen(value); if (isdirsep(value[t-1])) t--; if ((end+1-e+t) >= tolen) end += tolen - (end+1-e+t); memmove(a+t, e, end+1-e); end = a+t+(end-e); *end = '\0'; memcpy(a, value, t); ret++; } else { a = e+1; #if defined(WIN32) || defined(__EMX__) && !defined(__CYGWIN__) if (*e == '\\') {*e = '/'; ret++;} // ha ha! #endif } } strlcpy(to, start, tolen); delete[] temp; return ret; } // // End of "$Id: filename_expand.cxx 6986 2010-01-01 18:30:49Z greg.ercolano $". //