ret_t http2d_spdy_read_ctrl (http2d_buffer_t *buf, int pos, http2d_spdy_ctrl_t *ctrl) { char *p = &buf->buf[pos]; ctrl->version = _read_uint16(p) & SPDY_MASK_VERSION; ctrl->type = _read_uint16(p+2); ctrl->flags = p[4]; ctrl->length = _read_uint32(p+4) & SPDY_MASK_LENGTH; return ret_ok; }
static gboolean as_app_builder_parse_file_qt (AsAppBuilderContext *ctx, const gchar *locale, const gchar *filename, GError **error) { guint32 len; guint32 m = 0; g_autofree guint8 *data = NULL; const guint8 qm_magic[] = { 0x3c, 0xb8, 0x64, 0x18, 0xca, 0xef, 0x9c, 0x95, 0xcd, 0x21, 0x1c, 0xbf, 0x60, 0xa1, 0xbd, 0xdd }; /* load file */ if (!g_file_get_contents (filename, (gchar **) &data, (gsize *) &len, error)) return FALSE; /* check header */ if (len < sizeof(qm_magic) || memcmp (data, qm_magic, sizeof(qm_magic)) != 0) { g_set_error_literal (error, AS_APP_ERROR, AS_APP_ERROR_FAILED, "file is invalid"); return FALSE; } m += (guint32) sizeof(qm_magic); /* parse each section */ while (m < len) { AsAppBuilderQmSection section = _read_uint8(data, &m); guint32 section_len = _read_uint32 (data, &m); if (section == AS_APP_TRANSLATION_QM_SECTION_MESSAGES) { as_app_builder_parse_data_qt (ctx, locale, data + m, section_len); } m += section_len; } return TRUE; }
static void as_app_builder_parse_data_qt (AsAppBuilderContext *ctx, const gchar *locale, const guint8 *data, guint32 len) { AsAppBuilderEntry *entry; guint32 m = 0; guint nstrings = 0; /* read data */ while (m < len) { guint32 tag_len; AsAppBuilderQmTag tag = _read_uint8(data, &m); switch (tag) { case AS_APP_TRANSLATION_QM_TAG_END: break; case AS_APP_TRANSLATION_QM_TAG_OBSOLETE1: m += 4; break; case AS_APP_TRANSLATION_QM_TAG_TRANSLATION: case AS_APP_TRANSLATION_QM_TAG_SOURCE_TEXT: case AS_APP_TRANSLATION_QM_TAG_CONTEXT: case AS_APP_TRANSLATION_QM_TAG_COMMENT: tag_len = _read_uint32 (data, &m); if (tag_len < 0xffffffff) m += tag_len; if (tag == AS_APP_TRANSLATION_QM_TAG_TRANSLATION) nstrings++; break; default: m = G_MAXUINT32; break; } } /* add new entry */ entry = as_app_builder_entry_new (); entry->locale = g_strdup (locale); entry->nstrings = nstrings; if (entry->nstrings > ctx->max_nstrings) ctx->max_nstrings = entry->nstrings; ctx->data = g_list_prepend (ctx->data, entry); }