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

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

    Logiciel libre diffusé dans le domaine public.


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

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

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

// constantes
#include "graphe.h"

// pour écrire un point directement dans l'image
extern char *image [hauteur];



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

void main (int narg, char *varg [])
{
    char *csv;
    FILE *desccsv;        // descripteur du fichier csv local
    char imgbmp [30];     // chemin d'accès à l'image bmp à créer
    char champ1 [4];      // champ 1 pour la ligne courante du fichier csv
    char champ1_prec [4]; // champ 1 pour la ligne précédente du fichier csv
    char champ_date [11]; // date pour la ligne courante du fichier csv
    char champ_num [5];   // champ contenant un taux de vaccination
    int  doses;           // nombre de doses dans le fichier CSV
    int  pos_x;           // position du jour courant dans le graphique
    int  taux;            // taux de vaccination compté en pixels
    int  i;               // compteur


    // 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)
        {
            // créer l'image de base
            cree_base_image ();

            // préparer un graphique vierge
            init_image ();

            // initialisation
            *champ1_prec = '\0';

            // récupérer le nombre de doses
            doses = (comptechamps (desccsv) - 2) / 2;

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

            // tant que non fin de fichier csv
            while (*champ1)
            {
                // si le champ 1 a changé par rapport à la ligne précédente
                if (strcmp (champ1_prec, champ1) != 0)
                {
                    if (*champ1_prec)
                    {
                        // chemin d'accès au fichier qui va contenir le graphique précédent
                        sprintf (imgbmp, "images/%s-%s.bmp", varg [2], champ1_prec);

                        // générer l'image
                        genimage (imgbmp);
                    }

                    // préparer un graphique vierge pour l'image qui suivra
                    init_image ();

                    // on va sauter la vaccinations de fin décembre 2020
                    do
                    {
                        // lire la date
                        recupchamp (desccsv, champ_date);

                        // aller à la fin de la ligne
                        finligne (desccsv);

                        // récupérer le premier champ de la ligne suivante
                        recupchamp (desccsv, champ1_prec);
                    }
                    // jusque date de 2021
                    while (champ_date [9] == '0');

                    // initialisation axe des x
                    pos_x = p_axe_x + 1;
                }

                // récupérer la date
                recupchamp (desccsv, champ_date);

                // sauter les champs relatifs aux nombres des dose injectées
                for (i = 0; i < doses; i++)
                    sautechamp (desccsv);

                // recupérer et tracer un point pour les différentes courbes
                for (i = 0; i < doses; i++)
                {
                    // récupérer un taux de vaccination
                    recupchamp (desccsv, champ_num);

                    // 150 pixels pour 100 % arondi au pixel le plus proche
                    taux = (atof (champ_num) * haut_graph / 100) + 0.5;

                    // s'il n'est pas à 0
                    if (taux)
                        // rajouter un point de la bonne couleur dans le graphique
                        image [bas_axe_y - taux][pos_x] = i + 4;
                }

                // avancer d'un jour dans le graphique
                pos_x ++;

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

            // terminé avec les fichier csv
            fclose (desccsv);

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

            // générer l'image
            genimage (imgbmp);
        }
        // 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);
}