The function strtok_r() is part of the POSIX.1 specification, but is not available on some platforms. We provide an internal implementation, so we do not need to rely on a platform implementation.tags/n0.9
@@ -1186,7 +1186,6 @@ HAVE_LIST=" | |||||
setrlimit | setrlimit | ||||
strerror_r | strerror_r | ||||
strptime | strptime | ||||
strtok_r | |||||
struct_addrinfo | struct_addrinfo | ||||
struct_ipv6_mreq | struct_ipv6_mreq | ||||
struct_sockaddr_in6 | struct_sockaddr_in6 | ||||
@@ -1585,17 +1584,14 @@ tcp_protocol_deps="network" | |||||
udp_protocol_deps="network" | udp_protocol_deps="network" | ||||
# filters | # filters | ||||
abuffer_filter_deps="strtok_r" | |||||
aconvert_filter_deps="strtok_r" | |||||
aformat_filter_deps="strtok_r" | |||||
amovie_filter_deps="avcodec avformat" | amovie_filter_deps="avcodec avformat" | ||||
blackframe_filter_deps="gpl" | blackframe_filter_deps="gpl" | ||||
boxblur_filter_deps="gpl" | boxblur_filter_deps="gpl" | ||||
cropdetect_filter_deps="gpl" | cropdetect_filter_deps="gpl" | ||||
delogo_filter_deps="gpl" | delogo_filter_deps="gpl" | ||||
drawtext_filter_deps="libfreetype" | drawtext_filter_deps="libfreetype" | ||||
frei0r_filter_deps="frei0r dlopen strtok_r" | |||||
frei0r_src_filter_deps="frei0r dlopen strtok_r" | |||||
frei0r_filter_deps="frei0r dlopen" | |||||
frei0r_src_filter_deps="frei0r dlopen" | |||||
hqdn3d_filter_deps="gpl" | hqdn3d_filter_deps="gpl" | ||||
movie_filter_deps="avcodec avformat" | movie_filter_deps="avcodec avformat" | ||||
mp_filter_deps="gpl avcodec" | mp_filter_deps="gpl avcodec" | ||||
@@ -2942,7 +2938,6 @@ check_func ${malloc_prefix}posix_memalign && enable posix_memalign | |||||
check_func setrlimit | check_func setrlimit | ||||
check_func strerror_r | check_func strerror_r | ||||
check_func strptime | check_func strptime | ||||
check_func strtok_r | |||||
check_func_headers conio.h kbhit | check_func_headers conio.h kbhit | ||||
check_func_headers windows.h PeekNamedPipe | check_func_headers windows.h PeekNamedPipe | ||||
check_func_headers io.h setmode | check_func_headers io.h setmode | ||||
@@ -28,6 +28,7 @@ | |||||
*/ | */ | ||||
#include "libavutil/audioconvert.h" | #include "libavutil/audioconvert.h" | ||||
#include "libavutil/avstring.h" | |||||
#include "libavcodec/audioconvert.h" | #include "libavcodec/audioconvert.h" | ||||
#include "avfilter.h" | #include "avfilter.h" | ||||
#include "internal.h" | #include "internal.h" | ||||
@@ -125,15 +126,15 @@ static av_cold int init(AVFilterContext *ctx, const char *args0, void *opaque) | |||||
aconvert->out_chlayout = 0; | aconvert->out_chlayout = 0; | ||||
aconvert->out_packing_fmt = -1; | aconvert->out_packing_fmt = -1; | ||||
if ((arg = strtok_r(args, ":", &ptr)) && strcmp(arg, "auto")) { | |||||
if ((arg = av_strtok(args, ":", &ptr)) && strcmp(arg, "auto")) { | |||||
if ((ret = ff_parse_sample_format(&aconvert->out_sample_fmt, arg, ctx)) < 0) | if ((ret = ff_parse_sample_format(&aconvert->out_sample_fmt, arg, ctx)) < 0) | ||||
goto end; | goto end; | ||||
} | } | ||||
if ((arg = strtok_r(NULL, ":", &ptr)) && strcmp(arg, "auto")) { | |||||
if ((arg = av_strtok(NULL, ":", &ptr)) && strcmp(arg, "auto")) { | |||||
if ((ret = ff_parse_channel_layout(&aconvert->out_chlayout, arg, ctx)) < 0) | if ((ret = ff_parse_channel_layout(&aconvert->out_chlayout, arg, ctx)) < 0) | ||||
goto end; | goto end; | ||||
} | } | ||||
if ((arg = strtok_r(NULL, ":", &ptr)) && strcmp(arg, "auto")) { | |||||
if ((arg = av_strtok(NULL, ":", &ptr)) && strcmp(arg, "auto")) { | |||||
if ((ret = ff_parse_packing_format((int *)&aconvert->out_packing_fmt, arg, ctx)) < 0) | if ((ret = ff_parse_packing_format((int *)&aconvert->out_packing_fmt, arg, ctx)) < 0) | ||||
goto end; | goto end; | ||||
} | } | ||||
@@ -50,7 +50,7 @@ static av_cold int init(AVFilterContext *ctx, const char *args, void *opaque) | |||||
aformat->fmts_list = all_formats; \ | aformat->fmts_list = all_formats; \ | ||||
} else { \ | } else { \ | ||||
for (fmt_str = fmts_str; \ | for (fmt_str = fmts_str; \ | ||||
fmt_str = strtok_r(fmt_str, ",", &ptr); fmt_str = NULL) { \ | |||||
fmt_str = av_strtok(fmt_str, ",", &ptr); fmt_str = NULL) { \ | |||||
if ((ret = ff_parse_##fmt_name((fmt_type *)&fmt, \ | if ((ret = ff_parse_##fmt_name((fmt_type *)&fmt, \ | ||||
fmt_str, ctx)) < 0) { \ | fmt_str, ctx)) < 0) { \ | ||||
av_freep(&fmts_str); \ | av_freep(&fmts_str); \ | ||||
@@ -25,6 +25,7 @@ | |||||
*/ | */ | ||||
#include "libavutil/audioconvert.h" | #include "libavutil/audioconvert.h" | ||||
#include "libavutil/avstring.h" | |||||
#include "libavutil/fifo.h" | #include "libavutil/fifo.h" | ||||
#include "asrc_abuffer.h" | #include "asrc_abuffer.h" | ||||
#include "internal.h" | #include "internal.h" | ||||
@@ -256,7 +257,7 @@ static av_cold int init(AVFilterContext *ctx, const char *args0, void *opaque) | |||||
char *args = av_strdup(args0); | char *args = av_strdup(args0); | ||||
int ret; | int ret; | ||||
arg = strtok_r(args, ":", &ptr); | |||||
arg = av_strtok(args, ":", &ptr); | |||||
#define ADD_FORMAT(fmt_name) \ | #define ADD_FORMAT(fmt_name) \ | ||||
if (!arg) \ | if (!arg) \ | ||||
@@ -266,7 +267,7 @@ static av_cold int init(AVFilterContext *ctx, const char *args0, void *opaque) | |||||
return ret; \ | return ret; \ | ||||
} \ | } \ | ||||
if (*args) \ | if (*args) \ | ||||
arg = strtok_r(NULL, ":", &ptr) | |||||
arg = av_strtok(NULL, ":", &ptr) | |||||
ADD_FORMAT(sample_rate); | ADD_FORMAT(sample_rate); | ||||
ADD_FORMAT(sample_format); | ADD_FORMAT(sample_format); | ||||
@@ -216,7 +216,7 @@ static av_cold int frei0r_init(AVFilterContext *ctx, | |||||
/* see: http://piksel.org/frei0r/1.2/spec/1.2/spec/group__pluglocations.html */ | /* see: http://piksel.org/frei0r/1.2/spec/1.2/spec/group__pluglocations.html */ | ||||
if ((path = av_strdup(getenv("FREI0R_PATH")))) { | if ((path = av_strdup(getenv("FREI0R_PATH")))) { | ||||
char *p, *ptr = NULL; | char *p, *ptr = NULL; | ||||
for (p = path; p = strtok_r(p, ":", &ptr); p = NULL) | |||||
for (p = path; p = av_strtok(p, ":", &ptr); p = NULL) | |||||
if (frei0r->dl_handle = load_path(ctx, p, dl_name)) | if (frei0r->dl_handle = load_path(ctx, p, dl_name)) | ||||
break; | break; | ||||
av_free(path); | av_free(path); | ||||
@@ -160,6 +160,35 @@ char *av_get_token(const char **buf, const char *term) | |||||
return ret; | return ret; | ||||
} | } | ||||
char *av_strtok(char *s, const char *delim, char **saveptr) | |||||
{ | |||||
char *tok; | |||||
if (!s && !(s = *saveptr)) | |||||
return NULL; | |||||
/* skip leading delimiters */ | |||||
s += strspn(s, delim); | |||||
/* s now points to the first non delimiter char, or to the end of the string */ | |||||
if (!*s) { | |||||
*saveptr = NULL; | |||||
return NULL; | |||||
} | |||||
tok = s++; | |||||
/* skip non delimiters */ | |||||
s += strcspn(s, delim); | |||||
if (*s) { | |||||
*s = 0; | |||||
*saveptr = s+1; | |||||
} else { | |||||
*saveptr = NULL; | |||||
} | |||||
return tok; | |||||
} | |||||
#ifdef TEST | #ifdef TEST | ||||
#undef printf | #undef printf | ||||
@@ -141,4 +141,28 @@ char *av_d2str(double d); | |||||
*/ | */ | ||||
char *av_get_token(const char **buf, const char *term); | char *av_get_token(const char **buf, const char *term); | ||||
/** | |||||
* Split the string into several tokens which can be accessed by | |||||
* successive calls to av_strtok(). | |||||
* | |||||
* A token is defined as a sequence of characters not belonging to the | |||||
* set specified in delim. | |||||
* | |||||
* On the first call to av_strtok(), s should point to the string to | |||||
* parse, and the value of saveptr is ignored. In subsequent calls, s | |||||
* should be NULL, and saveptr should be unchanged since the previous | |||||
* call. | |||||
* | |||||
* This function is similar to strtok_r() defined in POSIX.1. | |||||
* | |||||
* @param s the string to parse, may be NULL | |||||
* @param delim 0-terminated list of token delimiters, must be non-NULL | |||||
* @param saveptr user-provided pointer which points to stored | |||||
* information necessary for av_strtok() to continue scanning the same | |||||
* string. saveptr is updated to point to the next character after the | |||||
* first delimiter found, or to NULL if the string was terminated | |||||
* @return the found token, or NULL when no token is found | |||||
*/ | |||||
char *av_strtok(char *s, const char *delim, char **saveptr); | |||||
#endif /* AVUTIL_AVSTRING_H */ | #endif /* AVUTIL_AVSTRING_H */ |