Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in
Toggle navigation
Menu
Open sidebar
Libretro
libretro-gme
Commits
c6b341e8
Commit
c6b341e8
authored
Oct 09, 2021
by
Libretro-Admin
Browse files
Hook up VFS
parent
c9afdb29
Pipeline
#63763
passed with stages
in 8 minutes and 31 seconds
Changes
42
Pipelines
30
Expand all
Hide whitespace changes
Inline
Side-by-side
Makefile.common
View file @
c6b341e8
...
...
@@ -78,10 +78,21 @@ SOURCES_C := $(CORE_DIR)/src/libretro.c \
$(DEPS_DIR)
/zlib-1.2.8/gzlib.c
\
$(DEPS_DIR)
/zlib-1.2.8/gzread.c
\
$(DEPS_DIR)
/zlib-1.2.8/gzwrite.c
\
$(DEPS_DIR)
/zlib-1.2.8/trees.c
\
$(DEPS_DIR)
/libretro-common/compat/compat_snprintf.c
\
$(DEPS_DIR)
/libretro-common/compat/compat_posix_string.c
\
$(DEPS_DIR)
/libretro-common/compat/compat_strcasestr.c
\
$(DEPS_DIR)
/libretro-common/compat/compat_strl.c
\
$(DEPS_DIR)
/libretro-common/file/file_path.c
\
$(DEPS_DIR)
/libretro-common/string/stdstring.c
$(DEPS_DIR)
/zlib-1.2.8/trees.c
ifneq
($(STATIC_LINKING), 1)
SOURCES_C
+=
\
$(LIBRETRO_COMM_DIR)
/compat/compat_strcasestr.c
\
$(LIBRETRO_COMM_DIR)
/encodings/encoding_utf.c
\
$(LIBRETRO_COMM_DIR)
/compat/compat_snprintf.c
\
$(LIBRETRO_COMM_DIR)
/compat/compat_strl.c
\
$(LIBRETRO_COMM_DIR)
/compat/compat_posix_string.c
\
$(LIBRETRO_COMM_DIR)
/compat/fopen_utf8.c
\
$(LIBRETRO_COMM_DIR)
/streams/file_stream.c
\
$(LIBRETRO_COMM_DIR)
/streams/file_stream_transforms.c
\
$(LIBRETRO_COMM_DIR)
/string/stdstring.c
\
$(LIBRETRO_COMM_DIR)
/vfs/vfs_implementation.c
\
$(LIBRETRO_COMM_DIR)
/file/file_path.c
\
$(LIBRETRO_COMM_DIR)
/file/file_path_io.c
\
$(LIBRETRO_COMM_DIR)
/time/rtime.c
endif
deps/game-music-emu/gme/Data_Reader.cpp
View file @
c6b341e8
...
...
@@ -6,6 +6,7 @@
#include <assert.h>
#include <string.h>
#include <stdio.h>
#include <streams/file_stream.h>
/* Copyright (C) 2005-2006 Shay Green. This module is free software; you
can redistribute it and/or modify it under the terms of the GNU Lesser
...
...
@@ -22,6 +23,20 @@ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */
const
char
Data_Reader
::
eof_error
[]
=
"Unexpected end of file"
;
extern
"C"
{
/* forward declarations */
RFILE
*
rfopen
(
const
char
*
path
,
const
char
*
mode
);
int
rfclose
(
RFILE
*
stream
);
int64_t
rftell
(
RFILE
*
stream
);
int
rferror
(
RFILE
*
stream
);
int64_t
rfread
(
void
*
buffer
,
size_t
elem_size
,
size_t
elem_count
,
RFILE
*
stream
);
int64_t
rfseek
(
RFILE
*
stream
,
int64_t
offset
,
int
origin
);
int
rfeof
(
RFILE
*
stream
);
}
blargg_err_t
Data_Reader
::
read
(
void
*
p
,
long
s
)
{
long
result
=
read_avail
(
p
,
s
);
...
...
@@ -193,40 +208,41 @@ Std_File_Reader::~Std_File_Reader() { close(); }
blargg_err_t
Std_File_Reader
::
open
(
const
char
*
path
)
{
file_
=
fopen
(
path
,
"rb"
);
if
(
!
file_
)
return
"Couldn't open file"
;
return
0
;
file_
=
r
fopen
(
path
,
"rb"
);
if
(
!
file_
)
return
"Couldn't open file"
;
return
0
;
}
long
Std_File_Reader
::
size
()
const
{
long
pos
=
tell
();
fseek
(
(
FILE
*
)
file_
,
0
,
SEEK_END
);
long
result
=
tell
();
fseek
(
(
FILE
*
)
file_
,
pos
,
SEEK_SET
);
return
result
;
int64_t
result
;
int64_t
pos
=
rftell
((
RFILE
*
)
file_
);
rfseek
(
(
RFILE
*
)
file_
,
0
,
SEEK_END
);
result
=
rftell
((
RFILE
*
)
file_
);
rfseek
(
(
RFILE
*
)
file_
,
pos
,
SEEK_SET
);
return
result
;
}
long
Std_File_Reader
::
read_avail
(
void
*
p
,
long
s
)
{
return
fread
(
p
,
1
,
s
,
(
FILE
*
)
file_
);
return
r
fread
(
p
,
1
,
s
,
(
R
FILE
*
)
file_
);
}
blargg_err_t
Std_File_Reader
::
read
(
void
*
p
,
long
s
)
{
if
(
s
==
(
long
)
fread
(
p
,
1
,
s
,
(
FILE
*
)
file_
)
)
return
0
;
if
(
feof
(
(
FILE
*
)
file_
)
)
return
eof_error
;
return
"Couldn't read from file"
;
if
(
s
==
(
long
)
r
fread
(
p
,
1
,
s
,
(
R
FILE
*
)
file_
)
)
return
0
;
if
(
r
feof
(
(
R
FILE
*
)
file_
)
)
return
eof_error
;
return
"Couldn't read from file"
;
}
long
Std_File_Reader
::
tell
()
const
{
return
ftell
(
(
FILE
*
)
file_
);
}
long
Std_File_Reader
::
tell
()
const
{
return
(
long
)
r
ftell
(
(
R
FILE
*
)
file_
);
}
blargg_err_t
Std_File_Reader
::
seek
(
long
n
)
{
if
(
!
fseek
(
(
FILE
*
)
file_
,
n
,
SEEK_SET
)
)
if
(
!
r
fseek
(
(
R
FILE
*
)
file_
,
n
,
SEEK_SET
)
)
return
0
;
if
(
n
>
size
()
)
return
eof_error
;
...
...
@@ -237,7 +253,7 @@ void Std_File_Reader::close()
{
if
(
file_
)
{
fclose
(
(
FILE
*
)
file_
);
r
fclose
(
(
R
FILE
*
)
file_
);
file_
=
0
;
}
}
...
...
@@ -250,24 +266,24 @@ void Std_File_Reader::close()
static
const
char
*
get_gzip_eof
(
const
char
*
path
,
long
*
eof
)
{
FILE
*
file
=
fopen
(
path
,
"rb"
);
unsigned
char
buf
[
4
];
RFILE
*
file
=
rfopen
(
path
,
"rb"
);
if
(
!
file
)
return
"Couldn't open file"
;
unsigned
char
buf
[
4
];
if
(
fread
(
buf
,
2
,
1
,
file
)
>
0
&&
buf
[
0
]
==
0x1F
&&
buf
[
1
]
==
0x8B
)
if
(
rfread
(
buf
,
2
,
1
,
file
)
>
0
&&
buf
[
0
]
==
0x1F
&&
buf
[
1
]
==
0x8B
)
{
fseek
(
file
,
-
4
,
SEEK_END
);
fread
(
buf
,
4
,
1
,
file
);
r
fseek
(
file
,
-
4
,
SEEK_END
);
r
fread
(
buf
,
4
,
1
,
file
);
*
eof
=
get_le32
(
buf
);
}
else
{
fseek
(
file
,
0
,
SEEK_END
);
*
eof
=
ftell
(
file
);
r
fseek
(
file
,
0
,
SEEK_END
);
*
eof
=
(
long
)
r
ftell
(
file
);
}
const
char
*
err
=
(
ferror
(
file
)
||
feof
(
file
))
?
"Couldn't get file size"
:
0
;
fclose
(
file
);
const
char
*
err
=
(
r
ferror
(
file
)
||
r
feof
(
file
))
?
"Couldn't get file size"
:
0
;
r
fclose
(
file
);
return
err
;
}
...
...
deps/libretro-common/compat/compat_posix_string.c
View file @
c6b341e8
/* Copyright (C) 2010-20
17
The RetroArch team
/* Copyright (C) 2010-20
20
The RetroArch team
*
* ---------------------------------------------------------------------------------------
* The following license statement only applies to this file (compat_posix_string.c).
...
...
deps/libretro-common/compat/compat_snprintf.c
View file @
c6b341e8
/* Copyright (C) 2010-20
17
The RetroArch team
/* Copyright (C) 2010-20
20
The RetroArch team
*
* ---------------------------------------------------------------------------------------
* The following license statement only applies to this file (compat_snprintf.c).
...
...
@@ -23,8 +23,6 @@
/* THIS FILE HAS NOT BEEN VALIDATED ON PLATFORMS BESIDES MSVC */
#ifdef _MSC_VER
#include <retro_common.h>
#include <stdio.h>
#include <stdarg.h>
...
...
@@ -35,12 +33,12 @@
#if _MSC_VER < 1300
#define _vscprintf c89_vscprintf_retro__
static
int
c89_vscprintf_retro__
(
const
char
*
f
orma
t
,
va_list
pargs
)
static
int
c89_vscprintf_retro__
(
const
char
*
f
m
t
,
va_list
pargs
)
{
int
retval
;
va_list
argcopy
;
va_copy
(
argcopy
,
pargs
);
retval
=
vsnprintf
(
NULL
,
0
,
f
orma
t
,
argcopy
);
retval
=
vsnprintf
(
NULL
,
0
,
f
m
t
,
argcopy
);
va_end
(
argcopy
);
return
retval
;
}
...
...
@@ -48,29 +46,36 @@ static int c89_vscprintf_retro__(const char *format, va_list pargs)
/* http://stackoverflow.com/questions/2915672/snprintf-and-visual-studio-2010 */
int
c99_vsnprintf_retro__
(
char
*
outBuf
,
size_t
size
,
const
char
*
f
orma
t
,
va_list
ap
)
int
c99_vsnprintf_retro__
(
char
*
s
,
size_t
len
,
const
char
*
f
m
t
,
va_list
ap
)
{
int
count
=
-
1
;
if
(
size
!=
0
)
if
(
len
!=
0
)
{
#if (_MSC_VER <= 1310)
count
=
_vsnprintf
(
outBuf
,
size
,
forma
t
,
ap
);
count
=
_vsnprintf
(
s
,
len
-
1
,
fm
t
,
ap
);
#else
count
=
_vsnprintf_s
(
outBuf
,
size
,
_TRUNCATE
,
forma
t
,
ap
);
count
=
_vsnprintf_s
(
s
,
len
,
len
-
1
,
fm
t
,
ap
);
#endif
}
if
(
count
==
-
1
)
count
=
_vscprintf
(
format
,
ap
);
count
=
_vscprintf
(
fmt
,
ap
);
/* there was no room for a NULL, so truncate the last character */
if
(
count
==
len
&&
len
)
s
[
len
-
1
]
=
'\0'
;
return
count
;
}
int
c99_snprintf_retro__
(
char
*
outBuf
,
size_t
size
,
const
char
*
f
orma
t
,
...)
int
c99_snprintf_retro__
(
char
*
s
,
size_t
len
,
const
char
*
f
m
t
,
...)
{
int
count
;
va_list
ap
;
va_start
(
ap
,
f
orma
t
);
count
=
c99_vsnprintf_retro__
(
outBuf
,
size
,
forma
t
,
ap
);
va_start
(
ap
,
f
m
t
);
count
=
c99_vsnprintf_retro__
(
s
,
len
,
fm
t
,
ap
);
va_end
(
ap
);
return
count
;
...
...
deps/libretro-common/compat/compat_strcasestr.c
View file @
c6b341e8
/* Copyright (C) 2010-20
17
The RetroArch team
/* Copyright (C) 2010-20
20
The RetroArch team
*
* ---------------------------------------------------------------------------------------
* The following license statement only applies to this file (compat_strcasestr.c).
...
...
deps/libretro-common/compat/compat_strl.c
View file @
c6b341e8
/* Copyright (C) 2010-20
17
The RetroArch team
/* Copyright (C) 2010-20
20
The RetroArch team
*
* ---------------------------------------------------------------------------------------
* The following license statement only applies to this file (compat_strl.c).
...
...
@@ -20,10 +20,10 @@
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
#include <stdlib.h>
#include <ctype.h>
#include <compat/strl.h>
#include <compat/posix_string.h>
/* Implementation of strlcpy()/strlcat() based on OpenBSD. */
...
...
@@ -60,3 +60,10 @@ size_t strlcat(char *dest, const char *source, size_t size)
return
len
+
strlcpy
(
dest
,
source
,
size
);
}
#endif
char
*
strldup
(
const
char
*
s
,
size_t
n
)
{
char
*
dst
=
(
char
*
)
malloc
(
sizeof
(
char
)
*
(
n
+
1
));
strlcpy
(
dst
,
s
,
n
);
return
dst
;
}
deps/libretro-common/compat/fopen_utf8.c
0 → 100644
View file @
c6b341e8
/* Copyright (C) 2010-2020 The RetroArch team
*
* ---------------------------------------------------------------------------------------
* The following license statement only applies to this file (fopen_utf8.c).
* ---------------------------------------------------------------------------------------
*
* Permission is hereby granted, free of charge,
* to any person obtaining a copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation the rights to
* use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software,
* and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
#include <compat/fopen_utf8.h>
#include <encodings/utf.h>
#include <stdio.h>
#include <stdlib.h>
#if defined(_WIN32_WINNT) && _WIN32_WINNT < 0x0500 || defined(_XBOX)
#ifndef LEGACY_WIN32
#define LEGACY_WIN32
#endif
#endif
#ifdef _WIN32
#undef fopen
void
*
fopen_utf8
(
const
char
*
filename
,
const
char
*
mode
)
{
#if defined(LEGACY_WIN32)
FILE
*
ret
=
NULL
;
char
*
filename_local
=
utf8_to_local_string_alloc
(
filename
);
if
(
!
filename_local
)
return
NULL
;
ret
=
fopen
(
filename_local
,
mode
);
if
(
filename_local
)
free
(
filename_local
);
return
ret
;
#else
wchar_t
*
filename_w
=
utf8_to_utf16_string_alloc
(
filename
);
wchar_t
*
mode_w
=
utf8_to_utf16_string_alloc
(
mode
);
FILE
*
ret
=
NULL
;
if
(
filename_w
&&
mode_w
)
ret
=
_wfopen
(
filename_w
,
mode_w
);
if
(
filename_w
)
free
(
filename_w
);
if
(
mode_w
)
free
(
mode_w
);
return
ret
;
#endif
}
#endif
deps/libretro-common/encodings/encoding_utf.c
0 → 100644
View file @
c6b341e8
/* Copyright (C) 2010-2020 The RetroArch team
*
* ---------------------------------------------------------------------------------------
* The following license statement only applies to this file (encoding_utf.c).
* ---------------------------------------------------------------------------------------
*
* Permission is hereby granted, free of charge,
* to any person obtaining a copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation the rights to
* use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software,
* and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
#include <stdint.h>
#include <stdlib.h>
#include <stddef.h>
#include <string.h>
#include <boolean.h>
#include <compat/strl.h>
#include <retro_inline.h>
#include <encodings/utf.h>
#if defined(_WIN32) && !defined(_XBOX)
#include <windows.h>
#elif defined(_XBOX)
#include <xtl.h>
#endif
#define UTF8_WALKBYTE(string) (*((*(string))++))
static
unsigned
leading_ones
(
uint8_t
c
)
{
unsigned
ones
=
0
;
while
(
c
&
0x80
)
{
ones
++
;
c
<<=
1
;
}
return
ones
;
}
/* Simple implementation. Assumes the sequence is
* properly synchronized and terminated. */
size_t
utf8_conv_utf32
(
uint32_t
*
out
,
size_t
out_chars
,
const
char
*
in
,
size_t
in_size
)
{
unsigned
i
;
size_t
ret
=
0
;
while
(
in_size
&&
out_chars
)
{
unsigned
extra
,
shift
;
uint32_t
c
;
uint8_t
first
=
*
in
++
;
unsigned
ones
=
leading_ones
(
first
);
if
(
ones
>
6
||
ones
==
1
)
/* Invalid or desync. */
break
;
extra
=
ones
?
ones
-
1
:
ones
;
if
(
1
+
extra
>
in_size
)
/* Overflow. */
break
;
shift
=
(
extra
-
1
)
*
6
;
c
=
(
first
&
((
1
<<
(
7
-
ones
))
-
1
))
<<
(
6
*
extra
);
for
(
i
=
0
;
i
<
extra
;
i
++
,
in
++
,
shift
-=
6
)
c
|=
(
*
in
&
0x3f
)
<<
shift
;
*
out
++
=
c
;
in_size
-=
1
+
extra
;
out_chars
--
;
ret
++
;
}
return
ret
;
}
bool
utf16_conv_utf8
(
uint8_t
*
out
,
size_t
*
out_chars
,
const
uint16_t
*
in
,
size_t
in_size
)
{
size_t
out_pos
=
0
;
size_t
in_pos
=
0
;
static
const
uint8_t
utf8_limits
[
5
]
=
{
0xC0
,
0xE0
,
0xF0
,
0xF8
,
0xFC
};
for
(;;)
{
unsigned
num_adds
;
uint32_t
value
;
if
(
in_pos
==
in_size
)
{
*
out_chars
=
out_pos
;
return
true
;
}
value
=
in
[
in_pos
++
];
if
(
value
<
0x80
)
{
if
(
out
)
out
[
out_pos
]
=
(
char
)
value
;
out_pos
++
;
continue
;
}
if
(
value
>=
0xD800
&&
value
<
0xE000
)
{
uint32_t
c2
;
if
(
value
>=
0xDC00
||
in_pos
==
in_size
)
break
;
c2
=
in
[
in_pos
++
];
if
(
c2
<
0xDC00
||
c2
>=
0xE000
)
break
;
value
=
(((
value
-
0xD800
)
<<
10
)
|
(
c2
-
0xDC00
))
+
0x10000
;
}
for
(
num_adds
=
1
;
num_adds
<
5
;
num_adds
++
)
if
(
value
<
(((
uint32_t
)
1
)
<<
(
num_adds
*
5
+
6
)))
break
;
if
(
out
)
out
[
out_pos
]
=
(
char
)(
utf8_limits
[
num_adds
-
1
]
+
(
value
>>
(
6
*
num_adds
)));
out_pos
++
;
do
{
num_adds
--
;
if
(
out
)
out
[
out_pos
]
=
(
char
)(
0x80
+
((
value
>>
(
6
*
num_adds
))
&
0x3F
));
out_pos
++
;
}
while
(
num_adds
!=
0
);
}
*
out_chars
=
out_pos
;
return
false
;
}
/* Acts mostly like strlcpy.
*
* Copies the given number of UTF-8 characters,
* but at most d_len bytes.
*
* Always NULL terminates.
* Does not copy half a character.
*
* Returns number of bytes. 's' is assumed valid UTF-8.
* Use only if 'chars' is considerably less than 'd_len'. */
size_t
utf8cpy
(
char
*
d
,
size_t
d_len
,
const
char
*
s
,
size_t
chars
)
{
const
uint8_t
*
sb
=
(
const
uint8_t
*
)
s
;
const
uint8_t
*
sb_org
=
sb
;
if
(
!
s
)
return
0
;
while
(
*
sb
&&
chars
--
>
0
)
{
sb
++
;
while
((
*
sb
&
0xC0
)
==
0x80
)
sb
++
;
}
if
((
size_t
)(
sb
-
sb_org
)
>
d_len
-
1
/* NUL */
)
{
sb
=
sb_org
+
d_len
-
1
;
while
((
*
sb
&
0xC0
)
==
0x80
)
sb
--
;
}
memcpy
(
d
,
sb_org
,
sb
-
sb_org
);
d
[
sb
-
sb_org
]
=
'\0'
;
return
sb
-
sb_org
;
}
const
char
*
utf8skip
(
const
char
*
str
,
size_t
chars
)
{
const
uint8_t
*
strb
=
(
const
uint8_t
*
)
str
;
if
(
!
chars
)
return
str
;
do
{
strb
++
;
while
((
*
strb
&
0xC0
)
==
0x80
)
strb
++
;
chars
--
;
}
while
(
chars
);
return
(
const
char
*
)
strb
;
}
size_t
utf8len
(
const
char
*
string
)
{
size_t
ret
=
0
;
if
(
!
string
)
return
0
;
while
(
*
string
)
{
if
((
*
string
&
0xC0
)
!=
0x80
)
ret
++
;
string
++
;
}
return
ret
;
}
/* Does not validate the input, returns garbage if it's not UTF-8. */
uint32_t
utf8_walk
(
const
char
**
string
)
{
uint8_t
first
=
UTF8_WALKBYTE
(
string
);
uint32_t
ret
=
0
;
if
(
first
<
128
)
return
first
;
ret
=
(
ret
<<
6
)
|
(
UTF8_WALKBYTE
(
string
)
&
0x3F
);
if
(
first
>=
0xE0
)
{
ret
=
(
ret
<<
6
)
|
(
UTF8_WALKBYTE
(
string
)
&
0x3F
);
if
(
first
>=
0xF0
)
{
ret
=
(
ret
<<
6
)
|
(
UTF8_WALKBYTE
(
string
)
&
0x3F
);
return
ret
|
(
first
&
7
)
<<
18
;
}
return
ret
|
(
first
&
15
)
<<
12
;
}
return
ret
|
(
first
&
31
)
<<
6
;
}
static
bool
utf16_to_char
(
uint8_t
**
utf_data
,
size_t
*
dest_len
,
const
uint16_t
*
in
)
{
unsigned
len
=
0
;
while
(
in
[
len
]
!=
'\0'
)
len
++
;
utf16_conv_utf8
(
NULL
,
dest_len
,
in
,
len
);
*
dest_len
+=
1
;
*
utf_data
=
(
uint8_t
*
)
malloc
(
*
dest_len
);
if
(
*
utf_data
==
0
)
return
false
;
return
utf16_conv_utf8
(
*
utf_data
,
dest_len
,
in
,
len
);
}
bool
utf16_to_char_string
(
const
uint16_t
*
in
,
char
*
s
,
size_t
len
)
{