summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/plugin.c4
-rw-r--r--src/pluginui.c2
-rw-r--r--src/slv2_internal.h9
-rw-r--r--src/util.c19
-rw-r--r--src/value.c14
-rw-r--r--src/world.c63
6 files changed, 83 insertions, 28 deletions
diff --git a/src/plugin.c b/src/plugin.c
index ce5299e..a4f9338 100644
--- a/src/plugin.c
+++ b/src/plugin.c
@@ -30,10 +30,6 @@
#include <stdlib.h>
#include <string.h>
-#ifdef SLV2_DYN_MANIFEST
-#include <dlfcn.h>
-#endif
-
#include "slv2-config.h"
#include "slv2_internal.h"
diff --git a/src/pluginui.c b/src/pluginui.c
index 4d61690..c81a5dd 100644
--- a/src/pluginui.c
+++ b/src/pluginui.c
@@ -51,7 +51,7 @@ slv2_ui_new(SLV2World world,
ui->binary_uri = binary_uri;
// FIXME: kludge
- char* bundle = strdup(slv2_value_as_string(ui->binary_uri));
+ char* bundle = slv2_strdup(slv2_value_as_string(ui->binary_uri));
char* last_slash = strrchr(bundle, '/') + 1;
*last_slash = '\0';
ui->bundle_uri = slv2_value_new_uri(world, bundle);
diff --git a/src/slv2_internal.h b/src/slv2_internal.h
index d24d570..e2a6807 100644
--- a/src/slv2_internal.h
+++ b/src/slv2_internal.h
@@ -28,7 +28,15 @@ extern "C" {
#include <stdint.h>
#include <stdlib.h>
+#ifdef __WIN32__
+#include <windows.h>
+#define dlopen(path, flags) LoadLibrary(path)
+#define dlclose(lib) FreeLibrary(lib)
+#define dlsym GetProcAddress
+static inline char* dlerror(void) { return "Unknown error"; }
+#else
#include <dlfcn.h>
+#endif
#include <glib.h>
@@ -379,6 +387,7 @@ SLV2Values slv2_values_from_stream_objects(SLV2Plugin p,
/* ********* Utilities ********* */
char* slv2_strjoin(const char* first, ...);
+char* slv2_strdup(const char* str);
char* slv2_get_lang();
uint8_t* slv2_qname_expand(SLV2Plugin p, const char* qname);
diff --git a/src/util.c b/src/util.c
index ba2ca5d..d7ac0b7 100644
--- a/src/util.c
+++ b/src/util.c
@@ -59,13 +59,28 @@ slv2_strjoin(const char* first, ...)
return result;
}
+char*
+slv2_strdup(const char* str)
+{
+ const size_t len = strlen(str);
+ char* dup = malloc(len + 1);
+ memcpy(dup, str, len + 1);
+ return dup;
+}
+
const char*
slv2_uri_to_path(const char* uri)
{
- if (!strncmp(uri, "file://", (size_t)7))
+#ifdef __WIN32__
+ if (!strncmp(uri, "file:///", (size_t)8)) {
+ return (char*)(uri + 8);
+#else
+ if (!strncmp(uri, "file://", (size_t)7)) {
return (char*)(uri + 7);
- else
+#endif
+ } else {
return NULL;
+ }
}
/** Return the current LANG converted to Turtle (i.e. RFC3066) style.
diff --git a/src/value.c b/src/value.c
index 09a0720..3dce427 100644
--- a/src/value.c
+++ b/src/value.c
@@ -48,7 +48,7 @@ slv2_value_set_numerics_from_string(SLV2Value val)
break;
case SLV2_VALUE_INT:
// FIXME: locale kludge, need a locale independent strtol
- locale = strdup(setlocale(LC_NUMERIC, NULL));
+ locale = slv2_strdup(setlocale(LC_NUMERIC, NULL));
setlocale(LC_NUMERIC, "POSIX");
val->val.int_val = strtol(val->str_val, &endptr, 10);
setlocale(LC_NUMERIC, locale);
@@ -56,7 +56,7 @@ slv2_value_set_numerics_from_string(SLV2Value val)
break;
case SLV2_VALUE_FLOAT:
// FIXME: locale kludge, need a locale independent strtod
- locale = strdup(setlocale(LC_NUMERIC, NULL));
+ locale = slv2_strdup(setlocale(LC_NUMERIC, NULL));
setlocale(LC_NUMERIC, "POSIX");
val->val.float_val = strtod(val->str_val, &endptr);
setlocale(LC_NUMERIC, locale);
@@ -91,7 +91,7 @@ slv2_value_new(SLV2World world, SLV2ValueType type, const char* str)
case SLV2_VALUE_INT:
case SLV2_VALUE_FLOAT:
case SLV2_VALUE_BOOL:
- val->str_val = strdup(str);
+ val->str_val = slv2_strdup(str);
break;
}
@@ -207,7 +207,7 @@ slv2_value_duplicate(SLV2Value val)
result->val.uri_val = slv2_node_copy(val->val.uri_val);
result->str_val = (char*)sord_node_get_string(result->val.uri_val);
} else {
- result->str_val = strdup(val->str_val);
+ result->str_val = slv2_strdup(val->str_val);
result->val = val->val;
}
@@ -277,12 +277,12 @@ slv2_value_get_turtle_token(SLV2Value value)
case SLV2_VALUE_STRING:
case SLV2_VALUE_QNAME_UNUSED:
case SLV2_VALUE_BOOL:
- result = strdup(value->str_val);
+ result = slv2_strdup(value->str_val);
break;
case SLV2_VALUE_INT:
// INT64_MAX is 9223372036854775807 (19 digits) + 1 for sign
// FIXME: locale kludge, need a locale independent snprintf
- locale = strdup(setlocale(LC_NUMERIC, NULL));
+ locale = slv2_strdup(setlocale(LC_NUMERIC, NULL));
len = 20;
result = calloc(len, 1);
setlocale(LC_NUMERIC, "POSIX");
@@ -291,7 +291,7 @@ slv2_value_get_turtle_token(SLV2Value value)
break;
case SLV2_VALUE_FLOAT:
// FIXME: locale kludge, need a locale independent snprintf
- locale = strdup(setlocale(LC_NUMERIC, NULL));
+ locale = slv2_strdup(setlocale(LC_NUMERIC, NULL));
len = 20; // FIXME: proper maximum value?
result = calloc(len, 1);
setlocale(LC_NUMERIC, "POSIX");
diff --git a/src/world.c b/src/world.c
index 6209c8c..ea2e20c 100644
--- a/src/world.c
+++ b/src/world.c
@@ -30,9 +30,8 @@
#include <string.h>
#include <dirent.h>
+#ifdef HAVE_WORDEXP
#include <wordexp.h>
-#ifdef SLV2_DYN_MANIFEST
-#include <dlfcn.h>
#endif
#include "slv2_internal.h"
@@ -212,7 +211,8 @@ slv2_world_find_statements(SLV2World world,
}
static SerdNode
-slv2_new_uri_relative_to_base(const uint8_t* uri_str, const uint8_t* base_uri_str)
+slv2_new_uri_relative_to_base(const uint8_t* uri_str,
+ const uint8_t* base_uri_str)
{
SerdURI base_uri;
if (!serd_uri_parse(base_uri_str, &base_uri)) {
@@ -496,22 +496,26 @@ slv2_world_load_bundle(SLV2World world, SLV2Value bundle_uri)
static char*
expand(const char* path)
{
+#ifdef HAVE_WORDEXP
char* ret = NULL;
wordexp_t p;
wordexp(path, &p, 0);
if (p.we_wordc == 0) {
- // Literal directory path (e.g. no variables or ~)
- ret = strdup(path);
+ /* Literal directory path (e.g. no variables or ~) */
+ ret = slv2_strdup(path);
} else if (p.we_wordc == 1) {
- // Directory path expands (e.g. contains ~ or $FOO)
- ret = strdup(p.we_wordv[0]);
+ /* Directory path expands (e.g. contains ~ or $FOO) */
+ ret = slv2_strdup(p.we_wordv[0]);
} else {
- // Multiple expansions in a single directory path?
- fprintf(stderr, "lv2config: malformed path `%s' ignored\n", path);
+ /* Multiple expansions in a single directory path? */
+ SLV2_ERRORF("malformed path `%s' ignored\n", path);
}
wordfree(&p);
+#else
+ char* ret = slv2_strdup(path);
+#endif
return ret;
}
@@ -521,31 +525,43 @@ slv2_world_load_directory(SLV2World world, const char* dir_path)
{
char* path = expand(dir_path);
if (!path) {
+ SLV2_WARNF("empty path `%s'\n", path);
return;
}
DIR* pdir = opendir(path);
if (!pdir) {
+ SLV2_WARNF("failed to open directory `%s' (%s)\n",
+ path, strerror(errno));
free(path);
return;
}
+#ifdef __WIN32__
+ static const char* const file_scheme = "file:///";
+#else
+ static const char* const file_scheme = "file://";
+#endif
+ const size_t file_scheme_len = strlen(file_scheme);
+
struct dirent* pfile;
while ((pfile = readdir(pdir))) {
if (!strcmp(pfile->d_name, ".") || !strcmp(pfile->d_name, ".."))
continue;
- char* uri = slv2_strjoin("file://",
- path, SLV2_DIR_SEP,
- pfile->d_name, SLV2_DIR_SEP,
+ char* uri = slv2_strjoin(file_scheme,
+ path, "/",
+ pfile->d_name, "/",
NULL);
- DIR* const bundle_dir = opendir(uri + 7);
+ DIR* const bundle_dir = opendir(uri + file_scheme_len);
if (bundle_dir) {
closedir(bundle_dir);
SLV2Value uri_val = slv2_value_new_uri(world, uri);
slv2_world_load_bundle(world, uri_val);
slv2_value_free(uri_val);
+ } else {
+ SLV2_WARNF("failed to open bundle `%s'\n", uri);
}
free(uri);
@@ -555,6 +571,25 @@ slv2_world_load_directory(SLV2World world, const char* dir_path)
closedir(pdir);
}
+static bool
+is_path_sep(char c)
+{
+ return c == SLV2_PATH_SEP[0];
+}
+
+const char*
+last_path_sep(const char* path)
+{
+ const size_t len = strlen(path);
+ const char* last_sep = path + len;
+ for (; last_sep > path; --last_sep) {
+ if (is_path_sep(*last_sep)) {
+ break;
+ }
+ }
+ return is_path_sep(*last_sep) ? last_sep : NULL;
+}
+
/** Load all bundles found in @a lv2_path.
* @param lv2_path A colon-delimited list of directories. These directories
* should contain LV2 bundle directories (ie the search path is a list of
@@ -565,7 +600,7 @@ slv2_world_load_path(SLV2World world,
const char* lv2_path)
{
while (lv2_path[0] != '\0') {
- const char* const sep = strchr(lv2_path, SLV2_PATH_SEP[0]);
+ const char* const sep = last_path_sep(lv2_path);
if (sep) {
const size_t dir_len = sep - lv2_path;
char* const dir = malloc(dir_len + 1);