Mercurial > vim
comparison src/change.c @ 16872:a836d122231a v8.1.1437
patch 8.1.1437: code to handle callbacks is duplicated
commit https://github.com/vim/vim/commit/3a97bb3f0f8bd118ae23f1c97e55d84ff42eef20
Author: Bram Moolenaar <Bram@vim.org>
Date: Sat Jun 1 13:28:35 2019 +0200
patch 8.1.1437: code to handle callbacks is duplicated
Problem: Code to handle callbacks is duplicated.
Solution: Add callback_T and functions to deal with it.
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Sat, 01 Jun 2019 13:30:07 +0200 |
parents | 7cade95272c4 |
children | 5493e31010e1 |
comparison
equal
deleted
inserted
replaced
16871:e5dab34ded73 | 16872:a836d122231a |
---|---|
268 * listener_add() function | 268 * listener_add() function |
269 */ | 269 */ |
270 void | 270 void |
271 f_listener_add(typval_T *argvars, typval_T *rettv) | 271 f_listener_add(typval_T *argvars, typval_T *rettv) |
272 { | 272 { |
273 char_u *callback; | 273 callback_T callback; |
274 partial_T *partial; | |
275 listener_T *lnr; | 274 listener_T *lnr; |
276 buf_T *buf = curbuf; | 275 buf_T *buf = curbuf; |
277 | 276 |
278 callback = get_callback(&argvars[0], &partial); | 277 callback = get_callback(&argvars[0]); |
279 if (callback == NULL) | 278 if (callback.cb_name == NULL) |
280 return; | 279 return; |
281 | 280 |
282 if (argvars[1].v_type != VAR_UNKNOWN) | 281 if (argvars[1].v_type != VAR_UNKNOWN) |
283 { | 282 { |
284 buf = get_buf_arg(&argvars[1]); | 283 buf = get_buf_arg(&argvars[1]); |
285 if (buf == NULL) | 284 if (buf == NULL) |
285 { | |
286 free_callback(&callback); | |
286 return; | 287 return; |
288 } | |
287 } | 289 } |
288 | 290 |
289 lnr = ALLOC_CLEAR_ONE(listener_T); | 291 lnr = ALLOC_CLEAR_ONE(listener_T); |
290 if (lnr == NULL) | 292 if (lnr == NULL) |
291 { | 293 { |
292 free_callback(callback, partial); | 294 free_callback(&callback); |
293 return; | 295 return; |
294 } | 296 } |
295 lnr->lr_next = buf->b_listener; | 297 lnr->lr_next = buf->b_listener; |
296 buf->b_listener = lnr; | 298 buf->b_listener = lnr; |
297 | 299 |
298 if (partial == NULL) | 300 set_callback(&lnr->lr_callback, &callback); |
299 lnr->lr_callback = vim_strsave(callback); | |
300 else | |
301 lnr->lr_callback = callback; // pointer into the partial | |
302 lnr->lr_partial = partial; | |
303 | 301 |
304 lnr->lr_id = ++next_listener_id; | 302 lnr->lr_id = ++next_listener_id; |
305 rettv->vval.v_number = lnr->lr_id; | 303 rettv->vval.v_number = lnr->lr_id; |
306 } | 304 } |
307 | 305 |
342 { | 340 { |
343 if (prev != NULL) | 341 if (prev != NULL) |
344 prev->lr_next = lnr->lr_next; | 342 prev->lr_next = lnr->lr_next; |
345 else | 343 else |
346 buf->b_listener = lnr->lr_next; | 344 buf->b_listener = lnr->lr_next; |
347 free_callback(lnr->lr_callback, lnr->lr_partial); | 345 free_callback(&lnr->lr_callback); |
348 vim_free(lnr); | 346 vim_free(lnr); |
349 } | 347 } |
350 prev = lnr; | 348 prev = lnr; |
351 } | 349 } |
352 } | 350 } |
416 argv[4].vval.v_list = buf->b_recorded_changes; | 414 argv[4].vval.v_list = buf->b_recorded_changes; |
417 ++textlock; | 415 ++textlock; |
418 | 416 |
419 for (lnr = buf->b_listener; lnr != NULL; lnr = lnr->lr_next) | 417 for (lnr = buf->b_listener; lnr != NULL; lnr = lnr->lr_next) |
420 { | 418 { |
421 call_func(lnr->lr_callback, -1, &rettv, | 419 call_callback(&lnr->lr_callback, -1, &rettv, |
422 5, argv, NULL, 0L, 0L, &dummy, TRUE, lnr->lr_partial, NULL); | 420 5, argv, NULL, 0L, 0L, &dummy, TRUE, NULL); |
423 clear_tv(&rettv); | 421 clear_tv(&rettv); |
424 } | 422 } |
425 | 423 |
426 --textlock; | 424 --textlock; |
427 list_unref(buf->b_recorded_changes); | 425 list_unref(buf->b_recorded_changes); |