summaryrefslogtreecommitdiff
path: root/src/Fl_System_Driver.cxx
diff options
context:
space:
mode:
authorManolo Gouy <Manolo>2016-04-07 16:54:20 +0000
committerManolo Gouy <Manolo>2016-04-07 16:54:20 +0000
commit19b98e40de481349f88c02883a2330ed19ccd316 (patch)
tree40346d9c13d70c2658406bcc7a5f0eedb83ec88b /src/Fl_System_Driver.cxx
parent050dfb55045e81ff681982f3d429d9cf8850a606 (diff)
Rewrite filename_expand.cxx under the driver model.
git-svn-id: file:///fltk/svn/fltk/branches/branch-1.3-porting@11553 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
Diffstat (limited to 'src/Fl_System_Driver.cxx')
-rw-r--r--src/Fl_System_Driver.cxx45
1 files changed, 45 insertions, 0 deletions
diff --git a/src/Fl_System_Driver.cxx b/src/Fl_System_Driver.cxx
index 212c293fd..0ececcb92 100644
--- a/src/Fl_System_Driver.cxx
+++ b/src/Fl_System_Driver.cxx
@@ -24,6 +24,7 @@
#include <stdio.h>
#include <stdarg.h>
#include <string.h>
+#include "flstring.h"
const int Fl_System_Driver::flNoValue = 0x0000;
const int Fl_System_Driver::flWidthValue = 0x0004;
@@ -372,6 +373,50 @@ int Fl_System_Driver::clocale_printf(FILE *output, const char *format, va_list a
return vfprintf(output, format, args);
}
+int Fl_System_Driver::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; a<end; ) { // for each slash component
+ char *e; for (e=a; e<end && *e != '/'; e++) {/*empty*/} // find next slash
+ const char *value = 0; // this will point at substitute value
+ switch (*a) {
+ case '~': // a home directory name
+ if (e <= a+1) { // current user's directory
+ value = getenv("HOME");
+ } else { // another user's directory
+ char t = *e; *(char *)e = 0;
+ value = getpwnam(a+1);
+ *(char *)e = t;
+ }
+ break;
+ case '$': /* an environment variable */
+ {char t = *e; *(char *)e = 0; value = getenv(a+1); *(char *)e = t;}
+ break;
+ }
+ if (value) {
+ // substitutions that start with slash delete everything before them:
+ if (value[0] == '/') start = a;
+ int t = (int) strlen(value); if (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;
+ }
+ }
+ strlcpy(to, start, tolen);
+ delete[] temp;
+ return ret;
+}
+
//
// End of "$Id$".
//