コード例 #1
0
ファイル: scanner.cpp プロジェクト: it3ration/opcpp
// basic type - labels all ISO standard/microsoft basic types
// with an id of T_BASIC_TYPE
void opScanner::BasicType() {
    opList<opToken>::iterator one = Tokens.Begin();
    opList<opToken>::iterator end = Tokens.End();
    opList<opToken>::iterator two;
    opList<opToken>::iterator three;

    while (one != end) {
        if (IsBasicType(one->Value)) one->Id = T_BASIC_TYPE;

        ++one;
    }

    if (Tokens.HasSize(3)) {
        one = Tokens.Begin();
        two = ++Tokens.Begin();
        three = ++(++Tokens.Begin());

        while (three != end) {
            if (one->Id == T_BASIC_TYPE && two->Id == T_WHITESPACE &&
                three->Id == T_BASIC_TYPE &&
                IsBasicType(one->Value + " " + three->Value)) {
                one->Value += opString(" ") + three->Value;

                Tokens.Erase(two);
                Tokens.Erase(three);
                two = one;
                ++two;
                three = two;
                ++three;
                continue;
            }

            ++one;
            ++two;
            ++three;
        }
    }
}
コード例 #2
0
ファイル: aj_msg.c プロジェクト: reignme/ajtcl
AJ_Arg* AJ_InitArg(AJ_Arg* arg, uint8_t typeId, uint8_t flags, const void* val, size_t len)
{
    if (!IsBasicType(typeId)) {
        memset(arg, 0, sizeof(AJ_Arg));
        return NULL;
    } else {
        arg->typeId = typeId;
        arg->flags = flags;
        arg->len = (uint16_t)len;
        arg->val.v_data = (void*)val;
        arg->sigPtr = NULL;
        arg->container = NULL;
        return arg;
    }
}
コード例 #3
0
ファイル: aj_msg.c プロジェクト: reignme/ajtcl
AJ_Status AJ_UnmarshalArgs(AJ_Message* msg, const char* sig, ...)
{
    AJ_Status status = AJ_OK;
    AJ_Arg arg;
    va_list argp;

    va_start(argp, sig);
    while (*sig) {
        uint8_t typeId = (uint8_t)*sig++;
        void* val = va_arg(argp, void*);

        if (!IsBasicType(typeId)) {
            status = AJ_ERR_UNEXPECTED;
            break;
        }
        status = AJ_UnmarshalArg(msg, &arg);
        if (status != AJ_OK) {
            break;
        }
        if (arg.typeId != typeId) {
            status = AJ_ERR_UNMARSHAL;
            break;
        }
        if (IsScalarType(typeId)) {
            switch (SizeOfType(typeId)) {
            case 1:
                *((uint8_t*)val) = *arg.val.v_byte;
                break;

            case 2:
                *((uint16_t*)val) = *arg.val.v_uint16;
                break;

            case 4:
                *((uint32_t*)val) = *arg.val.v_uint32;
                break;

            case 8:
                *((uint64_t*)val) = *arg.val.v_uint64;
                break;
            }
        } else {
            *((const char**)val) = arg.val.v_string;
        }
    }
    va_end(argp);
    return status;
}
コード例 #4
0
ファイル: aj_msg.c プロジェクト: reignme/ajtcl
AJ_Status AJ_MarshalArgs(AJ_Message* msg, const char* sig, ...)
{
    AJ_Status status = AJ_OK;
    AJ_Arg arg;
    va_list argp;

    va_start(argp, sig);
    while (*sig) {
        uint8_t u8;
        uint16_t u16;
        uint32_t u32;
        uint64_t u64;
        uint8_t typeId = (uint8_t)*sig++;
        void* val;
        if (!IsBasicType(typeId)) {
            status = AJ_ERR_UNEXPECTED;
            break;
        }
        if (IsScalarType(typeId)) {
            if (SizeOfType(typeId) == 8) {
                u64 = va_arg(argp, uint64_t);
                val = &u64;
            } else if (SizeOfType(typeId) == 4) {
                u32 = va_arg(argp, uint32_t);
                val = &u32;
            } else if (SizeOfType(typeId) == 2) {
                u16 = (uint16_t)va_arg(argp, uint32_t);
                val = &u16;
            } else {
                u8 = (uint8_t)va_arg(argp, uint32_t);
                val = &u8;
            }
        } else {
            val = va_arg(argp, char*);
        }
        InitArg(&arg, typeId, val);
        status = AJ_MarshalArg(msg, &arg);
        if (status != AJ_OK) {
            break;
        }
    }
    va_end(argp);
    return status;
}