]> sjero.net Git - wget/blobdiff - src/utils.c
[svn] Extract timers to a separate file.
[wget] / src / utils.c
index 2e45c4d5812edb4966cd83aa9ae98e0c88d6a53c..dc16d55afc5940d095b9ada5d33f4d6d77deb809 100644 (file)
@@ -1515,352 +1515,6 @@ number_to_static_string (wgint number)
   return buf;
 }
 \f
-/* Support for timers. */
-
-#undef TIMER_WINDOWS
-#undef TIMER_GETTIMEOFDAY
-#undef TIMER_TIME
-
-/* Depending on the OS and availability of gettimeofday(), one and
-   only one of the above constants will be defined.  Virtually all
-   modern Unix systems will define TIMER_GETTIMEOFDAY; Windows will
-   use TIMER_WINDOWS.  TIMER_TIME is a catch-all method for
-   non-Windows systems without gettimeofday.  */
-
-#ifdef WINDOWS
-# define TIMER_WINDOWS
-#else  /* not WINDOWS */
-# ifdef HAVE_GETTIMEOFDAY
-#  define TIMER_GETTIMEOFDAY
-# else
-#  define TIMER_TIME
-# endif
-#endif /* not WINDOWS */
-
-#ifdef TIMER_GETTIMEOFDAY
-typedef struct timeval wget_sys_time;
-#endif
-
-#ifdef TIMER_TIME
-typedef time_t wget_sys_time;
-#endif
-
-#ifdef TIMER_WINDOWS
-typedef union {
-  DWORD lores;          /* In case GetTickCount is used */
-  LARGE_INTEGER hires;  /* In case high-resolution timer is used */
-} wget_sys_time;
-#endif
-
-struct wget_timer {
-  /* Whether the start time has been initialized. */
-  int initialized;
-
-  /* The starting point in time which, subtracted from the current
-     time, yields elapsed time. */
-  wget_sys_time start;
-
-  /* The most recent elapsed time, calculated by wtimer_update().
-     Measured in milliseconds.  */
-  double elapsed_last;
-
-  /* Approximately, the time elapsed between the true start of the
-     measurement and the time represented by START.  */
-  double elapsed_pre_start;
-};
-
-#ifdef TIMER_WINDOWS
-
-/* Whether high-resolution timers are used.  Set by wtimer_initialize_once
-   the first time wtimer_allocate is called. */
-static int using_hires_timers;
-
-/* Frequency of high-resolution timers -- number of updates per
-   millisecond.  Calculated the first time wtimer_allocate is called
-   provided that high-resolution timers are available. */
-static double hires_millisec_freq;
-
-/* The first time a timer is created, determine whether to use
-   high-resolution timers. */
-
-static void
-wtimer_initialize_once (void)
-{
-  static int init_done;
-  if (!init_done)
-    {
-      LARGE_INTEGER freq;
-      init_done = 1;
-      freq.QuadPart = 0;
-      QueryPerformanceFrequency (&freq);
-      if (freq.QuadPart != 0)
-        {
-          using_hires_timers = 1;
-          hires_millisec_freq = (double) freq.QuadPart / 1000.0;
-        }
-     }
-}
-#endif /* TIMER_WINDOWS */
-
-/* Allocate a timer.  Calling wtimer_read on the timer will return
-   zero.  It is not legal to call wtimer_update with a freshly
-   allocated timer -- use wtimer_reset first.  */
-
-struct wget_timer *
-wtimer_allocate (void)
-{
-  struct wget_timer *wt = xnew (struct wget_timer);
-  xzero (*wt);
-
-#ifdef TIMER_WINDOWS
-  wtimer_initialize_once ();
-#endif
-
-  return wt;
-}
-
-/* Allocate a new timer and reset it.  Return the new timer. */
-
-struct wget_timer *
-wtimer_new (void)
-{
-  struct wget_timer *wt = wtimer_allocate ();
-  wtimer_reset (wt);
-  return wt;
-}
-
-/* Free the resources associated with the timer.  Its further use is
-   prohibited.  */
-
-void
-wtimer_delete (struct wget_timer *wt)
-{
-  xfree (wt);
-}
-
-/* Store system time to WST.  */
-
-static void
-wtimer_sys_set (wget_sys_time *wst)
-{
-#ifdef TIMER_GETTIMEOFDAY
-  gettimeofday (wst, NULL);
-#endif
-
-#ifdef TIMER_TIME
-  time (wst);
-#endif
-
-#ifdef TIMER_WINDOWS
-  if (using_hires_timers)
-    {
-      QueryPerformanceCounter (&wst->hires);
-    }
-  else
-    {
-      /* Where hires counters are not available, use GetTickCount rather
-         GetSystemTime, because it is unaffected by clock skew and simpler
-         to use.  Note that overflows don't affect us because we never use
-         absolute values of the ticker, only the differences.  */
-      wst->lores = GetTickCount ();
-    }
-#endif
-}
-
-/* Reset timer WT.  This establishes the starting point from which
-   wtimer_read() will return the number of elapsed milliseconds.
-   It is allowed to reset a previously used timer.  */
-
-void
-wtimer_reset (struct wget_timer *wt)
-{
-  /* Set the start time to the current time. */
-  wtimer_sys_set (&wt->start);
-  wt->elapsed_last = 0;
-  wt->elapsed_pre_start = 0;
-  wt->initialized = 1;
-}
-
-static double
-wtimer_sys_diff (wget_sys_time *wst1, wget_sys_time *wst2)
-{
-#ifdef TIMER_GETTIMEOFDAY
-  return ((double)(wst1->tv_sec - wst2->tv_sec) * 1000
-         + (double)(wst1->tv_usec - wst2->tv_usec) / 1000);
-#endif
-
-#ifdef TIMER_TIME
-  return 1000 * (*wst1 - *wst2);
-#endif
-
-#ifdef WINDOWS
-  if (using_hires_timers)
-    return (wst1->hires.QuadPart - wst2->hires.QuadPart) / hires_millisec_freq;
-  else
-    return wst1->lores - wst2->lores;
-#endif
-}
-
-/* Update the timer's elapsed interval.  This function causes the
-   timer to call gettimeofday (or time(), etc.) to update its idea of
-   current time.  To get the elapsed interval in milliseconds, use
-   wtimer_read.
-
-   This function handles clock skew, i.e. time that moves backwards is
-   ignored.  */
-
-void
-wtimer_update (struct wget_timer *wt)
-{
-  wget_sys_time now;
-  double elapsed;
-
-  assert (wt->initialized != 0);
-
-  wtimer_sys_set (&now);
-  elapsed = wt->elapsed_pre_start + wtimer_sys_diff (&now, &wt->start);
-
-  /* Ideally we'd just return the difference between NOW and
-     wt->start.  However, the system timer can be set back, and we
-     could return a value smaller than when we were last called, even
-     a negative value.  Both of these would confuse the callers, which
-     expect us to return monotonically nondecreasing values.
-
-     Therefore: if ELAPSED is smaller than its previous known value,
-     we reset wt->start to the current time and effectively start
-     measuring from this point.  But since we don't want the elapsed
-     value to start from zero, we set elapsed_pre_start to the last
-     elapsed time and increment all future calculations by that
-     amount.  */
-
-  if (elapsed < wt->elapsed_last)
-    {
-      wt->start = now;
-      wt->elapsed_pre_start = wt->elapsed_last;
-      elapsed = wt->elapsed_last;
-    }
-
-  wt->elapsed_last = elapsed;
-}
-
-/* Return the elapsed time in milliseconds between the last call to
-   wtimer_reset and the last call to wtimer_update.
-
-   A typical use of the timer interface would be:
-
-       struct wtimer *timer = wtimer_new ();
-       ... do something that takes a while ...
-       wtimer_update ();
-       double msecs = wtimer_read ();  */
-
-double
-wtimer_read (const struct wget_timer *wt)
-{
-  return wt->elapsed_last;
-}
-
-/* Return the assessed granularity of the timer implementation, in
-   milliseconds.  This is used by code that tries to substitute a
-   better value for timers that have returned zero.  */
-
-double
-wtimer_granularity (void)
-{
-#ifdef TIMER_GETTIMEOFDAY
-  /* Granularity of gettimeofday varies wildly between architectures.
-     However, it appears that on modern machines it tends to be better
-     than 1ms.  Assume 100 usecs.  (Perhaps the configure process
-     could actually measure this?)  */
-  return 0.1;
-#endif
-
-#ifdef TIMER_TIME
-  return 1000;
-#endif
-
-#ifdef TIMER_WINDOWS
-  if (using_hires_timers)
-    return 1.0 / hires_millisec_freq;
-  else
-    return 10;  /* according to MSDN */
-#endif
-}
-\f
-/* This should probably be at a better place, but it doesn't really
-   fit into html-parse.c.  */
-
-/* The function returns the pointer to the malloc-ed quoted version of
-   string s.  It will recognize and quote numeric and special graphic
-   entities, as per RFC1866:
-
-   `&' -> `&amp;'
-   `<' -> `&lt;'
-   `>' -> `&gt;'
-   `"' -> `&quot;'
-   SP  -> `&#32;'
-
-   No other entities are recognized or replaced.  */
-char *
-html_quote_string (const char *s)
-{
-  const char *b = s;
-  char *p, *res;
-  int i;
-
-  /* Pass through the string, and count the new size.  */
-  for (i = 0; *s; s++, i++)
-    {
-      if (*s == '&')
-       i += 4;                 /* `amp;' */
-      else if (*s == '<' || *s == '>')
-       i += 3;                 /* `lt;' and `gt;' */
-      else if (*s == '\"')
-       i += 5;                 /* `quot;' */
-      else if (*s == ' ')
-       i += 4;                 /* #32; */
-    }
-  res = (char *)xmalloc (i + 1);
-  s = b;
-  for (p = res; *s; s++)
-    {
-      switch (*s)
-       {
-       case '&':
-         *p++ = '&';
-         *p++ = 'a';
-         *p++ = 'm';
-         *p++ = 'p';
-         *p++ = ';';
-         break;
-       case '<': case '>':
-         *p++ = '&';
-         *p++ = (*s == '<' ? 'l' : 'g');
-         *p++ = 't';
-         *p++ = ';';
-         break;
-       case '\"':
-         *p++ = '&';
-         *p++ = 'q';
-         *p++ = 'u';
-         *p++ = 'o';
-         *p++ = 't';
-         *p++ = ';';
-         break;
-       case ' ':
-         *p++ = '&';
-         *p++ = '#';
-         *p++ = '3';
-         *p++ = '2';
-         *p++ = ';';
-         break;
-       default:
-         *p++ = *s;
-       }
-    }
-  *p = '\0';
-  return res;
-}
-
 /* Determine the width of the terminal we're running on.  If that's
    not possible, return 0.  */
 
@@ -2284,7 +1938,7 @@ base64_decode (const char *base64, char *to)
        {
          NEXT_BASE64_CHAR (c, p);
          if (!c)
-           return -1;          /* premature EOF while dcoding base64 */
+           return -1;          /* premature EOF while decoding base64 */
          if (c != '=')
            return -1;          /* padding `=' expected but not found */
          continue;
@@ -2296,7 +1950,7 @@ base64_decode (const char *base64, char *to)
       /* Process fourth byte of a quadruplet.  */
       NEXT_BASE64_CHAR (c, p);
       if (!c)
-       return -1;              /* premature EOF while dcoding base64 */
+       return -1;              /* premature EOF while decoding base64 */
       if (c == '=')
        continue;