[Opensrf-commits] r1036 - in branches/new-json2: . src/srfsh

svn at svn.open-ils.org svn at svn.open-ils.org
Sun Jul 15 20:03:55 EDT 2007


Author: erickson
Date: 2007-07-15 19:58:36 -0400 (Sun, 15 Jul 2007)
New Revision: 1036

Modified:
   branches/new-json2/
   branches/new-json2/src/srfsh/srfsh.c
Log:
Merged revisions 1034-1035 via svnmerge from 
svn://svn.open-ils.org/OpenSRF/trunk

........
  r1035 | miker | 2007-07-14 22:18:41 -0400 (Sat, 14 Jul 2007) | 30 lines
  
  Patch from Scott McKellar to clean up srfsh's user interface:
  
  1. srfsh exits the main loop in two circumstances.  The first is when
  it sees the "quit" or "exit" command.  The second is when it sees
  end-of-file, either because it reads the end of a script or because
  the user enters the associated keystrokes (typically Control-D).
  
  In the case of end-of-file, srfsh exits without issuing another
  newline.  As a result, the next shell prompt shows up concatenated
  to the srfsh prompt.  This result is harmless but annoying.
  
  I tweaked the code to detect this situation and issue an extra
  newline, so that the next shell prompt show up on a line by itself.
  
  2. I strip off leading whitespace before processing the input
  command.
  
  As a result, srfsh will now recognize "quit", "exit", or a leading
  exclamation point, even when preceded by whitespace.  Other commands
  are not affected because strtok() already strips off leading
  blanks.  Tab characters don't matter because readline() removes them.
  
  3. I also strip off trailing whitespace.  This measure affects only
  the "quit" and "exit" commands.
  
  4. I ignore input lines whose first non-whitespace character is an
  octothorpe ('#', also known as hash, pound, or tic-tac-toe).  In
  other words, scripts can now have comments.
........



Property changes on: branches/new-json2
___________________________________________________________________
Name: svnmerge-integrated
   - /trunk:1-1033
   + /trunk:1-1035

Modified: branches/new-json2/src/srfsh/srfsh.c
===================================================================
--- branches/new-json2/src/srfsh/srfsh.c	2007-07-15 02:18:41 UTC (rev 1035)
+++ branches/new-json2/src/srfsh/srfsh.c	2007-07-15 23:58:36 UTC (rev 1036)
@@ -2,6 +2,7 @@
 #include <opensrf/osrf_message.h>
 #include <opensrf/osrf_app_session.h>
 #include <time.h>
+#include <ctype.h>
 #include <sys/timeb.h>
 #include <sys/types.h>
 #include <sys/wait.h>
@@ -118,16 +119,46 @@
 	client = osrf_system_get_transport_client();
 
 	/* main process loop */
+	int newline_needed = 1;  /* used as boolean */
 	char* request;
 	while((request=readline(prompt))) {
 
-		if( !strcasecmp(request, "exit") || !strcasecmp(request,"quit")) 
+		// Find first non-whitespace character
+		
+		char * cmd = request;
+		while( isspace( (unsigned char) *cmd ) )
+			++cmd;
+
+		// ignore comments and empty lines
+
+		if( '\0' == *cmd || '#' == *cmd )
+			continue;
+
+		// Remove trailing whitespace.  We know at this point that
+		// there is at least one non-whitespace character somewhere,
+		// or we would have already skipped this line.  Hence we
+		// needn't check to make sure that we don't back up past
+		// the beginning.
+
+		{
+			// The curly braces limit the scope of the end variable
+			
+			char * end = cmd + strlen(cmd) - 1;
+			while( isspace( (unsigned char) *end ) )
+				--end;
+			end[1] = '\0';
+		}
+
+		if( !strcasecmp(cmd, "exit") || !strcasecmp(cmd, "quit"))
+		{
+			newline_needed = 0;
 			break; 
+		}
+		
+		char* req_copy = strdup(cmd);
 
-		char* req_copy = strdup(request);
-
 		parse_request( req_copy ); 
-		if( request && strlen(request) > 1 ) {
+		if( request && *cmd ) {
 			add_history(request);
 		}
 
@@ -138,6 +169,15 @@
 		fflush(stdout);
 	}
 
+	if( newline_needed ) {
+		
+		// We left the readline loop after seeing an EOF, not after
+		// seeing "quit" or "exit".  So we issue a newline in order
+		// to avoid leaving a dangling prompt.
+
+		putchar( '\n' );
+	}
+
 	if(history_file != NULL )
 		write_history(history_file);
 



More information about the opensrf-commits mailing list