project_files/frontlib/util/list.c
changeset 7269 5b0aeef8ba2a
equal deleted inserted replaced
7267:710f3ced8934 7269:5b0aeef8ba2a
       
     1 #include "list.h"
       
     2 
       
     3 #include <string.h>
       
     4 #include "util.h"
       
     5 #include "logging.h"
       
     6 
       
     7 void *flib_list_insert(void *list, int *listSizePtr, size_t elementSize, void *elementPtr, int pos) {
       
     8 	void *result = NULL;
       
     9 	if(!listSizePtr || !elementPtr || pos < 0 || pos > *listSizePtr) {
       
    10 		flib_log_e("Invalid parameter in flib_list_insert");
       
    11 	} else {
       
    12 		unsigned char *newList = flib_realloc(list, ((*listSizePtr)+1)*elementSize);
       
    13 		if(newList) {
       
    14 			memmove(newList + (pos+1)*elementSize, newList + pos*elementSize, ((*listSizePtr)-pos)*elementSize);
       
    15 			memmove(newList + pos*elementSize, elementPtr, elementSize);
       
    16 			(*listSizePtr)++;
       
    17 			result = newList;
       
    18 		}
       
    19 	}
       
    20 	return result;
       
    21 }
       
    22 
       
    23 void *flib_list_delete(void *list, int *listSizePtr, size_t elementSize, int pos) {
       
    24 	void *result = NULL;
       
    25 	if(!listSizePtr || pos < 0 || pos >= *listSizePtr) {
       
    26 		flib_log_e("Invalid parameter in flib_list_delete");
       
    27 	} else {
       
    28 		unsigned char *charList = list;
       
    29 		memmove(charList + (pos*elementSize), charList + (pos+1)*elementSize, (*listSizePtr-(pos+1))*elementSize);
       
    30 		(*listSizePtr)--;
       
    31 
       
    32 		// If the realloc fails, just keep using the old buffer...
       
    33 		size_t newCharSize = (*listSizePtr)*elementSize;
       
    34 		void *newList = flib_realloc(list, newCharSize);
       
    35 		if(newList || newCharSize==0) {
       
    36 			result = newList;
       
    37 		} else {
       
    38 			result = list;
       
    39 		}
       
    40 	}
       
    41 	return result;
       
    42 }