| 1 | /*filetools.c*/
 | 
|---|
| 2 | 
 | 
|---|
| 3 | #include "filetools.h"
 | 
|---|
| 4 | 
 | 
|---|
| 5 | #define MAX_LENGHT 255
 | 
|---|
| 6 | 
 | 
|---|
| 7 | /******************************************************
 | 
|---|
| 8 |  * NOM:              readINI                          *
 | 
|---|
| 9 |  * SPECIFICATION:                                     *
 | 
|---|
| 10 |  *   retourne la valeur de la cle du                  *
 | 
|---|
| 11 |  *               fichier dont la structure est celle  *
 | 
|---|
| 12 |  *               d'un fichier .ini windows            *
 | 
|---|
| 13 |  * ARGUMENTS:                                         *
 | 
|---|
| 14 |  * >section: le nom de la section sans les crochets   *
 | 
|---|
| 15 |  * >key: nom de la cle de la section                  *
 | 
|---|
| 16 |  * >pStr: pointeur pour mettre le resultat            *
 | 
|---|
| 17 |  *       allocation memoire effectuee                 *
 | 
|---|
| 18 |  * ENVIRONNEMENT:                                     *
 | 
|---|
| 19 |  * VALEUR RETOURNEE:0 si echec 1 si oui               *
 | 
|---|
| 20 |  ******************************************************/
 | 
|---|
| 21 | int
 | 
|---|
| 22 | readINI (char *sectionName, char *pKeyName, char **ppStr, char *fileName)
 | 
|---|
| 23 | {
 | 
|---|
| 24 |   INI *pIni = NULL;
 | 
|---|
| 25 |   SECTION *pSection = NULL;
 | 
|---|
| 26 |   KEY *pKey = NULL;
 | 
|---|
| 27 |   int trouve = 0;
 | 
|---|
| 28 |   char *pSectionName = NULL;
 | 
|---|
| 29 |   int offset = 0;
 | 
|---|
| 30 |   //pStr = resultValue;
 | 
|---|
| 31 |   TRY
 | 
|---|
| 32 |   {
 | 
|---|
| 33 |     trouve = 0;
 | 
|---|
| 34 |     pIni = _loadINI (fileName);
 | 
|---|
| 35 |     /*recherche de la section */
 | 
|---|
| 36 |     offset = strlen (sectionName) + 3;
 | 
|---|
| 37 |     pSectionName = (char *) m_malloc (sizeof (char) * offset);
 | 
|---|
| 38 |     pSectionName[0] = '[';
 | 
|---|
| 39 |     strcpy (pSectionName + 1, sectionName);
 | 
|---|
| 40 |     pSectionName[strlen (sectionName) + 1] = ']';
 | 
|---|
| 41 |     pSectionName[offset - 1]='\0';
 | 
|---|
| 42 | 
 | 
|---|
| 43 |     pSection = _findSECTION (pIni, pSectionName);
 | 
|---|
| 44 | 
 | 
|---|
| 45 |     if (pSection != NULL)
 | 
|---|
| 46 |       {
 | 
|---|
| 47 |         /*recherche de la cle */
 | 
|---|
| 48 |         pKey = _findKEY (pSection, pKeyName);
 | 
|---|
| 49 |         if (pKey != NULL)
 | 
|---|
| 50 |         {
 | 
|---|
| 51 |           *ppStr = (char *) m_malloc (sizeof (char) * strlen (pKey->value) + 2);
 | 
|---|
| 52 |           strcpy (*ppStr, pKey->value);
 | 
|---|
| 53 |           (*ppStr)[strlen (pKey->value)] = '\0';
 | 
|---|
| 54 |           trouve = 1;
 | 
|---|
| 55 |         }
 | 
|---|
| 56 |       }
 | 
|---|
| 57 |   }
 | 
|---|
| 58 |   CATCH (ERR_FOPEN)
 | 
|---|
| 59 |   {
 | 
|---|
| 60 |     printf ("impossible d'ouvrir le fichier %s\n", fileName);
 | 
|---|
| 61 |     ppStr = NULL;
 | 
|---|
| 62 |   }
 | 
|---|
| 63 |   CATCH (ERR_MALLOC)
 | 
|---|
| 64 |   {
 | 
|---|
| 65 |     perror ("Probleme d'allocation memoire");
 | 
|---|
| 66 |     exit (EXIT_FAILURE);
 | 
|---|
| 67 |   }  
 | 
|---|
| 68 |   ENDTRY;
 | 
|---|
| 69 |   
 | 
|---|
| 70 |   
 | 
|---|
| 71 |   return trouve;
 | 
|---|
| 72 | }
 | 
|---|
| 73 | 
 | 
|---|
| 74 | /******************************************************
 | 
|---|
| 75 |  * NOM:                delINI                         *
 | 
|---|
| 76 |  * SPECIFICATION:                                     *
 | 
|---|
| 77 |  *  seule la cle de la section est supprimee          *
 | 
|---|
| 78 |  *  si la section est vide, elle est supprimee        *
 | 
|---|
| 79 |  * ARGUMENTS:                                         *
 | 
|---|
| 80 |  * >section: le nom de la section sans les crochets   *
 | 
|---|
| 81 |  * >key: nom de la cle de la section                  *
 | 
|---|
| 82 |  * >pStr: pointeur pour mettre la valeur de la cle    *
 | 
|---|
| 83 |  *       avant sa suppression                         *
 | 
|---|
| 84 |  *       allocation memoire effectuee                 *
 | 
|---|
| 85 |  * ENVIRONNEMENT:                                     *
 | 
|---|
| 86 |  * VALEUR RETOURNEE:                                  *
 | 
|---|
| 87 |  * 1 si reussite de la suppression, 0 sinon           *
 | 
|---|
| 88 |  ******************************************************/
 | 
|---|
| 89 | int
 | 
|---|
| 90 | delINI (char *sectionName, char *pKeyName, char **ppStr, char *fileName)
 | 
