imports.c revision e1e446bf775a7f2ea93b4e54c7748ef603500977
16acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* $Id: imports.c,v 1.29 2003/01/14 03:05:38 brianp Exp $ */
26acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
36acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/*
46acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn * Mesa 3-D graphics library
56acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn * Version:  5.1
66acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn *
76acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn * Copyright (C) 1999-2002  Brian Paul   All Rights Reserved.
86acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn *
96acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn * Permission is hereby granted, free of charge, to any person obtaining a
106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn * copy of this software and associated documentation files (the "Software"),
116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn * to deal in the Software without restriction, including without limitation
126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn * the rights to use, copy, modify, merge, publish, distribute, sublicense,
136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn * and/or sell copies of the Software, and to permit persons to whom the
146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn * Software is furnished to do so, subject to the following conditions:
156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn *
166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn * The above copyright notice and this permission notice shall be included
176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn * in all copies or substantial portions of the Software.
186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn *
196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn */
266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/*
296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn * Imports are services which the device driver or window system or
306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn * operating system provides to the core renderer.  The core renderer (Mesa)
316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn * will call these functions in order to do memory allocation, simple I/O,
326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn * etc.
336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn *
346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn * Some drivers will want to override/replace this file with something
356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn * specialized, but that'll be rare.
366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn *
376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn * Eventually, I want to move roll the glheader.h file into this.
386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn *
396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn * The OpenGL SI's __GLimports structure allows per-context specification of
406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn * replacements for the standard C lib functions.  In practice that's probably
416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn * never needed; compile-time replacements are far more likely.
426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn *
436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn * The _mesa_foo() functions defined here don't in general take a context
446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn * parameter.  I guess we can change that someday, if need be.
456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn * So for now, the __GLimports stuff really isn't used.
466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn */
476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#include "glheader.h"
506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#include "mtypes.h"
516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#include "context.h"
526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#include "imports.h"
536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define MAXSTRING 4000  /* for vsnprintf() */
566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#ifdef WIN32
586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define vsnprintf _vsnprintf
596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#elif defined(__IBMC__) || defined(__IBMCPP__) || defined(VMS)
606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennextern int vsnprintf(char *str, size_t count, const char *fmt, va_list arg);
616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#endif
626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/**********************************************************************/
656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* Wrappers for standard C library functions                          */
666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/**********************************************************************/
676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/*
696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn * Functions still needed:
706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn * scanf
716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn * qsort
726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn * bsearch
736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn * rand and RAND_MAX
746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn */
756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennvoid *
776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn_mesa_malloc(size_t bytes)
786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#if defined(XFree86LOADER) && defined(IN_MODULE)
806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn   return xf86malloc(bytes);
816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#else
826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn   return malloc(bytes);
836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#endif
846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennvoid *
886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn_mesa_calloc(size_t bytes)
896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#if defined(XFree86LOADER) && defined(IN_MODULE)
916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn   return xf86calloc(1, bytes);
926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#else
936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn   return calloc(1, bytes);
946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#endif
956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennvoid
996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn_mesa_free(void *ptr)
1006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
1016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#if defined(XFree86LOADER) && defined(IN_MODULE)
1026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn   xf86free(ptr);
1036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#else
1046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn   free(ptr);
1056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#endif
1066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
1076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennvoid *
1106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn_mesa_align_malloc(size_t bytes, unsigned long alignment)
1116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
1126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn   unsigned long ptr, buf;
1136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn   ASSERT( alignment > 0 );
1156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn   /* Allocate extra memory to accomodate rounding up the address for
1176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    * alignment and to record the real malloc address.
1186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    */
1196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn   ptr = (unsigned long) _mesa_malloc(bytes + alignment + sizeof(void *));
1206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn   if (!ptr)
1216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn      return NULL;
1226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn   buf = (ptr + alignment + sizeof(void *)) & ~(unsigned long)(alignment - 1);
1246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn   *(unsigned long *)(buf - sizeof(void *)) = ptr;
1256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#ifdef DEBUG
1276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn   /* mark the non-aligned area */
1286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn   while ( ptr < buf - sizeof(void *) ) {
1296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn      *(unsigned long *)ptr = 0xcdcdcdcd;
1306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn      ptr += sizeof(unsigned long);
1316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn   }
1326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#endif
1336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn   return (void *) buf;
1356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
1366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennvoid *
1396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn_mesa_align_calloc(size_t bytes, unsigned long alignment)
1406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
1416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn   unsigned long ptr, buf;
1426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn   ASSERT( alignment > 0 );
1446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn   ptr = (unsigned long) _mesa_calloc(bytes + alignment + sizeof(void *));
1466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn   if (!ptr)
1476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn      return NULL;
1486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn   buf = (ptr + alignment + sizeof(void *)) & ~(unsigned long)(alignment - 1);
1506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn   *(unsigned long *)(buf - sizeof(void *)) = ptr;
1516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#ifdef DEBUG
1536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn   /* mark the non-aligned area */
1546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn   while ( ptr < buf - sizeof(void *) ) {
1556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn      *(unsigned long *)ptr = 0xcdcdcdcd;
1566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn      ptr += sizeof(unsigned long);
1576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn   }
1586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#endif
1596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn   return (void *)buf;
1616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
1626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennvoid
1656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn_mesa_align_free(void *ptr)
1666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
1676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#if 0
1686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn   _mesa_free( (void *)(*(unsigned long *)((unsigned long)ptr - sizeof(void *))) );
1696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#else
1706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn   /* The actuall address to free is stuffed in the word immediately
1716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    * before the address the client sees.
1726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    */
1736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn   void **cubbyHole = (void **) ((char *) ptr - sizeof(void *));
1746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn   void *realAddr = *cubbyHole;
1756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn   _mesa_free(realAddr);
1766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#endif
1776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
1786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennvoid *
1816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn_mesa_memcpy(void *dest, const void *src, size_t n)
1826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
1836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#if defined(XFree86LOADER) && defined(IN_MODULE)
1846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn   return xf86memcpy(dest, src, n);
1856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#elif defined(SUNOS4)
1866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn   return memcpy((char *) dest, (char *) src, (int) n);
1876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#else
1886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn   return memcpy(dest, src, n);
1896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#endif
1906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
1916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennvoid
1946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn_mesa_memset( void *dst, int val, size_t n )
1956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
1966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#if defined(XFree86LOADER) && defined(IN_MODULE)
1976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn   xf86memset( dst, val, n );
1986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#elif defined(SUNOS4)
1996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn   memset( (char *) dst, (int) val, (int) n );
2006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#else
2016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn   memset(dst, val, n);
2026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#endif
2036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
2046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennvoid
2076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn_mesa_memset16( unsigned short *dst, unsigned short val, size_t n )
2086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
2096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn   while (n-- > 0)
2106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn      *dst++ = val;
2116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
2126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennvoid
2156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn_mesa_bzero( void *dst, size_t n )
2166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
2176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#if defined(XFree86LOADER) && defined(IN_MODULE)
2186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn   xf86memset( dst, 0, n );
2196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#elif defined(__FreeBSD__)
2206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn   bzero( dst, n );
2216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#else
2226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn   memset( dst, 0, n );
2236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#endif
2246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
2256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renndouble
2286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn_mesa_sin(double a)
2296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
2306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#if defined(XFree86LOADER) && defined(IN_MODULE)
2316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn   return xf86sin(a);
2326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#else
2336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn   return sin(a);
2346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#endif
2356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
2366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renndouble
2396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn_mesa_cos(double a)
2406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
2416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#if defined(XFree86LOADER) && defined(IN_MODULE)
2426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn   return xf86cos(a);
2436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#else
2446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn   return cos(a);
2456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#endif
2466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
2476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renndouble
2506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn_mesa_sqrt(double x)
2516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
2526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#if defined(XFree86LOADER) && defined(IN_MODULE)
2536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn   return xf86sqrt(x);
2546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#else
2556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn   return sqrt(x);
2566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#endif
2576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
2586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renndouble
2616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn_mesa_pow(double x, double y)
2626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
2636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#if defined(XFree86LOADER) && defined(IN_MODULE)
2646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn   return xf86pow(x, y);
2656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#else
2666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn   return pow(x, y);
2676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#endif
2686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
2696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennchar *
2726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn_mesa_getenv( const char *var )
2736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
2746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#if defined(XFree86LOADER) && defined(IN_MODULE)
2756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn   return xf86getenv(var);
2766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#else
2776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn   return getenv(var);
2786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#endif
2796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
2806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennchar *
2836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn_mesa_strstr( const char *haystack, const char *needle )
2846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
2856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#if defined(XFree86LOADER) && defined(IN_MODULE)
2866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn   return xf86strstr(haystack, needle);
2876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#else
2886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn   return strstr(haystack, needle);
2896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#endif
2906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
2916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennchar *
2946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn_mesa_strncat( char *dest, const char *src, size_t n )
2956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
2966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#if defined(XFree86LOADER) && defined(IN_MODULE)
2976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn   return xf86strncat(dest, src, n);
2986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#else
2996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn   return strncat(dest, src, n);
3006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#endif
3016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
3026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennchar *
3056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn_mesa_strcpy( char *dest, const char *src )
3066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
3076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#if defined(XFree86LOADER) && defined(IN_MODULE)
3086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn   return xf86strcpy(dest, src);
3096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#else
3106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn   return strcpy(dest, src);
3116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#endif
3126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
3136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennchar *
3166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn_mesa_strncpy( char *dest, const char *src, size_t n )
3176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
3186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#if defined(XFree86LOADER) && defined(IN_MODULE)
3196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn   return xf86strncpy(dest, src, n);
3206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#else
3216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn   return strncpy(dest, src, n);
3226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#endif
3236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
3246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennsize_t
3276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn_mesa_strlen( const char *s )
3286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
3296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#if defined(XFree86LOADER) && defined(IN_MODULE)
3306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn   return xf86strlen(s);
3316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#else
3326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn   return strlen(s);
3336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#endif
3346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
3356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennint
3386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn_mesa_strcmp( const char *s1, const char *s2 )
3396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
3406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#if defined(XFree86LOADER) && defined(IN_MODULE)
3416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn   return xf86strcmp(s1, s2);
3426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#else
3436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn   return strcmp(s1, s2);
3446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#endif
3456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
3466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennint
3496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn_mesa_strncmp( const char *s1, const char *s2, size_t n )
3506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
3516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#if defined(XFree86LOADER) && defined(IN_MODULE)
3526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn   return xf86strncmp(s1, s2, n);
3536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#else
3546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn   return strncmp(s1, s2, n);
3556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#endif
3566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
3576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennchar *
3606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn_mesa_strdup( const char *s )
3616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
3626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn   int l = _mesa_strlen(s);
3636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn   char *s2 = _mesa_malloc(l + 1);
3646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn   if (s2)
3656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn      _mesa_strcpy(s2, s);
3666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn   return s2;
3676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
3686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennint
3716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn_mesa_atoi(const char *s)
3726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
3736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#if defined(XFree86LOADER) && defined(IN_MODULE)
3746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn   return xf86atoi(s);
3756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#else
3766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn   return atoi(s);
3776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#endif
3786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
3796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennfloat
3826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn_mesa_strtof( const char *s, char **end )
3836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
3846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#if defined(XFree86LOADER) && defined(IN_MODULE)
3856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn   return xf86strtof(s, end);
3866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#else
3876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn   return (float) strtod(s, end);
3886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#endif
3896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
3906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennint
3936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn_mesa_sprintf( char *str, const char *fmt, ... )
3946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
3956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn   int r;
3966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn   va_list args;
397   va_start( args, fmt );
398   va_end( args );
399#if defined(XFree86LOADER) && defined(IN_MODULE)
400   r = xf86vsprintf( str, fmt, args );
401#else
402   r = vsprintf( str, fmt, args );
403#endif
404   return r;
405}
406
407
408void
409_mesa_printf( const char *fmtString, ... )
410{
411   char s[MAXSTRING];
412   va_list args;
413   va_start( args, fmtString );
414   vsnprintf(s, MAXSTRING, fmtString, args);
415   va_end( args );
416#if defined(XFree86LOADER) && defined(IN_MODULE)
417   xf86printf("%s", s);
418#else
419   printf("%s", s);
420#endif
421}
422
423
424void
425_mesa_warning( GLcontext *ctx, const char *fmtString, ... )
426{
427   GLboolean debug;
428   char str[MAXSTRING];
429   va_list args;
430   (void) ctx;
431   va_start( args, fmtString );
432   (void) vsnprintf( str, MAXSTRING, fmtString, args );
433   va_end( args );
434#ifdef DEBUG
435   debug = GL_TRUE; /* always print warning */
436#else
437   debug = _mesa_getenv("MESA_DEBUG") ? GL_TRUE : GL_FALSE;
438#endif
439   if (debug) {
440#if defined(XFree86LOADER) && defined(IN_MODULE)
441      xf86fprintf(stderr, "Mesa warning: %s\n", str);
442#else
443      fprintf(stderr, "Mesa warning: %s\n", str);
444#endif
445   }
446}
447
448
449/*
450 * This function is called when the Mesa user has stumbled into a code
451 * path which may not be implemented fully or correctly.
452 */
453void
454_mesa_problem( const GLcontext *ctx, const char *fmtString, ... )
455{
456   va_list args;
457   char str[MAXSTRING];
458   (void) ctx;
459
460   va_start( args, fmtString );
461   vsnprintf( str, MAXSTRING, fmtString, args );
462   va_end( args );
463
464#if defined(XFree86LOADER) && defined(IN_MODULE)
465   xf86fprintf(stderr, "Mesa implementation error: %s\n", str);
466   xf86fprintf(stderr, "Please report to the DRI project at dri.sourceforge.net\n");
467#else
468   fprintf(stderr, "Mesa implementation error: %s\n", str);
469   fprintf(stderr, "Please report to the Mesa bug database at www.mesa3d.org\n" );
470#endif
471}
472
473
474/*
475 * If in debug mode, print error message to stdout.
476 * Also, record the error code by calling _mesa_record_error().
477 * Input:  ctx - the GL context
478 *         error - the error value
479 *         fmtString - printf-style format string, followed by optional args
480 */
481void
482_mesa_error( GLcontext *ctx, GLenum error, const char *fmtString, ... )
483{
484   const char *debugEnv;
485   GLboolean debug;
486
487   debugEnv = _mesa_getenv("MESA_DEBUG");
488
489#ifdef DEBUG
490   if (debugEnv && _mesa_strstr(debugEnv, "silent"))
491      debug = GL_FALSE;
492   else
493      debug = GL_TRUE;
494#else
495   if (debugEnv)
496      debug = GL_TRUE;
497   else
498      debug = GL_FALSE;
499#endif
500
501   if (debug) {
502      va_list args;
503      char where[MAXSTRING];
504      const char *errstr;
505
506      va_start( args, fmtString );
507      vsnprintf( where, MAXSTRING, fmtString, args );
508      va_end( args );
509
510      switch (error) {
511	 case GL_NO_ERROR:
512	    errstr = "GL_NO_ERROR";
513	    break;
514	 case GL_INVALID_VALUE:
515	    errstr = "GL_INVALID_VALUE";
516	    break;
517	 case GL_INVALID_ENUM:
518	    errstr = "GL_INVALID_ENUM";
519	    break;
520	 case GL_INVALID_OPERATION:
521	    errstr = "GL_INVALID_OPERATION";
522	    break;
523	 case GL_STACK_OVERFLOW:
524	    errstr = "GL_STACK_OVERFLOW";
525	    break;
526	 case GL_STACK_UNDERFLOW:
527	    errstr = "GL_STACK_UNDERFLOW";
528	    break;
529	 case GL_OUT_OF_MEMORY:
530	    errstr = "GL_OUT_OF_MEMORY";
531	    break;
532         case GL_TABLE_TOO_LARGE:
533            errstr = "GL_TABLE_TOO_LARGE";
534            break;
535	 default:
536	    errstr = "unknown";
537	    break;
538      }
539      _mesa_debug(ctx, "Mesa user error: %s in %s\n", errstr, where);
540   }
541
542   _mesa_record_error(ctx, error);
543}
544
545
546/*
547 * Call this to report debug information.  Uses stderr.
548 */
549void
550_mesa_debug( const GLcontext *ctx, const char *fmtString, ... )
551{
552   char s[MAXSTRING];
553   va_list args;
554   va_start(args, fmtString);
555   vsnprintf(s, MAXSTRING, fmtString, args);
556   va_end(args);
557#if defined(XFree86LOADER) && defined(IN_MODULE)
558   xf86fprintf(stderr, "Mesa: %s", s);
559#else
560   fprintf(stderr, "Mesa: %s", s);
561#endif
562}
563
564
565
566/**********************************************************************/
567/* Default Imports Wrapper                                            */
568/**********************************************************************/
569
570static void *
571default_malloc(__GLcontext *gc, size_t size)
572{
573   (void) gc;
574   return _mesa_malloc(size);
575}
576
577static void *
578default_calloc(__GLcontext *gc, size_t numElem, size_t elemSize)
579{
580   (void) gc;
581   return _mesa_calloc(numElem * elemSize);
582}
583
584static void *
585default_realloc(__GLcontext *gc, void *oldAddr, size_t newSize)
586{
587   (void) gc;
588#if defined(XFree86LOADER) && defined(IN_MODULE)
589   return xf86realloc(oldAddr, newSize);
590#else
591   return realloc(oldAddr, newSize);
592#endif
593}
594
595static void
596default_free(__GLcontext *gc, void *addr)
597{
598   (void) gc;
599   _mesa_free(addr);
600}
601
602static char * CAPI
603default_getenv( __GLcontext *gc, const char *var )
604{
605   (void) gc;
606   return _mesa_getenv(var);
607}
608
609static void
610default_warning(__GLcontext *gc, char *str)
611{
612   _mesa_warning(gc, str);
613}
614
615static void
616default_fatal(__GLcontext *gc, char *str)
617{
618   _mesa_problem(gc, str);
619   abort();
620}
621
622static int CAPI
623default_atoi(__GLcontext *gc, const char *str)
624{
625   (void) gc;
626   return atoi(str);
627}
628
629static int CAPI
630default_sprintf(__GLcontext *gc, char *str, const char *fmt, ...)
631{
632   int r;
633   va_list args;
634   va_start( args, fmt );
635   r = vsprintf( str, fmt, args );
636   va_end( args );
637   return r;
638}
639
640static void * CAPI
641default_fopen(__GLcontext *gc, const char *path, const char *mode)
642{
643   return fopen(path, mode);
644}
645
646static int CAPI
647default_fclose(__GLcontext *gc, void *stream)
648{
649   return fclose((FILE *) stream);
650}
651
652static int CAPI
653default_fprintf(__GLcontext *gc, void *stream, const char *fmt, ...)
654{
655   int r;
656   va_list args;
657   va_start( args, fmt );
658   r = vfprintf( (FILE *) stream, fmt, args );
659   va_end( args );
660   return r;
661}
662
663/* XXX this really is driver-specific and can't be here */
664static __GLdrawablePrivate *
665default_GetDrawablePrivate(__GLcontext *gc)
666{
667   return NULL;
668}
669
670
671
672
673/*
674 * Initialize a __GLimports object to point to the functions in
675 * this file.  This is to be called from device drivers.
676 * Input:  imports - the object to init
677 *         driverCtx - pointer to device driver-specific data
678 */
679void
680_mesa_init_default_imports(__GLimports *imports, void *driverCtx)
681{
682   imports->malloc = default_malloc;
683   imports->calloc = default_calloc;
684   imports->realloc = default_realloc;
685   imports->free = default_free;
686   imports->warning = default_warning;
687   imports->fatal = default_fatal;
688   imports->getenv = default_getenv; /* not used for now */
689   imports->atoi = default_atoi;
690   imports->sprintf = default_sprintf;
691   imports->fopen = default_fopen;
692   imports->fclose = default_fclose;
693   imports->fprintf = default_fprintf;
694   imports->getDrawablePrivate = default_GetDrawablePrivate;
695   imports->other = driverCtx;
696}
697