66 | | * {{{$@}}} : désigne la cible d'une règle |
67 | | * {{{$<}}} : désigne le premier fichier de la liste des sources d'une règle |
68 | | * {{{$^}}} : désigne la liste des sources d'une règle |
69 | | 1. Donnez une raison à la definition des commandes et parametres au début du Makefile |
70 | | 1. A quoi servent les options -p, -g, -wall, -werror, -ansi |
71 | | 1. Comment demander l'optimisation maximale du compilateur |
72 | | 1. L'option -p est présente dans LDFLAGS et CFLAGS, pourquoi n'est-ce pas le cas de -g |
73 | | 1. Que fait la regle indent ? quelle est la signification des flags utilisés par le programme indent? |
| 66 | * {{{$@}}} : désigne la cible d'une règle. |
| 67 | * {{{$<}}} : désigne le premier fichier de la liste des sources d'une règle. |
| 68 | * {{{$^}}} : désigne la liste des sources d'une règle. |
| 69 | 1. Donnez une raison à la definition des commandes et paramètres au début du Makefile |
| 70 | 1. A quoi servent les options -p, -g, -wall, -werror, -ansi ? |
| 71 | 1. Comment demander l'optimisation maximale du compilateur ? |
| 72 | 1. L'option -p est présente dans LDFLAGS et CFLAGS, pourquoi n'est-ce pas le cas de -g ? |
| 73 | 1. Que fait la regle indent ? quelle est la signification des flags utilisés par le programme indent ? |
| 116 | |
| 117 | == le programme principal : main == |
| 118 | |
| 119 | * A quoi servent les lignes 1, 2 et 11 ? |
| 120 | * Pourquoi inclure {{{stdio.h}}} ici ? |
| 121 | |
| 122 | {{{ |
| 123 | 1 #ifndef _MAIN_H_ |
| 124 | 2 #define _MAIN_H_ |
| 125 | 3 |
| 126 | 4 #include <stdio.h> |
| 127 | 5 |
| 128 | 6 struct mainarg_s |
| 129 | 7 { |
| 130 | 8 FILE *INFILE; |
| 131 | 9 FILE *OUTPUTFILE; |
| 132 | 10 char VERBOSE; |
| 133 | 11 }; |
| 134 | 12 extern struct mainarg_s MAINARG; |
| 135 | 13 |
| 136 | 14 #endif |
| 137 | }}} |
| 138 | |
| 139 | 1. A quoi sert chaque include ? |
| 140 | 1. Pourquoi a-t-on un fichier main.h ? |
| 141 | 1. Expliquez le fonctionnement de la fonction getopt ({{{man 3 getopt}}})[[BR]] |
| 142 | Ajoutez l'option -h qui affiche l'usage du programme et un petit texte de description du comportement (très court, c'est juste pour l'exercice).[[BR]] |
| 143 | Vous ajouterez plus tard l'option -s qui demande les statistiques d'usage de la tables de hachage. |
| 144 | 1. A quoi sert l'appel de return a la fin de la fonction main() ? |
| 145 | 1. Pourquoi y-a-t-il exit() a la fin de la fonction usage() ? |
| 146 | 1. Qu'est ce qu'un appel systeme, en voyez-vous dans ce fichier, si oui lesquels, |
| 147 | citez en d'autres, |
| 148 | 1. Quelle precaution doit on prendre lors de leur utilisation ? |
| 149 | 1. Ou sont definiies les fonctions standards ? |
| 150 | 1. Qu'est-ce qu'un filtre unix ? |
| 151 | 1. Que faut-il faire pour transformer ce programme en filtre ? |
| 152 | |
| 153 | {{{ |
| 154 | 1 #include <stdlib.h> |
| 155 | 2 #include <stdio.h> |
| 156 | 3 #include <getopt.h> |
| 157 | 4 #include "main.h" |
| 158 | 5 #include "count.h" |
| 159 | 6 #include "hte.h" |
| 160 | 7 |
| 161 | 8 struct mainarg_s MAINARG; |
| 162 | 9 |
| 163 | 10 void usage (char *command) |
| 164 | 11 { |
| 165 | 12 printf ("\nStatistique Diverses\n"); |
| 166 | 13 printf ("Usage : %s |
| 167 | 14 [-v] [-o OutFile] InFile\n", command); |
| 168 | 15 printf ("-v verbose mode\n"); |
| 169 | 16 printf ("-o OutFile output file (stdout by default)\n\n"); |
| 170 | 17 exit (EXIT_FAILURE); |
| 171 | 18 } |
| 172 | 19 |
| 173 | 20 void getarg (int argc, char **argv) |
| 174 | 21 { |
| 175 | 22 extern char *optarg; |
| 176 | 23 extern int optind; |
| 177 | 24 char option; |
| 178 | 25 |
| 179 | 26 MAINARG.OUTPUTFILE = NULL; |
| 180 | 27 while ((option = getopt (argc, argv, "vo:")) != EOF) |
| 181 | 28 switch (option) |
| 182 | 29 { |
| 183 | 30 case 'v': |
| 184 | 31 MAINARG.VERBOSE = 1; |
| 185 | 32 fprintf (stderr, "Verbose mode\n"); |
| 186 | 33 break; |
| 187 | 34 |
| 188 | 35 case 'o': |
| 189 | 36 if (MAINARG.VERBOSE) |
| 190 | 37 fprintf (stderr, "Fichier de sortie : %s\n", optarg); |
| 191 | 38 |
| 192 | 39 MAINARG.OUTPUTFILE = fopen (optarg, "w"); |
| 193 | 40 if (MAINARG.OUTPUTFILE == NULL) |
| 194 | 41 { |
| 195 | 42 fprintf (stderr, "%s: %s: \n", argv[0], optarg); |
| 196 | 43 perror ("fopen"); |
| 197 | 44 exit (EXIT_FAILURE); |
| 198 | 45 } |
| 199 | 46 break; |
| 200 | 47 |
| 201 | 48 case '?': |
| 202 | 49 default: |
| 203 | 50 usage (argv[0]); |
| 204 | 51 } |
| 205 | 52 if ((optind + 1) != argc) |
| 206 | 53 { |
| 207 | 54 usage (argv[0]); |
| 208 | 55 } |
| 209 | 56 else |
| 210 | 57 { |
| 211 | 58 if (MAINARG.VERBOSE) |
| 212 | 59 fprintf (stderr, "Fichier d'entrée : %s\n", argv[optind]); |
| 213 | 60 |
| 214 | 61 MAINARG.INFILE = fopen (argv[optind], "r"); |
| 215 | 62 if (MAINARG.INFILE == NULL) |
| 216 | 63 { |
| 217 | 64 fprintf (stderr, "%s: %s ", argv[0], argv[optind]); |
| 218 | 65 perror ("fopen"); |
| 219 | 66 exit (EXIT_FAILURE); |
| 220 | 67 } |
| 221 | 68 if (MAINARG.OUTPUTFILE == NULL) |
| 222 | 69 MAINARG.OUTPUTFILE = stdout; |
| 223 | 70 } |
| 224 | 71 } |
| 225 | 72 |
| 226 | 73 int main (int argc, char **argv) |
| 227 | 74 { |
| 228 | 75 getarg (argc, argv); |
| 229 | 76 count (MAINARG.INFILE); |
| 230 | 77 fclose (MAINARG.OUTPUTFILE); |
| 231 | 78 return EXIT_SUCCESS; |
| 232 | 79 } |
| 233 | }}} |
| 234 | |