Annotation of embedaddon/strongswan/src/libstrongswan/utils/lexparser.c, revision 1.1

1.1     ! misho       1: /*
        !             2:  * Copyright (C) 2001-2006 Andreas Steffen
        !             3:  *
        !             4:  * This program is free software; you can redistribute it and/or modify it
        !             5:  * under the terms of the GNU General Public License as published by the
        !             6:  * Free Software Foundation; either version 2 of the License, or (at your
        !             7:  * option) any later version.  See <http://www.fsf.org/copyleft/gpl.txt>.
        !             8:  *
        !             9:  * This program is distributed in the hope that it will be useful, but
        !            10:  * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
        !            11:  * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
        !            12:  * for more details.
        !            13:  */
        !            14: 
        !            15: #include "lexparser.h"
        !            16: 
        !            17: /**
        !            18:  * eat whitespace
        !            19:  */
        !            20: bool eat_whitespace(chunk_t *src)
        !            21: {
        !            22:        while (src->len > 0 && (*src->ptr == ' ' || *src->ptr == '\t'))
        !            23:        {
        !            24:                src->ptr++;  src->len--;
        !            25:        }
        !            26:        return  src->len > 0 && *src->ptr != '#';
        !            27: }
        !            28: 
        !            29: /**
        !            30:  * compare string with chunk
        !            31:  */
        !            32: bool match(const char *pattern, const chunk_t *ch)
        !            33: {
        !            34:        return ch->len == strlen(pattern) && strncmp(pattern, ch->ptr, ch->len) == 0;
        !            35: }
        !            36: 
        !            37: /**
        !            38:  * extracts a token ending with the first occurrence of a given termination symbol
        !            39:  */
        !            40: bool extract_token(chunk_t *token, const char termination, chunk_t *src)
        !            41: {
        !            42:        u_char *eot = memchr(src->ptr, termination, src->len);
        !            43: 
        !            44:        if (termination == ' ')
        !            45:        {
        !            46:                u_char *eot_tab = memchr(src->ptr, '\t', src->len);
        !            47: 
        !            48:                /* check if a tab instead of a space terminates the token */
        !            49:                eot = ( eot_tab == NULL || (eot && eot < eot_tab) ) ? eot : eot_tab;
        !            50:        }
        !            51: 
        !            52:        /* initialize empty token */
        !            53:        *token = chunk_empty;
        !            54: 
        !            55:        if (eot == NULL) /* termination symbol not found */
        !            56:        {
        !            57:                return FALSE;
        !            58:        }
        !            59: 
        !            60:        /* extract token */
        !            61:        token->ptr = src->ptr;
        !            62:        token->len = (u_int)(eot - src->ptr);
        !            63: 
        !            64:        /* advance src pointer after termination symbol */
        !            65:        src->ptr = eot + 1;
        !            66:        src->len -= (token->len + 1);
        !            67: 
        !            68:        return TRUE;
        !            69: }
        !            70: 
        !            71: /**
        !            72:  * extracts a token ending with the first occurrence of a given null-terminated string
        !            73:  */
        !            74: bool extract_token_str(chunk_t *token, const char *termination, chunk_t *src)
        !            75: {
        !            76:        u_char *eot = memstr(src->ptr, termination, src->len);
        !            77:        size_t l = strlen(termination);
        !            78: 
        !            79:        /* initialize empty token */
        !            80:        *token = chunk_empty;
        !            81: 
        !            82:        if (eot == NULL) /* termination string not found */
        !            83:        {
        !            84:                return FALSE;
        !            85:        }
        !            86: 
        !            87:        /* extract token */
        !            88:        token->ptr = src->ptr;
        !            89:        token->len = (u_int)(eot - src->ptr);
        !            90: 
        !            91:        /* advance src pointer after termination string */
        !            92:        src->ptr = eot + l;
        !            93:        src->len -= (token->len + l);
        !            94: 
        !            95:        return TRUE;
        !            96: }
        !            97: 
        !            98: /**
        !            99:  *  fetches a new line terminated by \n or \r\n
        !           100:  */
        !           101: bool fetchline(chunk_t *src, chunk_t *line)
        !           102: {
        !           103:        if (src->len == 0) /* end of src reached */
        !           104:                return FALSE;
        !           105: 
        !           106:        if (extract_token(line, '\n', src))
        !           107:        {
        !           108:                if (line->len > 0 && *(line->ptr + line->len -1) == '\r')
        !           109:                        line->len--;  /* remove optional \r */
        !           110:        }
        !           111:        else /*last line ends without newline */
        !           112:        {
        !           113:                *line = *src;
        !           114:                src->ptr += src->len;
        !           115:                src->len = 0;
        !           116:        }
        !           117:        return TRUE;
        !           118: }
        !           119: 
        !           120: err_t extract_value(chunk_t *value, chunk_t *line)
        !           121: {
        !           122:        char delimiter = ' ';
        !           123: 
        !           124:        if (!eat_whitespace(line))
        !           125:        {
        !           126:                *value = chunk_empty;
        !           127:                return NULL;
        !           128:        }
        !           129:        if (*line->ptr == '\'' || *line->ptr == '"')
        !           130:        {
        !           131:                delimiter = *line->ptr;
        !           132:                line->ptr++;  line->len--;
        !           133:        }
        !           134:        if (!extract_token(value, delimiter, line))
        !           135:        {
        !           136:                if (delimiter == ' ')
        !           137:                {
        !           138:                        *value = *line;
        !           139:                        line->len = 0;
        !           140:                }
        !           141:                else
        !           142:                {
        !           143:                        return "missing second delimiter";
        !           144:                }
        !           145:        }
        !           146:        return NULL;
        !           147: }
        !           148: 
        !           149: /**
        !           150:  * extracts a parameter: value pair
        !           151:  */
        !           152: err_t extract_parameter_value(chunk_t *name, chunk_t *value, chunk_t *line)
        !           153: {
        !           154:        /* extract name */
        !           155:        if (!extract_token(name,':', line))
        !           156:        {
        !           157:                return "missing ':'";
        !           158:        }
        !           159: 
        !           160:        /* extract value */
        !           161:        return extract_value(value, line);
        !           162: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>