Revision: 44746
http://brlcad.svn.sourceforge.net/brlcad/?rev=44746&view=rev
Author: brlcad
Date: 2011-06-06 19:48:04 +0000 (Mon, 06 Jun 2011)
Log Message:
-----------
accept kunigami's sf patch 3250116 (Corrected funcionality to bu_basename) that
makes bu_basename() correspond more closely with basename() albeit with
different memory management behavior, the latter being more consistent with
bu_dirname(). this annoyingly requires that all bu_basename calls must now
bu_free the memory returned but is the non-destructive thread-safe reentrant
option for now. a compromise to consider may be to pass the fill-buffer in as
a parameter (ala snprintf/memcpy/etc)..; coincidentally, kunigami added a nifty
test harness, which has been modified from the original patch to test other
cases (empty, null).
Modified Paths:
--------------
brlcad/trunk/include/bu.h
brlcad/trunk/src/conv/obj-g.c
brlcad/trunk/src/conv/walk_example.c
brlcad/trunk/src/fb/ioutil.c
brlcad/trunk/src/libbu/Makefile.am
brlcad/trunk/src/libbu/basename.c
brlcad/trunk/src/libbu/brlcad_path.c
brlcad/trunk/src/libged/editit.c
brlcad/trunk/src/librt/bbox.c
brlcad/trunk/src/librt/db_tree.c
brlcad/trunk/src/nirt/if.c
Added Paths:
-----------
brlcad/trunk/src/libbu/basenametester.c
Modified: brlcad/trunk/include/bu.h
===================================================================
--- brlcad/trunk/include/bu.h 2011-06-06 19:36:22 UTC (rev 44745)
+++ brlcad/trunk/include/bu.h 2011-06-06 19:48:04 UTC (rev 44746)
@@ -3382,6 +3382,9 @@
* Given a string containing slashes such as a pathname, return a
* pointer to the first character after the last slash.
*
+ * It is the caller's responsibility to bu_free() the pointer returned
+ * from this routine. Examples of strings returned:
+ *
* /usr/dir/file file
* @n /usr/dir/ dir
* @n /usr/ usr
@@ -3392,8 +3395,9 @@
* @n usr usr
* @n a/b b
* @n a/ a
+ * @n /// /
*/
-BU_EXPORT BU_EXTERN(const char *bu_basename,
+BU_EXPORT BU_EXTERN(char *bu_basename,
(const char *cp));
/** @} */
Modified: brlcad/trunk/src/conv/obj-g.c
===================================================================
--- brlcad/trunk/src/conv/obj-g.c 2011-06-06 19:36:22 UTC (rev 44745)
+++ brlcad/trunk/src/conv/obj-g.c 2011-06-06 19:48:04 UTC (rev 44746)
@@ -101,7 +101,7 @@
write_object(struct object_s *r, struct rt_wdb *out_fp)
{
int rval = -1;
- const char *regname;
+ char *regname;
if (r->bot->num_faces == 0) {
rval = 0;
@@ -117,6 +117,7 @@
r->bot = NULL; /* released during export */
if (verbose)
bu_log("Wrote %s (%d faces)\n", regname, faces);
+ bu_free(regname, "regname free");
}
/* done with this object, let it go */
Modified: brlcad/trunk/src/conv/walk_example.c
===================================================================
--- brlcad/trunk/src/conv/walk_example.c 2011-06-06 19:36:22 UTC (rev
44745)
+++ brlcad/trunk/src/conv/walk_example.c 2011-06-06 19:48:04 UTC (rev
44746)
@@ -88,6 +88,7 @@
{
int c;
char *strrchr();
+ char *tmp_basename = NULL;
/* Turn off bu_getopt's error messages */
bu_opterr = 0;
@@ -101,7 +102,9 @@
case '?':
case 'h':
default:
- usage(bu_basename(av[0]), "Bad or help flag specified\n");
+ tmp_basename = bu_basename(av[0]);
+ usage(tmp_basename, "Bad or help flag specified\n");
+ bu_free(tmp_basename, "tmp_basename free");
break;
}
}
@@ -251,6 +254,7 @@
struct db_tree_state init_state; /* state table for the heirarchy walker */
char idbuf[1024] = {0}; /* Database title */
int arg_count;
+ char *tmp_basename;
/** @struct user_data
* This is an example structure.
@@ -264,7 +268,9 @@
arg_count = parse_args(ac, av);
if ((ac - arg_count) < 1) {
- usage(bu_basename(av[0]), "bad arugment count");
+ tmp_basename = bu_basename(av[0]);
+ usage(tmp_basename, "bad arugment count");
+ bu_free(tmp_basename, "tmp_basename free");
}
/*
Modified: brlcad/trunk/src/fb/ioutil.c
===================================================================
--- brlcad/trunk/src/fb/ioutil.c 2011-06-06 19:36:22 UTC (rev 44745)
+++ brlcad/trunk/src/fb/ioutil.c 2011-06-06 19:48:04 UTC (rev 44746)
@@ -37,13 +37,17 @@
VMessage(const char *format, va_list ap)
{
struct bu_vls str;
+ char *tmp_basename;
bu_vls_init(&str);
bu_vls_printf(&str, format, ap);
- bu_log("%s: %V\n", bu_basename(bu_getprogname()), &str);
+ tmp_basename = bu_basename(bu_getprogname());
+ bu_log("%s: %V\n", , &str);
+
bu_vls_free(&str);
+ bu_free(tmp_basename);
}
Modified: brlcad/trunk/src/libbu/Makefile.am
===================================================================
--- brlcad/trunk/src/libbu/Makefile.am 2011-06-06 19:36:22 UTC (rev 44745)
+++ brlcad/trunk/src/libbu/Makefile.am 2011-06-06 19:48:04 UTC (rev 44746)
@@ -2,7 +2,7 @@
lib_LTLIBRARIES = libbu.la
noinst_LTLIBRARIES = libbu_nil.la
-noinst_PROGRAMS = htester timetester
+noinst_PROGRAMS = htester timetester basenametester
libbu_nil_la_SOURCES = \
argv.c \
@@ -95,6 +95,11 @@
libbu.la \
${BU_LIBS}
+basenametester_SOURCES = basenametester.c
+basenametester_LDADD = \
+ libbu.la \
+ ${BU_LIBS}
+
noinst_HEADERS = \
rb_internals.h \
uce-dirent.h
Modified: brlcad/trunk/src/libbu/basename.c
===================================================================
--- brlcad/trunk/src/libbu/basename.c 2011-06-06 19:36:22 UTC (rev 44745)
+++ brlcad/trunk/src/libbu/basename.c 2011-06-06 19:48:04 UTC (rev 44746)
@@ -21,22 +21,33 @@
#include "common.h"
#include "bu.h"
+#include <string.h>
-
-const char *
+char *
bu_basename(const char *str)
{
register const char *p = str;
+ char *base_str;
+ int len;
if (UNLIKELY(!str)) {
return NULL;
}
while (*p != '\0')
- if (*p++ == '/')
+ if (*p++ == '/' && *p != '/' && *p != '\0')
str = p;
- return str;
+ len = strlen(str);
+
+ /* Remove trailing '/'s */
+ while (len > 1 && str[len - 1] == '/') len--;
+
+ /* Create a new string */
+ base_str = bu_malloc(sizeof(char) * (len + 1), "bu_basename alloc");
+ bu_strlcpy(base_str, str, len + 1);
+ base_str[len] = '\0';
+ return base_str;
}
/*
Added: brlcad/trunk/src/libbu/basenametester.c
===================================================================
--- brlcad/trunk/src/libbu/basenametester.c (rev 0)
+++ brlcad/trunk/src/libbu/basenametester.c 2011-06-06 19:48:04 UTC (rev
44746)
@@ -0,0 +1,87 @@
+#include "common.h"
+
+#include <stdlib.h>
+#include <stdio.h>
+
+#include "bu.h"
+
+#include <string.h>
+#include <libgen.h>
+
+
+/* Test against basename UNIX tool */
+void automatic_test(const char *input)
+{
+
+ char *ans, buf_input[1000];
+ char *res;
+
+ if (input)
+ bu_strlcpy(buf_input, input, strlen(input)+1);
+
+ /* build UNIX 'basename' command */
+ if (!input)
+ ans = basename(NULL);
+ else
+ ans = basename(buf_input);
+
+ if (!input)
+ res = bu_basename(NULL);
+ else
+ res = bu_basename(buf_input);
+
+ if (BU_STR_EQUAL(res, ans))
+ printf("%24s -> %24s [PASSED]\n", input, res);
+ else
+ printf("%24s -> %24s (should be: %s) [FAIL]\n", input, res, ans);
+
+ bu_free(res, NULL);
+}
+
+
+int main(int ac, char *av[])
+{
+ char input[1000] = {0};
+
+ /* pre-define tests */
+ printf("Performing pre-defined tests:\n");
+ automatic_test("/usr/dir/file");
+ automatic_test("/usr/dir/");
+ automatic_test("/usr/");
+ automatic_test("/usr");
+ automatic_test("usr");
+ automatic_test("/usr/some long/file");
+ automatic_test("/usr/some file");
+ automatic_test("/a test file");
+ automatic_test("another file");
+ automatic_test("/");
+ automatic_test("/////");
+ automatic_test(".");
+ automatic_test("..");
+ automatic_test("...");
+ automatic_test(" ");
+ automatic_test("");
+ automatic_test(NULL);
+
+ /* user tests */
+ if (ac > 0) {
+ printf("Enter a string:\n");
+ fgets(input, 1000, stdin);
+ if (strlen(input) > 0)
+ input[strlen(input)-1] = '\0';
+ automatic_test(input);
+ }
+
+ printf("%s: testing complete\n", av[0]);
+ return 0;
+}
+
+/*
+ * Local Variables:
+ * mode: C
+ * tab-width: 8
+ * indent-tabs-mode: t
+ * c-file-style: "stroustrup"
+ * End:
+ * ex: shiftwidth=4 tabstop=8
+ */
Property changes on: brlcad/trunk/src/libbu/basenametester.c
___________________________________________________________________
Added: svn:mime-type
+ text/plain
Added: svn:eol-style
+ native
Modified: brlcad/trunk/src/libbu/brlcad_path.c
===================================================================
--- brlcad/trunk/src/libbu/brlcad_path.c 2011-06-06 19:36:22 UTC (rev
44745)
+++ brlcad/trunk/src/libbu/brlcad_path.c 2011-06-06 19:48:04 UTC (rev
44746)
@@ -206,9 +206,14 @@
const char *
bu_getprogname(void) {
const char *name = NULL;
+ static char buffer[MAXPATHLEN] = {0};
+ char *tmp_basename;
if (bu_progname[0] != '\0') {
- return bu_basename(bu_progname);
+ tmp_basename = bu_basename(bu_progname);
+ bu_strlcpy(buffer, tmp_basename, strlen(tmp_basename)+1);
+ bu_free(buffer, "tmp_basename free");
+ return buffer;
}
#ifdef HAVE_GETPROGNAME
@@ -221,7 +226,10 @@
snprintf(bu_progname, MAXPATHLEN, "%s", name);
- return bu_basename(bu_progname);
+ tmp_basename = bu_basename(bu_progname);
+ bu_strlcpy(buffer, tmp_basename, strlen(tmp_basename)+1);
+ bu_free(buffer, "tmp_basename free");
+ return buffer;
}
Modified: brlcad/trunk/src/libged/editit.c
===================================================================
--- brlcad/trunk/src/libged/editit.c 2011-06-06 19:36:22 UTC (rev 44745)
+++ brlcad/trunk/src/libged/editit.c 2011-06-06 19:48:04 UTC (rev 44746)
@@ -90,6 +90,8 @@
int length;
struct bu_vls str;
struct bu_vls sep;
+ char *editor_basename;
+
bu_vls_init(&str);
bu_vls_init(&sep);
if (terminal && editor_opt) {
@@ -101,13 +103,15 @@
} else {
bu_log("Invoking [%s %s]\n\n", editor, file);
}
- bu_vls_sprintf(&str, "\nNOTE: You must QUIT %s before %s will respond
and continue.\n", bu_basename(editor), bu_getprogname());
+ editor_basename = bu_basename(editor);
+ bu_vls_sprintf(&str, "\nNOTE: You must QUIT %s before %s will respond
and continue.\n", editor_basename, bu_getprogname());
for (length = bu_vls_strlen(&str) - 2; length > 0; length--) {
bu_vls_putc(&sep, '*');
}
bu_log("%V%V%V\n\n", &sep, &str, &sep);
bu_vls_free(&str);
bu_vls_free(&sep);
+ bu_free(editor_basename, "editor_basename free");
}
#if defined(SIGINT) && defined(SIGQUIT)
@@ -132,6 +136,9 @@
#endif
{
+
+ char *editor_basename;
+
#if defined(_WIN32) && !defined(__CYGWIN__)
char buffer[RT_MAXLINE + 1] = {0};
STARTUPINFO si = {0};
@@ -150,11 +157,13 @@
return 1;
#else
- if (BU_STR_EQUAL(bu_basename(editor), "TextEdit")) {
+ editor_basename = bu_basename(editor);
+ if (BU_STR_EQUAL(editor_basename, "TextEdit")) {
/* close stdout/stderr so we don't get blather from TextEdit
about service registration failure */
close(fileno(stdout));
close(fileno(stderr));
}
+ bu_free(editor_basename, "editor_basename free");
if (!terminal && !editor_opt) {
(void)execlp(editor, editor, file, NULL);
Modified: brlcad/trunk/src/librt/bbox.c
===================================================================
--- brlcad/trunk/src/librt/bbox.c 2011-06-06 19:36:22 UTC (rev 44745)
+++ brlcad/trunk/src/librt/bbox.c 2011-06-06 19:48:04 UTC (rev 44746)
@@ -126,20 +126,28 @@
_rt_getregion(struct rt_i *rtip, const char *reg_name)
{
struct region *regp;
- const char *reg_base = bu_basename(reg_name);
+ char *reg_base = bu_basename(reg_name);
RT_CK_RTI(rtip);
for (BU_LIST_FOR(regp, region, &(rtip->HeadRegion))) {
- const char *cp;
+ char *cp;
/* First, check for a match of the full path */
if (*reg_base == regp->reg_name[0] &&
- BU_STR_EQUAL(reg_base, regp->reg_name))
+ BU_STR_EQUAL(reg_base, regp->reg_name)){
+ bu_free(reg_base, "reg_base free");
return regp;
+ }
/* Second, check for a match of the database node name */
cp = bu_basename(regp->reg_name);
- if (*cp == *reg_name && BU_STR_EQUAL(cp, reg_name))
+ if (*cp == *reg_name && BU_STR_EQUAL(cp, reg_name)){
+ bu_free(reg_base, "reg_base free");
+ bu_free(cp, "cp free");
return regp;
+ }
+ bu_free(cp, "cp free");
}
+ bu_free(reg_base, "reg_base free");
+
return REGION_NULL;
}
Modified: brlcad/trunk/src/librt/db_tree.c
===================================================================
--- brlcad/trunk/src/librt/db_tree.c 2011-06-06 19:36:22 UTC (rev 44745)
+++ brlcad/trunk/src/librt/db_tree.c 2011-06-06 19:48:04 UTC (rev 44746)
@@ -2676,15 +2676,17 @@
mat_t m_tmp;
vect_t v_tmp;
struct rt_i *my_rtip;
- const char *reg_name;
+ char *reg_name;
RT_CK_RTI(rtip);
RT_CK_RESOURCE(resp);
reg_name = bu_basename(rp->reg_name);
/* get model-to-region space mapping */
- if (db_region_mat(model_to_region, rtip->rti_dbip, rp->reg_name, resp) < 0)
+ if (db_region_mat(model_to_region, rtip->rti_dbip, rp->reg_name, resp) <
0){
+ bu_free(reg_name, "reg_name free");
return -1;
+ }
if (VEQUAL(p_min, p_max)) {
/* User/shader did not specify bounding box, obtain bounding
@@ -2722,6 +2724,9 @@
MAT_IDN(m_scale);
MAT_SCALE_VEC(m_scale, v_tmp);
bn_mat_mul(model_to_shader, m_scale, m_tmp);
+
+ bu_free(reg_name, "reg_name free");
+
return 0;
}
Modified: brlcad/trunk/src/nirt/if.c
===================================================================
--- brlcad/trunk/src/nirt/if.c 2011-06-06 19:36:22 UTC (rev 44745)
+++ brlcad/trunk/src/nirt/if.c 2011-06-06 19:48:04 UTC (rev 44746)
@@ -162,11 +162,15 @@
ValTab[VTI_CLAIMANT_COUNT].value.ival = 0;
for (rpp = part->pt_overlap_reg; *rpp != REGION_NULL; ++rpp) {
char tmpcp[512] = {0};
+ char *base = NULL;
if (ValTab[VTI_CLAIMANT_COUNT].value.ival++)
bu_vls_strcat(&claimant_list, " ");
bu_strlcpy(tmpcp, (*rpp)->reg_name, sizeof(tmpcp));
- bu_vls_strcat(&claimant_list, bu_basename(tmpcp));
+
+ base = bu_basename(tmpcp);
+ bu_vls_strcat(&claimant_list, base);
+ bu_free(base, "bu_basename");
}
ValTab[VTI_CLAIMANT_LIST].value.sval =
bu_vls_addr(&claimant_list);
This was sent by the SourceForge.net collaborative development platform, the
world's largest Open Source development site.
------------------------------------------------------------------------------
Simplify data backup and recovery for your virtual environment with vRanger.
Installation's a snap, and flexible recovery options mean your data is safe,
secure and there when you need it. Discover what all the cheering's about.
Get your free trial download today.
http://p.sf.net/sfu/quest-dev2dev2
_______________________________________________
BRL-CAD Source Commits mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/brlcad-commits