From 62cdf2b04aa8d0162da8e024d9901ba5743bf5e3 Mon Sep 17 00:00:00 2001 From: oroborus Date: Mon, 30 Jun 2008 20:25:53 +0000 Subject: - hrac moze sucastne chodit aj strielat - na indexovanie poloziek v list_t sa pouizva index.c ( postaveny na list_t ) - oprava chyby, porgram sa zrutil ak nebolo inicializovane audio - zexxov patch git-svn-id: http://opensvn.csie.org/tuxanci_ng@80 0ee4d065-81f0-4d1e-b06c-ff20ad07cc3e --- src/base/index.c | 249 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 249 insertions(+) create mode 100644 src/base/index.c (limited to 'src/base/index.c') diff --git a/src/base/index.c b/src/base/index.c new file mode 100644 index 0000000..d3f75a5 --- /dev/null +++ b/src/base/index.c @@ -0,0 +1,249 @@ + +#include +#include +#include +#include + +#include "main.h" +#include "list.h" +#include "index.h" + +static int* index_newInt(int x) +{ + int *new; + new = malloc( sizeof(int) ); + *new = x; + return new; +} + +static void printIndex(list_t *list) +{ + int i; + + printf("printIndex\n"); + + for( i = 0 ; i < list->count ; i++ ) + { + int thisIndex; + + thisIndex = *(int *)list->list[i]; + printf("%d\n", thisIndex); + } +} + +static void checkIndex(list_t *list) +{ + int index, thisIndex; + int i; + + if( list->count == 0 ) + { + printf("nothing\n"); + return; + } + + thisIndex = *(int *)list->list[0]; + + for( i = 1 ; i < list->count ; i++ ) + { + index = *(int *)list->list[i]; + + if( index <= thisIndex ) + { + printIndex(list); + assert( ! "error" ); + } + + thisIndex = index; + } +} + +list_t* newIndex() +{ + return newList(); +} + +int addToIndex(list_t *list, int index) +{ + int point_index, inc_point_index; + int len; + int min, max; + int point; + + len = list->count; + + //printf("addToIndex (%p, %d)\n", list, index); + //printIndex(list); + + if( len == 0 ) + { + //printf("OK first\n"); + addList(list, index_newInt(index)); + checkIndex(list); + return 0; + } + + if( len == 1 ) + { + //space->getStatus(space->list->list[0], &point_id, &x, &y, &w, &h); + point_index = *(int *)list->list[0]; + + if( index > point_index ) + { + addList(list, index_newInt(index)); + //checkIndex(list); + return 1; + } + + if( index < point_index ) + { + insList(list, 0, index_newInt(index)); + //checkIndex(list); + return 0; + } + + //printf("OK\n") + return -1; + } + + min = 0; + max = len-1; +/* + if( max < 0 ) + { + max = 0; + } +*/ + for(;;) + { + point = min + ( max - min ) / 2; +/* + space->getStatus(space->list->list[min], &id_min, &x, &y, &w, &h); + space->getStatus(space->list->list[max], &id_max, &x, &y, &w, &h); +*/ + //printf("min = %d max = %d point = %d len = %d id = %d\n", min, max, point, len, id); + + if( max < 0 ) + { + //printf("OK first\n"); + insList(list, 0, index_newInt(index)); + //checkIndex(list); + return 0; + } + + if( point+1 >= len /*|| min >= len*/ ) + { + addList(list, index_newInt(index) ); + //printf("OK height\n"); + //checkIndex(list); + return len; + } + +// space->getStatus(space->list->list[point], &point_id, &x, &y, &w, &h); +// space->getStatus(space->list->list[point+1], &inc_point_id, &x, &y, &w, &h); + + point_index = *(int *)list->list[point]; + inc_point_index = *(int *)list->list[point+1]; +/* + if( min == max ) + { + //printf("OK\n"); + insList(space->list, min, p); + checkList(space); + return; + } +*/ + if( point_index < index && index < inc_point_index ) + { + //printf("OK\n"); + insList(list, point+1, index_newInt(index) ); + //checkIndex(list); + return point+1; + } + + if( index > inc_point_index ) + { + min = point + 1; + continue; + } + + if( index < point_index ) + { + max = point - 1; + continue; + } + } +} + +int getFormIndex(list_t *list, int index) +{ + int point_index; + int len; + int min, max; + int point; + + + //printf("getFormIndex %d\n", index); + //printIndex(list); + + len =list->count; + + min = 0; + max = len-1; + + for(;;) + { + point = min + ( max - min ) / 2; + + //printf("min = %d max = %d point = %d len = %d id = %d\n", min, max, point, len, id); + + if( max < 0 || point >= len || max < min ) + { + return -1; + } + + //space->getStatus(space->list->list[point], &point_id, &x, &y, &w, &h); + + point_index = *(int *)list->list[point]; + + if( min == max ) + { + //space->getStatus(space->list->list[min], &point_id, &x, &y, &w, &h); + point_index = *(int *)list->list[point]; + } + + if( point_index == index ) + { + return point; + } + + if( index > point_index ) + { + min = point + 1; + continue; + } + + if( index < point_index ) + { + max = point - 1; + continue; + } + } +} + +void delFromIndex(list_t *list, int index) +{ + int offset; + + offset = getFormIndex(list, index); + assert( offset != -1 ); + + delListItem(list, offset, free); +} + +void destroyIndex(list_t *list) +{ + assert( list != NULL); + + destroyListItem(list, free); +} -- cgit v1.2.3