rewrite ngdirname()

This commit is contained in:
rlar 2011-08-07 19:26:53 +00:00
parent e277eb3485
commit 9fd458f0ed
2 changed files with 43 additions and 61 deletions

View File

@ -1,4 +1,8 @@
2011-08-04 Paolo Nenzi
2011-08-07 Robert Larice
* src/misc/util.c :
rewrite ngdirname()
2011-08-07 Paolo Nenzi
* (new) examples/pss ,
* (new) examples/pss/colpitt_osc_pss.cir ,
* (new) examples/compl_cross_quad_osc_pss.cir ,

View File

@ -187,53 +187,48 @@ basename(const char *name)
}
*/
#if defined(HAS_WINDOWS) || defined(_MSC_VER) || defined(__MINGW32__)
/* allow back slashes \\ */
char *
ngdirname(const char *name)
{
static char *ret = NULL;
size_t len;
size_t size = 0;
const char *p;
const char *end = NULL;
int start = 0;
if (ret) {
free(ret);
ret = NULL;
}
if (!name || !strcmp(name, "") || (!strstr(name, "/") && !strstr(name, "\\")))
return(".");
if(name && ((name[0] >= 'a' && name[0] <= 'z') ||
(name[0] >= 'A' && name[0] <= 'Z')) && name[1] == ':')
start = 2;
if (!strcmp(name, "/"))
return (char*) name;
if(name) {
const char *p = name + start;
for(; *p; p++)
if(*p == '/' || *p == '\\')
end = p;
}
if (!strcmp(name, "\\"))
return (char*) name;
// find the last slash in the string
if(end && end == name + start)
end++;
len = strlen(name);
p = &name[len - 1];
if(end)
ret = copy_substring(name, end);
else {
char *p = TMALLOC(char, 4);
ret = p;
if(start) {
*p++ = name[0];
*p++ = name[1];
}
*p++ = '.';
*p++ = '\0';
}
if (*p == '/') p--; /* skip the trailing / */
if (*p == '\\') p--; /* skip the trailing \ */
while (p != name && *p != '/' && *p != '\\') p--;
size = (size_t)(p - name);
if (size) {
ret = TMALLOC(char, size + 1);
memcpy(ret, name, size);
ret[size] = '\0';
} else if (*p == '/')
return "/";
else if (*p == '\\')
return "\\";
else
return "";
return ret;
}
@ -243,41 +238,24 @@ char *
ngdirname(const char *name)
{
static char *ret = NULL;
size_t len;
size_t size = 0;
const char *p;
const char *end;
if (ret) {
free(ret);
ret = NULL;
}
if (!name || !strcmp(name, "") || !strstr(name, "/"))
return(".");
end = name ? strrchr(name, '/') : NULL;
if (!strcmp(name, "/"))
return(name);
if(end && end == name)
end++;
// find the last slash in the string
len = strlen(name);
p = &name[len - 1];
if (*p == '/') p--; /* skip the trailing / */
while (p != name && *p != '/') p--;
size = (size_t)(p - name);
if (size) {
ret = TMALLOC(char, size + 1);
memcpy(ret, name, size);
ret[size] = '\0';
} else if (*p == '/')
return "/";
if(end)
ret = copy_substring(name, end);
else
return "";
return (const char *) ret;
}
#endif
ret = copy(".");
return ret;
}
#endif