utf16_to_utf8
This commit is contained in:
parent
6f07b921bc
commit
b8dae8de40
10 changed files with 91 additions and 65 deletions
1
fs/fat.c
1
fs/fat.c
|
@ -25,6 +25,7 @@
|
||||||
#include <grub/mm.h>
|
#include <grub/mm.h>
|
||||||
#include <grub/err.h>
|
#include <grub/err.h>
|
||||||
#include <grub/dl.h>
|
#include <grub/dl.h>
|
||||||
|
#include <grub/charset.h>
|
||||||
|
|
||||||
#define GRUB_FAT_DIR_ENTRY_SIZE 32
|
#define GRUB_FAT_DIR_ENTRY_SIZE 32
|
||||||
|
|
||||||
|
|
|
@ -28,6 +28,7 @@
|
||||||
#include <grub/types.h>
|
#include <grub/types.h>
|
||||||
#include <grub/fshelp.h>
|
#include <grub/fshelp.h>
|
||||||
#include <grub/hfs.h>
|
#include <grub/hfs.h>
|
||||||
|
#include <grub/charset.h>
|
||||||
|
|
||||||
#define GRUB_HFSPLUS_MAGIC 0x482B
|
#define GRUB_HFSPLUS_MAGIC 0x482B
|
||||||
#define GRUB_HFSPLUSX_MAGIC 0x4858
|
#define GRUB_HFSPLUSX_MAGIC 0x4858
|
||||||
|
|
|
@ -26,6 +26,7 @@
|
||||||
#include <grub/dl.h>
|
#include <grub/dl.h>
|
||||||
#include <grub/types.h>
|
#include <grub/types.h>
|
||||||
#include <grub/fshelp.h>
|
#include <grub/fshelp.h>
|
||||||
|
#include <grub/charset.h>
|
||||||
|
|
||||||
#define GRUB_ISO9660_FSTYPE_DIR 0040000
|
#define GRUB_ISO9660_FSTYPE_DIR 0040000
|
||||||
#define GRUB_ISO9660_FSTYPE_REG 0100000
|
#define GRUB_ISO9660_FSTYPE_REG 0100000
|
||||||
|
|
1
fs/jfs.c
1
fs/jfs.c
|
@ -24,6 +24,7 @@
|
||||||
#include <grub/disk.h>
|
#include <grub/disk.h>
|
||||||
#include <grub/dl.h>
|
#include <grub/dl.h>
|
||||||
#include <grub/types.h>
|
#include <grub/types.h>
|
||||||
|
#include <grub/charset.h>
|
||||||
|
|
||||||
#define GRUB_JFS_MAX_SYMLNK_CNT 8
|
#define GRUB_JFS_MAX_SYMLNK_CNT 8
|
||||||
#define GRUB_JFS_FILETYPE_MASK 0170000
|
#define GRUB_JFS_FILETYPE_MASK 0170000
|
||||||
|
|
|
@ -24,6 +24,7 @@
|
||||||
#include <grub/dl.h>
|
#include <grub/dl.h>
|
||||||
#include <grub/fshelp.h>
|
#include <grub/fshelp.h>
|
||||||
#include <grub/ntfs.h>
|
#include <grub/ntfs.h>
|
||||||
|
#include <grub/charset.h>
|
||||||
|
|
||||||
static grub_dl_t my_mod;
|
static grub_dl_t my_mod;
|
||||||
|
|
||||||
|
|
84
include/grub/charset.h
Normal file
84
include/grub/charset.h
Normal file
|
@ -0,0 +1,84 @@
|
||||||
|
/*
|
||||||
|
* GRUB -- GRand Unified Bootloader
|
||||||
|
* Copyright (C) 1999,2000,2001,2002,2003,2004,2005,2006,2007,2008,2009 Free Software Foundation, Inc.
|
||||||
|
*
|
||||||
|
* GRUB is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* GRUB is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with GRUB. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef GRUB_CHARSET_HEADER
|
||||||
|
#define GRUB_CHARSET_HEADER 1
|
||||||
|
|
||||||
|
/* Convert UTF-16 to UTF-8. */
|
||||||
|
static inline grub_uint8_t *
|
||||||
|
grub_utf16_to_utf8 (grub_uint8_t *dest, grub_uint16_t *src,
|
||||||
|
grub_size_t size)
|
||||||
|
{
|
||||||
|
grub_uint32_t code_high = 0;
|
||||||
|
|
||||||
|
while (size--)
|
||||||
|
{
|
||||||
|
grub_uint32_t code = *src++;
|
||||||
|
|
||||||
|
if (code_high)
|
||||||
|
{
|
||||||
|
if (code >= 0xDC00 && code <= 0xDFFF)
|
||||||
|
{
|
||||||
|
/* Surrogate pair. */
|
||||||
|
code = ((code_high - 0xD800) << 12) + (code - 0xDC00) + 0x10000;
|
||||||
|
|
||||||
|
*dest++ = (code >> 18) | 0xF0;
|
||||||
|
*dest++ = ((code >> 12) & 0x3F) | 0x80;
|
||||||
|
*dest++ = ((code >> 6) & 0x3F) | 0x80;
|
||||||
|
*dest++ = (code & 0x3F) | 0x80;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* Error... */
|
||||||
|
*dest++ = '?';
|
||||||
|
}
|
||||||
|
|
||||||
|
code_high = 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (code <= 0x007F)
|
||||||
|
*dest++ = code;
|
||||||
|
else if (code <= 0x07FF)
|
||||||
|
{
|
||||||
|
*dest++ = (code >> 6) | 0xC0;
|
||||||
|
*dest++ = (code & 0x3F) | 0x80;
|
||||||
|
}
|
||||||
|
else if (code >= 0xD800 && code <= 0xDBFF)
|
||||||
|
{
|
||||||
|
code_high = code;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
else if (code >= 0xDC00 && code <= 0xDFFF)
|
||||||
|
{
|
||||||
|
/* Error... */
|
||||||
|
*dest++ = '?';
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
*dest++ = (code >> 12) | 0xE0;
|
||||||
|
*dest++ = ((code >> 6) & 0x3F) | 0x80;
|
||||||
|
*dest++ = (code & 0x3F) | 0x80;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return dest;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
|
@ -177,9 +177,6 @@ int EXPORT_FUNC(grub_sprintf) (char *str, const char *fmt, ...) __attribute__ ((
|
||||||
int EXPORT_FUNC(grub_vsprintf) (char *str, const char *fmt, va_list args);
|
int EXPORT_FUNC(grub_vsprintf) (char *str, const char *fmt, va_list args);
|
||||||
void EXPORT_FUNC(grub_exit) (void) __attribute__ ((noreturn));
|
void EXPORT_FUNC(grub_exit) (void) __attribute__ ((noreturn));
|
||||||
void EXPORT_FUNC(grub_abort) (void) __attribute__ ((noreturn));
|
void EXPORT_FUNC(grub_abort) (void) __attribute__ ((noreturn));
|
||||||
grub_uint8_t *EXPORT_FUNC(grub_utf16_to_utf8) (grub_uint8_t *dest,
|
|
||||||
grub_uint16_t *src,
|
|
||||||
grub_size_t size);
|
|
||||||
grub_ssize_t EXPORT_FUNC(grub_utf8_to_ucs4) (grub_uint32_t *dest,
|
grub_ssize_t EXPORT_FUNC(grub_utf8_to_ucs4) (grub_uint32_t *dest,
|
||||||
grub_size_t destsize,
|
grub_size_t destsize,
|
||||||
const grub_uint8_t *src,
|
const grub_uint8_t *src,
|
||||||
|
|
|
@ -18,6 +18,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <grub/misc.h>
|
#include <grub/misc.h>
|
||||||
|
#include <grub/charset.h>
|
||||||
#include <grub/efi/api.h>
|
#include <grub/efi/api.h>
|
||||||
#include <grub/efi/efi.h>
|
#include <grub/efi/efi.h>
|
||||||
#include <grub/efi/console_control.h>
|
#include <grub/efi/console_control.h>
|
||||||
|
|
62
kern/misc.c
62
kern/misc.c
|
@ -837,68 +837,6 @@ grub_sprintf (char *str, const char *fmt, ...)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Convert UTF-16 to UTF-8. */
|
|
||||||
grub_uint8_t *
|
|
||||||
grub_utf16_to_utf8 (grub_uint8_t *dest, grub_uint16_t *src,
|
|
||||||
grub_size_t size)
|
|
||||||
{
|
|
||||||
grub_uint32_t code_high = 0;
|
|
||||||
|
|
||||||
while (size--)
|
|
||||||
{
|
|
||||||
grub_uint32_t code = *src++;
|
|
||||||
|
|
||||||
if (code_high)
|
|
||||||
{
|
|
||||||
if (code >= 0xDC00 && code <= 0xDFFF)
|
|
||||||
{
|
|
||||||
/* Surrogate pair. */
|
|
||||||
code = ((code_high - 0xD800) << 12) + (code - 0xDC00) + 0x10000;
|
|
||||||
|
|
||||||
*dest++ = (code >> 18) | 0xF0;
|
|
||||||
*dest++ = ((code >> 12) & 0x3F) | 0x80;
|
|
||||||
*dest++ = ((code >> 6) & 0x3F) | 0x80;
|
|
||||||
*dest++ = (code & 0x3F) | 0x80;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
/* Error... */
|
|
||||||
*dest++ = '?';
|
|
||||||
}
|
|
||||||
|
|
||||||
code_high = 0;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (code <= 0x007F)
|
|
||||||
*dest++ = code;
|
|
||||||
else if (code <= 0x07FF)
|
|
||||||
{
|
|
||||||
*dest++ = (code >> 6) | 0xC0;
|
|
||||||
*dest++ = (code & 0x3F) | 0x80;
|
|
||||||
}
|
|
||||||
else if (code >= 0xD800 && code <= 0xDBFF)
|
|
||||||
{
|
|
||||||
code_high = code;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
else if (code >= 0xDC00 && code <= 0xDFFF)
|
|
||||||
{
|
|
||||||
/* Error... */
|
|
||||||
*dest++ = '?';
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
*dest++ = (code >> 12) | 0xE0;
|
|
||||||
*dest++ = ((code >> 6) & 0x3F) | 0x80;
|
|
||||||
*dest++ = (code & 0x3F) | 0x80;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return dest;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Convert a (possibly null-terminated) UTF-8 string of at most SRCSIZE
|
/* Convert a (possibly null-terminated) UTF-8 string of at most SRCSIZE
|
||||||
bytes (if SRCSIZE is -1, it is ignored) in length to a UCS-4 string.
|
bytes (if SRCSIZE is -1, it is ignored) in length to a UCS-4 string.
|
||||||
Return the number of characters converted. DEST must be able to hold
|
Return the number of characters converted. DEST must be able to hold
|
||||||
|
|
|
@ -25,6 +25,7 @@
|
||||||
#include <grub/device.h>
|
#include <grub/device.h>
|
||||||
#include <grub/disk.h>
|
#include <grub/disk.h>
|
||||||
#include <grub/misc.h>
|
#include <grub/misc.h>
|
||||||
|
#include <grub/charset.h>
|
||||||
#include <grub/mm.h>
|
#include <grub/mm.h>
|
||||||
#include <grub/types.h>
|
#include <grub/types.h>
|
||||||
#include <grub/dl.h>
|
#include <grub/dl.h>
|
||||||
|
|
Loading…
Reference in a new issue