widl #9: type info and function help* attributes

Huw D M Davies h.davies1 at physics.ox.ac.uk
Mon Jan 10 09:09:47 CST 2005


        Huw Davies <huw at codeweavers.com>
        Add help* attributes for typeinfos and functions.
-- 
Huw Davies
huw at codeweavers.com
--- tools/widl/typelib_struct.h	2005-01-06 20:45:21.000000000 +0000
+++ tools/widl/typelib_struct.h	2005-01-10 15:05:15.371366694 +0000
@@ -47,16 +47,20 @@
  *
  */
 typedef struct tagMSFT_Header {
-/*0x00*/INT magic1;       /* 0x5446534D "MSFT" */
+/*0x00*/INT   magic1;       /* 0x5446534D "MSFT" */
         INT   magic2;       /* 0x00010002 version nr? */
         INT   posguid;      /* position of libid in guid table  */
                             /* (should be,  else -1) */
         INT   lcid;         /* locale id */
 /*0x10*/INT   lcid2;
-        INT   varflags;     /* (largely) unknown flags ,seems to be always 41 */
-                            /* becomes 0x51 with a helpfile defined */
-                            /* if help dll defined it's 0x151 */
-                            /* update : the lower nibble is syskind */
+        INT   varflags;     /* (largely) unknown flags */
+                            /* the lower nibble is syskind */
+                            /* 0x40 always seems to be set */
+                            /* 0x10 set with a helpfile defined */
+                            /* 0x100 set with a helpstringdll defined - in this
+                                  case the offset to the name in the stringtable
+                                  appears right after this struct, before the
+                                  typeinfo offsets */
         INT   version;      /* set with SetVersion() */
         INT   flags;        /* set with SetFlags() */
 /*0x20*/INT   nrtypeinfos;  /* number of typeinfo's (till so far) */
--- tools/widl/write_msft.c	2005-01-10 12:05:09.653614493 +0000
+++ tools/widl/write_msft.c	2005-01-10 15:05:15.374365990 +0000
@@ -974,12 +974,13 @@
     int offset;
     int *typedata;
     int i, index = func->idx, id;
-    int decoded_size;
+    int decoded_size, extra_attr = 0;
     int num_params = 0, num_defaults = 0;
     var_t *arg, *last_arg = NULL;
     char *namedata;
     attr_t *attr;
     unsigned int funcflags = 0, callconv = 4;
+    int help_context = 0, help_string_context = 0, help_string_offset = -1;
 
     id = ((0x6000 | typeinfo->typeinfo->cImplTypes) << 16) | index;
 
@@ -1004,13 +1005,23 @@
     chat("num of params %d\n", num_params);
 
     for(attr = func->def->attrs; attr; attr = NEXT_LINK(attr)) {
+        expr_t *expr = attr->u.pval; 
         switch(attr->type) {
         case ATTR_ID:
-          {
-            expr_t *expr = attr->u.pval; 
             id = expr->u.lval;
             break;
-          }
+        case ATTR_HELPCONTEXT:
+            extra_attr = 1;
+            help_context = expr->u.lval;
+            break;
+        case ATTR_HELPSTRING:
+            extra_attr = 2;
+            help_string_offset = ctl2_alloc_string(typeinfo->typelib, attr->u.pval);
+            break;
+        case ATTR_HELPSTRINGCONTEXT:
+            extra_attr = 6;
+            help_string_context = expr->u.lval;
+            break;
         case ATTR_OUT:
             break;
 
@@ -1021,11 +1032,11 @@
     }
     /* allocate type data space for us */
     offset = typeinfo->typedata[0];
-    typeinfo->typedata[0] += 0x18 + (num_params * (num_defaults ? 16 : 12));
+    typeinfo->typedata[0] += 0x18 + extra_attr * sizeof(int) + (num_params * (num_defaults ? 16 : 12));
     typedata = typeinfo->typedata + (offset >> 2) + 1;
 
     /* fill out the basic type information */
-    typedata[0] = (0x18 + (num_params * (num_defaults ? 16 : 12))) | (index << 16);
+    typedata[0] = (0x18 + extra_attr * sizeof(int) + (num_params * (num_defaults ? 16 : 12))) | (index << 16);
     ctl2_encode_type(typeinfo->typelib, func->def->type, func->def->ptr_level, func->def->array, &typedata[1], NULL, NULL, &decoded_size);
     typedata[2] = funcflags;
     typedata[3] = ((52 /*sizeof(FUNCDESC)*/ + decoded_size) << 16) | typeinfo->typeinfo->cbSizeVft;
@@ -1038,11 +1049,24 @@
     typedata[3] += (16 /*sizeof(ELEMDESC)*/ * num_params) << 16;
     typedata[3] += (24 /*sizeof(PARAMDESCEX)*/ * num_defaults) << 16;
 
+    switch(extra_attr) {
+    case 6: typedata[11] = help_string_context;
+    case 5: typedata[10] = -1;
+    case 4: typedata[9] = -1;
+    case 3: typedata[8] = -1;
+    case 2: typedata[7] = help_string_offset;
+    case 1: typedata[6] = help_context;
+    case 0:
+        break;
+    default:
+        warning("unknown number of optional attrs\n");
+    }
+
     for (arg = last_arg, i = 0; arg; arg = PREV_LINK(arg), i++) {
         attr_t *attr;
         int paramflags = 0;
-        int *paramdata = typedata + 6 + (num_defaults ? num_params : 0) + i * 3;
-        int *defaultdata = num_defaults ? typedata + 6 + i : NULL;
+        int *paramdata = typedata + 6 + extra_attr + (num_defaults ? num_params : 0) + i * 3;
+        int *defaultdata = num_defaults ? typedata + 6 + extra_attr + i : NULL;
 
         if(defaultdata) *defaultdata = -1;
 
@@ -1122,7 +1146,7 @@
     for (arg = last_arg, i = 0; arg; arg = PREV_LINK(arg), i++) {
 	/* FIXME: Almost certainly easy to break */
 	int *paramdata = &typeinfo->typedata[typeinfo->offsets[index] >> 2];
-        paramdata += 7 + (num_defaults ? num_params : 0) + i * 3;
+        paramdata += 7 + extra_attr + (num_defaults ? num_params : 0) + i * 3;
 	offset = ctl2_alloc_name(typeinfo->typelib, arg->name);
 	paramdata[1] = offset;
         chat("param %d name %s offset %d\n", i, arg->name, offset);
@@ -1356,6 +1380,25 @@
 
     for( ; attr; attr = NEXT_LINK(attr)) {
         switch(attr->type) {
+        case ATTR_HELPCONTEXT:
+          {
+            expr_t *expr = (expr_t*)attr->u.pval;
+            typeinfo->helpcontext = expr->cval;
+            break;
+          }
+        case ATTR_HELPSTRING:
+          {
+            int offset = ctl2_alloc_string(typelib, attr->u.pval);
+            if (offset == -1) break;
+            typeinfo->docstringoffs = offset;
+            break;
+          }
+        case ATTR_HELPSTRINGCONTEXT:
+          {
+            expr_t *expr = (expr_t*)attr->u.pval;
+            typeinfo->helpstringcontext = expr->cval;
+            break;
+          }
         case ATTR_HIDDEN:
             typeinfo->flags |= 0x10; /* TYPEFLAG_FHIDDEN */
             break;



More information about the wine-patches mailing list