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

📄 i18n.c

📁 串口调试工具。非常好的串口调试助手
💻 C
字号:
/***********************************************************************//* i18n.c                                                              *//* ------                                                              *//*           GTKTerm Software                                          *//*                      (c) Julien Schmitt                             *//*                      julien@jls-info.com                            *//*                                                                     *//* ------------------------------------------------------------------- *//*                                                                     *//*   Purpose                                                           *//*      UTF-8 conversion to print in the console                       *//*                                                                     *//*   ChangeLog                                                         *//*      - 0.99.5 : created strerror_utf8() function                    *//*      - 0.99.2 : file creation by Julien                             *//*                 function iconv_from_utf8_to_locale is based         *//*                 on hddtemp 0.3 source code                          *//*                                                                     *//***********************************************************************/#include <stdio.h>#include <stdlib.h>#include <iconv.h>#include <langinfo.h>#include <locale.h>#include <string.h>#include <errno.h>#include <stdarg.h>#include <glib.h>#include "i18n.h"static char *iconv_from_utf8_to_locale(const char *str, const char *fallback_string){  const char *charset;  iconv_t cd;  size_t nconv;  char *buffer, *old_buffer;  char *buffer_ptr;  char *string_ptr;  char *string;  const size_t buffer_inc = 80; // Increment buffer size in 80 bytes step  size_t buffer_size;  size_t buffer_size_left;  size_t string_size;  // Get the current charset  charset = nl_langinfo(CODESET);  if(strcmp(charset, "UTF-8") == 0)    return g_strdup(str);  // Open iconv descriptor  cd = iconv_open(charset, "UTF-8");  if (cd == (iconv_t) -1)    return g_strdup(fallback_string);  // Set up the buffer  buffer_size = buffer_size_left = buffer_inc;  buffer = (char *) malloc(buffer_size + 1);  if (buffer == NULL)    return g_strdup(fallback_string);  buffer_ptr = buffer;  string = g_strdup(str);  string_ptr = string;  string_size = strlen(string);  // Do the conversion  while (string_size != 0)  {    nconv = iconv(cd, &string_ptr, &string_size, &buffer_ptr, &buffer_size_left);    if (nconv == (size_t) -1)    {      if (errno != E2BIG)                 // if translation error      {        iconv_close(cd);                  // close descriptor        free(buffer);                     // free buffer	free(string);        return g_strdup(fallback_string); // and return fallback string      }      // increase buffer size      buffer_size += buffer_inc;      buffer_size_left = buffer_inc;      old_buffer = buffer;      buffer = (char *) realloc(buffer, buffer_size + 1);      if (buffer == NULL)	{	  free(string);	  return g_strdup(fallback_string);	}      buffer_ptr = (buffer_ptr - old_buffer) + buffer;    }  }  *buffer_ptr = '\0';  iconv_close(cd);  free(string);  return buffer;}int i18n_printf(const char *format, ...){  char *new_format;  int return_value;  va_list args;  new_format = iconv_from_utf8_to_locale(format, "");  if(new_format != NULL)    {      va_start(args, format);      return_value = vprintf(new_format, args);      va_end(args);      free(new_format);    }  else    return_value = 0;  return return_value;}int i18n_fprintf(FILE *stream, const char *format, ...){  char *new_format;  int return_value;  va_list args;  new_format = iconv_from_utf8_to_locale(format, "");  if(new_format != NULL)    {      va_start(args, format);      return_value = vfprintf(stream, new_format, args);      va_end(args);      free(new_format);    }  else    return_value = 0;  return return_value;}void i18n_perror(const char *s){  char *conv_string;  int errno_backup;  errno_backup = errno;  conv_string = iconv_from_utf8_to_locale(s, "");  if(conv_string != NULL)    {      fprintf(stderr, "%s: %s\n", conv_string, strerror_utf8(errno_backup));      free(conv_string);    }}char *strerror_utf8(int errornum){  char *utf8error;     utf8error = g_locale_to_utf8(strerror(errornum), -1, NULL, NULL, NULL);  return utf8error;}

⌨️ 快捷键说明

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