diff extra/engine/engif.c @ 0:6b33357c7561 octave-forge

Initial revision
author pkienzle
date Wed, 10 Oct 2001 19:54:49 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/extra/engine/engif.c	Wed Oct 10 19:54:49 2001 +0000
@@ -0,0 +1,265 @@
+#include <stdio.h>
+
+#include <sys/time.h>
+#include <sys/types.h>
+#include <unistd.h>
+
+#include "engine.h"
+#include "engif.h"
+
+int  pfd1[2];
+int  pfd2[2];
+int  outcnt;
+
+extern Engine matengine;
+extern int matopen;
+extern char *matbufptr;
+extern int matbufcnt;
+
+static int savechar( int outdest, char dat );
+
+int openpipes( void )
+{
+  int retval = 0;
+
+  if( pipe( pfd1 ) == -1 )
+  {
+    perror("pipe");
+    retval = -1;
+  }
+  else
+  {
+    if( pipe( pfd2 ) == -1 )
+    {
+      perror("pipe");
+      close( pfd1[0] );  /* Needs some error checking */
+      close( pfd1[1] );  /* Needs some error checking */
+      retval = -1;
+    }
+  }
+  return retval;
+}
+
+
+int closepipes( void )
+{
+  int retval = 0;
+
+  /* Needs some error checking */
+
+  close( pfd1[0] );
+  close( pfd1[1] );
+  close( pfd2[0] );
+  close( pfd2[1] );
+
+  return retval;
+}
+
+
+int plumbpipes( void )
+{
+  int retval = 0;
+
+  /* Needs some error checking */
+
+  close(0);       /* close normal stdin */
+  dup(pfd2[0]);   /* make stdin same as pfd2[0] */
+  close(1);       /* close normal stdout */
+  dup(pfd1[1]);   /* make stdout same as pfd1[1] */
+
+  return retval;
+}
+
+
+void cleanhouse( void )
+{
+  if( matopen )
+    engClose( &matengine );
+}
+
+
+int getline( char* buf )
+{
+  int i;
+
+  /* Read a line into buf */
+  i = 0;
+  do
+  {
+    read( pfd1[0], &buf[i], 1 );
+    i++;
+    if( i == BUFMAX-1 )
+      buf[i-1] = '\n';
+  }
+  while( buf[i-1] != '\n' );
+  buf[i] = '\0';
+
+#ifdef DEBUGAPI
+  printf( "getline: %s", buf );
+#endif
+
+  return 0;
+}
+
+
+int putline( char* buf )
+{
+  int count;
+
+  /* Write a line from buf */
+  count = write( pfd2[1], buf, strlen(buf) );
+
+#ifdef DEBUGAPI
+  printf( "putline: %s", buf );
+#endif
+
+  return count;
+}
+
+int flushjunk( void )
+{
+#ifdef DEBUGAPI
+  char temp;
+  int count;
+  fd_set rfds;
+  struct timeval tv;
+  int retval;
+
+  printf( "flushjunk: " );
+
+  count = 0;
+  do
+  {
+    /* Check the Octave pipe to see if it has input. */
+    FD_ZERO(&rfds);
+    FD_SET(pfd1[0], &rfds);
+    /* Wait up to two seconds. */
+    tv.tv_sec = 2;
+    tv.tv_usec = 0;
+
+    retval = select(pfd1[0]+1, &rfds, NULL, NULL, &tv);
+    /* Don't rely on the value of tv now! */
+
+    if (retval)
+    {
+      count++;
+      read( pfd1[0], &temp, 1 );
+      printf( "%c", temp );
+    }
+  }  while( retval );
+
+  printf("\n");
+  return count;
+#else
+  return 0;
+#endif
+}
+
+
+int flushprompt( int outkey )
+{
+  char temp;
+  int test, count;
+
+  /* If outkey=1  : write all engine output to the output buffer */
+  /*    outkey=2  : write all engine output to stdout */
+  /*    otherwise : discard all output from the engine */
+
+  count = 0;
+  outcnt = 0;
+
+/*   printf( "flushprompt: " ); */
+
+  test = 1;
+  while( test != 4 )
+  {
+    read( pfd1[0], &temp, 1 );
+    switch( test )
+    {
+    case 0:
+      if( temp == '\n' )
+	test = 1;
+      else
+	test = 0;
+      break;
+    case 1:
+      if( temp == '\n' )
+	test = 1;
+      else
+      {
+	if( temp == '>' )
+	  test = 2;
+	else
+	  test = 0;
+      }
+      break;
+    case 2:
+      if( temp == '>' )
+	test = 3;
+      else
+      {
+	test = 0;
+	savechar( outkey, '>' );   /* Save the current ">" char */
+      }
+      break;
+    case 3:
+      if( temp == ' ' )
+	test = 4;
+      else
+      {
+	test = 0;
+	savechar( outkey, '>' );   /* Save the previous ">" char */
+	savechar( outkey, '>' );   /* Save the current ">" char */
+      }
+      break;
+    }
+    if( test < 2 )
+      savechar( outkey, temp );
+  }
+  if( outkey == 2 )
+    printf( ">> " );
+  else
+  {
+    if( outkey == 1 )
+    {
+      /* Add terminating NULL to output buffer */
+      if( matbufptr != NULL )
+	if( outcnt < matbufcnt )
+	{
+	  matbufptr[outcnt] = '\0';
+	  outcnt++;
+	}
+    }
+  }
+
+  return count;
+}
+
+
+static int savechar( int outdest, char dat )
+{
+  /* If outdest=1 : write all engine output to the output buffer */
+  /*    outdest=2 : write all engine output to stdout */
+  /*    otherwise : discard all output from the engine */
+
+  switch( outdest )
+  {
+  case 0:
+    break;
+  case 1:
+    if( matbufptr != NULL )
+      if( outcnt < matbufcnt-1 )
+      {
+	matbufptr[outcnt] = dat;
+	outcnt++;
+      }
+    break;
+  case 2:
+    putchar( dat );
+    break;
+  default:
+    fprintf( stderr, "Engine: unknown output destination specified\n" );
+  }
+
+  return 0;
+}