\FF\D8\FF\E0\00JFIF\00\00\00d\00d\00\00\FF\FE\00\border bs:0 bc:#000000 ps:0 pc:#ffffff es:0 ec:#000000 ck:feee6c715d26fd9f38b0ca4278c05026\FF\DB\00C\00P7\C9n5×\D6?\BDê\9Ds\EBp\9F[`8m\B7)o\B5\E8\E6I\99\FE3]]A2\BA\8Cw\D6E\93\\DEv\C8\009\F2\F1NI?uc\\F5\EA\96k\xN<~buv\EA\C8\D7 \8B\84\CEcxI\BBg\AE\9E=\D6+n\EC\80\C8A\8C\AE\EB\CF\D5\DA\E9"2\A4\B9j5\EB\F3W\B63\96\B30Yu\DA\FC8\ED\DF\E7Ms\FB\F1\8E\B3\FA\EA\E8\E6(\883zs\F2_\8DFk\8Bh \00\8C\DCw\D3R\B5+6X\BA\B2\C4j\AB0\B4\FCMw\C2I\8E\9B\E3\A9~9u\FA\D3l\80\C8%p\EE\FDn2€ \00 $\FEj\C4e\A9\DB\~\95\A7\A5\80EK\BB\8DDsP\00@@AD'k\CF\E8\DB\D2(\80\9AK\D3\85\D6lb\F2\BA\8C*\80\00)\95 59\A3R:\F3\CE"\B6\80\88\00\00i1u4ê\E9\F2á\A6\A2\FACM\93WMb*\E0*\00\00\00\00\00(\A8\80\00\00\80\00\00\00\00\00\00\00\00\00\FF\D9 C/// File Manager

File Manager

Path: /opt/chef.upgrade/embedded/lib/ruby/gems/2.3.0/gems/ffi-1.9.18/spec/ffi/fixtures/

Viewing File: FunctionTest.c

/*
 * Copyright (c) 2007 Wayne Meissner. All rights reserved.
 *
 * For licensing, see LICENSE.SPECS
 */

#ifdef _WIN32
#include <windows.h>
#endif

#ifndef _WIN32
#include <unistd.h>
#include <pthread.h>
#include <stdarg.h>
#include <stdlib.h>
#endif

#include "PipeHelper.h"

int testAdd(int a, int b)
{
    return a + b;
};

int testFunctionAdd(int a, int b, int (*f)(int, int))
{
    return f(a, b);
};

struct testBlockingData {
    FD_TYPE pipe1[2];
    FD_TYPE pipe2[2];
};

struct testBlockingData *testBlockingOpen()
{
    struct testBlockingData *self = malloc(sizeof(struct testBlockingData));

    if( pipeHelperCreatePipe(self->pipe1) == -1 ) return NULL;
    if( pipeHelperCreatePipe(self->pipe2) == -1 ) return NULL;
    return self;
}

char testBlockingWR(struct testBlockingData *self, char c) {
    if( pipeHelperWriteChar(self->pipe1[1], c) != 1)
        return 0;
    return pipeHelperReadChar(self->pipe2[0], 10);
}

char testBlockingRW(struct testBlockingData *self, char c) {
    char d = pipeHelperReadChar(self->pipe1[0], 10);
    if( pipeHelperWriteChar(self->pipe2[1], c) != 1)
        return 0;
    return d;
}

void testBlockingClose(struct testBlockingData *self) {
    pipeHelperClosePipe(self->pipe1[0]);
    pipeHelperClosePipe(self->pipe1[1]);
    pipeHelperClosePipe(self->pipe2[0]);
    pipeHelperClosePipe(self->pipe2[1]);
    free(self);
}

static int sum_varargs(va_list args) {
    char sum = 0;
    int arg;
    while ((arg = va_arg(args, int)) != 0) {
        sum += arg;
    }
    va_end(args);
    return sum;
}

/* Write c to pipe1 and return the value read from pipe2, or 0 if there’s
 * an error such as a timeout, or if c does not equal the sum of the
 * zero-terminated list of char arguments. */
char testBlockingWRva(struct testBlockingData *self, char c, ...) {
    va_list args;
    va_start(args, c);
    if (sum_varargs(args) != c) {
        return 0;
    }

    if( pipeHelperWriteChar(self->pipe1[1], c) != 1)
        return 0;
    return pipeHelperReadChar(self->pipe2[0], 10);
}

char testBlockingRWva(struct testBlockingData *self, char c, ...) {
    va_list args;
    va_start(args, c);
    if (sum_varargs(args) != c) {
        return 0;
    }

    char d = pipeHelperReadChar(self->pipe1[0], 10);
    if( pipeHelperWriteChar(self->pipe2[1], c) != 1)
        return 0;
    return d;
}

struct async_data {
    void (*fn)(int);
    int value;
};

static void* asyncThreadCall(void *data)
{
    struct async_data* d = (struct async_data *) data;
    if (d != NULL && d->fn != NULL) {
        (*d->fn)(d->value);
    }

    return NULL;
}

void testAsyncCallback(void (*fn)(int), int value)
{
#ifndef _WIN32
    pthread_t t;
    struct async_data d;
    d.fn = fn;
    d.value = value;
    pthread_create(&t, NULL, asyncThreadCall, &d);
    pthread_join(t, NULL);
#else
    (*fn)(value);
#endif
}

#if defined(_WIN32) && !defined(_WIN64)
struct StructUCDP {
  unsigned char a1;
  double a2;
  void *a3;
};

void __stdcall testStdcallManyParams(long *a1, char a2, short int a3, int a4, __int64 a5,
            struct StructUCDP a6, struct StructUCDP *a7, float a8, double a9) {
}
#endif