Grazie mille dell'aiuto.
Ho corretto anche questo errore.
Stanamente a volte, sopratutto con stringhe di pochi caratteri, mi da ancora errore di segmentazione.
Non capisco cosa possa essere.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <stdlib.h>
void sottoString(int nParam, char *param[], char str[])
{
int i;
int u;
char *pointer;
char tem1[1000] = ""; // Tiene la parte iniziale della stringa
char tem2[1000] = "";// Tiene la parte del parametro della stringa
char tem3[1000] = "";// Tiene la parte finale della stringa
char colorEnd[9] = "\e[00m"; //Vettore dei colori
char *color[8] = {"\e[1;31m", "\e[1;32m", "\e[1;33m", "\e[1;34m", "\e[1;35m", "\e[1;36m", "\e[1;37m"};
//**********************************************************************
for(i=2; i<nParam; i++)//i=2 perchè i primi 2 parametri passati sono
{// il nome dell'eseguibile e il nome del file dove cercare
for(u=0; u<1000; u++) //porto tem[1..3] a stringa vuota
{
tem1[u]='\0';
tem2[u]='\0';
tem3[u]='\0';
}
pointer = strstr(str, param[i]); // punta alla prima occorrenza
// della sottostringa cercata
//Estrazione delle sottostringhe
strcpy(tem2, param[i]);//tem2
strcpy(tem3, pointer+strlen(param[i])); //tem3
strncpy(tem1, str, strlen(str)-(strlen(param[i])+strlen(tem3))); //tem1
if (strstr(tem3, param[i]) != NULL)//ricorsione
sottoString(i+1, param, tem3);
//Concatenazione sottostringhe
strcat(tem2, colorEnd);
strcat(tem2, tem3);
strcat(tem1, color[i-2]);
strcat(tem1, tem2);
//Copia array
strcpy(str, tem1);
}
return ;
}
int IgnoraCase(int argc, char *argv[])
{
if((argv[argc-1][0] == '-' || argv[argc-1][0] == '/' ) && argv[argc-1][1] == 'i') //Confronto l'ultimo parametro con "-i" o "/i"
return 0;
return -1;
}
void Help()
{
printf("\e[1;33m\t *** FindLog ***\e[00m\n\n");
printf("Uso: FindLog FILE_DI_LOG PARAMETRO_1 [PARAMETRO_2]... [PARAMETRO_7] [OPZIONE]\n");
printf("Cerca nel FILE uno o più PARAMETRO.\n\n");
printf("Opzioni:\n");
printf(" --help \tVisualizza questo aiuto ed esce\n");
printf(" -i \tIgnora il case del FILE e del PARAMETRO\n");
printf("\n\n");
return;
}
int main(int argc, char *argv[]) {
char buf[1000];
char *res;
int i;
int j;
int k;
int righe = 0;
//*************************************************************
if(argc == 1 || argc == 2 || strcmp(argv[argc-1], "--help") == 0){ //Se non sono stati passati parametri sufficienti
Help(); // stampo il --help
exit (1);
}
//***************************************************************
//CONTROLLO SE ESISTE IL FILE
FILE *fp = NULL;
fp = fopen(argv[1], "r");
if(fp == NULL)
{
printf("\e[1;31mErrore! File non riconosciuto !\e[00m\n");
exit(1);
}
//***************************************************************
//CONTROLLO CASE
int caseCtrl; //Usato come un booleano
caseCtrl=IgnoraCase(argc, argv);
if(caseCtrl == 0)
argc--;//se l'utimo parametro è l'ignora case
// diminuisco i parametri di 1
if(caseCtrl == 0) //TO LOWER
for(j=2; j< argc; j++)
for(k=0; k< strlen(argv[j]); k++)
if(argv[j][k]>=65 && argv[j][k]<=90)
argv[j][k]+=32;
//****************************************************************
//CONTROLLO PARAMETRI
if(argc > 9)
{
printf("\e[1;31mErrore! Troppi parametri passati!\e[00m\n");
exit (1);
}
for(i=2; i<argc; i++)
{
for(j=i+1; j<argc; j++)
{
if(strstr(argv[i], argv[j]) != NULL){
printf("\e[1;31mErrore! In un parametro è presente un altro parametro!\e[00m\n");
exit (1);
}
if(strstr(argv[j], argv[i]) != NULL){
printf("\e[1;31mErrore! In un parametro è presente un altro parametro!\e[00m\n");
exit (1);
}
}
}
//****************************************************************
printf("\e[1;33mSTART\e[00m\n");//stampo start
while(1) {
res=fgets(buf, 1000, fp);
if(caseCtrl == 0) //TO LOWER
for(j=0; j<strlen(buf); j++)
if(buf[j]>=65 && buf[j]<=90)
buf[j]+=32;
if( res==NULL )
break;
for(i=2; i < argc; i++)
{
if (strstr(buf, argv[i]) == NULL)//CONTROLLO SE NELLA STRINGA
{// E' PRENSENTE LA SOTTOSTRINGA PASSATA
break;
}
if (i == argc-1)
{ //SE LA STRINGA SUPERA TUTTI I CONTROLLI LA STAMPO
//printf("%s\n", buf);
sottoString(argc , argv, buf);
printf("%s\n", buf);
righe++; // Tengo conto del numero di righe
}
}
}
//*****************************************************************
/* chiudo il file */
fclose(fp);
printf("\e[1;34mEND\e[00m\n");//Stampo end
printf("\e[1;32mRighe totali : %i\e[00m\n", righe); //Stampo numero di righe
return 0;
}