-const char miscutil_rcs[] = "$Id: miscutil.c,v 1.65 2011/04/19 13:00:47 fabiankeil Exp $";
+const char miscutil_rcs[] = "$Id: miscutil.c,v 1.80 2016/01/16 12:33:36 fabiankeil Exp $";
/*********************************************************************
*
* File : $Source: /cvsroot/ijbswa/current/miscutil.c,v $
* to deserve their own file but don't really fit in
* any other file.
*
- * Copyright : Written by and Copyright (C) 2001-2011 the
+ * Copyright : Written by and Copyright (C) 2001-2016 the
* Privoxy team. http://www.privoxy.org/
*
* Based on the Internet Junkbuster originally written
- * by and Copyright (C) 1997 Anonymous Coders and
+ * by and Copyright (C) 1997 Anonymous Coders and
* Junkbusters Corporation. http://www.junkbusters.com
*
* The timegm replacement function was taken from GnuPG,
* used under the terms of the GPL or the terms of the
* "Frontier Artistic License".
*
- * This program is free software; you can redistribute it
+ * This program is free software; you can redistribute it
* and/or modify it under the terms of the GNU General
* Public License as published by the Free Software
* Foundation; either version 2 of the License, or (at
* Function : zalloc
*
* Description : Malloc some memory and set it to '\0'.
- * The way calloc() ought to be -acjc
*
* Parameters :
* 1 : size = Size of memory chunk to return.
}
+/*********************************************************************
+ *
+ * Function : zalloc_or_die
+ *
+ * Description : zalloc wrapper that either succeeds or causes
+ * program termination.
+ *
+ * Useful in situations were the string length is
+ * "small" and zalloc() failures couldn't be handled
+ * better anyway. In case of debug builds, failures
+ * trigger an assert().
+ *
+ * Parameters :
+ * 1 : size = Size of memory chunk to return.
+ *
+ * Returns : Pointer to newly malloc'd memory chunk.
+ *
+ *********************************************************************/
+void *zalloc_or_die(size_t size)
+{
+ void *buffer;
+
+ buffer = zalloc(size);
+ if (buffer == NULL)
+ {
+ assert(buffer != NULL);
+ log_error(LOG_LEVEL_FATAL, "Out of memory in zalloc_or_die().");
+ exit(1);
+ }
+
+ return(buffer);
+
+}
+
+/*********************************************************************
+ *
+ * Function : strdup_or_die
+ *
+ * Description : strdup wrapper that either succeeds or causes
+ * program termination.
+ *
+ * Useful in situations were the string length is
+ * "small" and strdup() failures couldn't be handled
+ * better anyway. In case of debug builds, failures
+ * trigger an assert().
+ *
+ * Parameters :
+ * 1 : str = String to duplicate
+ *
+ * Returns : Pointer to newly strdup'd copy of the string.
+ *
+ *********************************************************************/
+char *strdup_or_die(const char *str)
+{
+ char *new_str;
+
+ new_str = strdup(str);
+
+ if (new_str == NULL)
+ {
+ assert(new_str != NULL);
+ log_error(LOG_LEVEL_FATAL, "Out of memory in strdup_or_die().");
+ exit(1);
+ }
+
+ return(new_str);
+
+}
+
+
+/*********************************************************************
+ *
+ * Function : malloc_or_die
+ *
+ * Description : malloc wrapper that either succeeds or causes
+ * program termination.
+ *
+ * Useful in situations were the buffer size is "small"
+ * and malloc() failures couldn't be handled better
+ * anyway. In case of debug builds, failures trigger
+ * an assert().
+ *
+ * Parameters :
+ * 1 : buffer_size = Size of the space to allocate
+ *
+ * Returns : Pointer to newly malloc'd memory
+ *
+ *********************************************************************/
+void *malloc_or_die(size_t buffer_size)
+{
+ char *new_buf;
+
+ if (buffer_size == 0)
+ {
+ log_error(LOG_LEVEL_ERROR,
+ "malloc_or_die() called with buffer size 0");
+ assert(buffer_size != 0);
+ buffer_size = 4096;
+ }
+
+ new_buf = malloc(buffer_size);
+
+ if (new_buf == NULL)
+ {
+ assert(new_buf != NULL);
+ log_error(LOG_LEVEL_FATAL, "Out of memory in malloc_or_die().");
+ exit(1);
+ }
+
+ return(new_buf);
+
+}
+
+
#if defined(unix)
/*********************************************************************
*
- * Function : write_pid_file
+ * Function : write_pid_file
*
- * Description : Writes a pid file with the pid of the main process
+ * Description : Writes a pid file with the pid of the main process
*
* Parameters : None
*
- * Returns : N/A
+ * Returns : N/A
*
*********************************************************************/
void write_pid_file(void)
{
FILE *fp;
-
+
/*
* If no --pidfile option was given,
* we can live without one.
* Function : hash_string
*
* Description : Take a string and compute a (hopefuly) unique numeric
- * integer value. This has several uses, but being able
- * to "switch" a string the one of my favorites.
+ * integer value. This is useful to "switch" a string.
*
* Parameters :
* 1 : s : string to be hashed.
*
- * Returns : an unsigned long variable with the hashed value.
+ * Returns : The string's hash
*
*********************************************************************/
-unsigned int hash_string( const char* s )
+unsigned int hash_string(const char* s)
{
- unsigned int h = 0;
+ unsigned int h = 0;
- for ( ; *s; ++s )
+ for (; *s; ++s)
{
h = 5 * h + (unsigned int)*s;
}
}
-#ifdef __MINGW32__
-/*********************************************************************
- *
- * Function : strdup
- *
- * Description : For some reason (which is beyond me), gcc and WIN32
- * don't like strdup. When a "free" is executed on a
- * strdup'd ptr, it can at times freez up! So I just
- * replaced it and problem was solved.
- *
- * Parameters :
- * 1 : s = string to duplicate
- *
- * Returns : Pointer to newly malloc'ed copy of the string.
- *
- *********************************************************************/
-char *strdup( const char *s )
-{
- char * result = (char *)malloc( strlen(s)+1 );
-
- if (result != NULL)
- {
- strcpy( result, s );
- }
-
- return( result );
-}
-
-#endif /* def __MINGW32__ */
-
-
/*********************************************************************
*
* Function : strcmpic
while (*s1 && *s2)
{
- if ( ( *s1 != *s2 ) && ( ijb_tolower(*s1) != ijb_tolower(*s2) ) )
+ if ((*s1 != *s2) && (privoxy_tolower(*s1) != privoxy_tolower(*s2)))
{
break;
}
s1++, s2++;
}
- return(ijb_tolower(*s1) - ijb_tolower(*s2));
+ return(privoxy_tolower(*s1) - privoxy_tolower(*s2));
}
if (n <= (size_t)0) return(0);
if (!s1) s1 = "";
if (!s2) s2 = "";
-
+
while (*s1 && *s2)
{
- if ( ( *s1 != *s2 ) && ( ijb_tolower(*s1) != ijb_tolower(*s2) ) )
+ if ((*s1 != *s2) && (privoxy_tolower(*s1) != privoxy_tolower(*s2)))
{
break;
}
s1++, s2++;
}
- return(ijb_tolower(*s1) - ijb_tolower(*s2));
+ return(privoxy_tolower(*s1) - privoxy_tolower(*s2));
}
{
char *p, *q, *r;
- /*
+ /*
* strip trailing whitespace
*/
p = string + strlen(string);
- while (p > string && ijb_isspace(*(p-1)))
+ while (p > string && privoxy_isspace(*(p-1)))
{
p--;
}
*p = '\0';
- /*
- * find end of leading whitespace
+ /*
+ * find end of leading whitespace
*/
q = r = string;
- while (*q && ijb_isspace(*q))
+ while (*q && privoxy_isspace(*q))
{
q++;
}
*
* Function : string_append
*
- * Description : Reallocate target_string and append text to it.
+ * Description : Reallocate target_string and append text to it.
* This makes it easier to append to malloc'd strings.
* This is similar to the (removed) strsav(), but
* running out of memory isn't catastrophic.
* Parameters :
* 1 : string = string to convert
*
- * Returns : Uppercase copy of string if possible,
+ * Returns : Uppercase copy of string if possible,
* NULL on out-of-memory or if string was NULL.
*
*********************************************************************/
{
return NULL;
}
-
+
q = string;
p = result;
}
+/*********************************************************************
+ *
+ * Function : string_move
+ *
+ * Description : memmove wrapper to move the last part of a string
+ * towards the beginning, overwriting the part in
+ * the middle. strlcpy() can't be used here as the
+ * strings overlap.
+ *
+ * Parameters :
+ * 1 : dst = Destination to overwrite
+ * 2 : src = Source to move.
+ *
+ * Returns : N/A
+ *
+ *********************************************************************/
+void string_move(char *dst, char *src)
+{
+ assert(dst < src);
+
+ /* +1 to copy the terminating nul as well. */
+ memmove(dst, src, strlen(src)+1);
+}
+
+
/*********************************************************************
*
* Function : bindup
{
char *duplicate;
- if (NULL == (duplicate = (char *)malloc(len)))
- {
- return NULL;
- }
- else
+ duplicate = (char *)malloc(len);
+ if (NULL != duplicate)
{
- memcpy(duplicate, string, len);
+ memcpy(duplicate, string, len);
}
return duplicate;
*
* Function : make_path
*
- * Description : Takes a directory name and a file name, returns
+ * Description : Takes a directory name and a file name, returns
* the complete path. Handles windows/unix differences.
* If the file name is already an absolute path, or if
- * the directory name is NULL or empty, it returns
- * the filename.
+ * the directory name is NULL or empty, it returns
+ * the filename.
*
* Parameters :
* 1 : dir: Name of directory or NULL for none.
* Returns : "dir/file" (Or on windows, "dir\file").
* It allocates the string on the heap. Caller frees.
* Returns NULL in error (i.e. NULL file or out of
- * memory)
+ * memory)
*
*********************************************************************/
char * make_path(const char * dir, const char * file)
#ifdef AMIGA
char path[512];
- if(dir)
+ if (dir)
{
- if(dir[0] == '.')
+ if (dir[0] == '.')
{
- if(dir[1] == '/')
+ if (dir[1] == '/')
{
strncpy(path,dir+2,512);
}
{
path[0]=0;
}
- if(AddPart(path,file,512))
+ if (AddPart(path,file,512))
{
return strdup(path);
}
size_t path_size = strlen(dir) + strlen(file) + 2; /* +2 for trailing (back)slash and \0 */
#if defined(unix)
- if ( *dir != '/' && basedir && *basedir )
+ if (*dir != '/' && basedir && *basedir)
{
/*
* Relative path, so start with the base directory.
*/
path_size += strlen(basedir) + 1; /* +1 for the slash */
path = malloc(path_size);
- if (!path ) log_error(LOG_LEVEL_FATAL, "malloc failed!");
+ if (!path) log_error(LOG_LEVEL_FATAL, "malloc failed!");
strlcpy(path, basedir, path_size);
strlcat(path, "/", path_size);
strlcat(path, dir, path_size);
#endif /* defined unix */
{
path = malloc(path_size);
- if (!path ) log_error(LOG_LEVEL_FATAL, "malloc failed!");
+ if (!path) log_error(LOG_LEVEL_FATAL, "malloc failed!");
strlcpy(path, dir, path_size);
}
assert(NULL != path);
#if defined(_WIN32) || defined(__OS2__)
- if(path[strlen(path)-1] != '\\')
+ if (path[strlen(path)-1] != '\\')
{
strlcat(path, "\\", path_size);
}
#else /* ifndef _WIN32 || __OS2__ */
- if(path[strlen(path)-1] != '/')
+ if (path[strlen(path)-1] != '/')
{
strlcat(path, "/", path_size);
}
* Parameters :
* 1 : range: Highest possible number to pick.
*
- * Returns : Picked number.
+ * Returns : Picked number.
*
*********************************************************************/
long int pick_from_range(long int range)
if (range <= 0) return 0;
#ifdef HAVE_RANDOM
- number = random() % range + 1;
+ number = random() % range + 1;
#elif defined(MUTEX_LOCKS_AVAILABLE)
privoxy_mutex_lock(&rand_mutex);
#ifdef _WIN32
* Parameters :
* 1 : tm: Broken-down time struct.
*
- * Returns : tm converted into time_t seconds.
+ * Returns : tm converted into time_t seconds.
*
*********************************************************************/
time_t timegm(struct tm *tm)
snprintf.c
- a portable implementation of snprintf,
including vsnprintf.c, asnprintf, vasnprintf, asprintf, vasprintf
-
+
snprintf is a routine to convert numeric and string arguments to
formatted strings. It is similar to sprintf(3) provided in a system's
C library, yet it requires an additional argument - the buffer size -
}
}
/* zero padding to specified precision? */
- if (num_of_digits < precision)
+ if (num_of_digits < precision)
number_of_zeros_to_pad = precision - num_of_digits;
}
/* zero padding to specified minimal field width? */