IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

grep --> option?


Sujet :

C

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Etudiant En dev jeux video ESGI. Dev c/c++
    Inscrit en
    Novembre 2012
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Vietnam

    Informations professionnelles :
    Activité : Etudiant En dev jeux video ESGI. Dev c/c++

    Informations forums :
    Inscription : Novembre 2012
    Messages : 63
    Points : 38
    Points
    38
    Par défaut grep --> option?
    Bonjour

    J'ai besoin de vos conseils,

    Certains le savent deja, j'ai eu pour projet de re-coder(dur torture) un grep en c, avec un maximum d'option.
    Bon grace à vos conseils j'ai pu develloper un parseur de commade en utilisant mon propre my_get_opt();
    maintenant que tout sa marche ... il faut bien que j'appel les fonctions correnspondant au options .... le probleme, c'est que la je vois pas du tout comment je dois faire ... surtout que je me dit qu 'il ya forcement des options qui seront imbrique dans dautre ....

    je vous met tout mon code(oui il doit manque quelque close file ... im aware about that)

    main.c :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    #include"my_grep.h"
     
    int main(int argc,char** argv)
    {
     
    	t_parametre parametre; // cette structure est le resultat du parseur.
     
    	parseur_parametre(argc,argv,&parametre);
    	load_file(&parametre);
     
    	return 0;
    }
    grep.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
     
    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    #define OptMax 4
     
    #define TRUE 1
    #define FALSE 0
    typedef int BOOL;
    typedef struct s_parametre
    {
    	char **str_cmd;		// save argv
    	BOOL option[OptMax]; // save the different option extracted of argv
    }t_parametre;
     
     
     
    void parseur_parametre(int c_argc, char ** c_argv,t_parametre *c_parametre);
    int My_Error();
    int load_file(t_parametre *c_parametre);
    int read_file(t_parametre *c_parametre,FILE*);
    int get_opt(char *str_opt,t_parametre *c_parametre);
    int grep_standard(char *line,int taille,t_parametre *c_parametre);
    int grep_whith_upper_case(char *line,int taille,t_parametre *c_parametre);// 
                                       //cette fonction sera p-e à changer ou à  
                                      //disparaitre
    grep.c
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
     
     
     
    #include "my_grep.h"
     
    int My_Error()
    {
    	printf("Error: veuillez verifier que vous utiliser grep avec cette syntaxe :\ngrep [OPTION]... PATTERN [FILE]\n");
    	//exit(1);	
    	return 1;
    }
    int load_file(t_parametre *c_parametre)
    {
    	int i = 0;
    	FILE* fichier = NULL;
    	BOOL not_found = FALSE;
    	// the name file(pattern) cannot to be in argv[0] 
    	//c_parametre->str_cmd[2] = "C:\\Dev\\a_geter\\grep\\Debug\\toto.txt";
    	for(i=1;c_parametre->str_cmd[i] != "\0";i+=1)
    	{
     
    		fichier = fopen(c_parametre->str_cmd[i],"r");
    		if(!fichier)//if don't open or not found the pattern
    		{
    			//pattern don't match
    			continue;
    			//not_found = FALSE;
    		}
    		else
    		{
    			// partern founded
    			read_file(c_parametre,fichier);
    			not_found = TRUE;
    		}
     
    	}
    	if(not_found == FALSE)
    	{
    		My_Error();
    		exit(1);
    	}
    	fclose(fichier);
     
    	return(0);
    }
     
    int read_file(t_parametre *c_parametre,FILE *file)
    {
    	char temp[1000];
    	while(fgets(temp,1000,file)!= NULL)
    	{
    		if(c_parametre->option[3] == TRUE) // exemple d'appel d'option
    		{
    			grep_standard(temp,strlen(temp),c_parametre) ;
    		}
    	}
    }
     
    void parseur_parametre(int c_argc,char ** c_argv,t_parametre *c_parametre)
    {
    	int i= 0;
    	int it_str_cmd = 0;
    	c_parametre->str_cmd = (char**)malloc((c_argc)*sizeof(char*));
     
    	//init********************************************************
    	for(i;i<=c_argc;i+=1)
    	{
    		c_parametre->str_cmd[i] = "\0";
    	}
    	for(i = 0;i<OptMax;i+=1)
    	{
    		c_parametre->option[i]=FALSE;
    	}
    	//***********************************************************
     
    	if(c_argc<2)
    	{
    		My_Error();//print Error on screen
    		exit(1);
    	}
    	for(i=0;i<c_argc;i+=1)
    	{
    		if(c_argv[i][0] == '-') // check if there are option(s) ('-' is only on the first line of c_argv)
    		{
    			//get_opt() permet de determiner le nbre d'option et quel option appliquee
    			get_opt(&c_argv[i][1],c_parametre); //take the next caracteres after'-'
    		}
    		else
    		{
    			c_parametre->str_cmd[it_str_cmd] = c_argv[i];
    			it_str_cmd+=1;
    		}
    	}
    	if(it_str_cmd == 1)
    	{
    		My_Error();
    		printf("Aide: verifier la syntaxe apres [OPTION]\n");
    		exit(1);
    	}
     
     
    }
     
    int get_opt(char *str_opt,t_parametre *c_parametre)
    {
    	char option[]={'E','F','G','i',0}; // liste d'option diponible du grep
    	int i = 0,j = 0;
    	BOOL option_non_repertorie = FALSE;
     
    	for(i;str_opt[i];i+=1)
    	{
    		for(j;option[j];j+=1)
    		{
    			if(str_opt[i]==option[j])
    			{
    				c_parametre->option[j] = TRUE;
    				option_non_repertorie = TRUE;
    			}
    		}
    		if(option_non_repertorie == FALSE )
    		{
    			My_Error();
    			printf("Aide: verifier la syntaxe apres [OPTION] ou option non repertorié\n");
    			//exit(1);
    		}
    	}
    	return 0;
    }
     
    int grep_standard(char *line,const int taille,t_parametre *c_parametre)
    {
     
    	int i = 0,j = 0;
     
    	for(i = 0;line[i];i++)
    	{
    		if(line[i] == c_parametre->str_cmd[1][0])
    		{
    			for(j = 0; c_parametre->str_cmd[1][j];j++)
    			{
    				if(line[i+j] == c_parametre->str_cmd[1][j]&&c_parametre->str_cmd[1][j])
    				{
    					if(c_parametre->str_cmd[1][strlen(c_parametre->str_cmd[1])-1] ==line[i+j])
    					{
    						printf("%s\n",line);
    						break;
    					}
     
    				}
    			}
    		}
    	}
    }
     
    int grep_whith_upper_case(char *line,const int taille,t_parametre *c_parametre)
    {
     
    	int i = 0,j = 0;
    	for(i;line[i];i+=1)
    	{
    		if(line[i] >= 'a' && line [i]<='z')
    		{
    			line[i] -=32;
    		}
    		if(c_parametre->str_cmd[1][i]>= 'a' &&c_parametre->str_cmd[1][i]<='z' )
    		{
    			c_parametre->str_cmd[1][i] -=32;
    		}
    	}
     
    	for(i = 0;line[i];i++)
    	{
    		if(line[i] == c_parametre->str_cmd[1][0])
    		{
    			for(j = 0; c_parametre->str_cmd[1][j];j++)
    			{
    				if(line[i+j] == c_parametre->str_cmd[1][j]&&c_parametre->str_cmd[1][j])
    				{
    					if(c_parametre->str_cmd[1][strlen(c_parametre->str_cmd[1])-1] ==line[i+j])
    					{
    						printf("%s\n",line);
    						break;
    					}
     
    				}
    			}
    		}
    	}
    }
    c'est dans
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    int read_file(t_parametre *c_parametre,FILE *file)
    {
    	char temp[1000];
    	while(fgets(temp,1000,file)!= NULL)
    	{
    		if(c_parametre->option[3] == TRUE) // exemple d'appel d'option
    		{
    			grep_standard(temp,strlen(temp),c_parametre) ;
    		}
    	}
    }
    que j'essaie d'appeler les fonctions ... comment les oprganiser proprements ....

  2. #2
    Nouveau membre du Club
    Homme Profil pro
    Etudiant En dev jeux video ESGI. Dev c/c++
    Inscrit en
    Novembre 2012
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Vietnam

    Informations professionnelles :
    Activité : Etudiant En dev jeux video ESGI. Dev c/c++

    Informations forums :
    Inscription : Novembre 2012
    Messages : 63
    Points : 38
    Points
    38
    Par défaut
    j'ai oublier de presiser ... de comment je parse et comment j'utilise le resultat.

    ex : grep -i a toto.txt

    cela nous fait un argv = [ ][ - ][ a ][ t ][ ][ ]
    [ ][ i ][ ][ o ][ ][ ]
    [ ][ ][ ][ t ][ ][ ]
    [ ][ ][ ][ o ][ ][ ] etc

    donc le parseur va parcourir la premiere ligne s'il rencontre un '-' il va s'arreter et stocker le prochain caractere de la colonne correspondante et s'ignaler sa presence dans un tableau booleen qui est present dans la structure. apres bien sur verifier que l'option choisi par l'utilisateur est bien present dans notre code

    voici un exemple du tableau contenant les option normale,ent implemente
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char option[] = {'E','F','G','i',0}
    donc on aura juste à verifier si le caractere derriere le '-' est present dans cette chaine de caractere....

    apres ... s'il le parseur stockera toute chaine de caractere qui ne possede pas de '-' dans la structure.

    Apres le chargement du fichier ... le programme aura juste à parcourir le tableau de booleen pour appeler les fonction_opt ... voila

  3. #3
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 195
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 195
    Points : 17 163
    Points
    17 163
    Par défaut
    un bon point de départ, c'est la liste de pointeur de fonction.

    L'idée est d'avoir une liste pour chaque genre d'option, et une structure pour chacune. Sachant qu'a chaque fois, tu auras un type de pointeur de fonction précis.

    Code types.h : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    typedef int (*filter_t) (togrep_list_t, greped_list_t);
    typedef int (*action_t) ();
    typedef int (*parameter_t) (int value);

    Code listes.h : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    typedef struct filter_option {
        const char* name;
        filter_t filter;
    } filter_option_t;
     
    typedef struct action_option {
        const char* name;
        action_t action;
    } action_option_t;
     
    typedef struct parameter_option {
        const char* name;
        parameter_t parameter;
    } parameter_option_t;

    Code fonctions.h : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    int help();//affiche l'aide
    int version();//affiche la version
     
    int setCaseInsensitive();//affiche la version
    int isCaseInsensitive();//1 si caseInsensitive, 0 otherwise
    //…

    Code fonctions.c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    int version_action(){
    printf("my grep version 1.0");
    return 0;
    }
     
    static int caseInsensitive = 0;
    int setCaseInsensitive(int value) {caseInsensitive = value?1:0;}
    int isCaseInsensitive() {return caseInsensitive;}
     
    //…

    Code main.c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    //à définir dans main
    action_option_t actions[]={
        {"-v", version_action}, {"--version", version},
        {"-h", help_action}, {"--help", help}
    }
     
    parameter_option_t parameters[]={
        {"-i", setCaseInsensitive}
    }
     
    filter_option_t filters[]={}
     
    //si filter_liste_t est une structure de liste de filter_option_t
    filter_liste_t active_filters;

    Il suffira alors de parcourir les bons ensembles, en lisant les champs name, puis en utilisant les parametres et actions, et de stocker les filtres fournis en arguments dans la liste de filtres actifs.

    Le main ressemble alors à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    définir les listes d'options.
    définir les filtres et options par défaut.
     
    lire les options de la ligne de commande.
     
    pour tout fichier du dossier,
        si tous les filtres acceptent le fichier, l'ajouter à la liste de fichier accepté
    afficher la liste des fichiers acceptés
    J'ai omis les includes, les gardes contre les double inclusions, etc.
    ps: une autre représentation visuelle de argv, c'est {"grep" "-i" "a" "toto.txt"}, ou encore {{'g','r','e','p','\0'}, {'-','i','\0'}, {'a','\0'}, {'t', 'o', t', 'o','\0'} }

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Etudiant En dev jeux video ESGI. Dev c/c++
    Inscrit en
    Novembre 2012
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Vietnam

    Informations professionnelles :
    Activité : Etudiant En dev jeux video ESGI. Dev c/c++

    Informations forums :
    Inscription : Novembre 2012
    Messages : 63
    Points : 38
    Points
    38
    Par défaut
    Merci de ta reponse. Mais se que tu me propose de faire ... Je serais Obliger de faire changement majeur de mon de code de base. Je travail en groupe .... je ne peut me permettre sa. Meme si j'en ai envie.

    Mais merci d'avoir pris du temps. Ma question ce pose apres voir fait le parseur et le get_opt comme organiser et comment appeler les differentes fonction-option.

    ps : oui je sais comment on peut reprensenter argv, merci, la representation que j'ai faite etait totalement justifier dans le contexte ou je l'ai mis .

  5. #5
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 195
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 195
    Points : 17 163
    Points
    17 163
    Par défaut
    Est-il jamais trop tard pour corriger des erreurs de choix.

    Comment gérerez-vous les options suivantes:
    • -e PATTERN
    • --exclude=GLOB
    • --exclude-dir=DIR
    • -m NUM, --max-count=NUM
    • -A NUM, --after-context=NUM
    • -B NUM, --before-context=NUM
    • -C NUM, --context=NUM

    Ces options ont un argument, qu'il faut stocker avec l'option. (-e est un filtre, les autres des parametres dans mon illustration)
    je vous épargne -NUM qui est un raccourci de -C NUM et qui permet de lire -1, -2, -17…

    Si vous avez encore un peu de temps, mieux vaut restructurer maintenant pour ne pas pleurer dans toute la suite du projet, parce que vous n'aurez pas les bonnes choses sous la main.

    En informatique, il y a plein de solutions, mais celles qui ont les bonnes structures de données sont faciles à lire, à écrire, à adapter et à expliquer.
    Et j'imagine que vous allez devoir faire une soutenance pour ce projet…

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Etudiant En dev jeux video ESGI. Dev c/c++
    Inscrit en
    Novembre 2012
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Vietnam

    Informations professionnelles :
    Activité : Etudiant En dev jeux video ESGI. Dev c/c++

    Informations forums :
    Inscription : Novembre 2012
    Messages : 63
    Points : 38
    Points
    38
    Par défaut
    Bien sur y'aura une soutenance .....(craintif ...) Les profs aiment nous faire souffrir, ils n'en abusent pas ... surtout si c'est justifier dans le bien de notre formation XD.

    PS: Eviter de me vouvoyer. Je suis pas à l'aise ... On dirait un de mes professeurs ou Le chef de mon chef (je suis alternant).

    Parcontre oui tu à raison, souvent il vaut mieux repartir sur des bonnes bases ... mais la avec le temps qu il nous restent . Avec un groupe qui ne communique pas assez (soit leur adresse mail, telephone ne marchent pas)
    ... ce n'est pas une tres tres bonne idee... sont deja perturbe comme sa ....

  7. #7
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 195
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 195
    Points : 17 163
    Points
    17 163
    Par défaut
    C'était un vous pluriel, destiné à parler de ton groupe de travail.

    La très très bonne idée, ce serait de vous réunir une heure après un cours, et d'en discuter sainement.

    Quite à ce que tu codes une base pour les aider à faire la migration vers le nouveau code.
    Ton prof sera content de voir le travail fourni, et pendant la soutenance, expliquer que vous avez corrigé une architecture initiale inadaptée est un énorme plus.

    Tu n'as pas à avoir peur de la soutenance, il s'agit souvent de vérifier que tout le monde a travaillé, et de voir comment.
    Pour que tout aille bien, sois bio: reste naturel, dis ce que tu as fais, comment et pourquoi.

Discussions similaires

  1. Grep sur plusieurs mots avec option -v
    Par rinuom dans le forum Linux
    Réponses: 4
    Dernier message: 10/09/2008, 12h02
  2. option de grep
    Par salseropom dans le forum Applications et environnements graphiques
    Réponses: 5
    Dernier message: 14/11/2007, 13h04
  3. [propriétés]Option Checked
    Par psl dans le forum Composants VCL
    Réponses: 6
    Dernier message: 22/08/2002, 08h07
  4. Parametrage des options de projet
    Par ares7 dans le forum EDI
    Réponses: 7
    Dernier message: 22/07/2002, 15h33
  5. Vous gerez comment les options d'un programme?
    Par n0n0 dans le forum C++Builder
    Réponses: 5
    Dernier message: 17/05/2002, 13h21

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo