comparison src/eval.c @ 17536:e00d12c085a5 v8.1.1766

patch 8.1.1766: code for writing session file is spread out commit https://github.com/vim/vim/commit/845380791196aec7f991987ebf7b22de3779d106 Author: Bram Moolenaar <Bram@vim.org> Date: Sun Jul 28 14:15:42 2019 +0200 patch 8.1.1766: code for writing session file is spread out Problem: Code for writing session file is spread out. Solution: Put it in one file. (Yegappan Lakshmanan, closes https://github.com/vim/vim/issues/4728)
author Bram Moolenaar <Bram@vim.org>
date Sun, 28 Jul 2019 14:30:07 +0200
parents cfdef48743ed
children ff097edaae89
comparison
equal deleted inserted replaced
17535:3015901aaaa6 17536:e00d12c085a5
9317 9317
9318 vim_free(tofree); 9318 vim_free(tofree);
9319 return ret; 9319 return ret;
9320 } 9320 }
9321 9321
9322 #if defined(FEAT_VIMINFO) || defined(FEAT_SESSION)
9323 var_flavour_T
9324 var_flavour(char_u *varname)
9325 {
9326 char_u *p = varname;
9327
9328 if (ASCII_ISUPPER(*p))
9329 {
9330 while (*(++p))
9331 if (ASCII_ISLOWER(*p))
9332 return VAR_FLAVOUR_SESSION;
9333 return VAR_FLAVOUR_VIMINFO;
9334 }
9335 else
9336 return VAR_FLAVOUR_DEFAULT;
9337 }
9338 #endif
9339
9340 #if defined(FEAT_SESSION) || defined(PROTO)
9341 int
9342 store_session_globals(FILE *fd)
9343 {
9344 hashitem_T *hi;
9345 dictitem_T *this_var;
9346 int todo;
9347 char_u *p, *t;
9348
9349 todo = (int)globvarht.ht_used;
9350 for (hi = globvarht.ht_array; todo > 0; ++hi)
9351 {
9352 if (!HASHITEM_EMPTY(hi))
9353 {
9354 --todo;
9355 this_var = HI2DI(hi);
9356 if ((this_var->di_tv.v_type == VAR_NUMBER
9357 || this_var->di_tv.v_type == VAR_STRING)
9358 && var_flavour(this_var->di_key) == VAR_FLAVOUR_SESSION)
9359 {
9360 /* Escape special characters with a backslash. Turn a LF and
9361 * CR into \n and \r. */
9362 p = vim_strsave_escaped(tv_get_string(&this_var->di_tv),
9363 (char_u *)"\\\"\n\r");
9364 if (p == NULL) /* out of memory */
9365 break;
9366 for (t = p; *t != NUL; ++t)
9367 if (*t == '\n')
9368 *t = 'n';
9369 else if (*t == '\r')
9370 *t = 'r';
9371 if ((fprintf(fd, "let %s = %c%s%c",
9372 this_var->di_key,
9373 (this_var->di_tv.v_type == VAR_STRING) ? '"'
9374 : ' ',
9375 p,
9376 (this_var->di_tv.v_type == VAR_STRING) ? '"'
9377 : ' ') < 0)
9378 || put_eol(fd) == FAIL)
9379 {
9380 vim_free(p);
9381 return FAIL;
9382 }
9383 vim_free(p);
9384 }
9385 #ifdef FEAT_FLOAT
9386 else if (this_var->di_tv.v_type == VAR_FLOAT
9387 && var_flavour(this_var->di_key) == VAR_FLAVOUR_SESSION)
9388 {
9389 float_T f = this_var->di_tv.vval.v_float;
9390 int sign = ' ';
9391
9392 if (f < 0)
9393 {
9394 f = -f;
9395 sign = '-';
9396 }
9397 if ((fprintf(fd, "let %s = %c%f",
9398 this_var->di_key, sign, f) < 0)
9399 || put_eol(fd) == FAIL)
9400 return FAIL;
9401 }
9402 #endif
9403 }
9404 }
9405 return OK;
9406 }
9407 #endif
9408
9409 /* 9322 /*
9410 * Display script name where an item was last set. 9323 * Display script name where an item was last set.
9411 * Should only be invoked when 'verbose' is non-zero. 9324 * Should only be invoked when 'verbose' is non-zero.
9412 */ 9325 */
9413 void 9326 void