Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Sign in / Register
Toggle navigation
M
magicseteditor
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Locked Files
Issues
0
Issues
0
List
Boards
Labels
Service Desk
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Security & Compliance
Security & Compliance
Dependency List
License Compliance
Packages
Packages
Container Registry
Analytics
Analytics
CI / CD
Code Review
Insights
Issues
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
MyCard
magicseteditor
Commits
b0d34072
Commit
b0d34072
authored
Aug 04, 2008
by
twanvl
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
command line interface can now execute scripts
parent
c7e3a98d
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
108 additions
and
22 deletions
+108
-22
src/cli/cli_main.cpp
src/cli/cli_main.cpp
+90
-16
src/cli/cli_main.hpp
src/cli/cli_main.hpp
+13
-3
src/cli/win32_cli_wrapper.cpp
src/cli/win32_cli_wrapper.cpp
+5
-3
No files found.
src/cli/cli_main.cpp
View file @
b0d34072
...
...
@@ -10,11 +10,17 @@
#include <util/error.hpp>
#include <cli/cli_main.hpp>
#include <cli/text_io_handler.hpp>
#include <script/functions/functions.hpp>
#include <data/format/formats.hpp>
#include <wx/process.h>
DECLARE_TYPEOF_COLLECTION
(
ScriptParseError
);
// ----------------------------------------------------------------------------- : Command line interface
CLISetInterface
::
CLISetInterface
()
:
quiet
(
false
)
,
our_context
(
nullptr
)
{
if
(
!
cli
.
haveConsole
())
{
throw
Error
(
_
(
"Can not run command line interface without a console;
\n
start MSE with
\"
mse.com --cli
\"
"
));
...
...
@@ -22,6 +28,20 @@ CLISetInterface::CLISetInterface()
run
();
}
CLISetInterface
::~
CLISetInterface
()
{
delete
our_context
;
}
Context
&
CLISetInterface
::
getContext
()
{
if
(
!
our_context
)
{
our_context
=
new
Context
();
init_script_functions
(
*
our_context
);
}
return
*
our_context
;
}
// ----------------------------------------------------------------------------- : Running
void
CLISetInterface
::
run
()
{
// show welcome logo
if
(
!
quiet
)
showWelcome
();
...
...
@@ -49,23 +69,77 @@ void CLISetInterface::showWelcome() {
cli
.
flush
();
}
void
CLISetInterface
::
showUsage
()
{
cli
<<
_
(
" Commands available from the prompt:
\n\n
"
);
cli
<<
_
(
" <expression> Execute a script expression, display the result
\n
"
);
cli
<<
_
(
" :help Show this help page.
\n
"
);
cli
<<
_
(
" :load <setfile> Load a different set file.
\n
"
);
cli
<<
_
(
" :quit Exit the MSE command line interface.
\n
"
);
cli
<<
_
(
" :! <command> Perform a shell command.
\n
"
);
cli
<<
_
(
"
\n
Commands can be abreviated to their first letter if there is no ambiguity.
\n\n
"
);
}
void
CLISetInterface
::
handleCommand
(
const
String
&
command
)
{
if
(
command
.
empty
())
{
// empty, ignore
}
else
if
(
command
==
_
(
":q"
)
||
command
==
_
(
":quit"
))
{
if
(
!
quiet
)
{
cli
<<
_
(
"Goodbye
\n
"
);
cli
.
flush
();
try
{
if
(
command
.
empty
())
{
// empty, ignore
}
else
if
(
command
.
GetChar
(
0
)
==
_
(
':'
))
{
// :something
size_t
space
=
min
(
command
.
find_first_of
(
_
(
' '
)),
command
.
size
());
String
before
=
command
.
substr
(
0
,
space
);
String
arg
=
space
+
1
<
command
.
size
()
?
command
.
substr
(
space
+
1
)
:
wxEmptyString
;
if
(
before
==
_
(
":q"
)
||
before
==
_
(
":quit"
))
{
if
(
!
quiet
)
{
cli
<<
_
(
"Goodbye
\n
"
);
cli
.
flush
();
}
running
=
false
;
}
else
if
(
before
==
_
(
":?"
)
||
before
==
_
(
":h"
)
||
before
==
_
(
":help"
))
{
showUsage
();
}
else
if
(
before
==
_
(
":l"
)
||
before
==
_
(
":load"
))
{
if
(
arg
.
empty
())
{
cli
<<
_
(
"Give a filename to open.
\n
"
);
}
else
{
setSet
(
import_set
(
arg
));
}
}
else
if
(
before
==
_
(
":!"
))
{
if
(
arg
.
empty
())
{
cli
<<
_
(
"Give a shell command to execute.
\n
"
);
}
else
{
#ifdef __WXMSW__
_wsystem
(
arg
.
c_str
());
#elif UNICODE
wxCharBuffer
buf
=
arg
.
fn_str
();
system
(
buf
);
#else
system
(
arg
.
c_str
());
#endif
}
}
else
{
cli
<<
_
(
"Unknown command, type :help for help.
\n
"
);
}
}
else
if
(
command
==
_
(
"exit"
)
||
command
==
_
(
"quit"
))
{
cli
<<
_
(
"Use :quit to quit
\n
"
);
}
else
if
(
command
==
_
(
"help"
))
{
cli
<<
_
(
"Use :help for help
\n
"
);
}
else
{
// parse command
vector
<
ScriptParseError
>
errors
;
ScriptP
script
=
parse
(
command
,
set
.
get
(),
false
,
errors
);
if
(
!
errors
.
empty
())
{
FOR_EACH
(
error
,
errors
)
showError
(
error
.
what
());
return
;
}
// execute command
Context
&
ctx
=
set
?
set
->
getContext
()
:
getContext
();
ScriptValueP
result
=
ctx
.
eval
(
*
script
,
false
);
// show result
cli
<<
result
->
toCode
()
<<
ENDL
;
}
running
=
false
;
}
else
if
(
command
==
_
(
":?"
)
||
command
==
_
(
":help"
))
{
// TODO show help
}
else
if
(
command
==
_
(
"exit"
)
||
command
==
_
(
"quit"
))
{
cli
<<
_
(
"Use :quit to quit
\n
"
);
cli
.
flush
();
}
else
if
(
command
.
GetChar
(
0
)
==
_
(
':'
))
{
cli
<<
_
(
"Unknown command, type :help for help.
\n
"
);
cli
.
flush
();
}
else
{
// execute command
// TODO
cli
<<
_
(
"You said:
\n
"
)
<<
command
<<
ENDL
;
cli
.
flush
();
}
catch
(
const
Error
&
e
)
{
showError
(
e
.
what
());
}
}
void
CLISetInterface
::
showError
(
const
String
&
error
)
{
cli
<<
RED
<<
_
(
"ERROR: "
)
<<
NORMAL
<<
replace_all
(
error
,
_
(
"
\n
"
),
_
(
" "
))
<<
ENDL
;
}
src/cli/cli_main.hpp
View file @
b0d34072
...
...
@@ -10,19 +10,29 @@
// ----------------------------------------------------------------------------- : Includes
#include <util/prec.hpp>
#include <data/set.hpp>
// ----------------------------------------------------------------------------- : Command line interface
class
CLISetInterface
{
class
CLISetInterface
:
public
SetView
{
public:
CLISetInterface
();
~
CLISetInterface
();
protected:
void
onAction
(
const
Action
&
,
bool
)
{}
private:
bool
quiet
;
bool
running
;
bool
quiet
;
///< Supress prompts and other non-vital stuff
bool
running
;
///< Still running?
void
run
();
void
showWelcome
();
void
showUsage
();
void
handleCommand
(
const
String
&
command
);
void
showError
(
const
String
&
error
);
/// our own context, when no set is loaded
Context
&
getContext
();
Context
*
our_context
;
};
// ----------------------------------------------------------------------------- : EOF
...
...
src/cli/win32_cli_wrapper.cpp
View file @
b0d34072
...
...
@@ -41,6 +41,7 @@ struct Transfer {
DWORD
WINAPI
TransferThread
(
Transfer
*
);
BOOL
WINAPI
HandleCtrlEvent
(
DWORD
type
);
void
CopyFileBuffer
(
HANDLE
output
,
char
*
buffer
,
DWORD
size
);
void
InitEscapeTranslation
(
HANDLE
console
);
void
PerformEscapeCode
(
HANDLE
console
,
char
command
,
int
argc
,
int
argv
[]);
...
...
@@ -158,12 +159,13 @@ BOOL WINAPI HandleCtrlEvent(DWORD type) {
DWORD
exit_code
=
1
;
// try to exit child process cleanly
// TODO: don't exit child on Ctrl+C
/*CopyFileBuffer(TODO,":quit\n",6);
CopyFileBuffer
(
in_mine
,
":quit
\n
"
,
6
);
CopyFileBuffer
(
out_real
,
":quit
\n
"
,
6
);
if
(
WaitForSingleObject
(
child_process_info
.
hProcess
,
100
)
==
WAIT_OBJECT_0
)
{
GetExitCodeProcess
(
child_process_info
.
hProcess
,
&
exit_code
);
} else {
*/
}
else
{
TerminateProcess
(
child_process_info
.
hProcess
,
1
);
//
}
}
// exit this process
ExitProcess
(
exit_code
);
return
TRUE
;
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment