summaryrefslogtreecommitdiffhomepage
path: root/src/argv/ntapi_tt_env_vars.c
diff options
context:
space:
mode:
authormidipix <writeonce@midipix.org>2016-06-29 10:49:47 -0400
committermidipix <writeonce@midipix.org>2016-06-29 19:16:37 -0400
commitf7b99942f85f4c8c35058f1a8b1194cd4468bc6d (patch)
tree890e0f326a2d0fbee61ae6062f26a4bd9dbef90c /src/argv/ntapi_tt_env_vars.c
parenta2ea1bdf70166f887457b5462332d2df4f6f54c5 (diff)
downloadntapi-f7b99942f85f4c8c35058f1a8b1194cd4468bc6d.tar.bz2
ntapi-f7b99942f85f4c8c35058f1a8b1194cd4468bc6d.tar.xz
free-standing environment: remove fluff from the argv/envp parsing facility.
Diffstat (limited to 'src/argv/ntapi_tt_env_vars.c')
-rw-r--r--src/argv/ntapi_tt_env_vars.c93
1 files changed, 15 insertions, 78 deletions
diff --git a/src/argv/ntapi_tt_env_vars.c b/src/argv/ntapi_tt_env_vars.c
index 4fe590c..5642101 100644
--- a/src/argv/ntapi_tt_env_vars.c
+++ b/src/argv/ntapi_tt_env_vars.c
@@ -9,104 +9,41 @@
#include "ntapi_impl.h"
int32_t __stdcall __ntapi_tt_get_env_var_meta_utf16(
- __in const uint32_t * crc32_table,
__in wchar16_t * env_var_name,
- __in uint32_t env_var_name_hash __optional,
__in wchar16_t ** envp,
__out nt_env_var_meta_utf16 * env_var_meta)
{
int idx;
- uint32_t crc32;
- unsigned char * byte_buffer;
wchar16_t * wch;
- #define EQUAL_SIGN 0x3D
+ #define EQUAL_SIGN 0x3D
- /* step 1: crc32 of the target env_var_name */
- if (env_var_name_hash)
- crc32 = env_var_name_hash;
- else {
- crc32 = 0 ^ 0xFFFFFFFF;
+ /* init */
+ env_var_meta->name = 0;
+ env_var_meta->value = 0;
+ env_var_meta->envp_index = 0;
+ env_var_meta->flags = 0;
- /* initialize byte_buffer */
- byte_buffer = (unsigned char *)env_var_name;
-
- /* iterate */
- while (*byte_buffer) {
- /* two bytes at a time */
- crc32 = (crc32 >> 8) ^ crc32_table[(crc32 ^ *byte_buffer) & 0xFF];
- byte_buffer++;
- crc32 = (crc32 >> 8) ^ crc32_table[(crc32 ^ *byte_buffer) & 0xFF];
- byte_buffer++;
- }
- crc32 = (crc32 ^ 0xFFFFFFFF);
- }
-
- /* initialize the env_var_meta structure */
- env_var_meta->name_hash = crc32;
- env_var_meta->name = (wchar16_t *)0;
- env_var_meta->value = (wchar16_t *)0;
- env_var_meta->value_hash = 0;
- env_var_meta->envp_index = 0;
- env_var_meta->flags = 0;
-
- /* step 2: look for the environment variable in envp[] */
- idx = 0;
- while (envp[idx] && (!env_var_meta->value)) {
+ /* lookup */
+ for (idx=0; envp[idx] && !env_var_meta->value; idx++) {
wch = envp[idx];
- /* find the equal sign */
- while ((*wch) && (*wch != EQUAL_SIGN))
+ while (*wch && (*wch != EQUAL_SIGN))
wch++;
if (*wch != EQUAL_SIGN)
return NT_STATUS_ILLEGAL_CHARACTER;
- /* hash the current environment variable */
- crc32 = 0 ^ 0xFFFFFFFF;
-
- /* initialize byte_buffer */
- byte_buffer = (unsigned char *)envp[idx];
-
- /* iterate */
- while ((uintptr_t)(byte_buffer) < (uintptr_t)wch) {
- /* two bytes at a time */
- crc32 = (crc32 >> 8) ^ crc32_table[(crc32 ^ *byte_buffer) & 0xFF];
- byte_buffer++;
- crc32 = (crc32 >> 8) ^ crc32_table[(crc32 ^ *byte_buffer) & 0xFF];
- byte_buffer++;
- }
-
- if (env_var_meta->name_hash == (crc32 ^ 0xFFFFFFFF)) {
- /* found it, get ready to hash the value */
+ if (!(__ntapi->tt_strncmp_utf16(
+ envp[idx],
+ env_var_name,
+ wch - envp[idx]))) {
wch++;
- env_var_meta->name = envp[idx];
- env_var_meta->value = wch;
+ env_var_meta->name = envp[idx];
+ env_var_meta->value = wch;
env_var_meta->envp_index = idx;
- } else {
- idx++;
- }
- }
-
- if (env_var_meta->value) {
- /* hash the value: utf-16, null-terminated */
- crc32 = 0 ^ 0xFFFFFFFF;
-
- /* initialize byte_buffer */
- byte_buffer = (unsigned char *)env_var_meta->value;
-
- /* iterate */
- while (*byte_buffer) {
- /* two bytes at a time */
- crc32 = (crc32 >> 8) ^ crc32_table[(crc32 ^ *byte_buffer) & 0xFF];
- byte_buffer++;
- crc32 = (crc32 >> 8) ^ crc32_table[(crc32 ^ *byte_buffer) & 0xFF];
- byte_buffer++;
}
-
- env_var_meta->value_hash = (crc32 ^ 0xFFFFFFFF);
}
return NT_STATUS_SUCCESS;
}
-