widl #8: type library help* attributes
Huw D M Davies
h.davies1 at physics.ox.ac.uk
Mon Jan 10 06:09:27 CST 2005
Huw Davies <huw at codeweavers.com>
Add support for the help* attributes on type libraries.
--
Huw Davies
huw at codeweavers.com
--- tools/widl/parser.l 2005-01-10 10:34:52.000000000 +0000
+++ tools/widl/parser.l 2005-01-10 11:53:35.653840231 +0000
@@ -226,7 +226,11 @@
{"handle", tHANDLE},
{"handle_t", tHANDLET},
/* ... */
+ {"helpcontext", tHELPCONTEXT},
+ {"helpfile", tHELPFILE},
{"helpstring", tHELPSTRING},
+ {"helpstringcontext", tHELPSTRINGCONTEXT},
+ {"helpstringdll", tHELPSTRINGDLL},
/* ... */
{"hidden", tHIDDEN},
{"hyper", tHYPER},
--- tools/widl/parser.y 2005-01-10 11:49:48.928180495 +0000
+++ tools/widl/parser.y 2005-01-10 11:56:40.984244352 +0000
@@ -142,7 +142,8 @@
%token tFLOAT
%token tHANDLE
%token tHANDLET
-%token tHELPSTRING
+%token tHELPCONTEXT tHELPFILE
+%token tHELPSTRING tHELPSTRINGCONTEXT tHELPSTRINGDLL
%token tHIDDEN
%token tHYPER tID tIDEMPOTENT
%token tIIDIS
@@ -358,7 +359,11 @@
| tENTRY '(' aSTRING ')' { $$ = make_attrp(ATTR_ENTRY_STRING, $3); }
| tENTRY '(' expr_const ')' { $$ = make_attrp(ATTR_ENTRY_ORDINAL, $3); }
| tHANDLE { $$ = make_attr(ATTR_HANDLE); }
+ | tHELPCONTEXT '(' expr_const ')' { $$ = make_attrp(ATTR_HELPCONTEXT, $3); }
+ | tHELPFILE '(' aSTRING ')' { $$ = make_attrp(ATTR_HELPFILE, $3); }
| tHELPSTRING '(' aSTRING ')' { $$ = make_attrp(ATTR_HELPSTRING, $3); }
+ | tHELPSTRINGCONTEXT '(' expr_const ')' { $$ = make_attrp(ATTR_HELPSTRINGCONTEXT, $3); }
+ | tHELPSTRINGDLL '(' aSTRING ')' { $$ = make_attrp(ATTR_HELPSTRINGDLL, $3); }
| tHIDDEN { $$ = make_attr(ATTR_HIDDEN); }
| tID '(' expr_const ')' { $$ = make_attrp(ATTR_ID, $3); }
| tIDEMPOTENT { $$ = make_attr(ATTR_IDEMPOTENT); }
--- tools/widl/widltypes.h 2005-01-10 11:49:48.929180260 +0000
+++ tools/widl/widltypes.h 2005-01-10 11:55:23.423488629 +0000
@@ -70,7 +70,11 @@
ATTR_ENTRY_STRING,
ATTR_ENTRY_ORDINAL,
ATTR_HANDLE,
+ ATTR_HELPCONTEXT,
+ ATTR_HELPFILE,
ATTR_HELPSTRING,
+ ATTR_HELPSTRINGCONTEXT,
+ ATTR_HELPSTRINGDLL,
ATTR_HIDDEN,
ATTR_ID,
ATTR_IDEMPOTENT,
--- tools/widl/write_msft.c 2005-01-10 11:49:48.931179789 +0000
+++ tools/widl/write_msft.c 2005-01-10 11:53:35.661838349 +0000
@@ -91,6 +91,8 @@
INT *typelib_namehash_segment;
INT *typelib_guidhash_segment;
+ INT help_string_dll_offset;
+
struct _msft_typeinfo_t *typeinfos;
struct _msft_typeinfo_t *last_typeinfo;
} msft_typelib_t;
@@ -1460,10 +1462,54 @@
static void set_help_file_name(msft_typelib_t *typelib)
{
int offset;
- offset = ctl2_alloc_string(typelib, "help file name");
- if (offset == -1) return;
- typelib->typelib_header.helpfile = offset;
- typelib->typelib_header.varflags |= 0x10;
+ attr_t *attr;
+ for(attr = typelib->typelib->attrs; attr; attr = NEXT_LINK(attr)) {
+ if(attr->type == ATTR_HELPFILE) {
+ offset = ctl2_alloc_string(typelib, attr->u.pval);
+ if (offset == -1) return;
+ typelib->typelib_header.helpfile = offset;
+ typelib->typelib_header.varflags |= 0x10;
+ }
+ }
+ return;
+}
+
+static void set_help_context(msft_typelib_t *typelib)
+{
+ attr_t *attr;
+ for(attr = typelib->typelib->attrs; attr; attr = NEXT_LINK(attr)) {
+ if(attr->type == ATTR_HELPCONTEXT) {
+ expr_t *expr = (expr_t *)attr->u.pval;
+ typelib->typelib_header.helpcontext = expr->cval;
+ }
+ }
+ return;
+}
+
+static void set_help_string_dll(msft_typelib_t *typelib)
+{
+ int offset;
+ attr_t *attr;
+ for(attr = typelib->typelib->attrs; attr; attr = NEXT_LINK(attr)) {
+ if(attr->type == ATTR_HELPSTRINGDLL) {
+ offset = ctl2_alloc_string(typelib, attr->u.pval);
+ if (offset == -1) return;
+ typelib->help_string_dll_offset = offset;
+ typelib->typelib_header.varflags |= 0x100;
+ }
+ }
+ return;
+}
+
+static void set_help_string_context(msft_typelib_t *typelib)
+{
+ attr_t *attr;
+ for(attr = typelib->typelib->attrs; attr; attr = NEXT_LINK(attr)) {
+ if(attr->type == ATTR_HELPSTRINGCONTEXT) {
+ expr_t *expr = (expr_t *)attr->u.pval;
+ typelib->typelib_header.helpstringcontext = expr->cval;
+ }
+ }
return;
}
@@ -1570,6 +1616,7 @@
if (fd == -1) return retval;
filepos = sizeof(MSFT_Header) + sizeof(MSFT_SegDir);
+ if(typelib->typelib_header.varflags & 0x100) filepos += 4; /* helpstringdll */
filepos += typelib->typelib_header.nrtypeinfos * 4;
filepos += ctl2_finalize_segment(typelib, filepos, MSFT_SEG_TYPEINFO);
@@ -1589,6 +1636,7 @@
ctl2_finalize_typeinfos(typelib, filepos);
if (!ctl2_write_chunk(fd, &typelib->typelib_header, sizeof(typelib->typelib_header))) return retval;
+ if (!ctl2_write_chunk(fd, &typelib->help_string_dll_offset, sizeof(typelib->help_string_dll_offset))) return retval;
if (!ctl2_write_chunk(fd, typelib->typelib_typeinfo_offsets, typelib->typelib_header.nrtypeinfos * 4)) return retval;
if (!ctl2_write_chunk(fd, &typelib->typelib_segdir, sizeof(typelib->typelib_segdir))) return retval;
if (!ctl2_write_segment(typelib, fd, MSFT_SEG_TYPEINFO )) return retval;
@@ -1649,12 +1697,15 @@
set_lib_flags(msft);
set_lcid(msft);
-/* set_help_file_name(msft);*/
+ set_help_file_name(msft);
set_doc_string(msft);
set_guid(msft);
set_version(msft);
set_name(msft);
-
+ set_help_context(msft);
+ set_help_string_dll(msft);
+ set_help_string_context(msft);
+
typelib_idx = 0;
for(entry = typelib->entry; NEXT_LINK(entry); entry = NEXT_LINK(entry))
;
More information about the wine-patches
mailing list