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

📄 mxml-file.c

📁 asterisk 是一个很有知名度开源软件
💻 C
📖 第 1 页 / 共 4 页
字号:
	  else if (ch == 0xfe)	  {	   /*	    * UTF-16 big-endian BOM?	    */            if (((*s)[0] & 255) != 0xff)	      return (EOF);	    *encoding = ENCODE_UTF16BE;	    (*s)++;	    return (mxml_string_getc(p, encoding));	  }	  else if (ch == 0xff)	  {	   /*	    * UTF-16 little-endian BOM?	    */            if (((*s)[0] & 255) != 0xfe)	      return (EOF);	    *encoding = ENCODE_UTF16LE;	    (*s)++;	    return (mxml_string_getc(p, encoding));	  }	  else if ((ch & 0xe0) == 0xc0)	  {	   /*	    * Two-byte value...	    */	    if (((*s)[0] & 0xc0) != 0x80)              return (EOF);	    ch = ((ch & 0x1f) << 6) | ((*s)[0] & 0x3f);	    (*s)++;	    if (ch < 0x80)	      return (EOF);#if DEBUG > 1            printf("mxml_string_getc: %c (0x%04x)\n", ch < ' ' ? '.' : ch, ch);#endif /* DEBUG > 1 */	    return (ch);	  }	  else if ((ch & 0xf0) == 0xe0)	  {	   /*	    * Three-byte value...	    */	    if (((*s)[0] & 0xc0) != 0x80 ||        	((*s)[1] & 0xc0) != 0x80)              return (EOF);	    ch = ((((ch & 0x0f) << 6) | ((*s)[0] & 0x3f)) << 6) | ((*s)[1] & 0x3f);	    (*s) += 2;	    if (ch < 0x800)	      return (EOF);#if DEBUG > 1            printf("mxml_string_getc: %c (0x%04x)\n", ch < ' ' ? '.' : ch, ch);#endif /* DEBUG > 1 */	    return (ch);	  }	  else if ((ch & 0xf8) == 0xf0)	  {	   /*	    * Four-byte value...	    */	    if (((*s)[0] & 0xc0) != 0x80 ||        	((*s)[1] & 0xc0) != 0x80 ||        	((*s)[2] & 0xc0) != 0x80)              return (EOF);	    ch = ((((((ch & 0x07) << 6) | ((*s)[0] & 0x3f)) << 6) |        	   ((*s)[1] & 0x3f)) << 6) | ((*s)[2] & 0x3f);	    (*s) += 3;	    if (ch < 0x10000)	      return (EOF);#if DEBUG > 1            printf("mxml_string_getc: %c (0x%04x)\n", ch < ' ' ? '.' : ch, ch);#endif /* DEBUG > 1 */	    return (ch);	  }	  else	    return (EOF);      case ENCODE_UTF16BE :	 /*          * Read UTF-16 big-endian char...	  */	  ch = (ch << 8) | ((*s)[0] & 255);	  (*s) ++;          if (mxml_bad_char(ch))	  {	    mxml_error("Bad control character 0x%02x not allowed by XML standard!",        	       ch);	    return (EOF);	  }          else if (ch >= 0xd800 && ch <= 0xdbff)	  {	   /*	    * Multi-word UTF-16 char...	    */            int lch;			/* Lower word */            if (!(*s)[0])	      return (EOF);            lch = (((*s)[0] & 255) << 8) | ((*s)[1] & 255);	    (*s) += 2;            if (lch < 0xdc00 || lch >= 0xdfff)	      return (EOF);            ch = (((ch & 0x3ff) << 10) | (lch & 0x3ff)) + 0x10000;	  }#if DEBUG > 1          printf("mxml_string_getc: %c (0x%04x)\n", ch < ' ' ? '.' : ch, ch);#endif /* DEBUG > 1 */	  return (ch);      case ENCODE_UTF16LE :	 /*          * Read UTF-16 little-endian char...	  */	  ch = ch | (((*s)[0] & 255) << 8);	  if (!ch)	  {	    (*s) --;	    return (EOF);	  }	  (*s) ++;          if (mxml_bad_char(ch))	  {	    mxml_error("Bad control character 0x%02x not allowed by XML standard!",        	       ch);	    return (EOF);	  }          else if (ch >= 0xd800 && ch <= 0xdbff)	  {	   /*	    * Multi-word UTF-16 char...	    */            int lch;			/* Lower word */            if (!(*s)[1])	      return (EOF);            lch = (((*s)[1] & 255) << 8) | ((*s)[0] & 255);	    (*s) += 2;            if (lch < 0xdc00 || lch >= 0xdfff)	      return (EOF);            ch = (((ch & 0x3ff) << 10) | (lch & 0x3ff)) + 0x10000;	  }#if DEBUG > 1          printf("mxml_string_getc: %c (0x%04x)\n", ch < ' ' ? '.' : ch, ch);#endif /* DEBUG > 1 */	  return (ch);    }  }  return (EOF);}/* * 'mxml_string_putc()' - Write a character to a string. */static int				/* O - 0 on success, -1 on failure */mxml_string_putc(int  ch,		/* I - Character to write */                 void *p)		/* I - Pointer to string pointers */{  char	**pp;				/* Pointer to string pointers */  pp = (char **)p;  if (ch < 0x80)  {   /*    * Plain ASCII doesn't need special encoding...    */    if (pp[0] < pp[1])      pp[0][0] = ch;    pp[0] ++;  }  else if (ch < 0x800)  {   /*    * Two-byte UTF-8 character...    */    if ((pp[0] + 1) < pp[1])    {      pp[0][0] = 0xc0 | (ch >> 6);      pp[0][1] = 0x80 | (ch & 0x3f);    }    pp[0] += 2;  }  else if (ch < 0x10000)  {   /*    * Three-byte UTF-8 character...    */    if ((pp[0] + 2) < pp[1])    {      pp[0][0] = 0xe0 | (ch >> 12);      pp[0][1] = 0x80 | ((ch >> 6) & 0x3f);      pp[0][2] = 0x80 | (ch & 0x3f);    }    pp[0] += 3;  }  else  {   /*    * Four-byte UTF-8 character...    */    if ((pp[0] + 2) < pp[1])    {      pp[0][0] = 0xf0 | (ch >> 18);      pp[0][1] = 0x80 | ((ch >> 12) & 0x3f);      pp[0][2] = 0x80 | ((ch >> 6) & 0x3f);      pp[0][3] = 0x80 | (ch & 0x3f);    }    pp[0] += 4;  }  return (0);}/* * 'mxml_write_name()' - Write a name string. */static int				/* O - 0 on success, -1 on failure */mxml_write_name(const char *s,		/* I - Name to write */                void       *p,		/* I - Write pointer */		int        (*putc_cb)(int, void *))					/* I - Write callback */{  char		quote;			/* Quote character */  const char	*name;			/* Entity name */  if (*s == '\"' || *s == '\'')  {   /*    * Write a quoted name string...    */    if ((*putc_cb)(*s, p) < 0)      return (-1);    quote = *s++;    while (*s && *s != quote)    {      if ((name = mxmlEntityGetName(*s)) != NULL)      {	if ((*putc_cb)('&', p) < 0)          return (-1);        while (*name)	{	  if ((*putc_cb)(*name, p) < 0)            return (-1);          name ++;	}	if ((*putc_cb)(';', p) < 0)          return (-1);      }      else if ((*putc_cb)(*s, p) < 0)	return (-1);      s ++;    }   /*    * Write the end quote...    */    if ((*putc_cb)(quote, p) < 0)      return (-1);  }  else  {   /*    * Write a non-quoted name string...    */    while (*s)    {      if ((*putc_cb)(*s, p) < 0)	return (-1);      s ++;    }  }  return (0);}/* * 'mxml_write_node()' - Save an XML node to a file. */static int				/* O - Column or -1 on error */mxml_write_node(mxml_node_t *node,	/* I - Node to write */                void        *p,		/* I - File to write to */	        const char  *(*cb)(mxml_node_t *, int),					/* I - Whitespace callback */		int         col,	/* I - Current column */		int         (*putc_cb)(int, void *)){  int		i,			/* Looping var */		width;			/* Width of attr + value */  mxml_attr_t	*attr;			/* Current attribute */  char		s[255];			/* Temporary string */  while (node != NULL)  {   /*    * Print the node value...    */    switch (node->type)    {      case MXML_ELEMENT :          col = mxml_write_ws(node, p, cb, MXML_WS_BEFORE_OPEN, col, putc_cb);          if ((*putc_cb)('<', p) < 0)	    return (-1);          if (node->value.element.name[0] == '?' ||	      !strncmp(node->value.element.name, "!--", 3) ||	      !strncmp(node->value.element.name, "![CDATA[", 8))          {	   /*	    * Comments, CDATA, and processing instructions do not	    * use character entities.	    */	    const char	*ptr;		/* Pointer into name */	    for (ptr = node->value.element.name; *ptr; ptr ++)	      if ((*putc_cb)(*ptr, p) < 0)	        return (-1);           /*	    * Prefer a newline for whitespace after ?xml...	    */            if (!strncmp(node->value.element.name, "?xml", 4))              col = MXML_WRAP;	  }	  else if (mxml_write_name(node->value.element.name, p, putc_cb) < 0)	    return (-1);          col += strlen(node->value.element.name) + 1;	  for (i = node->value.element.num_attrs, attr = node->value.element.attrs;	       i > 0;	       i --, attr ++)	  {	    width = strlen(attr->name);	    if (attr->value)	      width += strlen(attr->value) + 3;	    if ((col + width) > MXML_WRAP)	    {	      if ((*putc_cb)('\n', p) < 0)	        return (-1);	      col = 0;	    }	    else	    {	      if ((*putc_cb)(' ', p) < 0)	        return (-1);	      col ++;	    }            if (mxml_write_name(attr->name, p, putc_cb) < 0)	      return (-1);	    if (attr->value)	    {              if ((*putc_cb)('=', p) < 0)		return (-1);              if ((*putc_cb)('\"', p) < 0)		return (-1);	      if (mxml_write_string(attr->value, p, putc_cb) < 0)		return (-1);              if ((*putc_cb)('\"', p) < 0)		return (-1);            }            col += width;	  }	  if (node->child)	  {           /*	    * Write children...	    */	    if ((*putc_cb)('>', p) < 0)	      return (-1);	    else	      col ++;            col = mxml_write_ws(node, p, cb, MXML_WS_AFTER_OPEN, col, putc_cb);	    if ((col = mxml_write_node(node->child, p, cb, col, putc_cb)) < 0)	      return (-1);           /*	    * The ? and ! elements are special-cases and have no end tags...	    */            if (node->value.element.name[0] != '!' &&	        node->value.element.name[0] != '?')	    {              col = mxml_write_ws(node, p, cb, MXML_WS_BEFORE_CLOSE, col, putc_cb);              if ((*putc_cb)('<', p) < 0)		return (-1);              if ((*putc_cb)('/', p) < 0)		return (-1);              if (mxml_write_string(node->value.element.name, p, putc_cb) < 0)		return (-1);              if ((*putc_cb)('>', p) < 0)		return (-1);              col += strlen(node->value.element.name) + 3;              col = mxml_write_ws(node, p, cb, MXML_WS_AFTER_CLOSE, col, putc_cb);	    }	  }	  else if (node->value.element.name[0] == '!' ||	           node->value.element.name[0] == '?')	  {           /*	    * The ? and ! elements are special-cases...	    */	    if ((*putc_cb)('>', p) < 0)	      return (-1);	    else	      col ++;            col = mxml_write_ws(node, p, cb, MXML_WS_AFTER_OPEN, col, putc_cb);          }	  else	  {            if ((*putc_cb)(' ', p) < 0)	      return (-1);            if ((*putc_cb)('/', p) < 0)	      return (-1);            if ((*putc_cb)('>', p) < 0)	      return (-1);	    col += 3;            col = mxml_write_ws(node, p, cb, MXML_WS_AFTER_OPEN, col, putc_cb);	  }          break;      case MXML_INTEGER :	  if (node->prev)	  {	    if (col > MXML_WRAP)	    {	      if ((*putc_cb)('\n', p) < 0)	        return (-1);	      col = 0;	    }	    else if ((*putc_cb)(' ', p) < 0)	      return (-1);	    else	      col ++;          }          sprintf(s, "%d", node->value.integer);	  if (mxml_write_string(s, p, putc_cb) < 0)	    return (-1);	  col += strlen(s);          break;      case MXML_OPAQUE :          if (mxml_write_string(node->value.opaque, p, putc_cb) < 0)	    return (-1);          col += strlen(node->value.opaque);          break;      case MXML_REAL :	  if (node->prev)	  {	    if (col > MXML_WRAP)	    {	      if ((*putc_cb)('\n', p) < 0)	        return (-1);	      col = 0;	    }	    else if ((*putc_cb)(' ', p) < 0)	      return (-1);	    else	      col ++;          }          sprintf(s, "%f", node->value.real);	  if (mxml_write_string(s, p, putc_cb) < 0)	    return (-1);	  col += strlen(s);          break;      case MXML_TEXT :	  if (node->value.text.whitespace && col > 0)	  {	    if (col > MXML_WRAP)	    {	      if ((*putc_cb)('\n', p) < 0)	        return (-1);	      col = 0;	    }	    else if ((*putc_cb)(' ', p) < 0)	      return (-1);	    else	      col ++;          }          if (mxml_write_string(node->value.text.string, p, putc_cb) < 0)	    return (-1);	  col += strlen(node->value.text.string);          break;      case MXML_CUSTOM :          if (mxml_custom_save_cb)	  {	    char	*data;		/* Custom data string */	    const char	*newline;	/* Last newline in string */            if ((data = (*mxml_custom_save_cb)(node)) == NULL)	      return (-1);            if (mxml_write_string(data, p, putc_cb) < 0)	      return (-1);            if ((newline = strrchr(data, '\n')) == NULL)	      col += strlen(data);	    else              col = strlen(newline);            free(data);	    break;	  }      default : /* Should never happen */          return (-1);    }   /*    * Next node...    */    node = node->next;  }  return (col);}/* * 'mxml_write_string()' - Write a string, escaping & and < as needed. */static int				/* O - 0 on success, -1 on failure */mxml_write_string(const char *s,	/* I - String to write */                  void       *p,	/* I - Write pointer */		  int        (*putc_cb)(int, void *))					/* I - Write callback */{  const char	*name;			/* Entity name, if any */  while (*s)  {    if ((name = mxmlEntityGetName(*s)) != NULL)    {      if ((*putc_cb)('&', p) < 0)        return (-1);      while (*name)      {	if ((*putc_cb)(*name, p) < 0)          return (-1);        name ++;      }      if ((*putc_cb)(';', p) < 0)        return (-1);    }    else if ((*putc_cb)(*s, p) < 0)      return (-1);    s ++;  }  return (0);}/* * 'mxml_write_ws()' - Do whitespace callback... */static int				/* O - New column */mxml_write_ws(mxml_node_t *node,	/* I - Current node */              void        *p,		/* I - Write pointer */              const char  *(*cb)(mxml_node_t *, int),					/* I - Callback function */	      int         ws,		/* I - Where value */	      int         col,		/* I - Current column */              int         (*putc_cb)(int, void *))					/* I - Write callback */{  const char	*s;			/* Whitespace string */  if (cb && (s = (*cb)(node, ws)) != NULL)  {    while (*s)    {      if ((*putc_cb)(*s, p) < 0)	return (-1);      else if (*s == '\n')	col = 0;      else if (*s == '\t')      {	col += MXML_TAB;	col = col - (col % MXML_TAB);      }      else	col ++;      s ++;    }  }  return (col);}/* * End of "$Id: mxml-file.c 22267 2006-04-24 17:11:45Z kpfleming $". */

⌨️ 快捷键说明

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