summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBaruch Sterin <baruchs@gmail.com>2015-11-05 01:24:26 -0800
committerBaruch Sterin <baruchs@gmail.com>2015-11-05 01:24:26 -0800
commitaa62165a1cbd40740eb4ef5237d3a2259c40fb1d (patch)
tree9093299292af63e1732d647abb4e9fed380d7410
parent211c7ebe14a2d69f0550ed12b1e5133032aba4b9 (diff)
downloadabc-aa62165a1cbd40740eb4ef5237d3a2259c40fb1d.tar.gz
abc-aa62165a1cbd40740eb4ef5237d3a2259c40fb1d.tar.bz2
abc-aa62165a1cbd40740eb4ef5237d3a2259c40fb1d.zip
main: allow the -c -C -q -f -F -s command line options to be repeated and the commands they sepcify be executed in order instead of overriding each other
-rw-r--r--src/base/main/mainReal.c52
1 files changed, 40 insertions, 12 deletions
diff --git a/src/base/main/mainReal.c b/src/base/main/mainReal.c
index abe1f453..a22a871a 100644
--- a/src/base/main/mainReal.c
+++ b/src/base/main/mainReal.c
@@ -81,7 +81,8 @@ static int TypeCheck( Abc_Frame_t * pAbc, const char * s);
int Abc_RealMain( int argc, char * argv[] )
{
Abc_Frame_t * pAbc;
- char sCommandUsr[ABC_MAX_STR] = {0}, sCommandTmp[ABC_MAX_STR], sReadCmd[1000], sWriteCmd[1000];
+ Vec_Str_t* sCommandUsr = Vec_StrAlloc(1000);
+ char sCommandTmp[ABC_MAX_STR], sReadCmd[1000], sWriteCmd[1000];
const char * sOutFile, * sInFile;
char * sCommand;
int fStatus = 0;
@@ -143,32 +144,56 @@ int Abc_RealMain( int argc, char * argv[] )
while ((c = Extra_UtilGetopt(argc, argv, "c:q:C:S:hf:F:o:st:T:xb")) != EOF) {
switch(c) {
case 'c':
- strcpy( sCommandUsr, globalUtilOptarg );
+ if( Vec_StrSize(sCommandUsr) > 0 )
+ {
+ Vec_StrAppend(sCommandUsr, " ; ");
+ }
+ Vec_StrAppend(sCommandUsr, globalUtilOptarg );
fBatch = BATCH;
break;
case 'q':
- strcpy( sCommandUsr, globalUtilOptarg );
+ if( Vec_StrSize(sCommandUsr) > 0 )
+ {
+ Vec_StrAppend(sCommandUsr, " ; ");
+ }
+ Vec_StrAppend(sCommandUsr, globalUtilOptarg );
fBatch = BATCH_QUIET;
break;
case 'C':
- strcpy( sCommandUsr, globalUtilOptarg );
+ if( Vec_StrSize(sCommandUsr) > 0 )
+ {
+ Vec_StrAppend(sCommandUsr, " ; ");
+ }
+ Vec_StrAppend(sCommandUsr, globalUtilOptarg );
fBatch = BATCH_THEN_INTERACTIVE;
break;
case 'S':
- strcpy( sCommandUsr, globalUtilOptarg );
+ if( Vec_StrSize(sCommandUsr) > 0 )
+ {
+ Vec_StrAppend(sCommandUsr, " ; ");
+ }
+ Vec_StrAppend(sCommandUsr, globalUtilOptarg );
fBatch = BATCH_SMT;
break;
case 'f':
- sprintf(sCommandUsr, "source %s", globalUtilOptarg);
+ if( Vec_StrSize(sCommandUsr) > 0 )
+ {
+ Vec_StrAppend(sCommandUsr, " ; ");
+ }
+ Vec_StrPrintF(sCommandUsr, "source %s", globalUtilOptarg );
fBatch = BATCH;
break;
case 'F':
- sprintf(sCommandUsr, "source -x %s", globalUtilOptarg);
+ if( Vec_StrSize(sCommandUsr) > 0 )
+ {
+ Vec_StrAppend(sCommandUsr, " ; ");
+ }
+ Vec_StrPrintF(sCommandUsr, "source -x %s", globalUtilOptarg );
fBatch = BATCH;
break;
@@ -230,9 +255,11 @@ int Abc_RealMain( int argc, char * argv[] )
}
}
+ Vec_StrPush(sCommandUsr, '\0');
+
if ( fBatch == BATCH_SMT )
{
- Wlc_StdinProcessSmt( pAbc, sCommandUsr );
+ Wlc_StdinProcessSmt( pAbc, Vec_StrArray(sCommandUsr) );
Abc_Stop();
return 0;
}
@@ -242,8 +269,8 @@ int Abc_RealMain( int argc, char * argv[] )
extern Gia_Man_t * Gia_ManFromBridge( FILE * pFile, Vec_Int_t ** pvInit );
pAbc->pGia = Gia_ManFromBridge( stdin, NULL );
}
- else if ( fBatch!=INTERACTIVE && fBatch!=BATCH_QUIET && sCommandUsr[0] )
- Abc_Print( 1, "ABC command line: \"%s\".\n\n", sCommandUsr );
+ else if ( fBatch!=INTERACTIVE && fBatch!=BATCH_QUIET && Vec_StrSize(sCommandUsr)>0 )
+ Abc_Print( 1, "ABC command line: \"%s\".\n\n", Vec_StrArray(sCommandUsr) );
if ( fBatch!=INTERACTIVE )
{
@@ -280,7 +307,7 @@ int Abc_RealMain( int argc, char * argv[] )
if ( fStatus == 0 )
{
/* cmd line contains `source <file>' */
- fStatus = Cmd_CommandExecute( pAbc, sCommandUsr );
+ fStatus = Cmd_CommandExecute( pAbc, Vec_StrArray(sCommandUsr) );
if ( (fStatus == 0 || fStatus == -1) && fFinalWrite && sOutFile )
{
sprintf( sCommandTmp, "%s %s", sWriteCmd, sOutFile );
@@ -292,9 +319,10 @@ int Abc_RealMain( int argc, char * argv[] )
fBatch = INTERACTIVE;
pAbc->fBatchMode = 0;
}
-
}
+ Vec_StrFreeP(&sCommandUsr);
+
if ( fBatch==INTERACTIVE )
{
// start interactive mode