?? cs-ucs-4.cc
字號:
_CORBA_ULong tc; omniCodeSet::UniChar uc; for (_CORBA_ULong i=0; i < len; i++) { uc = us[i]; if (uc < 0xd800) { tc = uc; } else if (uc < 0xdc00) { // Surrogate pair tc = (uc - 0xd800) << 10; if (++i == len) { // No second half to surrogate pair OMNIORB_THROW(DATA_CONVERSION, DATA_CONVERSION_BadInput, (CORBA::CompletionStatus)stream.completion()); } uc = us[i]; if (uc < 0xdc00 || uc > 0xdfff) { // Value is not a valid second half to a surrogate pair OMNIORB_THROW(DATA_CONVERSION, DATA_CONVERSION_BadInput, (CORBA::CompletionStatus)stream.completion()); } tc = tc + uc - 0xdc00 + 0x10000; } else if (uc < 0xe000) { // Second half of surrogate pair not allowed on its own OMNIORB_THROW(DATA_CONVERSION, DATA_CONVERSION_BadInput, (CORBA::CompletionStatus)stream.completion()); tc = 0; // To shut paranoid compilers up } else { tc = uc; } tc >>= stream; }}omniCodeSet::UniCharTCS_W_UCS_4::unmarshalWChar(cdrStream& stream){ omniCodeSet::UniChar uc; _CORBA_Octet len = stream.unmarshalOctet(); _CORBA_Octet o; switch (len) { case 0: uc = 0; // Evil but it might happen, I suppose break; case 1: o = stream.unmarshalOctet(); uc = o; break; case 2: { _CORBA_Octet* p = (_CORBA_Octet*)&uc; if (stream.unmarshal_byte_swap()) { o = stream.unmarshalOctet(); p[1] = o; o = stream.unmarshalOctet(); p[0] = o; } else { o = stream.unmarshalOctet(); p[0] = o; o = stream.unmarshalOctet(); p[1] = o; } } break; case 4: { _CORBA_ULong tc; _CORBA_Octet* p = (_CORBA_Octet*)&tc; if (stream.unmarshal_byte_swap()) { o = stream.unmarshalOctet(); p[3] = o; o = stream.unmarshalOctet(); p[2] = o; o = stream.unmarshalOctet(); p[1] = o; o = stream.unmarshalOctet(); p[0] = o; } else { o = stream.unmarshalOctet(); p[0] = o; o = stream.unmarshalOctet(); p[1] = o; o = stream.unmarshalOctet(); p[2] = o; o = stream.unmarshalOctet(); p[3] = o; } if (tc > 0xffff) OMNIORB_THROW(DATA_CONVERSION, DATA_CONVERSION_CannotMapChar, (CORBA::CompletionStatus)stream.completion()); uc = tc; } break; default: OMNIORB_THROW(MARSHAL, MARSHAL_InvalidWCharSize, (CORBA::CompletionStatus)stream.completion()); } return uc;}_CORBA_ULongTCS_W_UCS_4::unmarshalWString(cdrStream& stream, _CORBA_ULong bound, omniCodeSet::UniChar*& us){ _CORBA_ULong mlen; mlen <<= stream; if (mlen % 4) OMNIORB_THROW(MARSHAL, MARSHAL_InvalidWCharSize, (CORBA::CompletionStatus)stream.completion()); _CORBA_ULong len = mlen / 4; // Note no terminating null in marshalled form if (bound && len > bound) OMNIORB_THROW(MARSHAL, MARSHAL_WStringIsTooLong, (CORBA::CompletionStatus)stream.completion()); if (!stream.checkInputOverrun(1, mlen)) OMNIORB_THROW(MARSHAL, MARSHAL_PassEndOfMessage, (CORBA::CompletionStatus)stream.completion()); omniCodeSetUtil::BufferU ub(len + 1); _CORBA_ULong tc; _CORBA_ULong i; for (i=0; i < len; i++) { tc <<= stream; if (tc <= 0xffff) { ub.insert(tc); } else if (tc <= 0x10ffff) { // Surrogate pair tc -= 0x10000; ub.insert((tc >> 10) + 0xd800); ub.insert((tc & 0x3ff) + 0xdc00); } else OMNIORB_THROW(DATA_CONVERSION, DATA_CONVERSION_CannotMapChar, (CORBA::CompletionStatus)stream.completion()); } ub.insert(0); // Null terminator us = ub.extract(); return ub.length() - 1;}_CORBA_BooleanTCS_W_UCS_4::fastMarshalWChar(cdrStream& stream, omniCodeSet::NCS_W* ncs, _CORBA_WChar wc){ if (ncs->id() == id()) { // Null transformation stream.marshalOctet(4); _CORBA_Octet* p = (_CORBA_Octet*)&wc; _CORBA_Octet o; if (stream.marshal_byte_swap()) { o = p[3]; stream.marshalOctet(o); o = p[2]; stream.marshalOctet(o); o = p[1]; stream.marshalOctet(o); o = p[0]; stream.marshalOctet(o); } else { o = p[0]; stream.marshalOctet(o); o = p[1]; stream.marshalOctet(o); o = p[2]; stream.marshalOctet(o); o = p[3]; stream.marshalOctet(o); } return 1; } return 0;}_CORBA_BooleanTCS_W_UCS_4::fastMarshalWString(cdrStream& stream, omniCodeSet::NCS_W* ncs, _CORBA_ULong bound, _CORBA_ULong len, const _CORBA_WChar* ws){ if (ncs->id() == id()) { // Null transformation if (bound && len > bound) OMNIORB_THROW(MARSHAL, MARSHAL_WStringIsTooLong, (CORBA::CompletionStatus)stream.completion()); _CORBA_ULong mlen = len * 4; mlen >>= stream; if (stream.marshal_byte_swap()) { _CORBA_ULong tc; for (_CORBA_ULong i=0; i<len; i++) { tc = ws[i]; tc >>= stream; } } else { stream.put_octet_array((const _CORBA_Char*)ws, mlen, omni::ALIGN_4); } return 1; } return 0;}_CORBA_BooleanTCS_W_UCS_4::fastUnmarshalWChar(cdrStream& stream, omniCodeSet::NCS_W* ncs, _CORBA_WChar& wc){ if (ncs->id() == id()) { // Null transformation _CORBA_Octet len = stream.unmarshalOctet(); _CORBA_Octet o; switch (len) { case 0: wc = 0; // Evil but it might happen, I suppose break; case 1: o = stream.unmarshalOctet(); wc = o; break; case 2: { _CORBA_UShort tc; _CORBA_Octet* p = (_CORBA_Octet*)&tc; if (stream.unmarshal_byte_swap()) { o = stream.unmarshalOctet(); p[1] = o; o = stream.unmarshalOctet(); p[0] = o; } else { o = stream.unmarshalOctet(); p[0] = o; o = stream.unmarshalOctet(); p[1] = o; } wc = tc; } break; case 4: { _CORBA_Octet* p = (_CORBA_Octet*)&wc; if (stream.unmarshal_byte_swap()) { o = stream.unmarshalOctet(); p[3] = o; o = stream.unmarshalOctet(); p[2] = o; o = stream.unmarshalOctet(); p[1] = o; o = stream.unmarshalOctet(); p[0] = o; } else { o = stream.unmarshalOctet(); p[0] = o; o = stream.unmarshalOctet(); p[1] = o; o = stream.unmarshalOctet(); p[2] = o; o = stream.unmarshalOctet(); p[3] = o; } } break; default: OMNIORB_THROW(MARSHAL, MARSHAL_InvalidWCharSize, (CORBA::CompletionStatus)stream.completion()); } return 1; } return 0;}_CORBA_BooleanTCS_W_UCS_4::fastUnmarshalWString(cdrStream& stream, omniCodeSet::NCS_W* ncs, _CORBA_ULong bound, _CORBA_ULong& len, _CORBA_WChar*& ws){ if (ncs->id() == id()) { // Null transformation _CORBA_ULong mlen; mlen <<= stream; if (mlen % 4) OMNIORB_THROW(MARSHAL, MARSHAL_InvalidWCharSize, (CORBA::CompletionStatus)stream.completion()); len = mlen / 4; // Note no terminating null in marshalled form if (bound && len > bound) OMNIORB_THROW(MARSHAL, MARSHAL_WStringIsTooLong, (CORBA::CompletionStatus)stream.completion()); if (!stream.checkInputOverrun(1, mlen)) OMNIORB_THROW(MARSHAL, MARSHAL_PassEndOfMessage, (CORBA::CompletionStatus)stream.completion()); ws = omniCodeSetUtil::allocW(len + 1); omniCodeSetUtil::HolderW wh(ws); stream.unmarshalArrayULong((_CORBA_ULong*)ws, len); ws[len] = 0; // Null terminator wh.drop(); return 1; } return 0;}//// Initialiser//static NCS_W_UCS_4 _NCS_W_UCS_4;static TCS_W_UCS_4 _TCS_W_UCS_4;class CS_UCS_4_init {public: CS_UCS_4_init() { omniCodeSet::registerNCS_W(&_NCS_W_UCS_4); omniCodeSet::registerTCS_W(&_TCS_W_UCS_4); }};static CS_UCS_4_init _CS_UCS_4_init;#endif // (SIZEOF_WCHAR == 4)OMNI_NAMESPACE_END(omni)OMNI_EXPORT_LINK_FORCE_SYMBOL(CS_UCS_4);
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -