head	1.2;
access;
symbols
	perseant-exfatfs-base-20250801:1.2
	perseant-exfatfs-base-20240630:1.2
	perseant-exfatfs:1.2.0.6
	perseant-exfatfs-base:1.2
	cjep_sun2x:1.2.0.4
	cjep_sun2x-base:1.2
	cjep_staticlib_x-base1:1.2
	cjep_staticlib_x:1.2.0.2
	cjep_staticlib_x-base:1.2
	phil-wifi-20200421:1.2
	phil-wifi-20200411:1.2
	phil-wifi-20200406:1.2
	pgoyette-compat-merge-20190127:1.1.1.1.2.3
	pgoyette-compat-20190127:1.2
	pgoyette-compat-20190118:1.2
	pgoyette-compat-1226:1.1.1.1
	pgoyette-compat-1126:1.1.1.1
	pgoyette-compat-1020:1.1.1.1
	pgoyette-compat-0930:1.1.1.1
	pgoyette-compat:1.1.1.1.0.2
	pgoyette-compat-0906:1.1.1.1
	bind-9-12-2-P1:1.1.1.1
	ISC:1.1.1;
locks; strict;
comment	@// @;


1.2
date	2019.01.09.16.55.21;	author christos;	state dead;
branches;
next	1.1;
commitid	grd0QDgIEpef587B;

1.1
date	2018.08.12.12.08.32;	author christos;	state Exp;
branches
	1.1.1.1;
next	;
commitid	vA9SFKj6FegqiPNA;

1.1.1.1
date	2018.08.12.12.08.32;	author christos;	state Exp;
branches
	1.1.1.1.2.1;
next	;
commitid	vA9SFKj6FegqiPNA;

1.1.1.1.2.1
date	2018.08.12.12.08.32;	author pgoyette;	state dead;
branches;
next	1.1.1.1.2.2;
commitid	HCi1bXD317XIK0RA;

1.1.1.1.2.2
date	2018.09.06.06.55.15;	author pgoyette;	state Exp;
branches;
next	1.1.1.1.2.3;
commitid	HCi1bXD317XIK0RA;

1.1.1.1.2.3
date	2019.01.18.08.50.05;	author pgoyette;	state dead;
branches;
next	;
commitid	Lmlzg3OVT2cd6f8B;


desc
@@


1.2
log
@merge conflicts, bump major, fix build.
@
text
@// Copyright (c) 2007 The NetBSD Foundation, Inc.
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions
// are met:
// 1. Redistributions of source code must retain the above copyright
//    notice, this list of conditions and the following disclaimer.
// 2. Redistributions in binary form must reproduce the above copyright
//    notice, this list of conditions and the following disclaimer in the
//    documentation and/or other materials provided with the distribution.
//
// THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND
// CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
// IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY
// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
// GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
// IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
// IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

#include "atf-c++/detail/text.hpp"

extern "C" {
#include <regex.h>
}

#include <cctype>
#include <cstring>

extern "C" {
#include "atf-c/detail/text.h"
#include "atf-c/error.h"
}

#include "atf-c++/detail/exceptions.hpp"

namespace impl = atf::text;
#define IMPL_NAME "atf::text"

char*
impl::duplicate(const char* str)
{
    char* copy = new char[std::strlen(str) + 1];
    std::strcpy(copy, str);
    return copy;
}

bool
impl::match(const std::string& str, const std::string& regex)
{
    bool found;

    // Special case: regcomp does not like empty regular expressions.
    if (regex.empty()) {
        found = str.empty();
    } else {
        ::regex_t preg;

        if (::regcomp(&preg, regex.c_str(), REG_EXTENDED) != 0)
            throw std::runtime_error("Invalid regular expression '" + regex +
                                     "'");

        const int res = ::regexec(&preg, str.c_str(), 0, NULL, 0);
        regfree(&preg);
        if (res != 0 && res != REG_NOMATCH)
            throw std::runtime_error("Invalid regular expression " + regex);

        found = res == 0;
    }

    return found;
}

std::string
impl::to_lower(const std::string& str)
{
    std::string lc;
    for (std::string::const_iterator iter = str.begin(); iter != str.end();
         iter++)
        lc += std::tolower(*iter);
    return lc;
}

std::vector< std::string >
impl::split(const std::string& str, const std::string& delim)
{
    std::vector< std::string > words;

    std::string::size_type pos = 0, newpos = 0;
    while (pos < str.length() && newpos != std::string::npos) {
        newpos = str.find(delim, pos);
        if (newpos != pos)
            words.push_back(str.substr(pos, newpos - pos));
        pos = newpos + delim.length();
    }

    return words;
}

std::string
impl::trim(const std::string& str)
{
    std::string::size_type pos1 = str.find_first_not_of(" \t");
    std::string::size_type pos2 = str.find_last_not_of(" \t");

    if (pos1 == std::string::npos && pos2 == std::string::npos)
        return "";
    else if (pos1 == std::string::npos)
        return str.substr(0, str.length() - pos2);
    else if (pos2 == std::string::npos)
        return str.substr(pos1);
    else
        return str.substr(pos1, pos2 - pos1 + 1);
}

bool
impl::to_bool(const std::string& str)
{
    bool b;

    atf_error_t err = atf_text_to_bool(str.c_str(), &b);
    if (atf_is_error(err))
        throw_atf_error(err);

