190 } |
191 } |
191 return NULL; |
192 return NULL; |
192 } |
193 } |
193 |
194 |
194 int flib_schemelist_insert(flib_schemelist *list, flib_cfg *cfg, int pos) { |
195 int flib_schemelist_insert(flib_schemelist *list, flib_cfg *cfg, int pos) { |
195 int result = -1; |
196 flib_cfg **changedList = flib_list_insert(list->schemes, &list->schemeCount, sizeof(*list->schemes), &cfg, pos); |
196 if(!list || !cfg || pos < 0 || pos > list->schemeCount) { |
197 if(changedList) { |
197 flib_log_e("Invalid parameter in flib_schemelist_insert"); |
198 list->schemes = changedList; |
|
199 flib_cfg_retain(cfg); |
|
200 return 0; |
198 } else { |
201 } else { |
199 flib_cfg **newSchemes = flib_realloc(list->schemes, (list->schemeCount+1)*sizeof(*list->schemes)); |
202 return -1; |
200 if(newSchemes) { |
203 } |
201 list->schemes = newSchemes; |
|
202 memmove(list->schemes+pos+1, list->schemes+pos, (list->schemeCount-pos)*sizeof(*list->schemes)); |
|
203 list->schemes[pos] = flib_cfg_retain(cfg); |
|
204 list->schemeCount++; |
|
205 result = 0; |
|
206 } |
|
207 } |
|
208 return result; |
|
209 } |
204 } |
210 |
205 |
211 int flib_schemelist_delete(flib_schemelist *list, int pos) { |
206 int flib_schemelist_delete(flib_schemelist *list, int pos) { |
212 int result = -1; |
207 int result = -1; |
213 if(!list || pos < 0 || pos >= list->schemeCount) { |
208 if(!list || pos<0 || pos>=list->schemeCount) { |
214 flib_log_e("Invalid parameter in flib_schemelist_delete"); |
209 flib_log_e("Invalid parameter in flib_schemelist_delete"); |
215 } else { |
210 } else { |
216 flib_cfg_release(list->schemes[pos]); |
211 flib_cfg *elem = list->schemes[pos]; |
217 memmove(list->schemes+pos, list->schemes+pos+1, (list->schemeCount-(pos+1))*sizeof(*list->schemes)); |
212 flib_cfg **changedList = flib_list_delete(list->schemes, &list->schemeCount, sizeof(*list->schemes), pos); |
218 list->schemes[list->schemeCount-1] = NULL; |
213 if(changedList || list->schemeCount==0) { |
219 list->schemeCount--; |
214 list->schemes = changedList; |
220 |
215 flib_cfg_release(elem); |
221 // If the realloc fails, just keep using the old buffer... |
216 result = 0; |
222 flib_cfg **newSchemes = flib_realloc(list->schemes, list->schemeCount*sizeof(*list->schemes)); |
217 } |
223 if(newSchemes || list->schemeCount==1) { |
|
224 list->schemes = newSchemes; |
|
225 } |
|
226 result = 0; |
|
227 } |
218 } |
228 return result; |
219 return result; |
229 } |
220 } |