1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
| /*
* This file is part of the Code::Blocks IDE and licensed under the GNU General Public License, version 3
* http://www.gnu.org/licenses/gpl-3.0.html
*
* $Revision: 4909 $
* $Id: main.cpp 4909 2008-02-27 13:15:26Z mortenmacfly $
* $HeadURL: svn://svn.berlios.de/codeblocks/tags/8.02/src/tools/ConsoleRunner/main.cpp $
*Modify by COCO<4341322@gmail.com>
*/
#include <stdio.h>
#include <stdlib.h>
#ifndef __WXMSW__
#define __WXMSW__ 1
#endif
#ifdef __WXMSW__
#include <windows.h>
#include <psapi.h>
#include <time.h>
#include <conio.h>
#define wait_key getch
#else
#define wait_key getchar
#endif
#include <string.h>
#ifdef __MINGW32__
int _CRT_glob = 0;
#endif
bool hasSpaces(const char* str)
{
char last = 0;
while (str && *str)
{
if ((*str == ' ' || *str == '\t') && last != '\\')
return true;
last = *str++;
}
return false;
}
int main(int argc, char** argv)
{
if (argc < 2)
{
printf("Usage: cb_console_runner <filename> <args ...>\n");
return 1;
}
// count size of arguments
int fullsize = 0;
for (int i = 1; i < argc; ++i)
{
fullsize += strlen(argv[i]);
}
// add some slack for spaces between args plus quotes around executable
fullsize += argc + 32;
char* cmdline = new char[fullsize];
memset(cmdline, 0, fullsize);
// 1st arg (executable) enclosed in quotes to support filenames with spaces
bool sp = hasSpaces(argv[1]);
if (sp)
strcat(cmdline, "\"");
strcat(cmdline, argv[1]);
if (sp)
strcat(cmdline, "\"");
strcat(cmdline, " ");
for (i = 2; i < argc; ++i)
{
sp = hasSpaces(argv[i]);
if (sp)
strcat(cmdline, "\"");
strcat(cmdline, argv[i]);
if (sp)
strcat(cmdline, "\"");
strcat(cmdline, " ");
}
//printf("Would run '%s'\n", cmdline);
#ifdef __WXMSW__
//Windows's system() seems to not be able to handle parentheses in
//the path, so we have to launch the program a different way.
SetConsoleTitle(cmdline);
STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory( &si, sizeof(si) );
si.cb = sizeof(si);
ZeroMemory( &pi, sizeof(pi) );
// Start the child process.
clock_t cl = clock();
CreateProcess( NULL, TEXT(cmdline), NULL, NULL, FALSE, 0,
NULL, NULL, &si, &pi );
// Wait until child process exits.
WaitForSingleObject( pi.hProcess, INFINITE );
PROCESS_MEMORY_COUNTERS memInfo;
GetProcessMemoryInfo(pi.hProcess,&memInfo,sizeof(memInfo));
FILETIME ftCreate, ftExit, ftKernel, ftUser;
GetProcessTimes(pi.hProcess, &ftCreate, &ftExit, &ftKernel, &ftUser);
LONGLONG tUser64 = *(LONGLONG*) &ftUser;
LONGLONG tKernel64 = *(LONGLONG*) &ftKernel;
DWORD tUser, tKernel;
tUser = (DWORD)(tUser64 / 10000);
tKernel = (DWORD)(tKernel64 / 10000);
cl = clock() - cl;
cl *= 1000;
cl /= CLOCKS_PER_SEC;
// Get the return value of the child process
DWORD ret;
GetExitCodeProcess( pi.hProcess, &ret );
// Close process and thread handles.
CloseHandle( pi.hProcess );
CloseHandle( pi.hThread );
printf("\nProcess returned %ld (0x%lX) execution time : %0.3f s", ret, ret, ((float)cl)/1000);
printf("\nPeakWorkingSetSize : %d K ~ %d Mb",memInfo.PeakWorkingSetSize/1024,memInfo.PeakWorkingSetSize/1024/1024);
printf("\nUser Time:%d ms ~ %0.3f S Kernel Time:%d ms ~ %0.3f S\nTotal Time:%d ms ~ %0.3f S",tUser,tUser/1000.0,tKernel,tKernel/1000.0,tUser+tKernel,(tUser+tKernel)/1000.0);
printf("\nPress any key to continue.\n");
#else
int ret = system(cmdline);
printf("\nPress ENTER to continue.\n");
#endif
wait_key();
delete[] cmdline;
return ret;
} |