toolkit/crashreporter/nsExceptionHandlerUtils.cpp
author Agi Sferro <agi@mozilla.com>
Thu, 20 Dec 2018 15:22:45 +0000
changeset 511518 12616753519d591246fa9578cc74a74b50414834
parent 508163 6f3709b3878117466168c40affa7bca0b60cf75b
permissions -rw-r--r--
Bug 1506658 - Add @Nullable or @NonNull to all APIs. r=snorp,rbarker,geckoview-reviewers Upgrading apilint to the 0.1.6 release will also ensure that new APIs have nullability annotations via the GV4 and GV5 lints, see [0]. [0]: https://github.com/mozilla-mobile/gradle-apilint/commit/b994c7ca9db056652ba4b5dd639437ddf2c5cc6f#diff-2c7de691a2642510f69b9ddf59276d85R569 Differential Revision: https://phabricator.services.mozilla.com/D14896

/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */

#include "nsExceptionHandlerUtils.h"

#include "double-conversion/double-conversion.h"

// Format a non-negative double to a string, without using C-library functions,
// which need to be avoided (.e.g. bug 1240160, comment 10).  Return false if
// we failed to get the formatting done correctly.
bool SimpleNoCLibDtoA(double aValue, char* aBuffer, int aBufferLength) {
  // aBufferLength is the size of the buffer.  Be paranoid.
  aBuffer[aBufferLength - 1] = '\0';

  if (aValue < 0) {
    return false;
  }

  int length, point, i;
  bool sign;
  bool ok = true;
  double_conversion::DoubleToStringConverter::DoubleToAscii(
      aValue, double_conversion::DoubleToStringConverter::SHORTEST, 8, aBuffer,
      aBufferLength, &sign, &length, &point);

  // length does not account for the 0 terminator.
  if (length > point && (length + 1) < (aBufferLength - 1)) {
    // We have to insert a decimal point.  Not worried about adding a leading
    // zero in the < 1 (point == 0) case.
    aBuffer[length + 1] = '\0';
    for (i = length; i > point; i -= 1) {
      aBuffer[i] = aBuffer[i - 1];
    }
    aBuffer[i] = '.';  // Not worried about locales
  } else if (length < point) {
    // Trailing zeros scenario
    for (i = length; i < point; i += 1) {
      if (i >= aBufferLength - 2) {
        ok = false;
      }
      aBuffer[i] = '0';
    }
    aBuffer[i] = '\0';
  }
  return ok;
}