00001
00009 #include <stdlib.h>
00010 #include "array.h"
00011
00012 Array newArray(int size)
00013 {
00014 Array array;
00015
00016 array=(Array)malloc(sizeof(SArray));
00017
00018 if(array)
00019 {
00020 array->capacity=size;
00021 array->size=0;
00022 array->array=(void**)calloc(size,sizeof(void*));
00023
00024 if(array->array) return array;
00025 else
00026 {
00027 free(array);
00028 return NULL;
00029 }
00030 }
00031 else return NULL;
00032 }
00033
00034
00035
00036 void arrayDelete(Array array)
00037 {
00038 free(array->array);
00039 free(array);
00040 }
00041
00042
00043
00044 int arrayInsert(Array array,int index,void* inf,int replace)
00045 {
00046 if(index<0) return 2;
00047 else if(index>=array->capacity)
00048 {
00049 if(!arrayResize(array,index+1))
00050 {
00051 array->size++;
00052 array->array[index]=inf;
00053 return 0;
00054 }
00055 else return 3;
00056 }
00057 else if(array->array[index])
00058 {
00059 if(replace) array->array[index]=inf;
00060 return 1;
00061 }
00062 else
00063 {
00064 array->size++;
00065 array->array[index]=inf;
00066 return 0;
00067 }
00068 }
00069
00070
00071
00072 int arrayRemove(Array array,int index,void** inf)
00073 {
00074 if(index<0||index>=array->capacity)
00075 {
00076 if(inf) *inf=NULL;
00077 return 1;
00078 }
00079 else if(!array->array[index])
00080 {
00081 if(inf) *inf=NULL;
00082 return 1;
00083 }
00084 else
00085 {
00086 if(inf) *inf=array->array[index];
00087 array->array[index]=NULL;
00088 array->size--;
00089 return 0;
00090 }
00091 }
00092
00093
00094
00095 int arrayAt(Array array,int index,void** inf)
00096 {
00097 if(index<0||index>=array->capacity)
00098 {
00099 *inf=NULL;
00100 return 1;
00101 }
00102 else if(!array->array[index])
00103 {
00104 *inf=NULL;
00105 return 1;
00106 }
00107 else
00108 {
00109 *inf=array->array[index];
00110 return 0;
00111 }
00112 }
00113
00114
00115
00116 int arrayResize(Array array,int size)
00117 {
00118 int i;
00119 void** newarray;
00120
00121 if(array->capacity>=size) return 2;
00122 else
00123 {
00124 newarray=(void**)realloc(array->array,size*sizeof(void*));
00125
00126 if(newarray)
00127 {
00128 for(i=array->capacity;i<size;i++)
00129 newarray[i]=NULL;
00130
00131 array->array=newarray;
00132 array->capacity=size;
00133
00134 return 0;
00135 }
00136 else return 1;
00137 }
00138 }
00139
00140
00141
00142 int arraySize(Array array)
00143 {
00144 return(array->size);
00145 }
00146
00147
00148
00149 int arrayCapacity(Array array)
00150 {
00151 return(array->capacity);
00152 }
00153
00154
00155
00156 int arrayMap(Array array,void(*fun)(void*))
00157 {
00158 int i,j;
00159
00160 if(!array->size) return 1;
00161 else
00162 {
00163 for(i=0,j=0;i<array->capacity&&j<array->size;i++)
00164 if(array->array[i])
00165 {
00166 fun(array->array[i]);
00167 j++;
00168 }
00169
00170 return 0;
00171 }
00172 }
00173
00174
00175
00176 Iterator arrayIterator(Array array)
00177 {
00178 int ctrl,i,j;
00179 Iterator it;
00180
00181 it=newIt(array->size);
00182 for(ctrl=0,i=0,j=0;i<array->capacity&&j<array->size&&!ctrl;i++)
00183 if(array->array[i])
00184 {
00185 ctrl=itAdd(it,array->array[i]);
00186 j++;
00187 }
00188
00189 if(ctrl)
00190 {
00191 itDelete(it);
00192 return NULL;
00193 }
00194 else return it;
00195 }