+#ifndef __MONO_METADATA_H__
+#define __MONO_METADATA_H__
+
+#include <glib.h>
+
+#include <mono/metadata/blob.h>
+#include <mono/metadata/row-indexes.h>
+#include <mono/metadata/image.h>
+
+#ifdef __GNUC__
+#define MONO_ZERO_LEN_ARRAY 0
+#else
+#define MONO_ZERO_LEN_ARRAY 1
+#endif
+
+typedef struct _MonoClass MonoClass;
+typedef struct _MonoDomain MonoDomain;
+
+typedef enum {
+ MONO_TABLE_MODULE,
+ MONO_TABLE_TYPEREF,
+ MONO_TABLE_TYPEDEF,
+ MONO_TABLE_UNUSED1,
+ MONO_TABLE_FIELD,
+ MONO_TABLE_UNUSED2,
+ MONO_TABLE_METHOD,
+ MONO_TABLE_UNUSED3,
+ MONO_TABLE_PARAM,
+ MONO_TABLE_INTERFACEIMPL,
+ MONO_TABLE_MEMBERREF,
+ MONO_TABLE_CONSTANT,
+ MONO_TABLE_CUSTOMATTRIBUTE,
+ MONO_TABLE_FIELDMARSHAL,
+ MONO_TABLE_DECLSECURITY,
+ MONO_TABLE_CLASSLAYOUT,
+ MONO_TABLE_FIELDLAYOUT,
+ MONO_TABLE_STANDALONESIG,
+ MONO_TABLE_EVENTMAP,
+ MONO_TABLE_UNUSED4,
+ MONO_TABLE_EVENT,
+ MONO_TABLE_PROPERTYMAP,
+ MONO_TABLE_UNUSED5,
+ MONO_TABLE_PROPERTY,
+ MONO_TABLE_METHODSEMANTICS,
+ MONO_TABLE_METHODIMPL,
+ MONO_TABLE_MODULEREF,
+ MONO_TABLE_TYPESPEC,
+ MONO_TABLE_IMPLMAP,
+ MONO_TABLE_FIELDRVA,
+ MONO_TABLE_UNUSED6,
+ MONO_TABLE_UNUSED7,
+ MONO_TABLE_ASSEMBLY,
+ MONO_TABLE_ASSEMBLYPROCESSOR,
+ MONO_TABLE_ASSEMBLYOS,
+ MONO_TABLE_ASSEMBLYREF,
+ MONO_TABLE_ASSEMBLYREFPROCESSOR,
+ MONO_TABLE_ASSEMBLYREFOS,
+ MONO_TABLE_FILE,
+ MONO_TABLE_EXPORTEDTYPE,
+ MONO_TABLE_MANIFESTRESOURCE,
+ MONO_TABLE_NESTEDCLASS
+
+#define MONO_TABLE_LAST MONO_TABLE_NESTEDCLASS
+} MonoMetaTableEnum;
+
+typedef enum {
+ MONO_EXCEPTION_CLAUSE_NONE,
+ MONO_EXCEPTION_CLAUSE_FILTER,
+ MONO_EXCEPTION_CLAUSE_FINALLY,
+ MONO_EXCEPTION_CLAUSE_FAULT = 4
+} MonoExceptionEnum;
+
+typedef enum {
+ MONO_CALL_DEFAULT,
+ MONO_CALL_C,
+ MONO_CALL_STDCALL,
+ MONO_CALL_THISCALL,
+ MONO_CALL_FASTCALL,
+ MONO_CALL_VARARG
+} MonoCallConvention;
+
+void mono_metadata_decode_row (MonoTableInfo *t,
+ int idx,
+ guint32 *res,
+ int res_size);
+
+guint32 mono_metadata_decode_row_col (MonoTableInfo *t,
+ int idx,
+ guint col);
+
+/*
+ * This macro is used to extract the size of the table encoded in
+ * the size_bitfield of MonoTableInfo.
+ */
+#define mono_metadata_table_size(bitfield,table) ((((bitfield) >> ((table)*2)) & 0x3) + 1)
+#define mono_metadata_table_count(bitfield) ((bitfield) >> 24)
+
+int mono_metadata_compute_size (MonoImage *meta,
+ int tableindex,
+ guint32 *result_bitfield);
+
+/*
+ *
+ */
+const char *mono_metadata_locate (MonoImage *meta, int table, int idx);
+const char *mono_metadata_locate_token (MonoImage *meta, guint32 token);
+
+const char *mono_metadata_string_heap (MonoImage *meta, guint32 table_index);
+const char *mono_metadata_blob_heap (MonoImage *meta, guint32 table_index);
+const char *mono_metadata_user_string (MonoImage *meta, guint32 table_index);
+const char *mono_metadata_guid_heap (MonoImage *meta, guint32 table_index);
+
+guint32 mono_metadata_typedef_from_field (MonoImage *meta, guint32 table_index);
+guint32 mono_metadata_typedef_from_method (MonoImage *meta, guint32 table_index);
+guint32 mono_metadata_nested_in_typedef (MonoImage *meta, guint32 table_index);
+guint32 mono_metadata_nesting_typedef (MonoImage *meta, guint32 table_index);
+
+MonoClass** mono_metadata_interfaces_from_typedef (MonoImage *meta, guint32 table_index, guint *count);
+
+guint32 mono_metadata_events_from_typedef (MonoImage *meta, guint32 table_index, guint *end_idx);
+guint32 mono_metadata_methods_from_event (MonoImage *meta, guint32 table_index, guint *end);
+guint32 mono_metadata_properties_from_typedef (MonoImage *meta, guint32 table_index, guint *end);
+guint32 mono_metadata_methods_from_property (MonoImage *meta, guint32 table_index, guint *end);
+guint32 mono_metadata_packing_from_typedef (MonoImage *meta, guint32 table_index, guint32 *packing, guint32 *size);
+
+void mono_metadata_field_info (MonoImage *meta,
+ guint32 table_index,
+ guint32 *offset,
+ guint32 *rva,
+ const char **marshal_info);
+
+guint32 mono_metadata_get_constant_index (MonoImage *meta, guint32 token);
+
+/*
+ * Functions to extract information from the Blobs
+ */
+guint32 mono_metadata_decode_value (const char *ptr,
+ const char **rptr);
+guint32 mono_metadata_decode_blob_size (const char *ptr,
+ const char **rptr);
+
+void mono_metadata_encode_value (guint32 value, char *bug, char **endbuf);
+
+#define MONO_OFFSET_IN_CLAUSE(clause,offset) \
+ ((clause)->try_offset <= (offset) && (offset) < ((clause)->try_offset + (clause)->try_len))
+#define MONO_OFFSET_IN_HANDLER(clause,offset) \
+ ((clause)->handler_offset <= (offset) && (offset) < ((clause)->handler_offset + (clause)->handler_len))
+
+typedef struct {
+ guint32 flags;
+ guint32 try_offset;
+ guint32 try_len;
+ guint32 handler_offset;
+ guint32 handler_len;
+ guint32 token_or_filter;
+} MonoExceptionClause;
+
+typedef struct _MonoType MonoType;
+typedef struct _MonoArrayType MonoArrayType;
+typedef struct _MonoMethodSignature MonoMethodSignature;
+