Browse Source

Finished implementing set command.

Only mouse is missing.
Thomas Buck 10 years ago
parent
commit
7443062c49
4 changed files with 134 additions and 9 deletions
  1. 7
    0
      include/OpenRaider.h
  2. 2
    0
      include/utils/strings.h
  3. 97
    9
      src/OpenRaider.cpp
  4. 28
    0
      src/utils/strings.cpp

+ 7
- 0
include/OpenRaider.h View File

@@ -39,6 +39,8 @@ public:
39 39
 
40 40
     int command(const char *command, std::vector<char *> *args);
41 41
 
42
+    char *expandDirectoryNames(const char *s);
43
+
42 44
     int set(const char *var, const char *value);
43 45
 
44 46
     int bind(const char *action, const char *key);
@@ -53,6 +55,11 @@ private:
53 55
     Window *mWindow;
54 56
 
55 57
     Sound *mSound;
58
+
59
+    char *mBaseDir;
60
+    char *mPakDir;
61
+    char *mAudioDir;
62
+    char *mDataDir;
56 63
 };
57 64
 
58 65
 #endif

+ 2
- 0
include/utils/strings.h View File

@@ -12,6 +12,8 @@
12 12
 #include <cstdarg>
13 13
 #include <vector>
14 14
 
15
+char *stringReplace(const char *s, const char *search, const char *replace);
16
+
15 17
 void printStringVector(std::vector<char *> *args);
16 18
 
17 19
 int readBool(const char *value, bool *var);

+ 97
- 9
src/OpenRaider.cpp View File

