diff options
author | Oneric <oneric@oneric.stub> | 2022-10-07 18:00:22 +0200 |
---|---|---|
committer | Oneric <oneric@oneric.stub> | 2022-10-14 20:21:04 +0200 |
commit | b7b816a8ea09d26574ba4090b6e1362a59065b66 (patch) | |
tree | 5ecceebfdb2fff410c37bfd242c8cdd0b0f5b05d | |
parent | 833d4026cb1eb9c97d8d67dc57cbde9ade4638ea (diff) | |
download | libass-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.c | 16 | ||||
-rw-r--r-- | libass/ass_utils.c | 12 | ||||
-rw-r--r-- | libass/ass_utils.h | 1 |
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); |