#if HAVE_LANGINFO_H
# include <langinfo.h>
#endif
-#include <pcre.h>
+
#if HAVE_SHLOBJ_H
# include <Shlobj.h>
#endif
#include "charset.h"
#include "defs.h"
#include "printf.h"
+#include "regexp.h"
#include "regsub.h"
#include "signame.h"
#include "authhash.h"
int nvec, char **vec) {
struct namepartlist *npl = ADDRESS(cs->config, struct namepartlist);
unsigned reflags;
- const char *errstr;
- int erroffset, n;
- pcre *re;
+ regexp *re;
+ char errstr[RXCERR_LEN];
+ size_t erroffset;
+ int n;
if(nvec < 3) {
disorder_error(0, "%s:%d: namepart needs at least 3 arguments",
return -1;
}
reflags = nvec >= 5 ? regsub_flags(vec[4]) : 0;
- if(!(re = pcre_compile(vec[1],
- PCRE_UTF8
- |regsub_compile_options(reflags),
- &errstr, &erroffset, 0))) {
- disorder_error(0, "%s:%d: compiling regexp /%s/: %s (offset %d)",
+ if(!(re = regexp_compile(vec[1], regsub_compile_options(reflags),
+ errstr, sizeof(errstr), &erroffset)))
+ {
+ disorder_error(0, "%s:%d: compiling regexp /%s/: %s (offset %zu)",
cs->path, cs->line, vec[1], errstr, erroffset);
return -1;
}
const struct conf *whoami,
int nvec, char **vec) {
struct transformlist *tl = ADDRESS(cs->config, struct transformlist);
- pcre *re;
+ regexp *re;
+ char errstr[RXCERR_LEN];
unsigned reflags;
- const char *errstr;
- int erroffset;
+ size_t erroffset;
if(nvec < 3) {
disorder_error(0, "%s:%d: transform needs at least 3 arguments",
return -1;
}
reflags = (nvec >= 5 ? regsub_flags(vec[4]) : 0);
- if(!(re = pcre_compile(vec[1],
- PCRE_UTF8
- |regsub_compile_options(reflags),
- &errstr, &erroffset, 0))) {
- disorder_error(0, "%s:%d: compiling regexp /%s/: %s (offset %d)",
+ if(!(re = regexp_compile(vec[1], regsub_compile_options(reflags),
+ errstr, sizeof(errstr), &erroffset)))
+ {
+ disorder_error(0, "%s:%d: compiling regexp /%s/: %s (offset %zu)",
cs->path, cs->line, vec[1], errstr, erroffset);
return -1;
}
for(n = 0; n < npl->n; ++n) {
np = &npl->s[n];
xfree(np->part);
- pcre_free(np->re); /* ...whatever pcre_free is set to. */
+ regexp_free(np->re);
xfree(np->res);
xfree(np->replace);
xfree(np->context);
for(n = 0; n < tl->n; ++n) {
t = &tl->t[n];
xfree(t->type);
- pcre_free(t->re); /* ...whatever pcre_free is set to. */
+ regexp_free(t->re);
xfree(t->replace);
xfree(t->context);
}
return 0;
}
-/** @brief Validate a non-negative (@c long) integer
+/** @brief Common code for validating integer values
* @param cs Configuration state
* @param nvec Length of (proposed) new value
* @param vec Elements of new value
- * @return 0 on success, non-0 on error
+ * @param n_out Where to put the value
*/
-static int validate_non_negative(const struct config_state *cs,
- int nvec, char **vec) {
- long n;
+static int common_validate_integer(const struct config_state *cs,
+ int nvec, char **vec, long *n_out) {
char errbuf[1024];
if(nvec < 1) {
disorder_error(0, "%s:%d: too many arguments", cs->path, cs->line);
return -1;
}
- if(xstrtol(&n, vec[0], 0, 0)) {
+ if(xstrtol(n_out, vec[0], 0, 0)) {
disorder_error(0, "%s:%d: %s", cs->path, cs->line,
format_error(ec_errno, errno, errbuf, sizeof errbuf));
return -1;
}
+ return 0;
+}
+
+/** @brief Validate a non-negative (@c long) integer
+ * @param cs Configuration state
+ * @param nvec Length of (proposed) new value
+ * @param vec Elements of new value
+ * @return 0 on success, non-0 on error
+ */
+static int validate_non_negative(const struct config_state *cs,
+ int nvec, char **vec) {
+ long n;
+ if(common_validate_integer(cs, nvec, vec, &n)) return -1;
if(n < 0) {
disorder_error(0, "%s:%d: must not be negative", cs->path, cs->line);
return -1;
static int validate_positive(const struct config_state *cs,
int nvec, char **vec) {
long n;
- char errbuf[1024];
-
- if(nvec < 1) {
- disorder_error(0, "%s:%d: missing argument", cs->path, cs->line);
- return -1;
- }
- if(nvec > 1) {
- disorder_error(0, "%s:%d: too many arguments", cs->path, cs->line);
- return -1;
- }
- if(xstrtol(&n, vec[0], 0, 0)) {
- disorder_error(0, "%s:%d: %s", cs->path, cs->line,
- format_error(ec_errno, errno, errbuf, sizeof errbuf));
- return -1;
- }
+ if(common_validate_integer(cs, nvec, vec, &n)) return -1;
if(n <= 0) {
disorder_error(0, "%s:%d: must be positive", cs->path, cs->line);
return -1;
if(server) {
if(!strcmp(c->api, "command") && !c->speaker_command)
disorder_fatal(0, "'api command' but speaker_command is not set");
- if((!strcmp(c->api, "rtp")) && c->broadcast.af == -1)
- disorder_fatal(0, "'api rtp' but broadcast is not set");
+ if((!strcmp(c->api, "rtp")) &&
+ c->broadcast.af == -1 && strcmp(c->rtp_mode, "request"))
+ disorder_fatal(0, "'api rtp' but broadcast is not set "
+ "and mode is not not 'request'");
}
/* Override sample format */
if(!strcmp(c->api, "rtp")) {