]>
Commit | Line | Data |
---|---|---|
db1771cf | 1 | /* cat.c - command to show the contents of a file */ |
2 | /* | |
4b13b216 | 3 | * GRUB -- GRand Unified Bootloader |
da9a6a94 | 4 | * Copyright (C) 2003,2005,2007,2008 Free Software Foundation, Inc. |
db1771cf | 5 | * |
5a79f472 | 6 | * GRUB is free software: you can redistribute it and/or modify |
db1771cf | 7 | * it under the terms of the GNU General Public License as published by |
5a79f472 | 8 | * the Free Software Foundation, either version 3 of the License, or |
db1771cf | 9 | * (at your option) any later version. |
10 | * | |
5a79f472 | 11 | * GRUB is distributed in the hope that it will be useful, |
db1771cf | 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 | |
5a79f472 | 17 | * along with GRUB. If not, see <http://www.gnu.org/licenses/>. |
db1771cf | 18 | */ |
19 | ||
4b13b216 | 20 | #include <grub/dl.h> |
4b13b216 | 21 | #include <grub/file.h> |
22 | #include <grub/disk.h> | |
23 | #include <grub/term.h> | |
24 | #include <grub/misc.h> | |
bbe34652 | 25 | #include <grub/extcmd.h> |
77a79592 | 26 | #include <grub/i18n.h> |
16f7c8f6 | 27 | #include <grub/charset.h> |
db1771cf | 28 | |
e745cf0c VS |
29 | GRUB_MOD_LICENSE ("GPLv3+"); |
30 | ||
bbe34652 CW |
31 | static 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 | }; | |
db1771cf | 36 | |
bbe34652 | 37 | static grub_err_t |
d18b05c4 | 38 | grub_cmd_cat (grub_extcmd_context_t ctxt, int argc, char **args) |
db1771cf | 39 | { |
d18b05c4 | 40 | struct grub_arg_list *state = ctxt->state; |
bbe34652 | 41 | int dos = 0; |
4b13b216 | 42 | grub_file_t file; |
16f7c8f6 | 43 | unsigned char buf[GRUB_DISK_SECTOR_SIZE]; |
4b13b216 | 44 | grub_ssize_t size; |
a8f16eab | 45 | int key = GRUB_TERM_NO_KEY; |
16f7c8f6 VS |
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; | |
db1771cf | 52 | |
bbe34652 CW |
53 | if (state[0].set) |
54 | dos = 1; | |
55 | ||
db1771cf | 56 | if (argc != 1) |
9c4b5c13 | 57 | return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("filename expected")); |
db1771cf | 58 | |
ca0a4f68 | 59 | file = grub_file_open (args[0], GRUB_FILE_TYPE_CAT); |
db1771cf | 60 | if (! file) |
5382b1e4 | 61 | return grub_errno; |
b39f9d20 | 62 | |
b7c6bed5 | 63 | while ((size = grub_file_read (file, buf, sizeof (buf))) > 0 |
64 | && key != GRUB_TERM_ESC) | |
db1771cf | 65 | { |
66 | int i; | |
b39f9d20 | 67 | |
db1771cf | 68 | for (i = 0; i < size; i++) |
69 | { | |
16f7c8f6 | 70 | utbuf[utcount++] = buf[i]; |
b39f9d20 | 71 | |
16f7c8f6 | 72 | if (is_0d && buf[i] != '\n') |
bbe34652 | 73 | { |
16f7c8f6 VS |
74 | grub_setcolorstate (GRUB_TERM_COLOR_HIGHLIGHT); |
75 | grub_printf ("<%x>", (int) '\r'); | |
76 | grub_setcolorstate (GRUB_TERM_COLOR_STANDARD); | |
bbe34652 | 77 | } |
16f7c8f6 VS |
78 | |
79 | is_0d = 0; | |
80 | ||
81 | if (!grub_utf8_process (buf[i], &code, &count)) | |
db1771cf | 82 | { |
4b13b216 | 83 | grub_setcolorstate (GRUB_TERM_COLOR_HIGHLIGHT); |
16f7c8f6 VS |
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 | } | |
4b13b216 | 97 | grub_setcolorstate (GRUB_TERM_COLOR_STANDARD); |
16f7c8f6 | 98 | utcount = 1; |
db1771cf | 99 | } |
16f7c8f6 VS |
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; | |
db1771cf | 129 | } |
b7202015 | 130 | |
1a1ac4f6 VS |
131 | do |
132 | key = grub_getkey_noblock (); | |
133 | while (key != GRUB_TERM_ESC && key != GRUB_TERM_NO_KEY); | |
db1771cf | 134 | } |
135 | ||
16f7c8f6 VS |
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 | ||
8c26dace VS |
143 | if (utcount) |
144 | { | |
145 | grub_setcolorstate (GRUB_TERM_COLOR_HIGHLIGHT); | |
146 | for (j = 0; j < utcount; j++) | |
147 | grub_printf ("<%x>", (unsigned int) utbuf[j]); | |
148 | grub_setcolorstate (GRUB_TERM_COLOR_STANDARD); | |
149 | } | |
16f7c8f6 | 150 | |
dfed5c6b | 151 | grub_xputs ("\n"); |
4b13b216 | 152 | grub_refresh (); |
153 | grub_file_close (file); | |
b39f9d20 | 154 | |
db1771cf | 155 | return 0; |
156 | } | |
157 | ||
bbe34652 | 158 | static grub_extcmd_t cmd; |
db1771cf | 159 | \f |
6d099807 | 160 | GRUB_MOD_INIT(cat) |
db1771cf | 161 | { |
ed80f7d5 | 162 | cmd = grub_register_extcmd ("cat", grub_cmd_cat, 0, |
bbe34652 CW |
163 | N_("FILE"), N_("Show the contents of a file."), |
164 | options); | |
db1771cf | 165 | } |
166 | ||
6d099807 | 167 | GRUB_MOD_FINI(cat) |
db1771cf | 168 | { |
bbe34652 | 169 | grub_unregister_extcmd (cmd); |
db1771cf | 170 | } |