/*----------------------------------------------------------------
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);
}