Clownfish-CFC

 view release on metacpan or  search on metacpan

src/CFCTest.c  view on Meta::CPAN

    return (struct CFCParcel*)result;
}

struct CFCType*
CFCTest_parse_type(CFCTest *test, CFCParser *parser, const char *src) {
    CFCBase *result = CFCParser_parse(parser, src);
    OK(test, result != NULL, "parse '%s'", src);
    STR_EQ(test, CFCBase_get_cfc_class(result),
           "Clownfish::CFC::Model::Type", "result class of '%s'", src);
    return (struct CFCType*)result;
}

struct CFCVariable*
CFCTest_parse_variable(CFCTest *test, CFCParser *parser, const char *src) {
    CFCBase *result = CFCParser_parse(parser, src);
    OK(test, result != NULL, "parse '%s'", src);
    STR_EQ(test, CFCBase_get_cfc_class(result),
           "Clownfish::CFC::Model::Variable", "result class of '%s'", src);
    return (struct CFCVariable*)result;
}

struct CFCParamList*
CFCTest_parse_param_list(CFCTest *test, CFCParser *parser, const char *src) {
    CFCBase *result = CFCParser_parse(parser, src);
    OK(test, result != NULL, "parse '%s'", src);
    STR_EQ(test, CFCBase_get_cfc_class(result),
           "Clownfish::CFC::Model::ParamList", "result class of '%s'", src);
    return (struct CFCParamList*)result;
}

struct CFCFunction*
CFCTest_parse_function(CFCTest *test, CFCParser *parser, const char *src) {
    CFCBase *result = CFCParser_parse(parser, src);
    OK(test, result != NULL, "parse '%s'", src);
    STR_EQ(test, CFCBase_get_cfc_class(result),
           "Clownfish::CFC::Model::Function", "result class of '%s'", src);
    return (struct CFCFunction*)result;
}

struct CFCMethod*
CFCTest_parse_method(CFCTest *test, CFCParser *parser, const char *src) {
    CFCBase *result = CFCParser_parse(parser, src);
    OK(test, result != NULL, "parse '%s'", src);
    STR_EQ(test, CFCBase_get_cfc_class(result),
           "Clownfish::CFC::Model::Method", "result class of '%s'", src);
    return (struct CFCMethod*)result;
}

struct CFCClass*
CFCTest_parse_class(CFCTest *test, CFCParser *parser, const char *src) {
    CFCBase *result = CFCParser_parse(parser, src);
    OK(test, result != NULL, "parse class");
    STR_EQ(test, CFCBase_get_cfc_class(result),
           "Clownfish::CFC::Model::Class", "result class");
    return (struct CFCClass*)result;
}

time_t
CFCTest_get_file_mtime(const char *path) {
    struct stat buf;
    if (stat(path, &buf)) {
        CFCUtil_die("Can't stat '%s': %s", path, strerror(errno));
    }
    return buf.st_mtime;
}

#if defined(CHY_HAS_WINDOWS_H)

#include <windows.h>

void
CFCTest_set_file_times(const char *path, time_t time) {
    // Strawberry Perl may unpack the distribution's files as read-only.
    DWORD attrs = GetFileAttributes(path);
    if (attrs == INVALID_FILE_ATTRIBUTES) {
        CFCUtil_die("Can't get file attrs of '%s': %u", path, GetLastError());
    }
    if (attrs & FILE_ATTRIBUTE_READONLY) {
        attrs &= ~FILE_ATTRIBUTE_READONLY;
        if (!SetFileAttributes(path, attrs)) {
                CFCUtil_die("Can't make '%s' writable: %u", path,
                            GetLastError());
        }
    }

    HANDLE handle = CreateFile(path, GENERIC_WRITE, FILE_SHARE_READ, NULL,
                               OPEN_EXISTING, 0, NULL);
    if (handle == INVALID_HANDLE_VALUE) {
        CFCUtil_die("Can't open '%s': %u", path, GetLastError());
    }
    uint64_t ticks = 10000000 * (UINT64_C(11644473600) + time);
    FILETIME file_time;
    file_time.dwLowDateTime  = (DWORD)ticks;
    file_time.dwHighDateTime = (DWORD)(ticks >> 32);
    if (!SetFileTime(handle, &file_time, &file_time, &file_time)) {
        CFCUtil_die("Can't set file time of '%s': %u", path, GetLastError());
    }
    CloseHandle(handle);
}

#elif defined(CHY_HAS_UTIME_H)

#include <utime.h>

void
CFCTest_set_file_times(const char *path, time_t time) {
    struct utimbuf buf;
    buf.actime  = time;
    buf.modtime = time;
    if (utime(path, &buf)) {
        CFCUtil_die("Can't set file time of '%s': %s", path, strerror(errno));
    }
}

#else

#error Need either utime.h or windows.h

#endif



( run in 2.651 seconds using v1.01-cache-2.11-cpan-437f7b0c052 )