diff options
| author | Alan Mishchenko <alanmi@berkeley.edu> | 2012-08-24 15:44:33 -0700 | 
|---|---|---|
| committer | Alan Mishchenko <alanmi@berkeley.edu> | 2012-08-24 15:44:33 -0700 | 
| commit | 22d21a5c44a05e49c315bb0732cc0de100350e4a (patch) | |
| tree | 5db529e04b2787346ae6cc36bc9cf89a85bea0df /src | |
| parent | 7e2b00776213f86f54b9aa601e8593951b9de7d0 (diff) | |
| download | abc-22d21a5c44a05e49c315bb0732cc0de100350e4a.tar.gz abc-22d21a5c44a05e49c315bb0732cc0de100350e4a.tar.bz2 abc-22d21a5c44a05e49c315bb0732cc0de100350e4a.zip  | |
Added recording history of used commands into file 'abc.history' (Windows only).
Diffstat (limited to 'src')
| -rw-r--r-- | src/base/cmd/cmd.c | 44 | ||||
| -rw-r--r-- | src/base/cmd/cmdApi.c | 6 | ||||
| -rw-r--r-- | src/base/cmd/cmdHist.c | 37 | ||||
| -rw-r--r-- | src/base/main/mainInt.h | 2 | 
4 files changed, 61 insertions, 28 deletions
diff --git a/src/base/cmd/cmd.c b/src/base/cmd/cmd.c index b20e9ee2..161cd090 100644 --- a/src/base/cmd/cmd.c +++ b/src/base/cmd/cmd.c @@ -337,33 +337,51 @@ int CmdCommandWhich( Abc_Frame_t * pAbc, int argc, char **argv )  int CmdCommandHistory( Abc_Frame_t * pAbc, int argc, char **argv )  {      char * pName; -    int i, c, num = 20; +    int i, c; +    int nPrints = 10; +    int iRepeat = -1;      Extra_UtilGetoptReset(); -    while ( ( c = Extra_UtilGetopt( argc, argv, "h" ) ) != EOF ) +    while ( ( c = Extra_UtilGetopt( argc, argv, "Nh" ) ) != EOF )      {          switch ( c )          { +            case 'N': +                if ( globalUtilOptind >= argc ) +                { +                    Abc_Print( -1, "Command line switch \"-N\" should be followed by an integer.\n" ); +                    goto usage; +                } +                nPrints = atoi(argv[globalUtilOptind]); +                globalUtilOptind++; +                if ( nPrints < 0 )  +                    goto usage; +                break;              case 'h':                  goto usage;              default :                  goto usage;          }      } -    if ( argc > 2 ) +//    if ( argc > globalUtilOptind + 1 ) +    if ( argc >= globalUtilOptind + 1 )          goto usage; -    // get the number of commands to print -    if ( argc == globalUtilOptind + 1 ) -        num = atoi(argv[globalUtilOptind]); +    // get the number from the command line +//    if ( argc == globalUtilOptind + 1 ) +//        iRepeat = atoi(argv[globalUtilOptind]);      // print the commands -    Vec_PtrForEachEntryStart( char *, pAbc->aHistory, pName, i, Abc_MaxInt(0, Vec_PtrSize(pAbc->aHistory)-num) ) -        fprintf( pAbc->Out, "%2d : %s", Vec_PtrSize(pAbc->aHistory)-i, pName ); +    if ( iRepeat >= 0 && iRepeat < Vec_PtrSize(pAbc->aHistory) ) +        fprintf( pAbc->Out, "%s", Vec_PtrEntry(pAbc->aHistory, Vec_PtrSize(pAbc->aHistory)-1-iRepeat) ); +    else if ( nPrints > 0 ) +        Vec_PtrForEachEntryStart( char *, pAbc->aHistory, pName, i, Abc_MaxInt(0, Vec_PtrSize(pAbc->aHistory)-nPrints) ) +            fprintf( pAbc->Out, "%2d : %s\n", Vec_PtrSize(pAbc->aHistory)-i, pName );      return 0;  usage: -    fprintf( pAbc->Err, "usage: history [-h] <num>\n" ); -    fprintf( pAbc->Err, "          prints the latest command entered on the command line\n" ); +    fprintf( pAbc->Err, "usage: history [-N <num>] [-h]\n" ); +    fprintf( pAbc->Err, "          lists the last commands entered on the command line\n" ); +    fprintf( pAbc->Err, " -N num : the maximum number of entries to show [default = %d]\n", nPrints );      fprintf( pAbc->Err, " -h     : print the command usage\n" ); -    fprintf( pAbc->Err, "num     : print the last num commands\n" ); +//    fprintf( pAbc->Err, " <this> : the history entry to repeat to the command line\n" );      return ( 1 );  } @@ -541,7 +559,7 @@ int CmdCommandSource( Abc_Frame_t * pAbc, int argc, char **argv )      int c, echo, prompt, silent, interactive, quit_count, lp_count;      int status = 0;             /* initialize so that lint doesn't complain */      int lp_file_index, did_subst; -    char *prompt_string, *real_filename, line[MAX_STR], *command; +    char *prompt_string, *real_filename, line[ABC_MAX_STR], *command;      FILE *fp;      interactive = silent = prompt = echo = 0; @@ -627,7 +645,7 @@ int CmdCommandSource( Abc_Frame_t * pAbc, int argc, char **argv )              clearerr( fp );              /* read another command line */ -            if ( fgets( line, MAX_STR, fp ) == NULL ) +            if ( fgets( line, ABC_MAX_STR, fp ) == NULL )              {                  if ( interactive )                  { diff --git a/src/base/cmd/cmdApi.c b/src/base/cmd/cmdApi.c index 5b94f67e..a2322c4c 100644 --- a/src/base/cmd/cmdApi.c +++ b/src/base/cmd/cmdApi.c @@ -86,11 +86,7 @@ int Cmd_CommandExecute( Abc_Frame_t * pAbc, const char * sCommand )      const char * sCommandNext;      char **argv; -    if ( !pAbc->fAutoexac && !pAbc->fSource &&  -        strncmp(sCommand,"set",3) &&  -        strncmp(sCommand,"quit",4) &&  -        strncmp(sCommand,"source",6) &&  -        strncmp(sCommand,"history",7) )  +    if ( !pAbc->fAutoexac && !pAbc->fSource )           Cmd_HistoryAddCommand(pAbc, sCommand);      sCommandNext = sCommand;      do  diff --git a/src/base/cmd/cmdHist.c b/src/base/cmd/cmdHist.c index 49808ec5..7222d2c5 100644 --- a/src/base/cmd/cmdHist.c +++ b/src/base/cmd/cmdHist.c @@ -47,11 +47,25 @@ ABC_NAMESPACE_IMPL_START  ***********************************************************************/  void Cmd_HistoryAddCommand(    Abc_Frame_t * p, const char * command )  { -    static char Buffer[MAX_STR]; +    char Buffer[ABC_MAX_STR]; +    int Len = strlen(command);      strcpy( Buffer, command ); -    if ( command[strlen(command)-1] != '\n' ) -        strcat( Buffer, "\n" ); -    Vec_PtrPush( p->aHistory, Extra_UtilStrsav(Buffer) ); +    if ( Buffer[Len-1] == '\n' ) +        Buffer[Len-1] = 0; +    if ( strncmp(Buffer,"set",3) &&  +         strncmp(Buffer,"quit",4) &&  +         strncmp(Buffer,"source",6) &&  +         strncmp(Buffer,"history",7) && strncmp(Buffer,"hi ", 3) && strcmp(Buffer,"hi") ) +    { +        char * pStr; +        int i; +        // do not enter if the same command appears among the last five commands +        Vec_PtrForEachEntryStart( char *, p->aHistory, pStr, i, Abc_MaxInt(0, Vec_PtrSize(p->aHistory)-5) ) +            if ( !strcmp(pStr, Buffer) ) +                break; +        if ( i == Vec_PtrSize(p->aHistory) ) +            Vec_PtrPush( p->aHistory, Extra_UtilStrsav(Buffer) ); +    }  }  /**Function************************************************************* @@ -67,7 +81,7 @@ void Cmd_HistoryAddCommand(    Abc_Frame_t * p, const char * command )  ***********************************************************************/  void Cmd_HistoryRead( Abc_Frame_t * p )  { -    char Buffer[1000]; +    char Buffer[ABC_MAX_STR];      FILE * pFile;      assert( Vec_PtrSize(p->aHistory) == 0 );      pFile = fopen( "abc.history", "rb" ); @@ -76,8 +90,13 @@ void Cmd_HistoryRead( Abc_Frame_t * p )  //        Abc_Print( 0, "Cannot open file \"abc.history\" for reading.\n" );          return;      } -    while ( fgets( Buffer, 1000, pFile ) != NULL ) +    while ( fgets( Buffer, ABC_MAX_STR, pFile ) != NULL ) +    { +        int Len = strlen(Buffer); +        if ( Buffer[Len-1] == '\n' ) +            Buffer[Len-1] = 0;          Vec_PtrPush( p->aHistory, Extra_UtilStrsav(Buffer) ); +    }      fclose( pFile );  } @@ -95,7 +114,7 @@ void Cmd_HistoryRead( Abc_Frame_t * p )  void Cmd_HistoryWrite( Abc_Frame_t * p )  {      FILE * pFile; -    char * pName;  +    char * pStr;       int i;      pFile = fopen( "abc.history", "wb" );      if ( pFile == NULL ) @@ -103,8 +122,8 @@ void Cmd_HistoryWrite( Abc_Frame_t * p )          Abc_Print( 0, "Cannot open file \"abc.history\" for writing.\n" );          return;      } -    Vec_PtrForEachEntry( char *, p->aHistory, pName, i ) -        fputs( pName, pFile ); +    Vec_PtrForEachEntry( char *, p->aHistory, pStr, i ) +        fprintf( pFile, "%s\n", pStr );      fclose( pFile );  } diff --git a/src/base/main/mainInt.h b/src/base/main/mainInt.h index 5c30f7c0..1eb47424 100644 --- a/src/base/main/mainInt.h +++ b/src/base/main/mainInt.h @@ -48,7 +48,7 @@ ABC_NAMESPACE_HEADER_START  #define ABC_VERSION "UC Berkeley, ABC 1.01"  // the maximum length of an input line  -#define MAX_STR     32768 +#define ABC_MAX_STR     (1<<15)  ////////////////////////////////////////////////////////////////////////  ///                    STRUCTURE DEFINITIONS                         ///  | 
