Example #1
0
TEST_F(SHAPE, Coordinates)
{
	std::vector<ade::DimT> slist = {9, 3, 7, 8, 5};
	ade::Shape shape(slist);
	ade::CoordT coord;
	for (ade::NElemT i = 0, n = shape.n_elems(); i < n; ++i)
	{
		coord = ade::coordinate(shape, i);
		for (uint8_t i = 0; i < ade::rank_cap; ++i)
		{
			EXPECT_GT(shape.at(i), coord[i]);
		}
		ade::NElemT idx = ade::index(shape, coord);
		EXPECT_EQ(i, idx);
	}

	for (uint8_t i = 0; i < ade::rank_cap; ++i)
	{
		coord[i] = shape.at(i);
	}
	std::string shapestr = shape.to_string();
	std::string fatalmsg = fmts::sprintf("cannot get index of bad coordinate "
		"%s for shape %s", shapestr.c_str(), shapestr.c_str());
	EXPECT_FATAL(ade::index(shape, coord), fatalmsg.c_str());

	std::string fatalmsg2 = fmts::sprintf("cannot get coordinate of index %d "
		"(>= shape %s)", shape.n_elems(), shapestr.c_str());
	EXPECT_FATAL(ade::coordinate(shape, shape.n_elems()), fatalmsg2.c_str());
}
Example #2
0
bool slice_file_extension(slice path, slice *left, slice *right)
{
    EXPECT_FATAL(path.start && path.end);
    EXPECT_FATAL(left);
    EXPECT_FATAL(right);
    
    // ensure paths containing "." but no extension, such as "./test",
    // are avoided.
    // side-effect: ensures "/" never appears inside an extension
    // e.g. "myfile.txt/2"
    const char *rslash = slice_strrchr(path, '/');
    const char *rdot   = slice_strrchr(path, '.');
    
    if (rslash && rdot)
    {
        if (rslash > rdot) { return false; }
    }
    
    // ensure "dotfiles", i.e. hidden files on linux like ".example", are
    // treated as named rather than as empty names with extensions
    if (rdot)
    {
        // starts with ".", no folders
        if ((!rslash) && (rdot == path.start)) { return false; }
        // filename part starts with ".", its a hidden dotfile
        if ((rslash) && ((rslash + 1) == rdot)) { return false; }
    }
    
    if (!slice_on_charr(path, '.', left, right)) { return false; }
    
    // avoid empty extensions e.g. "file."
    if (!slice_len(*right)) { return false; }
    
    return true;
}
Example #3
0
static bool filelike_FILE_size(filelike *f, size_t *dest)
{
    FILE *src = (void *) f->ptr;
    
    if (0 != fseek(src, 0, SEEK_END))
    {
        ERRORf("%s", "Seek to end error");
        return false;
    }
    
    long sz = ftell(src);
    EXPECT_FATAL(sz >= 0);
    
    // don't support files >= 2GB because the cross-platform pain isn't worth it
    if (sz > INT_MAX) { return false; }
    
    if (f->window_start >= 0)
    {
        ssize_t size = (ssize_t) sz;
        ssize_t window_size = f->window_end - f->window_start;
        size -= window_size;
        if (size < 0) { return false; }
        *dest = (size_t) size;
    }
    else
    {
        *dest = (size_t) sz;
    }
    
    return true;
}
Example #4
0
static bool slice_on_fnp(
    // function to find char to split on
    const char *(*fn)(const char *, int, size_t),
    slice src, const char c, slice *left, slice *right)
{
    EXPECT_FATAL(src.start && src.end);
    EXPECT_FATAL(left);
    EXPECT_FATAL(right);
    
    size_t len = slice_len(src);

    const char *index = fn(src.start, c, len);
    if (!index) { return false; }
    
    *left  = (slice){src.start, index};
    *right = (slice){index + 1, src.end};
    
    return true;
}
Example #5
0
TEST_F(SHAPE, Init)
{
	ade::Shape scalar;

	std::vector<ade::DimT> slist = {12, 43, 56};
	ade::Shape vec(slist);
	uint8_t n = slist.size();

	std::vector<ade::DimT> longlist = {4, 23, 44, 52, 19, 92, 12, 2, 5};
	ade::Shape lvec(longlist);

	std::vector<ade::DimT> zerolist = {43, 2, 5, 33, 0, 2, 7};
	std::string fatalmsg = "cannot create shape with vector containing zero: " +
		fmts::to_string(zerolist.begin(), zerolist.end());
	EXPECT_FATAL(ade::Shape junk(zerolist), fatalmsg.c_str());

	for (uint8_t i = 0; i < ade::rank_cap; ++i)
	{
		EXPECT_EQ(1, scalar.at(i));
	}

	for (uint8_t i = 0; i < n; ++i)
	{
		EXPECT_EQ(slist[i], vec.at(i));
	}
	for (uint8_t i = n; i < ade::rank_cap; ++i)
	{
		EXPECT_EQ(1, vec.at(i));
	}

	for (uint8_t i = 0; i < ade::rank_cap; ++i)
	{
		EXPECT_EQ(longlist[i], lvec.at(i));
	}

	EXPECT_FATAL(scalar.at(ade::rank_cap), "cannot access out of bounds index 8");
	EXPECT_FATAL(vec.at(ade::rank_cap), "cannot access out of bounds index 8");
}
Example #6
0
void filelike_range_from_FILE(filelike *f, FILE *o, ssize_t window_start, ssize_t window_end)
{
    char buf[CFW_MAX_PATH]; UNUSED(buf);
    TRACEf("io", "filelike=%p, FILE=%p <%s>, window_start="PRINTF_ZD ", window_end="PRINTF_ZD ,
        (void *) f, (void *) o, FILE_name(o, buf), CAST_ZD(window_start), CAST_ZD(window_end));

    EXPECT_FATAL(f);
    EXPECT_FATAL(o);
    EXPECT_FATAL(window_start <= window_end);
    
    f->ptr      = (void *) o;
    f->impl     = &filelike_impl_FILE;
    
    f->window_start = window_start;
    f->window_end   = window_end;
    
    if ((f->window_start >= 0) && (0 != fseek(o, (long) f->window_start, SEEK_SET)))
    {
        DIE("Seek to start error");
    }
    
    TRACEOUT("io");
}
Example #7
0
TEST(DATA, MismatchSize)
{
	std::vector<ade::DimT> slist = {4, 2, 3};
	ade::Shape shape(slist);
	std::vector<double> data = {
		41, 29, 86, 43, 12, 55, 68, 87, 16, 92, 26, 28,
		13, 1, 62, 9, 27, 10, 23, 70, 80, 67, 96, 22, 24
	};

	std::stringstream ss;
	ss << "cannot create variable with data size " << data.size() <<
		" against shape " << shape.to_string();
	EXPECT_FATAL(llo::Variable<double>::get(data, shape), ss.str().c_str());
}
Example #8
0
bool slice_uri_scheme(slice uri, slice *left, slice *right)
{
    EXPECT_FATAL(uri.start && uri.end);

    if (!slice_len(uri))
    {
        return false; // empty string
    }
    
    slice _left, _right;
    
    if (!slice_on_char(uri, ':', &_left, &_right)) { return false; }
    
    // Validate
    // necessaru so that e.g. "/some/file:with:a:colon" doesn't become a scheme
    
    // scheme      = ALPHA *( ALPHA / DIGIT / "+" / "-" / "." )
    // ALPHA       =  %x41-5A / %x61-7A   ; A-Z / a-z
    
    char first = *_left.start;
    if (!(
        ((first >= 'A') && (first <= 'Z')) ||
        ((first >= 'a') && (first <= 'z'))
    )) { return false; }
    
    for (const char *p = _left.start + 1; p < _left.end; p++)
    {
        char c = *p;
        if (!(
            ((c >= 'A') && (c <= 'Z')) ||
            ((c >= 'a') && (c <= 'z')) ||
            ((c >= '0') && (c <= '9')) ||
            (c == '+') ||
            (c == '-') ||
            (c == '.')
        )) { return false; }
    }
    
    if (left)  { *left  = _left; }
    if (right) { *right = _right; }
    
    return true;
}
Example #9
0
TEST_F(SHAPE, VecAssign)
{\
	std::vector<ade::DimT> zerolist = {3, 0, 11, 89};
	std::vector<ade::DimT> slist = {52, 58, 35, 46, 77, 80};
	std::vector<ade::DimT> junk = {7, 42};

	ade::Shape vecassign;
	ade::Shape vecassign2(junk);

	vecassign = slist;
	std::vector<ade::DimT> vlist(vecassign.begin(), vecassign.end());
	EXPECT_ARREQ(slist, vlist);

	vecassign2 = slist;
	std::vector<ade::DimT> vlist2(vecassign2.begin(), vecassign2.end());
	EXPECT_ARREQ(slist, vlist2);

	std::string fatalmsg = "cannot create shape with vector containing zero: " +
		fmts::to_string(zerolist.begin(), zerolist.end());
	EXPECT_FATAL(vecassign = zerolist, fatalmsg.c_str());
}
Example #10
0
bool connection_open_tcp(connection *con, const char *host, const char *service)
{
    EXPECT_FATAL(con);
    EXPECT_FATAL(host);
    EXPECT_FATAL(service);
    EXPECT_FATAL(sizeof(con->mem) >= sizeof(SOCKET));
    
    if (strnlen(host, 256) > 255) { X(bad_arg, XSTR_LIMIT": host must not exceed 255 octets"); }
    
    SOCKET s = INVALID_SOCKET;
    
    // method e.g. "GET"
    // host e.g. "example.org"
    // rsc e.g.  "/index.html"
    // port e.g. 80
    
    const struct addrinfo hints =
    {
        AI_NUMERICSERV | AI_ADDRCONFIG, // ai_flags
        AF_UNSPEC,   // ai_family: AF_INET | AF_INET6 | AF_UNSPEC
        SOCK_STREAM, // ai_socktype (TCP)
        IPPROTO_TCP, // ai_protocol (TCP)
        0,
        NULL,
        NULL,
        NULL,
    };
    struct addrinfo *result;
    
    int ret = getaddrinfo(host, service, &hints, &result);
    if (ret != 0) { Xf(lookup_address, XSTR_NETWORK": (%s) %s", host, getaddrinfo_strerror(ret)); }
    
    for (struct addrinfo *current = result; current; current = current->ai_next)
    {
        s = socket(current->ai_family, current->ai_socktype, current->ai_protocol);
        if (s == INVALID_SOCKET) { Xf(socket, XSTR_NETWORK ": socket() errno=%d\n", socket_geterr()); }
        
        ret = socket_connect(s, current->ai_addr, current->ai_addrlen);
        if (ret != 0) { Xf(connect, XSTR_NETWORK ": connect() errno=%d\n", socket_geterr()); }
        
        memset(con->address, '\0', CFW_INET6_ADDRSTRLEN);

#       ifndef TARGET_WINDOWS
            if(!inet_ntop(current->ai_family,
                &((struct sockaddr_in *) current->ai_addr)->sin_addr,
                con->address, CFW_INET6_ADDRSTRLEN)
            ) { WARNING("inet_ntop() IP lookup failure"); }
#       endif
        
        // success
        break;
        
        // fallthru
        err_connect:
            socket_close(s);
        err_socket:
            continue;
    }
    
    freeaddrinfo(result);
    
    if (s == INVALID_SOCKET) { X(no_match, "No matching socket"); }
    
    memcpy(con, &s, sizeof(SOCKET));
    strcpy(con->host, host);
    return true;
    
    err_no_match:
        freeaddrinfo(result);
    err_lookup_address:
    err_bad_arg:
        return false;
}