You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucy.apache.org by nw...@apache.org on 2013/09/14 21:29:39 UTC
[lucy-commits] [07/15] git commit: refs/heads/cfish-string-prep1 - Use Str_To_Utf8
to get NULL-terminated C strings
Use Str_To_Utf8 to get NULL-terminated C strings
Project: http://git-wip-us.apache.org/repos/asf/lucy/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucy/commit/235519b2
Tree: http://git-wip-us.apache.org/repos/asf/lucy/tree/235519b2
Diff: http://git-wip-us.apache.org/repos/asf/lucy/diff/235519b2
Branch: refs/heads/cfish-string-prep1
Commit: 235519b29ffd9cdc62e4282e53f434fa3641f470
Parents: 41a5ef7
Author: Nick Wellnhofer <we...@aevum.de>
Authored: Sat Sep 14 18:28:53 2013 +0200
Committer: Nick Wellnhofer <we...@aevum.de>
Committed: Sat Sep 14 18:28:53 2013 +0200
----------------------------------------------------------------------
c/sample/getting_started.c | 4 +-
c/src/Lucy/Analysis/RegexTokenizer.c | 7 +-
clownfish/runtime/c/src/Clownfish/Err.c | 9 +-
.../core/Clownfish/TestHarness/TestFormatter.c | 5 +-
clownfish/runtime/perl/xs/XSBind.c | 2 +
core/Lucy/Store/FSDirHandle.c | 12 ++-
core/Lucy/Store/FSFileHandle.c | 12 ++-
core/Lucy/Store/FSFolder.c | 100 ++++++++++++-------
8 files changed, 101 insertions(+), 50 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/lucy/blob/235519b2/c/sample/getting_started.c
----------------------------------------------------------------------
diff --git a/c/sample/getting_started.c b/c/sample/getting_started.c
index 2816a30..f7bbcfe 100644
--- a/c/sample/getting_started.c
+++ b/c/sample/getting_started.c
@@ -175,9 +175,11 @@ S_search(IndexSearcher *searcher, const char *query) {
// Loop over search results.
while (NULL != (hit = Hits_Next(hits))) {
String *value_str = (String*)HitDoc_Extract(hit, field_str);
+ char *value = Str_To_Utf8(value_str);
- printf("Result %d: %s\n", i, Str_Get_Ptr8(value_str));
+ printf("Result %d: %s\n", i, value);
+ DECREF(value);
DECREF(value_str);
DECREF(hit);
i++;
http://git-wip-us.apache.org/repos/asf/lucy/blob/235519b2/c/src/Lucy/Analysis/RegexTokenizer.c
----------------------------------------------------------------------
diff --git a/c/src/Lucy/Analysis/RegexTokenizer.c b/c/src/Lucy/Analysis/RegexTokenizer.c
index bb3f96b..62085cb 100644
--- a/c/src/Lucy/Analysis/RegexTokenizer.c
+++ b/c/src/Lucy/Analysis/RegexTokenizer.c
@@ -48,10 +48,12 @@ RegexTokenizer_init(RegexTokenizer *self, const String *pattern) {
Analyzer_init((Analyzer*)self);
RegexTokenizerIVARS *const ivars = RegexTokenizer_IVARS(self);
+ char *pattern_buf = NULL;
const char *pattern_ptr;
if (pattern) {
ivars->pattern = Str_Clone(pattern);
- pattern_ptr = (char*)Str_Get_Ptr8(ivars->pattern);
+ pattern_buf = Str_To_Utf8(ivars->pattern);
+ pattern_ptr = pattern_buf;
}
else {
pattern_ptr = "\\w+(?:['\\x{2019}]\\w+)*";
@@ -71,6 +73,9 @@ RegexTokenizer_init(RegexTokenizer *self, const String *pattern) {
const char *err_ptr;
int err_offset;
pcre *re = pcre_compile(pattern_ptr, options, &err_ptr, &err_offset, NULL);
+ if (pattern_buf) {
+ FREEMEM(pattern_buf);
+ }
if (!re) {
THROW(ERR, "%s", err_ptr);
}
http://git-wip-us.apache.org/repos/asf/lucy/blob/235519b2/clownfish/runtime/c/src/Clownfish/Err.c
----------------------------------------------------------------------
diff --git a/clownfish/runtime/c/src/Clownfish/Err.c b/clownfish/runtime/c/src/Clownfish/Err.c
index ae13494..b360d5a 100644
--- a/clownfish/runtime/c/src/Clownfish/Err.c
+++ b/clownfish/runtime/c/src/Clownfish/Err.c
@@ -26,6 +26,7 @@
#include "Clownfish/Err.h"
#include "Clownfish/String.h"
+#include "Clownfish/Util/Memory.h"
#include "Clownfish/VTable.h"
/* TODO: Thread safety */
@@ -58,7 +59,9 @@ Err_do_throw(Err *error) {
}
else {
String *message = Err_Get_Mess(error);
- fprintf(stderr, "%s", Str_Get_Ptr8(message));
+ char *utf8 = Str_To_Utf8(message);
+ fprintf(stderr, "%s", utf8);
+ FREEMEM(utf8);
exit(EXIT_FAILURE);
}
}
@@ -78,7 +81,9 @@ Err_throw_mess(VTable *vtable, String *message) {
void
Err_warn_mess(String *message) {
- fprintf(stderr, "%s", Str_Get_Ptr8(message));
+ char *utf8 = Str_To_Utf8(message);
+ fprintf(stderr, "%s", utf8);
+ FREEMEM(utf8);
DECREF(message);
}
http://git-wip-us.apache.org/repos/asf/lucy/blob/235519b2/clownfish/runtime/core/Clownfish/TestHarness/TestFormatter.c
----------------------------------------------------------------------
diff --git a/clownfish/runtime/core/Clownfish/TestHarness/TestFormatter.c b/clownfish/runtime/core/Clownfish/TestHarness/TestFormatter.c
index 6088c89..c5016be 100644
--- a/clownfish/runtime/core/Clownfish/TestHarness/TestFormatter.c
+++ b/clownfish/runtime/core/Clownfish/TestHarness/TestFormatter.c
@@ -28,6 +28,7 @@
#include "Clownfish/Err.h"
#include "Clownfish/TestHarness/TestBatch.h"
#include "Clownfish/TestHarness/TestSuiteRunner.h"
+#include "Clownfish/Util/Memory.h"
#include "Clownfish/VTable.h"
TestFormatter*
@@ -79,7 +80,9 @@ TestFormatterCF_Batch_Prologue_IMP(TestFormatterCF *self, TestBatch *batch,
UNUSED_VAR(self);
UNUSED_VAR(num_planned);
String *class_name = TestBatch_Get_Class_Name(batch);
- printf("Running %s...\n", Str_Get_Ptr8(class_name));
+ char *utf8 = Str_To_Utf8(class_name);
+ printf("Running %s...\n", utf8);
+ FREEMEM(utf8);
}
void
http://git-wip-us.apache.org/repos/asf/lucy/blob/235519b2/clownfish/runtime/perl/xs/XSBind.c
----------------------------------------------------------------------
diff --git a/clownfish/runtime/perl/xs/XSBind.c b/clownfish/runtime/perl/xs/XSBind.c
index 379bc7d..0f21e50 100644
--- a/clownfish/runtime/perl/xs/XSBind.c
+++ b/clownfish/runtime/perl/xs/XSBind.c
@@ -85,6 +85,8 @@ cfish_Obj*
XSBind_maybe_sv_to_cfish_obj(SV *sv, cfish_VTable *vtable, void *allocation) {
cfish_Obj *retval = NULL;
if (XSBind_sv_defined(sv)) {
+ // Assume that the class name is always NULL-terminated. Somewhat
+ // dangerous but should be safe.
if (sv_isobject(sv)
&& sv_derived_from(sv, (char*)CFISH_Str_Get_Ptr8(CFISH_VTable_Get_Name(vtable)))
) {
http://git-wip-us.apache.org/repos/asf/lucy/blob/235519b2/core/Lucy/Store/FSDirHandle.c
----------------------------------------------------------------------
diff --git a/core/Lucy/Store/FSDirHandle.c b/core/Lucy/Store/FSDirHandle.c
index 631f2f6..6fcf793 100644
--- a/core/Lucy/Store/FSDirHandle.c
+++ b/core/Lucy/Store/FSDirHandle.c
@@ -208,13 +208,13 @@ FSDH_Next_IMP(FSDirHandle *self) {
FSDirHandle*
FSDH_do_open(FSDirHandle *self, const String *dir) {
- char *dir_path_ptr = (char*)Str_Get_Ptr8(dir);
-
DH_init((DirHandle*)self, dir);
FSDirHandleIVARS *const ivars = FSDH_IVARS(self);
ivars->sys_dir_entry = NULL;
+ char *dir_path_ptr = Str_To_Utf8(dir);
ivars->sys_dirhandle = opendir(dir_path_ptr);
+ FREEMEM(dir_path_ptr);
if (!ivars->sys_dirhandle) {
Err_set_error(Err_new(Str_newf("Failed to opendir '%o'", dir)));
DECREF(self);
@@ -272,9 +272,11 @@ FSDH_Entry_Is_Dir_IMP(FSDirHandle *self) {
struct stat stat_buf;
String *fullpath = Str_newf("%o%s%o", ivars->dir, CHY_DIR_SEP,
ivars->entry);
- if (stat((char*)Str_Get_Ptr8(fullpath), &stat_buf) != -1) {
+ char *fullpath_ptr = Str_To_Utf8(fullpath);
+ if (stat(fullpath_ptr, &stat_buf) != -1) {
if (stat_buf.st_mode & S_IFDIR) { retval = true; }
}
+ FREEMEM(fullpath_ptr);
DECREF(fullpath);
return retval;
}
@@ -293,9 +295,11 @@ FSDH_Entry_Is_Symlink_IMP(FSDirHandle *self) {
struct stat stat_buf;
String *fullpath = Str_newf("%o%s%o", ivars->dir, CHY_DIR_SEP,
ivars->entry);
- if (stat((char*)Str_Get_Ptr8(fullpath), &stat_buf) != -1) {
+ char *fullpath_ptr = Str_To_Utf8(fullpath);
+ if (stat(fullpath_ptr, &stat_buf) != -1) {
if (stat_buf.st_mode & S_IFLNK) { retval = true; }
}
+ FREEMEM(fullpath_ptr);
DECREF(fullpath);
return retval;
}
http://git-wip-us.apache.org/repos/asf/lucy/blob/235519b2/core/Lucy/Store/FSFileHandle.c
----------------------------------------------------------------------
diff --git a/core/Lucy/Store/FSFileHandle.c b/core/Lucy/Store/FSFileHandle.c
index 020eb9f..1f8b831 100644
--- a/core/Lucy/Store/FSFileHandle.c
+++ b/core/Lucy/Store/FSFileHandle.c
@@ -100,7 +100,9 @@ FSFH_do_open(FSFileHandle *self, const String *path, uint32_t flags) {
// Attempt to open file.
if (flags & FH_WRITE_ONLY) {
- ivars->fd = open((char*)Str_Get_Ptr8(path), SI_posix_flags(flags), 0666);
+ char *path_ptr = Str_To_Utf8(path);
+ ivars->fd = open(path_ptr, SI_posix_flags(flags), 0666);
+ FREEMEM(path_ptr);
if (ivars->fd == -1) {
ivars->fd = 0;
Err_set_error(Err_new(Str_newf("Attempt to open '%o' failed: %s",
@@ -330,8 +332,9 @@ SI_init_read_only(FSFileHandle *self, FSFileHandleIVARS *ivars) {
UNUSED_VAR(self);
// Open.
- ivars->fd = open((char*)Str_Get_Ptr8(ivars->path),
- SI_posix_flags(ivars->flags), 0666);
+ char *path_ptr = Str_To_Utf8(ivars->path);
+ ivars->fd = open(path_ptr, SI_posix_flags(ivars->flags), 0666);
+ FREEMEM(path_ptr);
if (ivars->fd == -1) {
ivars->fd = 0;
Err_set_error(Err_new(Str_newf("Can't open '%o': %s", ivars->path,
@@ -438,7 +441,7 @@ FSFH_Read_IMP(FSFileHandle *self, char *dest, int64_t offset, size_t len) {
static CFISH_INLINE bool
SI_init_read_only(FSFileHandle *self, FSFileHandleIVARS *ivars) {
- char *filepath = (char*)Str_Get_Ptr8(ivars->path);
+ char *filepath = Str_To_Utf8(ivars->path);
SYSTEM_INFO sys_info;
// Get system page size.
@@ -455,6 +458,7 @@ SI_init_read_only(FSFileHandle *self, FSFileHandleIVARS *ivars) {
FILE_ATTRIBUTE_READONLY | FILE_FLAG_OVERLAPPED,
NULL
);
+ FREEMEM(filepath);
if (ivars->win_fhandle == INVALID_HANDLE_VALUE) {
char *win_error = Err_win_error();
Err_set_error(Err_new(Str_newf("CreateFile for %o failed: %s",
http://git-wip-us.apache.org/repos/asf/lucy/blob/235519b2/core/Lucy/Store/FSFolder.c
----------------------------------------------------------------------
diff --git a/core/Lucy/Store/FSFolder.c b/core/Lucy/Store/FSFolder.c
index 70522f3..eb1c54f 100644
--- a/core/Lucy/Store/FSFolder.c
+++ b/core/Lucy/Store/FSFolder.c
@@ -50,6 +50,10 @@
static String*
S_fullpath(FSFolder *self, const String *path);
+// Return a String containing a platform-specific absolute filepath.
+static char*
+S_fullpath_ptr(FSFolder *self, const String *path);
+
// Return true if the supplied path is a directory.
static bool
S_dir_ok(const String *path);
@@ -72,7 +76,7 @@ S_absolutify(const String *path);
// Create a hard link.
static bool
-S_hard_link(String *from_path, String *to_path);
+S_hard_link(char *from_path, char *to_path);
FSFolder*
FSFolder_new(const String *path) {
@@ -142,12 +146,12 @@ FSFolder_Local_Exists_IMP(FSFolder *self, const String *name) {
}
else {
struct stat stat_buf;
- String *fullpath = S_fullpath(self, name);
+ char *fullpath_ptr = S_fullpath_ptr(self, name);
bool retval = false;
- if (stat((char*)Str_Get_Ptr8(fullpath), &stat_buf) != -1) {
+ if (stat(fullpath_ptr, &stat_buf) != -1) {
retval = true;
}
- DECREF(fullpath);
+ FREEMEM(fullpath_ptr);
return retval;
}
}
@@ -171,27 +175,26 @@ FSFolder_Local_Is_Directory_IMP(FSFolder *self, const String *name) {
bool
FSFolder_Rename_IMP(FSFolder *self, const String* from, const String *to) {
- String *from_path = S_fullpath(self, from);
- String *to_path = S_fullpath(self, to);
- bool retval = !rename((char*)Str_Get_Ptr8(from_path),
- (char*)Str_Get_Ptr8(to_path));
+ char *from_path = S_fullpath_ptr(self, from);
+ char *to_path = S_fullpath_ptr(self, to);
+ bool retval = !rename(from_path, to_path);
if (!retval) {
- Err_set_error(Err_new(Str_newf("rename from '%o' to '%o' failed: %s",
+ Err_set_error(Err_new(Str_newf("rename from '%s' to '%s' failed: %s",
from_path, to_path, strerror(errno))));
}
- DECREF(from_path);
- DECREF(to_path);
+ FREEMEM(from_path);
+ FREEMEM(to_path);
return retval;
}
bool
FSFolder_Hard_Link_IMP(FSFolder *self, const String *from,
const String *to) {
- String *from_path = S_fullpath(self, from);
- String *to_path = S_fullpath(self, to);
- bool retval = S_hard_link(from_path, to_path);
- DECREF(from_path);
- DECREF(to_path);
+ char *from_path_ptr = S_fullpath_ptr(self, from);
+ char *to_path_ptr = S_fullpath_ptr(self, to);
+ bool retval = S_hard_link(from_path_ptr, to_path_ptr);
+ FREEMEM(from_path_ptr);
+ FREEMEM(to_path_ptr);
return retval;
}
@@ -199,15 +202,14 @@ bool
FSFolder_Local_Delete_IMP(FSFolder *self, const String *name) {
FSFolderIVARS *const ivars = FSFolder_IVARS(self);
- String *fullpath = S_fullpath(self, name);
- char *path_ptr = (char*)Str_Get_Ptr8(fullpath);
+ char *path_ptr = S_fullpath_ptr(self, name);
#ifdef CHY_REMOVE_ZAPS_DIRS
bool result = !remove(path_ptr);
#else
bool result = !rmdir(path_ptr) || !remove(path_ptr);
#endif
DECREF(Hash_Delete(ivars->entries, (Obj*)name));
- DECREF(fullpath);
+ FREEMEM(path_ptr);
return result;
}
@@ -281,23 +283,53 @@ S_fullpath(FSFolder *self, const String *path) {
return retval;
}
+static char*
+S_fullpath_ptr(FSFolder *self, const String *path) {
+ FSFolderIVARS *const ivars = FSFolder_IVARS(self);
+ size_t folder_size = Str_Get_Size(ivars->path);
+ size_t path_size = Str_Get_Size(path);
+ size_t full_size = folder_size + 1 + path_size;
+ const char *folder_ptr = (char*)Str_Get_Ptr8(ivars->path);
+ const char *path_ptr = (char*)Str_Get_Ptr8(path);
+
+ char *buf = (char*)MALLOCATE(full_size + 1);
+ memcpy(buf, folder_ptr, folder_size);
+ buf[folder_size] = DIR_SEP[0];
+ memcpy(buf + folder_size + 1, path_ptr, path_size);
+ buf[full_size] = '\0';
+
+ if (DIR_SEP[0] != '/') {
+ for (size_t i = 0; i < full_size; ++i) {
+ if (buf[i] == '/') { buf[i] = DIR_SEP[0]; }
+ }
+ }
+
+ return buf;
+}
+
static bool
S_dir_ok(const String *path) {
+ bool retval = false;
+ char *path_ptr = Str_To_Utf8(path);
struct stat stat_buf;
- if (stat((char*)Str_Get_Ptr8(path), &stat_buf) != -1) {
- if (stat_buf.st_mode & S_IFDIR) { return true; }
+ if (stat(path_ptr, &stat_buf) != -1) {
+ if (stat_buf.st_mode & S_IFDIR) { retval = true; }
}
- return false;
+ FREEMEM(path_ptr);
+ return retval;
}
static bool
S_create_dir(const String *path) {
- if (-1 == chy_makedir((char*)Str_Get_Ptr8(path), 0777)) {
+ bool retval = true;
+ char *path_ptr = Str_To_Utf8(path);
+ if (-1 == chy_makedir(path_ptr, 0777)) {
Err_set_error(Err_new(Str_newf("Couldn't create directory '%o': %s",
path, strerror(errno))));
- return false;
+ retval = false;
}
- return true;
+ FREEMEM(path_ptr);
+ return retval;
}
static bool
@@ -346,17 +378,14 @@ S_absolutify(const String *path) {
}
static bool
-S_hard_link(String *from_path, String *to_path) {
- char *from8 = (char*)Str_Get_Ptr8(from_path);
- char *to8 = (char*)Str_Get_Ptr8(to_path);
-
+S_hard_link(char *from8, char *to8) {
if (CreateHardLink(to8, from8, NULL)) {
return true;
}
else {
char *win_error = Err_win_error();
- Err_set_error(Err_new(Str_newf("CreateHardLink for new file '%o' from '%o' failed: %s",
- to_path, from_path, win_error)));
+ Err_set_error(Err_new(Str_newf("CreateHardLink for new file '%s' from '%s' failed: %s",
+ to8, from8, win_error)));
FREEMEM(win_error);
return false;
}
@@ -382,13 +411,10 @@ S_absolutify(const String *path) {
}
static bool
-S_hard_link(String *from_path, String *to_path) {
- char *from8 = (char*)Str_Get_Ptr8(from_path);
- char *to8 = (char*)Str_Get_Ptr8(to_path);
-
+S_hard_link(char *from8, char *to8) {
if (-1 == link(from8, to8)) {
- Err_set_error(Err_new(Str_newf("hard link for new file '%o' from '%o' failed: %s",
- to_path, from_path, strerror(errno))));
+ Err_set_error(Err_new(Str_newf("hard link for new file '%s' from '%s' failed: %s",
+ to8, from8, strerror(errno))));
return false;
}
else {