@@ -3417,8 +3417,7 @@ static int eval4(char_u **arg, typval_T *rettv, int evaluate)
3417
3417
{
3418
3418
typval_T var2 ;
3419
3419
char_u * p ;
3420
- exptype_T type = TYPE_UNKNOWN ;
3421
- bool type_is = false; // true for "is" and "isnot"
3420
+ exprtype_T type = EXPR_UNKNOWN ;
3422
3421
int len = 2 ;
3423
3422
bool ic ;
3424
3423
@@ -3430,35 +3429,42 @@ static int eval4(char_u **arg, typval_T *rettv, int evaluate)
3430
3429
3431
3430
p = * arg ;
3432
3431
switch (p [0 ]) {
3433
- case '=' : if (p [1 ] == '=' )
3434
- type = TYPE_EQUAL ;
3435
- else if (p [1 ] == '~' )
3436
- type = TYPE_MATCH ;
3432
+ case '=' :
3433
+ if (p [1 ] == '=' ) {
3434
+ type = EXPR_EQUAL ;
3435
+ } else if (p [1 ] == '~' ) {
3436
+ type = EXPR_MATCH ;
3437
+ }
3437
3438
break ;
3438
- case '!' : if (p [1 ] == '=' )
3439
- type = TYPE_NEQUAL ;
3440
- else if (p [1 ] == '~' )
3441
- type = TYPE_NOMATCH ;
3439
+ case '!' :
3440
+ if (p [1 ] == '=' ) {
3441
+ type = EXPR_NEQUAL ;
3442
+ } else if (p [1 ] == '~' ) {
3443
+ type = EXPR_NOMATCH ;
3444
+ }
3442
3445
break ;
3443
- case '>' : if (p [1 ] != '=' ) {
3444
- type = TYPE_GREATER ;
3446
+ case '>' :
3447
+ if (p [1 ] != '=' ) {
3448
+ type = EXPR_GREATER ;
3445
3449
len = 1 ;
3446
- } else
3447
- type = TYPE_GEQUAL ;
3450
+ } else {
3451
+ type = EXPR_GEQUAL ;
3452
+ }
3448
3453
break ;
3449
- case '<' : if (p [1 ] != '=' ) {
3450
- type = TYPE_SMALLER ;
3454
+ case '<' :
3455
+ if (p [1 ] != '=' ) {
3456
+ type = EXPR_SMALLER ;
3451
3457
len = 1 ;
3452
- } else
3453
- type = TYPE_SEQUAL ;
3458
+ } else {
3459
+ type = EXPR_SEQUAL ;
3460
+ }
3454
3461
break ;
3455
3462
case 'i' : if (p [1 ] == 's' ) {
3456
3463
if (p [2 ] == 'n' && p [3 ] == 'o' && p [4 ] == 't' ) {
3457
3464
len = 5 ;
3458
3465
}
3459
3466
if (!isalnum (p [len ]) && p [len ] != '_' ) {
3460
- type = len == 2 ? TYPE_EQUAL : TYPE_NEQUAL ;
3461
- type_is = true;
3467
+ type = len == 2 ? EXPR_IS : EXPR_ISNOT ;
3462
3468
}
3463
3469
}
3464
3470
break ;
@@ -3467,7 +3473,7 @@ static int eval4(char_u **arg, typval_T *rettv, int evaluate)
3467
3473
/*
3468
3474
* If there is a comparative operator, use it.
3469
3475
*/
3470
- if (type != TYPE_UNKNOWN ) {
3476
+ if (type != EXPR_UNKNOWN ) {
3471
3477
// extra question mark appended: ignore case
3472
3478
if (p [len ] == '?' ) {
3473
3479
ic = true;
@@ -3486,7 +3492,7 @@ static int eval4(char_u **arg, typval_T *rettv, int evaluate)
3486
3492
return FAIL ;
3487
3493
}
3488
3494
if (evaluate ) {
3489
- const int ret = typval_compare (rettv , & var2 , type , type_is , ic );
3495
+ const int ret = typval_compare (rettv , & var2 , type , ic );
3490
3496
3491
3497
tv_clear (& var2 );
3492
3498
return ret ;
@@ -10582,27 +10588,27 @@ bool invoke_prompt_interrupt(void)
10582
10588
int typval_compare (
10583
10589
typval_T * typ1 , // first operand
10584
10590
typval_T * typ2 , // second operand
10585
- exptype_T type , // operator
10586
- bool type_is , // true for "is" and "isnot"
10591
+ exprtype_T type , // operator
10587
10592
bool ic // ignore case
10588
10593
)
10589
10594
FUNC_ATTR_NONNULL_ALL
10590
10595
{
10591
10596
varnumber_T n1 , n2 ;
10597
+ const bool type_is = type == EXPR_IS || type == EXPR_ISNOT ;
10592
10598
10593
10599
if (type_is && typ1 -> v_type != typ2 -> v_type ) {
10594
10600
// For "is" a different type always means false, for "notis"
10595
10601
// it means true.
10596
- n1 = type == TYPE_NEQUAL ;
10602
+ n1 = type == EXPR_ISNOT ;
10597
10603
} else if (typ1 -> v_type == VAR_LIST || typ2 -> v_type == VAR_LIST ) {
10598
10604
if (type_is ) {
10599
10605
n1 = typ1 -> v_type == typ2 -> v_type
10600
10606
&& typ1 -> vval .v_list == typ2 -> vval .v_list ;
10601
- if (type == TYPE_NEQUAL ) {
10607
+ if (type == EXPR_ISNOT ) {
10602
10608
n1 = !n1 ;
10603
10609
}
10604
10610
} else if (typ1 -> v_type != typ2 -> v_type
10605
- || (type != TYPE_EQUAL && type != TYPE_NEQUAL )) {
10611
+ || (type != EXPR_EQUAL && type != EXPR_NEQUAL )) {
10606
10612
if (typ1 -> v_type != typ2 -> v_type ) {
10607
10613
EMSG (_ ("E691: Can only compare List with List" ));
10608
10614
} else {
@@ -10613,19 +10619,19 @@ int typval_compare(
10613
10619
} else {
10614
10620
// Compare two Lists for being equal or unequal.
10615
10621
n1 = tv_list_equal (typ1 -> vval .v_list , typ2 -> vval .v_list , ic , false);
10616
- if (type == TYPE_NEQUAL ) {
10622
+ if (type == EXPR_NEQUAL ) {
10617
10623
n1 = !n1 ;
10618
10624
}
10619
10625
}
10620
10626
} else if (typ1 -> v_type == VAR_DICT || typ2 -> v_type == VAR_DICT ) {
10621
10627
if (type_is ) {
10622
10628
n1 = typ1 -> v_type == typ2 -> v_type
10623
10629
&& typ1 -> vval .v_dict == typ2 -> vval .v_dict ;
10624
- if (type == TYPE_NEQUAL ) {
10630
+ if (type == EXPR_ISNOT ) {
10625
10631
n1 = !n1 ;
10626
10632
}
10627
10633
} else if (typ1 -> v_type != typ2 -> v_type
10628
- || (type != TYPE_EQUAL && type != TYPE_NEQUAL )) {
10634
+ || (type != EXPR_EQUAL && type != EXPR_NEQUAL )) {
10629
10635
if (typ1 -> v_type != typ2 -> v_type ) {
10630
10636
EMSG (_ ("E735: Can only compare Dictionary with Dictionary" ));
10631
10637
} else {
@@ -10636,12 +10642,13 @@ int typval_compare(
10636
10642
} else {
10637
10643
// Compare two Dictionaries for being equal or unequal.
10638
10644
n1 = tv_dict_equal (typ1 -> vval .v_dict , typ2 -> vval .v_dict , ic , false);
10639
- if (type == TYPE_NEQUAL ) {
10645
+ if (type == EXPR_NEQUAL ) {
10640
10646
n1 = !n1 ;
10641
10647
}
10642
10648
}
10643
10649
} else if (tv_is_func (* typ1 ) || tv_is_func (* typ2 )) {
10644
- if (type != TYPE_EQUAL && type != TYPE_NEQUAL ) {
10650
+ if (type != EXPR_EQUAL && type != EXPR_NEQUAL
10651
+ && type != EXPR_IS && type != EXPR_ISNOT ) {
10645
10652
EMSG (_ ("E694: Invalid operation for Funcrefs" ));
10646
10653
tv_clear (typ1 );
10647
10654
return FAIL ;
@@ -10663,72 +10670,78 @@ int typval_compare(
10663
10670
} else {
10664
10671
n1 = tv_equal (typ1 , typ2 , ic , false);
10665
10672
}
10666
- if (type == TYPE_NEQUAL ) {
10673
+ if (type == EXPR_NEQUAL || type == EXPR_ISNOT ) {
10667
10674
n1 = !n1 ;
10668
10675
}
10669
10676
} else if ((typ1 -> v_type == VAR_FLOAT || typ2 -> v_type == VAR_FLOAT )
10670
- && type != TYPE_MATCH && type != TYPE_NOMATCH ) {
10677
+ && type != EXPR_MATCH && type != EXPR_NOMATCH ) {
10671
10678
// If one of the two variables is a float, compare as a float.
10672
10679
// When using "=~" or "!~", always compare as string.
10673
10680
const float_T f1 = tv_get_float (typ1 );
10674
10681
const float_T f2 = tv_get_float (typ2 );
10675
10682
n1 = false;
10676
10683
switch (type ) {
10677
- case TYPE_EQUAL : n1 = f1 == f2 ; break ;
10678
- case TYPE_NEQUAL : n1 = f1 != f2 ; break ;
10679
- case TYPE_GREATER : n1 = f1 > f2 ; break ;
10680
- case TYPE_GEQUAL : n1 = f1 >= f2 ; break ;
10681
- case TYPE_SMALLER : n1 = f1 < f2 ; break ;
10682
- case TYPE_SEQUAL : n1 = f1 <= f2 ; break ;
10683
- case TYPE_UNKNOWN :
10684
- case TYPE_MATCH :
10685
- case TYPE_NOMATCH : break ;
10684
+ case EXPR_IS :
10685
+ case EXPR_EQUAL : n1 = f1 == f2 ; break ;
10686
+ case EXPR_ISNOT :
10687
+ case EXPR_NEQUAL : n1 = f1 != f2 ; break ;
10688
+ case EXPR_GREATER : n1 = f1 > f2 ; break ;
10689
+ case EXPR_GEQUAL : n1 = f1 >= f2 ; break ;
10690
+ case EXPR_SMALLER : n1 = f1 < f2 ; break ;
10691
+ case EXPR_SEQUAL : n1 = f1 <= f2 ; break ;
10692
+ case EXPR_UNKNOWN :
10693
+ case EXPR_MATCH :
10694
+ case EXPR_NOMATCH : break ; // avoid gcc warning
10686
10695
}
10687
10696
} else if ((typ1 -> v_type == VAR_NUMBER || typ2 -> v_type == VAR_NUMBER )
10688
- && type != TYPE_MATCH && type != TYPE_NOMATCH ) {
10697
+ && type != EXPR_MATCH && type != EXPR_NOMATCH ) {
10689
10698
// If one of the two variables is a number, compare as a number.
10690
10699
// When using "=~" or "!~", always compare as string.
10691
10700
n1 = tv_get_number (typ1 );
10692
10701
n2 = tv_get_number (typ2 );
10693
10702
switch (type ) {
10694
- case TYPE_EQUAL : n1 = n1 == n2 ; break ;
10695
- case TYPE_NEQUAL : n1 = n1 != n2 ; break ;
10696
- case TYPE_GREATER : n1 = n1 > n2 ; break ;
10697
- case TYPE_GEQUAL : n1 = n1 >= n2 ; break ;
10698
- case TYPE_SMALLER : n1 = n1 < n2 ; break ;
10699
- case TYPE_SEQUAL : n1 = n1 <= n2 ; break ;
10700
- case TYPE_UNKNOWN :
10701
- case TYPE_MATCH :
10702
- case TYPE_NOMATCH : break ;
10703
+ case EXPR_IS :
10704
+ case EXPR_EQUAL : n1 = n1 == n2 ; break ;
10705
+ case EXPR_ISNOT :
10706
+ case EXPR_NEQUAL : n1 = n1 != n2 ; break ;
10707
+ case EXPR_GREATER : n1 = n1 > n2 ; break ;
10708
+ case EXPR_GEQUAL : n1 = n1 >= n2 ; break ;
10709
+ case EXPR_SMALLER : n1 = n1 < n2 ; break ;
10710
+ case EXPR_SEQUAL : n1 = n1 <= n2 ; break ;
10711
+ case EXPR_UNKNOWN :
10712
+ case EXPR_MATCH :
10713
+ case EXPR_NOMATCH : break ; // avoid gcc warning
10703
10714
}
10704
10715
} else {
10705
10716
char buf1 [NUMBUFLEN ];
10706
10717
char buf2 [NUMBUFLEN ];
10707
10718
const char * const s1 = tv_get_string_buf (typ1 , buf1 );
10708
10719
const char * const s2 = tv_get_string_buf (typ2 , buf2 );
10709
10720
int i ;
10710
- if (type != TYPE_MATCH && type != TYPE_NOMATCH ) {
10721
+ if (type != EXPR_MATCH && type != EXPR_NOMATCH ) {
10711
10722
i = mb_strcmp_ic (ic , s1 , s2 );
10712
10723
} else {
10713
10724
i = 0 ;
10714
10725
}
10715
10726
n1 = false;
10716
10727
switch (type ) {
10717
- case TYPE_EQUAL : n1 = i == 0 ; break ;
10718
- case TYPE_NEQUAL : n1 = i != 0 ; break ;
10719
- case TYPE_GREATER : n1 = i > 0 ; break ;
10720
- case TYPE_GEQUAL : n1 = i >= 0 ; break ;
10721
- case TYPE_SMALLER : n1 = i < 0 ; break ;
10722
- case TYPE_SEQUAL : n1 = i <= 0 ; break ;
10723
-
10724
- case TYPE_MATCH :
10725
- case TYPE_NOMATCH :
10728
+ case EXPR_IS :
10729
+ case EXPR_EQUAL : n1 = i == 0 ; break ;
10730
+ case EXPR_ISNOT :
10731
+ case EXPR_NEQUAL : n1 = i != 0 ; break ;
10732
+ case EXPR_GREATER : n1 = i > 0 ; break ;
10733
+ case EXPR_GEQUAL : n1 = i >= 0 ; break ;
10734
+ case EXPR_SMALLER : n1 = i < 0 ; break ;
10735
+ case EXPR_SEQUAL : n1 = i <= 0 ; break ;
10736
+
10737
+ case EXPR_MATCH :
10738
+ case EXPR_NOMATCH :
10726
10739
n1 = pattern_match ((char_u * )s2 , (char_u * )s1 , ic );
10727
- if (type == TYPE_NOMATCH ) {
10740
+ if (type == EXPR_NOMATCH ) {
10728
10741
n1 = !n1 ;
10729
10742
}
10730
10743
break ;
10731
- case TYPE_UNKNOWN : break ; // Avoid gcc warning.
10744
+ case EXPR_UNKNOWN : break ; // avoid gcc warning
10732
10745
}
10733
10746
}
10734
10747
tv_clear (typ1 );
0 commit comments