parseip.c
来自「在ARM7和UC/OSII的平台上实现了GPS自动报站的功能,涉及GPS模块LE」· C语言 代码 · 共 135 行
C
135 行
/*
* FILENAME: parseip.c
*
* Copyright 2000 By InterNiche Technologies Inc. All rights reserved
*
* parse_ipad() function and wrapper function inet_addr() for IP applications
*
* MODULE: MISCLIB
*
* ROUTINES: inet_addr(), parse_ipad()
*
* PORTABLE: yes
*/
/* Additional Copyrights: */
/* Portions Copyright 1993 NetPort Software, all rights reserved. */
#include "ipport.h"
#include "in_utils.h"
/* FUNCTION: parse_ipad()
*
* parse_ipad(long_out, string_in); Looks for an IP address in
* string_in buffer, makes an IP address (in big endian) in long_out.
* returns NULL if OK, else returns a pointer to a string describing
* problem.
*
*
* PARAM1: ip_addr * ipout
* PARAM2: unsigned * sbits
* PARAM3: char * stringin
*
* RETURNS:
*/
char *
parse_ipad(ip_addr * ipout, /* pointer to IP address to set */
unsigned * sbits, /* default subnet bit number */
char * stringin) /* buffer with ascii to parse */
{
char * cp;
int dots = 0; /* periods imbedded in input string */
int number;
union
{
u_char c[4];
u_long l;
} retval;
char * toobig = "each number must be less than 255";
cp = stringin;
while (*cp)
{
if (*cp > '9' || *cp < '.' || *cp == '/')
return("all chars must be digits (0-9) or dots (.)");
if (*cp == '.')dots++;
cp++;
}
if ( dots < 1 || dots > 3 )
return("string must contain 1 - 3 dots (.)");
cp = stringin;
if ((number = atoi(cp)) > 255) /* set net number */
return(toobig);
retval.c[0] = (u_char)number;
while (*cp != '.')cp++; /* find dot (end of number) */
cp++; /* point past dot */
if (dots == 1 || dots == 2) retval.c[1] = 0;
else
{
number = atoi(cp);
while (*cp != '.')cp++; /* find dot (end of number) */
cp++; /* point past dot */
if (number > 255) return(toobig);
retval.c[1] = (u_char)number;
}
if (dots == 1) retval.c[2] = 0;
else
{
number = atoi(cp);
while (*cp != '.')cp++; /* find dot (end of number) */
cp++; /* point past dot */
if (number > 255) return(toobig);
retval.c[2] = (u_char)number;
}
if ((number = atoi(cp)) > 255)
return(toobig);
retval.c[3] = (u_char)number;
if (retval.c[0] < 128) *sbits = 8;
else if(retval.c[0] < 192) *sbits = 16;
else *sbits = 24;
*ipout = retval.l; /* everything went OK, return number */
return(NULL); /* return OK code (no error string) */
}
/* FUNCTION: inet_addr()
*
* PARAM1: char far *str
*
* RETURNS: u_long ipaddr
*/
u_long
inet_addr(char FAR * str)
{
u_long ipaddr;
unsigned bits ;
/* parse_ipad expects a "char and we are passing "char far Hence
* we need to make the conversion. Usually this function will be
* used for debugging, so I think we can bear the STRCPY overhead.
*/
static char nearBuf[30];
strcpy((char FAR *)nearBuf,str);
if ( parse_ipad(&ipaddr,&bits,nearBuf) == NULL )
{
return ipaddr ;
}
else
{
return (u_long)NULL ;
}
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?