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
beetle-lynx-libretro
Commits
12c75b6f
Unverified
Commit
12c75b6f
authored
Oct 14, 2020
by
Libretro-Admin
Committed by
GitHub
Oct 14, 2020
Browse files
Merge pull request #42 from negativeExponent/libretro-common
Update libretro-common
parents
48b6b739
a5ff2156
Pipeline
#1436
passed with stages
in 1 minute and 57 seconds
Changes
32
Pipelines
1
Expand all
Hide whitespace changes
Inline
Side-by-side
Makefile.common
View file @
12c75b6f
...
...
@@ -99,7 +99,9 @@ SOURCES_C += \
$(LIBRETRO_COMM_DIR)
/compat/compat_strcasestr.c
\
$(LIBRETRO_COMM_DIR)
/encodings/encoding_utf.c
\
$(LIBRETRO_COMM_DIR)
/file/file_path.c
\
$(LIBRETRO_COMM_DIR)
/vfs/vfs_implementation.c
$(LIBRETRO_COMM_DIR)
/vfs/vfs_implementation.c
\
$(LIBRETRO_COMM_DIR)
/time/rtime.c
\
$(LIBRETRO_COMM_DIR)
/string/stdstring.c
endif
SOURCES_C
+=
\
...
...
libretro-common/compat/compat_posix_string.c
View file @
12c75b6f
/* Copyright (C) 2010-20
18
The RetroArch team
/* Copyright (C) 2010-20
20
The RetroArch team
*
* ---------------------------------------------------------------------------------------
* The following license statement only applies to this file (compat_posix_string.c).
...
...
libretro-common/compat/compat_snprintf.c
View file @
12c75b6f
/* Copyright (C) 2010-20
18
The RetroArch team
/* Copyright (C) 2010-20
20
The RetroArch team
*
* ---------------------------------------------------------------------------------------
* The following license statement only applies to this file (compat_snprintf.c).
...
...
@@ -33,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
;
}
...
...
@@ -46,38 +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
-
1
,
f
orma
t
,
ap
);
count
=
_vsnprintf
(
s
,
len
-
1
,
f
m
t
,
ap
);
#else
count
=
_vsnprintf_s
(
outBuf
,
size
,
size
-
1
,
f
orma
t
,
ap
);
count
=
_vsnprintf_s
(
s
,
len
,
len
-
1
,
f
m
t
,
ap
);
#endif
}
if
(
count
==
-
1
)
count
=
_vscprintf
(
f
orma
t
,
ap
);
count
=
_vscprintf
(
f
m
t
,
ap
);
if
(
count
==
size
)
{
/* there was no room for a NULL, so truncate the last character */
outBuf
[
size
-
1
]
=
'\0'
;
}
/* 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
;
...
...
libretro-common/compat/compat_strcasestr.c
View file @
12c75b6f
/* Copyright (C) 2010-20
18
The RetroArch team
/* Copyright (C) 2010-20
20
The RetroArch team
*
* ---------------------------------------------------------------------------------------
* The following license statement only applies to this file (compat_strcasestr.c).
...
...
libretro-common/compat/compat_strl.c
View file @
12c75b6f
/* Copyright (C) 2010-20
18
The RetroArch team
/* Copyright (C) 2010-20
20
The RetroArch team
*
* ---------------------------------------------------------------------------------------
* The following license statement only applies to this file (compat_strl.c).
...
...
libretro-common/compat/fopen_utf8.c
View file @
12c75b6f
/* Copyright (C) 2010-20
18
The RetroArch team
/* Copyright (C) 2010-20
20
The RetroArch team
*
* ---------------------------------------------------------------------------------------
* The following license statement only applies to this file (fopen_utf8.c).
...
...
libretro-common/encodings/encoding_utf.c
View file @
12c75b6f
/* Copyright (C) 2010-20
18
The RetroArch team
/* Copyright (C) 2010-20
20
The RetroArch team
*
* ---------------------------------------------------------------------------------------
* The following license statement only applies to this file (encoding_utf.c).
...
...
@@ -37,6 +37,8 @@
#include <xtl.h>
#endif
#define UTF8_WALKBYTE(string) (*((*(string))++))
static
unsigned
leading_ones
(
uint8_t
c
)
{
unsigned
ones
=
0
;
...
...
@@ -89,13 +91,14 @@ size_t utf8_conv_utf32(uint32_t *out, size_t out_chars,
bool
utf16_conv_utf8
(
uint8_t
*
out
,
size_t
*
out_chars
,
const
uint16_t
*
in
,
size_t
in_size
)
{
static
uint8_t
kUtf8Limits
[
5
]
=
{
0xC0
,
0xE0
,
0xF0
,
0xF8
,
0xFC
};
size_t
out_pos
=
0
;
size_t
in_pos
=
0
;
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
A
dds
;
unsigned
num
_a
dds
;
uint32_t
value
;
if
(
in_pos
==
in_size
)
...
...
@@ -124,21 +127,21 @@ bool utf16_conv_utf8(uint8_t *out, size_t *out_chars,
value
=
(((
value
-
0xD800
)
<<
10
)
|
(
c2
-
0xDC00
))
+
0x10000
;
}
for
(
num
A
dds
=
1
;
num
A
dds
<
5
;
num
A
dds
++
)
if
(
value
<
(((
uint32_t
)
1
)
<<
(
num
A
dds
*
5
+
6
)))
for
(
num
_a
dds
=
1
;
num
_a
dds
<
5
;
num
_a
dds
++
)
if
(
value
<
(((
uint32_t
)
1
)
<<
(
num
_a
dds
*
5
+
6
)))
break
;
if
(
out
)
out
[
out_pos
]
=
(
char
)(
kU
tf8
L
imits
[
num
A
dds
-
1
]
+
(
value
>>
(
6
*
num
A
dds
)));
out
[
out_pos
]
=
(
char
)(
u
tf8
_l
imits
[
num
_a
dds
-
1
]
+
(
value
>>
(
6
*
num
_a
dds
)));
out_pos
++
;
do
{
num
A
dds
--
;
num
_a
dds
--
;
if
(
out
)
out
[
out_pos
]
=
(
char
)(
0x80
+
((
value
>>
(
6
*
num
A
dds
))
&
0x3F
));
+
((
value
>>
(
6
*
num
_a
dds
))
&
0x3F
));
out_pos
++
;
}
while
(
num
A
dds
!=
0
);
}
while
(
num
_a
dds
!=
0
);
}
*
out_chars
=
out_pos
;
...
...
@@ -166,13 +169,15 @@ size_t utf8cpy(char *d, size_t d_len, const char *s, size_t chars)
while
(
*
sb
&&
chars
--
>
0
)
{
sb
++
;
while
((
*
sb
&
0xC0
)
==
0x80
)
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
--
;
while
((
*
sb
&
0xC0
)
==
0x80
)
sb
--
;
}
memcpy
(
d
,
sb_org
,
sb
-
sb_org
);
...
...
@@ -184,14 +189,18 @@ size_t utf8cpy(char *d, size_t d_len, const char *s, size_t chars)
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
++
;
while
((
*
strb
&
0xC0
)
==
0x80
)
strb
++
;
chars
--
;
}
while
(
chars
);
}
while
(
chars
);
return
(
const
char
*
)
strb
;
}
...
...
@@ -211,24 +220,22 @@ size_t utf8len(const char *string)
return
ret
;
}
#define utf8_walkbyte(string) (*((*(string))++))
/* 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
);
uint8_t
first
=
UTF8_WALKBYTE
(
string
);
uint32_t
ret
=
0
;
if
(
first
<
128
)
return
first
;
ret
=
(
ret
<<
6
)
|
(
utf8_walkbyte
(
string
)
&
0x3F
);
ret
=
(
ret
<<
6
)
|
(
UTF8_WALKBYTE
(
string
)
&
0x3F
);
if
(
first
>=
0xE0
)
{
ret
=
(
ret
<<
6
)
|
(
utf8_walkbyte
(
string
)
&
0x3F
);
ret
=
(
ret
<<
6
)
|
(
UTF8_WALKBYTE
(
string
)
&
0x3F
);
if
(
first
>=
0xF0
)
{
ret
=
(
ret
<<
6
)
|
(
utf8_walkbyte
(
string
)
&
0x3F
);
ret
=
(
ret
<<
6
)
|
(
UTF8_WALKBYTE
(
string
)
&
0x3F
);
return
ret
|
(
first
&
7
)
<<
18
;
}
return
ret
|
(
first
&
15
)
<<
12
;
...
...
@@ -277,9 +284,7 @@ bool utf16_to_char_string(const uint16_t *in, char *s, size_t len)
static
char
*
mb_to_mb_string_alloc
(
const
char
*
str
,
enum
CodePage
cp_in
,
enum
CodePage
cp_out
)
{
char
*
path_buf
=
NULL
;
wchar_t
*
path_buf_wide
=
NULL
;
int
path_buf_len
=
0
;
int
path_buf_wide_len
=
MultiByteToWideChar
(
cp_in
,
0
,
str
,
-
1
,
NULL
,
0
);
/* Windows 95 will return 0 from these functions with
...
...
@@ -292,54 +297,51 @@ static char *mb_to_mb_string_alloc(const char *str,
* MultiByteToWideChar also supports CP_UTF7 and CP_UTF8.
*/
if
(
path_buf_wide_len
)
if
(
!
path_buf_wide_len
)
return
strdup
(
str
);
path_buf_wide
=
(
wchar_t
*
)
calloc
(
path_buf_wide_len
+
sizeof
(
wchar_t
),
sizeof
(
wchar_t
));
if
(
path_buf_wide
)
{
path_buf_wide
=
(
wchar_t
*
)
calloc
(
path_buf_wide
_len
+
sizeof
(
wchar_t
),
sizeof
(
wchar_t
)
);
MultiByteToWideChar
(
cp_in
,
0
,
str
,
-
1
,
path_buf_wide
,
path_buf_wide_len
);
if
(
path_buf_wide
)
if
(
*
path_buf_wide
)
{
MultiByteToWideChar
(
cp_
in
,
0
,
str
,
-
1
,
path_buf_wide
,
path_buf_wide_len
);
int
path_buf_len
=
WideCharToMultiByte
(
cp_
out
,
0
,
path_buf_wide
,
-
1
,
NULL
,
0
,
NULL
,
NULL
);
if
(
*
path_buf_
wide
)
if
(
path_buf_
len
)
{
path_buf
_len
=
WideCharToMultiByte
(
cp_out
,
0
,
path_buf_
wide
,
-
1
,
NULL
,
0
,
NULL
,
NULL
);
char
*
path_buf
=
(
char
*
)
calloc
(
path_buf_
len
+
sizeof
(
char
),
sizeof
(
char
)
);
if
(
path_buf
_len
)
if
(
path_buf
)
{
path_buf
=
(
char
*
)
calloc
(
path_buf_len
+
sizeof
(
char
),
sizeof
(
char
));
WideCharToMultiByte
(
cp_out
,
0
,
path_buf_wide
,
-
1
,
path_buf
,
path_buf_len
,
NULL
,
NULL
);
if
(
path_buf
)
{
WideCharToMultiByte
(
cp_out
,
0
,
path_buf_wide
,
-
1
,
path_buf
,
path_buf_len
,
NULL
,
NULL
);
free
(
path_buf_wide
);
free
(
path_buf_wide
);
if
(
*
path_buf
)
return
path_buf
;
if
(
*
path_buf
)
return
path_buf
;
free
(
path_buf
);
return
NULL
;
}
}
else
{
free
(
path_buf_wide
);
return
strdup
(
str
);
free
(
path_buf
);
return
NULL
;
}
}
else
{
free
(
path_buf_wide
);
return
strdup
(
str
);
}
}
}
else
return
strdup
(
str
);
if
(
path_buf_wide
)
free
(
path_buf_wide
);
}
return
NULL
;
}
...
...
@@ -379,13 +381,13 @@ char* local_to_utf8_string_alloc(const char *str)
wchar_t
*
utf8_to_utf16_string_alloc
(
const
char
*
str
)
{
#ifdef _WIN32
int
len
=
0
;
int
out_len
=
0
;
int
len
=
0
;
int
out_len
=
0
;
#else
size_t
len
=
0
;
size_t
len
=
0
;
size_t
out_len
=
0
;
#endif
wchar_t
*
buf
=
NULL
;
wchar_t
*
buf
=
NULL
;
if
(
!
str
||
!*
str
)
return
NULL
;
...
...
libretro-common/file/file_path.c
View file @
12c75b6f
/* Copyright (C) 2010-20
19
The RetroArch team
/* Copyright (C) 2010-20
20
The RetroArch team
*
* ---------------------------------------------------------------------------------------
* The following license statement only applies to this file (file_path.c).
...
...
@@ -32,8 +32,7 @@
#include <file/file_path.h>
#include <retro_assert.h>
#include <string/stdstring.h>
#define VFS_FRONTEND
#include <vfs/vfs_implementation.h>
#include <time/rtime.h>
/* TODO: There are probably some unnecessary things on this huge include list now but I'm too afraid to touch it */
#ifdef __APPLE__
...
...
@@ -46,7 +45,6 @@
#include <compat/strl.h>
#include <compat/posix_string.h>
#endif
#include <compat/strcasestr.h>
#include <retro_miscellaneous.h>
#include <encodings/utf.h>
...
...
@@ -82,12 +80,7 @@
#include <pspkernel.h>
#endif
#if defined(PS2)
#include <fileXio_rpc.h>
#include <fileXio.h>
#endif
#if defined(__CELLOS_LV2__)
#if defined(__CELLOS_LV2__) && !defined(__PSL1GHT__)
#include <cell/cell_fs.h>
#endif
...
...
@@ -95,7 +88,7 @@
#define FIO_S_ISDIR SCE_S_ISDIR
#endif
#if (defined(__CELLOS_LV2__) && !defined(__PSL1GHT__)) || defined(__QNX__) || defined(PSP)
|| defined(PS2)
#if (defined(__CELLOS_LV2__) && !defined(__PSL1GHT__)) || defined(__QNX__) || defined(PSP)
#include <unistd.h>
/* stat() is defined here */
#endif
...
...
@@ -114,133 +107,6 @@
#endif
static
retro_vfs_stat_t
path_stat_cb
=
retro_vfs_stat_impl
;
static
retro_vfs_mkdir_t
path_mkdir_cb
=
retro_vfs_mkdir_impl
;
void
path_vfs_init
(
const
struct
retro_vfs_interface_info
*
vfs_info
)
{
const
struct
retro_vfs_interface
*
vfs_iface
=
vfs_info
->
iface
;
path_stat_cb
=
retro_vfs_stat_impl
;
path_mkdir_cb
=
retro_vfs_mkdir_impl
;
if
(
vfs_info
->
required_interface_version
<
PATH_REQUIRED_VFS_VERSION
||
!
vfs_iface
)
return
;
path_stat_cb
=
vfs_iface
->
stat
;
path_mkdir_cb
=
vfs_iface
->
mkdir
;
}
int
path_stat
(
const
char
*
path
)
{
return
path_stat_cb
(
path
,
NULL
);
}
/**
* path_is_directory:
* @path : path
*
* Checks if path is a directory.
*
* Returns: true (1) if path is a directory, otherwise false (0).
*/
bool
path_is_directory
(
const
char
*
path
)
{
return
(
path_stat_cb
(
path
,
NULL
)
&
RETRO_VFS_STAT_IS_DIRECTORY
)
!=
0
;
}
bool
path_is_character_special
(
const
char
*
path
)
{
return
(
path_stat_cb
(
path
,
NULL
)
&
RETRO_VFS_STAT_IS_CHARACTER_SPECIAL
)
!=
0
;
}
bool
path_is_valid
(
const
char
*
path
)
{
return
(
path_stat_cb
(
path
,
NULL
)
&
RETRO_VFS_STAT_IS_VALID
)
!=
0
;
}
int32_t
path_get_size
(
const
char
*
path
)
{
int32_t
filesize
=
0
;
if
(
path_stat_cb
(
path
,
&
filesize
)
!=
0
)
return
filesize
;
return
-
1
;
}
/**
* path_mkdir:
* @dir : directory
*
* Create directory on filesystem.
*
* Returns: true (1) if directory could be created, otherwise false (0).
**/
bool
path_mkdir
(
const
char
*
dir
)
{
bool
sret
=
false
;
bool
norecurse
=
false
;
char
*
basedir
=
NULL
;
if
(
!
(
dir
&&
*
dir
))
return
false
;
/* Use heap. Real chance of stack
* overflow if we recurse too hard. */
basedir
=
strdup
(
dir
);
if
(
!
basedir
)
return
false
;
path_parent_dir
(
basedir
);
if
(
!*
basedir
||
!
strcmp
(
basedir
,
dir
))
{
free
(
basedir
);
return
false
;
}
#if defined(GEKKO)
{
size_t
len
=
strlen
(
basedir
);
/* path_parent_dir() keeps the trailing slash.
* On Wii, mkdir() fails if the path has a
* trailing slash...
* We must therefore remove it. */
if
(
len
>
0
)
if
(
basedir
[
len
-
1
]
==
'/'
)
basedir
[
len
-
1
]
=
'\0'
;
}
#endif
if
(
path_is_directory
(
basedir
))
norecurse
=
true
;
else
{
sret
=
path_mkdir
(
basedir
);
if
(
sret
)
norecurse
=
true
;
}
free
(
basedir
);
if
(
norecurse
)
{
int
ret
=
path_mkdir_cb
(
dir
);
/* Don't treat this as an error. */
if
(
ret
==
-
2
&&
path_is_directory
(
dir
))
return
true
;
return
(
ret
==
0
);
}
return
sret
;
}
/**
* path_get_archive_delim:
* @path : path
...
...
@@ -253,26 +119,48 @@ bool path_mkdir(const char *dir)
*/
const
char
*
path_get_archive_delim
(
const
char
*
path
)
{
const
char
*
last
=
find_last_slash
(
path
);
const
char
*
delim
=
NULL
;
const
char
*
last_slash
=
find_last_slash
(
path
);
const
char
*
delim
=
NULL
;
char
buf
[
5
];
if
(
!
last
)
buf
[
0
]
=
'\0'
;
if
(
!
last_slash
)
return
NULL
;
/*
Test if it's .zip
*/
delim
=
str
casestr
(
las
t
,
".zip#"
);
/*
Find delimiter position
*/
delim
=
str
rchr
(
last_s
las
h
,
'#'
);
if
(
!
delim
)
/* If it's not a .zip, test if it's .apk */
delim
=
strcasestr
(
last
,
".apk#"
)
;
if
(
!
delim
)
return
NULL
;
if
(
delim
)
return
delim
+
4
;
/* Check whether this is a known archive type
* > Note: The code duplication here is
* deliberate, to maximise performance */
if
(
delim
-
last_slash
>
4
)
{
strlcpy
(
buf
,
delim
-
4
,
sizeof
(
buf
));
buf
[
4
]
=
'\0'
;
/* If it's not a .zip or .apk file, test if it's .7z */
delim
=
strcasestr
(
last
,
".7z#"
);
string_to_lower
(
buf
);
if
(
delim
)
return
delim
+
3
;
/* Check if this is a '.zip', '.apk' or '.7z' file */
if
(
string_is_equal
(
buf
,
".zip"
)
||
string_is_equal
(
buf
,
".apk"
)
||
string_is_equal
(
buf
+
1
,
".7z"
))
return
delim
;
}
else
if
(
delim
-
last_slash
>
3
)
{
strlcpy
(
buf
,
delim
-
3
,
sizeof
(
buf
));
buf
[
3
]
=
'\0'
;
string_to_lower
(
buf
);
/* Check if this is a '.7z' file */
if
(
string_is_equal
(
buf
,
".7z"
))
return
delim
;
}
return
NULL
;
}
...
...
@@ -331,9 +219,12 @@ bool path_is_compressed_file(const char* path)
{
const
char
*
ext
=
path_get_extension
(
path
);
if
(
strcasestr
(
ext
,
"zip"
)
||
strcasestr
(
ext
,
"apk"
)
||
strcasestr
(
ext
,
"7z"
))
if
(
string_is_empty
(
ext
))
return
false
;
if
(
string_is_equal_noncase
(
ext
,
"zip"
)
||
string_is_equal_noncase
(
ext
,
"apk"
)
||
string_is_equal_noncase
(
ext
,
"7z"
))
return
true
;
return
false
;
...
...
@@ -423,7 +314,7 @@ void fill_pathname_slash(char *path, size_t size)
if
(
!
last_slash
)
{
strlcat
(
path
,
path_default_slash
(),
size
);