mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 13:41:24 +00:00 
			
		
		
		
	
		
			
	
	
		
			370 lines
		
	
	
	
		
			6.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			370 lines
		
	
	
	
		
			6.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
|   | /* Functions used by cgen output */ | ||
|  | 
 | ||
|  | #include <stdio.h>
 | ||
|  | 
 | ||
|  | #include "PROTO.h"
 | ||
|  | #include "object.h"
 | ||
|  | #include "intobject.h"
 | ||
|  | #include "floatobject.h"
 | ||
|  | #include "stringobject.h"
 | ||
|  | #include "tupleobject.h"
 | ||
|  | #include "listobject.h"
 | ||
|  | #include "methodobject.h"
 | ||
|  | #include "moduleobject.h"
 | ||
|  | #include "modsupport.h"
 | ||
|  | #include "import.h"
 | ||
|  | #include "cgensupport.h"
 | ||
|  | #include "errors.h"
 | ||
|  | 
 | ||
|  | 
 | ||
|  | /* Functions to construct return values */ | ||
|  | 
 | ||
|  | object * | ||
|  | mknewcharobject(c) | ||
|  | 	int c; | ||
|  | { | ||
|  | 	char ch[1]; | ||
|  | 	ch[0] = c; | ||
|  | 	return newsizedstringobject(ch, 1); | ||
|  | } | ||
|  | 
 | ||
|  | /* Functions to extract arguments.
 | ||
|  |    These needs to know the total number of arguments supplied, | ||
|  |    since the argument list is a tuple only of there is more than | ||
|  |    one argument. */ | ||
|  | 
 | ||
|  | int | ||
|  | getiobjectarg(args, nargs, i, p_arg) | ||
|  | 	register object *args; | ||
|  | 	int nargs, i; | ||
|  | 	object **p_arg; | ||
|  | { | ||
|  | 	if (nargs != 1) { | ||
|  | 		if (args == NULL || !is_tupleobject(args) || | ||
|  | 				nargs != gettuplesize(args) || | ||
|  | 				i < 0 || i >= nargs) { | ||
|  | 			return err_badarg(); | ||
|  | 		} | ||
|  | 		else { | ||
|  | 			args = gettupleitem(args, i); | ||
|  | 		} | ||
|  | 	} | ||
|  | 	if (args == NULL) { | ||
|  | 		return err_badarg(); | ||
|  | 	} | ||
|  | 	*p_arg = args; | ||
|  | 	return 1; | ||
|  | } | ||
|  | 
 | ||
|  | int | ||
|  | getilongarg(args, nargs, i, p_arg) | ||
|  | 	register object *args; | ||
|  | 	int nargs, i; | ||
|  | 	long *p_arg; | ||
|  | { | ||
|  | 	if (nargs != 1) { | ||
|  | 		if (args == NULL || !is_tupleobject(args) || | ||
|  | 				nargs != gettuplesize(args) || | ||
|  | 				i < 0 || i >= nargs) { | ||
|  | 			return err_badarg(); | ||
|  | 		} | ||
|  | 		args = gettupleitem(args, i); | ||
|  | 	} | ||
|  | 	if (args == NULL || !is_intobject(args)) { | ||
|  | 		return err_badarg(); | ||
|  | 	} | ||
|  | 	*p_arg = getintvalue(args); | ||
|  | 	return 1; | ||
|  | } | ||
|  | 
 | ||
|  | int | ||
|  | getishortarg(args, nargs, i, p_arg) | ||
|  | 	register object *args; | ||
|  | 	int nargs, i; | ||
|  | 	short *p_arg; | ||
|  | { | ||
|  | 	long x; | ||
|  | 	if (!getilongarg(args, nargs, i, &x)) | ||
|  | 		return 0; | ||
|  | 	*p_arg = x; | ||
|  | 	return 1; | ||
|  | } | ||
|  | 
 | ||
|  | static int | ||
|  | extractdouble(v, p_arg) | ||
|  | 	register object *v; | ||
|  | 	double *p_arg; | ||
|  | { | ||
|  | 	if (v == NULL) { | ||
|  | 		/* Fall through to error return at end of function */ | ||
|  | 	} | ||
|  | 	else if (is_floatobject(v)) { | ||
|  | 		*p_arg = GETFLOATVALUE((floatobject *)v); | ||
|  | 		return 1; | ||
|  | 	} | ||
|  | 	else if (is_intobject(v)) { | ||
|  | 		*p_arg = GETINTVALUE((intobject *)v); | ||
|  | 		return 1; | ||
|  | 	} | ||
|  | 	return err_badarg(); | ||
|  | } | ||
|  | 
 | ||
|  | static int | ||
|  | extractfloat(v, p_arg) | ||
|  | 	register object *v; | ||
|  | 	float *p_arg; | ||
|  | { | ||
|  | 	if (v == NULL) { | ||
|  | 		/* Fall through to error return at end of function */ | ||
|  | 	} | ||
|  | 	else if (is_floatobject(v)) { | ||
|  | 		*p_arg = GETFLOATVALUE((floatobject *)v); | ||
|  | 		return 1; | ||
|  | 	} | ||
|  | 	else if (is_intobject(v)) { | ||
|  | 		*p_arg = GETINTVALUE((intobject *)v); | ||
|  | 		return 1; | ||
|  | 	} | ||
|  | 	return err_badarg(); | ||
|  | } | ||
|  | 
 | ||
