89 lines
2 KiB
C
89 lines
2 KiB
C
|
/*
|
||
|
sysutil: generic utilities to interact with the OS (signals, paths)
|
||
|
|
||
|
copyright ?-2014 by the mpg123 project - free software under the terms of the LGPL 2.1
|
||
|
see COPYING and AUTHORS files in distribution or http://mpg123.org
|
||
|
initially written by Michael Hipp (dissected/renamed by Thomas Orgis)
|
||
|
*/
|
||
|
|
||
|
#include "mpg123app.h"
|
||
|
#include <sys/stat.h>
|
||
|
#include "sysutil.h"
|
||
|
|
||
|
#include "common/debug.h"
|
||
|
|
||
|
#if 0
|
||
|
/* removed the strndup for better portability */
|
||
|
/*
|
||
|
* Allocate space for a new string containing the first
|
||
|
* "num" characters of "src". The resulting string is
|
||
|
* always zero-terminated. Returns NULL if malloc fails.
|
||
|
*/
|
||
|
char *strndup (const char *src, int num)
|
||
|
{
|
||
|
char *dst;
|
||
|
|
||
|
if (!(dst = (char *) malloc(num+1)))
|
||
|
return (NULL);
|
||
|
dst[num] = '\0';
|
||
|
return (strncpy(dst, src, num));
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
|
||
|
size_t dir_length(const char *path)
|
||
|
{
|
||
|
char * slashpos = strrchr(path, '/');
|
||
|
return (slashpos ? slashpos-path : 0);
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* Split "path" into directory and filename components.
|
||
|
*
|
||
|
* Return value is 0 if no directory was specified (i.e.
|
||
|
* "path" does not contain a '/'), OR if the directory
|
||
|
* is the same as on the previous call to this function.
|
||
|
*
|
||
|
* Return value is 1 if a directory was specified AND it
|
||
|
* is different from the previous one (if any).
|
||
|
*/
|
||
|
|
||
|
int split_dir_file (const char *path, char **dname, char **fname)
|
||
|
{
|
||
|
static char *lastdir = NULL;
|
||
|
char *slashpos;
|
||
|
|
||
|
if ((slashpos = strrchr(path, '/'))) {
|
||
|
*fname = slashpos + 1;
|
||
|
*dname = INT123_compat_strdup(path); /* , 1 + slashpos - path); */
|
||
|
if(!(*dname)) {
|
||
|
perror("failed to allocate memory for dir name");
|
||
|
return 0;
|
||
|
}
|
||
|
(*dname)[1 + slashpos - path] = 0;
|
||
|
if (lastdir && !strcmp(lastdir, *dname)) {
|
||
|
/*** same as previous directory ***/
|
||
|
free (*dname);
|
||
|
*dname = lastdir;
|
||
|
return 0;
|
||
|
}
|
||
|
else {
|
||
|
/*** different directory ***/
|
||
|
if (lastdir)
|
||
|
free (lastdir);
|
||
|
lastdir = *dname;
|
||
|
return 1;
|
||
|
}
|
||
|
}
|
||
|
else {
|
||
|
/*** no directory specified ***/
|
||
|
if (lastdir) {
|
||
|
free (lastdir);
|
||
|
lastdir = NULL;
|
||
|
};
|
||
|
*dname = NULL;
|
||
|
*fname = (char *)path;
|
||
|
return 0;
|
||
|
}
|
||
|
}
|