[logging] Minor performance tweak

2007-04-29 Andrew J. Schorr <ajschorr@alumni.princeton.edu>

	* log.c: (quagga_timestamp) Optimize the subsecond timestamp generation.
diff --git a/lib/ChangeLog b/lib/ChangeLog
index 3e515f8..f8fdd11 100644
--- a/lib/ChangeLog
+++ b/lib/ChangeLog
@@ -1,3 +1,7 @@
+2007-04-29 Andrew J. Schorr <ajschorr@alumni.princeton.edu>
+
+	* log.c: (quagga_timestamp) Optimize the subsecond timestamp generation.
+
 2007-04-28 Andrew J. Schorr <ajschorr@alumni.princeton.edu>
 
 	* command.c: (config_write_host) Save "log timestamp precision"
diff --git a/lib/log.c b/lib/log.c
index 7668222..21bf3f2 100644
--- a/lib/log.c
+++ b/lib/log.c
@@ -100,18 +100,25 @@
 	  (buflen > cache.len+1+timestamp_precision))
 	{
 	  /* should we worry about locale issues? */
-	  long divisor = 100000;
-	  char *p = buf+cache.len;
-	  *p++ = '.';
+	  static const int divisor[] = {0, 100000, 10000, 1000, 100, 10, 1};
+	  int prec;
+	  char *p = buf+cache.len+1+(prec = timestamp_precision);
+	  *p-- = '\0';
+	  while (prec > 6)
+	    /* this is unlikely to happen, but protect anyway */
+	    {
+	      *p-- = '0';
+	      prec--;
+	    }
+	  clock.tv_usec /= divisor[prec];
 	  do
 	    {
-	      *p++ = '0'+(clock.tv_usec/divisor);
-	      clock.tv_usec %= divisor;
-	      divisor /= 10;
+	      *p-- = '0'+(clock.tv_usec % 10);
+	      clock.tv_usec /= 10;
 	    }
-	  while (--timestamp_precision > 0);
-	  *p = '\0';
-	  return p-buf;
+	  while (--prec > 0);
+	  *p = '.';
+	  return cache.len+1+timestamp_precision;
 	}
       buf[cache.len] = '\0';
       return cache.len;