Splint cleanups and related bugfixes:

- fix memory leak in bin_objfmt_resolve_label2()
 - delete common data in bin_objfmt_common_data_new() rather than continuing
   to handle it in declare_data_*()

svn path=/trunk/yasm/; revision=604
0.3
Peter Johnson 23 years ago
parent f11e97b9ec
commit 6033703a64
  1. 6
      libyasm/coretype.h
  2. 75
      modules/objfmts/bin/bin-objfmt.c
  3. 17
      modules/objfmts/dbg/dbg-objfmt.c
  4. 6
      src/coretype.h
  5. 75
      src/objfmts/bin/bin-objfmt.c
  6. 17
      src/objfmts/dbg/dbg-objfmt.c

@ -98,7 +98,9 @@ typedef /*@null@*/ intnum *(*resolve_label_func) (symrec *sym, int withstart);
* Returns nonzero if an error occurred, 0 otherwise
*/
typedef int (*output_expr_func) (expr **ep, unsigned char **bufp,
unsigned long valsize, const section *sect,
const bytecode *bc, int rel, void *d)
unsigned long valsize,
/*@observer@*/ const section *sect,
/*@observer@*/ const bytecode *bc, int rel,
/*@null@*/ void *d)
/*@uses *ep@*/ /*@sets **bufp@*/;
#endif

