Files
Nim/lib/pure
havardjohn f4bbf3bf0b Add use of Windows Wide CRT API for env. vars (#20084)
* Add use of Windows Wide CRT API for env. vars

Replaces use of CRT API `getenv` and `putenv` with respectively
`_wgetenv` and `_wputenv`. Motivation is to reliably convert environment
variables to UTF-8, and the wide API is best there, because it's
reliably UTF-16.

Changed the hack in `lib/std/private/win_setenv.nim` by switching the
order of the Unicode and MBCS environment update; Unicode first, MBCS
second. Because `_wgetenv`/`_wputenv` is now used, the Unicode
environment will be initialized, so it should always be updated.

Stop updating MBCS environment with the name of `getEnv`. It's not
necessarily true that MBCS encoding and the `string` encoding is the
same. Instead convert UTF-16 to current Windows code page with
`wcstombs`, and use that string to update MBCS.

Fixes regression in `6b3c77e` that caused `std/envvars.getEnv` or
`std/os.getEnv` on Windows to return non-UTF-8 encoded strings.

Add tests that test environment variables with Unicode characters in
their name or value.

* Fix test issues

Fixes

* `nim cpp` didn't compile the tests
* Nimscript import of `tosenv.nim` from `test_nimscript.nims` failed
  with "cannot importc"

* Fix missing error check on `wcstombs`

* Fix ANSI testing errors

* Separate ANSI-related testing to their own tests, and only executing
  them if running process has a specific code page
  * Setting locale with `setlocale` was not reliable and didn't work on
    certain machines
* Add handling of a "no character representation" error in second
  `wcstombs` call

* tests/newruntime_misc: Increment allocCount

Increments overall allocations in `tnewruntime_misc` test. This is
because `getEnv` now does an additional allocation: allocation of the
UTF-16 string used as parameter to `c_wgetenv`.

* Revert "tests/newruntime_misc: Increment allocCount"

This reverts commit 4d4fe8bd3e.

* tests/newruntime_misc: Increment allocCount on Windows

Increments overall allocations in `tnewruntime_misc` test for Windows.
This is because `getEnv` on Windows now does an additional allocation:
allocation of the UTF-16 string used as parameter to `c_wgetenv`.

* Refactor, adding suggestions from code review

Co-authored-by: Clay Sweetser <Varriount@users.noreply.github.com>

* Document, adding suggestions

Co-authored-by: Clay Sweetser <Varriount@users.noreply.github.com>

Co-authored-by: ringabout <43030857+ringabout@users.noreply.github.com>
Co-authored-by: Clay Sweetser <Varriount@users.noreply.github.com>
2022-08-20 04:30:11 -04:00
..
2021-08-31 08:14:05 +02:00
2021-12-20 10:40:32 +01:00
2022-06-04 07:03:03 +02:00
2015-10-01 12:05:45 -07:00
2021-02-23 21:05:39 -08:00
2021-07-13 09:22:33 +02:00
2021-04-08 14:08:58 +02:00
2018-04-06 11:59:49 +02:00
2022-02-02 17:10:11 +01:00
2021-01-09 00:24:41 +01:00
2022-02-14 22:15:59 +00:00
2022-02-02 17:10:11 +01:00
2021-04-06 22:08:59 +02:00
2021-02-24 21:47:27 -08:00
2022-02-02 17:10:11 +01:00
2022-02-02 17:10:11 +01:00
2021-02-21 00:27:39 -08:00
2022-08-02 00:06:27 +08:00
2022-02-02 17:10:11 +01:00
2021-07-20 12:50:43 +02:00
2021-08-23 00:13:39 +02:00
2021-10-05 12:29:59 +02:00
2021-09-19 23:35:50 +02:00
2021-02-08 09:46:07 +01:00
2022-02-02 17:10:11 +01:00