mbus_parser.c
上传用户:sun1608
上传日期:2007-02-02
资源大小:6116k
文件大小:6k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. /*
  2.  * FILE:     mbus_parser.c
  3.  * AUTHOR:   Colin Perkins
  4.  * 
  5.  * Copyright (c) 1997-2000 University College London
  6.  * All rights reserved.
  7.  *
  8.  * Redistribution and use in source and binary forms, with or without
  9.  * modification, is permitted provided that the following conditions 
  10.  * are met:
  11.  * 1. Redistributions of source code must retain the above copyright
  12.  *    notice, this list of conditions and the following disclaimer.
  13.  * 2. Redistributions in binary form must reproduce the above copyright
  14.  *    notice, this list of conditions and the following disclaimer in the
  15.  *    documentation and/or other materials provided with the distribution.
  16.  * 3. All advertising materials mentioning features or use of this software
  17.  *    must display the following acknowledgement:
  18.  *      This product includes software developed by the Computer Science
  19.  *      Department at University College London
  20.  * 4. Neither the name of the University nor of the Department may be used
  21.  *    to endorse or promote products derived from this software without
  22.  *    specific prior written permission.
  23.  * THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND
  24.  * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  25.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  26.  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE
  27.  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  28.  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  29.  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  30.  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  31.  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  32.  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  33.  * SUCH DAMAGE.
  34.  */
  35. #include "config_unix.h"
  36. #include "config_win32.h"
  37. #include "debug.h"
  38. #include "memory.h"
  39. #include "mbus_parser.h"
  40. #define MBUS_PARSER_MAGIC 0xbadface
  41. struct mbus_parser {
  42. char *buffer; /* Temporary storage for parsing mbus commands  */
  43. char *bufend; /* End of space allocated for parsing, to check for overflows  */
  44. uint32_t magic; /* For debugging...                                             */
  45. };
  46. struct mbus_parser *mbus_parse_init(char *str)
  47. {
  48. struct mbus_parser *m;
  49. m = (struct mbus_parser *) xmalloc(sizeof(struct mbus_parser));
  50. m->buffer = str;
  51. m->bufend = str + strlen(str);
  52. m->magic  = MBUS_PARSER_MAGIC;
  53. return m;
  54. }
  55. void mbus_parse_done(struct mbus_parser *m)
  56. {
  57. ASSERT(m->magic == MBUS_PARSER_MAGIC);
  58. xfree(m);
  59. }
  60. #define CHECK_OVERRUN if (m->buffer > m->bufend) {
  61. debug_msg("parse m->buffer overflown");
  62. return FALSE;
  63. }
  64. int mbus_parse_lst(struct mbus_parser *m, char **l)
  65. {
  66. int instr = FALSE;
  67. int inlst = FALSE;
  68. ASSERT(m->magic == MBUS_PARSER_MAGIC);
  69.         while (isspace((unsigned char)*m->buffer)) {
  70.                 m->buffer++;
  71. CHECK_OVERRUN;
  72.         }
  73. if (*m->buffer != '(') {
  74. return FALSE;
  75. }
  76. m->buffer++;
  77. *l = m->buffer;
  78. while (*m->buffer != '') {
  79. if ((*m->buffer == '"') && (*(m->buffer-1) != '\')) {
  80. instr = !instr;
  81. }
  82. if ((*m->buffer == '(') && (*(m->buffer-1) != '\') && !instr) {
  83. inlst = !inlst;
  84. }
  85. if ((*m->buffer == ')') && (*(m->buffer-1) != '\') && !instr) {
  86. if (inlst) {
  87. inlst = !inlst;
  88. } else {
  89. *m->buffer = '';
  90. m->buffer++;
  91. CHECK_OVERRUN;
  92. return TRUE;
  93. }
  94. }
  95. m->buffer++;
  96. CHECK_OVERRUN;
  97. }
  98. return FALSE;
  99. }
  100. int mbus_parse_str(struct mbus_parser *m, char **s)
  101. {
  102. ASSERT(m->magic == MBUS_PARSER_MAGIC);
  103.         while (isspace((unsigned char)*m->buffer)) {
  104.                 m->buffer++;
  105. CHECK_OVERRUN;
  106.         }
  107. if (*m->buffer != '"') {
  108. return FALSE;
  109. }
  110. *s = m->buffer++;
  111. while (*m->buffer != '') {
  112. if ((*m->buffer == '"') && (*(m->buffer-1) != '\')) {
  113. m->buffer++;
  114. *m->buffer = '';
  115. m->buffer++;
  116. return TRUE;
  117. }
  118. m->buffer++;
  119. CHECK_OVERRUN;
  120. }
  121. return FALSE;
  122. }
  123. int mbus_parse_sym(struct mbus_parser *m, char **s)
  124. {
  125. ASSERT(m->magic == MBUS_PARSER_MAGIC);
  126.         while (isspace((unsigned char)*m->buffer)) {
  127.                 m->buffer++;
  128. CHECK_OVERRUN;
  129.         }
  130. if (!isgraph((unsigned char)*m->buffer)) {
  131. return FALSE;
  132. }
  133. *s = m->buffer++;
  134. while (!isspace((unsigned char)*m->buffer) && (*m->buffer != '')) {
  135. m->buffer++;
  136. CHECK_OVERRUN;
  137. }
  138. *m->buffer = '';
  139. m->buffer++;
  140. CHECK_OVERRUN;
  141. return TRUE;
  142. }
  143. int mbus_parse_int(struct mbus_parser *m, int *i)
  144. {
  145. char *p;
  146. ASSERT(m->magic == MBUS_PARSER_MAGIC);
  147.         while (isspace((unsigned char)*m->buffer)) {
  148.                 m->buffer++;
  149. CHECK_OVERRUN;
  150.         }
  151. *i = strtol(m->buffer, &p, 10);
  152. if (((*i == LONG_MAX) || (*i == LONG_MIN)) && (errno == ERANGE)) {
  153. debug_msg("integer out of rangen");
  154. return FALSE;
  155. }
  156. if (p == m->buffer) {
  157. return FALSE;
  158. }
  159. if (!isspace((unsigned char)*p) && (*p != '')) {
  160. return FALSE;
  161. }
  162. m->buffer = p;
  163. CHECK_OVERRUN;
  164. return TRUE;
  165. }
  166. int mbus_parse_flt(struct mbus_parser *m, double *d)
  167. {
  168. char *p;
  169. ASSERT(m->magic == MBUS_PARSER_MAGIC);
  170.         while (isspace((unsigned char)*m->buffer)) {
  171.                 m->buffer++;
  172. CHECK_OVERRUN;
  173.         }
  174. *d = strtod(m->buffer, &p);
  175. if (errno == ERANGE) {
  176. debug_msg("float out of rangen");
  177. return FALSE;
  178. }
  179. if (p == m->buffer) {
  180. return FALSE;
  181. }
  182. if (!isspace((unsigned char)*p) && (*p != '')) {
  183. return FALSE;
  184. }
  185. m->buffer = p;
  186. CHECK_OVERRUN;
  187. return TRUE;
  188. }
  189. char *mbus_decode_str(char *s)
  190. {
  191. int l = strlen(s);
  192. int i, j;
  193. /* Check that this an encoded string... */
  194. ASSERT(s[0]   == '"');
  195. ASSERT(s[l-1] == '"');
  196. for (i=1,j=0; i < l - 1; i++,j++) {
  197. if (s[i] == '\') {
  198. i++;
  199. }
  200. s[j] = s[i];
  201. }
  202. s[j] = '';
  203. return s;
  204. }
  205. char *mbus_encode_str(const char *s)
  206. {
  207. int   i, j;
  208. int  len = strlen(s);
  209. char *buf = (char *) xmalloc((len * 2) + 3);
  210. for (i = 0, j = 1; i < len; i++,j++) {
  211. if (s[i] == ' ') {
  212. buf[j] = '\';
  213. buf[j+1] = ' ';
  214. j++;
  215. } else if (s[i] == '"') {
  216. buf[j] = '\';
  217. buf[j+1] = '"';
  218. j++;
  219. } else {
  220. buf[j] = s[i];
  221. }
  222. }
  223. buf[0]   = '"';
  224. buf[j]   = '"';
  225. buf[j+1] = '';
  226. return buf;
  227. }