{
return list->len;
}
+
+/* Selection sort */
+int list_sort(struct list *l, sort_function_t *fn)
+{
+ int i, j;
+ for (i = 0; i < l->len; i++) {
+ int max = i;
+ void *tmp;
+ /* Find index of max value */
+ for (j = i; j < l->len; j++) {
+ if (fn(l->items[j].val, l->items[max].val) < 0)
+ max = j;
+ }
+ /* Swap items */
+ tmp = l->items[max].val;
+ l->items[max].val = l->items[i].val;
+ l->items[i].val = tmp;
+ }
+}
return 0;
}
+static struct pagamento * novo_pagamento_cnpj(struct pagamento *pagamento)
+{
+ struct pagamento *cnpj;
+ cnpj = malloc(sizeof(*pagamento));
+ cnpj->codigo = pagamento->codigo;
+ cnpj->cnpj = strdup(pagamento->cnpj);
+ cnpj->nome = strdup(pagamento->nome);
+ cnpj->pagamento = 0;
+ return cnpj;
+}
+
+static struct pagamento * procura_pagamento_cnpj(struct declaracao *dec, char *cnpj)
+{
+ int i;
+ struct pagamento *pagamento;
+ for (i = 0; (pagamento = list_get(dec->pagamentos_cnpj, i)); i++) {
+ if (!strcmp(pagamento->cnpj, cnpj)) {
+ return pagamento;
+ }
+ }
+ return NULL;
+}
+
+static void agrupa_ordena_pagamentos(struct declaracao *dec)
+{
+ int i;
+ struct pagamento *pagamento;
+ struct pagamento *cnpj;
+ struct pagamento *j;
+ dec->pagamentos_cnpj = list_new();
+ for (i = 0; (pagamento = list_get(dec->pagamentos, i)); i++) {
+ cnpj = procura_pagamento_cnpj(dec, pagamento->cnpj);
+ if (!cnpj) {
+ cnpj = novo_pagamento_cnpj(pagamento);
+ cnpj->pagamento = (pagamento->pagamento);
+ list_add(&dec->pagamentos_cnpj, cnpj);
+ } else {
+ cnpj->pagamento += (pagamento->pagamento);
+ }
+ }
+ list_sort(dec->pagamentos_cnpj, pagamento_cmp);
+ for (i = 0; (j = list_get(dec->pagamentos_cnpj, i)); i++) {
+ if (dec->verbose)
+ printf("pagamento %d \"%s\" \"%s\" %lld\n",
+ j->codigo, j->cnpj, j->nome, j->pagamento);
+ }
+}
+
char * pagamento_cnpj_ordenado_cond(struct declaracao *dec,
int (*cond)(struct pagamento *), int n)
{
struct pagamento *pagamento;
int i;
int j = 0;
- for (i = 0; (pagamento = list_get(dec->pagamentos, i)); i++) {
+ if (!dec->pagamentos_cnpj) {
+ agrupa_ordena_pagamentos(dec);
+ }
+ for (i = 0; (pagamento = list_get(dec->pagamentos_cnpj, i)); i++) {
if (cond(pagamento) && j++ == n)
break;
}