Home | History | Annotate | Line # | Download | only in citrus
citrus_memstream.c revision 1.2.22.1
      1  1.2.22.1      matt /*	citrus_memstream.c,v 1.2 2004/01/02 21:49:35 itojun Exp	*/
      2       1.1  tshiozak 
      3       1.1  tshiozak /*-
      4       1.1  tshiozak  * Copyright (c)2003 Citrus Project,
      5       1.1  tshiozak  * All rights reserved.
      6       1.1  tshiozak  *
      7       1.1  tshiozak  * Redistribution and use in source and binary forms, with or without
      8       1.1  tshiozak  * modification, are permitted provided that the following conditions
      9       1.1  tshiozak  * are met:
     10       1.1  tshiozak  * 1. Redistributions of source code must retain the above copyright
     11       1.1  tshiozak  *    notice, this list of conditions and the following disclaimer.
     12       1.1  tshiozak  * 2. Redistributions in binary form must reproduce the above copyright
     13       1.1  tshiozak  *    notice, this list of conditions and the following disclaimer in the
     14       1.1  tshiozak  *    documentation and/or other materials provided with the distribution.
     15       1.1  tshiozak  *
     16       1.1  tshiozak  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
     17       1.1  tshiozak  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     18       1.1  tshiozak  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     19       1.1  tshiozak  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
     20       1.1  tshiozak  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     21       1.1  tshiozak  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     22       1.1  tshiozak  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     23       1.1  tshiozak  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
     24       1.1  tshiozak  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
     25       1.1  tshiozak  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     26       1.1  tshiozak  * SUCH DAMAGE.
     27       1.1  tshiozak  */
     28       1.1  tshiozak 
     29       1.1  tshiozak #include <sys/cdefs.h>
     30       1.1  tshiozak #if defined(LIBC_SCCS) && !defined(lint)
     31  1.2.22.1      matt __RCSID("citrus_memstream.c,v 1.2 2004/01/02 21:49:35 itojun Exp");
     32       1.1  tshiozak #endif /* LIBC_SCCS and not lint */
     33       1.1  tshiozak 
     34       1.1  tshiozak #include "namespace.h"
     35       1.1  tshiozak #include <assert.h>
     36       1.1  tshiozak #include <stdio.h>
     37       1.1  tshiozak #include <stdlib.h>
     38       1.1  tshiozak #include <string.h>
     39       1.1  tshiozak 
     40       1.1  tshiozak #include "citrus_namespace.h"
     41       1.1  tshiozak #include "citrus_region.h"
     42       1.1  tshiozak #include "citrus_memstream.h"
     43       1.1  tshiozak #include "citrus_bcs.h"
     44       1.1  tshiozak 
     45       1.1  tshiozak const char *
     46       1.1  tshiozak _citrus_memory_stream_getln(struct _citrus_memory_stream * __restrict ms,
     47       1.1  tshiozak 			    size_t * __restrict rlen)
     48       1.1  tshiozak {
     49       1.1  tshiozak 	int i;
     50  1.2.22.1      matt 	const uint8_t *h, *p;
     51       1.1  tshiozak 	size_t ret;
     52       1.1  tshiozak 
     53       1.1  tshiozak 	if (ms->ms_pos>=_region_size(&ms->ms_region))
     54       1.1  tshiozak 		return (NULL);
     55       1.1  tshiozak 
     56       1.1  tshiozak 	h = p = (uint8_t *)_region_offset(&ms->ms_region, ms->ms_pos);
     57       1.1  tshiozak 	ret = 0;
     58       1.2    itojun 	for (i = _region_size(&ms->ms_region) - ms->ms_pos; i > 0; i--) {
     59       1.1  tshiozak 		ret++;
     60       1.1  tshiozak 		if (_bcs_iseol(*p))
     61       1.1  tshiozak 			break;
     62       1.1  tshiozak 		p++;
     63       1.1  tshiozak 	}
     64       1.1  tshiozak 
     65       1.1  tshiozak 	ms->ms_pos += ret;
     66       1.1  tshiozak 	*rlen = ret;
     67       1.1  tshiozak 	return ((const char *)h);
     68       1.1  tshiozak }
     69       1.1  tshiozak 
     70       1.1  tshiozak #define T_COMM	'#'
     71       1.1  tshiozak 
     72       1.1  tshiozak const char *
     73       1.1  tshiozak _citrus_memory_stream_matchline(struct _citrus_memory_stream * __restrict ms,
     74       1.1  tshiozak 				const char * __restrict key,
     75       1.1  tshiozak 				size_t * __restrict rlen,
     76       1.1  tshiozak 				int iscasesensitive)
     77       1.1  tshiozak {
     78       1.1  tshiozak 	const char *p, *q;
     79       1.1  tshiozak 	size_t len, keylen;
     80       1.1  tshiozak 
     81       1.1  tshiozak 	keylen = strlen(key);
     82       1.1  tshiozak 	while (/*CONSTCOND*/ 1) {
     83       1.1  tshiozak 		p = _citrus_memory_stream_getln(ms, &len);
     84       1.1  tshiozak 		if (p == NULL)
     85       1.1  tshiozak 			return (NULL);
     86       1.1  tshiozak 
     87       1.1  tshiozak 		/* ignore comment */
     88       1.1  tshiozak 		q = memchr(p, T_COMM, len);
     89       1.1  tshiozak 		if (q) {
     90       1.1  tshiozak 			len = q-p;
     91       1.1  tshiozak 		}
     92       1.1  tshiozak 		/* ignore trailing white space and newline */
     93       1.1  tshiozak 		_bcs_trunc_rws_len(p, &len);
     94       1.1  tshiozak 		if (len == 0)
     95       1.1  tshiozak 			continue; /* ignore null line */
     96       1.1  tshiozak 
     97       1.1  tshiozak 		/* skip white spaces at the head of the line */
     98       1.1  tshiozak 		p = _bcs_skip_ws_len(p, &len);
     99       1.1  tshiozak 		q = _bcs_skip_nonws_len(p, &len);
    100       1.1  tshiozak 
    101       1.1  tshiozak 		if (q-p == keylen) {
    102       1.1  tshiozak 			if (iscasesensitive) {
    103       1.1  tshiozak 				if (memcmp(key, p, keylen) == 0)
    104       1.1  tshiozak 					break; /* match */
    105       1.1  tshiozak 			} else {
    106       1.1  tshiozak 				if (_bcs_strncasecmp(key, p, keylen) == 0)
    107       1.1  tshiozak 					break; /* match */
    108       1.1  tshiozak 			}
    109       1.1  tshiozak 		}
    110       1.1  tshiozak 	}
    111       1.1  tshiozak 
    112       1.1  tshiozak 	p = _bcs_skip_ws_len(q, &len);
    113       1.1  tshiozak 	*rlen = len;
    114       1.1  tshiozak 
    115       1.1  tshiozak 	return (p);
    116       1.1  tshiozak }
    117       1.1  tshiozak 
    118       1.1  tshiozak void *
    119       1.1  tshiozak _citrus_memory_stream_chr(struct _citrus_memory_stream *ms,
    120       1.1  tshiozak 			  struct _citrus_region *r, char ch)
    121       1.1  tshiozak {
    122       1.1  tshiozak 	void *head, *chr;
    123       1.1  tshiozak 	size_t sz;
    124       1.1  tshiozak 
    125       1.1  tshiozak 	if (ms->ms_pos >= _region_size(&ms->ms_region))
    126       1.1  tshiozak 		return NULL;
    127       1.1  tshiozak 
    128       1.1  tshiozak 	head = _region_offset(&ms->ms_region, ms->ms_pos);
    129       1.1  tshiozak 	chr = memchr(head, ch, _memstream_remainder(ms));
    130       1.1  tshiozak 	if (chr == NULL) {
    131       1.1  tshiozak 		_region_init(r, head, _memstream_remainder(ms));
    132       1.1  tshiozak 		ms->ms_pos = _region_size(&ms->ms_region);
    133       1.1  tshiozak 		return NULL;
    134       1.1  tshiozak 	}
    135       1.1  tshiozak 	sz = (char *)chr - (char *)head;
    136       1.1  tshiozak 
    137       1.1  tshiozak 	_region_init(r, head, sz);
    138       1.1  tshiozak 	ms->ms_pos += sz+1;
    139       1.1  tshiozak 
    140       1.1  tshiozak 	return chr;
    141       1.1  tshiozak }
    142       1.1  tshiozak 
    143       1.1  tshiozak void
    144       1.1  tshiozak _citrus_memory_stream_skip_ws(struct _citrus_memory_stream *ms)
    145       1.1  tshiozak {
    146       1.1  tshiozak 	int ch;
    147       1.1  tshiozak 
    148       1.1  tshiozak 	while ((ch = _memstream_peek(ms)) != EOF) {
    149       1.1  tshiozak 		if (!_bcs_isspace(ch))
    150       1.1  tshiozak 			break;
    151       1.1  tshiozak 		_memstream_getc(ms);
    152       1.1  tshiozak 	}
    153       1.1  tshiozak }
    154