update for HEAD-2003091401
[reactos.git] / lib / ntdll / rtl / env.c
index cbdf7be..ce47600 100644 (file)
 
 /* FUNCTIONS *****************************************************************/
 
+/*
+ * @implemented
+ */
 NTSTATUS STDCALL
 RtlCreateEnvironment(BOOLEAN Inherit,
                     PWSTR *Environment)
 {
-  MEMORY_BASIC_INFORMATION MemInfo;
   PVOID EnvPtr = NULL;
   NTSTATUS Status = STATUS_SUCCESS;
   ULONG RegionSize = PAGE_SIZE;
@@ -94,6 +96,9 @@ RtlCreateEnvironment(BOOLEAN Inherit,
 }
 
 
+/*
+ * @implemented
+ */
 VOID STDCALL
 RtlDestroyEnvironment(PWSTR Environment)
 {
@@ -106,6 +111,9 @@ RtlDestroyEnvironment(PWSTR Environment)
 }
 
 
+/*
+ * @implemented
+ */
 NTSTATUS STDCALL
 RtlExpandEnvironmentStrings_U(PWSTR Environment,
                              PUNICODE_STRING Source,
@@ -192,6 +200,9 @@ copy:
 }
 
 
+/*
+ * @implemented
+ */
 VOID STDCALL
 RtlSetCurrentEnvironment(PWSTR NewEnvironment,
                         PWSTR *OldEnvironment)
@@ -213,6 +224,9 @@ RtlSetCurrentEnvironment(PWSTR NewEnvironment,
 }
 
 
+/*
+ * @implemented
+ */
 NTSTATUS STDCALL
 RtlSetEnvironmentVariable(PWSTR *Environment,
                          PUNICODE_STRING Name,
@@ -244,9 +258,11 @@ RtlSetEnvironmentVariable(PWSTR *Environment,
     {
       /* get environment length */
       wcs = env_end = env;
-      while (*env_end)
-       while (*env_end++)
-         ;
+      do
+      {
+        env_end += wcslen(env_end) + 1;
+      }
+      while (*env_end);
       env_end++;
       env_len = env_end - env;
       DPRINT("environment length %ld characters\n", env_len);
@@ -254,14 +270,18 @@ RtlSetEnvironmentVariable(PWSTR *Environment,
       /* find where to insert */
       while (*wcs)
        {
-         for (var.Buffer = wcs++; *wcs && *wcs != L'='; wcs++)
-           ;
+          var.Buffer = wcs++;
+         wcs = wcschr(wcs, L'=');
+         if (wcs == NULL)
+         {
+            wcs = var.Buffer + wcslen(var.Buffer);
+         }
          if (*wcs)
            {
              var.Length = (wcs - var.Buffer) * sizeof(WCHAR);
              var.MaximumLength = var.Length;
-             for ( val = ++wcs; *wcs; wcs++)
-               ;
+             val = ++wcs;
+             wcs += wcslen(wcs); 
              f = RtlCompareUnicodeString(&var, Name, TRUE);
              if (f >= 0)
                {
@@ -418,6 +438,9 @@ found:
 }
 
 
+/*
+ * @implemented
+ */
 NTSTATUS STDCALL
 RtlQueryEnvironmentVariable_U(PWSTR Environment,
                              PUNICODE_STRING Name,
@@ -425,9 +448,8 @@ RtlQueryEnvironmentVariable_U(PWSTR Environment,
 {
   NTSTATUS Status;
   PWSTR wcs;
-  PWSTR var;
+  UNICODE_STRING var;
   PWSTR val;
-  int varlen;
   int len;
   BOOLEAN SysEnvUsed = FALSE;
 
@@ -451,22 +473,24 @@ RtlQueryEnvironmentVariable_U(PWSTR Environment,
   len = Name->Length / sizeof(WCHAR);
   while (*wcs)
     {
-      for (var = wcs++; *wcs && *wcs != L'='; wcs++)
-       ;
-
+      var.Buffer = wcs++;
+      wcs = wcschr(wcs, L'=');
+      if (wcs == NULL)
+      {
+         wcs = var.Buffer + wcslen(var.Buffer);
+      }
       if (*wcs)
        {
-         varlen = wcs - var;
-         for (val = ++wcs; *wcs; wcs++)
-            ;
+         var.Length = var.MaximumLength = (wcs - var.Buffer) * sizeof(WCHAR);
+         val = ++wcs;
+         wcs += wcslen(wcs);
 
-         if (varlen == len &&
-             !_wcsnicmp(var, Name->Buffer, len))
+         if (RtlEqualUnicodeString(&var, Name, TRUE))
            {
              Value->Length = (wcs - val) * sizeof(WCHAR);
              if (Value->Length < Value->MaximumLength)
                {
-                 wcscpy(Value->Buffer, val);
+                 memcpy(Value->Buffer, val, Value->Length + sizeof(WCHAR));
                  DPRINT("Value %S\n", val);
                  DPRINT("Return STATUS_SUCCESS\n");
                  Status = STATUS_SUCCESS;