diff options
author | Guido van Rossum <guido@python.org> | 1994-09-29 09:42:55 (GMT) |
---|---|---|
committer | Guido van Rossum <guido@python.org> | 1994-09-29 09:42:55 (GMT) |
commit | fe3f1a256bc4f0c359ab843d5de517946916218f (patch) | |
tree | a8b42e97bb6a3f7e851f4763384b72ef5f3feaf0 /Python/modsupport.c | |
parent | 6989e54ebf020ce9b3b2ecd327afa650e0e27995 (diff) | |
download | cpython-fe3f1a256bc4f0c359ab843d5de517946916218f.zip cpython-fe3f1a256bc4f0c359ab843d5de517946916218f.tar.gz cpython-fe3f1a256bc4f0c359ab843d5de517946916218f.tar.bz2 |
* Python/{modsupport.c,getargs.c,Makefile.in},
Include/modsupport.h: moved getargs() to its own file and
re-implemented it entirely to support optional arguments, multiple
arguments without surrounding parentheses
(when called as newgetargs()), and better error messages
Diffstat (limited to 'Python/modsupport.c')
-rw-r--r-- | Python/modsupport.c | 340 |
1 files changed, 0 insertions, 340 deletions
diff --git a/Python/modsupport.c b/Python/modsupport.c index 826e285..ae9a838 100644 --- a/Python/modsupport.c +++ b/Python/modsupport.c @@ -25,7 +25,6 @@ OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. /* Module support implementation */ #include "allobjects.h" -#include "modsupport.h" #include "import.h" #ifdef MPW /* MPW pushes 'extended' for float and double types with varargs */ @@ -111,345 +110,6 @@ static int countformat(format, endchar) } -/* Generic argument list parser */ - -static int do_arg PROTO((object *arg, char** p_format, va_list *p_va)); -static int -do_arg(arg, p_format, p_va) - object *arg; - char** p_format; - va_list *p_va; -{ - char *format = *p_format; - - if (arg == NULL) - return 0; /* Incomplete tuple or list */ - - switch (*format++) { - - case '(': /* tuple, distributed over C parameters */ { - int i, n; - if (!is_tupleobject(arg)) - return 0; - n = gettuplesize(arg); - for (i = 0; i < n; i++) { - if (!do_arg(gettupleitem(arg, i), &format, p_va)) - return 0; - } - if (*format++ != ')') - return 0; - break; - } - - case ')': /* End of format -- too many arguments */ - return 0; - - case 'b': /* byte -- very short int */ { - char *p = va_arg(*p_va, char *); - long ival = getintvalue(arg); - if (ival == -1 && err_occurred()) - return 0; - else - *p = ival; - break; - } - - case 'h': /* short int */ { - short *p = va_arg(*p_va, short *); - long ival = getintvalue(arg); - if (ival == -1 && err_occurred()) - return 0; - else - *p = ival; - break; - } - - case 'i': /* int */ { - int *p = va_arg(*p_va, int *); - long ival = getintvalue(arg); - if (ival == -1 && err_occurred()) - return 0; - else - *p = ival; - break; - } - - case 'l': /* long int */ { - long *p = va_arg(*p_va, long *); - long ival = getintvalue(arg); - if (ival == -1 && err_occurred()) - return 0; - else - *p = ival; - break; - } - - case 'f': /* float */ { - float *p = va_arg(*p_va, float *); - double dval = getfloatvalue(arg); - if (err_occurred()) - return 0; - else - *p = dval; - break; - } - - case 'd': /* double */ { - double *p = va_arg(*p_va, double *); - double dval = getfloatvalue(arg); - if (err_occurred()) - return 0; - else - *p = dval; - break; - } - - case 'c': /* char */ { - char *p = va_arg(*p_va, char *); - if (is_stringobject(arg) && getstringsize(arg) == 1) - *p = getstringvalue(arg)[0]; - else - return 0; - break; - } - - case 's': /* string */ { - char **p = va_arg(*p_va, char **); - if (is_stringobject(arg)) - *p = getstringvalue(arg); - else - return 0; - if (*format == '#') { - int *q = va_arg(*p_va, int *); - *q = getstringsize(arg); - format++; - } - else if (strlen(*p) != getstringsize(arg)) { - err_setstr(ValueError, "embedded '\\0' in string arg"); - return 0; - } - break; - } - - case 'z': /* string, may be NULL (None) */ { - char **p = va_arg(*p_va, char **); - if (arg == None) - *p = 0; - else if (is_stringobject(arg)) - *p = getstringvalue(arg); - else - return 0; - if (*format == '#') { - int *q = va_arg(*p_va, int *); - if (arg == None) - *q = 0; - else - *q = getstringsize(arg); - format++; - } - else if (*p != NULL && strlen(*p) != getstringsize(arg)) { - err_setstr(ValueError, "embedded '\\0' in string arg"); - return 0; - } - break; - } - - case 'S': /* string object */ { - object **p = va_arg(*p_va, object **); - if (is_stringobject(arg)) - *p = arg; - else - return 0; - break; - } - - case 'O': /* object */ { - typeobject *type; - object **p; - if (*format == '!') { - format++; - type = va_arg(*p_va, typeobject*); - if (arg->ob_type != type) - return 0; - else { - p = va_arg(*p_va, object **); - *p = arg; - } - } - else if (*format == '?') { - inquiry pred = va_arg(*p_va, inquiry); - format++; - if ((*pred)(arg)) { - p = va_arg(*p_va, object **); - *p = arg; - } - } - else if (*format == '&') { - binaryfunc convert = va_arg(*p_va, binaryfunc); - void *addr = va_arg(*p_va, void *); - format++; - if (! (*convert)(arg, addr)) - return 0; - } - else { - p = va_arg(*p_va, object **); - *p = arg; - } - break; - } - - default: - fprintf(stderr, "bad do_arg format: x%x '%c'\n", - format[-1], format[-1]); - return 0; - - } - - *p_format = format; - - return 1; -} - -#ifdef HAVE_STDARG_PROTOTYPES -/* VARARGS2 */ -int getargs(object *arg, char *format, ...) -#else -/* VARARGS */ -int getargs(va_alist) va_dcl -#endif -{ - char *f; - int ok; - va_list va; -#ifdef HAVE_STDARG_PROTOTYPES - - va_start(va, format); -#else - object *arg; - char *format; - - va_start(va); - arg = va_arg(va, object *); - format = va_arg(va, char *); -#endif - if (*format == '\0' || *format == ';') { - va_end(va); - if (arg != NULL) { - char *str = "no arguments needed"; - if (*format == ';') - str = format+1; - err_setstr(TypeError, str); - return 0; - } - return 1; - } - - f = format; - ok = do_arg(arg, &f, &va) && (*f == '\0' || *f == ';'); - va_end(va); - if (!ok) { - if (!err_occurred()) { - char buf[256]; - char *str; - f = strchr(format, ';'); - if (f != NULL) - str = f+1; - else { - sprintf(buf, "bad argument list (format '%s')", - format); - str = buf; - } - err_setstr(TypeError, str); - } - } - return ok; -} - -#ifdef UNUSED - -int -getlongtuplearg(args, a, n) - object *args; - long *a; /* [n] */ - int n; -{ - int i; - if (!is_tupleobject(args) || gettuplesize(args) != n) { - return err_badarg(); - } - for (i = 0; i < n; i++) { - object *v = gettupleitem(args, i); - if (!is_intobject(v)) { - return err_badarg(); - } - a[i] = getintvalue(v); - } - return 1; -} - -int -getshorttuplearg(args, a, n) - object *args; - short *a; /* [n] */ - int n; -{ - int i; - if (!is_tupleobject(args) || gettuplesize(args) != n) { - return err_badarg(); - } - for (i = 0; i < n; i++) { - object *v = gettupleitem(args, i); - if (!is_intobject(v)) { - return err_badarg(); - } - a[i] = getintvalue(v); - } - return 1; -} - -int -getlonglistarg(args, a, n) - object *args; - long *a; /* [n] */ - int n; -{ - int i; - if (!is_listobject(args) || getlistsize(args) != n) { - return err_badarg(); - } - for (i = 0; i < n; i++) { - object *v = getlistitem(args, i); - if (!is_intobject(v)) { - return err_badarg(); - } - a[i] = getintvalue(v); - } - return 1; -} - -int -getshortlistarg(args, a, n) - object *args; - short *a; /* [n] */ - int n; -{ - int i; - if (!is_listobject(args) || getlistsize(args) != n) { - return err_badarg(); - } - for (i = 0; i < n; i++) { - object *v = getlistitem(args, i); - if (!is_intobject(v)) { - return err_badarg(); - } - a[i] = getintvalue(v); - } - return 1; -} - -#endif /* UNUSED */ - - /* Generic function to create a value -- the inverse of getargs() */ /* After an original idea and first implementation by Steven Miale */ |