Ignore:
File:
1 edited

Legend:

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

    ra33706e r0845589  
    6363static bool should_quit = false;
    6464static bool dash_represents_stdin = false;
     65static unsigned int lineno = 0;
     66static bool number = false;
     67static bool last_char_was_newline = false;
    6568
    6669static console_ctrl_t *console = NULL;
     
    7578        { "hex", no_argument, 0, 'x' },
    7679        { "stdin", no_argument, 0, 's' },
     80        { "number", no_argument, 0, 'n' },
    7781        { 0, 0, 0, 0 }
    7882};
     
    9599                "  -m, --more       Pause after each screen full\n"
    96100                "  -x, --hex        Print bytes as hex values\n"
    97                 "  -s  --stdin      Treat `-' in file list as standard input\n"
     101                "  -s, --stdin      Treat `-' in file list as standard input\n"
     102                "  -n, --number     Number all output lines\n"
    98103                "Currently, %s is under development, some options don't work.\n",
    99104                cmdname, cmdname);
     
    117122static void waitkey()
    118123{
    119         kbd_event_t ev;
     124        cons_event_t ev;
     125        kbd_event_t *kev;
    120126       
    121127        while (true) {
    122                 if (!console_get_kbd_event(console, &ev)) {
     128                if (!console_get_event(console, &ev)) {
    123129                        return;
    124130                }
    125                 if (ev.type == KEY_PRESS) {
    126                         if (ev.key == KC_ESCAPE || ev.key == KC_Q) {
     131                if (ev.type == CEV_KEY && ev.ev.key.type == KEY_PRESS) {
     132                        kev = &ev.ev.key;
     133                       
     134                        if (kev->key == KC_ESCAPE || kev->key == KC_Q) {
    127135                                should_quit = true;
    128136                                return;
    129137                        }
    130                         if (ev.key == KC_C) {
     138                        if (kev->key == KC_C) {
    131139                                paging_enabled = false;
    132140                                return;
    133141                        }
    134                         if (ev.key == KC_ENTER || ev.key == KC_SPACE ||
    135                             ev.key == KC_PAGE_DOWN) {
     142                        if (kev->key == KC_ENTER || kev->key == KC_SPACE ||
     143                            kev->key == KC_PAGE_DOWN) {
    136144                                return;
    137145                        }
     
    150158static void paged_char(wchar_t c)
    151159{
     160        if (last_char_was_newline && number) {
     161                lineno++;
     162                printf("%6u  ", lineno);
     163        }
    152164        putchar(c);
     165        last_char_was_newline = c == '\n';
    153166        if (paging_enabled) {
    154167                chars_remaining--;
     
    176189
    177190        bool reading_stdin = dash_represents_stdin && (str_cmp(fname, "-") == 0);
    178 
     191       
    179192        if (reading_stdin) {
    180193                fd = fileno(stdin);
    181194                /* Allow storing the whole UTF-8 character. */
    182195                blen = STR_BOUNDS(1);
    183         } else {
     196        } else
    184197                fd = open(fname, O_RDONLY);
    185         }
     198       
    186199        if (fd < 0) {
    187200                printf("Unable to open %s\n", fname);
     
    222235                        bytes_to_read = 1;
    223236                } else {
    224                         if ((length != CAT_FULL_FILE)
    225                             && (length - (off64_t)count <= (off64_t)(blen - copied_bytes))) {
     237                        if ((length != CAT_FULL_FILE) &&
     238                            (length - (off64_t)count <= (off64_t)(blen - copied_bytes))) {
    226239                                bytes_to_read = (size_t) (length - count);
    227240                        } else {
     
    229242                        }
    230243                }
     244               
    231245                bytes = read(fd, buff + copied_bytes, bytes_to_read);
    232246                bytes += copied_bytes;
     
    261275                        reads++;
    262276                }
    263 
    264                 if (reading_stdin) {
     277               
     278                if (reading_stdin)
    265279                        fflush(stdout);
    266                 }
    267280        } while (bytes > 0 && !should_quit && (count < length || length == CAT_FULL_FILE));
    268281
     
    303316        should_quit = false;
    304317        console = console_init(stdin, stdout);
     318        number = false;
     319        lineno = 0;
     320        /* This enables printing of the first number. */
     321        last_char_was_newline = true;
     322
    305323
    306324        argc = cli_count_args(argv);
    307325
    308326        for (c = 0, optind = 0, opt_ind = 0; c != -1;) {
    309                 c = getopt_long(argc, argv, "xhvmH:t:b:s", long_options, &opt_ind);
     327                c = getopt_long(argc, argv, "xhvmH:t:b:s:n", long_options, &opt_ind);
    310328                switch (c) {
    311329                case 'h':
     
    344362                        dash_represents_stdin = true;
    345363                        break;
     364                case 'n':
     365                        number = true;
     366                        break;
    346367                }
    347368        }
Note: See TracChangeset for help on using the changeset viewer.