| /* | |
| genidl - Generate interface defintion language listing from a | |
| Portable Executable. | |
| Copyright (C) 2009-2016 mingw-w64 project | |
| This program is free software: you can redistribute it and/or modify | |
| it under the terms of the GNU General Public License as published by | |
| the Free Software Foundation, either version 3 of the License, or | |
| (at your option) any later version. | |
| This program is distributed in the hope that it will be useful, | |
| but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
| GNU General Public License for more details. | |
| You should have received a copy of the GNU General Public License | |
| along with this program. If not, see <http://www.gnu.org/licenses/>. | |
| */ | |
| #ifndef GETIDL_TYPINFO_HXX | |
| #define GETIDL_TYPINFO_HXX | |
| #define TITYP_NONE -1 | |
| #define TITYP_NAME 0 | |
| #define TITYP_STR 1 | |
| #define TITYP_GUIDS 2 | |
| #define TITYP_TYPINFO_NAMES 3 | |
| #define TITYP_DEREF 4 | |
| #define TITYP_ARRAY 5 | |
| #define TITYP_REF 6 | |
| #define TITYP_IMP 7 | |
| #define TITYP_UNKNOWN 8 | |
| #define TITYP_CUSTOMDATA 9 | |
| #define TITYP_CUSTOMGUID 10 | |
| #define TITYP_IMPREF 11 | |
| #define TITYP_MAX 12 | |
| typedef struct sTITyp { | |
| uint32_t memid; /**< TYPINFO offset ID */ | |
| int32_t kind; /**< TYPINFO kind */ | |
| int32_t refkind; | |
| uint32_t refmem; /**< Offset reference */ | |
| char *refstr; /**< Helper member to form TYPINFO string */ | |
| char *poststr; /**< Helper member to form TYPINFO string */ | |
| char name[1]; /**< TYPINFO name */ | |
| } sTITyp; | |
| typedef struct sTITypsHash | |
| { | |
| size_t count; | |
| size_t max; | |
| sTITyp **arr; /**< Directory of TYPEINFO data found */ | |
| } sTITypsHash; | |
| typedef struct sTITyps { | |
| sTITypsHash buc[TITYP_MAX]; | |
| } sTITyps; | |
| /** | |
| * Initializes sTITyps struct | |
| * @param[in] ptyp Address of struct to zero | |
| * @return always 0 | |
| */ | |
| int32_t TI_init_typs (sTITyps *ptyp); | |
| /** | |
| * Walks over and frees sTITypsHash entries found in sTITyps structure | |
| * @param[in] ptyp sTITyps structure containing sTITypsHash entries to destroy | |
| * @return always 0 | |
| */ | |
| int32_t TI_dest_typs (sTITyps *ptyp); | |
| /** | |
| * Inserts a sTITypsHash entry into a sTITyps | |
| * @param[in] ptyp Structure to insert entry into | |
| * @param[in] memid | |
| * @param[in] kind | |
| * @param[in] refkind | |
| * @param[in] refmem | |
| * @param[in[ refstr | |
| * @param[in] name typinfo associated name | |
| * @param[in] poststr | |
| * @return always 0 | |
| */ | |
| int32_t TI_add_typ (sTITyps *ptyp, uint32_t memid, int32_t kind, int32_t refkind, uint32_t refmem, | |
| const char *refstr, const char *name, const char *poststr); | |
| /** | |
| * Searches ptyp for element matching memid and kind. | |
| * @param[in] ptyp typelib data to search | |
| * @param[in] memid TTYPINFO offset to match | |
| * @param[in] kind TYPINFO kind to match | |
| * @return pointer to matching matching typinfo section | |
| */ | |
| sTITyp *TI_get_typ (sTITyps *ptyp, uint32_t memid, int32_t kind); | |
| /** | |
| * Returns a string to name the TYPINFO sections | |
| * @param[in] memid TTYPINFO offset to match | |
| * @param[in] kind TYPINFO kind to match | |
| * @param[in] varname | |
| * @return string to name of TYPINFO section | |
| */ | |
| char *TI_get_typ_name (sTITyps *ptyp, uint32_t memid, int32_t kind, const char *varName); | |
| /** | |
| * Decodes name from raw data to insert into new entry in sTITyps | |
| * @return always 0 | |
| */ | |
| int32_t TI2_import_name (sTITyps *nptr, unsigned char *dta, uint32_t len); | |
| int32_t TI2_import_guid (sTITyps *gptr, unsigned char *dta, uint32_t len); | |
| int32_t TI2_import_typinfo_names (sTITyps *tptr, unsigned char *dta, uint32_t len); | |
| int32_t TI2_import_string (sTITyps *sptr, unsigned char *dta, uint32_t len); | |
| int32_t TI2_import_typedesc (sTITyps *dptr, unsigned char *dta, uint32_t len); | |
| int32_t TI2_import_customdata (sTITyps *dptr, unsigned char *dta, uint32_t len); | |
| int32_t TI2_import_customdataguid (sTITyps *gptr, unsigned char *dta, uint32_t len); | |
| int32_t TI2_import_importlibs (sTITyps *iptr, unsigned char *dta, uint32_t len); | |
| int32_t TI2_import_ref (sTITyps *gptr, unsigned char *dta, uint32_t len); | |
| int32_t TI2_import_array (sTITyps *gptr, unsigned char *dta, uint32_t len); | |
| int32_t TI2_import_importref (sTITyps *gptr, unsigned char *dta, uint32_t len); | |
| const char *decode_VT_name_tmp (unsigned short vt); | |
| size_t getVT_data (sTITyps *dptr, uint32_t vt, unsigned char *dta, char **ret); | |
| char *TI_getVTorDref (sTITyps *ptyp,uint32_t vt, const char *varName, int beBase); | |
| size_t getVT_size (uint32_t vt, unsigned char *dta, size_t *basesz); | |
| typedef struct sTI2TypeBaseMemItem { | |
| int beFunc; | |
| #ifdef __GNUC__ | |
| __extension__ | |
| #endif | |
| union { | |
| unsigned char *mem; | |
| sMSFT_func *func; | |
| sMSFT_var *var; | |
| }; | |
| uint32_t *customData; | |
| sMSFT_FuncParam *funcParam; | |
| uint32_t *extData; | |
| size_t max; | |
| } sTI2TypeBaseMemItem; | |
| typedef struct sTI2TypeBaseMem | |
| { | |
| size_t count; | |
| sTI2TypeBaseMemItem *items; | |
| } sTI2TypeBaseMem; | |
| typedef struct sTI2TypeBase { | |
| uint32_t kind; | |
| uint32_t kflags; | |
| int32_t cVars; | |
| int32_t cFuncs; | |
| int32_t flags; | |
| char *name; | |
| char *guid; | |
| char *docstr; | |
| char *custData; | |
| uint32_t version; | |
| char *dataType; | |
| sMSFT_TypeInfoBase *tib; | |
| sTI2TypeBaseMem mem; | |
| } sTI2TypeBase; | |
| typedef struct sTI2TypLib { | |
| int16_t ver_major; | |
| int16_t ver_minor; | |
| int32_t version; | |
| char *guid; | |
| uint32_t lcid1; | |
| uint32_t lcid2; | |
| uint32_t flags; | |
| uint32_t setFlags; | |
| char *helpstring; | |
| char *helpfile; | |
| int32_t helpstringctx; | |
| int32_t helpctx; | |
| char *name; | |
| int32_t dispatch; | |
| size_t nr_typinfos; | |
| size_t nr_impinfos; | |
| uint32_t *typinfos_hash; | |
| sTITyps ti2_typs; | |
| sTI2TypeBase *typb; | |
| } sTI2TypLib; | |
| sTI2TypLib *TI2_typlib_init (unsigned char *dta, size_t len); | |
| void TI2_typlib_dest (sTI2TypLib *tl); | |
| void TI2_typlib_hdr (FILE *fp, sTI2TypLib *tl, const char *orgfname); | |
| void TI2_typlib_idl (FILE *fp, sTI2TypLib *tl, const char *orgname); | |
| /** | |
| * Returns text string of calling convention type | |
| * @param[in] cc calling convention type | |
| * @return pointer to convention type string | |
| */ | |
| const char *getCallConvName (int32_t cc); | |
| /** | |
| * Returns text string of calling convention type | |
| * @param[in] fp file to print to | |
| * @param[in] typs | |
| */ | |
| void printValue(FILE *fp, sTITyps *typs, uint32_t val); | |
| char *getTypeBOrImpRef (sTITyps *dptr, uint32_t off, const char *var); | |
| #endif |