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

📄 st-sgml-ref.c

📁 linux下网络收音机的源码
💻 C
字号:
/* * Copyright (c) 2004 Jean-Yves Lefort * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are 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. Neither the name of Jean-Yves Lefort nor the names of its contributors *    may be used to endorse or promote products derived from this software *    without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND * CONTRIBUTORS "AS IS" AND ANY EXPRESS 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 COPYRIGHT OWNER 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 <string.h>#include <stdlib.h>#include <limits.h>#include <glib.h>#include "st-entities.h"#include "st-sgml-ref-api.h"/*** function declarations ***************************************************/static gunichar st_sgml_ref_get_unichar (const char *ref);/*** implementation **********************************************************/static gunicharst_sgml_ref_get_unichar (const char *ref){  gunichar c = 0;		/* 0 means "invalid reference" */  g_return_val_if_fail(ref != NULL, 0);  if (*ref == '#')    {				/* numeric reference */      const char *nptr;      int base;      if (*(ref + 1) == 'x' || *(ref + 1) == 'X')	{			/* hexadecimal number */	  nptr = ref + 2;	  base = 16;	}      else	{			/* decimal number */	  nptr = ref + 1;	  base = 10;	}      if (*nptr)	{	  char *end;	  unsigned long code;	  	  code = strtoul(nptr, &end, base);	  if (*end == 0)	/* could convert */	    c = code;	}    }  else    {				/* entity reference */      int i;      for (i = 0; i < G_N_ELEMENTS(entities); i++)	if (! strcmp(ref, entities[i].name))	  {	    c = entities[i].character;	    break;	  }    }    return c;}/** * st_sgml_ref_expand: * @str: the nul-terminated string to parse. * * Parses @str, expanding its SGML character references and XHTML * character entities. See st_sgml_ref_expand_len(). * * Return value: the expansion of @str. The string should be freed * when no longer needed. **/char *st_sgml_ref_expand (const char *str){  g_return_val_if_fail(str != NULL, NULL);  return st_sgml_ref_expand_len(str, -1);}/** * st_sgml_ref_expand_len: * @str: the string to parse. * @len: the length of @str, or -1 if @str is nul-terminated. * * Parses @str, expanding its SGML character references and XHTML * character entities. * * Numerical SGML character references as well as XHTML entities are * supported. Unsupported entities will be inserted verbatim into the * result. * * Return value: the expansion of @str. The string should be freed * when no longer needed. **/char *st_sgml_ref_expand_len (const char *str, int len){  GString *unescaped;  char *ampersand;  char *semicolon;  g_return_val_if_fail(str != NULL, NULL);  if (len == -1)    len = strlen(str);  unescaped = g_string_new(NULL);  while ((ampersand = g_strstr_len(str, len, "&")))    if ((semicolon = g_strstr_len(ampersand, len - (ampersand - str), ";")))      {	char *ref;	gunichar c;		ref = g_strndup(ampersand + 1, semicolon - ampersand - 1);	c = st_sgml_ref_get_unichar(ref);	g_free(ref);		g_string_append_len(unescaped, str, ampersand - str);	if (c)	  g_string_append_unichar(unescaped, c);	else			/* invalid reference, append it raw */	  g_string_append_len(unescaped, ampersand, semicolon - ampersand + 1);		len -= semicolon - str + 1;	str = semicolon + 1;      }    else      break;  g_string_append_len(unescaped, str, len);  return g_string_free(unescaped, FALSE);}

⌨️ 快捷键说明

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