|---|
| 91 | {
 | 
|---|
| 92 |   INI *pIni = NULL;
 | 
|---|
| 93 |   SECTION *pSection = NULL;
 | 
|---|
| 94 |   KEY *pKey = NULL;
 | 
|---|
| 95 |   int del = 0;
 | 
|---|
| 96 |   char *pSectionName = NULL;
 | 
|---|
| 97 |   int offset = 0;
 | 
|---|
| 98 |   //pStr = resultValue;
 | 
|---|
| 99 |   TRY
 | 
|---|
| 100 |   {
 | 
|---|
| 101 | 
 | 
|---|
| 102 |     pIni = _loadINI (fileName);
 | 
|---|
| 103 |     /*recherche de la section */
 | 
|---|
| 104 |     offset = strlen (sectionName) + 3;
 | 
|---|
| 105 |     pSectionName = (char *) m_malloc (sizeof (char) * offset);
 | 
|---|
| 106 |     pSectionName[0] = '[';
 | 
|---|
| 107 |     strcpy (pSectionName + 1, sectionName);
 | 
|---|
| 108 |     pSectionName[strlen (sectionName) + 1] = ']';
 | 
|---|
| 109 |     pSectionName[offset - 1];
 | 
|---|
| 110 | 
 | 
|---|
| 111 |     pSection = _findSECTION (pIni, pSectionName);
 | 
|---|
| 112 | 
 | 
|---|
| 113 |     if (pSection != NULL)
 | 
|---|
| 114 |       {
 | 
|---|
| 115 |         if (pKeyName == NULL)
 | 
|---|
| 116 |           {
 | 
|---|
| 117 |             /*on supprime toute la section */
 | 
|---|
| 118 | 
 | 
|---|
| 119 |             pKey = _lastKEY (pSection);
 | 
|---|
| 120 |             while (pKey != NULL)
 | 
|---|
| 121 |               {
 | 
|---|
| 122 |                 _delKEY (pKey);
 | 
|---|
| 123 |                 pKey = _lastKEY (pSection);
 | 
|---|
| 124 |               }
 | 
|---|
| 125 |             _delSECTION (pSection);
 | 
|---|
| 126 |             del = 1;
 | 
|---|
| 127 |           }
 | 
|---|
| 128 |         else
 | 
|---|
| 129 |           {
 | 
|---|
| 130 |             /*recherche de la cle si indiquee */
 | 
|---|
| 131 |             pKey = _findKEY (pSection, pKeyName);
 | 
|---|
| 132 |             if (pKey != NULL)
 | 
|---|
| 133 |               {
 | 
|---|
| 134 |                 (*ppStr) =
 | 
|---|
| 135 |                   (char *) m_malloc (sizeof (char) * strlen (pKey->value) +
 | 
|---|
| 136 |                                      2);
 | 
|---|
| 137 |                 strcpy (*ppStr, pKey->value);
 | 
|---|
| 138 |                 (*ppStr)[strlen (pKey->value)] = '\0';
 | 
|---|
| 139 |                 if (_delKEY (pKey))
 | 
|---|
| 140 |                   {
 | 
|---|
| 141 |                     /*si la cle supprimee etait la derniere de la section */
 | 
|---|
| 142 |                     _delSECTION (pSection);
 | 
|---|
| 143 |                   }
 | 
|---|
| 144 |                 del = 1;
 | 
|---|
| 145 |               }
 | 
|---|
| 146 |           }
 | 
|---|
| 147 |       }
 | 
|---|
| 148 |     if (del)
 | 
|---|
| 149 |       {
 | 
|---|
| 150 |         _saveINI (pIni);
 | 
|---|
| 151 |       }
 | 
|---|
| 152 |   }
 | 
|---|
| 153 |   CATCH (ERR_FOPEN)
 | 
|---|
| 154 |   {
 | 
|---|
| 155 |     printf ("impossible d'ouvrir le fichier %s\n", fileName);
 | 
|---|
| 156 |     (*ppStr) = NULL;
 | 
|---|
| 157 |   }
 | 
|---|
| 158 |   CATCH (ERR_MALLOC)
 | 
|---|
| 159 |   {
 | 
|---|
| 160 |     perror ("Probleme d'allocation memoire");
 | 
|---|
| 161 |     exit (EXIT_FAILURE);
 | 
|---|
| 162 |   }
 | 
|---|
| 163 |   ENDTRY;
 | 
|---|
| 164 | 
 | 
|---|
| 165 |   return del;
 | 
|---|
| 166 | }
 | 
|---|
| 167 | 
 | 
|---|
| 168 | /******************************************************
 | 
|---|
| 169 |  * NOM:                writeINI                       *
 | 
|---|
| 170 |  * SPECIFICATION:                                     *
 | 
|---|
| 171 |  *  si la section n'existe pas elle est cree          *
 | 
|---|
| 172 |  *  si la cle n'existe pas elle est cree              *
 | 
|---|
| 173 |  *  et la valeur de la cle est initialisee            *
 | 
|---|
| 174 |  *  sinon la cle existante de la section existante est*
 | 
|---|
| 175 |  *  mise a jour                                       * 
 | 
|---|
| 176 |  * ARGUMENTS:                                         *
 | 
|---|
| 177 |  * ENVIRONNEMENT:                                     *
 | 
|---|
| 178 |  * VALEUR RETOURNEE:                                  *
 | 
|---|
| 179 |  *  NULL si echec ou keyValue si reussite             *
 | 
|---|
| 180 |  ******************************************************/
 | 
|---|
| 181 | char *
 | 
|---|
| 182 | writeINI (char *sectionName, char *keyName, char *keyValue, char *fileName)
 | 
|---|
| 183 | {
 | 
|---|
| 184 |   char *pSectionName = NULL;
 | 
|---|
| 185 |   char *pKeyName = NULL;
 | 
|---|
| 186 |   char *pKeyValue = NULL;
 | 
|---|
| 187 |   INI *pIni = NULL;
 | 
|---|
| 188 |   SECTION *pSection = NULL;
 | 
|---|
| 189 |   KEY *pKey = NULL;
 | 
|---|
| 190 |   TRY
 | 
|---|
| 191 |   {
 | 
|---|
| 192 |     pKeyName = (char *) m_malloc (sizeof (char) * strlen (keyName) + 1);
 | 
|---|
| 193 |     pSectionName =
 | 
|---|
| 194 |       (char *) m_malloc (sizeof (char) * strlen (sectionName) + 3);
 | 
|---|
| 195 |     if (keyValue != NULL)
 | 
|---|
| 196 |       {
 | 
|---|
| 197 |         pKeyValue = (char *) m_malloc (sizeof (char) * strlen (keyValue) + 1);
 | 
|---|
| 198 |         strcpy (pKeyValue, keyValue);
 | 
|---|
| 199 |         pKeyValue[strlen (keyValue)] = '\0';
 | 
|---|
| 200 |       }
 | 
|---|
| 201 |     else
 | 
|---|
| 202 |       {
 | 
|---|
| 203 |         pKeyValue = (char *) m_malloc (sizeof (char));
 | 
|---|
| 204 |         pKeyValue[0] = '\0';
 | 
|---|
| 205 |       }
 | 
|---|
| 206 |     strcpy (pKeyName, keyName);
 | 
|---|
| 207 |     pSectionName[0] = '[';
 | 
|---|
| 208 |     strcpy (pSectionName + 1, sectionName);
 | 
|---|
| 209 |     pSectionName[strlen (sectionName) + 1] = ']';
 | 
|---|
| 210 |     pSectionName[strlen (sectionName) + 2] = '\0';
 | 
|---|
| 211 |     /*chargement */
 | 
|---|
| 212 |     pIni = _loadINI (fileName);
 | 
|---|
| 213 | 
 | 
|---|
| 214 |   }
 | 
|---|
| 215 |   CATCH (ERR_FOPEN)
 | 
|---|
| 216 |   {
 | 
|---|
| 217 |     printf ("Erreur en ouvrant le fichier .ini:%s\n", fileName);
 | 
|---|
| 218 |     exit (EXIT_FAILURE);
 | 
|---|
| 219 |   }
 | 
|---|
| 220 |   CATCH (ERR_MALLOC)
 | 
|---|
| 221 |   {
 | 
|---|
| 222 |     perror ("Probleme d'allocation memoire");
 | 
|---|
| 223 |     exit (EXIT_FAILURE);
 | 
|---|
| 224 |   }
 | 
|---|
| 225 |   ENDTRY;
 | 
|---|
| 226 | 
 | 
|---|
| 227 |   /*recherche de la section */
 | 
|---|
| 228 |   pSection = _findSECTION (pIni, pSectionName);
 | 
|---|
| 229 |   /*recherche de la cle */
 | 
|---|
| 230 |   if (pSection != NULL)
 | 
|---|
| 231 |     {
 | 
|---|
| 232 |       pKey = _findKEY (pSection, pKeyName);
 | 
|---|
| 233 |       if (pKey != NULL)
 | 
|---|
| 234 |         {
 | 
|---|
| 235 |           pKey->value =
 | 
|---|
| 236 |             (char *) realloc (pKey->value,
 | 
|---|
| 237 |                               sizeof (char) * strlen (pKeyName) + 1);
 | 
|---|
| 238 |           if (pKey->value == NULL)
 | 
|---|
| 239 |             {
 | 
|---|
| 240 |               perror ("probleme de reallocation memoire");
 | 
|---|
| 241 |               exit (EXIT_FAILURE);
 | 
|---|
| 242 |             }
 | 
|---|
| 243 |           strcpy (pKey->value, pKeyValue);
 | 
|---|
| 244 |         }
 | 
|---|
| 245 |       else
 | 
|---|
| 246 |         {
 | 
|---|
| 247 |           /*cle pas trouve dans la section, on ajoute la cle a la section */
 | 
|---|
| 248 |           pKey = _newKEY (pKeyName, pKeyValue);
 | 
|---|
| 249 |           _addKEY (pSection, pKey);
 | 
|---|
| 250 |         }
 | 
|---|
| 251 |     }
 | 
|---|
| 252 |   else
 | 
|---|
| 253 |     {
 | 
|---|
| 254 |       /*section pas trouve, on la cree avec sa cle */
 | 
|---|
| 255 |       pSection = _newSECTION (pSectionName);
 | 
|---|
| 256 |       _addSECTION (pIni, pSection);
 | 
|---|
| 257 |       pKey = _newKEY (pKeyName, pKeyValue);
 | 
|---|
| 258 |       _addKEY (pSection, pKey);
 | 
|---|
| 259 | 
 | 
|---|
| 260 |     }
 | 
|---|
| 261 |   TRY
 | 
|---|
| 262 |   {
 | 
|---|
| 263 | 
 | 
|---|
| 264 |     /*sauvegarde */
 | 
|---|
| 265 |     _saveINI (pIni);
 | 
|---|
| 266 | 
 | 
|---|
| 267 |   }
 | 
|---|
| 268 |   CATCH (ERR_FOPEN)
 | 
|---|
| 269 |   {
 | 
|---|
| 270 |     printf ("erruer sur le fichier %s", pIni->fileName);
 | 
|---|
| 271 |   }
 | 
|---|
| 272 |   ENDTRY;
 | 
|---|
| 273 | 
 | 
|---|
| 274 |   /*nettoyage */
 | 
|---|
| 275 | 
 | 
|---|
| 276 |   free (pIni);
 | 
|---|
| 277 |   free (pSection);
 | 
|---|
| 278 |   free (pKey);
 | 
|---|
| 279 |   free (pKeyName);
 | 
|---|
| 280 |   free (pSectionName);
 | 
|---|
| 281 |   pIni = NULL;
 | 
|---|
| 282 |   pKeyName = NULL;
 | 
|---|
| 283 |   pSectionName = NULL;
 | 
|---|
| 284 |   return pKeyValue;
 | 
|---|
| 285 | }
 | 
