Logo Search packages:      
Sourcecode: hlfl version File versions  Download package

utils.c

#include "config.h"
#include "includes.h"

char *strchr_items(str, chr, open, close)
char *str;
char chr, open, close;
{
      while (str[0]) {
            if (str[0] == chr)
                  return str;

            else if (str[0] == open) {
                  str = strchr(str + 1, close);
                  if (!str)
                        return str;
            }
            str++;
      }
      if (!str[0])
            str = NULL;
      return str;
}

char *matching_items(str, open, close)
char *str;
char open;
char close;
{

      char *s = (char *) strchr(str, open);
      if (s) {
            char v;
            int level = 1;
            while (level) {
                  s++;
                  v = s[0];
                  if (!v)
                        break;
                  if (v == open)
                        level++;
                  else if (v == close)
                        level--;
            }
            if (!s[0])
                  s = NULL;
      }
      return s;
}

#ifndef HAVE_INET_ATON
/*
 * Coming straight from Fyodor's Nmap
 */
int inet_aton(cp, addr)
register const char *cp;
struct in_addr *addr;
{
      register unsigned int val;    /* changed from u_long --david */
      register int base, n;
      register char c;
      u_int parts[4];
      register u_int *pp = parts;

      c = *cp;
      for (;;) {
            /*
             * Collect number up to ``.''.
             * Values are specified as for C:
             * 0x=hex, 0=octal, isdigit=decimal.
             */
            if (!isdigit((int) c))
                  return (0);
            val = 0;
            base = 10;
            if (c == '0') {
                  c = *++cp;
                  if (c == 'x' || c == 'X')
                        base = 16, c = *++cp;
                  else
                        base = 8;
            }
            for (;;) {
                  if (isascii((int) c) && isdigit((int) c)) {
                        val = (val * base) + (c - '0');
                        c = *++cp;
                  } else if (base == 16 && isascii((int) c)
                           && isxdigit((int) c)) {
                        val =
                            (val << 4) | (c + 10 -
                                      (islower((int) c) ? 'a' : 'A'));
                        c = *++cp;
                  } else
                        break;
            }
            if (c == '.') {
                  /*
                   * Internet format:
                   *      a.b.c.d
                   *      a.b.c   (with c treated as 16 bits)
                   *      a.b     (with b treated as 24 bits)
                   */
                  if (pp >= parts + 3)
                        return (0);
                  *pp++ = val;
                  c = *++cp;
            } else
                  break;
      }
      /*
       * Check for trailing characters.
       */
      if (c != '\0' && (!isascii((int) c) || !isspace((int) c)))
            return (0);
      /*
       * Concoct the address according to
       * the number of parts specified.
       */
      n = pp - parts + 1;
      switch (n) {

      case 0:
            return (0); /* initial nondigit */

      case 1:           /* a -- 32 bits */
            break;

      case 2:           /* a.b -- 8.24 bits */
            if (val > 0xffffff)
                  return (0);
            val |= parts[0] << 24;
            break;

      case 3:           /* a.b.c -- 8.8.16 bits */
            if (val > 0xffff)
                  return (0);
            val |= (parts[0] << 24) | (parts[1] << 16);
            break;

      case 4:           /* a.b.c.d -- 8.8.8.8 bits */
            if (val > 0xff)
                  return (0);
            val |= (parts[0] << 24) | (parts[1] << 16) | (parts[2] << 8);
            break;
      }
      if (addr)
            addr->s_addr = htonl(val);
      return (1);
}
#endif                        /* ! HAVE_INET_ATON */

Generated by  Doxygen 1.6.0   Back to index