@@ -21,6 +21,10 @@
21 21
 OpenRaider::OpenRaider() {
22 22
     mInit = false;
23 23
     mRunning = false;
24
+    mBaseDir = NULL;
25
+    mPakDir = NULL;
26
+    mAudioDir = NULL;
27
+    mDataDir = NULL;
24 28
 
25 29
     mSound = new Sound();
26 30
     mWindow = new WindowSDL();
@@ -32,6 +36,18 @@ OpenRaider::~OpenRaider() {
32 36
 
33 37
     if (mWindow)
34 38
         delete mWindow;
39
+
40
+    if (mBaseDir)
41
+        delete mBaseDir;
42
+
43
+    if (mPakDir)
44
+        delete mPakDir;
45
+
46
+    if (mAudioDir)
47
+        delete mAudioDir;
48
+
49
+    if (mDataDir)
50
+        delete mDataDir;
35 51
 }
36 52
 
37 53
 int OpenRaider::loadConfig(const char *config) {
@@ -122,6 +138,39 @@ int OpenRaider::command(const char *command, std::vector<char *> *args) {
122 138
     }
123 139
 }
124 140
 
141
+char *OpenRaider::expandDirectoryNames(const char *s) {
142
+    const char *base = "$(basedir)";
143
+    const char *pak = "$(pakdir)";
144
+    const char *audio = "$(audiodir)";
145
+    const char *data = "$(datadir)";
146
+
147
+    if (mBaseDir != NULL) {
148
+        if (strstr(s, base) != NULL) {
149
+            return stringReplace(s, base, mBaseDir);
150
+        }
151
+    }
152
+
153
+    if (mPakDir != NULL) {
154
+        if (strstr(s, pak) != NULL) {
155
+            return stringReplace(s, pak, mPakDir);
156
+        }
157
+    }
158
+
159
+    if (mAudioDir != NULL) {
160
+        if (strstr(s, audio) != NULL) {
161
+            return stringReplace(s, audio, mAudioDir);
162
+        }
163
+    }
164
+
165
+    if (mDataDir != NULL) {
166
+        if (strstr(s, data) != NULL) {
167
+            return stringReplace(s, data, mDataDir);
168
+        }
169
+    }
170
+
171
+    return NULL;
172
+}
173
+
125 174
 int OpenRaider::set(const char *var, const char *value) {
126 175
     if (strcmp(var, "size") == 0) {
127 176
         // value has format like "\"1024x768\""
@@ -151,22 +200,63 @@ int OpenRaider::set(const char *var, const char *value) {
151 200
         float vol = 1.0f;
152 201
         if (sscanf(value, "%f", &vol) != 1) {
153 202
             printf("set-volume-Error: Invalid value (%s)\n", value);
203
+            return -5;
154 204
         }
155 205
         mSound->setVolume(vol);
156 206
     } else if (strcmp(var, "mouse_x") == 0) {
157
-        // TODO set
207
+        // TODO mouse support
158 208
     } else if (strcmp(var, "mouse_y") == 0) {
159
-        // TODO set
209
+        // TODO mouse support
160 210
     } else if (strcmp(var, "basedir") == 0) {
161
-
211
+        char *quotes = stringReplace(value, "\"", "");
212
+        char *tmp = expandDirectoryNames(quotes);
213
+        if (tmp == NULL) {
214
+            mBaseDir = fullPath(quotes, 0);
215
+        } else {
216
+            mBaseDir = fullPath(tmp, 0);
217
+            delete [] tmp;
218
+        }
219
+        delete [] quotes;
162 220
     } else if (strcmp(var, "pakdir") == 0) {
163
-
221
+        char *quotes = stringReplace(value, "\"", "");
222
+        char *tmp = expandDirectoryNames(quotes);
223
+        if (tmp == NULL) {
224
+            mPakDir = fullPath(quotes, 0);
225
+        } else {
226
+            mPakDir = fullPath(tmp, 0);
227
+            delete [] tmp;
228
+        }
229
+        delete [] quotes;
164 230
     } else if (strcmp(var, "audiodir") == 0) {
165
-
231
+        char *quotes = stringReplace(value, "\"", "");
232
+        char *tmp = expandDirectoryNames(quotes);
233
+        if (tmp == NULL) {
234
+            mAudioDir = fullPath(quotes, 0);
235
+        } else {
236
+            mAudioDir = fullPath(tmp, 0);
237
+            delete [] tmp;
238
+        }
239
+        delete [] quotes;
166 240
     } else if (strcmp(var, "datadir") == 0) {
167
-
241
+        char *quotes = stringReplace(value, "\"", "");
242
+        char *tmp = expandDirectoryNames(quotes);
243
+        if (tmp == NULL) {
244
+            mDataDir = fullPath(quotes, 0);
245
+        } else {
246
+            mDataDir = fullPath(tmp, 0);
247
+            delete [] tmp;
248
+        }
249
+        delete [] quotes;
168 250
     } else if (strcmp(var, "font") == 0) {
169
-
251
+        char *quotes = stringReplace(value, "\"", "");
252
+        char *tmp = expandDirectoryNames(quotes);
253
+        if (tmp == NULL) {
254
+            mWindow->setFont(quotes);
255
+        } else {
256
+            mWindow->setFont(tmp);
257
+            delete [] tmp;
258
+        }
259
+        delete [] quotes;
170 260
     } else {
171 261
         printf("set-Error: Unknown variable (%s = %s)\n", var, value);
172 262
         return -1;
@@ -209,8 +299,6 @@ int OpenRaider::initialize() {
209 299
     if (mWindow->initializeGL() != 0)
210 300
         return -2;
211 301
 
212
-    mWindow->setFont("~/.OpenRaider/data/test.ttf");
213
-
214 302
     // Initialize window font
215 303
     if (mWindow->initializeFont() != 0)
216 304
         return -3;

+ 28
- 0
src/utils/strings.cpp View File

@@ -17,6 +17,34 @@
17 17
 
18 18
 #include "utils/strings.h"
19 19
 
20
+char *stringReplace(const char *s, const char *search, const char *replace) {
21
+    char *tmp = strstr(s, search);
22
+    if (tmp == NULL)
23
+        return NULL;
24
+    size_t offset = tmp - s;
25
+
26
+    size_t length = strlen(s) - strlen(search) + strlen(replace);
27
+    char *buf = new char[length + 1];
28
+    buf[length] = '\0';
29
+
30
+    for (size_t i = 0; i < offset; i++)
31
+        buf[i] = s[i];
32
+
33
+    for (size_t i = 0; i < strlen(replace); i++)
34
+        buf[offset + i] = replace[i];
35
+
36
+    for (size_t i = (offset + strlen(search)); i < strlen(s); i++)
37
+        buf[i + strlen(replace) - strlen(search)] = s[i];
38
+
39
+    tmp = stringReplace(buf, search, replace);
40
+    if (tmp == NULL)
41
+        return buf;
42
+    else {
43
+        delete [] buf;
44
+        return tmp;
45
+    }
46
+}
47
+
20 48
 void printStringVector(std::vector<char *> *args) {
21 49
     printf("(");
22 50
     for (std::vector<char *>::size_type i = 0; i < args->size(); i++) {

Loading…
Cancel
Save