HPDF_STATUS HPDF_Info_SetInfoDateAttr (HPDF_Dict info, HPDF_InfoType type, HPDF_Date value) { char tmp[HPDF_DATE_TIME_STR_LEN + 1]; char* ptmp; const char* name = InfoTypeToName (type); HPDF_PTRACE((" HPDF_Info_SetInfoDateAttr\n")); if (type > HPDF_INFO_MOD_DATE) return HPDF_SetError (info->error, HPDF_INVALID_PARAMETER, 0); HPDF_MemSet (tmp, 0, HPDF_DATE_TIME_STR_LEN + 1); if (value.month < 1 || 12 < value.month || value.day < 1 || 23 < value.hour || 59 < value.minutes || 59 < value.seconds || (value.ind != '+' && value.ind != '-' && value.ind != 'Z' && value.ind != ' ') || 23 < value.off_hour || 59 < value.off_minutes) { return HPDF_SetError (info->error, HPDF_INVALID_DATE_TIME, 0); } switch (value.month) { case 1: case 3: case 5: case 7: case 8: case 10: case 12: if (value.day > 31) return HPDF_SetError (info->error, HPDF_INVALID_DATE_TIME, 0); break; case 4: case 6: case 9: case 11: if (value.day > 30) return HPDF_SetError (info->error, HPDF_INVALID_DATE_TIME, 0); break; case 2: if (value.day > 29 || (value.day == 29 && (value.year % 4 != 0 || (value.year % 100 == 0 && value.year % 400 != 0)))) return HPDF_SetError (info->error, HPDF_INVALID_DATE_TIME, 0); break; default: return HPDF_SetError (info->error, HPDF_INVALID_DATE_TIME, 0); } ptmp = (char *)HPDF_MemCpy ((HPDF_BYTE *)tmp, (HPDF_BYTE *)"D:", 2); ptmp = HPDF_IToA2 (ptmp, value.year, 5); ptmp = HPDF_IToA2 (ptmp, value.month, 3); ptmp = HPDF_IToA2 (ptmp, value.day, 3); ptmp = HPDF_IToA2 (ptmp, value.hour, 3); ptmp = HPDF_IToA2 (ptmp, value.minutes, 3); ptmp = HPDF_IToA2 (ptmp, value.seconds, 3); if (value.ind != ' ') { *ptmp++ = value.ind; ptmp = HPDF_IToA2 (ptmp, value.off_hour, 3); *ptmp++ = '\''; ptmp = HPDF_IToA2 (ptmp, value.off_minutes, 3); *ptmp++ = '\''; } *ptmp = 0; return HPDF_Dict_Add (info, name, HPDF_String_New (info->mmgr, tmp, NULL)); }
HPDF_STATUS HPDF_Xref_WriteToStream (HPDF_Xref xref, HPDF_Stream stream, HPDF_Encrypt e) { HPDF_STATUS ret; HPDF_UINT i; char buf[HPDF_SHORT_BUF_SIZ]; char* pbuf; char* eptr = buf + HPDF_SHORT_BUF_SIZ - 1; HPDF_UINT str_idx; HPDF_Xref tmp_xref = xref; /* write each objects of xref to the specified stream */ HPDF_PTRACE((" HPDF_Xref_WriteToStream\n")); while (tmp_xref) { if (tmp_xref->start_offset == 0) str_idx = 1; else str_idx = 0; for (i = str_idx; i < tmp_xref->entries->count; i++) { HPDF_XrefEntry entry = (HPDF_XrefEntry)HPDF_List_ItemAt (tmp_xref->entries, i); HPDF_UINT obj_id = tmp_xref->start_offset + i; HPDF_UINT16 gen_no = entry->gen_no; entry->byte_offset = stream->size; pbuf = buf; pbuf = HPDF_IToA (pbuf, obj_id, eptr); *pbuf++ = ' '; pbuf = HPDF_IToA (pbuf, gen_no, eptr); HPDF_StrCpy(pbuf, " obj\012", eptr); if ((ret = HPDF_Stream_WriteStr (stream, buf)) != HPDF_OK) return ret; if (e) HPDF_Encrypt_InitKey (e, obj_id, gen_no); if ((ret = HPDF_Obj_WriteValue (entry->obj, stream, e)) != HPDF_OK) return ret; if ((ret = HPDF_Stream_WriteStr (stream, "\012endobj\012")) != HPDF_OK) return ret; } tmp_xref = tmp_xref->prev; } /* start to write cross-reference table */ tmp_xref = xref; while (tmp_xref) { tmp_xref->addr = stream->size; pbuf = buf; pbuf = (char *)HPDF_StrCpy (pbuf, "xref\012", eptr); pbuf = HPDF_IToA (pbuf, tmp_xref->start_offset, eptr); *pbuf++ = ' '; pbuf = HPDF_IToA (pbuf, tmp_xref->entries->count, eptr); HPDF_StrCpy (pbuf, "\012", eptr); ret = HPDF_Stream_WriteStr (stream, buf); if (ret != HPDF_OK) return ret; for (i = 0; i < tmp_xref->entries->count; i++) { HPDF_XrefEntry entry = HPDF_Xref_GetEntry(tmp_xref, i); pbuf = buf; pbuf = HPDF_IToA2 (pbuf, entry->byte_offset, HPDF_BYTE_OFFSET_LEN + 1); *pbuf++ = ' '; pbuf = HPDF_IToA2 (pbuf, entry->gen_no, HPDF_GEN_NO_LEN + 1); *pbuf++ = ' '; *pbuf++ = entry->entry_typ; HPDF_StrCpy (pbuf, "\015\012", eptr); ret = HPDF_Stream_WriteStr (stream, buf); if (ret != HPDF_OK) return ret; } tmp_xref = tmp_xref->prev; } /* write trailer dictionary */ ret = WriteTrailer (xref, stream); return ret; }