/*************************************************************************
*                                                                        *
*         SSSSSS     UU     UU    MM       MM    DATUM: 23-03-1990       *
*        SS          UU     UU    MMM     MMM                            *
*       SS           UU     UU    MMMM   MMMM    AUTOR: A. NEUPER        *
*        SS          UU     UU    MM MM MM MM                            *
*         SSSSS      UU     UU    MM  MMM  MM    COMPILER: AZTEC C 5.0   *
*             SS     UU     UU    MM   M   MM                            *
*              SS    UU     UU    MM       MM    CC: Voreinstellung      *
*             SS      UU   UU     MM       MM                            *
*        SSSSSS        UUUUU      MM       MM    LN: -lm -lc             *
*                                                                        *
*************************************************************************/
#include <stdio.h>
#include <math.h>
#include <ctype.h>
#include <exec/types.h>

main(int argc, char *argv[])
{  FILE  *infile;
   register int i;
   int   tempint=0, printint;
   int    maximal=120, line=0;
   double tempfloat=(double)0.0,printfloat;
   char  *buffer,filename[100],chary;
   int  format=0,start=0,stop=0,begin=0,end=0,query=0,verbose=0;
         /* Format:  0-INTEGER/KARDINAL  1-EXP.FLOAT/Gleitkommazahlen */
         /* Spalten: Bearbeitet Spalten 'start' bis 'stop'(=\0 in Buffer)*/
         /* Zeile:   die erste untersuchte Zeile ist 'begin', die letzte 'end' */

   if(argc>1)
   if(argv[1][0]=='?')
   {  puts("");
      puts(" \033[41;32m ZWECK:     Zählt Zahlen (Integer oder Float) in einem File zusammen.       \033[40;31m");
      puts(" \033[42;33m GEBRAUCH: \033[41m SUM [ - [?] [M] [Z[nnn]-[nnn]] [S[nnn]-[nnn]] [I|G] ] <file>    \033[40;31m");
      puts(" \033[41;32mURBELEGUNG:\033[30m               (alle) 0 - 0   (alle) 0 - 0      I                \033[40;31m");
      puts(" \033[41;32mERKLÄRUNG: \033[30m         Meldung  Zeile          Spalte   Integer|Gleitkomma     \033[40;31m");
      puts(" \033[41;32mBEMERKUNG: \033[30mKeine Leerzeichen im Optionsausdruck verwenden. (z.B.'-mGS-12')  \033[40;31m");
      puts(" \033[41;30m           int   heißt '[-]<nummer>'                      - Format [atoi()] \033[40;31m");
      puts(" \033[41;30m           float heißt '[-]<nummer>.<nummer>E[-]<nummer>' - Format [atof()] \033[40;31m");
      puts(" \033[41;30m           Groß- und Klein-Schreibung wird nicht unterschieden.             \033[40;31m");
      puts(" \033[41;30m           Alles hinter der letzten Spalte wird abgehackt (halbe Zahlen?!).\033[40;31m");
      puts("");
      return(0);
   } else if(argv[1][1]=='?')
   {  puts("Die Werte der Voreinstellung werden durch '0' übernommen !");
      printf("Erste  Zeile  >"); scanf("%d",&begin);
      printf("Letzte Zeile  >"); scanf("%d",&end);
      printf("Erste  Spalte >"); scanf("%d",&start);
      printf("Letzte Spalte >"); scanf("%d",&stop);
      printf("Such-Format   >"); scanf("%s",buffer);
      if(toupper((int)buffer[0])=='F') format=1; else format=0; 
      verbose = 1;
      if(argc==3) { strcpy(filename,argv[2]); }
      else  {  printf("Eingabefilename>"); scanf("%s",filename); }
      query = 1;
   }

   if( (argc>3) || (argc<2) )
   {
      fputs("FEHLER in den Übergabe-Parametern !\n",stderr);
       exit(11);
   } else if(argc==3)
   {  if(argv[1][0]=='-')

      {  i=1;
         while(argv[1][i])
         {  switch(toupper((int)argv[1][i++]))
            {  case 'S' :
               case 'C' :  if(argv[1][i]!='-')
                              start = atoi(&argv[1][i]);
                           while(argv[1][i]!='-')
                              if(!isdigit(argv[1][i++])) return(10);
                           i++;
                           stop = atoi(&argv[1][i]);
                           while(isdigit(argv[1][i])) i++;
                           break;
               case 'Z' :
               case 'L' :  if(argv[1][i]!='-')
                              begin = atoi(&argv[1][i]);
                           while(argv[1][i]!='-')
                              if(!isdigit(argv[1][i++])) return(10);
                           i++;
                           end = atoi(&argv[1][i]);
                           while(isdigit(argv[1][i])) i++;
                           break;
               case 'M' :
               case 'V' :  verbose=1; break;
               case 'I' :  format=0; break;
               case 'E' :
               case 'G' :
               case 'F' :  format=1; break;
               case '?' :  break;
               default  :  exit(10);
            }
         }
      }
      if(!query) strcpy(filename,argv[2]);
   } else if(!query) strcpy(filename,argv[1]);
   if(!( infile=fopen(filename,"r") ) )
   {  fputs("\nFEHLER beim Öffen des Files!\n"    ,stderr);
      exit(10);
   }
   if((begin>end&&end!=0)||(start>stop&&stop!=0))
   {  fputs("\nEs gab nichts zu tun!\n",stderr);
      exit(12);
   }
   if(stop>maximal-2) maximal = stop+2;
   if(!(buffer = (char *)calloc(maximal,sizeof(char)))) return(10);
   fgets(buffer,maximal,infile);
   while(!feof(infile))
   {  line++;
      if(start) i = start-1; else i=0;
      if(stop) { chary=buffer[stop]; buffer[stop]=0; }
      if(begin<=line && (end>=line||end==0))
      {  while(buffer[i])
         {  while(!(isdigit(buffer[i]) || buffer[i]=='-' || buffer[i]==0) ) i++;
            if(buffer[i]==0) break;
            if(format)
            {  tempfloat += printfloat = atof(&buffer[i]);
               if(verbose) printf("%22.10f\n",printfloat);
               if(buffer[i]=='-') i++;
               while(isdigit(buffer[i])) i++;
               if(buffer[i]=='.')
               {  i++;
                  while(isdigit(buffer[i])) i++;
               }
               if(toupper((int)buffer[i])=='E')
               {  i++;
                  if(buffer[i]=='-') i++;
                  while(isdigit(buffer[i])) i++;
               }
            } else
            {  tempint += printint = atoi(&buffer[i]);
               if(verbose) printf("%18d\n",printint);
               if(buffer[i]=='-') i++;
               while(isdigit(buffer[i])) i++;
            }
         }
      }
      buffer[stop]=chary; while(buffer[i]) i++;
      while(buffer[i-1]!=10&&stop!=0)
      {  fgets(buffer,maximal,infile);
         i=0; while(buffer[i]) i++;
      }
      fgets(buffer,maximal,infile);
   }
   free((void *)buffer);
   if(verbose)printf(" ­­­­­­­­­­­­­­­­­­­­­­\n");
   if(format) printf("%22.10f\n",tempfloat);
   else       printf("%18d\n",tempint);

   fclose(infile);
   return(0);
}
