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 *GFileBuildName(char *dir,char *fname,char *buffer,size_t size) { int len; if ( dir==NULL || *dir=='\0' ) { if ( strlen( fname )<size-1 ) /* valgrind didn't like my strncpies but this complication makes it happy */ savestrcpy(buffer,fname); else { strncpy(buffer,fname,size-1); buffer[size-1]='\0'; } } else { if ( buffer!=dir ) { if ( strlen( dir )<size-3 ) strcpy(buffer,dir); else { strncpy(buffer,dir,size-3); buffer[size-3]='\0'; } } len = strlen(buffer); if ( buffer[len-1]!='/' ) buffer[len++] = '/'; if ( strlen( fname )<size-1 ) strcpy(buffer+len,fname); else { strncpy(buffer+len,fname,size-len-1); buffer[size-1]='\0'; } } return( buffer ); }