aboutsummaryrefslogtreecommitdiff
path: root/agent/src/os/win32/Buffer.cpp
blob: 6c14b6a17dc2cec2e3a3288386afe0f12899e8a5 (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
/*
 * Copyright (c) 2001, Oracle and/or its affiliates. All rights reserved.
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 *
 * This code is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License version 2 only, as
 * published by the Free Software Foundation.
 *
 * This code is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 * version 2 for more details (a copy is included in the LICENSE file that
 * accompanied this code).
 *
 * You should have received a copy of the GNU General Public License version
 * 2 along with this work; if not, write to the Free Software Foundation,
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 *
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
 * or visit www.oracle.com if you need additional information or have any
 * questions.
 *
 */

#include "Buffer.hpp"

#include <string.h>

Buffer::Buffer(int bufSize) {
  buf = new char[bufSize];
  sz = bufSize;
  fill = 0;
  drain = 0;
}

Buffer::~Buffer() {
  delete[] buf;
}

char*
Buffer::fillPos() {
  return buf + fill;
}

int
Buffer::remaining() {
  return sz - fill;
}

int
Buffer::size() {
  return sz;
}

bool
Buffer::incrFillPos(int amt) {
  if (fill + amt >= sz) {
    return false;
  }
  fill += amt;
  return true;
}

int
Buffer::readByte() {
  if (drain < fill) {
    return buf[drain++] & 0xFF;
  } else {
    return -1;
  }
}

int
Buffer::readBytes(char* data, int len) {
  int numRead = 0;
  while (numRead < len) {
    int c = readByte();
    if (c < 0) break;
    data[numRead++] = (char) c;
  }
  return numRead;
}

char*
Buffer::drainPos() {
  return buf + drain;
}

int
Buffer::drainRemaining() {
  return fill - drain;
}

bool
Buffer::incrDrainPos(int amt) {
  if (drainRemaining() < amt) {
    return false;
  }
  drain += amt;
  return true;
}

void
Buffer::compact() {
  // Copy down data
  memmove(buf, buf + drain, fill - drain);
  // Adjust positions
  fill -= drain;
  drain = 0;
}