* config.c: Added audioop to lists.
* Makefile: change default source directory * socketmodule.c: added getsockname and getpeername * bltinmodule.c: corrected typo in type() error message * Added new built-in functions str() and repr(): repr(x) == `x`; str(x) == x if x is a string, otherwise str(x) == repr(x). * Added joinfields to stropmodule.c (string.join calls joinfields now)
This commit is contained in:
parent
df9320f8bc
commit
c89705d697
|
@ -136,6 +136,9 @@ extern void initamoeba();
|
|||
#ifdef USE_AUDIO
|
||||
extern void initaudio();
|
||||
#endif
|
||||
#ifdef USE_AUDIOOP
|
||||
extern void initaudioop();
|
||||
#endif
|
||||
#ifdef USE_CD
|
||||
extern void initcd();
|
||||
#endif
|
||||
|
@ -242,6 +245,10 @@ struct {
|
|||
{"audio", initaudio},
|
||||
#endif
|
||||
|
||||
#ifdef USE_AUDIOOP
|
||||
{"audioop", initaudioop},
|
||||
#endif
|
||||
|
||||
#ifdef USE_CD
|
||||
{"cd", initcd},
|
||||
#endif
|
||||
|
|
|
@ -57,6 +57,8 @@ Socket methods:
|
|||
- s.getsockopt(level, optname) --> flag
|
||||
- s.bind(sockaddr) --> None
|
||||
- s.connect(sockaddr) --> None
|
||||
- s.getsockname() --> sockaddr
|
||||
- s.getpeername() --> sockaddr
|
||||
- s.listen(n) --> None
|
||||
- s.makefile(mode) --> file object
|
||||
- s.recv(nbytes) --> string
|
||||
|
@ -564,6 +566,50 @@ sock_fileno(s, args)
|
|||
}
|
||||
|
||||
|
||||
/* s.getsockname() method */
|
||||
|
||||
static object *
|
||||
sock_getsockname(s, args)
|
||||
sockobject *s;
|
||||
object *args;
|
||||
{
|
||||
char addrbuf[256];
|
||||
int addrlen, res;
|
||||
if (!getnoarg(args))
|
||||
return NULL;
|
||||
if (!getsockaddrlen(s, &addrlen))
|
||||
return NULL;
|
||||
BGN_SAVE
|
||||
res = getsockname(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
|
||||
END_SAVE
|
||||
if (res < 0)
|
||||
return socket_error();
|
||||
return makesockaddr((struct sockaddr *) addrbuf, addrlen);
|
||||
}
|
||||
|
||||
|
||||
/* s.getpeername() method */
|
||||
|
||||
static object *
|
||||
sock_getpeername(s, args)
|
||||
sockobject *s;
|
||||
object *args;
|
||||
{
|
||||
char addrbuf[256];
|
||||
int addrlen, res;
|
||||
if (!getnoarg(args))
|
||||
return NULL;
|
||||
if (!getsockaddrlen(s, &addrlen))
|
||||
return NULL;
|
||||
BGN_SAVE
|
||||
res = getpeername(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
|
||||
END_SAVE
|
||||
if (res < 0)
|
||||
return socket_error();
|
||||
return makesockaddr((struct sockaddr *) addrbuf, addrlen);
|
||||
}
|
||||
|
||||
|
||||
/* s.listen(n) method */
|
||||
|
||||
static object *
|
||||
|
@ -753,6 +799,8 @@ static struct methodlist sock_methods[] = {
|
|||
{"close", sock_close},
|
||||
{"connect", sock_connect},
|
||||
{"fileno", sock_fileno},
|
||||
{"getsockname", sock_getsockname},
|
||||
{"getpeername", sock_getpeername},
|
||||
{"listen", sock_listen},
|
||||
{"makefile", sock_makefile},
|
||||
{"recv", sock_recv},
|
||||
|
|
|
@ -112,6 +112,70 @@ strop_splitfields(self, args)
|
|||
}
|
||||
|
||||
|
||||
static object *
|
||||
strop_joinfields(self, args)
|
||||
object *self; /* Not used */
|
||||
object *args;
|
||||
{
|
||||
object *seq, *item, *res;
|
||||
object * (*getitem) FPROTO((object *, int));
|
||||
char *sep, *p;
|
||||
int seplen, seqlen, reslen, itemlen, i;
|
||||
|
||||
if (!getargs(args, "(Os#)", &seq, &sep, &seplen))
|
||||
return NULL;
|
||||
if (is_listobject(seq)) {
|
||||
getitem = getlistitem;
|
||||
seqlen = getlistsize(seq);
|
||||
}
|
||||
else if (is_tupleobject(seq)) {
|
||||
getitem = gettupleitem;
|
||||
seqlen = gettuplesize(seq);
|
||||
}
|
||||
else {
|
||||
err_setstr(TypeError, "first argument must be list/tuple");
|
||||
return NULL;
|
||||
}
|
||||
reslen = 0;
|
||||
for (i = 0; i < seqlen; i++) {
|
||||
item = getitem(seq, i);
|
||||
if (!is_stringobject(item)) {
|
||||
err_setstr(TypeError,
|
||||
"first argument must be list/tuple of strings");
|
||||
return NULL;
|
||||
}
|
||||
if (i > 0)
|
||||
reslen = reslen + seplen;
|
||||
reslen = reslen + getstringsize(item);
|
||||
}
|
||||
if (seqlen == 1) {
|
||||
/* Optimization if there's only one item */
|
||||
item = getitem(seq, 0);
|
||||
INCREF(item);
|
||||
return item;
|
||||
}
|
||||
res = newsizedstringobject((char *)NULL, reslen);
|
||||
if (res == NULL)
|
||||
return NULL;
|
||||
p = getstringvalue(res);
|
||||
for (i = 0; i < seqlen; i++) {
|
||||
item = getitem(seq, i);
|
||||
if (i > 0) {
|
||||
memcpy(p, sep, seplen);
|
||||
p += seplen;
|
||||
}
|
||||
itemlen = getstringsize(item);
|
||||
memcpy(p, getstringvalue(item), itemlen);
|
||||
p += itemlen;
|
||||
}
|
||||
if (p != getstringvalue(res) + reslen) {
|
||||
err_setstr(SystemError, "strop.joinfields: assertion failed");
|
||||
return NULL;
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
||||
|
||||
static object *
|
||||
strop_index(self, args)
|
||||
object *self; /* Not used */
|
||||
|
@ -290,6 +354,7 @@ strop_swapcase(self, args)
|
|||
|
||||
static struct methodlist strop_methods[] = {
|
||||
{"index", strop_index},
|
||||
{"joinfields", strop_joinfields},
|
||||
{"lower", strop_lower},
|
||||
{"split", strop_split},
|
||||
{"splitfields", strop_splitfields},
|
||||
|
|
|
@ -601,13 +601,42 @@ builtin_reload(self, v)
|
|||
return reload_module(v);
|
||||
}
|
||||
|
||||
static object *
|
||||
builtin_repr(self, v)
|
||||
object *self;
|
||||
object *v;
|
||||
{
|
||||
if (v == NULL) {
|
||||
err_badarg();
|
||||
return NULL;
|
||||
}
|
||||
return reprobject(v);
|
||||
}
|
||||
|
||||
static object *
|
||||
builtin_str(self, v)
|
||||
object *self;
|
||||
object *v;
|
||||
{
|
||||
if (v == NULL) {
|
||||
err_badarg();
|
||||
return NULL;
|
||||
}
|
||||
if (is_stringobject(v)) {
|
||||
INCREF(v);
|
||||
return v;
|
||||
}
|
||||
else
|
||||
return reprobject(v);
|
||||
}
|
||||
|
||||
static object *
|
||||
builtin_type(self, v)
|
||||
object *self;
|
||||
object *v;
|
||||
{
|
||||
if (v == NULL) {
|
||||
err_setstr(TypeError, "type() requres an argument");
|
||||
err_setstr(TypeError, "type() requires an argument");
|
||||
return NULL;
|
||||
}
|
||||
v = (object *)v->ob_type;
|
||||
|
@ -642,7 +671,9 @@ static struct methodlist builtin_methods[] = {
|
|||
{"range", builtin_range},
|
||||
{"raw_input", builtin_raw_input},
|
||||
{"reload", builtin_reload},
|
||||
{"repr", builtin_repr},
|
||||
{"setattr", builtin_setattr},
|
||||
{"str", builtin_str},
|
||||
{"type", builtin_type},
|
||||
{NULL, NULL},
|
||||
};
|
||||
|
|
Loading…
Reference in New Issue