/* Modifications were made by Cisco Systems, Inc. on or before Wed Nov 30 13:28:05 PST 2011
 * Helpers for netfiler modules.  This file provides implementations for basic
 * functions such as strncasecmp(), etc.
 *
 * gcc will warn for defined but unused functions, so we only include the
 * functions requested.  The following macros are used:
 *   NF_NEED_STRNCASECMP        nf_strncasecmp()
 *   NF_NEED_STRTOU16           nf_strtou16()
 *   NF_NEED_STRTOU32           nf_strtou32()
 */
#ifndef _NETFILTER_HELPERS_H
#define _NETFILTER_HELPERS_H

/* Only include these functions for kernel code. */
#ifdef __KERNEL__

#include <linux/ctype.h>
#define iseol(c) ( (c) == '\r' || (c) == '\n' )

/*
 * The standard strncasecmp()
 */
#ifdef NF_NEED_STRNCASECMP
static int
nf_strncasecmp(const char* s1, const char* s2, u_int32_t len)
{
    if (s1 == NULL || s2 == NULL)
    {
        if (s1 == NULL && s2 == NULL)
        {
            return 0;
        }
        return (s1 == NULL) ? -1 : 1;
    }
    while (len > 0 && tolower(*s1) == tolower(*s2))
    {
        len--;
        s1++;
        s2++;
    }
    return ( (len == 0) ? 0 : (tolower(*s1) - tolower(*s2)) );
}
#endif /* NF_NEED_STRNCASECMP */

/*
 * Parse a string containing a 16-bit unsigned integer.
 * Returns the number of chars used, or zero if no number is found.
 */
#ifdef NF_NEED_STRTOU16
static int
nf_strtou16(const char* pbuf, u_int16_t* pval)
{
    int n = 0;

    *pval = 0;
    while (isdigit(pbuf[n]))
    {
        *pval = (*pval * 10) + (pbuf[n] - '0');
        n++;
    }

    return n;
}
#endif /* NF_NEED_STRTOU16 */

/*
 * Parse a string containing a 32-bit unsigned integer.
 * Returns the number of chars used, or zero if no number is found.
 */
#ifdef NF_NEED_STRTOU32
static int
nf_strtou32(const char* pbuf, u_int32_t* pval)
{
    int n = 0;

    *pval = 0;
    while (pbuf[n] >= '0' && pbuf[n] <= '9')
    {
        *pval = (*pval * 10) + (pbuf[n] - '0');
        n++;
    }

    return n;
}
#endif /* NF_NEED_STRTOU32 */

/*
 * Given a buffer and length, advance to the next line and mark the current
 * line.
 */
#ifdef NF_NEED_NEXTLINE
static int
nf_nextline(char* p, uint len, uint* poff, uint* plineoff, uint* plinelen)
{
    uint    off = *poff;
    uint    physlen = 0;

    if (off >= len)
    {
        return 0;
    }

    while (p[off] != '\n')
    {
        if (len-off <= 1)
        {
            return 0;
        }

        physlen++;
        off++;
    }

    /* if we saw a crlf, physlen needs adjusted */
    if (physlen > 0 && p[off] == '\n' && p[off-1] == '\r')
    {
        physlen--;
    }

    /* advance past the newline */
    off++;

    *plineoff = *poff;
    *plinelen = physlen;
    *poff = off;

    return 1;
}
#endif /* NF_NEED_NEXTLINE */

#endif /* __KERNEL__ */

#endif /* _NETFILTER_HELPERS_H */
