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>