#include <stdio.h>
#include <stdlib.h>

#define FILE_IN        "addendi.txt"
#define END_NUM_CHAR    'e'
#define STOP_NUMS_CHAR  's'
#define MAX_DIGITS      1000
#define STRLENGHT       1024

typedef FILE*     pfile;
typedef unsigned* punsigned;

int main(void)
 {pfile     f;
  unsigned  i,j,dt,continua=1,n;
  punsigned ps;
  char      s[STRLENGHT];

  if ((ps=(punsigned)malloc(sizeof(unsigned)*MAX_DIGITS))==NULL) goto mem_err;
  if ((f=fopen(FILE_IN,"r"))==NULL) goto file_err;
  for(i=0;i<MAX_DIGITS;i++) ps[i]=0;
  i=dt=n=0;
  do
   {
    fscanf(f,"%s",s);
    switch (s[0])
     {case '0':
      case '1':
      case '2':
      case '3':
      case '4':
      case '5':
      case '6':
      case '7':
      case '8':
      case '9':            printf("%c",s[0]);
                           ps[i]+=(s[0]-'0');
                           j=i;
                           while (ps[j]>9)
                            {ps[j]-=10;
                             if ((++j)>=MAX_DIGITS) goto digit_err;
                             ps[j]++;
                            }
                           if ((++i)>=MAX_DIGITS) goto digit_err;;
                           if (j>=dt) dt=j+1; break;
      case END_NUM_CHAR:   printf("\n"); if (i>dt) dt=i; i=0; n++; break;

      case STOP_NUMS_CHAR: fclose(f); if (i) goto num_err; continua=0; break;

      default:             goto digit_err;
     }
   }
  while(continua);
  printf("\nLa somma totale e' pari a: ");
  for(i=1;i<=dt;i++) printf("%u",ps[dt-i]);
  free(ps); printf("\nAddendi letti: %u\n",n);
  return EXIT_SUCCESS;

  mem_err:    printf("\nMemoria insufficiente!\n");      return EXIT_FAILURE;
  file_err:   printf("\nProblema con i files!\n");       return EXIT_FAILURE;
  digit_err:  printf("\nProblema con le cifre!\n");      return EXIT_FAILURE;
  num_err:    printf("\nQuantitativo numeri errato!\n"); return EXIT_FAILURE;


 }
