summaryrefslogtreecommitdiffstats
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
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.
-rw-r--r--libass/ass.c16
-rw-r--r--libass/ass_utils.c12
-rw-r--r--libass/ass_utils.h1
3 files changed, 18 insertions, 11 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;
diff --git a/libass/ass_utils.c b/libass/ass_utils.c
index a9db9be..af44704 100644
--- a/libass/ass_utils.c
+++ b/libass/ass_utils.c
@@ -256,9 +256,9 @@ uint32_t parse_color_tag(char *str)
return ass_bswap32((uint32_t) color);
}
-uint32_t parse_color_header(char *str)
+int32_t parse_int_header(char *str)
{
- uint32_t color = 0;
+ uint32_t val = 0;
unsigned base;
if (!ass_strncasecmp(str, "&h", 2) || !ass_strncasecmp(str, "0x", 2)) {
@@ -267,7 +267,13 @@ uint32_t parse_color_header(char *str)
} else
base = 10;
- mystrtou32_modulo(&str, base, &color);
+ mystrtou32_modulo(&str, base, &val);
+ return val;
+}
+
+uint32_t parse_color_header(char *str)
+{
+ uint32_t color = parse_int_header(str);
return ass_bswap32(color);
}
diff --git a/libass/ass_utils.h b/libass/ass_utils.h
index 3e239b5..b4f570a 100644
--- a/libass/ass_utils.h
+++ b/libass/ass_utils.h
@@ -97,6 +97,7 @@ void skip_spaces(char **str);
void rskip_spaces(char **str, char *limit);
int32_t parse_alpha_tag(char *str);
uint32_t parse_color_tag(char *str);
+int32_t parse_int_header(char *str);
uint32_t parse_color_header(char *str);
char parse_bool(char *str);
int parse_ycbcr_matrix(char *str);