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 + -
显示快捷键?