----- Original Message -----
From: "Jim Persson" <jim@LINUX.NU>
Sent: Friday, June 08, 2001 9:13 AM
> i would like the function to operate to make something like this possible
>
> line_input(ch->desc, "First Name", &f_name); // It should wait for
> the input here and then continue
> line_input(ch->desc, "Prompt 2", &l_name); // Same here
> sprintf(buf, "Hi %s %s\r\n", f_name, l_name); // and then execute
> this
Obviously this won't work for the same reason the other one wouldn't work. To
solve the problem, I would suggest a modification to the line input function
and the descriptor_data structure (See my original email for previous code
modifications):
in structs.h:
struct descriptor_data {
socket_t descriptor; /* file descriptor for socket */
- void (*callback)(struct descriptor_data *, char *);
+ void (*callback)(struct descriptor_data *, char *, void *);
+ void *argument;
Then modify the case statement in interpreter.c:
case CON_LINE_INPUT:
if (d->callback)
- d->callback(d, arg);
+ d->callback(d, arg, d->argument);
else
log("SYSERR: No callback specified for line input.");
d->callback = NULL;
+ d->argument = NULL;
STATE(d) = CON_PLAYING;
break;
Then modify line_input:
-void line_input( struct descriptor_data *d, const char *prompt,
void (*callback)(struct descriptor_data *, char *) ) {
+void line_input( struct descriptor_data *d, const char *prompt,
void (*callback)(struct descriptor_data *, char *, void *),
void *argument ) {
d->callback = callback;
+ d->argument = argument;
STATE(d) = CON_LINE_INPUT;
SEND_TO_Q(prompt, d);
}
You will have to add the void * parameter to all of your callbacks, and now
you can pass along context information which you can use however you want.
For example:
+void parse_last(struct descriptor_data *, char *, void *);
+void parse_first( struct descriptor_data *d, char *name, void *ignore) {
+ line_input(d, "Enter last name: ", parse_last, str_dup(name));
+}
+void parse_last( struct descriptor_data *d, char *name, void *context ) {
+ sprintf(buf, "Hi %s %s.\r\n", (char *)context, name);
+ SEND_TO_Q(buf, d);
+ free(context); /* Don't forget this! */
+}
And then somewhere in your code:
...
line_input(ch->desc, "Enter first name: ", parse_first, NULL);
NOTE: Technically it is possible to do this with fewer arguments by accessing
the members of struct descriptor_data directly. I personally prefer the style
described above because it makes the code a little more readable. Also note
that if you want to pass more than one argument to line_input that you can
create a structure containing your arguments and pass a pointer to that.
Mike
P.S. I suggest reading the FAQ at the bottom of this message so you don't get
dropped from the list.
--
+---------------------------------------------------------------+
| FAQ: http://qsilver.queensu.ca/~fletchra/Circle/list-faq.html |
| Archives: http://post.queensu.ca/listserv/wwwarch/circle.html |
+---------------------------------------------------------------+
This archive was generated by hypermail 2b30 : 12/05/01 PST