Module Name:    src
Committed By:   christos
Date:           Mon Aug 29 12:49:37 UTC 2011

Modified Files:
        src/tests/lib/libcurses/director: testlang_parse.y

Log Message:
- err -> errx mistakes
- make sure that -v does not change the program behavior
- don't set revents in poll
- add more debugging
- only call read when we have POLLIN
- don't mix I/O from master while processing input


To generate a diff of this commit:
cvs rdiff -u -r1.8 -r1.9 src/tests/lib/libcurses/director/testlang_parse.y

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/tests/lib/libcurses/director/testlang_parse.y
diff -u src/tests/lib/libcurses/director/testlang_parse.y:1.8 src/tests/lib/libcurses/director/testlang_parse.y:1.9
--- src/tests/lib/libcurses/director/testlang_parse.y:1.8	Wed Aug 17 22:44:45 2011
+++ src/tests/lib/libcurses/director/testlang_parse.y	Mon Aug 29 08:49:37 2011
@@ -1,5 +1,5 @@
 %{
-/*	$NetBSD: testlang_parse.y,v 1.8 2011/08/18 02:44:45 christos Exp $	*/
+/*	$NetBSD: testlang_parse.y,v 1.9 2011/08/29 12:49:37 christos Exp $	*/
 
 /*-
  * Copyright 2009 Brett Lymn <bl...@netbsd.org>
@@ -41,6 +41,7 @@
 #include <sys/syslimits.h>
 #include <time.h>
 #include <vis.h>
+#include <stdint.h>
 #include "returns.h"
 
 #define YYDEBUG 1
@@ -226,16 +227,18 @@
 		err(1, "Undefined variable in check statement, line %zu"
 		    " of file %s", line, cur_file);
 
-	if (verbose)
+	if (verbose) {
 		fprintf(stderr, "Checking contents of variable %s for %s\n",
 		    vars[command.returns[0].return_index].name,
 		    returns_enum_names[command.returns[1].return_type]);
+	}
 
 	if (((command.returns[1].return_type == ret_byte) &&
 	     (vars[command.returns[0].return_index].type != ret_byte)) ||
 	    vars[command.returns[0].return_index].type != ret_string)
 		err(1, "Var type %s (%d) does not match return type %s (%d)",
-		    returns_enum_names[vars[command.returns[0].return_index].type],
+		    returns_enum_names[
+		    vars[command.returns[0].return_index].type],
 		    vars[command.returns[0].return_index].type,
 		    returns_enum_names[command.returns[1].return_type],
 		    command.returns[1].return_type);
@@ -263,11 +266,12 @@
 
 	case ret_string:
 	case ret_number:
-		if (verbose)
+		if (verbose) {
 			fprintf(stderr, " %s == returned %s\n",
 			    (const char *)command.returns[1].return_value,
 			    (const char *)
 			    vars[command.returns[0].return_index].value);
+		}
 		validate_variable(0, ret_string,
 		    command.returns[1].return_value,
 		    command.returns[0].return_index, 0);
@@ -296,8 +300,9 @@
 	if (sscanf($2, "%d", &input_delay) == 0)
 		err(1, "delay specification %s could not be converted to "
 		    "numeric at line %zu of file %s", $2, line, cur_file);
-	if (verbose)
+	if (verbose) {
 		fprintf(stderr, "Set input delay to %d ms\n", input_delay);
+	}
 
 	if (input_delay < DELAY_MIN)
 		input_delay = 1000 * DELAY_MIN; /* ms to ns */
@@ -308,6 +313,11 @@
 	 */
 	delay_spec.tv_sec = input_delay / 1000;
 	delay_spec.tv_nsec = (input_delay - 1000 * delay_spec.tv_sec) * 1000;
+	if (verbose) {
+		fprintf(stderr, "set delay to %jd.%jd\n",
+		    (intmax_t)delay_spec.tv_sec, 
+		    (intmax_t)delay_spec.tv_nsec);
+	}
 
 	init_parse_variables(0);
  }
@@ -464,10 +474,11 @@
 	result = i1 | i2;
 	asprintf(&ret, "%lu", result);
 
-	if (verbose)
+	if (verbose) {
 		fprintf(stderr, "numeric or of 0x%lx (%s) and 0x%lx (%s)"
 		    " results in 0x%lx (%s)\n",
 		    i1, n1, i2, n2, result, ret);
+	}
 
 	return ret;
 }
