summaryrefslogtreecommitdiff
path: root/mg_valmap.c
blob: 1728701230524e4aa5d477a6bc4c06187ba9ad2f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
#include <stdarg.h>

#include "mg_valmap.h"
#include "mg_tools.h"

mgValmap::mgValmap(const char *key) {
	m_key = key;
}

void mgValmap::Read(FILE *f) {
	char *line=(char*)malloc(1000);
	char *prefix=(char*)malloc(strlen(m_key)+2);
	strcpy(prefix,m_key);
	strcat(prefix,".");
	rewind(f);
	while (fgets(line,1000,f)) {
		if (strncmp(line,prefix,strlen(prefix))) continue;
		if (line[strlen(line)-1]=='\n')
				line[strlen(line)-1]=0;
		char *name = line + strlen(prefix);
		char *eq = strchr(name,'=');
		if (!eq) continue;
		*(eq-1)=0;
		char *value = eq + 2;
		(*this)[string(name)]=string(value);
	}
	free(prefix);
	free(line);
}

void mgValmap::Write(FILE *f) {
	for (mgValmap::const_iterator it=begin();it!=end();++it) {
		char b[1000];
		sprintf(b,"%s.%s = %s\n",
			m_key,it->first.c_str(),
			it->second.c_str());
		fputs(b,f);
	}
}

void mgValmap::put(const string value, const char* name, ... ) {
	va_list ap;
	va_start(ap, name);
	my_put(value,name,ap);
}

void mgValmap::put(int value, const char* name, ...) {
	va_list ap;
	va_start(ap, name);
	my_put(ltos(value),name,ap);
	va_end(ap);
}

void mgValmap::put(unsigned int value, const char* name, ...) {
	va_list ap;
	va_start(ap, name);
	my_put(ltos(value),name,ap);
	va_end(ap);
}

void mgValmap::put(long value,const char* name, ...) {
	va_list ap;
	va_start(ap, name);
	my_put(ltos(value),name,ap);
	va_end(ap);
}

void mgValmap::put(const bool value,const char* name, ...) {
	string  s;
	if (value)
		s = "true";
	else
		s = "false";
	va_list ap;
	va_start(ap, name);
	my_put(s,name,ap);
	va_end(ap);
}

void mgValmap::put(const char* value, const char* name, ...)
{
	if (!value) return;
	va_list ap;
	va_start(ap, name);
	my_put(value, name, ap);
	va_end(ap);
}

string
mgValmap::getstr(const char* name, ...)
{
	va_list ap;
	va_start(ap, name);
	string result = my_get(name, ap);
	va_end(ap);
	return result;
}

bool
mgValmap::getbool(const char* name, ...)
{
	va_list ap;
	va_start(ap, name);
	bool result = my_get(name, ap)=="true";
	va_end(ap);
	return result;
}
	
long
mgValmap::getlong(const char* name, ...)
{
	va_list ap;
	va_start(ap, name);
	long result = atol(my_get(name, ap).c_str());
	va_end(ap);
	return result;
}
	
unsigned int
mgValmap::getuint(const char* name, ...)
{
	va_list ap;
	va_start(ap, name);
	unsigned int result = atol(my_get(name, ap).c_str());
	va_end(ap);
	return result;
}
	
void mgValmap::my_put(const string value, const char* name, va_list& ap)
{
	char buffer[600];
	vsnprintf(buffer, 599, name, ap);
	(*this)[string(buffer)] = value;
}

string
mgValmap::my_get(const char *name, va_list& ap)
{
	char buffer[600];
	vsnprintf(buffer, 599, name, ap);
	return (*this)[buffer];
}