Start abs_path and basename to be used in cue files.
This commit is contained in:
1
lib/driver/.gitignore
vendored
1
lib/driver/.gitignore
vendored
@@ -7,6 +7,7 @@
|
||||
/.libs
|
||||
/Makefile
|
||||
/Makefile.in
|
||||
/abs_path
|
||||
/follow_symlink
|
||||
/libcdio.la
|
||||
/libcdio.la.ver
|
||||
|
||||
@@ -57,6 +57,7 @@ libcdio_sources = \
|
||||
_cdio_stdio.h \
|
||||
_cdio_stream.c \
|
||||
_cdio_stream.h \
|
||||
abs_path.c \
|
||||
aix.c \
|
||||
bsdi.c \
|
||||
audio.c \
|
||||
|
||||
176
lib/driver/abs_path.c
Normal file
176
lib/driver/abs_path.c
Normal file
@@ -0,0 +1,176 @@
|
||||
/*
|
||||
To compile as a standalone program:
|
||||
gcc -Wall -g -I../.. -DHAVE_CONFIG_H -DSTANDALONE -o abs_path abs_path.c
|
||||
*/
|
||||
#ifdef HAVE_CONFIG_H
|
||||
# include "config.h"
|
||||
# define __CDIO_CONFIG_H__ 1
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_STRING_H
|
||||
# include <string.h>
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_STDLIB_H
|
||||
# include <stdlib.h>
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_UNISTD_H
|
||||
# include <unistd.h>
|
||||
#endif
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
#ifndef PATH_MAX
|
||||
#define PATH_MAX 4096
|
||||
#endif
|
||||
|
||||
#ifndef NULL
|
||||
# define NULL 0
|
||||
#endif
|
||||
|
||||
#ifdef __CYGWIN__
|
||||
#undef DOSISH
|
||||
#endif
|
||||
#if defined __CYGWIN__ || defined DOSISH
|
||||
#define DOSISH_UNC
|
||||
#define DOSISH_DRIVE_LETTER
|
||||
#define FILE_ALT_SEPARATOR '\\'
|
||||
#endif
|
||||
|
||||
#ifndef CDIO_FILE_SEPARATOR
|
||||
# define CDIO_FILE_SEPARATOR '/'
|
||||
#endif
|
||||
|
||||
#if defined __CYGWIN__ || defined DOSISH
|
||||
# define FILE_ALT_SEPARATOR '\\'
|
||||
#endif
|
||||
|
||||
#ifdef CDIO_FILE_ALT_SEPARATOR
|
||||
# define isdirsep(x) ((x) == CDIO_FILE_SEPARATOR || (x) == CDIO_FILE_ALT_SEPARATOR)
|
||||
#else
|
||||
# define isdirsep(x) ((x) == CDIO_FILE_SEPARATOR)
|
||||
#endif
|
||||
|
||||
#define skipprefix(path) (path)
|
||||
|
||||
#ifndef CharNext /* defined as CharNext[AW] on Windows. */
|
||||
# define CharNext(p) ((p) + 1)
|
||||
#endif
|
||||
|
||||
static char *
|
||||
chompdirsep(const char *path)
|
||||
{
|
||||
while (*path) {
|
||||
if (isdirsep(*path)) {
|
||||
const char *last = path++;
|
||||
while (isdirsep(*path)) path++;
|
||||
if (!*path) return (char *)last;
|
||||
}
|
||||
else {
|
||||
path = CharNext(path);
|
||||
}
|
||||
}
|
||||
return (char *)path;
|
||||
}
|
||||
|
||||
static char *
|
||||
strrdirsep(const char *path)
|
||||
{
|
||||
char *last = NULL;
|
||||
while (*path) {
|
||||
if (isdirsep(*path)) {
|
||||
const char *tmp = path++;
|
||||
while (isdirsep(*path)) path++;
|
||||
if (!*path) break;
|
||||
last = (char *)tmp;
|
||||
}
|
||||
else {
|
||||
path = CharNext(path);
|
||||
}
|
||||
}
|
||||
return last;
|
||||
}
|
||||
|
||||
const char *
|
||||
cdio_basename(const char *name)
|
||||
{
|
||||
const char *p;
|
||||
#if defined DOSISH_DRIVE_LETTER || defined DOSISH_UNC
|
||||
const char *root;
|
||||
#endif
|
||||
long f, n = -1;
|
||||
|
||||
name = skipprefix(name);
|
||||
#if defined DOSISH_DRIVE_LETTER || defined DOSISH_UNC
|
||||
root = name;
|
||||
#endif
|
||||
while (isdirsep(*name))
|
||||
name++;
|
||||
if (!*name) {
|
||||
p = name - 1;
|
||||
f = 1;
|
||||
#if defined DOSISH_DRIVE_LETTER || defined DOSISH_UNC
|
||||
if (name != root) {
|
||||
/* has slashes */
|
||||
}
|
||||
#ifdef DOSISH_DRIVE_LETTER
|
||||
else if (*p == ':') {
|
||||
p++;
|
||||
f = 0;
|
||||
}
|
||||
#endif
|
||||
#ifdef DOSISH_UNC
|
||||
else {
|
||||
p = CDIO_FILE_SEPARARATOR;
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
}
|
||||
else {
|
||||
if (!(p = strrdirsep(name))) {
|
||||
p = name;
|
||||
}
|
||||
else {
|
||||
while (isdirsep(*p)) p++; /* skip last / */
|
||||
}
|
||||
n = chompdirsep(p) - p;
|
||||
}
|
||||
|
||||
return p;
|
||||
}
|
||||
|
||||
/* If fname isn't absolute, add cwd to it. */
|
||||
char *
|
||||
cdio_abspath(const char *cwd, char *fname)
|
||||
{
|
||||
if (isdirsep(*fname)) return fname;
|
||||
{
|
||||
size_t len = strlen(cwd) + strlen(fname) + 2;
|
||||
char* result = calloc(sizeof(char), len);
|
||||
snprintf(result, len, "%s%c%s",
|
||||
cwd, CDIO_FILE_SEPARATOR, fname);
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
#define STANDALONE 1
|
||||
#ifdef STANDALONE
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
char *dest;
|
||||
char cwd[PATH_MAX];
|
||||
|
||||
getcwd(cwd, sizeof(cwd));
|
||||
|
||||
if (argc != 2) {
|
||||
fprintf(stderr, "Usage: %s PATH\n", argv[0]);
|
||||
fprintf(stderr,
|
||||
" Make PATH absolute\n");
|
||||
exit(1);
|
||||
}
|
||||
dest = cdio_abspath (cwd, argv[1]);
|
||||
printf("%s -> %s\n", argv[1], dest);
|
||||
exit(0);
|
||||
}
|
||||
#endif
|
||||
@@ -14,6 +14,7 @@ _cdio_list_prepend
|
||||
_cdio_malloc
|
||||
_cdio_strfreev
|
||||
_cdio_strsplit
|
||||
cdio_abspath
|
||||
cdio_audio_get_msf_seconds
|
||||
cdio_audio_get_volume
|
||||
cdio_audio_pause
|
||||
|
||||
Reference in New Issue
Block a user