コード例 #1
0
ファイル: packrat.c プロジェクト: GregorR/plof3
/* create a nonterminal given only names */
struct Production *newPackratNonterminal(unsigned char *name, unsigned char ***sub)
{
    struct Production *ret = getProduction(name);
    struct Buffer_Production_p pors;
    struct Buffer_Production pthens;
    struct Production *pr;
    int ors, thens;

    ret->parser = packratNonterminal;

    /* now fill in the sub-productions */
    INIT_BUFFER(pors);
    for (ors = 0; sub[ors]; ors++) {
        INIT_BUFFER(pthens);
        for (thens = 0; sub[ors][thens]; thens++) {
            pr = getProduction(sub[ors][thens]);
            WRITE_BUFFER(pthens, &pr, 1);
        }
        pr = NULL;
        WRITE_BUFFER(pthens, &pr, 1);

        WRITE_BUFFER(pors, &pthens.buf, 1);
    }
    pr = NULL;
    WRITE_BUFFER(pors, (struct Production ***) &pr, 1);

    ret->arg = pors.buf;

    return ret;
}
コード例 #2
0
static int ReadTRexShort(struct synaptics_ts_data *ts)
{
	int ret = 0;
	unsigned char TRX_Short[7] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00};

	int MaxArrayLength = RxChNum * TxChNum * 2;
	int i, j = 0;
	int mask = 0x01;
	int value;	// Hardcode for Waikiki Test and it support up to 54 Tx
	int result = TOUCH_SUCCESS;
	u8 buf[40] = {0};
	u8 cap_data[MaxArrayLength];

	ret = Touch_I2C_Read(ts->client, REPORT_DATA_REG, cap_data, MaxArrayLength);

	WRITE_BUFFER(f54_wlog_buf, "TRex Short Test\n");

	for (i = 0; i < 7; i++) {
		int short_num = 0;

		value = cap_data[i];
		cap_data[i] = 0;

		for (j = 0; j < 8; j++) {
			if((value & mask) == 1) {
				cap_data[i] = cap_data[i] + (unsigned char)pow_func(2, (7 - j));
				short_num += sprintf(buf+short_num, "%d ", (i * 8 + (7 - j)));
			}

			value >>= 1;
		}

		WRITE_BUFFER(f54_wlog_buf, "TRex-TRex Short Test Data = %#x", cap_data[i]);

		if (short_num) {
			WRITE_BUFFER(f54_wlog_buf, " (Short TRx Number: ");
			WRITE_BUFFER(f54_wlog_buf, buf);
			WRITE_BUFFER(f54_wlog_buf, ")\n");
		}

		WRITE_BUFFER(f54_wlog_buf, "\n");
	}

	for(i = 0; i < 7; i++) {
		if(cap_data[i] != TRX_Short[i]) {
			result = TOUCH_FAIL;
			break;
		}
	}

	if (result == TOUCH_SUCCESS)
		WRITE_BUFFER(f54_wlog_buf, "\nTRex-TRex Short Test passed.\n\n");
	else
		WRITE_BUFFER(f54_wlog_buf, "\nTRex-TRex Short Test failed.\n\n");

	write_log(NULL, f54_wlog_buf);

	return result;
}
コード例 #3
0
ファイル: kssl_helpers.c プロジェクト: b1v1r/keyless
// flatten_item: Serialize a single kssl_item. The offset is updated
// as bytes are written. If offset pointer is NULL this function
// starts at offset 0. Returns KSSL_ERROR_NONE if successful.
kssl_error_code flatten_item(BYTE tag,         // The kssl_item's tag (see
                             // kssl.h)
                             BYTE *payload,    // Buffer containing the item's
                             // payload
                             WORD payload_len, // Length of data from payload
                             // to copy
                             BYTE *bytes,      // Buffer into which item is
                             // serialized
                             int *offset) {    // (optional) offset into bytes
    // to write from
    int local_offset = 0;

    if (bytes == NULL) {
        return KSSL_ERROR_INTERNAL;
    }

    if (offset != NULL) {
        local_offset = *offset;
    }

    WRITE_BYTE(bytes, local_offset, tag);
    WRITE_WORD(bytes, local_offset, payload_len);
    if (payload_len > 0) {
        WRITE_BUFFER(bytes, local_offset, payload, payload_len);
    }

    if (offset != NULL) {
        *offset = local_offset;
    }

    return KSSL_ERROR_NONE;
}
コード例 #4
0
ファイル: ide.c プロジェクト: Aishou/lxdream
void ide_write_data_pio( uint16_t val ) {
    if( idereg.state == IDE_STATE_CMD_WRITE ) {
        WRITE_BUFFER(val);
        idereg.data_offset+=2;
        if( idereg.data_offset >= idereg.data_length ) {
            idereg.state = IDE_STATE_BUSY;
            idereg.status = (idereg.status & ~IDE_STATUS_DRQ) | IDE_STATUS_BSY;
            idereg.data_offset = -1;
            ide_packet_command(data_buffer);
        }
    } else if( idereg.state == IDE_STATE_PIO_WRITE ) {
        WRITE_BUFFER(val);
        idereg.data_offset +=2;
        if( idereg.data_offset >= idereg.data_length ) {
            idereg.state = IDE_STATE_IDLE;
            idereg.status &= ~IDE_STATUS_DRQ;
            idereg.data_offset = -1;
            idereg.count = 3; /* complete */
            ide_raise_interrupt();
            ide_write_buffer( data_buffer, idereg.data_length );
        }
    }
}
コード例 #5
0
ファイル: unparse.c プロジェクト: GregorR/exc
static void unparseJSONStr(struct Buffer_char *buf, const char *str)
{
    size_t i;
    for (i = 0; str[i]; i++) {
        char c = str[i];
        switch (c) {
            case '"':
            case '\\':
                WRITE_ONE_BUFFER(*buf, '\\');
                WRITE_ONE_BUFFER(*buf, c);
                break;

            case '\b':
                WRITE_BUFFER(*buf, "\\b", 2);
                break;

            case '\f':
                WRITE_BUFFER(*buf, "\\f", 2);
                break;

            case '\n':
                WRITE_BUFFER(*buf, "\\n", 2);
                break;

            case '\r':
                WRITE_BUFFER(*buf, "\\r", 2);
                break;

            case '\t':
                WRITE_BUFFER(*buf, "\\t", 2);
                break;

            default:
                WRITE_ONE_BUFFER(*buf, c);
        }
    }
}
コード例 #6
0
ファイル: ReadSMC.c プロジェクト: Download-Fritz/ReadSMC
//
// unicode to utf8
//
EFI_STATUS UnicodeToUtf8(CHAR16 CONST* unicodeBuffer, UINTN unicodeCharCount, UINT8* utf8Buffer, UINTN utf8BufferLength)
{
	UINT32 j																= 0;
	utf8Buffer[utf8BufferLength - 1]										= 0;
    UINT32 i = 0;

	for(i = 0; i < unicodeCharCount; i ++)
	{
		CHAR16 unicodeChar													= unicodeBuffer[i];
		if(unicodeChar < 0x0080)
		{
			WRITE_BUFFER(utf8Buffer, utf8BufferLength, j, unicodeChar, UINT8);
		}
		else if(unicodeChar < 0x0800)
		{
			WRITE_BUFFER(utf8Buffer, utf8BufferLength, j, ((unicodeChar >>  6) & 0x0f) | 0xc0, UINT8);
			WRITE_BUFFER(utf8Buffer, utf8BufferLength, j, ((unicodeChar >>  0) & 0x3f) | 0x80, UINT8);
		}
		else
		{
コード例 #7
0
ファイル: unparse.c プロジェクト: GregorR/exc
static void unparseJSONPrime(struct Buffer_char *buf, Node *node)
{
    size_t i;
    const char *tmp;

    WRITE_ONE_BUFFER(*buf, '{');

    if (node->tok) {
        Token *tok = node->tok;
        WRITE_BUFFER(*buf, "\"tok\":{\"type\":\"", 15);

        tmp = tokenName(tok->type);
        unparseJSONStr(buf, tmp);

        WRITE_ONE_BUFFER(*buf, '"');

        if (tok->pre) {
            WRITE_BUFFER(*buf, ",\"pre\":\"", 8);
            unparseJSONStr(buf, tok->pre);
            WRITE_ONE_BUFFER(*buf, '"');
        }

        if (tok->tok) {
            WRITE_BUFFER(*buf, ",\"tok\":\"", 8);
            unparseJSONStr(buf, tok->tok);
            WRITE_ONE_BUFFER(*buf, '"');
        }

        WRITE_BUFFER(*buf, "},", 2);
    }

    WRITE_BUFFER(*buf, "\"type\":\"", 8);
    tmp = nodeName(node->type);
    unparseJSONStr(buf, tmp);

    WRITE_BUFFER(*buf, "\",\"children\":[", 14);

    for (i = 0; node->children[i]; i++) {
        if (i != 0) WRITE_ONE_BUFFER(*buf, ',');
        unparseJSONPrime(buf, node->children[i]);
    }

    WRITE_BUFFER(*buf, "]}", 2);
}
コード例 #8
0
ファイル: usrview.c プロジェクト: GregorR/snowflake
/* validate a path as OK */
void validatePath(char **path)
{
    struct Buffer_char pathok;
    struct stat sbuf;
    char *rpath;

    if (!*path) return;

    /* first make sure it's absolute */
    if (**path != '/') {
        *path = NULL;
        return;
    }

    /* then get its real path (don't worry about deallocation, there aren't
     * many of these) */
    *path = realpath(*path, NULL);
    if (*path == NULL) return;

    /* then check the ok file */
    INIT_BUFFER(pathok);
    WRITE_BUFFER(pathok, *path, strlen(*path));
    WRITE_STR_BUFFER(pathok, OKFILE);
    WRITE_STR_BUFFER(pathok, "\0");
    if (stat(pathok.buf, &sbuf) < 0) {
        /* file not found or otherwise very bad, kill it */
        *path = NULL;
        FREE_BUFFER(pathok);
        return;
    }
    FREE_BUFFER(pathok);
    if (sbuf.st_uid != geteuid()) {
        /* wrong owner */
        *path = NULL;
        return;
    }

    /* it's valid */
}
コード例 #9
0
static int ReadHighResistance(struct synaptics_ts_data *ts)
{
	int MaxArrayLength = RxChNum * TxChNum * 2;
	int HighResistanceLowerLimit[3] = {-1000, -1000, -400};
	int HighResistanceUpperLimit[3] = {450, 450, 200};
	int maxRxpF, maxTxpF, minpF;
	int i = 0;
	int result = LGTC_SUCCESS;
	u8 cap_data[MaxArrayLength];
	short maxRx, maxTx, min;

	touch_i2c_read(ts->client, REPORT_DATA_REG, MaxArrayLength, cap_data);

	maxRx = ((short)cap_data[0] | (short)cap_data[1] << 8);
	maxTx = ((short)cap_data[2] | (short)cap_data[3] << 8);
	min = ((short)cap_data[4] | (short)cap_data[5] << 8);

	maxRxpF = maxRx;
	maxTxpF = maxTx;
	minpF = min;

	WRITE_BUFFER(f54_wlog_buf, "High Resistance Test\n");
	WRITE_BUFFER(f54_wlog_buf, "Max Rx Offset(pF) = %d\n", maxRxpF);
	WRITE_BUFFER(f54_wlog_buf, "Max Tx Offset(pF) = %d\n", maxTxpF);
	WRITE_BUFFER(f54_wlog_buf, "Min(pF) = %d\n", minpF);
	WRITE_BUFFER(f54_wlog_buf, "\n=====================================================\n");
	WRITE_BUFFER(f54_wlog_buf, "\tHigh Resistance Test\n");
	WRITE_BUFFER(f54_wlog_buf, "=====================================================\n");
	WRITE_BUFFER(f54_wlog_buf, " Parameters: ");
	WRITE_BUFFER(f54_wlog_buf, "%5d %5d %5d ", maxRxpF, maxTxpF, minpF);
	WRITE_BUFFER(f54_wlog_buf, "\n\n Limits(+) : ");

	for(i = 0; i < 3; i++)
		WRITE_BUFFER(f54_wlog_buf, "%5d ", HighResistanceUpperLimit[i]);

	WRITE_BUFFER(f54_wlog_buf, "\n Limits(-) : ");

	for(i = 0; i < 3; i++)
		WRITE_BUFFER(f54_wlog_buf, "%5d ", HighResistanceLowerLimit[i]);

	WRITE_BUFFER(f54_wlog_buf, "\n-----------------------------------------------------\n");

	if (maxRxpF > HighResistanceUpperLimit[0] || maxRxpF < HighResistanceLowerLimit[0])
		result = LGTC_FAIL;
	if (maxTxpF > HighResistanceUpperLimit[1] || maxTxpF < HighResistanceLowerLimit[1])
		result = LGTC_FAIL;
	if (minpF > HighResistanceUpperLimit[2] || minpF < HighResistanceLowerLimit[2])
		result = LGTC_FAIL;

	if (result == LGTC_FAIL)
		WRITE_BUFFER(f54_wlog_buf, "HighResistance Test failed.\n\n");
	else
		WRITE_BUFFER(f54_wlog_buf, "HighResistance Test passed.\n\n");

	write_log(NULL, f54_wlog_buf);

	return result;
}
コード例 #10
0
ファイル: usrview.c プロジェクト: GregorR/snowflake
int main(int argc, char **argv)
{
    struct Buffer_charp rpaths;
    struct Buffer_char options;
    char *wpath = NULL, *arg;
    char *envpaths;
    int i, j, argi, tmpi;
    unsigned long mountflags = 0;
    int allowclear = 0, clear = 0, userwpath = 1;

    INIT_BUFFER(rpaths);
    WRITE_ONE_BUFFER(rpaths, NULL); /* filled in by forced dir later */

    /* get all the paths out of the environment */
    envpaths = getenv(PATHENV);
    if (envpaths && envpaths[0]) {
        char *saveptr;
        arg = strtok_r(envpaths, ":", &saveptr);
        while (arg) {
            WRITE_ONE_BUFFER(rpaths, arg);
            arg = strtok_r(NULL, ":", &saveptr);
        }
    }

    /* get all the paths out of the args */
    for (argi = 1; argi < argc; argi++) {
        arg = argv[argi];
        if (arg[0] == '-') {
            if (!strcmp(arg, "-w") && argi < argc - 1) {
                argi++;
                wpath = argv[argi];

            } else if (!strcmp(arg, "-r")) {
                /* reset current paths (ignore environment) */
                rpaths.bufused = 1;
                allowclear = 1;

            } else if (!strcmp(arg, "--") && argi < argc - 1) {
                argi++;
                break;

            } else {
                fprintf(stderr, "Unrecognized option %s\n", arg);
            }

        } else {
            WRITE_ONE_BUFFER(rpaths, arg);

        }
    }
    if (argi >= argc) {
        if (getuid() != geteuid()) {
            fprintf(stderr, "Only root may remount an existing view\n");
            return 1;
        }
        mountflags |= MS_REMOUNT;
    }

    /* validate all our paths */
    for (i = 1; i < rpaths.bufused; i++) {
        validatePath(&rpaths.buf[i]);
    }
    validatePath(&wpath);
    rpaths.buf[0] = FORCEDIR;
    if (!wpath) {
        wpath = DEFAULTWRITEDIR;
        userwpath = 0;
    }

    /* make sure there are no duplicates */
    for (i = 1; i < rpaths.bufused; i++) {
        if (!rpaths.buf[i]) continue;
        if (!strcmp(rpaths.buf[i], wpath)) {
            rpaths.buf[i] = NULL;
            continue;
        }
        for (j = 0; j < i; j++) {
            if (rpaths.buf[j] &&
                !strcmp(rpaths.buf[i], rpaths.buf[j])) {
                rpaths.buf[i] = NULL;
                break;
            }
        }
    }

    /* are we trying to clear /usr? */
    if (rpaths.bufused == 1) {
        /* no options = unmount all */
        if (!allowclear) {
            fprintf(stderr, "To explicitly clear all /usr mounts, -r must be specified\n");
            return 1;
        }
        clear = 1;
    }

    /* perform the mount */
    if (!(mountflags & MS_REMOUNT))
        SF(tmpi, unshare, -1, (CLONE_NEWNS));
    if (clear) {
        do {
            tmpi = umount("/usr");
        } while (tmpi == 0);
        if (errno != EINVAL)
            perror("/usr");
    } else {
        /* first mount */
        INIT_BUFFER(options);
        WRITE_STR_BUFFER(options, "br:");
        WRITE_BUFFER(options, wpath, strlen(wpath) + 1);
        tmpi = mount("none", BASE, "aufs", mountflags, options.buf);
        if (tmpi == -1 && (mountflags & MS_REMOUNT)) {
            /* OK, we tried to remount, maybe it just wasn't mounted though */
            mountflags &= ~(MS_REMOUNT);
            tmpi = mount("none", BASE, "aufs", mountflags, options.buf);
        }

        /* remaining mounts */
        for (i = 0; tmpi != -1 && i < rpaths.bufused; i++) {
            if (!rpaths.buf[i]) continue;
            options.bufused = 0;
            WRITE_STR_BUFFER(options, "append:");
            WRITE_BUFFER(options, rpaths.buf[i], strlen(rpaths.buf[i]));
            if (!userwpath)
                WRITE_STR_BUFFER(options, "=rw");
            WRITE_STR_BUFFER(options, "\0");
            tmpi = mount("none", BASE, "aufs", mountflags|MS_REMOUNT, options.buf);
        }

        if (tmpi == -1) {
            perror("mount");
            return 1;
        }
    }

    /* drop privs */
    SF(tmpi, setuid, -1, (getuid()));
    SF(tmpi, setgid, -1, (getgid()));

    /* free our mount options */
    FREE_BUFFER(options);

    /* add it to the environment */
    INIT_BUFFER(options);
    for (i = 0; i < rpaths.bufused; i++) {
        arg = rpaths.buf[i];
        if (arg) {
            if (options.bufused) WRITE_STR_BUFFER(options, ":");
            WRITE_BUFFER(options, arg, strlen(arg));
        }
    }
    WRITE_STR_BUFFER(options, "\0");
    SF(tmpi, setenv, -1, (PATHENV, options.buf, 1));
    FREE_BUFFER(options);

    if (userwpath) {
        SF(tmpi, setenv, -1, (WRITEENV, wpath, 1));
    } else {
        SF(tmpi, unsetenv, -1, (WRITEENV));
    }

    /* then run it */
    if (argi < argc) {
        execvp(argv[argi], argv + argi);
        fprintf(stderr, "[usrview] ");
        perror(argv[argi]);

        return 1;

    } else {
        return 0;

    }
}
コード例 #11
0
ファイル: ast.c プロジェクト: GregorR/plof3
/* turn this PSL into a PSL AST */
struct PSLAstNode *pslToAst(unsigned char *psl, size_t psllen)
{
    size_t psli, si, curtemp;
    struct Buffer_PSLAstNode astout, aststack;
    struct PSLAstNode *cur;

    INIT_BUFFER(astout);
    INIT_BUFFER(aststack);
    curtemp = 1;

    /* make the arg */
    cur = allocPSLAstNode(pslast_arg, NULL, 0, 0, NULL);
    WRITE_BUFFER(aststack, &cur, 1);

    for (psli = 0; psli < psllen; psli++) {
        int arity = 0, pushes = 0;
        unsigned short cmd = psl[psli];
        unsigned char *data = NULL;
        size_t datasz = 0;

        /* maybe it has raw data */
        if (cmd >= psl_marker) {
            psli++;
            psli += pslBignumToInt(psl + psli, &datasz);

            /* make sure this doesn't go off the edge */
            if (psli + datasz <= psllen) {
                data = psl + psli;
                psli += datasz - 1;
            }
        }

        /* now get our arity info */
        switch (cmd) {
#define FOREACH(cmd)
#define LEAKY_PUSH(x)
#define ARITY(x) arity = x;
#define PUSHES(x) pushes = x;
#define LEAKA
#define LEAKB
#define LEAKC
#define LEAKP
#define LEAKALL
#include "psl-optim.c"
#undef FOREACH
#undef LEAKY_PUSH
#undef ARITY
#undef PUSHES
#undef LEAKA
#undef LEAKB
#undef LEAKC
#undef LEAKP
#undef LEAKALL

        default:
            arity = 0;
            pushes = 0;
        }

        /* if this has data, but the data is actually code, need to put that in place */
        if (cmd == psl_code || cmd == psl_immediate) {
            cur = pslToAst(data, datasz);
            data = NULL;
            datasz = 0;
            WRITE_BUFFER(aststack, &cur, 1);
            arity++;
        }

        /* if we need to flatten the stack (we're duplicating or removing stack elements), do so */
        if ((cmd >= psl_push0 && cmd <= psl_push7) || pushes != 1) {
            struct Buffer_PSLAstNode naststack;
            INIT_BUFFER(naststack);

            for (si = 0; si < aststack.bufused; si++) {
                if (aststack.buf[si]->cmd == pslast_gettemp) {
                    /* just copy it */
                    WRITE_BUFFER(naststack, aststack.buf + si, 1);

                } else {
                    cur = allocPSLAstNode(pslast_settemp, NULL, 0,
                                          1, aststack.buf + si);
                    cur->temp0 = curtemp;
                    WRITE_BUFFER(astout, &cur, 1);

                    cur = allocPSLAstNode(pslast_gettemp, NULL, 0,
                                          0, NULL);
                    cur->temp0 = curtemp;
                    WRITE_BUFFER(naststack, &cur, 1);

                    curtemp++;
                }
            }

            /* now replace aststack with the new one */
            aststack = naststack;
        }

        /* replace pushes by gettemps */
        if (cmd >= psl_push0 && cmd <= psl_push7) {
            int depth = cmd - psl_push0;
            if (aststack.bufused < depth + 1) {
                cur = allocPSLAstNode(psl_null, NULL, 0, 0, NULL);
            } else {
                cur = BUFFER_END(aststack)[-depth-1];
            }

            WRITE_BUFFER(aststack, &cur, 1);

            /* just perform pops */
        } else if (cmd == psl_pop) {
            if (aststack.bufused > 0)
                aststack.bufused--;

            /* resolve is weird */
        } else {
            /* figure out the mixed arity of an array */
            if (cmd == psl_array) {
                arity = 1;
                if (aststack.bufused > 0 && BUFFER_TOP(aststack)->cmd == psl_integer) {
                    /* OK, good, there's an integer. If it makes sense, get the value */
                    cur = BUFFER_TOP(aststack);
                    if (cur->children[0]->cmd == psl_raw) {
                        /* hooplah! Get the int val*/
                        struct PlofRawData *rd;
                        ptrdiff_t val;
                        cur = cur->children[0];
                        rd = newPlofRawDataNonAtomic(cur->datasz);
                        memcpy(rd->data, cur->data, cur->datasz);

                        val = parseRawInt(rd);

                        /* and extend the arity */
                        if (val > 0) arity += val;
                    }
                }
            }

            /* make sure we have all the children */
            while (aststack.bufused < arity) {
                /* need to put nulls at the start */
                while (BUFFER_SPACE(aststack) < 1) EXPAND_BUFFER(aststack);
                memmove(aststack.buf + 1, aststack.buf, aststack.bufused * sizeof(struct PSLAstNode *));
                aststack.buf[0] = allocPSLAstNode(psl_null, NULL, 0, 0, NULL);
                aststack.bufused++;
            }

            /* and create the current one */
            cur = allocPSLAstNode(cmd, data, datasz, arity, BUFFER_END(aststack) - arity);
            aststack.bufused -= arity;

            /* handle resolve's weird push */
            if (cmd == psl_resolve) {
                struct PSLAstNode *tmp;
                tmp = allocPSLAstNode(pslast_gettemp, NULL, 0, 0, NULL);
                tmp->temp0 = curtemp;
                WRITE_BUFFER(aststack, &tmp, 1);

                tmp = allocPSLAstNode(pslast_gettemp, NULL, 0, 0, NULL);
                tmp->temp0 = curtemp + 1;
                WRITE_BUFFER(aststack, &tmp, 1);

                cur->temp0 = curtemp;
                cur->temp1 = curtemp + 1;

                curtemp += 2;
            }

            /* put it either on the stack or in our instruction list */
            if (pushes == 1) {
                WRITE_BUFFER(aststack, &cur, 1);
            } else {
                WRITE_BUFFER(astout, &cur, 1);
            }

            /* FIXME: array, resolve special */
        }
    }

    WRITE_BUFFER(astout, aststack.buf, aststack.bufused);
    return allocPSLAstNode(pslast_seq, NULL, 0, astout.bufused, astout.buf);
}
コード例 #12
0
ファイル: MeshLoader.cpp プロジェクト: hlrs-vis/osgcal
void saveMeshes( const CalCoreModel* calCoreModel,
                 const MeshesVector& meshes,
                 const std::string&  fn )
    throw (std::runtime_error)
{
    FILE* f = fopen( fn.c_str(), "wb" );

    if ( f == NULL )
    {
        throw std::runtime_error( "Can't create " + fn );
    }

    FileCloser closeOnExit( f );
//    FileBuffer setReadBufferOfSize( f, 1*1024*1024 );

    WRITE_I32( HW_MODEL_FILE_VERSION );

    // -- Write meshes --
    WRITE_I32( meshes.size() );

    for ( size_t i = 0; i < meshes.size(); i++ )
    {
        MeshData* m = meshes[i].get();

        // -- Write name --
        const std::string& name = m->name;
        WRITE_I32( name.size() );
        WRITE_( m->name, name.data(), name.size() );

        // -- Write material --
        int coreMaterialThreadId = getCoreMaterialThreadId(
            const_cast< CalCoreModel* >( calCoreModel ), m->coreMaterial );
        if ( coreMaterialThreadId < 0 )
        {
            fclose( f );
            throw std::runtime_error( "Can't get coreMaterialThreadId (mesh.pCoreMaterial not found in coreModel?" );            
        }
        WRITE_I32( coreMaterialThreadId );

        // -- Read bone parameters --
        WRITE_I32( m->rigid );
        WRITE_I32( m->rigidBoneId );
        WRITE_I32( m->maxBonesInfluence );

        // -- Read bonesIndices --
        WRITE_I32( m->bonesIndices.size() );
        for ( size_t bi = 0; bi < m->bonesIndices.size(); bi++ )
        {
            WRITE_I32( m->bonesIndices[ bi ] );
        }

        // -- Write boundingBox --
        assert( sizeof ( m->boundingBox ) == 6 * 4 ); // must be 6 floats
        WRITE_STRUCT( m->boundingBox );
    }

#define WRITE_BUFFER( _bufferType, _buffer )    \
    if ( m->_buffer.valid() )                   \
    {                                           \
        WRITE_I32( i );                         \
        WRITE_I32( _bufferType );               \
        WRITE_I32( m->_buffer->size() );        \
        WRITE( m->_buffer )                     \
    }

    // -- Write resident mesh buffers --
    for ( size_t i = 0; i < meshes.size(); i++ )
    {
        MeshData* m = meshes[i].get();

        WRITE_I32( i );
        switch ( m->indexBuffer->getType() )
        {
            case osg::PrimitiveSet::DrawElementsUBytePrimitiveType:
                WRITE_I32( BT_INDEX + ET_UBYTE );
                break;

            case osg::PrimitiveSet::DrawElementsUShortPrimitiveType:
                WRITE_I32( BT_INDEX + ET_USHORT );
                break;

            case osg::PrimitiveSet::DrawElementsUIntPrimitiveType:
                WRITE_I32( BT_INDEX + ET_UINT );
                break;

            default:
                throw std::runtime_error( "unsupported indexBuffer type?" );

        }
        WRITE_I32( m->getIndicesCount() );
        WRITE( m->indexBuffer );
        
        WRITE_BUFFER( BT_VERTEX, vertexBuffer );
        WRITE_BUFFER( BT_WEIGHT, weightBuffer );
        WRITE_BUFFER( BT_MATRIX_INDEX, matrixIndexBuffer );
    }

    // -- Write mesh buffers that will be freed after display list created --
    for ( size_t i = 0; i < meshes.size(); i++ )
    {
        MeshData* m = meshes[i].get();

        WRITE_BUFFER ( BT_NORMAL, normalBuffer );
        WRITE_BUFFER ( BT_TEX_COORD, texCoordBuffer );
        WRITE_BUFFER ( BT_TANGENT_AND_HANDEDNESS, tangentAndHandednessBuffer );
    }

#undef WRITE_BUFFER
}
コード例 #13
0
ファイル: pslast.c プロジェクト: GregorR/plof3
int main(int argc, char **argv)
{
    FILE *fh;
    struct Buffer_psl file;
    char *filenm = NULL, *arg;
    struct Buffer_psl psl;
    int i, dot;
    struct PSLAstNode *ast;

    GC_INIT();

    dot = 0;
    for (i = 1; i < argc; i++) {
        arg = argv[i];
        if (arg[0] == '-') {
            if (!strcmp(arg, "-d")) {
                dot = 1;
            } else {
                usage();
                return 1;
            }
        } else {
            filenm = arg;
        }
    }

    if (filenm == NULL) {
        usage();
        return 1;
    }

    /* load in the file */
    INIT_BUFFER(file);

    /* find the file */
    fh = fopen(filenm, "rb");
    if (fh == NULL) {
        perror(filenm);
        return 1;
    }

    /* read it */
    READ_FILE_BUFFER(file, fh);
    WRITE_BUFFER(file, "\0", 1);
    file.bufused--;
    fclose(fh);

    /* FIXME: bounds checking */

    /* check what type of file it is */
    psl = readPSLFile(file.bufused, file.buf);

    ast = pslToAst(psl.buf, psl.bufused);
    if (!dot) {
        dumpPSLAst(stdout, ast, 0);
    } else {
        printf("digraph {\nnodesep=0;\nranksep=0;\n");
        dumpPSLAstDot(stdout, ast);
        printf("}\n");
    }
    return 0;
}
コード例 #14
0
static GstFlowReturn
gst_tta_dec_chain (GstPad * pad, GstBuffer * in)
{
  GstTtaDec *ttadec;
  GstBuffer *outbuf, *buf = GST_BUFFER (in);
  guchar *data, *p;
  decoder *dec;
  unsigned long outsize;
  unsigned long size;
  guint32 frame_samples;
  long res;
  long *prev;

  ttadec = GST_TTA_DEC (GST_OBJECT_PARENT (pad));

  data = GST_BUFFER_DATA (buf);
  size = GST_BUFFER_SIZE (buf);

  ttadec->tta_buf.bit_count = 0;
  ttadec->tta_buf.bit_cache = 0;
  ttadec->tta_buf.bitpos = ttadec->tta_buf.buffer_end;
  ttadec->tta_buf.offset = 0;
  decoder_init (ttadec->tta, ttadec->channels, ttadec->bytes);

  if (GST_BUFFER_DURATION_IS_VALID (buf)) {
    frame_samples =
        ceil ((gdouble) (GST_BUFFER_DURATION (buf) * ttadec->samplerate) /
        (gdouble) GST_SECOND);
  } else {
    frame_samples = ttadec->samplerate * FRAME_TIME;
  }
  outsize = ttadec->channels * frame_samples * ttadec->bytes;

  dec = ttadec->tta;
  p = ttadec->decdata;
  prev = ttadec->cache;
  for (res = 0;
      p < ttadec->decdata + frame_samples * ttadec->channels * ttadec->bytes;) {
    unsigned long unary, binary, depth, k;
    long value, temp_value;
    fltst *fst = &dec->fst;
    adapt *rice = &dec->rice;
    long *last = &dec->last;

    // decode Rice unsigned
    get_unary (&ttadec->tta_buf, data, size, &unary);

    switch (unary) {
      case 0:
        depth = 0;
        k = rice->k0;
        break;
      default:
        depth = 1;
        k = rice->k1;
        unary--;
    }

    if (k) {
      get_binary (&ttadec->tta_buf, data, size, &binary, k);
      value = (unary << k) + binary;
    } else
      value = unary;

    switch (depth) {
      case 1:
        rice->sum1 += value - (rice->sum1 >> 4);
        if (rice->k1 > 0 && rice->sum1 < shift_16[rice->k1])
          rice->k1--;
        else if (rice->sum1 > shift_16[rice->k1 + 1])
          rice->k1++;
        value += bit_shift[rice->k0];
      default:
        rice->sum0 += value - (rice->sum0 >> 4);
        if (rice->k0 > 0 && rice->sum0 < shift_16[rice->k0])
          rice->k0--;
        else if (rice->sum0 > shift_16[rice->k0 + 1])
          rice->k0++;
    }

    /* this only uses a temporary variable to silence a gcc warning */
    temp_value = DEC (value);
    value = temp_value;

    // decompress stage 1: adaptive hybrid filter
    hybrid_filter (fst, &value);

    // decompress stage 2: fixed order 1 prediction
    switch (ttadec->bytes) {
      case 1:
        value += PREDICTOR1 (*last, 4);
        break;                  // bps 8
      case 2:
        value += PREDICTOR1 (*last, 5);
        break;                  // bps 16
      case 3:
        value += PREDICTOR1 (*last, 5);
        break;                  // bps 24
      case 4:
        value += *last;
        break;                  // bps 32
    }
    *last = value;

    if (dec < ttadec->tta + ttadec->channels - 1) {
      *prev++ = value;
      dec++;
    } else {
      *prev = value;
      if (ttadec->channels > 1) {
        long *r = prev - 1;

        for (*prev += *r / 2; r >= ttadec->cache; r--)
          *r = *(r + 1) - *r;
        for (r = ttadec->cache; r < prev; r++)
          WRITE_BUFFER (r, ttadec->bytes, p);
      }
      WRITE_BUFFER (prev, ttadec->bytes, p);
      prev = ttadec->cache;
      res++;
      dec = ttadec->tta;
    }
  }

  outbuf = gst_buffer_new_and_alloc (outsize);
  memcpy (GST_BUFFER_DATA (outbuf), ttadec->decdata, outsize);
  GST_BUFFER_TIMESTAMP (outbuf) = GST_BUFFER_TIMESTAMP (buf);
  GST_BUFFER_DURATION (outbuf) = GST_BUFFER_DURATION (buf);
  gst_buffer_set_caps (outbuf, GST_PAD_CAPS (ttadec->srcpad));
  return gst_pad_push (ttadec->srcpad, outbuf);
}
コード例 #15
0
// Construct data with Report Type #20 data
static int ReadRawData(struct synaptics_ts_data *ts)
{
	int MaxArrayLength = RxChNum * TxChNum * 2;
	int i,j,k = 0;
	int result = LGTC_SUCCESS;
	u8 cap_data[MaxArrayLength];

	touch_i2c_read(ts->client, REPORT_DATA_REG, MaxArrayLength, cap_data);

	WRITE_BUFFER(f54_wlog_buf, "Full Raw Capacitance Test\n");
	WRITE_BUFFER(f54_wlog_buf, "\nInfo: Tx = %d Rx = %d \n", TxChNum, RxChNum);
	WRITE_BUFFER(f54_wlog_buf, "Image Data : \n");
	WRITE_BUFFER(f54_wlog_buf, "==========================================================================================================\n         :");

	for (i = 0; i < RxChNum; i++)
		WRITE_BUFFER(f54_wlog_buf, "%5d ", i);

	WRITE_BUFFER(f54_wlog_buf, "\n----------------------------------------------------------------------------------------------------------\n");

	for (i = 0; i < TxChNum; i++) {
		WRITE_BUFFER(f54_wlog_buf, "   %5d : ", i);
		for (j = 0; j < RxChNum; j++) {
			full_raw_data[i][j] = ((short)cap_data[k] | (short)cap_data[k+1] << 8);

			WRITE_BUFFER(f54_wlog_buf, "%5d ", full_raw_data[i][j]);
			k = k + 2;
		}
		WRITE_BUFFER(f54_wlog_buf, "\n");
	}
	WRITE_BUFFER(f54_wlog_buf, "------------------------------------------------------------------------------------------------------------\n");

	//Compare 2D area
	for (j = 0; j < RxChNum; j++) {
		for (i = 0; i < TxChNum; i++) {
			if ((full_raw_data[i][j] < LowerImageLimit[i][j]) || (full_raw_data[i][j] > UpperImageLimit[i][j])) {
				WRITE_BUFFER(f54_wlog_buf, "FAIL, %d,%d,%d\n", LowerImageLimit[i][j], UpperImageLimit[i][j], full_raw_data[i][j]);
				result = LGTC_FAIL;
				break;
			}
		}
	}

	if (result == LGTC_SUCCESS)
		WRITE_BUFFER(f54_wlog_buf, "\nFull Raw Capacitance Image Test passed.\n\n");
	else
		WRITE_BUFFER(f54_wlog_buf, "\nFull Raw Capacitance Image Test failed.\n\n");

	write_log(NULL, f54_wlog_buf);

	return result;
}
コード例 #16
0
ファイル: errorhandler.c プロジェクト: adaptee/fcitx
void OnException(int signo)
{
    if (signo == SIGCHLD)
        return;


#define WRITE_STRING_LEN(STR, LEN) \
    do { \
        write(STDERR_FILENO, (STR), (LEN)); \
        if (fd) \
            write(fd, (STR), (LEN)); \
    } while(0)

#define WRITE_STRING(STR) \
    WRITE_STRING_LEN(STR, (sizeof(STR) - sizeof(STR[0])))

#define WRITE_BUFFER(BUFFER) \
    WRITE_STRING_LEN((BUFFER).buffer, (BUFFER).offset)

    MinimalBuffer buffer;

    int fd = 0;

    if (crashlog && (signo == SIGSEGV || signo == SIGABRT || signo == SIGKILL))
        fd = open(crashlog, O_WRONLY | O_CREAT | O_TRUNC, 0644);

    /* print signal info */
    BufferReset(&buffer);
    BufferAppendUInt64(&buffer, signo, 10);
    WRITE_STRING("=========================\n");
    WRITE_STRING("FCITX " VERSION " -- Get Signal No.: ");
    WRITE_BUFFER(buffer);
    WRITE_STRING("\n");

    /* print time info */
    time_t t = time(NULL);
    BufferReset(&buffer);
    BufferAppendUInt64(&buffer, t, 10);
    WRITE_STRING("Date: try \"date -d @");
    WRITE_BUFFER(buffer);
    WRITE_STRING("\" if you are using GNU date ***\n");

    /* print process info */
    BufferReset(&buffer);
    BufferAppendUInt64(&buffer, getpid(), 10);
    WRITE_STRING("ProcessID: ");
    WRITE_BUFFER(buffer);
    WRITE_STRING("\n");

#if defined(ENABLE_BACKTRACE)
#define BACKTRACE_SIZE 32
    void *array[BACKTRACE_SIZE] = {NULL, };

    int size = backtrace(array, BACKTRACE_SIZE);
    backtrace_symbols_fd(array, size, STDERR_FILENO);
    if (fd)
        backtrace_symbols_fd(array, size, fd);
#endif

    if (fd)
        close(fd);

    switch (signo) {
    case SIGKILL:
        break;
    case SIGABRT:
    case SIGSEGV:
    case SIGBUS:
    case SIGILL:
    case SIGFPE:
        exit(1);
        break;

    default:
        {
            if (!instance || !instance->initialized) {
                exit(1);
                break;
            }

            uint8_t sig = 0;
            if (signo < 0xff)
                sig = (uint8_t)(signo & 0xff);
            write(selfpipe[1], &sig, 1);
            signal(signo, OnException);
        }
        break;
    }
}
コード例 #17
0
ファイル: unparse.c プロジェクト: GregorR/exc
static void unparsePrime(struct Buffer_char *buf,
                         struct Buffer_charp *filenames,
                         size_t *lastFile,
                         Node *node)
{
    size_t i;

    if (node->tok) {
        Token *tok = node->tok;

        if (tok->f != *lastFile) {
            /* first get out any comments that come before the final newline */
            char *fnl;
            fnl = tok->pre ? strrchr(tok->pre, '\n') : NULL;
            if (fnl)
                WRITE_BUFFER(*buf, tok->pre, fnl - tok->pre);

            /* we're in a different file, write a #line directive */
            if ((tok->f != (size_t) -1) && filenames) {
                char *lnum;
                SF(lnum, malloc, NULL, (4*sizeof(int) + 1));
                sprintf(lnum, "%d", (int) tok->l);

                WRITE_BUFFER(*buf, "\n#line ", 7);
                WRITE_BUFFER(*buf, lnum, strlen(lnum));
                free(lnum);
                WRITE_BUFFER(*buf, " \"", 2);
                if (tok->f < filenames->bufused) {
                    WRITE_BUFFER(*buf, filenames->buf[tok->f], strlen(filenames->buf[tok->f]));
                } else {
                    WRITE_BUFFER(*buf, "???", 3);
                }
                WRITE_BUFFER(*buf, "\"\n", 2);
            } else if (fnl) {
                WRITE_ONE_BUFFER(*buf, '\n');
            }

            *lastFile = tok->f;

            /* now write out the remainder of the comment */
            if (fnl) {
                WRITE_BUFFER(*buf, fnl + 1, strlen(fnl + 1));
            } else if (tok->pre) {
                WRITE_BUFFER(*buf, tok->pre, strlen(tok->pre));
            }

        } else if (tok->pre) {
            WRITE_BUFFER(*buf, tok->pre, strlen(tok->pre));
        }

        if (tok->tok)
            WRITE_BUFFER(*buf, tok->tok, strlen(tok->tok));
    }

    for (i = 0; node->children[i]; i++) {
        unparsePrime(buf, filenames, lastFile, node->children[i]);
    }
}