|---|
| 286 | 
 | 
|---|
| 287 | /******************************************************
 | 
|---|
| 288 |  * NOM:                                               *
 | 
|---|
| 289 |  *                 _delKEY                            *
 | 
|---|
| 290 |  * SPECIFICATION:                                     *
 | 
|---|
| 291 |  * ARGUMENTS:                                         *
 | 
|---|
| 292 |  * ENVIRONNEMENT:                                     *
 | 
|---|
| 293 |  * VALEUR RETOURNEE:                                  *
 | 
|---|
| 294 |  *  1 si derniere cellule, 0 sinon, -1 si probleme    *
 | 
|---|
| 295 |  ******************************************************/
 | 
|---|
| 296 | int
 | 
|---|
| 297 | _delKEY (KEY * pKey)
 | 
|---|
| 298 | {
 | 
|---|
| 299 |   int result = 0;
 | 
|---|
| 300 |   if (pKey != NULL)
 | 
|---|
| 301 |     {
 | 
|---|
| 302 |       /*la cle n'est pas la premiere */
 | 
|---|
| 303 |       if (pKey->prev != pKey)
 | 
|---|
| 304 |         {
 | 
|---|
| 305 |           if (pKey->next != pKey)
 | 
|---|
| 306 |             {
 | 
|---|
| 307 |               /*la cle n'est pas la derniere */
 | 
|---|
| 308 |               pKey->prev->next = pKey->next;
 | 
|---|
| 309 |             }
 | 
|---|
| 310 |           else
 | 
|---|
| 311 |             {
 | 
|---|
| 312 |               result = 1;
 | 
|---|
| 313 |               pKey->prev->next = pKey->prev;
 | 
|---|
| 314 |             }
 | 
|---|
| 315 |         }
 | 
|---|
| 316 |       else
 | 
|---|
| 317 |         {
 | 
|---|
| 318 |           if (pKey->next != pKey)
 | 
|---|
| 319 |             {
 | 
|---|
| 320 |               /*la cle n'est pas non plus la derniere */
 | 
|---|
| 321 |               pKey->parent->fils = pKey->next;
 | 
|---|
| 322 |             }
 | 
|---|
| 323 |           else
 | 
|---|
| 324 |             {
 | 
|---|
| 325 |               result = 1;
 | 
|---|
| 326 |               pKey->parent->fils = NULL;
 | 
|---|
| 327 |             }
 | 
|---|
| 328 |         }
 | 
|---|
| 329 |       _freeKEY (pKey);
 | 
|---|
| 330 |       return result;
 | 
|---|
| 331 |     }
 | 
|---|
| 332 |   else
 | 
|---|
| 333 |     {
 | 
|---|
| 334 |       result = -1;
 | 
|---|
| 335 |       return result;
 | 
|---|
| 336 |     }
 | 
|---|
| 337 | }
 | 
|---|
| 338 | 
 | 
|---|
| 339 | 
 | 
|---|
| 340 | /******************************************************
 | 
|---|
| 341 |  * NOM:                                               *
 | 
|---|
| 342 |  *                 _delSECTION                        *
 | 
|---|
| 343 |  * SPECIFICATION:                                     *
 | 
|---|
| 344 |  * ARGUMENTS:                                         *
 | 
|---|
| 345 |  * ENVIRONNEMENT:                                     *
 | 
|---|
| 346 |  * VALEUR RETOURNEE:                                  *
 | 
|---|
| 347 |  *  pointeur sur la section                           *
 | 
|---|
| 348 |  ******************************************************/
 | 
|---|
| 349 | int
 | 
|---|
| 350 | _delSECTION (SECTION * pSection)
 | 
|---|
| 351 | {
 | 
|---|
| 352 |   if (pSection != NULL)
 | 
|---|
| 353 |     {
 | 
|---|
| 354 |       /*la cle n'est pas la premiere */
 | 
|---|
| 355 |       if (pSection->prev != pSection)
 | 
|---|
| 356 |         {
 | 
|---|
| 357 |           /*la cle n'est pas la derniere */
 | 
|---|
| 358 |           if (pSection->next != pSection)
 | 
|---|
| 359 |             {
 | 
|---|
| 360 |               pSection->prev->next = pSection->next;
 | 
|---|
| 361 |             }
 | 
|---|
| 362 |           else
 | 
|---|
| 363 |             {
 | 
|---|
| 364 |               pSection->prev->next = pSection->prev;
 | 
|---|
| 365 |             }
 | 
|---|
| 366 |         }
 | 
|---|
| 367 |       else
 | 
|---|
| 368 |         {
 | 
|---|
| 369 |           /*la cle n'estpas nonplus la derniere */
 | 
|---|
| 370 |           if (pSection->next != pSection)
 | 
|---|
| 371 |             {
 | 
|---|
| 372 |               pSection->parent->fils = pSection->next;
 | 
|---|
| 373 |               pSection->next->prev = pSection->next;
 | 
|---|
| 374 |             }
 | 
|---|
| 375 |           else
 | 
|---|
| 376 |             {
 | 
|---|
| 377 |               pSection->parent->fils = NULL;
 | 
|---|
| 378 |             }
 | 
|---|
| 379 |         }
 | 
|---|
| 380 |       _freeSECTION (pSection);
 | 
|---|
| 381 |       return 1;
 | 
|---|
| 382 |     }
 | 
|---|
| 383 |   else
 | 
|---|
| 384 |     {
 | 
|---|
| 385 |       return 0;
 | 
|---|
| 386 |     }
 | 
|---|
| 387 | }
 | 
|---|
| 388 | 
 | 
|---|
| 389 | /************************
 | 
|---|
| 390 |  * liberation memoire   *
 | 
|---|
| 391 |  ************************/
 | 
|---|
| 392 | void
 | 
|---|
| 393 | _freeKEY (KEY * pKey)
 | 
|---|
| 394 | {
 | 
|---|
| 395 |   if (pKey != NULL)
 | 
|---|
| 396 |     {
 | 
|---|
| 397 |       pKey->parent = NULL;
 | 
|---|
| 398 |       pKey->next = NULL;
 | 
|---|
| 399 |       pKey->prev = NULL;
 | 
|---|
| 400 |       if (pKey->value != NULL)
 | 
|---|
| 401 |         {
 | 
|---|
| 402 |           free (pKey->value);
 | 
|---|
| 403 |         }
 | 
|---|
| 404 |       if (pKey->name != NULL)
 | 
|---|
| 405 |         {
 | 
|---|
| 406 |           free (pKey->name);
 | 
|---|
| 407 |         }
 | 
|---|
| 408 |       free (pKey);
 | 
|---|
| 409 |     }
 | 
|---|
| 410 | }
 | 
