Coverage Report

Created: 2021-08-22 09:07

/src/skia/third_party/externals/icu/source/common/bytestream.cpp
Line
Count
Source (jump to first uncovered line)
1
// © 2016 and later: Unicode, Inc. and others.
2
// License & terms of use: http://www.unicode.org/copyright.html
3
// Copyright (C) 2009-2011, International Business Machines
4
// Corporation and others. All Rights Reserved.
5
//
6
// Copyright 2007 Google Inc. All Rights Reserved.
7
// Author: sanjay@google.com (Sanjay Ghemawat)
8
9
#include "unicode/utypes.h"
10
#include "unicode/bytestream.h"
11
#include "cmemory.h"
12
13
U_NAMESPACE_BEGIN
14
15
106k
ByteSink::~ByteSink() {}
16
17
char* ByteSink::GetAppendBuffer(int32_t min_capacity,
18
                                int32_t /*desired_capacity_hint*/,
19
                                char* scratch, int32_t scratch_capacity,
20
0
                                int32_t* result_capacity) {
21
0
  if (min_capacity < 1 || scratch_capacity < min_capacity) {
22
0
    *result_capacity = 0;
23
0
    return NULL;
24
0
  }
25
0
  *result_capacity = scratch_capacity;
26
0
  return scratch;
27
0
}
28
29
0
void ByteSink::Flush() {}
30
31
CheckedArrayByteSink::CheckedArrayByteSink(char* outbuf, int32_t capacity)
32
    : outbuf_(outbuf), capacity_(capacity < 0 ? 0 : capacity),
33
106k
      size_(0), appended_(0), overflowed_(FALSE) {
34
106k
}
35
36
CheckedArrayByteSink::~CheckedArrayByteSink() {}
37
38
0
CheckedArrayByteSink& CheckedArrayByteSink::Reset() {
39
0
  size_ = appended_ = 0;
40
0
  overflowed_ = FALSE;
41
0
  return *this;
42
0
}
43
44
87.1k
void CheckedArrayByteSink::Append(const char* bytes, int32_t n) {
45
87.1k
  if (n <= 0) {
46
7.93k
    return;
47
7.93k
  }
48
79.1k
  if (n > (INT32_MAX - appended_)) {
49
    // TODO: Report as integer overflow, not merely buffer overflow.
50
0
    appended_ = INT32_MAX;
51
0
    overflowed_ = TRUE;
52
0
    return;
53
0
  }
54
79.1k
  appended_ += n;
55
79.1k
  int32_t available = capacity_ - size_;
56
79.1k
  if (n > available) {
57
0
    n = available;
58
0
    overflowed_ = TRUE;
59
0
  }
60
79.1k
  if (n > 0 && bytes != (outbuf_ + size_)) {
61
79.1k
    uprv_memcpy(outbuf_ + size_, bytes, n);
62
79.1k
  }
63
79.1k
  size_ += n;
64
79.1k
}
65
66
char* CheckedArrayByteSink::GetAppendBuffer(int32_t min_capacity,
67
                                            int32_t /*desired_capacity_hint*/,
68
                                            char* scratch,
69
                                            int32_t scratch_capacity,
70
0
                                            int32_t* result_capacity) {
71
0
  if (min_capacity < 1 || scratch_capacity < min_capacity) {
72
0
    *result_capacity = 0;
73
0
    return NULL;
74
0
  }
75
0
  int32_t available = capacity_ - size_;
76
0
  if (available >= min_capacity) {
77
0
    *result_capacity = available;
78
0
    return outbuf_ + size_;
79
0
  } else {
80
0
    *result_capacity = scratch_capacity;
81
0
    return scratch;
82
0
  }
83
0
}
84
85
U_NAMESPACE_END