diff --git a/code/qcommon/cmd.c b/code/qcommon/cmd.c index 6f7c36f0..b40aa875 100644 --- a/code/qcommon/cmd.c +++ b/code/qcommon/cmd.c @@ -176,6 +176,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 ) { @@ -185,7 +190,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; @@ -193,10 +198,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)) {