summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/qcommon/cmd.c32
1 files changed, 28 insertions, 4 deletions
diff --git a/src/qcommon/cmd.c b/src/qcommon/cmd.c
index afd10279..99a80fd7 100644
--- a/src/qcommon/cmd.c
+++ b/src/qcommon/cmd.c
@@ -177,6 +177,11 @@ void Cbuf_Execute (void)
char line[MAX_CMD_LINE];
int quotes;
+ // This will keep // style comments all on one line by not breaking on
+ // a semicolon. It will keep /* ... */ style comments all on one line by not
+ // breaking it for semicolon or newline.
+ qboolean in_star_comment = qfalse;
+ qboolean in_slash_comment = qfalse;
while (cmd_text.cursize)
{
if ( cmd_wait > 0 ) {
@@ -186,7 +191,7 @@ void Cbuf_Execute (void)
break;
}
- // find a \n or ; line break
+ // find a \n or ; line break or comment: // or /* */
text = (char *)cmd_text.data;
quotes = 0;
@@ -194,10 +199,29 @@ void Cbuf_Execute (void)
{
if (text[i] == '"')
quotes++;
- if ( !(quotes&1) && text[i] == ';')
- break; // don't break if inside a quoted string
- if (text[i] == '\n' || text[i] == '\r' )
+
+ if ( !(quotes&1)) {
+ if (i < cmd_text.cursize - 1) {
+ if (! in_star_comment && text[i] == '/' && text[i+1] == '/')
+ in_slash_comment = qtrue;
+ else if (! in_slash_comment && text[i] == '/' && text[i+1] == '*')
+ in_star_comment = qtrue;
+ else if (in_star_comment && text[i] == '*' && text[i+1] == '/') {
+ in_star_comment = qfalse;
+ // If we are in a star comment, then the part after it is valid
+ // Note: This will cause it to NUL out the terminating '/'
+ // but ExecuteString doesn't require it anyway.
+ i++;
+ break;
+ }
+ }
+ if (! in_slash_comment && ! in_star_comment && text[i] == ';')
+ break;
+ }
+ if (! in_star_comment && (text[i] == '\n' || text[i] == '\r')) {
+ in_slash_comment = qfalse;
break;
+ }
}
if( i >= (MAX_CMD_LINE - 1)) {