/*****************************************************************************
* ipT.h *
* *
* create : kim hong gon *
*****************************************************************************/
#ifndef _IPT_H
#define _IPT_H
#define A_CLASS 0xff000000
#define B_CLASS 0xffff0000
#define C_CLASS 0xffffff00
#define IF_T(A,B,C,D) { if (A==B) {printf(C,D); exit(1);}}
#define IF_N(A,B,C,D) { if (A!=B) {printf(C,D); exit(1);}}
#define IF_T_F(A,B,C,D) { if (A==B) {printf(C,D); return -1;}}
#define IF_N_F(A,B,C,D) { if (A!=B) {printf(C,D); return -1;}}
unsigned int pow(int i, int j);
unsigned int s2i(const char *src);
unsigned short cv_port(const char *src);
unsigned int ip_s2i(const char *src);
unsigned int ip_mask(unsigned int ip);
int i2s(unsigned int I_ip, char *S_ip, int mode);
int input_ip_check(char *data);
#endif
/*****************************************************************************
* ipT.c *
* *
* create : kim hong gon *
*****************************************************************************/
#include <stdio.h>
#include "ipT.h"
unsigned int pow(int i, int j)
{// return i^j
register k;
unsigned retval=1;
if (j ==0) return 1;
for (k=0; k<j; k++) retval = retval*i;
return retval;
}
unsigned int s2i(const char *src)
{ //string to integer !('.' and '\n')
register i=0;
register j=0;
unsigned int ip=0;
while (src[i] != '.' && src[i] !='\0' ) i++;
for (; j < i; j++) {
ip += (src[j] - '0') * pow(10,i-j-1);
}
return ip;
}
unsigned short cv_port(const char *src)
{
unsigned short port;
port = (unsigned short)s2i(src);
port = (port >> 8) + (port << 8 );
return port;
}
unsigned int ip_s2i(const char *src)
{//string ip to integer ip
unsigned int ip=0;
register int j=1;
register int i=0;
ip = s2i(src);
while (src[i] != '\0') {
if (src[i] == '.') {
ip += s2i(&src[i+1])<<(j*8) ;
j++;
}
i++;
}
return ip;
}
unsigned int ip_mask(unsigned int ip)
{//return mask
unsigned int mask=0x80000000;
if (!(ip&mask)) return A_CLASS;
else {
mask >>= 1;
if (!(ip&mask)) return B_CLASS;
else return C_CLASS;
}
}
int i2s(unsigned int I_ip, char *S_ip, int mode)
{//integer to string
unsigned char C_ip;
register int i=0;
register int j=0;
register int k=14;
int imsi=0;
for (i=3; i >= 0; i--) {
C_ip = I_ip;
imsi += C_ip << (i*8);
I_ip >>= 8;
}
I_ip = imsi;
for (i=0; i <4; i++ ) {
C_ip = I_ip;
for (j=0; j<3; j++) {
imsi = C_ip%pow(10,j+1)-C_ip%pow(10,j);
if (imsi > 5) imsi /=pow(10,j);
S_ip[k] = imsi + '0';
k--;
}
S_ip[k] = '.';
k--;
I_ip >>=8;
}
if (mode) {//print form ex) 211.55.2.0 before 211.055.002.000
for (i=0,j=0; S_ip[i]; i++,j++)
{
if (S_ip[i] =='0' && S_ip[i+1] != '.'){
if (S_ip[i-1] == '.') {
i++;
if (S_ip[i] =='0') i++;
}
}
S_ip[j] = S_ip[i];
}
S_ip[j] = '\0';
}
return 0;
}
int input_ip_check(char *data) // ip error check
{
register int i=0;
unsigned int ip;
int count=0;
int eCh=0;
char ipS[16]={'\0'};
memcpy(ipS,data, strlen(data));
IF_N_F(ipS[15], '\0', "Ip adress error [%s]\n", ipS);
IF_T_F(ipS[0], '.',"Ip adress error [%s]\n",ipS);
ip = s2i(ipS);
if (ip > 255) { printf("Ip adress over num error [%s]\n",ipS); return -1;}
while (ipS[i] != '\0') {
if (ipS[i] == '.'){
if (eCh) { // '.' between '.'
if ((i-eCh) < 2 || (i-eCh) > 4){
printf("Ip adress error1 [%s]\n",ipS);
return -1;
}
}else if (i-eCh < 1) {
printf("Ip adress error2 [%s]\n",ipS);
return -1;
}
ip = s2i(&ipS[i+1]); // max num check
if (ip > 255) { printf("Ip adress over num error [%s]\n",ipS); return -1;}
eCh=i;
count++;
}
else {
if (ipS[i] < '0' || ipS[i] >'9'){ // string individual check
printf("Ip adress error3 [%s]\n",ipS);
return -1;
}
}
i++;
}
IF_T(ipS[i--],'.',"Ip adress error4 [%s]\n",ipS);
IF_N(count,3,"Ip adress '.' error5 [%s]\n",ipS);
return 0;
}