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

📄 sg-util.c

📁 linux下网络收音机的源码
💻 C
字号:
/* * Copyright (c) 2003 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 <glib.h>#ifndef ST_REGRESSION_TEST#include <glib-object.h>#include "sg-util.h"/*** function declarations ***************************************************/static gboolean sg_objects_free_node_cb (GNode *node, gpointer data);/*** implementation **********************************************************/char *sg_str_sentencize (const char *str){  char *sentencized;  int len;  g_return_val_if_fail(str != NULL, NULL);  len = strlen(str);  if (len > 0      && str[len - 1] != '.'      && str[len - 1] != '!'      && str[len - 1] != '?')    sentencized = g_strconcat(str, ".", NULL);  else    sentencized = g_strdup(str);    if (sentencized[0])    sentencized[0] = g_ascii_toupper(sentencized[0]);  return sentencized;}voidsg_pointers_free (GSList *pointers){  GSList *l;  SG_LIST_FOREACH(l, pointers)    g_free(l->data);  g_slist_free(pointers);}voidsg_objects_free (GSList *objects){  GSList *l;  SG_LIST_FOREACH(l, objects)    g_object_unref(l->data);  g_slist_free(objects);}voidsg_objects_free_node (GNode *objects){  g_return_if_fail(objects != NULL);  g_node_traverse(objects,		  G_PRE_ORDER,		  G_TRAVERSE_ALL,		  -1,		  sg_objects_free_node_cb,		  NULL);  g_node_destroy(objects);}static gbooleansg_objects_free_node_cb (GNode *node, gpointer data){  if (node->data)    g_object_unref(node->data);  return FALSE;			/* continue */}intsg_utf8_strcmp (const char *s1, const char *s2){  int cmp;  char *normalized_s1;  char *normalized_s2;  g_return_val_if_fail(s1 != NULL, 0);  g_return_val_if_fail(s2 != NULL, 0);  normalized_s1 = g_utf8_normalize(s1, -1, G_NORMALIZE_ALL);  normalized_s2 = g_utf8_normalize(s2, -1, G_NORMALIZE_ALL);    cmp = strcmp(normalized_s1, normalized_s2);  g_free(normalized_s1);  g_free(normalized_s2);  return cmp;}gbooleansg_utf8_strcontains (const char *big, const char *little){  gboolean contains;  char *normalized_big;  char *normalized_little;  g_return_val_if_fail(big != NULL, FALSE);  g_return_val_if_fail(little != NULL, FALSE);  normalized_big = g_utf8_normalize(big, -1, G_NORMALIZE_ALL);  normalized_little = g_utf8_normalize(little, -1, G_NORMALIZE_ALL);  contains = strstr(normalized_big, normalized_little) != NULL;  g_free(normalized_big);  g_free(normalized_little);  return contains;}gbooleansg_utf8_strcasecontains (const char *big, const char *little){  gboolean contains;  char *normalized_big;  char *normalized_little;  char *case_normalized_big;  char *case_normalized_little;  g_return_val_if_fail(big != NULL, FALSE);  g_return_val_if_fail(little != NULL, FALSE);  normalized_big = g_utf8_normalize(big, -1, G_NORMALIZE_ALL);  normalized_little = g_utf8_normalize(little, -1, G_NORMALIZE_ALL);  case_normalized_big = g_utf8_casefold(normalized_big, -1);  case_normalized_little = g_utf8_casefold(normalized_little, -1);  contains = strstr(case_normalized_big, case_normalized_little) != NULL;  g_free(normalized_big);  g_free(normalized_little);  g_free(case_normalized_big);  g_free(case_normalized_little);  return contains;}char *sg_value_array_get_string (GValueArray *value_array){  GString *string;  int i;  g_return_val_if_fail(value_array != NULL, NULL);  string = g_string_new(NULL);  for (i = 0; i < value_array->n_values; i++)    {      GValue *value = g_value_array_get_nth(value_array, i);      GValue transformed = { 0, };      g_value_init(&transformed, G_TYPE_STRING);      if (g_value_transform(value, &transformed))	{	  if (*string->str)	    g_string_append_printf(string, ", %s", g_value_get_string(&transformed));	  else	    g_string_append(string, g_value_get_string(&transformed));	}      g_value_unset(&transformed);    }  return g_string_free(string, FALSE);}voidsg_string_append_escaped (GString *string, const char *str){  char *escaped;  g_return_if_fail(string != NULL);  g_return_if_fail(str != NULL);  escaped = g_markup_escape_text(str, -1);  g_string_append(string, escaped);  g_free(escaped);}voidsg_string_append_printf_escaped (GString *string, const char *format, ...){  va_list args;  g_return_if_fail(string != NULL);  g_return_if_fail(format != NULL);  va_start(args, format);  sg_string_append_vprintf_escaped(string, format, args);  va_end(args);}voidsg_string_append_vprintf_escaped (GString *string,				  const char *format,				  va_list args){  char *escaped;  g_return_if_fail(string != NULL);  g_return_if_fail(format != NULL);  escaped = g_markup_vprintf_escaped(format, args);  g_string_append(string, escaped);  g_free(escaped);}gbooleansg_str_slist_contains (GSList *list, const char *str){  GSList *l;  g_return_val_if_fail(str != NULL, FALSE);  SG_LIST_FOREACH(l, list)    if (! strcmp(l->data, str))      return TRUE;  return FALSE;}GValue *sg_value_new (GType type){  GValue *value;  value = g_new0(GValue, 1);  g_value_init(value, type);  return value;}voidsg_value_free (GValue *value){  g_return_if_fail(G_IS_VALUE(value));  g_value_unset(value);  g_free(value);}voidsg_slist_push (GSList **list, gpointer data){  g_return_if_fail(list != NULL);  *list = g_slist_prepend(*list, data);}gpointersg_slist_peek (GSList *list){  return list ? list->data : NULL;}gpointersg_slist_pop (GSList **list){  gpointer data;  g_return_val_if_fail(list != NULL, NULL);  data = sg_slist_peek(*list);  *list = g_slist_delete_link(*list, *list);  return data;}gbooleansg_double_equal (double a, double b){  return ! (a < b || a > b);}#endif /* ! ST_REGRESSION_TEST */gbooleansg_ascii_validate (const char *str){  int i;  g_return_val_if_fail(str != NULL, FALSE);  for (i = 0; str[i]; i++)    if ((unsigned char) str[i] > 127)      return FALSE;  return TRUE;}char *sg_ascii_strcasestr (const char *big, const char *little){  char *lower_big;  char *lower_little;  char *s;  g_return_val_if_fail(big != NULL, NULL);  g_return_val_if_fail(little != NULL, NULL);  lower_big = g_ascii_strdown(big, -1);  lower_little = g_ascii_strdown(little, -1);    s = strstr(lower_big, lower_little);    g_free(lower_big);  g_free(lower_little);  return s ? (char *) big + (s - lower_big) : NULL;}

⌨️ 快捷键说明

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