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 /libass/ass.c | |
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.
Diffstat (limited to 'libass/ass.c')
-rw-r--r-- | libass/ass.c | 16 |
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; |