You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
239 lines
5.3 KiB
239 lines
5.3 KiB
/*
|
|
* $Id$
|
|
*
|
|
* This file is part of WorkMan, the civilized CD player library
|
|
* (c) 1991-1997 by Steven Grimm (original author)
|
|
* (c) by Dirk Försterling (current 'author' = maintainer)
|
|
* The maintainer can be contacted by his e-mail address:
|
|
* milliByte@DeathsDoor.com
|
|
*
|
|
* This library is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU Library General Public
|
|
* License as published by the Free Software Foundation; either
|
|
* version 2 of the License, or (at your option) any later version.
|
|
*
|
|
* This library is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
* Library General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Library General Public
|
|
* License along with this library; if not, write to the Free
|
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
|
*
|
|
*
|
|
* Some helpful functions...
|
|
*
|
|
*/
|
|
|
|
#include <stdio.h>
|
|
#include <string.h>
|
|
#include <stdlib.h>
|
|
#include <errno.h>
|
|
#include <stdarg.h>
|
|
#include <sys/time.h>
|
|
#include "include/workman_defs.h"
|
|
#include "include/wm_config.h"
|
|
#include "include/wm_helpers.h"
|
|
#include "include/wm_struct.h"
|
|
|
|
#define WM_MSG_CLASS WM_MSG_CLASS_MISC
|
|
|
|
int wm_lib_verbosity = WM_MSG_LEVEL_NONE;
|
|
|
|
/*
|
|
* Some seleced functions of version reporting follow...
|
|
*/
|
|
|
|
int wm_libver_major( void ){return WM_LIBVER_MAJOR;}
|
|
int wm_libver_minor( void ){return WM_LIBVER_MINOR;}
|
|
int wm_libver_pl( void ){return WM_LIBVER_PL;}
|
|
|
|
char *wm_libver_name( void )
|
|
{
|
|
char *s = NULL;
|
|
|
|
wm_strmcat(&s, WM_LIBVER_NAME);
|
|
return s;
|
|
} /* wm_libver_name() */
|
|
|
|
char *wm_libver_number( void )
|
|
{
|
|
char *s = NULL;
|
|
|
|
s = malloc(10);
|
|
/* this is not used very often, so don't care about speed...*/
|
|
sprintf(s, "%d.%d.%d", wm_libver_major(), wm_libver_minor(), wm_libver_pl());
|
|
return s;
|
|
} /* wm_libver_number() */
|
|
|
|
char *wm_libver_date( void )
|
|
{
|
|
char *s = NULL;
|
|
wm_strmcat(&s, __DATE__);
|
|
return s;
|
|
} /* wm_libver_date() */
|
|
|
|
char *wm_libver_string( void )
|
|
{
|
|
char *s = NULL;
|
|
|
|
wm_strmcat( &s, wm_libver_name() );
|
|
wm_strmcat( &s, " " );
|
|
wm_strmcat( &s, wm_libver_number() );
|
|
return s;
|
|
} /* wm_libver_string() */
|
|
|
|
|
|
/*
|
|
*
|
|
* Now for some memory management...
|
|
*
|
|
*/
|
|
|
|
/* Free some memory and set a pointer to null. */
|
|
void freeup( char **x )
|
|
{
|
|
if (*x != NULL)
|
|
{
|
|
free(*x);
|
|
*x = NULL;
|
|
}
|
|
} /* freeup() */
|
|
|
|
/* Copy into a malloced string. */
|
|
void
|
|
wm_strmcpy( char **t, const char *s )
|
|
{
|
|
wm_lib_message(WM_MSG_CLASS_MISC | WM_MSG_LEVEL_DEBUG, "wm_strmcpy(%s, '%s')\n", *t, s);
|
|
if (*t != NULL)
|
|
{
|
|
wm_lib_message(WM_MSG_CLASS_MISC | WM_MSG_LEVEL_DEBUG, "wm_strmcpy freeing pointer %p\n", *t);
|
|
free(*t);
|
|
}
|
|
|
|
*t = malloc(strlen(s) + 1);
|
|
if (*t == NULL)
|
|
{
|
|
perror("wm_strmcpy");
|
|
exit(1);
|
|
}
|
|
|
|
wm_lib_message(WM_MSG_CLASS_MISC | WM_MSG_LEVEL_DEBUG, "wm_strmcpy finally copying (%p, '%s')\n", *t, s);
|
|
strncpy(*t, s, strlen(s));
|
|
} /* wm_strmcpy() */
|
|
|
|
/* Add to a malloced string. */
|
|
void
|
|
wm_strmcat( char **t, const char *s)
|
|
{
|
|
int len = strlen(s) + 1;
|
|
|
|
wm_lib_message(WM_MSG_CLASS_MISC | WM_MSG_LEVEL_DEBUG, "wm_strmcat(%s, %s)\n", *t, s);
|
|
|
|
if (*s == '\0')
|
|
return;
|
|
|
|
if (*t != NULL)
|
|
{
|
|
len += strlen(*t);
|
|
*t = realloc(*t, len);
|
|
if (*t == NULL)
|
|
{
|
|
perror("wm_strmcat");
|
|
exit(1);
|
|
}
|
|
strcat(*t, s);
|
|
}
|
|
else
|
|
wm_strmcpy(t, s);
|
|
} /* wm_strmcat() */
|
|
|
|
/* Duplicate a string. Some systems have this in libc, but not all. */
|
|
char *
|
|
wm_strdup( char *s )
|
|
{
|
|
char *new;
|
|
|
|
new = malloc(strlen(s) + 1);
|
|
if (new)
|
|
strcpy(new, s);
|
|
return (new);
|
|
} /* wm_strdup() */
|
|
|
|
|
|
/*
|
|
* set and get verbosity level.
|
|
*/
|
|
void wm_lib_set_verbosity( int level )
|
|
{
|
|
if( WM_MSG_LEVEL_NONE <= level && level <= WM_MSG_LEVEL_DEBUG )
|
|
{
|
|
wm_lib_verbosity = level;
|
|
wm_lib_message(WM_MSG_CLASS_MISC | WM_MSG_LEVEL_DEBUG, "Verbosity set to %d|%d\n", WM_MSG_LEVEL_DEBUG, level & WM_MSG_CLASS_ALL);
|
|
}
|
|
} /* wm_lib_set_verbosity */
|
|
|
|
int wm_lib_get_verbosity( void )
|
|
{
|
|
return wm_lib_verbosity;
|
|
}
|
|
|
|
/*
|
|
* wm_lib_message().
|
|
*
|
|
* any message that falls into allowed classes and has at least
|
|
* verbosity level wm_lib_verbosity & 0xf will be printed.
|
|
*
|
|
* Usage:
|
|
*
|
|
* wm_lib_message( WM_MSG_LEVEL | WM_MSG_CLASS, "format", contents);
|
|
*
|
|
* To simplify the usage, you may simply use WM_MSG_CLASS. It should be
|
|
* defined in each module to reflect the correct message class.
|
|
*
|
|
*/
|
|
void wm_lib_message( unsigned int level, const char *fmt, ... )
|
|
{
|
|
va_list ap;
|
|
/* verbosity level */
|
|
unsigned int vlevel = wm_lib_verbosity & 0xf;
|
|
/* allowed classes */
|
|
unsigned int vclass = (level & WM_MSG_CLASS_ALL) & (wm_lib_verbosity & WM_MSG_CLASS_ALL);
|
|
|
|
/*
|
|
* just give me the level
|
|
*/
|
|
level &= 0xf;
|
|
if(level <= WM_MSG_LEVEL_NONE)
|
|
{
|
|
fprintf(stderr, "LibWorkMan warning: A LibWorkMan programmer specified an invalid message level.\n");
|
|
}
|
|
/*
|
|
* print it only if level and class are allowed.
|
|
*/
|
|
if( (level <= vlevel) && (vclass != 0) )
|
|
{
|
|
fprintf(stderr, "libWorkMan: ");
|
|
va_start(ap, fmt);
|
|
vfprintf(stderr, fmt, ap);
|
|
va_end(ap);
|
|
}
|
|
} /* wm_lib_message() */
|
|
|
|
/*
|
|
* Simulate usleep() using select().
|
|
*/
|
|
int
|
|
wm_susleep( int usec )
|
|
{
|
|
struct timeval tv;
|
|
|
|
timerclear(&tv);
|
|
tv.tv_sec = usec / 1000000;
|
|
tv.tv_usec = usec % 1000000;
|
|
return (select(0, NULL, NULL, NULL, &tv));
|
|
} /* wm_susleep() */
|
|
|
|
|