project_files/frontlib/model/schemelist.c
changeset 7269 5b0aeef8ba2a
parent 7230 240620f46dd7
child 7271 5608ac657362
equal deleted inserted replaced
7267:710f3ced8934 7269:5b0aeef8ba2a
     2 
     2 
     3 #include "../util/inihelper.h"
     3 #include "../util/inihelper.h"
     4 #include "../util/logging.h"
     4 #include "../util/logging.h"
     5 #include "../util/util.h"
     5 #include "../util/util.h"
     6 #include "../util/refcounter.h"
     6 #include "../util/refcounter.h"
       
     7 #include "../util/list.h"
     7 
     8 
     8 #include <stdio.h>
     9 #include <stdio.h>
     9 #include <stdlib.h>
    10 #include <stdlib.h>
    10 #include <limits.h>
    11 #include <limits.h>
    11 #include <string.h>
    12 #include <string.h>
   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 }