|---|
| 411 | void
 | 
|---|
| 412 | _freeSECTION (SECTION * pSection)
 | 
|---|
| 413 | {
 | 
|---|
| 414 |   if (pSection != NULL)
 | 
|---|
| 415 |     {
 | 
|---|
| 416 |       pSection->parent = NULL;
 | 
|---|
| 417 |       pSection->next = NULL;
 | 
|---|
| 418 |       pSection->prev = NULL;
 | 
|---|
| 419 |       if (pSection->name != NULL)
 | 
|---|
| 420 |         {
 | 
|---|
| 421 |           free (pSection->name);
 | 
|---|
| 422 |         }
 | 
|---|
| 423 |       free (pSection);
 | 
|---|
| 424 |     }
 | 
|---|
| 425 | }
 | 
|---|
| 426 | 
 | 
|---|
| 427 | /******************************************************
 | 
|---|
| 428 |  * NOM:                                               *
 | 
|---|
| 429 |  *                 _newKEY                            *
 | 
|---|
| 430 |  * SPECIFICATION:                                     *
 | 
|---|
| 431 |  *  allocation d'une nouvelle cle                     *
 | 
|---|
| 432 |  * ARGUMENTS:                                         *
 | 
|---|
| 433 |  * le nom et la valeur de la cle                      *
 | 
|---|
| 434 |  * ENVIRONNEMENT:                                     *
 | 
|---|
| 435 |  * VALEUR RETOURNEE:                                  *
 | 
|---|
| 436 |  * pointeur sur la cle, NULL sinon                    *
 | 
|---|
| 437 |  ******************************************************/
 | 
|---|
| 438 | KEY *
 | 
|---|
| 439 | _newKEY (char *pKeyName, char *pKeyValue)
 | 
|---|
| 440 | {
 | 
|---|
| 441 |   KEY *pKey;
 | 
|---|
| 442 |   TRY
 | 
|---|
| 443 |   {
 | 
|---|
| 444 |     pKey = (KEY *) m_malloc (sizeof (KEY));
 | 
|---|
| 445 | 
 | 
|---|
| 446 |     pKey->name = (char *) m_malloc (sizeof (char) * strlen (pKeyName) + 1);
 | 
|---|
| 447 |     pKey->value = (char *) m_malloc (sizeof (char) * strlen (pKeyValue) + 1);
 | 
|---|
| 448 |   }
 | 
|---|
| 449 |   CATCH (ERR_MALLOC)
 | 
|---|
| 450 |   {
 | 
|---|
| 451 |     perror ("Probleme d'allocation memoire");
 | 
|---|
| 452 |     exit (EXIT_FAILURE);
 | 
|---|
| 453 |   }
 | 
|---|
| 454 |   ENDTRY;
 | 
|---|
| 455 | 
 | 
|---|
| 456 |   strcpy (pKey->name, pKeyName);
 | 
|---|
| 457 |   strcpy (pKey->value, pKeyValue);
 | 
|---|
| 458 |   pKey->parent = NULL;
 | 
|---|
| 459 |   pKey->prev = pKey;
 | 
|---|
| 460 |   pKey->next = pKey;
 | 
|---|
| 461 | 
 | 
|---|
| 462 | 
 | 
|---|
| 463 |   return pKey;
 | 
|---|
| 464 | }
 | 
|---|
| 465 | 
 | 
|---|
| 466 | /******************************************************
 | 
|---|
| 467 |  * NOM:                                               *
 | 
|---|
| 468 |  *                 _newSECTION                        *
 | 
|---|
| 469 |  * SPECIFICATION:                                     *
 | 
|---|
| 470 |  *  allocation d'une nouvelle section                 *
 | 
|---|
| 471 |  * ARGUMENTS:                                         *
 | 
|---|
| 472 |  * le nom de la section                               *
 | 
|---|
| 473 |  * ENVIRONNEMENT:                                     *
 | 
|---|
| 474 |  * VALEUR RETOURNEE:                                  *
 | 
|---|
| 475 |  * pointeur sur la section, NULL sinon                *
 | 
|---|
| 476 |  ******************************************************/
 | 
|---|
| 477 | SECTION *
 | 
|---|
| 478 | _newSECTION (char *pSectionName)
 | 
|---|
| 479 | {
 | 
|---|
| 480 |   SECTION *pSection;
 | 
|---|
| 481 |   TRY
 | 
|---|
| 482 |   {
 | 
|---|
| 483 |     pSection = (SECTION *) m_malloc (sizeof (SECTION));
 | 
|---|
| 484 | 
 | 
|---|
| 485 |     pSection->name =
 | 
|---|
| 486 |       (char *) m_malloc (sizeof (char) * strlen (pSectionName) + 1);
 | 
|---|
| 487 |   }
 | 
|---|
| 488 |   CATCH (ERR_MALLOC)
 | 
|---|
| 489 |   {
 | 
|---|
| 490 |     perror ("Probleme d'allocation memoire");
 | 
|---|
| 491 |     exit (EXIT_FAILURE);
 | 
|---|
| 492 |   }
 | 
|---|
| 493 |   ENDTRY;
 | 
|---|
| 494 | 
 | 
|---|
| 495 |   strcpy (pSection->name, pSectionName);
 | 
|---|
| 496 |   pSection->parent = NULL;
 | 
|---|
| 497 |   pSection->fils = NULL;
 | 
|---|
| 498 |   pSection->prev = pSection;
 | 
|---|
| 499 |   pSection->next = pSection;
 | 
|---|
| 500 |   return pSection;
 | 
|---|
| 501 | }
 | 
|---|
| 502 | 
 | 
|---|
| 503 | /******************************************************
 | 
|---|
| 504 |  * NOM:                                               *
 | 
|---|
| 505 |  *                 _findSECTION                       *
 | 
|---|
| 506 |  * SPECIFICATION:                                     *
 | 
|---|
| 507 |  *  trouver la section dans une struture INI          *
 | 
|---|
| 508 |  * ARGUMENTS:                                         *
 | 
|---|
| 509 |  * la structure INI, le nom de la section avec ses [ ]*
 | 
|---|
| 510 |  * ENVIRONNEMENT:                                     *
 | 
|---|
| 511 |  * VALEUR RETOURNEE:                                  *
 | 
|---|
| 512 |  * pointeur sur la section, NULL sinon                *
 | 
|---|
| 513 |  ******************************************************/
 | 
|---|
| 514 | SECTION *
 | 
|---|
| 515 | _findSECTION (INI * pIni, char *pSectionName)
 | 
|---|
| 516 | {
 | 
|---|
| 517 |   SECTION *pSection = NULL;
 | 
|---|
| 518 |   pSection = pIni->fils;
 | 
|---|
| 519 |   while ((pSection != NULL) && (strcmp (pSection->name, pSectionName) != 0))
 | 
|---|
| 520 |     {
 | 
|---|
| 521 |       if (pSection == pSection->next)
 | 
|---|
| 522 |         {
 | 
|---|
| 523 |           pSection = NULL;
 | 
|---|
| 524 |         }
 | 
|---|
| 525 |       else
 | 
|---|
| 526 |         {
 | 
|---|
| 527 |           pSection = pSection->next;
 | 
|---|
| 528 |         }
 | 
|---|
| 529 |     }
 | 
|---|
| 530 |   return pSection;
 | 
|---|
| 531 | }
 | 
|---|
| 532 | 
 | 
|---|
| 533 | /******************************************************
 | 
|---|
| 534 |  * NOM:                                               *
 | 
|---|
| 535 |  *                 _findKEY                           *
 | 
|---|
| 536 |  * SPECIFICATION:                                     *
 | 
|---|
| 537 |  *  trouver la cle dans une struture SECTION          *
 | 
|---|
| 538 |  * ARGUMENTS:                                         *
 | 
|---|
| 539 |  * la structure SECTION, le nom de la cle             *
 | 
|---|
| 540 |  * ENVIRONNEMENT:                                     *
 | 
|---|
| 541 |  * VALEUR RETOURNEE:                                  *
 | 
|---|
| 542 |  * pointeur sur la cle, NULL sinon                    *
 | 
|---|
| 543 |  ******************************************************/
 | 
|---|
| 544 | KEY *
 | 
|---|
| 545 | _findKEY (SECTION * pSection, char *pKeyName)
 | 
|---|
| 546 | {
 | 
|---|
| 547 |   KEY *pKey = NULL;
 | 
|---|
| 548 |   pKey = pSection->fils;
 | 
|---|
| 549 |   while ((pKey != NULL) && (strcmp (pKey->name, pKeyName) != 0))
 | 
|---|
| 550 |     {
 | 
|---|
| 551 |       if (pKey == pKey->next)
 | 
|---|
| 552 |         {
 | 
|---|
| 553 |           pKey = NULL;
 | 
|---|
| 554 |         }
 | 
|---|
| 555 |       else
 | 
|---|
| 556 |         {
 | 
|---|
| 557 |           pKey = pKey->next;
 | 
|---|
| 558 |         }
 | 
|---|
| 559 |     }
 | 
|---|
| 560 |   return pKey;
 | 
|---|
| 561 | }
 | 
|---|
| 562 | 
 | 
|---|
| 563 | /******************************************************
 | 
|---|
| 564 |  * NOM:                                               *
 | 
|---|
| 565 |  *                 _lastKEY                           *
 | 
|---|
| 566 |  * SPECIFICATION:                                     *
 | 
|---|
| 567 |  *  trouver la derniere cle dans une struture SECTION *
 | 
|---|
| 568 |  * ARGUMENTS:                                         *
 | 
|---|
| 569 |  * la structure SECTION                               *
 | 
|---|
| 570 |  * ENVIRONNEMENT:                                     *
 | 
|---|
| 571 |  * VALEUR RETOURNEE:                                  *
 | 
|---|
| 572 |  * pointeur sur la cle, NULL sinon                    *
 | 
|---|
| 573 |  ******************************************************/
 | 
|---|
| 574 | KEY *
 | 
|---|
| 575 | _lastKEY (SECTION * pSection)
 | 
|---|
| 576 | {
 | 
|---|
| 577 |   KEY *pKey_pred = NULL;
 | 
|---|
| 578 |   KEY *pKey = NULL;
 | 
|---|
| 579 |   pKey = pSection->fils;
 | 
|---|
| 580 |   pKey_pred = pKey;
 | 
|---|
| 581 |   while (pKey != NULL)
 | 
|---|
| 582 |     {
 | 
|---|
| 583 |       pKey_pred = pKey;
 | 
|---|
| 584 |       if (pKey == pKey->next)
 | 
|---|
| 585 |         {
 | 
|---|
| 586 |           pKey = NULL;
 | 
|---|
| 587 |         }
 | 
|---|
| 588 |       else
 | 
|---|
| 589 |         {
 | 
|---|
| 590 |           pKey = pKey->next;
 | 
|---|
| 591 |         }
 | 
|---|
| 592 |     }
 | 
|---|
| 593 |   return pKey_pred;
 | 
|---|
| 594 | }
 | 
|---|
| 595 | 
 | 
|---|
| 596 | /******************************************************
 | 
|---|
| 597 |  * NOM:                                               *
 | 
|---|
| 598 |  *                 _lastSECTION                       *
 | 
|---|
| 599 |  * SPECIFICATION:                                     *
 | 
|---|
| 600 |  *  trouver la derniere section dans une INI          *
 | 
|---|
| 601 |  * ARGUMENTS:                                         *
 | 
|---|
| 602 |  * la structure INI                                   *
 | 
|---|
| 603 |  * ENVIRONNEMENT:                                     *
 | 
|---|
| 604 |  * VALEUR RETOURNEE:                                  *
 | 
|---|
| 605 |  * pointeur sur la section, NULL sinon                *
 | 
|---|
| 606 |  ******************************************************/
 | 
|---|
| 607 | SECTION *
 | 
|---|
| 608 | _lastSECTION (INI * pIni)
 | 
|---|
| 609 | {
 | 
|---|
| 610 |   SECTION *pSection_pred = NULL;
 | 
|---|
| 611 |   SECTION *pSection = NULL;
 | 
|---|
| 612 |   pSection = pIni->fils;
 | 
|---|
| 613 |   pSection_pred = pSection;
 | 
|---|
| 614 |   while (pSection != NULL)
 | 
|---|
| 615 |     {
 | 
|---|
| 616 |       pSection_pred = pSection;
 | 
|---|
| 617 |       if (pSection == pSection->next)
 | 
|---|
| 618 |         {
 | 
|---|
| 619 |           pSection = NULL;
 | 
|---|
| 620 |         }
 | 
|---|
| 621 |       else
 | 
|---|
| 622 |         {
 | 
|---|
| 623 |           pSection = pSection->next;
 | 
|---|
| 624 |         }
 | 
|---|
| 625 |     }
 | 
|---|
| 626 |   return pSection_pred;
 | 
|---|
| 627 | }
 | 
|---|
| 628 | 
 | 
|---|
| 629 | /******************************************************
 | 
|---|
| 630 |  * NOM:                                               *
 | 
|---|
| 631 |  *                 _addSECTION                        *
 | 
|---|
| 632 |  * SPECIFICATION:                                     *
 | 
|---|
| 633 |  *  ajoute une section en derniere place dans une INI *
 | 
|---|
| 634 |  *  la section ne doit pas appartenir a une INI       *
 | 
|---|
| 635 |  * ARGUMENTS:                                         *
 | 
|---|
| 636 |  * la structure INI, la structure SECTION             * 
 | 
|---|
| 637 |  * ENVIRONNEMENT:                                     *
 | 
|---|
| 638 |  * VALEUR RETOURNEE:                                  *
 | 
|---|
| 639 |  * pointeur sur la section, NULL sinon                *
 | 
|---|
| 640 |  ******************************************************/
 | 
|---|
| 641 | SECTION *
 | 
|---|
| 642 | _addSECTION (INI * pIni, SECTION * pSection)
 | 
|---|
| 643 | {
 | 
|---|
| 644 |   SECTION *pSection_last = NULL;
 | 
|---|
| 645 | 
 | 
|---|
| 646 |   if (pSection->parent != NULL)
 | 
|---|
| 647 |     {
 | 
|---|
| 648 |       return NULL;
 | 
|---|
| 649 |     }
 | 
|---|
| 650 |   else
 | 
|---|
| 651 |     {
 | 
|---|
| 652 |       pSection_last = _lastSECTION (pIni);
 | 
|---|
| 653 |       pSection->parent = pIni;
 | 
|---|
| 654 |       if (pSection_last != NULL)
 | 
|---|
| 655 |         {
 | 
|---|
| 656 |           pSection_last->next = pSection;
 | 
|---|
| 657 |           pSection->prev = pSection_last;
 | 
|---|
| 658 |         }
 | 
|---|
| 659 |       else
 | 
|---|
| 660 |         {
 | 
|---|
| 661 |           pIni->fils = pSection;
 | 
|---|
| 662 |         }
 | 
|---|
| 663 |       return pSection;
 | 
|---|
| 664 |     }
 | 
|---|
| 665 | }
 | 
|---|
| 666 | 
 | 
|---|
| 667 | /******************************************************
 | 
|---|
| 668 |  * NOM:                                               *
 | 
|---|
| 669 |  *                 _addKEY                            *
 | 
|---|
| 670 |  * SPECIFICATION:                                     *
 | 
|---|
| 671 |  *  ajoute une cle en derniere place dans une SECTION *
 | 
|---|
| 672 |  *  la section ne doit pas appartenir a une SECTION   *
 | 
|---|
| 673 |  * ARGUMENTS:                                         *
 | 
|---|
| 674 |  * la structure KEY, la structure SECTION             *
 | 
|---|
| 675 |  * ENVIRONNEMENT:                                     *
 | 
|---|
| 676 |  * VALEUR RETOURNEE:                                  *
 | 
|---|
| 677 |  * pointeur sur la cle, NULL sinon                *
 | 
|---|
| 678 |  ******************************************************/
 | 
