je me suis lancé dans le codage d'un logiciel (un eggdrop-like) qui necessite un fichier de configuration.

pour recuperer ces parametres, j'utilise cette fonction:

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
 
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
#define LINESIZE 128
#define MAXLEN 5
#define NBVAR 8
 
typedef struct
{
  char *port_c;
  char *server_c;
  char *nick;
  char *chann;
  char *ident;
  char *realname;
  char *serv_pass;
  char *chan_pass;
} cfgstruct;
 
int rtrcfg (cfgstruct * cfg);
 
int
main()
{
  int cfgctrl;
  cfgstruct cfgparms;
  memset (&cfgparms, 0, sizeof (cfgparms));
  cfgctrl = rtrcfg(&cfgparms);
return EXIT_SUCCESS;
}
 
int
rtrcfg (cfgstruct * cfg)
{
  char varlist[NBVAR][9] =
    { "port", "server", "nick", "channel", "ident", "realname", "serv_pass",
    "chan_pass"
  };
 
  FILE *cfg_file;
  cfg_file = fopen ("dotcfg.dat", "r");
 
  if (cfg_file != NULL)
    {
      char *line = NULL;
      char *lgerline = NULL;
      char *p = NULL;
      int ctr = 1;
      int i;
      line = malloc (ctr * LINESIZE);
      fpos_t laspos;
      memset (&laspos, 0, sizeof (laspos));
      while (fgets (line, ctr * LINESIZE, cfg_file) != NULL)
	{
	  p = strchr (line, '\n');
	  if (p != NULL)
	    {
	      *p = 0;
	      if (fgetpos (cfg_file, &laspos) != 0)
		perror ("file pos!");
	    }
	  else
	    {
	      printf ("reallocating some memory !\n");
	      if (ctr < MAXLEN)
		{
		  ctr++;
		  lgerline = realloc (line, ctr * LINESIZE);
		  if (lgerline != NULL)
		    {
		      line = lgerline;
		      if (fsetpos (cfg_file, &laspos) != 0)
			perror ("setpos failed");
		    }
		  else
		    perror ("couldn't alloc enough memory to line func");
		}
	      else
		printf ("line too long !\n");
	    }
	  p = strchr (line, '=');
	  if (p != NULL)
	    {
	      char *qualif = malloc (p - line);
	      char *param = malloc (strlen (p) - 1);
	      if (qualif != NULL && param != NULL);
	      {
		strncpy (qualif, line, p - line);
		strncpy (param, p + 1, strlen (p) - 1);
		printf ("%s %s \n", qualif, param);
		for (i = 0; i < NBVAR; i++)
		  {
		    if (strncmp (varlist[i], qualif, strlen (qualif) - 1) ==
			0)
		      {
			switch (i)
			  {
			  case 0:
			    cfg->port_c = param;
			  i = NBVAR;
			    break;
			  case 1:
			    cfg->server_c = param;
			  i = NBVAR;
			    break;
			  case 2:
			    cfg->nick = param;
			  i = NBVAR;
			    break;
			  case 3:
			    cfg->chann = param;
			  i = NBVAR;
			    break;
			  case 4:
			    cfg->ident = param;
			  i = NBVAR;
			    break;
			  case 5:
			    cfg->realname = param;
			  i = NBVAR;
			    break;
			  case 6:
			    cfg->serv_pass = param;
			  i = NBVAR;
			    break;
			  case 7:
			    cfg->chan_pass = param;
			  i = NBVAR;
			    break;
			  }
		      }
		  }
	      }
	    }
	}
	free(line);
//needed: test if everything has been allocated ...
    }
return 1;
}
le but est de faire un fichier de config assez facile a faire:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
[irc]
server=irc.quakenet.org
port=6667
channel=#bot
nick=ircybotty
ident=frisky
realname=Ebola's bot
farfelu=pouet
un fichier de config ou l'utilisateur puisse oublier des choses (on mettras les parametres a des valeurs par defaut), ou il puisse mettre des parametres farfelu ... des commentaires sans respecter aucune syntaxe ... (tant qu'il n'y as pas de '=')

breffe, mon probleme :
le switch // case ne me conviens pas, j'aimerais trouver autre chose ... (je trouve pas :X) => lourd de faire evoluer le code pour rajouter par exemple 10 parametres !
je ne vois pas, dans l'etat actuel, comment free param et qualif si le parametre ne correspond a rien et est en derniere position (param => farfelu et qualif => pouet :: ne seras jamais free !): j'ai pensé utilisé un "flag" pour dire affecté (a un element de ma struct) ou pas et donc faire un free si non affecté.

j'ai entendu parlé de hashtables :: mais j'ai rien compris du tout. (mais alors RIEN du tout)
est-ce que ces fameuses hashtables pourrait m'aider dans ce cas?

je me relis ... mais je sais pas si je suis bien clair ... moi je me comprend !
j'espere que vous aussi
merci d'avoir lut jusque ici en tout cas !