struct tm tm;
dvr_config_t *cfg;
htsmsg_t *m;
- size_t l, j;
+ size_t l, j, k;
long max;
int dir_dosubs;
max = pathconf(filename, _PC_NAME_MAX);
if (max < 8)
max = NAME_MAX;
+ max -= 2;
j = strlen(filename);
snprintf(filename + j, sizeof(filename) - j, "/%s", dirsep);
if (filename[j] == '/')
}
/* Check the maximum filename length */
l = strlen(number);
- if (l + strlen(filename + j) > max) {
- l = j + (max - l);
- if (filename[l - 1] == '$') /* not optimal */
- filename[l + 1] = '\0';
- else
- filename[l] = '\0';
+ k = strlen(filename + j);
+ if (l + k > max) {
+ s = (char *)htsstr_substitute_find(filename + j, '$');
+ if (s == NULL || s - (filename + j) < (l + k) - max) {
+cut1:
+ l = j + (max - l);
+ if (filename[l - 1] == '$') /* not optimal */
+ filename[l + 1] = '\0';
+ else
+ filename[l] = '\0';
+ } else {
+ x = (char *)htsstr_escape_find(filename + j, s - (filename + j) - ((l + k) - max));
+ if (x == NULL)
+ goto cut1;
+ k = strlen(s);
+ memmove(x, s, k);
+ x[k] = '\0';
+ }
}
htsstr_substitute(filename + j, ptmp, sizeof(ptmp), '$', dvr_subs_tally, number, tmp, sizeof(tmp));
return res;
}
+const char *
+htsstr_escape_find(const char *src, size_t upto_index)
+{
+ while (upto_index && *src) {
+ if (*src == '\\') {
+ src++;
+ upto_index--;
+ if (*src == '\0' || upto_index == 0) {
+ src--;
+ break;
+ }
+ }
+ src++;
+ upto_index--;
+ }
+ if (*src)
+ return src;
+ return NULL;
+}
+
static void
htsstr_argsplit_add(char ***argv, int *argc, char *s)
{
free(argv);
}
+const char *
+htsstr_substitute_find(const char *src, int first)
+{
+ while (*src) {
+ if (*src == '\\') {
+ src++;
+ if (*src == '\0')
+ break;
+ } else if (*src == first)
+ return src;
+ src++;
+ }
+ return NULL;
+}
+
char *
htsstr_substitute(const char *src, char *dst, size_t dstlen,
int first, htsstr_substitute_t *sub, const void *aux,
char *htsstr_unescape_to(const char *src, char *dst, size_t dstlen);
+const char *htsstr_escape_find(const char *src, size_t upto_index);
+
char **htsstr_argsplit(const char *str);
void htsstr_argsplit_free(char **argv);
const char *(*getval)(const char *id, const void *aux, char *tmp, size_t tmplen);
} htsstr_substitute_t;
+const char *
+htsstr_substitute_find(const char *src, int first);
+
char *
htsstr_substitute(const char *src, char *dst, size_t dstlen,
int first, htsstr_substitute_t *sub, const void *aux,