+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);
+ }
+}
+