diff src/genprops.awk @ 7363:c31e5dab4f85

[project @ 2008-01-12 08:21:57 by jwe]
author jwe
date Sat, 12 Jan 2008 08:21:57 +0000
parents 1f3e360c1bba
children 600808df131c
line wrap: on
line diff
--- a/src/genprops.awk	Sat Jan 12 08:00:38 2008 +0000
+++ b/src/genprops.awk	Sat Jan 12 08:21:57 2008 +0000
@@ -109,174 +109,420 @@
 ## The 'o' and 'O' qualifiers are only useful when the the property type
 ## is something other than octave_value.
 
+## simple accessor
+
+function emit_get_accessor (i, rtype, faccess)
+{
+  printf ("  %s get_%s (void) const", rtype, name[i]);
+  
+  if (emit_get[i] == "definition")
+    printf (" { return %s.%s (); }\n", name[i], faccess);
+  else
+    printf (";\n");
+}
+
+## bool_property
+
+function emit_get_bool (i)
+{
+  printf ("  bool is_%s (void) const", name[i]);
+  
+  if (emit_get[i] == "definition")
+    printf (" { return %s.is_on (); }\n", name[i]);
+  else
+    printf (";\n");
+
+  emit_get_accessor(i, "std::string", "current_value");
+}
+
+## radio_property
+
+function emit_get_radio (i)
+{
+  printf ("  bool %s_is (const std::string& v) const", name[i]);
+  
+  if (emit_get[i] == "definition")
+    printf (" { return %s.is (v); }\n", name[i]);
+  else
+    printf (";\n");
+
+  emit_get_accessor(i, "std::string", "current_value");
+}
+
+## color_property
+
+function emit_get_color (i)
+{
+  printf ("  bool %s_is_rgb (void) const { return %s.is_rgb (); }\n", name[i], name[i]);
+
+  printf ("  bool %s_is (const std::string& v) const", name[i]);
+  
+  if (emit_get[i] == "definition")
+    printf (" { return %s.is (v); }\n", name[i]);
+  else
+    printf (";\n");
+  
+  printf ("  Matrix get_%s_rgb (void) const", name[i]);
+  
+  if (emit_get[i] == "definition")
+    printf (" { return (%s.is_rgb () ? %s.rgb () : Matrix ()); }\n", name[i], name[i]);
+  else
+    printf (";\n");
+
+  emit_get_accessor(i, "octave_value", "get");
+}
+
+## callback_property
+
+function emit_get_callback (i)
+{
+  printf ("  void execute_%s (void)", name[i]);
+  
+  if (emit_get[i] == "definition")
+    printf (" { %s.execute (); }\n", name[i]);
+  else
+    printf (";\n");
+
+  emit_get_accessor(i, "octave_value", "get");
+}
+
+## data_property
+
+function emit_get_data (i)
+{
+  emit_get_accessor(i, "NDArray", "array_value");
+
+  printf ("  data_property get_%s_property (void) const { return %s; }\n",
+          name[i], name[i]);
+}
+
+## common section
+
+function emit_common_declarations ()
+{
+  printf ("public:\n");
+  printf ("  properties (const graphics_handle& mh, const graphics_handle& p);\n\n");
+  printf ("  ~properties (void) { }\n\n");
+  printf ("  void set (const caseless_str& name, const octave_value& val);\n\n");
+  printf ("  octave_value get (void) const;\n\n");
+  printf ("  octave_value get (const caseless_str& name) const;\n\n");
+  printf ("  std::string graphics_object_name (void) const { return go_name; }\n\n");
+  printf ("  static property_list::pval_map_type factory_defaults (void);\n\n");
+  printf ("private:\n  static std::string go_name;\n\n");
+}
+
 function emit_declarations ()
 {
+  if (class_name)
+    emit_common_declarations();
+
   if (idx > 0)
-      print "private:\n";
+    print "private:\n";
 
   for (i = 1; i <= idx; i++)
-      printf ("  %s%s %s;\n", mutable[i] ? "mutable " : "", type[i], name[i]);
+    printf ("  %s%s %s;\n", mutable[i] ? "mutable " : "", type[i], name[i]);
 
   if (idx > 0)
-      print "\npublic:\n";
+    print "\npublic:\n";
 
   for (i = 1; i <= idx; i++)
   {
-      if (emit_get[i])
+    if (emit_get[i])
+    {
+      if (type[i] == "array_property" || type[i] == "any_property")
+        emit_get_accessor(i, "octave_value", "get");
+      else if (type[i] == "handle_property")
+        emit_get_accessor(i, "graphics_handle", "handle_value");
+      else if (type[i] == "string_property")
+        emit_get_accessor(i, "std::string", "string_value");
+      else if (type[i] == "double_property")
+        emit_get_accessor(i, "double", "double_value");
+      else if (type[i] == "data_property")
+        emit_get_data(i);
+      else if (type[i] == "bool_property")
+        emit_get_bool(i);
+      else if (type[i] == "radio_property")
+        emit_get_radio(i);
+      else if (type[i] == "color_property")
+        emit_get_color(i);
+      else if (type[i] == "callback_property")
+        emit_get_callback(i);
+      else
       {
-	  printf ("  %s get_%s (void) const", type[i], name[i]);
+        printf ("  %s get_%s (void) const", type[i], name[i]);
 
-	  if (emit_get[i] == "definition")
-	      printf (" { return %s; }\n", name[i]);
-	  else
-	      printf (";\n");
+        if (emit_get[i] == "definition")
+          printf (" { return %s; }\n", name[i]);
+        else
+          printf (";\n");
       }
+      printf ("\n");
+    }
   }
 
   if (idx > 0)
-      printf ("\n");
+    printf ("\n");
 
   for (i = 1; i <= idx; i++)
   {
-      if (emit_set[i])
-      {
-	  printf ("  void set_%s (const %s& val)", name[i], type[i]);
+    if (emit_set[i])
+    {
+      printf ("  void set_%s (const octave_value& val)", name[i], type[i]);
 
-	  if (emit_set[i] == "definition")
-	  {
-	      printf ("\n  {\n    if (! error_state)\n      {\n        %s = val;\n",
-		      name[i]);
-	      if (limits[i])
-		  printf ("        update_axis_limits (\"%s\");\n", name[i]);
-	      if (mode[i])
-		  printf ("        set_%smode (\"manual\");\n", name[i]);
-	      printf ("        mark_modified ();\n      }\n  }\n\n");
-	  }
-	  else
-	      printf (";\n");
+      if (emit_set[i] == "definition")
+      {
+        printf ("\n  {\n    if (! error_state)\n      {\n        %s = val;\n",
+          name[i]);
+        if (limits[i])
+          printf ("        update_axis_limits (\"%s\");\n", name[i]);
+        if (mode[i])
+          printf ("        set_%smode (\"manual\");\n", name[i]);
+        printf ("        mark_modified ();\n      }\n  }\n\n");
       }
+      else
+        printf (";\n\n");
+    }
 
-      if (emit_ov_set[i])
-      {
-	  printf ("  void set_%s (const octave_value& val)", name[i]);
-
-	  if (emit_ov_set[i] == "definition")
-	      printf (" { set_%s (%s (val)); }\n\n", name[i], type[i]);
-          else if (emit_ov_set[i] == "assignment")
-          {
-              printf ("\n  {\n    %s tmp (%s);\n    tmp = val;\n    set_%s (tmp);\n  };\n\n",
-		      type[i], name[i], name[i], name[i]);
-         }
-	  else
-	      printf (";\n");
-      }
+##    if (emit_ov_set[i])
+##    {
+##      printf ("  void set_%s (const octave_value& val)", name[i]);
+##
+##      if (emit_ov_set[i] == "definition")
+##        printf (" { set_%s (%s (val)); }\n\n", name[i], type[i]);
+##      else if (emit_ov_set[i] == "assignment")
+##      {
+##        printf ("\n  {\n    %s tmp (%s);\n    tmp = val;\n    set_%s (tmp);\n  };\n\n",
+##                type[i], name[i], name[i], name[i]);
+##      }
+##      else
+##        printf (";\n");
+##    }
   }
 
-  if (idx > 0)
-      print "\nprivate:";
+##  if (idx > 0)
+##    print "\nprivate:";
+}
+
+function emit_source ()
+{
+  if (class_name)
+  {
+    printf ("// ******** %s ********\n\n", class_name) >> filename;
+
+    ## constructor
+
+    printf ("%s::properties::properties (const graphics_handle& mh, const graphics_handle& p)\n", class_name) >> filename;
+    printf ("  : base_properties (go_name, mh, p),\n") >> filename;
+
+    for (i = 1; i <= idx; i++)
+    {
+      printf ("    %s (\"%s\", mh, %s)", name[i], name[i], default[i]) >> filename;
+      if (i < idx)
+        printf (",") >> filename;
+      printf ("\n") >> filename;
+    }
+
+    printf ("{\n  init ();\n") >> filename;
+
+##    for (i = 1; i <= idx; i++)
+##      printf ("  insert_static_property (\"%s\", %s);\n", name[i], name[i]) >> filename;
+
+    printf ("}\n\n") >> filename;
+
+    ## set method
+
+    printf ("void\n%s::properties::set (const caseless_str& name, const octave_value& val)\n{\n",
+            class_name) >> filename;
+
+    for (i = 1; i <= idx; i++)
+    {
+      printf ("  %sif (name.compare (\"%s\"))\n    set_%s (val);\n",
+              (i > 1 ? "else " : ""), name[i], name[i]) >> filename;
+    }
+
+    printf ("  else\n    base_properties::set (name, val);\n}\n\n") >> filename;
+
+    ## get "all" method
+
+    printf ("octave_value\n%s::properties::get (void) const\n{\n", class_name) >> filename;
+    printf ("  Octave_map m = base_properties::get ().map_value ();\n\n") >> filename;
+
+    for (i = 1; i <= idx; i++)
+    {
+      printf ("  m.assign (\"%s\", get_%s ()%s);\n", name[i], name[i],
+              (type[i] == "handle_property" ? ".as_octave_value ()" : "")) >> filename;
+    }
+
+    printf ("\n  return m;\n}\n\n") >> filename;
+    
+    ## get "one" method
+
+    printf ("octave_value\n%s::properties::get (const caseless_str& name) const\n{\n",
+            class_name) >> filename;
+    printf ("  octave_value retval;\n\n") >> filename;
+
+    for (i = 1; i<= idx; i++)
+    {
+      printf ("  %sif (name.compare (\"%s\"))\n",
+              (i > 1 ? "else " : ""), name[i]) >> filename;
+      printf ("    retval = get_%s ()%s;\n", name[i],
+              (type[i] == "handle_property" ? ".as_octave_value ()" : "")) >> filename;
+    }
+
+    printf ("  else\n    retval = base_properties::get (name);\n\n") >> filename;
+    printf ("  return retval;\n}\n\n") >> filename;
+
+    ## factory defaults method
+
+    printf ("property_list::pval_map_type\n%s::properties::factory_defaults (void)\n{\n",
+            class_name) >> filename;
+    printf ("  property_list::pval_map_type m;\n\n") >> filename;
+
+    for (i = 1; i <= idx; i++)
+    {
+      defval = default[i];
+      if (type[i] == "radio_property" || type[i] == "color_property")
+        defval = gensub (/^.*\{(.*)\}.*$/, "\"\\1\"", "g", defval);
+      if (! defval)
+        defval = "octave_value ()";
+      if (name[i] !~ /__.*/)
+        printf ("  m[\"%s\"] = %s%s;\n", name[i], defval,
+                (type[i] == "handle_property" ? ".as_octave_value ()" : "")) >> filename;
+    }
+
+    printf ("\n  return m;\n}\n\n") >> filename;
+
+    ## go_name static field
+
+    printf ("std::string %s::properties::go_name (\"%s\");\n\n",
+            class_name, class_name) >> filename;
+  }
 }
 
 BEGIN {
-    printf ("// DO NOT EDIT!  Generated automatically by genprops.awk.\n\n");
+  filename = "graphics-props.cc";
+  printf ("// DO NOT EDIT!  Generated automatically by genprops.awk.\n\n");
+  printf ("// DO NOT EDIT!  Generated automatically by genprops.awk.\n\n") > filename;
+}
+
+/BEGIN_PROPERTIES\(.*\)/ {
+  gather = 1;
+  idx = 0;
+  class_name = gensub (/^.*BEGIN_PROPERTIES\((.*)\)/, "\\1", "g");
+  next;
 }
 
 /BEGIN_PROPERTIES/ {
-    gather = 1;
-    idx = 0;
-    next;
+  gather = 1;
+  idx = 0;
+  class_name = "";
+  next;
 }
 
 /END_PROPERTIES/ {
-    emit_declarations();
-    gather = 0;
-    next;
+  emit_declarations();
+  emit_source();
+  gather = 0;
+  next;
 }
 
 {
   if (gather)
-    {
-      if (NF < 2 || NF > 4)
-	next;
+  {
+    if (NF < 2)
+      next;
 
-      idx++;
+    idx++;
 
-      field = 1;
+    field = 1;
 
-      if ($field == "mutable")
-      {
-	  mutable[idx] = 1;
-	  field++;
-      }
-      else
-	  mutable[idx] = 0;
+    if ($field == "mutable")
+    {
+      mutable[idx] = 1;
+      field++;
+    }
+    else
+      mutable[idx] = 0;
 
-      type[idx] = $(field++);
-      name[idx] = $(field++);
+    type[idx] = $(field++);
+    name[idx] = $(field++);
 
-      limits[idx] = 0;
-      mode[idx] = 0;
-      emit_get[idx] = "definition";
-      emit_set[idx] = "definition";
-      if (type[idx] == "octave_value")
-	  emit_ov_set[idx] = "";
-      else
-	  emit_ov_set[idx] = "definition";
+    limits[idx] = 0;
+    mode[idx] = 0;
+    emit_get[idx] = "definition";
+    emit_set[idx] = "definition";
+    default[idx] = "";
+##    if (type[idx] == "octave_value")
+##      emit_ov_set[idx] = "";
+##    else
+##      emit_ov_set[idx] = "definition";
 
-      if (NF == field)
-        {
-	    quals = $field;
-
-	    if (index (quals, "l"))
-		limits[idx] = 1;
+    if (NF >= field)
+    {
+      if ($field != ",")
+      {
+        quals = $(field++);
 
-	    if (index (quals, "m"))
-		mode[idx] = 1;
+        if (index (quals, "l"))
+          limits[idx] = 1;
 
-	    ## There is a custom inline definition for the get function,
-	    ## so we don't emit anything.
-	    if (index (quals, "g"))
-		emit_get[idx] = "";
+        if (index (quals, "m"))
+          mode[idx] = 1;
+
+        ## There is a custom inline definition for the get function,
+        ## so we don't emit anything.
+        if (index (quals, "g"))
+          emit_get[idx] = "";
 
-	    ## There is a custom extern definition for the get function,
-	    ## but we still emit the declaration.
-	    if (index (quals, "G"))
-		emit_get[idx] = "declaration";
+        ## There is a custom extern definition for the get function,
+        ## but we still emit the declaration.
+        if (index (quals, "G"))
+          emit_get[idx] = "declaration";
 
-	    ## There is a custom inline definition for the set function,
-	    ## so we don't emit anything.
-	    if (index (quals, "s"))
-		emit_set[idx] = "";
+        ## There is a custom inline definition for the set function,
+        ## so we don't emit anything.
+        if (index (quals, "s"))
+          emit_set[idx] = "";
 
-	    ## There is a custom extern definition for the set function,
-	    ## but we still emit the declaration.
-	    if (index (quals, "S"))
-		emit_set[idx] = "declaration";
-
-            ## emmit an asignment set function
-            if (index (quals, "a"))
-                emit_ov_set[idx] = "assignment";
+        ## There is a custom extern definition for the set function,
+        ## but we still emit the declaration.
+        if (index (quals, "S"))
+          emit_set[idx] = "declaration";
 
-	    if (type[idx] != "octave_value")
-	    {
-		## The 'o' and 'O' qualifiers are only useful when the
-		## the property type is something other than an
-		## octave_value.
-
-		## There is a custom inline definition for the
-		## octave_value version of the set function, so we
-		## don't emit anything.
-		if (index (quals, "o"))
-		    emit_ov_set[idx] = "";
+##        ## emmit an asignment set function
+##        if (index (quals, "a"))
+##          emit_ov_set[idx] = "assignment";
+##
+##        if (type[idx] != "octave_value")
+##        {
+##          ## The 'o' and 'O' qualifiers are only useful when the
+##          ## the property type is something other than an
+##          ## octave_value.
+##
+##          ## There is a custom inline definition for the
+##          ## octave_value version of the set function, so we
+##          ## don't emit anything.
+##          if (index (quals, "o"))
+##            emit_ov_set[idx] = "";
+##
+##          ## There is a custom extern definition for the
+##          ## octave_value version of the set function, but we
+##          ## still emit the declaration.
+##          if (index (quals, "O"))
+##            emit_ov_set[idx] = "declaration";
+##        }
+      }
 
-		## There is a custom extern definition for the
-		## octave_value version of the set function, but we
-		## still emit the declaration.
-		if (index (quals, "O"))
-		    emit_ov_set[idx] = "declaration";
-	    }
-        }
+      if (NF > field && $field == ",")
+      {
+        field++;
 
+        for (i = field; i <= NF; i++)
+          default[idx] = (default[idx] (i > field ? " " : "") $i);
+      }
     }
+
+  }
   else
-      print $0;
+    print $0;
 }