static LIFMemBlock* lif_read_memblock(const guchar *buffer, gsize *size, gint version) { LIFMemBlock *memblock; const guchar *p; int i; p = buffer; memblock = g_new0(LIFMemBlock, 1); memblock->magic = gwy_get_gint32_le(&p); gwy_debug("Magic = %d", memblock->magic); if (memcmp(&memblock->magic, MAGIC, MAGIC_SIZE) != 0) { gwy_debug("Wrong magic for memblock"); size = 0; g_free(memblock); return NULL; } memblock->size = gwy_get_guint32_le(&p); gwy_debug("Size = %d", memblock->size); memblock->testcode = *(p++); gwy_debug("Testcode = 0x%x", memblock->testcode); if (memblock->testcode != TESTCODE) { gwy_debug("Wrong testcode for memblock"); g_free(memblock); size = 0; return NULL; } if (version == 1) { memblock->memsize = gwy_get_guint32_le(&p); } else if (version >= 2) { memblock->memsize = gwy_get_guint64_le(&p); } gwy_debug("data length = %" G_GUINT64_FORMAT "", memblock->memsize); i = 0; while (*(p++) != TESTCODE) { i++; } gwy_debug("skipped %d bytes", i); memblock->desclen = gwy_get_guint32_le(&p); gwy_debug("description length = %d", memblock->desclen); memblock->memid = g_convert((const gchar*)p, 2 * memblock->desclen, "UTF-8", "UTF-16", NULL, NULL, NULL); gwy_debug("description = %s", memblock->memid); p += memblock->desclen * 2; memblock->data = (gpointer)p; *size = (gsize)(p - buffer) + memblock->memsize; return memblock; }
static gboolean rhk_sm4_read_drift_header(RHKSpecDriftHeader *drift_header, const RHKObject *obj, const guchar *buffer) { const guchar *p = buffer + obj->offset; if (obj->size < 16) return FALSE; drift_header->start_time = gwy_get_guint64_le(&p); drift_header->drift_opt = gwy_get_gint16_le(&p); drift_header->nstrings = gwy_get_guint16_le(&p); /* TODO: Read the strings. */ return TRUE; }
static RHKSpecDriftHeader* rhk_sm4_read_drift_header(const RHKObject *obj, const guchar *buffer) { RHKSpecDriftHeader *drift_header = NULL; const guchar *p = buffer + obj->offset; if (obj->size < 16) return drift_header; drift_header = g_new0(RHKSpecDriftHeader, 1); drift_header->start_time = gwy_get_guint64_le(&p); drift_header->drift_opt = gwy_get_gint16_le(&p); drift_header->nstrings = gwy_get_guint16_le(&p); /* TODO: Read the strings. */ return drift_header; }