|  | int | ||
|  | getifloatarg(args, nargs, i, p_arg) | ||
|  | 	register object *args; | ||
|  | 	int nargs, i; | ||
|  | 	float *p_arg; | ||
|  | { | ||
|  | 	object *v; | ||
|  | 	float x; | ||
|  | 	if (!getiobjectarg(args, nargs, i, &v)) | ||
|  | 		return 0; | ||
|  | 	if (!extractfloat(v, &x)) | ||
|  | 		return 0; | ||
|  | 	*p_arg = x; | ||
|  | 	return 1; | ||
|  | } | ||
|  | 
 | ||
|  | int | ||
|  | getistringarg(args, nargs, i, p_arg) | ||
|  | 	object *args; | ||
|  | 	int nargs, i; | ||
|  | 	string *p_arg; | ||
|  | { | ||
|  | 	object *v; | ||
|  | 	if (!getiobjectarg(args, nargs, i, &v)) | ||
|  | 		return NULL; | ||
|  | 	if (!is_stringobject(v)) { | ||
|  | 		return err_badarg(); | ||
|  | 	} | ||
|  | 	*p_arg = getstringvalue(v); | ||
|  | 	return 1; | ||
|  | } | ||
|  | 
 | ||
|  | int | ||
|  | getichararg(args, nargs, i, p_arg) | ||
|  | 	object *args; | ||
|  | 	int nargs, i; | ||
|  | 	char *p_arg; | ||
|  | { | ||
|  | 	string x; | ||
|  | 	if (!getistringarg(args, nargs, i, &x)) | ||
|  | 		return 0; | ||
|  | 	if (x[0] == '\0' || x[1] != '\0') { | ||
|  | 		/* Not exactly one char */ | ||
|  | 		return err_badarg(); | ||
|  | 	} | ||
|  | 	*p_arg = x[0]; | ||
|  | 	return 1; | ||
|  | } | ||
|  | 
 | ||
|  | int | ||
|  | getilongarraysize(args, nargs, i, p_arg) | ||
|  | 	object *args; | ||
|  | 	int nargs, i; | ||
|  | 	long *p_arg; | ||
|  | { | ||
|  | 	object *v; | ||
|  | 	if (!getiobjectarg(args, nargs, i, &v)) | ||
|  | 		return 0; | ||
|  | 	if (is_tupleobject(v)) { | ||
|  | 		*p_arg = gettuplesize(v); | ||
|  | 		return 1; | ||
|  | 	} | ||
|  | 	if (is_listobject(v)) { | ||
|  | 		*p_arg = getlistsize(v); | ||
|  | 		return 1; | ||
|  | 	} | ||
|  | 	return err_badarg(); | ||
|  | } | ||
|  | 
 | ||
|  | int | ||
|  | getishortarraysize(args, nargs, i, p_arg) | ||
|  | 	object *args; | ||
|  | 	int nargs, i; | ||
|  | 	short *p_arg; | ||
|  | { | ||
|  | 	long x; | ||
|  | 	if (!getilongarraysize(args, nargs, i, &x)) | ||
|  | 		return 0; | ||
|  | 	*p_arg = x; | ||
|  | 	return 1; | ||
|  | } | ||
|  | 
 | ||
|  | /* XXX The following four are too similar.  Should share more code. */ | ||
|  | 
 | ||
|  | int | ||
|  | getilongarray(args, nargs, i, n, p_arg) | ||
|  | 	object *args; | ||
|  | 	int nargs, i; | ||
|  | 	int n; | ||
|  | 	long *p_arg; /* [n] */ | ||
|  | { | ||
|  | 	object *v, *w; | ||
|  | 	if (!getiobjectarg(args, nargs, i, &v)) | ||
|  | 		return 0; | ||
|  | 	if (is_tupleobject(v)) { | ||
|  | 		if (gettuplesize(v) != n) { | ||
|  | 			return err_badarg(); | ||
|  | 		} | ||
|  | 		for (i = 0; i < n; i++) { | ||
|  | 			w = gettupleitem(v, i); | ||
|  | 			if (!is_intobject(w)) { | ||
|  | 				return err_badarg(); | ||
|  | 			} | ||
|  | 			p_arg[i] = getintvalue(w); | ||
|  | 		} | ||
|  | 		return 1; | ||
|  | 	} | ||
|  | 	else if (is_listobject(v)) { | ||
|  | 		if (getlistsize(v) != n) { | ||
|  | 			return err_badarg(); | ||
|  | 		} | ||
|  | 		for (i = 0; i < n; i++) { | ||
|  | 			w = getlistitem(v, i); | ||
|  | 			if (!is_intobject(w)) { | ||
|  | 				return err_badarg(); | ||
|  | 			} | ||
|  | 			p_arg[i] = getintvalue(w); | ||
|  | 		} | ||
|  | 		return 1; | ||
|  | 	} | ||
|  | 	else { | ||
|  | 		return err_badarg(); | ||
|  | 	} | ||
|  | } | ||
|  | 
 | ||
