1
/****************** context.c ******************/
2
/****************** 1999.6.17 ******************/
8
AppContext::AppContext()
13
name_default = new List();
14
type_default = new List();
15
value_default = new List();
17
set_default_value("h_size","int",(void *)300);
18
set_default_value("v_size","int",(void *)200);
21
AppContext::~AppContext()
31
int AppContext::search_name(List * list,char * name)
36
if (!strcmp((char*)(list->get_item(i)),name)) break;
40
int AppContext::set_value(char * _name, char * type, void * data)
43
if((i = search_name(name_default,_name)) != -1) {
44
if( !strcmp((char*)type_default->get_item(i),type)) {
45
if((i = search_name(names,_name)) != -1)
46
values->reset_item(i,data);
48
values->add_item(data);
49
types->add_item(type);
50
names->add_item(_name);
54
fprintf(stderr,"Warning: class AppContext: data type mismatch, "
55
" variable \"%s\" is a \"%s\" instead of \"%s\"\n",
56
name_default->get_item(i),type_default->get_item(i),type);
61
if((i = search_name(names,_name)) != -1)
62
values->reset_item(i,data);
64
values->add_item(data);
65
types->add_item(type);
66
names->add_item(_name);
72
void * AppContext::get_value(char * _name)
75
if((i = search_name(names,_name)) != -1)
76
return values->get_item(i);
77
else if ((i = search_name(name_default,_name)) != -1)
78
return value_default->get_item(i);
82
char * AppContext::get_value_type(char * _name)
85
if((i = search_name(names,_name)) != -1)
86
return (char*)types->get_item(i);
87
else if ((i = search_name(name_default,_name)) != -1)
88
return (char*)type_default->get_item(i);
92
void AppContext::set_default_value(char * _name, char * type, void * data)
95
if((i = search_name(name_default,_name)) != -1) {
96
value_default->reset_item(i,data);
97
type_default->reset_item(i,type);
100
name_default->add_item(_name);
101
type_default->add_item(type);
102
value_default->add_item(data);
106
void AppContext::restore_default(char * _name)
109
if((i = search_name(names,_name)) != -1) {
110
values->delete_item(i);
111
types->delete_item(i);
112
names->delete_item(i);
116
void AppContext::restore_all()
120
values->delete_all();
123
void AppContext::display_values()
127
j = names->get_size();
129
if(!strcmp((char*)types->get_item(i),"char*"))
130
printf("\"%s\" = \"%s\"\n",names->get_item(i),values->get_item(i));
131
else if(!strcmp((char*)types->get_item(i),"int"))
132
printf("\"%s\" = %d\n",names->get_item(i),values->get_item(i));
134
printf("\"%s\" = 0x%x\n",names->get_item(i),values->get_item(i));
135
printf("default values:\n");
136
j = name_default->get_size();
138
if(!strcmp((char*)type_default->get_item(i),"char*"))
139
printf("\"%s\" = \"%s\"\n",name_default->get_item(i),value_default->get_item(i));
140
else if(!strcmp((char*)type_default->get_item(i),"int"))
141
printf("\"%s\" = %d\n",name_default->get_item(i),value_default->get_item(i));
143
printf("\"%s\" = 0x%x\n",name_default->get_item(i),value_default->get_item(i));
146
#define BUFFER_LENGTH 200
149
#define NAME_ESCAPE 4
152
static int is_blank(char c) { return c==' ' || c==9;}
153
static int is_end(char c) { return c=='\n' || c == 0;}
154
static int is_number(char c) {return c<='9' && c>='0';}
156
static void * my_parser(char *a, char ** type)
160
for(b = a; is_number(*b) && !is_blank(*b) && !is_end(*b);b++);
161
if(!(is_blank(*b)||is_end(*b))) {
162
for(;!is_blank(*b) && !is_end(*b);b++);
165
return (void*)my_strdup(a);
174
void AppContext::load(FILE * fd)
178
char *a,*b,*c,*name,*type;
180
char buffer[BUFFER_LENGTH];
185
fseek(fd,pos,SEEK_SET);
186
i = fread(buffer,1,BUFFER_LENGTH-1,fd);
190
b = strchr(buffer,(int)'\n');
192
pos += b - buffer +1;
197
for(a = buffer;is_blank(*a) && !is_end(*a);a++);
198
if (*a == '#' || is_end(*a)) continue;
199
for(b = a;!is_blank(*b) && !is_end(*b) && *b != '=';b++);
200
if(is_end(*b)) continue;
201
c = strchr(b,(int)'=');
204
for(;is_blank(*c) && !is_end(*c);c++);
205
if(is_end(*c)) continue;
207
// printf("name = %s, value = %s",a,c);
209
value = my_parser(c,&type);
210
set_value(name,type,value);
214
void AppContext::save(FILE * fp, char * header)
219
fprintf(fp,"#%s\n\n",header);
221
j = names->get_size();
222
for (i = 0;i<j;i++) {
223
type = (char*)types->get_item(i);
224
if (!strcmp(type,"char*"))
225
fprintf(fp,"%s = %s\n",names->get_item(i),values->get_item(i));
226
else if (!strcmp(type,"int"))
227
fprintf(fp,"%s = %d\n",names->get_item(i),values->get_item(i));
228
else fprintf(stderr,"class AppContext: save: type \"%s\" does not be supported yet.\n",type);