Revision: 41318
          http://brlcad.svn.sourceforge.net/brlcad/?rev=41318&view=rev
Author:   brlcad
Date:     2010-11-10 21:07:50 +0000 (Wed, 10 Nov 2010)

Log Message:
-----------
remove more instances of RT_MAXARGS and MAXARGS. this one is technically a bug 
that would have been a crasher if the limit were hit as the array was sized as 
RT_MAXARGS but being iterated over as size MAXARGS (and those two don't 
actually match each other).  we allocate and free memory dynamically based on 
the exact size that is needed now.

Modified Paths:
--------------
    brlcad/trunk/include/dg.h
    brlcad/trunk/src/libged/dg_obj.c

Modified: brlcad/trunk/include/dg.h
===================================================================
--- brlcad/trunk/include/dg.h   2010-11-10 20:19:21 UTC (rev 41317)
+++ brlcad/trunk/include/dg.h   2010-11-10 21:07:50 UTC (rev 41318)
@@ -95,8 +95,9 @@
     struct bu_list             dgo_headVDraw;          /**< @brief  head of 
vdraw list */
     struct vd_curve            *dgo_currVHead;         /**< @brief  current 
vdraw head */
     struct solid               *dgo_freeSolids;        /**< @brief  ptr to 
head of free solid list */
-    char                       *dgo_rt_cmd[RT_MAXARGS];
-    int                                dgo_rt_cmd_len;
+    char                       **dgo_rt_cmd;
+    size_t                     dgo_rt_cmd_cap;
+    size_t                     dgo_rt_cmd_len;
     struct bu_observer         dgo_observers;
     struct run_rt              dgo_headRunRt;          /**< @brief  head of 
forked rt processes */
     struct bu_vls              dgo_qray_basename;      /**< @brief  basename 
of query ray vlist */

Modified: brlcad/trunk/src/libged/dg_obj.c
===================================================================
--- brlcad/trunk/src/libged/dg_obj.c    2010-11-10 20:19:21 UTC (rev 41317)
+++ brlcad/trunk/src/libged/dg_obj.c    2010-11-10 21:07:50 UTC (rev 41318)
@@ -205,6 +205,21 @@
     {(char *)0,                        (int (*)())0}
 };
 
+/**
+ * count the total number of solids, phony or otherwise
+ */
+HIDDEN size_t
+dgo_count_tops(const struct solid *headsp)
+{
+    struct solid *sp;
+    size_t count = 0;
+    FOR_ALL_SOLIDS(sp, &headsp->l) {
+       count++;
+    }
+    return count;
+}
+
+
 /*
  *                     D G O _ C M D
  *
@@ -1317,7 +1332,7 @@
 }
 
 int
-dgo_rt_cmd(struct dg_obj       *dgop,
+dgo_rt_command(struct dg_obj   *dgop,
           struct view_obj      *vop,
           Tcl_Interp           *interp,
           int                  argc,
@@ -1326,6 +1341,7 @@
     char **vp;
     int i;
     char       pstring[32];
+    size_t args;
 
     if (argc < 1) {
        struct bu_vls vls;
@@ -1337,6 +1353,10 @@
        return TCL_ERROR;
     }
 
+    args = argc + 2 + dgo_count_tops((struct solid *)&dgop->dgo_headSolid);
+    dgop->dgo_rt_cmd = (char **)bu_calloc(args, sizeof(char *), "alloc 
dgo_rt_cmd");
+    dgop->dgo_rt_cmd_cap = args;
+
     vp = &dgop->dgo_rt_cmd[0];
     *vp++ = argv[0];
     *vp++ = "-M";
@@ -1376,7 +1396,7 @@
        dgop->dgo_rt_cmd_len += dgo_build_tops(interp,
                                               (struct solid 
*)&dgop->dgo_headSolid,
                                               vp,
-                                              &dgop->dgo_rt_cmd[MAXARGS]);
+                                              &dgop->dgo_rt_cmd[args]);
     } else {
        while (i < argc)
            *vp++ = argv[i++];
@@ -1389,6 +1409,8 @@
     }
     (void)dgo_run_rt(dgop, vop);
 
+    bu_free(dgop->dgo_rt_cmd, "free dgo_rt_cmd");
+
     return TCL_OK;
 }
 
@@ -1428,7 +1450,7 @@
 
     /* copy command name into argv[2], could be rt or some other rt-style 
command  */
     argv[2] = argv[1];
