Blame lib/util.c

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
}