00001
00002
00003
00004
00005 #include <stdlib.h>
00006 #include <stdio.h>
00007 #include <errno.h>
00008 #include <math.h>
00009 #include "network.h"
00010
00011
00012 typedef struct {
00013 char *name;
00014 double *addr;
00015 double min, max;
00016 } VARMAP;
00017 VARMAP varmap[] = {
00018 #define MAP(X,LO,HI) {#X,&X,LO,HI}
00019
00020 MAP(convergence_limit,1e-8,1e-0),
00021 MAP(acceleration_factor,0.5,2.0),
00022 MAP(mvabase,0.0,0.0),
00023 };
00024
00025 EXPORT int setvar(char *varname, char *value)
00026 {
00027 VARMAP *p;
00028 for (p=varmap; p<varmap+sizeof(varmap)/sizeof(varmap[0]); p++)
00029 {
00030 if (strcmp(p->name,varname)==0)
00031 {
00032 double v = atof(value);
00033 if (p->min<p->max && v>=p->min && v<=p->max)
00034 { *(p->addr) = v; return 1;}
00035 else
00036 return 0;
00037 }
00038 }
00039 return 0;
00040 }
00041
00042 EXPORT void* getvar(char *varname, char *value, unsigned int size)
00043 {
00044 VARMAP *p;
00045 if (value==NULL && varname[0]=='\0')
00046 {
00047 strcpy(varname,varmap[0].name);
00048 return (void*)1;
00049 }
00050 for (p=varmap; p<varmap+sizeof(varmap)/sizeof(varmap[0]); p++)
00051 {
00052 if (strcmp(p->name,varname)==0)
00053 {
00054 if (size==-1)
00055 {
00056 return (void*)p->addr;
00057 }
00058 else if (value==NULL)
00059 {
00060 if (p+1<varmap+sizeof(varmap)/sizeof(varmap[0]))
00061 {
00062 strcpy(varname,(p+1)->name);
00063 return (void*)1;
00064 }
00065 else
00066 {
00067 return (void*)0;
00068 }
00069 }
00070 else {
00071 double *v = p->addr;
00072 sprintf(value,"%lg",*v);
00073 return (void*)1;
00074 }
00075 }
00076 }
00077 return (void*)0;
00078 }