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