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

📄 loadmsgcat.c

📁 经典的C语言MP3编码解码实现,可以在linux/unix平台下编译运行.
💻 C
📖 第 1 页 / 共 3 页
字号:
/* For systems that distinguish between text and binary I/O.   O_BINARY is usually declared in <fcntl.h>. */#if !defined O_BINARY && defined _O_BINARY  /* For MSC-compatible compilers.  */# define O_BINARY _O_BINARY# define O_TEXT _O_TEXT#endif#ifdef __BEOS__  /* BeOS 5 has O_BINARY and O_TEXT, but they have no effect.  */# undef O_BINARY# undef O_TEXT#endif/* On reasonable systems, binary I/O is the default.  */#ifndef O_BINARY# define O_BINARY 0#endif/* We need a sign, whether a new catalog was loaded, which can be associated   with all translations.  This is important if the translations are   cached by one of GCC's features.  */int _nl_msg_cat_cntr;/* Expand a system dependent string segment.  Return NULL if unsupported.  */static const char *get_sysdep_segment_value (const char *name){  /* Test for an ISO C 99 section 7.8.1 format string directive.     Syntax:     P R I { d | i | o | u | x | X }     { { | LEAST | FAST } { 8 | 16 | 32 | 64 } | MAX | PTR }  */  /* We don't use a table of 14 times 6 'const char *' strings here, because     data relocations cost startup time.  */  if (name[0] == 'P' && name[1] == 'R' && name[2] == 'I')    {      if (name[3] == 'd' || name[3] == 'i' || name[3] == 'o' || name[3] == 'u'	  || name[3] == 'x' || name[3] == 'X')	{	  if (name[4] == '8' && name[5] == '\0')	    {	      if (name[3] == 'd')		return PRId8;	      if (name[3] == 'i')		return PRIi8;	      if (name[3] == 'o')		return PRIo8;	      if (name[3] == 'u')		return PRIu8;	      if (name[3] == 'x')		return PRIx8;	      if (name[3] == 'X')		return PRIX8;	      abort ();	    }	  if (name[4] == '1' && name[5] == '6' && name[6] == '\0')	    {	      if (name[3] == 'd')		return PRId16;	      if (name[3] == 'i')		return PRIi16;	      if (name[3] == 'o')		return PRIo16;	      if (name[3] == 'u')		return PRIu16;	      if (name[3] == 'x')		return PRIx16;	      if (name[3] == 'X')		return PRIX16;	      abort ();	    }	  if (name[4] == '3' && name[5] == '2' && name[6] == '\0')	    {	      if (name[3] == 'd')		return PRId32;	      if (name[3] == 'i')		return PRIi32;	      if (name[3] == 'o')		return PRIo32;	      if (name[3] == 'u')		return PRIu32;	      if (name[3] == 'x')		return PRIx32;	      if (name[3] == 'X')		return PRIX32;	      abort ();	    }	  if (name[4] == '6' && name[5] == '4' && name[6] == '\0')	    {	      if (name[3] == 'd')		return PRId64;	      if (name[3] == 'i')		return PRIi64;	      if (name[3] == 'o')		return PRIo64;	      if (name[3] == 'u')		return PRIu64;	      if (name[3] == 'x')		return PRIx64;	      if (name[3] == 'X')		return PRIX64;	      abort ();	    }	  if (name[4] == 'L' && name[5] == 'E' && name[6] == 'A'	      && name[7] == 'S' && name[8] == 'T')	    {	      if (name[9] == '8' && name[10] == '\0')		{		  if (name[3] == 'd')		    return PRIdLEAST8;		  if (name[3] == 'i')		    return PRIiLEAST8;		  if (name[3] == 'o')		    return PRIoLEAST8;		  if (name[3] == 'u')		    return PRIuLEAST8;		  if (name[3] == 'x')		    return PRIxLEAST8;		  if (name[3] == 'X')		    return PRIXLEAST8;		  abort ();		}	      if (name[9] == '1' && name[10] == '6' && name[11] == '\0')		{		  if (name[3] == 'd')		    return PRIdLEAST16;		  if (name[3] == 'i')		    return PRIiLEAST16;		  if (name[3] == 'o')		    return PRIoLEAST16;		  if (name[3] == 'u')		    return PRIuLEAST16;		  if (name[3] == 'x')		    return PRIxLEAST16;		  if (name[3] == 'X')		    return PRIXLEAST16;		  abort ();		}	      if (name[9] == '3' && name[10] == '2' && name[11] == '\0')		{		  if (name[3] == 'd')		    return PRIdLEAST32;		  if (name[3] == 'i')		    return PRIiLEAST32;		  if (name[3] == 'o')		    return PRIoLEAST32;		  if (name[3] == 'u')		    return PRIuLEAST32;		  if (name[3] == 'x')		    return PRIxLEAST32;		  if (name[3] == 'X')		    return PRIXLEAST32;		  abort ();		}	      if (name[9] == '6' && name[10] == '4' && name[11] == '\0')		{		  if (name[3] == 'd')		    return PRIdLEAST64;		  if (name[3] == 'i')		    return PRIiLEAST64;		  if (name[3] == 'o')		    return PRIoLEAST64;		  if (name[3] == 'u')		    return PRIuLEAST64;		  if (name[3] == 'x')		    return PRIxLEAST64;		  if (name[3] == 'X')		    return PRIXLEAST64;		  abort ();		}	    }	  if (name[4] == 'F' && name[5] == 'A' && name[6] == 'S'	      && name[7] == 'T')	    {	      if (name[8] == '8' && name[9] == '\0')		{		  if (name[3] == 'd')		    return PRIdFAST8;		  if (name[3] == 'i')		    return PRIiFAST8;		  if (name[3] == 'o')		    return PRIoFAST8;		  if (name[3] == 'u')		    return PRIuFAST8;		  if (name[3] == 'x')		    return PRIxFAST8;		  if (name[3] == 'X')		    return PRIXFAST8;		  abort ();		}	      if (name[8] == '1' && name[9] == '6' && name[10] == '\0')		{		  if (name[3] == 'd')		    return PRIdFAST16;		  if (name[3] == 'i')		    return PRIiFAST16;		  if (name[3] == 'o')		    return PRIoFAST16;		  if (name[3] == 'u')		    return PRIuFAST16;		  if (name[3] == 'x')		    return PRIxFAST16;		  if (name[3] == 'X')		    return PRIXFAST16;		  abort ();		}	      if (name[8] == '3' && name[9] == '2' && name[10] == '\0')		{		  if (name[3] == 'd')		    return PRIdFAST32;		  if (name[3] == 'i')		    return PRIiFAST32;		  if (name[3] == 'o')		    return PRIoFAST32;		  if (name[3] == 'u')		    return PRIuFAST32;		  if (name[3] == 'x')		    return PRIxFAST32;		  if (name[3] == 'X')		    return PRIXFAST32;		  abort ();		}	      if (name[8] == '6' && name[9] == '4' && name[10] == '\0')		{		  if (name[3] == 'd')		    return PRIdFAST64;		  if (name[3] == 'i')		    return PRIiFAST64;		  if (name[3] == 'o')		    return PRIoFAST64;		  if (name[3] == 'u')		    return PRIuFAST64;		  if (name[3] == 'x')		    return PRIxFAST64;		  if (name[3] == 'X')		    return PRIXFAST64;		  abort ();		}	    }	  if (name[4] == 'M' && name[5] == 'A' && name[6] == 'X'	      && name[7] == '\0')	    {	      if (name[3] == 'd')		return PRIdMAX;	      if (name[3] == 'i')		return PRIiMAX;	      if (name[3] == 'o')		return PRIoMAX;	      if (name[3] == 'u')		return PRIuMAX;	      if (name[3] == 'x')		return PRIxMAX;	      if (name[3] == 'X')		return PRIXMAX;	      abort ();	    }	  if (name[4] == 'P' && name[5] == 'T' && name[6] == 'R'	      && name[7] == '\0')	    {	      if (name[3] == 'd')		return PRIdPTR;	      if (name[3] == 'i')		return PRIiPTR;	      if (name[3] == 'o')		return PRIoPTR;	      if (name[3] == 'u')		return PRIuPTR;	      if (name[3] == 'x')		return PRIxPTR;	      if (name[3] == 'X')		return PRIXPTR;	      abort ();	    }	}    }  /* Test for a glibc specific printf() format directive flag.  */  if (name[0] == 'I' && name[1] == '\0')    {#if defined _LIBC || __GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 2)      /* The 'I' flag, in numeric format directives, replaces ASCII digits	 with the 'outdigits' defined in the LC_CTYPE locale facet.  This is	 used for Farsi (Persian) and maybe Arabic.  */      return "I";#else      return "";#endif    }  /* Other system dependent strings are not valid.  */  return NULL;}/* Initialize the codeset dependent parts of an opened message catalog.   Return the header entry.  */const char *internal_function_nl_init_domain_conv (struct loaded_l10nfile *domain_file,		      struct loaded_domain *domain,		      struct binding *domainbinding){  /* Find out about the character set the file is encoded with.     This can be found (in textual form) in the entry "".  If this     entry does not exist or if this does not contain the `charset='     information, we will assume the charset matches the one the     current locale and we don't have to perform any conversion.  */  char *nullentry;  size_t nullentrylen;  /* Preinitialize fields, to avoid recursion during _nl_find_msg.  */  domain->codeset_cntr =    (domainbinding != NULL ? domainbinding->codeset_cntr : 0);#ifdef _LIBC  domain->conv = (__gconv_t) -1;#else# if HAVE_ICONV  domain->conv = (iconv_t) -1;# endif#endif  domain->conv_tab = NULL;  /* Get the header entry.  */  nullentry = _nl_find_msg (domain_file, domainbinding, "", &nullentrylen);  if (nullentry != NULL)    {#if defined _LIBC || HAVE_ICONV      const char *charsetstr;      charsetstr = strstr (nullentry, "charset=");      if (charsetstr != NULL)	{	  size_t len;	  char *charset;	  const char *outcharset;	  charsetstr += strlen ("charset=");	  len = strcspn (charsetstr, " \t\n");	  charset = (char *) alloca (len + 1);# if defined _LIBC || HAVE_MEMPCPY	  *((char *) mempcpy (charset, charsetstr, len)) = '\0';# else	  memcpy (charset, charsetstr, len);	  charset[len] = '\0';# endif	  /* The output charset should normally be determined by the	     locale.  But sometimes the locale is not used or not correctly	     set up, so we provide a possibility for the user to override	     this.  Moreover, the value specified through	     bind_textdomain_codeset overrides both.  */	  if (domainbinding != NULL && domainbinding->codeset != NULL)	    outcharset = domainbinding->codeset;	  else	    {	      outcharset = getenv ("OUTPUT_CHARSET");	      if (outcharset == NULL || outcharset[0] == '\0')		{# ifdef _LIBC		  outcharset = _NL_CURRENT (LC_CTYPE, CODESET);# else#  if HAVE_ICONV		  extern const char *locale_charset (void);		  outcharset = locale_charset ();#  endif# endif		}	    }# ifdef _LIBC	  /* We always want to use transliteration.  */	  outcharset = norm_add_slashes (outcharset, "TRANSLIT");	  charset = norm_add_slashes (charset, NULL);	  if (__gconv_open (outcharset, charset, &domain->conv,			    GCONV_AVOID_NOCONV)	      != __GCONV_OK)	    domain->conv = (__gconv_t) -1;# else#  if HAVE_ICONV	  /* When using GNU libc >= 2.2 or GNU libiconv >= 1.5,	     we want to use transliteration.  */#   if (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 2) || __GLIBC__ > 2 \       || _LIBICONV_VERSION >= 0x0105	  if (strchr (outcharset, '/') == NULL)	    {	      char *tmp;	      len = strlen (outcharset);	      tmp = (char *) alloca (len + 10 + 1);	      memcpy (tmp, outcharset, len);	      memcpy (tmp + len, "//TRANSLIT", 10 + 1);	      outcharset = tmp;	      domain->conv = iconv_open (outcharset, charset);	      freea (outcharset);	    }	  else#   endif	    domain->conv = iconv_open (outcharset, charset);#  endif# endif	  freea (charset);	}#endif /* _LIBC || HAVE_ICONV */    }  return nullentry;}/* Frees the codeset dependent parts of an opened message catalog.  */voidinternal_function_nl_free_domain_conv (struct loaded_domain *domain){  if (domain->conv_tab != NULL && domain->conv_tab != (char **) -1)    free (domain->conv_tab);#ifdef _LIBC  if (domain->conv != (__gconv_t) -1)    __gconv_close (domain->conv);#else# if HAVE_ICONV  if (domain->conv != (iconv_t) -1)    iconv_close (domain->conv);# endif#endif}/* Load the message catalogs specified by FILENAME.  If it is no valid   message catalog do nothing.  */voidinternal_function_nl_load_domain (struct loaded_l10nfile *domain_file,		 struct binding *domainbinding){  int fd;  size_t size;#ifdef _LIBC  struct stat64 st;#else  struct stat st;#endif  struct mo_file_header *data = (struct mo_file_header *) -1;  int use_mmap = 0;  struct loaded_domain *domain;  int revision;  const char *nullentry;  domain_file->decided = 1;  domain_file->data = NULL;  /* Note that it would be useless to store domainbinding in domain_file     because domainbinding might be == NULL now but != NULL later (after     a call to bind_textdomain_codeset).  */  /* If the record does not represent a valid locale the FILENAME     might be NULL.  This can happen when according to the given     specification the locale file name is different for XPG and CEN     syntax.  */  if (domain_file->filename == NULL)    return;  /* Try to open the addressed file.  */  fd = open (domain_file->filename, O_RDONLY | O_BINARY);  if (fd == -1)    return;  /* We must know about the size of the file.  */  if (#ifdef _LIBC      __builtin_expect (fstat64 (fd, &st) != 0, 0)#else

⌨️ 快捷键说明

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