34#include <libFreeWRL.h>
36#include "../vrml_parser/Structs.h"
40char *BrowserFullPath = NULL;
41char *BrowserName =
"FreeWRL VRML/X3D Browser";
43static unsigned int fps_histo[120];
44static int collect_fps_histo = 0;
45void fps_histo_print(){
48 printf(
"%3d %d\n",i,fps_histo[i]);
52void fps_histo_toggle(){
53 if(collect_fps_histo == 0){
54 printf(
"turning on fps histo collection - hit H again to print and end\n");
55 collect_fps_histo = 1;
56 }
else if(collect_fps_histo == 1){
57 printf(
"fps histo:\n");
59 collect_fps_histo = 0;
62void fps_histo_collect(){
63 if(collect_fps_histo == 1){
65 dt = TickTime() - lastTime();
72 fps_histo[(int)fps] +=1;
77const char* freewrl_get_browser_program()
86 tmp = getenv(
"BROWSER");
99 if(DEFedNodes == NULL)
return 0;
100 for (ind=0; ind < DEFedNodes->n; ind++) {
102 if (vector_get(
struct X3D_Node*, DEFedNodes, ind) == node) {
109char * dontRecurseList [] = {
113int doRecurse(
const char *fieldname){
117 while(dontRecurseList[j] != NULL)
119 dont = dont || !strcmp(dontRecurseList[j],fieldname);
122 return dont == 0 ? 1 : 0;
133 PRINTF(
"multi url: <empty>");
137 PRINTF(
"multi url: ");
138 for (i = 0; i < url->n; i++) {
140 PRINTF(
"[%d] %s", i, s->strptr);
146void print_field_value(FILE *fp,
int typeIndex,
union anyVrml* value)
151 case FIELDTYPE_FreeWRLPTR:
153 fprintf(fp,
" %p \n",(
void *)value);
156 case FIELDTYPE_SFNode:
158 fprintf(fp,
" %p \n",(
void *)value);
161 case FIELDTYPE_MFNode:
167 for(j=0;j<mfnode->n;j++)
168 fprintf(fp,
" %p, ",mfnode->p[j]);
171 case FIELDTYPE_SFString:
174 fprintf (fp,
" %s ",(*sfstring)->strptr);
177 case FIELDTYPE_MFString:
181 for (i=0; i<mfstring->n; i++) { fprintf (fp,
"%s, ",mfstring->p[i]->strptr); }
185 case FIELDTYPE_SFFloat:
187 float *flt = (
float*)value;
188 fprintf(fp,
" %4.3f ",*flt);
191 case FIELDTYPE_MFFloat:
195 for (i=0; i<mffloat->n; i++) { fprintf (fp,
" %4.3f,",mffloat->p[i]); }
199 case FIELDTYPE_SFTime:
200 case FIELDTYPE_SFDouble:
202 double *sftime = (
double*)value;
203 fprintf (fp,
"%4.3f",*sftime);
206 case FIELDTYPE_MFTime:
207 case FIELDTYPE_MFDouble:
211 for (i=0; i<mfdouble->n; i++) { fprintf (fp,
" %4.3f,",mfdouble->p[i]); }
215 case FIELDTYPE_SFInt32:
216 case FIELDTYPE_SFBool:
218 int *sfint32 = (
int*)(value);
219 fprintf (fp,
" \t%d\n",*sfint32);
222 case FIELDTYPE_MFInt32:
223 case FIELDTYPE_MFBool:
227 for (i=0; i<mfint32->n; i++) { fprintf (fp,
" %d,",mfint32->p[i]); }
231 case FIELDTYPE_SFVec2f:
234 for (i=0; i<2; i++) { fprintf (fp,
"%4.3f ",sfvec2f->c[i]); }
237 case FIELDTYPE_MFVec2f:
241 for (i=0; i<mfvec2f->n; i++)
242 { fprintf (fp,
"[%4.3f, %4.3f],",mfvec2f->p[i].c[0], mfvec2f->p[i].c[1]); }
246 case FIELDTYPE_SFVec2d:
249 for (i=0; i<2; i++) { fprintf (fp,
"%4.3f, ",sfvec2d->c[i]); }
252 case FIELDTYPE_MFVec2d:
256 for (i=0; i<mfvec2d->n; i++)
257 { fprintf (fp,
"[%4.3f, %4.3f], ",mfvec2d->p[i].c[0], mfvec2d->p[i].c[1]); }
261 case FIELDTYPE_SFVec3f:
262 case FIELDTYPE_SFColor:
265 for (i=0; i<3; i++) { fprintf (fp,
"%4.3f ",sfvec3f->c[i]); }
268 case FIELDTYPE_MFVec3f:
269 case FIELDTYPE_MFColor:
273 for (i=0; i<mfvec3f->n; i++)
274 { fprintf (fp,
"[%4.3f, %4.3f, %4.3f],",mfvec3f->p[i].c[0], mfvec3f->p[i].c[1],mfvec3f->p[i].c[2]); }
278 case FIELDTYPE_SFVec3d:
281 for (i=0; i<3; i++) { fprintf (fp,
"%4.3f ",sfvec3d->c[i]); }
284 case FIELDTYPE_MFVec3d:
288 for (i=0; i<mfvec3d->n; i++)
289 { fprintf (fp,
"[%4.3f, %4.3f, %4.3f],",mfvec3d->p[i].c[0], mfvec3d->p[i].c[1],mfvec3d->p[i].c[2]); }
293 case FIELDTYPE_SFVec4f:
294 case FIELDTYPE_SFColorRGBA:
295 case FIELDTYPE_SFRotation:
298 for (i=0; i<4; i++) { fprintf (fp,
"%4.3f ",sfrot->c[i]); }
301 case FIELDTYPE_MFVec4f:
302 case FIELDTYPE_MFColorRGBA:
303 case FIELDTYPE_MFRotation:
307 for (i=0; i<mfrgba->n; i++)
308 { fprintf (fp,
"[%4.3f, %4.3f, %4.3f, %4.3f]\n",mfrgba->p[i].c[0], mfrgba->p[i].c[1],mfrgba->p[i].c[2],mfrgba->p[i].c[3]); }
312 case FIELDTYPE_SFVec4d:
315 for (i=0; i<4; i++) { fprintf (fp,
"%4.3f ",sfvec4d->c[i]); }
318 case FIELDTYPE_MFVec4d:
322 for (i=0; i<mfvec4d->n; i++)
323 { fprintf (fp,
"[%4.3f, %4.3f, %4.3f, %4.3f],",mfvec4d->p[i].c[0], mfvec4d->p[i].c[1],mfvec4d->p[i].c[2],mfvec4d->p[i].c[3]); }
327 case FIELDTYPE_SFMatrix3f:
330 fprintf (fp,
" [%4.3f, %4.3f, %4.3f, %4.3f, %4.3f, %4.3f, %4.3f, %4.3f, %4.3f ]\n",
331 sfmat3f->c[0],sfmat3f->c[1],sfmat3f->c[2],
332 sfmat3f->c[3],sfmat3f->c[4],sfmat3f->c[5],
333 sfmat3f->c[6],sfmat3f->c[7],sfmat3f->c[8]);
336 case FIELDTYPE_MFMatrix3f:
340 for (i=0; i<mfmat3f->n; i++) {
341 fprintf (fp,
"[%4.3f, %4.3f, %4.3f, %4.3f, %4.3f, %4.3f, %4.3f, %4.3f, %4.3f ],",
342 mfmat3f->p[i].c[0],mfmat3f->p[i].c[1],mfmat3f->p[i].c[2],
343 mfmat3f->p[i].c[3],mfmat3f->p[i].c[4],mfmat3f->p[i].c[5],
344 mfmat3f->p[i].c[6],mfmat3f->p[i].c[7],mfmat3f->p[i].c[8]); }
348 case FIELDTYPE_SFMatrix3d:
351 fprintf (fp,
" [%4.3f, %4.3f, %4.3f, %4.3f, %4.3f, %4.3f, %4.3f, %4.3f, %4.3f ]",
352 sfmat3d->c[0],sfmat3d->c[1],sfmat3d->c[2],
353 sfmat3d->c[3],sfmat3d->c[4],sfmat3d->c[5],
354 sfmat3d->c[6],sfmat3d->c[7],sfmat3d->c[8]);
357 case FIELDTYPE_MFMatrix3d:
361 for (i=0; i<mfmat3d->n; i++) {
362 fprintf (fp,
" %d: \t[%4.3f, %4.3f, %4.3f, %4.3f, %4.3f, %4.3f, %4.3f, %4.3f, %4.3f ]\n",i,
363 mfmat3d->p[i].c[0],mfmat3d->p[i].c[1],mfmat3d->p[i].c[2],
364 mfmat3d->p[i].c[3],mfmat3d->p[i].c[4],mfmat3d->p[i].c[5],
365 mfmat3d->p[i].c[6],mfmat3d->p[i].c[7],mfmat3d->p[i].c[8]); }
368 case FIELDTYPE_SFMatrix4f:
371 fprintf (fp,
" \t[%4.3f, %4.3f, %4.3f, %4.3f, %4.3f, %4.3f, %4.3f, %4.3f, %4.3f, %4.3f, %4.3f, %4.3f, %4.3f, %4.3f, %4.3f, %4.3f ]\n",
372 sfmat4f->c[0],sfmat4f->c[1],sfmat4f->c[2],sfmat4f->c[3],
373 sfmat4f->c[4],sfmat4f->c[5],sfmat4f->c[6],sfmat4f->c[7],
374 sfmat4f->c[8],sfmat4f->c[9],sfmat4f->c[10],sfmat4f->c[11],
375 sfmat4f->c[12],sfmat4f->c[13],sfmat4f->c[14],sfmat4f->c[15]);
378 case FIELDTYPE_MFMatrix4f:
382 for (i=0; i<mfmat4f->n; i++) {
383 fprintf (fp,
"[%4.3f, %4.3f, %4.3f, %4.3f, %4.3f, %4.3f, %4.3f, %4.3f, %4.3f, %4.3f, %4.3f, %4.3f, %4.3f, %4.3f, %4.3f, %4.3f ],",
384 mfmat4f->p[i].c[0],mfmat4f->p[i].c[1],mfmat4f->p[i].c[2],mfmat4f->p[i].c[3],
385 mfmat4f->p[i].c[4],mfmat4f->p[i].c[5],mfmat4f->p[i].c[6],mfmat4f->p[i].c[7],
386 mfmat4f->p[i].c[8],mfmat4f->p[i].c[9],mfmat4f->p[i].c[10],mfmat4f->p[i].c[11],
387 mfmat4f->p[i].c[12],mfmat4f->p[i].c[13],mfmat4f->p[i].c[14],mfmat4f->p[i].c[15]); }
391 case FIELDTYPE_SFMatrix4d:
394 fprintf (fp,
" [%4.3f, %4.3f, %4.3f, %4.3f, %4.3f, %4.3f, %4.3f, %4.3f, %4.3f, %4.3f, %4.3f, %4.3f, %4.3f, %4.3f, %4.3f, %4.3f ]",
395 sfmat4d->c[0],sfmat4d->c[1],sfmat4d->c[2],sfmat4d->c[3],
396 sfmat4d->c[4],sfmat4d->c[5],sfmat4d->c[6],sfmat4d->c[7],
397 sfmat4d->c[8],sfmat4d->c[9],sfmat4d->c[10],sfmat4d->c[11],
398 sfmat4d->c[12],sfmat4d->c[13],sfmat4d->c[14],sfmat4d->c[15]);
401 case FIELDTYPE_MFMatrix4d:
405 for (i=0; i<mfmat4d->n; i++) {
406 fprintf (fp,
"[%4.3f, %4.3f, %4.3f, %4.3f, %4.3f, %4.3f, %4.3f, %4.3f, %4.3f, %4.3f, %4.3f, %4.3f, %4.3f, %4.3f, %4.3f, %4.3f ],",
407 mfmat4d->p[i].c[0],mfmat4d->p[i].c[1],mfmat4d->p[i].c[2],mfmat4d->p[i].c[3],
408 mfmat4d->p[i].c[4],mfmat4d->p[i].c[5],mfmat4d->p[i].c[6],mfmat4d->p[i].c[7],
409 mfmat4d->p[i].c[8],mfmat4d->p[i].c[9],mfmat4d->p[i].c[10],mfmat4d->p[i].c[11],
410 mfmat4d->p[i].c[12],mfmat4d->p[i].c[13],mfmat4d->p[i].c[14],mfmat4d->p[i].c[15]); }
415 case FIELDTYPE_SFImage:
417 fprintf(fp,
" %p ",(
void *)value);
422void dump_scene(FILE *fp,
int level,
struct X3D_Node* node);
423void dump_scene2(FILE *fp,
int level,
struct X3D_Node* node,
int recurse,
Stack *DEFedNodes);
426void print_field(FILE *fp,
int level,
int typeIndex,
const char* fieldName,
union anyVrml* value,
Stack* DEFedNodes)
429 #define spacer for (lc=0; lc<level; lc++) fprintf (fp," ");
433 case FIELDTYPE_FreeWRLPTR:
435 fprintf(fp,
" %p \n",(
void *)value);
438 case FIELDTYPE_SFNode:
442 dore = doRecurse(fieldName);
443 fprintf (fp,
":\n"); dump_scene2(fp,level+1,*sfnode,dore,DEFedNodes);
446 case FIELDTYPE_MFNode:
450 dore = doRecurse(fieldName);
453 for(j=0;j<mfnode->n;j++)
454 dump_scene2(fp,level+1,mfnode->p[j],dore,DEFedNodes);
457 case FIELDTYPE_SFString:
460 fprintf (fp,
" \t%s\n",(*sfstring)->strptr);
463 case FIELDTYPE_MFString:
466 fprintf (fp,
" : \n");
467 for (i=0; i<mfstring->n; i++) { spacer fprintf (fp,
" %d: \t%s\n",i,mfstring->p[i]->strptr); }
470 case FIELDTYPE_SFFloat:
472 float *flt = (
float*)value;
473 fprintf (fp,
" \t%4.3f\n",*flt);
476 case FIELDTYPE_MFFloat:
480 for (i=0; i<mffloat->n; i++) { spacer fprintf (fp,
" %d: \t%4.3f\n",i,mffloat->p[i]); }
483 case FIELDTYPE_SFTime:
484 case FIELDTYPE_SFDouble:
486 double *sftime = (
double*)value;
487 fprintf (fp,
" \t%4.3f\n",*sftime);
490 case FIELDTYPE_MFTime:
491 case FIELDTYPE_MFDouble:
495 for (i=0; i<mfdouble->n; i++) { spacer fprintf (fp,
" %d: \t%4.3f\n",i,mfdouble->p[i]); }
498 case FIELDTYPE_SFInt32:
499 case FIELDTYPE_SFBool:
501 int *sfint32 = (
int*)(value);
502 fprintf (fp,
" \t%d\n",*sfint32);
505 case FIELDTYPE_MFInt32:
506 case FIELDTYPE_MFBool:
510 for (i=0; i<mfint32->n; i++) { spacer fprintf (fp,
" %d: \t%d\n",i,mfint32->p[i]); }
513 case FIELDTYPE_SFVec2f:
517 for (i=0; i<2; i++) { fprintf (fp,
"%4.3f ",sfvec2f->c[i]); }
521 case FIELDTYPE_MFVec2f:
525 for (i=0; i<mfvec2f->n; i++)
526 { spacer fprintf (fp,
" %d: \t[%4.3f, %4.3f]\n",i,mfvec2f->p[i].c[0], mfvec2f->p[i].c[1]); }
529 case FIELDTYPE_SFVec2d:
533 for (i=0; i<2; i++) { fprintf (fp,
"%4.3f ",sfvec2d->c[i]); }
537 case FIELDTYPE_MFVec2d:
541 for (i=0; i<mfvec2d->n; i++)
542 { spacer fprintf (fp,
" %d: \t[%4.3f, %4.3f]\n",i,mfvec2d->p[i].c[0], mfvec2d->p[i].c[1]); }
545 case FIELDTYPE_SFVec3f:
546 case FIELDTYPE_SFColor:
550 for (i=0; i<3; i++) { fprintf (fp,
"%4.3f ",sfvec3f->c[i]); }
554 case FIELDTYPE_MFVec3f:
555 case FIELDTYPE_MFColor:
559 for (i=0; i<mfvec3f->n; i++)
560 { spacer fprintf (fp,
" %d: \t[%4.3f, %4.3f, %4.3f]\n",i,mfvec3f->p[i].c[0], mfvec3f->p[i].c[1],mfvec3f->p[i].c[2]); }
563 case FIELDTYPE_SFVec3d:
567 for (i=0; i<3; i++) { fprintf (fp,
"%4.3f ",sfvec3d->c[i]); }
571 case FIELDTYPE_MFVec3d:
575 for (i=0; i<mfvec3d->n; i++)
576 { spacer fprintf (fp,
" %d: \t[%4.3f, %4.3f, %4.3f]\n",i,mfvec3d->p[i].c[0], mfvec3d->p[i].c[1],mfvec3d->p[i].c[2]); }
579 case FIELDTYPE_SFVec4f:
580 case FIELDTYPE_SFColorRGBA:
581 case FIELDTYPE_SFRotation:
585 for (i=0; i<4; i++) { fprintf (fp,
"%4.3f ",sfrot->c[i]); }
589 case FIELDTYPE_MFVec4f:
590 case FIELDTYPE_MFColorRGBA:
591 case FIELDTYPE_MFRotation:
595 for (i=0; i<mfrgba->n; i++)
596 { spacer fprintf (fp,
" %d: \t[%4.3f, %4.3f, %4.3f, %4.3f]\n",i,mfrgba->p[i].c[0], mfrgba->p[i].c[1],mfrgba->p[i].c[2],mfrgba->p[i].c[3]); }
599 case FIELDTYPE_SFVec4d:
603 for (i=0; i<4; i++) { fprintf (fp,
"%4.3f ",sfvec4d->c[i]); }
607 case FIELDTYPE_MFVec4d:
611 for (i=0; i<mfvec4d->n; i++)
612 { spacer fprintf (fp,
" %d: \t[%4.3f, %4.3f, %4.3f, %4.3f]\n",i,mfvec4d->p[i].c[0], mfvec4d->p[i].c[1],mfvec4d->p[i].c[2],mfvec4d->p[i].c[3]); }
615 case FIELDTYPE_SFMatrix3f:
618 spacer fprintf (fp,
" \t[%4.3f, %4.3f, %4.3f, %4.3f, %4.3f, %4.3f, %4.3f, %4.3f, %4.3f ]\n",
619 sfmat3f->c[0],sfmat3f->c[1],sfmat3f->c[2],
620 sfmat3f->c[3],sfmat3f->c[4],sfmat3f->c[5],
621 sfmat3f->c[6],sfmat3f->c[7],sfmat3f->c[8]);
624 case FIELDTYPE_MFMatrix3f:
628 for (i=0; i<mfmat3f->n; i++) {
629 spacer fprintf (fp,
" %d: \t[%4.3f, %4.3f, %4.3f, %4.3f, %4.3f, %4.3f, %4.3f, %4.3f, %4.3f ]\n",i,
630 mfmat3f->p[i].c[0],mfmat3f->p[i].c[1],mfmat3f->p[i].c[2],
631 mfmat3f->p[i].c[3],mfmat3f->p[i].c[4],mfmat3f->p[i].c[5],
632 mfmat3f->p[i].c[6],mfmat3f->p[i].c[7],mfmat3f->p[i].c[8]); }
635 case FIELDTYPE_SFMatrix3d:
638 spacer fprintf (fp,
" \t[%4.3f, %4.3f, %4.3f, %4.3f, %4.3f, %4.3f, %4.3f, %4.3f, %4.3f ]\n",
639 sfmat3d->c[0],sfmat3d->c[1],sfmat3d->c[2],
640 sfmat3d->c[3],sfmat3d->c[4],sfmat3d->c[5],
641 sfmat3d->c[6],sfmat3d->c[7],sfmat3d->c[8]);
644 case FIELDTYPE_MFMatrix3d:
648 for (i=0; i<mfmat3d->n; i++) {
649 spacer fprintf (fp,
" %d: \t[%4.3f, %4.3f, %4.3f, %4.3f, %4.3f, %4.3f, %4.3f, %4.3f, %4.3f ]\n",i,
650 mfmat3d->p[i].c[0],mfmat3d->p[i].c[1],mfmat3d->p[i].c[2],
651 mfmat3d->p[i].c[3],mfmat3d->p[i].c[4],mfmat3d->p[i].c[5],
652 mfmat3d->p[i].c[6],mfmat3d->p[i].c[7],mfmat3d->p[i].c[8]); }
655 case FIELDTYPE_SFMatrix4f:
658 fprintf (fp,
" \t[%4.3f, %4.3f, %4.3f, %4.3f, %4.3f, %4.3f, %4.3f, %4.3f, %4.3f, %4.3f, %4.3f, %4.3f, %4.3f, %4.3f, %4.3f, %4.3f ]\n",
659 sfmat4f->c[0],sfmat4f->c[1],sfmat4f->c[2],sfmat4f->c[3],
660 sfmat4f->c[4],sfmat4f->c[5],sfmat4f->c[6],sfmat4f->c[7],
661 sfmat4f->c[8],sfmat4f->c[9],sfmat4f->c[10],sfmat4f->c[11],
662 sfmat4f->c[12],sfmat4f->c[13],sfmat4f->c[14],sfmat4f->c[15]);
665 case FIELDTYPE_MFMatrix4f:
669 for (i=0; i<mfmat4f->n; i++) {
671 fprintf (fp,
" %d: \t[%4.3f, %4.3f, %4.3f, %4.3f, %4.3f, %4.3f, %4.3f, %4.3f, %4.3f, %4.3f, %4.3f, %4.3f, %4.3f, %4.3f, %4.3f, %4.3f ]\n",i,
672 mfmat4f->p[i].c[0],mfmat4f->p[i].c[1],mfmat4f->p[i].c[2],mfmat4f->p[i].c[3],
673 mfmat4f->p[i].c[4],mfmat4f->p[i].c[5],mfmat4f->p[i].c[6],mfmat4f->p[i].c[7],
674 mfmat4f->p[i].c[8],mfmat4f->p[i].c[9],mfmat4f->p[i].c[10],mfmat4f->p[i].c[11],
675 mfmat4f->p[i].c[12],mfmat4f->p[i].c[13],mfmat4f->p[i].c[14],mfmat4f->p[i].c[15]); }
678 case FIELDTYPE_SFMatrix4d:
681 fprintf (fp,
" \t[%4.3f, %4.3f, %4.3f, %4.3f, %4.3f, %4.3f, %4.3f, %4.3f, %4.3f, %4.3f, %4.3f, %4.3f, %4.3f, %4.3f, %4.3f, %4.3f ]\n",
682 sfmat4d->c[0],sfmat4d->c[1],sfmat4d->c[2],sfmat4d->c[3],
683 sfmat4d->c[4],sfmat4d->c[5],sfmat4d->c[6],sfmat4d->c[7],
684 sfmat4d->c[8],sfmat4d->c[9],sfmat4d->c[10],sfmat4d->c[11],
685 sfmat4d->c[12],sfmat4d->c[13],sfmat4d->c[14],sfmat4d->c[15]);
688 case FIELDTYPE_MFMatrix4d:
692 for (i=0; i<mfmat4d->n; i++) {
694 fprintf (fp,
" %d: \t[%4.3f, %4.3f, %4.3f, %4.3f, %4.3f, %4.3f, %4.3f, %4.3f, %4.3f, %4.3f, %4.3f, %4.3f, %4.3f, %4.3f, %4.3f, %4.3f ]\n",i,
695 mfmat4d->p[i].c[0],mfmat4d->p[i].c[1],mfmat4d->p[i].c[2],mfmat4d->p[i].c[3],
696 mfmat4d->p[i].c[4],mfmat4d->p[i].c[5],mfmat4d->p[i].c[6],mfmat4d->p[i].c[7],
697 mfmat4d->p[i].c[8],mfmat4d->p[i].c[9],mfmat4d->p[i].c[10],mfmat4d->p[i].c[11],
698 mfmat4d->p[i].c[12],mfmat4d->p[i].c[13],mfmat4d->p[i].c[14],mfmat4d->p[i].c[15]); }
702 case FIELDTYPE_SFImage:
704 fprintf(fp,
" %p \n",(
void *)value);
718void dump_scene2(FILE *fp,
int level,
struct X3D_Node* node,
int recurse,
Stack *DEFedNodes) {
719 #define spacer for (lc=0; lc<level; lc++) fprintf (fp," ");
738 if (fileno(fp) == fileno(stdout)) { allFields = TRUE; }
else { allFields = FALSE; }
740 Boolean allFields = TRUE;
743 if (node==NULL)
return;
746 if (level == 0) fprintf (fp,
"starting dump_scene2\n");
747 nodeName = parser_getNameFromNode(node) ;
748 isDefed = isNodeDEFedYet(node,DEFedNodes);
749 spacer fprintf (fp,
"L%d: node (%p) (",level,node);
750 if(nodeName != NULL) {
752 fprintf(fp,
"USE %s",nodeName);
754 fprintf(fp,
"DEF %s",nodeName);
756 fprintf(fp,
") type %s\n",stringNodeType(node->_nodeType));
758 if(recurse && !isDefed)
760 vector_pushBack(
struct X3D_Node*, DEFedNodes, node);
761 offsets = (
fieldinfo)NODE_OFFSETS[node->_nodeType];
763 field = &offsets[ifield];
764 while( field->nameIndex > -1)
767 privat = FIELDNAMES[field->nameIndex][0] ==
'_';
768 privat = privat && strcmp(FIELDNAMES[field->nameIndex],
"__scriptObj");
769 privat = privat && strcmp(FIELDNAMES[field->nameIndex],
"__protoDef");
770 if(allFields || !privat)
773 fprintf(fp,
" %s",FIELDNAMES[field->nameIndex]);
774 fprintf(fp,
" (%s)",FIELDTYPES[field->typeIndex]);
775 if(node->_nodeType == NODE_Script && !strcmp(FIELDNAMES[field->nameIndex],
"__scriptObj") )
784 sp = *(
struct Shader_Script **)&((
char*)node)[field->offset];
785 fprintf(fp,
"loaded = %d\n",sp->loaded);
786 sfields = sp->fields;
788 for(k=0;k<sfields->n;k++)
793 fdecl = sfield->fieldDecl;
794 fieldName = fieldDecl_getShaderScriptName(fdecl);
795 fprintf(fp,
" %s",fieldName);
797 fprintf(fp,
" (%s)", stringFieldtypeType(fdecl->fieldType));
798 fprintf(fp,
" %s ",stringPROTOKeywordType(fdecl->PKWmode));
800 if(fdecl->PKWmode == PKW_initializeOnly)
801 print_field(fp,level,fdecl->fieldType,fieldName,&(sfield->value),DEFedNodes);
807 else if(node->_nodeType == NODE_Proto && !strcmp(FIELDNAMES[field->nameIndex],
"__protoDef") )
814 fprintf(fp,
" user fields:\n");
817 for(k=0; k!=vectorSize(pstruct->iface); ++k)
819 const char *fieldName;
822 fieldName = pfield->cname;
824 fprintf(fp,
" %p ",(
void*)pfield);
825 fprintf(fp,
" %s",fieldName);
826 fprintf(fp,
" (%s)", stringFieldtypeType(pfield->type));
827 fprintf(fp,
" %s ",stringPROTOKeywordType(pfield->mode));
829 if(pfield->mode == PKW_initializeOnly || pfield->mode == PKW_inputOutput)
830 print_field(fp,level,pfield->type,fieldName,&(pfield->defaultVal),DEFedNodes);
837 union anyVrml* any_except_PTR = (
union anyVrml*)&((
char*)node)[field->offset];
838 print_field(fp,level,field->typeIndex,FIELDNAMES[field->nameIndex],any_except_PTR,DEFedNodes);
842 field = &offsets[ifield];
846 spacer fprintf (fp,
"L%d end\n",level);
847 if (level == 0) fprintf (fp,
"ending dump_scene2\n");
851void deep_copy2(
int iopt,
char* defname)
856 ConsoleMessage(
"in deep_copy2 - for copying a node and its fields\n");
857 ConsoleMessage(
"got iopt=%d defname=%s\n",iopt,defname);
858 if(iopt == 0)
return;
861 node = parser_getNodeFromName(defname);
865 node = (
struct X3D_Node*)rootNode();
869 sscanf(defname,
"%p",&node);
871 if( checkNode(node, NULL, 0) )
873 name2 = parser_getNameFromNode(node);
875 ConsoleMessage(
"You entered %s\n",name2);
877 ConsoleMessage(
"Node exists!\n");
879 ConsoleMessage(
"Node does not exist.\n");
883void print_DEFed_node_names_and_pointers(FILE* fp)
885 int ind,j,jj,nstack,nvector;
888 struct Vector *curNameStackTop;
889 struct Vector *curNodeStackTop;
892 fprintf(fp,
"DEFedNodes ");
893 if(!globalParser)
return;
894 if(globalParser->DEFedNodes == NULL)
896 fprintf(fp,
" NULL\n");
899 nstack = globalParser->lexer->userNodeNames->n;
900 fprintf(fp,
" lexer namespace vectors = %d\n",nstack);
901 for(j=0;j<nstack;j++)
903 curNameStackTop = vector_get(
struct Vector *, globalParser->lexer->userNodeNames,j);
904 curNodeStackTop = vector_get(
struct Vector *, globalParser->DEFedNodes,j);
905 if(curNameStackTop && curNodeStackTop)
907 nvector = vectorSize(curNodeStackTop);
908 for(jj=0;jj<j;jj++) fprintf(fp,
" ");
909 fprintf(fp,
"vector %d name count = %d\n",j,nvector);
910 for (ind=0; ind < nvector; ind++)
912 for(jj=0;jj<j;jj++) fprintf(fp,
" ");
913 node = vector_get(
struct X3D_Node*,curNodeStackTop, ind);
914 name = vector_get(
char *,curNameStackTop, ind);
915 fprintf (fp,
"L%d: node (%p) name (%s) \n",jj,node,name);
920char *findFIELDNAMESfromNodeOffset0(
struct X3D_Node *node,
int offset)
922 if( node->_nodeType != NODE_Script)
924 if( node->_nodeType == NODE_Proto )
932 if(offset < vectorSize(pstruct->iface))
935 pfield= vector_get(
struct ProtoFieldDecl*, pstruct->iface, offset);
937 return pfield->cname;
944 return (
char *)findFIELDNAMESfromNodeOffset(node,offset);
954 fields = myObj->fields;
956 return fieldDecl_getShaderScriptName(curField->fieldDecl);
960char *findFIELDNAMES0(
struct X3D_Node *node,
int offset)
962 return findFIELDNAMESfromNodeOffset0(node,offset);
964#include "../vrml_parser/CRoutes.h"
965void print_routes_ready_to_register(FILE* fp);
966void print_routes(FILE* fp)
977 print_routes_ready_to_register(fp);
978 numRoutes = getRoutesCount();
979 fprintf(fp,
"Number of Routes %d\n",numRoutes-2);
985 for (count = 1; count < (numRoutes-1); count++) {
986 getSpecificRoute (count,&fromNode, &fromOffset, &toNode, &toOffset);
987 fromName = parser_getNameFromNode(fromNode);
988 toName = parser_getNameFromNode(toNode);
990 fprintf (fp,
" %p %s.%s TO %p %s.%s \n",fromNode,fromName,
991 findFIELDNAMESfromNodeOffset0(fromNode,fromOffset),
993 findFIELDNAMESfromNodeOffset0(toNode,toOffset)
997static struct consoleMenuState
1000 void (*f)(
void*,
char*);
1006int consoleMenuActive()
1008 return ConsoleMenuState.active;
1010void setConsoleMenu(
void *yourData,
char *prompt,
void (*callback),
char* dfault)
1012 ConsoleMenuState.f = callback;
1013 ConsoleMenuState.len = 0;
1014 ConsoleMenuState.buf[0] =
'\0';
1015 ConsoleMenuState.active = TRUE;
1016 ConsoleMenuState.dfault = dfault;
1017 ConsoleMenuState.yourData = yourData;
1018 ConsoleMessage(prompt);
1019 ConsoleMessage(
"[%s]:",dfault);
1021void deep_copy_defname(
void *myData,
char *defname)
1024 ConsoleMessage(
"you entered defname: %s\n",defname);
1025 memcpy(&iopt,myData,4);
1026 deep_copy2(iopt,defname);
1029void deep_copy_option(
void* yourData,
char *opt)
1032 ConsoleMessage(
"you chose option %s\n",opt);
1033 sscanf(opt,
"%d",&iopt);
1034 if(iopt == 0)
return;
1035 if(iopt == 1 || iopt == 3)
1037 void* myData = MALLOC(
void *, 4);
1038 memcpy(myData,&iopt,4);
1039 setConsoleMenu(myData,
"Enter DEFname or node address:", deep_copy_defname,
"");
1042 deep_copy2(iopt, NULL);
1044void dump_scenegraph(
int method)
1048 dump_scene(stdout, 0, (
struct X3D_Node*) rootNode());
1049 else if(method == 2)
1052 dump_scene2(stdout, 0, (
struct X3D_Node*) rootNode(),1,DEFedNodes);
1053 deleteVector(
struct X3D_Node*,DEFedNodes);
1055 else if(method == 3)
1057 print_DEFed_node_names_and_pointers(stdout);
1059 else if(method == 4)
1061 print_routes(stdout);
1063 else if(method == 5)
1066 setConsoleMenu(NULL,
"0. Exit 1.DEFname 2.ROOTNODE 3.node address", deep_copy_option,
"0");
1073void register_node_gc(
void *node,
void *p);
1074void unregister_node_gc(
void *node,
void *p);
1075void free_registered_node_gc(
void* node);
1077void register_node_gc(
void *node,
void *p){
1079 if(!_node->_gc) _node->_gc = newVector(
void*,1);
1080 vector_pushBack(
void*,_node->_gc,p);
1082void unregister_node_gc(
void *node,
void *p){
1088 if(!_node->_gc)
return;
1090 v = (
struct Vector*)_node->_gc;
1091 for(i=0;i<v->n;i++){
1092 p0 = vector_get(
void*,v,i);
1094 vector_set(
void*,v,i,NULL);
1099void free_registered_node_gc(
void* node){
1105 for(i=0;i<v->n;i++){
1106 p = vector_get(
void *,v,i);
1109 deleteVector(
void*,_node->_gc);
1117#if defined(DISABLER) || defined(DISABLER_MALLOC)
1120#define WRAP_MALLOC 1
1123int DROIDDEBUG(
const char*pFmtStr, ...);
1124#define printf DROIDDEBUG
1133#if defined(WRAP_MALLOC) || defined(DEBUG_MALLOC)
1135#define FWL_NOT_FOUND_IN_MEM_TABLE -1
1137void __free_memtable_elem(
void *ptr);
1138void __free_memtable_elem_with_data(
void *ptr);
1139int __match_memtable_elem(
void *elem1,
void *elem2);
1141typedef struct fwl_memtable_elem
1149static ttglobal sLastSeenGlobal = NULL;
1151void __freeWholeMemTable(
ttglobal gg)
1153 if (gg->__memTable != NULL)
1155 gg->__memTable->free = &__free_memtable_elem_with_data;
1156 dbl_list_destroy(gg->__memTable);
1157 gg->__memTable = NULL;
1161int __removeFromMemTable(
ttglobal gg,
void *ptr,
char *file,
int line)
1163 int retVal = FWL_NOT_FOUND_IN_MEM_TABLE;
1164 if (gg->__memTable != NULL)
1166 fwl_memtable_elem searchedElem;
1167 searchedElem.ptr = ptr;
1168 dbl_list_node_t *node = dbl_list_find(gg->__memTable, &searchedElem);
1172 dbl_list_remove(gg->__memTable, node);
1176 printf (
"freewrlFree - did not find 0x%016llx at %s:%d\n", (
unsigned long long)ptr,file,line);
1183void __reserveInMemTable(
ttglobal gg,
void *ptr,
char *file,
int line)
1185 if (gg->__memTable != NULL)
1187 fwl_memtable_elem searchedElem;
1188 searchedElem.ptr = ptr;
1189 dbl_list_node_t *node = dbl_list_find(gg->__memTable, &searchedElem);
1192 fwl_memtable_elem *foundElem = (fwl_memtable_elem *)node->val;
1194 printf (
"freewrl__ReserveInMemTable - ptr already in the table 0x%016llx at %s:%d, added at %s:%d\n", (
unsigned long long)ptr, file, line, foundElem->fileName, foundElem->lineNubmer);
1199 fwl_memtable_elem *newElem = malloc(
sizeof(fwl_memtable_elem));
1200 newElem->fileName = file;
1201 newElem->lineNubmer = line;
1203 dbl_list_rpush(gg->__memTable, dbl_list_node_new(newElem));
1208#define LOCK_GLOBAL_MEMORYTABLE if (tg) pthread_mutex_lock(&tg->__memTableGlobalLock);
1209#define UNLOCK_GLOBAL_MEMORYTABLE if (tg) pthread_mutex_unlock(&tg->__memTableGlobalLock);
1216 sLastSeenGlobal = tg;
1220 tg = sLastSeenGlobal;
1226void freewrlInitMemTable()
1228 ttglobal tg = freewrlGetActualGlobal();
1231 pthread_mutex_init(&(tg->__memTableGlobalLock), NULL);
1233 LOCK_GLOBAL_MEMORYTABLE
1235 if (tg && !tg->__memTable_CheckInit) {
1237 tg->__memTable = dbl_list_new();
1238 tg->__memTable->free = &__free_memtable_elem;
1239 tg->__memTable->match = &__match_memtable_elem;
1240 tg->__memTable_CheckInit = TRUE;
1243 UNLOCK_GLOBAL_MEMORYTABLE
1246void __free_memtable_elem_with_data(
void *ptr)
1248 fwl_memtable_elem *elem = (fwl_memtable_elem *)ptr;
1250 printf (
"freewrl MemTable disposing ptr 0x%016llx\n", (
unsigned long long)elem->ptr);
1256void __free_memtable_elem(
void *ptr)
1261int __match_memtable_elem(
void *elem1,
void *elem2)
1263 return ((fwl_memtable_elem *)elem1)->ptr == ((fwl_memtable_elem *)elem2)->ptr;
1266void freewrlDisposeMemTable()
1268 ttglobal tg = freewrlGetActualGlobal();
1271 pthread_mutex_destroy(&(tg->__memTableGlobalLock));
1272 if (sLastSeenGlobal == tg)
1274 sLastSeenGlobal = NULL;
1279void freewrlFree(
int line,
char *file,
void *a)
1281 ttglobal tg = freewrlGetActualGlobal();
1282 LOCK_GLOBAL_MEMORYTABLE
1286 printf (
"freewrlFree 0x%016llx xfree at %s:%d\n", (
unsigned long long)a, file,line);
1289 __removeFromMemTable(tg, a,file,line);
1292 UNLOCK_GLOBAL_MEMORYTABLE
1296void scanMallocTableOnQuit()
1298 ttglobal tg = freewrlGetActualGlobal();
1299 LOCK_GLOBAL_MEMORYTABLE
1302 dbl_list_iterator_t *it = dbl_list_iterator_new(tg->__memTable, LIST_HEAD);
1303 dbl_list_node_t *node;
1304 while ((node = dbl_list_iterator_next(it))) {
1305 fwl_memtable_elem *elem = ((fwl_memtable_elem *)node->val);
1306 printf (
"unfreed memory %016llx created at %s:%d \n", (
unsigned long long)elem->ptr, elem->fileName, elem->lineNubmer);
1308 dbl_list_iterator_destroy(it);
1310 UNLOCK_GLOBAL_MEMORYTABLE
1313void freewrlSetShouldRegisterAllocation(
bool shouldRegisterAllocation)
1315 ttglobal tg = freewrlGetActualGlobal();
1316 LOCK_GLOBAL_MEMORYTABLE
1319 tg->__memTable_ShouldRegisterAllocation = shouldRegisterAllocation;
1321 UNLOCK_GLOBAL_MEMORYTABLE
1324bool freewrlIsRegisteringAllocation()
1326 ttglobal tg = freewrlGetActualGlobal();
1330 return tg->__memTable_ShouldRegisterAllocation;
1336void freewrlFreeAllRegisteredAllocations()
1338 ttglobal tg = freewrlGetActualGlobal();
1339 LOCK_GLOBAL_MEMORYTABLE
1342 __freeWholeMemTable(tg);
1344 UNLOCK_GLOBAL_MEMORYTABLE
1350void *freewrlMalloc(
int line,
char *file,
size_t sz,
int zeroData)
1354 ttglobal tg = freewrlGetActualGlobal();
1355 LOCK_GLOBAL_MEMORYTABLE
1358 if (zeroData) bzero (rv, sz);
1364 sprintf (myline,
"MALLOC PROBLEM - out of memory at %s:%d for %zu",file,line,sz);
1365 outOfMemory (myline);
1368 printf (
"freewrlMalloc 0x%016llx size %zu at %s:%d\n", (
unsigned long long)rv,sz,file,line);
1371 if (tg && tg->__memTable_ShouldRegisterAllocation)
1373 __reserveInMemTable(tg, rv,file,line);
1376 UNLOCK_GLOBAL_MEMORYTABLE
1381void *freewrlRealloc(
int line,
char *file,
void *ptr,
size_t size)
1385 ttglobal tg = freewrlGetActualGlobal();
1386 LOCK_GLOBAL_MEMORYTABLE
1389 rv = realloc (ptr,size);
1397 sprintf (myline,
"REALLOC PROBLEM - out of memory at %s:%d size %zu",file,line,size);
1398 outOfMemory (myline);
1402 printf (
"freewrlRealloc 0x%016llx to 0x%016llx size %zu at %s:%d\n", (
unsigned long long)ptr, (
unsigned long long)rv, size, file, line);
1410 result = __removeFromMemTable(tg, ptr,file,line);
1412 if (result != FWL_NOT_FOUND_IN_MEM_TABLE)
1414 if (tg->__memTable_ShouldRegisterAllocation)
1416 __reserveInMemTable(tg, rv,file,line);
1421 printf (
"0x%016llx FOR REALLOC NOT FOUND for size %zu at %s:%d\n", (
unsigned long long)ptr,size,file,line);
1425 UNLOCK_GLOBAL_MEMORYTABLE
1430void *freewrlStrdup (
int line,
char *file,
const char *str)
1434 ttglobal tg = freewrlGetActualGlobal();
1435 LOCK_GLOBAL_MEMORYTABLE
1439 printf(
"freewrlStrdup 0x%016llx, at line %d file %s\n",(
unsigned long long)rv, line,file);
1443 sprintf (myline,
"STRDUP PROBLEM - out of memory at %s:%d ",file,line);
1444 outOfMemory (myline);
1448 if (tg && tg->__memTable_ShouldRegisterAllocation)
1450 __reserveInMemTable(tg, rv,file,line);
1452 UNLOCK_GLOBAL_MEMORYTABLE
1456void *freewrlStrndup (
int line,
char *file,
const char *str,
size_t n)
1459 ttglobal tg = freewrlGetActualGlobal();
1460 LOCK_GLOBAL_MEMORYTABLE
1462 rv = strndup (str, n);
1465 printf(
"freewrlStrndup 0x%016llx count at line %d file %s\n", (
unsigned long long)rv, line,file);
1469 sprintf (myline,
"STRNDUP PROBLEM - out of memory at %s:%d ",file,line);
1470 outOfMemory (myline);
1474 if (tg && tg->__memTable_ShouldRegisterAllocation)
1476 __reserveInMemTable(tg, rv,file,line);
1478 UNLOCK_GLOBAL_MEMORYTABLE
1502static int _noisy = 0;
1504#define MAXMALLOCSTOKEEP 100000
1505static int mcheckinit = FALSE;
1506static void* mcheck[MAXMALLOCSTOKEEP];
1507static char* mplace[MAXMALLOCSTOKEEP];
1508static int mlineno[MAXMALLOCSTOKEEP];
1509static size_t msize[MAXMALLOCSTOKEEP];
1512static mcheck_init(){
1514 for (mcount=0; mcount < MAXMALLOCSTOKEEP; mcount++) {
1515 mcheck[mcount] = NULL;
1516 mplace[mcount] = NULL;
1517 mlineno[mcount] = 0;
1524void FREETABLE(
void *a,
char *file,
int line) {
1525 LOCK_GLOBAL_MEMORYTABLE
1527 while ((mcount<(MAXMALLOCSTOKEEP-1)) && (mcheck[mcount]!=a)) mcount++;
1528 if (mcheck[mcount]!=a) {
1529 printf (
"freewrlFree - did not find %p at %s:%d\n",a,file,line);
1530 printf(
"mcount = %d\n",mcount);
1535 mcheck[mcount] = NULL;
1536 mlineno[mcount] = 0;
1537 if (mplace[mcount]!=NULL) free(mplace[mcount]);
1538 mplace[mcount]=NULL;
1540 UNLOCK_GLOBAL_MEMORYTABLE
1543void RESERVETABLE(
void *a,
char *file,
int line,
int size) {
1544 LOCK_GLOBAL_MEMORYTABLE
1546 while ((mcount<(MAXMALLOCSTOKEEP-1)) && (mcheck[mcount]!=NULL)) mcount++;
1547 if (mcheck[mcount]!=NULL) {
1548 printf (
"freewrlMalloc - out of malloc check store\n");
1549 printf(
"mcount=%d\n",mcount);
1553 mlineno[mcount] = line;
1554 mplace[mcount] = strdup(file);
1555 msize[mcount] = size;
1557 UNLOCK_GLOBAL_MEMORYTABLE
1560void freewrlFree(
int line,
char *file,
void *a)
1563 if(_noisy) printf (
"freewrlFree %p xfree at %s:%d\n",a,file,line);
1565 FREETABLE(a,file,line);
1569void scanMallocTableOnQuit_old()
1571 for (mcount=0; mcount<MAXMALLOCSTOKEEP;mcount++) {
1572 if (mcheck[mcount]!=NULL) {
1573 printf (
"unfreed memory %p created at %s:%d \n",mcheck[mcount], mplace[mcount],mlineno[mcount]);
1577typedef struct malloc_location {
1585#define alloca _alloca
1587int comp_count (
const void * elem1,
const void * elem2)
1589 malloc_location *e1, *e2;
1590 e1 = (malloc_location*)elem1;
1591 e2 = (malloc_location*)elem2;
1592 return e1->count < e2->count ? -1 : e1->count > e2->count ? 1 : 0;
1594int comp_size (
const void * elem1,
const void * elem2)
1596 malloc_location *e1, *e2;
1597 e1 = (malloc_location*)elem1;
1598 e2 = (malloc_location*)elem2;
1599 return e1->size < e2->size ? -1 : e1->size > e2->size ? 1 : 0;
1601int comp_file (
const void * elem1,
const void * elem2)
1603 malloc_location *e1, *e2;
1604 e1 = (malloc_location*)elem1;
1605 e2 = (malloc_location*)elem2;
1606 return strcmp(e1->fname,e2->fname);
1608int comp_line (
const void * elem1,
const void * elem2)
1610 malloc_location *e1, *e2;
1611 e1 = (malloc_location*)elem1;
1612 e2 = (malloc_location*)elem2;
1613 return e1->line < e2->line ? -1 : e1->line > e2->line ? 1 : 0;
1615int comp_fileline (
const void * elem1,
const void * elem2)
1618 iret = comp_file(elem1,elem2);
1620 iret = comp_line(elem1,elem2);
1623void scanForVectorTypes(){
1624 for (mcount=0; mcount<MAXMALLOCSTOKEEP;mcount++) {
1625 if (mcheck[mcount]!=NULL) {
1626 if(mlineno[mcount]==5873){
1629 printf(
"!%d!",v->n);
1634void scanForFieldTypes(){
1635 for (mcount=0; mcount<MAXMALLOCSTOKEEP;mcount++) {
1636 if (mcheck[mcount]!=NULL) {
1637 if(mlineno[mcount]==105){
1643 printf(
"#%s#",us->strptr);
1649void scanForCstringTypes(){
1650 for (mcount=0; mcount<MAXMALLOCSTOKEEP;mcount++) {
1651 if (mcheck[mcount]!=NULL) {
1652 if(mlineno[mcount]==456 || mlineno[mcount]==117){
1653 char *s = (
char*)mcheck[mcount];
1659void scanMallocTableOnQuit()
1665 scanForFieldTypes();
1667 malloc_location *mlocs = malloc(
sizeof(malloc_location)*MAXMALLOCSTOKEEP);
1668 memset(mlocs,0,
sizeof(malloc_location)*MAXMALLOCSTOKEEP);
1670 for (mcount=0; mcount<MAXMALLOCSTOKEEP;mcount++) {
1671 if (mcheck[mcount]!=NULL) {
1674 for(j=0;j<nlocs;j++){
1677 file = mplace[mcount];
1678 line = mlineno[mcount];
1679 mfile = mlocs[j].fname;
1680 mline = mlocs[j].line;
1682 printf(
"line %d",line);
1683 if(mfile) printf(
"mfile=%s",mfile);
1686 printf(
"line %d",line);
1687 if(file) printf(
"file=%s",file);
1690 if(!strcmp(file,mfile) && (line == mline) ){
1692 mlocs[j].size += msize[mcount];
1698 mlocs[nlocs].count = 1;
1699 mlocs[nlocs].fname = mplace[mcount];
1701 printf(
"adding null place\n");
1702 mlocs[nlocs].line = mlineno[mcount];
1703 mlocs[nlocs].size = msize[mcount];
1709 if(1) qsort(mlocs,nlocs,
sizeof(malloc_location),comp_fileline);
1710 if(0) qsort(mlocs,nlocs,
sizeof(malloc_location),comp_line);
1711 if(0) qsort(mlocs,nlocs,
sizeof(malloc_location),comp_file);
1712 if(0) qsort(mlocs,nlocs,
sizeof(malloc_location),comp_count);
1713 if(0) qsort(mlocs,nlocs,
sizeof(malloc_location),comp_size);
1714 printf(
"unfreed:\n");
1715 printf(
"%5s %8s %4s %55s\n",
"count",
"size",
"line",
"file");
1717 for(j=0;j<nlocs;j++){
1718 printf(
"%5d %8d %4d %55s\n",mlocs[j].count,mlocs[j].size, mlocs[j].line,mlocs[j].fname);
1719 total += mlocs[j].size;
1721 printf(
"total bytes not freed %d\n",total);
1730void *freewrlMalloc(
int line,
char *file,
size_t sz,
int zeroData)
1739 sprintf (myline,
"MALLOC PROBLEM - out of memory at %s:%d for %d",file,line,sz);
1740 outOfMemory (myline);
1742 if(_noisy)printf (
"%p malloc %d at %s:%d\n",rv,sz,file,line);
1745 RESERVETABLE(rv,file,line,sz);
1747 if (zeroData) bzero (rv, sz);
1751void *freewrlRealloc (
int line,
char *file,
void *ptr,
size_t size)
1758 if(_noisy) printf (
"%p xfree (from realloc) at %s:%d\n",ptr,file,line);
1759 rv = realloc (ptr,size);
1762 sprintf (myline,
"REALLOC PROBLEM - out of memory at %s:%d size %d",file,line,size);
1763 outOfMemory (myline);
1770 FREETABLE(ptr,file,line);
1771 RESERVETABLE(rv,file,line,size);
1777void *freewrlStrdup (
int line,
char *file,
char *str)
1782 if(_noisy) printf(
"freewrlStrdup, at line %d file %s\n",line,file);
1785 sprintf (myline,
"STRDUP PROBLEM - out of memory at %s:%d ",file,line);
1786 outOfMemory (myline);
1788 if(_noisy) printf (
"freewrlStrdup, before reservetable\n");
1791 RESERVETABLE(rv,file,line,strlen(str)+1);
1794void *mallocn_debug(
int line,
char *file,
void *node,
size_t size){
1796 struct X3D_Node *_node = X3D_NODE(node);
1797 p = freewrlMalloc(line,file,size,FALSE);
1798 register_node_gc(node,p);
1801void *reallocn_debug(
int line,
char *file,
void *node,
void *pold,
size_t newsize){
1803 struct X3D_Node *_node = X3D_NODE(node);
1804 unregister_node_gc(node,pold);
1805 p = freewrlRealloc(line,file,pold,newsize);
1806 register_node_gc(node,p);
1810void *mallocn(
void *node,
size_t size){
1814 register_node_gc(node,p);
1817void *reallocn(
void *node,
void *pold,
size_t newsize){
1820 unregister_node_gc(node,pold);
1821 p = realloc(pold,newsize);
1822 register_node_gc(node,p);
1827#if defined(_MSC_VER) && defined(W_DEBUG)
1830 static int check_memory_initialized = 0;
1832 if(!check_memory_initialized){
1834 int tmpFlag = _CrtSetDbgFlag( _CRTDBG_REPORT_FLAG );
1837 tmpFlag |= _CRTDBG_LEAK_CHECK_DF;
1840 tmpFlag |= ~_CRTDBG_CHECK_CRT_DF;
1843 _CrtSetDbgFlag( tmpFlag );
1844 check_memory_initialized = 1;
1846 iret = _CrtCheckMemory();
1848 printf(
"ouch - memory violation\n");
1853int check_memory(){
return TRUE; }