|
Packit |
022b05 |
/*
|
|
Packit |
022b05 |
* util.c --
|
|
Packit |
022b05 |
*
|
|
Packit |
022b05 |
* Misc utility functions.
|
|
Packit |
022b05 |
*
|
|
Packit |
022b05 |
* Copyright (c) 1999 Frank Strauss, Technical University of Braunschweig.
|
|
Packit |
022b05 |
*
|
|
Packit |
022b05 |
* See the file "COPYING" for information on usage and redistribution
|
|
Packit |
022b05 |
* of this file, and for a DISCLAIMER OF ALL WARRANTIES.
|
|
Packit |
022b05 |
*
|
|
Packit |
022b05 |
* @(#) $Id: util.c 1470 2002-11-13 13:15:03Z strauss $
|
|
Packit |
022b05 |
*/
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
#include <config.h>
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
#include <stdio.h>
|
|
Packit |
022b05 |
#include <stdarg.h>
|
|
Packit |
022b05 |
#include <stdlib.h>
|
|
Packit |
022b05 |
#include <string.h>
|
|
Packit |
022b05 |
#include <time.h>
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
#include "util.h"
|
|
Packit |
022b05 |
#include "snprintf.h"
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
#ifdef HAVE_DMALLOC_H
|
|
Packit |
022b05 |
#include <dmalloc.h>
|
|
Packit |
022b05 |
#endif
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
#ifdef HAVE_DMALLOC_H
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
void *_smiMalloc(char *file, int line, size_t size)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
char *m = _calloc_leap(file, line, 1, size);
|
|
Packit |
022b05 |
if (! m) {
|
|
Packit |
022b05 |
smiPrintError(NULL, ERR_OUT_OF_MEMORY);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
return m;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
void *_smiRealloc(char *file, int line, void *ptr, size_t size)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
char *m = _realloc_leap(file, line, ptr, size);
|
|
Packit |
022b05 |
if (! m) {
|
|
Packit |
022b05 |
smiPrintError(NULL, ERR_OUT_OF_MEMORY);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
return m;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
char *_smiStrdup(char *file, int line, const char *s1)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
if (s1) {
|
|
Packit |
022b05 |
char *m = _strdup_leap(file, line, s1);
|
|
Packit |
022b05 |
if (! m) {
|
|
Packit |
022b05 |
smiPrintError(NULL, ERR_OUT_OF_MEMORY);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
return m;
|
|
Packit |
022b05 |
} else {
|
|
Packit |
022b05 |
return NULL;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
char *_smiStrndup(char *file, int line, const char *s1, size_t n)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
char *m;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
m = _smiMalloc(file, line, n+1);
|
|
Packit |
022b05 |
if (! m) {
|
|
Packit |
022b05 |
smiPrintError(NULL, ERR_OUT_OF_MEMORY);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
strncpy(m, s1, n);
|
|
Packit |
022b05 |
m[n] = 0;
|
|
Packit |
022b05 |
return m;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
void _smiFree(char *file, int line, void *ptr)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
if (ptr) {
|
|
Packit |
022b05 |
_free_leap(file, line, ptr);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
#else
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
void *smiMalloc(size_t size)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
char *m = calloc(1, size);
|
|
Packit |
022b05 |
if (! m) {
|
|
Packit |
022b05 |
smiPrintError(NULL, ERR_OUT_OF_MEMORY);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
return m;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
void *smiRealloc(void *ptr, size_t size)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
char *m = realloc(ptr, size);
|
|
Packit |
022b05 |
if (! m) {
|
|
Packit |
022b05 |
smiPrintError(NULL, ERR_OUT_OF_MEMORY);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
return m;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
char *smiStrdup(const char *s1)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
if (s1) {
|
|
Packit |
022b05 |
char *m = strdup(s1);
|
|
Packit |
022b05 |
if (! m) {
|
|
Packit |
022b05 |
smiPrintError(NULL, ERR_OUT_OF_MEMORY);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
return m;
|
|
Packit |
022b05 |
} else {
|
|
Packit |
022b05 |
return NULL;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
char *smiStrndup(const char *s1, size_t n)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
char *m;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
m = smiMalloc(n+1);
|
|
Packit |
022b05 |
if (! m) {
|
|
Packit |
022b05 |
smiPrintError(NULL, ERR_OUT_OF_MEMORY);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
strncpy(m, s1, n);
|
|
Packit |
022b05 |
m[n] = 0;
|
|
Packit |
022b05 |
return m;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
void smiFree(void *ptr)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
if (ptr) {
|
|
Packit |
022b05 |
free(ptr);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
#endif
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
int smiIsPath(const char *s)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
return (strchr(s, '.') || strchr(s, DIR_SEPARATOR));
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
#ifndef HAVE_TIMEGM
|
|
Packit |
022b05 |
time_t timegm(struct tm *tm)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
char *tz;
|
|
Packit |
022b05 |
static char *s = NULL;
|
|
Packit |
022b05 |
char *tofree = NULL;
|
|
Packit |
022b05 |
time_t t;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
/* ensure to call mktime() for UTC */
|
|
Packit |
022b05 |
tz = getenv("TZ");
|
|
Packit |
022b05 |
if (tz) {
|
|
Packit |
022b05 |
tofree = s;
|
|
Packit |
022b05 |
smiAsprintf(&s, "TZ=%s", tz);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
putenv("TZ=NULL");
|
|
Packit |
022b05 |
t = mktime(tm);
|
|
Packit |
022b05 |
if (tz) {
|
|
Packit |
022b05 |
putenv(s);
|
|
Packit |
022b05 |
} else {
|
|
Packit |
022b05 |
putenv("TZ=");
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
if (tofree) smiFree(tofree);
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
return t;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
#endif
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
int smiTypeDerivedFrom(Type *typePtr, Type *parentTypePtr)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
Type *t;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if ((!typePtr) || (!parentTypePtr)) {
|
|
Packit |
022b05 |
return 0;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
for (t = typePtr; t != NULL; t = t->parentPtr) {
|
|
Packit |
022b05 |
if (parentTypePtr == t) {
|
|
Packit |
022b05 |
return 1;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
return 0;
|
|
Packit |
022b05 |
}
|