Hi! Attached is a patch (generated using cvs diff -u this time) that
fixes the problems discussed previously, namely:
1. There were unnecessary checks for multiple Timeout commands that
were never implemented. Those are gone now.
2. There was no support for multi-word commands inside quotes. That
should work fine now.
Also, I cleaned up the code to do some more error checking "just in case".
Let me know if you see any more problems or have any other suggestions.
Daniel
--
/\\\----------------------------------------------------------------------///\
\ \\\ Daniel Henninger http://www.vorpalcloud.org/ /// /
\_\\\ North Carolina State University - Systems Programmer ///_/
\\\ Information Technology <IT> ///
"""--------------------------------------------------------------"""
Index: modules/ChangeLog
===================================================================
RCS file: /home/cvs/fvwm/fvwm/modules/ChangeLog,v
retrieving revision 1.820
diff -u -u -r1.820 ChangeLog
--- modules/ChangeLog 2002/03/18 10:56:03 1.820
+++ modules/ChangeLog 2002/03/22 05:34:04
@@ -1,3 +1,11 @@
+2002-03-21 Daniel Henninger <[EMAIL PROTECTED]>
+
+ * FvwmForm/FvwmForm.c:
+ * FvwmForm/FvwmForm.h:
+ Took out pointless multiple Timeout command support.
+ Better line parsing error checking for Timeout.
+ Fixed command parsing to allow for quoted commands.
+
2002-03-18 Dominik Vogt <[EMAIL PROTECTED]>
* FvwmWinList/FvwmWinList.c (main):
Index: modules/FvwmForm/FvwmForm.c
===================================================================
RCS file: /home/cvs/fvwm/fvwm/modules/FvwmForm/FvwmForm.c,v
retrieving revision 1.91
diff -u -u -r1.91 FvwmForm.c
--- modules/FvwmForm/FvwmForm.c 2002/03/16 20:14:32 1.91
+++ modules/FvwmForm/FvwmForm.c 2002/03/22 05:34:04
@@ -870,29 +870,38 @@
}
timer = item;
- while (!isspace((unsigned char)*cp)) cp++; /* skip timeout */
- while (isspace((unsigned char)*cp)) cp++; /* move up to command */
+ while (*cp && *cp != '\n' && !isspace((unsigned char)*cp)) cp++;
+ /* skip timeout */
+ while (*cp && *cp != '\n' && isspace((unsigned char)*cp)) cp++;
+ /* move up to command */
- tmpbuf = safestrdup(cp);
- tmpcp = tmpbuf;
- while (!isspace((unsigned char)*tmpcp)) tmpcp++;
- /* question */
- /* This next piece assumes the command is one word, That no
- good, treat it as a word or a quoted string. */
- *tmpcp = '\0'; /* cutoff command at first word */
- /* question */
- /* This pretends that there can be more than one command
- per timeout, but I don't see how. */
- item->timeout.timeout_array_size += TIMEOUT_COMMAND_EXPANSION;
- item->timeout.commands =
- (char **)saferealloc((void *)item->timeout.commands,
- sizeof(char *) *
- item->timeout.timeout_array_size);
- item->timeout.commands[item->timeout.numcommands++] = safestrdup(tmpbuf);
- free(tmpbuf);
+ if (!*cp || *cp == '\n') {
+ fprintf(stderr,"Improper arguments specified for FvwmForm Timeout.\n");
+ return;
+ }
+
+ if (*cp == '\"') {
+ item->timeout.command = CopyQuotedString(++cp);
+ /* skip over the whole quoted string to continue parsing */
+ cp += strlen(item->timeout.command);
+ }
+ else {
+ tmpbuf = safestrdup(cp);
+ tmpcp = tmpbuf;
+ while (!isspace((unsigned char)*tmpcp)) tmpcp++;
+ *tmpcp = '\0'; /* cutoff command at first word */
+ item->timeout.command = safestrdup(tmpbuf);
+ free(tmpbuf);
+ while (!isspace((unsigned char)*cp)) cp++; /* move past command again */
+ }
+
+ while (*cp && *cp != '\n' && isspace((unsigned char)*cp)) cp++;
+ /* move up to next arg */
- while (!isspace((unsigned char)*cp)) cp++; /* move past command again */
- while (isspace((unsigned char)*cp)) cp++; /* move up to start of text */
+ if (!*cp || *cp == '\n') {
+ fprintf(stderr,"Improper arguments specified for FvwmForm Timeout.\n");
+ return;
+ }
if (*cp == '\"') {
item->timeout.text = CopyQuotedString(++cp);
@@ -2277,8 +2286,9 @@
static RETSIGTYPE
TimerHandler(int sig)
{
- int k, dn;
+ int dn;
char *sp;
+ char *parsed_command;
timer->timeout.timeleft--;
if (timer->timeout.timeleft <= 0) {
@@ -2288,19 +2298,15 @@
/* hm, what can we do now? just ignore this situation. */
}
- for (k = 0; k < timer->timeout.numcommands; k++) {
- char *parsed_command;
- /* construct command */
- parsed_command = ParseCommand(0, timer->timeout.commands[k],
- '\0', &dn, &sp);
- myfprintf((stderr, "Final command[%d]: [%s]\n", k, parsed_command));
-
- /* send command */
- if ( parsed_command[0] == '!') { /* If command starts with ! */
- system(parsed_command+1); /* Need synchronous execution */
- } else {
- SendText(Channel,parsed_command, ref);
- }
+ /* construct command */
+ parsed_command = ParseCommand(0, timer->timeout.command, '\0', &dn, &sp);
+ myfprintf((stderr, "Final command: %s\n", parsed_command));
+
+ /* send command */
+ if ( parsed_command[0] == '!') { /* If command starts with ! */
+ system(parsed_command+1); /* Need synchronous execution */
+ } else {
+ SendText(Channel,parsed_command, ref);
}
/* post-command */
Index: modules/FvwmForm/FvwmForm.h
===================================================================
RCS file: /home/cvs/fvwm/fvwm/modules/FvwmForm/FvwmForm.h,v
retrieving revision 1.23
diff -u -u -r1.23 FvwmForm.h
--- modules/FvwmForm/FvwmForm.h 2002/03/16 20:14:32 1.23
+++ modules/FvwmForm/FvwmForm.h 2002/03/22 05:34:05
@@ -140,14 +140,12 @@
int button_array_size; /* current size of next array */
char **commands; /* Fvwm command to execute */
} button;
- struct {
+ struct { /* I_TIMEOUT */
struct _head head;
int timeleft; /* seconds left on timer */
int len; /* text length */
char *text; /* text string */
- int numcommands; /* # of commands */
- int timeout_array_size; /* current size of next array */
- char **commands; /* Fvwm command(s) to execute */
+ char *command; /* Fvwm command(s) to execute */
} timeout;
} Item;