summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJack Jansen <jack.jansen@cwi.nl>1994-12-14 13:04:05 (GMT)
committerJack Jansen <jack.jansen@cwi.nl>1994-12-14 13:04:05 (GMT)
commit599f0d1c2c72e1364c564226c69d40dcfff1f960 (patch)
tree3996cfcb096fc6f7fc36edeeeb837b7adccc00fb
parente00637bdcf31ed5247de4e3fbea931b52defaf8e (diff)
downloadcpython-599f0d1c2c72e1364c564226c69d40dcfff1f960.zip
cpython-599f0d1c2c72e1364c564226c69d40dcfff1f960.tar.gz
cpython-599f0d1c2c72e1364c564226c69d40dcfff1f960.tar.bz2
- Added ability to get at strings embedded in the struct
- For the mac, added ability to get at pascal-style strings
-rw-r--r--Include/structmember.h7
-rw-r--r--Python/structmember.c24
2 files changed, 30 insertions, 1 deletions
diff --git a/Include/structmember.h b/Include/structmember.h
index 7a047b9..2e9bd0d 100644
--- a/Include/structmember.h
+++ b/Include/structmember.h
@@ -74,6 +74,13 @@ struct memberlist {
#define T_UINT 11
#define T_ULONG 12
+/* Added by Jack: strings contained in the structure */
+#define T_STRING_INPLACE 13
+#ifdef macintosh
+#define T_PSTRING 14 /* macintosh pascal-style counted string */
+#define T_PSTRING_INPLACE 15
+#endif /* macintosh */
+
/* Readonly flag */
#define READONLY 1
#define RO READONLY /* Shorthand */
diff --git a/Python/structmember.c b/Python/structmember.c
index 784bbf5..7ec48b3 100644
--- a/Python/structmember.c
+++ b/Python/structmember.c
@@ -108,6 +108,24 @@ getmember(addr, mlist, name)
else
v = newstringobject(*(char**)addr);
break;
+ case T_STRING_INPLACE:
+ v = newstringobject((char*)addr);
+ break;
+#ifdef macintosh
+ case T_PSTRING:
+ if (*(char**)addr == NULL) {
+ INCREF(None);
+ v = None;
+ }
+ else
+ v = newsizedstringobject((*(char**)addr)+1,
+ **(unsigned char**)addr);
+ break;
+ case T_PSTRING_INPLACE:
+ v = newsizedstringobject(((char*)addr)+1,
+ *(unsigned char*)addr);
+ break;
+#endif /* macintosh */
case T_CHAR:
v = newsizedstringobject((char*)addr, 1);
break;
@@ -140,7 +158,11 @@ setmember(addr, mlist, name, v)
for (l = mlist; l->name != NULL; l++) {
if (strcmp(l->name, name) == 0) {
- if (l->readonly || l->type == T_STRING) {
+#ifdef macintosh
+ if (l->readonly || l->type == T_STRING || l->type == T_PSTRING) {
+#else
+ if (l->readonly || l->type == T_STRING ) {
+#endif /* macintosh */
err_setstr(TypeError, "readonly attribute");
return -1;
}