OpenCores
URL https://opencores.org/ocsvn/qaz_libs/qaz_libs/trunk

Subversion Repositories qaz_libs

[/] [qaz_libs/] [trunk/] [cli/] [cli/] [sys_cli.c] - Rev 22

Go to most recent revision | Compare with Previous | Blame | View Log

/*-----------------------------------------------------------*/
 
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
 
#include "sys_cmd.h"
#include "sys_error.h"
 
 
 
/*-----------------------------------------------------------*/
#ifdef ANSI_ESCAPE_CODE
#define ASCII_ESC '\x1b'
 
static void send_csi( char c )
{
  putchar( ASCII_ESC );
  putchar( '[' );
  putchar( c );
}
#else
static void send_csi( char c ) {};
#endif
 
 
/*-----------------------------------------------------------*/
static char *cli_edit_buffer( char *in_buffer, char *out_buffer, unsigned int line_length )
{
  static char *out_ptr;
  static char *begin_ptr;
  static char *end_ptr;
 
#ifdef ANSI_ESCAPE_CODE
  static char prev_char;
  static unsigned int csi;
#endif
 
  unsigned int i;
 
  if( out_buffer != NULL )
  {
    out_ptr   = out_buffer;
    begin_ptr = out_buffer;
    end_ptr   = out_buffer + INPUT_LINE_LENGTH;
 
#ifdef ANSI_ESCAPE_CODE
    prev_char = 0;
    csi = 0;
#endif
  }
 
  for( i = 0 ; i < line_length ; i++ )
  {
 
    if( out_ptr >= end_ptr )
    {
      *end_ptr = '\0';
      return( NULL );
    }
 
    if( out_ptr < begin_ptr )
      sys_error_fatal( FATAL_ERROR_CLI );
 
    switch( in_buffer[i] )
    {
      case '\0':
        return( NULL );
        break;
 
      case '\n':
        *out_ptr = '\0';
        return( NULL );
        break;
 
      case '\r':
        *out_ptr = '\0';
        return( NULL );
        break;
 
      case '\b':
        if( out_ptr != begin_ptr )
        {
          send_csi( 'P' );
          out_ptr--;
        } else
        {
          putchar( ' ' );
          send_csi( '\a' );
        }
        break;
 
#ifdef ANSI_ESCAPE_CODE
      case ASCII_ESC:
        break;
 
      case '[':
        if( prev_char == ASCII_ESC )
        {
          csi = 1;
        } else
        {
          *out_ptr = in_buffer[i];
          out_ptr++;
        }
        break;
 
      case 'A':
        if( csi )
        {
          send_csi( 'B' );
          send_csi( '\a' );
 
          csi = 0;
        } else
        {
          *out_ptr = in_buffer[i];
          out_ptr++;
        }
        break;
 
      case 'B':
        if( csi == 0 )
        {
          *out_ptr = in_buffer[i];
          out_ptr++;
        }
        break;
 
      case 'C':
        if( csi )
        {
          send_csi( 'D' );
          send_csi( '\a' );
 
          csi = 0;
        } else
        {
          *out_ptr = in_buffer[i];
          out_ptr++;
        }
        break;
 
      case 'D':
        if( csi )
        {
          send_csi( 'C' );
          send_csi( '\a' );
 
          csi = 0;
        } else
        {
          *out_ptr = in_buffer[i];
          out_ptr++;
        }
        break;
#endif
 
      default:
        *out_ptr = in_buffer[i];
        out_ptr++;
        break;
    }
 
#ifdef ANSI_ESCAPE_CODE
    prev_char = in_buffer[i];
#endif
  }
 
  return( out_ptr );
}
 
 
/*-----------------------------------------------------------*/
void sys_cli_task( void )
{
  char last_return_value = EXIT_SUCCESS;
  char in_buffer[INPUT_LINE_LENGTH + 1];
  char out_buffer[INPUT_LINE_LENGTH + 1];
  char *cli_ptr;
  struct cli_cmd_tab_t cmd_to_check = { "", NULL, NULL };
  unsigned char cli_argc;
  char *cli_argv[MAX_CLI_ARGC];
  struct cli_cmd_tab_t *cli_cmd;
  unsigned int bytes_read;
 
  cli_init();
 
  PRINTF_MACRO( "\r\n" );
 
  for( ;; )
  {
    PRINTF_MACRO( "%d > ", last_return_value );
 
    cli_argc = 0;
    last_return_value = EXIT_SUCCESS;
 
    bytes_read = (unsigned int)read( STDIN_FILENO, (void *)in_buffer, sizeof(in_buffer) );
    cli_ptr = cli_edit_buffer( in_buffer, out_buffer, bytes_read );
 
    while( cli_ptr != NULL )
    {
      bytes_read = (unsigned int)read( STDIN_FILENO, (void *)in_buffer, sizeof(in_buffer) );
      cli_ptr = cli_edit_buffer( in_buffer, NULL, bytes_read );
    }
 
    if( out_buffer[0] == '\0' )
    {
      PRINTF_MACRO( " NULL String! Command ignored\r\n" );
      last_return_value = EXIT_FAILURE;
    }
 
    while( last_return_value != EXIT_FAILURE )
    {
      cli_ptr = strtok( out_buffer, " \t" );
 
      strncpy( cmd_to_check.cmd, out_buffer, MAX_CMD_LENGTH );
      cli_cmd = cli_find_command( &cmd_to_check );
 
      if ( cli_cmd == NULL )
      {
        PRINTF_MACRO( "\r\n Command not found!\r\n" );
        last_return_value = EXIT_FAILURE;
        break;
      }
 
      if( cli_ptr == NULL )
      {
        cli_argv[cli_argc] = out_buffer;
        cli_argc++;
      } else
      {
        while( cli_ptr != NULL )
        {
          cli_argv[cli_argc] = cli_ptr;
          cli_argc++;
 
          cli_ptr = strtok( NULL, " \t" );
        }
      }
 
      PRINTF_MACRO( "\r\n" );
 
      last_return_value = cli_cmd->func( cli_argc, (const char **)cli_argv );
      break;
    }
 
  }
}
 
 

Go to most recent revision | Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

© copyright 1999-2020 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.