fix: stop using "magic" numbers in string operations for the copyannofile2log feature
fix: When using the copylogfromannofile workaround, extract the build ID and build duration and add to the log as these are useful for analysis. The log should now be identical to the stdout file.
fix: Remove extra blank lines from output in copylogfromannofile mode.
/*
* Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
* All rights reserved.
* This component and the accompanying materials are made available
* under the terms of the License "Eclipse Public License v1.0"
* which accompanies this distribution, and is available
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
*
* Initial Contributors:
* Nokia Corporation - initial contribution.
*
* Contributors:
*
* Description:
*
*/
/*
Get rid of the path to talon from a commandline string on windows find the
-c (if it's there) and step past it to after the quote on the first command:
"g:\program files\talon\talon.exe" -c "gcc -c . . ."
^------ Returns a pointer to here
Take care of the possibilty that there might be spaces in the command
if it is quoted.
A state-machine is flexible but not all that easy to write. Should investigate
the possiblity of using the Ragel state machine generator perhaps.
*/
#define CH_START 0 /* start state */
#define CH_PRE 1 /* spaces before executable name */
#define CH_EXQUOTE 2 /* part of the executable name, outside quotes */
#define CH_INQUOTE 3 /* part of the executable name, in a quoted region */
#define CH_POST 4 /* spaces after executable name */
#define CH_MINUS 5 /* start of -c option */
#define CH_C 6 /* end of -c option */
#define CH_PRECOMMAND 7 /* spaces before shell commands */
#define CH_COMMAND 8 /* first character of shell command */
#define CH_ERR 9 /* Error! */
#include "log.h"
#include "chomp.h"
char * chompCommand(char command[])
{
char *result = command;
int state = CH_START;
while (state != CH_COMMAND && state != CH_ERR)
{
DEBUG(("startstate: %d, char %c ",state, *result));
switch (*result)
{
case ' ':
switch (state)
{
case CH_START:
case CH_PRE:
state = CH_PRE;
break;
case CH_EXQUOTE:
state = CH_POST;
break;
case CH_INQUOTE:
break;
case CH_POST:
break;
case CH_MINUS:
state = CH_C;
break;
case CH_C:
state = CH_PRECOMMAND;
break;
case CH_PRECOMMAND:
break;
default:
state = CH_ERR;
break;
}
break;
case 'c':
switch (state)
{
case CH_START:
case CH_PRE:
state = CH_EXQUOTE;
break;
case CH_EXQUOTE:
case CH_INQUOTE:
break;
case CH_POST:
state = CH_ERR;
break;
case CH_MINUS:
state = CH_C;
break;
case CH_C:
case CH_PRECOMMAND:
default:
state = CH_ERR;
break;
}
break;
case '-':
switch (state)
{
case CH_START:
case CH_PRE:
state = CH_EXQUOTE;
break;
case CH_EXQUOTE:
case CH_INQUOTE:
break;
case CH_POST:
state = CH_MINUS;
break;
case CH_MINUS:
case CH_C:
case CH_PRECOMMAND:
default:
state = CH_ERR;
break;
}
break;
case '"':
switch (state)
{
case CH_START:
case CH_PRE:
case CH_EXQUOTE:
state = CH_INQUOTE;
break;
case CH_INQUOTE:
state = CH_EXQUOTE;
break;
case CH_POST:
case CH_MINUS:
case CH_C:
state = CH_ERR;
break;
case CH_PRECOMMAND:
state = CH_COMMAND;
break;
default:
state = CH_ERR;
break;
}
break;
default:
switch (state)
{
case CH_START:
case CH_PRE:
state = CH_EXQUOTE;
break;
case CH_INQUOTE:
case CH_EXQUOTE:
break;
default:
state = CH_ERR;
break;
}
break;
}
DEBUG(("endstate: %d\n",state));
result ++;
}
if (state == CH_ERR)
return (char *)0;
return result;
}