X-Git-Url: http://sjero.net/git/?a=blobdiff_plain;f=src%2Futils.c;h=7a90c0692dfe6a569e1e53bafd6e92de23d91d36;hb=8566a727674ab3c2b0df03c31c6085a0d5d5bf81;hp=0a2fc9f977549ad3e5127321f7af371e25ec3679;hpb=7bc4d2db21743fc91837f6d86762acc6d4a46f05;p=wget diff --git a/src/utils.c b/src/utils.c index 0a2fc9f9..7a90c069 100644 --- a/src/utils.c +++ b/src/utils.c @@ -1,5 +1,5 @@ /* Various utility functions. - Copyright (C) 1996-2005 Free Software Foundation, Inc. + Copyright (C) 1996-2006 Free Software Foundation, Inc. This file is part of GNU Wget. @@ -253,51 +253,38 @@ concat_strings (const char *str0, ...) return ret; } +/* Format the provided time according to the specified format. The + format is a string with format elements supported by strftime. */ + +static char * +fmttime (time_t t, const char *fmt) +{ + static char output[32]; + struct tm *tm = localtime(&t); + if (!tm) + abort (); + if (!strftime(output, sizeof(output), fmt, tm)) + abort (); + return output; +} + /* Return pointer to a static char[] buffer in which zero-terminated string-representation of TM (in form hh:mm:ss) is printed. If TM is NULL, the current time will be used. */ char * -time_str (time_t *tm) +time_str (time_t t) { - static char output[15]; - struct tm *ptm; - time_t secs = tm ? *tm : time (NULL); - - if (secs == -1) - { - /* In case of error, return the empty string. Maybe we should - just abort if this happens? */ - *output = '\0'; - return output; - } - ptm = localtime (&secs); - sprintf (output, "%02d:%02d:%02d", ptm->tm_hour, ptm->tm_min, ptm->tm_sec); - return output; + return fmttime(t, "%H:%M:%S"); } /* Like the above, but include the date: YYYY-MM-DD hh:mm:ss. */ char * -datetime_str (time_t *tm) +datetime_str (time_t t) { - static char output[20]; /* "YYYY-MM-DD hh:mm:ss" + \0 */ - struct tm *ptm; - time_t secs = tm ? *tm : time (NULL); - - if (secs == -1) - { - /* In case of error, return the empty string. Maybe we should - just abort if this happens? */ - *output = '\0'; - return output; - } - ptm = localtime (&secs); - sprintf (output, "%04d-%02d-%02d %02d:%02d:%02d", - ptm->tm_year + 1900, ptm->tm_mon + 1, ptm->tm_mday, - ptm->tm_hour, ptm->tm_min, ptm->tm_sec); - return output; + return fmttime(t, "%Y-%m-%d %H:%M:%S"); } /* The Windows versions of the following two functions are defined in @@ -1889,32 +1876,31 @@ xsleep (double seconds) #endif /* not WINDOWS */ -/* Encode the string STR of length LENGTH to base64 format and place it - to B64STORE. The output will be \0-terminated, and must point to a - writable buffer of at least 1+BASE64_LENGTH(length) bytes. It - returns the length of the resulting base64 data, not counting the - terminating zero. +/* Encode the octets in DATA of length LENGTH to base64 format, + storing the result to DEST. The output will be zero-terminated, + and must point to a writable buffer of at least + 1+BASE64_LENGTH(length) bytes. The function returns the length of + the resulting base64 data, not counting the terminating zero. - This implementation will not emit newlines after 76 characters of + This implementation does not emit newlines after 76 characters of base64 data. */ int -base64_encode (const char *str, int length, char *b64store) +base64_encode (const void *data, int length, char *dest) { /* Conversion table. */ - static char tbl[64] = { - 'A','B','C','D','E','F','G','H', - 'I','J','K','L','M','N','O','P', - 'Q','R','S','T','U','V','W','X', - 'Y','Z','a','b','c','d','e','f', - 'g','h','i','j','k','l','m','n', - 'o','p','q','r','s','t','u','v', - 'w','x','y','z','0','1','2','3', - '4','5','6','7','8','9','+','/' + static const char tbl[64] = { + 'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P', + 'Q','R','S','T','U','V','W','X','Y','Z','a','b','c','d','e','f', + 'g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v', + 'w','x','y','z','0','1','2','3','4','5','6','7','8','9','+','/' }; - const unsigned char *s = (const unsigned char *) str; - const unsigned char *end = (const unsigned char *) str + length - 2; - char *p = b64store; + /* Access bytes in DATA as unsigned char, otherwise the shifts below + don't work for data with MSB set. */ + const unsigned char *s = data; + /* Theoretical ANSI violation when length < 3. */ + const unsigned char *end = (const unsigned char *) data + length - 2; + char *p = dest; /* Transform the 3x8 bits to 4x6 bits, as required by base64. */ for (; s < end; s += 3) @@ -1944,7 +1930,7 @@ base64_encode (const char *str, int length, char *b64store) /* ...and zero-terminate it. */ *p = '\0'; - return p - b64store; + return p - dest; } /* Store in C the next non-whitespace character from the string, or \0 @@ -1955,21 +1941,24 @@ base64_encode (const char *str, int length, char *b64store) #define IS_ASCII(c) (((c) & 0x80) == 0) -/* Decode data from BASE64 (pointer to \0-terminated text) into memory - pointed to by TO. TO should be large enough to accomodate the - decoded data, which is guaranteed to be less than strlen(base64). +/* Decode data from BASE64 (a null-terminated string) into memory + pointed to by DEST. DEST is assumed to be large enough to + accomodate the decoded data, which is guaranteed to be no more than + 3/4*strlen(base64). - Since TO is assumed to contain binary data, it is not + Since DEST is assumed to contain binary data, it is not NUL-terminated. The function returns the length of the data written to TO. -1 is returned in case of error caused by malformed - base64 input. */ + base64 input. + + This function originates from Free Recode. */ int -base64_decode (const char *base64, char *to) +base64_decode (const char *base64, void *dest) { /* Table of base64 values for first 128 characters. Note that this assumes ASCII (but so does Wget in other places). */ - static signed char base64_char_to_value[128] = + static const signed char base64_char_to_value[128] = { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 0- 9 */ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 10- 19 */ @@ -1989,7 +1978,7 @@ base64_decode (const char *base64, char *to) #define IS_BASE64(c) ((IS_ASCII (c) && BASE64_CHAR_TO_VALUE (c) >= 0) || c == '=') const char *p = base64; - char *q = to; + char *q = dest; while (1) { @@ -2048,7 +2037,7 @@ base64_decode (const char *base64, char *to) #undef IS_BASE64 #undef BASE64_CHAR_TO_VALUE - return q - to; + return q - (char *) dest; } #undef IS_ASCII