nmeter: reinstate and document -d-1

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
diff --git a/procps/nmeter.c b/procps/nmeter.c
index d6c46c6..33de379 100644
--- a/procps/nmeter.c
+++ b/procps/nmeter.c
@@ -21,7 +21,7 @@
 //usage:#define nmeter_full_usage "\n\n"
 //usage:       "Monitor system in real time"
 //usage:     "\n"
-//usage:     "\n -d MSEC	Milliseconds between updates (default:1000)"
+//usage:     "\n -d MSEC	Milliseconds between updates, default:1000, none:-1"
 //usage:     "\n"
 //usage:     "\nFormat specifiers:"
 //usage:     "\n %Nc or %[cN]	CPU. N - bar size (default:10)"
@@ -86,7 +86,7 @@
 	char final_char;
 	char *cur_outbuf;
 	int delta;
-	int deltanz;
+	unsigned deltanz;
 	struct timeval tv;
 #define first_proc_file proc_stat
 	proc_file proc_stat;	// Must match the order of proc_name's!
@@ -101,8 +101,6 @@
 #define is26               (G.is26              )
 #define need_seconds       (G.need_seconds      )
 #define cur_outbuf         (G.cur_outbuf        )
-#define delta              (G.delta             )
-#define deltanz            (G.deltanz           )
 #define tv                 (G.tv                )
 #define proc_stat          (G.proc_stat         )
 #define proc_loadavg       (G.proc_loadavg      )
@@ -114,7 +112,7 @@
 	SET_PTR_TO_GLOBALS(xzalloc(sizeof(G))); \
 	cur_outbuf = outbuf; \
 	G.final_char = '\n'; \
-	deltanz = delta = 1000000; \
+	G.deltanz = G.delta = 1000000; \
 } while (0)
 
 // We depend on this being a char[], not char* - we take sizeof() of it
@@ -844,9 +842,9 @@
 	}
 
 	if (getopt32(argv, "d:", &opt_d)) {
-		delta = xatou(opt_d) * 1000;
-		deltanz = delta > 0 ? delta : 1;
-		need_seconds = (1000000 % deltanz) != 0;
+		G.delta = xatoi(opt_d) * 1000;
+		G.deltanz = G.delta > 0 ? G.delta : 1;
+		need_seconds = (1000000 % G.deltanz) != 0;
 	}
 	argv += optind;
 
@@ -902,8 +900,8 @@
 				last->next = s;
 			last = s;
 		} else {
-			// %NNNNd or %r option. remove it from string
-			strcpy(prev + strlen(prev), cur);
+			// %r option. remove it from string
+			overlapping_strcpy(prev + strlen(prev), cur);
 			cur = prev;
 		}
 	}
@@ -921,9 +919,9 @@
 	// Generate first samples but do not print them, they're bogus
 	collect_info(first);
 	reset_outbuf();
-	if (delta >= 0) {
+	if (G.delta >= 0) {
 		gettimeofday(&tv, NULL);
-		usleep(delta > 1000000 ? 1000000 : delta - tv.tv_usec%deltanz);
+		usleep(G.delta > 1000000 ? 1000000 : G.delta - tv.tv_usec % G.deltanz);
 	}
 
 	while (1) {
@@ -937,18 +935,18 @@
 		// time resolution ;)
 		// TODO: detect and avoid useless updates
 		// (like: nothing happens except time)
-		if (delta >= 0) {
+		if (G.delta >= 0) {
 			int rem;
 			// can be commented out, will sacrifice sleep time precision a bit
 			gettimeofday(&tv, NULL);
 			if (need_seconds)
-				rem = delta - ((ullong)tv.tv_sec*1000000 + tv.tv_usec) % deltanz;
+				rem = G.delta - ((ullong)tv.tv_sec*1000000 + tv.tv_usec) % G.deltanz;
 			else
-				rem = delta - tv.tv_usec%deltanz;
+				rem = G.delta - (unsigned)tv.tv_usec % G.deltanz;
 			// Sometimes kernel wakes us up just a tiny bit earlier than asked
 			// Do not go to very short sleep in this case
-			if (rem < delta/128) {
-				rem += delta;
+			if (rem < (unsigned)G.delta / 128) {
+				rem += G.delta;
 			}
 			usleep(rem);
 		}