Ejemplo n.º 1
0
PRECOMP_PAR_DATA* Precompute_Parametric_Values(PARAMETRIC* Par, char flags, int depth)
{
	PRECOMP_PAR_DATA * PData;
	DBL * Last;
	char* es = "precompute";
	int nmb;

	if ((depth < 1) || (depth > 20))
		Error("Precompute: invalid depth");
	nmb = 1 << depth;

	PData = (PRECOMP_PAR_DATA *)POV_MALLOC(sizeof(PRECOMP_PAR_DATA), es);
	if (PData == NULL)
		MAError("precompute", sizeof(PRECOMP_PAR_DATA));
	PData->flags = flags;
	PData->depth = depth;
	PData->use = 1;

	if (flags & OK_X)
	{
		PData->Low[0] = (DBL *)POV_MALLOC(sizeof(DBL) * nmb, es);
		Last = PData->Hi[0] = (DBL *)POV_MALLOC(sizeof(DBL) * nmb, es);
	}
	if (flags & OK_Y)
	{
		PData->Low[1] = (DBL *)POV_MALLOC(sizeof(DBL) * nmb, es);
		Last = PData->Hi[1] = (DBL *)POV_MALLOC(sizeof(DBL) * nmb, es);
	}
	if (flags & OK_Z)
	{
		PData->Low[2] = (DBL *)POV_MALLOC(sizeof(DBL) * nmb, es);
		Last = PData->Hi[2] = (DBL *)POV_MALLOC(sizeof(DBL) * nmb, es);
	}
	if (Last == NULL)
		MAError("precompute", sizeof(DBL) * nmb);

	PrecompLastDepth = 1 << (depth - 1);
	PrecParData = PData;
	PrecompParFunc = Par;

	Precomp_Par_Int(1, Par->umin, Par->vmin, Par->umax, Par->vmax);

	return (PData);
}
Ejemplo n.º 2
0
void *pov_realloc(void *ptr, size_t size, const char *file, int line, const char *msg)
{
  void *block;
#if defined(MEM_STATS)
  size_t oldsize;
#endif

#if defined(MEM_HEADER)
  MEMNODE *node;
#endif

#if defined(MEM_RECLAIM)
  MEMNODE *prev;
  MEMNODE *next;
#endif

#if defined(MEM_PREFILL) || defined(MEM_GUARD)
  char *memptr;
  size_t i;
#endif

  if (size == 0)
  {
    if (ptr)
      pov_free(ptr, file, line);
    return NULL;
  }
  else if (ptr == NULL)
    return pov_malloc(size, file, line, msg);

  block = (void *)((char *)ptr - NODESIZE - MEM_GUARD_SIZE);

#if defined(MEM_GUARD)
  memptr = (char *)block + NODESIZE;
  for(i = 0; i < MEM_GUARD_SIZE; i++)
  {
     if(memptr[i] != mem_guard_string[i % mem_guard_string_len])
     {
        Warning(0, "Damaged start guard detected in resized block (File: %s Line: %d).", file, line);
        break;
     }
  }
  memptr = (char *)block + ((MEMNODE *)block)->size - MEM_GUARD_SIZE;
  for(i = 0; i < MEM_GUARD_SIZE; i++)
  {
     if(memptr[i] != mem_guard_string[i % mem_guard_string_len])
     {
        Warning(0, "Damaged end guard detected in resized block (File: %s Line: %d).", file, line);
        break;
     }
  }
#endif

#if defined(MEM_HEADER)
  node = (MEMNODE *) block;
#endif

#if defined(MEM_TAG)
  if (node->tag != MEMTAG_VALUE)
    Error("Attempt to realloc invalid block (File: %s Line: %d).", file, line);

  node->tag = ~node->tag;
#endif

#if defined(MEM_RECLAIM)
  prev = node->prev;
  next = node->next;
#endif

#if defined(MEM_STATS)
  oldsize = ((MEMNODE *)block)->size;

  #if defined(MEM_PREFILL)
    memptr = (char *)block + NODESIZE + MEM_GUARD_SIZE;
    for(i = size; i < oldsize - NODESIZE - (MEM_GUARD_SIZE * 2); i++)
       memptr[i] = mem_clear_string[i % mem_clear_string_len];
  #endif
#endif

  block = (void *)REALLOC(block, NODESIZE + (MEM_GUARD_SIZE * 2) + size);

  if (block == NULL)
    MAError(msg, size);

#if defined(MEM_STATS)
  /* REALLOC does an implied FREE... */
  mem_stats_free(oldsize);
  /* ...and an implied MALLOC... */
  mem_stats_alloc(NODESIZE + (MEM_GUARD_SIZE * 2) + size, file, line);

  #if defined(MEM_PREFILL)
    memptr = (char *)block + NODESIZE + MEM_GUARD_SIZE;
    for(i = oldsize - NODESIZE - (MEM_GUARD_SIZE * 2); i < size; i++)
       memptr[i] = mem_prefill_string[i % mem_prefill_string_len];
  #endif

#endif

#if defined(MEM_HEADER)
  node = (MEMNODE *) block;
#endif

#if defined(MEM_TAG)
  node->tag = MEMTAG_VALUE;
#endif

#if defined(MEM_TRACE) || defined(MEM_STATS)
  node->size = size + NODESIZE + (MEM_GUARD_SIZE * 2);
#endif
#if defined(MEM_TRACE)
  node->file = file;
  node->line = line;
#endif

#if defined(MEM_GUARD)
  memptr = (char *)block + NODESIZE;
  for(i = 0; i < MEM_GUARD_SIZE; i++)
     memptr[i] = mem_guard_string[i % mem_guard_string_len];
  memptr = (char *)block + ((MEMNODE *)block)->size - MEM_GUARD_SIZE;
  for(i = 0; i < MEM_GUARD_SIZE; i++)
     memptr[i] = mem_guard_string[i % mem_guard_string_len];
#endif

#if defined(MEM_RECLAIM)
  if (prev == NULL)
    memlist = node;
  else
    prev->next = node;
  if (node->next != NULL)
    node->next->prev = node;
  if (next != NULL)
    next->prev = node;
#endif

  return (void *)((char *)block + NODESIZE + MEM_GUARD_SIZE);
}
Ejemplo n.º 3
0
void *pov_malloc(size_t size, const char *file, int line, const char *msg)
{
  void *block;
  size_t totalsize;
#if defined(MEM_HEADER)
  MEMNODE *node;
#endif

#if defined(MEM_PREFILL) || defined(MEM_GUARD)
  char *memptr;
  size_t i;
#endif

#if defined(MEM_HEADER)
  if (size == 0)
  {
    Error("Attempt to malloc zero size block (File: %s Line: %d).", file, line);
  }
#endif

  totalsize = size + NODESIZE + (MEM_GUARD_SIZE * 2); /* number of bytes allocated in OS */

  block = (void *)MALLOC(totalsize);

  if (block == NULL)
    MAError(msg, size);

#if defined(MEM_HEADER)
  node = (MEMNODE *) block;
#endif

#if defined(MEM_TAG)
  node->tag = MEMTAG_VALUE;
#endif

#if defined(MEM_TRACE) || defined(MEM_STATS)
  node->size = totalsize;
#endif
#if defined(MEM_TRACE)
  node->file = file;
  node->line = line;
#endif

#if defined(MEM_PREFILL)
  memptr = (char *)block + NODESIZE + MEM_GUARD_SIZE;
  for(i = 0; i < size; i++)
     memptr[i] = mem_prefill_string[i % mem_prefill_string_len];
#endif

#if defined(MEM_GUARD)
  memptr = (char *)block + NODESIZE;
  for(i = 0; i < MEM_GUARD_SIZE; i++)
     memptr[i] = mem_guard_string[i % mem_guard_string_len];
  memptr = (char *)block + ((MEMNODE *)block)->size - MEM_GUARD_SIZE;
  for(i = 0; i < MEM_GUARD_SIZE; i++)
     memptr[i] = mem_guard_string[i % mem_guard_string_len];
#endif

#if defined(MEM_RECLAIM)
  add_node(node);
#endif

#if defined(MEM_STATS)
  mem_stats_alloc(totalsize, file, line);
#endif

  return (void *)((char *)block + NODESIZE + MEM_GUARD_SIZE);
}