#include <stdio.h>    // pour printf, scanf
#include <stdlib.h>   // pour atoi, exit, malloc (si besoin)
#include <string.h>   // pour strtok, strcmp (si tu découpes l’IP en chaîne)
#include <math.h>     // pour pow() (calcul du nombre d’adresses)
#include <stdint.h>   // pour uint32_t (manipuler l’IP en entier 32 bits proprement)

int main(void){

    while (1)
    {    
        char ip_string[20];
        int mask_int;




        printf("Veuillez rentrer une adresse IP : ");
        scanf("%s", ip_string);

        printf("Veuillez rentrer un mask en notation CIDR (juste le nombre): ");
        scanf("%d", &mask_int);

        printf("IP : %s\n", ip_string);

        int ip[4];

        // traitement de l'IP string pour la transformer en tableau de int afin de pouvoir faire des operations dessus
        char *token = strtok(ip_string, ".");
        int i = 0;
        while (token != NULL && i < 4) {
            ip[i] = atoi(token);  // conversion chaîne → entier
            token = strtok(NULL, ".");
            i++;
        }


        uint32_t ip32 = (ip[0] << 24) | (ip[1] << 16) | (ip[2] << 8) | ip[3];

        uint32_t mask = 0;  // tous les bits à 0

        mask = (0xFFFFFFFF  << (32 - mask_int)); // le 0xFFFFFFFF permet de mettre tt les bits a 1 puis on fait le decalage mais comme taille limite, les 1 en trop sont supprimer car ils sont pousser par les 0 qui rentre


        /* permet d afficher le masque en decimale pointé
        printf("%d %d %d %d",
        (mask >> 24) & 0xFF,   // premier octet
        (mask >> 16) & 0xFF,   // deuxième octet
        (mask >> 8)  & 0xFF,   // troisième octet
        mask & 0xFF);          // quatrième octet

        */


        int nb_adresses = pow(2, (32 - mask_int));

        uint32_t reseau_de_depart = ip32 & mask;

        uint32_t taille_sous_reseau = 1 << (32 - mask_int);

        uint32_t borne_fin = (reseau_de_depart & mask) + (1 << (32 - (mask_int & (~0x7))));


        printf("Voici la liste des sous reseaux pour l'adresse IP : %d.%d.%d.%d et le masque : /%d\n\n", ip[0], ip[1], ip[2], ip[3], mask_int);


        for (uint32_t net = reseau_de_depart; net < borne_fin; net += taille_sous_reseau) {
        printf("%d.%d.%d.%d\n",
            (net >> 24) & 0xFF,
            (net >> 16) & 0xFF,
            (net >> 8) & 0xFF,
            net & 0xFF
        );

        
        }
        printf("\n");
    }

    return 0;
}