Ignore:
Timestamp:
Nov 30, 2012 8:57:18 AM (11 years ago)
Author:
riza
Message:

Re #1098: Modify input method for console, from character based to line based

File:
1 edited

Legend:

Unmodified
Added
Removed
  • pjproject/branches/projects/cli/pjlib-util/src/pjlib-util/cli_telnet.c

    r4302 r4303  
    2727#include <pj/pool.h> 
    2828#include <pj/string.h> 
     29#include <pj/except.h> 
    2930#include <pjlib-util/errno.h> 
     31#include <pjlib-util/scanner.h> 
    3032 
    3133#define CLI_TELNET_BUF_SIZE 256 
     
    889891} 
    890892 
     893/* Syntax error handler for parser. */ 
     894static void on_syntax_error(pj_scanner *scanner) 
     895{ 
     896    PJ_UNUSED_ARG(scanner); 
     897    PJ_THROW(PJ_EINVAL); 
     898} 
     899 
     900static pj_status_t get_last_token(pj_str_t *cmd, pj_str_t *str) 
     901{ 
     902    pj_scanner scanner; 
     903    PJ_USE_EXCEPTION; 
     904    pj_scan_init(&scanner, cmd->ptr, cmd->slen, PJ_SCAN_AUTOSKIP_WS,  
     905                 &on_syntax_error); 
     906    PJ_TRY { 
     907        while (!pj_scan_is_eof(&scanner)) { 
     908            pj_scan_get_until_chr(&scanner, " \t\r\n", str); 
     909        } 
     910    } 
     911    PJ_CATCH_ANY { 
     912        pj_scan_fini(&scanner);  
     913        return PJ_GET_EXCEPTION(); 
     914    } 
     915    PJ_END; 
     916    return PJ_SUCCESS; 
     917} 
     918 
    891919static pj_bool_t handle_tab(cli_telnet_sess *sess) 
    892920{ 
     
    930958        if (info.hint_cnt > 0) {         
    931959            /* Complete command */ 
    932             send_comp_arg(sess, &info); 
    933  
    934             pj_memcpy(&sess->rcmd->rbuf[len],  
    935                       &info.hint[0].name.ptr[0], info.hint[0].name.slen); 
    936  
    937             len += info.hint[0].name.slen; 
    938             sess->rcmd->rbuf[len] = 0;               
     960            pj_str_t cmd = pj_str((char *)&sess->rcmd->rbuf[0]); 
     961            pj_str_t last_token; 
     962 
     963            if (get_last_token(&cmd, &last_token) == PJ_SUCCESS) { 
     964                pj_str_t *hint_info = &info.hint[0].name; 
     965                pj_strtrim(&last_token); 
     966                if (hint_info->slen > last_token.slen) { 
     967                    hint_info->slen -= last_token.slen; 
     968                    pj_memmove(&hint_info->ptr[0], &hint_info->ptr[last_token.slen],  
     969                               hint_info->slen);                     
     970                }  
     971                send_comp_arg(sess, &info); 
     972 
     973                pj_memcpy(&sess->rcmd->rbuf[len], &info.hint[0].name.ptr[0],  
     974                          info.hint[0].name.slen); 
     975 
     976                len += info.hint[0].name.slen; 
     977                sess->rcmd->rbuf[len] = 0;                   
     978            } 
    939979        } else { 
    940980            retval = PJ_FALSE; 
Note: See TracChangeset for help on using the changeset viewer.