#include "plugin_utils.h"

/* pour le plaisir de fignoler au max,
   il faut faire une routine générique d'analyse
   de paramètres.
   il faudrait utiliser les outils d'expressions
   régulières (regcomp, regexec etc.) mais juste
   pour décoder des associations du type :
   aa=bb (x fois) autant le faire "à la main"
*/
int recherche_valeurs(char **param, long *largeur, long *longueur,
                      long *hauteur,
                      char *buffer_erreur, int maxlen_erreur)
{
    char *curr = *param;
    long tmp;
    long largeur_tmp = -1;
    long longueur_tmp = -1;
    long hauteur_tmp = -1;
    int ok;

    while (1) {

        ok = sscanf(curr, "largeur=%ld ", &tmp);
        if (ok == 1) {
            if (largeur_tmp != -1) {
                snprintf(buffer_erreur, maxlen_erreur,
                         "L'option param:largeur est définie deux fois.\n");
                return -1;
            }
            largeur_tmp = tmp;
            while (*curr != ' ') {
                curr++;
                if (!(*curr)) {
                    break;
                }
            }
            if (!(*curr)) {
                break;
            }
            curr++;
            continue;
        }
        ok = sscanf(curr, "longueur=%ld ", &tmp);
        if (ok == 1) {
            if (longueur_tmp != -1) {
                snprintf(buffer_erreur, maxlen_erreur,
                         "L'option param:longueur est définie deux fois.\n");
                return -1;
            }
            longueur_tmp = tmp;
            while (*curr != ' ') {
                curr++;
                if (!(*curr)) {
                    break;
                }
            }
            if (!(*curr)) {
                break;
            }
            curr++;
            continue;
        }

        ok = sscanf(curr, "hauteur=%ld ", &tmp);
        if (ok == 1) {
            if (hauteur_tmp != -1) {
                snprintf(buffer_erreur, maxlen_erreur,
                         "L'option param:hauteur est définie deux fois.\n");
                return -1;
            }
            hauteur_tmp = tmp;
            while (*curr != ' ') {
                curr++;
                if (!(*curr)) {
                    break;
                }
            }
            if (!(*curr)) {
                break;
            }
            curr++;
            continue;
        }
        /* arrivé ici c'est qu'aucun des paramètres n'a été lu
           => break */
        break;
    }

    *param = curr;

    /* arrivé ici c'est qu'on est arrivé au bout de la chaine */
    if ((largeur_tmp < 0) || (longueur_tmp < 0) || (hauteur_tmp < 0)) {
        snprintf(buffer_erreur, maxlen_erreur,
                 "Dans les options param:xxx, "
                 "il faut définir la largeur, la longueur et la hauteur.\n");
        if (largeur_tmp < 0) {
            strncat(buffer_erreur,
                    "Vous n'avez pas défini param:largeur=xx.\n",
                    maxlen_erreur);
        }
        if (longueur_tmp < 0) {
            strncat(buffer_erreur,
                    "Vous n'avez pas défini param:longueur=xx.\n",
                    maxlen_erreur);
        }
        if (hauteur_tmp < 0) {
            strncat(buffer_erreur,
                    "Vous n'avez pas défini param:hauteur=xx.\n",
                    maxlen_erreur);
        }
        return -1;
    }
    *largeur = largeur_tmp;
    *longueur = longueur_tmp;
    *hauteur = hauteur_tmp;
    return 0;
}

/* voir long commentaire fonction au dessus
   (!) le paramètre **param doit être valide 
       *et* il est modifié pour aller sur le
       début de la paire aa=bb suivante
*/
int decode_assoc(char **param, unsigned long *index, unsigned long *value)
{
    char *curr = *param;
    int ok;

    ok = sscanf(*param, "%lu=%lu ", index, value);
    if (ok != 2) {
        return -1;
    }

    /* Sauter toute la chaine trouvée :
       (1) d'abord aller jusqu'à '=' :
     */
    while (*curr != '=') {
        curr++;
        if (!(*curr)) {
            return -1;
        }
    }
    curr++;
    /* (2) ensuite tant que 'chiffre', passer :
     */
    while (*curr) {
        if (*curr == ' ') {
            /* faire pointer le pointeur en paramètre
               vers la nouvelle chaine association ('xx=yy') */
            *param = (++curr);
            return 0;
        }
        if ((*curr < '0') || (*curr > '9')) {
            return -1;
        }
        curr++;
    }
    /* faire pointeur en paramètre = NULL signifie :
       "plus aucune association de type 'xx=yy' "
     */
    *param = NULL;
    return 0;
}
