mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 05:31:20 +00:00 
			
		
		
		
	* 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
					
				
					 4 changed files with 152 additions and 1 deletions
				
			
		|  | @ -136,6 +136,9 @@ extern void initamoeba(); | ||||||
| #ifdef USE_AUDIO | #ifdef USE_AUDIO | ||||||
| extern void initaudio(); | extern void initaudio(); | ||||||
| #endif | #endif | ||||||
|  | #ifdef USE_AUDIOOP | ||||||
|  | extern void initaudioop(); | ||||||
|  | #endif | ||||||
| #ifdef USE_CD | #ifdef USE_CD | ||||||
| extern void initcd(); | extern void initcd(); | ||||||
| #endif | #endif | ||||||
|  | @ -242,6 +245,10 @@ struct { | ||||||
| 	{"audio",	initaudio}, | 	{"audio",	initaudio}, | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
|  | #ifdef USE_AUDIOOP | ||||||
|  | 	{"audioop",	initaudioop}, | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
| #ifdef USE_CD | #ifdef USE_CD | ||||||
| 	{"cd",		initcd}, | 	{"cd",		initcd}, | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
|  | @ -57,6 +57,8 @@ Socket methods: | ||||||
| - s.getsockopt(level, optname) --> flag | - s.getsockopt(level, optname) --> flag | ||||||
| - s.bind(sockaddr) --> None | - s.bind(sockaddr) --> None | ||||||
| - s.connect(sockaddr) --> None | - s.connect(sockaddr) --> None | ||||||
|  | - s.getsockname() --> sockaddr | ||||||
|  | - s.getpeername() --> sockaddr | ||||||
| - s.listen(n) --> None | - s.listen(n) --> None | ||||||
| - s.makefile(mode) --> file object | - s.makefile(mode) --> file object | ||||||
| - s.recv(nbytes) --> string | - 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 */ | /* s.listen(n) method */ | ||||||
| 
 | 
 | ||||||
| static object * | static object * | ||||||
|  | @ -753,6 +799,8 @@ static struct methodlist sock_methods[] = { | ||||||
| 	{"close",	sock_close}, | 	{"close",	sock_close}, | ||||||
| 	{"connect",	sock_connect}, | 	{"connect",	sock_connect}, | ||||||
| 	{"fileno",	sock_fileno}, | 	{"fileno",	sock_fileno}, | ||||||
|  | 	{"getsockname",	sock_getsockname}, | ||||||
|  | 	{"getpeername",	sock_getpeername}, | ||||||
| 	{"listen",	sock_listen}, | 	{"listen",	sock_listen}, | ||||||
| 	{"makefile",	sock_makefile}, | 	{"makefile",	sock_makefile}, | ||||||
| 	{"recv",	sock_recv}, | 	{"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 * | static object * | ||||||
| strop_index(self, args) | strop_index(self, args) | ||||||
| 	object *self; /* Not used */ | 	object *self; /* Not used */ | ||||||
|  | @ -290,6 +354,7 @@ strop_swapcase(self, args) | ||||||
| 
 | 
 | ||||||
| static struct methodlist strop_methods[] = { | static struct methodlist strop_methods[] = { | ||||||
| 	{"index",	strop_index}, | 	{"index",	strop_index}, | ||||||
|  | 	{"joinfields",	strop_joinfields}, | ||||||
| 	{"lower",	strop_lower}, | 	{"lower",	strop_lower}, | ||||||
| 	{"split",	strop_split}, | 	{"split",	strop_split}, | ||||||
| 	{"splitfields",	strop_splitfields}, | 	{"splitfields",	strop_splitfields}, | ||||||
|  |  | ||||||
|  | @ -601,13 +601,42 @@ builtin_reload(self, v) | ||||||
| 	return reload_module(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 * | static object * | ||||||
| builtin_type(self, v) | builtin_type(self, v) | ||||||
| 	object *self; | 	object *self; | ||||||
| 	object *v; | 	object *v; | ||||||
| { | { | ||||||
| 	if (v == NULL) { | 	if (v == NULL) { | ||||||
| 		err_setstr(TypeError, "type() requres an argument"); | 		err_setstr(TypeError, "type() requires an argument"); | ||||||
| 		return NULL; | 		return NULL; | ||||||
| 	} | 	} | ||||||
| 	v = (object *)v->ob_type; | 	v = (object *)v->ob_type; | ||||||
|  | @ -642,7 +671,9 @@ static struct methodlist builtin_methods[] = { | ||||||
| 	{"range",	builtin_range}, | 	{"range",	builtin_range}, | ||||||
| 	{"raw_input",	builtin_raw_input}, | 	{"raw_input",	builtin_raw_input}, | ||||||
| 	{"reload",	builtin_reload}, | 	{"reload",	builtin_reload}, | ||||||
|  | 	{"repr",	builtin_repr}, | ||||||
| 	{"setattr",	builtin_setattr}, | 	{"setattr",	builtin_setattr}, | ||||||
|  | 	{"str",		builtin_str}, | ||||||
| 	{"type",	builtin_type}, | 	{"type",	builtin_type}, | ||||||
| 	{NULL,		NULL}, | 	{NULL,		NULL}, | ||||||
| }; | }; | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Guido van Rossum
						Guido van Rossum