summaryrefslogtreecommitdiffstats
path: root/libtecla/demo.c
diff options
context:
space:
mode:
Diffstat (limited to 'libtecla/demo.c')
-rw-r--r--libtecla/demo.c166
1 files changed, 166 insertions, 0 deletions
diff --git a/libtecla/demo.c b/libtecla/demo.c
new file mode 100644
index 0000000..e115472
--- /dev/null
+++ b/libtecla/demo.c
@@ -0,0 +1,166 @@
+/*
+ * 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.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <ctype.h>
+#include <string.h>
+#include <errno.h>
+#include <locale.h>
+
+#include <unistd.h>
+#include <sys/stat.h>
+
+#include "libtecla.h"
+
+/* The function which displays the introductory text of the demo */
+
+static void show_demo_introduction(GetLine *gl);
+
+/*.......................................................................
+ * This program demonstrates how to use gl_get_line() as a line editor to
+ * to enable users to enter input. It takes no arguments.
+ */
+int main(int argc, char *argv[])
+{
+ char *line; /* A line of input */
+ GetLine *gl; /* The line editor */
+ int major,minor,micro; /* The version number of the library */
+/*
+ * Create the line editor, specifying a max line length of 500 bytes,
+ * and 10000 bytes to allocate to storage of historical input lines.
+ */
+ gl = new_GetLine(500, 5000);
+ if(!gl)
+ return 1;
+/*
+ * If the user has the LC_CTYPE or LC_ALL environment variables set,
+ * enable display of characters corresponding to the specified locale.
+ */
+ (void) setlocale(LC_CTYPE, "");
+/*
+ * Lookup and display the version number of the library.
+ */
+ libtecla_version(&major, &minor, &micro);
+ printf("\n Welcome to the main demo program of libtecla version %d.%d.%d\n",
+ major, minor, micro);
+/*
+ * Display an introductory banner.
+ */
+ show_demo_introduction(gl);
+/*
+ * Load history.
+ */
+#ifndef WITHOUT_FILE_SYSTEM
+ (void) gl_load_history(gl, "~/.demo_history", "#");
+#endif
+/*
+ * Read lines of input from the user and print them to stdout.
+ */
+ do {
+/*
+ * Get a new line from the user.
+ */
+ line = gl_get_line(gl, "$ ", NULL, 0);
+ if(!line)
+ break;
+/*
+ * Display what was entered.
+ */
+ if(printf("You entered: %s", line) < 0 || fflush(stdout))
+ break;
+/*
+ * If the user types "exit", quit the program.
+ */
+ if(strcmp(line, "exit\n")==0)
+ break;
+ else if(strcmp(line, "history\n")==0)
+ gl_show_history(gl, stdout, "%N %T %H\n", 0, -1);
+ else if(strcmp(line, "size\n")==0) {
+ GlTerminalSize size = gl_terminal_size(gl, 80, 24);
+ printf("Terminal size = %d columns x %d lines.\n", size.ncolumn,
+ size.nline);
+ } else if(strcmp(line, "clear\n")==0) {
+ if(gl_erase_terminal(gl))
+ return 1;
+ };
+ } while(1);
+/*
+ * Save historical command lines.
+ */
+#ifndef WITHOUT_FILE_SYSTEM
+ (void) gl_save_history(gl, "~/.demo_history", "#", -1);
+#endif
+/*
+ * Clean up.
+ */
+ gl = del_GetLine(gl);
+ return 0;
+}
+
+/*.......................................................................
+ * Display introductory text to the user, formatted according to the
+ * current terminal width and enclosed in a box of asterixes.
+ *
+ * Input:
+ * gl GetLine * The resource object of gl_get_line().
+ */
+static void show_demo_introduction(GetLine *gl)
+{
+ int start; /* The column in which gl_display_text() left the cursor */
+ int i;
+/*
+ * Break the indtroductory text into an array of strings, so as to
+ * avoid overflowing any compiler string limits.
+ */
+ const char *doc[] = {
+ "This program is a simple shell with which you can experiment with the ",
+ "line editing and tab completion facilities provided by the gl_get_line() ",
+ "function. The file demo.c also serves as a fully commented example ",
+ "of how to use gl_get_line().\n"
+ };
+/*
+ * Form the top line of the documentation box by filling the area of
+ * the line between a " *" prefix and a "* " suffix with asterixes.
+ */
+ printf("\n");
+ gl_display_text(gl, 0, " *", "* ", '*', 80, 0, "\n");
+/*
+ * Justify the documentation text within margins of asterixes.
+ */
+ for(start=0,i=0; i<sizeof(doc)/sizeof(doc[0]) && start >= 0; i++)
+ start = gl_display_text(gl, 0, " * ", " * ", ' ', 80, start,doc[i]);
+/*
+ * Draw the bottom line of the documentation box.
+ */
+ gl_display_text(gl, 0, " *", "* ", '*', 80, 0, "\n");
+ printf("\n");
+}