Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
G
girara
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
6
Issues
6
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
pwmt
girara
Commits
4329e767
Commit
4329e767
authored
Sep 06, 2020
by
Sebastian Ramacher
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Refactor parsing and execution of commands
parent
dfdb19ba
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
85 additions
and
70 deletions
+85
-70
girara/callbacks.c
girara/callbacks.c
+4
-70
girara/commands.c
girara/commands.c
+71
-0
girara/commands.h
girara/commands.h
+10
-0
No files found.
girara/callbacks.c
View file @
4329e767
...
...
@@ -2,6 +2,7 @@
#include "callbacks.h"
#include "commands.h"
#include "datastructures.h"
#include "input-history.h"
#include "internal.h"
...
...
@@ -447,76 +448,9 @@ girara_callback_inputbar_activate(GtkEntry* entry, girara_session_t* session)
}
);
/* parse input */
gchar
**
argv
=
NULL
;
gint
argc
=
0
;
if
(
g_shell_parse_argv
(
input
,
&
argc
,
&
argv
,
NULL
)
==
FALSE
)
{
girara_debug
(
"Failed to parse argument."
);
g_free
(
input
);
return
false
;
}
gchar
*
cmd
=
argv
[
0
];
/* search commands */
GIRARA_LIST_FOREACH_BODY_WITH_ITER
(
session
->
bindings
.
commands
,
girara_command_t
*
,
iter
,
binding_command
,
if
((
g_strcmp0
(
cmd
,
binding_command
->
command
)
==
0
)
||
(
g_strcmp0
(
cmd
,
binding_command
->
abbr
)
==
0
))
{
girara_list_t
*
argument_list
=
girara_list_new
();
if
(
argument_list
==
NULL
)
{
g_free
(
input
);
g_strfreev
(
argv
);
girara_list_iterator_free
(
iter
);
return
false
;
}
girara_list_set_free_function
(
argument_list
,
g_free
);
for
(
int
i
=
1
;
i
<
argc
;
i
++
)
{
char
*
argument
=
g_strdup
(
argv
[
i
]);
girara_list_append
(
argument_list
,
(
void
*
)
argument
);
}
binding_command
->
function
(
session
,
argument_list
);
girara_list_free
(
argument_list
);
g_free
(
input
);
g_strfreev
(
argv
);
girara_isc_abort
(
session
,
NULL
,
NULL
,
0
);
if
(
session
->
global
.
autohide_inputbar
==
true
)
{
gtk_widget_hide
(
GTK_WIDGET
(
session
->
gtk
.
inputbar
));
}
gtk_widget_hide
(
GTK_WIDGET
(
session
->
gtk
.
inputbar_dialog
));
girara_list_iterator_free
(
iter
);
return
true
;
}
);
/* check for unknown command event handler */
if
(
session
->
events
.
unknown_command
!=
NULL
)
{
if
(
session
->
events
.
unknown_command
(
session
,
input
)
==
true
)
{
g_strfreev
(
argv
);
g_free
(
input
);
girara_isc_abort
(
session
,
NULL
,
NULL
,
0
);
if
(
session
->
global
.
autohide_inputbar
==
true
)
{
gtk_widget_hide
(
GTK_WIDGET
(
session
->
gtk
.
inputbar
));
}
gtk_widget_hide
(
GTK_WIDGET
(
session
->
gtk
.
inputbar_dialog
));
return
true
;
}
}
/* unhandled command */
girara_notify
(
session
,
GIRARA_ERROR
,
_
(
"Not a valid command: %s"
),
cmd
);
g_strfreev
(
argv
);
girara_isc_abort
(
session
,
NULL
,
NULL
,
0
);
return
false
;
bool
ret
=
girara_command_run
(
session
,
input
);
g_free
(
input
);
return
ret
;
}
gboolean
...
...
girara/commands.c
View file @
4329e767
...
...
@@ -632,3 +632,74 @@ girara_cmd_exec(girara_session_t* session, girara_list_t* argument_list)
return
girara_exec_with_argument_list
(
session
,
argument_list
);
}
bool
girara_command_run
(
girara_session_t
*
session
,
const
char
*
input
)
{
/* parse input */
gchar
**
argv
=
NULL
;
gint
argc
=
0
;
if
(
g_shell_parse_argv
(
input
,
&
argc
,
&
argv
,
NULL
)
==
FALSE
)
{
girara_debug
(
"Failed to parse argument."
);
return
false
;
}
gchar
*
cmd
=
argv
[
0
];
/* search commands */
GIRARA_LIST_FOREACH_BODY_WITH_ITER
(
session
->
bindings
.
commands
,
girara_command_t
*
,
iter
,
binding_command
,
if
((
g_strcmp0
(
cmd
,
binding_command
->
command
)
==
0
)
||
(
g_strcmp0
(
cmd
,
binding_command
->
abbr
)
==
0
))
{
girara_list_t
*
argument_list
=
girara_list_new
();
if
(
argument_list
==
NULL
)
{
g_strfreev
(
argv
);
girara_list_iterator_free
(
iter
);
return
false
;
}
girara_list_set_free_function
(
argument_list
,
g_free
);
for
(
int
i
=
1
;
i
<
argc
;
i
++
)
{
char
*
argument
=
g_strdup
(
argv
[
i
]);
girara_list_append
(
argument_list
,
(
void
*
)
argument
);
}
binding_command
->
function
(
session
,
argument_list
);
girara_list_free
(
argument_list
);
g_strfreev
(
argv
);
girara_isc_abort
(
session
,
NULL
,
NULL
,
0
);
if
(
session
->
global
.
autohide_inputbar
==
true
)
{
gtk_widget_hide
(
GTK_WIDGET
(
session
->
gtk
.
inputbar
));
}
gtk_widget_hide
(
GTK_WIDGET
(
session
->
gtk
.
inputbar_dialog
));
girara_list_iterator_free
(
iter
);
return
true
;
}
);
/* check for unknown command event handler */
if
(
session
->
events
.
unknown_command
!=
NULL
)
{
if
(
session
->
events
.
unknown_command
(
session
,
input
)
==
true
)
{
g_strfreev
(
argv
);
girara_isc_abort
(
session
,
NULL
,
NULL
,
0
);
if
(
session
->
global
.
autohide_inputbar
==
true
)
{
gtk_widget_hide
(
GTK_WIDGET
(
session
->
gtk
.
inputbar
));
}
gtk_widget_hide
(
GTK_WIDGET
(
session
->
gtk
.
inputbar_dialog
));
return
true
;
}
}
/* unhandled command */
girara_notify
(
session
,
GIRARA_ERROR
,
_
(
"Not a valid command: %s"
),
cmd
);
g_strfreev
(
argv
);
girara_isc_abort
(
session
,
NULL
,
NULL
,
0
);
return
false
;
}
girara/commands.h
View file @
4329e767
...
...
@@ -40,4 +40,14 @@ bool girara_special_command_add(girara_session_t* session, char identifier,
girara_inputbar_special_function_t
function
,
bool
always
,
int
argument_n
,
void
*
argument_data
)
GIRARA_VISIBLE
;
/**
* Parse input and execute the command
*
* @param session The used girara session
* @param input User input
* @return TRUE No error occurred
* @return FALSE An error occured */
bool
girara_command_run
(
girara_session_t
*
session
,
const
char
*
input
)
GIRARA_VISIBLE
;
#endif
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