Code source du fichier src/gen-serie-bargraphes.c

/*
    Fichier gen-serie-bargraphes.c
    Auteur Bernard Chardonneau

    Logiciel libre diffusé dans le domaine public.


    Programme qui génère une série de bargraphes sous la forme d'images bmp
    à partir des données d'un fichier csv issu des données officielles sur
    les taux de vaccination COVID 19 à ce jour en France.
*/

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

// constantes
#include "bargraphe.h"

// bibliothèques de fonctions
#include "trtchamps.h"
#include "entete-bmp.h"
#include "genbargraphe.h"


// programme principal : récupère les données d'un fichier csv et crée les images bmp

void main (int narg, char *varg [])
{
    FILE *desccsv;    // descripteur du fichier csv local
    long posit;       // position dans le fichier csv
    char champ [lgmax_champ + 1]; // champ récupéré dans le fichier csv
    char imgbmp [30]; // nom d'une image bmp
    int  doses;       // nombre de doses dans le fichier CSV
    int  i, j;        // compteurs
    float taux [coul_bgraph - 1]; // taux de vaccination pour chaque dose


    // si appel avec le bon nombre de paramètres
    if (--narg == 2)
    {
        // ouvrir le fichier csv en lecture
        desccsv = fopen (varg [1], "r");

        // si l'ouverture s'est bien passée
        if (desccsv)
        {
            // initialiser l'entête pour les fichier bmp
            gen_entete_bmp (larg_bgraph, haut_bgraph, coul_bgraph);

            // sauter la première ligne du fichier csv
            finligne (desccsv);

            // chercher le nombre de doses prises en compte par le fichier CSV
            posit = ftell (desccsv);
            doses = comptechamps (desccsv) - 2;
            fseek (desccsv, posit, SEEK_SET);

            // au cas ou une dose de moins que de couleurs
            taux [0] = 0;

            // récupérer le début du premier champ de la ligne suivante
            recupchamp (desccsv, champ);

            // tant que non fin de fichier csv
            while (*champ)
            {
                // si champ alphabétique
                if (*champ > '9')
                {
                    // passer le premier caractère en minuscules
                    champ [0] = champ [0] | 0x20;

                    // si le nom du champ commence par "st"
                    if (champ [0] == 's' && champ [1] == 't')
                    {
                        // prendre 2 autres caractères significatifs plus loin
                        champ [1] = champ [3] | 0x20;
                        champ [2] = champ [4];
                    }
                    // sinon si le 2ème caractère est accentué
                    else if (champ [1] & 0x80)
                    {
                        // le mettre en minuscules
                        champ [1] = 'e';

                        // et récupérer le caractère suivant
                        champ [2] = champ [3];
                    }

                    // champ alphabétique limité à 3 caractères
                    champ [3] = '\0';
                }

                // fabriquer le chemin d'accès au fichier image
                sprintf (imgbmp, "images/%s-%s.bmp", varg [2], champ);

                // sauter le champ relatif à la population totale
                sautechamp (desccsv);

                // on va récupérer les taux de vaccination et les mémoriser
                // de la dernière dose à la première (ordre croissant des taux)

                // une dose de vaccin de moins que de couleurs dans le bargraphe
                j = coul_bgraph - 2;

                // tant qu'on n'a pas récupéré tous les taux de vaccination
                for (i = 0; i < doses; i++)
                {
                    // lire le taux dans un champ qui contient aussi le nombre de doses
                    recuptaux (desccsv, champ);

                    // le mémoriser
                    taux [j--] = atof (champ);
                }

                // générer l'image du barregraphe
                cree_bargraphe (imgbmp, taux);

                // récupérer le début du premier champ de la ligne suivante
                recupchamp (desccsv, champ);
            }

            // terminé avec le fichier csv
            fclose (desccsv);
        }
        // sinon
        else
            // message d'erreur
            fprintf (stderr, "Fichier %s inaccessible ou inexistant\n", varg [1]);
    }
    // sinon
    else
        // autre message d'erreur
        fprintf (stderr, "Syntaxe : %s fichier_csv préfixe_images_bmp\n", *varg);
}