Ignore:
File:
1 edited

Legend:

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

    r36ab7c7 rb9ae539  
    11/*
    22 * Copyright (c) 2008 Tim Post
     3 * Copyright (c) 2011 Jiri Svoboda
     4 * Copyright (c) 2011 Martin Sucha
    35 * All rights reserved.
    46 *
     
    4345
    4446#include "config.h"
     47#include "compl.h"
    4548#include "util.h"
    4649#include "scli.h"
     
    6568{
    6669        char *cmd[WORD_MAX];
     70        token_t *tokens = calloc(WORD_MAX, sizeof(token_t));
     71        if (tokens == NULL)
     72                return ENOMEM;
    6773        int rc = 0;
    6874        tokenizer_t tok;
    69         int i, pipe_count, processed_pipes;
    70         int pipe_pos[2];
    71         char **actual_cmd;
     75        unsigned int i, pipe_count, processed_pipes;
     76        unsigned int pipe_pos[2];
    7277        char *redir_from = NULL;
    7378        char *redir_to = NULL;
    7479
    75         if (NULL == usr->line)
     80        if (NULL == usr->line) {
     81                free(tokens);
    7682                return CL_EFAIL;
    77 
    78         rc = tok_init(&tok, usr->line, cmd, WORD_MAX);
     83        }
     84
     85        rc = tok_init(&tok, usr->line, tokens, WORD_MAX);
    7986        if (rc != EOK) {
    8087                goto finit;
    8188        }
    8289       
    83         rc = tok_tokenize(&tok);
     90        size_t tokens_length;
     91        rc = tok_tokenize(&tok, &tokens_length);
    8492        if (rc != EOK) {
    8593                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--;
    86103        }
    87104       
     
    91108         * First find the pipes and check that there are no more
    92109         */
    93         int cmd_length = 0;
    94         for (i = 0, pipe_count = 0; cmd[i] != NULL; i++, cmd_length++) {
    95                 if (cmd[i][0] == '|') {
     110        for (i = 0, pipe_count = 0; i < tokens_length; i++) {
     111                if (tokens[i].type == TOKTYPE_PIPE) {
    96112                        if (pipe_count >= 2) {
    97113                                print_pipe_usage();
     
    104120        }
    105121       
    106         actual_cmd = cmd;
     122        unsigned int cmd_token_start = 0;
     123        unsigned int cmd_token_end = tokens_length;
     124       
    107125        processed_pipes = 0;
    108126       
    109127        /* Check if the first part (from <file> |) is present */
    110         if (pipe_count > 0 && pipe_pos[0] == 2 && str_cmp(cmd[0], "from") == 0) {
     128        if (pipe_count > 0 && (pipe_pos[0] == 3 || pipe_pos[0] == 4) && str_cmp(tokens[0].text, "from") == 0) {
    111129                /* Ignore the first three tokens (from, file, pipe) and set from */
    112                 redir_from = cmd[1];
    113                 actual_cmd = cmd + 3;
     130                redir_from = tokens[2].text;
     131                cmd_token_start = pipe_pos[0]+1;
    114132                processed_pipes++;
    115133        }
     
    117135        /* Check if the second part (| to <file>) is present */
    118136        if ((pipe_count - processed_pipes) > 0 &&
    119             pipe_pos[processed_pipes] == cmd_length - 3 &&
    120             str_cmp(cmd[cmd_length-2], "to") == 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) {
    121141                /* Ignore the last three tokens (pipe, to, file) and set to */
    122                 redir_to = cmd[cmd_length-1];
    123                 cmd[cmd_length-3] = NULL;
    124                 cmd_length -= 3;
     142                redir_to = tokens[tokens_length-1].text;
     143                cmd_token_end = pipe_pos[processed_pipes];
    125144                processed_pipes++;
    126145        }
     
    132151        }
    133152       
    134         if (actual_cmd[0] == NULL) {
     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) {
    135163                print_pipe_usage();
    136164                rc = ENOTSUP;
     
    184212        }
    185213        tok_fini(&tok);
     214        free(tokens);
    186215
    187216        return rc;
     
    226255        int rc;
    227256       
    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);
     257        tinput_set_prompt(tinput, usr->prompt);
    233258
    234259        rc = tinput_read(tinput, &str);
     
    263288        }
    264289
     290        tinput_set_compl_ops(tinput, &compl_ops);
     291
    265292        return 0;
    266293}
Note: See TracChangeset for help on using the changeset viewer.