diff options
author | Joel Sherrill <joel.sherrill@oarcorp.com> | 2015-05-27 13:48:33 -0700 |
---|---|---|
committer | Joel Sherrill <joel.sherrill@oarcorp.com> | 2015-05-27 13:48:33 -0700 |
commit | e96199c670ce672049d7f009bd03258649352fc5 (patch) | |
tree | e5f30408253b02c04b349c262d8d9fddfed76d25 /libtecla/man | |
parent | Add libtecla 1.6.3 (diff) | |
download | rtems-addon-packages-e96199c670ce672049d7f009bd03258649352fc5.tar.bz2 |
Rename libtecla to a versioned directory (1.6.3)
Diffstat (limited to 'libtecla/man')
80 files changed, 0 insertions, 5391 deletions
diff --git a/libtecla/man/file/teclarc.in b/libtecla/man/file/teclarc.in deleted file mode 100644 index b5ee705..0000000 --- a/libtecla/man/file/teclarc.in +++ /dev/null @@ -1 +0,0 @@ -.so @MISC_MANDIR@/tecla.@MISC_MANEXT@ diff --git a/libtecla/man/func/cfc_file_start.in b/libtecla/man/func/cfc_file_start.in deleted file mode 100644 index 734f281..0000000 --- a/libtecla/man/func/cfc_file_start.in +++ /dev/null @@ -1 +0,0 @@ -.so @FUNC_MANDIR@/cpl_complete_word.@FUNC_MANEXT@ diff --git a/libtecla/man/func/cfc_literal_escapes.in b/libtecla/man/func/cfc_literal_escapes.in deleted file mode 100644 index 734f281..0000000 --- a/libtecla/man/func/cfc_literal_escapes.in +++ /dev/null @@ -1 +0,0 @@ -.so @FUNC_MANDIR@/cpl_complete_word.@FUNC_MANEXT@ diff --git a/libtecla/man/func/cfc_set_check_fn.in b/libtecla/man/func/cfc_set_check_fn.in deleted file mode 100644 index 734f281..0000000 --- a/libtecla/man/func/cfc_set_check_fn.in +++ /dev/null @@ -1 +0,0 @@ -.so @FUNC_MANDIR@/cpl_complete_word.@FUNC_MANEXT@ diff --git a/libtecla/man/func/cpl_add_completion.in b/libtecla/man/func/cpl_add_completion.in deleted file mode 100644 index 734f281..0000000 --- a/libtecla/man/func/cpl_add_completion.in +++ /dev/null @@ -1 +0,0 @@ -.so @FUNC_MANDIR@/cpl_complete_word.@FUNC_MANEXT@ diff --git a/libtecla/man/func/cpl_complete_word.in b/libtecla/man/func/cpl_complete_word.in deleted file mode 100644 index 2479657..0000000 --- a/libtecla/man/func/cpl_complete_word.in +++ /dev/null @@ -1,441 +0,0 @@ -.\" Copyright (c) 2000, 2001, 2002, 2003, 2004, 2012 by Martin C. Shepherd -.\" -.\" All rights reserved. -.\" -.\" Permission is hereby granted, free of charge, to any person obtaining a -.\" copy of this software and associated documentation files (the -.\" "Software"), to deal in the Software without restriction, including -.\" without limitation the rights to use, copy, modify, merge, publish, -.\" distribute, and/or sell copies of the Software, and to permit persons -.\" to whom the Software is furnished to do so, provided that the above -.\" copyright notice(s) and this permission notice appear in all copies of -.\" the Software and that both the above copyright notice(s) and this -.\" permission notice appear in supporting documentation. -.\" -.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT -.\" OF THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR -.\" HOLDERS INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL -.\" INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING -.\" FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, -.\" NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION -.\" WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -.\" -.\" Except as contained in this notice, the name of a copyright holder -.\" shall not be used in advertising or otherwise to promote the sale, use -.\" or other dealings in this Software without prior written authorization -.\" of the copyright holder. -.TH cpl_complete_word @FUNC_MANEXT@ -.SH NAME -cpl_complete_word, cfc_file_start, cfc_literal_escapes, cfc_set_check_fn, cpl_add_completion, cpl_file_completions, cpl_last_error, cpl_list_completions, cpl_recall_matches, cpl_record_error, del_CplFileConf, del_WordCompletion, new_CplFileConf, new_WordCompletion \- lookup possible completions for a word -.SH SYNOPSIS -.nf -#include <stdio.h> -#include <libtecla.h> - -WordCompletion *new_WordCompletion(void); - -WordCompletion *del_WordCompletion(WordCompletion *cpl); - - -#define CPL_MATCH_FN(fn) int (fn)(WordCompletion *cpl, \\ - void *data, \\ - const char *line, \\ - int word_end) -typedef CPL_MATCH_FN(CplMatchFn); - -CPL_MATCH_FN(cpl_file_completions); - - -CplMatches *cpl_complete_word(WordCompletion *cpl, - const char *line, - int word_end, void *data, - CplMatchFn *match_fn); - -CplMatches *cpl_recall_matches(WordCompletion *cpl); - -int cpl_list_completions(CplMatches *result, FILE *fp, - int term_width); - -int cpl_add_completion(WordCompletion *cpl, - const char *line, int word_start, - int word_end, const char *suffix, - const char *type_suffix, - const char *cont_suffix); - -void cpl_record_error(WordCompletion *cpl, - const char *errmsg); - -const char *cpl_last_error(WordCompletion *cpl); - - -#define CPL_CHECK_FN(fn) int (fn)(void *data, \\ - const char *pathname) - -typedef CPL_CHECK_FN(CplCheckFn); - -CPL_CHECK_FN(cpl_check_exe); - -CplFileConf *new_CplFileConf(void); - -CplFileConf *del_CplFileConf(CplFileConf *cfc); - -void cfc_literal_escapes(CplFileConf *cfc, int literal); - -void cfc_file_start(CplFileConf *cfc, int start_index); - -void cfc_set_check_fn(CplFileConf *cfc, CplCheckFn *chk_fn, - void *chk_data); - -.fi - -.SH DESCRIPTION - -The \f3cpl_complete_word()\f1 function is part of the tecla library -(see the libtecla(@LIBR_MANEXT@) man page). It is usually called behind the scenes -by \f3gl_get_line(@FUNC_MANEXT@)\f1, but can also be called separately. - -Given an input line containing an incomplete word to be completed, it -calls a user-provided callback function (or the provided -file-completion callback function) to look up all possible completion -suffixes for that word. The callback function is expected to look -backward in the line, starting from the specified cursor position, to -find the start of the word to be completed, then to look up all -possible completions of that word and record them, one at a time by -calling \f3cpl_add_completion()\f1. - -.sp -Descriptions of the functions of this module are as follows: -.sp -.nf - WordCompletion *new_WordCompletion(void) -.fi -.sp -This function creates the resources used by the \f3cpl_complete_word()\f1 -function. In particular, it maintains the memory that is used to -return the results of calling \f3cpl_complete_word()\f1. -.sp -.nf - WordCompletion *del_WordCompletion(WordCompletion *cpl) -.fi -.sp -This function deletes the resources that were returned by a previous -call to \f3new_WordCompletion()\f1. It always returns \f3NULL\f1 (ie. a -deleted object). It does nothing if the \f3cpl\f1 argument is -\f3NULL\f1. -.sp -The callback functions which lookup possible completions should be -defined with the following macro (which is defined in libtecla.h). -.sp -.nf - #define CPL_MATCH_FN(fn) int (fn)(WordCompletion *cpl, \\ - void *data, \\ - const char *line, \\ - int word_end) -.fi -.sp -Functions of this type are called by \f3cpl_complete_word()\f1, and -all of the arguments of the callback are those that were passed to -said function. In particular, the \f3line\f1 argument contains the -input line containing the word to be completed, and \f3word_end\f1 is -the index of the character that follows the last character of the -incomplete word within this string. The callback is expected to look -backwards from \f3word_end\f1 for the start of the incomplete -word. What constitutes the start of a word clearly depends on the -application, so it makes sense for the callback to take on this -responsibility. For example, the builtin filename completion function -looks backwards until it hits an unescaped space, or the start of the -line. Having found the start of the word, the callback should then -lookup all possible completions of this word, and record each -completion via separate calls to \f3cpl_add_completion()\f1. If the -callback needs access to an application-specific symbol table, it can -pass it and any other data that it needs, via the \f3data\f1 -argument. This removes any need for globals. -.sp -The callback function should return 0 if no errors occur. On failure -it should return 1, and register a terse description of the error by -calling \f3cpl_record_error()\f1. -.sp -.nf - void cpl_record_error(WordCompletion *cpl, - const char *errmsg); -.fi -.sp -The last error message recorded by calling \f3cpl_record_error()\f1, -can subsequently be queried by calling \f3cpl_last_error()\f1, as -described later. -.sp -.nf - int cpl_add_completion(WordCompletion *cpl, - const char *line, int word_start, - int word_end, const char *suffix, - const char *type_suffix, - const char *cont_suffix); -.fi -.sp -The \f3cpl_add_completion()\f1 function is called zero or more times -by the completion callback function to record each possible completion -in the specified \f3WordCompletion\f1 object. These completions are -subsequently returned by \f3cpl_complete_word()\f1, as described -later. The \f3cpl\f1, \f3line\f1, and \f3word_end\f1 arguments should -be those that were passed to the callback function. The -\f3word_start\f1 argument should be the index within the input line -string of the start of the word that is being completed. This should -equal \f3word_end\f1 if a zero-length string is being completed. The -\f3suffix\f1 argument is the string that would have to be appended to -the incomplete word to complete it. If this needs any quoting -(eg. the addition of backslashes before special charaters) to be valid -within the displayed input line, this should be included. A copy of -the suffix string is allocated internally, so there is no need to -maintain your copy of the string after \f3cpl_add_completion()\f1 -returns. -.sp -Note that in the array of possible completions which the -\f3cpl_complete_word()\f1 function returns, the suffix recorded by -\f3cpl_add_completion()\f1 is listed along with the concatentation of -this suffix with the word that lies between \f3word_start\f1 and -\f3word_end\f1 in the input line. -.sp -The \f3type_suffix\f1 argument specifies an optional string to be -appended to the completion if it is displayed as part of a list of -completions by \f3cpl_list_completions()\f1. The intention is that -this indicate to the user the type of each completion. For example, -the file completion function places a directory separator after -completions that are directories, to indicate their nature to the -user. Similary, if the completion were a function, you could indicate -this to the user by setting \f3type_suffix\f1 to "()". Note that the -\f3type_suffix\f1 string isn't copied, so if the argument isn't a -literal string between speech marks, be sure that the string remains -valid for at least as long as the results of \f3cpl_complete_word()\f1 -are needed. -.sp -The \f3cont_suffix\f1 is a continuation suffix to append to the -completed word in the input line if this is the only completion. This -is something that isn't part of the completion itself, but that gives -the user an indication about how they might continue to extend the -token. For example, the file-completion callback function adds a -directory separator if the completed word is a directory. If the -completed word were a function name, you could similarly aid the user -by arranging for an open parenthesis to be appended. -.sp -.nf - CplMatches *cpl_complete_word(WordCompletion *cpl, - const char *line, - int word_end, void *data, - CplMatchFn *match_fn); -.fi -.sp -The \f3cpl_complete_word()\f1 is normally called behind the scenes by -\f3gl_get_line(@FUNC_MANEXT@)\f1, but can also be called separately if you -separately allocate a \f3WordCompletion\f1 object. It performs word -completion, as described at the beginning of this section. Its first -argument is a resource object previously returned by -\f3new_WordCompletion()\f1. The \f3line\f1 argument is the input line -string, containing the word to be completed. The \f3word_end\f1 -argument contains the index of the character in the input line, that -just follows the last character of the word to be completed. When -called by \f3gl_get_line()\f1, this is the character over which the -user pressed \f3TAB\f1. The \f3match_fn\f3 argument is the function -pointer of the callback function which will lookup possible -completions of the word, as described above, and the \f3data\f1 -argument provides a way for the application to pass arbitrary data to -the callback function. -.sp -If no errors occur, the \f3cpl_complete_word()\f1 function returns a -pointer to a \f3CplMatches\f1 container, as defined below. This -container is allocated as part of the \f3cpl\f1 object that was passed -to \f3cpl_complete_word()\f1, and will thus change on each call which -uses the same \f3cpl\f1 argument. -.sp -.nf - typedef struct { - char *completion; /* A matching completion */ - /* string */ - char *suffix; /* The part of the */ - /* completion string which */ - /* would have to be */ - /* appended to complete the */ - /* original word. */ - const char *type_suffix; /* A suffix to be added when */ - /* listing completions, to */ - /* indicate the type of the */ - /* completion. */ - } CplMatch; - - typedef struct { - char *suffix; /* The common initial part */ - /* of all of the completion */ - /* suffixes. */ - const char *cont_suffix; /* Optional continuation */ - /* string to be appended to */ - /* the sole completion when */ - /* nmatch==1. */ - CplMatch *matches; /* The array of possible */ - /* completion strings, */ - /* sorted into lexical */ - /* order. */ - int nmatch; /* The number of elements in */ - /* the above matches[] */ - /* array. */ - } CplMatches; -.fi -.sp -If an error occurs during completion, \f3cpl_complete_word()\f1 -returns NULL. A description of the error can be acquired by calling -the \f3cpl_last_error()\f3 function. -.sp -.nf - const char *cpl_last_error(WordCompletion *cpl); -.fi -.sp -The \f3cpl_last_error()\f3 function returns a terse description of the -error which occurred on the last call to \f3cpl_complete_word()\f1 or -\f3cpl_add_completion()\f1. -.sp -.nf - CplMatches *cpl_recall_matches(WordCompletion *cpl); -.fi -.sp -As a convenience, the return value of the last call to -\f3cpl_complete_word()\f1 can be recalled at a later time by calling -\f3cpl_recall_matches()\f1. If \f3cpl_complete_word()\f1 returned -\f3NULL\f1, so will \f3cpl_recall_matches()\f1. -.sp -.nf - int cpl_list_completions(CplMatches *result, FILE *fp, - int terminal_width); -.fi -.sp -When the \f3cpl_complete_word()\f1 function returns multiple possible -completions, the \f3cpl_list_completions()\f1 function can be called -upon to list them, suitably arranged across the available width of the -terminal. It arranges for the displayed columns of completions to all -have the same width, set by the longest completion. It also appends -the \f3type_suffix\f1 strings that were recorded with each completion, -thus indicating their types to the user. - -.SH THE BUILT-IN FILENAME-COMPLETION CALLBACK - -By default the \f3gl_get_line(@FUNC_MANEXT@)\f1 function, passes the following -completion callback function to \f3cpl_complete_word()\f1. This -function can also be used separately, either by sending it to -\f3cpl_complete_word()\f1, or by calling it directly from your -own completion callback function. -.sp -.nf - CPL_MATCH_FN(cpl_file_completions); -.fi -.sp -Certain aspects of the behavior of this callback can be changed via -its \f3data\f1 argument. If you are happy with its default behavior -you can pass \f3NULL\f1 in this argument. Otherwise it should be a -pointer to a \f3CplFileConf\f1 object, previously allocated by calling -\f3new_CplFileConf()\f1. -.sp -.nf - CplFileConf *new_CplFileConf(void); -.fi -.sp -\f3CplFileConf\f1 objects encapsulate the configuration parameters of -\f3cpl_file_completions()\f1. These parameters, which start out with -default values, can be changed by calling the accessor functions -described below. -.sp -By default, the \f3cpl_file_completions()\f3 callback function -searches backwards for the start of the filename being completed, -looking for the first un-escaped space or the start of the input -line. If you wish to specify a different location, call -\f3cfc_file_start()\f1 with the index at which the filename starts in -the input line. Passing start_index=-1 re-enables the default -behavior. -.sp -.nf - void cfc_file_start(CplFileConf *cfc, int start_index); -.fi -.sp -By default, when \f3cpl_file_completions()\f1 looks at a filename in -the input line, each lone backslash in the input line is interpreted -as being a special character which removes any special significance of -the character which follows it, such as a space which should be taken -as part of the filename rather than delimiting the start of the -filename. These backslashes are thus ignored while looking for -completions, and subsequently added before spaces, tabs and literal -backslashes in the list of completions. To have unescaped backslashes -treated as normal characters, call \f3cfc_literal_escapes()\f1 with a -non-zero value in its \f3literal\f1 argument. -.sp -.nf - void cfc_literal_escapes(CplFileConf *cfc, int literal); -.fi -.sp -By default, \f3cpl_file_completions()\f1 reports all files who's names -start with the prefix that is being completed. If you only want a -selected subset of these files to be reported in the list of -completions, you can arrange this by providing a callback function -which takes the full pathname of a file, and returns \f30\f1 if the -file should be ignored, or \f31\f1 if the file should be included in -the list of completions. To register such a function for use by -\f3cpl_file_completions()\f1, call \f3cfc_set_check_fn()\f1, and pass -it a pointer to the function, together with a pointer to any data that -you would like passed to this callback whenever it is called. Your -callback can make its decisions based on any property of the file, -such as the filename itself, whether the file is readable, writable or -executable, or even based on what the file contains. -.sp -.nf - #define CPL_CHECK_FN(fn) int (fn)(void *data, \\ - const char *pathname) - typedef CPL_CHECK_FN(CplCheckFn); - - void cfc_set_check_fn(CplFileConf *cfc, - CplCheckFn *chk_fn, void *chk_data); -.fi -.sp -The \f3cpl_check_exe()\f1 function is a provided callback of the above -type, for use with \f3cpl_file_completions()\f1. It returns non-zero -if the filename that it is given represents a normal file that the -user has execute permission to. You could use this to have -\f3cpl_file_completions()\f1 only list completions of executable -files. -.sp -When you have finished with a \f3CplFileConf\f1 variable, you can pass -it to the \f3del_CplFileConf()\f1 destructor function to reclaim its -memory. -.sp -.nf - CplFileConf *del_CplFileConf(CplFileConf *cfc); -.fi -.sp - -.SH THREAD SAFETY - -In multi-threaded programs, you should use the \f3libtecla_r.a\f1 -version of the library. This uses POSIX reentrant functions where -available (hence the \f3_r\f1 suffix), and disables features that rely -on non-reentrant system functions. In the case of this module, the -only disabled feature is username completion in \f3~username/\f1 -expressions, in \f3cpl_file_completions()\f1. - -Using the \f3libtecla_r.a\f1 version of the library, it is safe to use -the facilities of this module in multiple threads, provided that each -thread uses a separately allocated \f3WordCompletion\f1 object. In -other words, if two threads want to do word completion, they should -each call \f3new_WordCompletion()\f1 to allocate their own completion -objects. - -.SH FILES -.nf -libtecla.a - The tecla library -libtecla.h - The tecla header file. -.fi - -.SH SEE ALSO - -.nf -libtecla(@LIBR_MANEXT@), gl_get_line(@FUNC_MANEXT@), ef_expand_file(@FUNC_MANEXT@), -pca_lookup_file(@FUNC_MANEXT@) -.fi - -.SH AUTHOR -Martin Shepherd (mcs@astro.caltech.edu) diff --git a/libtecla/man/func/cpl_file_completions.in b/libtecla/man/func/cpl_file_completions.in deleted file mode 100644 index 734f281..0000000 --- a/libtecla/man/func/cpl_file_completions.in +++ /dev/null @@ -1 +0,0 @@ -.so @FUNC_MANDIR@/cpl_complete_word.@FUNC_MANEXT@ diff --git a/libtecla/man/func/cpl_last_error.in b/libtecla/man/func/cpl_last_error.in deleted file mode 100644 index 734f281..0000000 --- a/libtecla/man/func/cpl_last_error.in +++ /dev/null @@ -1 +0,0 @@ -.so @FUNC_MANDIR@/cpl_complete_word.@FUNC_MANEXT@ diff --git a/libtecla/man/func/cpl_list_completions.in b/libtecla/man/func/cpl_list_completions.in deleted file mode 100644 index 734f281..0000000 --- a/libtecla/man/func/cpl_list_completions.in +++ /dev/null @@ -1 +0,0 @@ -.so @FUNC_MANDIR@/cpl_complete_word.@FUNC_MANEXT@ diff --git a/libtecla/man/func/cpl_recall_matches.in b/libtecla/man/func/cpl_recall_matches.in deleted file mode 100644 index 734f281..0000000 --- a/libtecla/man/func/cpl_recall_matches.in +++ /dev/null @@ -1 +0,0 @@ -.so @FUNC_MANDIR@/cpl_complete_word.@FUNC_MANEXT@ diff --git a/libtecla/man/func/cpl_record_error.in b/libtecla/man/func/cpl_record_error.in deleted file mode 100644 index 734f281..0000000 --- a/libtecla/man/func/cpl_record_error.in +++ /dev/null @@ -1 +0,0 @@ -.so @FUNC_MANDIR@/cpl_complete_word.@FUNC_MANEXT@ diff --git a/libtecla/man/func/del_CplFileConf.in b/libtecla/man/func/del_CplFileConf.in deleted file mode 100644 index 734f281..0000000 --- a/libtecla/man/func/del_CplFileConf.in +++ /dev/null @@ -1 +0,0 @@ -.so @FUNC_MANDIR@/cpl_complete_word.@FUNC_MANEXT@ diff --git a/libtecla/man/func/del_ExpandFile.in b/libtecla/man/func/del_ExpandFile.in deleted file mode 100644 index 3d0a884..0000000 --- a/libtecla/man/func/del_ExpandFile.in +++ /dev/null @@ -1 +0,0 @@ -.so @FUNC_MANDIR@/ef_expand_file.@FUNC_MANEXT@ diff --git a/libtecla/man/func/del_GetLine.in b/libtecla/man/func/del_GetLine.in deleted file mode 100644 index 6e46fc6..0000000 --- a/libtecla/man/func/del_GetLine.in +++ /dev/null @@ -1 +0,0 @@ -.so @FUNC_MANDIR@/gl_get_line.@FUNC_MANEXT@ diff --git a/libtecla/man/func/del_PathCache.in b/libtecla/man/func/del_PathCache.in deleted file mode 100644 index dbc4da7..0000000 --- a/libtecla/man/func/del_PathCache.in +++ /dev/null @@ -1 +0,0 @@ -.so @FUNC_MANDIR@/pca_lookup_file.@FUNC_MANEXT@ diff --git a/libtecla/man/func/del_PcaPathConf.in b/libtecla/man/func/del_PcaPathConf.in deleted file mode 100644 index dbc4da7..0000000 --- a/libtecla/man/func/del_PcaPathConf.in +++ /dev/null @@ -1 +0,0 @@ -.so @FUNC_MANDIR@/pca_lookup_file.@FUNC_MANEXT@ diff --git a/libtecla/man/func/del_WordCompletion.in b/libtecla/man/func/del_WordCompletion.in deleted file mode 100644 index 734f281..0000000 --- a/libtecla/man/func/del_WordCompletion.in +++ /dev/null @@ -1 +0,0 @@ -.so @FUNC_MANDIR@/cpl_complete_word.@FUNC_MANEXT@ diff --git a/libtecla/man/func/ef_expand_file.in b/libtecla/man/func/ef_expand_file.in deleted file mode 100644 index 6637f9f..0000000 --- a/libtecla/man/func/ef_expand_file.in +++ /dev/null @@ -1,248 +0,0 @@ -.\" Copyright (c) 2000, 2001, 2002, 2003, 2004, 2012 by Martin C. Shepherd -.\" -.\" All rights reserved. -.\" -.\" Permission is hereby granted, free of charge, to any person obtaining a -.\" copy of this software and associated documentation files (the -.\" "Software"), to deal in the Software without restriction, including -.\" without limitation the rights to use, copy, modify, merge, publish, -.\" distribute, and/or sell copies of the Software, and to permit persons -.\" to whom the Software is furnished to do so, provided that the above -.\" copyright notice(s) and this permission notice appear in all copies of -.\" the Software and that both the above copyright notice(s) and this -.\" permission notice appear in supporting documentation. -.\" -.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT -.\" OF THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR -.\" HOLDERS INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL -.\" INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING -.\" FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, -.\" NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION -.\" WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -.\" -.\" Except as contained in this notice, the name of a copyright holder -.\" shall not be used in advertising or otherwise to promote the sale, use -.\" or other dealings in this Software without prior written authorization -.\" of the copyright holder. -.TH ef_expand_file @FUNC_MANEXT@ -.SH NAME -ef_expand_file, del_ExpandFile, ef_last_error, ef_list_expansions, new_ExpandFile \- expand filenames containing ~user/$envvar and wildcard expressions -.SH SYNOPSIS -.nf -#include <libtecla.h> - -ExpandFile *new_ExpandFile(void); - -ExpandFile *del_ExpandFile(ExpandFile *ef); - -FileExpansion *ef_expand_file(ExpandFile *ef, - const char *path, - int pathlen); - -int ef_list_expansions(FileExpansion *result, FILE *fp, - int term_width); - -const char *ef_last_error(ExpandFile *ef); -.fi - -.SH DESCRIPTION - -The \f3ef_expand_file()\f1 function is part of the tecla library -(see the libtecla(@LIBR_MANEXT@) man page). It expands a specified filename, -converting \f3~user/\f1 and \f3~/\f1 expressions at the start of the -filename to the corresponding home directories, replacing -\f3$envvar\f1 with the value of the corresponding environment -variable, and then, if there are any wildcards, matching these against -existing filenames. Backslashes in the input filename are interpreted -as escaping any special meanings of the characters that follow them. -Only backslahes that are themselves preceded by backslashes are -preserved in the expanded filename. -.sp -In the presence of wildcards, the returned list of filenames only -includes the names of existing files which match the -wildcards. Otherwise, the original filename is returned after -expansion of tilde and dollar expressions, and the result is not -checked against existing files. This mimics the file-globbing behavior -of the unix \f3tcsh\f1 shell. -.sp -The supported wildcards and their meanings are: -.nf - * - Match any sequence of zero or more characters. - ? - Match any single character. - [chars] - Match any single character that appears in - 'chars'. If 'chars' contains an expression of - the form a-b, then any character between a and - b, including a and b, matches. The '-' - character looses its special meaning as a - range specifier when it appears at the start - of the sequence of characters. The ']' - character also looses its significance as the - terminator of the range expression if it - appears immediately after the opening '[', at - which point it is treated one of the - characters of the range. If you want both '-' - and ']' to be part of the range, the '-' - should come first and the ']' second. - - [^chars] - The same as [chars] except that it matches any - single character that doesn't appear in - 'chars'. -.fi - -Note that wildcards never match the initial dot in filenames that -start with '.'. The initial '.' must be explicitly specified in the -filename. This again mimics the globbing behavior of most unix shells, -and its rational is based in the fact that in unix, files with names -that start with '.' are usually hidden configuration files, which are -not listed by default by the ls command. -.sp -The following is a complete example of how to use the file expansion -function. - -.nf - #include <stdio.h> - #include <libtecla.h> - - int main(int argc, char *argv[]) - { - ExpandFile *ef; /* The expansion resource object */ - char *filename; /* The filename being expanded */ - FileExpansion *expn; /* The results of the expansion */ - int i; - - ef = new_ExpandFile(); - if(!ef) - return 1; - - for(arg = *(argv++); arg; arg = *(argv++)) { - if((expn = ef_expand_file(ef, arg, -1)) == NULL) { - fprintf(stderr, "Error expanding %s (%s).\\n", arg, - ef_last_error(ef)); - } else { - printf("%s matches the following files:\\n", arg); - for(i=0; i<expn->nfile; i++) - printf(" %s\\n", expn->files[i]); - } - } - - ef = del_ExpandFile(ef); - return 0; - } -.fi -.sp -Descriptions of the functions used above are as follows: -.sp -.nf - ExpandFile *new_ExpandFile(void) -.fi -.sp -This function creates the resources used by the \f3ef_expand_file()\f1 -function. In particular, it maintains the memory that is used to record the -array of matching filenames that is returned by \f3ef_expand_file()\f1. This -array is expanded as needed, so there is no built in limit to the number of -files that can be matched. -.sp -.nf - ExpandFile *del_ExpandFile(ExpandFile *ef) -.fi -.sp -This function deletes the resources that were returned by a previous call to -\f3new_ExpandFile()\f1. It always returns \f3NULL\f1 (ie a deleted object). It -does nothing if the \f3ef\f1 argument is \f3NULL\f1. -.sp -A container of the following type is returned by \f3ef_expand_file()\f1. -.sp -.nf - typedef struct { - int exists; /* True if the files in files[] exist */ - int nfile; /* The number of files in files[] */ - char **files; /* An array of 'nfile' filenames. */ - } FileExpansion; -.fi -.sp -.nf - FileExpansion *ef_expand_file(ExpandFile *ef, - const char *path, - int pathlen) -.fi -.sp -The \f3ef_expand_file()\f1 function performs filename expansion, as documented -at the start of this section. Its first argument is a resource object returned -by \f3new_ExpandFile()\f1. A pointer to the start of the filename to be matched -is passed via the \f3path\f1 argument. This must be a normal \f3NUL\f1 -terminated string, but unless a length of -1 is passed in \f3pathlen\f1, only -the first \f3pathlen\f1 characters will be used in the filename expansion. If -the length is specified as -1, the whole of the string will be -expanded. -.sp -The function returns a pointer to a container who's contents are the -results of the expansion. If there were no wildcards in the filename, -the \f3nfile\f1 member will be 1, and the \f3exists\f1 member should -be queried if it is important to know if the expanded file currently -exists or not. If there were wildcards, then the contained -\f3files[]\f1 array will contain the names of the \f3nfile\f1 existing -files that matched the wildcarded filename, and the \f3exists\f1 -member will have the value 1. Note that the returned container belongs -to the specified \f3ef\f1 object, and its contents will change on each -call, so if you need to retain the results of more than one call to -\f3ef_expand_file()\f1, you should either make a private copy of the -returned results, or create multiple file-expansion resource objects -via multiple calls to \f3new_ExpandFile()\f1. -.sp -On error, \f3NULL\f1 is returned, and an explanation of the error can -be determined by calling \f3ef_last_error(ef)\f1. -.sp -.nf - const char *ef_last_error(ExpandFile *ef) -.fi -.sp -This function returns the message which describes the error that -occurred on the last call to \f3ef_expand_file()\f1, for the given -\f3(ExpandFile *ef)\f1 resource object. -.sp -.nf - int ef_list_expansions(FileExpansion *result, FILE *fp, - int terminal_width); -.fi -.sp -The \f3ef_list_expansions()\f1 function provides a convenient way to -list the filename expansions returned by \f3ef_expand_file()\f1. Like -the unix \f3ls\f1 command, it arranges the filenames into equal width -columns, each column having the width of the largest file. The number -of columns used is thus determined by the length of the longest -filename, and the specified terminal width. Beware that filenames that -are longer than the specified terminal width are printed without being -truncated, so output longer than the specified terminal width can -occur. The list is written to the stdio stream specified by the -\f3fp\f1 argument. - -.SH THREAD SAFETY - -In multi-threaded programs, you should use the \f3libtecla_r.a\f1 -version of the library. This uses POSIX reentrant functions where -available (hence the \f3_r\f1 suffix), and disables features that rely -on non-reentrant system functions. Currently there are no features -disabled in this module. - -Using the \f3libtecla_r.a\f1 version of the library, it is safe to use -the facilities of this module in multiple threads, provided that each -thread uses a separately allocated \f3ExpandFile\f1 object. In other -words, if two threads want to do file expansion, they should each call -\f3new_ExpandFile()\f1 to allocate their own file-expansion objects. - -.SH FILES -.nf -libtecla.a - The tecla library -libtecla.h - The tecla header file. -.fi - -.SH SEE ALSO -.nf -libtecla(@LIBR_MANEXT@), gl_get_line(@FUNC_MANEXT@), cpl_complete_word(@FUNC_MANEXT@), -pca_lookup_file(@FUNC_MANEXT@) -.fi - -.SH AUTHOR -Martin Shepherd (mcs@astro.caltech.edu) diff --git a/libtecla/man/func/ef_last_error.in b/libtecla/man/func/ef_last_error.in deleted file mode 100644 index 3d0a884..0000000 --- a/libtecla/man/func/ef_last_error.in +++ /dev/null @@ -1 +0,0 @@ -.so @FUNC_MANDIR@/ef_expand_file.@FUNC_MANEXT@ diff --git a/libtecla/man/func/ef_list_expansions.in b/libtecla/man/func/ef_list_expansions.in deleted file mode 100644 index 3d0a884..0000000 --- a/libtecla/man/func/ef_list_expansions.in +++ /dev/null @@ -1 +0,0 @@ -.so @FUNC_MANDIR@/ef_expand_file.@FUNC_MANEXT@ diff --git a/libtecla/man/func/gl_abandon_line.in b/libtecla/man/func/gl_abandon_line.in deleted file mode 100644 index 24798bc..0000000 --- a/libtecla/man/func/gl_abandon_line.in +++ /dev/null @@ -1 +0,0 @@ -.so @FUNC_MANDIR@/gl_io_mode.@FUNC_MANEXT@ diff --git a/libtecla/man/func/gl_bind_keyseq.in b/libtecla/man/func/gl_bind_keyseq.in deleted file mode 100644 index 6e46fc6..0000000 --- a/libtecla/man/func/gl_bind_keyseq.in +++ /dev/null @@ -1 +0,0 @@ -.so @FUNC_MANDIR@/gl_get_line.@FUNC_MANEXT@ diff --git a/libtecla/man/func/gl_catch_blocked.in b/libtecla/man/func/gl_catch_blocked.in deleted file mode 100644 index 6e46fc6..0000000 --- a/libtecla/man/func/gl_catch_blocked.in +++ /dev/null @@ -1 +0,0 @@ -.so @FUNC_MANDIR@/gl_get_line.@FUNC_MANEXT@ diff --git a/libtecla/man/func/gl_change_terminal.in b/libtecla/man/func/gl_change_terminal.in deleted file mode 100644 index 6e46fc6..0000000 --- a/libtecla/man/func/gl_change_terminal.in +++ /dev/null @@ -1 +0,0 @@ -.so @FUNC_MANDIR@/gl_get_line.@FUNC_MANEXT@ diff --git a/libtecla/man/func/gl_clear_history.in b/libtecla/man/func/gl_clear_history.in deleted file mode 100644 index 6e46fc6..0000000 --- a/libtecla/man/func/gl_clear_history.in +++ /dev/null @@ -1 +0,0 @@ -.so @FUNC_MANDIR@/gl_get_line.@FUNC_MANEXT@ diff --git a/libtecla/man/func/gl_completion_action.in b/libtecla/man/func/gl_completion_action.in deleted file mode 100644 index 6e46fc6..0000000 --- a/libtecla/man/func/gl_completion_action.in +++ /dev/null @@ -1 +0,0 @@ -.so @FUNC_MANDIR@/gl_get_line.@FUNC_MANEXT@ diff --git a/libtecla/man/func/gl_configure_getline.in b/libtecla/man/func/gl_configure_getline.in deleted file mode 100644 index 6e46fc6..0000000 --- a/libtecla/man/func/gl_configure_getline.in +++ /dev/null @@ -1 +0,0 @@ -.so @FUNC_MANDIR@/gl_get_line.@FUNC_MANEXT@ diff --git a/libtecla/man/func/gl_customize_completion.in b/libtecla/man/func/gl_customize_completion.in deleted file mode 100644 index 6e46fc6..0000000 --- a/libtecla/man/func/gl_customize_completion.in +++ /dev/null @@ -1 +0,0 @@ -.so @FUNC_MANDIR@/gl_get_line.@FUNC_MANEXT@ diff --git a/libtecla/man/func/gl_display_text.in b/libtecla/man/func/gl_display_text.in deleted file mode 100644 index 6e46fc6..0000000 --- a/libtecla/man/func/gl_display_text.in +++ /dev/null @@ -1 +0,0 @@ -.so @FUNC_MANDIR@/gl_get_line.@FUNC_MANEXT@ diff --git a/libtecla/man/func/gl_echo_mode.in b/libtecla/man/func/gl_echo_mode.in deleted file mode 100644 index 6e46fc6..0000000 --- a/libtecla/man/func/gl_echo_mode.in +++ /dev/null @@ -1 +0,0 @@ -.so @FUNC_MANDIR@/gl_get_line.@FUNC_MANEXT@ diff --git a/libtecla/man/func/gl_erase_terminal.in b/libtecla/man/func/gl_erase_terminal.in deleted file mode 100644 index 6e46fc6..0000000 --- a/libtecla/man/func/gl_erase_terminal.in +++ /dev/null @@ -1 +0,0 @@ -.so @FUNC_MANDIR@/gl_get_line.@FUNC_MANEXT@ diff --git a/libtecla/man/func/gl_error_message.in b/libtecla/man/func/gl_error_message.in deleted file mode 100644 index 6e46fc6..0000000 --- a/libtecla/man/func/gl_error_message.in +++ /dev/null @@ -1 +0,0 @@ -.so @FUNC_MANDIR@/gl_get_line.@FUNC_MANEXT@ diff --git a/libtecla/man/func/gl_get_line.in b/libtecla/man/func/gl_get_line.in deleted file mode 100644 index ba0df8d..0000000 --- a/libtecla/man/func/gl_get_line.in +++ /dev/null @@ -1,2236 +0,0 @@ -.\" Copyright (c) 2000, 2001, 2002, 2003, 2004, 2012 by Martin C. Shepherd -.\" -.\" All rights reserved. -.\" -.\" Permission is hereby granted, free of charge, to any person obtaining a -.\" copy of this software and associated documentation files (the -.\" "Software"), to deal in the Software without restriction, including -.\" without limitation the rights to use, copy, modify, merge, publish, -.\" distribute, and/or sell copies of the Software, and to permit persons -.\" to whom the Software is furnished to do so, provided that the above -.\" copyright notice(s) and this permission notice appear in all copies of -.\" the Software and that both the above copyright notice(s) and this -.\" permission notice appear in supporting documentation. -.\" -.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT -.\" OF THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR -.\" HOLDERS INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL -.\" INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING -.\" FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, -.\" NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION -.\" WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -.\" -.\" Except as contained in this notice, the name of a copyright holder -.\" shall not be used in advertising or otherwise to promote the sale, use -.\" or other dealings in this Software without prior written authorization -.\" of the copyright holder. -.TH gl_get_line @FUNC_MANEXT@ -.SH NAME -gl_get_line, new_GetLine, del_GetLine, gl_customize_completion, -gl_change_terminal, gl_configure_getline, gl_load_history, -gl_save_history, gl_group_history, gl_show_history, gl_watch_fd, -gl_inactivity_timeout, gl_terminal_size, gl_set_term_size, -gl_resize_history, gl_limit_history, gl_clear_history, -gl_toggle_history, gl_lookup_history, gl_state_of_history, -gl_range_of_history, gl_size_of_history, gl_echo_mode, -gl_replace_prompt, gl_prompt_style, gl_ignore_signal, gl_trap_signal, -gl_last_signal, gl_completion_action, gl_display_text, -gl_return_status, gl_error_message, gl_catch_blocked, gl_list_signals, -gl_bind_keyseq, gl_erase_terminal, gl_automatic_history, gl_append_history, -gl_query_char, gl_read_char \- allow the user to compose an input line -.SH SYNOPSIS -.nf -#include <stdio.h> -#include <libtecla.h> - -GetLine *new_GetLine(size_t linelen, size_t histlen); - -GetLine *del_GetLine(GetLine *gl); - -char *gl_get_line(GetLine *gl, const char *prompt, - const char *start_line, int start_pos); - -int gl_query_char(GetLine *gl, const char *prompt, - char defchar); - -int gl_read_char(GetLine *gl); - -int gl_customize_completion(GetLine *gl, void *data, - CplMatchFn *match_fn); - -int gl_change_terminal(GetLine *gl, FILE *input_fp, - FILE *output_fp, const char *term); - -int gl_configure_getline(GetLine *gl, - const char *app_string, - const char *app_file, - const char *user_file); - -int gl_bind_keyseq(GetLine *gl, GlKeyOrigin origin, - const char *keyseq, const char *action); - -int gl_save_history(GetLine *gl, const char *filename, - const char *comment, int max_lines); - -int gl_load_history(GetLine *gl, const char *filename, - const char *comment); - -int gl_watch_fd(GetLine *gl, int fd, GlFdEvent event, - GlFdEventFn *callback, void *data); - -int gl_inactivity_timeout(GetLine *gl, GlTimeoutFn *callback, - void *data, unsigned long sec, - unsigned long nsec); - -int gl_group_history(GetLine *gl, unsigned stream); - -int gl_show_history(GetLine *gl, FILE *fp, - const char *fmt, int all_groups, - int max_lines); - -int gl_resize_history(GetLine *gl, size_t bufsize); - -void gl_limit_history(GetLine *gl, int max_lines); - -void gl_clear_history(GetLine *gl, int all_groups); - -void gl_toggle_history(GetLine *gl, int enable); - -GlTerminalSize gl_terminal_size(GetLine *gl, - int def_ncolumn, - int def_nline); - -int gl_set_term_size(GetLine *gl, int ncolumn, int nline); - -int gl_lookup_history(GetLine *gl, unsigned long id, - GlHistoryLine *hline); - -void gl_state_of_history(GetLine *gl, - GlHistoryState *state); - -void gl_range_of_history(GetLine *gl, - GlHistoryRange *range); - -void gl_size_of_history(GetLine *gl, GlHistorySize *size); - -void gl_echo_mode(GetLine *gl, int enable); - -void gl_replace_prompt(GetLine *gl, const char *prompt); - -void gl_prompt_style(GetLine *gl, GlPromptStyle style); - -int gl_ignore_signal(GetLine *gl, int signo); - -int gl_trap_signal(GetLine *gl, int signo, unsigned flags, - GlAfterSignal after, int errno_value); - -int gl_last_signal(GetLine *gl); - -int gl_completion_action(GetLine *gl, - void *data, CplMatchFn *match_fn, - int list_only, const char *name, - const char *keyseq); - -int gl_register_action(GetLine *gl, void *data, - GlActionFn *fn, const char *name, - const char *keyseq); - -int gl_display_text(GetLine *gl, int indentation, - const char *prefix, - const char *suffix, int fill_char, - int def_width, int start, - const char *string); - -GlReturnStatus gl_return_status(GetLine *gl); - -const char *gl_error_message(GetLine *gl, char *buff, - size_t n); - -void gl_catch_blocked(GetLine *gl); - -int gl_list_signals(GetLine *gl, sigset_t *set); - -int gl_append_history(GetLine *gl, const char *line); - -int gl_automatic_history(GetLine *gl, int enable); - -.fi - -.SH DESCRIPTION - -The \f3gl_get_line()\f1 function is part of the tecla library (see the -\f3libtecla(@LIBR_MANEXT@)\f1 man page). If the user is typing at a terminal, each -call prompts them for an line of input, then provides interactive -editing facilities, similar to those of the unix \f3tcsh\f1 shell. In -addition to simple command-line editing, it supports recall of -previously entered command lines, TAB completion of file names, and -in-line wild-card expansion of filenames. Documentation of both the -user-level command-line editing features and all user configuration -options, can be found in the \f3tecla(@MISC_MANEXT@)\f1 man page. This man page -concerns itself with documentation for programmers interested in using -this library in their application. -.sp -.SH AN EXAMPLE - -The following shows a complete example of how to use the -\f3gl_get_line()\f1 function to get input from the user: - -.nf - #include <stdio.h> - #include <locale.h> - #include <libtecla.h> - - int main(int argc, char *argv[]) - { - char *line; /* The line that the user typed */ - GetLine *gl; /* The gl_get_line() resource object */ - - setlocale(LC_CTYPE, ""); /* Adopt the user's choice */ - /* of character set. */ - - gl = new_GetLine(1024, 2048); - if(!gl) - return 1; - - while((line=gl_get_line(gl, "$ ", NULL, -1)) != NULL && - strcmp(line, "exit\\n") != 0) - printf("You typed: %s\\n", line); - - gl = del_GetLine(gl); - return 0; - } -.fi -.sp -In the example, first the resources needed by the \f3gl_get_line()\f1 function -are created by calling \f3new_GetLine()\f1. This allocates the memory used in -subsequent calls to the \f3gl_get_line()\f1 function, including the history -buffer for recording previously entered lines. Then one or more lines are read -from the user, until either an error occurs, or the user types \f3exit\f1. Then -finally the resources that were allocated by \f3new_GetLine()\f1, are returned -to the system by calling \f3del_GetLine()\f1. Note the use of the \f3NULL\f1 -return value of \f3del_GetLine()\f1 to make \f3gl\f1 \f3NULL\f1. This is a -safety precaution. If the program subsequently attempts to pass \f3gl\f1 to -\f3gl_get_line()\f1, said function will complain, and return an error, instead of -attempting to use the deleted resource object. - -.sp -.SH THE FUNCTIONS USED IN THE EXAMPLE -The descriptions of the functions used in the example are as follows: -.sp -.nf - GetLine *new_GetLine(size_t linelen, size_t histlen) -.fi -.sp -This function creates the resources used by the \f3gl_get_line()\f1 -function and returns an opaque pointer to the object that contains -them. The maximum length of an input line is specified via the -\f3linelen\f1 argument, and the number of bytes to allocate for -storing history lines is set by the \f3histlen\f1 argument. History -lines are stored back-to-back in a single buffer of this size. Note -that this means that the number of history lines that can be stored at -any given time, depends on the lengths of the individual lines. If -you want to place an upper limit on the number of lines that can be -stored, see the \f3gl_limit_history()\f1 function described later. If -you don't want history at all, specify \f3histlen\f1 as zero, and no -history buffer will be allocated. -.sp -On error, a message is printed to \f3stderr\f1 and \f3NULL\f1 is returned. -.sp -.nf - GetLine *del_GetLine(GetLine *gl) -.fi -.sp -This function deletes the resources that were returned by a previous -call to \f3new_GetLine()\f1. It always returns \f3NULL\f1 (ie a -deleted object). It does nothing if the \f3gl\f1 argument is -\f3NULL\f1. -.sp -.nf - char *gl_get_line(GetLine *gl, const char *prompt, - const char *start_line, int start_pos); -.fi -.sp -The \f3gl_get_line()\f1 function can be called any number of -times to read input from the user. The \f3gl\f1 argument -must have been previously returned by a call to -\f3new_GetLine()\f1. The \f3prompt\f1 argument should be a -normal \f3NUL\f1 terminated string, specifying the prompt to -present the user with. By default prompts are displayed -literally, but if enabled with the \f3gl_prompt_style()\f1 -function (see later), prompts can contain directives to do -underlining, switch to and from bold fonts, or turn -highlighting on and off. - -If you want to specify the initial contents of the line, for the user -to edit, pass the desired string via the \f3start_line\f1 -argument. You can then specify which character of this line the cursor -is initially positioned over, using the \f3start_pos\f1 argument. This -should be -1 if you want the cursor to follow the last character of -the start line. If you don't want to preload the line in this manner, -send \f3start_line\f1 as \f3NULL\f1, and set \f3start_pos\f1 to --1. Note that the line pointer returned by one call to -\f3gl_get_line()\f1 can be passed back to the next call to -\f3gl_get_line()\f1 via the \f3start_line\f1. This allows the -application to take the last entered line, and if it contains an -error, to then present it back to the user for re-editing, with the -cursor initially positioned where the error was encountered. - -The \f3gl_get_line()\f1 function returns a pointer to the line entered -by the user, or \f3NULL\f1 on error or at the end of the input. The -returned pointer is part of the specified \f3gl\f1 resource object, -and thus should not be free'd by the caller, or assumed to be -unchanging from one call to the next. When reading from a user at a -terminal, there will always be a newline character at the end of the -returned line. When standard input is being taken from a pipe or a -file, there will similarly be a newline unless the input line was too -long to store in the internal buffer. In the latter case you should -call \f3gl_get_line()\f1 again to read the rest of the line. Note that -this behavior makes \f3gl_get_line()\f1 similar to \f3fgets()\f1. In -fact when \f3stdin\f1 isn't connected to a terminal,\f3gl_get_line()\f1 -just calls \f3fgets()\f1. - -.SH THE RETURN STATUS OF GL_GET_LINE - -As described above, the \f3gl_get_line()\f1 function has two possible -return values; a pointer to the completed input line, or -\f3NULL\f1. Extra information about what caused \f3gl_get_line()\f1 to -return is available both by inspecting \f3errno\f1, and by calling the -\f3gl_return_status()\f1 function. - -.sp -.nf - GlReturnStatus gl_return_status(GetLine *gl); -.fi -.sp - -The following are the possible enumerated values that this -function returns. - -.sp -.nf - GLR_NEWLINE - The last call to \f3gl_get_line()\f1 - successfully returned a completed - input line. - - GLR_BLOCKED - \f3gl_get_line()\f1 was in non-blocking - server mode, and returned early to - avoid blocking the process while - waiting for terminal I/O. The - \f3gl_pending_io()\f1 function can be - used to see what type of I/O - \f3gl_get_line()\f1 was waiting for. - (see the \f3gl_io_mode(@FUNC_MANEXT@)\f1 man page - for details). - - GLR_SIGNAL - A signal was caught by - \f3gl_get_line()\f1 that had an - after-signal disposition of - \f3GLS_ABORT\f1 (See \f3gl_trap_signal()\f1). - - GLR_TIMEOUT - The inactivity timer expired while - \f3gl_get_line()\f1 was waiting for - input, and the timeout callback - function returned \f3GLTO_ABORT\f1. - See \f3gl_inactivity_timeout()\f1 for - information about timeouts. - - GLR_FDABORT - An application I/O callack returned - \f3GLFD_ABORT\f1 (see \f3gl_watch_fd()\f1). - - GLR_EOF - End of file reached. This can happen - when input is coming from a file or a - pipe, instead of the terminal. It also - occurs if the user invokes the - \f3list-or-eof\f1 or \f3del-char-or-list-or-eof\f1 - actions at the start of a new line. - - GLR_ERROR - An unexpected error caused - \f3gl_get_line()\f1 to abort (consult - \f3errno\f1 and/or - \f3gl_error_message()\f1 for details. -.fi -.sp - -When \f3gl_return_status()\f1 returns \f3GLR_ERROR\f1, and the -value of \f3errno\f1 isn't sufficient to explain what -happened, you can use the \f3gl_error_message()\f1 function -to request a description of the last error that occurred. - -.sp -.nf - const char *gl_error_message(GetLine *gl, char *buff, - size_t n); -.fi -.sp - -The return value is a pointer to the message that -occurred. If the \f3buff\f1 argument is \f3NULL\f1, this -will be a pointer to a buffer within \f3gl\f1, who's value -will probably change on the next call to any function -associated with \f3gl_get_line()\f1. Otherwise, if a -non-\f3NULL\f1 \f3buff\f1 argument is provided, the error -message, including a \f3'\\0'\f1 terminator, will be written -within the first \f3n\f1 elements of this buffer, and the -return value will be a pointer to the first element of this -buffer. If the message won't fit in the provided buffer, it -will be truncated to fit. - -.SH OPTIONAL PROMPT FORMATTING - -Whereas by default the prompt string that you specify is -displayed literally, without any special interpretation of -the characters within it, the \f3gl_prompt_style()\f1 -function can be used to enable optional formatting -directives within the prompt. -.sp -.nf - void gl_prompt_style(GetLine *gl, GlPromptStyle style); -.fi -.sp -The \f3style\f1 argument, which specifies the formatting -style, can take any of the following values: -.sp -.nf - GL_FORMAT_PROMPT - In this style, the formatting - directives described below, when - included in prompt strings, are - interpreted as follows: - - %B - Display subsequent - characters with a bold - font. - %b - Stop displaying characters - with the bold font. - %F - Make subsequent characters - flash. - %f - Turn off flashing - characters. - %U - Underline subsequent - characters. - %u - Stop underlining - characters. - %P - Switch to a pale (half - brightness) font. - %p - Stop using the pale font. - %S - Highlight subsequent - characters (also known as - standout mode). - %s - Stop highlighting - characters. - %V - Turn on reverse video. - %v - Turn off reverse video. - %% - Display a single % - character. - - For example, in this mode, a prompt - string like \f3"%UOK%u$ "\f1 would - display the prompt \f3"OK$ "\f1, - but with the \f3OK\f1 part - underlined. - - Note that although a pair of - characters that starts with a % - character, but doesn't match any of - the above directives is displayed - literally, if a new directive is - subsequently introduced which does - match, the displayed prompt will - change, so it is better to always - use %% to display a literal %. - - Also note that not all terminals - support all of these text - attributes, and that some substitute - a different attribute for missing - ones. - - GL_LITERAL_PROMPT - In this style, the prompt string is - printed literally. This is the - default style. -.fi - -.SH ALTERNATE CONFIGURATION SOURCES - -As mentioned above, by default users have the option of configuring -the behavior of \f3gl_get_line()\f1 via a configuration file called -\f3\&.teclarc\f1 in their home directories. The fact that all -applications share this same configuration file is both an advantage -and a disadvantage. In most cases it is an advantage, since it -encourages uniformity, and frees the user from having to configure -each application separately. In some applications, however, this -single means of configuration is a problem. This is particularly true -of embedded software, where there's no filesystem to read a -configuration file from, and also in applications where a radically -different choice of keybindings is needed to emulate a legacy keyboard -interface. To cater for such cases, the following function allows the -application to control where configuration information is read from. - -.sp -.nf - int gl_configure_getline(GetLine *gl, - const char *app_string, - const char *app_file, - const char *user_file); -.fi -.sp - -It allows the configuration commands that would normally be read from -a user's \f3~/.teclarc\f1 file, to be read from any or none of, a -string, an application specific configuration file, and/or a -user-specific configuration file. If this function is called before -the first call to \f3gl_get_line()\f1, the default behavior of -reading \f3~/.teclarc\f1 on the first call to \f3gl_get_line()\f1 is -disabled, so all configuration must be achieved using the -configuration sources specified with this function. - -If \f3app_string != NULL\f1, then it is interpreted as a string -containing one or more configuration commands, separated from each -other in the string by embedded newline characters. If \f3app_file != -NULL\f1 then it is interpreted as the full pathname of an -application-specific configuration file. If \f3user_file != NULL\f1 -then it is interpreted as the full pathname of a user-specific -configuration file, such as \f3~/.teclarc\f1. For example, in the -following call, - -.sp -.nf - gl_configure_getline(gl, "edit-mode vi \\n nobeep", - "/usr/share/myapp/teclarc", - "~/.teclarc"); -.fi -.sp - -the \f3app_string\f1 argument causes the calling application to start -in vi edit-mode, instead of the default emacs mode, and turns off the -use of the terminal bell by the library. It then attempts to read -system-wide configuration commands from an optional file called -\f3/usr/share/myapp/teclarc\f1, then finally reads user-specific -configuration commands from an optional \f3\&.teclarc\f1 file in the -user's home directory. Note that the arguments are listed in ascending -order of priority, with the contents of \f3app_string\f1 being -potentially overriden by commands in \f3app_file\f1, and commands in -\f3app_file\f1 potentially being overriden by commands in -\f3user_file\f1. -.sp -You can call this function as many times as needed, the results being -cumulative, but note that copies of any filenames specified via the -\f3app_file\f1 and \f3user_file\f1 arguments are recorded internally -for subsequent use by the \f3read-init-files\f1 key-binding function, -so if you plan to call this function multiple times, be sure that the -last call specifies the filenames that you want re-read when the user -requests that the configuration files be re-read. -.sp -Individual key sequences can also be bound and unbound using the -\f3gl_bind_keyseq()\f1 function. - -.sp -.nf - int gl_bind_keyseq(GetLine *gl, GlKeyOrigin origin, - const char *keyseq, - const char *action); -.fi -.sp - -The \f3origin\f1 argument specifies the priority of the binding, -according to who it is being established for, and must be one of -the following two values. -.sp -.nf - GL_USER_KEY - The user requested this key-binding. - GL_APP_KEY - This is a default binding set by the - application. -.fi -.sp -When both user and application bindings for a given key-sequence have -been specified, the user binding takes precedence. The application's -binding is subsequently reinstated if the user's binding is later -unbound via either another to this function, or a call to -\f3gl_configure_getline()\f1. - -The \f3keyseq\f1 argument specifies the key-sequence to be bound or -unbound, and is expressed in the same way as in a \f3~/.teclarc\f1 -configuration file. The \f3action\f1 argument must either be a string -containing the name of the action to bind the key-sequence to, or it -must be \f3NULL\f1 or "" to unbind the key-sequence. - -.SH CUSTOMIZED WORD COMPLETION - -If in your application, you would like to have TAB completion complete -other things in addition to or instead of filenames, you can arrange -this by registering an alternate completion callback function, via a -call to the \f3gl_customize_completion()\f1 function. -.sp -.nf - int gl_customize_completion(GetLine *gl, void *data, - CplMatchFn *match_fn); -.fi -.sp -The \f3data\f1 argument provides a way for your application to pass -arbitrary, application-specific information to the callback -function. This is passed to the callback every time that it is -called. It might for example, point to the symbol table from which -possible completions are to be sought. The \f3match_fn\f1 argument -specifies the callback function to be called. The \f3CplMatchFn\f1 -function type is defined in \f3libtecla.h\f1, as is a -\f3CPL_MATCH_FN()\f1 macro that you can use to declare and prototype -callback functions. The declaration and responsibilities of callback -functions are described in depth in the \f1cpl_complete_word(@FUNC_MANEXT@)\f1 man -page. -.sp -In brief, the callback function is responsible for looking backwards -in the input line, back from the point at which the user pressed TAB, -to find the start of the word being completed. It then must lookup -possible completions of this word, and record them one by one in the -\f3WordCompletion\f1 object that is passed to it as an argument, by -calling the \f3cpl_add_completion()\f1 function. If the callback -function wishes to provide filename completion in addition to its own -specific completions, it has the option of itself calling the builtin -file-name completion callback. This also, is documented in the -\f3cpl_complete_word(@FUNC_MANEXT@)\f1 man page. -.sp -Note that if you would like \f3gl_get_line()\f1 to return the current -input line when a successful completion is been made, you can arrange -this when you call \f3cpl_add_completion()\f1, by making the last -character of the continuation suffix a newline character. If you do -this, the input line will be updated to display the completion, -together with any contiuation suffix up to the newline character, then -\f3gl_get_line()\f1 will return this input line. -.sp - -If, for some reason, your callback function needs to write something -to the terminal, it must call \f3gl_normal_io()\f1 before doing -so. This will start a new line after the input line that is currently -being edited, reinstate normal terminal I/O, and tell -\f3gl_get_line()\f1 that the input line will need to be redrawn when -the callback returns. - -.SH ADDING COMPLETION ACTIONS - -In the previous section the ability to customize the behavior of the -only default completion action, \f3complete-word\f1, was described. -In this section the ability to install additional action functions, so -that different types of word completion can be bound to different -key-sequences, is described. This is achieved by using the -\f3gl_completion_action()\f1 function. - -.sp -.nf - int gl_completion_action(GetLine *gl, - void *data, CplMatchFn *match_fn, - int list_only, const char *name, - const char *keyseq); -.fi -.sp - -The \f3data\f1 and \f3match_fn\f1 arguments are as described -in the \f3cpl_complete_word\f1 man page, and specify the -callback function that should be invoked to identify -possible completions. The \f3list_only\f1 argument -determines whether the action that is being defined should -attempt to complete the word as far as possible in the input -line before displaying any possible ambiguous completions, -or whether it should simply display the list of possible -completions without touching the input line. The former -option is selected by specifying a value of \f30\f1, and the -latter by specifying a value of \f31\f1. The \f3name\f1 -argument specifies the name by which configuration files and -future invokations of this function should refer to the -action. This must either be the name of an existing -completion action to be changed, or be a new unused name for -a new action. Finally, the \f3keyseq\f1 argument specifies -the default key-sequence to bind the action to. If this is -\f3NULL\f1, no new keysequence will be bound to the action. - -Beware that in order for the user to be able to change the -key-sequence that is bound to actions that are installed in -this manner, when you call \f3gl_completion_action()\f1 to -install a given action for the first time, you should do -this between calling \f3new_GetLine()\f1 and the first call -to \f3gl_get_line()\f1. Otherwise, when the user's -configuration file is read on the first call to -\f3gl_get_line()\f1, the name of the your additional action -won't be known, and any reference to it in the configuration -file will generate an error. - -As discussed for \f3gl_customize_completion()\f1, if your callback -function, for some reason, needs to write anything to the terminal, it -must call \f3gl_normal_io()\f1 before doing so. - -.SH DEFINING CUSTOM ACTIONS - -Although the built-in key-binding actions are sufficient for the needs -of most applications, occasionally a specialized application may need -to define one or more custom actions, bound to application-specific -key-sequences. For example, a sales application would benefit from -having a key-sequence that displayed the part name that corresponded -to a part number preceding the cursor. Such a feature is clearly -beyond the scope of the built-in action functions. So for such special -cases, the \f3gl_register_action()\f1 function is provided. - -.sp -.nf - int gl_register_action(GetLine *gl, void *data, - GlActionFn *fn, const char *name, - const char *keyseq); -.fi -.sp - -This function lets the application register an external function, -\f3fn\f1, that will thereafter be called whenever either the specified -key-sequence, \f3keyseq\f1, is entered by the user, or the user enters -any other key-sequence that the user subsequently binds to the -specified action name, \f3name\f1, in their configuration file. The -\f3data\f1 argument can be a pointer to anything that the application -wishes to have passed to the action function, \f3fn\f1, whenever that -function is invoked. - -The action function, \f3fn\f1, should be declared using the following -macro, which is defined in \f3libtecla.h\f1. - -.sp -.nf - #define GL_ACTION_FN(fn) GlAfterAction (fn)(GetLine *gl, \\ - void *data, int count, size_t curpos, \\ - const char *line) -.fi -.sp - -The \f3gl\f1 and \f3data\f1 arguments are those that were previously -passed to \f3gl_register_action()\f1 when the action function was -registered. The \f3count\f1 argument is a numeric argument which the -user has the option of entering using the \f3digit-argument\f1 action, -before invoking the action. If the user doesn't enter a number, then -the \f3count\f1 argument is set to 1. Nominally this argument is -interpreted as a repeat count, meaning that the action should be -repeated that many times. In practice however, for some actions a -repeat count makes little sense. In such cases, actions can either -simply ignore the \f3count\f1 argument, or use its value for a -different purpose. - -A copy of the current input line is passed in the read-only \f3line\f1 -argument. The current cursor position within this string is given by -the index contained in the \f3curpos\f1 argument. Note that direct -manipulation of the input line and the cursor position is not -permitted. This is because the rules dicated by various modes, such as -vi mode versus emacs mode, no-echo mode, and insert mode versus -overstrike mode etc, make it too complex for an application writer to -write a conforming editing action, as well as constrain future changes -to the internals of \f3gl_get_line()\f1. A potential solution to this -dilema would be to allow the action function to edit the line using -the existing editing actions. This is currently under consideration. - -If the action function wishes to write text to the terminal, without -this getting mixed up with the displayed text of the input line, or -read from the terminal without having to handle raw terminal I/O, then -before doing either of these operations, it must temporarily suspend -line editing by calling the \f3gl_normal_io()\f1 function. This -function flushes any pending output to the terminal, moves the cursor -to the start of the line that follows the last terminal line of the -input line, then restores the terminal to a state that is suitable for -use with the C stdio facilities. The latter includes such things as -restoring the normal mapping of \f3\\n\f1 to \f3\\r\\n\f1, and, when -in server mode, restoring the normal blocking form of terminal -I/O. Having called this function, the action function can read from -and write to the terminal without the fear of creating a mess. It -isn't necessary for the action function to restore the original -editing environment before it returns. This is done automatically by -\f3gl_get_line()\f1 after the action function returns. The following -is a simple example of an action function which writes the sentence -"Hello world" on a new terminal line after the line being edited. When -this function returns, the input line is redrawn on the line that -follows the "Hello world" line, and line editing resumes. - -.sp -.nf - static GL_ACTION_FN(say_hello_fn) - { - if(gl_normal_io(gl)) /* Temporarily suspend editing */ - return GLA_ABORT; - printf("Hello world\\n"); - return GLA_CONTINUE; - } -.fi -.sp - -Action functions must return one of the following values, to tell -\f3gl_get_line()\f1 how to procede. - -.sp -.nf - GLA_ABORT - Cause gl_get_line() to return NULL. - GLA_RETURN - Cause gl_get_line() to return the - completed input line. - GLA_CONTINUE - Resume command-line editing. -.fi -.sp - -Note that the \f3name\f1 argument of \f3gl_register_action()\f1 -specifies the name by which a user can refer to the action in their -configuration file. This allows them to re-bind the action to an -alternate key-seqeunce. In order for this to work, it is necessary to -call \f3gl_register_action()\f1 between calling \f3new_GetLine()\f1 -and the first call to \f3gl_get_line()\f1. - -.SH HISTORY FILES - -To save the contents of the history buffer before quitting your -application, and subsequently restore them when you next start the -application, the following functions are provided. - -.sp -.nf - int gl_save_history(GetLine *gl, const char *filename, - const char *comment, int max_lines); - int gl_load_history(GetLine *gl, const char *filename, - const char *comment); -.fi -.sp - -The \f3filename\f1 argument specifies the name to give the history -file when saving, or the name of an existing history file, when -loading. This may contain home-directory and environment variable -expressions, such as "~/.myapp_history" or "$HOME/.myapp_history". -.sp -Along with each history line, extra information about it, such as when -it was entered by the user, and what its nesting level is, is recorded -as a comment preceding the line in the history file. Writing this as a -comment allows the history file to double as a command file, just in -case you wish to replay a whole session using it. Since comment -prefixes differ in different languages, the \f3comment\f1 argument is -provided for specifying the comment prefix. For example, if your -application were a unix shell, such as the bourne shell, you would -specify "#" here. Whatever you choose for the comment character, you -must specify the same prefix to \f3gl_load_history()\f1 that you used -when you called \f3gl_save_history()\f1 to write the history file. -.sp -The \f3max_lines\f1 must be either -1 to specify that all lines in the -history list be saved, or a positive number specifying a ceiling on -how many of the most recent lines should be saved. -.sp -Both fuctions return non-zero on error, after writing an error message -to stderr. Note that \f3gl_load_history()\f1 does not consider the -non-existence of a file to be an error. - -.SH MULTIPLE HISTORY LISTS - -If your application uses a single \f3GetLine\f1 object for entering -many different types of input lines, you may wish \f3gl_get_line()\f1 -to distinguish the different types of lines in the history list, and -only recall lines that match the current type of line. To support this -requirement, \f3gl_get_line()\f1 marks lines being recorded in the -history list with an integer identifier chosen by the application. -Initially this identifier is set to \f10\f3 by \f3new_GetLine()\f1, -but it can be changed subsequently by calling -\f3gl_group_history()\f1. - -.sp -.nf - int gl_group_history(GetLine *gl, unsigned id); -.fi -.sp - -The integer identifier \f3id\f1 can be any number chosen by the -application, but note that \f3gl_save_history()\f1 and -\f3gl_load_history()\f1 preserve the association between identifiers -and historical input lines between program invokations, so you should -choose fixed identifiers for the different types of input line used by -your application. -.sp -Whenever \f3gl_get_line()\f1 appends a new input line to the history -list, the current history identifier is recorded with it, and when it -is asked to recall a historical input line, it only recalls lines that -are marked with the current identifier. - -.SH DISPLAYING HISTORY - -The history list can be displayed by calling \f3gl_show_history()\f1. - -.sp -.nf - int gl_show_history(GetLine *gl, FILE *fp, - const char *fmt, - int all_groups, - int max_lines); -.fi -.sp - -This displays the current contents of the history list to the stdio -output stream \f3fp\f1. If the \f3max_lines\f1 argument is greater -than or equal to zero, then no more than this number of the most -recent lines will be displayed. If the \f3all_groups\f1 argument is -non-zero, lines from all history groups are displayed. Otherwise just -those of the currently selected history group are displayed. The -format string argument, \f3fmt\f1, determines how the line is -displayed. This can contain arbitrary characters which are written -verbatim, interleaved with any of the following format directives: - -.nf - %D - The date on which the line was originally - entered, formatted like 2001-11-20. - %T - The time of day when the line was entered, - formatted like 23:59:59. - %N - The sequential entry number of the line in - the history buffer. - %G - The number of the history group which the - line belongs to. - %% - A literal % character. - %H - The history line itself. -.fi - -Thus a format string like \f3"%D %T %H\n"\f1 would output something like: - -.nf - 2001-11-20 10:23:34 Hello world -.fi - -Note the inclusion of an explicit newline character in the format -string. - -.SH LOOKING UP HISTORY - -The \f3gl_lookup_history()\f1 function allows the calling application -to look up lines in the history list. - -.sp -.nf - typedef struct { - const char *line; /* The requested historical */ - /* line. */ - unsigned group; /* The history group to which */ - /* the line belongs. */ - time_t timestamp; /* The date and time at which */ - /* the line was originally */ - /* entered. */ - } GlHistoryLine; - - int gl_lookup_history(GetLine *gl, unsigned long id, - GlHistoryLine *hline); -.fi -.sp - -The \f3id\f1 argument indicates which line to look up, where the first -line that was entered in the history list after \f3new_GetLine()\f1 -was called, is denoted by 0, and subsequently entered lines are -denoted with successively higher numbers. Note that the range of lines -currently preserved in the history list can be queried by calling the -\f3gl_range_of_history()\f1 function, described later. If the -requested line is in the history list, the details of the line are -recorded in the variable pointed to by the \f3hline\f1 argument, and -\f31\f1 is returned. Otherwise \f30\f1 is returned, and the variable -pointed to by \f3hline\f1 is left unchanged. -.sp -Beware that the string returned in \f3hline->line\f1 is part of the -history buffer, so it must not be modified by the caller, and will be -recycled on the next call to any function that takes \f3gl\f1 as its -argument. Therefore you should make a private copy of this string if -you need to keep it around. - -.SH MANUAL HISTORY ARCHIVAL - -By default, whenever a line is entered by the user, it is -automatically appended to the history list, just before -\f3gl_get_line()\f1 returns the line to the caller. This is convenient -for the majority of applications, but there are also applications that -need finer grained control over what gets added to the history -list. In such cases, the automatic addition of entered lines to the -history list can be turned off by calling the -\f3gl_automatic_history()\f1 function. - -.sp -.nf - int gl_automatic_history(GetLine *gl, int enable); -.fi -.sp - -If this function is called with its \f3enable\f1 argument set to -\f30\f1, \f3gl_get_line()\f1 won't automatically archive subsequently -entered lines. Automatic archiving can be reenabled at a later time, -by calling this function again, with its \f3enable\f1 argument set to -1. While automatic history archiving is disabled, the calling -application can use the \f3gl_append_history()\f1 to append lines to -the history list as needed. - -.sp -.nf - int gl_append_history(GetLine *gl, const char *line); -.fi -.sp - -The \f3line\f1 argument specifies the line to be added to the history -list. This must be a normal \f3'\0'\f1 terminated string. If this -string contains any newline characters, the line that gets archived in -the history list will be terminated by the first of these. Otherwise -it will be terminated by the \f3'\0'\f1 terminator. If the line is -longer than the maximum input line length, that was specified when -\f3new_GetLine()\f1 was called, when the line is recalled, it will get -truncated to the actual \f3gl_get_line()\f1 line length. - -If successful, \f3gl_append_history()\f1 returns 0. Otherwise it -returns non-zero, and sets \f3errno\f1 to one of the following values. - -.sp -.nf - EINVAL - One of the arguments passed to - gl_append_history() was NULL. - ENOMEM - The specified line was longer than the allocated - size of the history buffer (as specified when - new_GetLine() was called), so it couldn't be - archived. -.fi -.sp - -A textual description of the error can optionally be obtained by -calling \f3gl_error_message()\f1. Note that after such an error, the -history list remains in a valid state to receive new history lines, so -there is little harm in simply ignoring the return status of -\f3gl_append_history()\f1. - -.SH MISCELLANEOUS HISTORY CONFIGURATION - -If you wish to change the size of the history buffer that was -originally specified in the call to \f3new_GetLine()\f1, you can do so -with the \f3gl_resize_history()\f1 function. - -.sp -.nf - int gl_resize_history(GetLine *gl, size_t histlen); -.fi -.sp - -The \f3histlen\f1 argument specifies the new size in bytes, and if you -specify this as 0, the buffer will be deleted. -.sp -As mentioned in the discussion of \f3new_GetLine()\f1, the number of -lines that can be stored in the history buffer, depends on the lengths -of the individual lines. For example, a 1000 byte buffer could equally -store 10 lines of average length 100 bytes, or 2 lines of average -length 50 bytes. Although the buffer is never expanded when new lines -are added, a list of pointers into the buffer does get expanded when -needed to accomodate the number of lines currently stored in the -buffer. To place an upper limit on the number of lines in the buffer, -and thus a ceiling on the amount of memory used in this list, you can -call the \f3gl_limit_history()\f1 function. - -.sp -.nf - void gl_limit_history(GetLine *gl, int max_lines); -.fi -.sp - -The \f3max_lines\f1 should either be a positive number \f3>= 0\f1, -specifying an upper limit on the number of lines in the buffer, or be -\f3-1\f1 to cancel any previously specified limit. When a limit is in -effect, only the \f3max_lines\f1 most recently appended lines are kept -in the buffer. Older lines are discarded. -.sp -To discard lines from the history buffer, use the -\f3gl_clear_history()\f1 function. -.sp -.nf - void gl_clear_history(GetLine *gl, int all_groups); -.fi -.sp -The \f3all_groups\f1 argument tells the function whether to delete -just the lines associated with the current history group (see -\f3gl_group_history()\f1), or all historical lines in the buffer. -.sp -The \f3gl_toggle_history()\f1 function allows you to toggle history on -and off without losing the current contents of the history list. - -.sp -.nf - void gl_toggle_history(GetLine *gl, int enable); -.fi -.sp - -Setting the \f3enable\f1 argument to 0 turns off the history -mechanism, and setting it to 1 turns it back on. When history is -turned off, no new lines will be added to the history list, and -history lookup key-bindings will act as though there is nothing in the -history buffer. - -.SH QUERYING HISTORY INFORMATION - -The configured state of the history list can be queried with the -\f3gl_history_state()\f1 function. - -.sp -.nf - typedef struct { - int enabled; /* True if history is enabled */ - unsigned group; /* The current history group */ - int max_lines; /* The current upper limit on the */ - /* number of lines in the history */ - /* list, or -1 if unlimited. */ - } GlHistoryState; - - void gl_state_of_history(GetLine *gl, - GlHistoryState *state); -.fi -.sp -On return, the status information is recorded in the variable pointed -to by the \f3state\f1 argument. -.sp -The \f3gl_range_of_history()\f1 function returns the number and -range of lines in the history list. - -.sp -.nf -typedef struct { - unsigned long oldest; /* The sequential entry number */ - /* of the oldest line in the */ - /* history list. */ - unsigned long newest; /* The sequential entry number */ - /* of the newest line in the */ - /* history list. */ - int nlines; /* The number of lines in the */ - /* history list. */ -} GlHistoryRange; - -void gl_range_of_history(GetLine *gl, GlHistoryRange *range); -.fi -.sp -The return values are recorded in the variable pointed to by the -\f3range\f1 argument. If the \f3nlines\f1 member of this structure is -greater than zero, then the \f3oldest\f1 and \f3newest\f1 members -report the range of lines in the list, and \f3newest=oldest+nlines-1\f1. -Otherwise they are both zero. -.sp -The \f3gl_size_of_history()\f1 function returns the total size of the -history buffer and the amount of the buffer that is currently -occupied. -.sp -.nf - typedef struct { - size_t size; /* The size of the history buffer */ - /* (bytes). */ - size_t used; /* The number of bytes of the */ - /* history buffer that are */ - /* currently occupied. */ - } GlHistorySize; - - void gl_size_of_history(GetLine *gl, GlHistorySize *size); -.fi -.sp -On return, the size information is recorded in the variable pointed to -by the \f3size\f1 argument. - -.SH CHANGING TERMINALS - -The \f3new_GetLine()\f1 constructor function assumes that input is to -be read from \f3stdin\f1, and output written to \f3stdout\f1. The -following function allows you to switch to different input and output -streams. -.sp -.nf - int gl_change_terminal(GetLine *gl, FILE *input_fp, - FILE *output_fp, const char *term); -.fi -.sp -The \f3gl\f1 argument is the object that was returned by -\f3new_GetLine()\f1. The \f3input_fp\f1 argument specifies the stream -to read from, and \f3output_fp\f1 specifies the stream to be written -to. Only if both of these refer to a terminal, will interactive -terminal input be enabled. Otherwise \f3gl_get_line()\f1 will simply -call \f3fgets()\f1 to read command input. If both streams refer to a -terminal, then they must refer to the same terminal, and the type of -this terminal must be specified via the \f3term\f1 argument. The value -of the \f3term\f1 argument is looked up in the terminal information -database (terminfo or termcap), in order to determine which special -control sequences are needed to control various aspects of the -terminal. \f3new_GetLine()\f1 for example, passes the return value of -\f3getenv("TERM")\f1 in this argument. Note that if one or both of -\f3input_fp\f1 and \f3output_fp\f1 don't refer to a terminal, then it -is legal to pass \f3NULL\f1 instead of a terminal type. -.sp -Note that if you want to pass file descriptors to -\f3gl_change_terminal()\f1, you can do this by creating stdio stream -wrappers using the POSIX \f3fdopen()\f1 function. - -.SH EXTERNAL EVENT HANDLING - -By default, \f3gl_get_line()\f1 doesn't return until either a complete -input line has been entered by the user, or an error occurs. In -programs that need to watch for I/O from other sources than the -terminal, there are two options. - -.sp -.nf - 1. Use the functions described in the - \f3gl_io_mode(@FUNC_MANEXT@)\f1 man page to switch - \f3gl_get_line()\f1 into non-blocking server mode. In this mode, - \f3gl_get_line()\f1 becomes a non-blocking, incremental - line-editing function that can safely be called from - an external event loop. Although this is a very - versatile method, it involves taking on some - responsibilities that are normally performed behind - the scenes by \f3gl_get_line()\f1. - - 2. While \f3gl_get_line()\f1 is waiting for keyboard - input from the user, you can ask it to also watch for - activity on arbitrary file descriptors, such as - network sockets, pipes etc, and have it call functions - of your choosing when activity is seen. This works on - any system that has the \f3select()\f1 system call, - which is most, if not all flavors of unix. -.fi -.sp - -Registering a file descriptor to be watched by -\f3gl_get_line()\f1 involves calling the \f3gl_watch_fd()\f1 function. - -.sp -.nf - int gl_watch_fd(GetLine *gl, int fd, GlFdEvent event, - GlFdEventFn *callback, void *data); -.fi -.sp - -If this returns non-zero, then it means that either your arguments are -invalid, or that this facility isn't supported on the host system. -.sp -The \f3fd\f1 argument is the file descriptor to be watched. The -\f3event\f1 argument specifies what type of activity is of interest, -chosen from the following enumerated values: - -.sp -.nf - GLFD_READ - Watch for the arrival of data to be read. - GLFD_WRITE - Watch for the ability to write to the file - descriptor without blocking. - GLFD_URGENT - Watch for the arrival of urgent - out-of-band data on the file descriptor. -.fi -.sp - -The \f3callback\f1 argument is the function to call when the selected -activity is seen. It should be defined with the following macro, which -is defined in libtecla.h. - -.sp -.nf - #define GL_FD_EVENT_FN(fn) GlFdStatus (fn)(GetLine *gl, \\ - void *data, int fd, \\ - GlFdEvent event) -.fi -.sp -The \f3data\f1 argument of the \f3gl_watch_fd()\f1 function is passed -to the callback function for its own use, and can point to anything -you like, including \f3NULL\f1. The file descriptor and the event -argument are also passed to the callback function, and this -potentially allows the same callback function to be registered to more -than one type of event and/or more than one file descriptor. The -return value of the callback function should be one of the following -values. - -.sp -.nf - GLFD_ABORT - Tell gl_get_line() to abort. When this - happens, \f3gl_get_line()\f1 returns - \f3NULL\f1, and a following call to - \f3gl_return_status()\f1 will return - \f3GLR_FDABORT\f1. Note that if the - application needs \f3errno\f1 always to - have a meaningful value when - \f3gl_get_line()\f1 returns \f3NULL\f1, - the callback function should set - \f3errno\f1 appropriately. - GLFD_REFRESH - Redraw the input line then continue - waiting for input. Return this if - your callback wrote to the terminal. - GLFD_CONTINUE - Continue to wait for input, without - redrawing the line. -.fi -.sp -Note that before calling the callback, \f3gl_get_line()\f1 blocks most -signals, and leaves its own signal handlers installed, so if you need -to catch a particular signal you will need to both temporarily install -your own signal handler, and unblock the signal. Be sure to re-block -the signal (if it was originally blocked) and reinstate the original -signal handler, if any, before returning. - -.sp - -If the callback function needs to read or write to the terminal, it -should ideally first call \f3gl_normal_io(gl)\f1 to temporarily -suspend line editing. This will restore the terminal to canonical, -blocking-I/O, mode, and move the cursor to the start of a new terminal -line. Later, when the callback returns, \f3gl_get_line()\f1 will -notice that \f3gl_normal_io()\f1 was called, redisplay the input line -and resume editing. Note that in this case the return values, -\f3GLFD_REFRESH\f1 and \f3GLFD_CONTINUE\f1 are equivalent. - -.sp - -To support cases where the callback function calls a third-party -function which occasionally and unpredictably writes to the terminal, -the automatic conversion of \f3"\n"\f1 to \f3"\r\n"\f1 is re-enabled -before the callback function is called. If the callack knows that the -third-party function wrote to the terminal, it should then return the -\f3GLFD_REFRESH\f1 return value, to tell \f3gl_get_line()\f1 to -redisplay the input line. - -.sp - -To remove a callback function that you previously registered for a -given file descriptor and event, simply call \f3gl_watch_fd()\f1 with -the same file descriptor and \f3event\f1 arguments, but with a -\f3callback\f1 argument of \f30\f1. The \f3data\f1 argument is ignored -in this case. - -.SH SETTING AN INACTIVITY TIMEOUT - -On systems with the \f3select()\f1 system call, the -\f3gl_inactivity_timeout()\f1 function can be used to set or cancel an -inactivity timeout. Inactivity in this case refers both to keyboard -input, and to I/O on any file descriptors registered by prior and -subsequent calls to \f3gl_watch_fd()\f1. On oddball systems that don't -have \f3select()\f1, this call has no effect. - -.sp -.nf - int gl_inactivity_timeout(GetLine *gl, GlTimeoutFn *callback, - void *data, unsigned long sec, - unsigned long nsec); -.fi -.sp - -The timeout is specified in the form of an integral number of seconds -and an integral number of nanoseconds, via the \f3sec\f1 and -\f3nsec\f1 arguments respectively. Subsequently, whenever no activity -is seen for this time period, the function specified via the -\f3callback\f1 argument is called. The \f3data\f1 argument of -\f3gl_inactivity_timeout()\f1 is passed verbatim to this callback function -whenever it is invoked, and can thus be used to pass arbitrary -application-specific information to the callback. The following macro -is provided in \f3libtecla.h\f1 for applications to use to declare and -prototype timeout callback functions. - -.sp -.nf - #define GL_TIMEOUT_FN(fn) \\ - GlAfterTimeout (fn)(GetLine *gl, void *data) -.fi -.sp - -On returning, the application's callback is expected to return one of -the following enumerators to tell \f3gl_get_line()\f1 how to procede -after the timeout has been handled by the callback. - -.sp -.nf - GLTO_ABORT - Tell gl_get_line() to abort. When - this happens, \f3gl_get_line()\f1 will - return \f3NULL\f1, and a following call - to \f3gl_return_status()\f1 will return - \f3GLR_TIMEOUT\f1. Note that if the - application needs \f3errno\f1 always to - have a meaningful value when - \f3gl_get_line()\f1 returns \f3NULL\f1, - the callback function should set - \f3errno\f1 appropriately. - GLTO_REFRESH - Redraw the input line, then continue - waiting for input. You should return - this value if your callback wrote to the - terminal without having first called - \f3gl_normal_io(gl)\f1. - GLTO_CONTINUE - In normal blocking-I/O mode, continue to - wait for input, without redrawing the - user's input line. - In non-blocking server I/O mode (see - gl_io_mode(@FUNC_MANEXT@)), cause \f3gl_get_line()\f1 - to act as though I/O blocked. This means - that \f3gl_get_line()\f1 will immediately - return \f3NULL\f1, and a following call - to \f3gl_return_status()\f1 will return - \f3GLR_BLOCKED\f1. -.fi -.sp - -Note that before calling the callback, \f3gl_get_line()\f1 blocks most -signals, and leaves its own signal handlers installed, so if you need -to catch a particular signal you will need to both temporarily install -your own signal handler, and unblock the signal. Be sure to re-block -the signal (if it was originally blocked) and reinstate the original -signal handler, if any, before returning. - -.sp - -If the callback function needs to read or write to the terminal, it -should ideally first call \f3gl_normal_io(gl)\f1 to temporarily -suspend line editing. This will restore the terminal to canonical, -blocking-I/O, mode, and move the cursor to the start of a new terminal -line. Later, when the callback returns, \f3gl_get_line()\f1 will -notice that \f3gl_normal_io()\f1 was called, redisplay the input line -and resume editing. Note that in this case the return values, -\f3GLTO_REFRESH\f1 and \f3GLTO_CONTINUE\f1 are equivalent. - -.sp - -To support cases where the callback function calls a third-party -function which occasionally and unpredictably writes to the terminal, -the automatic conversion of \f3"\n"\f1 to \f3"\r\n"\f1 is re-enabled -before the callback function is called. If the callack knows that the -third-party function wrote to the terminal, it should then return the -\f3GLTO_REFRESH\f1 return value, to tell \f3gl_get_line()\f1 to -redisplay the input line. - -.sp - -Note that although the timeout argument includes a nano-second -component, few computer clocks presently have resolutions that are -finer than a few milliseconds, so asking for less than a few -milliseconds is equivalent to requesting zero seconds on a lot of -systems. If this would be a problem, you should base your timeout -selection on the actual resolution of the host clock (eg. by calling -\f3sysconf(_SC_CLK_TCK)\f1). - -.sp - -To turn off timeouts, simply call \f3gl_inactivity_timeout()\f1 with a -\f3callback\f1 argument of \f30\f1. The \f3data\f1 argument is ignored -in this case. - -.SH SIGNAL HANDLING DEFAULTS - -By default, the \f3gl_get_line()\f1 function intercepts a -number of signals. This is particularly important for -signals which would by default terminate the process, since -the terminal needs to be restored to a usable state before -this happens. In this section, the signals that are trapped -by default, and how \f3gl_get_line()\f1 responds to them, is -described. Changing these defaults is the topic of the -following section. -.sp -When the following subset of signals are caught, \f3gl_get_line()\f1 -first restores the terminal settings and signal handling to how they -were before \f3gl_get_line()\f1 was called, resends the signal, to -allow the calling application's signal handlers to handle it, then if -the process still exists, \f3gl_get_line()\f1 returns \f3NULL\f1 and -sets \f3errno\f1 as specified below. - -.sp -.nf - SIGINT - This signal is generated both by the keyboard - interrupt key (usually ^C), and the keyboard - break key. - - errno=EINTR - - SIGHUP - This signal is generated when the controlling - terminal exits. - - errno=ENOTTY - - SIGPIPE - This signal is generated when a program attempts - to write to a pipe who's remote end isn't being - read by any process. This can happen for example - if you have called \f3gl_change_terminal()\f1 to - redirect output to a pipe hidden under a pseudo - terminal. - - errno=EPIPE - - SIGQUIT - This signal is generated by the keyboard quit - key (usually ^\\). - - errno=EINTR - - SIGABRT - This signal is generated by the standard C, - abort() function. By default it both - terminates the process and generates a core - dump. - - errno=EINTR - - SIGTERM - This is the default signal that the UN*X - kill command sends to processes. - - errno=EINTR -.fi -.sp -Note that in the case of all of the above signals, POSIX mandates that -by default the process is terminated, with the addition of a core dump -in the case of the \f3SIGQUIT\f1 signal. In other words, if the -calling application doesn't override the default handler by supplying -its own signal handler, receipt of the corresponding signal will -terminate the application before \f3gl_get_line()\f1 returns. -.sp -If gl_get_line() aborts with errno set to EINTR, you can find out what -signal caused it to abort, by calling the following function. -.sp -.nf - int gl_last_signal(const GetLine *gl); -.fi -.sp -This returns the numeric code (eg. \f3SIGINT\f1) of the last signal -that was received during the most recent call to \f3gl_get_line()\f1, -or \f3-1\f1 if no signals were received. -.sp -On systems that support it, when a SIGWINCH (window change) signal is -received, \f3gl_get_line()\f1 queries the terminal to find out its new -size, redraws the current input line to accomodate the new size, then -returns to waiting for keyboard input from the user. Unlike other -signals, this signal isn't resent to the application. -.sp -Finally, the following signals cause \f3gl_get_line()\f1 to first -restore the terminal and signal environment to that which prevailed -before \f3gl_get_line()\f1 was called, then resend the signal to the -application. If the process still exists after the signal has been -delivered, then \f3gl_get_line()\f1 then re-establishes its own signal -handlers, switches the terminal back to raw mode, redisplays the input -line, and goes back to awaiting terminal input from the user. -.sp -.nf - SIGCONT - This signal is generated when a suspended - process is resumed. - - SIGPOLL - On SVR4 systems, this signal notifies the - process of an asynchronous I/O event. Note - that under 4.3+BSD, SIGIO and SIGPOLL are - the same. On other systems, SIGIO is ignored - by default, so \f3gl_get_line()\f1 doesn't - trap it by default. - - SIGPWR - This signal is generated when a power failure - occurs (presumably when the system is on a - UPS). - - SIGALRM - This signal is generated when a timer - expires. - - SIGUSR1 - An application specific signal. - - SIGUSR2 - Another application specific signal. - - SIGVTALRM - This signal is generated when a virtual - timer expires (see man setitimer(2)). - - SIGXCPU - This signal is generated when a process - exceeds its soft CPU time limit. - - SIGXFSZ - This signal is generated when a process - exceeds its soft file-size limit. - - SIGTSTP - This signal is generated by the terminal - suspend key, which is usually ^Z, or the - delayed terminal suspend key, which is - usually ^Y. - - SIGTTIN - This signal is generated if the program - attempts to read from the terminal while the - program is running in the background. - - SIGTTOU - This signal is generated if the program - attempts to write to the terminal while the - program is running in the background. -.fi -.sp - -Obviously not all of the above signals are supported on all systems, -so code to support them is conditionally compiled into the tecla -library. -.sp -Note that if \f3SIGKILL\f1 or \f3SIGPOLL\f1, which by definition can't -be caught, or any of the hardware generated exception signals, such as -\f3SIGSEGV\f1, \f3SIGBUS\f1 and \f3SIGFPE\f1, are received and -unhandled while \f3gl_get_line()\f1 has the terminal in raw mode, the -program will be terminated without the terminal having been restored -to a usable state. In practice, job-control shells usually reset the -terminal settings when a process relinquishes the controlling -terminal, so this is only a problem with older shells. - -.SH CUSTOMIZED SIGNAL HANDLING - -The previous section listed the signals that -\f3gl_get_line()\f1 traps by default, and described how it -responds to them. This section describes how to both add and -remove signals from the list of trapped signals, and how to -specify how \f3gl_get_line()\f1 should respond to a given -signal. -.sp -If you don't need \f3gl_get_line()\f1 to do anything in -response to a signal that it normally traps, you can tell to -\f3gl_get_line()\f1 to ignore that signal by calling -\f3gl_ignore_signal()\f1. -.sp -.nf - int gl_ignore_signal(GetLine *gl, int signo); -.fi -.sp -The \f3signo\f1 argument is the number of the signal -(eg. \f3SIGINT\f1) that you want to have ignored. If the -specified signal isn't currently one of those being trapped, -this function does nothing. -.sp -The \f3gl_trap_signal()\f1 function allows you to either add -a new signal to the list that \f3gl_get_line()\f1 traps, or -modify how it responds to a signal that it already traps. -.sp -.nf - int gl_trap_signal(GetLine *gl, int signo, unsigned flags, - GlAfterSignal after, int errno_value); -.fi -.sp -The \f3signo\f1 argument is the number of the signal that -you wish to have trapped. The \f3flags\f1 argument is a set -of flags which determine the environment in which the -application's signal handler is invoked, the \f3after\f1 -argument tells \f3gl_get_line()\f1 what to do after the -application's signal handler returns, and \f3errno_value\f1 -tells \f3gl_get_line()\f1 what to set \f3errno\f1 to if told -to abort. -.sp -The \f3flags\f1 argument is a bitwise OR of zero or more of -the following enumerators: -.sp -.nf - GLS_RESTORE_SIG - Restore the caller's signal - environment while handling the - signal. - - GLS_RESTORE_TTY - Restore the caller's terminal settings - while handling the signal. - - GLS_RESTORE_LINE - Move the cursor to the start of the - line following the input line before - invoking the application's signal - handler. - - GLS_REDRAW_LINE - Redraw the input line when the - application's signal handler returns. - - GLS_UNBLOCK_SIG - Normally, if the calling program has - a signal blocked (man sigprocmask), - gl_get_line() does not trap that - signal. This flag tells gl_get_line() - to trap the signal and unblock it for - the duration of the call to - gl_get_line(). - - GLS_DONT_FORWARD - If this flag is included, the signal - will not be forwarded to the signal - handler of the calling program. -.fi -.sp -Two commonly useful flag combinations are also enumerated as -follows: -.sp -.nf - GLS_RESTORE_ENV = GLS_RESTORE_SIG | GLS_RESTORE_TTY | - GLS_REDRAW_LINE - - GLS_SUSPEND_INPUT = GLS_RESTORE_ENV | GLS_RESTORE_LINE -.fi -.sp - -If your signal handler, or the default system signal -handler for this signal, if you haven't overridden it, never -either writes to the terminal, nor suspends or terminates -the calling program, then you can safely set the \f3flags\f1 -argument to \f30\f1. -.sp -If your signal handler always writes to the terminal, reads -from it, or suspends or terminates the program, you should -specify the \f3flags\f1 argument as \f3GL_SUSPEND_INPUT\f1, -so that: -.sp -.nf -1. The cursor doesn't get left in the middle of the input - line. -2. So that the user can type in input and have it echoed. -3. So that you don't need to end each output line with - \f3\\r\\n\f1, instead of just \f3\\n\f1. -.fi -.sp -The \f3GL_RESTORE_ENV\f1 combination is the same as -\f3GL_SUSPEND_INPUT\f1, except that it doesn't move the -cursor, and if your signal handler doesn't read or write -anything to the terminal, the user won't see any visible -indication that a signal was caught. This can be useful if -you have a signal handler that only occasionally writes to -the terminal, where using \f3GL_SUSPEND_LINE\f1 would cause -the input line to be unnecessarily duplicated when nothing -had been written to the terminal. Such a signal handler, -when it does write to the terminal, should be sure to start -a new line at the start of its first write, by writing a -'\\n' character, and should be sure to leave the cursor on a -new line before returning. If the signal arrives while the -user is entering a line that only occupies a signal terminal -line, or if the cursor is on the last terminal line of a -longer input line, this will have the same effect as -\f3GL_SUSPEND_INPUT\f1. Otherwise it will start writing on a -line that already contains part of the displayed input line. -This doesn't do any harm, but it looks a bit ugly, which is -why the \f3GL_SUSPEND_INPUT\f1 combination is better if you -know that you are always going to be writting to the -terminal. -.sp -The \f3after\f1 argument, which determines what -\f3gl_get_line()\f1 does after the application's signal -handler returns (if it returns), can take any one of the -following values: -.sp -.nf - GLS_RETURN - Return the completed input line, just as - though the user had pressed the return - key. - - GLS_ABORT - Cause \f3gl_get_line()\f1 to abort. When - this happens, \f3gl_get_line()\f1 returns - \f3NULL\f1, and a following call to - \f3gl_return_status()\f1 will return - \f3GLR_SIGNAL\f1. Note that if the - application needs \f3errno\f1 always to - have a meaningful value when - \f3gl_get_line()\f1 returns \f3NULL\f1, - the callback function should set - \f3errno\f1 appropriately. - GLS_CONTINUE - Resume command line editing. -.fi -.sp -The \f3errno_value\f1 argument is intended to be combined -with the \f3GLS_ABORT\f1 option, telling \f3gl_get_line()\f1 -what to set the standard \f3errno\f1 variable to before -returning \f3NULL\f1 to the calling program. It can also, -however, be used with the \f3GL_RETURN\f1 option, in case -you wish to have a way to distinguish between an input line -that was entered using the return key, and one that was -entered by the receipt of a signal. - -.SH RELIABLE SIGNAL HANDLING - -Signal handling is suprisingly hard to do reliably without race -conditions. In \f3gl_get_line()\f1 a lot of care has been taken to -allow applications to perform reliable signal handling around -\f3gl_get_line()\f1. This section explains how to make use of this. - -As an example of the problems that can arise if the application isn't -written correctly, imagine that one's application has a SIGINT signal -handler that sets a global flag. Now suppose that the application -tests this flag just before invoking \f3gl_get_line()\f1. If a SIGINT -signal happens to be received in the small window of time between the -statement that tests the value of this flag, and the statement that -calls \f3gl_get_line()\f1, then \f3gl_get_line()\f1 will not see the -signal, and will not be interrupted. As a result, the application -won't be able to respond to the signal until the user gets around to -finishing entering the input line and \f3gl_get_line()\f1 -returns. Depending on the application, this might or might not be a -disaster, but at the very least it would puzzle the user. - -The way to avoid such problems is to do the following. - -1. If needed, use the \f3gl_trap_signal()\f1 function to - configure \f3gl_get_line()\f1 to abort when important - signals are caught. - -2. Configure \f3gl_get_line()\f1 such that if any of the - signals that it catches are blocked when - \f3gl_get_line()\f1 is called, they will be unblocked - automatically during times when \f3gl_get_line()\f1 is - waiting for I/O. This can be done either - on a per signal basis, by calling the - \f3gl_trap_signal()\f1 function, and specifying the - \f3GLS_UNBLOCK\f1 attribute of the signal, or globally by - calling the \f3gl_catch_blocked()\f1 function. - -.sp -.nf - void gl_catch_blocked(GetLine *gl); -.fi -.sp - - This function simply adds the \f3GLS_UNBLOCK\f1 attribute - to all of the signals that it is currently configured to - trap. - -3. Just before calling \f3gl_get_line()\f1, block delivery - of all of the signals that \f3gl_get_line()\f1 is - configured to trap. This can be done using the POSIX - \f3sigprocmask()\f1 function in conjunction with the - \f3gl_list_signals()\f1 function. - -.sp -.nf - int gl_list_signals(GetLine *gl, sigset_t *set); -.fi -.sp - - This function returns the set of signals that it is - currently configured to catch in the \f3set\f1 argument, - which is in the form required by \f3sigprocmask()\f1. - -4. In the example, one would now test the global flag that - the signal handler sets, knowing that there is now no - danger of this flag being set again until - \f3gl_get_line()\f1 unblocks its signals while performing - I/O. - -5. Eventually \f3gl_get_line()\f1 returns, either because - a signal was caught, an error occurred, or the user - finished entering their input line. - -6. Now one would check the global signal flag again, and if - it is set, respond to it, and zero the flag. - -7. Use \f3sigprocmask()\f1 to unblock the signals that were - blocked in step 3. - -The same technique can be used around certain POSIX -signal-aware functions, such as \f3sigsetjmp()\f1 and -\f3sigsuspend()\f1, and in particular, the former of these -two functions can be used in conjunction with -\f3siglongjmp()\f1 to implement race-condition free signal -handling around other long-running system calls. The way to -do this, is explained next, by showing how -\f3gl_get_line()\f1 manages to reliably trap signals around -calls to functions like \f3read()\f1 and \f3select()\f1 -without race conditions. - -The first thing that \f3gl_get_line()\f1 does, whenever it -is called, is to use the POSIX \f3sigprocmask()\f1 function -to block the delivery of all of the signals that it is -currently configured to catch. This is redundant if the -application has already blocked them, but it does no -harm. It undoes this step just before returning. - -Whenever \f3gl_get_line()\f1 needs to call \f3read()\f1 or -\f3select()\f1 to wait for input from the user, it first -calls the POSIX \f3sigsetjmp()\f1 function, being sure to -specify a non-zero value for its \f3savesigs\f1 argument. -The reason for the latter argument will become clear -shortly. - -If \f3sigsetjmp()\f1 returns zero, \f3gl_get_line()\f1 then -does the following. - -.sp -.nf -a. It uses the POSIX \f3sigaction()\f1 function to register - a temporary signal handler to all of the signals that it - is configured to catch. This signal handler does two - things. - - 1. It records the number of the signal that was received - in a file-scope variable. - - 2. It then calls the POSIX \f3siglongjmp()\f1 - function using the buffer that was passed to - \f3sigsetjmp()\f1 for its first argument, and - a non-zero value for its second argument. - - When this signal handler is registered, the \f3sa_mask\f1 - member of the \f3struct sigaction act\f1 argument of the - call to \f3sigaction()\f1 is configured to contain all of - the signals that \f3gl_get_line()\f1 is catching. This - ensures that only one signal will be caught at once by - our signal handler, which in turn ensures that multiple - instances of our signal handler don't tread on each - other's toes. - -b. Now that the signal handler has been set up, - \f3gl_get_line()\f1 unblocks all of the signals that it - is configured to catch. - -c. It then calls the \f3read()\f1 or \f3select()\f1 system - calls to wait for keyboard input. - -d. If this system call returns (ie. no signal is received), - \f3gl_get_line()\f1 blocks delivery of the signals of - interest again. - -e. It then reinstates the signal handlers that were - displaced by the one that was just installed. -.fi -.sp - -Alternatively, if \f3sigsetjmp()\f1 returns non-zero, this -means that one of the signals being trapped was caught while -the above steps were executing. When this happens, -\f3gl_get_line()\f1 does the following. - -First, note that when a call to \f3siglongjmp()\f1 causes -\f3sigsetjmp()\f1 to return, provided that the -\f3savesigs\f1 argument of \f3sigsetjmp()\f1 was non-zero, -as specified above, the signal process mask is restored to -how it was when \f3sigsetjmp()\f1 was called. This is the -important difference between \f3sigsetjmp()\f1 and the older -problematic \f3setjmp()\f1, and is the essential ingredient -that makes it possible to avoid signal handling race -conditions. Because of this we are guaranteed that all of -the signals that we blocked before calling \f3sigsetjmp()\f1 -are blocked again as soon as any signal is caught. The -following statements, which are then executed, are thus -guaranteed to be executed without any further signals being -caught. - -1. If so instructed by the \f3gl_get_line()\f1 configuration - attributes of the signal that was caught, - \f3gl_get_line()\f1 restores the terminal attributes to - the state that they had when \f3gl_get_line()\f1 was - called. This is particularly important for signals that - suspend or terminate the process, since otherwise the - terminal would be left in an unusable state. - -2. It then reinstates the application's signal handlers. - -3. Then it uses the C standard-library \f3raise()\f1 - function to re-send the application the signal that - was caught. - -3. Next it unblocks delivery of the signal that we just - sent. This results in the signal that was just sent - via \f3raise()\f1, being caught by the application's - original signal handler, which can now handle it as it - sees fit. - -4. If the signal handler returns (ie. it doesn't terminate - the process), \f3gl_get_line()\f1 blocks delivery of the - above signal again. - -5. It then undoes any actions performed in the first of the - above steps, and redisplays the line, if the signal - configuration calls for this. - -6. \f3gl_get_line()\f1 then either resumes trying to - read a character, or aborts, depending on the - configuration of the signal that was caught. - -What the above steps do in essence is to take asynchronously -delivered signals and handle them synchronously, one at a -time, at a point in the code where \f3gl_get_line()\f1 has -complete control over its environment. - -.SH THE TERMINAL SIZE - -On most systems the combination of the \f3TIOCGWINSZ\f1 ioctl and the -\f3SIGWINCH\f1 signal is used to maintain an accurate idea of the -terminal size. The terminal size is newly queried every time that -\f3gl_get_line()\f1 is called and whenever a \f3SIGWINCH\f1 signal is -received. -.sp -On the few systems where this mechanism isn't available, at -startup \f3new_GetLine()\f1 first looks for the \f3LINES\f1 -and \f3COLUMNS\f1 environment variables. If these aren't -found, or they contain unusable values, then if a terminal -information database like terminfo or termcap is available, -the default size of the terminal is looked up in this -database. If this too fails to provide the terminal size, a -default size of 80 columns by 24 lines is used. -.sp -Even on systems that do support \f3ioctl(TIOCGWINSZ)\f1, if the -terminal is on the other end of a serial line, the terminal driver -generally has no way of detecting when a resize occurs or of querying -what the current size is. In such cases no \f3SIGWINCH\f1 is sent to -the process, and the dimensions returned by \f3ioctl(TIOCGWINSZ)\f1 -aren't correct. The only way to handle such instances is to provide a -way for the user to enter a command that tells the remote system what -the new size is. This command would then call the -\f3gl_set_term_size()\f1 function to tell \f3gl_get_line()\f1 about -the change in size. - -.sp -.nf - int gl_set_term_size(GetLine *gl, int ncolumn, int nline); -.fi -.sp - -The \f3ncolumn\f1 and \f3nline\f1 arguments are used to specify the -new dimensions of the terminal, and must not be less than 1. On -systems that do support \f3ioctl(TIOCGWINSZ)\f1, this function first -calls \f3ioctl(TIOCSWINSZ)\f1 to tell the terminal driver about the -change in size. In non-blocking server-I/O mode, if a line is -currently being input, the input line is then redrawn to accomodate -the changed size. Finally the new values are recorded in \f3gl\f1 for -future use by \f3gl_get_line()\f1. -.sp -The \f3gl_terminal_size()\f1 function allows you to query -the current size of the terminal, and install an alternate -fallback size for cases where the size isn't available. -Beware that the terminal size won't be available if reading -from a pipe or a file, so the default values can be -important even on systems that do support ways of finding -out the terminal size. -.sp -.nf - typedef struct { - int nline; /* The terminal has nline lines */ - int ncolumn; /* The terminal has ncolumn columns */ - } GlTerminalSize; - - GlTerminalSize gl_terminal_size(GetLine *gl, - int def_ncolumn, - int def_nline); -.fi -.sp -This function first updates \f3gl_get_line()\f1's fallback terminal -dimensions, then records its findings in the return value. -.sp -The \f3def_ncolumn\f1 and \f3def_nline\f1 specify the -default number of terminal columns and lines to use if the -terminal size can't be determined via \f3ioctl(TIOCGWINSZ)\f1 or -environment variables. - -.SH HIDING WHAT YOU TYPE - -When entering sensitive information, such as passwords, it is best not -to have the text that you are entering echoed on the terminal. -Furthermore, such text should not be recorded in the history list, -since somebody finding your terminal unattended could then recall it, -or somebody snooping through your directories could see it in your -history file. With this in mind, the \f3gl_echo_mode()\f1 -function allows you to toggle on and off the display and archival of -any text that is subsequently entered in calls to \f3gl_get_line()\f1. - -.sp -.nf - int gl_echo_mode(GetLine *gl, int enable); -.fi -.sp - -The \f3enable\f1 argument specifies whether entered text -should be visible or not. If it is \f30\f1, then -subsequently entered lines will not be visible on the -terminal, and will not be recorded in the history list. If -it is \f31\f1, then subsequent input lines will be displayed -as they are entered, and provided that history hasn't been -turned off via a call to \f3gl_toggle_history()\f1, then -they will also be archived in the history list. Finally, if -the \f3enable\f1 argument is \f3-1\f1, then the echoing mode -is left unchanged, which allows you to non-destructively -query the current setting via the return value. In all -cases, the return value of the function is \f30\f1 if -echoing was disabled before the function was called, and -\f31\f1 if it was enabled. -.sp -When echoing is turned off, note that although tab -completion will invisibly complete your prefix as far as -possible, ambiguous completions will not be displayed. - -.SH SINGLE CHARACTER QUERIES - -Using \f3gl_get_line()\f1 to query the user for a single character -reply, is inconvenient for the user, since they must hit the enter or -return key before the character that they typed is returned to the -program. Thus the \f3gl_query_char()\f1 function has been provided for -single character queries like this. - -.sp -.nf - int gl_query_char(GetLine *gl, const char *prompt, - char defchar); -.fi -.sp - -This function displays the specified prompt at the start of a new -line, and waits for the user to type a character. When the user types -a character, \f3gl_query_char()\f1 displays it to the right of the -prompt, starts a newline, then returns the character to the calling -program. The return value of the function is the character that was -typed. If the read had to be aborted for some reason, \f3EOF\f1 is -returned instead. In the latter case, the application can call the -previously documented \f3gl_return_status()\f1, to find out what went -wrong. This could, for example, have been the reception of a signal, -or the optional inactivity timer going off. - -If the user simply hits enter, the value of the \f3defchar\f1 argument -is substituted. This means that when the user hits either newline or -return, the character specified in \f3defchar\f1, is displayed after -the prompt, as though the user had typed it, as well as being returned -to the calling application. If such a replacement is not important, -simply pass \f3'\n'\f1 as the value of \f3defchar\f1. - -If the entered character is an unprintable character, it is displayed -symbolically. For example, control-A is displayed as ^A, and -characters beyond 127 are displayed in octal, preceded by a -backslash. - -As with \f3gl_get_line()\f1, echoing of the entered character can be -disabled using the \f3gl_echo_mode()\f1 function. - -If the calling process is suspended while waiting for the user to type -their response, the cursor is moved to the line following the prompt -line, then when the process resumes, the prompt is redisplayed, and -\f3gl_query_char()\f1 resumes waiting for the user to type a -character. - -Note that in non-blocking server mode, (see -gl_io_mode(@FUNC_MANEXT@)), if an incomplete input line is in the -process of being read when \f3gl_query_char()\f1 is called, the -partial input line is discarded, and erased from the terminal, before -the new prompt is displayed. The next call to \f3gl_get_line()\f1 will -thus start editing a new line. - -.SH READING RAW CHARACTERS - -Whereas the \f3gl_query_char()\f1 function visibly prompts the user -for a character, and displays what they typed, the -\f3gl_read_char()\f1 function reads a signal character from the user, -without writing anything to the terminal, or perturbing any -incompletely entered input line. This means that it can be called not -only from between calls to \f3gl_get_line()\f1, but also from callback -functions that the application has registered to be called by -\f3gl_get_line()\f1. - -.sp -.nf - int gl_read_char(GetLine *gl); -.fi -.sp - -On success, the return value of \f3gl_read_char()\f1 is the character -that was read. On failure, \f3EOF\f1 is returned, and the -\f3gl_return_status()\f1 function can be called to find out what went -wrong. Possibilities include the optional inactivity timer going off, -the receipt of a signal that is configured to abort gl_get_line(), or -terminal I/O blocking, when in non-blocking server-I/O mode. - -Beware that certain keyboard keys, such as function keys, and cursor -keys, usually generate at least 3 characters each, so a single call to -\f3gl_read_char()\f1 won't be enough to identify such keystrokes. - -.SH CLEARING THE TERMINAL - -The calling program can clear the terminal by calling -\f3gl_erase_terminal()\f1. In non-blocking server-I/O mode, this -function also arranges for the current input line to be redrawn from -scratch when \f3gl_get_line()\f1 is next called. - -.sp -.nf - int gl_erase_terminal(GetLine *gl); -.fi -.sp - -.SH DISPLAYING TEXT DYNAMICALLY - -Between calls to \f3gl_get_line()\f1, the \f3gl_display_text()\f1 -function provides a convenient way to display paragraphs of text, -left-justified and split over one or more terminal lines according to -the constraints of the current width of the terminal. Examples of the -use of this function may be found in the demo programs, where it is -used to display introductions. In those examples the advanced use of -optional prefixes, suffixes and filled lines to draw a box around the -text is also illustrated. - -.sp -.nf - int gl_display_text(GetLine *gl, int indentation, - const char *prefix, - const char *suffix, int fill_char, - int def_width, int start, - const char *string); -.fi -.sp -If \f3gl\f1 isn't currently connected to a terminal, for example if -the output of a program that uses \f3gl_get_line()\f1 is being piped -to another program or redirected to a file, then the value of the -\f3def_width\f1 parameter is used as the terminal width. - -The \f3indentation\f1 argument specifies the number of characters to -use to indent each line of ouput. The \f3fill_char\f1 argument -specifies the character that will be used to perform this indentation. - -The \f3prefix\f1 argument can either be \f3NULL\f1, or be a string to -place at the beginning of each new line (after any indentation). -Similarly, the \f3suffix\f1 argument can either be \f3NULL\f1, or be a -string to place at the end of each line. The suffix is placed flush -against the right edge of the terminal, and any space between its -first character and the last word on that line is filled with the -character specified via the \f3fill_char\f1 argument. Normally the -fill-character is a space. - -The \f3start\f1 argument tells \f3gl_display_text()\f1 how many -characters have already been written to the current terminal line, and -thus tells it the starting column index of the cursor. Since the -return value of \f3gl_display_text()\f1 is the ending column index of -the cursor, by passing the return value of one call to the \f3start\f1 -argument of the next call, a paragraph that is broken between more -than one string can be composed by calling \f3gl_display_text()\f1 for -each successive portion of the paragraph. Note that literal newline -characters are necessary at the end of each paragraph to force a new -line to be started. - -On error, \f3gl_display_text()\f1 returns -1. - -.SH CALLBACK FUNCTION FACILITIES - -Unless otherwise stated, callback functions, such as tab -completion callbacks and event callbacks should not call any -functions in this module. The following functions, however, -are designed specifically to be used by callback functions. -.sp -Calling the \f3gl_replace_prompt()\f1 function from a -callback tells \f3gl_get_line()\f1 to display a different -prompt when the callback returns. Except in non-blocking -server mode, it has no effect if used between calls to -\f3gl_get_line()\f1. In non-blocking server mode (see the -\f3gl_io_mode(@FUNC_MANEXT@)\f1 man page, when used between two calls to -\f3gl_get_line()\f1 that are operating on the same input -line, the current input line will be re-drawn with the new -prompt on the following call to \f3gl_get_line()\f1. - -.sp -.nf - void gl_replace_prompt(GetLine *gl, const char *prompt); -.fi -.sp - -.SH INTERNATIONAL CHARACTER SETS - -Since libtecla version 1.4.0, \f3gl_get_line()\f1 has been 8-bit -clean. This means that all 8-bit characters that are printable in the -user's current locale are now displayed verbatim and included in the -returned input line. Assuming that the calling program correctly -contains a call like the following, -.sp -.nf - setlocale(LC_CTYPE, ""); -.fi -.sp -then the current locale is determined by the first of the environment -variables \f3LC_CTYPE\f1, \f3LC_ALL\f1, and \f3LANG\f1, that is found -to contain a valid locale name. If none of these variables are -defined, or the program neglects to call setlocale, then the default -\f3C\f1 locale is used, which is US 7-bit ASCII. On most unix-like -platforms, you can get a list of valid locales by typing the command: -.sp -.nf - locale -a -.fi -.sp -at the shell prompt. Further documentation on how the user can make use -of this to enter international characters can be found in the -\f3tecla(@MISC_MANEXT@)\f1 man page. - -.SH THREAD SAFETY - -In a multi-threaded program, you should use the libtecla_r.a version -of the library. This uses reentrant versions of system functions, -where available. Unfortunately neither terminfo nor termcap were -designed to be reentrant, so you can't safely use the functions of the -getline module in multiple threads (you can use the separate -file-expansion and word-completion modules in multiple threads, see -the corresponding man pages for details). However due to the use of -POSIX reentrant functions for looking up home directories etc, it is -safe to use this module from a single thread of a multi-threaded -program, provided that your other threads don't use any termcap or -terminfo functions. - -.SH FILES -.nf -libtecla.a - The tecla library -libtecla.h - The tecla header file. -~/.teclarc - The personal tecla customization file. -.fi - -.SH SEE ALSO -.nf -libtecla(@LIBR_MANEXT@), gl_io_mode(@FUNC_MANEXT@), tecla(@MISC_MANEXT@), ef_expand_file(@FUNC_MANEXT@), -cpl_complete_word(@FUNC_MANEXT@), pca_lookup_file(@FUNC_MANEXT@) -.fi - -.SH AUTHOR -Martin Shepherd (mcs@astro.caltech.edu) diff --git a/libtecla/man/func/gl_group_history.in b/libtecla/man/func/gl_group_history.in deleted file mode 100644 index 6e46fc6..0000000 --- a/libtecla/man/func/gl_group_history.in +++ /dev/null @@ -1 +0,0 @@ -.so @FUNC_MANDIR@/gl_get_line.@FUNC_MANEXT@ diff --git a/libtecla/man/func/gl_handle_signal.in b/libtecla/man/func/gl_handle_signal.in deleted file mode 100644 index 24798bc..0000000 --- a/libtecla/man/func/gl_handle_signal.in +++ /dev/null @@ -1 +0,0 @@ -.so @FUNC_MANDIR@/gl_io_mode.@FUNC_MANEXT@ diff --git a/libtecla/man/func/gl_ignore_signal.in b/libtecla/man/func/gl_ignore_signal.in deleted file mode 100644 index 6e46fc6..0000000 --- a/libtecla/man/func/gl_ignore_signal.in +++ /dev/null @@ -1 +0,0 @@ -.so @FUNC_MANDIR@/gl_get_line.@FUNC_MANEXT@ diff --git a/libtecla/man/func/gl_inactivity_timeout.in b/libtecla/man/func/gl_inactivity_timeout.in deleted file mode 100644 index 6e46fc6..0000000 --- a/libtecla/man/func/gl_inactivity_timeout.in +++ /dev/null @@ -1 +0,0 @@ -.so @FUNC_MANDIR@/gl_get_line.@FUNC_MANEXT@ diff --git a/libtecla/man/func/gl_io_mode.in b/libtecla/man/func/gl_io_mode.in deleted file mode 100644 index 0bcca8b..0000000 --- a/libtecla/man/func/gl_io_mode.in +++ /dev/null @@ -1,571 +0,0 @@ -.\" Copyright (c) 2002, 2003, 2004, 2012 by Martin C. Shepherd -.\" -.\" All rights reserved. -.\" -.\" Permission is hereby granted, free of charge, to any person obtaining a -.\" copy of this software and associated documentation files (the -.\" "Software"), to deal in the Software without restriction, including -.\" without limitation the rights to use, copy, modify, merge, publish, -.\" distribute, and/or sell copies of the Software, and to permit persons -.\" to whom the Software is furnished to do so, provided that the above -.\" copyright notice(s) and this permission notice appear in all copies of -.\" the Software and that both the above copyright notice(s) and this -.\" permission notice appear in supporting documentation. -.\" -.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT -.\" OF THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR -.\" HOLDERS INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL -.\" INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING -.\" FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, -.\" NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION -.\" WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -.\" -.\" Except as contained in this notice, the name of a copyright holder -.\" shall not be used in advertising or otherwise to promote the sale, use -.\" or other dealings in this Software without prior written authorization -.\" of the copyright holder. -.TH gl_io_mode @FUNC_MANEXT@ -.SH NAME - gl_io_mode, gl_raw_io, gl_normal_io, gl_tty_signals, gl_abandon_line, - gl_handle_signal, gl_pending_io \- How to use gl_get_line() from an external event loop. -.SH SYNOPSIS -.nf -#include <libtecla.h> - -int gl_io_mode(GetLine *gl, GlIOMode mode); - -int gl_raw_io(GetLine *gl); - -int gl_normal_io(GetLine *gl); - -int gl_tty_signals(void (*term_handler)(int), - void (*susp_handler)(int), - void (*cont_handler)(int), - void (*size_handler)(int)); - -void gl_abandon_line(GetLine *gl); - -void gl_handle_signal(int signo, GetLine *gl, int ngl); - -GlPendingIO gl_pending_io(GetLine *gl); - -.fi - -.SH DESCRIPTION - -The \f3gl_get_line()\f1 function, which is documented separately in -the \f3gl_get_line(@FUNC_MANEXT@)\f1 man page, supports two different I/O modes. -These are selected by calling the \f3gl_io_mode()\f1 function. - -.sp -.nf - int gl_io_mode(GetLine *gl, GlIOMode mode); -.fi -.sp - -The \f3mode\f1 argument of this function specifies the new I/O mode, -and must be one of the following. - -.sp -.nf - GL_NORMAL_MODE - Select the normal blocking-I/O mode. - In this mode \f3gl_get_line()\f1 - doesn't return until either an error - occurs of the user finishes entering a - new line. This mode is the focus of - the \f3gl_get_line(@FUNC_MANEXT@)\f1 man page. - - GL_SERVER_MODE - Select non-blocking server I/O mode. - In this mode, since non-blocking - terminal I/O is used, the entry of - each new input line typically requires - many calls to \f3gl_get_line()\f1 from - an external I/O-driven event loop. - This mode is the focus of this man - page. -.fi -.sp - -Newly created \f3GetLine\f1 objects start in normal I/O -mode, so to switch to non-blocking server mode requires an -initial call to \f3gl_io_mode()\f1. - -.SH SERVER I/O MODE - -In non-blocking server I/O mode, the application is required -to have an event loop which calls \f3gl_get_line()\f1 -whenever the terminal file descriptor can do the type I/O -that \f3gl_get_line()\f1 is waiting for. To determine which -type of I/O \f3gl_get_line()\f1 is waiting for, the -application calls the \f3gl_pending_io()\f1 function. - -.sp -.nf - GlPendingIO gl_pending_io(GetLine *gl); -.fi -.sp - -The return value of this function is one of the following two -enumerated values. - -.sp -.nf - GLP_READ - gl_get_line() is waiting to write a - character to the terminal. - - GLP_WRITE - gl_get_line() is waiting to read a - character from the keyboad. -.fi -.sp - -If the application is using either the \f3select()\f1 or \f3poll()\f1 -system calls to watch for I/O on a group of file descriptors, then it -should call the \f3gl_pending_io()\f1 function before each call to -these functions to see which direction of I/O it should tell them to -watch for, and configure their arguments accordingly. In the case of -the \f3select()\f1 system call, this means using the \f3FD_SET()\f1 -macro to add the terminal file descriptor either to the set of file -descriptors to be watched for readability, or the set to be watched -for writability. - -As in normal I/O mode, the return value of \f3gl_get_line()\f1 is -either a pointer to a completed input line, or \f3NULL\f1. However, -whereas in normal I/O mode a \f3NULL\f1 return value always means that -an error occurred, in non-blocking server mode, \f3NULL\f1 is also -returned when \f3gl_get_line()\f1 can't read or write to the terminal -without blocking. Thus in non-blocking server mode, in order to -determine when a \f3NULL\f1 return value signifies that an error -occurred or not, it is necessary to call the \f3gl_return_status()\f1 -function. If this function returns the enumerated value, -\f3GLR_BLOCKED\f1, as documented in the \f3gl_get_line(@FUNC_MANEXT@)\f1 man page, -this means that \f3gl_get_line()\f1 is waiting for I/O, and no error -has occurred. - -When \f3gl_get_line()\f1 returns \f3NULL\f1 and -\f3gl_return_status()\f1 indicates that this is due to blocked -terminal I/O, the application should call \f3gl_get_line()\f1 again -when the type of I/O reported by \f3gl_pending_io()\f1 becomes -possible. The \f3prompt\f1, \f3start_line\f1 and \f3start_pos\f1 -arguments of \f3gl_get_line()\f1 will be ignored on these calls. If -you need to change the prompt of the line that is currently being -edited, then you can call the \f3gl_replace_prompt()\f1 function -(documented in the \f3gl_get_line(@FUNC_MANEXT@) man page) between calls to -\f3gl_get_line()\f1. - -.SH GIVING UP THE TERMINAL - -A complication that is unique to non-blocking server mode is that it -requires that the terminal be left in raw mode between calls to -\f3gl_get_line()\f1. If this weren't the case, the external event loop -wouldn't be able to detect individual key-presses, and the basic line -editing implemented by the terminal driver would clash with the -editing provided by \f3gl_get_line()\f1. What this means is that any -time that the terminal needs to be used for other things than entering -a new input line with \f3gl_get_line()\f1, it needs to be restored to -a usable state. In particular, whenever the process is suspended or -terminated, the terminal must be returned to a normal state. If this -isn't done, then depending on the characteristics of the shell that -was used to invoke the program, the user may end up with a hung -terminal. To this end, the \f3gl_normal_io()\f1 function is provided -for switching the terminal back to the state that it was in when raw -mode was last established. - -.sp -.nf - int gl_normal_io(GetLine *gl); -.fi -.sp - -What this function does is first flush any pending output to the -terminal, then move the cursor to the start of the terminal line which -follows the end of the incompletely entered input line. At this point -it is safe to suspend or terminate the process, and it is safe for the -application to read and write to the terminal. To resume entry of the -input line, the application should call the \f3gl_raw_io()\f1 -function. - -.sp -.nf - int gl_raw_io(GetLine *gl); -.fi -.sp - -This function starts a new line, redisplays the partially completed -input line (if any), restores the cursor position within this line to -where it was when \f3gl_normal_io()\f1 was called, then switches back -to raw, non-blocking terminal mode ready to continue entry of the -input line when \f3gl_get_line()\f1 is next called. - -Note that in non-blocking server mode, if \f3gl_get_line()\f1 is -called after a call to \f3gl_normal_io()\f1, without an intervening -call to \f3gl_raw_io()\f1, \f3gl_get_line()\f1 will call -\f3gl_raw_mode()\f1 itself, and the terminal will remain in this mode -when \f3gl_get_line()\f1 returns. - -.SH SIGNAL HANDLING - -In the previous section it was pointed out that in non-blocking server -mode, the terminal must be restored to a sane state whenever a signal -is received that either suspends or terminates the process. In normal -I/O mode, this is done for you by \f3gl_get_line()\f1, but in -non-blocking server mode, since the terminal is left in raw mode -between calls to \f3gl_get_line()\f1, this signal handling has to be -done by the application. Since there are many signals that can suspend -or terminate a process, as well as other signals that are important to -\f3gl_get_line()\f1, such as the \f3SIGWINCH\f1 signal, which tells it -when the terminal size has changed, the \f3gl_tty_signals()\f1 -function is provided for installing signal handlers for all pertinent -signals. - -.sp -.nf - int gl_tty_signals(void (*term_handler)(int), - void (*susp_handler)(int), - void (*cont_handler)(int), - void (*size_handler)(int)); -.fi -.sp - -What this does is use \f3gl_get_line()\f1's internal list of signals -to assign specified signal handlers to groups of signals. The -arguments of this function are as follows. - -.sp -.nf - term_handler - This is the signal handler that is to be - used to trap signals that by default - terminate any process that receives - them (eg. SIGINT or SIGTERM). - - susp_handler - This is the signal handler that is to be - used to trap signals that by default - suspend any process that receives them, - (eg. SIGTSTP or SIGTTOU). - - cont_handler - This is the signal handler that is to be - used to trap signals that are usually - sent when a process resumes after being - suspended (usually SIGCONT). Beware that there is - nothing to stop a user from sending one of these - signals at other times. - - size_handler - This signal handler is used to trap - signals that are sent to processes when - their controlling terminals are resized - by the user (eg. SIGWINCH). -.fi -.sp - -These arguments can all be the same, if so desired, and you can -specify \f3SIG_IGN\f1 (ignore this signal) or \f3SIG_DFL\f1 (use the -system-provided default signal handler) instead of a function where -pertinent. In particular, it is rarely useful to trap \f3SIGCONT\f1, -so the \f3cont_handler\f1 argument will usually be \f3SIG_DFL\f1 or -\f3SIG_IGN\f1. - -The \f3gl_tty_signals()\f1 function uses the POSIX \f3sigaction()\f1 -function to install these signal handlers, and it is careful to use -the \f3sa_mask\f1 member of each sigaction structure to ensure that -only one of these signals is ever delivered at a time. This guards -against different instances of these signal handlers from -simultaneously trying to write to common global data, such as a shared -\f3sigsetjmp()\f1 buffer or a signal-received flag. - -The signal handlers that are installed by this function, should call -the \f3gl_handle_signal(). - -.sp -.nf - void gl_handle_signal(int signo, GetLine *gl, int ngl); -.fi -.sp - -The \f3signo\f1 argument tells this function which signal it is being -asked to respond to, and the \f3gl\f1 argument should be a pointer to -the first element of an array of \f3ngl\f1 \f3GetLine\f1 objects. If -your application only has one of these objects, just pass its pointer -as the \f3gl\f1 argument and specify \f3ngl\f1 as \f31\f1. - -Depending on the signal that is being handled, this function does -different things. - -.SS Terminal resize signals (SIGWINCH) - -If the signal indicates that the terminal was resized, then it -arranges for the next call to \f3gl_get_line()\f1 to ask the terminal -for its new size and redraw the input line accordingly. In order that -\f3gl_get_line()\f1 be called as soon as possible to do this, -\f3gl_handle_signal()\f1 also arranges that the next call to -\f3gl_pending_io()\f1 will return \f3GLP_WRITE\f1. Thus if the -application waits for I/O in \f3select()\f1 or \f3poll()\f1, then the -application needs to ensure that these functions will be reliably -aborted when a signal is caught and handled by the application. More -on this below. - -.SH Process termination signals. - -If the signal that was caught is one of those that by default -terminates any process that receives it, then \f3gl_handle_signal()\f1 -does the following steps. - -1. First it blocks the delivery of all signals that can be - blocked (ie. \f3SIGKILL\f1 and \f3SIGSTOP\f1 can't be blocked) - -2. Next it calls \f3gl_normal_io()\f1 for each of the \f3ngl\f1 - \f3GetLine\f1 objects. Note that this does nothing to any of the - \f3GetLine\f1 objects that aren't currently in raw mode. - -3. Next it sets the signal handler of the signal to its default, - process-termination disposition. - -4. Next it re-sends the process the signal that was caught. - -5. Finally it unblocks delivery of this signal, which - results in the process being terminated. - -.SH Process suspension signals. - -If the default disposition of the signal is to suspend the process, -the same steps are executed as for process termination signals, except -that when the process is later resumed, \f3gl_handle_signal()\f1 -continues, and does the following steps. - -6. It re-blocks delivery of the signal. - -7. It reinstates the signal handler of the signal to the one - that was displaced when its default disposition was substituted. - -8. For any of the \f3GetLine\f1 objects that were in raw mode when - \f3gl_handle_signal()\f1 was called, \f3gl_handle_signal()\f1 then - calls \f3gl_raw_io()\f1, to resume entry of the input lines on - those terminals. - -9. Finally, it restores the signal process mask to how it - was when \f3gl_handle_signal()\f1 was called. - -Note that the process is suspended or terminated using the original -signal that was caught, rather than using the uncatchable -\f3SIGSTOP\f1 and \f3SIGKILL\f1 signals. This is important, because -when a process is suspended or terminated, the parent of the process -may wish to use the status value returned by the \f3wait()\f1 system -call to figure out which signal was responsible. In particular, most -shells use this information to print a corresponding message to the -terminal. Users would be rightly confused if when their process -received a \f3SIGPIPE\f1 signal, the program responded by sending -itself a \f3SIGKILL\f1 signal, and the shell then printed out the -provocative statement, "Killed!". - -.SH INTERRUPTING THE EVENT LOOP - -If a signal is caught and handled when the application's event loop is -waiting in \f3select()\f1 or \f3poll()\f1, these functions will be -aborted with \f3errno\f1 set to \f3EINTR\f1. When this happens the -event loop should call \f3gl_pending_io()\f1, before calling -\f3select()\f1 or \f3poll()\f1 again. It should then arrange for -\f3select()\f1 or \f3poll()\f1 to wait for the type of I/O that this -reports. This is necessary, because any signal handler which calls -\f3gl_handle_signal()\f1, will frequently change the type of I/O that -\f3gl_get_line()\f1 is waiting for. - -Unfortunately, if a signal arrives between the statements which -configure the arguments of \f3select()\f1 or \f3poll()\f1 and the -calls to these functions, then the signal will not be seen by these -functions, which will then not be aborted. If these functions are -waiting for keyboard input from the user when the signal is received, -and the signal handler arranges to redraw the input line to accomodate -a terminal resize or the resumption of the process, then this -redisplay will be end up being delayed until the user hits the next -key. Apart from puzzling the user, this clearly isn't a serious -problem. However there is a way, albeit complicated, to completely -avoid this race condition. The following steps illustrate this. - -1. Block all of the signals that \f3gl_get_line()\f1 catches, - by passing the signal set returned by \f3gl_list_signals()\f1 to - \f3sigprocmask()\f1. - -2. Call \f3gl_pending_io()\f1 and set up the arguments of - \f3select()\f1 or \f3poll()\f1 accordingly. - -3. Call \f3sigsetjmp()\f1 with a non-zero \f3savesigs\f1 argument. - -4. Initially this \f3sigsetjmp()\f1 statement will return zero, - indicating that control isn't resuming there after a matching - call to \f3siglongjmp()\f1. - -5. Replace all of the handlers of the signals that \f3gl_get_line()\f1 - is configured to catch, with a signal handler that first records - the number of the signal that was caught, in a file-scope variable, - then calls \f3siglongjmp()\f1 with a non-zero value argument, to - return execution to the above \f3sigsetjmp()\f1 - statement. Registering these signal handlers can conveniently be - done using the \f3gl_tty_signals()\f1 function. - -6. Set the file-scope variable that the above signal handler uses to - record any signal that is caught to -1, so that we can check - whether a signal was caught by seeing if it contains a valid signal - number. - -7. Now unblock the signals that were blocked in step 1. Any signal - that was received by the process in between step 1 and now will - now be delivered, and trigger our signal handler, as will any - signal that is received until we block these signals again. - -8. Now call \f3select()\f1 or \f3poll()\f1. - -9. When \f3select()\f1 returns, again block the signals that were - unblocked in step 7. - -If a signal is arrived any time during the above steps, our signal -handler will be triggered and cause control to return to the -\f3sigsetjmp()\f1 statement, where this time, \f3sigsetjmp()\f1 will -return non-zero, indicating that a signal was caught. When this -happens we simply skip the above block of statements, and continue -with the following statements, which are executed regardless of -whether or not a signal is caught. Note that when \f3sigsetjmp()\f1 -returns, regardless of why it returned, the process signal mask is -returned to how it was when \f3sigsetjmp()\f1 was called. Thus the -following statements are always executed with all of our signals -blocked. - -9. Reinstate the signal handlers that were displaced in step 5. - -10. Check wether a signal was caught, by checking the file-scope - variable that the signal handler records signal numbers in. - -11. If a signal was caught, send this signal to the application - again, and unblock just this signal, so that it invokes the - signal handler which we just reinstated in step 10. - -12. Unblock all of the signals that were blocked in step 7. - -Since this is complicated, note that \f3demo3.c\f1 includes a working -example of how to do this. The method used there however, is more -general than the above. What it provides is a wrapper function around -\f3select()\f1 which encompasses steps 3 to 11. In this wrapper, -rather than use \f3gl_list_signals()\f1 to figure out the signals to -block, and and \f3gl_tty_signals()\f1 to assign and revert signal -handlers, one of its arguments is a \f3sigset_t\f1 which specifies -which signals to block and assign signal handlers to. This function -thus doesn't depend on \f3gl_get_line()\f1 and can thus be used in -other situations where race-condition-free signal handling is -required. - -.SH SIGNALS CAUGHT BY GL_GET_LINE - -Since the application is expected to handle signals in non-blocking -server mode, \f3gl_get_line()\f1 doesn't attempt to duplicate this -when it is being called. If one of the signals that it is configured -to catch is sent to the application while \f3gl_get_line()\f1 is being -called, \f3gl_get_line()\f1 reinstates the caller's signal handlers, -then just before returning, re-sends the signal to the process to let -the application's signal handler handle it. If the process isn't -terminated by this signal, \f3gl_get_line()\f1 returns \f3NULL\f1, and -a following call to \f3gl_return_status()\f1 returns the enumerated -value \f3GLR_SIGNAL\f1. - -.SH ABORTING LINE INPUT - -Often, rather than letting it terminate the process, applications -respond to the SIGINT user-interrupt signal by aborting the current -input line. The way to do this in non-blocking server-I/O mode is to -not call \f3gl_handle_signal()\f1 when this signal is caught, but -instead to call the \f3gl_abandon_line()\f1. - -.sp -.nf - void gl_abandon_line(GetLine *gl); -.fi -.sp - -This function arranges that when \f3gl_get_line()\f1 is next called, -it first flushes any pending output to the terminal, then discardes -the current input line, outputs a new prompt on the next line, and -finally starts accepting input of a new input line from the user. - -.SH SIGNAL SAFE FUNCTIONS - -Provided that certain rules are followed, the following functions can -have been written to be safely callable from signal handlers. Other -functions in this library should not be called from signal handlers. - -.sp -.nf - gl_normal_io() - gl_raw_io() - gl_handle_signal() - gl_abandon_line() -.fi -.sp - -In order for this to be true, all signal handlers that call these -functions must be registered in such a way that only one instance of -any one of them can be running at one time. The way to do this is to -use the POSIX \f3sigaction()\f1 function to register all signal -handlers, and when doing this, use the \f3sa_mask\f1 member of the -corresponding sigaction structure, to indicate that all of the signals -who's handlers invoke the above functions, should be blocked when the -current signal is being handled. This prevents two signal handlers -from operating on a \f3GetLine\f1 object at the same time. - -To prevent signal handlers from accessing a \f3GetLine\f1 object while -\f3gl_get_line()\f1 or any of its associated public functions are -operating on it, all public functions associated with -\f3gl_get_line()\f1, including \f3gl_get_line()\f1 itself, temporarily -block the delivery of signals when they are accessing \f3GetLine\f1 -objects. Beware that the only signals that they block are the signals -that \f3gl_get_line()\f1 is currently configured to catch, so be sure -that if you call any of the above functions from signal handlers, that -the signals that these handlers are assigned to are configured to be -caught by \f3gl_get_line()\f1 (see \f3gl_trap_signal()\f1). - -.SH USING TIMEOUTS TO POLL - -If instead of using \f3select()\f1 or \f3poll()\f1 to wait for I/O, -your application just needs to get out of \f3gl_get_line()\f1 -periodically to briefly do something else before returning to accept -input from the user, this can be done in non-blocking server mode by -using the \f3gl_inactivity_timeout()\f1 function (see -\f3gl_get_line(@FUNC_MANEXT@)\f1), to specify that a callback function that -returns \f3GLTO_CONTINUE\f1 should be called whenever -\f3gl_get_line()\f1 has been waiting for I/O for more than a specified -amount of time. - -When this callback is triggered, \f3gl_get_line()\f1 will return -\f3NULL\f1, and a following call to \f3gl_return_status()\f1 will -return \f3GLR_BLOCKED\f1. - -Beware that \f3gl_get_line()\f1 won't return until the user -hasn't typed a key for the specified interval, so if the -interval is long, and the user keeps typing, -\f3gl_get_line()\f1 may not return for a while. In other -words there is no guarantee that it will return in the time -specified. - -.SH THE SERVER DEMO PROGRAM - -The \f3demo3\f1 program that is distributed with the library, provides -a working example of how to use non-blocking server I/O mode in a real -program. As far as the user is concerned, this program operates -identically to the main demo program (called \f3demo\f1), except that -whereas the main demo program uses the normal blocking I/O mode, -\f3demo3\f1 using non-blocking I/O and an external event loop. The -source code can be found in \f3demo3.c\f1, and the comments therein -explain the various steps. - -.SH FILES -.nf -libtecla.a - The tecla library -libtecla.h - The tecla header file. -.fi - -.SH SEE ALSO - -.nf -libtecla(@LIBR_MANEXT@), gl_get_line(@FUNC_MANEXT@), tecla(@MISC_MANEXT@), ef_expand_file(@FUNC_MANEXT@), -cpl_complete_word(@FUNC_MANEXT@), pca_lookup_file(@FUNC_MANEXT@) -.fi - -.SH AUTHOR -Martin Shepherd (mcs@astro.caltech.edu) diff --git a/libtecla/man/func/gl_last_signal.in b/libtecla/man/func/gl_last_signal.in deleted file mode 100644 index 6e46fc6..0000000 --- a/libtecla/man/func/gl_last_signal.in +++ /dev/null @@ -1 +0,0 @@ -.so @FUNC_MANDIR@/gl_get_line.@FUNC_MANEXT@ diff --git a/libtecla/man/func/gl_limit_history.in b/libtecla/man/func/gl_limit_history.in deleted file mode 100644 index 6e46fc6..0000000 --- a/libtecla/man/func/gl_limit_history.in +++ /dev/null @@ -1 +0,0 @@ -.so @FUNC_MANDIR@/gl_get_line.@FUNC_MANEXT@ diff --git a/libtecla/man/func/gl_list_signals.in b/libtecla/man/func/gl_list_signals.in deleted file mode 100644 index 6e46fc6..0000000 --- a/libtecla/man/func/gl_list_signals.in +++ /dev/null @@ -1 +0,0 @@ -.so @FUNC_MANDIR@/gl_get_line.@FUNC_MANEXT@ diff --git a/libtecla/man/func/gl_load_history.in b/libtecla/man/func/gl_load_history.in deleted file mode 100644 index 6e46fc6..0000000 --- a/libtecla/man/func/gl_load_history.in +++ /dev/null @@ -1 +0,0 @@ -.so @FUNC_MANDIR@/gl_get_line.@FUNC_MANEXT@ diff --git a/libtecla/man/func/gl_lookup_history.in b/libtecla/man/func/gl_lookup_history.in deleted file mode 100644 index 6e46fc6..0000000 --- a/libtecla/man/func/gl_lookup_history.in +++ /dev/null @@ -1 +0,0 @@ -.so @FUNC_MANDIR@/gl_get_line.@FUNC_MANEXT@ diff --git a/libtecla/man/func/gl_normal_io.in b/libtecla/man/func/gl_normal_io.in deleted file mode 100644 index 24798bc..0000000 --- a/libtecla/man/func/gl_normal_io.in +++ /dev/null @@ -1 +0,0 @@ -.so @FUNC_MANDIR@/gl_io_mode.@FUNC_MANEXT@ diff --git a/libtecla/man/func/gl_pending_io.in b/libtecla/man/func/gl_pending_io.in deleted file mode 100644 index 24798bc..0000000 --- a/libtecla/man/func/gl_pending_io.in +++ /dev/null @@ -1 +0,0 @@ -.so @FUNC_MANDIR@/gl_io_mode.@FUNC_MANEXT@ diff --git a/libtecla/man/func/gl_prompt_style.in b/libtecla/man/func/gl_prompt_style.in deleted file mode 100644 index 6e46fc6..0000000 --- a/libtecla/man/func/gl_prompt_style.in +++ /dev/null @@ -1 +0,0 @@ -.so @FUNC_MANDIR@/gl_get_line.@FUNC_MANEXT@ diff --git a/libtecla/man/func/gl_query_char.in b/libtecla/man/func/gl_query_char.in deleted file mode 100644 index 6e46fc6..0000000 --- a/libtecla/man/func/gl_query_char.in +++ /dev/null @@ -1 +0,0 @@ -.so @FUNC_MANDIR@/gl_get_line.@FUNC_MANEXT@ diff --git a/libtecla/man/func/gl_range_of_history.in b/libtecla/man/func/gl_range_of_history.in deleted file mode 100644 index 6e46fc6..0000000 --- a/libtecla/man/func/gl_range_of_history.in +++ /dev/null @@ -1 +0,0 @@ -.so @FUNC_MANDIR@/gl_get_line.@FUNC_MANEXT@ diff --git a/libtecla/man/func/gl_raw_io.in b/libtecla/man/func/gl_raw_io.in deleted file mode 100644 index 24798bc..0000000 --- a/libtecla/man/func/gl_raw_io.in +++ /dev/null @@ -1 +0,0 @@ -.so @FUNC_MANDIR@/gl_io_mode.@FUNC_MANEXT@ diff --git a/libtecla/man/func/gl_read_char.in b/libtecla/man/func/gl_read_char.in deleted file mode 100644 index 6e46fc6..0000000 --- a/libtecla/man/func/gl_read_char.in +++ /dev/null @@ -1 +0,0 @@ -.so @FUNC_MANDIR@/gl_get_line.@FUNC_MANEXT@ diff --git a/libtecla/man/func/gl_register_action.in b/libtecla/man/func/gl_register_action.in deleted file mode 100644 index 6e46fc6..0000000 --- a/libtecla/man/func/gl_register_action.in +++ /dev/null @@ -1 +0,0 @@ -.so @FUNC_MANDIR@/gl_get_line.@FUNC_MANEXT@ diff --git a/libtecla/man/func/gl_resize_history.in b/libtecla/man/func/gl_resize_history.in deleted file mode 100644 index 6e46fc6..0000000 --- a/libtecla/man/func/gl_resize_history.in +++ /dev/null @@ -1 +0,0 @@ -.so @FUNC_MANDIR@/gl_get_line.@FUNC_MANEXT@ diff --git a/libtecla/man/func/gl_return_status.in b/libtecla/man/func/gl_return_status.in deleted file mode 100644 index 6e46fc6..0000000 --- a/libtecla/man/func/gl_return_status.in +++ /dev/null @@ -1 +0,0 @@ -.so @FUNC_MANDIR@/gl_get_line.@FUNC_MANEXT@ diff --git a/libtecla/man/func/gl_save_history.in b/libtecla/man/func/gl_save_history.in deleted file mode 100644 index 6e46fc6..0000000 --- a/libtecla/man/func/gl_save_history.in +++ /dev/null @@ -1 +0,0 @@ -.so @FUNC_MANDIR@/gl_get_line.@FUNC_MANEXT@ diff --git a/libtecla/man/func/gl_set_term_size.in b/libtecla/man/func/gl_set_term_size.in deleted file mode 100644 index 6e46fc6..0000000 --- a/libtecla/man/func/gl_set_term_size.in +++ /dev/null @@ -1 +0,0 @@ -.so @FUNC_MANDIR@/gl_get_line.@FUNC_MANEXT@ diff --git a/libtecla/man/func/gl_show_history.in b/libtecla/man/func/gl_show_history.in deleted file mode 100644 index 6e46fc6..0000000 --- a/libtecla/man/func/gl_show_history.in +++ /dev/null @@ -1 +0,0 @@ -.so @FUNC_MANDIR@/gl_get_line.@FUNC_MANEXT@ diff --git a/libtecla/man/func/gl_size_of_history.in b/libtecla/man/func/gl_size_of_history.in deleted file mode 100644 index 6e46fc6..0000000 --- a/libtecla/man/func/gl_size_of_history.in +++ /dev/null @@ -1 +0,0 @@ -.so @FUNC_MANDIR@/gl_get_line.@FUNC_MANEXT@ diff --git a/libtecla/man/func/gl_state_of_history.in b/libtecla/man/func/gl_state_of_history.in deleted file mode 100644 index 6e46fc6..0000000 --- a/libtecla/man/func/gl_state_of_history.in +++ /dev/null @@ -1 +0,0 @@ -.so @FUNC_MANDIR@/gl_get_line.@FUNC_MANEXT@ diff --git a/libtecla/man/func/gl_terminal_size.in b/libtecla/man/func/gl_terminal_size.in deleted file mode 100644 index 6e46fc6..0000000 --- a/libtecla/man/func/gl_terminal_size.in +++ /dev/null @@ -1 +0,0 @@ -.so @FUNC_MANDIR@/gl_get_line.@FUNC_MANEXT@ diff --git a/libtecla/man/func/gl_toggle_history.in b/libtecla/man/func/gl_toggle_history.in deleted file mode 100644 index 6e46fc6..0000000 --- a/libtecla/man/func/gl_toggle_history.in +++ /dev/null @@ -1 +0,0 @@ -.so @FUNC_MANDIR@/gl_get_line.@FUNC_MANEXT@ diff --git a/libtecla/man/func/gl_trap_signal.in b/libtecla/man/func/gl_trap_signal.in deleted file mode 100644 index 6e46fc6..0000000 --- a/libtecla/man/func/gl_trap_signal.in +++ /dev/null @@ -1 +0,0 @@ -.so @FUNC_MANDIR@/gl_get_line.@FUNC_MANEXT@ diff --git a/libtecla/man/func/gl_tty_signals.in b/libtecla/man/func/gl_tty_signals.in deleted file mode 100644 index 24798bc..0000000 --- a/libtecla/man/func/gl_tty_signals.in +++ /dev/null @@ -1 +0,0 @@ -.so @FUNC_MANDIR@/gl_io_mode.@FUNC_MANEXT@ diff --git a/libtecla/man/func/gl_watch_fd.in b/libtecla/man/func/gl_watch_fd.in deleted file mode 100644 index 6e46fc6..0000000 --- a/libtecla/man/func/gl_watch_fd.in +++ /dev/null @@ -1 +0,0 @@ -.so @FUNC_MANDIR@/gl_get_line.@FUNC_MANEXT@ diff --git a/libtecla/man/func/libtecla_version.in b/libtecla/man/func/libtecla_version.in deleted file mode 100644 index 31867c4..0000000 --- a/libtecla/man/func/libtecla_version.in +++ /dev/null @@ -1 +0,0 @@ -.so @LIBR_MANDIR@/libtecla.@LIBR_MANEXT@ diff --git a/libtecla/man/func/new_CplFileConf.in b/libtecla/man/func/new_CplFileConf.in deleted file mode 100644 index 734f281..0000000 --- a/libtecla/man/func/new_CplFileConf.in +++ /dev/null @@ -1 +0,0 @@ -.so @FUNC_MANDIR@/cpl_complete_word.@FUNC_MANEXT@ diff --git a/libtecla/man/func/new_ExpandFile.in b/libtecla/man/func/new_ExpandFile.in deleted file mode 100644 index 3d0a884..0000000 --- a/libtecla/man/func/new_ExpandFile.in +++ /dev/null @@ -1 +0,0 @@ -.so @FUNC_MANDIR@/ef_expand_file.@FUNC_MANEXT@ diff --git a/libtecla/man/func/new_GetLine.in b/libtecla/man/func/new_GetLine.in deleted file mode 100644 index 6e46fc6..0000000 --- a/libtecla/man/func/new_GetLine.in +++ /dev/null @@ -1 +0,0 @@ -.so @FUNC_MANDIR@/gl_get_line.@FUNC_MANEXT@ diff --git a/libtecla/man/func/new_PathCache.in b/libtecla/man/func/new_PathCache.in deleted file mode 100644 index dbc4da7..0000000 --- a/libtecla/man/func/new_PathCache.in +++ /dev/null @@ -1 +0,0 @@ -.so @FUNC_MANDIR@/pca_lookup_file.@FUNC_MANEXT@ diff --git a/libtecla/man/func/new_PcaPathConf.in b/libtecla/man/func/new_PcaPathConf.in deleted file mode 100644 index dbc4da7..0000000 --- a/libtecla/man/func/new_PcaPathConf.in +++ /dev/null @@ -1 +0,0 @@ -.so @FUNC_MANDIR@/pca_lookup_file.@FUNC_MANEXT@ diff --git a/libtecla/man/func/new_WordCompletion.in b/libtecla/man/func/new_WordCompletion.in deleted file mode 100644 index 734f281..0000000 --- a/libtecla/man/func/new_WordCompletion.in +++ /dev/null @@ -1 +0,0 @@ -.so @FUNC_MANDIR@/cpl_complete_word.@FUNC_MANEXT@ diff --git a/libtecla/man/func/pca_last_error.in b/libtecla/man/func/pca_last_error.in deleted file mode 100644 index dbc4da7..0000000 --- a/libtecla/man/func/pca_last_error.in +++ /dev/null @@ -1 +0,0 @@ -.so @FUNC_MANDIR@/pca_lookup_file.@FUNC_MANEXT@ diff --git a/libtecla/man/func/pca_lookup_file.in b/libtecla/man/func/pca_lookup_file.in deleted file mode 100644 index e74114a..0000000 --- a/libtecla/man/func/pca_lookup_file.in +++ /dev/null @@ -1,365 +0,0 @@ -.\" Copyright (c) 2001, 2002, 2003, 2004, 2012 by Martin C. Shepherd -.\" -.\" All rights reserved. -.\" -.\" Permission is hereby granted, free of charge, to any person obtaining a -.\" copy of this software and associated documentation files (the -.\" "Software"), to deal in the Software without restriction, including -.\" without limitation the rights to use, copy, modify, merge, publish, -.\" distribute, and/or sell copies of the Software, and to permit persons -.\" to whom the Software is furnished to do so, provided that the above -.\" copyright notice(s) and this permission notice appear in all copies of -.\" the Software and that both the above copyright notice(s) and this -.\" permission notice appear in supporting documentation. -.\" -.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT -.\" OF THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR -.\" HOLDERS INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL -.\" INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING -.\" FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, -.\" NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION -.\" WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -.\" -.\" Except as contained in this notice, the name of a copyright holder -.\" shall not be used in advertising or otherwise to promote the sale, use -.\" or other dealings in this Software without prior written authorization -.\" of the copyright holder. -.TH pca_lookup_file @FUNC_MANEXT@ -.SH NAME -pca_lookup_file, del_PathCache, del_PcaPathConf, new_PathCache, new_PcaPathConf, pca_last_error, pca_path_completions, pca_scan_path, pca_set_check_fn, ppc_file_start, ppc_literal_escapes \- lookup a file in a list of directories -.SH SYNOPSIS -.nf -#include <libtecla.h> - -PathCache *new_PathCache(void); - -PathCache *del_PathCache(PathCache *pc); - -int pca_scan_path(PathCache *pc, const char *path); - -void pca_set_check_fn(PathCache *pc, CplCheckFn *check_fn, - void *data); - -char *pca_lookup_file(PathCache *pc, const char *name, - int name_len, int literal); - -const char *pca_last_error(PathCache *pc); - -CPL_MATCH_FN(pca_path_completions); - -.fi - -.SH DESCRIPTION - -The \f3PathCache\f1 object is part of the tecla library (see the -libtecla(@LIBR_MANEXT@) man page). -.sp -\f3PathCache\f1 objects allow an application to search for files in -any colon separated list of directories, such as the unix execution -PATH environment variable. Files in absolute directories are cached in -a \f3PathCache\f1 object, whereas relative directories are scanned as -needed. Using a \f3PathCache\f1 object, you can look up the full -pathname of a simple filename, or you can obtain a list of the -possible completions of a given filename prefix. By default all files -in the list of directories are targets for lookup and completion, but -a versatile mechanism is provided for only selecting specific types of -files. The obvious application of this facility is to provide -Tab-completion and lookup of executable commands in the unix PATH, so -an optional callback which rejects all but executable files, is -provided. -.sp -.SH AN EXAMPLE - -Under UNIX, the following example program looks up and displays the -full pathnames of each of the command names on the command line. -.sp -.nf - #include <stdio.h> - #include <stdlib.h> - #include <libtecla.h> - - int main(int argc, char *argv[]) - { - int i; - /* - * Create a cache for executable files. - */ - PathCache *pc = new_PathCache(); - if(!pc) - exit(1); - /* - * Scan the user's PATH for executables. - */ - if(pca_scan_path(pc, getenv("PATH"))) { - fprintf(stderr, "%s\\n", pca_last_error(pc)); - exit(1); - } - /* - * Arrange to only report executable files. - */ - pca_set_check_fn(pc, cpl_check_exe, NULL); - /* - * Lookup and display the full pathname of each of the - * commands listed on the command line. - */ - for(i=1; i<argc; i++) { - char *cmd = pca_lookup_file(pc, argv[i], -1, 0); - printf("The full pathname of '%s' is %s\\n", argv[i], - cmd ? cmd : "unknown"); - } - pc = del_PathCache(pc); /* Clean up */ - return 0; - } -.fi -.sp -The following is an example of what this does on my laptop under -linux: -.sp -.nf - $ ./example less more blob - The full pathname of 'less' is /usr/bin/less - The full pathname of 'more' is /bin/more - The full pathname of 'blob' is unknown - $ -.fi -.sp -.SH FUNCTION DESCRIPTIONS - -In order to use the facilities of this module, you must first allocate -a \f3PathCache\f1 object by calling the \f3new_PathCache()\f1 -constructor function. -.sp -.nf - PathCache *new_PathCache(void) -.fi -.sp -This function creates the resources needed to cache and lookup files -in a list of directories. It returns \f3NULL\f1 on error. -.sp -.SH POPULATING THE CACHE -Once you have created a cache, it needs to be populated with files. -To do this, call the \f3pca_scan_path()\f1 function. -.sp -.nf - int pca_scan_path(PathCache *pc, const char *path); -.fi -.sp -Whenever this function is called, it discards the current contents of -the cache, then scans the list of directories specified in its -\f3path\f1 argument for files. The \f3path\f1 argument must be a -string containing a colon-separated list of directories, such as -\f3"/usr/bin:/home/mcs/bin:."\f1. This can include directories -specified by absolute pathnames such as \f3"/usr/bin"\f1, as well as -sub-directories specified by relative pathnames such as \f3"."\f1 or -\f3"bin"\f1. Files in the absolute directories are immediately cached -in the specified \f3PathCache\f1 object, whereas sub-directories, -whose identities obviously change whenever the current working -directory is changed, are marked to be scanned on the fly whenever a -file is looked up. -.sp -On success this function return \f30\f1. On error it returns \f31\f1, -and a description of the error can be obtained by calling -\f3pca_last_error(pc)\f1. -.sp -.SH LOOKING UP FILES - -Once the cache has been populated with files, you can look up the full -pathname of a file, simply by specifying its filename to -\f3pca_lookup_file()\f1. -.sp -.nf - char *pca_lookup_file(PathCache *pc, const char *name, - int name_len, int literal); -.fi -.sp -To make it possible to pass this function a filename which is actually -part of a longer string, the \f3name_len\f1 argument can be used to -specify the length of the filename at the start of the \f3name[]\f1 -argument. If you pass \f3-1\f1 for this length, the length of the -string will be determined with \f3strlen()\f1. If the \f3name[]\f1 -string might contain backslashes that escape the special meanings of -spaces and tabs within the filename, give the \f3literal\f1 argument, -the value \f30\f1. Otherwise, if backslashes should be treated as -normal characters, pass \f31\f1 for the value of the \f3literal\f1 -argument. - -.SH FILENAME COMPLETION - -Looking up the potential completions of a filename-prefix in the -filename cache, is achieved by passing the provided -\f3pca_path_completions()\f1 callback function to the -\f3cpl_complete_word()\f1 function (see the \f3cpl_complete_word(@FUNC_MANEXT@)\f1 -man page). -.sp -.nf - CPL_MATCH_FN(pca_path_completions); -.fi -.sp -This callback requires that its \f3data\f1 argument be a pointer to a -\f3PcaPathConf\f1 object. Configuration objects of this type are -allocated by calling \f3new_PcaPathConf()\f1. -.sp -.nf - PcaPathConf *new_PcaPathConf(PathCache *pc); -.fi -.sp -This function returns an object initialized with default configuration -parameters, which determine how the \f3cpl_path_completions()\f1 -callback function behaves. The functions which allow you to -individually change these parameters are discussed below. -.sp -By default, the \f3pca_path_completions()\f1 callback function -searches backwards for the start of the filename being completed, -looking for the first un-escaped space or the start of the input -line. If you wish to specify a different location, call -\f3ppc_file_start()\f1 with the index at which the filename starts in -the input line. Passing \f3start_index=-1\f1 re-enables the default -behavior. -.sp -.nf - void ppc_file_start(PcaPathConf *ppc, int start_index); -.fi -.sp -By default, when \f3pca_path_completions()\f1 looks at a filename in -the input line, each lone backslash in the input line is interpreted -as being a special character which removes any special significance of -the character which follows it, such as a space which should be taken -as part of the filename rather than delimiting the start of the -filename. These backslashes are thus ignored while looking for -completions, and subsequently added before spaces, tabs and literal -backslashes in the list of completions. To have unescaped backslashes -treated as normal characters, call \f3ppc_literal_escapes()\f1 with a -non-zero value in its \f3literal\f1 argument. -.sp -.nf - void ppc_literal_escapes(PcaPathConf *ppc, int literal); -.fi -.sp -When you have finished with a \f3PcaPathConf\f1 variable, you can pass -it to the \f3del_PcaPathConf()\f1 destructor function to reclaim its -memory. -.sp -.nf - PcaPathConf *del_PcaPathConf(PcaPathConf *ppc); -.fi -.sp - -.SH BEING SELECTIVE -If you are only interested in certain types or files, such as, for -example, executable files, or files whose names end in a particular -suffix, you can arrange for the file completion and lookup functions -to be selective in the filenames that they return. This is done by -registering a callback function with your \f3PathCache\f1 -object. Thereafter, whenever a filename is found which either matches -a filename being looked up, or matches a prefix which is being -completed, your callback function will be called with the full -pathname of the file, plus any application-specific data that you -provide, and if the callback returns \f31\f1 the filename will be -reported as a match, and if it returns \f30\f1, it will be ignored. -Suitable callback functions and their prototypes should be declared -with the following macro. The \f3CplCheckFn\f1 \f3typedef\f1 is also -provided in case you wish to declare pointers to such functions. -.sp -.nf - #define CPL_CHECK_FN(fn) int (fn)(void *data, \\ - const char *pathname) - typedef CPL_CHECK_FN(CplCheckFn); -.fi -.sp -Registering one of these functions involves calling the -\f3pca_set_check_fn()\f1 function. In addition to the callback -function, passed via the \f3check_fn\f1 argument, you can pass a -pointer to anything via the \f3data\f1 argument. This pointer will be -passed on to your callback function, via its own \f3data\f1 argument, -whenever it is called, so this provides a way to pass appplication -specific data to your callback. -.sp -.nf - void pca_set_check_fn(PathCache *pc, CplCheckFn *check_fn, - void *data); -.fi -.sp -Note that these callbacks are passed the full pathname of each -matching file, so the decision about whether a file is of interest can -be based on any property of the file, not just its filename. As an -example, the provided \f3cpl_check_exe()\f1 callback function looks at -the executable permissions of the file and the permissions of its -parent directories, and only returns \f31\f1 if the user has execute -permission to the file. This callback function can thus be used to -lookup or complete command names found in the directories listed in -the user's \f3PATH\f1 environment variable. The example program given -earlier in this man page provides a demonstration of this. -.sp -Beware that if somebody tries to complete an empty string, your -callback will get called once for every file in the cache, which could -number in the thousands. If your callback does anything time -consuming, this could result in an unacceptable delay for the user, so -callbacks should be kept short. -.sp -To improve performance, whenever one of these callbacks is called, the -choice that it makes is cached, and the next time the corresponding -file is looked up, instead of calling the callback again, the cached -record of whether it was accepted or rejected is used. Thus if -somebody tries to complete an empty string, and hits tab a second time -when nothing appears to happen, there will only be one long delay, -since the second pass will operate entirely from the cached -dispositions of the files. These cached dipositions are discarded -whenever \f3pca_scan_path()\f1 is called, and whenever -\f3pca_set_check_fn()\f1 is called with changed callback function or -data arguments. - -.SH ERROR HANDLING - -If \f3pca_scan_path()\f1 reports that an error occurred by returning -\f31\f1, you can obtain a terse description of the error by calling -\f3pca_last_error(pc)\f1. This returns an internal string containing -an error message. -.sp -.nf - const char *pca_last_error(PathCache *pc); -.fi -.sp - -.SH CLEANING UP - -Once you have finished using a \f3PathCache\f1 object, you can reclaim -its resources by passing it to the \f3del_PathCache()\f1 destructor -function. This takes a pointer to one of these objects, and always -returns \f3NULL\f1. -.sp -.nf - PathCache *del_PathCache(PathCache *pc); -.fi -.sp -.SH THREAD SAFETY - -In multi-threaded programs, you should use the \f3libtecla_r.a\f1 -version of the library. This uses POSIX reentrant functions where -available (hence the \f3_r\f1 suffix), and disables features that rely -on non-reentrant system functions. In the case of this module, the -only disabled feature is username completion in \f3~username/\f1 -expressions, in \f3cpl_path_completions()\f1. - -Using the \f3libtecla_r.a\f1 version of the library, it is safe to use -the facilities of this module in multiple threads, provided that each -thread uses a separately allocated \f3PathCache\f1 object. In other -words, if two threads want to do path searching, they should each call -\f3new_PathCache()\f1 to allocate their own caches. - -.SH FILES -.nf -libtecla.a - The tecla library -libtecla.h - The tecla header file. -.fi - -.SH SEE ALSO - -.nf -libtecla(@LIBR_MANEXT@), gl_get_line(@FUNC_MANEXT@), ef_expand_file(@FUNC_MANEXT@), -cpl_complete_word(@FUNC_MANEXT@) -.fi - -.SH AUTHOR -Martin Shepherd (mcs@astro.caltech.edu) diff --git a/libtecla/man/func/pca_path_completions.in b/libtecla/man/func/pca_path_completions.in deleted file mode 100644 index dbc4da7..0000000 --- a/libtecla/man/func/pca_path_completions.in +++ /dev/null @@ -1 +0,0 @@ -.so @FUNC_MANDIR@/pca_lookup_file.@FUNC_MANEXT@ diff --git a/libtecla/man/func/pca_scan_path.in b/libtecla/man/func/pca_scan_path.in deleted file mode 100644 index dbc4da7..0000000 --- a/libtecla/man/func/pca_scan_path.in +++ /dev/null @@ -1 +0,0 @@ -.so @FUNC_MANDIR@/pca_lookup_file.@FUNC_MANEXT@ diff --git a/libtecla/man/func/pca_set_check_fn.in b/libtecla/man/func/pca_set_check_fn.in deleted file mode 100644 index dbc4da7..0000000 --- a/libtecla/man/func/pca_set_check_fn.in +++ /dev/null @@ -1 +0,0 @@ -.so @FUNC_MANDIR@/pca_lookup_file.@FUNC_MANEXT@ diff --git a/libtecla/man/func/ppc_file_start.in b/libtecla/man/func/ppc_file_start.in deleted file mode 100644 index dbc4da7..0000000 --- a/libtecla/man/func/ppc_file_start.in +++ /dev/null @@ -1 +0,0 @@ -.so @FUNC_MANDIR@/pca_lookup_file.@FUNC_MANEXT@ diff --git a/libtecla/man/func/ppc_literal_escapes.in b/libtecla/man/func/ppc_literal_escapes.in deleted file mode 100644 index dbc4da7..0000000 --- a/libtecla/man/func/ppc_literal_escapes.in +++ /dev/null @@ -1 +0,0 @@ -.so @FUNC_MANDIR@/pca_lookup_file.@FUNC_MANEXT@ diff --git a/libtecla/man/libr/libtecla.in b/libtecla/man/libr/libtecla.in deleted file mode 100644 index 4c600a8..0000000 --- a/libtecla/man/libr/libtecla.in +++ /dev/null @@ -1,168 +0,0 @@ -.\" Copyright (c) 2000, 2001, 2002, 2003, 2004, 2012 by Martin C. Shepherd -.\" -.\" All rights reserved. -.\" -.\" Permission is hereby granted, free of charge, to any person obtaining a -.\" copy of this software and associated documentation files (the -.\" "Software"), to deal in the Software without restriction, including -.\" without limitation the rights to use, copy, modify, merge, publish, -.\" distribute, and/or sell copies of the Software, and to permit persons -.\" to whom the Software is furnished to do so, provided that the above -.\" copyright notice(s) and this permission notice appear in all copies of -.\" the Software and that both the above copyright notice(s) and this -.\" permission notice appear in supporting documentation. -.\" -.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT -.\" OF THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR -.\" HOLDERS INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL -.\" INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING -.\" FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, -.\" NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION -.\" WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -.\" -.\" Except as contained in this notice, the name of a copyright holder -.\" shall not be used in advertising or otherwise to promote the sale, use -.\" or other dealings in this Software without prior written authorization -.\" of the copyright holder. -.TH libtecla @LIBR_MANEXT@ -.SH NAME -libtecla - An interactive command-line input library. -.SH SYNOPSIS -.nf -@CC@ ... -ltecla -lcurses -.fi - -.SH DESCRIPTION - -The \f3tecla\f1 library provides programs with interactive command -line editing facilities, similar to those of the unix \f3tcsh\f1 -shell. In addition to simple command-line editing, it supports recall -of previously entered command lines, TAB completion of file names or -other tokens, and in-line wild-card expansion of filenames. The -internal functions which perform file-name completion and wild-card -expansion are also available externally for optional use by the -calling program. -.sp -The various parts of the library are documented in the following man -pages: - -.nf - tecla(@MISC_MANEXT@) - Use level documentation of the - command-line editing facilities - provided by \f3gl_get_line()\f1. - gl_get_line(@FUNC_MANEXT@) - The interactive line-input module. - gl_io_mode(@FUNC_MANEXT@) - How to use \f3gl_get_line()\f1 in an - incremental, non-blocking fashion. - cpl_complete_word(@FUNC_MANEXT@) - The word completion module. - ef_expand_file(@FUNC_MANEXT@) - The filename expansion module. - pca_lookup_file(@FUNC_MANEXT@) - A directory-list based filename - lookup and completion module. -.fi - -In addition there is one optional application distributed -with the library: - -.nf - enhance(@PROG_MANEXT@) - Add command-line editing to third - party applications. -.fi - -.SH THREAD SAFETY - -If the library is compiled with -D_POSIX_C_SOURCE=199506L, reentrant -versions of as many functions as possible are used. This includes -using getpwuid_r() and getpwnam_r() instead of getpwuid() and -getpwnam() when looking up the home directories of specific users in -the password file (for ~user/ expansion), and readdir_r() instead of -readdir() for reading directory entries when doing filename -completion. The reentrant version of the library is usually called -libtecla_r.a instead of libtecla.a, so if only the latter is -available, it probably isn't the correct version to link with -threaded programs. - -Reentrant functions for iterating through the password file aren't -available, so when the library is compiled to be reentrant, TAB -completion of incomplete usernames in \f3~username/\f1 expressions is -disabled. This doesn't disable expansion of complete \f3~username\f1 -expressions, which can be done reentrantly, or expansion of the parts -of filenames that follow them, so this doesn't remove much -functionality. - -The terminfo functions setupterm(), tigetstr(), tigetnum() and tputs() -also aren't reentrant, but very few programs will want to interact -with multiple terminals, so this shouldn't prevent this library from -being used in threaded programs. - -.SH LIBRARY VERSION NUMBER - -The version number of the library can be queried using the following -function. -.sp -.nf - void libtecla_version(int *major, int *minor, int *micro); -.fi -.sp - -On return, this function records the three components of the libtecla -version number in \f3*major\f1, \f3*minor\f1, \f3*micro\f1. The formal -meaning of the three components is as follows. - -.sp -.nf - major - Incrementing this number implies that a change has - been made to the library's public interface, which - makes it binary incompatible with programs that - were linked with previous shared versions of the - tecla library. - - minor - This number is incremented by one whenever - additional functionality, such as new functions or - modules, are added to the library. - - micro - This is incremented whenever modifications to the - library are made which make no changes to the - public interface, but which fix bugs and/or improve - the behind-the-scenes implementation. -.fi -.sp - -.SH TRIVIA - -In Spanish, a "tecla" is the key of a keyboard. Since this library -centers on keyboard input, and given that I wrote much of the library -while working in Chile, this seemed like a suitable name. - -.SH FILES -.nf -libtecla.a - The tecla library. -libtecla.h - The tecla header file. -~/.teclarc - The tecla personal customization file. -.fi - -.SH SEE ALSO - -.nf -gl_get_line(@FUNC_MANEXT@), tecla(@MISC_MANEXT@), gl_io_mode(@FUNC_MANEXT@), ef_expand_file(@FUNC_MANEXT@), -cpl_complete_word(@FUNC_MANEXT@), pca_lookup_file(@FUNC_MANEXT@), enhance(@PROG_MANEXT@) -.fi - -.SH AUTHOR -Martin Shepherd (mcs@astro.caltech.edu) - -.SH ACKNOWLEDGMENTS - -.nf -Markus Gyger - Lots of assistance, including help with - shared libraries, configuration information, - particularly for Solaris; modifications to - support C++ compilers, improvements for ksh - users, faster cursor motion, output - buffering, and changes to make gl_get_line() - 8-bit clean. -Mike MacFaden - Suggestions, feedback and testing that led - to many of the major new functions that were - added in version 1.4.0. -Tim Eliseo - Many vi-mode bindings and fixes. -.fi diff --git a/libtecla/man/misc/tecla.in b/libtecla/man/misc/tecla.in deleted file mode 100644 index 567a810..0000000 --- a/libtecla/man/misc/tecla.in +++ /dev/null @@ -1,1201 +0,0 @@ -.\" Copyright (c) 2000, 2001, 2002, 2003, 2004, 2012 by Martin C. Shepherd -.\" -.\" All rights reserved. -.\" -.\" Permission is hereby granted, free of charge, to any person obtaining a -.\" copy of this software and associated documentation files (the -.\" "Software"), to deal in the Software without restriction, including -.\" without limitation the rights to use, copy, modify, merge, publish, -.\" distribute, and/or sell copies of the Software, and to permit persons -.\" to whom the Software is furnished to do so, provided that the above -.\" copyright notice(s) and this permission notice appear in all copies of -.\" the Software and that both the above copyright notice(s) and this -.\" permission notice appear in supporting documentation. -.\" -.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT -.\" OF THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR -.\" HOLDERS INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL -.\" INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING -.\" FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, -.\" NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION -.\" WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -.\" -.\" Except as contained in this notice, the name of a copyright holder -.\" shall not be used in advertising or otherwise to promote the sale, use -.\" or other dealings in this Software without prior written authorization -.\" of the copyright holder. -.TH tecla @MISC_MANEXT@ -.SH NAME -tecla, teclarc \- The user interface provided by the Tecla library. -.SH DESCRIPTION - -This man page describes the command-line editing features that are -available to users of programs that read keyboard input via the Tecla -library. Users of the tcsh shell will find the default key-bindings -very familiar. Users of the bash shell will also find it quite -familiar, but with a few minor differences, most notably in how -forward and backward searches through the list of historical commands -are performed. There are two major editing modes, one with emacs-like -key-bindings and another with vi-like key-bindings. By default emacs -mode is enabled, but vi mode can alternatively be selected via the -user's configuration file. This file can also be used to change the -bindings of individual keys to suit the user's preferences. By -default, tab completion is provided. If the application hasn't -reconfigured this to complete other types of symbols, then tab -completion completes file-names. - -.SH KEY SEQUENCE NOTATION - -In the rest of this man page, and also in all Tecla configuration -files, key-sequences are expressed as follows. - -.sp -.nf -\f3^A\f1 or \f3C-a\f1 - This is a control-A, entered by pressing the control key at - the same time as the \f3A\f1 key. - -\f3\\E\f1 or \f3M-\f1 - In key-sequences, both of these notations can be entered - either by pressing the escape key, then the following key, or by - pressing the Meta key at the same time as the following key. Thus - the key sequence \f3M-p\f1 can be typed in two ways, by pressing - the escape key, followed by pressing \f3p\f1, or by pressing the - Meta key at the same time as \f3p\f1. - -\f3up\f1 - This refers to the up-arrow key. - -\f3down\f1 - This refers to the down-arrow key. - -\f3left\f1 - This refers to the left-arrow key. - -\f3right\f1 - This refers to the right-arrow key. - -\f3a\f1 - This is just a normal A key. -.fi -.sp - -.SH THE TECLA CONFIGURATION FILE - -By default, Tecla looks for a file called \f3\&.teclarc\f1 in your -home directory (ie. \f3~/.teclarc\f1). If it finds this file, it -reads it, interpreting each line as defining a new key binding or an -editing configuration option. Since the emacs keybindings are -installed by default, if you want to use the non-default vi editing -mode, the most important item to go in this file is the following -line: - -.nf - edit-mode vi -.fi - -This will re-configure the default bindings for vi-mode. The -complete set of arguments that this command accepts are: -.sp -.nf - vi - Install key-bindings like those of the vi - editor. - emacs - Install key-bindings like those of the emacs - editor. This is the default. - none - Use just the native line editing facilities - provided by the terminal driver. -.fi -.sp -To prevent the terminal bell from being rung, such as when -an unrecognized control-sequence is typed, place the -following line in the configuration file: - -.nf - nobeep -.fi - -An example of a key binding line in the configuration file is -the following. - -.nf - bind M-[2~ insert-mode -.fi - -On many keyboards, the above key sequence is generated when one -presses the \f3insert\f1 key, so with this keybinding, one can toggle -between the emacs-mode insert and overwrite modes by hitting one -key. One could also do it by typing out the above sequence of -characters one by one. As explained above, the \f3M-\f1 part of this -sequence can be typed either by pressing the escape key before the -following key, or by pressing the Meta key at the same time as the -following key. Thus if you had set the above key binding, and the -insert key on your keyboard didn't generate the above key sequence, -you could still type it in either of the following 2 ways. - -.nf - 1. Hit the escape key momentarily, then press '[', then '2', then - finally '~'. - - 2. Press the meta key at the same time as pressing the '[' key, - then press '2', then '~'. -.fi - -If you set a keybinding for a key-sequence that is already bound to a function, -the new binding overrides the old one. If in the new binding you omit the name -of the new function to bind to the key-sequence, the original binding becomes -undefined. -.sp -Starting with versions of libtecla later than 1.3.3 it is now possible -to bind keysequences that begin with a printable character. Previously -key-sequences were required to start with a control or meta character. -.sp -Note that the special keywords "up", "down", "left" and "right" refer -to the arrow keys, and are thus not treated as keysequences. So, for -example, to rebind the up and down arrow keys to use the history -search mechanism instead of the simple history recall method, you -could place the following in your configuration file: - -.nf - bind up history-search-backwards - bind down history-search-backwards -.fi -.sp -To unbind an existing binding, you can do this with the bind command -by omitting to name any action to rebind the key sequence to. For -example, by not specifying an action function, the following command -unbinds the default beginning-of-line action from the ^A key sequence: - -.nf - bind ^A -.fi - -If you create a \f3~/.teclarc\f1 configuration file, but it appears to -have no effect on the program, check the documentation of the program -to see if the author chose a different name for this file. - -.SH FILENAME AND TILDE COMPLETION - -With the default key bindings, pressing the TAB key (aka. \f3^I\f1) -results in Tecla attempting to complete the incomplete filename that -precedes the cursor. Tecla searches backwards from the cursor, looking -for the start of the filename, stopping when it hits either a space or -the start of the line. If more than one file has the specified prefix, -then Tecla completes the filename up to the point at which the -ambiguous matches start to differ, then lists the possible matches. -.sp -In addition to literally written filenames, Tecla can -complete files that start with \f3~/\f1 and \f3~user/\f1 expressions -and that contain \f3$envvar\f1 expressions. In particular, if you hit -TAB within an incomplete \f3~user\f1, expression, Tecla -will attempt to complete the username, listing any ambiguous matches. -.sp -The completion binding is implemented using the -\f3cpl_word_completions()\f1 function, which is also available -separately to users of this library. See the -\f3cpl_complete_word(@LIBR_MANEXT@)\f1 man page for more details. - -.SH FILENAME EXPANSION - -With the default key bindings, pressing \f3^X*\f1 causes Tecla to -expand the filename that precedes the cursor, replacing \f3~/\f1 and -\f3~user/\f1 expressions with the corresponding home directories, and -replacing \f3$envvar\f1 expressions with the value of the specified -environment variable, then if there are any wildcards, replacing the -so far expanded filename with a space-separated list of the files -which match the wild cards. -.sp -The expansion binding is implemented using the \f3ef_expand_file()\f1 function. -See the \f3ef_expand_file(@LIBR_MANEXT@)\f1 man page for more details. - -.SH RECALLING PREVIOUSLY TYPED LINES - -Every time that a new line is entered by the user, it is appended to a -list of historical input lines maintained within the GetLine resource -object. You can traverse up and down this list using the up and down -arrow keys. Alternatively, you can do the same with the \f3^P\f1, and -\f3^N\f1 keys, and in vi command mode you can alternatively use the k -and j characters. Thus pressing up-arrow once, replaces the current -input line with the previously entered line. Pressing up-arrow again, -replaces this with the line that was entered before it, etc.. Having -gone back one or more lines into the history list, one can return to -newer lines by pressing down-arrow one or more times. If you do this -sufficient times, you will return to the original line that you were -entering when you first hit up-arrow. -.sp -Note that in vi mode, all of the history recall functions switch the -library into command mode. -.sp -In emacs mode the \f3M-p\f1 and \f3M-n\f1 keys work just like the -\f3^P\f1 and \f3^N\f1 keys, except that they skip all but those -historical lines which share the prefix that precedes the cursor. In -vi command mode the upper case \f3K\f1 and \f3J\f1 characters do the -same thing, except that the string that they search for includes the -character under the cursor as well as what precedes it. -.sp -Thus for example, suppose that you were in emacs mode, and you had -just entered the following list of commands in the order shown: - -.nf - ls ~/tecla/ - cd ~/tecla - ls -l getline.c - emacs ~/tecla/getline.c -.fi - -If you next typed: - -.nf - ls -.fi - -and then hit \f3M-p\f1, then rather than returning the previously -typed emacs line, which doesn't start with "ls", Tecla -would recall the "ls -l getline.c" line. Pressing \f3M-p\f1 again -would recall the "ls ~/tecla/" line. - -Note that if the string that you are searching for, contains any of -the special characters, *, ?, or '[', then it is interpretted as a -pattern to be matched. Thus, cotinuing with the above example, after -typing in the list of commands shown, if you then typed: - -.nf - *tecla* -.fi - -and hit \f3M-p\f1, then the "emacs ~/tecla/getline.c" line would be -recalled first, since it contains the word tecla somewhere in the -line, Similarly, hitting \f3M-p\f1 again, would recall the "ls -~/tecla/" line, and hitting it once more would recall the "ls -~/tecla/" line. The pattern syntax is the same as that described for -filename expansion, in the \f3ef_expand_file(@LIBR_MANEXT@\f1 man -page. - -.SH HISTORY FILES - -Authors of programs that use the Tecla library have the option of -saving historical command-lines in a file before exiting, and -subsequently reading them back in from this file when the program is -next started. There is no standard name for this file, since it makes -sense for each application to use its own history file, so that -commands from different applications don't get mixed up. - -.SH INTERNATIONAL CHARACTER SETS - -Since libtecla version 1.4.0, Tecla has been 8-bit clean. This means -that all 8-bit characters that are printable in the user's current -locale are now displayed verbatim and included in the returned input -line. Assuming that the calling program correctly contains a call -like the following, -.sp -.nf - setlocale(LC_CTYPE, ""); -.fi -.sp -then the current locale is determined by the first of the environment -variables \f3LC_CTYPE\f1, \f3LC_ALL\f1, and \f3LANG\f1, that is found -to contain a valid locale name. If none of these variables are -defined, or the program neglects to call setlocale, then the default -\f3C\f1 locale is used, which is US 7-bit ASCII. On most unix-like -platforms, you can get a list of valid locales by typing the command: -.sp -.nf - locale -a -.fi -.sp -at the shell prompt. -.sp -.SS "Meta keys and locales" - -Beware that in most locales other than the default C locale, meta -characters become printable, and they are then no longer considered to -match \f3M-c\f1 style key bindings. This allows international -characters to be entered with the compose key without unexpectedly -triggering meta key bindings. You can still invoke meta bindings, -since there are actually two ways to do this. For example the binding -\f3M-c\f1 can also be invoked by pressing the escape key momentarily, -then pressing the \f3c\f1 key, and this will work regardless of -locale. Moreover, many modern terminal emulators, such as gnome's -gnome-terminal's and KDE's konsole terminals, already generate escape -pairs like this when you use the meta key, rather than a real meta -character, and other emulators usually have a way to request this -behavior, so you can continue to use the meta key on most systems. -.sp -For example, although xterm terminal emulators generate real 8-bit -meta characters by default when you use the meta key, they can be -configured to output the equivalent escape pair by setting their -\f3EightBitInput\f1 X resource to \f3False\f1. You can either do this -by placing a line like the following in your \f3~/.Xdefaults\f1 file, -.sp -.nf - XTerm*EightBitInput: False -.sp -.fi -or by starting an xterm with an \f3-xrm '*EightBitInput: False'\f1 -command-line argument. In recent versions of xterm you can toggle this -feature on and off with the \f3"Meta Sends Escape"\f1 option in the -menu that is displayed when you press the left mouse button and the -control key within an xterm window. In CDE, dtterms can be similarly -coerced to generate escape pairs in place of meta characters, by -setting the \f3Dtterm*KshMode\f1 resource to \f3True\f1. -.sp -.SS "Entering international characters" - -If you don't have a keyboard that generates all of the -international characters that you need, there is usually a -compose key that will allow you to enter special characters, -or a way to create one. For example, under X windows on -unix-like systems, if your keyboard doesn't have a compose -key, you can designate a redundant key to serve this purpose -with the xmodmap command. For example, on many PC keyboards -there is a microsoft-windows key, which is otherwise useless -under Linux. On my laptop the \f3xev\f1 program reports that -pressing this key generates keycode 115, so to turn this key -into a compose key, I do the following: -.sp -.nf - xmodmap -e 'keycode 115 = Multi_key' -.fi -.sp -I can then enter an i with a umlaut over it by typing this key, -followed by \f3"\f1, followed by i. - -.SH THE AVAILABLE KEY BINDING FUNCTIONS - -The following is a list of the editing functions provided by the Tecla -library. The names in the leftmost column of the list can be used in -configuration files to specify which function a given key or -combination of keys should invoke. They are also used in the next two -sections to list the default key-bindings in emacs and vi modes. - -.nf - user-interrupt - Send a SIGINT signal to the - parent process. - abort - Send a SIGABRT signal to the - parent process. - suspend - Suspend the parent process. - stop-output - Pause terminal output. - start-output - Resume paused terminal output. - literal-next - Arrange for the next character - to be treated as a normal - character. This allows control - characters to be entered. - cursor-right - Move the cursor one character - right. - cursor-left - Move the cursor one character - left. - insert-mode - Toggle between insert mode and - overwrite mode. - beginning-of-line - Move the cursor to the - beginning of the line. - end-of-line - Move the cursor to the end of - the line. - delete-line - Delete the contents of the - current line. - kill-line - Delete everything that follows - the cursor. - backward-kill-line - Delete all characters between - the cursor and the start of the - line. - forward-word - Move to the end of the word - which follows the cursor. - forward-to-word - Move the cursor to the start of - the word that follows the - cursor. - backward-word - Move to the start of the word - which precedes the cursor. - goto-column - Move the cursor to the - 1-relative column in the line - specified by any preceding - digit-argument sequences (see - ENTERING REPEAT COUNTS below). - find-parenthesis - If the cursor is currently - over a parenthesis character, - move it to the matching - parenthesis character. If not - over a parenthesis character - move right to the next close - parenthesis. - forward-delete-char - Delete the character under the - cursor. - backward-delete-char - Delete the character which - precedes the cursor. - list-or-eof - This is intended for binding - to ^D. When invoked when the - cursor is within the line it - displays all possible - completions then redisplays - the line unchanged. When - invoked on an empty line, it - signals end-of-input (EOF) to - the caller of gl_get_line(). - del-char-or-list-or-eof - This is intended for binding - to ^D. When invoked when the - cursor is within the line it - invokes forward-delete-char. - When invoked at the end of the - line it displays all possible - completions then redisplays - the line unchanged. When - invoked on an empty line, it - signals end-of-input (EOF) to - the caller of gl_get_line(). - forward-delete-word - Delete the word which follows - the cursor. - backward-delete-word - Delete the word which precedes - the cursor. - upcase-word - Convert all of the characters - of the word which follows the - cursor, to upper case. - downcase-word - Convert all of the characters - of the word which follows the - cursor, to lower case. - capitalize-word - Capitalize the word which - follows the cursor. - change-case - If the next character is upper - case, toggle it to lower case - and vice versa. - redisplay - Redisplay the line. - clear-screen - Clear the terminal, then - redisplay the current line. - transpose-chars - Swap the character under the - cursor with the character just - before the cursor. - set-mark - Set a mark at the position of - the cursor. - exchange-point-and-mark - Move the cursor to the last - mark that was set, and move - the mark to where the cursor - used to be. - kill-region - Delete the characters that lie - between the last mark that was - set, and the cursor. - copy-region-as-kill - Copy the text between the mark - and the cursor to the cut - buffer, without deleting the - original text. - yank - Insert the text that was last - deleted, just before the - current position of the cursor. - append-yank - Paste the current contents of - the cut buffer, after the - cursor. - up-history - Recall the next oldest line - that was entered. Note that - in vi mode you are left in - command mode. - down-history - Recall the next most recent - line that was entered. If no - history recall session is - currently active, the next - line from a previous recall - session is recalled. Note that - in vi mode you are left in - command mode. - history-search-backward - Recall the next oldest line - who's prefix matches the string - which currently precedes the - cursor (in vi command-mode the - character under the cursor is - also included in the search - string). Note that in vi mode - you are left in command mode. - history-search-forward - Recall the next newest line - who's prefix matches the string - which currently precedes the - cursor (in vi command-mode the - character under the cursor is - also included in the search - string). Note that in vi mode - you are left in command mode. - history-re-search-backward -Recall the next oldest line - who's prefix matches that - established by the last - invocation of either - history-search-forward or - history-search-backward. - history-re-search-forward - Recall the next newest line - who's prefix matches that - established by the last - invocation of either - history-search-forward or - history-search-backward. - complete-word - Attempt to complete the - incomplete word which - precedes the cursor. Unless - the host program has customized - word completion, filename - completion is attempted. In vi - commmand mode the character - under the cursor is also - included in the word being - completed, and you are left in - vi insert mode. - expand-filename - Within the command line, expand - wild cards, tilde expressions - and dollar expressions in the - filename which immediately - precedes the cursor. In vi - commmand mode the character - under the cursor is also - included in the filename being - expanded, and you are left in - vi insert mode. - list-glob - List any filenames which match - the wild-card, tilde and dollar - expressions in the filename - which immediately precedes the - cursor, then redraw the input - line unchanged. - list-history - Display the contents of the - history list for the current - history group. If a repeat - count of > 1 is specified, - only that many of the most - recent lines are displayed. - See the "ENTERING REPEAT - COUNTS" section. - read-from-file - Temporarily switch to reading - input from the file who's - name precedes the cursor. - read-init-files - Re-read teclarc configuration - files. - beginning-of-history - Move to the oldest line in the - history list. Note that in vi - mode you are left in command - mode. - end-of-history - Move to the newest line in the - history list (ie. the current - line). Note that in vi mode - this leaves you in command - mode. - digit-argument - Enter a repeat count for the - next key-binding function. - For details, see the ENTERING - REPEAT COUNTS section. - newline - Terminate and return the - current contents of the - line, after appending a - newline character. The newline - character is normally '\\n', - but will be the first - character of the key-sequence - that invoked the newline - action, if this happens to be - a printable character. If the - action was invoked by the - '\\n' newline character or the - '\\r' carriage return - character, the line is - appended to the history - buffer. - repeat-history - Return the line that is being - edited, then arrange for the - next most recent entry in the - history buffer to be recalled - when Tecla is next called. - Repeatedly invoking this - action causes successive - historical input lines to be - re-executed. Note that this - action is equivalent to the - 'Operate' action in ksh. - ring-bell - Ring the terminal bell, unless - the bell has been silenced via - the \f3nobeep\f1 configuration - option (see the THE TECLA - CONFIGURATION FILE section). - forward-copy-char - Copy the next character into - the cut buffer (NB. use repeat - counts to copy more than one). - backward-copy-char - Copy the previous character - into the cut buffer. - forward-copy-word - Copy the next word into the cut - buffer. - backward-copy-word - Copy the previous word into the - cut buffer. - forward-find-char - Move the cursor to the next - occurrence of the next - character that you type. - backward-find-char - Move the cursor to the last - occurrence of the next - character that you type. - forward-to-char - Move the cursor to the - character just before the next - occurrence of the next - character that the user types. - backward-to-char - Move the cursor to the - character just after the last - occurrence before the cursor - of the next character that the - user types. - repeat-find-char - Repeat the last - backward-find-char, - forward-find-char, - backward-to-char or - forward-to-char. - invert-refind-char - Repeat the last - backward-find-char, - forward-find-char, - backward-to-char, or - forward-to-char in the - opposite direction. - delete-to-column - Delete the characters from the - cursor up to the column that - is specified by the repeat - count. - delete-to-parenthesis - Delete the characters from the - cursor up to and including - the matching parenthesis, or - next close parenthesis. - forward-delete-find - Delete the characters from the - cursor up to and including the - following occurence of the - next character typed. - backward-delete-find - Delete the characters from the - cursor up to and including the - preceding occurence of the - next character typed. - forward-delete-to - Delete the characters from the - cursor up to, but not - including, the following - occurence of the next - character typed. - backward-delete-to - Delete the characters from the - cursor up to, but not - including, the preceding - occurence of the next - character typed. - delete-refind - Repeat the last *-delete-find - or *-delete-to action. - delete-invert-refind - Repeat the last *-delete-find - or *-delete-to action, in the - opposite direction. - copy-to-column - Copy the characters from the - cursor up to the column that - is specified by the repeat - count, into the cut buffer. - copy-to-parenthesis - Copy the characters from the - cursor up to and including - the matching parenthesis, or - next close parenthesis, into - the cut buffer. - forward-copy-find - Copy the characters from the - cursor up to and including the - following occurence of the - next character typed, into the - cut buffer. - backward-copy-find - Copy the characters from the - cursor up to and including the - preceding occurence of the - next character typed, into the - cut buffer. - forward-copy-to - Copy the characters from the - cursor up to, but not - including, the following - occurence of the next - character typed, into the cut - buffer. - backward-copy-to - Copy the characters from the - cursor up to, but not - including, the preceding - occurence of the next - character typed, into the cut - buffer. - copy-refind - Repeat the last *-copy-find - or *-copy-to action. - copy-invert-refind - Repeat the last *-copy-find - or *-copy-to action, in the - opposite direction. - vi-mode - Switch to vi mode from emacs - mode. - emacs-mode - Switch to emacs mode from vi - mode. - vi-insert - From vi command mode, switch to - insert mode. - vi-overwrite - From vi command mode, switch to - overwrite mode. - vi-insert-at-bol - From vi command mode, move the - cursor to the start of the line - and switch to insert mode. - vi-append-at-eol - From vi command mode, move the - cursor to the end of the line - and switch to append mode. - vi-append - From vi command mode, move the - cursor one position right, and - switch to insert mode. - vi-replace-char - From vi command mode, replace - the character under the cursor - with the the next character - entered. - vi-forward-change-char - From vi command mode, delete - the next character then enter - insert mode. - vi-backward-change-char - From vi command mode, delete - the preceding character then - enter insert mode. - vi-forward-change-word - From vi command mode, delete - the next word then enter - insert mode. - vi-backward-change-word - From vi command mode, delete - the preceding word then - enter insert mode. - vi-change-rest-of-line - From vi command mode, delete - from the cursor to the end of - the line, then enter insert - mode. - vi-change-line - From vi command mode, delete - the current line, then enter - insert mode. - vi-change-to-bol - From vi command mode, delete - all characters between the - cursor and the beginning of - the line, then enter insert - mode. - vi-change-to-column - From vi command mode, delete - the characters from the cursor - up to the column that is - specified by the repeat count, - then enter insert mode. - vi-change-to-parenthesis - Delete the characters from the - cursor up to and including - the matching parenthesis, or - next close parenthesis, then - enter vi insert mode. - vi-forward-change-find - From vi command mode, delete - the characters from the - cursor up to and including the - following occurence of the - next character typed, then - enter insert mode. - vi-backward-change-find - From vi command mode, delete - the characters from the - cursor up to and including the - preceding occurence of the - next character typed, then - enter insert mode. - vi-forward-change-to - From vi command mode, delete - the characters from the - cursor up to, but not - including, the following - occurence of the next - character typed, then enter - insert mode. - vi-backward-change-to - From vi command mode, delete - the characters from the - cursor up to, but not - including, the preceding - occurence of the next - character typed, then enter - insert mode. - vi-change-refind - Repeat the last - vi-*-change-find or - vi-*-change-to action. - vi-change-invert-refind - Repeat the last - vi-*-change-find or - vi-*-change-to action, in the - opposite direction. - vi-undo - In vi mode, undo the last - editing operation. - vi-repeat-change - In vi command mode, repeat the - last command that modified the - line. -.fi - -.SH DEFAULT KEY BINDINGS IN EMACS MODE - -The following default key bindings, which can be overriden by -the Tecla configuration file, are designed to mimic most of -the bindings of the unix \f3tcsh\f1 shell, when it is in -emacs editing mode. -.sp -This is the default editing mode of the Tecla library. -.sp -Under UNIX the terminal driver sets a number of special keys for certain -functions. The tecla library attempts to use the same keybindings to maintain -consistency. The key sequences shown for the following 6 bindings are thus just -examples of what they will probably be set to. If you have used the \f3stty\f1 -command to change these keys, then the default bindings should match. - -.nf - ^C -> user-interrupt - ^\\ -> abort - ^Z -> suspend - ^Q -> start-output - ^S -> stop-output - ^V -> literal-next -.fi - -The cursor keys are refered to by name, as follows. This is necessary -because different types of terminals generate different key sequences -when their cursor keys are pressed. - - right -> cursor-right - left -> cursor-left - up -> up-history - down -> down-history - -The remaining bindings don't depend on the terminal setttings. - -.nf - ^F -> cursor-right - ^B -> cursor-left - M-i -> insert-mode - ^A -> beginning-of-line - ^E -> end-of-line - ^U -> delete-line - ^K -> kill-line - M-f -> forward-word - M-b -> backward-word - ^D -> del-char-or-list-or-eof - ^H -> backward-delete-char - ^? -> backward-delete-char - M-d -> forward-delete-word - M-^H -> backward-delete-word - M-^? -> backward-delete-word - M-u -> upcase-word - M-l -> downcase-word - M-c -> capitalize-word - ^R -> redisplay - ^L -> clear-screen - ^T -> transpose-chars - ^@ -> set-mark - ^X^X -> exchange-point-and-mark - ^W -> kill-region - M-w -> copy-region-as-kill - ^Y -> yank - ^P -> up-history - ^N -> down-history - M-p -> history-search-backward - M-n -> history-search-forward - ^I -> complete-word - ^X* -> expand-filename - ^X^F -> read-from-file - ^X^R -> read-init-files - ^Xg -> list-glob - ^Xh -> list-history - M-< -> beginning-of-history - M-> -> end-of-history - \\n -> newline - \\r -> newline - M-o -> repeat-history - M-^V -> vi-mode - - M-0, M-1, ... M-9 -> digit-argument (see below) -.fi - -Note that \f3^I\f1 is what the TAB key generates, and that \f3^@\f1 -can be generated not only by pressing the control key and the \f3@\f1 -key simultaneously, but also by pressing the control key and the space -bar at the same time. - -.SH DEFAULT KEY BINDINGS IN VI MODE - -The following default key bindings are designed to mimic the -vi style of editing as closely as possible. This means that -very few editing functions are provided in the initial -character input mode, editing functions instead being -provided by the vi command mode. Vi command mode is entered -whenever the escape character is pressed, or whenever a -key-sequence that starts with a meta character is entered. In -addition to mimicing vi, libtecla provides bindings for tab -completion, wild-card expansion of file names, and historical -line recall. -.sp -To learn how to tell the Tecla library to use vi mode instead -of the default emacs editing mode, see the earlier section entitled -THE TECLA CONFIGURATION FILE. -.sp -Under UNIX the terminal driver sets a number of special keys -for certain functions. The Tecla library attempts to use the -same keybindings to maintain consistency, binding them both -in input mode and in command mode. The key sequences shown -for the following 6 bindings are thus just examples of what -they will probably be set to. If you have used the \f3stty\f1 -command to change these keys, then the default bindings -should match. - -.nf - ^C -> user-interrupt - ^\\ -> abort - ^Z -> suspend - ^Q -> start-output - ^S -> stop-output - ^V -> literal-next - M-^C -> user-interrupt - M-^\\ -> abort - M-^Z -> suspend - M-^Q -> start-output - M-^S -> stop-output -.fi - -Note that above, most of the bindings are defined twice, once -as a raw control code like \f3^C\f1 and then a second time as -a meta character like \f3M-^C\f1. The former is the binding -for vi input mode, whereas the latter is the binding for vi -command mode. Once in command mode all key-sequences that the -user types that they don't explicitly start with an escape or -a meta key, have their first key secretly converted to a meta -character before the key sequence is looked up in the key -binding table. Thus, once in command mode, when you type the -letter \f3i\f1, for example, the Tecla library actually looks -up the binding for \f3M-i\f1. - -The cursor keys are refered to by name, as follows. This is necessary -because different types of terminals generate different key sequences -when their cursor keys are pressed. - - right -> cursor-right - left -> cursor-left - up -> up-history - down -> down-history - -The cursor keys normally generate a keysequence that start -with an escape character, so beware that using the arrow keys -will put you into command mode (if you aren't already in -command mode). -.sp -The following are the terminal-independent key bindings for vi input -mode. - -.nf - ^D -> list-or-eof - ^G -> list-glob - ^H -> backward-delete-char - ^I -> complete-word - \\r -> newline - \\n -> newline - ^L -> clear-screen - ^N -> down-history - ^P -> up-history - ^R -> redisplay - ^U -> backward-kill-line - ^W -> backward-delete-word - ^X* -> expand-filename - ^X^F -> read-from-file - ^X^R -> read-init-files - ^? -> backward-delete-char -.fi - -The following are the key bindings that are defined in vi -command mode, this being specified by them all starting with -a meta character. As mentioned above, once in command mode -the initial meta character is optional. For example, you -might enter command mode by typing Esc, and then press h -twice to move the cursor two positions to the left. Both h -characters get quietly converted to M-h before being compared -to the key-binding table, the first one because Escape -followed by a character is always converted to the equivalent -meta character, and the second because command mode was -already active. - -.nf - M-\\ -> cursor-right (Meta-space) - M-$ -> end-of-line - M-* -> expand-filename - M-+ -> down-history - M-- -> up-history - M-< -> beginning-of-history - M-> -> end-of-history - M-^ -> beginning-of-line - M-; -> repeat-find-char - M-, -> invert-refind-char - M-| -> goto-column - M-~ -> change-case - M-. -> vi-repeat-change - M-% -> find-parenthesis - M-a -> vi-append - M-A -> vi-append-at-eol - M-b -> backward-word - M-B -> backward-word - M-C -> vi-change-rest-of-line - M-cb -> vi-backward-change-word - M-cB -> vi-backward-change-word - M-cc -> vi-change-line - M-ce -> vi-forward-change-word - M-cE -> vi-forward-change-word - M-cw -> vi-forward-change-word - M-cW -> vi-forward-change-word - M-cF -> vi-backward-change-find - M-cf -> vi-forward-change-find - M-cT -> vi-backward-change-to - M-ct -> vi-forward-change-to - M-c; -> vi-change-refind - M-c, -> vi-change-invert-refind - M-ch -> vi-backward-change-char - M-c^H -> vi-backward-change-char - M-c^? -> vi-backward-change-char - M-cl -> vi-forward-change-char - M-c\\ -> vi-forward-change-char (Meta-c-space) - M-c^ -> vi-change-to-bol - M-c0 -> vi-change-to-bol - M-c$ -> vi-change-rest-of-line - M-c| -> vi-change-to-column - M-c% -> vi-change-to-parenthesis - M-dh -> backward-delete-char - M-d^H -> backward-delete-char - M-d^? -> backward-delete-char - M-dl -> forward-delete-char - M-d -> forward-delete-char (Meta-d-space) - M-dd -> delete-line - M-db -> backward-delete-word - M-dB -> backward-delete-word - M-de -> forward-delete-word - M-dE -> forward-delete-word - M-dw -> forward-delete-word - M-dW -> forward-delete-word - M-dF -> backward-delete-find - M-df -> forward-delete-find - M-dT -> backward-delete-to - M-dt -> forward-delete-to - M-d; -> delete-refind - M-d, -> delete-invert-refind - M-d^ -> backward-kill-line - M-d0 -> backward-kill-line - M-d$ -> kill-line - M-D -> kill-line - M-d| -> delete-to-column - M-d% -> delete-to-parenthesis - M-e -> forward-word - M-E -> forward-word - M-f -> forward-find-char - M-F -> backward-find-char - M-- -> up-history - M-h -> cursor-left - M-H -> beginning-of-history - M-i -> vi-insert - M-I -> vi-insert-at-bol - M-j -> down-history - M-J -> history-search-forward - M-k -> up-history - M-K -> history-search-backward - M-l -> cursor-right - M-L -> end-of-history - M-n -> history-re-search-forward - M-N -> history-re-search-backward - M-p -> append-yank - M-P -> yank - M-r -> vi-replace-char - M-R -> vi-overwrite - M-s -> vi-forward-change-char - M-S -> vi-change-line - M-t -> forward-to-char - M-T -> backward-to-char - M-u -> vi-undo - M-w -> forward-to-word - M-W -> forward-to-word - M-x -> forward-delete-char - M-X -> backward-delete-char - M-yh -> backward-copy-char - M-y^H -> backward-copy-char - M-y^? -> backward-copy-char - M-yl -> forward-copy-char - M-y\\ -> forward-copy-char (Meta-y-space) - M-ye -> forward-copy-word - M-yE -> forward-copy-word - M-yw -> forward-copy-word - M-yW -> forward-copy-word - M-yb -> backward-copy-word - M-yB -> backward-copy-word - M-yf -> forward-copy-find - M-yF -> backward-copy-find - M-yt -> forward-copy-to - M-yT -> backward-copy-to - M-y; -> copy-refind - M-y, -> copy-invert-refind - M-y^ -> copy-to-bol - M-y0 -> copy-to-bol - M-y$ -> copy-rest-of-line - M-yy -> copy-line - M-Y -> copy-line - M-y| -> copy-to-column - M-y% -> copy-to-parenthesis - M-^E -> emacs-mode - M-^H -> cursor-left - M-^? -> cursor-left - M-^L -> clear-screen - M-^N -> down-history - M-^P -> up-history - M-^R -> redisplay - M-^D -> list-or-eof - M-^I -> complete-word - M-\\r -> newline - M-\\n -> newline - M-^X^R -> read-init-files - M-^Xh -> list-history - - M-0, M-1, ... M-9 -> digit-argument (see below) -.fi - -Note that \f3^I\f1 is what the TAB key generates. - -.SH ENTERING REPEAT COUNTS - -Many of the key binding functions described previously, take an -optional count, typed in before the target keysequence. This is -interpreted as a repeat count by most bindings. A notable exception is -the goto-column binding, which interprets the count as a column -number. -.sp -By default you can specify this count argument by pressing the meta -key while typing in the numeric count. This relies on the -\f3digit-argument\f1 action being bound to Meta-0, Meta-1 etc. Once -any one of these bindings has been activated, you can optionally take -your finger off the meta key to type in the rest of the number, since -every numeric digit thereafter is treated as part of the number, -unless it is preceded by the \f3literal-next\f1 binding. As soon as a -non-digit, or literal digit key is pressed the repeat count is -terminated and either causes the just typed character to be added to -the line that many times, or causes the next key-binding function to -be given that argument. -.sp -For example, in emacs mode, typing: -.sp -.nf - M-12a -.fi -.sp -causes the letter 'a' to be added to the line 12 times, -whereas -.sp -.nf - M-4M-c -.fi -.sp -Capitalizes the next 4 words. -.sp -In vi command mode the Meta modifier is automatically added to all -characters typed in, so to enter a count in vi command-mode, just -involves typing in the number, just as it does in the vi editor -itself. So for example, in vi command mode, typing: -.sp -.nf - 4w2x -.fi -.sp -moves the cursor four words to the right, then deletes two characters. -.sp -You can also bind \f3digit-argument\f1 to other key sequences. If -these end in a numeric digit, that digit gets appended to the current -repeat count. If it doesn't end in a numeric digit, a new repeat count -is started with a value of zero, and can be completed by typing in the -number, after letting go of the key which triggered the digit-argument -action. - -.SH FILES -.nf -libtecla.a - The Tecla library -libtecla.h - The Tecla header file. -~/.teclarc - The personal Tecla customization file. -.fi - -.SH SEE ALSO - -.nf -libtecla(@LIBR_MANEXT@), gl_get_line(@LIBR_MANEXT@), gl_io_mode(@LIBR_MANEXT@), ef_expand_file(@LIBR_MANEXT@), -cpl_complete_word(@LIBR_MANEXT@), pca_lookup_file(@LIBR_MANEXT@) -.fi - -.SH AUTHOR -Martin Shepherd (mcs@astro.caltech.edu) diff --git a/libtecla/man/prog/enhance.in b/libtecla/man/prog/enhance.in deleted file mode 100644 index aacd8a0..0000000 --- a/libtecla/man/prog/enhance.in +++ /dev/null @@ -1,89 +0,0 @@ -.\" Copyright (c) 2000, 2001, 2002, 2003, 2004, 2012 by Martin C. Shepherd -.\" -.\" All rights reserved. -.\" -.\" Permission is hereby granted, free of charge, to any person obtaining a -.\" copy of this software and associated documentation files (the -.\" "Software"), to deal in the Software without restriction, including -.\" without limitation the rights to use, copy, modify, merge, publish, -.\" distribute, and/or sell copies of the Software, and to permit persons -.\" to whom the Software is furnished to do so, provided that the above -.\" copyright notice(s) and this permission notice appear in all copies of -.\" the Software and that both the above copyright notice(s) and this -.\" permission notice appear in supporting documentation. -.\" -.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT -.\" OF THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR -.\" HOLDERS INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL -.\" INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING -.\" FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, -.\" NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION -.\" WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -.\" -.\" Except as contained in this notice, the name of a copyright holder -.\" shall not be used in advertising or otherwise to promote the sale, use -.\" or other dealings in this Software without prior written authorization -.\" of the copyright holder. -.TH enhance @PROG_MANEXT@ -.SH NAME -enhance - A program that adds command-line editing to third party programs. -.SH SYNOPSIS -.nf -enhance command [ argument ... ] -.fi - -.SH DESCRIPTION - -The \f3enhance\f1 program provides enhanced command-line editing -facilities to users of third party applications, to which one doesn't -have any source code. It does this by placing a pseudo-terminal -between the application and the real terminal. It uses the tecla -command-line editing library to read input from the real terminal, -then forwards each just completed input line to the application via -the pseudo-terminal. All output from the application is forwarded -back unchanged to the real terminal. -.sp -Whenever the application stops generating output for more than a tenth -of a second, the \f3enhance\f1 program treats the latest incomplete -output line as the prompt, and redisplays any incompleted input line -that the user has typed after it. Note that the small delay, which is -imperceptible to the user, isn't necessary for correct operation of -the program. It is just an optimization, designed to stop the input -line from being redisplayed so often that it slows down output. -.sp -Note that the user-level command-line editing facilities provided by -the Tecla library are documented in the \f3tecla(@MISC_MANEXT@)\f1 man page - -.SH DEFICIENCIES - -The one major problem that hasn't been solved yet, is how to deal with -applications that change whether typed input is echo'd by their -controlling terminal. For example, programs that ask for a password, -such as ftp and telnet, temporarily tell their controlling terminal -not to echo what the user types. Since this request goes to the -application side of the psuedo terminal, the \f3enhance\f1 program has -no way of knowing that this has happened, and continues to echo typed -input to its controlling terminal, while the user types their -password. -.sp -Furthermore, before executing the host application, the \f3enhance\f1 -program initially sets the pseudo terminal to noecho mode, so that -everything that it sends to the program doesn't get redundantly -echoed. If a program that switches to noecho mode explicitly restores -echoing afterwards, rather than restoring the terminal modes that were -previously in force, then subsequently, every time that you enter a -new input line, a duplicate copy will be displayed on the next line. - -.SH FILES -.nf -libtecla.a - The tecla library. -~/.teclarc - The tecla personal customization file. -.fi - -.SH SEE ALSO -tecla(@MISC_MANEXT@), libtecla(@LIBR_MANEXT@) - -.SH AUTHOR -Martin Shepherd (mcs@astro.caltech.edu) |