comparison src/viminfo.c @ 19102:ba9f50bfda83 v8.2.0111

patch 8.2.0111: VAR_SPECIAL is also used for booleans Commit: https://github.com/vim/vim/commit/9b4a15d5dba354d2e1e02871470bad103f34769a Author: Bram Moolenaar <Bram@vim.org> Date: Sat Jan 11 16:05:23 2020 +0100 patch 8.2.0111: VAR_SPECIAL is also used for booleans Problem: VAR_SPECIAL is also used for booleans. Solution: Add VAR_BOOL for better type checking.
author Bram Moolenaar <Bram@vim.org>
date Sat, 11 Jan 2020 16:15:04 +0100
parents de2d1820215a
children 94eda51ba9ba
comparison
equal deleted inserted replaced
19101:7c682fab000b 19102:ba9f50bfda83
1231 #ifdef FEAT_FLOAT 1231 #ifdef FEAT_FLOAT
1232 else if (type == VAR_FLOAT) 1232 else if (type == VAR_FLOAT)
1233 (void)string2float(tab + 1, &tv.vval.v_float); 1233 (void)string2float(tab + 1, &tv.vval.v_float);
1234 #endif 1234 #endif
1235 else 1235 else
1236 {
1236 tv.vval.v_number = atol((char *)tab + 1); 1237 tv.vval.v_number = atol((char *)tab + 1);
1238 if (type == VAR_SPECIAL && (tv.vval.v_number == VVAL_FALSE
1239 || tv.vval.v_number == VVAL_TRUE))
1240 tv.v_type = VAR_BOOL;
1241 }
1237 if (type == VAR_DICT || type == VAR_LIST) 1242 if (type == VAR_DICT || type == VAR_LIST)
1238 { 1243 {
1239 typval_T *etv = eval_expr(tv.vval.v_string, NULL); 1244 typval_T *etv = eval_expr(tv.vval.v_string, NULL);
1240 1245
1241 if (etv == NULL) 1246 if (etv == NULL)
1310 this_var = HI2DI(hi); 1315 this_var = HI2DI(hi);
1311 if (var_flavour(this_var->di_key) == VAR_FLAVOUR_VIMINFO) 1316 if (var_flavour(this_var->di_key) == VAR_FLAVOUR_VIMINFO)
1312 { 1317 {
1313 switch (this_var->di_tv.v_type) 1318 switch (this_var->di_tv.v_type)
1314 { 1319 {
1315 case VAR_STRING: s = "STR"; break; 1320 case VAR_STRING: s = "STR"; break;
1316 case VAR_NUMBER: s = "NUM"; break; 1321 case VAR_NUMBER: s = "NUM"; break;
1317 case VAR_FLOAT: s = "FLO"; break; 1322 case VAR_FLOAT: s = "FLO"; break;
1318 case VAR_DICT: s = "DIC"; break; 1323 case VAR_DICT: s = "DIC"; break;
1319 case VAR_LIST: s = "LIS"; break; 1324 case VAR_LIST: s = "LIS"; break;
1320 case VAR_BLOB: s = "BLO"; break; 1325 case VAR_BLOB: s = "BLO"; break;
1326 case VAR_BOOL: s = "XPL"; break; // backwards compat.
1321 case VAR_SPECIAL: s = "XPL"; break; 1327 case VAR_SPECIAL: s = "XPL"; break;
1322 1328
1323 case VAR_UNKNOWN: 1329 case VAR_UNKNOWN:
1324 case VAR_FUNC: 1330 case VAR_FUNC:
1325 case VAR_PARTIAL: 1331 case VAR_PARTIAL:
1326 case VAR_JOB: 1332 case VAR_JOB:
1327 case VAR_CHANNEL: 1333 case VAR_CHANNEL:
1328 continue; 1334 continue;
1329 } 1335 }
1330 fprintf(fp, "!%s\t%s\t", this_var->di_key, s); 1336 fprintf(fp, "!%s\t%s\t", this_var->di_key, s);
1331 if (this_var->di_tv.v_type == VAR_SPECIAL) 1337 if (this_var->di_tv.v_type == VAR_BOOL
1338 || this_var->di_tv.v_type == VAR_SPECIAL)
1332 { 1339 {
1340 // do not use "v:true" but "1"
1333 sprintf((char *)numbuf, "%ld", 1341 sprintf((char *)numbuf, "%ld",
1334 (long)this_var->di_tv.vval.v_number); 1342 (long)this_var->di_tv.vval.v_number);
1335 p = numbuf; 1343 p = numbuf;
1336 tofree = NULL; 1344 tofree = NULL;
1337 } 1345 }