From 938719062df1bd17d4360c2e51d07423aee28ab1 Mon Sep 17 00:00:00 2001
From: Jason Edmeades <us@edmeades.me.uk>
Date: Tue, 20 Feb 2007 00:40:28 +0000
Subject: [PATCH] cmd.exe: Add support for %ERRORLEVEL% in both batch and cmd
 line.

---
 programs/cmd/batch.c    | 10 +++++++++-
 programs/cmd/wcmdmain.c | 21 ++++++++++++++++++++-
 2 files changed, 29 insertions(+), 2 deletions(-)

diff --git a/programs/cmd/batch.c b/programs/cmd/batch.c
index 9532cbba8f3..384feddc184 100755
--- a/programs/cmd/batch.c
+++ b/programs/cmd/batch.c
@@ -146,13 +146,21 @@ int i;
   /*   contents of fred, then the digit 1. Would need to remove */
   /*   ExpandEnvStrings to achieve this                         */
 
-  /* Replace use of %0...%9 */
+  /* Replace use of %0...%9 and errorlevel*/
   p = cmd1;
   while ((p = strchr(p, '%'))) {
     i = *(p+1) - '0';
     if (*(p+1) == '~') {
       WCMD_HandleTildaModifiers(&p, NULL);
       p++;
+    } else if (CompareString (LOCALE_USER_DEFAULT,
+                              NORM_IGNORECASE | SORT_STRINGSORT,
+	                      (p+1), 11, "ERRORLEVEL%", -1) == 2) {
+      char output[10];
+      sprintf(output, "%d", errorlevel);
+      s = strdup (p+12);
+      strcpy (p, output);
+      strcat (p, s);
     } else if ((i >= 0) && (i <= 9)) {
       s = strdup (p+2);
       t = WCMD_parameter (context -> command, i + context -> shift_count, NULL);
diff --git a/programs/cmd/wcmdmain.c b/programs/cmd/wcmdmain.c
index fa17d9373bf..0e58197539a 100755
--- a/programs/cmd/wcmdmain.c
+++ b/programs/cmd/wcmdmain.c
@@ -301,13 +301,32 @@ int main (int argc, char *argv[])
 
 void WCMD_process_command (char *command)
 {
-    char *cmd, *p;
+    char *cmd, *p, *s;
     int status, i, len;
     DWORD count, creationDisposition;
     HANDLE h;
     char *whichcmd;
     SECURITY_ATTRIBUTES sa;
 
+/*
+ *	Replace errorlevel with current value (This shrinks in
+ *	  place and hence no need to reallocate the memory yet)
+ */
+    p = command;
+    while ((p = strchr(p, '%'))) {
+      if (CompareString (LOCALE_USER_DEFAULT,
+                                NORM_IGNORECASE | SORT_STRINGSORT,
+                                (p+1), 11, "ERRORLEVEL%", -1) == 2) {
+        char output[10];
+        sprintf(output, "%d", errorlevel);
+        s = strdup (p+12);
+        strcpy (p, output);
+        strcat (p, s);
+      } else {
+        p++;
+      }
+    }
+
 /*
  *	Expand up environment variables.
  */
-- 
GitLab