-    return dgo_rt_cmd(dgop, vop, interp, argc-2, argv+2);
+    return dgo_rt_command(dgop, vop, interp, argc-2, argv+2);
 }
 
 
@@ -1760,7 +1782,7 @@
 #endif
 
 int
-dgo_rtcheck_cmd(struct dg_obj  *dgop,
+dgo_rtcheck_command(struct dg_obj      *dgop,
                struct view_obj *vop,
                Tcl_Interp      *interp,
                int             argc,
@@ -1768,6 +1790,8 @@
 {
     char **vp;
     int i;
+    size_t args;
+
 #ifndef _WIN32
     int        pid;
     int        i_pipe[2];      /* object reads results for building vectors */
@@ -1789,6 +1813,10 @@
     vect_t temp;
     vect_t eye_model;
 
+    args = argc + 2 + dgo_count_tops((struct solid *)&dgop->dgo_headSolid);
+    dgop->dgo_rt_cmd = (char **)bu_calloc(args, sizeof(char *), "alloc 
dgo_rt_cmd");
+    dgop->dgo_rt_cmd_cap = args;
+
 #ifndef _WIN32
     vp = &dgop->dgo_rt_cmd[0];
     *vp++ = argv[0];
@@ -1807,7 +1835,7 @@
        dgop->dgo_rt_cmd_len += dgo_build_tops(interp,
                                               (struct solid 
*)&dgop->dgo_headSolid,
                                               vp,
-                                              &dgop->dgo_rt_cmd[MAXARGS]);
+                                              &dgop->dgo_rt_cmd[args]);
     } else {
        while (i < argc)
            *vp++ = argv[i++];
@@ -1890,9 +1918,10 @@
                          dgo_rtcheck_output_handler,
                          (ClientData)rtcop);
 
-    return TCL_OK;
 #else
+
     /* _WIN32 */
+
     vp = &dgop->dgo_rt_cmd[0];
     *vp++ = "rtcheck";
     *vp++ = "-M";
@@ -1916,7 +1945,7 @@
        dgop->dgo_rt_cmd_len += dgo_build_tops(interp,
                                               (struct solid 
*)&dgop->dgo_headSolid,
                                               vp,
-                                              &dgop->dgo_rt_cmd[MAXARGS]);
+                                              &dgop->dgo_rt_cmd[args]);
     } else {
        while (i < argc)
            *vp++ = argv[i++];
@@ -2037,10 +2066,10 @@
                             TCL_READABLE,
                             dgo_rtcheck_output_handler,
                             (ClientData)rtcop);
+#endif
+
+    bu_free(dgop->dgo_rt_cmd, "free dgo_rt_cmd");
     return TCL_OK;
-
-
-#endif
 }
 
 /*
@@ -2078,7 +2107,7 @@
        return TCL_ERROR;
     }
 
-    return dgo_rtcheck_cmd(dgop, vop, interp, argc-2, argv+2);
+    return dgo_rtcheck_command(dgop, vop, interp, argc-2, argv+2);
 }
 
 /*
@@ -3802,6 +3831,7 @@
     }
 }
 
+
 /*
  *                    D G O _ B U I L D _ T O P S
  *


This was sent by the SourceForge.net collaborative development platform, the 
world's largest Open Source development site.

------------------------------------------------------------------------------
The Next 800 Companies to Lead America's Growth: New Video Whitepaper
David G. Thomson, author of the best-selling book "Blueprint to a 
Billion" shares his insights and actions to help propel your 
business during the next growth cycle. Listen Now!
http://p.sf.net/sfu/SAP-dev2dev
_______________________________________________
BRL-CAD Source Commits mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/brlcad-commits

Reply via email to