#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>
struct IP
{
char ip[20];
int cidr;
unsigned long mask;
unsigned long binary;
};
void ip_init(struct IP *ip, const char *format);
unsigned long ip_to_long(const int ip[4]);
int ip_sort_by_format(const void *e1, const void *e2);
int ip_sort_by_cidr(const void *e1, const void *e2);
void strip(char *input);
int main(void)
{
int N;
struct IP ips[N];
int cur = 0;
for(int i = 0; i < N; i++)
{
char line[20];
strip(line);
ip_init(&ips[cur], line);
cur++;
}
qsort(ips
, cur
, sizeof(struct IP
), ip_sort_by_format
); for(int i = 0; i < cur; i++)
{
for(int j = 0; j < cur; j++)
{
if(i == j)
continue;
if(strcmp(ips
[i
].
ip, "_") == 0) continue;
if(strcmp(ips
[j
].
ip, "_") == 0) continue;
int small = ips[i].cidr < ips[j].cidr ? i : j;
unsigned long masks[2] = {
ips[i].binary & ips[small].mask,
ips[j].binary & ips[small].mask
};
if(masks[0] == masks[1])
}
}
qsort(ips
, cur
, sizeof(struct IP
), ip_sort_by_cidr
); for(int i = 0; i < cur; i++)
if(strcmp(ips
[i
].
ip, "_") != 0)
return 0;
}
void ip_init(struct IP *ip, const char *format)
{
int parts[4];
int cidr;
sscanf(format
, "%d.%d.%d.%d/%d", &parts
[0], &parts
[1], &parts
[2], &parts
[3], &cidr
);
ip->cidr = cidr;
ip->binary = ip_to_long(parts);
ip->mask = ~(1 << (cidr + 1)) << (32 - cidr);
}
unsigned long ip_to_long(const int ip[4])
{
return ip[3] | ip[2] << 8 | ip[1] << 16 | ip[0] << 24;
}
void strip(char *input)
{
if(eol != NULL)
*eol = '\0';
}
int ip_sort_by_format(const void *e1, const void *e2)
{
struct IP *ip1 = (struct IP *) e1;
struct IP *ip2 = (struct IP *) e2;
int diff = (ip1->binary & ip1->mask) - (ip2->binary & ip2->mask);
if(diff == 0)
return ip1->cidr < ip2->cidr;
return diff;
}
int ip_sort_by_cidr(const void *e1, const void *e2)
{
struct IP *ip1 = (struct IP *) e1;
struct IP *ip2 = (struct IP *) e2;
return ip1->cidr - ip2->cidr;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CgkjaW5jbHVkZSA8c3RkbGliLmg+CgkjaW5jbHVkZSA8c3RkYm9vbC5oPgoJI2luY2x1ZGUgPHN0cmluZy5oPgoKCXN0cnVjdCBJUAoJewoJCWNoYXIgaXBbMjBdOwoJCWludCBjaWRyOwoJCXVuc2lnbmVkIGxvbmcgbWFzazsKCQl1bnNpZ25lZCBsb25nIGJpbmFyeTsKCX07Cgl2b2lkIGlwX2luaXQoc3RydWN0IElQICppcCwgY29uc3QgY2hhciAqZm9ybWF0KTsKCXVuc2lnbmVkIGxvbmcgaXBfdG9fbG9uZyhjb25zdCBpbnQgaXBbNF0pOwoJaW50IGlwX3NvcnRfYnlfZm9ybWF0KGNvbnN0IHZvaWQgKmUxLCBjb25zdCB2b2lkICplMik7CglpbnQgaXBfc29ydF9ieV9jaWRyKGNvbnN0IHZvaWQgKmUxLCBjb25zdCB2b2lkICplMik7Cgl2b2lkIHN0cmlwKGNoYXIgKmlucHV0KTsKCWludCBtYWluKHZvaWQpCgl7CgkJaW50IE47CgkJc2NhbmYoIiVkXG4iLCAmTik7CgkJc3RydWN0IElQIGlwc1tOXTsKCQlpbnQgY3VyID0gMDsKCQlmb3IoaW50IGkgPSAwOyBpIDwgTjsgaSsrKQoJCXsKCQkJY2hhciBsaW5lWzIwXTsKCQkJZmdldHMobGluZSwgMjAsIHN0ZGluKTsKCQkJc3RyaXAobGluZSk7CgkJCWlwX2luaXQoJmlwc1tjdXJdLCBsaW5lKTsKCQkJY3VyKys7CgkJfQoKCQlxc29ydChpcHMsIGN1ciwgc2l6ZW9mKHN0cnVjdCBJUCksIGlwX3NvcnRfYnlfZm9ybWF0KTsKCQlmb3IoaW50IGkgPSAwOyBpIDwgY3VyOyBpKyspCgkJewoJCQlmb3IoaW50IGogPSAwOyBqIDwgY3VyOyBqKyspCgkJCXsKCQkJCWlmKGkgPT0gaikKCQkJCQljb250aW51ZTsKCQkJCWlmKHN0cmNtcChpcHNbaV0uaXAsICJfIikgPT0gMCkKCQkJCQljb250aW51ZTsKCQkJCWlmKHN0cmNtcChpcHNbal0uaXAsICJfIikgPT0gMCkKCQkJCQljb250aW51ZTsKCgkJCQlpbnQgc21hbGwgPSBpcHNbaV0uY2lkciA8IGlwc1tqXS5jaWRyID8gaSA6IGo7CgkJCQl1bnNpZ25lZCBsb25nIG1hc2tzWzJdID0gewoJCQkJCWlwc1tpXS5iaW5hcnkgJiBpcHNbc21hbGxdLm1hc2ssCgkJCQkJaXBzW2pdLmJpbmFyeSAmIGlwc1tzbWFsbF0ubWFzawoJCQkJfTsKCgkJCQlpZihtYXNrc1swXSA9PSBtYXNrc1sxXSkKCQkJCQlzdHJjcHkoaXBzW2pdLmlwLCAiXyIpOwoJCQl9CgkJfQoKCQlxc29ydChpcHMsIGN1ciwgc2l6ZW9mKHN0cnVjdCBJUCksIGlwX3NvcnRfYnlfY2lkcik7CgkJZm9yKGludCBpID0gMDsgaSA8IGN1cjsgaSsrKQoJCQlpZihzdHJjbXAoaXBzW2ldLmlwLCAiXyIpICE9IDApCgkJCQlwcmludGYoIiVzXG4iLCBpcHNbaV0uaXApOwoJCXByaW50ZigiXG4iKTsKCgkJcmV0dXJuIDA7Cgl9CgoJdm9pZCBpcF9pbml0KHN0cnVjdCBJUCAqaXAsIGNvbnN0IGNoYXIgKmZvcm1hdCkKCXsKCQlpbnQgcGFydHNbNF07CgkJaW50IGNpZHI7CgkJc3NjYW5mKGZvcm1hdCwgIiVkLiVkLiVkLiVkLyVkIiwgJnBhcnRzWzBdLCAmcGFydHNbMV0sICZwYXJ0c1syXSwgJnBhcnRzWzNdLCAmY2lkcik7CgoJCWlwLT5jaWRyID0gY2lkcjsKCQlpcC0+YmluYXJ5ID0gaXBfdG9fbG9uZyhwYXJ0cyk7CgkJaXAtPm1hc2sgPSB+KDEgPDwgKGNpZHIgKyAxKSkgPDwgKDMyIC0gY2lkcik7CgkJc3RyY3B5KGlwLT5pcCwgZm9ybWF0KTsKCX0KCgl1bnNpZ25lZCBsb25nIGlwX3RvX2xvbmcoY29uc3QgaW50IGlwWzRdKQoJewoJCXJldHVybiBpcFszXSB8IGlwWzJdIDw8IDggfCBpcFsxXSA8PCAxNiB8IGlwWzBdIDw8IDI0OwoJfQoKCXZvaWQgc3RyaXAoY2hhciAqaW5wdXQpCgl7CgkJY2hhciAqZW9sID0gc3RycmNocihpbnB1dCwgJ1xuJyk7CgkJaWYoZW9sICE9IE5VTEwpCgkJCSplb2wgPSAnXDAnOwoJfQoKCWludCBpcF9zb3J0X2J5X2Zvcm1hdChjb25zdCB2b2lkICplMSwgY29uc3Qgdm9pZCAqZTIpCgl7CgkJc3RydWN0IElQICppcDEgPSAoc3RydWN0IElQICopIGUxOwoJCXN0cnVjdCBJUCAqaXAyID0gKHN0cnVjdCBJUCAqKSBlMjsKCgkJaW50IGRpZmYgPSAoaXAxLT5iaW5hcnkgJiBpcDEtPm1hc2spIC0gKGlwMi0+YmluYXJ5ICYgaXAyLT5tYXNrKTsKCQlpZihkaWZmID09IDApCgkJCXJldHVybiBpcDEtPmNpZHIgPCBpcDItPmNpZHI7CgkJcmV0dXJuIGRpZmY7Cgl9CgoJaW50IGlwX3NvcnRfYnlfY2lkcihjb25zdCB2b2lkICplMSwgY29uc3Qgdm9pZCAqZTIpCgl7CgkJc3RydWN0IElQICppcDEgPSAoc3RydWN0IElQICopIGUxOwoJCXN0cnVjdCBJUCAqaXAyID0gKHN0cnVjdCBJUCAqKSBlMjsKCQlyZXR1cm4gaXAxLT5jaWRyIC0gaXAyLT5jaWRyOwoJfQ==