blob: f33b2b9352189a3cbb7bad692d3fe0929d490826 [file] [log] [blame]
Jari Aalto726f6381996-08-26 18:22:31 +00001This file is help.def, from which is created help.c.
2It implements the builtin "help" in Bash.
3
Chet Ramey8868eda2020-12-06 15:51:17 -05004Copyright (C) 1987-2020 Free Software Foundation, Inc.
Jari Aalto726f6381996-08-26 18:22:31 +00005
6This file is part of GNU Bash, the Bourne Again SHell.
7
Jari Aalto31859422009-01-12 13:36:28 +00008Bash is free software: you can redistribute it and/or modify
9it under the terms of the GNU General Public License as published by
10the Free Software Foundation, either version 3 of the License, or
11(at your option) any later version.
Jari Aalto726f6381996-08-26 18:22:31 +000012
Jari Aalto31859422009-01-12 13:36:28 +000013Bash is distributed in the hope that it will be useful,
14but WITHOUT ANY WARRANTY; without even the implied warranty of
15MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16GNU General Public License for more details.
Jari Aalto726f6381996-08-26 18:22:31 +000017
Jari Aalto31859422009-01-12 13:36:28 +000018You should have received a copy of the GNU General Public License
19along with Bash. If not, see <http://www.gnu.org/licenses/>.
Jari Aalto726f6381996-08-26 18:22:31 +000020
21$PRODUCES help.c
22
23$BUILTIN help
24$FUNCTION help_builtin
Jari Aaltoccc6cda1996-12-23 17:02:34 +000025$DEPENDS_ON HELP_BUILTIN
Chet Ramey00018032011-11-21 20:51:19 -050026$SHORT_DOC help [-dms] [pattern ...]
Jari Aalto31859422009-01-12 13:36:28 +000027Display information about builtin commands.
28
29Displays brief summaries of builtin commands. If PATTERN is
Jari Aalto726f6381996-08-26 18:22:31 +000030specified, gives detailed help on all commands matching PATTERN,
Jari Aalto31859422009-01-12 13:36:28 +000031otherwise the list of help topics is printed.
32
33Options:
34 -d output short description for each topic
35 -m display usage in pseudo-manpage format
36 -s output only a short usage synopsis for each topic matching
Chet Rameya0c0a002016-09-15 16:59:08 -040037 PATTERN
Jari Aalto31859422009-01-12 13:36:28 +000038
39Arguments:
Chet Rameyd233b482019-01-07 09:27:52 -050040 PATTERN Pattern specifying a help topic
Jari Aalto31859422009-01-12 13:36:28 +000041
42Exit Status:
43Returns success unless PATTERN is not found or an invalid option is given.
Jari Aalto726f6381996-08-26 18:22:31 +000044$END
45
Jari Aaltoccc6cda1996-12-23 17:02:34 +000046#include <config.h>
47
48#if defined (HELP_BUILTIN)
Jari Aalto726f6381996-08-26 18:22:31 +000049#include <stdio.h>
Jari Aaltoccc6cda1996-12-23 17:02:34 +000050
51#if defined (HAVE_UNISTD_H)
Jari Aaltocce855b1998-04-17 19:52:44 +000052# ifdef _MINIX
53# include <sys/types.h>
54# endif
Jari Aaltoccc6cda1996-12-23 17:02:34 +000055# include <unistd.h>
56#endif
57
Jari Aalto7117c2d2002-07-17 14:10:11 +000058#include <errno.h>
59
60#include <filecntl.h>
Chet Rameya0c0a002016-09-15 16:59:08 -040061#include <stddef.h>
Jari Aalto7117c2d2002-07-17 14:10:11 +000062
Jari Aaltob80f6442004-07-27 13:29:18 +000063#include "../bashintl.h"
64
Jari Aalto726f6381996-08-26 18:22:31 +000065#include "../shell.h"
66#include "../builtins.h"
Chet Rameyd233b482019-01-07 09:27:52 -050067#include "../execute_cmd.h"
Jari Aaltocce855b1998-04-17 19:52:44 +000068#include "../pathexp.h"
Jari Aaltof73dda02001-11-13 17:56:06 +000069#include "common.h"
Jari Aaltoccc6cda1996-12-23 17:02:34 +000070#include "bashgetopt.h"
Jari Aalto726f6381996-08-26 18:22:31 +000071
Jari Aaltof73dda02001-11-13 17:56:06 +000072#include <glob/strmatch.h>
Jari Aaltoccc6cda1996-12-23 17:02:34 +000073#include <glob/glob.h>
74
Jari Aalto7117c2d2002-07-17 14:10:11 +000075#ifndef errno
76extern int errno;
77#endif
78
Jari Aalto31859422009-01-12 13:36:28 +000079extern const char * const bash_copyright;
80extern const char * const bash_license;
81
Chet Ramey8868eda2020-12-06 15:51:17 -050082static void show_builtin_command_help PARAMS((void));
83static int open_helpfile PARAMS((char *));
84static void show_desc PARAMS((char *, int));
85static void show_manpage PARAMS((char *, int));
86static void show_longdoc PARAMS((int));
Jari Aalto726f6381996-08-26 18:22:31 +000087
88/* Print out a list of the known functions in the shell, and what they do.
89 If LIST is supplied, print out the list which matches for each pattern
90 specified. */
Jari Aaltoccc6cda1996-12-23 17:02:34 +000091int
Jari Aalto726f6381996-08-26 18:22:31 +000092help_builtin (list)
93 WORD_LIST *list;
94{
Jari Aalto7117c2d2002-07-17 14:10:11 +000095 register int i;
Jari Aaltoccc6cda1996-12-23 17:02:34 +000096 char *pattern, *name;
Chet Rameyac50fba2014-02-26 09:36:43 -050097 int plen, match_found, sflag, dflag, mflag, m, pass, this_found;
Jari Aalto726f6381996-08-26 18:22:31 +000098
Jari Aalto31859422009-01-12 13:36:28 +000099 dflag = sflag = mflag = 0;
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000100 reset_internal_getopt ();
Jari Aalto31859422009-01-12 13:36:28 +0000101 while ((i = internal_getopt (list, "dms")) != -1)
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000102 {
103 switch (i)
104 {
Jari Aalto31859422009-01-12 13:36:28 +0000105 case 'd':
106 dflag = 1;
107 break;
108 case 'm':
109 mflag = 1;
110 break;
Jari Aaltobb706242000-03-17 21:46:59 +0000111 case 's':
112 sflag = 1;
113 break;
Chet Rameya0c0a002016-09-15 16:59:08 -0400114 CASE_HELPOPT;
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000115 default:
116 builtin_usage ();
117 return (EX_USAGE);
118 }
119 }
120 list = loptend;
121
Jari Aaltod166f041997-06-05 14:59:13 +0000122 if (list == 0)
123 {
124 show_shell_version (0);
125 show_builtin_command_help ();
126 return (EXECUTION_SUCCESS);
127 }
128
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000129 /* We should consider making `help bash' do something. */
130
Chet Ramey8868eda2020-12-06 15:51:17 -0500131 if (glob_pattern_p (list->word->word) == 1)
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000132 {
Chet Rameyd233b482019-01-07 09:27:52 -0500133 printf ("%s", ngettext ("Shell commands matching keyword `", "Shell commands matching keywords `", (list->next ? 2 : 1)));
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000134 print_word_list (list, ", ");
Chet Ramey8868eda2020-12-06 15:51:17 -0500135 printf ("%s", _("'\n\n"));
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000136 }
137
138 for (match_found = 0, pattern = ""; list; list = list->next)
139 {
140 pattern = list->word->word;
141 plen = strlen (pattern);
142
Chet Rameyac50fba2014-02-26 09:36:43 -0500143 for (pass = 1, this_found = 0; pass < 3; pass++)
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000144 {
Chet Rameyac50fba2014-02-26 09:36:43 -0500145 for (i = 0; name = shell_builtins[i].name; i++)
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000146 {
Chet Rameyac50fba2014-02-26 09:36:43 -0500147 QUIT;
Jari Aalto31859422009-01-12 13:36:28 +0000148
Chet Rameyac50fba2014-02-26 09:36:43 -0500149 /* First pass: look for exact string or pattern matches.
150 Second pass: look for prefix matches like bash-4.2 */
151 if (pass == 1)
152 m = (strcmp (pattern, name) == 0) ||
153 (strmatch (pattern, name, FNMATCH_EXTFLAG) != FNM_NOMATCH);
154 else
155 m = strncmp (pattern, name, plen) == 0;
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000156
Chet Rameyac50fba2014-02-26 09:36:43 -0500157 if (m)
158 {
159 this_found = 1;
160 match_found++;
161 if (dflag)
162 {
163 show_desc (name, i);
164 continue;
165 }
166 else if (mflag)
167 {
168 show_manpage (name, i);
169 continue;
170 }
171
172 printf ("%s: %s\n", name, _(shell_builtins[i].short_doc));
173
174 if (sflag == 0)
175 show_longdoc (i);
176 }
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000177 }
Chet Rameyac50fba2014-02-26 09:36:43 -0500178 if (pass == 1 && this_found == 1)
179 break;
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000180 }
181 }
182
183 if (match_found == 0)
184 {
Jari Aaltob80f6442004-07-27 13:29:18 +0000185 builtin_error (_("no help topics match `%s'. Try `help help' or `man -k %s' or `info %s'."), pattern, pattern, pattern);
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000186 return (EXECUTION_FAILURE);
187 }
188
189 fflush (stdout);
190 return (EXECUTION_SUCCESS);
191}
192
Chet Rameya0c0a002016-09-15 16:59:08 -0400193void
194builtin_help ()
195{
196 int ind;
197 ptrdiff_t d;
198
199 current_builtin = builtin_address_internal (this_command_name, 0);
200 if (current_builtin == 0)
201 return;
202
203 d = current_builtin - shell_builtins;
204
205#if defined (__STDC__)
206 ind = (int)d;
207#else
208 ind = (int)d / sizeof (struct builtin);
209#endif
210
211 printf ("%s: %s\n", this_command_name, _(shell_builtins[ind].short_doc));
212 show_longdoc (ind);
213}
214
Jari Aalto31859422009-01-12 13:36:28 +0000215static int
216open_helpfile (name)
217 char *name;
218{
219 int fd;
220
221 fd = open (name, O_RDONLY);
222 if (fd == -1)
223 {
224 builtin_error (_("%s: cannot open: %s"), name, strerror (errno));
225 return -1;
226 }
227 return fd;
228}
229
Jari Aalto7117c2d2002-07-17 14:10:11 +0000230/* By convention, enforced by mkbuiltins.c, if separate help files are being
231 used, the long_doc array contains one string -- the full pathname of the
232 help file for this builtin. */
233static void
234show_longdoc (i)
235 int i;
236{
237 register int j;
238 char * const *doc;
239 int fd;
240
241 doc = shell_builtins[i].long_doc;
242
243 if (doc && doc[0] && *doc[0] == '/' && doc[1] == (char *)NULL)
244 {
Jari Aalto31859422009-01-12 13:36:28 +0000245 fd = open_helpfile (doc[0]);
246 if (fd < 0)
247 return;
Jari Aalto7117c2d2002-07-17 14:10:11 +0000248 zcatfd (fd, 1, doc[0]);
249 close (fd);
250 }
Chet Rameyac50fba2014-02-26 09:36:43 -0500251 else if (doc)
Jari Aalto7117c2d2002-07-17 14:10:11 +0000252 for (j = 0; doc[j]; j++)
Jari Aalto95732b42005-12-07 14:08:12 +0000253 printf ("%*s%s\n", BASE_INDENT, " ", _(doc[j]));
Jari Aalto7117c2d2002-07-17 14:10:11 +0000254}
255
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000256static void
Jari Aalto31859422009-01-12 13:36:28 +0000257show_desc (name, i)
258 char *name;
259 int i;
260{
Chet Rameyd233b482019-01-07 09:27:52 -0500261 register int j, r;
Jari Aalto31859422009-01-12 13:36:28 +0000262 char **doc, *line;
263 int fd, usefile;
264
265 doc = (char **)shell_builtins[i].long_doc;
266
267 usefile = (doc && doc[0] && *doc[0] == '/' && doc[1] == (char *)NULL);
268 if (usefile)
269 {
270 fd = open_helpfile (doc[0]);
271 if (fd < 0)
272 return;
Chet Rameyd233b482019-01-07 09:27:52 -0500273 r = zmapfd (fd, &line, doc[0]);
Jari Aalto31859422009-01-12 13:36:28 +0000274 close (fd);
Chet Rameyd233b482019-01-07 09:27:52 -0500275 /* XXX - handle errors if zmapfd returns < 0 */
Jari Aalto31859422009-01-12 13:36:28 +0000276 }
277 else
278 line = doc ? doc[0] : (char *)NULL;
279
280 printf ("%s - ", name);
281 for (j = 0; line && line[j]; j++)
282 {
283 putchar (line[j]);
284 if (line[j] == '\n')
285 break;
286 }
287
288 fflush (stdout);
289
290 if (usefile)
291 free (line);
292}
293
294/* Print builtin help in pseudo-manpage format. */
295static void
296show_manpage (name, i)
297 char *name;
298 int i;
299{
300 register int j;
301 char **doc, *line;
302 int fd, usefile;
303
304 doc = (char **)shell_builtins[i].long_doc;
305
306 usefile = (doc && doc[0] && *doc[0] == '/' && doc[1] == (char *)NULL);
307 if (usefile)
308 {
309 fd = open_helpfile (doc[0]);
310 if (fd < 0)
311 return;
312 zmapfd (fd, &line, doc[0]);
313 close (fd);
314 }
315 else
316 line = doc ? _(doc[0]) : (char *)NULL;
317
318 /* NAME */
319 printf ("NAME\n");
320 printf ("%*s%s - ", BASE_INDENT, " ", name);
321 for (j = 0; line && line[j]; j++)
322 {
323 putchar (line[j]);
324 if (line[j] == '\n')
325 break;
326 }
327 printf ("\n");
328
329 /* SYNOPSIS */
330 printf ("SYNOPSIS\n");
Chet Ramey495aee42011-11-22 19:11:26 -0500331 printf ("%*s%s\n\n", BASE_INDENT, " ", _(shell_builtins[i].short_doc));
Jari Aalto31859422009-01-12 13:36:28 +0000332
333 /* DESCRIPTION */
334 printf ("DESCRIPTION\n");
335 if (usefile == 0)
336 {
337 for (j = 0; doc[j]; j++)
338 printf ("%*s%s\n", BASE_INDENT, " ", _(doc[j]));
339 }
340 else
341 {
342 for (j = 0; line && line[j]; j++)
343 {
344 putchar (line[j]);
345 if (line[j] == '\n')
346 printf ("%*s", BASE_INDENT, " ");
347 }
348 }
349 putchar ('\n');
350
351 /* SEE ALSO */
352 printf ("SEE ALSO\n");
353 printf ("%*sbash(1)\n\n", BASE_INDENT, " ");
354
355 /* IMPLEMENTATION */
356 printf ("IMPLEMENTATION\n");
357 printf ("%*s", BASE_INDENT, " ");
358 show_shell_version (0);
359 printf ("%*s", BASE_INDENT, " ");
360 printf ("%s\n", _(bash_copyright));
361 printf ("%*s", BASE_INDENT, " ");
362 printf ("%s\n", _(bash_license));
363
364 fflush (stdout);
365 if (usefile)
366 free (line);
367}
368
369static void
Chet Rameyac50fba2014-02-26 09:36:43 -0500370dispcolumn (i, buf, bufsize, width, height)
371 int i;
372 char *buf;
373 size_t bufsize;
374 int width, height;
375{
376 int j;
Chet Rameya0c0a002016-09-15 16:59:08 -0400377 int dispcols;
Chet Rameyac50fba2014-02-26 09:36:43 -0500378 char *helpdoc;
379
380 /* first column */
381 helpdoc = _(shell_builtins[i].short_doc);
382
383 buf[0] = (shell_builtins[i].flags & BUILTIN_ENABLED) ? ' ' : '*';
384 strncpy (buf + 1, helpdoc, width - 2);
385 buf[width - 2] = '>'; /* indicate truncation */
386 buf[width - 1] = '\0';
387 printf ("%s", buf);
388 if (((i << 1) >= num_shell_builtins) || (i+height >= num_shell_builtins))
389 {
390 printf ("\n");
391 return;
392 }
393
Chet Rameya0c0a002016-09-15 16:59:08 -0400394 dispcols = strlen (buf);
Chet Rameyac50fba2014-02-26 09:36:43 -0500395 /* two spaces */
Chet Rameya0c0a002016-09-15 16:59:08 -0400396 for (j = dispcols; j < width; j++)
Chet Rameyac50fba2014-02-26 09:36:43 -0500397 putc (' ', stdout);
398
399 /* second column */
400 helpdoc = _(shell_builtins[i+height].short_doc);
401
402 buf[0] = (shell_builtins[i+height].flags & BUILTIN_ENABLED) ? ' ' : '*';
403 strncpy (buf + 1, helpdoc, width - 3);
404 buf[width - 3] = '>'; /* indicate truncation */
405 buf[width - 2] = '\0';
406
407 printf ("%s\n", buf);
408}
409
410#if defined (HANDLE_MULTIBYTE)
411static void
412wdispcolumn (i, buf, bufsize, width, height)
413 int i;
414 char *buf;
415 size_t bufsize;
416 int width, height;
417{
418 int j;
Chet Rameya0c0a002016-09-15 16:59:08 -0400419 int dispcols, dispchars;
Chet Rameyac50fba2014-02-26 09:36:43 -0500420 char *helpdoc;
421 wchar_t *wcstr;
422 size_t slen, n;
Chet Rameyac50fba2014-02-26 09:36:43 -0500423
424 /* first column */
425 helpdoc = _(shell_builtins[i].short_doc);
426
427 wcstr = 0;
428 slen = mbstowcs ((wchar_t *)0, helpdoc, 0);
429 if (slen == -1)
430 {
431 dispcolumn (i, buf, bufsize, width, height);
432 return;
433 }
434
435 /* No bigger than the passed max width */
436 if (slen >= width)
437 slen = width - 2;
438 wcstr = (wchar_t *)xmalloc (sizeof (wchar_t) * (width + 2));
439 n = mbstowcs (wcstr+1, helpdoc, slen + 1);
440 wcstr[n+1] = L'\0';
441
442 /* Turn tabs and newlines into spaces for column display, since wcwidth
443 returns -1 for them */
444 for (j = 1; j < n; j++)
445 if (wcstr[j] == L'\n' || wcstr[j] == L'\t')
446 wcstr[j] = L' ';
447
Chet Rameya0c0a002016-09-15 16:59:08 -0400448 /* dispchars == number of characters that will be displayed */
449 dispchars = wcsnwidth (wcstr+1, slen, width - 2);
450 /* dispcols == number of columns required to display DISPCHARS */
451 dispcols = wcswidth (wcstr+1, dispchars) + 1; /* +1 for ' ' or '*' */
452
Chet Rameyac50fba2014-02-26 09:36:43 -0500453 wcstr[0] = (shell_builtins[i].flags & BUILTIN_ENABLED) ? L' ' : L'*';
454
Chet Rameya0c0a002016-09-15 16:59:08 -0400455 if (dispcols >= width-2)
456 {
457 wcstr[dispchars] = L'>'; /* indicate truncation */
458 wcstr[dispchars+1] = L'\0';
459 }
Chet Rameyac50fba2014-02-26 09:36:43 -0500460
461 printf ("%ls", wcstr);
462 if (((i << 1) >= num_shell_builtins) || (i+height >= num_shell_builtins))
463 {
464 printf ("\n");
Chet Rameya0c0a002016-09-15 16:59:08 -0400465 free (wcstr);
Chet Rameyac50fba2014-02-26 09:36:43 -0500466 return;
467 }
468
469 /* at least one space */
Chet Rameya0c0a002016-09-15 16:59:08 -0400470 for (j = dispcols; j < width; j++)
Chet Rameyac50fba2014-02-26 09:36:43 -0500471 putc (' ', stdout);
472
473 /* second column */
474 helpdoc = _(shell_builtins[i+height].short_doc);
475 slen = mbstowcs ((wchar_t *)0, helpdoc, 0);
476 if (slen == -1)
477 {
478 /* for now */
479 printf ("%c%s\n", (shell_builtins[i+height].flags & BUILTIN_ENABLED) ? ' ' : '*', helpdoc);
Chet Rameya0c0a002016-09-15 16:59:08 -0400480 free (wcstr);
Chet Rameyac50fba2014-02-26 09:36:43 -0500481 return;
482 }
483
484 /* Reuse wcstr since it is already width wide chars long */
485 if (slen >= width)
486 slen = width - 2;
487 n = mbstowcs (wcstr+1, helpdoc, slen + 1);
488 wcstr[n+1] = L'\0'; /* make sure null-terminated */
489
490 /* Turn tabs and newlines into spaces for column display */
491 for (j = 1; j < n; j++)
492 if (wcstr[j] == L'\n' || wcstr[j] == L'\t')
493 wcstr[j] = L' ';
494
Chet Rameya0c0a002016-09-15 16:59:08 -0400495 /* dispchars == number of characters that will be displayed */
496 dispchars = wcsnwidth (wcstr+1, slen, width - 2);
497 dispcols = wcswidth (wcstr+1, dispchars) + 1; /* +1 for ' ' or '*' */
Chet Rameyac50fba2014-02-26 09:36:43 -0500498
499 wcstr[0] = (shell_builtins[i+height].flags & BUILTIN_ENABLED) ? L' ' : L'*';
500
Chet Rameya0c0a002016-09-15 16:59:08 -0400501 /* The dispchars-1 is there for terminals that behave strangely when you
502 have \n in the nth column for terminal width n; this is what bash-4.3
503 did. */
504 if (dispcols >= width - 2)
505 {
506 wcstr[dispchars-1] = L'>'; /* indicate truncation */
507 wcstr[dispchars] = L'\0';
508 }
Chet Rameyac50fba2014-02-26 09:36:43 -0500509
510 printf ("%ls\n", wcstr);
511
512 free (wcstr);
513}
514#endif /* HANDLE_MULTIBYTE */
515
516static void
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000517show_builtin_command_help ()
518{
519 int i, j;
Jari Aalto31859422009-01-12 13:36:28 +0000520 int height, width;
521 char *t, blurb[128];
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000522
523 printf (
Jari Aaltob80f6442004-07-27 13:29:18 +0000524_("These shell commands are defined internally. Type `help' to see this list.\n\
Jari Aalto726f6381996-08-26 18:22:31 +0000525Type `help name' to find out more about the function `name'.\n\
526Use `info bash' to find out more about the shell in general.\n\
Jari Aalto7117c2d2002-07-17 14:10:11 +0000527Use `man -k' or `info' to find out more about commands not in this list.\n\
Jari Aalto726f6381996-08-26 18:22:31 +0000528\n\
529A star (*) next to a name means that the command is disabled.\n\
Jari Aaltob80f6442004-07-27 13:29:18 +0000530\n"));
Jari Aalto726f6381996-08-26 18:22:31 +0000531
Chet Rameyd233b482019-01-07 09:27:52 -0500532 width = default_columns ();
Jari Aalto31859422009-01-12 13:36:28 +0000533
534 width /= 2;
535 if (width > sizeof (blurb))
536 width = sizeof (blurb);
Chet Ramey00018032011-11-21 20:51:19 -0500537 if (width <= 3)
538 width = 40;
Jari Aalto31859422009-01-12 13:36:28 +0000539 height = (num_shell_builtins + 1) / 2; /* number of rows */
540
541 for (i = 0; i < height; i++)
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000542 {
543 QUIT;
Jari Aalto726f6381996-08-26 18:22:31 +0000544
Chet Rameyac50fba2014-02-26 09:36:43 -0500545#if defined (HANDLE_MULTIBYTE)
546 if (MB_CUR_MAX > 1)
547 wdispcolumn (i, blurb, sizeof (blurb), width, height);
548 else
549#endif
550 dispcolumn (i, blurb, sizeof (blurb), width, height);
Jari Aalto726f6381996-08-26 18:22:31 +0000551 }
Jari Aalto726f6381996-08-26 18:22:31 +0000552}
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000553#endif /* HELP_BUILTIN */