|  | int | ||
|  | getishortarray(args, nargs, i, n, p_arg) | ||
|  | 	object *args; | ||
|  | 	int nargs, i; | ||
|  | 	int n; | ||
|  | 	short *p_arg; /* [n] */ | ||
|  | { | ||
|  | 	object *v, *w; | ||
|  | 	if (!getiobjectarg(args, nargs, i, &v)) | ||
|  | 		return 0; | ||
|  | 	if (is_tupleobject(v)) { | ||
|  | 		if (gettuplesize(v) != n) { | ||
|  | 			return err_badarg(); | ||
|  | 		} | ||
|  | 		for (i = 0; i < n; i++) { | ||
|  | 			w = gettupleitem(v, i); | ||
|  | 			if (!is_intobject(w)) { | ||
|  | 				return err_badarg(); | ||
|  | 			} | ||
|  | 			p_arg[i] = getintvalue(w); | ||
|  | 		} | ||
|  | 		return 1; | ||
|  | 	} | ||
|  | 	else if (is_listobject(v)) { | ||
|  | 		if (getlistsize(v) != n) { | ||
|  | 			return err_badarg(); | ||
|  | 		} | ||
|  | 		for (i = 0; i < n; i++) { | ||
|  | 			w = getlistitem(v, i); | ||
|  | 			if (!is_intobject(w)) { | ||
|  | 				return err_badarg(); | ||
|  | 			} | ||
|  | 			p_arg[i] = getintvalue(w); | ||
|  | 		} | ||
|  | 		return 1; | ||
|  | 	} | ||
|  | 	else { | ||
|  | 		return err_badarg(); | ||
|  | 	} | ||
|  | } | ||
|  | 
 | ||
|  | int | ||
|  | getidoublearray(args, nargs, i, n, p_arg) | ||
|  | 	object *args; | ||
|  | 	int nargs, i; | ||
|  | 	int n; | ||
|  | 	double *p_arg; /* [n] */ | ||
|  | { | ||
|  | 	object *v, *w; | ||
|  | 	if (!getiobjectarg(args, nargs, i, &v)) | ||
|  | 		return 0; | ||
|  | 	if (is_tupleobject(v)) { | ||
|  | 		if (gettuplesize(v) != n) { | ||
|  | 			return err_badarg(); | ||
|  | 		} | ||
|  | 		for (i = 0; i < n; i++) { | ||
|  | 			w = gettupleitem(v, i); | ||
|  | 			if (!extractdouble(w, &p_arg[i])) | ||
|  | 				return 0; | ||
|  | 		} | ||
|  | 		return 1; | ||
|  | 	} | ||
|  | 	else if (is_listobject(v)) { | ||
|  | 		if (getlistsize(v) != n) { | ||
|  | 			return err_badarg(); | ||
|  | 		} | ||
|  | 		for (i = 0; i < n; i++) { | ||
|  | 			w = getlistitem(v, i); | ||
|  | 			if (!extractdouble(w, &p_arg[i])) | ||
|  | 				return 0; | ||
|  | 		} | ||
|  | 		return 1; | ||
|  | 	} | ||
|  | 	else { | ||
|  | 		return err_badarg(); | ||
|  | 	} | ||
|  | } | ||
|  | 
 | ||
|  | int | ||
|  | getifloatarray(args, nargs, i, n, p_arg) | ||
|  | 	object *args; | ||
|  | 	int nargs, i; | ||
|  | 	int n; | ||
|  | 	float *p_arg; /* [n] */ | ||
|  | { | ||
|  | 	object *v, *w; | ||
|  | 	if (!getiobjectarg(args, nargs, i, &v)) | ||
|  | 		return 0; | ||
|  | 	if (is_tupleobject(v)) { | ||
|  | 		if (gettuplesize(v) != n) { | ||
|  | 			return err_badarg(); | ||
|  | 		} | ||
|  | 		for (i = 0; i < n; i++) { | ||
|  | 			w = gettupleitem(v, i); | ||
|  | 			if (!extractfloat(w, &p_arg[i])) | ||
|  | 				return 0; | ||
|  | 		} | ||
|  | 		return 1; | ||
|  | 	} | ||
|  | 	else if (is_listobject(v)) { | ||
|  | 		if (getlistsize(v) != n) { | ||
|  | 			return err_badarg(); | ||
|  | 		} | ||
|  | 		for (i = 0; i < n; i++) { | ||
|  | 			w = getlistitem(v, i); | ||
|  | 			if (!extractfloat(w, &p_arg[i])) | ||
|  | 				return 0; | ||
|  | 		} | ||
|  | 		return 1; | ||
|  | 	} | ||
|  | 	else { | ||
|  | 		return err_badarg(); | ||
|  | 	} | ||
|  | } |