eval/ex_cmds2/ops: Implement providers with eval_call_provider

Replace references to provider_call/provider_has with the new functions
eval_call_provider/eval_has_provider.
This commit is contained in:
Thiago de Arruda
2014-11-11 10:32:32 -03:00
parent 268b2eff4a
commit 375db3b19a
3 changed files with 60 additions and 66 deletions

View File

@@ -5152,7 +5152,7 @@ void list_append_string(list_T *l, char_u *str, int len)
/* /*
* Append "n" to list "l". * Append "n" to list "l".
*/ */
static void list_append_number(list_T *l, varnumber_T n) void list_append_number(list_T *l, varnumber_T n)
{ {
listitem_T *li = listitem_alloc(); listitem_T *li = listitem_alloc();
li->li_tv.v_type = VAR_NUMBER; li->li_tv.v_type = VAR_NUMBER;
@@ -9987,7 +9987,7 @@ static void f_has(typval_T *argvars, typval_T *rettv)
} }
} }
if (n == FALSE && provider_has_feature((char *)name)) { if (n == FALSE && eval_has_provider((char *)name)) {
n = TRUE; n = TRUE;
} }
@@ -11695,7 +11695,7 @@ static void f_pumvisible(typval_T *argvars, typval_T *rettv)
*/ */
static void f_pyeval(typval_T *argvars, typval_T *rettv) static void f_pyeval(typval_T *argvars, typval_T *rettv)
{ {
script_host_eval("python_eval", argvars, rettv); script_host_eval("python", argvars, rettv);
} }
/* /*
@@ -19712,23 +19712,19 @@ static void apply_job_autocmds(int id, char *name, char *type,
} }
} }
static void script_host_eval(char *method, typval_T *argvars, typval_T *rettv) static void script_host_eval(char *name, typval_T *argvars, typval_T *rettv)
{ {
Array args = ARRAY_DICT_INIT; if (check_restricted() || check_secure()) {
ADD(args, vim_to_object(argvars));
Object result = provider_call(method, args);
if (result.type == kObjectTypeNil) {
return; return;
} }
Error err = ERROR_INIT; if (argvars[0].v_type != VAR_STRING) {
EMSG(_(e_invarg));
if (!object_to_vim(result, rettv, &err)){
EMSG("Error converting value back to vim");
} }
api_free_object(result); list_T *args = list_alloc();
list_append_string(args, argvars[0].vval.v_string, -1);
*rettv = eval_call_provider(name, "eval", args);
} }
typval_T eval_call_provider(char *provider, char *method, list_T *arguments) typval_T eval_call_provider(char *provider, char *method, list_T *arguments)

View File

@@ -791,17 +791,17 @@ void ex_profile(exarg_T *eap)
void ex_python(exarg_T *eap) void ex_python(exarg_T *eap)
{ {
script_host_execute("python_execute", eap); script_host_execute("python", eap);
} }
void ex_pyfile(exarg_T *eap) void ex_pyfile(exarg_T *eap)
{ {
script_host_execute_file("python_execute_file", eap); script_host_execute_file("python", eap);
} }
void ex_pydo(exarg_T *eap) void ex_pydo(exarg_T *eap)
{ {
script_host_do_range("python_do_range", eap); script_host_do_range("python", eap);
} }
@@ -3254,46 +3254,43 @@ char_u *get_locales(expand_T *xp, int idx)
#endif #endif
static void script_host_execute(char *method, exarg_T *eap) static void script_host_execute(char *name, exarg_T *eap)
{ {
char *script = (char *)script_get(eap, eap->arg); uint8_t *script = script_get(eap, eap->arg);
if (!eap->skip) { if (!eap->skip) {
Array args = ARRAY_DICT_INIT; list_T *args = list_alloc();
ADD(args, STRING_OBJ(cstr_to_string(script ? script : (char *)eap->arg))); // script
// add current range list_append_string(args, script ? script : eap->arg, -1);
ADD(args, INTEGER_OBJ(eap->line1)); // current range
ADD(args, INTEGER_OBJ(eap->line2)); list_append_number(args, eap->line1);
Object result = provider_call(method, args); list_append_number(args, eap->line2);
// We don't care about the result, so free it just in case a bad provider (void)eval_call_provider(name, "execute", args);
// returned something
api_free_object(result);
} }
free(script); free(script);
} }
static void script_host_execute_file(char *method, exarg_T *eap) static void script_host_execute_file(char *name, exarg_T *eap)
{ {
char buffer[MAXPATHL]; uint8_t buffer[MAXPATHL];
vim_FullName(eap->arg, (uint8_t *)buffer, sizeof(buffer), false); vim_FullName(eap->arg, buffer, sizeof(buffer), false);
Array args = ARRAY_DICT_INIT; list_T *args = list_alloc();
ADD(args, STRING_OBJ(cstr_to_string(buffer))); // filename
// add current range list_append_string(args, buffer, -1);
ADD(args, INTEGER_OBJ(eap->line1)); // current range
ADD(args, INTEGER_OBJ(eap->line2)); list_append_number(args, eap->line1);
Object result = provider_call(method, args); list_append_number(args, eap->line2);
api_free_object(result); (void)eval_call_provider(name, "execute_file", args);
} }
static void script_host_do_range(char *method, exarg_T *eap) static void script_host_do_range(char *name, exarg_T *eap)
{ {
Array args = ARRAY_DICT_INIT; list_T *args = list_alloc();
ADD(args, INTEGER_OBJ(eap->line1)); list_append_number(args, eap->line1);
ADD(args, INTEGER_OBJ(eap->line2)); list_append_number(args, eap->line2);
ADD(args, STRING_OBJ(cstr_to_string((char *)eap->arg))); list_append_string(args, eap->arg, -1);
Object result = provider_call(method, args); (void)eval_call_provider(name, "do_range", args);
api_free_object(result);
} }

View File

@@ -1308,7 +1308,7 @@ bool adjust_clipboard_register(int *rp)
{ {
// If no reg. specified and 'unnamedclip' is set, use the // If no reg. specified and 'unnamedclip' is set, use the
// clipboard register. // clipboard register.
if (*rp == 0 && p_unc && provider_has_feature("clipboard")) { if (*rp == 0 && p_unc && eval_has_provider("clipboard")) {
*rp = '+'; *rp = '+';
return true; return true;
} }
@@ -5240,28 +5240,29 @@ static void copy_register(struct yankreg *dest, struct yankreg *src)
static void get_clipboard(int name) static void get_clipboard(int name)
{ {
if (!(name == '*' || name == '+' if (!(name == '*' || name == '+'
|| (p_unc && !name && provider_has_feature("clipboard")))) { || (p_unc && !name && eval_has_provider("clipboard")))) {
return; return;
} }
struct yankreg *reg = &y_regs[CLIP_REGISTER]; struct yankreg *reg = &y_regs[CLIP_REGISTER];
free_register(reg); free_register(reg);
Array args = ARRAY_DICT_INIT; list_T *args = list_alloc();
Object result = provider_call("clipboard_get", args); typval_T result = eval_call_provider("clipboard", "get", args);
if (result.type != kObjectTypeArray) { if (result.v_type != VAR_LIST) {
goto err; goto err;
} }
Array lines = result.data.array; list_T *lines = result.vval.v_list;
reg->y_array = xcalloc(lines.size, sizeof(uint8_t *)); reg->y_array = xcalloc(lines->lv_len, sizeof(uint8_t *));
reg->y_size = lines.size; reg->y_size = lines->lv_len;
for (size_t i = 0; i < lines.size; i++) { int i = 0;
if (lines.items[i].type != kObjectTypeString) { for (listitem_T *li = lines->lv_first; li != NULL; li = li->li_next) {
if (li->li_tv.v_type != VAR_STRING) {
goto err; goto err;
} }
reg->y_array[i] = (uint8_t *)lines.items[i].data.string.data; reg->y_array[i++] = (uint8_t *)xstrdup((char *)li->li_tv.vval.v_string);
} }
if (!name && p_unc) { if (!name && p_unc) {
@@ -5272,8 +5273,12 @@ static void get_clipboard(int name)
return; return;
err: err:
api_free_object(result); if (reg->y_array) {
free(reg->y_array); for (int i = 0; i < reg->y_size; i++) {
free(reg->y_array[i]);
}
free(reg->y_array);
}
reg->y_array = NULL; reg->y_array = NULL;
reg->y_size = 0; reg->y_size = 0;
EMSG("Clipboard provider returned invalid data"); EMSG("Clipboard provider returned invalid data");
@@ -5282,7 +5287,7 @@ err:
static void set_clipboard(int name) static void set_clipboard(int name)
{ {
if (!(name == '*' || name == '+' if (!(name == '*' || name == '+'
|| (p_unc && !name && provider_has_feature("clipboard")))) { || (p_unc && !name && eval_has_provider("clipboard")))) {
return; return;
} }
@@ -5293,15 +5298,11 @@ static void set_clipboard(int name)
copy_register(reg, &y_regs[0]); copy_register(reg, &y_regs[0]);
} }
Array lines = ARRAY_DICT_INIT; list_T *lines = list_alloc();
for (int i = 0; i < reg->y_size; i++) { for (int i = 0; i < reg->y_size; i++) {
ADD(lines, STRING_OBJ(cstr_to_string((char *)reg->y_array[i]))); list_append_string(lines, reg->y_array[i], -1);
} }
Array args = ARRAY_DICT_INIT; (void)eval_call_provider("clipboard", "set", lines);
ADD(args, ARRAY_OBJ(lines));
Object result = provider_call("clipboard_set", args);
api_free_object(result);
} }