⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mbus_parser.c

📁 网络MPEG4IP流媒体开发源代码
💻 C
字号:
/* * FILE:     mbus_parser.c * AUTHOR:   Colin Perkins *  * Copyright (c) 1997-2000 University College London * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, is permitted provided that the following conditions  * are met: * 1. Redistributions of source code must retain the above copyright *    notice, this list of conditions and the following disclaimer. * 2. 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. * 3. All advertising materials mentioning features or use of this software *    must display the following acknowledgement: *      This product includes software developed by the Computer Science *      Department at University College London * 4. Neither the name of the University nor of the Department may be used *    to endorse or promote products derived from this software without *    specific prior written permission. * THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``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 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_unix.h"#include "config_win32.h"#include "debug.h"#include "memory.h"#include "mbus_parser.h"#define MBUS_PARSER_MAGIC 0xbadfacestruct mbus_parser {	char	*buffer;	/* Temporary storage for parsing mbus commands 			*/	char	*bufend;	/* End of space allocated for parsing, to check for overflows 	*/	uint32_t magic;		/* For debugging...                                             */};struct mbus_parser *mbus_parse_init(char *str){	struct mbus_parser	*m;	m = (struct mbus_parser *) xmalloc(sizeof(struct mbus_parser));	m->buffer = str;	m->bufend = str + strlen(str);	m->magic  = MBUS_PARSER_MAGIC;	return m;}void mbus_parse_done(struct mbus_parser *m){	ASSERT(m->magic == MBUS_PARSER_MAGIC);	xfree(m);}#define CHECK_OVERRUN if (m->buffer > m->bufend) {\	debug_msg("parse m->buffer overflow\n");\	return FALSE;\}int mbus_parse_lst(struct mbus_parser *m, char **l){	int instr = FALSE;	int inlst = FALSE;	ASSERT(m->magic == MBUS_PARSER_MAGIC);        while (isspace((unsigned char)*m->buffer)) {                m->buffer++;		CHECK_OVERRUN;        }	if (*m->buffer != '(') {		return FALSE;	}	m->buffer++;	*l = m->buffer;	while (*m->buffer != '\0') {		if ((*m->buffer == '"') && (*(m->buffer-1) != '\\')) {			instr = !instr;		}		if ((*m->buffer == '(') && (*(m->buffer-1) != '\\') && !instr) {			inlst = !inlst;		}		if ((*m->buffer == ')') && (*(m->buffer-1) != '\\') && !instr) {			if (inlst) {				inlst = !inlst;			} else {				*m->buffer = '\0';				m->buffer++;				CHECK_OVERRUN;				return TRUE;			}		}		m->buffer++;		CHECK_OVERRUN;	}	return FALSE;}int mbus_parse_str(struct mbus_parser *m, char **s){	ASSERT(m->magic == MBUS_PARSER_MAGIC);        while (isspace((unsigned char)*m->buffer)) {                m->buffer++;		CHECK_OVERRUN;        }	if (*m->buffer != '"') {		return FALSE;	}	*s = m->buffer++;	while (*m->buffer != '\0') {		if ((*m->buffer == '"') && (*(m->buffer-1) != '\\')) {			m->buffer++;			*m->buffer = '\0';			m->buffer++;			return TRUE;		}		m->buffer++;		CHECK_OVERRUN;	}	return FALSE;}int mbus_parse_sym(struct mbus_parser *m, char **s){	ASSERT(m->magic == MBUS_PARSER_MAGIC);        while (isspace((unsigned char)*m->buffer)) {                m->buffer++;		CHECK_OVERRUN;        }	if (!isgraph((unsigned char)*m->buffer)) {		return FALSE;	}	*s = m->buffer++;	while (!isspace((unsigned char)*m->buffer) && (*m->buffer != '\0')) {		m->buffer++;		CHECK_OVERRUN;	}	*m->buffer = '\0';	m->buffer++;	CHECK_OVERRUN;	return TRUE;}int mbus_parse_int(struct mbus_parser *m, int *i){	char	*p;	ASSERT(m->magic == MBUS_PARSER_MAGIC);        while (isspace((unsigned char)*m->buffer)) {                m->buffer++;		CHECK_OVERRUN;        }	*i = strtol(m->buffer, &p, 10);	if (((*i == LONG_MAX) || (*i == LONG_MIN)) && (errno == ERANGE)) {		debug_msg("integer out of range\n");		return FALSE;	}	if (p == m->buffer) {		return FALSE;	}	if (!isspace((unsigned char)*p) && (*p != '\0')) {		return FALSE;	}	m->buffer = p;	CHECK_OVERRUN;	return TRUE;}int mbus_parse_flt(struct mbus_parser *m, double *d){	char	*p;	ASSERT(m->magic == MBUS_PARSER_MAGIC);        while (isspace((unsigned char)*m->buffer)) {                m->buffer++;		CHECK_OVERRUN;        }	*d = strtod(m->buffer, &p);	if (errno == ERANGE) {		debug_msg("float out of range\n");		return FALSE;	}	if (p == m->buffer) {		return FALSE;	}	if (!isspace((unsigned char)*p) && (*p != '\0')) {		return FALSE;	}	m->buffer = p;	CHECK_OVERRUN;	return TRUE;}char *mbus_decode_str(char *s){	int	l = strlen(s);	int	i, j;	/* Check that this an encoded string... */	ASSERT(s[0]   == '\"');	ASSERT(s[l-1] == '\"');	for (i=1,j=0; i < l - 1; i++,j++) {		if (s[i] == '\\') {			i++;		}		s[j] = s[i];	}	s[j] = '\0';	return s;}char *mbus_encode_str(const char *s){	int 	 i, j;	int	 len = strlen(s);	char	*buf = (char *) xmalloc((len * 2) + 3);	for (i = 0, j = 1; i < len; i++,j++) {		if (s[i] == ' ') {			buf[j] = '\\';			buf[j+1] = ' ';			j++;		} else if (s[i] == '\"') {			buf[j] = '\\';			buf[j+1] = '\"';			j++;		} else {			buf[j] = s[i];		}	}	buf[0]   = '\"';	buf[j]   = '\"';	buf[j+1] = '\0';	return buf;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -