@@ -137,6 +137,7 @@ static void f_did_filetype(typval_T *argvars, typval_T *rettv);
137137static void f_diff_filler (typval_T * argvars , typval_T * rettv );
138138static void f_diff_hlID (typval_T * argvars , typval_T * rettv );
139139static void f_empty (typval_T * argvars , typval_T * rettv );
140+ static void f_environ (typval_T * argvars , typval_T * rettv );
140141static void f_escape (typval_T * argvars , typval_T * rettv );
141142static void f_eval (typval_T * argvars , typval_T * rettv );
142143static void f_eventhandler (typval_T * argvars , typval_T * rettv );
@@ -187,6 +188,7 @@ static void f_getcmdpos(typval_T *argvars, typval_T *rettv);
187188static void f_getcmdtype (typval_T * argvars , typval_T * rettv );
188189static void f_getcmdwintype (typval_T * argvars , typval_T * rettv );
189190static void f_getcwd (typval_T * argvars , typval_T * rettv );
191+ static void f_getenv (typval_T * argvars , typval_T * rettv );
190192static void f_getfontname (typval_T * argvars , typval_T * rettv );
191193static void f_getfperm (typval_T * argvars , typval_T * rettv );
192194static void f_getfsize (typval_T * argvars , typval_T * rettv );
@@ -365,6 +367,7 @@ static void f_setbufline(typval_T *argvars, typval_T *rettv);
365367static void f_setbufvar (typval_T * argvars , typval_T * rettv );
366368static void f_setcharsearch (typval_T * argvars , typval_T * rettv );
367369static void f_setcmdpos (typval_T * argvars , typval_T * rettv );
370+ static void f_setenv (typval_T * argvars , typval_T * rettv );
368371static void f_setfperm (typval_T * argvars , typval_T * rettv );
369372static void f_setline (typval_T * argvars , typval_T * rettv );
370373static void f_setloclist (typval_T * argvars , typval_T * rettv );
@@ -629,6 +632,7 @@ static struct fst
629632 {"diff_filler" , 1 , 1 , f_diff_filler },
630633 {"diff_hlID" , 2 , 2 , f_diff_hlID },
631634 {"empty" , 1 , 1 , f_empty },
635+ {"environ" , 0 , 0 , f_environ },
632636 {"escape" , 2 , 2 , f_escape },
633637 {"eval" , 1 , 1 , f_eval },
634638 {"eventhandler" , 0 , 0 , f_eventhandler },
@@ -681,6 +685,7 @@ static struct fst
681685#endif
682686 {"getcurpos" , 0 , 0 , f_getcurpos },
683687 {"getcwd" , 0 , 2 , f_getcwd },
688+ {"getenv" , 1 , 1 , f_getenv },
684689 {"getfontname" , 0 , 1 , f_getfontname },
685690 {"getfperm" , 1 , 1 , f_getfperm },
686691 {"getfsize" , 1 , 1 , f_getfsize },
@@ -873,6 +878,7 @@ static struct fst
873878 {"setbufvar" , 3 , 3 , f_setbufvar },
874879 {"setcharsearch" , 1 , 1 , f_setcharsearch },
875880 {"setcmdpos" , 1 , 1 , f_setcmdpos },
881+ {"setenv" , 2 , 2 , f_setenv },
876882 {"setfperm" , 2 , 2 , f_setfperm },
877883 {"setline" , 2 , 2 , f_setline },
878884 {"setloclist" , 2 , 4 , f_setloclist },
@@ -3339,6 +3345,59 @@ f_empty(typval_T *argvars, typval_T *rettv)
33393345 rettv -> vval .v_number = n ;
33403346}
33413347
3348+ /*
3349+ * "environ()" function
3350+ */
3351+ static void
3352+ f_environ (typval_T * argvars UNUSED , typval_T * rettv )
3353+ {
3354+ #if !defined(AMIGA )
3355+ int i = 0 ;
3356+ char_u * entry , * value ;
3357+ # ifdef MSWIN
3358+ extern wchar_t * * _wenviron ;
3359+ # else
3360+ extern char * * environ ;
3361+ # endif
3362+
3363+ if (rettv_dict_alloc (rettv ) != OK )
3364+ return ;
3365+
3366+ # ifdef MSWIN
3367+ if (* _wenviron == NULL )
3368+ return ;
3369+ # else
3370+ if (* environ == NULL )
3371+ return ;
3372+ # endif
3373+
3374+ for (i = 0 ; ; ++ i )
3375+ {
3376+ # ifdef MSWIN
3377+ short_u * p ;
3378+
3379+ if ((p = (short_u * )_wenviron [i ]) == NULL )
3380+ return ;
3381+ entry = utf16_to_enc (p , NULL );
3382+ # else
3383+ if ((entry = (char_u * )environ [i ]) == NULL )
3384+ return ;
3385+ entry = vim_strsave (entry );
3386+ # endif
3387+ if (entry == NULL ) // out of memory
3388+ return ;
3389+ if ((value = vim_strchr (entry , '=' )) == NULL )
3390+ {
3391+ vim_free (entry );
3392+ continue ;
3393+ }
3394+ * value ++ = NUL ;
3395+ dict_add_string (rettv -> vval .v_dict , (char * )entry , value );
3396+ vim_free (entry );
3397+ }
3398+ #endif
3399+ }
3400+
33423401/*
33433402 * "escape({string}, {chars})" function
33443403 */
@@ -5260,6 +5319,27 @@ f_getcwd(typval_T *argvars, typval_T *rettv)
52605319#endif
52615320}
52625321
5322+ /*
5323+ * "getenv()" function
5324+ */
5325+ static void
5326+ f_getenv (typval_T * argvars , typval_T * rettv )
5327+ {
5328+ int mustfree = FALSE;
5329+ char_u * p = vim_getenv (tv_get_string (& argvars [0 ]), & mustfree );
5330+
5331+ if (p == NULL )
5332+ {
5333+ rettv -> v_type = VAR_SPECIAL ;
5334+ rettv -> vval .v_number = VVAL_NULL ;
5335+ return ;
5336+ }
5337+ if (!mustfree )
5338+ p = vim_strsave (p );
5339+ rettv -> vval .v_string = p ;
5340+ rettv -> v_type = VAR_STRING ;
5341+ }
5342+
52635343/*
52645344 * "getfontname()" function
52655345 */
@@ -11424,6 +11504,23 @@ f_setcmdpos(typval_T *argvars, typval_T *rettv)
1142411504 rettv -> vval .v_number = set_cmdline_pos (pos );
1142511505}
1142611506
11507+ /*
11508+ * "setenv()" function
11509+ */
11510+ static void
11511+ f_setenv (typval_T * argvars , typval_T * rettv UNUSED )
11512+ {
11513+ char_u namebuf [NUMBUFLEN ];
11514+ char_u valbuf [NUMBUFLEN ];
11515+ char_u * name = tv_get_string_buf (& argvars [0 ], namebuf );
11516+
11517+ if (argvars [1 ].v_type == VAR_SPECIAL
11518+ && argvars [1 ].vval .v_number == VVAL_NULL )
11519+ vim_unsetenv (name );
11520+ else
11521+ vim_setenv (name , tv_get_string_buf (& argvars [1 ], valbuf ));
11522+ }
11523+
1142711524/*
1142811525 * "setfperm({fname}, {mode})" function
1142911526 */
0 commit comments