summaryrefslogtreecommitdiff
path: root/ace/Obstack.cpp
blob: 5bd969201bbaf8ba7ecebce99b11c275c02b0f13 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
// Obstack.cpp
// $Id$

#define ACE_BUILD_DLL
#include "ace/Obstack.h"

ACE_ALLOC_HOOK_DEFINE(ACE_Obstack)

void
ACE_Obstack::dump (void) const
{
  ACE_TRACE ("ACE_Obstack::dump");

  ACE_DEBUG ((LM_DEBUG, ACE_BEGIN_DUMP, this));
  ACE_DEBUG ((LM_DEBUG, "size_ = %d\n", this->size_));
  ACE_DEBUG ((LM_DEBUG, "head_ = %x\n", this->head_));
  ACE_DEBUG ((LM_DEBUG, "curr_ = %x\n", this->curr_));
  ACE_DEBUG ((LM_DEBUG, ACE_END_DUMP));
}

ACE_ALLOC_HOOK_DEFINE(ACE_Obchunk)

void
ACE_Obchunk::dump (void) const
{
  ACE_TRACE ("ACE_Obchunk::dump");

  ACE_DEBUG ((LM_DEBUG, ACE_BEGIN_DUMP, this));
  ACE_DEBUG ((LM_DEBUG, "end_ = %x\n", this->end_));
  ACE_DEBUG ((LM_DEBUG, "cur_ = %x\n", this->cur_));
  ACE_DEBUG ((LM_DEBUG, ACE_END_DUMP));
}

class ACE_Obchunk *
ACE_Obstack::new_chunk (void)
{
  ACE_TRACE ("ACE_Obstack::new_chunk");
  class ACE_Obchunk *temp = (class ACE_Obchunk *) 
    new char[sizeof (class ACE_Obchunk) + this->size_];

  if (temp == 0)
    {
      errno = ENOMEM;
      return 0;
    }

  temp->next_ = 0;
  temp->end_  = temp->contents_ + this->size_;
  temp->cur_  = temp->contents_;

  return temp;
}

ACE_Obstack::ACE_Obstack (int sz)
  : size_ (sz), 
    head_ (0)
{
  ACE_TRACE ("ACE_Obstack::ACE_Obstack");
  this->head_ = this->new_chunk ();
  this->curr_ = this->head_;
}

ACE_Obstack::~ACE_Obstack (void)
{
  ACE_TRACE ("ACE_Obstack::~ACE_Obstack");
  class ACE_Obchunk *temp = this->head_;

  while (temp != 0)
    {
      class ACE_Obchunk *next = temp->next_;
      temp->next_  = 0;
      delete [] temp;
      temp = next;
    }
}

char *
ACE_Obstack::copy (const char *s, 
		   size_t len)
{
  ACE_TRACE ("ACE_Obstack::copy");
  char *result;

  ACE_ASSERT (this->size_ >= len + 1);

  // Check whether we need to grow our chunk...

  if (this->curr_->cur_ + len + 1 >= this->curr_->end_)
    {
      // Check whether we can just reuse previously allocated memory.

      if (this->curr_->next_ == 0)
	{
	  this->curr_->next_ = this->new_chunk ();
	  this->curr_ = this->curr_->next_;
	}
      else
	{
	  this->curr_ = this->curr_->next_;
	  this->curr_->cur_ = this->curr_->contents_;
	}
    }

  result = this->curr_->cur_;
  ACE_OS::memcpy (result, s, len);
  result[len] = '\0';
  this->curr_->cur_ += (len + 1);
  return result;
}

void 
ACE_Obstack::release (void)
{
  ACE_TRACE ("ACE_Obstack::release");
  this->curr_ = this->head_;
  this->curr_->cur_ = this->curr_->contents_;
}