/** \file afs.c Paraslash's audio file selector. */
+#include <fnmatch.h>
#include "server.cmdline.h"
#include "para.h"
#include "afh.h"
return send_option_arg_callback_request(NULL, argc, argv, f, result);
}
+static int action_if_pattern_matches(struct osl_row *row, void *data)
+{
+ struct pattern_match_data *pmd = data;
+ struct osl_object name_obj;
+ const char *p, *name;
+ int ret = osl_get_object(pmd->table, row, pmd->match_col_num, &name_obj);
+ const char *pattern_txt = (const char *)pmd->patterns.data;
+
+ if (ret < 0)
+ return ret;
+ name = (char *)name_obj.data;
+ if ((!name || !*name) && (pmd->pm_flags & PM_SKIP_EMPTY_NAME))
+ return 1;
+ if (!pmd->patterns.size && (pmd->pm_flags & PM_NO_PATTERN_MATCHES_EVERYTHING))
+ return pmd->action(pmd->table, row, name, pmd->data);
+ for (p = pattern_txt; p < pattern_txt + pmd->patterns.size;
+ p += strlen(p) + 1) {
+ ret = fnmatch(p, name, pmd->fnmatch_flags);
+ if (ret == FNM_NOMATCH)
+ continue;
+ if (ret)
+ return -E_FNMATCH;
+ return pmd->action(pmd->table, row, name, pmd->data);
+ }
+ return 1;
+}
+
+int for_each_matching_row(struct pattern_match_data *pmd)
+{
+ if (pmd->pm_flags & PM_REVERSE_LOOP)
+ return osl_rbtree_loop_reverse(pmd->table, pmd->loop_col_num, pmd,
+ action_if_pattern_matches);
+ return osl_rbtree_loop(pmd->table, pmd->loop_col_num, pmd,
+ action_if_pattern_matches);
+}
+
/**
* Compare two osl objects of string type.
*
return strncmp(str1, str2, PARA_MIN(obj1->size, obj2->size));
}
-/**
- * A wrapper for strtol(3).
- *
- * \param str The string to be converted to a long integer.
- * \param result The converted value is stored here.
- *
- * \return Positive on success, -E_ATOL on errors.
- *
- * \sa strtol(3), atoi(3).
- */
-int para_atol(const char *str, long *result)
-{
- char *endptr;
- long val;
- int ret, base = 10;
-
- errno = 0; /* To distinguish success/failure after call */
- val = strtol(str, &endptr, base);
- ret = -E_ATOL;
- if (errno == ERANGE && (val == LONG_MAX || val == LONG_MIN))
- goto out; /* overflow */
- if (errno != 0 && val == 0)
- goto out; /* other error */
- if (endptr == str)
- goto out; /* No digits were found */
- if (*endptr != '\0')
- goto out; /* Further characters after number */
- *result = val;
- ret = 1;
-out:
- return ret;
-}
-
-
/*
* write input from fd to dynamically allocated buffer,
* but maximal max_size byte.
given_playlist = "given_playlist";
if (given_mood) {
- ret = mood_open(given_mood);
+ ret = change_current_mood(given_mood);
if (ret >= 0) {
if (given_playlist)
PARA_WARNING_LOG("ignoring playlist %s\n",
if (ret >= 0)
return PLAY_MODE_PLAYLIST;
}
- ret = mood_open(NULL); /* open first available mood */
+ ret = change_current_mood(NULL); /* open first available mood */
if (ret >= 0)
return PLAY_MODE_MOOD;
- mood_open(""); /* open dummy mood, always successful */
+ change_current_mood(""); /* open dummy mood, always successful */
return PLAY_MODE_MOOD;
}
PARA_NOTICE_LOG("closing afs_tables\n");
score_shutdown(flags);
attribute_shutdown(flags);
- mood_close();
+ close_current_mood();
playlist_close();
moods_shutdown(flags);
playlists_shutdown(flags);
return ret;
}
}
+ if (flags & CHECK_MOODS) {
+ ret = send_callback_request(mood_check_callback, NULL, &result);
+ if (ret < 0)
+ return ret;
+ if (ret > 0) {
+ ret = send_buffer(fd, (char *) result.data);
+ free(result.data);
+ if (ret < 0)
+ return ret;
+ }
+ }
return 1;
}