| 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 | |