Mercurial > molko
annotate libmlk-core/core/sys.c @ 301:f04b4ee04db3
make: switch to GNU make
author | David Demelier <markand@malikania.fr> |
---|---|
date | Wed, 23 Jun 2021 22:41:34 +0200 |
parents | 196264679079 |
children | 363024b76da7 |
rev | line source |
---|---|
23
bc9637a2601b
core: add basic system routines
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
1 /* |
bc9637a2601b
core: add basic system routines
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
2 * sys.c -- system routines |
bc9637a2601b
core: add basic system routines
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
3 * |
bc9637a2601b
core: add basic system routines
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
4 * Copyright (c) 2020 David Demelier <markand@malikania.fr> |
bc9637a2601b
core: add basic system routines
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
5 * |
bc9637a2601b
core: add basic system routines
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
6 * Permission to use, copy, modify, and/or distribute this software for any |
bc9637a2601b
core: add basic system routines
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
7 * purpose with or without fee is hereby granted, provided that the above |
bc9637a2601b
core: add basic system routines
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
8 * copyright notice and this permission notice appear in all copies. |
bc9637a2601b
core: add basic system routines
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
9 * |
bc9637a2601b
core: add basic system routines
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES |
bc9637a2601b
core: add basic system routines
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF |
bc9637a2601b
core: add basic system routines
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR |
bc9637a2601b
core: add basic system routines
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES |
bc9637a2601b
core: add basic system routines
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN |
bc9637a2601b
core: add basic system routines
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF |
bc9637a2601b
core: add basic system routines
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. |
bc9637a2601b
core: add basic system routines
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
17 */ |
bc9637a2601b
core: add basic system routines
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
18 |
301
f04b4ee04db3
make: switch to GNU make
David Demelier <markand@malikania.fr>
parents:
298
diff
changeset
|
19 #include "config.h" |
241
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
20 |
32
91bc2329ab0c
core: implement data directory access, closes #2454 @1h
David Demelier <markand@malikania.fr>
parents:
31
diff
changeset
|
21 #include <assert.h> |
56
43d1102a367e
core: disable buffering on MinGW
David Demelier <markand@malikania.fr>
parents:
52
diff
changeset
|
22 #include <stdio.h> |
43d1102a367e
core: disable buffering on MinGW
David Demelier <markand@malikania.fr>
parents:
52
diff
changeset
|
23 #include <stdlib.h> |
84
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
59
diff
changeset
|
24 #include <limits.h> |
32
91bc2329ab0c
core: implement data directory access, closes #2454 @1h
David Demelier <markand@malikania.fr>
parents:
31
diff
changeset
|
25 |
241
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
26 #if defined(_WIN32) |
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
27 # include <shlwapi.h> |
255
d987a5fc4a3e
core: add sys_mkdir function
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
28 # include <windows.h> |
d987a5fc4a3e
core: add sys_mkdir function
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
29 #else |
d987a5fc4a3e
core: add sys_mkdir function
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
30 # include <sys/stat.h> |
d987a5fc4a3e
core: add sys_mkdir function
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
31 # include <errno.h> |
d987a5fc4a3e
core: add sys_mkdir function
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
32 # include <string.h> |
241
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
33 #endif |
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
34 |
23
bc9637a2601b
core: add basic system routines
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
35 #include <SDL.h> |
bc9637a2601b
core: add basic system routines
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
36 #include <SDL_image.h> |
bc9637a2601b
core: add basic system routines
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
37 #include <SDL_mixer.h> |
bc9637a2601b
core: add basic system routines
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
38 #include <SDL_ttf.h> |
bc9637a2601b
core: add basic system routines
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
39 |
39
9d1421c09dfb
core: add more utilities to improve code simplicity
David Demelier <markand@malikania.fr>
parents:
36
diff
changeset
|
40 #include "error.h" |
204
c9fbb822d269
core: allocate sound channels at startup
David Demelier <markand@malikania.fr>
parents:
169
diff
changeset
|
41 #include "sound.h" |
23
bc9637a2601b
core: add basic system routines
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
42 #include "sys.h" |
bc9637a2601b
core: add basic system routines
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
43 |
241
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
44 static struct { |
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
45 char organization[128]; |
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
46 char name[128]; |
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
47 } info = { |
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
48 .organization = "fr.malikania", |
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
49 .name = "molko" |
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
50 }; |
36
798baf7f3ec0
core: implement sys_data* functions for Windows
David Demelier <markand@malikania.fr>
parents:
32
diff
changeset
|
51 |
241
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
52 static const char *paths[] = { |
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
53 [SYS_DIR_BIN] = MOLKO_BINDIR, |
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
54 [SYS_DIR_DATA] = MOLKO_DATADIR, |
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
55 [SYS_DIR_LOCALE] = MOLKO_LOCALEDIR |
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
56 }; |
36
798baf7f3ec0
core: implement sys_data* functions for Windows
David Demelier <markand@malikania.fr>
parents:
32
diff
changeset
|
57 |
241
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
58 static const char *abspaths[] = { |
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
59 [SYS_DIR_BIN] = MOLKO_ABS_BINDIR, |
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
60 [SYS_DIR_DATA] = MOLKO_ABS_DATADIR, |
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
61 [SYS_DIR_LOCALE] = MOLKO_ABS_LOCALEDIR |
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
62 }; |
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
63 |
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
64 #if defined(_WIN32) |
32
91bc2329ab0c
core: implement data directory access, closes #2454 @1h
David Demelier <markand@malikania.fr>
parents:
31
diff
changeset
|
65 |
298
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
279
diff
changeset
|
66 static inline int |
32
91bc2329ab0c
core: implement data directory access, closes #2454 @1h
David Demelier <markand@malikania.fr>
parents:
31
diff
changeset
|
67 is_absolute(const char *path) |
91bc2329ab0c
core: implement data directory access, closes #2454 @1h
David Demelier <markand@malikania.fr>
parents:
31
diff
changeset
|
68 { |
241
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
69 return !PathIsRelativeA(path); |
32
91bc2329ab0c
core: implement data directory access, closes #2454 @1h
David Demelier <markand@malikania.fr>
parents:
31
diff
changeset
|
70 } |
91bc2329ab0c
core: implement data directory access, closes #2454 @1h
David Demelier <markand@malikania.fr>
parents:
31
diff
changeset
|
71 |
241
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
72 #else |
32
91bc2329ab0c
core: implement data directory access, closes #2454 @1h
David Demelier <markand@malikania.fr>
parents:
31
diff
changeset
|
73 |
298
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
279
diff
changeset
|
74 static inline int |
241
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
75 is_absolute(const char *path) |
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
76 { |
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
77 return path[0] == '/'; |
32
91bc2329ab0c
core: implement data directory access, closes #2454 @1h
David Demelier <markand@malikania.fr>
parents:
31
diff
changeset
|
78 } |
91bc2329ab0c
core: implement data directory access, closes #2454 @1h
David Demelier <markand@malikania.fr>
parents:
31
diff
changeset
|
79 |
91bc2329ab0c
core: implement data directory access, closes #2454 @1h
David Demelier <markand@malikania.fr>
parents:
31
diff
changeset
|
80 #endif |
91bc2329ab0c
core: implement data directory access, closes #2454 @1h
David Demelier <markand@malikania.fr>
parents:
31
diff
changeset
|
81 |
298
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
279
diff
changeset
|
82 static inline char * |
241
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
83 normalize(char *str) |
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
84 { |
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
85 for (char *p = str; *p; ++p) |
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
86 if (*p == '\\') |
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
87 *p = '/'; |
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
88 |
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
89 return str; |
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
90 } |
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
91 |
298
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
279
diff
changeset
|
92 static inline const char * |
241
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
93 absolute(const char *which) |
31 | 94 { |
84
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
59
diff
changeset
|
95 static char path[PATH_MAX]; |
31 | 96 |
258
f978fa0137ce
extern: provide libcompat
David Demelier <markand@malikania.fr>
parents:
255
diff
changeset
|
97 strlcpy(path, which, sizeof (path)); |
31 | 98 |
241
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
99 return normalize(path); |
32
91bc2329ab0c
core: implement data directory access, closes #2454 @1h
David Demelier <markand@malikania.fr>
parents:
31
diff
changeset
|
100 } |
91bc2329ab0c
core: implement data directory access, closes #2454 @1h
David Demelier <markand@malikania.fr>
parents:
31
diff
changeset
|
101 |
241
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
102 static const char * |
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
103 system_directory(enum sys_dir kind) |
32
91bc2329ab0c
core: implement data directory access, closes #2454 @1h
David Demelier <markand@malikania.fr>
parents:
31
diff
changeset
|
104 { |
241
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
105 static char path[PATH_MAX]; |
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
106 static char ret[PATH_MAX]; |
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
107 char *base, *binsect; |
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
108 |
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
109 /* 1. Get current binary directory. */ |
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
110 base = SDL_GetBasePath(); |
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
111 |
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
112 /* |
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
113 * 2. Decompose the path to the given special directory by computing |
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
114 * relative directory to it from where the binary is located. |
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
115 * |
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
116 * Example: |
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
117 * PREFIX/bin/mlk |
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
118 * PREFIX/share/molko |
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
119 * |
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
120 * The path to the data is ../share/molko starting from the binary. |
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
121 * |
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
122 * If path to binary is absolute we can't determine relative paths to |
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
123 * any other directory and use the absolute one instead. |
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
124 * |
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
125 * Also, on some platforms SDL_GetBasePath isn't implemented and returns |
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
126 * NULL, in that case return the fallback to the installation prefix. |
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
127 */ |
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
128 if (is_absolute(paths[SYS_DIR_BIN]) || is_absolute(paths[kind]) || !base) |
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
129 return absolute(abspaths[kind]); |
32
91bc2329ab0c
core: implement data directory access, closes #2454 @1h
David Demelier <markand@malikania.fr>
parents:
31
diff
changeset
|
130 |
241
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
131 /* |
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
132 * 3. Put the base path into the path and remove the value of |
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
133 * MOLKO_BINDIR. |
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
134 * |
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
135 * Example: |
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
136 * from: /usr/local/bin |
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
137 * to: /usr/local |
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
138 */ |
258
f978fa0137ce
extern: provide libcompat
David Demelier <markand@malikania.fr>
parents:
255
diff
changeset
|
139 strlcpy(path, base, sizeof (path)); |
241
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
140 SDL_free(base); |
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
141 |
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
142 if ((binsect = strstr(path, paths[SYS_DIR_BIN]))) |
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
143 *binsect = '\0'; |
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
144 |
259
16be1ad3ddba
adventure: start working on maps and teleport
David Demelier <markand@malikania.fr>
parents:
258
diff
changeset
|
145 snprintf(ret, sizeof (ret), "%s%s", path, paths[kind]); |
32
91bc2329ab0c
core: implement data directory access, closes #2454 @1h
David Demelier <markand@malikania.fr>
parents:
31
diff
changeset
|
146 |
241
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
147 return normalize(ret); |
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
148 } |
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
149 |
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
150 static const char * |
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
151 user_directory(enum sys_dir kind) |
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
152 { |
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
153 /* Kept for future use. */ |
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
154 (void)kind; |
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
155 |
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
156 static char path[PATH_MAX]; |
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
157 char *pref; |
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
158 |
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
159 if ((pref = SDL_GetPrefPath(info.organization, info.name))) { |
258
f978fa0137ce
extern: provide libcompat
David Demelier <markand@malikania.fr>
parents:
255
diff
changeset
|
160 strlcpy(path, pref, sizeof (path)); |
241
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
161 SDL_free(pref); |
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
162 } else |
258
f978fa0137ce
extern: provide libcompat
David Demelier <markand@malikania.fr>
parents:
255
diff
changeset
|
163 strlcpy(path, "./", sizeof (path)); |
241
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
164 |
279
5217c195c5b9
core: forgot to return the path
David Demelier <markand@malikania.fr>
parents:
259
diff
changeset
|
165 return path; |
32
91bc2329ab0c
core: implement data directory access, closes #2454 @1h
David Demelier <markand@malikania.fr>
parents:
31
diff
changeset
|
166 } |
91bc2329ab0c
core: implement data directory access, closes #2454 @1h
David Demelier <markand@malikania.fr>
parents:
31
diff
changeset
|
167 |
298
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
279
diff
changeset
|
168 static inline int |
255
d987a5fc4a3e
core: add sys_mkdir function
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
169 mkpath(const char *path) |
d987a5fc4a3e
core: add sys_mkdir function
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
170 { |
d987a5fc4a3e
core: add sys_mkdir function
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
171 #ifdef _WIN32 |
d987a5fc4a3e
core: add sys_mkdir function
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
172 /* TODO: add error using the convenient FormatMessage function. */ |
d987a5fc4a3e
core: add sys_mkdir function
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
173 if (!CreateDirectoryA(path, NULL) && GetLastError() != ERROR_ALREADY_EXISTS) |
d987a5fc4a3e
core: add sys_mkdir function
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
174 return errorf("unable to create directory: %s", path); |
d987a5fc4a3e
core: add sys_mkdir function
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
175 #else |
d987a5fc4a3e
core: add sys_mkdir function
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
176 if (mkdir(path, 0755) < 0 && errno != EEXIST) |
d987a5fc4a3e
core: add sys_mkdir function
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
177 return errorf("%s", strerror(errno)); |
d987a5fc4a3e
core: add sys_mkdir function
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
178 #endif |
d987a5fc4a3e
core: add sys_mkdir function
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
179 |
298
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
279
diff
changeset
|
180 return 0; |
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
279
diff
changeset
|
181 } |
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
279
diff
changeset
|
182 |
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
279
diff
changeset
|
183 int |
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
279
diff
changeset
|
184 sys_init(const char *organization, const char *name) |
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
279
diff
changeset
|
185 { |
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
279
diff
changeset
|
186 #if defined(__MINGW64__) |
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
279
diff
changeset
|
187 /* On MinGW buffering leads to painful debugging. */ |
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
279
diff
changeset
|
188 setbuf(stderr, NULL); |
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
279
diff
changeset
|
189 setbuf(stdout, NULL); |
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
279
diff
changeset
|
190 #endif |
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
279
diff
changeset
|
191 |
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
279
diff
changeset
|
192 strlcpy(info.organization, organization, sizeof (info.organization)); |
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
279
diff
changeset
|
193 strlcpy(info.name, name, sizeof (info.name)); |
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
279
diff
changeset
|
194 |
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
279
diff
changeset
|
195 if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO) < 0) |
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
279
diff
changeset
|
196 return errorf("%s", SDL_GetError()); |
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
279
diff
changeset
|
197 if (IMG_Init(IMG_INIT_PNG) != IMG_INIT_PNG) |
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
279
diff
changeset
|
198 return errorf("%s", SDL_GetError()); |
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
279
diff
changeset
|
199 if (TTF_Init() < 0) |
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
279
diff
changeset
|
200 return errorf("%s", SDL_GetError()); |
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
279
diff
changeset
|
201 if (Mix_Init(MIX_INIT_OGG) != MIX_INIT_OGG) |
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
279
diff
changeset
|
202 return errorf("%s", SDL_GetError()); |
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
279
diff
changeset
|
203 if (Mix_OpenAudio(44100, MIX_DEFAULT_FORMAT, 2, 4096) < 0) |
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
279
diff
changeset
|
204 return errorf("%s", SDL_GetError()); |
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
279
diff
changeset
|
205 |
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
279
diff
changeset
|
206 Mix_AllocateChannels(SOUND_CHANNELS_MAX); |
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
279
diff
changeset
|
207 |
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
279
diff
changeset
|
208 return 0; |
255
d987a5fc4a3e
core: add sys_mkdir function
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
209 } |
d987a5fc4a3e
core: add sys_mkdir function
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
210 |
32
91bc2329ab0c
core: implement data directory access, closes #2454 @1h
David Demelier <markand@malikania.fr>
parents:
31
diff
changeset
|
211 const char * |
241
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
212 sys_dir(enum sys_dir kind) |
32
91bc2329ab0c
core: implement data directory access, closes #2454 @1h
David Demelier <markand@malikania.fr>
parents:
31
diff
changeset
|
213 { |
241
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
214 switch (kind) { |
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
215 case SYS_DIR_BIN: |
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
216 case SYS_DIR_DATA: |
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
217 case SYS_DIR_LOCALE: |
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
218 return system_directory(kind); |
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
219 default: |
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
220 return user_directory(kind); |
76afe639fd72
misc: add support for NLS, closes #22510 @4h
David Demelier <markand@malikania.fr>
parents:
204
diff
changeset
|
221 } |
84
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
59
diff
changeset
|
222 } |
a6c2067709ce
core: implement basic save routines, closes #2476 @2h
David Demelier <markand@malikania.fr>
parents:
59
diff
changeset
|
223 |
298
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
279
diff
changeset
|
224 int |
255
d987a5fc4a3e
core: add sys_mkdir function
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
225 sys_mkdir(const char *directory) |
d987a5fc4a3e
core: add sys_mkdir function
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
226 { |
d987a5fc4a3e
core: add sys_mkdir function
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
227 char path[PATH_MAX], *p; |
d987a5fc4a3e
core: add sys_mkdir function
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
228 |
d987a5fc4a3e
core: add sys_mkdir function
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
229 /* Copy the directory to normalize and iterate over '/'. */ |
258
f978fa0137ce
extern: provide libcompat
David Demelier <markand@malikania.fr>
parents:
255
diff
changeset
|
230 strlcpy(path, directory, sizeof (path)); |
255
d987a5fc4a3e
core: add sys_mkdir function
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
231 normalize(path); |
d987a5fc4a3e
core: add sys_mkdir function
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
232 |
d987a5fc4a3e
core: add sys_mkdir function
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
233 #if defined(_WIN32) |
d987a5fc4a3e
core: add sys_mkdir function
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
234 /* Remove drive letter that we don't need. */ |
d987a5fc4a3e
core: add sys_mkdir function
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
235 if ((p = strchr(path, ':'))) |
d987a5fc4a3e
core: add sys_mkdir function
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
236 ++p; |
d987a5fc4a3e
core: add sys_mkdir function
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
237 else |
d987a5fc4a3e
core: add sys_mkdir function
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
238 p = path; |
d987a5fc4a3e
core: add sys_mkdir function
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
239 #else |
d987a5fc4a3e
core: add sys_mkdir function
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
240 p = path; |
d987a5fc4a3e
core: add sys_mkdir function
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
241 #endif |
d987a5fc4a3e
core: add sys_mkdir function
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
242 |
d987a5fc4a3e
core: add sys_mkdir function
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
243 for (p = p + 1; *p; ++p) { |
d987a5fc4a3e
core: add sys_mkdir function
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
244 if (*p == '/') { |
d987a5fc4a3e
core: add sys_mkdir function
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
245 *p = 0; |
d987a5fc4a3e
core: add sys_mkdir function
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
246 |
298
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
279
diff
changeset
|
247 if (mkpath(path) < 0) |
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
279
diff
changeset
|
248 return -1; |
255
d987a5fc4a3e
core: add sys_mkdir function
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
249 |
d987a5fc4a3e
core: add sys_mkdir function
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
250 *p = '/'; |
d987a5fc4a3e
core: add sys_mkdir function
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
251 } |
d987a5fc4a3e
core: add sys_mkdir function
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
252 } |
d987a5fc4a3e
core: add sys_mkdir function
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
253 |
d987a5fc4a3e
core: add sys_mkdir function
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
254 return mkpath(path); |
d987a5fc4a3e
core: add sys_mkdir function
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
255 } |
d987a5fc4a3e
core: add sys_mkdir function
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
256 |
23
bc9637a2601b
core: add basic system routines
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
257 void |
97
58133933ea17
window: expose some data to avoid functions
David Demelier <markand@malikania.fr>
parents:
87
diff
changeset
|
258 sys_finish(void) |
23
bc9637a2601b
core: add basic system routines
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
259 { |
bc9637a2601b
core: add basic system routines
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
260 Mix_Quit(); |
bc9637a2601b
core: add basic system routines
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
261 TTF_Quit(); |
bc9637a2601b
core: add basic system routines
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
262 IMG_Quit(); |
bc9637a2601b
core: add basic system routines
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
263 SDL_Quit(); |
bc9637a2601b
core: add basic system routines
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
264 } |