]> Shamusworld >> Repos - stargem2/blob - src/sdlemu_config.cpp
Finally fixed problems with demo mode.
[stargem2] / src / sdlemu_config.cpp
1 /*
2  * SDLEMU library - Free sdl related functions library
3  * Copyright (C) 1999-2002 sdlemu development crew
4  *
5  *  This program is free software; you can redistribute it and/or modify
6  *  it under the terms of the GNU General Public License as published by
7  *  the Free Software Foundation; either version 2 of the License, or
8  *  (at your option) any later version.
9  *
10  *  This program is distributed in the hope that it will be useful,
11  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
12  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  *  GNU General Public License for more details.
14  *
15  *  You should have received a copy of the GNU General Public License
16  *  along with this program; if not, write to the Free Software
17  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
18  */
19
20 #include <stdio.h>
21 #include <string.h>
22 #include <stdlib.h>
23 #include <string>
24 #include <list>
25 #include "sdlemu_config.h"
26
27 using namespace std;
28
29 class token_list
30 {
31 public:
32         token_list(const string &name) : m_name(name), m_value(""), m_token("") {}
33         void add_token_variable(const string &var) { m_token = var; }
34         void add_token_value(const string &value) { m_value = value; }
35         const string &LineName() const { return m_name; }
36         const string &Token() const { return m_token; }
37         const string &Value() const { return m_value; }
38 private:
39         std::string m_name;
40         std::string m_value;
41         std::string m_token;
42 };
43
44 std::list<token_list> vec;
45
46 void string_tokenize_variable()
47 {
48         list<token_list>::iterator p;
49         const string delim = " ";
50         for(p = vec.begin(); p != vec.end(); p++) {
51                 string::size_type lastPos = (*p).LineName().find_first_not_of(delim, 0);
52                 string::size_type pos     = (*p).LineName().find_first_of(delim, lastPos);
53
54                 if(string::npos != pos && string::npos != lastPos) {
55                         string s = (*p).LineName().substr(lastPos, pos - lastPos);
56                         (*p).add_token_variable(s);
57                 }
58         }
59 }
60
61 void string_tokenize_value()
62 {
63         list<token_list>::iterator p;
64         const string delim = " =\n\t\r";                // "\r" needed for Win32 compatibility...
65
66         for(p = vec.begin(); p != vec.end(); p++) {
67                 string::size_type lastPos = (*p).LineName().find_first_of(delim, 0);
68                 string::size_type pos     = (*p).LineName().find_first_not_of(delim, lastPos);
69
70                 if(string::npos != pos && string::npos != lastPos) {
71                         string s = (*p).LineName().substr(pos);
72                         (*p).add_token_value(s);
73                 }
74         }
75 }
76
77 int sdlemu_init_config(const char *filename)
78 {
79         FILE *f = fopen(filename, "r");
80         if(!f) return 0;
81
82         fseek(f, 0, SEEK_END);
83         int len = ftell(f);
84         fseek(f, 0, SEEK_SET);
85
86         char *s = new char[len];
87         size_t unused = fread(s, 1, len, f);
88         string str(s);
89
90         const string delim = "\n\r";            // "\r" needed for Win32 compatibility...
91         string::size_type lastPos = str.find_first_not_of(delim, 0);
92         string::size_type pos     = str.find_first_of(delim, lastPos);
93
94         while (string::npos != pos || string::npos != lastPos) {
95                 string string = str.substr(lastPos, pos - lastPos);
96                 if(string[0] == '#')
97                 {
98                 }
99                 else if(string[0] == '[')
100                 {
101                 }
102                 else
103                 {
104                         vec.push_back(string);
105                 }
106                 lastPos = str.find_first_not_of(delim, pos);
107                 pos = str.find_first_of(delim, lastPos);
108         }
109         string_tokenize_variable();
110         string_tokenize_value();
111         delete [] s;
112         fclose(f);
113         return 1;
114 }
115
116 const char *sdlemu_getval_string(const char *key_string, const char *default_string)
117 {
118         list<token_list>::iterator p;
119         for(p = vec.begin(); p != vec.end(); p++) {
120
121                 if(strcmp((*p).Token().c_str(), key_string) == 0)
122                         return (*p).Value().c_str();
123         }
124         return default_string;
125 }
126
127 int sdlemu_getval_int(const char *key_string, int default_int)
128 {
129         list<token_list>::iterator p;
130         for(p = vec.begin(); p != vec.end(); p++) {
131
132                 if(strcmp((*p).Token().c_str(), key_string) == 0) {
133                         const char *ret = (*p).Value().c_str();
134                         if(ret) return atoi(ret);
135                 }
136         }
137         return default_int;
138 }
139
140 int sdlemu_getval_bool(const char *key_string, int default_int)
141 {
142         list<token_list>::iterator p;
143         for(p = vec.begin(); p != vec.end(); p++) {
144
145                 if(strcmp((*p).Token().c_str(), key_string) == 0) {
146                         const char *ret = (*p).Value().c_str();
147                         if(ret) return atoi(ret)>0;
148                 }
149         }
150         return default_int;
151 }