@@ -1997,8 +1997,7 @@ eval4(char_u **arg, typval_T *rettv, int evaluate)
19971997 typval_T var2 ;
19981998 char_u * p ;
19991999 int i ;
2000- exptype_T type = TYPE_UNKNOWN ;
2001- int type_is = FALSE; // TRUE for "is" and "isnot"
2000+ exptype_T type = ETYPE_UNKNOWN ;
20022001 int len = 2 ;
20032002 int ic ;
20042003
@@ -2012,49 +2011,46 @@ eval4(char_u **arg, typval_T *rettv, int evaluate)
20122011 switch (p [0 ])
20132012 {
20142013 case '=' : if (p [1 ] == '=' )
2015- type = TYPE_EQUAL ;
2014+ type = ETYPE_EQUAL ;
20162015 else if (p [1 ] == '~' )
2017- type = TYPE_MATCH ;
2016+ type = ETYPE_MATCH ;
20182017 break ;
20192018 case '!' : if (p [1 ] == '=' )
2020- type = TYPE_NEQUAL ;
2019+ type = ETYPE_NEQUAL ;
20212020 else if (p [1 ] == '~' )
2022- type = TYPE_NOMATCH ;
2021+ type = ETYPE_NOMATCH ;
20232022 break ;
20242023 case '>' : if (p [1 ] != '=' )
20252024 {
2026- type = TYPE_GREATER ;
2025+ type = ETYPE_GREATER ;
20272026 len = 1 ;
20282027 }
20292028 else
2030- type = TYPE_GEQUAL ;
2029+ type = ETYPE_GEQUAL ;
20312030 break ;
20322031 case '<' : if (p [1 ] != '=' )
20332032 {
2034- type = TYPE_SMALLER ;
2033+ type = ETYPE_SMALLER ;
20352034 len = 1 ;
20362035 }
20372036 else
2038- type = TYPE_SEQUAL ;
2037+ type = ETYPE_SEQUAL ;
20392038 break ;
20402039 case 'i' : if (p [1 ] == 's' )
20412040 {
20422041 if (p [2 ] == 'n' && p [3 ] == 'o' && p [4 ] == 't' )
20432042 len = 5 ;
20442043 i = p [len ];
20452044 if (!isalnum (i ) && i != '_' )
2046- {
2047- type = len == 2 ? TYPE_EQUAL : TYPE_NEQUAL ;
2048- type_is = TRUE;
2049- }
2045+ type = len == 2 ? ETYPE_IS : ETYPE_ISNOT ;
20502046 }
20512047 break ;
20522048 }
20532049
20542050 /*
20552051 * If there is a comparative operator, use it.
20562052 */
2057- if (type != TYPE_UNKNOWN )
2053+ if (type != ETYPE_UNKNOWN )
20582054 {
20592055 // extra question mark appended: ignore case
20602056 if (p [len ] == '?' )
@@ -2083,7 +2079,7 @@ eval4(char_u **arg, typval_T *rettv, int evaluate)
20832079 }
20842080 if (evaluate )
20852081 {
2086- int ret = typval_compare (rettv , & var2 , type , type_is , ic );
2082+ int ret = typval_compare (rettv , & var2 , type , ic );
20872083
20882084 clear_tv (& var2 );
20892085 return ret ;
@@ -6163,31 +6159,31 @@ typval_compare(
61636159 typval_T * typ1 , // first operand
61646160 typval_T * typ2 , // second operand
61656161 exptype_T type , // operator
6166- int type_is , // TRUE for "is" and "isnot"
61676162 int ic ) // ignore case
61686163{
61696164 int i ;
61706165 varnumber_T n1 , n2 ;
61716166 char_u * s1 , * s2 ;
61726167 char_u buf1 [NUMBUFLEN ], buf2 [NUMBUFLEN ];
6168+ int type_is = type == ETYPE_IS || type == ETYPE_ISNOT ;
61736169
61746170 if (type_is && typ1 -> v_type != typ2 -> v_type )
61756171 {
61766172 // For "is" a different type always means FALSE, for "notis"
61776173 // it means TRUE.
6178- n1 = (type == TYPE_NEQUAL );
6174+ n1 = (type == ETYPE_ISNOT );
61796175 }
61806176 else if (typ1 -> v_type == VAR_BLOB || typ2 -> v_type == VAR_BLOB )
61816177 {
61826178 if (type_is )
61836179 {
61846180 n1 = (typ1 -> v_type == typ2 -> v_type
61856181 && typ1 -> vval .v_blob == typ2 -> vval .v_blob );
6186- if (type == TYPE_NEQUAL )
6182+ if (type == ETYPE_ISNOT )
61876183 n1 = !n1 ;
61886184 }
61896185 else if (typ1 -> v_type != typ2 -> v_type
6190- || (type != TYPE_EQUAL && type != TYPE_NEQUAL ))
6186+ || (type != ETYPE_EQUAL && type != ETYPE_NEQUAL ))
61916187 {
61926188 if (typ1 -> v_type != typ2 -> v_type )
61936189 emsg (_ ("E977: Can only compare Blob with Blob" ));
@@ -6200,7 +6196,7 @@ typval_compare(
62006196 {
62016197 // Compare two Blobs for being equal or unequal.
62026198 n1 = blob_equal (typ1 -> vval .v_blob , typ2 -> vval .v_blob );
6203- if (type == TYPE_NEQUAL )
6199+ if (type == ETYPE_NEQUAL )
62046200 n1 = !n1 ;
62056201 }
62066202 }
@@ -6210,11 +6206,11 @@ typval_compare(
62106206 {
62116207 n1 = (typ1 -> v_type == typ2 -> v_type
62126208 && typ1 -> vval .v_list == typ2 -> vval .v_list );
6213- if (type == TYPE_NEQUAL )
6209+ if (type == ETYPE_ISNOT )
62146210 n1 = !n1 ;
62156211 }
62166212 else if (typ1 -> v_type != typ2 -> v_type
6217- || (type != TYPE_EQUAL && type != TYPE_NEQUAL ))
6213+ || (type != ETYPE_EQUAL && type != ETYPE_NEQUAL ))
62186214 {
62196215 if (typ1 -> v_type != typ2 -> v_type )
62206216 emsg (_ ("E691: Can only compare List with List" ));
@@ -6228,7 +6224,7 @@ typval_compare(
62286224 // Compare two Lists for being equal or unequal.
62296225 n1 = list_equal (typ1 -> vval .v_list , typ2 -> vval .v_list ,
62306226 ic , FALSE);
6231- if (type == TYPE_NEQUAL )
6227+ if (type == ETYPE_NEQUAL )
62326228 n1 = !n1 ;
62336229 }
62346230 }
@@ -6239,11 +6235,11 @@ typval_compare(
62396235 {
62406236 n1 = (typ1 -> v_type == typ2 -> v_type
62416237 && typ1 -> vval .v_dict == typ2 -> vval .v_dict );
6242- if (type == TYPE_NEQUAL )
6238+ if (type == ETYPE_ISNOT )
62436239 n1 = !n1 ;
62446240 }
62456241 else if (typ1 -> v_type != typ2 -> v_type
6246- || (type != TYPE_EQUAL && type != TYPE_NEQUAL ))
6242+ || (type != ETYPE_EQUAL && type != ETYPE_NEQUAL ))
62476243 {
62486244 if (typ1 -> v_type != typ2 -> v_type )
62496245 emsg (_ ("E735: Can only compare Dictionary with Dictionary" ));
@@ -6257,15 +6253,15 @@ typval_compare(
62576253 // Compare two Dictionaries for being equal or unequal.
62586254 n1 = dict_equal (typ1 -> vval .v_dict , typ2 -> vval .v_dict ,
62596255 ic , FALSE);
6260- if (type == TYPE_NEQUAL )
6256+ if (type == ETYPE_NEQUAL )
62616257 n1 = !n1 ;
62626258 }
62636259 }
62646260
62656261 else if (typ1 -> v_type == VAR_FUNC || typ2 -> v_type == VAR_FUNC
62666262 || typ1 -> v_type == VAR_PARTIAL || typ2 -> v_type == VAR_PARTIAL )
62676263 {
6268- if (type != TYPE_EQUAL && type != TYPE_NEQUAL )
6264+ if (type != ETYPE_EQUAL && type != ETYPE_NEQUAL )
62696265 {
62706266 emsg (_ ("E694: Invalid operation for Funcrefs" ));
62716267 clear_tv (typ1 );
@@ -6291,7 +6287,7 @@ typval_compare(
62916287 }
62926288 else
62936289 n1 = tv_equal (typ1 , typ2 , ic , FALSE);
6294- if (type == TYPE_NEQUAL )
6290+ if (type == ETYPE_NEQUAL || type == ETYPE_ISNOT )
62956291 n1 = !n1 ;
62966292 }
62976293
@@ -6301,7 +6297,7 @@ typval_compare(
63016297 * When using "=~" or "!~", always compare as string.
63026298 */
63036299 else if ((typ1 -> v_type == VAR_FLOAT || typ2 -> v_type == VAR_FLOAT )
6304- && type != TYPE_MATCH && type != TYPE_NOMATCH )
6300+ && type != ETYPE_MATCH && type != ETYPE_NOMATCH )
63056301 {
63066302 float_T f1 , f2 ;
63076303
@@ -6310,15 +6306,17 @@ typval_compare(
63106306 n1 = FALSE;
63116307 switch (type )
63126308 {
6313- case TYPE_EQUAL : n1 = (f1 == f2 ); break ;
6314- case TYPE_NEQUAL : n1 = (f1 != f2 ); break ;
6315- case TYPE_GREATER : n1 = (f1 > f2 ); break ;
6316- case TYPE_GEQUAL : n1 = (f1 >= f2 ); break ;
6317- case TYPE_SMALLER : n1 = (f1 < f2 ); break ;
6318- case TYPE_SEQUAL : n1 = (f1 <= f2 ); break ;
6319- case TYPE_UNKNOWN :
6320- case TYPE_MATCH :
6321- case TYPE_NOMATCH : break ; // avoid gcc warning
6309+ case ETYPE_EQUAL : n1 = (f1 == f2 ); break ;
6310+ case ETYPE_NEQUAL : n1 = (f1 != f2 ); break ;
6311+ case ETYPE_GREATER : n1 = (f1 > f2 ); break ;
6312+ case ETYPE_GEQUAL : n1 = (f1 >= f2 ); break ;
6313+ case ETYPE_SMALLER : n1 = (f1 < f2 ); break ;
6314+ case ETYPE_SEQUAL : n1 = (f1 <= f2 ); break ;
6315+ case ETYPE_UNKNOWN :
6316+ case ETYPE_IS :
6317+ case ETYPE_ISNOT :
6318+ case ETYPE_MATCH :
6319+ case ETYPE_NOMATCH : break ; // avoid gcc warning
63226320 }
63236321 }
63246322#endif
@@ -6328,49 +6326,53 @@ typval_compare(
63286326 * When using "=~" or "!~", always compare as string.
63296327 */
63306328 else if ((typ1 -> v_type == VAR_NUMBER || typ2 -> v_type == VAR_NUMBER )
6331- && type != TYPE_MATCH && type != TYPE_NOMATCH )
6329+ && type != ETYPE_MATCH && type != ETYPE_NOMATCH )
63326330 {
63336331 n1 = tv_get_number (typ1 );
63346332 n2 = tv_get_number (typ2 );
63356333 switch (type )
63366334 {
6337- case TYPE_EQUAL : n1 = (n1 == n2 ); break ;
6338- case TYPE_NEQUAL : n1 = (n1 != n2 ); break ;
6339- case TYPE_GREATER : n1 = (n1 > n2 ); break ;
6340- case TYPE_GEQUAL : n1 = (n1 >= n2 ); break ;
6341- case TYPE_SMALLER : n1 = (n1 < n2 ); break ;
6342- case TYPE_SEQUAL : n1 = (n1 <= n2 ); break ;
6343- case TYPE_UNKNOWN :
6344- case TYPE_MATCH :
6345- case TYPE_NOMATCH : break ; // avoid gcc warning
6335+ case ETYPE_EQUAL : n1 = (n1 == n2 ); break ;
6336+ case ETYPE_NEQUAL : n1 = (n1 != n2 ); break ;
6337+ case ETYPE_GREATER : n1 = (n1 > n2 ); break ;
6338+ case ETYPE_GEQUAL : n1 = (n1 >= n2 ); break ;
6339+ case ETYPE_SMALLER : n1 = (n1 < n2 ); break ;
6340+ case ETYPE_SEQUAL : n1 = (n1 <= n2 ); break ;
6341+ case ETYPE_UNKNOWN :
6342+ case ETYPE_IS :
6343+ case ETYPE_ISNOT :
6344+ case ETYPE_MATCH :
6345+ case ETYPE_NOMATCH : break ; // avoid gcc warning
63466346 }
63476347 }
63486348 else
63496349 {
63506350 s1 = tv_get_string_buf (typ1 , buf1 );
63516351 s2 = tv_get_string_buf (typ2 , buf2 );
6352- if (type != TYPE_MATCH && type != TYPE_NOMATCH )
6352+ if (type != ETYPE_MATCH && type != ETYPE_NOMATCH )
63536353 i = ic ? MB_STRICMP (s1 , s2 ) : STRCMP (s1 , s2 );
63546354 else
63556355 i = 0 ;
63566356 n1 = FALSE;
63576357 switch (type )
63586358 {
6359- case TYPE_EQUAL : n1 = (i == 0 ); break ;
6360- case TYPE_NEQUAL : n1 = (i != 0 ); break ;
6361- case TYPE_GREATER : n1 = (i > 0 ); break ;
6362- case TYPE_GEQUAL : n1 = (i >= 0 ); break ;
6363- case TYPE_SMALLER : n1 = (i < 0 ); break ;
6364- case TYPE_SEQUAL : n1 = (i <= 0 ); break ;
6365-
6366- case TYPE_MATCH :
6367- case TYPE_NOMATCH :
6359+ case ETYPE_EQUAL : n1 = (i == 0 ); break ;
6360+ case ETYPE_NEQUAL : n1 = (i != 0 ); break ;
6361+ case ETYPE_GREATER : n1 = (i > 0 ); break ;
6362+ case ETYPE_GEQUAL : n1 = (i >= 0 ); break ;
6363+ case ETYPE_SMALLER : n1 = (i < 0 ); break ;
6364+ case ETYPE_SEQUAL : n1 = (i <= 0 ); break ;
6365+
6366+ case ETYPE_MATCH :
6367+ case ETYPE_NOMATCH :
63686368 n1 = pattern_match (s2 , s1 , ic );
6369- if (type == TYPE_NOMATCH )
6369+ if (type == ETYPE_NOMATCH )
63706370 n1 = !n1 ;
63716371 break ;
63726372
6373- case TYPE_UNKNOWN : break ; // avoid gcc warning
6373+ case ETYPE_IS :
6374+ case ETYPE_ISNOT :
6375+ case ETYPE_UNKNOWN : break ; // avoid gcc warning
63746376 }
63756377 }
63766378 clear_tv (typ1 );
0 commit comments