|---|
| 679 | KEY *
 | 
|---|
| 680 | _addKEY (SECTION * pSection, KEY * pKey)
 | 
|---|
| 681 | {
 | 
|---|
| 682 |   KEY *pKey_last = NULL;
 | 
|---|
| 683 | 
 | 
|---|
| 684 |   if (pKey->parent != NULL)
 | 
|---|
| 685 |     {
 | 
|---|
| 686 |       return NULL;
 | 
|---|
| 687 |     }
 | 
|---|
| 688 |   else
 | 
|---|
| 689 |     {
 | 
|---|
| 690 | 
 | 
|---|
| 691 |       pKey_last = _lastKEY (pSection);
 | 
|---|
| 692 |       pKey->parent = pSection;
 | 
|---|
| 693 |       if (pKey_last != NULL)
 | 
|---|
| 694 |         {
 | 
|---|
| 695 |           pKey_last->next = pKey;
 | 
|---|
| 696 |           pKey->prev = pKey_last;
 | 
|---|
| 697 |         }
 | 
|---|
| 698 |       else
 | 
|---|
| 699 |         {
 | 
|---|
| 700 |           pSection->fils = pKey;
 | 
|---|
| 701 |         }
 | 
|---|
| 702 |       pKey->next = pKey;
 | 
|---|
| 703 |       return pKey;
 | 
|---|
| 704 |     }
 | 
|---|
| 705 | }
 | 
|---|
| 706 | 
 | 
|---|
| 707 | /******************************************************
 | 
|---|
| 708 |  * NOM:                                               *
 | 
|---|
| 709 |  *                 saveINI                            *
 | 
|---|
| 710 |  * SPECIFICATION:                                     *
 | 
|---|
| 711 |  *  sauvegarde de la structure INI dans son fichier   *
 | 
|---|
| 712 |  *  Attention, ecrase l'ancien fichier                *
 | 
|---|
| 713 | * ARGUMENTS:                                         *
 | 
|---|
| 714 | *  pointeur sur la structure INI a sauvegarder       *
 | 
|---|
| 715 | * ENVIRONNEMENT:                                     *
 | 
|---|
| 716 | * VALEUR RETOURNEE:                                  *
 | 
|---|
| 717 | *  -1 si un probleme a eu lieu, 0 sinon              *
 | 
|---|
| 718 | ******************************************************/
 | 
|---|
| 719 | int
 | 
|---|
| 720 | _saveINI (INI * pIni)
 | 
|---|
| 721 | {
 | 
|---|
| 722 |   FILE *pFile = NULL;
 | 
|---|
| 723 |   char *str = NULL;
 | 
|---|
| 724 |   SECTION *pSection_pred = NULL, *pSection = NULL;
 | 
|---|
| 725 |   KEY *pKey_pred = NULL, *pKey = NULL;
 | 
|---|
| 726 |   int offset = 0;
 | 
|---|
| 727 | 
 | 
|---|
| 728 |   pFile = fopen (pIni->fileName, "w");
 | 
|---|
| 729 |   if (pFile == NULL)
 | 
|---|
| 730 |     THROW (ERR_FOPEN);
 | 
|---|
| 731 |   //printf("#SAUVEGARDE Fichier INI#\n");
 | 
|---|
| 732 |   //printf("# %s #\n\n",pIni->fileName);
 | 
|---|
| 733 |   if (pIni->fils != NULL)
 | 
|---|
| 734 |     {
 | 
|---|
| 735 |       pSection = pIni->fils;
 | 
|---|
| 736 |       do
 | 
|---|
| 737 |         {
 | 
|---|
| 738 | 
 | 
|---|
| 739 |           fprintf (pFile, pSection->name);
 | 
|---|
| 740 |           fprintf (pFile, "\n");
 | 
|---|
| 741 |           pKey = pSection->fils;
 | 
|---|
| 742 |           do
 | 
|---|
| 743 |             {
 | 
|---|
| 744 | 
 | 
|---|
| 745 |               offset = strlen (pKey->name) + strlen (pKey->value) + 2;
 | 
|---|
| 746 | 
 | 
|---|
| 747 |               TRY
 | 
|---|
| 748 |               {
 | 
|---|
| 749 |                 str = (char *) m_malloc (sizeof (char) * offset);
 | 
|---|
| 750 |               }
 | 
|---|
| 751 |               CATCH (ERR_MALLOC)
 | 
|---|
| 752 |               {
 | 
|---|
| 753 |                 perror ("probleme d'allocation memoire");
 | 
|---|
| 754 |                 exit (EXIT_FAILURE);
 | 
|---|
| 755 |               }
 | 
|---|
| 756 |               ENDTRY;
 | 
|---|
| 757 |               memset (str, 0, offset);
 | 
|---|
| 758 |               strcpy (str, pKey->name);
 | 
|---|
| 759 |               offset = strlen (pKey->name);
 | 
|---|
| 760 |               strcpy (str + offset, "=");
 | 
|---|
| 761 |               offset = strlen (pKey->name) + 1;
 | 
|---|
| 762 |               strcpy (str + offset, pKey->value);
 | 
|---|
| 763 |               fprintf (pFile, str);
 | 
|---|
| 764 |               fprintf (pFile, "\n");
 | 
|---|
| 765 |               pKey_pred = pKey;
 | 
|---|
| 766 |               pKey = pKey->next;
 | 
|---|
| 767 |               free (str);
 | 
|---|
| 768 |             }
 | 
|---|
| 769 |           while (pKey != pKey_pred);
 | 
|---|
| 770 | 
 | 
|---|
| 771 |           pSection_pred = pSection;
 | 
|---|
| 772 |           pSection = pSection->next;
 | 
|---|
| 773 |         }
 | 
|---|
| 774 |       while (pSection != pSection_pred);
 | 
|---|
| 775 |     }
 | 
|---|
| 776 |   /*nettoyage */
 | 
|---|
| 777 |   fclose (pFile);
 | 
|---|
| 778 | }
 | 
|---|
| 779 | 
 | 
|---|
| 780 | /******************************************************
 | 
|---|
| 781 |  * NOM:                                               *
 | 
|---|
| 782 |  *                  loadINI                           *
 | 
|---|
| 783 |  * SPECIFICATION:                                     *
 | 
|---|
| 784 |  *  Charge le contenu d'un fichier .ini en memoire    *
 | 
|---|
| 785 |  * ARGUMENTS:                                         *
 | 
|---|
| 786 |  *  nom du fichier                                    *
 | 
|---|
| 787 |  * ENVIRONNEMENT:                                     *
 | 
|---|
| 788 |  * VALEUR RETOURNEE:                                  *
 | 
|---|
| 789 |  *  pointeur sur la structure INI contenant le fichier*
 | 
|---|
| 790 |  *  .ini avec les structures decrites dans le .h      *
 | 
|---|
| 791 |  * EXCEPTION:                                         *
 | 
|---|
| 792 |  * ERR_FOPEN, ERR_MALLOC
 | 
|---|
| 793 |  ******************************************************/
 | 
|---|
| 794 | INI *
 | 
|---|
| 795 | _loadINI (char *fileName)
 | 
