diff --git a/Doc/Manual/SWIG.html b/Doc/Manual/SWIG.html index 8818a6c60..c17add4c5 100644 --- a/Doc/Manual/SWIG.html +++ b/Doc/Manual/SWIG.html @@ -2506,41 +2506,53 @@ of the object.

-A similar technique can also be used to work with problematic data members. +A similar technique can also be used to work with data members that you want to process. For example, consider this interface:

 typedef struct {
-   char name[50];
-   ...
+  char name[50];
+  ...
 } Person;
 

-By default, the name attribute is read-only because SWIG does not -normally know how to modify arrays. However, you can rewrite the interface -as follows to change this: +Say you wanted to ensure name was always upper case, you can rewrite +the interface as follows to ensure this occurs whenever a name is read or written to:

 typedef struct {
-    %extend {
-       char *name;
-    }
-...
+  %extend {
+    char name[50];
+  }
+  ...
 } Person;
 
-// Specific implementation of set/get functions
 %{
-char *Person_name_get(Person *p) {
-   return p->name;
+#include <string.h>
+#include <ctype.h>
+
+void make_upper(char *name) {
+  char *c;
+  for (c = name; *c; ++c)
+    *c = (char)toupper((int)*c);
 }
+
+/* Specific implementation of set/get functions forcing capitalization */
+
+char *Person_name_get(Person *p) {
+  make_upper(p->name);
+  return p->name;
+}
+
 void Person_name_set(Person *p, char *val) {
-   strncpy(p->name,val,50);
+  strncpy(p->name,val,50);
+  make_upper(p->name);
 }
 %}
 
@@ -2550,7 +2562,7 @@ void Person_name_set(Person *p, char *val) { Finally, it should be stressed that even though %extend can be used to add new data members, these new members can not require the allocation of additional storage in the object (e.g., their values must -be entirely synthesized from existing attributes of the structure). +be entirely synthesized from existing attributes of the structure or obtained elsewhere).

@@ -2633,7 +2645,7 @@ $o->{intRep}->{ivalue} = 7 # Change value of o.intRep.ivalue

-If you have a lot nested structure declarations, it is +If you have a lot of nested structure declarations, it is advisable to double-check them after running SWIG. Although, there is a good chance that they will work, you may have to modify the interface file in certain cases. diff --git a/Examples/test-suite/memberin_extend.i b/Examples/test-suite/memberin_extend.i index 94d2cab3f..c6eb10526 100644 --- a/Examples/test-suite/memberin_extend.i +++ b/Examples/test-suite/memberin_extend.i @@ -1,6 +1,6 @@ %module memberin_extend -// Tests memberin typemap. The default char * memberin typemap will be used. +// Tests memberin typemap is not used for %extend. // The test extends the struct with a pseudo member variable %inline %{ diff --git a/Examples/test-suite/memberin_extend_c.i b/Examples/test-suite/memberin_extend_c.i index e0c2f6333..0599e65a0 100644 --- a/Examples/test-suite/memberin_extend_c.i +++ b/Examples/test-suite/memberin_extend_c.i @@ -4,22 +4,35 @@ %{ typedef struct { - char name[50]; + char name[50]; } Person; %} typedef struct { - %extend { - char *name; - } + %extend { + char name[50]; + } } Person; -/* Specific implementation of set/get functions */ %{ -char *Person_name_get(Person *p) { - return p->name; +#include +#include + +void make_upper(char *name) { + char *c; + for (c = name; *c; ++c) + *c = (char)toupper((int)*c); } + +/* Specific implementation of set/get functions forcing capitalization */ + +char *Person_name_get(Person *p) { + make_upper(p->name); + return p->name; +} + void Person_name_set(Person *p, char *val) { - strncpy(p->name,val,50); + strncpy(p->name,val,50); + make_upper(p->name); } %} diff --git a/Examples/test-suite/python/memberin_extend_c_runme.py b/Examples/test-suite/python/memberin_extend_c_runme.py index af84535eb..314761f89 100644 --- a/Examples/test-suite/python/memberin_extend_c_runme.py +++ b/Examples/test-suite/python/memberin_extend_c_runme.py @@ -1,6 +1,6 @@ import memberin_extend_c t = memberin_extend_c.Person() -t.name = "some name" -if t.name != "some name": - raise RuntimeError("some name wrong") +t.name = "Fred Bloggs" +if t.name != "FRED BLOGGS": + raise RuntimeError("name wrong")