/*----------------------------------------------------------------
                               regex

 Il programma richiede 2 stringhe e  ricerca la presenza della se-
 conda nella prima. La seconda stringa puo' essere  espressa anche
 con la sintassi delle (Extended) Regular Expression. Le occorren-
 ze vengono stampate in rosso mentre il resto  viene  stampato  in
 colore verde.

 Il lavoro di ricerca viene svolto facendo uso di 3 funzioni:

    * regcomp; compila la RE
    * regexec; esegue la ricerca
    * regfree; libera la memoria usata

 Posizionare  a REG_EXTENDED il 3^ parametro di regcomp perche` di
 default e' consentito l'uso delle sole basic Regular  Expression.
 Riveste  particolare importanza il 4^ parametro di regexec. Se e'
 NULL, la regexec funziona in maniera rudimentale: RE presente/non
 presente.  Il 4^ parametro puo' essere un puntatore ad un dato di
 tipo regmatch_t. E' una struttura che comprende 2 membri interi:

    * rm_so e' la posizione del primo carattere della stringa  che
      e' conforme alla RE
    * rm_eo  e'  la posizione successiva all'ultimo carattere con-
      forme alla RE

 E' cosi' possibile individuare con esattezza  i  caratteri  della
 stringa  conformi  alla  RE.   Un  esempio dovrebbe sperabilmente
 chiarire le cose. Nella stringa
      char *str = "abc123xyz"
 si ricerca una sequenza di cifre (la RE e': [0-9]+). I  2  membri
 risultano cosi' posizionati:

    * rm_so vale 3, perche` la cifra 1 si trova in posizione 3 (si
      parte da zero)
    * rm_eo vale 6, la posizione della x


      Messaggistica

 malloc errata
      si e' verificato un errore di allocazione
----------------------------------------------------------------*/

#include <regex.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>

#define True  1
#define False !True

/*-----configurazione-----*/
const int rosso = 31;
const int string_len = 80;
const int verde = 32;
/*---fineconfigurazione---*/

int main (void)
{
  char       *p, *pattern, *stringa;
  int        len;
  extern int match (char *, char *, regmatch_t *);
  regmatch_t pmatch;
  void       colora (char *, int, int);

  pattern = (char *) calloc (sizeof (char), string_len);
  stringa = (char *) calloc (sizeof (char), string_len);
  if (stringa == NULL || pattern == NULL)
    {
      fprintf (stderr, "malloc error\n");
      exit (EXIT_FAILURE);
    }
  printf ("immettere una stringa ");
  fgets (stringa, string_len, stdin);
  len = strlen (stringa) - 1;
  stringa [len] = '\0';
  printf ("immettere la reg expr ");
  fgets (pattern, string_len, stdin);
  pattern [strlen (pattern) - 1] = '\0';
  p = stringa;
  while (match (p, pattern, &pmatch))
    {
      if (pmatch.rm_so)
        colora (p, pmatch.rm_so, verde);
      colora (p + pmatch.rm_so, pmatch.rm_eo - pmatch.rm_so, rosso);
      p += pmatch.rm_eo;
      len -= pmatch.rm_eo;
    }
  if (len > 0)
    colora (p, len, verde);
  printf ("\n");
  free ((void *) pattern);
  free ((void *) stringa);

  exit (EXIT_SUCCESS);
}

void colora (char *s, int len, int colore)
{
  unsigned char escape = 0x1b;

  printf ("%c[%dm%.*s%c[0m", escape, colore, len, s, escape);
}