diff --git a/ChangeLog b/ChangeLog index a1f1a5082..f016b8aef 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2010-06-26 Robert Larice + * src/include/inpptree.h, + * src/spicelib/parser/ifeval.c, + * src/spicelib/parser/inpptree.c : + avoid function pointer warnings + 2010-06-25 Robert Larice * src/frontend/com_hardcopy.c, * src/maths/sparse/spbuild.c, diff --git a/src/include/inpptree.h b/src/include/inpptree.h index 769d15855..a02d01a88 100644 --- a/src/include/inpptree.h +++ b/src/include/inpptree.h @@ -50,10 +50,22 @@ typedef struct INPparseNode { int valueIndex; /* If INP_VAR, index into vars array. */ char *funcname; /* If INP_FUNCTION, name of function, */ int funcnum; /* ... one of PTF_*, */ - double (*function)(); /* ... and pointer to the function. */ + void *function; /* ... and pointer to the function. */ void *data; /* private data for certain functions, currently PTF_PWL */ } INPparseNode; + +/* FIXME, less public + * and replace with static inline functions for better type check + */ + +#define PTunary(node_ptr) \ + ((double(*)(double)) (node_ptr)) +#define PTbinary(node_ptr) \ + ((double(*)(double, double)) (node_ptr)) +#define PTunary_with_private(node_ptr) \ + ((double(*)(double, void*)) (node_ptr)) + /* These are the possible types of nodes we can have in the parse tree. The * numbers for the ops 1 - 5 have to be the same as the token numbers, * below. diff --git a/src/spicelib/parser/ifeval.c b/src/spicelib/parser/ifeval.c index 85869dc0b..22ef69be4 100644 --- a/src/spicelib/parser/ifeval.c +++ b/src/spicelib/parser/ifeval.c @@ -83,7 +83,7 @@ PTeval(INPparseNode * tree, double gmin, double *res, double *vals) err = PTeval(tree->left->right, gmin, &r2, vals); if (err != OK) return (err); - *res = (*tree->function) (r1, r2); + *res = PTbinary(tree -> function) (r1, r2); if (*res == HUGE) { fprintf(stderr, "Error: %g, %g out of range for %s\n", r1, r2, tree->funcname); @@ -96,9 +96,9 @@ PTeval(INPparseNode * tree, double gmin, double *res, double *vals) if (err != OK) return (err); if(tree->data == NULL) - *res = (*tree->function) (r1); + *res = PTunary(tree -> function) (r1); else - *res = (*tree->function) (r1, tree->data); + *res = PTunary_with_private(tree -> function) (r1, tree->data); if (*res == HUGE) { fprintf(stderr, "Error: %g out of range for %s\n", r1, tree->funcname); @@ -138,7 +138,7 @@ PTeval(INPparseNode * tree, double gmin, double *res, double *vals) err = PTeval(tree->right, gmin, &r2, vals); if (err != OK) return (err); - *res = (*tree->function) (r1, r2); + *res = PTbinary(tree -> function) (r1, r2); if (*res == HUGE) { fprintf(stderr, "Error: %g, %g out of range for %s\n", r1, r2, tree->funcname); diff --git a/src/spicelib/parser/inpptree.c b/src/spicelib/parser/inpptree.c index bd34b8f2f..0585da414 100644 --- a/src/spicelib/parser/inpptree.c +++ b/src/spicelib/parser/inpptree.c @@ -42,7 +42,7 @@ extern IFsimulator *ft_sim; /* XXX */ static struct op { int number; char *name; - double (*funcptr) (); + void *funcptr; } ops[] = { { PT_COMMA, ",", NULL}, { @@ -58,7 +58,7 @@ static struct op { static struct func { char *name; int number; - double (*funcptr) (); + void *funcptr; } funcs[] = { { "abs", PTF_ABS, PTabs } , { "acos", PTF_ACOS, PTacos } , @@ -665,7 +665,7 @@ static INPparseNode *mkf(int type, INPparseNode * arg) } if (arg->type == PT_CONSTANT) { - constval = ((*funcs[i].funcptr) (arg->constant)); + constval = PTunary(funcs[i].funcptr) (arg->constant); return (mkcon(constval)); }