comparison src/list.c @ 19229:d776967d0f0d v8.2.0173

patch 8.2.0173: build fails with old compiler Commit: https://github.com/vim/vim/commit/0ff6aad393c4130818fb4f49137380f78d7cc882 Author: Bram Moolenaar <Bram@vim.org> Date: Wed Jan 29 21:27:21 2020 +0100 patch 8.2.0173: build fails with old compiler Problem: Build fails with old compiler. Solution: Do not use anonymous unions. (John Marriott)
author Bram Moolenaar <Bram@vim.org>
date Wed, 29 Jan 2020 21:30:05 +0100
parents 09f01421a356
children 04c164c971a3
comparison
equal deleted inserted replaced
19228:6db2a20db2c3 19229:d776967d0f0d
124 int i; 124 int i;
125 125
126 l->lv_len = count; 126 l->lv_len = count;
127 l->lv_with_items = count; 127 l->lv_with_items = count;
128 l->lv_first = li; 128 l->lv_first = li;
129 l->lv_last = li + count - 1; 129 l->lv_u.mat.lv_last = li + count - 1;
130 for (i = 0; i < count; ++i) 130 for (i = 0; i < count; ++i)
131 { 131 {
132 if (i == 0) 132 if (i == 0)
133 li->li_prev = NULL; 133 li->li_prev = NULL;
134 else 134 else
404 return NULL; 404 return NULL;
405 405
406 range_list_materialize(l); 406 range_list_materialize(l);
407 407
408 // When there is a cached index may start search from there. 408 // When there is a cached index may start search from there.
409 if (l->lv_idx_item != NULL) 409 if (l->lv_u.mat.lv_idx_item != NULL)
410 { 410 {
411 if (n < l->lv_idx / 2) 411 if (n < l->lv_u.mat.lv_idx / 2)
412 { 412 {
413 // closest to the start of the list 413 // closest to the start of the list
414 item = l->lv_first; 414 item = l->lv_first;
415 idx = 0; 415 idx = 0;
416 } 416 }
417 else if (n > (l->lv_idx + l->lv_len) / 2) 417 else if (n > (l->lv_u.mat.lv_idx + l->lv_len) / 2)
418 { 418 {
419 // closest to the end of the list 419 // closest to the end of the list
420 item = l->lv_last; 420 item = l->lv_u.mat.lv_last;
421 idx = l->lv_len - 1; 421 idx = l->lv_len - 1;
422 } 422 }
423 else 423 else
424 { 424 {
425 // closest to the cached index 425 // closest to the cached index
426 item = l->lv_idx_item; 426 item = l->lv_u.mat.lv_idx_item;
427 idx = l->lv_idx; 427 idx = l->lv_u.mat.lv_idx;
428 } 428 }
429 } 429 }
430 else 430 else
431 { 431 {
432 if (n < l->lv_len / 2) 432 if (n < l->lv_len / 2)
436 idx = 0; 436 idx = 0;
437 } 437 }
438 else 438 else
439 { 439 {
440 // closest to the end of the list 440 // closest to the end of the list
441 item = l->lv_last; 441 item = l->lv_u.mat.lv_last;
442 idx = l->lv_len - 1; 442 idx = l->lv_len - 1;
443 } 443 }
444 } 444 }
445 445
446 while (n > idx) 446 while (n > idx)
455 item = item->li_prev; 455 item = item->li_prev;
456 --idx; 456 --idx;
457 } 457 }
458 458
459 // cache the used index 459 // cache the used index
460 l->lv_idx = idx; 460 l->lv_u.mat.lv_idx = idx;
461 l->lv_idx_item = item; 461 l->lv_u.mat.lv_idx_item = item;
462 462
463 return item; 463 return item;
464 } 464 }
465 465
466 /* 466 /*
489 if (errorp != NULL) 489 if (errorp != NULL)
490 *errorp = TRUE; 490 *errorp = TRUE;
491 return -1L; 491 return -1L;
492 } 492 }
493 493
494 return l->lv_start + n * l->lv_stride; 494 return l->lv_u.nonmat.lv_start + n * l->lv_u.nonmat.lv_stride;
495 } 495 }
496 496
497 li = list_find(l, idx); 497 li = list_find(l, idx);
498 if (li == NULL) 498 if (li == NULL)
499 { 499 {
547 */ 547 */
548 void 548 void
549 list_append(list_T *l, listitem_T *item) 549 list_append(list_T *l, listitem_T *item)
550 { 550 {
551 range_list_materialize(l); 551 range_list_materialize(l);
552 if (l->lv_last == NULL) 552 if (l->lv_u.mat.lv_last == NULL)
553 { 553 {
554 // empty list 554 // empty list
555 l->lv_first = item; 555 l->lv_first = item;
556 l->lv_last = item; 556 l->lv_u.mat.lv_last = item;
557 item->li_prev = NULL; 557 item->li_prev = NULL;
558 } 558 }
559 else 559 else
560 { 560 {
561 l->lv_last->li_next = item; 561 l->lv_u.mat.lv_last->li_next = item;
562 item->li_prev = l->lv_last; 562 item->li_prev = l->lv_u.mat.lv_last;
563 l->lv_last = item; 563 l->lv_u.mat.lv_last = item;
564 } 564 }
565 ++l->lv_len; 565 ++l->lv_len;
566 item->li_next = NULL; 566 item->li_next = NULL;
567 } 567 }
568 568
708 ni->li_prev = item->li_prev; 708 ni->li_prev = item->li_prev;
709 ni->li_next = item; 709 ni->li_next = item;
710 if (item->li_prev == NULL) 710 if (item->li_prev == NULL)
711 { 711 {
712 l->lv_first = ni; 712 l->lv_first = ni;
713 ++l->lv_idx; 713 ++l->lv_u.mat.lv_idx;
714 } 714 }
715 else 715 else
716 { 716 {
717 item->li_prev->li_next = ni; 717 item->li_prev->li_next = ni;
718 l->lv_idx_item = NULL; 718 l->lv_u.mat.lv_idx_item = NULL;
719 } 719 }
720 item->li_prev = ni; 720 item->li_prev = ni;
721 ++l->lv_len; 721 ++l->lv_len;
722 } 722 }
723 } 723 }
844 if (ip == item2) 844 if (ip == item2)
845 break; 845 break;
846 } 846 }
847 847
848 if (item2->li_next == NULL) 848 if (item2->li_next == NULL)
849 l->lv_last = item->li_prev; 849 l->lv_u.mat.lv_last = item->li_prev;
850 else 850 else
851 item2->li_next->li_prev = item->li_prev; 851 item2->li_next->li_prev = item->li_prev;
852 if (item->li_prev == NULL) 852 if (item->li_prev == NULL)
853 l->lv_first = item2->li_next; 853 l->lv_first = item2->li_next;
854 else 854 else
855 item->li_prev->li_next = item2->li_next; 855 item->li_prev->li_next = item2->li_next;
856 l->lv_idx_item = NULL; 856 l->lv_u.mat.lv_idx_item = NULL;
857 } 857 }
858 858
859 /* 859 /*
860 * Return an allocated string with the string representation of a list. 860 * Return an allocated string with the string representation of a list.
861 * May return NULL. 861 * May return NULL.
1147 list_T *l = &sl->sl_list; 1147 list_T *l = &sl->sl_list;
1148 int i; 1148 int i;
1149 1149
1150 memset(sl, 0, sizeof(staticList10_T)); 1150 memset(sl, 0, sizeof(staticList10_T));
1151 l->lv_first = &sl->sl_items[0]; 1151 l->lv_first = &sl->sl_items[0];
1152 l->lv_last = &sl->sl_items[9]; 1152 l->lv_u.mat.lv_last = &sl->sl_items[9];
1153 l->lv_refcount = DO_NOT_FREE_CNT; 1153 l->lv_refcount = DO_NOT_FREE_CNT;
1154 l->lv_lock = VAR_FIXED; 1154 l->lv_lock = VAR_FIXED;
1155 sl->sl_list.lv_len = 10; 1155 sl->sl_list.lv_len = 10;
1156 1156
1157 for (i = 0; i < 10; ++i) 1157 for (i = 0; i < 10; ++i)
1278 vimlist_remove(l, item, item2); 1278 vimlist_remove(l, item, item2);
1279 if (rettv_list_alloc(rettv) == OK) 1279 if (rettv_list_alloc(rettv) == OK)
1280 { 1280 {
1281 l = rettv->vval.v_list; 1281 l = rettv->vval.v_list;
1282 l->lv_first = item; 1282 l->lv_first = item;
1283 l->lv_last = item2; 1283 l->lv_u.mat.lv_last = item2;
1284 item->li_prev = NULL; 1284 item->li_prev = NULL;
1285 item2->li_next = NULL; 1285 item2->li_next = NULL;
1286 l->lv_len = cnt; 1286 l->lv_len = cnt;
1287 } 1287 }
1288 } 1288 }
1603 ? item_compare : item_compare2); 1603 ? item_compare : item_compare2);
1604 1604
1605 if (!info.item_compare_func_err) 1605 if (!info.item_compare_func_err)
1606 { 1606 {
1607 // Clear the List and append the items in sorted order. 1607 // Clear the List and append the items in sorted order.
1608 l->lv_first = l->lv_last = l->lv_idx_item = NULL; 1608 l->lv_first = l->lv_u.mat.lv_last
1609 = l->lv_u.mat.lv_idx_item = NULL;
1609 l->lv_len = 0; 1610 l->lv_len = 0;
1610 for (i = 0; i < len; ++i) 1611 for (i = 0; i < len; ++i)
1611 list_append(l, ptrs[i].item); 1612 list_append(l, ptrs[i].item);
1612 } 1613 }
1613 } 1614 }
1643 li = ptrs[i].item->li_next; 1644 li = ptrs[i].item->li_next;
1644 ptrs[i].item->li_next = li->li_next; 1645 ptrs[i].item->li_next = li->li_next;
1645 if (li->li_next != NULL) 1646 if (li->li_next != NULL)
1646 li->li_next->li_prev = ptrs[i].item; 1647 li->li_next->li_prev = ptrs[i].item;
1647 else 1648 else
1648 l->lv_last = ptrs[i].item; 1649 l->lv_u.mat.lv_last = ptrs[i].item;
1649 list_fix_watch(l, li); 1650 list_fix_watch(l, li);
1650 listitem_free(l, li); 1651 listitem_free(l, li);
1651 l->lv_len--; 1652 l->lv_len--;
1652 } 1653 }
1653 } 1654 }
2257 && !var_check_lock(l->lv_lock, 2258 && !var_check_lock(l->lv_lock,
2258 (char_u *)N_("reverse() argument"), TRUE)) 2259 (char_u *)N_("reverse() argument"), TRUE))
2259 { 2260 {
2260 if (l->lv_first == &range_list_item) 2261 if (l->lv_first == &range_list_item)
2261 { 2262 {
2262 varnumber_T new_start = l->lv_start 2263 varnumber_T new_start = l->lv_u.nonmat.lv_start
2263 + (l->lv_len - 1) * l->lv_stride; 2264 + (l->lv_len - 1) * l->lv_u.nonmat.lv_stride;
2264 l->lv_end = new_start - (l->lv_end - l->lv_start); 2265 l->lv_u.nonmat.lv_end = new_start
2265 l->lv_start = new_start; 2266 - (l->lv_u.nonmat.lv_end - l->lv_u.nonmat.lv_start);
2266 l->lv_stride = -l->lv_stride; 2267 l->lv_u.nonmat.lv_start = new_start;
2268 l->lv_u.nonmat.lv_stride = -l->lv_u.nonmat.lv_stride;
2267 rettv_list_set(rettv, l); 2269 rettv_list_set(rettv, l);
2268 return; 2270 return;
2269 } 2271 }
2270 li = l->lv_last; 2272 li = l->lv_u.mat.lv_last;
2271 l->lv_first = l->lv_last = NULL; 2273 l->lv_first = l->lv_u.mat.lv_last = NULL;
2272 l->lv_len = 0; 2274 l->lv_len = 0;
2273 while (li != NULL) 2275 while (li != NULL)
2274 { 2276 {
2275 ni = li->li_prev; 2277 ni = li->li_prev;
2276 list_append(l, li); 2278 list_append(l, li);
2277 li = ni; 2279 li = ni;
2278 } 2280 }
2279 rettv_list_set(rettv, l); 2281 rettv_list_set(rettv, l);
2280 l->lv_idx = l->lv_len - l->lv_idx - 1; 2282 l->lv_u.mat.lv_idx = l->lv_len - l->lv_u.mat.lv_idx - 1;
2281 } 2283 }
2282 } 2284 }
2283 2285
2284 #endif // defined(FEAT_EVAL) 2286 #endif // defined(FEAT_EVAL)