Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/app/bdsh/input.c

    rb9ae539 r36ab7c7  
    11/*
    22 * Copyright (c) 2008 Tim Post
    3  * Copyright (c) 2011 Jiri Svoboda
    4  * Copyright (c) 2011 Martin Sucha
    53 * All rights reserved.
    64 *
     
    4543
    4644#include "config.h"
    47 #include "compl.h"
    4845#include "util.h"
    4946#include "scli.h"
     
    6865{
    6966        char *cmd[WORD_MAX];
    70         token_t *tokens = calloc(WORD_MAX, sizeof(token_t));
    71         if (tokens == NULL)
    72                 return ENOMEM;
    7367        int rc = 0;
    7468        tokenizer_t tok;
    75         unsigned int i, pipe_count, processed_pipes;
    76         unsigned int pipe_pos[2];
     69        int i, pipe_count, processed_pipes;
     70        int pipe_pos[2];
     71        char **actual_cmd;
    7772        char *redir_from = NULL;
    7873        char *redir_to = NULL;
    7974
    80         if (NULL == usr->line) {
    81                 free(tokens);
     75        if (NULL == usr->line)
    8276                return CL_EFAIL;
    83         }
    84 
    85         rc = tok_init(&tok, usr->line, tokens, WORD_MAX);
     77
     78        rc = tok_init(&tok, usr->line, cmd, WORD_MAX);
    8679        if (rc != EOK) {
    8780                goto finit;
    8881        }
    8982       
    90         size_t tokens_length;
    91         rc = tok_tokenize(&tok, &tokens_length);
     83        rc = tok_tokenize(&tok);
    9284        if (rc != EOK) {
    9385                goto finit;
    94         }
    95        
    96         if (tokens_length > 0 && tokens[0].type == TOKTYPE_SPACE) {
    97                 tokens++;
    98                 tokens_length--;
    99         }
    100        
    101         if (tokens_length > 0 && tokens[tokens_length-1].type == TOKTYPE_SPACE) {
    102                 tokens_length--;
    10386        }
    10487       
     
    10891         * First find the pipes and check that there are no more
    10992         */
    110         for (i = 0, pipe_count = 0; i < tokens_length; i++) {
    111                 if (tokens[i].type == TOKTYPE_PIPE) {
     93        int cmd_length = 0;
     94        for (i = 0, pipe_count = 0; cmd[i] != NULL; i++, cmd_length++) {
     95                if (cmd[i][0] == '|') {
    11296                        if (pipe_count >= 2) {
    11397                                print_pipe_usage();
     
    120104        }
    121105       
    122         unsigned int cmd_token_start = 0;
    123         unsigned int cmd_token_end = tokens_length;
    124        
     106        actual_cmd = cmd;
    125107        processed_pipes = 0;
    126108       
    127109        /* Check if the first part (from <file> |) is present */
    128         if (pipe_count > 0 && (pipe_pos[0] == 3 || pipe_pos[0] == 4) && str_cmp(tokens[0].text, "from") == 0) {
     110        if (pipe_count > 0 && pipe_pos[0] == 2 && str_cmp(cmd[0], "from") == 0) {
    129111                /* Ignore the first three tokens (from, file, pipe) and set from */
    130                 redir_from = tokens[2].text;
    131                 cmd_token_start = pipe_pos[0]+1;
     112                redir_from = cmd[1];
     113                actual_cmd = cmd + 3;
    132114                processed_pipes++;
    133115        }
     
    135117        /* Check if the second part (| to <file>) is present */
    136118        if ((pipe_count - processed_pipes) > 0 &&
    137             (pipe_pos[processed_pipes] == tokens_length - 4 ||
    138             (pipe_pos[processed_pipes] == tokens_length - 5 &&
    139             tokens[tokens_length-4].type == TOKTYPE_SPACE )) &&
    140             str_cmp(tokens[tokens_length-3].text, "to") == 0) {
     119            pipe_pos[processed_pipes] == cmd_length - 3 &&
     120            str_cmp(cmd[cmd_length-2], "to") == 0) {
    141121                /* Ignore the last three tokens (pipe, to, file) and set to */
    142                 redir_to = tokens[tokens_length-1].text;
    143                 cmd_token_end = pipe_pos[processed_pipes];
     122                redir_to = cmd[cmd_length-1];
     123                cmd[cmd_length-3] = NULL;
     124                cmd_length -= 3;
    144125                processed_pipes++;
    145126        }
     
    151132        }
    152133       
    153         /* Convert tokens of the command to string array */
    154         unsigned int cmd_pos = 0;
    155         for (i = cmd_token_start; i < cmd_token_end; i++) {
    156                 if (tokens[i].type != TOKTYPE_SPACE) {
    157                         cmd[cmd_pos++] = tokens[i].text;
    158                 }
    159         }
    160         cmd[cmd_pos++] = NULL;
    161        
    162         if (cmd[0] == NULL) {
     134        if (actual_cmd[0] == NULL) {
    163135                print_pipe_usage();
    164136                rc = ENOTSUP;
     
    212184        }
    213185        tok_fini(&tok);
    214         free(tokens);
    215186
    216187        return rc;
     
    255226        int rc;
    256227       
    257         tinput_set_prompt(tinput, usr->prompt);
     228        console_flush(tinput->console);
     229        console_set_style(tinput->console, STYLE_EMPHASIS);
     230        printf("%s", usr->prompt);
     231        console_flush(tinput->console);
     232        console_set_style(tinput->console, STYLE_NORMAL);
    258233
    259234        rc = tinput_read(tinput, &str);
     
    288263        }
    289264
    290         tinput_set_compl_ops(tinput, &compl_ops);
    291 
    292265        return 0;
    293266}
Note: See TracChangeset for help on using the changeset viewer.