Example #1
0
UBool
AffixPatternIterator::nextToken() {
    int32_t tlen = tokens->length();
    if (nextTokenIndex == tlen) {
        return FALSE;
    }
    ++nextTokenIndex;
    const UChar *tokenBuffer = tokens->getBuffer();
    if (UNPACK_TOKEN(tokenBuffer[nextTokenIndex - 1]) ==
            AffixPattern::kLiteral) {
        while (nextTokenIndex < tlen &&
                UNPACK_LONG(tokenBuffer[nextTokenIndex])) {
            ++nextTokenIndex;
        }
        lastLiteralLength = 0;
        int32_t i = nextTokenIndex - 1;
        for (; UNPACK_LONG(tokenBuffer[i]); --i) {
            lastLiteralLength <<= 8;
            lastLiteralLength |= UNPACK_LENGTH(tokenBuffer[i]);
        }
        lastLiteralLength <<= 8;
        lastLiteralLength |= UNPACK_LENGTH(tokenBuffer[i]);
        nextLiteralIndex += lastLiteralLength;
    }
    return TRUE;
}
Example #2
0
File: ctrans.c Project: ariavie/bcm
bcm_rx_t
ab_echo_cb(cpudb_key_t src_key,
           int client_id,
           bcm_pkt_t *pkt,
           uint8 *payload,
           int payload_len,
           void *cookie)
{
    uint16 depth;
    int async_free;
    uint32 pkt_flags;
    bcm_rx_t rv = BCM_RX_HANDLED;
    int offset = 0;
    int mode;
    int len;
    CallbackOptions *options = (CallbackOptions *)cookie;

    if (payload == NULL) {  /* Just use first segment for string */
        if (pkt == NULL) {
            cli_out("CT echo error: payload and pkt both NULL, cli %d\n",
                    client_id);
            return BCM_RX_NOT_HANDLED;
        }
        payload = pkt->pkt_data[1].data;
        len = pkt->pkt_data[1].len;
        cli_out("CT echo warning: \n");
        cli_out("   Segmented packet; segmentation not maintained on echo\n");
    } else {
        len = payload_len;
    }

    UNPACK_SHORT(payload, depth);
    offset += sizeof(uint16);
    UNPACK_LONG(payload + offset, pkt_flags);
    offset += sizeof(uint32);
    async_free = pkt_flags & CTE_FLAGS_ASYNC_FREE;
    mode = client_id - ECHO_BASE_CLI_ID;

    if (mode < 0 || mode > 4) {
        cli_out("CT echo error: Bad client id: %d\n", client_id);
        return BCM_RX_NOT_HANDLED;
    }

    if (sal_strlen((char *)&payload[offset]) > len) {
        cli_out("CT echo error: Unterminated string in first segment\n");
        return BCM_RX_HANDLED;
    }

    if (_shr_crc32(~0, payload, len) != _SHR_CRC32_CORRECT) {
        cli_out("CT echo error: Echo payload CRC failure.\n");
    }
    
    if (options->verbose) {
        cli_out("%s echo request from " CPUDB_KEY_FMT ": %s\n",
                cte_mode_list[mode],
                CPUDB_KEY_DISP(src_key),
                &payload[offset]);
        cli_out("       Depth %d, flags 0x%x, len %d. (total %d)\n",
                depth, pkt_flags, len - offset, payload_len);
    }

    if (depth > 0) {
        /* Return echo: one less depth, clear async flag */
        pkt_flags &= ~CTE_FLAGS_ASYNC_FREE;
        pkt_flags &= ~CTE_FLAGS_CRC_REGEN;
        _send_echo_pkt(client_id, payload, len, depth - 1,
                       pkt_flags, mode, options->verbose, src_key, NULL);
    }

    if (async_free) {
        rv = BCM_RX_HANDLED_OWNED;
        sal_dpc(echo_free_buf, payload, pkt, NULL, NULL, NULL);
    } else {
        rv = BCM_RX_HANDLED;
    }

    return rv;
}