Merge 14551:14980 from trunk
[reactos.git] / reactos / subsys / system / cmd / call.c
1 /*
2 * CALL.C - call internal batch command.
3 *
4 *
5 * History:
6 *
7 * 16 Jul 1998 (Hans B Pufal)
8 * started.
9 *
10 * 16 Jul 1998 (John P Price)
11 * Seperated commands into individual files.
12 *
13 * 27-Jul-1998 (John P Price <linux-guru@gcfl.net>)
14 * added config.h include
15 *
16 * 04-Aug-1998 (Hans B Pufal)
17 * added lines to initialize for pointers (HBP004) This fixed the
18 * lock-up that happened sometimes when calling a batch file from
19 * another batch file.
20 *
21 * 07-Jan-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
22 * Added help text ("call /?") and cleaned up.
23 *
24 * 20-Jan-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
25 * Unicode and redirection safe!
26 *
27 * 02-Apr-2005 (Magnus Olsen) <magnus@greatlord.com>)
28 * Remove all hardcode string to En.rc
29 */
30
31 #include "precomp.h"
32 #include "resource.h"
33
34
35 /*
36 * Perform CALL command.
37 *
38 * Allocate a new batch context and add it to the current chain.
39 * Call parsecommandline passing in our param string
40 * If No batch file was opened then remove our newly allocted
41 * context block.
42 */
43
44 INT cmd_call (LPTSTR cmd, LPTSTR param)
45 {
46 TCHAR szMsg[RC_STRING_MAX_SIZE];
47 LPBATCH_CONTEXT n = NULL;
48
49 #ifdef _DEBUG
50 DebugPrintf (_T("cmd_call: (\'%s\',\'%s\')\n"), cmd, param);
51 #endif
52 if (!_tcsncmp (param, _T("/?"), 2))
53 {
54 LoadString(GetModuleHandle(NULL), STRING_CALL_HELP, szMsg, RC_STRING_MAX_SIZE);
55 ConOutPuts(szMsg);
56 return 0;
57 }
58
59 n = (LPBATCH_CONTEXT)malloc (sizeof (BATCH_CONTEXT));
60
61 if (n == NULL)
62 {
63 error_out_of_memory ();
64 return 1;
65 }
66
67 n->prev = bc;
68 bc = n;
69
70 bc->hBatchFile = INVALID_HANDLE_VALUE;
71 bc->params = NULL;
72 bc->shiftlevel = 0;
73 bc->forvar = 0; /* HBP004 */
74 bc->forproto = NULL; /* HBP004 */
75
76 ParseCommandLine (param);
77
78 /* Wasn't a batch file so remove conext */
79 if (bc->hBatchFile == INVALID_HANDLE_VALUE)
80 {
81 bc = bc->prev;
82 free (n);
83 }
84
85 return 0;
86 }
87
88 /* EOF */