Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependents: MbedSmartRestMain MbedSmartRestMain
ParsedValue.cpp
- Committer:
- Cumulocity
- Date:
- 2014-07-03
- Revision:
- 0:099f76422485
- Child:
- 7:8159a2d12e4e
File content as of revision 0:099f76422485:
/*
* ParsedValue.cpp
*
* Created on: Nov 1, 2013
* * Authors: Vincent Wochnik <v.wochnik@gmail.com>
*
* Copyright (c) 2013 Cumulocity GmbH
*
* Permission is hereby granted, free of charge, to any person obtaining
* a copy of this software and associated documentation files (the
* "Software"), to deal in the Software without restriction, including
* without limitation the rights to use, copy, modify, merge, publish,
* distribute, sublicense, and/or sell copies of the Software, and to
* permit persons to whom the Software is furnished to do so, subject to
* the following conditions:
*
* The above copyright notice and this permission notice shall be
* included in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
#include "ParsedValue.h"
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <errno.h>
#include <math.h>
#include "NullValue.h"
#include "IntegerValue.h"
#include "FloatValue.h"
#include "CharValue.h"
ParsedValue::ParsedValue(const char *str, bool copy) : _value(str, copy), _float(0.0), _digits(0), _zflag(false), _integer(0l)
{
if (_value.valueType() != VALUE_NULL) {
_type = VALUE_CHARACTER;
extractValue();
} else {
_type = VALUE_NULL;
}
}
uint8_t ParsedValue::valueType() const
{
return _type;
}
long ParsedValue::integerValue() const
{
return _integer;
}
double ParsedValue::floatValue() const
{
return _float;
}
const char * ParsedValue::characterValue() const
{
if (_type != VALUE_CHARACTER)
return NULL;
return _value.characterValue();
}
size_t ParsedValue::write(AbstractDataSink& sink) const
{
return _value.write(sink);
}
size_t ParsedValue::length() const
{
return _value.length();
}
Value* ParsedValue::copy() const
{
if (_type == VALUE_NULL)
return new NullValue();
if (_type == VALUE_INTEGER)
return new IntegerValue(_integer);
if (_type == VALUE_FLOAT)
return new FloatValue(_float, _digits, _zflag);
return new CharValue(_value.characterValue(), true);
}
void ParsedValue::extractValue()
{
const char *str; char *ptr, c;
bool floating = false, zflag = false, negative = false;
uint8_t digits = 0;
str = _value.characterValue();
if (isspace(*str))
return;
// easy check for nan
if (strcmp(str, "nan") == 0) {
_float = NAN;
_type = VALUE_FLOAT;
return;
}
if (*str == '-') {
negative = true;
str++;
}
if (strcmp(str, "inf") == 0) {
_float = (negative) ? -INFINITY : INFINITY;
_type = VALUE_FLOAT;
return;
}
for (ptr = (char*)str; (c = *ptr) != 0; ptr++) {
if (floating) {
if (!isdigit(c))
return;
digits++;
} else {
if (c == '.') {
if (*(ptr+1) == '\0')
return;
floating = true;
} else if (isdigit(c)) {
_zflag = true;
} else {
return;
}
}
}
if (floating) {
errno = 0;
if ((((_float = strtod(str, &ptr)) != 0.0) || (errno == 0)) &&
(*ptr == '\0')) {
if (negative)
_float = -_float;
_zflag = zflag;
_digits = digits;
_type = VALUE_FLOAT;
}
} else {
errno = 0;
if ((((_integer = strtol(str, &ptr, 10)) != 0) || (errno == 0)) &&
(*ptr == '\0')) {
if (negative)
_integer = -_integer;
_type = VALUE_INTEGER;
return;
}
}
}

Cumulocity