1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106
|
#include <cstdio>
#include <cstdlib>
#include <cstdio>
#include <iostream>
#include <string.h>
#include <glib.h>
#ifdef WIN32
#include <w32api.h>
#define _WIN32_IE IE5
#define _WIN32_WINNT Windows2000
#include <shlobj.h>
#endif
#include "debug.h"
#include "searchpath.h"
#include "pathsupport.h"
using namespace std;
const char *get_homedir()
{
// return(getenv("HOME"));
#ifdef WIN32
static char homedir[MAX_PATH]={0};
static bool init=false;
if(!init)
{
SHGetFolderPath(NULL,CSIDL_APPDATA,NULL,SHGFP_TYPE(SHGFP_TYPE_CURRENT),homedir);
}
return(homedir);
#else
return(g_get_home_dir());
#endif
}
char *substitute_homedir(const char *path)
{
char *result=NULL;
if(path)
{
if(path[0]=='~')
++path;
else if(strncmp(path,"$HOME",5)==0)
path+=5;
else // No substitution to be done...
return(strdup(path));
if(path[0]=='/' || path[0]=='\\')
++path;
// If we get this far, then we need to substitute - and path now points
// to the beginning of the path proper...
const char *hd=get_homedir();
result=(char *)malloc(strlen(path)+strlen(hd)+2);
sprintf(result,"%s%c%s",hd,SEARCHPATH_SEPARATOR,path);
}
return(result);
}
char *substitute_xdgconfighome(const char *path)
{
const char *envvar="$XDG_CONFIG_HOME";
char *result=NULL;
if(path)
{
if(path[0]=='~')
++path;
else if(strncmp(path,envvar,strlen(envvar))==0)
path+=strlen(envvar);
else // No substitution to be done...
return(strdup(path));
if(path[0]=='/' || path[0]=='\\')
++path;
// If we get this far, then we need to substitute - and path now points
// to the beginning of the path proper...
const char *hd=NULL;
if((hd=getenv(envvar+1)))
{
// Debug[TRACE] << "Got XDG_CONFIG_HOME: " << hd << endl;
result=(char *)malloc(strlen(path)+strlen(hd)+2);
sprintf(result,"%s%c%s",hd,SEARCHPATH_SEPARATOR,path);
}
else
{
// Debug[TRACE] << "No XDG_CONFIG_HOME set - using $HOME/.config instead" << endl;
const char *hd=g_get_home_dir();
result=(char *)malloc(strlen(hd)+strlen("/.config/")+strlen(path)+strlen(hd)+2);
sprintf(result,"%s%c.config%c%s",hd,SEARCHPATH_SEPARATOR,SEARCHPATH_SEPARATOR,path);
}
}
return(result);
}
|