// 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; } } }
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; } }
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; }
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; }