static void *
xmalloc(size_t n)
{
void *obj = malloc(n);
if (obj == NULL) {
perror("xmalloc");
exit(EXIT_FAILURE);
}
return obj;
}
char *
get_pathname(const char *path)
{
char *slash = strrchr('/', path);
if (slash == NULL) {
char *dot = xmalloc(2);
strcpy(dot, ".");
return dot;
}
char *parent = xmalloc((slash - path) + 1);
memcpy(parent, path, slash - path);
parent[slash - path] = '\0';
return parent;
}
char *
get_filename(const char *path)
{
const char *slash = strrchr('/', path);
const char *filename = (slash == NULL) ? "" : (slash + 1);
char *result = xmalloc(strlen(filename) + 1);
strcpy(result, filename);
return result;
}
Я добавил недостающую обработку ошибок и случаи, когда нет косой черты в данном пути. В исходном коде у вас была утечка памяти в get_pathname
: вы звонили malloc
через get_filename
, но не free
этой памяти после того, как вы ее использовали.