|---|
| 796 | {
 | 
|---|
| 797 |   FILE *pFile = NULL;
 | 
|---|
| 798 |   char *pBuf;
 | 
|---|
| 799 |   int nbRead = 0;
 | 
|---|
| 800 |   SECTION *pSection = NULL;
 | 
|---|
| 801 |   KEY *pKey = NULL;
 | 
|---|
| 802 | 
 | 
|---|
| 803 |   INI *pIni = NULL;
 | 
|---|
| 804 |   pBuf = (char *) m_malloc (sizeof (char) * MAX_LENGHT);
 | 
|---|
| 805 | 
 | 
|---|
| 806 |   pFile = fopen (fileName, "r");
 | 
|---|
| 807 |   if (pFile == NULL)
 | 
|---|
| 808 |     {
 | 
|---|
| 809 |       pFile = fopen (fileName, "a");
 | 
|---|
| 810 |       if (pFile == NULL)
 | 
|---|
| 811 |         THROW (ERR_FOPEN);      /*encore NULL !!? la! il y a vraiment un probleme !! */
 | 
|---|
| 812 |     }
 | 
|---|
| 813 | 
 | 
|---|
| 814 |   pIni = (INI *) m_malloc (sizeof (INI));
 | 
|---|
| 815 |   pIni->fileName = (char *) m_malloc (sizeof (char) * strlen (fileName) + 1);
 | 
|---|
| 816 |   strcpy (pIni->fileName, fileName);
 | 
|---|
| 817 |   pIni->fils = NULL;
 | 
|---|
| 818 |   /* on lit ligne par ligne */
 | 
|---|
| 819 |   nbRead = readline (pFile, pBuf);
 | 
|---|
| 820 |   while (nbRead != -1)
 | 
|---|
| 821 |     {
 | 
|---|
| 822 | 
 | 
|---|
| 823 |       if ((pBuf[0] == '[') && (pBuf[strlen (pBuf) - 1] == ']'))
 | 
|---|
| 824 |         {
 | 
|---|
| 825 |           /* une section */
 | 
|---|
| 826 |           pSection = NULL;
 | 
|---|
| 827 | 
 | 
|---|
| 828 |           pSection = _newSECTION (pBuf);
 | 
|---|
| 829 |           _addSECTION (pIni, pSection);
 | 
|---|
| 830 |         }
 | 
|---|
| 831 | 
 | 
|---|
| 832 |       /* les cles de la section */
 | 
|---|
| 833 |       while (((nbRead = readline (pFile, pBuf)) !=-1) && (pBuf[0] != '['))
 | 
|---|
| 834 |         {
 | 
|---|
| 835 |           int ind = 0;
 | 
|---|
| 836 |           pKey = NULL;
 | 
|---|
| 837 |           if ((ind = _isKey (pBuf)) >= 0)
 | 
|---|
| 838 |             {
 | 
|---|
| 839 | 
 | 
|---|
| 840 |               char *strName = NULL;
 | 
|---|
| 841 |               strName = (char *) m_malloc (sizeof (char) * ind + 1);
 | 
|---|
| 842 |               strncpy (strName, pBuf, ind);
 | 
|---|
| 843 |               strName[ind] = '\0';
 | 
|---|
| 844 |               pKey = _newKEY (strName, pBuf + ind + 1);
 | 
|---|
| 845 |               _addKEY (pSection, pKey);
 | 
|---|
| 846 |             }
 | 
|---|
| 847 |         }
 | 
|---|
| 848 |     }
 | 
|---|
| 849 | 
 | 
|---|
| 850 |   /*nettoyage */
 | 
|---|
| 851 |   free (pBuf);
 | 
|---|
| 852 |   fclose (pFile);
 | 
|---|
| 853 |   return pIni;
 | 
|---|
| 854 | }
 | 
|---|
| 855 | 
 | 
|---|
| 856 | /******************************************************
 | 
|---|
| 857 |  * NOM:                                               *
 | 
|---|
| 858 |  *                 _isKey                             *
 | 
|---|
| 859 |  * SPECIFICATION:                                     *
 | 
|---|
| 860 |  *  determine si une chaine est une cle valide        *
 | 
|---|
| 861 |  * ARGUMENTS:                                         *
 | 
|---|
| 862 |  *  pointeur sur la chaine                            *
 | 
|---|
| 863 |  * ENVIRONNEMENT:                                     *
 | 
|---|
| 864 |  * VALEUR RETOURNEE:                                  *
 | 
|---|
| 865 |  *  indice du signe '=' si oui, -1 sinon              *
 | 
|---|
| 866 |  ******************************************************/
 | 
|---|
| 867 | int
 | 
|---|
| 868 | _isKey (char *str)
 | 
|---|
| 869 | {
 | 
|---|
| 870 |   int ind = 0;
 | 
|---|
| 871 |   for (ind; (ind < strlen (str)) && (str[ind] != '='); ind++);
 | 
|---|
| 872 |   if (str[ind] == '=')
 | 
|---|
| 873 |     return ind;
 | 
|---|
| 874 |   else
 | 
|---|
| 875 |     return -1;
 | 
|---|
| 876 | }
 | 
|---|
| 877 | 
 | 
|---|
| 878 | 
 | 
|---|
| 879 | /******************************************************
 | 
|---|
| 880 |  * NOM:                                               *
 | 
|---|
| 881 |  *                  _printINI                         *
 | 
|---|
| 882 |  * SPECIFICATION:                                     *
 | 
|---|
| 883 |  * affiche a l'ecran le contenu de structure INI      *
 | 
|---|
| 884 |  * ARGUMENTS:                                         *
 | 
|---|
| 885 |  *  pointeur sur la structure INI                     *
 | 
|---|
| 886 |  * ENVIRONNEMENT:                                     *
 | 
|---|
| 887 |  * VALEUR RETOURNEE:                                  *
 | 
|---|
| 888 |  ******************************************************/
 | 
|---|
| 889 | void
 | 
|---|
| 890 | _printINI (INI * pIni)
 | 
|---|
| 891 | {
 | 
|---|
| 892 |   SECTION *pSection_pred = NULL;
 | 
|---|
| 893 |   SECTION *pSection = NULL;
 | 
|---|
| 894 |   printf ("#Fichier INI#\n");
 | 
|---|
| 895 |   printf ("# %s #\n\n", pIni->fileName);
 | 
|---|
| 896 |   pSection = pIni->fils;
 | 
|---|
| 897 |   if (pSection != NULL)
 | 
|---|
| 898 |     {
 | 
|---|
| 899 |       do
 | 
|---|
| 900 |         {
 | 
|---|
| 901 |           _printSECTION (pSection);
 | 
|---|
| 902 |           pSection_pred = pSection;
 | 
|---|
| 903 |           pSection = pSection->next;
 | 
|---|
| 904 |         }
 | 
|---|
| 905 |       while (pSection != pSection_pred);
 | 
|---|
| 906 |     }
 | 
|---|
| 907 |   printf ("\n#Fin du fichier INI#\n");
 | 
|---|
| 908 | }
 | 
|---|
| 909 | 
 | 
|---|
| 910 | /******************************************************
 | 
|---|
| 911 |  * NOM:                                               *
 | 
|---|
| 912 |  *                  _printSECTION                     *
 | 
|---|
| 913 |  * SPECIFICATION:                                     *
 | 
|---|
| 914 |  * affiche a l'ecran le contenu de structure SECTION  *
 | 
|---|
| 915 |  * ARGUMENTS:                                         *
 | 
|---|
| 916 |  *  pointeur sur la structure SECTION                 *
 | 
|---|
| 917 |  * ENVIRONNEMENT:                                     *
 | 
|---|
| 918 |  * VALEUR RETOURNEE:                                  *
 | 
|---|
| 919 |  ******************************************************/
 | 
|---|
| 920 | void
 | 
|---|
| 921 | _printSECTION (SECTION * pSection)
 | 
|---|
| 922 | {
 | 
|---|
| 923 |   KEY *pKey = NULL;
 | 
|---|
| 924 |   KEY *pKey_pred = NULL;
 | 
|---|
| 925 |   printf ("%s\n", pSection->name);
 | 
|---|
| 926 |   pKey = pSection->fils;
 | 
|---|
| 927 |   if (pKey != NULL)
 | 
|---|
| 928 |     {
 | 
|---|
| 929 |       do
 | 
|---|
| 930 |         {
 | 
|---|
| 931 |           _printKEY (pKey);
 | 
|---|
| 932 |           pKey_pred = pKey;
 | 
|---|
| 933 |           pKey = pKey->next;
 | 
|---|
| 934 |         }
 | 
|---|
| 935 |       while (pKey != pKey_pred);
 | 
|---|
| 936 |     }
 | 
|---|
| 937 | }
 | 