@ -42,7 +42,7 @@
#define REGULAR_OUTBUF_SIZE 1024
static intnum *bin_objfmt_resolve_label(symrec *sym, int withstart);
static /*@null@*/ intnum *bin_objfmt_resolve_label(symrec *sym, int withstart);
static void
bin_objfmt_initialize(/*@unused@*/ const char *in_filename,
@ -94,7 +94,7 @@ bin_objfmt_align_section(section *sect, section *prevsect, unsigned long base,
return start;
}
static intnum *
static /*@null@*/ intnum *
bin_objfmt_resolve_label2(symrec *sym, /*@null@*/ const section *cursect,
unsigned long cursectstart, int withstart)
{
@ -122,8 +122,10 @@ bin_objfmt_resolve_label2(symrec *sym, /*@null@*/ const section *cursect,
assert(startexpr != NULL);
expr_expand_labelequ(startexpr, sect, 1, bin_objfmt_resolve_label);
start = expr_get_intnum(&startexpr);
if (!start)
if (!start) {
expr_delete(startexpr);
return NULL;
}
startval = intnum_get_uint(start);
expr_delete(startexpr);
@ -144,7 +146,7 @@ bin_objfmt_resolve_label(symrec *sym, int withstart)
}
typedef struct bin_objfmt_expr_data {
const section *sect;
/*@observer@*/ const section *sect;
unsigned long start;
int withstart;
} bin_objfmt_expr_data;
@ -177,19 +179,20 @@ bin_objfmt_expr_traverse_callback(ExprItem *ei, void *d)
}
typedef struct bin_objfmt_output_info {
FILE *f;
unsigned char *buf;
const section *sect;
/*@dependent@*/ FILE *f;
/*@only@*/ unsigned char *buf;
/*@observer@*/ const section *sect;
unsigned long start;
} bin_objfmt_output_info;
static int
bin_objfmt_output_expr(expr **ep, unsigned char **bufp, unsigned long valsize,
const section *sect, const bytecode *bc, int rel,
/*@observer@*/ const section *sect,
/*@observer@*/ const bytecode *bc, int rel,
/*@null@*/ void *d)
{
/*@null@*/ bin_objfmt_output_info *info = (bin_objfmt_output_info *)d;
bin_objfmt_expr_data data;
/*@observer@*/ bin_objfmt_expr_data data;
/*@dependent@*/ /*@null@*/ const intnum *num;
/*@dependent@*/ /*@null@*/ const floatnum *flt;
unsigned long val;
@ -217,7 +220,7 @@ bin_objfmt_output_expr(expr **ep, unsigned char **bufp, unsigned long valsize,
flt = expr_get_floatnum(ep);
if (flt) {
int fltret;
fltret = floatnum_get_sized(flt, *bufp, valsize);
fltret = floatnum_get_sized(flt, *bufp, (size_t)valsize);
if (fltret < 0) {
ErrorAt((*ep)->line, _("underflow in floating point expression"));
return 1;
@ -271,6 +274,8 @@ bin_objfmt_output_bytecode(bytecode *bc, /*@null@*/ void *d)
unsigned long i;
int gap;
assert(info != NULL);
bigbuf = bc_tobytes(bc, info->buf, &size, &multiple, &gap, info->sect,
info, bin_objfmt_output_expr);
@ -280,11 +285,9 @@ bin_objfmt_output_bytecode(bytecode *bc, /*@null@*/ void *d)
if (gap)
Warning(_("uninitialized space declared in code/data section: zeroing"));
assert(info != NULL);
/* Output multiple copies of buf (or bigbuf if non-NULL) to file */
for (i=0; i<multiple; i++)
fwrite(bigbuf ? bigbuf : info->buf, size, 1, info->f);
fwrite(bigbuf ? bigbuf : info->buf, (size_t)size, 1, info->f);
/* If bigbuf was allocated, free it */
if (bigbuf)
@ -296,10 +299,10 @@ bin_objfmt_output_bytecode(bytecode *bc, /*@null@*/ void *d)
static void
bin_objfmt_output(FILE *f, sectionhead *sections)
{
/*@null@*/ section *text, *data, *bss, *prevsect;
/*@observer@*/ /*@null@*/ section *text, *data, *bss, *prevsect;
/*@null@*/ expr *startexpr;
/*@dependent@*/ /*@null@*/ const intnum *startnum;
unsigned long start, textstart, datastart;
unsigned long start = 0, textstart = 0, datastart = 0;
unsigned long textlen = 0, textpad = 0, datalen = 0, datapad = 0;
unsigned long *prevsectlenptr, *prevsectpadptr;
unsigned long i;
@ -383,7 +386,7 @@ bin_objfmt_cleanup(void)
{
}
static /*@dependent@*/ /*@null@*/ section *
static /*@observer@*/ /*@null@*/ section *
bin_objfmt_sections_switch(sectionhead *headp, valparamhead *valparams,
/*@unused@*/ /*@null@*/
valparamhead *objext_valparams)
@ -476,49 +479,43 @@ bin_objfmt_section_data_print(FILE *f, /*@null@*/ void *data)
}
static /*@null@*/ void *
bin_objfmt_extern_data_new(const char *name, /*@unused@*/ /*@null@*/
valparamhead *objext_valparams)
bin_objfmt_extern_data_new(/*@unused@*/ const char *name, /*@unused@*/
/*@null@*/ valparamhead *objext_valparams)
{
return NULL;
}
static /*@null@*/ void *
bin_objfmt_global_data_new(const char *name, /*@unused@*/ /*@null@*/
valparamhead *objext_valparams)
bin_objfmt_global_data_new(/*@unused@*/ const char *name, /*@unused@*/
/*@null@*/ valparamhead *objext_valparams)
{
return NULL;
}
static /*@null@*/ void *
bin_objfmt_common_data_new(const char *name,
/*@unused@*/ /*@only@*/ expr *size,
/*@unused@*/ /*@null@*/
bin_objfmt_common_data_new(/*@unused@*/ const char *name,
/*@only@*/ expr *size, /*@unused@*/ /*@null@*/
valparamhead *objext_valparams)
{
expr_delete(size);
Error(_("binary object format does not support common variables"));
return NULL;
}
static void *
bin_objfmt_declare_data_copy(SymVisibility vis, /*@only@*/ void *data)
static /*@only@*/ void *
bin_objfmt_declare_data_copy(/*@unused@*/ SymVisibility vis,
/*@unused@*/ const void *data)
{
if (vis == SYM_COMMON) {
return expr_copy(data);
} else {
InternalError(_("Unrecognized data in bin objfmt declare_data_copy"));
return NULL;
}
InternalError(_("Unrecognized data in bin objfmt declare_data_copy"));
/*@notreached@*/
return xstrdup(data);
}
static void
bin_objfmt_declare_data_delete(SymVisibility vis, /*@only@*/ void *data)
bin_objfmt_declare_data_delete(/*@unused@*/ SymVisibility vis,
/*@unused@*/ /*@only@*/ void *data)
{
if (vis == SYM_COMMON) {
expr_delete(data);
} else {
InternalError(_("Unrecognized data in bin objfmt declare_data_delete"));
xfree(data);
}
InternalError(_("Unrecognized data in bin objfmt declare_data_delete"));
}
static void
@ -536,7 +533,7 @@ bin_objfmt_declare_data_print(FILE *f, SymVisibility vis,
static int
bin_objfmt_directive(const char *name, valparamhead *valparams,
/*@null@*/ valparamhead *objext_valparams,
/*@unused@*/ /*@null@*/ valparamhead *objext_valparams,
sectionhead *headp)
{
section *sect;

@ -39,6 +39,7 @@
static void
dbg_objfmt_initialize(const char *in_filename, const char *obj_filename)
{
assert(debug_file != NULL);
fprintf(debug_file, "%*sinitialize(\"%s\", \"%s\")\n", indent_level, "",
in_filename, obj_filename);
}
@ -60,10 +61,11 @@ dbg_objfmt_output(FILE *f, sectionhead *sections)
static void
dbg_objfmt_cleanup(void)
{
assert(debug_file != NULL);
fprintf(debug_file, "%*scleanup()\n", indent_level, "");
}
static /*@dependent@*/ /*@null@*/ section *
static /*@observer@*/ /*@null@*/ section *
dbg_objfmt_sections_switch(sectionhead *headp, valparamhead *valparams,
/*@unused@*/ /*@null@*/
valparamhead *objext_valparams)
@ -72,6 +74,8 @@ dbg_objfmt_sections_switch(sectionhead *headp, valparamhead *valparams,
section *retval;
int isnew;
assert(debug_file != NULL);
fprintf(debug_file, "%*ssections_switch(headp, ", indent_level, "");
vps_print(debug_file, valparams);
fprintf(debug_file, ", ");
@ -95,6 +99,7 @@ dbg_objfmt_sections_switch(sectionhead *headp, valparamhead *valparams,
static void
dbg_objfmt_section_data_delete(/*@only@*/ void *data)
{
assert(debug_file != NULL);
fprintf(debug_file, "%*ssection_data_delete(%p)\n", indent_level, "", data);
xfree(data);
}
@ -112,6 +117,7 @@ static /*@null@*/ void *
dbg_objfmt_extern_data_new(const char *name, /*@unused@*/ /*@null@*/
valparamhead *objext_valparams)
{
assert(debug_file != NULL);
fprintf(debug_file, "%*sextern_data_new(\"%s\", ", indent_level, "", name);
vps_print(debug_file, objext_valparams);
fprintf(debug_file, "), returning NULL\n");
@ -122,6 +128,7 @@ static /*@null@*/ void *
dbg_objfmt_global_data_new(const char *name, /*@unused@*/ /*@null@*/
valparamhead *objext_valparams)
{
assert(debug_file != NULL);
fprintf(debug_file, "%*sglobal_data_new(\"%s\", ", indent_level, "", name);
vps_print(debug_file, objext_valparams);
fprintf(debug_file, "), returning NULL\n");
@ -133,6 +140,7 @@ dbg_objfmt_common_data_new(const char *name, /*@only@*/ expr *size,
/*@unused@*/ /*@null@*/
valparamhead *objext_valparams)
{
assert(debug_file != NULL);
fprintf(debug_file, "%*scommon_data_new(\"%s\", ", indent_level, "", name);
expr_print(debug_file, size);
fprintf(debug_file, ", ");
@ -144,10 +152,11 @@ dbg_objfmt_common_data_new(const char *name, /*@only@*/ expr *size,
}
static void *
dbg_objfmt_declare_data_copy(SymVisibility vis, /*@only@*/ void *data)
dbg_objfmt_declare_data_copy(SymVisibility vis, const void *data)
{
void *retval = NULL;
assert(debug_file != NULL);
fprintf(debug_file, "%*sdeclare_data_copy(", indent_level, "");
switch (vis) {
case SYM_LOCAL:
@ -178,6 +187,7 @@ dbg_objfmt_declare_data_copy(SymVisibility vis, /*@only@*/ void *data)
static void
dbg_objfmt_declare_data_delete(SymVisibility vis, /*@only@*/ void *data)
{
assert(debug_file != NULL);
fprintf(debug_file, "%*sdeclare_data_delete(", indent_level, "");
switch (vis) {
case SYM_LOCAL:
@ -219,8 +229,9 @@ dbg_objfmt_declare_data_print(FILE *f, SymVisibility vis,
static int
dbg_objfmt_directive(const char *name, valparamhead *valparams,
/*@null@*/ valparamhead *objext_valparams,
sectionhead *headp)
/*@unused@*/ sectionhead *headp)
{
assert(debug_file != NULL);
fprintf(debug_file, "%*sdirective(\"%s\", ", indent_level, "", name);
vps_print(debug_file, valparams);
fprintf(debug_file, ", ");

@ -98,7 +98,9 @@ typedef /*@null@*/ intnum *(*resolve_label_func) (symrec *sym, int withstart);
* Returns nonzero if an error occurred, 0 otherwise
*/
typedef int (*output_expr_func) (expr **ep, unsigned char **bufp,
unsigned long valsize, const section *sect,
const bytecode *bc, int rel, void *d)
unsigned long valsize,
/*@observer@*/ const section *sect,
/*@observer@*/ const bytecode *bc, int rel,
/*@null@*/ void *d)
/*@uses *ep@*/ /*@sets **bufp@*/;
#endif

@ -42,7 +42,7 @@
#define REGULAR_OUTBUF_SIZE 1024
static intnum *bin_objfmt_resolve_label(symrec *sym, int withstart);
static /*@null@*/ intnum *bin_objfmt_resolve_label(symrec *sym, int withstart);
static void
bin_objfmt_initialize(/*@unused@*/ const char *in_filename,
@ -94,7 +94,7 @@ bin_objfmt_align_section(section *sect, section *prevsect, unsigned long base,
return start;
}
static intnum *
static /*@null@*/ intnum *
bin_objfmt_resolve_label2(symrec *sym, /*@null@*/ const section *cursect,
unsigned long cursectstart, int withstart)
{
@ -122,8 +122,10 @@ bin_objfmt_resolve_label2(symrec *sym, /*@null@*/ const section *cursect,
assert(startexpr != NULL);
expr_expand_labelequ(startexpr, sect, 1, bin_objfmt_resolve_label);
start = expr_get_intnum(&startexpr);
if (!start)
if (!start) {
expr_delete(startexpr);
return NULL;
}
startval = intnum_get_uint(start);
expr_delete(startexpr);
@ -144,7 +146,7 @@ bin_objfmt_resolve_label(symrec *sym, int withstart)
}
typedef struct bin_objfmt_expr_data {
const section *sect;
/*@observer@*/ const section *sect;
unsigned long start;
int withstart;
} bin_objfmt_expr_data;
@ -177,19 +179,20 @@ bin_objfmt_expr_traverse_callback(ExprItem *ei, void *d)
}
typedef struct bin_objfmt_output_info {
FILE *f;
unsigned char *buf;
const section *sect;
/*@dependent@*/ FILE *f;
/*@only@*/ unsigned char *buf;
/*@observer@*/ const section *sect;
unsigned long start;
} bin_objfmt_output_info;
static int
bin_objfmt_output_expr(expr **ep, unsigned char **bufp, unsigned long valsize,
const section *sect, const bytecode *bc, int rel,
/*@observer@*/ const section *sect,
/*@observer@*/ const bytecode *bc, int rel,
/*@null@*/ void *d)
{
/*@null@*/ bin_objfmt_output_info *info = (bin_objfmt_output_info *)d;
bin_objfmt_expr_data data;
/*@observer@*/ bin_objfmt_expr_data data;
/*@dependent@*/ /*@null@*/ const intnum *num;
/*@dependent@*/ /*@null@*/ const floatnum *flt;
unsigned long val;
@ -217,7 +220,7 @@ bin_objfmt_output_expr(expr **ep, unsigned char **bufp, unsigned long valsize,
flt = expr_get_floatnum(ep);
if (flt) {
int fltret;
fltret = floatnum_get_sized(flt, *bufp, valsize);
fltret = floatnum_get_sized(flt, *bufp, (size_t)valsize);
if (fltret < 0) {
ErrorAt((*ep)->line, _("underflow in floating point expression"));
return 1;
@ -271,6 +274,8 @@ bin_objfmt_output_bytecode(bytecode *bc, /*@null@*/ void *d)
unsigned long i;
int gap;
assert(info != NULL);
bigbuf = bc_tobytes(bc, info->buf, &size, &multiple, &gap, info->sect,
info, bin_objfmt_output_expr);
@ -280,11 +285,9 @@ bin_objfmt_output_bytecode(bytecode *bc, /*@null@*/ void *d)
if (gap)
Warning(_("uninitialized space declared in code/data section: zeroing"));
assert(info != NULL);
/* Output multiple copies of buf (or bigbuf if non-NULL) to file */
for (i=0; i<multiple; i++)
fwrite(bigbuf ? bigbuf : info->buf, size, 1, info->f);
fwrite(bigbuf ? bigbuf : info->buf, (size_t)size, 1, info->f);
/* If bigbuf was allocated, free it */
if (bigbuf)
@ -296,10 +299,10 @@ bin_objfmt_output_bytecode(bytecode *bc, /*@null@*/ void *d)
static void
bin_objfmt_output(FILE *f, sectionhead *sections)
{
/*@null@*/ section *text, *data, *bss, *prevsect;
/*@observer@*/ /*@null@*/ section *text, *data, *bss, *prevsect;
/*@null@*/ expr *startexpr;
/*@dependent@*/ /*@null@*/ const intnum *startnum;
unsigned long start, textstart, datastart;
unsigned long start = 0, textstart = 0, datastart = 0;
unsigned long textlen = 0, textpad = 0, datalen = 0, datapad = 0;
unsigned long *prevsectlenptr, *prevsectpadptr;
unsigned long i;
@ -383,7 +386,7 @@ bin_objfmt_cleanup(void)
{
}
static /*@dependent@*/ /*@null@*/ section *
static /*@observer@*/ /*@null@*/ section *
bin_objfmt_sections_switch(sectionhead *headp, valparamhead *valparams,
/*@unused@*/ /*@null@*/
valparamhead *objext_valparams)
@ -476,49 +479,43 @@ bin_objfmt_section_data_print(FILE *f, /*@null@*/ void *data)
}
static /*@null@*/ void *
bin_objfmt_extern_data_new(const char *name, /*@unused@*/ /*@null@*/
valparamhead *objext_valparams)
bin_objfmt_extern_data_new(/*@unused@*/ const char *name, /*@unused@*/
/*@null@*/ valparamhead *objext_valparams)
{
return NULL;
}
static /*@null@*/ void *
bin_objfmt_global_data_new(const char *name, /*@unused@*/ /*@null@*/
valparamhead *objext_valparams)
bin_objfmt_global_data_new(/*@unused@*/ const char *name, /*@unused@*/
/*@null@*/ valparamhead *objext_valparams)
{
return NULL;
}
static /*@null@*/ void *
bin_objfmt_common_data_new(const char *name,
/*@unused@*/ /*@only@*/ expr *size,
/*@unused@*/ /*@null@*/
bin_objfmt_common_data_new(/*@unused@*/ const char *name,
/*@only@*/ expr *size, /*@unused@*/ /*@null@*/
valparamhead *objext_valparams)
{
expr_delete(size);
Error(_("binary object format does not support common variables"));
return NULL;
}
static void *
bin_objfmt_declare_data_copy(SymVisibility vis, /*@only@*/ void *data)
static /*@only@*/ void *
bin_objfmt_declare_data_copy(/*@unused@*/ SymVisibility vis,
/*@unused@*/ const void *data)
{
if (vis == SYM_COMMON) {
return expr_copy(data);
} else {
InternalError(_("Unrecognized data in bin objfmt declare_data_copy"));
return NULL;
}
InternalError(_("Unrecognized data in bin objfmt declare_data_copy"));
/*@notreached@*/
return xstrdup(data);
}
static void
bin_objfmt_declare_data_delete(SymVisibility vis, /*@only@*/ void *data)
bin_objfmt_declare_data_delete(/*@unused@*/ SymVisibility vis,
/*@unused@*/ /*@only@*/ void *data)
{
if (vis == SYM_COMMON) {
expr_delete(data);
} else {
InternalError(_("Unrecognized data in bin objfmt declare_data_delete"));
xfree(data);
}
InternalError(_("Unrecognized data in bin objfmt declare_data_delete"));
}
static void
@ -536,7 +533,7 @@ bin_objfmt_declare_data_print(FILE *f, SymVisibility vis,
static int
bin_objfmt_directive(const char *name, valparamhead *valparams,
/*@null@*/ valparamhead *objext_valparams,
/*@unused@*/ /*@null@*/ valparamhead *objext_valparams,
sectionhead *headp)
{
section *sect;

@ -39,6 +39,7 @@
static void
dbg_objfmt_initialize(const char *in_filename, const char *obj_filename)
{
assert(debug_file != NULL);
fprintf(debug_file, "%*sinitialize(\"%s\", \"%s\")\n", indent_level, "",
in_filename, obj_filename);
}
@ -60,10 +61,11 @@ dbg_objfmt_output(FILE *f, sectionhead *sections)
static void
dbg_objfmt_cleanup(void)
{
assert(debug_file != NULL);
fprintf(debug_file, "%*scleanup()\n", indent_level, "");
}
static /*@dependent@*/ /*@null@*/ section *
static /*@observer@*/ /*@null@*/ section *
dbg_objfmt_sections_switch(sectionhead *headp, valparamhead *valparams,
/*@unused@*/ /*@null@*/
valparamhead *objext_valparams)
@ -72,6 +74,8 @@ dbg_objfmt_sections_switch(sectionhead *headp, valparamhead *valparams,
section *retval;
int isnew;
assert(debug_file != NULL);
fprintf(debug_file, "%*ssections_switch(headp, ", indent_level, "");
vps_print(debug_file, valparams);
fprintf(debug_file, ", ");
@ -95,6 +99,7 @@ dbg_objfmt_sections_switch(sectionhead *headp, valparamhead *valparams,
static void
dbg_objfmt_section_data_delete(/*@only@*/ void *data)
{
assert(debug_file != NULL);
fprintf(debug_file, "%*ssection_data_delete(%p)\n", indent_level, "", data);
xfree(data);
}
@ -112,6 +117,7 @@ static /*@null@*/ void *
dbg_objfmt_extern_data_new(const char *name, /*@unused@*/ /*@null@*/
valparamhead *objext_valparams)
{
assert(debug_file != NULL);
fprintf(debug_file, "%*sextern_data_new(\"%s\", ", indent_level, "", name);
vps_print(debug_file, objext_valparams);
fprintf(debug_file, "), returning NULL\n");
@ -122,6 +128,7 @@ static /*@null@*/ void *
dbg_objfmt_global_data_new(const char *name, /*@unused@*/ /*@null@*/
valparamhead *objext_valparams)
{
assert(debug_file != NULL);
fprintf(debug_file, "%*sglobal_data_new(\"%s\", ", indent_level, "", name);
vps_print(debug_file, objext_valparams);
fprintf(debug_file, "), returning NULL\n");
@ -133,6 +140,7 @@ dbg_objfmt_common_data_new(const char *name, /*@only@*/ expr *size,
/*@unused@*/ /*@null@*/
valparamhead *objext_valparams)
{
assert(debug_file != NULL);
fprintf(debug_file, "%*scommon_data_new(\"%s\", ", indent_level, "", name);
expr_print(debug_file, size);
fprintf(debug_file, ", ");
@ -144,10 +152,11 @@ dbg_objfmt_common_data_new(const char *name, /*@only@*/ expr *size,
}
static void *
dbg_objfmt_declare_data_copy(SymVisibility vis, /*@only@*/ void *data)
dbg_objfmt_declare_data_copy(SymVisibility vis, const void *data)
{
void *retval = NULL;
assert(debug_file != NULL);
fprintf(debug_file, "%*sdeclare_data_copy(", indent_level, "");
switch (vis) {
case SYM_LOCAL:
@ -178,6 +187,7 @@ dbg_objfmt_declare_data_copy(SymVisibility vis, /*@only@*/ void *data)
static void
dbg_objfmt_declare_data_delete(SymVisibility vis, /*@only@*/ void *data)
{
assert(debug_file != NULL);
fprintf(debug_file, "%*sdeclare_data_delete(", indent_level, "");
switch (vis) {
case SYM_LOCAL:
@ -219,8 +229,9 @@ dbg_objfmt_declare_data_print(FILE *f, SymVisibility vis,
static int
dbg_objfmt_directive(const char *name, valparamhead *valparams,
/*@null@*/ valparamhead *objext_valparams,
sectionhead *headp)
/*@unused@*/ sectionhead *headp)
{
assert(debug_file != NULL);
fprintf(debug_file, "%*sdirective(\"%s\", ", indent_level, "", name);
vps_print(debug_file, valparams);
fprintf(debug_file, ", ");

Loading…
Cancel
Save