--- edtk-1.1-orig/edtk/c_c_template.gsl	2003-05-20 08:43:51.000000000 +0900
+++ edtk-1.1/edtk/c_c_template.gsl	2006-03-31 19:03:01.490987312 +0900
@@ -438,13 +438,21 @@
 	EV_GET_UINT32(ev, &index, &p, &q);
 	if (index == -1 && $(.valmap_may_be_void?"0") == 1) {
 	    edtk_debug("%s: valmap $(.valmap_name) index %d = default value 0x%lx", __FUNCTION__, index, $(_tmp));
-	    c->i.$(.iname?.name) = $(_tmp);
+.          if .argtype?"" = "inout"
+            c->o.$(.iname?.name) = $(_tmp);
+.          else
+            c->i.$(.iname?.name) = $(_tmp);
+.          endif
 	    c->i.__valmap_$(.valmap_name)_index = -1;
 	} else if (desc->valmap_$(.valmap_name)[index] == $(_tmp)) {
 	    goto error;
 	} else {
 	    edtk_debug("%s: valmap $(.valmap_name) index %d = 0x%lx", __FUNCTION__, index, desc->valmap_$(.valmap_name)[index]);
+.          if .argtype?"" = "inout"
+	    c->o.$(.iname?.name) = desc->valmap_$(.valmap_name)[index];
+.          else
 	    c->i.$(.iname?.name) = desc->valmap_$(.valmap_name)[index];
+.          endif
 	    c->i.__valmap_$(.valmap_name)_index = index;
 	}
 .    elsif _etype = "integer"
@@ -736,7 +744,7 @@
 			 &$(.callcast?) c->o.$(oname?name)$(_comma)
 .      endif
 .    elsif .argtype = "inout"
-			 $(.callcast?) c->o.$(oname?name)$(_comma) /*inout*/
+			 &$(.callcast?) c->o.$(oname?name)$(_comma) /*inout*/
 .    elsif .argtype = "verbatim"
 $(.)
 .    else
@@ -970,6 +978,30 @@
 >$(-1.il) members++;
     elsif .etype = "float"
 >$(-1.il) Type float not implemented
+    elsif .etype = "valmap"
+.- FIXME: copied verbatim from the *_outputv implementation:
+.      if defined(.expect)
+.- FIXME: to implement:
+.-     if (! c->o.__expect) {
+.-         WHAT TO DO?
+.-     }
+.      endif
+.      if .valmap_type = "start"
+>$(-1.il) if (find_unused_$(.valmap_name)_index(desc, &valmap_index) < 0) {
+>$(-1.il)  reply_error(desc, ENOMEM);
+>$(-1.il)  return -1;
+>$(-1.il) } else {
+>$(-1.il)  desc->valmap_$(.valmap_name)[valmap_index] = c->o.$(.oname?.name);
+>$(-1.il) }
+.      elsif .valmap_type = "stop"
+>$(-1.il) cleanup_valmap_$(.valmap_name)_index(desc, c->i.__valmap_$(.valmap_name)_index, 0);
+.      else
+>$(-1.il) Unknown attribute valmap_type: $(.valmap_type)
+.      endif
+>$(-1.il) msgcount = LOAD_ATOM(msg, msgcount, am_valmap_$(.valmap_name));
+>$(-1.il) msgcount = LOAD_INT(msg, msgcount, valmap_index);
+>$(-1.il) msgcount = LOAD_TUPLE(msg, msgcount, 2);
+>$(-1.il) members++;
     elsif .etype = "tuple"
 .- Type tuple is handled by macro recursion, don't need to deal with it here.
     elsif .etype = "list"
@@ -1026,6 +1058,7 @@
     int			members = 0;
     char		*tmp = NULL;
     int                 i;
+    unsigned long	valmap_index;
     ErlDrvBinary	*tmpbin = NULL;
 
     tmp = tmp; tmpbin = tmpbin;
