00001 #include <stdio.h>
00002 #include <stdlib.h>
00003 #include "TaskIdList.h"
00004 #include "constants.h"
00005
00006
00007 #ifdef TASK_ID_LIST_SEND
00008 #define TO_NETWORK
00009 #endif
00010 #include "cser.h"
00011
00012
00013 #ifndef TASK_ID_LIST_SEND
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034 int taskIdListGetMinCpacity(int size){
00035 int cap;
00036
00037 cap=1;
00038 for (cap=1; cap<size; cap=cap<<1);
00039 return cap;
00040 }
00041
00042
00043
00044
00045 TaskIdList *taskIdListCreate(int cap_inicial) {
00046 TaskIdList *vet = malloc(sizeof(TaskIdList));
00047
00048 vet->size = 0;
00049 vet->capacity = taskIdListGetMinCpacity(cap_inicial);
00050 vet->vetor = malloc(sizeof(int)*vet->capacity);
00051
00052 return vet;
00053 }
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065 int taskIdListAdd(TaskIdList *vet, int doc) {
00066 int ret = 0;
00067
00068
00069 if (vet->size+1 > vet->capacity) {
00070 vet->capacity = vet->capacity << 1;
00071 vet->vetor = realloc(vet->vetor, sizeof(int)*vet->capacity);
00072 }
00073
00074 vet->vetor[vet->size] = doc;
00075
00076 ret = vet->size;
00077 vet->size++;
00078
00079 return ret;
00080 }
00081
00082
00083
00084
00085 int taskIdListGetSize(TaskIdList *vet) {
00086 if (vet == NULL) {
00087 return 0;
00088 }
00089 return vet->size;
00090 }
00091
00092
00093
00094
00095 int taskIdListGet(TaskIdList *vet, int pos) {
00096 return ((vet->vetor[pos]) );
00097 }
00098
00099
00100
00101
00102 int taskIdListGetLast(TaskIdList *vet) {
00103 if (vet->size > 0) {
00104 return ((vet->vetor[vet->size-1]) );
00105 } else {
00106 return 0;
00107 }
00108 }
00109
00110 int *taskIdListToArray(TaskIdList *list, int *listSize) {
00111 int size = list->size;
00112 int *ret = NULL;
00113
00114 if (size > 0) {
00115 ret = malloc(sizeof(int)*size);
00116 memcpy(ret, list->vetor, sizeof(int)*size);
00117 }
00118
00119 *listSize = size;
00120 return ret;
00121 }
00122
00123
00124
00125
00126
00127
00128
00129
00130
00131
00132
00133 int taskIdListCompare(TaskIdList *list1, TaskIdList *list2) {
00134 int i=0;
00135
00136 if (list1->size < list2->size) {
00137 for (i=0; i<list1->size; i++) {
00138 if (list1->vetor[i] > list2->vetor[i]) {
00139 return 1;
00140 } else if (list1->vetor[i] < list2->vetor[i]) {
00141 return -1;
00142 }
00143 }
00144
00145 return -1;
00146 } else if (list1->size > list2->size) {
00147 for (i=0; i<list2->size; i++) {
00148 if (list1->vetor[i] > list2->vetor[i]) {
00149 return 1;
00150 } else if (list1->vetor[i] < list2->vetor[i]) {
00151 return -1;
00152 }
00153 }
00154
00155 return 1;
00156 } else {
00157 for (i=0; i<list1->size; i++) {
00158 if (list1->vetor[i] > list2->vetor[i]) {
00159 return 1;
00160 } else if (list1->vetor[i] < list2->vetor[i]) {
00161 return -1;
00162 }
00163 }
00164 return 0;
00165 }
00166 }
00167
00168
00169
00170
00171
00172 void taskIdListDestroy(TaskIdList *vet) {
00173 if (vet != NULL) {
00174 if (vet->vetor != NULL) {
00175 free(vet->vetor);
00176 }
00177 free(vet);
00178 }
00179 }
00180
00181
00182 TaskIdList *taskIdListCopy(TaskIdList* list){
00183 if (list == NULL) {
00184 return NULL;
00185 }
00186
00187 int i, value, size = taskIdListGetSize(list);
00188 TaskIdList *auxList = taskIdListCreate(size);
00189
00190 for(i = 0; i < size; i++){
00191 value = taskIdListGet(list, i);
00192 taskIdListAdd(auxList, value);
00193 }
00194 return auxList;
00195 }
00196
00197
00198
00199 TaskIdList *taskIdListIntersection(TaskIdList *a, TaskIdList *b) {
00200 int i,j, resultSize=0;
00201
00202 if(a->size < b->size) {
00203 resultSize = a->size;
00204 } else {
00205 resultSize = b->size;
00206 }
00207 TaskIdList *result = (TaskIdList *)taskIdListCreate(resultSize);
00208
00209 for(i=0,j=0; i < a->size && j < b->size;) {
00210 if(a->vetor[i] > b->vetor[j]) {
00211 j++;
00212 } else if(a->vetor[i]==b->vetor[j]) {
00213 taskIdListAdd(result, a->vetor[i]);
00214 j++;
00215 i++;
00216 } else {
00217 i++;
00218 }
00219 }
00220
00221
00222 if(result->size > 0) {
00223 result->vetor=(int*)realloc(result->vetor,sizeof(int)*result->size);
00224 result->capacity = result->size;
00225 } else {
00226 free(result->vetor);
00227 result->vetor = NULL;
00228 result->capacity = 0;
00229 }
00230
00231 return result;
00232 }
00233
00234
00235 static int compareTaskIds(const void *a, const void *b) {
00236 int* i=(int*)a;
00237 int* j=(int*)b;
00238
00239 if (*i > *j) return(1);
00240 if (*i < *j) return(-1);
00241 return 0;
00242 }
00243
00244
00245 void taskIdListSortAscendig(TaskIdList *list) {
00246 if (list->size > 1) {
00247 qsort(list->vetor, list->size, sizeof(int), &compareTaskIds);
00248 }
00249 }
00250
00251
00252 #endif
00253
00254
00255
00256 int WRITE_TIDL(FILE *outputFile, void *list){
00257 int i, taskId, listSize = taskIdListGetSize((TaskIdList *)list);
00258
00259 WRITE_NUM(outputFile, "listSize", listSize);
00260
00261 for(i = 0; i < listSize; i++){
00262 taskId = taskIdListGet((TaskIdList *)list, i);
00263
00264 WRITE_NUM(outputFile, "taskId", taskId);
00265 }
00266
00267 return 1;
00268 }
00269
00270 void *READ_TIDL(FILE *inputFile){
00271 int i, taskId, listSize = -1;
00272 TaskIdList *list = NULL;
00273
00274 READ_BEGIN(inputFile);
00275
00276
00277 READ_NUM("listSize", listSize);
00278 if(listSize == -1)fprintf(stderr,"Error: Reading task Id List Size\n");
00279
00280 list = taskIdListCreate(listSize);
00281
00282 for(i = 0; i< listSize; i++){
00283 taskId = -2;
00284 READ_NUM("taskId", taskId);
00285 if(taskId == -1){
00286 fprintf(stderr,"Error: Reading task Id List\n");
00287 return NULL;
00288 }
00289 taskIdListAdd(list, taskId);
00290
00291
00292 }
00293 READ_END
00294 return ((void *) list);
00295 }
00296