char *GFileGetAbsoluteName(char *name, char *result, int rsiz) { /* result may be the same as name */ char buffer[1000]; if (!GFileIsAbsolute(name)) { char *pt, *spt, *rpt, *bpt; if (dirname_[0] == '\0') { getcwd(dirname_, sizeof(dirname_)); } strcpy(buffer, dirname_); if (buffer[strlen(buffer) - 1] != '/') strcat(buffer, "/"); strcat(buffer, name); #if defined(__MINGW32__) _backslash_to_slash(buffer); #endif /* Normalize out any .. */ spt = rpt = buffer; while (*spt != '\0') { if (*spt == '/') { if (*++spt == '\0') break; } for (pt = spt; *pt != '\0' && *pt != '/'; ++pt); if (pt == spt) /* Found // in a path spec, reduce to / (we've */ savestrcpy(spt, spt + 1); /* skipped past the :// of the machine name) */ else if (pt == spt + 1 && spt[0] == '.' && *pt == '/') { /* Noop */ savestrcpy(spt, spt + 2); } else if (pt == spt + 2 && spt[0] == '.' && spt[1] == '.') { for (bpt = spt - 2; bpt > rpt && *bpt != '/'; --bpt); if (bpt >= rpt && *bpt == '/') { savestrcpy(bpt, pt); spt = bpt; } else { rpt = pt; spt = pt; } } else spt = pt; } name = buffer; if (rsiz > sizeof(buffer)) rsiz = sizeof(buffer); /* Else valgrind gets unhappy */ } if (result != name) { strncpy(result, name, rsiz); result[rsiz - 1] = '\0'; #if defined(__MINGW32__) _backslash_to_slash(result); #endif } return (result); }
char *GFileGetHomeDocumentsDir(void) { static char* ret = 0; if( ret ) return ret; #if defined(__MINGW32__) CHAR my_documents[MAX_PATH+2]; HRESULT result = SHGetFolderPath(NULL, CSIDL_PERSONAL, NULL, SHGFP_TYPE_CURRENT, my_documents ); if (result != S_OK) { fprintf(stderr,"Error: Can't get My Documents path!'\n"); return ret; } int pos = strlen(my_documents); my_documents[ pos++ ] = '\\'; my_documents[ pos++ ] = '\0'; ret = copy( my_documents ); _backslash_to_slash(ret); return ret; #endif // On GNU/Linux and OSX it was decided that this should be just the // home directory itself. ret = GFileGetHomeDir(); return ret; }
/* reimplementation of GFileGetHomeDir, avoiding copy(). Returns NULL if home * directory cannot be found */ char *getUserHomeDir(void) { #if defined(__MINGW32__) char* dir = getenv("APPDATA"); if( dir==NULL ) dir = getenv("USERPROFILE"); if( dir!=NULL ) { _backslash_to_slash(dir); return dir; } return NULL; #else uid_t uid; struct passwd *pw; char *home = getenv("HOME"); if( home!=NULL ) return home; uid = getuid(); while( (pw=getpwent())!=NULL ) { if ( pw->pw_uid==uid ) { home = pw->pw_dir; endpwent(); return home; } } endpwent(); return NULL; #endif }
char *GFileGetHomeDir(void) { #if defined(__MINGW32__) char* dir = getenv("HOME"); if(!dir) dir = getenv("USERPROFILE"); if(dir){ char* buffer = copy(dir); _backslash_to_slash(buffer); return buffer; } return NULL; #else static char *dir; uid_t uid; struct passwd *pw; dir = getenv("HOME"); if ( dir!=NULL ) return( copy(dir) ); uid = getuid(); while ( (pw=getpwent())!=NULL ) { if ( pw->pw_uid==uid ) { dir = copy(pw->pw_dir); endpwent(); return( dir ); } } endpwent(); return( NULL ); #endif }
char *GFileDirName(const char *path) { char ret[PATH_MAX+1]; strncpy( ret, path, PATH_MAX ); _backslash_to_slash( ret ); char *pt = strrchr( ret, '/' ); if ( pt ) *pt = '\0'; return strdup(ret); }