OSSP CVS Repository

ossp - ossp-pkg/l2/l2_ut_level.c 1.4
Not logged in
[Honeypot]  [Browse]  [Directory]  [Home]  [Login
[Reports]  [Search]  [Ticket]  [Timeline
  [Raw

ossp-pkg/l2/l2_ut_level.c 1.4
/*
**  L2 - OSSP Logging Library
**  Copyright (c) 2001 The OSSP Project (http://www.ossp.org/)
**  Copyright (c) 2001 Cable & Wireless Deutschland (http://www.cw.com/de/)
**
**  This file is part of OSSP L2, a flexible logging library which
**  can be found at http://www.ossp.org/pkg/l2/.
**
**  Permission to use, copy, modify, and distribute this software for
**  any purpose with or without fee is hereby granted, provided that
**  the above copyright notice and this permission notice appear in all
**  copies.
**
**  THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
**  WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
**  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
**  IN NO EVENT SHALL THE AUTHORS AND COPYRIGHT HOLDERS AND THEIR
**  CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
**  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
**  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
**  USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
**  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
**  OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
**  OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
**  SUCH DAMAGE.
**
**  l2_ut_level.c: level mask transformations
*/

#include "l2.h"
#include "l2_p.h"

#include <string.h>
#include <ctype.h>

static struct {
    l2_level_t level;
    char *string;
} l2s_table[] = {
    { L2_LEVEL_PANIC,    "panic"    },
    { L2_LEVEL_CRITICAL, "critical" },
    { L2_LEVEL_ERROR,    "error"    },
    { L2_LEVEL_WARNING,  "warning"  },
    { L2_LEVEL_NOTICE,   "notice"   },
    { L2_LEVEL_INFO,     "info"     },
    { L2_LEVEL_TRACE,    "trace"    },
    { L2_LEVEL_DEBUG,    "debug"    },
    { 0,                 NULL       }
};

l2_result_t l2_util_l2s(char *string, size_t maxlen, l2_level_t level)
{
    int len, i, j, l;

    string[0] = '\0';
    len = i = j = l = 0;
    for (i = 0; l2s_table[i].level != NULL; i++) { /* loop through levels    */
        if (level & l2s_table[i].level) {
            if (j != 0)
                return L2_ERR_ARG; /* level has matched more than one string */
            else
                j = i; /* index the given level to its corresponding string  */
        }

        l = strlen(l2s_table[i].string);
        if (l > len) 
            len = l; /* len is the size of the largest level string          */
    }

    if (len + 1 > maxlen)
        return L2_ERR_MEM;
    else
        sprintf(string, "%s", l2s_table[j].string);

    for (i = 0; string[i] != '\0'; i++) /* process string to dynamically pad */
    ;                                   /* with spaces in order to line up   */
    while (i < len){                    /* small level string text with the  */
        string[i++] = ' ';              /* larger ones                       */
    }
    string[i] = '\0';                   /* don't forget to put back the EOL  */
    return L2_OK;
}

static unsigned int hexval(const char *cpB, const char *cpE)
{
    unsigned int hv;
    unsigned int nibble;

    hv = 0;
    while (cpB < cpE) {
        nibble = tolower((unsigned int)(*cpB++));
        if (isdigit(nibble)) 
            nibble = nibble - '0';
        else
            nibble = nibble - 'a';
        hv = ((hv << 4) | nibble);
    }
    return hv;
}

static int myishexnumber(int c)
{
    if (isdigit(c) || (c >= 'a' && c <= 'f') || (c >= 'A' && c <= 'F'))
        return 1;
    return 0;
}

l2_result_t l2_util_s2l(const char *string, size_t maxlen, l2_level_t *level)
{
    int bFound;
    int i;

    *level = 0;
    bFound = 0;
    for (i = 0; l2s_table[i].level != NULL; i++) {
        if (strcasecmp(string, l2s_table[i].string) == 0) {
            *level = l2s_table[i].level;
            bFound = 1;
            break;
        }
    }
    if (!bFound) {
        if (strncasecmp(string, "0x", 2) == 0 && myishexnumber((int)(*(string+2)))) {
            *level = hexval(string+2, string + strlen(string));
        }
        else
            return L2_ERR_ARG;
    }
    return L2_OK;
}


CVSTrac 2.0.1