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

Reply via email to