@@ -518,8 +529,7 @@
 	if ((name = malloc(strlen(varname) + 1)) == NULL)
 		err(1, "Alloc of varname failed");
 
-	if ((temp = (var_t *) realloc(vars, sizeof(var_t) * (nvars + 1)))
-	    == NULL) {
+	if ((temp = realloc(vars, sizeof(*temp) * (nvars + 1))) == NULL) {
 		free(name);
 		err(1, "Realloc of vars array failed");
 	}
@@ -544,9 +554,10 @@
 	char *str = arg;
 	returns_t *ret;
 
-	if (verbose)
-		printf("function is >%s<, adding arg >%s< type %s\n",
+	if (verbose) {
+		fprintf(stderr, "function is >%s<, adding arg >%s< type %s\n",
 		       command.function, str, args_enum_names[arg_type]);
+	}
 
 	cur.arg_type = arg_type;
 	switch (arg_type) {
@@ -580,7 +591,7 @@
 		strcpy(cur.arg_string, arg);
 	}
 
-	temp = realloc(command.args, sizeof(args_t) * (command.nargs + 1));
+	temp = realloc(command.args, sizeof(*temp) * (command.nargs + 1));
 	if (temp == NULL)
 		err(1, "Failed to reallocate args");
 	command.args = temp;
@@ -627,8 +638,7 @@
 			cur.return_index = assign_var(ret);
 	}
 
-	temp = realloc(command.returns,
-		       sizeof(returns_t) * (command.nrets + 1));
+	temp = realloc(command.returns, sizeof(*temp) * (command.nrets + 1));
 	if (temp == NULL)
 		err(1, "Failed to reallocate returns");
 	command.returns = temp;
@@ -687,6 +697,7 @@
 	struct pollfd fds[2];
 	int nfd, check_fd;
 	ssize_t result;
+	size_t offs;
 
 	/*
 	 * Don't prepend check path iff check file has an absolute
@@ -714,10 +725,8 @@
 
 	fds[0].fd = check_fd;
 	fds[0].events = POLLIN;
-	fds[0].revents = 0;
 	fds[1].fd = master;
 	fds[1].events = POLLIN;
-	fds[1].revents = 0;
 
 	nfd = 2;
 	/*
@@ -727,12 +736,16 @@
 	if (saved_output.count > 0)
 		nfd = 1;
 
-	while (poll(&fds[0], nfd, 500) == nfd) {
-		if ((result = read(check_fd, &ref, 1)) < 1) {
-			if (result != 0) {
-				err(2, "Bad read on file %s", check_file);
-			} else {
-				break;
+	offs = 0;
+	while (poll(fds, nfd, 500) == nfd) {
+		if (fds[0].revents & POLLIN) {
+			if ((result = read(check_fd, &ref, 1)) < 1) {
+				if (result != 0) {
+					err(2,
+					    "Bad read on file %s", check_file);
+				} else {
+					break;
+				}
 			}
 		}
 
@@ -744,28 +757,30 @@
 			if (saved_output.count == 0)
 				nfd = 2;
 		} else {
-			if (read(master, &data, 1) < 1)
-				err(2, "Bad read on slave pty");
+			if (fds[0].revents & POLLIN) {
+				if (read(master, &data, 1) < 1)
+					err(2, "Bad read on slave pty");
+			} else
+				continue;
 		}
 
 		if (verbose) {
 			fprintf(stderr, "Comparing reference byte 0x%x (%c)"
-				" against slave byte 0x%x (%c)\n", ref,
-				(ref >= ' ')? ref : '-',
-				data, (data >= ' ')? data : '-');
+				" against slave byte 0x%x (%c)\n",
+				ref, (ref >= ' ') ? ref : '-',
+				data, (data >= ' ' )? data : '-');
 		}
 
 		if (ref != data) {
-			warnx("%s, %zu: refresh data from slave does "
-			    "not match expected from file %s",
-			    cur_file, line, check_file);
-
-			if (!verbose)
-				exit(2);
+			errx(2, "%s, %zu: refresh data from slave does "
+			    "not match expected from file %s offs %zu "
+			    "[reference 0x%x (%c) != slave 0x%x (%c)]",
+			    cur_file, line, check_file, offs,
+			    ref, (ref >= ' ') ? ref : '-',
+			    data, (data >= ' ') ? data : '-');
 		}
 
-		fds[0].revents = 0;
-		fds[1].revents = 0;
+		offs++;
 	}
 
 
@@ -779,15 +794,13 @@
 		saved_output.readp = 0;
 	}
 
-	fds[0].revents = 0;
-	fds[1].revents = 0;
 	if ((result = poll(&fds[0], 2, 0)) != 0) {
 		if (result == -1)
 			err(2, "poll of file descriptors failed");
 
 		if ((fds[1].revents & POLLIN) == POLLIN) {
 			save_slave_output(true);
-		} else {
+		} else if ((fds[0].revents & POLLIN) == POLLIN) {
 			/*
 			 * handle excess in file if it exists.  Poll
 			 * says there is data until EOF is read.
@@ -802,8 +815,6 @@
 			if (result > 0) {
 				excess(check_file, 0, __func__, "", drain,
 				    result);
-				if (!verbose)
-					exit(2);
 			}
 		}
 	}
@@ -843,14 +854,16 @@
 		err(2, "expected return type of ret_count but received %s",
 		    returns_enum_names[returns_count.return_type]);
 
-	if (verbose)
+	if (verbose) {
 		fprintf(stderr, "Expect %zu results from slave, slave "
-			"reported %zu\n", nresults, returns_count.return_len);
+		    "reported %zu\n", nresults, returns_count.return_len);
+	}
 
 	if ((no_input == false) && (do_input == 1)) {
-		if (verbose)
+		if (verbose) {
 			fprintf(stderr, "doing input with inputstr >%s<\n",
-				input_str);
+			    input_str);
+		}
 
 		if (input_str == NULL)
 			errx(2, "%s, %zu: Call to input function "
@@ -858,31 +871,35 @@
 
 		fds[0].fd = slvpipe[READ_PIPE];
 		fds[0].events = POLLIN;
+		fds[1].fd = master;
+		fds[1].events = POLLOUT;
  		p = input_str;
 		save_slave_output(false);
 		while(*p != '\0') {
-			if (verbose) {
-				fprintf(stderr, "Writing char >%c< to slave\n",
-					*p);
-				fflush(stderr);
-			}
-
 			nanosleep(&delay_spec, NULL);
-
-			write(master, p, 1);
-			save_slave_output(false);
-
-			p++;
-			fds[0].revents = 0;
-
-			/* check for slave function returning unexpectedly */
-			if ((poll(&fds[0], 1, 10) > 0) && (*p != '\0')) {
+			if (poll(fds, 2, 0) < 0)
+				err(2, "poll failed");
+			if (fds[0].revents & POLLIN) {
 				warnx("%s, %zu: Slave function "
 				    "returned before end of input string",
 				    cur_file, line);
 				break;
 			}
+			if ((fds[1].revents & POLLOUT) == 0)
+				continue;
+			if (verbose) {
+				fprintf(stderr, "Writing char >%c< to slave\n",
+				    *p);
+			}
+			if (write(master, p, 1) != 1) {
+				warn("%s, %zu: Slave function write error",
+				    cur_file, line);
+				break;
+			}
+			p++;
+
 		}
+		save_slave_output(false);
 
 		if (verbose) {
 			fprintf(stderr, "Input done.\n");
@@ -893,18 +910,15 @@
 		input_str = NULL;
 	}
 
-	if (verbose) {
+	if (verbose && 0) {
 		fds[0].fd = slvpipe[READ_PIPE];
 		fds[0].events = POLLIN;
-		fds[0].revents = 0;
 
 		fds[1].fd = slvpipe[WRITE_PIPE];
 		fds[1].events = POLLOUT;
-		fds[1].revents = 0;
 
 		fds[2].fd = master;
 		fds[2].events = POLLIN | POLLOUT;
-		fds[2].revents = 0;
 
 		i = poll(&fds[0], 3, 1000);
 		fprintf(stderr, "Poll returned %zu\n", i);
@@ -982,8 +996,9 @@
 {
 	int i;
 
-	if (verbose)
+	if (verbose) {
 		fprintf(stderr, "calling function >%s<\n", command.function);
+	}
 
 	write_cmd_pipe(command.function);
 	for (i = 0; i < command.nargs; i++) {
@@ -1050,7 +1065,6 @@
 	 */
 	slave_pty.fd = master;
 	slave_pty.events = POLLIN;
-	slave_pty.revents = 0;
 	result = poll(&slave_pty, 1, 0);
 
 	if (result < 0)
@@ -1129,11 +1143,12 @@
 	if (command.returns[i].return_type != ret_byte)
 		response = data;
 
-	if (verbose)
+	if (1 || verbose) {
 		fprintf(stderr,
-			"validate_reference: return type of %s, value %s \n",
-			returns_enum_names[varp->type],
-			(const char *)varp->value);
+		    "validate_reference: return type of %s, value %s \n",
+		    returns_enum_names[varp->type],
+		    (const char *)varp->value);
+	}
 
 	switch (varp->type) {
 	case ret_string:
@@ -1167,12 +1182,13 @@
 		    (check == 0)? "matching" : "not matching",
 		    returns_enum_names[value->return_type], line, cur_file);
 
-	if (verbose)
+	if (verbose) {
 		fprintf(stderr, "Validate expected type %s %s %s line %zu"
-			" of file %s\n",
-			returns_enum_names[expected],
-			(check == 0)? "matching" : "not matching",
-			returns_enum_names[value->return_type], line, cur_file);
+		    " of file %s\n",
+		    returns_enum_names[expected],
+		    (check == 0)? "matching" : "not matching",
+		    returns_enum_names[value->return_type], line, cur_file);
+	}
 }
 
 /*
@@ -1184,15 +1200,16 @@
 {
 	if (((check == 0) && strcmp(expected, value) != 0) ||
 	    ((check == 1) && strcmp(expected, value) == 0))
-		err(1, "Validate expected %s %s %s line %zu of file %s",
+		errx(1, "Validate expected %s %s %s line %zu of file %s",
 		    expected,
 		    (check == 0)? "matching" : "not matching", value,
 		    line, cur_file);
-	if (verbose)
+	if (verbose) {
 		fprintf(stderr, "Validated expected value %s %s %s "
-			"at line %zu of file %s\n", expected,
-			(check == 0)? "matches" : "does not match",
-			value, line, cur_file);
+		    "at line %zu of file %s\n", expected,
+		    (check == 0)? "matches" : "does not match",
+		    value, line, cur_file);
+	}
 }
 
 /*
@@ -1206,7 +1223,7 @@
 	 * No chance of a match if lengths differ...
 	 */
 	if ((check == 0) && (expected->return_len != value->return_len))
-	    err(1, "Byte validation failed, length mismatch");
+	    errx(1, "Byte validation failed, length mismatch");
 
 	/*
 	 * If check is 0 then we want to throw an error IFF the byte streams
@@ -1218,14 +1235,15 @@
 	    ((check == 1) && (expected->return_len == value->return_len) &&
 	     memcmp(expected->return_value, value->return_value,
 		    value->return_len) == 0))
-		err(1, "Validate expected %s byte stream at line %zu"
+		errx(1, "Validate expected %s byte stream at line %zu"
 		    "of file %s",
 		    (check == 0)? "matching" : "not matching", line, cur_file);
-	if (verbose)
+	if (verbose) {
 		fprintf(stderr, "Validated expected %s byte stream "
-			"at line %zu of file %s\n",
-			(check == 0)? "matching" : "not matching",
-			line, cur_file);
+		    "at line %zu of file %s\n",
+		    (check == 0)? "matching" : "not matching",
+		    line, cur_file);
+	}
 }
 
 /*
@@ -1259,12 +1277,13 @@
 			    (check == 0)? "expected" : "not matching",
 			    (const char *)value,
 			    line, cur_file);
-		if (verbose)
+		if (verbose) {
 			fprintf(stderr, "Variable %s contains %s value "
-				"%s at line %zu of file %s\n",
-				varptr->name,
-				(check == 0)? "expected" : "not matching",
-				(const char *)varptr->value, line, cur_file);
+			    "%s at line %zu of file %s\n",
+			    varptr->name,
+			    (check == 0)? "expected" : "not matching",
+			    (const char *)varptr->value, line, cur_file);
+		}
 	} else {
 		if ((check == 0) && (retval->return_len != varptr->len))
 			err(1, "Byte validation failed, length mismatch");
@@ -1283,11 +1302,12 @@
 			    " of file %s",
 			    (check == 0)? "matching" : "not matching",
 			    line, cur_file);
-		if (verbose)
+		if (verbose) {
 			fprintf(stderr, "Validated expected %s byte stream "
-				"at line %zu of file %s\n",
-				(check == 0)? "matching" : "not matching",
-				line, cur_file);
+			    "at line %zu of file %s\n",
+			    (check == 0)? "matching" : "not matching",
+			    line, cur_file);
+		}
 	}
 }
 
@@ -1351,23 +1371,26 @@
 			send_type = ret_string;
 	}
 
-	if (verbose)
+	if (verbose) {
 		fprintf(stderr, "Writing type %s to command pipe\n",
-			returns_enum_names[send_type]);
+		    returns_enum_names[send_type]);
+	}
 
 	if (write(cmdpipe[WRITE_PIPE], &send_type, sizeof(int)) < 0)
 		err(1, "command pipe write for type failed");
 
-	if (verbose)
+	if (verbose) {
 		fprintf(stderr, "Writing length %d to command pipe\n", len);
+	}
 
 	if (write(cmdpipe[WRITE_PIPE], &len, sizeof(int)) < 0)
 		err(1, "command pipe write for length failed");
 
 	if (len > 0) {
-		if (verbose)
+		if (verbose) {
 			fprintf(stderr, "Writing data >%s< to command pipe\n",
-				(const char *)cmd);
+			    (const char *)cmd);
+		}
 		if (write(cmdpipe[WRITE_PIPE], cmd, len) < 0)
 			err(1, "command pipe write of data failed");
 	}
@@ -1396,17 +1419,15 @@
 	rfd[1].events = POLLIN;
 
 	do {
-		rfd[0].revents = 0;
-		rfd[1].revents = 0;
-
 		if (poll(rfd, 2, 4000) == 0)
 			errx(2, "%s, %zu: Command pipe read timeout",
 			    cur_file, line);
 
 		if ((rfd[1].revents & POLLIN) == POLLIN) {
-			if (verbose)
+			if (verbose) {
 				fprintf(stderr,
-					"draining output from slave\n");
+				    "draining output from slave\n");
+			}
 			save_slave_output(false);
 		}
 	}
@@ -1421,9 +1442,10 @@
 			err(1, "command pipe read for length failed");
 		response->return_len = len;
 
-		if (verbose)
+		if (verbose) {
 			fprintf(stderr,
-				"Reading %d bytes from command pipe\n", len);
+			    "Reading %d bytes from command pipe\n", len);
+		}
 
 		if ((response->return_value = malloc(len + 1)) == NULL)
 			err(1, "Failed to alloc memory for cmd pipe read");
@@ -1435,9 +1457,10 @@
 			str = response->return_value;
 			str[len] = '\0';
 
-			if (verbose)
+			if (verbose) {
 				fprintf(stderr, "Read data >%s< from pipe\n",
-					(const char *)response->return_value);
+				    (const char *)response->return_value);
+			}
 		}
 	} else {
 		response->return_value = NULL;
@@ -1448,9 +1471,10 @@
 			response->return_len = len;
 		}
 
-		if (verbose)
+		if (verbose) {
 			fprintf(stderr, "Read type %s from pipe\n",
-				returns_enum_names[type]);
+			    returns_enum_names[type]);
+		}
 	}
 }
 
@@ -1463,29 +1487,25 @@
 static void
 save_slave_output(bool discard)
 {
-	struct pollfd fd;
 	char *new_data, drain[MAX_DRAIN];
 	size_t to_allocate;
 	ssize_t result;
 	size_t i;
 
-	fd.fd = master;
-	fd.events = POLLIN;
-	fd.revents = 0;
-
 	result = 0;
-	while (1) {
+	for (;;) {
 		if (result == -1)
 			err(2, "poll of slave pty failed");
 		result = MAX_DRAIN;
-		if ((result = read(master, &drain, result)) < 0) {
+		if ((result = read(master, drain, result)) < 0) {
 			if (errno == EAGAIN)
 				break;
 			else
 				err(2, "draining slave pty failed");
 		}
+		if (result == 0)
+			abort();
 
-		fd.revents = 0;
 		if (!discard) {
 			if ((size_t)result >
 			    (saved_output.allocated - saved_output.count)) {
@@ -1505,7 +1525,8 @@
 				    saved_output.allocated);
 				for (i = 0; i < (size_t)result; i++) {
 					fprintf(stderr, "Saving slave output "
-					    "0x%x (%c)\n", drain[i],
+					    "at %zu: 0x%x (%c)\n",
+					    saved_output.count + i, drain[i],
 					    (drain[i] >= ' ')? drain[i] : '-');
 				}
 			}
@@ -1521,7 +1542,7 @@
 			}
 		} else {
 			if (verbose) {
-				for (i=0; i < (size_t)result; i++) {
+				for (i = 0; i < (size_t)result; i++) {
 					fprintf(stderr, "Discarding slave "
 					    "output 0x%x (%c)\n",
 					    drain[i],

Reply via email to