    return b;
}

int64_t
impl::to_bytes(std::string str)
{
    if (str.empty())
        throw std::runtime_error("Empty value");

    const char unit = str[str.length() - 1];
    int64_t multiplier;
    switch (unit) {
    case 'k': case 'K': multiplier = 1 << 10; break;
    case 'm': case 'M': multiplier = 1 << 20; break;
    case 'g': case 'G': multiplier = 1 << 30; break;
    case 't': case 'T': multiplier = int64_t(1) << 40; break;
    default:
        if (!std::isdigit(unit))
            throw std::runtime_error(std::string("Unknown size unit '") + unit
                                     + "'");
        multiplier = 1;
    }
    if (multiplier != 1)
        str.erase(str.length() - 1);

    return to_type< int64_t >(str) * multiplier;
}
@


1.1
log
@Initial revision
@
text
@@


1.1.1.1
log
@Import bind-9.12.2-P2 since bind-9.10 (the last BSD version) is
now out of support.  The changes since our last version imported
(9.10.7) version are too big to include inline here; please consult
the CHANGES file in this directory.
@
text
@@


1.1.1.1.2.1
log
@file text.cpp was added on branch pgoyette-compat on 2018-09-06 06:55:15 +0000
@
text
@d1 156
@


1.1.1.1.2.2
log
@Sync with HEAD

Resolve a couple of conflicts (result of the uimin/uimax changes)
@
text
@a0 156
// Copyright (c) 2007 The NetBSD Foundation, Inc.
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions
// are met:
// 1. Redistributions of source code must retain the above copyright
//    notice, this list of conditions and the following disclaimer.
// 2. Redistributions in binary form must reproduce the above copyright
//    notice, this list of conditions and the following disclaimer in the
//    documentation and/or other materials provided with the distribution.
//
// THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND
// CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
// IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY
// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
// GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
// IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
// IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

#include "atf-c++/detail/text.hpp"

extern "C" {
#include <regex.h>
}

#include <cctype>
#include <cstring>

extern "C" {
#include "atf-c/detail/text.h"
#include "atf-c/error.h"
}

#include "atf-c++/detail/exceptions.hpp"

namespace impl = atf::text;
#define IMPL_NAME "atf::text"

char*
impl::duplicate(const char* str)
{
    char* copy = new char[std::strlen(str) + 1];
    std::strcpy(copy, str);
    return copy;
}

bool
impl::match(const std::string& str, const std::string& regex)
{
    bool found;

    // Special case: regcomp does not like empty regular expressions.
    if (regex.empty()) {
        found = str.empty();
    } else {
        ::regex_t preg;

        if (::regcomp(&preg, regex.c_str(), REG_EXTENDED) != 0)
            throw std::runtime_error("Invalid regular expression '" + regex +
                                     "'");

        const int res = ::regexec(&preg, str.c_str(), 0, NULL, 0);
        regfree(&preg);
        if (res != 0 && res != REG_NOMATCH)
            throw std::runtime_error("Invalid regular expression " + regex);

        found = res == 0;
    }

    return found;
}

std::string
impl::to_lower(const std::string& str)
{
    std::string lc;
    for (std::string::const_iterator iter = str.begin(); iter != str.end();
         iter++)
        lc += std::tolower(*iter);
    return lc;
}

std::vector< std::string >
impl::split(const std::string& str, const std::string& delim)
{
    std::vector< std::string > words;

    std::string::size_type pos = 0, newpos = 0;
    while (pos < str.length() && newpos != std::string::npos) {
        newpos = str.find(delim, pos);
        if (newpos != pos)
            words.push_back(str.substr(pos, newpos - pos));
        pos = newpos + delim.length();
    }

    return words;
}

std::string
impl::trim(const std::string& str)
{
    std::string::size_type pos1 = str.find_first_not_of(" \t");
    std::string::size_type pos2 = str.find_last_not_of(" \t");

    if (pos1 == std::string::npos && pos2 == std::string::npos)
        return "";
    else if (pos1 == std::string::npos)
        return str.substr(0, str.length() - pos2);
    else if (pos2 == std::string::npos)
        return str.substr(pos1);
    else
        return str.substr(pos1, pos2 - pos1 + 1);
}

bool
impl::to_bool(const std::string& str)
{
    bool b;

    atf_error_t err = atf_text_to_bool(str.c_str(), &b);
    if (atf_is_error(err))
        throw_atf_error(err);

    return b;
}

int64_t
impl::to_bytes(std::string str)
{
    if (str.empty())
        throw std::runtime_error("Empty value");

    const char unit = str[str.length() - 1];
    int64_t multiplier;
    switch (unit) {
    case 'k': case 'K': multiplier = 1 << 10; break;
    case 'm': case 'M': multiplier = 1 << 20; break;
    case 'g': case 'G': multiplier = 1 << 30; break;
    case 't': case 'T': multiplier = int64_t(1) << 40; break;
    default:
        if (!std::isdigit(unit))
            throw std::runtime_error(std::string("Unknown size unit '") + unit
                                     + "'");
        multiplier = 1;
    }
    if (multiplier != 1)
        str.erase(str.length() - 1);

    return to_type< int64_t >(str) * multiplier;
}
@


1.1.1.1.2.3
log
@Synch with HEAD
@
text
@@


