X-Git-Url: http://sjero.net/git/?p=wget;a=blobdiff_plain;f=src%2Futils.c;h=dc16d55afc5940d095b9ada5d33f4d6d77deb809;hp=2e45c4d5812edb4966cd83aa9ae98e0c88d6a53c;hb=2219d47ba301c3ea47b36291dda8eabead0fc75d;hpb=42139ce9b1697a424e31b3d0f7b1a07315661579 diff --git a/src/utils.c b/src/utils.c index 2e45c4d5..dc16d55a 100644 --- a/src/utils.c +++ b/src/utils.c @@ -1515,352 +1515,6 @@ number_to_static_string (wgint number) return buf; } -/* 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 -} - -/* 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: - - `&' -> `&' - `<' -> `<' - `>' -> `>' - `"' -> `"' - SP -> ` ' - - 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;