/* LGets.c */
#include "Sys.h"
#include "Util.h"
#include "LGets.h"
#ifdef HAVE_LIBREADLINE
# include <readline/readline.h>
# ifdef HAVE_READLINE_HISTORY_H
/* Required for version 2.0 of readline. */
# include <readline/history.h>
# endif
#endif /* HAVE_LIBREADLINE */
#ifdef HAVE_LIBGETLINE
# include <getline.h>
#endif /* HAVE_LIBGETLINE */
extern int gIsFromTTY, gIsToTTY;
char *StdioGets(char *promptStr, char *lineStr, size_t size)
{
char *cp, *nl;
if (gIsFromTTY) {
/* It's okay to print a prompt if we are redirecting stdout,
* as long as stdin is still a tty. Otherwise, don't print
* a prompt at all if stdin is redirected.
*/
(void) fputs(promptStr, stdout);
}
(void) fflush(stdout); /* for svr4 */
cp = fgets(lineStr, (int)(size - 2), stdin);
if (cp != NULL) {
nl = cp + strlen(cp) - 1;
if (*nl == '\n')
*nl = '\0';
}
return cp;
} /* StdioGets */
#ifdef HAVE_LIBREADLINE
char *ReadlineGets(char *promptStr, char *lineStr, size_t size)
{
char *dynamic;
dynamic = readline(promptStr);
if (dynamic == NULL)
return NULL;
if (dynamic[0] != '\0') {
(void) Strncpy(lineStr, dynamic, size);
add_history(lineStr);
}
free(dynamic);
return (lineStr);
} /* ReadlineGets */
#endif /* HAVE_LIBREADLINE */
#ifdef HAVE_LIBGETLINE
char *GetlineGets(char *promptStr, char *lineStr, size_t size)
{
char *cp, *nl;
if ((cp = getline(promptStr)) != NULL) {
if (*cp == '\0') /* You hit ^D. */
return NULL;
cp = Strncpy(lineStr, cp, size);
nl = cp + strlen(cp) - 1;
if (*nl == '\n')
*nl = '\0';
if (*cp != '\0') { /* Don't add blank lines to history buffer. */
gl_histadd(cp);
}
}
return (cp);
} /* GetlineGets */
#endif /* HAVE_LIBGETLINE */
/* Given a prompt string, a destination string, and its size, return feedback
* from the user in the destination string, with any trailing newlines
* stripped. Returns NULL if EOF encountered.
*/
char *LineModeGets(char *promptStr, char *lineStr, size_t size)
{
char *cp;
longstring pLines;
string p2;
lineStr[0] = 0; /* Clear it, in case of an error later. */
if (gIsFromTTY && gIsToTTY) {
/* Don't worry about a cmdline/history editor or prompts
* if you redirected a file at me.
*/
/* The prompt string may actually be several lines if the user put a
* newline in it with the @N option. In this case we only want to print
* the very last line, so the command-line editors won't screw up. So
* now we print all the lines except the last line.
*/
cp = strrchr(promptStr, '\n');
if (cp != NULL) {
STRNCPY(p2, cp + 1);
STRNCPY(pLines, promptStr);
cp = pLines + (int)(cp - promptStr);
*cp = '\0';
promptStr = p2;
(void) fputs(pLines, stdout);
}
#ifdef HAVE_LIBREADLINE
return (ReadlineGets(promptStr, lineStr, size));
#endif /* HAVE_LIBREADLINE */
#ifdef HAVE_LIBGETLINE
return (GetlineGets(promptStr, lineStr, size));
#endif /* HAVE_LIBGETLINE */
}
return (StdioGets(promptStr, lineStr, size));
} /* LineModeGets */
syntax highlighted by Code2HTML, v. 0.9.1