X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=afs.c;h=fbcffddef8d3669888be7711e097ebf07666012d;hp=1084b715354d3532d5a3be038186a04fdd41f1c8;hb=575aa063581ddfae4af105cea6066c165e9faf1d;hpb=2a03f7eebcd08222f771611679d2914e8b48e935 diff --git a/afs.c b/afs.c index 1084b715..fbcffdde 100644 --- a/afs.c +++ b/afs.c @@ -312,106 +312,31 @@ int send_lls_callback_request(afs_callback *f, return ret; } -/** - * Send a callback request passing an options structure and an argument vector. - * - * \param options pointer to an arbitrary data structure. - * \param argc Argument count. - * \param argv Standard argument vector. - * \param f The callback function. - * \param result_handler See \ref send_callback_request. - * \param private_result_data See \ref send_callback_request. - * - * Some command handlers pass command-specific options to a callback, together - * with a list of further arguments (often a list of audio files). This - * function allows to pass an arbitrary structure (given as an osl object) and - * a usual argument vector to the specified callback. - * - * \return The return value of the underlying call to \ref - * send_callback_request(). - * - * \sa send_standard_callback_request(), send_callback_request(). - */ -int send_option_arg_callback_request(struct osl_object *options, - int argc, char * const * const argv, afs_callback *f, - callback_result_handler *result_handler, - void *private_result_data) -{ - char *p; - int i, ret; - struct osl_object query = {.size = options? options->size : 0}; - - for (i = 0; i < argc; i++) - query.size += strlen(argv[i]) + 1; - query.data = para_malloc(query.size); - p = query.data; - if (options) { - memcpy(query.data, options->data, options->size); - p += options->size; - } - for (i = 0; i < argc; i++) { - strcpy(p, argv[i]); /* OK */ - p += strlen(argv[i]) + 1; - } - ret = send_callback_request(f, &query, result_handler, - private_result_data); - free(query.data); - return ret; -} - -/** - * Send a callback request with an argument vector only. - * - * \param argc The same meaning as in send_option_arg_callback_request(). - * \param argv The same meaning as in send_option_arg_callback_request(). - * \param f The same meaning as in send_option_arg_callback_request(). - * \param result_handler See \ref send_callback_request. - * \param private_result_data See \ref send_callback_request. - * - * This is similar to send_option_arg_callback_request(), but no options buffer - * is passed to the parent process. - * - * \return The return value of the underlying call to - * send_option_arg_callback_request(). - */ -int send_standard_callback_request(int argc, char * const * const argv, - afs_callback *f, callback_result_handler *result_handler, - void *private_result_data) -{ - return send_option_arg_callback_request(NULL, argc, argv, f, result_handler, - private_result_data); -} - 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 i, ret = osl(osl_get_object(pmd->table, row, pmd->match_col_num, &name_obj)); - const char *pattern_txt = (const char *)pmd->patterns.data; + int i, ret; + ret = osl(osl_get_object(pmd->table, row, pmd->match_col_num, + &name_obj)); if (ret < 0) return ret; name = (char *)name_obj.data; if ((!name || !*name) && (pmd->pm_flags & PM_SKIP_EMPTY_NAME)) return 1; - if ((pmd->lpr && lls_num_inputs(pmd->lpr) == 0) || pmd->patterns.size == 0) { + if (lls_num_inputs(pmd->lpr) == 0) { if (pmd->pm_flags & PM_NO_PATTERN_MATCHES_EVERYTHING) { pmd->num_matches++; return pmd->action(pmd->table, row, name, pmd->data); } } - p = pattern_txt; i = pmd->input_skip; for (;;) { - if (pmd->lpr) { - if (i >= lls_num_inputs(pmd->lpr)) - break; - p = lls_input(i, pmd->lpr); - } else { - if (p >= pattern_txt + pmd->patterns.size) - break; - } + if (i >= lls_num_inputs(pmd->lpr)) + break; + p = lls_input(i, pmd->lpr); ret = fnmatch(p, name, pmd->fnmatch_flags); if (ret != FNM_NOMATCH) { if (ret != 0) @@ -422,10 +347,7 @@ static int action_if_pattern_matches(struct osl_row *row, void *data) return ret; } - if (pmd->lpr) - i++; - else - p += strlen(p) + 1; + i++; } return 1; } @@ -638,14 +560,17 @@ static void flush_and_free_pb(struct para_buffer *pb) static int com_select_callback(struct afs_callback_arg *aca) { - const char *arg = aca->query.data; + const struct lls_command *cmd = SERVER_CMD_CMD_PTR(SELECT); + const char *arg; int num_admissible, ret; + ret = lls_deserialize_parse_result(aca->query.data, cmd, &aca->lpr); + assert(ret >= 0); + arg = lls_input(0, aca->lpr); ret = clear_score_table(); if (ret < 0) { - para_printf(&aca->pbout, "could not clear score table: %s\n", - para_strerror(-ret)); - return ret; + para_printf(&aca->pbout, "could not clear score table\n"); + goto free_lpr; } if (current_play_mode == PLAY_MODE_MOOD) close_current_mood(); @@ -670,20 +595,24 @@ static int com_select_callback(struct afs_callback_arg *aca) out: para_printf(&aca->pbout, "activated %s (%d admissible files)\n", current_mop? current_mop : "dummy mood", num_admissible); +free_lpr: + lls_free_parse_result(aca->lpr, cmd); return ret; } -int com_select(struct command_context *cc) +static int com_select(struct command_context *cc, struct lls_parse_result *lpr) { - struct osl_object query; + const struct lls_command *cmd = SERVER_CMD_CMD_PTR(SELECT); + char *errctx; + int ret = lls(lls_check_arg_count(lpr, 1, 1, &errctx)); - if (cc->argc != 2) - return -E_AFS_SYNTAX; - query.data = cc->argv[1]; - query.size = strlen(cc->argv[1]) + 1; - return send_callback_request(com_select_callback, &query, - &afs_cb_result_handler, cc); + if (ret < 0) { + send_errctx(cc, errctx); + return ret; + } + return send_lls_callback_request(com_select_callback, cmd, lpr, cc); } +EXPORT_SERVER_CMD_HANDLER(select); static void init_admissible_files(char *arg) {