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