#include<stdio.h>
#include<stdlib.h>
struct prefix {
unsigned int IP ;
unsigned char len ;
struct prefix * next ;
} ;
typedef struct prefix Prefix ;
int cal( int d) {
int i , sum ;
sum = 2 ;
for ( i = 0 ; i < d- 1 ; i++ )
sum = sum * 2 ;
return sum+ 1 ; }
Prefix * insert_a_node( Prefix * head, Prefix * node ) {
Prefix * cur ;
cur = head ;
if ( head == NULL)
return node ;
if ( node == NULL )
return head ;
if ( node-> IP < head-> IP)
{ node-> next = head ;
return node ; }
while ( cur-> next != NULL && cur-> next-> IP <= node-> IP)
cur = cur-> next ;
node-> next = cur-> next ;
cur-> next = node ;
return head ;
}
void insert_prefix( Prefix * group_head, Prefix * node, int index) {
int i = 0 ;
Prefix * t;
if ( node == NULL) return ;
if ( group_head-> next == NULL)
{
group_head-> next= node;
t = group_head;
return ;
}
if ( node-> IP <= group_head-> next-> IP)
{
node-> next = group_head-> next ;
group_head-> next= node;
return ;
}
t = group_head-> next ;
if ( t-> next== NULL)
{ t-> next= node;
return ; }
while ( t-> next!= NULL && t-> next-> IP < node-> IP)
t= t-> next;
node-> next= t-> next;
t-> next= node;
return ;
}
Prefix * build_list_no_order( Prefix * head, Prefix * node) {
if ( head == NULL)
return node ;
if ( node == NULL)
return head ;
Prefix * cur ;
cur = head ;
while ( cur-> next != NULL)
cur = cur-> next ;
cur-> next = node ;
return head ;
}
Prefix * build_routing_table( ) {
int a[ 5 ] , i ;
int ip = 0 ;
Prefix * head ;
head = NULL ;
FILE * ofp ;
ofp
= fopen ( "routing_table" , "r" ) ; while ( fscanf ( ofp
, "%d.%d.%d.%d/%d" ,& a
[ 0 ] ,& a
[ 1 ] ,& a
[ 2 ] ,& a
[ 3 ] ,& a
[ 4 ] ) != EOF
) { Prefix
* node
= ( Prefix
* ) malloc ( sizeof ( Prefix
) ) ; for ( i = 0 ; i < 4 ; i++ )
{ ip = ip + a[ i] ;
if ( i != 3 )
ip = ip<< 8 ; }
node-> IP = ip ;
ip = 0 ;
node-> len= a[ 4 ] ;
head = build_list_no_order( head, node) ; }
return head ;
}
void segment( int d, Prefix * rout , Prefix group[ ] ) {
int index= 0 , i;
for ( i= 31 ; i> 31 - d ; i-- ) {
if ( rout-> len< d)
index= cal( d) - 1 ;
if ( ( rout-> IP & 1 << i ) && ( i!= 32 - d) )
{ index++;
index= index<< 1 ; }
if ( ( rout-> IP & 1 << i) && i== 32 - d)
index++;
if ( ! ( rout-> IP & 1 << i) && i!= 32 - d)
index= index<< 1 ;
}
insert_prefix( & group[ index] , rout, index) ;
}
int main ( int argc , char * argv[ ] ) {
Prefix * head ;
Prefix * routing_head;
Prefix * trace_head;
Prefix * temp_rout ;
int d = 2 ; //need use argc finally
int group_num;
group_num = cal( d) ;
Prefix group[ group_num] ;
trace_head = build_trace( ) ;
routing_head = build_routing_table( ) ;
while ( routing_head != NULL ) {
segment( d, routing_head, group) ;
routing_head = routing_head-> next;
}
return 0 ;
}
I2luY2x1ZGU8c3RkaW8uaD4KI2luY2x1ZGU8c3RkbGliLmg+CnN0cnVjdCBwcmVmaXggewogICB1bnNpZ25lZCBpbnQgSVAgOwogICB1bnNpZ25lZCBjaGFyIGxlbiA7CiAgc3RydWN0IHByZWZpeCAqbmV4dCA7CiB9Owp0eXBlZGVmIHN0cnVjdCBwcmVmaXggUHJlZml4IDsKaW50IGNhbChpbnQgZCl7CiAgIGludCBpICwgc3VtIDsKICAgc3VtID0gMiA7CiAgIGZvciggaSA9IDAgOyBpIDwgZC0xIDsgaSsrKQogICAgIHN1bSA9IHN1bSAqIDIgOwogICAgICByZXR1cm4gc3VtKzEgOyB9CgpQcmVmaXggKmluc2VydF9hX25vZGUoUHJlZml4ICpoZWFkLFByZWZpeCAqbm9kZSApewogICAgUHJlZml4ICpjdXIgOwogICAgICBjdXIgPSBoZWFkIDsKICAgIGlmKGhlYWQgPT0gTlVMTCkKICAgICAgICByZXR1cm4gbm9kZSA7CiAgICBpZiggbm9kZSA9PSBOVUxMICkKICAgICAgIHJldHVybiBoZWFkIDsKICAgIGlmKCBub2RlLT5JUCA8IGhlYWQtPklQKQogICAgICB7IG5vZGUtPm5leHQgPSBoZWFkIDsKICAgICAgICAgIHJldHVybiBub2RlIDsgIH0KICAgIHdoaWxlKCBjdXItPm5leHQgIT0gTlVMTCAmJiBjdXItPm5leHQtPklQIDw9IG5vZGUtPklQKQogICAgICAgIGN1ciA9IGN1ci0+bmV4dCA7CiAgICAgICBub2RlLT5uZXh0ID0gY3VyLT5uZXh0IDsKICAgICAgIGN1ci0+bmV4dCA9IG5vZGUgOwogICAgICByZXR1cm4gaGVhZCA7CiAgICAgICAgICAgICAgICAgICAgICAgfQoKdm9pZCBpbnNlcnRfcHJlZml4KFByZWZpeCAqZ3JvdXBfaGVhZCxQcmVmaXggKm5vZGUsaW50IGluZGV4KXsKICBpbnQgaSA9IDA7CiAgUHJlZml4ICp0OwoKICBpZihub2RlID09IE5VTEwpIHJldHVybjsKICBpZihncm91cF9oZWFkLT5uZXh0ID09IE5VTEwpCiAgICAgICAgewogICAgICAgICBncm91cF9oZWFkLT5uZXh0PW5vZGU7CiAgICAgICAgIHQgPSBncm91cF9oZWFkOwogICAgICAgICByZXR1cm4gOwogICAgICAgIH0KICBpZihub2RlLT5JUCA8PSBncm91cF9oZWFkLT5uZXh0LT5JUCkKICAgICAgICB7CiAgICAgICAgbm9kZS0+bmV4dCA9IGdyb3VwX2hlYWQtPm5leHQgOwogICAgICAgIGdyb3VwX2hlYWQtPm5leHQ9bm9kZTsKICAgICAgICByZXR1cm4gOwogICAgICAgIH0KIHQgPSBncm91cF9oZWFkLT5uZXh0IDsKIGlmKHQtPm5leHQ9PU5VTEwpCiAgIHsgIHQtPm5leHQ9bm9kZTsKICAgICAgcmV0dXJuO30KICB3aGlsZSh0LT5uZXh0IT1OVUxMICYmIHQtPm5leHQtPklQIDwgbm9kZS0+SVApCiAgICAgICAgdD10LT5uZXh0OwogICAgbm9kZS0+bmV4dD10LT5uZXh0OwogICAgdC0+bmV4dD1ub2RlOwogICAgcmV0dXJuOwp9ClByZWZpeCAqYnVpbGRfbGlzdF9ub19vcmRlcihQcmVmaXggKmhlYWQsUHJlZml4ICpub2RlKXsKCiAgICAgaWYgKGhlYWQgPT0gTlVMTCkKICAgICAgICAgcmV0dXJuIG5vZGUgOwogICAgIGlmIChub2RlID09IE5VTEwpCiAgICAgICAgcmV0dXJuIGhlYWQgOwogICBQcmVmaXggKmN1ciA7CiAgICAgY3VyID0gaGVhZCA7CiAgIHdoaWxlICggY3VyLT5uZXh0ICE9IE5VTEwpCiAgICBjdXIgPSBjdXItPm5leHQgOwogICAgY3VyLT5uZXh0ID0gbm9kZSA7CiAgcmV0dXJuIGhlYWQgOwoKIH0KClByZWZpeCAqYnVpbGRfcm91dGluZ190YWJsZSgpewogICAgaW50IGFbNV0saSA7CiAgIGludCBpcCA9IDAgOwogIFByZWZpeCAqaGVhZCA7CiAgICAgIGhlYWQgPSAgTlVMTCA7CiBGSUxFICpvZnAgOwogb2ZwID0gZm9wZW4oInJvdXRpbmdfdGFibGUiLCJyIikgOwogd2hpbGUoIGZzY2FuZihvZnAsIiVkLiVkLiVkLiVkLyVkIiwmYVswXSwmYVsxXSwmYVsyXSwmYVszXSwmYVs0XSkgIT0gRU9GKXsKICAgICAgIFByZWZpeCAqbm9kZSA9IChQcmVmaXgqKW1hbGxvYyhzaXplb2YoUHJlZml4KSkgOwogICBmb3IgKCBpID0wIDsgaSA8IDQgOyBpKyspCiAgIHsgIGlwID0gaXAgKyBhW2ldIDsKICAgIGlmICggaSAhPSAzICkKICAgICAgaXAgPSBpcDw8OCA7ICB9CiAgICAgICAgbm9kZS0+SVAgPSBpcCA7CiAgICAgICAgaXAgPSAwIDsKICAgICAgICBub2RlLT5sZW49YVs0XTsKICAgICAgaGVhZCA9IGJ1aWxkX2xpc3Rfbm9fb3JkZXIoaGVhZCxub2RlKTsgIH0KICAgIHJldHVybiBoZWFkIDsKCiAgICB9Cgp2b2lkIHNlZ21lbnQoaW50IGQsUHJlZml4ICpyb3V0ICxQcmVmaXggZ3JvdXBbXSl7CiAgIGludCBpbmRleD0wLGk7CgogICBmb3IoaT0zMSA7IGk+MzEtZCA7IGktLSl7CiAgICBpZihyb3V0LT5sZW48ZCkKICAgICAgICAgaW5kZXg9Y2FsKGQpLTE7CiAgICBpZiggKCByb3V0LT5JUCAmIDE8PGkgKSAmJiAoIGkhPTMyLWQpKQogICAgICAgIHtpbmRleCsrOwogICAgICAgIGluZGV4PWluZGV4PDwxO30KICAgIGlmKCAocm91dC0+SVAgJiAxPDxpKSAmJiBpPT0zMi1kKQogICAgICAgIGluZGV4Kys7CiAgICBpZiggIShyb3V0LT5JUCAmIDE8PGkpICYmIGkhPTMyLWQpCiAgICAgICAgaW5kZXg9aW5kZXg8PDE7CiAgICAgIH0KICAgaW5zZXJ0X3ByZWZpeCgmZ3JvdXBbaW5kZXhdLHJvdXQsaW5kZXgpOwoKICAgfQppbnQgbWFpbiAoIGludCBhcmdjICwgY2hhciAqYXJndltdKXsKICBQcmVmaXggKmhlYWQgOwogIFByZWZpeCAqcm91dGluZ19oZWFkOwogIFByZWZpeCAqdHJhY2VfaGVhZDsKICBQcmVmaXggKnRlbXBfcm91dCA7CiAgaW50IGQgPSAyIDsgLy9uZWVkIHVzZSBhcmdjIGZpbmFsbHkKICBpbnQgZ3JvdXBfbnVtOwogIGdyb3VwX251bSA9IGNhbChkKTsKICBQcmVmaXggZ3JvdXBbZ3JvdXBfbnVtXSA7CiAgdHJhY2VfaGVhZCA9IGJ1aWxkX3RyYWNlKCk7CiAgcm91dGluZ19oZWFkID0gYnVpbGRfcm91dGluZ190YWJsZSgpOwoKIHdoaWxlKHJvdXRpbmdfaGVhZCAhPSBOVUxMICl7CiAgc2VnbWVudChkLHJvdXRpbmdfaGVhZCxncm91cCk7CiAgcm91dGluZ19oZWFkID0gcm91dGluZ19oZWFkLT5uZXh0OwogIH0KCiAgICAgcmV0dXJuIDAgOwp9Cg==
compilation info
prog.c: In function ‘insert_prefix’:
prog.c:34:7: warning: unused variable ‘i’ [-Wunused-variable]
int i = 0;
^
prog.c: In function ‘build_list_no_order’:
prog.c:64:4: warning: this ‘while’ clause does not guard... [-Wmisleading-indentation]
while ( cur->next != NULL)
^~~~~
prog.c:66:5: note: ...this statement, but the latter is misleadingly indented as if it is guarded by the ‘while’
cur->next = node ;
^~~
prog.c: In function ‘main’:
prog.c:118:16: warning: implicit declaration of function ‘build_trace’ [-Wimplicit-function-declaration]
trace_head = build_trace();
^~~~~~~~~~~
prog.c:118:14: warning: assignment makes pointer from integer without a cast [-Wint-conversion]
trace_head = build_trace();
^
prog.c:113:11: warning: unused variable ‘temp_rout’ [-Wunused-variable]
Prefix *temp_rout ;
^~~~~~~~~
prog.c:112:11: warning: variable ‘trace_head’ set but not used [-Wunused-but-set-variable]
Prefix *trace_head;
^~~~~~~~~~
prog.c:110:11: warning: unused variable ‘head’ [-Wunused-variable]
Prefix *head ;
^~~~
prog.c: In function ‘insert_prefix’:
prog.c:50:10: warning: ‘t’ may be used uninitialized in this function [-Wmaybe-uninitialized]
while(t->next!=NULL && t->next->IP < node->IP)
~^~~~~~
prog.c: In function ‘segment’:
prog.c:50:10: warning: ‘t’ may be used uninitialized in this function [-Wmaybe-uninitialized]
while(t->next!=NULL && t->next->IP < node->IP)
~^~~~~~
prog.c:35:11: note: ‘t’ was declared here
Prefix *t;
^
/home/Dp5Ur3/ccXMxJGT.o: In function `main':
prog.c:(.text.startup+0x9): undefined reference to `build_trace'
collect2: error: ld returned 1 exit status
stdout