|---|
| 938 | 
 | 
|---|
| 939 | /******************************************************
 | 
|---|
| 940 |  * NOM:                                               *
 | 
|---|
| 941 |  *                  _printKEY                         *
 | 
|---|
| 942 |  * SPECIFICATION:                                     *
 | 
|---|
| 943 |  * affiche a l'ecran le contenu de structure SECTION  *
 | 
|---|
| 944 |  * ARGUMENTS:                                         *
 | 
|---|
| 945 |  *  pointeur sur la structure SECTION                 *
 | 
|---|
| 946 |  * ENVIRONNEMENT:                                     *
 | 
|---|
| 947 |  * VALEUR RETOURNEE:                                  *
 | 
|---|
| 948 |  ******************************************************/
 | 
|---|
| 949 | void
 | 
|---|
| 950 | _printKEY (KEY * pKey)
 | 
|---|
| 951 | {
 | 
|---|
| 952 |   printf ("%s=%s\n", pKey->name, pKey->value);
 | 
|---|
| 953 | }
 | 
|---|
| 954 | 
 | 
|---|
| 955 | /******************************************************
 | 
|---|
| 956 |  * NOM:                                               *
 | 
|---|
| 957 |  *                  printINI                          *
 | 
|---|
| 958 |  * SPECIFICATION:                                     *
 | 
|---|
| 959 |  * affiche a l'ecran le contenu du fichier .ini       *
 | 
|---|
| 960 |  * ARGUMENTS:                                         *
 | 
|---|
| 961 |  *  nom du fichier                                    *
 | 
|---|
| 962 |  * ENVIRONNEMENT:                                     *
 | 
|---|
| 963 |  * VALEUR RETOURNEE:                                  *
 | 
|---|
| 964 |  ******************************************************/
 | 
|---|
| 965 | void
 | 
|---|
| 966 | printINI (char *file)
 | 
|---|
| 967 | {
 | 
|---|
| 968 |   INI *pIni = NULL;
 | 
|---|
| 969 |   TRY
 | 
|---|
| 970 |   {
 | 
|---|
| 971 |     pIni = _loadINI (file);
 | 
|---|
| 972 |   }
 | 
|---|
| 973 |   CATCH (ERR_MALLOC)
 | 
|---|
| 974 |   {
 | 
|---|
| 975 |     printf ("Erreur d'allocation memoire en chargeant le fichier .ini:%s\n",
 | 
|---|
| 976 |             file);
 | 
|---|
| 977 |     exit (EXIT_FAILURE);
 | 
|---|
| 978 |   }
 | 
|---|
| 979 |   CATCH (ERR_FOPEN)
 | 
|---|
| 980 |   {
 | 
|---|
| 981 |     printf ("Erreur en ouvrant le fichier .ini:%s\n", file);
 | 
|---|
| 982 |     exit (EXIT_FAILURE);
 | 
|---|
| 983 |   }
 | 
|---|
| 984 |   ENDTRY;
 | 
|---|
| 985 |   _printINI (pIni);
 | 
|---|
| 986 |   free (pIni);
 | 
|---|
| 987 | }
 | 
|---|
| 988 | 
 | 
|---|
| 989 | /******************************************************
 | 
|---|
| 990 |  * NOM:                 jumpline                      *
 | 
|---|
| 991 |  * SPECIFICATION:                                     *
 | 
|---|
| 992 |  * fonction permettant de sauter des lignes dans le   *
 | 
|---|
| 993 |  * fichier a partir de la position courante dans le   *
 | 
|---|
| 994 |  * fichier                                            *
 | 
|---|
| 995 |  * ARGUMENTS:                                         *
 | 
|---|
| 996 |  * nombre de lignes a saute, pointeur sur le fichier  *
 | 
|---|
| 997 |  * ENVIRONNEMENT:                                     *
 | 
|---|
| 998 |  * VALEUR RETOURNEE: nombre de lignes sautees         *
 | 
|---|
| 999 |  ******************************************************/
 | 
|---|
| 1000 | 
 | 
|---|
| 1001 | int
 | 
|---|
| 1002 | jumpline (int nbline, FILE * pfile)
 | 
|---|
| 1003 | {
 | 
|---|
| 1004 |   int compteur = 0, c;
 | 
|---|
| 1005 | 
 | 
|---|
| 1006 |   while ((compteur < nbline) && ((c = getc (pfile)) != EOF))
 | 
|---|
| 1007 |     {
 | 
|---|
| 1008 |       if (c == '\n')
 | 
|---|
| 1009 |         compteur++;
 | 
|---|
| 1010 |     }
 | 
|---|
| 1011 |   return (compteur);
 | 
|---|
| 1012 | }
 | 
|---|
| 1013 | 
 | 
|---|
| 1014 | /******************************************************
 | 
|---|
| 1015 |  * NOM:                readline                       *
 | 
|---|
| 1016 |  * SPECIFICATION:                                     *
 | 
|---|
| 1017 |  * recupere la ligne courante du fichier et renvoie le*
 | 
|---|
| 1018 |  * nombre de caracteres lus                           *
 | 
|---|
| 1019 |  * ARGUMENTS:                                         *
 | 
|---|
| 1020 |  * pointeur sur le fichier a lire                     *
 | 
|---|
| 1021 |  * pointeur sur le tableau recevant la ligne          *
 | 
|---|
| 1022 |  * ENVIRONNEMENT:                                     *
 | 
|---|
| 1023 |  * VALEUR RETOURNEE:                                  *
 | 
|---|
| 1024 |  * nombre de caracteres lus                           *
 | 
|---|
| 1025 |  ******************************************************/
 | 
|---|
| 1026 | int
 | 
|---|
| 1027 | readline (FILE * pfile, char *tab)
 | 
|---|
| 1028 | {
 | 
|---|
| 1029 |   int nbchar = 0;
 | 
|---|
| 1030 |   char c;
 | 
|---|
| 1031 |   while ((c = getc (pfile)) != '\n')
 | 
|---|
| 1032 |     {
 | 
|---|
| 1033 |       if (c == EOF)
 | 
|---|
| 1034 |         {
 | 
|---|
| 1035 |           break;          
 | 
|---|
| 1036 |         }
 | 
|---|
| 1037 |       tab[nbchar++] = c;
 | 
|---|
| 1038 |     }
 | 
|---|
| 1039 |   tab[nbchar] = '\0';
 | 
|---|
| 1040 |   
 | 
|---|
| 1041 |   while (nbchar>0 && tab[nbchar-1]==' ') { tab[--nbchar] = '\0';}
 | 
|---|
| 1042 |   
 | 
|---|
| 1043 |   while (tab[0]==' ') for (int i=1; i<=nbchar; i++) tab[i-1]=tab[i];
 | 
|---|
| 1044 |   
 | 
|---|
| 1045 |   if (c == EOF) nbchar=-1;
 | 
|---|
| 1046 |   
 | 
|---|
| 1047 |   return (nbchar);
 | 
|---|
| 1048 | }
 | 
|---|
| 1049 | 
 | 
|---|
| 1050 | /******************************************************
 | 
|---|
| 1051 |  * NOM:                m_malloc                       *
 | 
|---|
| 1052 |  * SPECIFICATION:                                     *
 | 
|---|
| 1053 |  *  clone de malloc renvoyant une exception           *
 | 
|---|
| 1054 |  * ARGUMENTS:                                         *
 | 
|---|
| 1055 |  * ENVIRONNEMENT:                                     *
 | 
|---|
| 1056 |  * VALEUR RETOURNEE:                                  *
 | 
|---|
| 1057 |  ******************************************************/
 | 
|---|
| 1058 | void *
 | 
|---|
| 1059 | m_malloc (size_t size)
 | 
|---|
| 1060 | {
 | 
|---|
| 1061 |   void *ptr = malloc (size);
 | 
|---|
| 1062 |   if (ptr == NULL)
 | 
|---|
| 1063 |     THROW (ERR_MALLOC);
 | 
|---|
| 1064 |   else
 | 
|---|
| 1065 |     return ptr;
 | 
|---|
| 1066 | }
 | 
|---|