/*
         Crunch.c - Elimina Line-Feed inutili e commenti da sorgente C

         Versione 1.0i - by Larry Phillips & Luigi Callegari - 11/1988

            Sviluppato con Lattice AmigaDOS C Compiler & Blink V7.2

                          Compilazione: LC -vbr -ce LD

              Link: BLINK FROM LIB:c.o+ld.o TO ld SC SD ND VERBOSE
                        LIBRARY LIB:lc.lib+LIB:amiga.lib

            Facilmente trasportabile su Aztec C ed altri compilatori
*/

#define NULLA 0		/* Flag di nessun carattere speciale */
#define LINEFEED 10	/* Flag di nuova linea */
#define SPAZIO 32	/* Flag di spazio o tabulatore */
#define COMMEN 1	/* Flag di commento */

/* ************ Files di inclusione: tipi C, standard I/O ********** */

#include <exec/types.h>
#include <ctype.h>
#include <stdio.h>

#include <proto/dos.h>	/* *SOLO Lattice 4.0* File di prototipo */

void main(argc, argv)	/* Funzione senza interi di ritorno */
int argc;		/* Numero di argomenti passati dal CLI */
char *argv[];		/* Puntatori agli argomenti del CLI */
{
extern void exit(long);
register int cicla = 0;	/* Contatore di ciclo, usato intensivamente */
register int flag = 0;	/* Flag di controllo ciclo, usato intensamente */
register char c;	/* variabile di I/O dei caratteri */
register FILE *in, *out;	/* Puntatori ai files di I/O */

if (argc < 3) {
	printf("Argomenti errati!\n");
	exit(20L);
}

/* Tenta di aprire il file di input */

if ((in = fopen (argv [1], "r")) == 0)
   { printf("Non si apre il file di input\n");
     exit(20L);
   }

/* Verifica della sintassi CLI */

if (argc == 4)
   {
   if ((out = fopen (argv [3], "w")) == 0)
      { printf("Non si apre il file di output\n");
      exit(20L);
      }

   }

if (argc == 3)
   {
   if ((out = fopen (argv [2], "w")) == 0)
      { printf("Non si apre il file di output\n");
      exit(20L);
      }
   }

/* Loop principale */

while((c = getc(in)) !=EOF)	/* Cicla sino a fine del file */
   {
   cicla = TRUE;

   while (cicla == TRUE)           /* Sino a risolvimento carattere */
      {
      if (flag == NULLA)                /* controlla casi particolari */
         {

         if (c == '/')                 /* controlla se commento */
            {
            if ((c = getc(in)) == '*') { /* e' commento, attiva flag */
		flag = COMMEN;
		c = 0;
		cicla = FALSE;
		}
	    else                       /* non commento, output '/'  */
               putc ('/', out);        /* c e' il nuovo carattere */
            }                          /* scandito da qui in poi  */

         if (c == '\n' || c == '\r')   /* Flag di linefeed */
            flag = LINEFEED;

         if (c == ' ' || c == '\t')    /* Fissa flag di SPAZIO */
            flag = SPAZIO;

         if (flag == NULLA)             /* Nessun flag acceso */
            cicla = FALSE;         /* e poni carattere in output  */

         }

      if (flag == SPAZIO)               /* se attivo flag SPAZIO  */
         {
         if (c == ' ' || c == '\t')    /* Verifica SPAZIO or tab */
            {
            c = 0;                     /* Positivo, nessun output */
            cicla = FALSE;
            }
         else
            {
            putc (' ', out);           /* Negativo, output SPAZIO e lascia */
            flag = NULLA;              /* c come nuovo carattere da  */
            }                          /* analizzare */
         }

      if (flag == LINEFEED)
         {
         if (c == '\n' || c == ' ' || c == '\r') /*  Toglie LF extra */
            {                                    /* tabulatori e spazi */
            c = 0;                              /* dopo un '\n' */
            cicla = FALSE;
            }
         else
            {
            putc ('\n', out);    /* output 1 linefeed se ricevuto un */
            flag = NULLA;         /* carattere. c lo conserva */
            }
         }

      if (flag == COMMEN)       /* tratta i COMMENTI */
         {
         if (c == '*')
            {
            if ((c = getc(in)) == '/')  /* Se fine del commento */
               {
               flag = NULLA;             /* spegne flag di commento  */
               c = 0;                    /* non abbiamo un carattere  */
               cicla = FALSE;            /* quindi leggiamone uno.*/
               }
            }
         else
            {
            c = 0;
            cicla = FALSE;
            }
         }
      }                                /*  endwhile  cicla  */ 
   if (c != 0)
      putc (c, out);
   }                                   /*  endwhile NOT EOF  */
putc('\n', out);
fclose (in);
fclose (out);
}

       /* Fine della fiaba - Gentilmente offerta da EnigmA AmigA Disk */
