Jason Edmeades : cmd.exe: Add support for %ERRORLEVEL% in both batch and cmd line.

Alexandre Julliard julliard at wine.codeweavers.com
Wed Feb 21 06:01:09 CST 2007


Module: wine
Branch: master
Commit: 938719062df1bd17d4360c2e51d07423aee28ab1
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=938719062df1bd17d4360c2e51d07423aee28ab1

Author: Jason Edmeades <us at edmeades.me.uk>
Date:   Tue Feb 20 00:40:28 2007 +0000

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 9532cbb..384fedd 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 fa17d93..0e58197 100755
--- a/programs/cmd/wcmdmain.c
+++ b/programs/cmd/wcmdmain.c
@@ -301,7 +301,7 @@ 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;
@@ -309,6 +309,25 @@ void WCMD_process_command (char *command)
     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.
  */
     len = ExpandEnvironmentStrings (command, NULL, 0);




More information about the wine-cvs mailing list