summaryrefslogtreecommitdiffstats
path: root/libass/ass.c
diff options
context:
space:
mode:
authorOneric <oneric@oneric.stub>2022-10-07 18:00:22 +0200
committerOneric <oneric@oneric.stub>2022-10-14 20:21:04 +0200
commitb7b816a8ea09d26574ba4090b6e1362a59065b66 (patch)
tree5ecceebfdb2fff410c37bfd242c8cdd0b0f5b05d /libass/ass.c
parent833d4026cb1eb9c97d8d67dc57cbde9ade4638ea (diff)
downloadlibass-b7b816a8ea09d26574ba4090b6e1362a59065b66.tar.bz2
libass-b7b816a8ea09d26574ba4090b6e1362a59065b66.tar.xz
Accept hexadecimal for all non-inline int values
VSFilter uses the same GetInt method used for colour values also for all other integer headers and Style or Dialogue integer fields. This method accepts hexadecimal with a case-insensitive '&H' or '0x' prefix. GetInt is practically unchanged from its initial form in 2003's revision 8 of guliverkli to today's xy*. (MPC-HC'S ISR changed it more but it still behaves the same wrt to hex) The previously used atoi never accepts hexadecimal input and is now only used for the ReadOrder pseudo-field which isn't parsed by VSFilter. This relies on uint32_t <-> int32_t conversions just keeping the bitpattern unchanged (as do many other places in libass) and mystrtou32_modulo taking sign prefixes into account rather than rejecting non-positive input.
Diffstat (limited to 'libass/ass.c')
-rw-r--r--libass/ass.c16
1 files changed, 8 insertions, 8 deletions
diff --git a/libass/ass.c b/libass/ass.c
index 0624b98..7c2ccde 100644
--- a/libass/ass.c
+++ b/libass/ass.c
@@ -282,7 +282,7 @@ static long long string2timecode(ASS_Library *library, char *p)
}
#define COLORVAL(name) ANYVAL(name,parse_color_header)
-#define INTVAL(name) ANYVAL(name,atoi)
+#define INTVAL(name) ANYVAL(name,parse_int_header)
#define FPVAL(name) ANYVAL(name,ass_atof)
#define TIMEVAL(name) \
} else if (ass_strcasecmp(tname, #name) == 0) { \
@@ -403,13 +403,13 @@ void ass_process_force_style(ASS_Track *track)
token = eq + 1;
if (!ass_strcasecmp(*fs, "PlayResX"))
- track->PlayResX = atoi(token);
+ track->PlayResX = parse_int_header(token);
else if (!ass_strcasecmp(*fs, "PlayResY"))
- track->PlayResY = atoi(token);
+ track->PlayResY = parse_int_header(token);
else if (!ass_strcasecmp(*fs, "Timer"))
track->Timer = ass_atof(token);
else if (!ass_strcasecmp(*fs, "WrapStyle"))
- track->WrapStyle = atoi(token);
+ track->WrapStyle = parse_int_header(token);
else if (!ass_strcasecmp(*fs, "ScaledBorderAndShadow"))
track->ScaledBorderAndShadow = parse_bool(token);
else if (!ass_strcasecmp(*fs, "Kerning"))
@@ -677,16 +677,16 @@ static int process_info_line(ASS_Track *track, char *str)
{
if (!strncmp(str, "PlayResX:", 9)) {
check_duplicate_info_line(track, SINFO_PLAYRESX, "PlayResX");
- track->PlayResX = atoi(str + 9);
+ track->PlayResX = parse_int_header(str + 9);
} else if (!strncmp(str, "PlayResY:", 9)) {
check_duplicate_info_line(track, SINFO_PLAYRESY, "PlayResY");
- track->PlayResY = atoi(str + 9);
+ track->PlayResY = parse_int_header(str + 9);
} else if (!strncmp(str, "Timer:", 6)) {
check_duplicate_info_line(track, SINFO_TIMER, "Timer");
track->Timer = ass_atof(str + 6);
} else if (!strncmp(str, "WrapStyle:", 10)) {
check_duplicate_info_line(track, SINFO_WRAPSTYLE, "WrapStyle");
- track->WrapStyle = atoi(str + 10);
+ track->WrapStyle = parse_int_header(str + 10);
} else if (!strncmp(str, "ScaledBorderAndShadow:", 22)) {
check_duplicate_info_line(track, SINFO_SCALEDBORDER,
"ScaledBorderAndShadow");
@@ -1129,7 +1129,7 @@ void ass_process_chunk(ASS_Track *track, char *data, int size,
break;
NEXT(p, token);
- event->Layer = atoi(token);
+ event->Layer = parse_int_header(token);
if (process_event_tail(track, event, p, 3))
break;