I have changed code some parts by fixing arrays and separating structures.
Code:
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
struct ttyp
{
unsigned int index;
struct prtyp *prefix;
};
struct prtyp{
unsigned char len;
unsigned char port;
unsigned int ip;
} ;
struct prtyp *prefix;
struct ttyp *htable;
int num_entry=0;
////////////////////////////////////////////////////////////////////////////////////
void read_table(char *str,unsigned int *ip,int *len,unsigned int *nexthop)
{
char tok[]="./";
char buf[100],*str1;
unsigned int n[4];
sprintf(buf,"%s\0",strtok(str,tok));
n[0]=atoi(buf);
sprintf(buf,"%s\0",strtok(NULL,tok));
n[1]=atoi(buf);
sprintf(buf,"%s\0",strtok(NULL,tok));
n[2]=atoi(buf);
sprintf(buf,"%s\0",strtok(NULL,tok));
n[3]=atoi(buf);
*nexthop=n[2];
str1=(char *)strtok(NULL,tok);
if(str1!=NULL)
{
sprintf(buf,"%s\0",str1);
*len=atoi(buf);
}
else
{
if(n[1]==0&&n[2]==0&&n[3]==0)
*len=8;
else if(n[2]==0&&n[3]==0)
*len=16;
else if(n[3]==0)
*len=24;
}
*ip=n[0];
*ip<<=8;
*ip+=n[1];
*ip<<=8;
*ip+=n[2];
*ip<<=8;
*ip+=n[3];
}
//********************************************************
void hash_table(char *file_name)
{
int count,z;
FILE *fp;
int len;
char string[100];
unsigned int ip,nexthop;
fp=fopen(file_name,"r");
while(fgets(string,50,fp)!=NULL)
{
read_table(string,&ip,&len,&nexthop);
num_entry++;
}
rewind(fp);
prefix=(struct prtyp *)malloc(num_entry*sizeof(struct prtyp));
htable=(struct ttyp *)malloc(32*sizeof(struct ttyp));
for(count=0; count<=31; count++){
htable[count].index=0; //counter initialization
}
while(fgets(string,50,fp)!=NULL){
read_table(string,&ip,&len,&nexthop);
z=htable[len-1].index;
htable[len-1].prefix[z].ip=ip;
htable[len-1].index++;
}
}
//*********************************************************
int main(int argc,char *argv[])
{
if(argc!=3)
{
printf("Please execute the file as the following way:\n");
printf("%s routing_table_file_name query_table_file_name\n",argv[0]);
exit(1);
}
//set_query(argv[2]);
int y;
hash_table(argv[1]);
printf("\n=================================");
printf("\nTotal prefix in txt file: %d", num_entry);
printf("\n=================================\n");
for(y=0;y<=31;y++){
if(htable[y].index)
printf("Table[%d] value numbers: %d\n",y+1,htable[y].index);
}
printf("TEST: %d",htable[23].prefix[0].ip); //there is 23 length exists in file
return 0;
}
TRACE:
root@kane-BM5220-BM5320-BM5620:/home/kane/my_files/course_files/midterm_project# gcc -O3 -g3 -Wall -c -fmessage-length=0 -otest.o trash.c
trash.c: In function read_table:
trash.c:26:5: warning: embedded \0 in format [-Wformat-contains-nul]
trash.c:28:5: warning: embedded \0 in format [-Wformat-contains-nul]
trash.c:30:5: warning: embedded \0 in format [-Wformat-contains-nul]
trash.c:32:5: warning: embedded \0 in format [-Wformat-contains-nul]
trash.c:38:9: warning: embedded \0 in format [-Wformat-contains-nul]
Thanks,
Kane