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