source: grub-pc/trunk/fuentes/grub-core/commands/cat.c @ 22

Last change on this file since 22 was 22, checked in by mabarracus, 4 years ago

updated version and apply net.ifnames=0 into debian/rules

File size: 4.0 KB
Line 
1/* cat.c - command to show the contents of a file  */
2/*
3 *  GRUB  --  GRand Unified Bootloader
4 *  Copyright (C) 2003,2005,2007,2008  Free Software Foundation, Inc.
5 *
6 *  GRUB is free software: you can redistribute it and/or modify
7 *  it under the terms of the GNU General Public License as published by
8 *  the Free Software Foundation, either version 3 of the License, or
9 *  (at your option) any later version.
10 *
11 *  GRUB is distributed in the hope that it will be useful,
12 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
13 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 *  GNU General Public License for more details.
15 *
16 *  You should have received a copy of the GNU General Public License
17 *  along with GRUB.  If not, see <http://www.gnu.org/licenses/>.
18 */
19
20#include <grub/dl.h>
21#include <grub/file.h>
22#include <grub/disk.h>
23#include <grub/term.h>
24#include <grub/misc.h>
25#include <grub/extcmd.h>
26#include <grub/i18n.h>
27#include <grub/charset.h>
28
29GRUB_MOD_LICENSE ("GPLv3+");
30
31static const struct grub_arg_option options[] =
32  {
33    {"dos", -1, 0, N_("Accept DOS-style CR/NL line endings."), 0, 0},
34    {0, 0, 0, 0, 0, 0}
35  };
36
37static grub_err_t
38grub_cmd_cat (grub_extcmd_context_t ctxt, int argc, char **args)
39{
40  struct grub_arg_list *state = ctxt->state;
41  int dos = 0;
42  grub_file_t file;
43  unsigned char buf[GRUB_DISK_SECTOR_SIZE];
44  grub_ssize_t size;
45  int key = GRUB_TERM_NO_KEY;
46  grub_uint32_t code = 0;
47  int count = 0;
48  unsigned char utbuf[GRUB_MAX_UTF8_PER_CODEPOINT + 1];
49  int utcount = 0;
50  int is_0d = 0;
51  int j;
52
53  if (state[0].set)
54    dos = 1;
55
56  if (argc != 1)
57    return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("filename expected"));
58
59  file = grub_file_open (args[0]);
60  if (! file)
61    return grub_errno;
62
63  while ((size = grub_file_read (file, buf, sizeof (buf))) > 0
64         && key != GRUB_TERM_ESC)
65    {
66      int i;
67
68      for (i = 0; i < size; i++)
69        {
70          utbuf[utcount++] = buf[i];
71
72          if (is_0d && buf[i] != '\n')
73            {
74              grub_setcolorstate (GRUB_TERM_COLOR_HIGHLIGHT);
75              grub_printf ("<%x>", (int) '\r');
76              grub_setcolorstate (GRUB_TERM_COLOR_STANDARD);
77            }
78
79          is_0d = 0;
80
81          if (!grub_utf8_process (buf[i], &code, &count))
82            {
83              grub_setcolorstate (GRUB_TERM_COLOR_HIGHLIGHT);
84              for (j = 0; j < utcount - 1; j++)
85                grub_printf ("<%x>", (unsigned int) utbuf[j]);
86              code = 0;
87              count = 0;
88              if (utcount == 1 || !grub_utf8_process (buf[i], &code, &count))
89                {
90                  grub_printf ("<%x>", (unsigned int) buf[i]);
91                  code = 0;
92                  count = 0;
93                  utcount = 0;
94                  grub_setcolorstate (GRUB_TERM_COLOR_STANDARD);
95                  continue;
96                }
97              grub_setcolorstate (GRUB_TERM_COLOR_STANDARD);
98              utcount = 1;
99            }
100          if (count)
101            continue;
102
103          if ((code >= 0xa1 || grub_isprint (code)
104               || grub_isspace (code)) && code != '\r')
105            {
106              grub_printf ("%C", code);
107              count = 0; 
108              code = 0;
109              utcount = 0;
110              continue;
111            }
112
113          if (dos && code == '\r')
114            {
115              is_0d = 1;
116              count = 0; 
117              code = 0;
118              utcount = 0;
119              continue;
120            }
121
122          grub_setcolorstate (GRUB_TERM_COLOR_HIGHLIGHT);
123          for (j = 0; j < utcount; j++)
124            grub_printf ("<%x>", (unsigned int) utbuf[j]);
125          grub_setcolorstate (GRUB_TERM_COLOR_STANDARD);
126          count = 0; 
127          code = 0;
128          utcount = 0;
129        }
130
131      do
132        key = grub_getkey_noblock ();
133      while (key != GRUB_TERM_ESC && key != GRUB_TERM_NO_KEY);
134    }
135
136  if (is_0d)
137    {
138      grub_setcolorstate (GRUB_TERM_COLOR_HIGHLIGHT);
139      grub_printf ("<%x>", (unsigned int) '\r');
140      grub_setcolorstate (GRUB_TERM_COLOR_STANDARD);
141    }
142
143  grub_setcolorstate (GRUB_TERM_COLOR_HIGHLIGHT);
144  for (j = 0; j < utcount; j++)
145    grub_printf ("<%x>", (unsigned int) utbuf[j]);
146  grub_setcolorstate (GRUB_TERM_COLOR_STANDARD);
147
148  grub_xputs ("\n");
149  grub_refresh ();
150  grub_file_close (file);
151
152  return 0;
153}
154
155static grub_extcmd_t cmd;
156
157GRUB_MOD_INIT(cat)
158{
159  cmd = grub_register_extcmd ("cat", grub_cmd_cat, 0,
160                              N_("FILE"), N_("Show the contents of a file."),
161                              options);
162}
163
164GRUB_MOD_FINI(cat)
165{
166  grub_unregister_extcmd (cmd);
167}
Note: See TracBrowser for help on using the repository browser.