call AC_TYPE_MODE_T
[heimdal.git] / lib / sl / sl.c
blobf5057384c29c08d5e136507c3ea087b8881e06c7
1 /*
2 * Copyright (c) 1995, 1996, 1997 Kungliga Tekniska Högskolan
3 * (Royal Institute of Technology, Stockholm, Sweden).
4 * All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:
9 *
10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
13 * 2. Redistributions in binary form must reproduce the above copyright
14 * notice, this list of conditions and the following disclaimer in the
15 * documentation and/or other materials provided with the distribution.
17 * 3. All advertising materials mentioning features or use of this software
18 * must display the following acknowledgement:
19 * This product includes software developed by the Kungliga Tekniska
20 * Högskolan and its contributors.
22 * 4. Neither the name of the Institute nor the names of its contributors
23 * may be used to endorse or promote products derived from this software
24 * without specific prior written permission.
26 * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
27 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
28 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
29 * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
30 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
31 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
32 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
33 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
34 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
35 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
36 * SUCH DAMAGE.
39 #ifdef HAVE_CONFIG_H
40 #include <config.h>
41 RCSID("$Id$");
42 #endif
44 #include "sl_locl.h"
46 static SL_cmd *
47 sl_match (SL_cmd *cmds, char *cmd, int exactp)
49 SL_cmd *c, *current = NULL, *partial_cmd = NULL;
50 int partial_match = 0;
52 for (c = cmds; c->name; ++c) {
53 if (c->func)
54 current = c;
55 if (strcmp (cmd, c->name) == 0)
56 return current;
57 else if (strncmp (cmd, c->name, strlen(cmd)) == 0 &&
58 partial_cmd != current) {
59 ++partial_match;
60 partial_cmd = current;
63 if (partial_match == 1 && !exactp)
64 return partial_cmd;
65 else
66 return NULL;
69 void
70 sl_help (SL_cmd *cmds, int argc, char **argv)
72 SL_cmd *c, *prev_c;
74 if (argc == 1) {
75 prev_c = NULL;
76 for (c = cmds; c->name; ++c) {
77 if (c->func) {
78 if(prev_c)
79 printf ("\n\t%s%s", prev_c->usage ? prev_c->usage : "",
80 prev_c->usage ? "\n" : "");
81 prev_c = c;
82 printf ("%s", c->name);
83 } else
84 printf (", %s", c->name);
86 if(prev_c)
87 printf ("\n\t%s%s", prev_c->usage ? prev_c->usage : "",
88 prev_c->usage ? "\n" : "");
89 } else {
90 c = sl_match (cmds, argv[1], 0);
91 if (c == NULL)
92 printf ("No such command: %s. Try \"help\" for a list of all commands\n",
93 argv[1]);
94 else {
95 printf ("%s\t%s", c->name, c->usage);
96 if((++c)->name && c->func == NULL) {
97 printf ("\nSynonyms:");
98 while (c->name && c->func == NULL)
99 printf ("\t%s", (c++)->name);
101 printf ("\n");
106 #ifdef HAVE_READLINE
108 char *readline(char *prompt);
109 void add_history(char *p);
111 #else
113 static char *
114 readline(char *prompt)
116 char buf[BUFSIZ];
117 printf ("%s", prompt);
118 fflush (stdout);
119 if(fgets(buf, sizeof(buf), stdin) == NULL)
120 return NULL;
121 if (buf[strlen(buf) - 1] == '\n')
122 buf[strlen(buf) - 1] = '\0';
123 return strdup(buf);
126 static void
127 add_history(char *p)
131 #endif
134 sl_command(SL_cmd *cmds, int argc, char **argv)
136 SL_cmd *c;
137 c = sl_match (cmds, argv[0], 0);
138 if (c == NULL)
139 return -1;
140 return (*c->func)(argc, argv);
144 sl_loop (SL_cmd *cmds, char *prompt)
146 unsigned max_count;
147 char **ptr;
148 int ret;
150 max_count = 17;
151 ptr = malloc(max_count * sizeof(*ptr));
152 if (ptr == NULL) {
153 printf ("sl_loop: failed to allocate %u bytes of memory\n",
154 (int) max_count * sizeof(*ptr));
155 return -1;
158 for (;;) {
159 char *buf;
160 unsigned count;
161 SL_cmd *c;
163 ret = 0;
164 buf = readline(prompt);
165 if(buf == NULL)
166 break;
168 if(*buf)
169 add_history(buf);
170 count = 0;
172 char *foo = NULL;
173 char *p;
175 for(p = strtok_r (buf, " \t", &foo);
177 p = strtok_r (NULL, " \t", &foo)) {
178 if(count == max_count) {
179 max_count *= 2;
180 ptr = realloc (ptr, max_count * sizeof(*ptr));
181 if (ptr == NULL) {
182 printf ("sl_loop: failed to allocate %u "
183 "bytes of memory\n",
184 (unsigned) max_count * sizeof(*ptr));
185 return -1;
188 ptr[count++] = p;
191 if (count > 0) {
192 c = sl_match (cmds, ptr[0], 0);
193 if (c) {
194 ret = (*c->func)(count, ptr);
195 if (ret != 0) {
196 free (buf);
197 break;
199 } else
200 printf ("Unrecognized command: %s\n", ptr[0]);
202 free(buf);
204 free (ptr);
205 return 0;