5 * Copyright (c) 2000, 2001, 2002, 2003, 2004 by Martin C. Shepherd.
9 * Permission is hereby granted, free of charge, to any person obtaining a
10 * copy of this software and associated documentation files (the
11 * "Software"), to deal in the Software without restriction, including
12 * without limitation the rights to use, copy, modify, merge, publish,
13 * distribute, and/or sell copies of the Software, and to permit persons
14 * to whom the Software is furnished to do so, provided that the above
15 * copyright notice(s) and this permission notice appear in all copies of
16 * the Software and that both the above copyright notice(s) and this
17 * permission notice appear in supporting documentation.
19 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
20 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
21 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
22 * OF THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
23 * HOLDERS INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL
24 * INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING
25 * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
26 * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
27 * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
29 * Except as contained in this notice, the name of a copyright holder
30 * shall not be used in advertising or otherwise to promote the sale, use
31 * or other dealings in this Software without prior written authorization
32 * of the copyright holder.
35 #pragma ident "%Z%%M% %I% %E% SMI"
41 #include <stdio.h> /* FILE * */
42 #include <stdlib.h> /* size_t */
43 #include <time.h> /* time_t */
44 #include <signal.h> /* struct sigaction */
47 * The following are the three components of the libtecla version number.
48 * Note that it is better to use the libtecla_version() function than these
49 * macros since the macros only tell you which version of the library your
50 * code was compiled against, whereas the libtecla_version() function
51 * tells you which version of the shared tecla library your program is
54 #define TECLA_MAJOR_VER 1
55 #define TECLA_MINOR_VER 6
56 #define TECLA_MICRO_VER 0
58 /*.......................................................................
59 * Query the version number of the tecla library.
62 * major int * The major version number of the library
63 * will be assigned to *major. This number is
64 * only incremented when a change to the library is
65 * made that breaks binary (shared library) and/or
66 * compilation backwards compatibility.
67 * minor int * The minor version number of the library
68 * will be assigned to *minor. This number is
69 * incremented whenever new functions are added to
71 * micro int * The micro version number of the library will be
72 * assigned to *micro. This number is incremented
73 * whenever internal changes are made that don't
74 * change the public API, such as bug fixes and
75 * performance enhancements.
77 void libtecla_version(int *major
, int *minor
, int *micro
);
79 /*-----------------------------------------------------------------------
80 * The getline module provides interactive command-line input, recall
81 * and editing by users at terminals. See the gl_getline(3) man page for
83 *-----------------------------------------------------------------------*/
86 * Provide an opaque handle for the resource object that is defined in
89 typedef struct GetLine GetLine
;
92 * The following two functions are used to create and delete the
93 * resource objects that are used by the gl_getline() function.
95 GetLine
*new_GetLine(size_t linelen
, size_t histlen
);
96 GetLine
*del_GetLine(GetLine
*gl
);
99 * Read a line into an internal buffer of gl.
101 char *gl_get_line(GetLine
*gl
, const char *prompt
, const char *start_line
,
104 /*.......................................................................
105 * Prompt the user for a single-character reply.
108 * gl GetLine * A resource object returned by new_GetLine().
109 * prompt char * The prompt to prefix the query with, or NULL
110 * to reuse the previous prompt.
111 * defchar char The character to substitute if the
112 * user simply hits return, or '\n' if you don't
113 * need to substitute anything.
115 * return int The character that was read, or EOF if the read
116 * had to be aborted (in which case you can call
117 * gl_return_status() to find out why).
119 int gl_query_char(GetLine
*gl
, const char *prompt
, char defchar
);
121 /*.......................................................................
122 * Read a single uninterpretted character from the user, without
123 * displaying anything.
126 * gl GetLine * A resource object previously returned by
129 * return int The character that was read, or EOF if the read
130 * had to be aborted (in which case you can call
131 * gl_return_status() to find out why).
133 int gl_read_char(GetLine
*gl
);
136 * Configure the application specific and/or user-specific behavior of
139 int gl_configure_getline(GetLine
*gl
, const char *app_string
,
140 const char *app_file
, const char *user_file
);
143 * The following enumerators specify the origin of a key binding, and
144 * are listed in order of decreasing priority, such that user-specified
145 * key-bindings take precedence over application default bindings.
148 GL_USER_KEY
, /* A key-binding specified by the user */
149 GL_APP_KEY
/* A key-binding specified by the application */
153 * Bind a key sequence to a given action. If action==NULL, unbind the
156 int gl_bind_keyseq(GetLine
*gl
, GlKeyOrigin origin
, const char *keyseq
,
159 /*-----------------------------------------------------------------------
160 * The file-expansion module provides facilities for expanding ~user/ and
161 * $envvar expressions, and for expanding glob-style wildcards.
162 * See the ef_expand_file(3) man page for more details.
163 *-----------------------------------------------------------------------*/
166 * ExpandFile objects contain the resources needed to expand pathnames.
168 typedef struct ExpandFile ExpandFile
;
171 * The following functions are used to create and delete the resource
172 * objects that are used by the ef_expand_file() function.
174 ExpandFile
*new_ExpandFile(void);
175 ExpandFile
*del_ExpandFile(ExpandFile
*ef
);
178 * A container of the following type is returned by ef_expand_file().
181 int exists
; /* True if the files in files[] currently exist. */
182 /* This only time that this may not be true is if */
183 /* the input filename didn't contain any wildcards */
184 /* and thus wasn't matched against existing files. */
185 /* In this case the single entry in 'nfile' may not */
186 /* refer to an existing file. */
187 int nfile
; /* The number of files in files[] */
188 char **files
; /* An array of 'nfile' filenames. */
192 * The ef_expand_file() function expands a specified pathname, converting
193 * ~user/ and ~/ patterns at the start of the pathname to the
194 * corresponding home directories, replacing $envvar with the value of
195 * the corresponding environment variable, and then, if there are any
196 * wildcards, matching these against existing filenames.
198 * If no errors occur, a container is returned containing the array of
199 * files that resulted from the expansion. If there were no wildcards
200 * in the input pathname, this will contain just the original pathname
201 * after expansion of ~ and $ expressions. If there were any wildcards,
202 * then the array will contain the files that matched them. Note that
203 * if there were any wildcards but no existing files match them, this
204 * is counted as an error and NULL is returned.
206 * The supported wildcards and their meanings are:
207 * * - Match any sequence of zero or more characters.
208 * ? - Match any single character.
209 * [chars] - Match any single character that appears in 'chars'.
210 * If 'chars' contains an expression of the form a-b,
211 * then any character between a and b, including a and b,
212 * matches. The '-' character looses its special meaning
213 * as a range specifier when it appears at the start
214 * of the sequence of characters.
215 * [^chars] - The same as [chars] except that it matches any single
216 * character that doesn't appear in 'chars'.
218 * Wildcard expressions are applied to individual filename components.
219 * They don't match across directory separators. A '.' character at
220 * the beginning of a filename component must also be matched
221 * explicitly by a '.' character in the input pathname, since these
222 * are UNIX's hidden files.
225 * fe ExpandFile * The pathname expansion resource object.
226 * path const char * The path name to be expanded.
227 * pathlen int The length of the suffix of path[] that
228 * constitutes the filename to be expanded,
229 * or -1 to specify that the whole of the
230 * path string should be used.
232 * return FileExpansion * A pointer to a results container within the
233 * given ExpandFile object. This contains an
234 * array of the pathnames that resulted from
235 * expanding ~ and $ expressions and from
236 * matching any wildcards, sorted into lexical
239 * This container and its contents will be
240 * recycled on subsequent calls, so if you need
241 * to keep the results of two successive runs,
242 * you will either have to allocate a private
243 * copy of the array, or use two ExpandFile
246 * On error, NULL is returned. A description
247 * of the error can be acquired by calling the
248 * ef_last_error() function.
250 FileExpansion
*ef_expand_file(ExpandFile
*ef
, const char *path
, int pathlen
);
252 /*.......................................................................
253 * Print out an array of matching files.
256 * result FileExpansion * The container of the sorted array of
258 * fp FILE * The output stream to write to.
259 * term_width int The width of the terminal.
264 int ef_list_expansions(FileExpansion
*result
, FILE *fp
, int term_width
);
267 * The ef_last_error() function returns a description of the last error
268 * that occurred in a call ef_expand_file(). Note that this message is
269 * contained in an array which is allocated as part of *ef, and its
270 * contents thus potentially change on every call to ef_expand_file().
272 const char *ef_last_error(ExpandFile
*ef
);
274 /*-----------------------------------------------------------------------
275 * The WordCompletion module is used for completing incomplete words, such
276 * as filenames. Programs can use functions within this module to register
277 * their own customized completion functions.
278 *-----------------------------------------------------------------------*/
281 * Ambiguous completion matches are recorded in objects of the
284 typedef struct WordCompletion WordCompletion
;
287 * Create a new completion object.
289 WordCompletion
*new_WordCompletion(void);
292 * Delete a redundant completion object.
294 WordCompletion
*del_WordCompletion(WordCompletion
*cpl
);
296 /*.......................................................................
297 * Callback functions declared and prototyped using the following macro
298 * are called upon to return an array of possible completion suffixes
299 * for the token that precedes a specified location in the given
300 * input line. It is up to this function to figure out where the token
301 * starts, and to call cpl_add_completion() to register each possible
302 * completion before returning.
305 * cpl WordCompletion * An opaque pointer to the object that will
306 * contain the matches. This should be filled
307 * via zero or more calls to cpl_add_completion().
308 * data void * The anonymous 'data' argument that was
309 * passed to cpl_complete_word() or
310 * gl_customize_completion()).
311 * line const char * The current input line.
312 * word_end int The index of the character in line[] which
313 * follows the end of the token that is being
319 #define CPL_MATCH_FN(fn) int (fn)(WordCompletion *cpl, void *data, \
320 const char *line, int word_end)
321 typedef CPL_MATCH_FN(CplMatchFn
);
323 /*.......................................................................
324 * Optional callback functions declared and prototyped using the
325 * following macro are called upon to return non-zero if a given
326 * file, specified by its pathname, is to be included in a list of
330 * data void * The application specified pointer which
331 * was specified when this callback function
332 * was registered. This can be used to have
333 * anything you like passed to your callback.
334 * pathname const char * The pathname of the file to be checked to
335 * see if it should be included in the list
338 * return int 0 - Ignore this file.
339 * 1 - Do include this file in the list
342 #define CPL_CHECK_FN(fn) int (fn)(void *data, const char *pathname)
343 typedef CPL_CHECK_FN(CplCheckFn
);
346 * You can use the following CplCheckFn callback function to only
347 * have executables included in a list of completions.
349 CPL_CHECK_FN(cpl_check_exe
);
352 * cpl_file_completions() is the builtin filename completion callback
353 * function. This can also be called by your own custom CPL_MATCH_FN()
354 * callback functions. To do this pass on all of the arguments of your
355 * custom callback function to cpl_file_completions(), with the exception
356 * of the (void *data) argument. The data argument should either be passed
357 * NULL to request the default behaviour of the file-completion function,
358 * or be passed a pointer to a CplFileConf structure (see below). In the
359 * latter case the contents of the structure modify the behavior of the
362 CPL_MATCH_FN(cpl_file_completions
);
365 * Objects of the following type can be used to change the default
366 * behavior of the cpl_file_completions() callback function.
368 typedef struct CplFileConf CplFileConf
;
371 * If you want to change the behavior of the cpl_file_completions()
372 * callback function, call the following function to allocate a
373 * configuration object, then call one or more of the subsequent
374 * functions to change any of the default configuration parameters
375 * that you don't want. This function returns NULL when there is
376 * insufficient memory.
378 CplFileConf
*new_CplFileConf(void);
381 * If backslashes in the prefix being passed to cpl_file_completions()
382 * should be treated as literal characters, call the following function
383 * with literal=1. Otherwise the default is to treat them as escape
384 * characters which remove the special meanings of spaces etc..
386 void cfc_literal_escapes(CplFileConf
*cfc
, int literal
);
389 * Before calling cpl_file_completions(), call this function if you
390 * know the index at which the filename prefix starts in the input line.
391 * Otherwise by default, or if you specify start_index to be -1, the
392 * filename is taken to start after the first unescaped space preceding
393 * the cursor, or the start of the line, which ever comes first.
395 void cfc_file_start(CplFileConf
*cfc
, int start_index
);
398 * If you only want certain types of files to be included in the
399 * list of completions, use the following function to specify a
400 * callback function which will be called to ask whether a given file
401 * should be included. The chk_data argument is will be passed to the
402 * callback function whenever it is called and can be anything you want.
404 void cfc_set_check_fn(CplFileConf
*cfc
, CplCheckFn
*chk_fn
, void *chk_data
);
407 * The following function deletes a CplFileConf objects previously
408 * returned by new_CplFileConf(). It always returns NULL.
410 CplFileConf
*del_CplFileConf(CplFileConf
*cfc
);
413 * The following configuration structure is deprecated. Do not change
414 * its contents, since this will break any programs that still use it,
415 * and don't use it in new programs. Instead use opaque CplFileConf
416 * objects as described above. cpl_file_completions() figures out
417 * what type of structure you pass it, by virtue of a magic int code
418 * placed at the start of CplFileConf object by new_CplFileConf().
421 int escaped
; /* Opposite to the argument of cfc_literal_escapes() */
422 int file_start
; /* Equivalent to the argument of cfc_file_start() */
425 * This initializes the deprecated CplFileArgs structures.
427 void cpl_init_FileArgs(CplFileArgs
*cfa
);
429 /*.......................................................................
430 * When an error occurs while performing a completion, custom completion
431 * callback functions should register a terse description of the error
432 * by calling cpl_record_error(). This message will then be returned on
433 * the next call to cpl_last_error() and used by getline to display an
434 * error message to the user.
437 * cpl WordCompletion * The string-completion resource object that was
438 * originally passed to the callback.
439 * errmsg const char * The description of the error.
441 void cpl_record_error(WordCompletion
*cpl
, const char *errmsg
);
443 /*.......................................................................
444 * This function can be used to replace the builtin filename-completion
445 * function with one of the user's choice. The user's completion function
446 * has the option of calling the builtin filename-completion function
447 * if it believes that the token that it has been presented with is a
448 * filename (see cpl_file_completions() above).
451 * gl GetLine * The resource object of the command-line input
453 * data void * This is passed to match_fn() whenever it is
454 * called. It could, for example, point to a
455 * symbol table that match_fn() would look up
457 * match_fn CplMatchFn * The function that will identify the prefix
458 * to be completed from the input line, and
459 * report matching symbols.
464 int gl_customize_completion(GetLine
*gl
, void *data
, CplMatchFn
*match_fn
);
466 /*.......................................................................
467 * This function allows you to install alternate completion action
468 * functions or completion listing functions, or to change the
469 * completion function of an existing action of the same type. This
470 * should preferably be called before the first call to gl_get_line()
471 * so that the name of the action becomes defined before the user's
472 * configuration file is read.
475 * gl GetLine * The resource object of the command-line input
477 * data void * This is passed to match_fn() whenever it is
478 * called. It could, for example, point to a
479 * symbol table that match_fn() would look up
481 * match_fn CplMatchFn * The function that will identify the prefix
482 * to be completed from the input line, and
483 * report matching symbols.
484 * list_only int If non-zero, install an action that only lists
485 * possible completions, rather than attempting
486 * to perform the completion.
487 * name const char * The name with which users can refer to the
488 * binding in tecla configuration files.
489 * keyseq const char * The key sequence with which to invoke
490 * the binding. This should be specified in the
491 * same manner as key-sequences in tecla
492 * configuration files (eg. "M-^I").
497 int gl_completion_action(GetLine
*gl
, void *data
, CplMatchFn
*match_fn
,
498 int list_only
, const char *name
, const char *keyseq
);
500 /*.......................................................................
501 * Change the terminal (or stream) that getline interacts with.
504 * gl GetLine * The resource object of the command-line input
506 * input_fp FILE * The stdio stream to read from.
507 * output_fp FILE * The stdio stream to write to.
508 * term const char * The terminal type. This can be NULL if
509 * either or both of input_fp and output_fp don't
510 * refer to a terminal. Otherwise it should refer
511 * to an entry in the terminal information database.
516 int gl_change_terminal(GetLine
*gl
, FILE *input_fp
, FILE *output_fp
,
519 /*.......................................................................
520 * The following functions can be used to save and restore the contents
521 * of the history buffer.
524 * gl GetLine * The resource object of the command-line input
526 * filename const char * The name of the new file to write to.
527 * comment const char * Extra information such as timestamps will
528 * be recorded on a line started with this
529 * string, the idea being that the file can
530 * double as a command file. Specify "" if
531 * you don't care. Be sure to specify the
532 * same string to both functions.
533 * max_lines int The maximum number of lines to save, or -1
534 * to save all of the lines in the history
540 int gl_save_history(GetLine
*gl
, const char *filename
, const char *comment
,
542 int gl_load_history(GetLine
*gl
, const char *filename
, const char *comment
);
545 * Enumerate file-descriptor events that can be waited for.
548 GLFD_READ
, /* Watch for data waiting to be read from a file descriptor */
549 GLFD_WRITE
, /* Watch for ability to write to a file descriptor */
550 GLFD_URGENT
/* Watch for urgent out-of-band data on the file descriptor */
554 * The following enumeration is used for the return status of file
555 * descriptor event callbacks.
558 GLFD_ABORT
, /* Cause gl_get_line() to abort with an error */
559 GLFD_REFRESH
, /* Redraw the input line and continue waiting for input */
560 GLFD_CONTINUE
/* Continue to wait for input, without redrawing the line */
563 /*.......................................................................
564 * On systems that have the select() system call, while gl_get_line()
565 * is waiting for terminal input, it can also be asked to listen for
566 * activity on arbitrary file descriptors. Callback functions of the
567 * following type can be registered to be called when activity is
568 * seen. If your callback needs to write to the terminal or use
569 * signals, please see the gl_get_line(3) man page.
572 * gl GetLine * The gl_get_line() resource object. You can use
573 * this safely to call gl_watch_fd() or
574 * gl_inactivity_timeout(). The effect of calling other
575 * functions that take a gl argument is undefined,
576 * and must be avoided.
577 * data void * A pointer to arbitrary callback data, as originally
578 * registered with gl_watch_fd().
579 * fd int The file descriptor that has activity.
580 * event GlFdEvent The activity seen on the file descriptor. The
581 * inclusion of this argument allows the same
582 * callback to be registered for multiple events.
584 * return GlFdStatus GLFD_ABORT - Cause gl_get_line() to abort with
585 * an error (set errno if you need it).
586 * GLFD_REFRESH - Redraw the input line and continue
587 * waiting for input. Use this if you
588 * wrote something to the terminal.
589 * GLFD_CONTINUE - Continue to wait for input, without
590 * redrawing the line.
592 #define GL_FD_EVENT_FN(fn) GlFdStatus (fn)(GetLine *gl, void *data, int fd, \
594 typedef GL_FD_EVENT_FN(GlFdEventFn
);
596 /*.......................................................................
597 * Where possible, register a function and associated data to be called
598 * whenever a specified event is seen on a file descriptor.
601 * gl GetLine * The resource object of the command-line input
603 * fd int The file descriptor to watch.
604 * event GlFdEvent The type of activity to watch for.
605 * callback GlFdEventFn * The function to call when the specified
606 * event occurs. Setting this to 0 removes
607 * any existing callback.
608 * data void * A pointer to arbitrary data to pass to the
612 * 1 - Either gl==NULL, or this facility isn't
613 * available on the the host system
614 * (ie. select() isn't available). No
615 * error message is generated in the latter
618 int gl_watch_fd(GetLine
*gl
, int fd
, GlFdEvent event
,
619 GlFdEventFn
*callback
, void *data
);
622 * Enumerators from the following list are returned by activity
623 * timeout callbacks registered by gl_inactivity_timeout(). They tell
624 * gl_get_line() whether and how to procede.
627 GLTO_ABORT
, /* Cause gl_get_line() to abort with an error */
628 GLTO_REFRESH
, /* Redraw the input line and continue waiting for input */
629 GLTO_CONTINUE
/* Continue to wait for input, without redrawing the line */
632 /*.......................................................................
633 * On systems that have the select() system call, the application has
634 * the option of providing a callback function of the following type,
635 * which is called whenever no terminal input or other I/O activity is
636 * seen for the timeout duration specified in the last call to
637 * gl_inactivity_timeout().
640 * gl GetLine * The gl_get_line() resource object. You can use
641 * this safely to call gl_watch_fd() or
642 * gl_inactivity_timeout(). The effect of calling other
643 * functions that take a gl argument is undefined,
644 * and must be avoided.
645 * data void * A pointer to arbitrary callback data, as
646 * originally registered with gl_inactivity_timeout().
648 * return GlAfterTimeout GLTO_ABORT - Cause gl_get_line() to
649 * abort with an error (set
650 * errno if you need it).
651 * GLTO_REFRESH - Redraw the input line and
652 * continue waiting for
653 * input. Use this if you
654 * wrote something to the
656 * GLTO_CONTINUE - Continue to wait for
657 * input, without redrawing
660 #define GL_TIMEOUT_FN(fn) GlAfterTimeout (fn)(GetLine *gl, void *data)
661 typedef GL_TIMEOUT_FN(GlTimeoutFn
);
663 /*.......................................................................
664 * On systems with the select() system call, the gl_inactivity_timeout()
665 * function provides the option of setting (or cancelling) an
666 * inactivity timeout. Inactivity, in this case, refers both to
667 * terminal input received from the user, and to I/O on any file
668 * descriptors registered by calls to gl_watch_fd(). If at any time,
669 * no activity is seen for the requested time period, the specified
670 * timeout callback function is called. On returning, this callback
671 * returns a code which tells gl_get_line() what to do next. Note that
672 * each call to gl_inactivity_timeout() replaces any previously installed
673 * timeout callback, and that specifying a callback of 0, turns off
676 * Beware that although the timeout argument includes a nano-second
677 * component, few computer clocks presently have resolutions finer
678 * than a few milliseconds, so asking for less than a few milliseconds
679 * is equivalent to zero on a lot of systems.
682 * gl GetLine * The resource object of the command-line input
684 * callback GlTimeoutFn * The function to call when the inactivity
685 * timeout is exceeded. To turn off
686 * inactivity timeouts altogether, send 0.
687 * data void * A pointer to arbitrary data to pass to the
689 * sec unsigned long The number of whole seconds in the timeout.
690 * nsec unsigned long The fractional number of seconds in the
691 * timeout, expressed in nano-seconds (see
695 * 1 - Either gl==NULL, or this facility isn't
696 * available on the the host system
697 * (ie. select() isn't available). No
698 * error message is generated in the latter
701 int gl_inactivity_timeout(GetLine
*gl
, GlTimeoutFn
*timeout_fn
, void *data
,
702 unsigned long sec
, unsigned long nsec
);
704 /*.......................................................................
705 * Switch history streams. History streams represent separate history
706 * lists recorded within a single history buffer. Different streams
707 * are distinguished by integer identifiers chosen by the calling
708 * appplicaton. Initially new_GetLine() sets the stream identifier to
709 * 0. Whenever a new line is appended to the history list, the current
710 * stream identifier is recorded with it, and history lookups only
711 * consider lines marked with the current stream identifier.
714 * gl GetLine * The resource object of gl_get_line().
715 * id unsigned The new history stream identifier.
720 int gl_group_history(GetLine
*gl
, unsigned id
);
722 /*.......................................................................
723 * Display the contents of the history list.
726 * gl GetLine * The resource object of gl_get_line().
727 * fp FILE * The stdio output stream to write to.
728 * fmt const char * A format string. This containing characters to be
729 * written verbatim, plus any of the following
731 * %D - The date, formatted like 2001-11-20
732 * %T - The time of day, formatted like 23:59:59
733 * %N - The sequential entry number of the
734 * line in the history buffer.
735 * %G - The number of the history group that
736 * the line belongs to.
737 * %% - A literal % character.
738 * %H - The history line itself.
739 * Note that a '\n' newline character is not
740 * appended by default.
741 * all_groups int If true, display history lines from all
742 * history groups. Otherwise only display
743 * those of the current history group.
744 * max_lines int If max_lines is < 0, all available lines
745 * are displayed. Otherwise only the most
746 * recent max_lines lines will be displayed.
751 int gl_show_history(GetLine
*gl
, FILE *fp
, const char *fmt
, int all_groups
,
754 /*.......................................................................
755 * Resize or delete the history buffer.
758 * gl GetLine * The resource object of gl_get_line().
759 * bufsize size_t The number of bytes in the history buffer, or 0
760 * to delete the buffer completely.
763 * 1 - Insufficient memory (the previous buffer
764 * will have been retained). No error message
767 int gl_resize_history(GetLine
*gl
, size_t bufsize
);
769 /*.......................................................................
770 * Set an upper limit to the number of lines that can be recorded in the
771 * history list, or remove a previously specified limit.
774 * gl GetLine * The resource object of gl_get_line().
775 * max_lines int The maximum number of lines to allow, or -1 to
776 * cancel a previous limit and allow as many lines
777 * as will fit in the current history buffer size.
779 void gl_limit_history(GetLine
*gl
, int max_lines
);
781 /*.......................................................................
782 * Discard either all historical lines, or just those associated with the
783 * current history group.
786 * gl GetLine * The resource object of gl_get_line().
787 * all_groups int If true, clear all of the history. If false,
788 * clear only the stored lines associated with the
789 * currently selected history group.
791 void gl_clear_history(GetLine
*gl
, int all_groups
);
793 /*.......................................................................
794 * Temporarily enable or disable the gl_get_line() history mechanism.
797 * gl GetLine * The resource object of gl_get_line().
798 * enable int If true, turn on the history mechanism. If
801 void gl_toggle_history(GetLine
*gl
, int enable
);
804 * Objects of the following type are returned by gl_terminal_size().
807 int nline
; /* The terminal has nline lines */
808 int ncolumn
; /* The terminal has ncolumn columns */
811 /*.......................................................................
812 * Update if necessary, and return the current size of the terminal.
815 * gl GetLine * The resource object of gl_get_line().
816 * def_ncolumn int If the number of columns in the terminal
817 * can't be determined, substitute this number.
818 * def_nline int If the number of lines in the terminal can't
819 * be determined, substitute this number.
821 * return GlTerminalSize The current terminal size.
823 GlTerminalSize
gl_terminal_size(GetLine
*gl
, int def_ncolumn
, int def_nline
);
825 /*.......................................................................
826 * Tell gl_get_line() the current terminal size. Note that this is only
827 * necessary on systems where changes in terminal size aren't reported
831 * gl GetLine * The resource object of gl_get_line().
832 * ncolumn int The number of columns in the terminal.
833 * nline int The number of rows in the terminal.
838 int gl_set_term_size(GetLine
*gl
, int ncolumn
, int nline
);
841 * The gl_lookup_history() function returns information in an
842 * argument of the following type.
845 const char *line
; /* The requested history line */
846 unsigned group
; /* The history group to which the */
848 time_t timestamp
; /* The date and time at which the */
849 /* line was originally entered. */
852 /*.......................................................................
853 * Lookup a history line by its sequential number of entry in the
857 * gl GetLine * The resource object of gl_get_line().
858 * id unsigned long The identification number of the line to
859 * be returned, where 0 denotes the first line
860 * that was entered in the history list, and
861 * each subsequently added line has a number
862 * one greater than the previous one. For
863 * the range of lines currently in the list,
864 * see the gl_range_of_history() function.
866 * line GlHistoryLine * A pointer to the variable in which to
867 * return the details of the line.
869 * return int 0 - The line is no longer in the history
870 * list, and *line has not been changed.
871 * 1 - The requested line can be found in
872 * *line. Note that the string in
873 * line->line is part of the history
874 * buffer and will change, so a private
875 * copy should be made if you wish to
876 * use it after subsequent calls to any
877 * functions that take gl as an argument.
879 int gl_lookup_history(GetLine
*gl
, unsigned long id
, GlHistoryLine
*line
);
882 * The gl_state_of_history() function returns information in an argument
883 * of the following type.
886 int enabled
; /* True if history is enabled */
887 unsigned group
; /* The current history group */
888 int max_lines
; /* The current upper limit on the number of lines */
889 /* in the history list, or -1 if unlimited. */
892 /*.......................................................................
893 * Query the state of the history list. Note that any of the input/output
894 * pointers can be specified as NULL.
897 * gl GetLine * The resource object of gl_get_line().
899 * state GlHistoryState * A pointer to the variable in which to record
902 void gl_state_of_history(GetLine
*gl
, GlHistoryState
*state
);
905 * The gl_range_of_history() function returns information in an argument
906 * of the following type.
909 unsigned long oldest
; /* The sequential entry number of the oldest */
910 /* line in the history list. */
911 unsigned long newest
; /* The sequential entry number of the newest */
912 /* line in the history list. */
913 int nlines
; /* The number of lines in the history list */
916 /*.......................................................................
917 * Query the number and range of lines in the history buffer.
920 * gl GetLine * The resource object of gl_get_line().
921 * range GlHistoryRange * A pointer to the variable in which to record
922 * the return values. If range->nline=0, the
923 * range of lines will be given as 0-0.
925 void gl_range_of_history(GetLine
*gl
, GlHistoryRange
*range
);
928 * The gl_size_of_history() function returns information in an argument
929 * of the following type.
932 size_t size
; /* The size of the history buffer (bytes) */
933 size_t used
; /* The number of bytes of the history buffer */
934 /* that are currently occupied. */
937 /*.......................................................................
938 * Return the size of the history buffer and the amount of the
939 * buffer that is currently in use.
942 * gl GetLine * The resource object of gl_get_line().
944 * GlHistorySize size * A pointer to the variable in which to return
947 void gl_size_of_history(GetLine
*gl
, GlHistorySize
*size
);
949 /*.......................................................................
950 * Enable or disable the automatic addition of newly entered lines to the
954 * gl GetLine * The resource object of gl_get_line().
955 * enable int If true, subsequently entered lines will
956 * automatically be added to the history list
957 * before they are returned to the caller of
958 * gl_get_line(). If 0, the choice of how and
959 * when to archive lines in the history list,
960 * is left up to the calling application, which
961 * can do so via calls to gl_append_history().
966 int gl_automatic_history(GetLine
*gl
, int enable
);
968 /*.......................................................................
969 * Append a specified line to the history list.
972 * gl GetLine * The resource object of gl_get_line().
973 * line const char * The line to be added.
978 int gl_append_history(GetLine
*gl
, const char *line
);
980 /*.......................................................................
981 * Specify whether text that users type should be displayed or hidden.
982 * In the latter case, only the prompt is displayed, and the final
983 * input line is not archived in the history list.
986 * gl GetLine * The input-line history maintenance object.
987 * enable int 0 - Disable echoing.
988 * 1 - Enable echoing.
989 * -1 - Just query the mode without changing it.
991 * return int The echoing disposition that was in effect
992 * before this function was called:
993 * 0 - Echoing was disabled.
994 * 1 - Echoing was enabled.
996 int gl_echo_mode(GetLine
*gl
, int enable
);
998 /*.......................................................................
999 * This function can be called from gl_get_line() callbacks to have
1000 * the prompt changed when they return. It has no effect if gl_get_line()
1001 * is not currently being invoked.
1004 * gl GetLine * The resource object of gl_get_line().
1005 * prompt const char * The new prompt.
1007 void gl_replace_prompt(GetLine
*gl
, const char *prompt
);
1010 * Enumerate the available prompt formatting styles.
1013 GL_LITERAL_PROMPT
, /* Display the prompt string literally */
1014 GL_FORMAT_PROMPT
/* The prompt string can contain any of the */
1015 /* following formatting directives: */
1016 /* %B - Display subsequent characters */
1017 /* with a bold font. */
1018 /* %b - Stop displaying characters */
1019 /* with the bold font. */
1020 /* %U - Underline subsequent characters. */
1021 /* %u - Stop underlining characters. */
1022 /* %S - Highlight subsequent characters */
1023 /* (also known as standout mode). */
1024 /* %s - Stop highlighting characters */
1025 /* %% - Display a single % character. */
1028 /*.......................................................................
1029 * Specify whether to heed text attribute directives within prompt
1033 * gl GetLine * The resource object of gl_get_line().
1034 * style GlPromptStyle The style of prompt (see the definition of
1035 * GlPromptStyle in libtecla.h for details).
1037 void gl_prompt_style(GetLine
*gl
, GlPromptStyle style
);
1039 /*.......................................................................
1040 * Remove a signal from the list of signals that gl_get_line() traps.
1043 * gl GetLine * The resource object of gl_get_line().
1044 * signo int The number of the signal to be ignored.
1046 * return int 0 - OK.
1049 int gl_ignore_signal(GetLine
*gl
, int signo
);
1052 * A bitwise union of the following enumerators is passed to
1053 * gl_trap_signal() to specify the environment in which the
1054 * application's signal handler is to be called.
1057 GLS_RESTORE_SIG
=1, /* Restore the caller's signal environment */
1058 /* while handling the signal. */
1059 GLS_RESTORE_TTY
=2, /* Restore the caller's terminal settings */
1060 /* while handling the signal. */
1061 GLS_RESTORE_LINE
=4, /* Move the cursor to the start of the next line */
1062 GLS_REDRAW_LINE
=8, /* Redraw the input line when the signal handler */
1064 GLS_UNBLOCK_SIG
=16, /* Normally a signal who's delivery is found to */
1065 /* be blocked by the calling application is not */
1066 /* trapped by gl_get_line(). Including this flag */
1067 /* causes it to be temporarily unblocked and */
1068 /* trapped while gl_get_line() is executing. */
1069 GLS_DONT_FORWARD
=32,/* Don't forward the signal to the signal handler */
1070 /* of the calling program. */
1071 GLS_RESTORE_ENV
= GLS_RESTORE_SIG
| GLS_RESTORE_TTY
| GLS_REDRAW_LINE
,
1072 GLS_SUSPEND_INPUT
= GLS_RESTORE_ENV
| GLS_RESTORE_LINE
1076 * The following enumerators are passed to gl_trap_signal() to tell
1077 * it what to do after the application's signal handler has been called.
1080 GLS_RETURN
, /* Return the line as though the user had pressed the */
1082 GLS_ABORT
, /* Cause gl_get_line() to return NULL */
1083 GLS_CONTINUE
/* After handling the signal, resume command line editing */
1086 /*.......................................................................
1087 * Tell gl_get_line() how to respond to a given signal. This can be used
1088 * both to override the default responses to signals that gl_get_line()
1089 * normally catches and to add new signals to the list that are to be
1093 * gl GetLine * The resource object of gl_get_line().
1094 * signo int The number of the signal to be caught.
1095 * flags unsigned A bitwise union of GlSignalFlags enumerators.
1096 * after GlAfterSignal What to do after the application's signal
1097 * handler has been called.
1098 * errno_value int The value to set errno to.
1100 * return int 0 - OK.
1101 * 1 - Insufficient memory to record the
1102 * new signal disposition.
1104 int gl_trap_signal(GetLine
*gl
, int signo
, unsigned flags
,
1105 GlAfterSignal after
, int errno_value
);
1107 /*.......................................................................
1108 * By default, gl_get_line() doesn't trap signals that are blocked
1109 * when it is called. This default can be changed either on a
1110 * per-signal basis by calling gl_trap_signal(), or on a global basis
1111 * by calling this function. What this function does is add the
1112 * GLS_UNBLOCK_SIG flag to all signals that are currently configured
1113 * to be trapped by gl_get_line(), such that when subsequent calls to
1114 * gl_get_line() wait for I/O, these signals are temporarily
1115 * unblocked. This behavior is useful in non-blocking server-I/O mode,
1116 * where it is used to avoid race conditions related to handling these
1117 * signals externally to gl_get_line(). See the demonstration code in
1118 * demo3.c, or the gl_handle_signal() man page for further
1122 * gl GetLine * The resource object of gl_get_line().
1124 void gl_catch_blocked(GetLine
*gl
);
1126 /*.......................................................................
1127 * In server-I/O mode the terminal is left in raw mode between calls
1128 * to gl_get_line(), so it is necessary for the application to install
1129 * terminal restoring signal handlers for signals that could terminate
1130 * or suspend the process, plus a terminal reconfiguration handler to
1131 * be called when a process resumption signal is received, and finally
1132 * a handler to be called when a terminal-resize signal is received.
1134 * Since there are many signals that by default terminate or suspend
1135 * processes, and different systems support different sub-sets of
1136 * these signals, this function provides a convenient wrapper around
1137 * sigaction() for assigning the specified handlers to all appropriate
1138 * signals. It also arranges that when any one of these signals is
1139 * being handled, all other catchable signals are blocked. This is
1140 * necessary so that the specified signal handlers can safely call
1141 * gl_raw_io(), gl_normal_io() and gl_update_size() without reentrancy
1145 * term_handler void (*)(int) The signal handler to invoke when
1146 * a process terminating signal is
1148 * susp_handler void (*)(int) The signal handler to invoke when
1149 * a process suspending signal is
1151 * cont_handler void (*)(int) The signal handler to invoke when
1152 * a process resumption signal is
1153 * received (ie. SIGCONT).
1154 * size_handler void (*)(int) The signal handler to invoke when
1155 * a terminal-resize signal (ie. SIGWINCH)
1158 * return int 0 - OK.
1161 int gl_tty_signals(void (*term_handler
)(int), void (*susp_handler
)(int),
1162 void (*cont_handler
)(int), void (*size_handler
)(int));
1164 /*.......................................................................
1165 * Return the last signal that was caught by the most recent call to
1166 * gl_get_line(), or -1 if no signals were caught. This is useful if
1167 * gl_get_line() returns errno=EINTR and you need to find out what signal
1168 * caused it to abort.
1171 * gl GetLine * The resource object of gl_get_line().
1173 * return int The last signal caught by the most recent
1174 * call to gl_get_line(), or -1 if no signals
1177 int gl_last_signal(GetLine
*gl
);
1179 /*.......................................................................
1180 * Return the signal mask used by gl_get_line(). This is the set of
1181 * signals that gl_get_line() is currently configured to trap.
1184 * gl GetLine * The resource object of gl_get_line().
1186 * set sigset_t * The set of signals will be returned in *set,
1187 * in the form of a signal process mask, as
1188 * used by sigaction(), sigprocmask(),
1189 * sigpending(), sigsuspend(), sigsetjmp() and
1190 * other standard POSIX signal-aware
1193 * return int 0 - OK.
1194 * 1 - Error (examine errno for reason).
1196 int gl_list_signals(GetLine
*gl
, sigset_t
*set
);
1198 /*.......................................................................
1199 * Respond to signals who's default effects have important
1200 * consequences to gl_get_line(). This is intended for use in
1201 * non-blocking server mode, where the external event loop is
1202 * responsible for catching signals. Signals that are handled include
1203 * those that by default terminate or suspend the process, and the
1204 * signal that indicates that the terminal size has changed. Note that
1205 * this function is not signal safe and should thus not be called from
1206 * a signal handler itself. See the gl_io_mode() man page for how it
1209 * In the case of signals that by default terminate or suspend
1210 * processes, command-line editing will be suspended, the terminal
1211 * returned to a usable state, then the default disposition of the
1212 * signal restored and the signal resent, in order to suspend or
1213 * terminate the process. If the process subsequently resumes,
1214 * command-line editing is resumed.
1216 * In the case of signals that indicate that the terminal has been
1217 * resized, the new size will be queried, and any input line that is
1218 * being edited will be redrawn to fit the new dimensions of the
1222 * signo int The number of the signal to respond to.
1223 * gl GetLine * The first element of an array of 'ngl' GetLine
1225 * ngl int The number of elements in the gl[] array. Normally
1228 void gl_handle_signal(int signo
, GetLine
*gl
, int ngl
);
1230 /*.......................................................................
1231 * Return extra information (ie. in addition to that provided by errno)
1232 * about the last error to occur in either gl_get_line() or its
1233 * associated public functions.
1236 * gl GetLine * The resource object of gl_get_line().
1238 * buff char * An optional output buffer. Note that if the
1239 * calling application calls any gl_*()
1240 * functions from signal handlers, it should
1241 * provide a buffer here, so that a copy of
1242 * the latest error message can safely be made
1243 * while signals are blocked.
1244 * n size_t The allocated size of buff[].
1246 * return const char * A pointer to the error message. This will
1247 * be the buff argument, unless buff==NULL, in
1248 * which case it will be a pointer to an
1249 * internal error buffer. In the latter case,
1250 * note that the contents of the returned buffer
1251 * will change on subsequent calls to any gl_*()
1254 const char *gl_error_message(GetLine
*gl
, char *buff
, size_t n
);
1256 /*.......................................................................
1257 * Clear the terminal and leave the cursor at the home position. In
1258 * server I/O mode, arrange for the input line to be redrawn from scratch
1259 * when gl_get_line() is next called.
1262 * gl GetLine * The resource object of gl_get_line().
1264 * return int 0 - OK.
1267 int gl_erase_terminal(GetLine
*gl
);
1269 /*.......................................................................
1270 * Display a left-justified string over multiple terminal lines,
1271 * taking account of the current width of the terminal. Optional
1272 * indentation and an optional prefix string can be specified to be
1273 * displayed at the start of each new terminal line used. Similarly,
1274 * an optional suffix can be specified to be displayed at the end of
1275 * each terminal line. If needed, a single paragraph can be broken
1276 * across multiple calls. Note that literal newlines in the input
1277 * string can be used to force a newline at any point and that you
1278 * should use this feature to explicitly end all paragraphs, including
1279 * at the end of the last string that you write. Note that when a new
1280 * line is started between two words that are separated by spaces,
1281 * those spaces are not output, whereas when a new line is started
1282 * because a newline character was found in the string, only the
1283 * spaces before the newline character are discarded.
1286 * gl GetLine * The resource object of gl_get_line().
1287 * indentation int The number of spaces of indentation to write
1288 * at the beginning of each new terminal line.
1289 * prefix const char * An optional prefix string to write after the
1290 * indentation margin at the start of each new
1291 * terminal line. You can specify NULL if no
1292 * prefix is required.
1293 * suffix const char * An optional suffix string to draw at the end
1294 * of the terminal line. Spaces will be added
1295 * where necessary to ensure that the suffix ends
1296 * in the last column of the terminal line. If
1297 * no suffix is desired, specify NULL.
1298 * fill_char int The padding character to use when indenting
1299 * the line or padding up to the suffix.
1300 * def_width int If the terminal width isn't known, such as when
1301 * writing to a pipe or redirecting to a file,
1302 * this number specifies what width to assume.
1303 * start int The number of characters already written to
1304 * the start of the current terminal line. This
1305 * is primarily used to allow individual
1306 * paragraphs to be written over multiple calls
1307 * to this function, but can also be used to
1308 * allow you to start the first line of a
1309 * paragraph with a different prefix or
1310 * indentation than those specified above.
1311 * string const char * The string to be written.
1313 * return int On error -1 is returned. Otherwise the
1314 * return value is the terminal column index at
1315 * which the cursor was left after writing the
1316 * final word in the string. Successful return
1317 * values can thus be passed verbatim to the
1318 * 'start' arguments of subsequent calls to
1319 * gl_display_text() to allow the printing of a
1320 * paragraph to be broken across multiple calls
1321 * to gl_display_text().
1323 int gl_display_text(GetLine
*gl
, int indentation
, const char *prefix
,
1324 const char *suffix
, int fill_char
, int def_width
,
1325 int start
, const char *string
);
1329 * Enumerate the I/O modes supported by gl_get_line().
1332 GL_NORMAL_MODE
, /* Normal line-at-a-time mode using gl_get_line()'s */
1333 /* internal event loop. */
1334 GL_SERVER_MODE
/* Non-blocking server mode, driven by an external */
1338 /*.......................................................................
1339 * Select the I/O mode to be used by gl_get_line().
1342 * gl GetLine * The resource object of gl_get_line().
1343 * mode GlIOMode The I/O mode to establish. Note that
1344 * when server mode, the terminal is placed
1345 * in raw mode, as though gl_raw_io() had
1348 * return int 0 - OK.
1351 int gl_io_mode(GetLine
*gl
, GlIOMode mode
);
1353 /*.......................................................................
1354 * In server mode, this function configures the terminal for non-blocking
1355 * raw terminal I/O. In normal I/O mode it does nothing.
1357 * Callers of this function must be careful to trap all signals that
1358 * terminate or suspend the program, and call gl_normal_io()
1359 * from the corresponding signal handlers in order to restore the
1360 * terminal to its original settings before the program is terminated
1361 * or suspended. They should also trap the SIGCONT signal to detect
1362 * when the program resumes, and ensure that its signal handler
1363 * call gl_raw_io() to redisplay the line and resume editing.
1366 * gl GetLine * The line editor resource object.
1368 * return int 0 - OK.
1371 int gl_raw_io(GetLine
*gl
);
1373 /*.......................................................................
1374 * Restore the terminal to the state that it had when gl_raw_io() was
1375 * last called. After calling gl_raw_io(), this function must be called
1376 * before terminating or suspending the program, and before attempting
1377 * other uses of the terminal from within the program. See gl_raw_io()
1381 * gl GetLine * The line editor resource object.
1383 * return int 0 - OK.
1386 int gl_normal_io(GetLine
*gl
);
1388 /*.......................................................................
1389 * When in non-blocking server mode, this function can be used to abandon
1390 * the current incompletely entered input line, and prepare to start
1391 * editing a new line on the next call to gl_get_line().
1394 * gl GetLine * The line editor resource object.
1396 * return int 0 - OK.
1399 void gl_abandon_line(GetLine
*gl
);
1402 * Enumerators of the following type are used to report why
1403 * gl_get_line() returned. This is most useful in non-blocking
1404 * server mode, since in that mode a NULL return value can mean
1405 * either that an error occurred, or that I/O blocked.
1408 GLR_NEWLINE
, /* A new input line was returned */
1409 GLR_BLOCKED
, /* The terminal was in non-blocking mode, and input */
1410 /* or output would have blocked. */
1411 GLR_SIGNAL
, /* A signal caused gl_get_line() to return. */
1412 GLR_TIMEOUT
, /* An application timeout callback returned GLTO_ABORT */
1413 GLR_FDABORT
, /* An application I/O callack returned GLFD_ABORT */
1414 GLR_EOF
, /* End of file reached */
1415 GLR_ERROR
/* An unexpected error caused gl_get_line() to abort */
1418 /*.......................................................................
1419 * Ask gl_get_line() what caused it to return.
1422 * gl GetLine * The line editor resource object.
1424 * return GlReturnStatus The return status of the last call to
1427 GlReturnStatus
gl_return_status(GetLine
*gl
);
1430 * Enumerate the types of I/O that gl_get_line() can be waiting for
1431 * in non-blocking sedrver I/O mode.
1434 GLP_READ
, /* gl_get_line() is waiting to write to the terminal */
1435 GLP_WRITE
/* gl_get_line() is waiting to read from the terminal */
1438 /*.......................................................................
1439 * In non-blocking server-I/O mode, this function should be called
1440 * from the application's external event loop to see what type of
1441 * terminal I/O is being waited for by gl_get_line(), and thus what
1442 * direction of I/O to wait for with select() or poll().
1445 * gl GetLine * The resource object of gl_get_line().
1447 * return GlPendingIO The type of pending I/O being waited for.
1449 GlPendingIO
gl_pending_io(GetLine
*gl
);
1452 * The following enumerators are returned by externally defined action
1453 * functions to tell gl_get_line() how to procede after the action
1457 GLA_ABORT
, /* Cause gl_get_line() to return NULL */
1458 GLA_RETURN
, /* Return the line as though the user had pressed the */
1460 GLA_CONTINUE
/* Resume command-line editing */
1463 /*.......................................................................
1464 * Functions of the following form implement external
1465 * application-specific action functions, which can then be bound to
1466 * sequences of terminal keys.
1469 * gl GetLine * The line editor resource object.
1470 * data void * The anonymous 'data' argument that was
1471 * passed to gl_external_action() when the
1472 * callback function was registered.
1473 * count int A positive repeat count specified by the user,
1474 * or 1 if not specified. Action functions should
1475 * ignore this if repeating the action multiple
1476 * times isn't appropriate. Alternatively they
1477 * can interpret it as a general numeric
1479 * curpos size_t The position of the cursor within the input
1480 * line, expressed as the index of the
1481 * corresponding character within the line[]
1483 * line const char * A read-only copy of the current input line.
1485 * return GlAfterAction What should gl_get_line() do when the action
1487 * GLA_ABORT - Cause gl_get_line() to
1488 * abort with an error (set
1489 * errno if you need it).
1490 * GLA_RETURN - Return the input line as
1491 * though the user had typed
1493 * GLA_CONTINUE - Resume waiting for keyboard
1496 #define GL_ACTION_FN(fn) GlAfterAction (fn)(GetLine *gl, void *data, \
1497 int count, size_t curpos, const char *line)
1499 typedef GL_ACTION_FN(GlActionFn
);
1501 /*.......................................................................
1502 * Register an application-provided function as an action function.
1503 * This should preferably be called before the first call to gl_get_line()
1504 * so that the name of the action becomes defined before the user's
1505 * configuration file is read.
1508 * gl GetLine * The resource object of the command-line input
1510 * data void * Arbitrary application-specific callback
1511 * data to be passed to the callback
1513 * fn GlActionFn * The application-specific function that
1514 * implements the action. This will be invoked
1515 * whenever the user presses any
1516 * key-sequence which is bound to this action.
1517 * name const char * The name with which users can refer to the
1518 * binding in tecla configuration files.
1519 * keyseq const char * The key sequence with which to invoke
1520 * the binding. This should be specified in the
1521 * same manner as key-sequences in tecla
1522 * configuration files (eg. "M-^I").
1524 * return int 0 - OK.
1527 int gl_register_action(GetLine
*gl
, void *data
, GlActionFn
*fn
,
1528 const char *name
, const char *keyseq
);
1530 /*.......................................................................
1531 * This function is designed to be called by CPL_MATCH_FN() callback
1532 * functions. It adds one possible completion of the token that is being
1533 * completed to an array of completions. If the completion needs any
1534 * special quoting to be valid when displayed in the input line, this
1535 * quoting must be included in the string.
1538 * cpl WordCompletion * The argument of the same name that was passed
1539 * to the calling CPL_MATCH_FN() callback function.
1540 * line const char * The input line, as received by the callback
1542 * word_start int The index within line[] of the start of the
1543 * word that is being completed. If an empty
1544 * string is being completed, set this to be
1545 * the same as word_end.
1546 * word_end int The index within line[] of the character which
1547 * follows the incomplete word, as received by the
1548 * callback function.
1549 * suffix const char * The appropriately quoted string that could
1550 * be appended to the incomplete token to complete
1551 * it. A copy of this string will be allocated
1553 * type_suffix const char * When listing multiple completions, gl_get_line()
1554 * appends this string to the completion to indicate
1555 * its type to the user. If not pertinent pass "".
1556 * Otherwise pass a literal or static string.
1557 * cont_suffix const char * If this turns out to be the only completion,
1558 * gl_get_line() will append this string as
1559 * a continuation. For example, the builtin
1560 * file-completion callback registers a directory
1561 * separator here for directory matches, and a
1562 * space otherwise. If the match were a function
1563 * name you might want to append an open
1564 * parenthesis, etc.. If not relevant pass "".
1565 * Otherwise pass a literal or static string.
1567 * return int 0 - OK.
1570 int cpl_add_completion(WordCompletion
*cpl
, const char *line
,
1571 int word_start
, int word_end
, const char *suffix
,
1572 const char *type_suffix
, const char *cont_suffix
);
1575 * Each possible completion string is recorded in an array element of
1576 * the following type.
1579 char *completion
; /* The matching completion string */
1580 char *suffix
; /* The pointer into completion[] at which the */
1581 /* string was extended. */
1582 const char *type_suffix
; /* A suffix to be added when listing completions */
1583 /* to indicate the type of the completion. */
1587 * Completions are returned in a container of the following form.
1590 char *suffix
; /* The common initial part of all of the */
1591 /* completion suffixes. */
1592 const char *cont_suffix
; /* Optional continuation string to be appended to */
1593 /* the sole completion when nmatch==1. */
1594 CplMatch
*matches
; /* The array of possible completion strings, */
1595 /* sorted into lexical order. */
1596 int nmatch
; /* The number of elements in matches[] */
1599 /*.......................................................................
1600 * Given an input line and the point at which completion is to be
1601 * attempted, return an array of possible completions.
1604 * cpl WordCompletion * The word-completion resource object.
1605 * line const char * The current input line.
1606 * word_end int The index of the character in line[] which
1607 * follows the end of the token that is being
1609 * data void * Anonymous 'data' to be passed to match_fn().
1610 * match_fn CplMatchFn * The function that will identify the prefix
1611 * to be completed from the input line, and
1612 * record completion suffixes.
1614 * return CplMatches * The container of the array of possible
1615 * completions. The returned pointer refers
1616 * to a container owned by the parent Completion
1617 * object, and its contents thus potentially
1618 * change on every call to cpl_complete_word().
1620 CplMatches
*cpl_complete_word(WordCompletion
*cpl
, const char *line
,
1621 int word_end
, void *data
,
1622 CplMatchFn
*match_fn
);
1624 /*.......................................................................
1625 * Recall the return value of the last call to cpl_complete_word().
1628 * cpl WordCompletion * The completion resource object.
1630 * return CplMatches * The container of the array of possible
1631 * completions, as returned by the last call to
1632 * cpl_complete_word(). The returned pointer refers
1633 * to a container owned by the parent WordCompletion
1634 * object, and its contents thus potentially
1635 * change on every call to cpl_complete_word().
1636 * On error, either in the execution of this
1637 * function, or in the last call to
1638 * cpl_complete_word(), NULL is returned, and a
1639 * description of the error can be acquired by
1640 * calling cpl_last_error(cpl).
1642 CplMatches
*cpl_recall_matches(WordCompletion
*cpl
);
1644 /*.......................................................................
1645 * Print out an array of matching completions.
1648 * result CplMatches * The container of the sorted array of
1650 * fp FILE * The output stream to write to.
1651 * term_width int The width of the terminal.
1653 * return int 0 - OK.
1656 int cpl_list_completions(CplMatches
*result
, FILE *fp
, int term_width
);
1658 /*.......................................................................
1659 * Return a description of the error that occurred on the last call to
1660 * cpl_complete_word() or cpl_add_completion().
1663 * cpl WordCompletion * The string-completion resource object.
1665 * return const char * The description of the last error.
1667 const char *cpl_last_error(WordCompletion
*cpl
);
1670 * PathCache objects encapsulate the resources needed to record
1671 * files of interest from comma-separated lists of directories.
1673 typedef struct PathCache PathCache
;
1675 /*.......................................................................
1676 * Create an object who's function is to maintain a cache of filenames
1677 * found within a list of directories, and provide quick lookup and
1678 * completion of selected files in this cache.
1681 * return PathCache * The new, initially empty cache, or NULL
1684 PathCache
*new_PathCache(void);
1686 /*.......................................................................
1687 * Delete a given cache of files, returning the resources that it
1688 * was using to the system.
1691 * pc PathCache * The cache to be deleted (can be NULL).
1693 * return PathCache * The deleted object (ie. allways NULL).
1695 PathCache
*del_PathCache(PathCache
*pc
);
1697 /*.......................................................................
1698 * Return a description of the last path-caching error that occurred.
1701 * pc PathCache * The filename cache that suffered the error.
1703 * return char * The description of the last error.
1705 const char *pca_last_error(PathCache
*pc
);
1707 /*.......................................................................
1708 * Build the list of files of interest contained in a given
1709 * colon-separated list of directories.
1712 * pc PathCache * The cache in which to store the names of
1713 * the files that are found in the list of
1715 * path const char * A colon-separated list of directory
1716 * paths. Under UNIX, when searching for
1717 * executables, this should be the return
1718 * value of getenv("PATH").
1720 * return int 0 - OK.
1721 * 1 - An error occurred.
1723 int pca_scan_path(PathCache
*pc
, const char *path
);
1725 /*.......................................................................
1726 * If you want subsequent calls to pca_lookup_file() and
1727 * pca_path_completions() to only return the filenames of certain
1728 * types of files, for example executables, or filenames ending in
1729 * ".ps", call this function to register a file-selection callback
1730 * function. This callback function takes the full pathname of a file,
1731 * plus application-specific data, and returns 1 if the file is of
1732 * interest, and zero otherwise.
1735 * pc PathCache * The filename cache.
1736 * check_fn CplCheckFn * The function to call to see if the name of
1737 * a given file should be included in the
1738 * cache. This determines what type of files
1739 * will reside in the cache. To revert to
1740 * selecting all files, regardless of type,
1742 * data void * You can pass a pointer to anything you
1743 * like here, including NULL. It will be
1744 * passed to your check_fn() callback
1745 * function, for its private use.
1747 void pca_set_check_fn(PathCache
*pc
, CplCheckFn
*check_fn
, void *data
);
1749 /*.......................................................................
1750 * Given the simple name of a file, search the cached list of files
1751 * in the order in which they where found in the list of directories
1752 * previously presented to pca_scan_path(), and return the pathname
1753 * of the first file which has this name.
1756 * pc PathCache * The cached list of files.
1757 * name const char * The name of the file to lookup.
1758 * name_len int The length of the filename substring at the
1759 * beginning of name[], or -1 to assume that the
1760 * filename occupies the whole of the string.
1761 * literal int If this argument is zero, lone backslashes
1762 * in name[] are ignored during comparison
1763 * with filenames in the cache, under the
1764 * assumption that they were in the input line
1765 * soley to escape the special significance of
1766 * characters like spaces. To have them treated
1767 * as normal characters, give this argument a
1768 * non-zero value, such as 1.
1770 * return char * The pathname of the first matching file,
1771 * or NULL if not found. Note that the returned
1772 * pointer points to memory owned by *pc, and
1773 * will become invalid on the next call.
1775 char *pca_lookup_file(PathCache
*pc
, const char *name
, int name_len
,
1779 * Objects of the following type can be used to change the default
1780 * behavior of the pca_path_completions() callback function.
1782 typedef struct PcaPathConf PcaPathConf
;
1785 * pca_path_completions() is a completion callback function for use directly
1786 * with cpl_complete_word() or gl_customize_completions(), or indirectly
1787 * from your own completion callback function. It requires that a PcaPathConf
1788 * object be passed via its 'void *data' argument (see below).
1790 CPL_MATCH_FN(pca_path_completions
);
1792 /*.......................................................................
1793 * Allocate and initialize a pca_path_completions() configuration object.
1796 * pc PathCache * The filename cache in which to look for
1797 * file name completions.
1799 * return PcaPathConf * The new configuration structure, or NULL
1802 PcaPathConf
*new_PcaPathConf(PathCache
*pc
);
1804 /*.......................................................................
1805 * Deallocate memory, previously allocated by new_PcaPathConf().
1808 * ppc PcaPathConf * Any pointer previously returned by
1809 * new_PcaPathConf() [NULL is allowed].
1811 * return PcaPathConf * The deleted structure (always NULL).
1813 PcaPathConf
*del_PcaPathConf(PcaPathConf
*ppc
);
1816 * If backslashes in the prefix being passed to pca_path_completions()
1817 * should be treated as literal characters, call the following function
1818 * with literal=1. Otherwise the default is to treat them as escape
1819 * characters which remove the special meanings of spaces etc..
1821 void ppc_literal_escapes(PcaPathConf
*ppc
, int literal
);
1824 * Before calling pca_path_completions, call this function if you know
1825 * the index at which the filename prefix starts in the input line.
1826 * Otherwise by default, or if you specify start_index to be -1, the
1827 * filename is taken to start after the first unescaped space preceding
1828 * the cursor, or the start of the line, whichever comes first.
1830 void ppc_file_start(PcaPathConf
*ppc
, int start_index
);