Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/app/bdsh/cmds/modules/cat/cat.c

    r28a3e74 rafe1d1e  
    11/* Copyright (c) 2008, Tim Post <tinkertim@gmail.com>
    2  * Copyright (c) 2011, Martin Sucha
    32 * All rights reserved.
    43 *
     
    3635#include <str.h>
    3736#include <fcntl.h>
    38 #include <io/console.h>
    39 #include <io/color.h>
    40 #include <io/style.h>
    41 #include <io/keycode.h>
    42 #include <errno.h>
    43 #include <vfs/vfs.h>
    44 #include <assert.h>
    4537
    4638#include "config.h"
     
    5648
    5749static const char *cat_oops = "That option is not yet supported\n";
    58 static const char *hexchars = "0123456789abcdef";
    59 
    60 static bool paging_enabled = false;
    61 static size_t chars_remaining = 0;
    62 static size_t lines_remaining = 0;
    63 static sysarg_t console_cols = 0;
    64 static sysarg_t console_rows = 0;
    65 static bool should_quit = false;
    6650
    6751static struct option const long_options[] = {
     
    7256        { "buffer", required_argument, 0, 'b' },
    7357        { "more", no_argument, 0, 'm' },
    74         { "hex", no_argument, 0, 'x' },
    7558        { 0, 0, 0, 0 }
    7659};
     
    9275                "  -b, --buffer ##  Set the read buffer size to ##\n"
    9376                "  -m, --more       Pause after each screen full\n"
    94                 "  -x, --hex        Print bytes as hex values\n"
    9577                "Currently, %s is under development, some options don't work.\n",
    9678                cmdname, cmdname);
     
    10082}
    10183
    102 static void waitprompt()
    103 {
    104         console_set_pos(fphone(stdout), 0, console_rows-1);
    105         console_set_color(fphone(stdout), COLOR_BLUE, COLOR_WHITE, 0);
    106         printf("ENTER/SPACE/PAGE DOWN - next page, "
    107                "ESC/Q - quit, C - continue unpaged");
    108         fflush(stdout);
    109         console_set_style(fphone(stdout), STYLE_NORMAL);
    110 }
    111 
    112 static void waitkey()
    113 {
    114         console_event_t ev;
    115        
    116         while (true) {
    117                 if (!console_get_event(fphone(stdin), &ev)) {
    118                         return;
    119                 }
    120                 if (ev.type == KEY_PRESS) {
    121                         if (ev.key == KC_ESCAPE || ev.key == KC_Q) {
    122                                 should_quit = true;
    123                                 return;
    124                         }
    125                         if (ev.key == KC_C) {
    126                                 paging_enabled = false;
    127                                 return;
    128                         }
    129                         if (ev.key == KC_ENTER || ev.key == KC_SPACE ||
    130                             ev.key == KC_PAGE_DOWN) {
    131                                 return;
    132                         }
    133                 }
    134         }
    135         assert(false);
    136 }
    137 
    138 static void newpage()
    139 {
    140         console_clear(fphone(stdout));
    141         chars_remaining = console_cols;
    142         lines_remaining = console_rows-1;
    143 }
    144 
    145 static void paged_char(wchar_t c)
    146 {
    147         putchar(c);
    148         if (paging_enabled) {
    149                 chars_remaining--;
    150                 if (c == '\n' || chars_remaining == 0) {
    151                         chars_remaining = console_cols;
    152                         lines_remaining--;
    153                 }
    154                 if (lines_remaining == 0) {
    155                         fflush(stdout);
    156                         waitprompt();
    157                         waitkey();
    158                         newpage();
    159                 }
    160         }
    161 }
    162 
    163 static unsigned int cat_file(const char *fname, size_t blen, bool hex)
     84static unsigned int cat_file(const char *fname, size_t blen)
    16485{
    16586        int fd, bytes = 0, count = 0, reads = 0;
     87        off64_t total = 0;
    16688        char *buff = NULL;
    167         int i;
    168         size_t offset = 0;
    16989
    17090        fd = open(fname, O_RDONLY);
     
    17393                return 1;
    17494        }
     95
     96        total = lseek(fd, 0, SEEK_END);
     97        lseek(fd, 0, SEEK_SET);
    17598
    17699        if (NULL == (buff = (char *) malloc(blen + 1))) {
     
    186109                        count += bytes;
    187110                        buff[bytes] = '\0';
    188                         offset = 0;
    189                         for (i = 0; i < bytes && !should_quit; i++) {
    190                                 if (hex) {
    191                                         paged_char(hexchars[((uint8_t)buff[i])/16]);
    192                                         paged_char(hexchars[((uint8_t)buff[i])%16]);
    193                                 }
    194                                 else {
    195                                         wchar_t c = str_decode(buff, &offset, bytes);
    196                                         if (c == 0) {
    197                                                 /* Reached end of string */
    198                                                 break;
    199                                         }
    200                                         paged_char(c);
    201                                 }
    202                                
    203                         }
     111                        printf("%s", buff);
    204112                        reads++;
    205113                }
    206         } while (bytes > 0 && !should_quit);
     114        } while (bytes > 0);
    207115
    208116        close(fd);
     
    223131        unsigned int argc, i, ret = 0, buffer = 0;
    224132        int c, opt_ind;
    225         bool hex = false;
    226         bool more = false;
    227         sysarg_t rows, cols;
    228         int rc;
    229        
    230         /*
    231          * reset global state
    232          * TODO: move to structure?
    233          */
    234         paging_enabled = false;
    235         chars_remaining = 0;
    236         lines_remaining = 0;
    237         console_cols = 0;
    238         console_rows = 0;
    239         should_quit = false;
    240133
    241134        argc = cli_count_args(argv);
    242135
    243136        for (c = 0, optind = 0, opt_ind = 0; c != -1;) {
    244                 c = getopt_long(argc, argv, "xhvmH:t:b:", long_options, &opt_ind);
     137                c = getopt_long(argc, argv, "hvmH:t:b:", long_options, &opt_ind);
    245138                switch (c) {
    246139                case 'h':
     
    260153                        break;
    261154                case 'm':
    262                         more = true;
    263                         break;
    264                 case 'x':
    265                         hex = true;
    266                         break;
     155                        printf("%s", cat_oops);
     156                        return CMD_FAILURE;
    267157                }
    268158        }
     
    278168        if (buffer <= 0)
    279169                buffer = CAT_DEFAULT_BUFLEN;
    280        
    281         if (more) {
    282                 rc = console_get_size(fphone(stdout), &cols, &rows);
    283                 if (rc != EOK) {
    284                         printf("%s - cannot get console size\n", cmdname);
    285                         return CMD_FAILURE;
    286                 }
    287                 console_cols = cols;
    288                 console_rows = rows;
    289                 paging_enabled = true;
    290                 newpage();
    291         }
    292170
    293         for (i = optind; argv[i] != NULL && !should_quit; i++)
    294                 ret += cat_file(argv[i], buffer, hex);
     171        for (i = optind; argv[i] != NULL; i++)
     172                ret += cat_file(argv[i], buffer);
    295173
    296174        if (ret)
Note: See TracChangeset for help on using the changeset viewer.