9511_project03

project 3 for algorithms & programming I (9511) prof. Cardozo
Index Commits Files Refs README LICENSE
source/load.c (3270B)
   1 #include "../include/load.h"
   2 
   3 status_t load_users_to_vector(ADT_Vector_t **v, cla_t cla)
   4 {
   5     status_t st;
   6     char buffer[IN_FILE_MAX_LEN];
   7     char *endptr1, *endptr2, **data;
   8     user_t *u1, *u2, *u3;
   9     time_t epoch;
  10     long long amount;
  11     size_t user_pos, parsed_lines, users_created;
  12     ulong id, c, d;
  13 
  14     if(v == NULL || cla == NULL) return ERROR_NULL_POINTER;
  15 
  16     if((st = create_2darray(&data, IN_FILE_FIELDS, IN_FILE_FIELDS_MAX_LEN)) != OK)
  17         return st;
  18 
  19     parsed_lines = 0;
  20     users_created = 0;
  21     while(fgets(buffer, IN_FILE_MAX_LEN, cla->fi)) {
  22         if((st = user_create(&u1)) != OK) {
  23             destroy_2darray(data, IN_FILE_FIELDS);
  24             return st;
  25         }
  26 
  27         if((st = string_split(buffer, data, IN_FILE_DELIM)) != OK) {
  28             free(u1);
  29             destroy_2darray(data, IN_FILE_FIELDS);
  30             return st;
  31         }
  32 
  33         id = strtol(data[POS_USER_ID], &endptr1, 10);
  34         amount = strtol(data[POS_AMOUNT], &endptr2, 10);
  35 
  36         if(*endptr1 || *endptr2) {
  37             free(u1);
  38             destroy_2darray(data, IN_FILE_FIELDS);
  39             return ERROR_CORRUPT_DATA;
  40         }
  41 
  42         if(amount > 0) { c = amount; d = 0; }
  43         else if(amount < 0) { c = 0; d = -amount; }
  44 
  45         if((st = user_set_data(u1, id, c, d)) != OK) {
  46             free(u1);
  47             destroy_2darray(data, IN_FILE_FIELDS);
  48             return ERROR_CORRUPT_DATA;
  49         }
  50 
  51         if((st = get_date(&epoch, data[POS_TXN_DATE])) != OK){
  52             free(u1);
  53             destroy_2darray(data, IN_FILE_FIELDS);
  54             return ERROR_CORRUPT_DATA;
  55         }
  56 
  57         /* Comprueba el que el tiempo este dentro de los valores pasados como argumentos */
  58         if(epoch < cla->ti) continue;
  59         else if(epoch > cla->tf) break;
  60 
  61         /* Comprueba que la tarjeta usada en la transaccion sea la correcta */
  62         if(!is_valid_card(data[POS_CARD_NUMBER])) {
  63             fprintf(stderr, "%s: %s\n", STR_INVALID_CARD_NUMBER, data[POS_CARD_NUMBER]);
  64             continue;
  65         }
  66 
  67         /* Busca el id del usuario en el vector */
  68         if((st = ADT_Vector_get_elem_pos(*v, u1, &user_pos)) == OK) {
  69             /* Si llega aca lo encontrĂ³, entonces se lo asigna a un usuario temporal */
  70             if((st = ADT_Vector_get_elem(*v, (void **)&u2, user_pos) != OK)) {
  71                 destroy_2darray(data, IN_FILE_FIELDS);
  72                 free(u1);
  73                 return st;
  74             }
  75 
  76             /* Crea un usuario nuevo para almacenar la copia */
  77             if((st = user_create(&u3)) != OK) {
  78                 destroy_2darray(data, IN_FILE_FIELDS);
  79                 free(u1);
  80                 return st;
  81             }
  82 
  83             /* Copia el contenido del usuario */
  84             *u3 = *u2;
  85 
  86             /* Asigna a la copia el nuevo monto */
  87             if(amount > 0) u3->c += amount;
  88             else if(amount < 0) u2->d -= amount;
  89 
  90             /* Asigna la copia al vector en el lugar que estaba el usuario original */
  91             if((st = ADT_Vector_set_elem(v, u3, user_pos)) != OK) {
  92                 destroy_2darray(data, IN_FILE_FIELDS);
  93                 free(u1);
  94             }
  95 
  96             free(u1);
  97             free(u2);
  98         }
  99 
 100         /* Hubo un error distinto a no encontrar el usuario */
 101         else if(st != ELEM_NOT_FOUND) {
 102                 destroy_2darray(data, IN_FILE_FIELDS);
 103                 return st;
 104         }
 105 
 106         else { 
 107             /* Si no lo encuentra entonces lo agrega al vector */
 108             if((st = ADT_Vector_add(v, u1)) != OK){
 109                 destroy_2darray(data, IN_FILE_FIELDS);
 110                 return st;
 111             }
 112             users_created++;
 113         }
 114         clean_buffer(buffer); clean_array(data);
 115         parsed_lines++;
 116     } /* End while */
 117 
 118     destroy_2darray(data, IN_FILE_FIELDS);
 119     printf("%s\n%s%11ld\n%s%8ld\n", STR_MSG_END_PROCSS_ES, STR_MSG_LINES_PROCSSD_ES, parsed_lines, STR_MSG_USRS_REGISTERD_ES, users_created);
 120 
 121     return OK;
 122 }