3分間ハッキング

Britestreamという弊社取り扱い製品についてくるucliというユーティリティーは、単にstdinからfgets()しているだけで不便だったので、readline()するようにしてみました。とりあえずLinux版のみ。これでちょいとは便利になりました。
 
以下パッチ。

diff -cr cli/Makefile clinew/Makefile
*** cli/Makefile 2005-07-18 11:55:29.000000000 +0900
— clinew/Makefile 2005-07-18 15:14:24.000000000 +0900
***************
*** 1,7 ****
  # Lines starting with the pound sign are comments.
  #
 
! SRC_DIR = ..
  MID_DIR = .
  OUT_DIR = .
 
— 1,7 —-
  # Lines starting with the pound sign are comments.
  #
 
! SRC_DIR = .
  MID_DIR = .
  OUT_DIR = .
 
***************
*** 108,114 ****
 
  # Ultralock Management API
  APIINCLUDE = $(SRC_DIR)/../api
! APILIB =  $(SRC_DIR)/../api/linux/libulapi.a
 
  SSLBASE = $(SRC_DIR)/../../Library/Openssl/openssl-0.9.7c
  SSLINCLUDE1 = $(SSLBASE)/Linux/include
— 108,114 —-
 
  # Ultralock Management API
  APIINCLUDE = $(SRC_DIR)/../api
! APILIB =  $(SRC_DIR)/../api/libulapi.a
 
  SSLBASE = $(SRC_DIR)/../../Library/Openssl/openssl-0.9.7c
  SSLINCLUDE1 = $(SSLBASE)/Linux/include
***************
*** 116,122 ****
  #ifeq ($(SECURE_CHANNEL),yes)
    SSLLIB = $(SSLBASE)/Linux/libssl.a
  #endif
! SSLLIB += $(SSLBASE)/Linux/libcrypto.a
 
  #ifdef CHIPDEV
  # Layer N internal code control
— 116,123 —-
  #ifeq ($(SECURE_CHANNEL),yes)
    SSLLIB = $(SSLBASE)/Linux/libssl.a
  #endif
! #SSLLIB += $(SSLBASE)/Linux/libcrypto.a ! SSLLIB += /usr/lib/libcrypto.a
 
  #ifdef CHIPDEV
  # Layer N internal code control
diff -cr cli/gcli.c clinew/gcli.c
*** cli/gcli.c 2005-07-18 11:55:29.000000000 +0900
— clinew/gcli.c 2005-07-18 17:19:29.000000000 +0900
***************
*** 25,30 ****
— 25,33 —-
  #include <ctype.h>
  #endif
 
+ #include <readline/readline.h>
+ #include <readline/history.h>
+
  #include "gcli.h"
  #ifdef UMC_IF
  #include "ultralock_umcif.h"
***************
*** 223,228 ****
— 226,232 —-
  #ifdef UMC_IF
    char cmdBuffer[2048]; int cmdLen;
  #endif
+   char *rl = NULL;
 
    // Read in one whole line
    if(fp_current) {
***************
*** 264,274 ****
  #endif
    else {
      // use fgets() to get the command
!     printf_STD("%s", cli_prompt);
!     fflush(stdout); // important flush, do not remove
!     status = (int)(fgets(command_line, MAX_LINE_LEN, stdin)!=NULL);
!     if(!status)
        return ERR_READLINE;
    }
 
    // get rid of newline character at end of line (if any)
— 268,287 —-
  #endif
    else {
      // use fgets() to get the command
!     // printf_STD("%s", cli_prompt);
!     // fflush(stdout); // important flush, do not remove
!     // status = (int)(fgets(command_line, MAX_LINE_LEN, stdin)!=NULL);
!
!     rl = readline("uclinew> ");
!     if (rl == NULL) {
!       free(rl);
        return ERR_READLINE;
+     }
+     else {
+       status = (rl != NULL);
+       strncpy(command_line, rl, MAX_LINE_LEN);
+     }
+     free(rl);
    }
 
    // get rid of newline character at end of line (if any)
 



コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください