/** * Copyright (c) 2018, Timothy Stack * * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of Timothy Stack nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ''AS IS'' AND ANY * EXPRESS 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 REGENTS OR 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. */ #include "config.h" #include #include "log_level.hh" log_level_t string2level(const char *levelstr, ssize_t len, bool exact) { log_level_t retval = LEVEL_UNKNOWN; if (len == (ssize_t)-1) { len = strlen(levelstr); } if (((len == 1) || ((len > 1) && (levelstr[1] == ' '))) && (retval = abbrev2level(levelstr, 1)) != LEVEL_UNKNOWN) { return retval; } # define YYCTYPE unsigned char # define RET(tok) { \ return tok; \ } const YYCTYPE *YYCURSOR = (const unsigned char *) levelstr; const YYCTYPE *YYLIMIT = (const unsigned char *) levelstr + len; const YYCTYPE *YYMARKER = YYCURSOR; const YYCTYPE *debug_level = nullptr; # define YYPEEK() (YYCURSOR < YYLIMIT ? *YYCURSOR : 0) # define YYSKIP() ++YYCURSOR # define YYBACKUP() YYMARKER = YYCURSOR # define YYRESTORE() YYCURSOR = YYMARKER # define YYSTAGP(x) x = YYCURSOR - 1 /*!stags:re2c format = 'const unsigned char *@@;'; */ loop: /*!re2c re2c:tags = 1; re2c:yyfill:enable = 0; re2c:flags:input = custom; EOF = "\x00"; EOF { RET(LEVEL_UNKNOWN); } 'trace' { RET(LEVEL_TRACE); } 'debug' [2-5]? @debug_level { if (debug_level == nullptr) { RET(LEVEL_DEBUG); } switch (*debug_level) { case '2': RET(LEVEL_DEBUG2); case '3': RET(LEVEL_DEBUG3); case '4': RET(LEVEL_DEBUG4); case '5': RET(LEVEL_DEBUG5); default: RET(LEVEL_DEBUG); } } 'info' { RET(LEVEL_INFO); } 'notice' { RET(LEVEL_NOTICE); } 'stats' { RET(LEVEL_STATS); } 'warn'|'warning' { RET(LEVEL_WARNING); } 'err'|'error' { RET(LEVEL_ERROR); } 'critical' { RET(LEVEL_CRITICAL); } 'severe' { RET(LEVEL_CRITICAL); } 'fatal' { RET(LEVEL_FATAL); } * { goto loop; } */ }