27 #include <stdlib.h> |
27 #include <stdlib.h> |
28 #include <ctype.h> |
28 #include <ctype.h> |
29 #include <string.h> |
29 #include <string.h> |
30 |
30 |
31 static void setField(char field[WEAPONS_COUNT+1], const char *line, int lineLen, bool no9) { |
31 static void setField(char field[WEAPONS_COUNT+1], const char *line, int lineLen, bool no9) { |
32 if(lineLen>WEAPONS_COUNT) { |
32 if(lineLen>WEAPONS_COUNT) { |
33 lineLen = WEAPONS_COUNT; |
33 lineLen = WEAPONS_COUNT; |
34 } |
34 } |
35 |
35 |
36 char min = '0'; |
36 char min = '0'; |
37 char max = no9 ? '8' : '9'; |
37 char max = no9 ? '8' : '9'; |
38 for(int i=0; i<lineLen; i++) { |
38 for(int i=0; i<lineLen; i++) { |
39 if(line[i] >= min && line[i] <= max) { |
39 if(line[i] >= min && line[i] <= max) { |
40 field[i] = line[i]; |
40 field[i] = line[i]; |
41 } else { |
41 } else { |
42 flib_log_w("Invalid character in weapon config string \"%.*s\", position %i", lineLen, line, i); |
42 flib_log_w("Invalid character in weapon config string \"%.*s\", position %i", lineLen, line, i); |
43 field[i] = '0'; |
43 field[i] = '0'; |
44 } |
44 } |
45 } |
45 } |
46 for(int i=lineLen; i<WEAPONS_COUNT; i++) { |
46 for(int i=lineLen; i<WEAPONS_COUNT; i++) { |
47 field[i] = '0'; |
47 field[i] = '0'; |
48 } |
48 } |
49 field[WEAPONS_COUNT] = 0; |
49 field[WEAPONS_COUNT] = 0; |
50 } |
50 } |
51 |
51 |
52 flib_weaponset *flib_weaponset_create(const char *name) { |
52 flib_weaponset *flib_weaponset_create(const char *name) { |
53 flib_weaponset *result = NULL; |
53 flib_weaponset *result = NULL; |
54 if(!log_badargs_if(name==NULL)) { |
54 if(!log_badargs_if(name==NULL)) { |
55 flib_weaponset *newSet = flib_calloc(1, sizeof(flib_weaponset)); |
55 flib_weaponset *newSet = flib_calloc(1, sizeof(flib_weaponset)); |
56 if(newSet) { |
56 if(newSet) { |
57 newSet->name = flib_strdupnull(name); |
57 newSet->name = flib_strdupnull(name); |
58 if(newSet->name) { |
58 if(newSet->name) { |
59 setField(newSet->loadout, "", 0, false); |
59 setField(newSet->loadout, "", 0, false); |
60 setField(newSet->crateprob, "", 0, false); |
60 setField(newSet->crateprob, "", 0, false); |
61 setField(newSet->crateammo, "", 0, false); |
61 setField(newSet->crateammo, "", 0, false); |
62 setField(newSet->delay, "", 0, false); |
62 setField(newSet->delay, "", 0, false); |
63 result = newSet; |
63 result = newSet; |
64 newSet = NULL; |
64 newSet = NULL; |
65 } |
65 } |
66 } |
66 } |
67 flib_weaponset_destroy(newSet); |
67 flib_weaponset_destroy(newSet); |
68 } |
68 } |
69 return result; |
69 return result; |
70 } |
70 } |
71 |
71 |
72 void flib_weaponset_destroy(flib_weaponset *cfg) { |
72 void flib_weaponset_destroy(flib_weaponset *cfg) { |
73 if(cfg) { |
73 if(cfg) { |
74 free(cfg->name); |
74 free(cfg->name); |
75 free(cfg); |
75 free(cfg); |
76 } |
76 } |
77 } |
77 } |
78 |
78 |
79 flib_weaponset *flib_weaponset_copy(const flib_weaponset *weaponset) { |
79 flib_weaponset *flib_weaponset_copy(const flib_weaponset *weaponset) { |
80 if(!weaponset) { |
80 if(!weaponset) { |
81 return NULL; |
81 return NULL; |
82 } |
82 } |
83 |
83 |
84 flib_weaponset *result = flib_weaponset_create(weaponset->name); |
84 flib_weaponset *result = flib_weaponset_create(weaponset->name); |
85 if(result) { |
85 if(result) { |
86 memcpy(result->loadout, weaponset->loadout, WEAPONS_COUNT+1); |
86 memcpy(result->loadout, weaponset->loadout, WEAPONS_COUNT+1); |
87 memcpy(result->crateprob, weaponset->crateprob, WEAPONS_COUNT+1); |
87 memcpy(result->crateprob, weaponset->crateprob, WEAPONS_COUNT+1); |
88 memcpy(result->delay, weaponset->delay, WEAPONS_COUNT+1); |
88 memcpy(result->delay, weaponset->delay, WEAPONS_COUNT+1); |
89 memcpy(result->crateammo, weaponset->crateammo, WEAPONS_COUNT+1); |
89 memcpy(result->crateammo, weaponset->crateammo, WEAPONS_COUNT+1); |
90 } |
90 } |
91 |
91 |
92 return result; |
92 return result; |
93 } |
93 } |
94 |
94 |
95 void flib_weaponsetlist_destroy(flib_weaponsetlist *list) { |
95 void flib_weaponsetlist_destroy(flib_weaponsetlist *list) { |
96 if(list) { |
96 if(list) { |
97 for(int i=0; i<list->weaponsetCount; i++) { |
97 for(int i=0; i<list->weaponsetCount; i++) { |
98 flib_weaponset_destroy(list->weaponsets[i]); |
98 flib_weaponset_destroy(list->weaponsets[i]); |
99 } |
99 } |
100 free(list->weaponsets); |
100 free(list->weaponsets); |
101 free(list); |
101 free(list); |
102 } |
102 } |
103 } |
103 } |
104 |
104 |
105 flib_weaponset *flib_weaponset_from_ammostring(const char *name, const char *ammostring) { |
105 flib_weaponset *flib_weaponset_from_ammostring(const char *name, const char *ammostring) { |
106 flib_weaponset *result = NULL; |
106 flib_weaponset *result = NULL; |
107 if(!log_badargs_if2(name==NULL, ammostring==NULL)) { |
107 if(!log_badargs_if2(name==NULL, ammostring==NULL)) { |
108 result = flib_weaponset_create(name); |
108 result = flib_weaponset_create(name); |
109 if(result) { |
109 if(result) { |
110 int fieldlen = strlen(ammostring)/4; |
110 int fieldlen = strlen(ammostring)/4; |
111 setField(result->loadout, ammostring, fieldlen, false); |
111 setField(result->loadout, ammostring, fieldlen, false); |
112 setField(result->crateprob, ammostring + fieldlen, fieldlen, true); |
112 setField(result->crateprob, ammostring + fieldlen, fieldlen, true); |
113 setField(result->delay, ammostring + 2*fieldlen, fieldlen, true); |
113 setField(result->delay, ammostring + 2*fieldlen, fieldlen, true); |
114 setField(result->crateammo, ammostring + 3*fieldlen, fieldlen, true); |
114 setField(result->crateammo, ammostring + 3*fieldlen, fieldlen, true); |
115 } |
115 } |
116 } |
116 } |
117 return result; |
117 return result; |
118 } |
118 } |
119 |
119 |
120 static int fillWeaponsetFromIni(flib_weaponsetlist *list, flib_ini *ini, int index) { |
120 static int fillWeaponsetFromIni(flib_weaponsetlist *list, flib_ini *ini, int index) { |
121 int result = -1; |
121 int result = -1; |
122 char *keyname = flib_ini_get_keyname(ini, index); |
122 char *keyname = flib_ini_get_keyname(ini, index); |
123 char *decodedKeyname = flib_urldecode(keyname); |
123 char *decodedKeyname = flib_urldecode(keyname); |
124 char *ammostring = NULL; |
124 char *ammostring = NULL; |
125 if(decodedKeyname && !flib_ini_get_str(ini, &ammostring, keyname)) { |
125 if(decodedKeyname && !flib_ini_get_str(ini, &ammostring, keyname)) { |
126 flib_weaponset *set = flib_weaponset_from_ammostring(decodedKeyname, ammostring); |
126 flib_weaponset *set = flib_weaponset_from_ammostring(decodedKeyname, ammostring); |
127 if(set) { |
127 if(set) { |
128 result = flib_weaponsetlist_insert(list, set, list->weaponsetCount); |
128 result = flib_weaponsetlist_insert(list, set, list->weaponsetCount); |
129 if(result) { |
129 if(result) { |
130 flib_weaponset_destroy(set); |
130 flib_weaponset_destroy(set); |
131 } |
131 } |
132 } |
132 } |
133 } |
133 } |
134 free(ammostring); |
134 free(ammostring); |
135 free(decodedKeyname); |
135 free(decodedKeyname); |
136 free(keyname); |
136 free(keyname); |
137 return result; |
137 return result; |
138 } |
138 } |
139 |
139 |
140 static int fillWeaponsetsFromIni(flib_weaponsetlist *list, flib_ini *ini) { |
140 static int fillWeaponsetsFromIni(flib_weaponsetlist *list, flib_ini *ini) { |
141 bool error = false; |
141 bool error = false; |
142 int weaponsets = flib_ini_get_keycount(ini); |
142 int weaponsets = flib_ini_get_keycount(ini); |
143 |
143 |
144 for(int i=0; i<weaponsets && !error; i++) { |
144 for(int i=0; i<weaponsets && !error; i++) { |
145 error |= fillWeaponsetFromIni(list, ini, i); |
145 error |= fillWeaponsetFromIni(list, ini, i); |
146 } |
146 } |
147 return error; |
147 return error; |
148 } |
148 } |
149 |
149 |
150 flib_weaponsetlist *flib_weaponsetlist_from_ini(const char *filename) { |
150 flib_weaponsetlist *flib_weaponsetlist_from_ini(const char *filename) { |
151 flib_weaponsetlist *result = NULL; |
151 flib_weaponsetlist *result = NULL; |
152 if(!log_badargs_if(filename==NULL)) { |
152 if(!log_badargs_if(filename==NULL)) { |
153 flib_ini *ini = flib_ini_load(filename); |
153 flib_ini *ini = flib_ini_load(filename); |
154 if(!ini) { |
154 if(!ini) { |
155 flib_log_e("Missing file %s.", filename); |
155 flib_log_e("Missing file %s.", filename); |
156 } else if(flib_ini_enter_section(ini, "General")) { |
156 } else if(flib_ini_enter_section(ini, "General")) { |
157 flib_log_e("Missing section \"General\" in file %s.", filename); |
157 flib_log_e("Missing section \"General\" in file %s.", filename); |
158 } else { |
158 } else { |
159 flib_weaponsetlist *tmpList = flib_weaponsetlist_create(); |
159 flib_weaponsetlist *tmpList = flib_weaponsetlist_create(); |
160 if(tmpList && !fillWeaponsetsFromIni(tmpList, ini)) { |
160 if(tmpList && !fillWeaponsetsFromIni(tmpList, ini)) { |
161 result = tmpList; |
161 result = tmpList; |
162 tmpList = NULL; |
162 tmpList = NULL; |
163 } |
163 } |
164 flib_weaponsetlist_destroy(tmpList); |
164 flib_weaponsetlist_destroy(tmpList); |
165 } |
165 } |
166 flib_ini_destroy(ini); |
166 flib_ini_destroy(ini); |
167 } |
167 } |
168 return result; |
168 return result; |
169 } |
169 } |
170 |
170 |
171 static bool needsEscape(char c) { |
171 static bool needsEscape(char c) { |
172 return !((c>='0' && c<='9') || (c>='a' && c <='z')); |
172 return !((c>='0' && c<='9') || (c>='a' && c <='z')); |
173 } |
173 } |
174 |
174 |
175 static int writeWeaponsetToIni(flib_ini *ini, flib_weaponset *set) { |
175 static int writeWeaponsetToIni(flib_ini *ini, flib_weaponset *set) { |
176 int result = -1; |
176 int result = -1; |
177 char weaponstring[WEAPONS_COUNT*4+1]; |
177 char weaponstring[WEAPONS_COUNT*4+1]; |
178 strcpy(weaponstring, set->loadout); |
178 strcpy(weaponstring, set->loadout); |
179 strcat(weaponstring, set->crateprob); |
179 strcat(weaponstring, set->crateprob); |
180 strcat(weaponstring, set->delay); |
180 strcat(weaponstring, set->delay); |
181 strcat(weaponstring, set->crateammo); |
181 strcat(weaponstring, set->crateammo); |
182 |
182 |
183 char *escapedname = flib_urlencode_pred(set->name, needsEscape); |
183 char *escapedname = flib_urlencode_pred(set->name, needsEscape); |
184 if(escapedname) { |
184 if(escapedname) { |
185 result = flib_ini_set_str(ini, escapedname, weaponstring); |
185 result = flib_ini_set_str(ini, escapedname, weaponstring); |
186 } |
186 } |
187 free(escapedname); |
187 free(escapedname); |
188 return result; |
188 return result; |
189 } |
189 } |
190 |
190 |
191 int flib_weaponsetlist_to_ini(const char *filename, const flib_weaponsetlist *list) { |
191 int flib_weaponsetlist_to_ini(const char *filename, const flib_weaponsetlist *list) { |
192 int result = -1; |
192 int result = -1; |
193 if(!log_badargs_if2(filename==NULL, list==NULL)) { |
193 if(!log_badargs_if2(filename==NULL, list==NULL)) { |
194 flib_ini *ini = flib_ini_create(NULL); |
194 flib_ini *ini = flib_ini_create(NULL); |
195 if(ini && !flib_ini_create_section(ini, "General")) { |
195 if(ini && !flib_ini_create_section(ini, "General")) { |
196 bool error = false; |
196 bool error = false; |
197 for(int i=0; i<list->weaponsetCount && !error; i++) { |
197 for(int i=0; i<list->weaponsetCount && !error; i++) { |
198 error |= writeWeaponsetToIni(ini, list->weaponsets[i]); |
198 error |= writeWeaponsetToIni(ini, list->weaponsets[i]); |
199 } |
199 } |
200 |
200 |
201 if(!error) { |
201 if(!error) { |
202 result = flib_ini_save(ini, filename); |
202 result = flib_ini_save(ini, filename); |
203 } |
203 } |
204 } |
204 } |
205 flib_ini_destroy(ini); |
205 flib_ini_destroy(ini); |
206 } |
206 } |
207 return result; |
207 return result; |
208 } |
208 } |
209 |
209 |
210 flib_weaponsetlist *flib_weaponsetlist_create() { |
210 flib_weaponsetlist *flib_weaponsetlist_create() { |
211 return flib_calloc(1, sizeof(flib_weaponsetlist)); |
211 return flib_calloc(1, sizeof(flib_weaponsetlist)); |
212 } |
212 } |
213 |
213 |
214 GENERATE_STATIC_LIST_INSERT(insertWeaponset, flib_weaponset*) |
214 GENERATE_STATIC_LIST_INSERT(insertWeaponset, flib_weaponset*) |
215 GENERATE_STATIC_LIST_DELETE(deleteWeaponset, flib_weaponset*) |
215 GENERATE_STATIC_LIST_DELETE(deleteWeaponset, flib_weaponset*) |
216 |
216 |
217 int flib_weaponsetlist_insert(flib_weaponsetlist *list, flib_weaponset *set, int pos) { |
217 int flib_weaponsetlist_insert(flib_weaponsetlist *list, flib_weaponset *set, int pos) { |
218 if(!log_badargs_if2(list==NULL, set==NULL) |
218 if(!log_badargs_if2(list==NULL, set==NULL) |
219 && !insertWeaponset(&list->weaponsets, &list->weaponsetCount, set, pos)) { |
219 && !insertWeaponset(&list->weaponsets, &list->weaponsetCount, set, pos)) { |
220 return 0; |
220 return 0; |
221 } |
221 } |
222 return -1; |
222 return -1; |
223 } |
223 } |
224 |
224 |
225 int flib_weaponsetlist_delete(flib_weaponsetlist *list, int pos) { |
225 int flib_weaponsetlist_delete(flib_weaponsetlist *list, int pos) { |
226 if(!log_badargs_if(list==NULL)) { |
226 if(!log_badargs_if(list==NULL)) { |
227 flib_weaponset *elem = list->weaponsets[pos]; |
227 flib_weaponset *elem = list->weaponsets[pos]; |
228 if(!deleteWeaponset(&list->weaponsets, &list->weaponsetCount, pos)) { |
228 if(!deleteWeaponset(&list->weaponsets, &list->weaponsetCount, pos)) { |
229 flib_weaponset_destroy(elem); |
229 flib_weaponset_destroy(elem); |
230 return 0; |
230 return 0; |
231 } |
231 } |
232 } |
232 } |
233 return -1; |
233 return -1; |
234 } |
234 } |