HPDF_STATUS HPDF_Binary_Write (HPDF_Binary obj, HPDF_Stream stream, HPDF_Encrypt e) { HPDF_STATUS ret; if (obj->len == 0) return HPDF_Stream_WriteStr (stream, "<>"); if ((ret = HPDF_Stream_WriteChar (stream, '<')) != HPDF_OK) return ret; if (e) HPDF_Encrypt_Reset (e); if ((ret = HPDF_Stream_WriteBinary (stream, obj->value, obj->len, e)) != HPDF_OK) return ret; return HPDF_Stream_WriteChar (stream, '>'); }
HPDF_STATUS HPDF_String_Write (HPDF_String obj, HPDF_Stream stream, HPDF_Encrypt e) { HPDF_STATUS ret; /* * When encoder is not NULL, text is changed to unicode using encoder, * and it outputs by HPDF_write_binary method. */ HPDF_PTRACE((" HPDF_String_Write\n")); if (e) HPDF_Encrypt_Reset (e); if (obj->encoder == NULL) { if (e) { if ((ret = HPDF_Stream_WriteChar (stream, '<')) != HPDF_OK) return ret; if ((ret = HPDF_Stream_WriteBinary (stream, obj->value, HPDF_StrLen ((char *)obj->value, -1), e)) != HPDF_OK) return ret; return HPDF_Stream_WriteChar (stream, '>'); } else { return HPDF_Stream_WriteEscapeText (stream, (char *)obj->value); } } else { HPDF_BYTE* src = obj->value; HPDF_BYTE buf[HPDF_TEXT_DEFAULT_LEN * 2]; HPDF_UINT tmp_len = 0; HPDF_BYTE* pbuf = buf; HPDF_INT32 len = obj->len; HPDF_ParseText_Rec parse_state; HPDF_UINT i; if ((ret = HPDF_Stream_WriteChar (stream, '<')) != HPDF_OK) return ret; if ((ret = HPDF_Stream_WriteBinary (stream, UNICODE_HEADER, 2, e)) != HPDF_OK) return ret; HPDF_Encoder_SetParseText (obj->encoder, &parse_state, src, len); for (i = 0; i < len; i++) { HPDF_BYTE b = src[i]; HPDF_UNICODE tmp_unicode; HPDF_ByteType btype = HPDF_Encoder_ByteType (obj->encoder, &parse_state); if (tmp_len >= HPDF_TEXT_DEFAULT_LEN - 1) { if ((ret = HPDF_Stream_WriteBinary (stream, buf, tmp_len * 2, e)) != HPDF_OK) return ret; tmp_len = 0; pbuf = buf; } if (btype != HPDF_BYTE_TYPE_TRIAL) { if (btype == HPDF_BYTE_TYPE_LEAD) { HPDF_BYTE b2 = src[i + 1]; HPDF_UINT16 char_code = (HPDF_UINT) b * 256 + b2; tmp_unicode = HPDF_Encoder_ToUnicode (obj->encoder, char_code); } else { tmp_unicode = HPDF_Encoder_ToUnicode (obj->encoder, b); } HPDF_UInt16Swap (&tmp_unicode); HPDF_MemCpy (pbuf, (HPDF_BYTE*)&tmp_unicode, 2); pbuf += 2; tmp_len++; } } if (tmp_len > 0) { if ((ret = HPDF_Stream_WriteBinary (stream, buf, tmp_len * 2, e)) != HPDF_OK) return ret; } if ((ret = HPDF_Stream_WriteChar (stream, '>')) != HPDF_OK) return ret; } return HPDF_OK; }