]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
* Changed many files to use mkvalue() instead of newtupleobject().
authorGuido van Rossum <guido@python.org>
Tue, 16 Mar 1993 12:15:04 +0000 (12:15 +0000)
committerGuido van Rossum <guido@python.org>
Tue, 16 Mar 1993 12:15:04 +0000 (12:15 +0000)
* Fixcprt.py: added [-y file] option, do only files younger than file.
* modsupport.[ch]: added vmkvalue().
* intobject.c: use mkvalue().
* stringobject.c: added "formatstring"; renamed string* to string_*;
  ceval.c: call formatstring for string % value.
* longobject.c: close memory leak in divmod.
* parsetok.c: set result node to NULL when returning an error.

21 files changed:
Include/modsupport.h
Include/stringobject.h
Modules/almodule.c
Modules/clmodule.c
Modules/flmodule.c
Modules/fmmodule.c
Modules/mathmodule.c
Modules/posixmodule.c
Modules/pwdmodule.c
Modules/selectmodule.c
Modules/socketmodule.c
Objects/classobject.c
Objects/floatobject.c
Objects/intobject.c
Objects/longobject.c
Objects/stringobject.c
Parser/parsetok.c
Python/bltinmodule.c
Python/ceval.c
Python/errors.c
Python/modsupport.c

index 28821d9ef78be6e5d98c55995df22032c6242917..bb809c76bd8bfbc8f56a24d9f6d6e359be00c0d0 100644 (file)
@@ -1,6 +1,6 @@
 /***********************************************************
-Copyright 1991, 1992 by Stichting Mathematisch Centrum, Amsterdam, The
-Netherlands.
+Copyright 1991, 1992, 1993 by Stichting Mathematisch Centrum,
+Amsterdam, The Netherlands.
 
                         All Rights Reserved
 
@@ -24,9 +24,21 @@ OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 
 /* Module support interface */
 
+#ifdef HAVE_PROTOTYPES
+#define USE_STDARG
+#endif
+
+#ifdef USE_STDARG
+#include <stdarg.h>
+#else
+#include <varargs.h>
+#endif
+
 extern object *initmodule PROTO((char *, struct methodlist *));
 extern int getargs PROTO((object *, char *, ...));
+extern int vgetargs PROTO((object *, char *, va_list));
 extern object *mkvalue PROTO((char *, ...));
+extern object *vmkvalue PROTO((char *, va_list));
 
 #define getnoarg(v) getargs(v, "")
 #define getintarg(v, a) getargs(v, "i", a)
index 2fb386b43378c715d936071cbf0a4d0bb8123940..2a3d47ab6b503ef6a9c58208d5170b139713b4c7 100644 (file)
@@ -1,6 +1,6 @@
 /***********************************************************
-Copyright 1991, 1992 by Stichting Mathematisch Centrum, Amsterdam, The
-Netherlands.
+Copyright 1991, 1992, 1993 by Stichting Mathematisch Centrum,
+Amsterdam, The Netherlands.
 
                         All Rights Reserved
 
@@ -58,6 +58,7 @@ extern unsigned int getstringsize PROTO((object *));
 extern char *getstringvalue PROTO((object *));
 extern void joinstring PROTO((object **, object *));
 extern int resizestring PROTO((object **, int));
+extern object *formatstring PROTO((object *, object *));
 
 /* Macro, trading safety for speed */
 #define GETSTRINGVALUE(op) ((op)->ob_sval)
index aef2eee05a33e0b7d8bd18ae4bfed7e111163e8a..d986d3445e4ea9163f1b6ec3efacd6e8895097cd 100644 (file)
@@ -1,6 +1,6 @@
 /**********************************************************
-Copyright 1991, 1992 by Stichting Mathematisch Centrum, Amsterdam, The
-Netherlands.
+Copyright 1991, 1992, 1993 by Stichting Mathematisch Centrum,
+Amsterdam, The Netherlands.
 
                         All Rights Reserved
 
index 8220862f49ba1c4b30370fa6af41ea34d29d05b1..a9a378e3451fafef8fe5f88cddf1b17642b08c7f 100644 (file)
@@ -1,6 +1,6 @@
 /***********************************************************
-Copyright 1991, 1992 by Stichting Mathematisch Centrum, Amsterdam, The
-Netherlands.
+Copyright 1991, 1992, 1993 by Stichting Mathematisch Centrum,
+Amsterdam, The Netherlands.
 
                         All Rights Reserved
 
index dca39ad646b498056b5a2ff1dba5d42fc1aa229c..00cf12c7fd4f3a6b8b055f54b49da11778a05bcf 100644 (file)
@@ -1,6 +1,6 @@
 /**********************************************************
-Copyright 1991, 1992 by Stichting Mathematisch Centrum, Amsterdam, The
-Netherlands.
+Copyright 1991, 1992, 1993 by Stichting Mathematisch Centrum,
+Amsterdam, The Netherlands.
 
                         All Rights Reserved
 
@@ -614,18 +614,12 @@ call_forms_OUTfOUTf (func, obj, args)
        object *args;
 {
        float f1, f2;
-       object *arg;
        
        if (!getnoarg(args)) return NULL;
        
        (*func) (obj, &f1, &f2);
-       
-       arg = newtupleobject (2);
-       if (arg == NULL) return NULL;
 
-       settupleitem (arg, 0, newfloatobject (f1));
-       settupleitem (arg, 1, newfloatobject (f2));
-       return arg;
+       return mkvalue("(ff)", f1, f2);
 }
 
 #ifdef UNUSED
@@ -966,20 +960,13 @@ get_clock(g, args)
        object *args;
 {
        int i0, i1, i2;
-       object *arg;
 
        if (!getnoarg(args))
                return NULL;
 
        fl_get_clock (g->ob_generic, &i0, &i1, &i2);
 
-       arg = newtupleobject (3);
-       if (arg == NULL) return NULL;
-
-       settupleitem (arg, 0, newintobject (i0));
-       settupleitem (arg, 1, newintobject (i1));
-       settupleitem (arg, 2, newintobject (i2));
-       return arg;
+       return mkvalue("(iii)", i0, i1, i2);
 }
 
 static struct methodlist clock_methods[] = {
@@ -2064,11 +2051,9 @@ forms_do_or_check_forms(dummy, args, func)
                        if (my_event_callback == NULL)
                                return newintobject(-1L);
                        dev = fl_qread(&val);
-                       arg = newtupleobject(2);
+                       arg = mkvalue("(ih)", dev, val);
                        if (arg == NULL)
                                return NULL;
-                       settupleitem(arg, 0, newintobject((long)dev));
-                       settupleitem(arg, 1, newintobject((long)val));
                        res = call_object(my_event_callback, arg);
                        XDECREF(res);
                        DECREF(arg);
@@ -2085,11 +2070,9 @@ forms_do_or_check_forms(dummy, args, func)
                        INCREF(g);
                        return ((object *) g);
                }
-               arg = newtupleobject(2);
-               INCREF(g);
-               settupleitem(arg, 0, (object *)g);
-               INCREF(g->ob_callback_arg);
-               settupleitem(arg, 1, g->ob_callback_arg);
+               arg = mkvalue("(OO)", (object *)g, g->ob_callback_arg);
+               if (arg == NULL)
+                       return NULL;
                res = call_object(g->ob_callback, arg);
                XDECREF(res);
                DECREF(arg);
@@ -2259,18 +2242,12 @@ forms_qread(self, args)
        object *self;
        object *args;
 {
-       long retval;
-       short arg1;
+       int dev;
+       short val;
        BGN_SAVE
-       retval = fl_qread(&arg1);
+       dev = fl_qread(&val);
        END_SAVE
-       {
-               object *v = newtupleobject(2);
-               if (v == NULL) return NULL;
-               settupleitem(v, 0, newintobject(retval));
-               settupleitem(v, 1, newintobject((long)arg1));
-               return v;
-       }
+       return mkvalue("(ih)", dev, val);
 }
 
 static object *
@@ -2336,21 +2313,12 @@ forms_getmcolor(self, args)
 {
        int arg;
        short r, g, b;
-       object *v;
 
        if (!getintarg(args, &arg)) return NULL;
 
        fl_getmcolor(arg, &r, &g, &b);
 
-       v = newtupleobject(3);
-
-       if (v == NULL) return NULL;
-
-       settupleitem(v, 0, newintobject((long)r));
-       settupleitem(v, 1, newintobject((long)g));
-       settupleitem(v, 2, newintobject((long)b));
-
-       return v;
+       return mkvalue("(hhh)", r, g, b);
 }
 
 static object *
@@ -2358,21 +2326,13 @@ forms_get_mouse(self, args)
        object *self;
        object *args;
 {
-       float x, y ;
-       object *v;
+       float x, y;
 
        if (!getnoarg(args)) return NULL;
        
        fl_get_mouse(&x, &y);
 
-       v = newtupleobject(2);
-
-       if (v == NULL) return NULL;
-
-       settupleitem(v, 0, newfloatobject(x));
-       settupleitem(v, 1, newfloatobject(y));
-
-       return v;
+       return mkvalue("(ff)", x, y);
 }
 
 static object *
index f3df6ce2e3d275238cb9d95046c09b7831e77390..8d54d97140f0122b0ebdcf7b7362785e4c504811 100644 (file)
@@ -1,6 +1,6 @@
 /***********************************************************
-Copyright 1991, 1992 by Stichting Mathematisch Centrum, Amsterdam, The
-Netherlands.
+Copyright 1991, 1992, 1993 by Stichting Mathematisch Centrum,
+Amsterdam, The Netherlands.
 
                         All Rights Reserved
 
@@ -134,22 +134,15 @@ fh_getfontinfo(self, args)
                err_setstr(RuntimeError, "error in fmgetfontinfo");
                return NULL;
        }
-       v = newtupleobject(8);
-       if (v == NULL)
-               return NULL;
-#define SET(i, member) settupleitem(v, i, newintobject(info.member))
-       SET(0, printermatched);
-       SET(1, fixed_width);
-       SET(2, xorig);
-       SET(3, yorig);
-       SET(4, xsize);
-       SET(5, ysize);
-       SET(6, height);
-       SET(7, nglyphs);
-#undef SET
-       if (err_occurred())
-               return NULL;
-       return v;
+       return mkvalue("(llllllll)",
+                      info.printermatched,
+                      info.fixed_width,
+                      info.xorig,
+                      info.yorig,
+                      info.xsize,
+                      info.ysize,
+                      info.height,
+                      info.nglyphs);
 }
 
 #if 0
index 00aa5eb90341f32afb52cafce057653d0c44fdb4..15211339bfcd46c7558fb229ebd9ba45a4ac1b1a 100644 (file)
@@ -1,6 +1,6 @@
 /***********************************************************
-Copyright 1991, 1992 by Stichting Mathematisch Centrum, Amsterdam, The
-Netherlands.
+Copyright 1991, 1992, 1993 by Stichting Mathematisch Centrum,
+Amsterdam, The Netherlands.
 
                         All Rights Reserved
 
@@ -136,7 +136,6 @@ math_frexp(self, args)
        object *self;
        object *args;
 {
-       object *v;
        double x;
        int i;
        if (!getdoublearg(args, &x))
@@ -146,16 +145,7 @@ math_frexp(self, args)
        CHECK(x);
        if (errno != 0)
                return math_error();
-       v = newtupleobject(2);
-       if (v != NULL) {
-               settupleitem(v, 0, newfloatobject(x));
-               settupleitem(v, 1, newintobject((long)i));
-               if (err_occurred()) {
-                       DECREF(v);
-                       v = NULL;
-               }
-       }
-       return v;
+       return mkvalue("(di)", x, i);
 }
 
 static object *
@@ -181,7 +171,6 @@ math_modf(self, args)
        object *self;
        object *args;
 {
-       object *v;
        double x, y;
        if (!getdoublearg(args, &x))
                return NULL;
@@ -190,16 +179,7 @@ math_modf(self, args)
        CHECK(x);
        if (errno != 0)
                return math_error();
-       v = newtupleobject(2);
-       if (v != NULL) {
-               settupleitem(v, 0, newfloatobject(x));
-               settupleitem(v, 1, newfloatobject(y));
-               if (err_occurred()) {
-                       DECREF(v);
-                       v = NULL;
-               }
-       }
-       return v;
+       return mkvalue("(dd)", x, y);
 }
 
 static struct methodlist math_methods[] = {
index a6001151fb98a991ad3a5d57531f194a19102833..4e8440795f1cf2c924bebc0442540837f8b4ccfc 100644 (file)
@@ -216,26 +216,17 @@ posix_do_stat(self, args, statfunc)
        END_SAVE
        if (res != 0)
                return posix_error();
-       v = newtupleobject(10);
-       if (v == NULL)
-               return NULL;
-#define SET(i, st_member) settupleitem(v, i, newintobject((long)st.st_member))
-       SET(0, st_mode);
-       SET(1, st_ino);
-       SET(2, st_dev);
-       SET(3, st_nlink);
-       SET(4, st_uid);
-       SET(5, st_gid);
-       SET(6, st_size);
-       SET(7, st_atime);
-       SET(8, st_mtime);
-       SET(9, st_ctime);
-#undef SET
-       if (err_occurred()) {
-               DECREF(v);
-               return NULL;
-       }
-       return v;
+       v = mkvalue("(llllllllll)",
+                   (long)st.st_mode,
+                   (long)st.st_ino,
+                   (long)st.st_dev,
+                   (long)st.st_nlink,
+                   (long)st.st_uid,
+                   (long)st.st_gid,
+                   (long)st.st_size,
+                   (long)st.st_atime,
+                   (long)st.st_mtime,
+                   (long)st.st_ctime);
 }
 
 
@@ -477,21 +468,12 @@ posix_uname(self, args)
        END_SAVE
        if (res < 0)
                return posix_error();
-       v = newtupleobject(5);
-       if (v == NULL)
-               return NULL;
-#define SET(i, member) settupleitem(v, i, newstringobject(u.member))
-       SET(0, sysname);
-       SET(1, nodename);
-       SET(2, release);
-       SET(3, version);
-       SET(4, machine);
-#undef SET
-       if (err_occurred()) {
-               DECREF(v);
-               return NULL;
-       }
-       return v;
+       return mkvalue("(sssss)",
+                      u.sysname,
+                      u.nodename,
+                      u.release,
+                      u.version,
+                      u.machine);
 }
 #endif /* NO_UNAME */
 
index 4d787baf3d16b7a195635c173babb7e70042f402..eb7a1cc3eb8417f3297a812b943d049de5c1403c 100644 (file)
@@ -1,6 +1,6 @@
 /***********************************************************
-Copyright 1991, 1992 by Stichting Mathematisch Centrum, Amsterdam, The
-Netherlands.
+Copyright 1991, 1992, 1993 by Stichting Mathematisch Centrum,
+Amsterdam, The Netherlands.
 
                         All Rights Reserved
 
@@ -38,25 +38,14 @@ OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 static object *mkpwent(p)
        struct passwd *p;
 {
-       object *v;
-       if ((v = newtupleobject(7)) == NULL)
-               return NULL;
-#define ISET(i, member) settupleitem(v, i, newintobject((long)p->member))
-#define SSET(i, member) settupleitem(v, i, newstringobject(p->member))
-       SSET(0, pw_name);
-       SSET(1, pw_passwd);
-       ISET(2, pw_uid);
-       ISET(3, pw_gid);
-       SSET(4, pw_gecos);
-       SSET(5, pw_dir);
-       SSET(6, pw_shell);
-#undef SSET
-#undef ISET
-       if (err_occurred()) {
-               DECREF(v);
-               return NULL;
-       }
-       return v;
+       return mkvalue("(ssllsss)",
+                      p->pw_name,
+                      p->pw_passwd,
+                      (long)p->pw_uid,
+                      (long)p->pw_gid,
+                      p->pw_gecos,
+                      p->pw_dir,
+                      p->pw_shell);
 }
 
 static object *pwd_getpwuid(self, args)
@@ -130,32 +119,24 @@ static object *mkgrent(p)
 {
        object *v, *w;
        char **member;
-       if ((v = newtupleobject(4)) == NULL)
-               return NULL;
-#define ISET(i, member) settupleitem(v, i, newintobject((long)p->member))
-#define SSET(i, member) settupleitem(v, i, newstringobject(p->member))
-       SSET(0, gr_name);
-       SSET(1, gr_passwd);
-       ISET(2, gr_gid);
-#undef SSET
-#undef ISET
-       if (err_occurred()) {
-               DECREF(v);
-               return NULL;
-       }
        if ((w = newlistobject(0)) == NULL) {
                DECREF(v);
                return NULL;
        }
-       (void) settupleitem(v, 3, w); /* Cannot fail; eats refcnt */
        for (member = p->gr_mem; *member != NULL; member++) {
                object *x = newstringobject(*member);
                if (x == NULL || addlistitem(w, x) != 0) {
                        XDECREF(x);
-                       DECREF(v);
+                       DECREF(w);
                        return NULL;
                }
        }
+       v = mkvalue("(sslO)",
+                      p->gr_name,
+                      p->gr_passwd,
+                      (long)p->gr_gid,
+                      w);
+       DECREF(w);
        return v;
 }
 
index 99a9213c7630de38c9fd035f8145bacfa66fe6a4..de80b826599d051b4ef0c85068dd5b97931d458c 100644 (file)
@@ -1,6 +1,6 @@
 /***********************************************************
-Copyright 1991, 1992 by Stichting Mathematisch Centrum, Amsterdam, The
-Netherlands.
+Copyright 1991, 1992, 1993 by Stichting Mathematisch Centrum,
+Amsterdam, The Netherlands.
 
                         All Rights Reserved
 
index 2a0e291dcf3a6358398294d5425a72b5b04c1174..0e20307f7daff1816bb1920f03c99c98dbf13f11 100644 (file)
@@ -1,6 +1,6 @@
 /***********************************************************
-Copyright 1991, 1992 by Stichting Mathematisch Centrum, Amsterdam, The
-Netherlands.
+Copyright 1991, 1992, 1993 by Stichting Mathematisch Centrum,
+Amsterdam, The Netherlands.
 
                         All Rights Reserved
 
index 1e6fdb660afaa6511d86dccdded57985189518ce..95b85f52a42ad1f4c2614b2dc49b147a3c78dbc6 100644 (file)
@@ -1,6 +1,6 @@
 /***********************************************************
-Copyright 1991, 1992 by Stichting Mathematisch Centrum, Amsterdam, The
-Netherlands.
+Copyright 1991, 1992, 1993 by Stichting Mathematisch Centrum,
+Amsterdam, The Netherlands.
 
                         All Rights Reserved
 
@@ -49,7 +49,7 @@ newclassobject(bases, methods, name)
        if (bases == NULL) {
                bases = newtupleobject(0);
                if (bases == NULL)
-                       return err_nomem();
+                       return NULL;
        }
        else
                INCREF(bases);
index 1a1598c91e2b40118088270d89da52e9f00ef929..e5635837d075f4a95f56e5e7af31f29237a87a4d 100644 (file)
@@ -1,6 +1,6 @@
 /***********************************************************
-Copyright 1991, 1992 by Stichting Mathematisch Centrum, Amsterdam, The
-Netherlands.
+Copyright 1991, 1992, 1993 by Stichting Mathematisch Centrum,
+Amsterdam, The Netherlands.
 
                         All Rights Reserved
 
@@ -28,6 +28,7 @@ OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
    for any kind of float exception without losing portability. */
 
 #include "allobjects.h"
+#include "modsupport.h"
 
 #include <errno.h>
 #ifndef errno
@@ -222,16 +223,7 @@ float_divmod(v, w)
                mod += wx;
                div -= 1.0;
        }
-       t = newtupleobject(2);
-       if (t != NULL) {
-               settupleitem(t, 0, newfloatobject(div));
-               settupleitem(t, 1, newfloatobject(mod));
-               if (err_occurred()) {
-                       DECREF(t);
-                       t = NULL;
-               }
-       }
-       return t;
+       return mkvalue("(dd)", div, mod);
 }
 
 static object *
index e10dab2b3ea1fc4f8d1336c69d9e364cd2791714..858458c0848da1e1e2aebe7323794b69f8fed21d 100644 (file)
@@ -1,6 +1,6 @@
 /***********************************************************
-Copyright 1991, 1992 by Stichting Mathematisch Centrum, Amsterdam, The
-Netherlands.
+Copyright 1991, 1992, 1993 by Stichting Mathematisch Centrum,
+Amsterdam, The Netherlands.
 
                         All Rights Reserved
 
@@ -25,6 +25,7 @@ OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 /* Integer object implementation */
 
 #include "allobjects.h"
+#include "modsupport.h"
 
 /* Standard Booleans */
 
@@ -252,18 +253,7 @@ int_divmod(x, y)
        long d, m;
        if (i_divmod(x, y, &d, &m) < 0)
                return NULL;
-       v = newtupleobject(2);
-       v0 = newintobject(d);
-       v1 = newintobject(m);
-       if (v == NULL || v0 == NULL || v1 == NULL ||
-               settupleitem(v, 0, v0) != 0 ||
-               settupleitem(v, 1, v1) != 0) {
-               XDECREF(v);
-               XDECREF(v0);
-               XDECREF(v1);
-               v = NULL;
-       }
-       return v;
+       return mkvalue("(ll)", d, m);
 }
 
 static object *
index 4c5ede548294e71036c34bb287d33a9d9026b93b..38473e24226b1c0ad51648668ed1304945e5b39a 100644 (file)
@@ -844,8 +844,10 @@ l_divmod(v, w, pdiv, pmod)
                    (temp = (longobject *) long_sub(div, one)) == NULL) {
                        DECREF(mod);
                        DECREF(div);
+                       XDECREF(one);
                        return -1;
                }
+               DECREF(one);
                DECREF(div);
                div = temp;
        }
index 9f8de920b243c8ee1c8d8981a4d3e290f9bcf929..25f12fc36d0d3250fdf0b4be25c360bdad827bd3 100644 (file)
@@ -1,6 +1,6 @@
 /***********************************************************
-Copyright 1991, 1992 by Stichting Mathematisch Centrum, Amsterdam, The
-Netherlands.
+Copyright 1991, 1992, 1993 by Stichting Mathematisch Centrum,
+Amsterdam, The Netherlands.
 
                         All Rights Reserved
 
@@ -61,7 +61,7 @@ newstringobject(str)
 }
 
 void
-stringdealloc(op)
+string_dealloc(op)
        object *op;
 {
        DEL(op);
@@ -92,7 +92,7 @@ getstringvalue(op)
 /* Methods */
 
 static int
-stringprint(op, fp, flags)
+string_print(op, fp, flags)
        stringobject *op;
        FILE *fp;
        int flags;
@@ -119,7 +119,7 @@ stringprint(op, fp, flags)
 }
 
 static object *
-stringrepr(op)
+string_repr(op)
        register stringobject *op;
 {
        /* XXX overflow? */
@@ -155,14 +155,14 @@ stringrepr(op)
 }
 
 static int
-stringlength(a)
+string_length(a)
        stringobject *a;
 {
        return a->ob_size;
 }
 
 static object *
-stringconcat(a, bb)
+string_concat(a, bb)
        register stringobject *a;
        register object *bb;
 {
@@ -198,7 +198,7 @@ stringconcat(a, bb)
 }
 
 static object *
-stringrepeat(a, n)
+string_repeat(a, n)
        register stringobject *a;
        register int n;
 {
@@ -228,7 +228,7 @@ stringrepeat(a, n)
 /* String slice a[i:j] consists of characters a[i] ... a[j-1] */
 
 static object *
-stringslice(a, i, j)
+string_slice(a, i, j)
        register stringobject *a;
        register int i, j; /* May be negative! */
 {
@@ -258,7 +258,7 @@ stringslice(a, i, j)
 static object *characters[UCHAR_MAX + 1];
 
 static object *
-stringitem(a, i)
+string_item(a, i)
        stringobject *a;
        register int i;
 {
@@ -282,7 +282,7 @@ stringitem(a, i)
 }
 
 static int
-stringcompare(a, b)
+string_compare(a, b)
        stringobject *a, *b;
 {
        int len_a = a->ob_size, len_b = b->ob_size;
@@ -294,11 +294,11 @@ stringcompare(a, b)
 }
 
 static sequence_methods string_as_sequence = {
-       stringlength,   /*sq_length*/
-       stringconcat,   /*sq_concat*/
-       stringrepeat,   /*sq_repeat*/
-       stringitem,     /*sq_item*/
-       stringslice,    /*sq_slice*/
+       string_length,  /*sq_length*/
+       string_concat,  /*sq_concat*/
+       string_repeat,  /*sq_repeat*/
+       string_item,    /*sq_item*/
+       string_slice,   /*sq_slice*/
        0,              /*sq_ass_item*/
        0,              /*sq_ass_slice*/
 };
@@ -309,12 +309,12 @@ typeobject Stringtype = {
        "string",
        sizeof(stringobject),
        sizeof(char),
-       stringdealloc,  /*tp_dealloc*/
-       stringprint,    /*tp_print*/
+       string_dealloc, /*tp_dealloc*/
+       string_print,   /*tp_print*/
        0,              /*tp_getattr*/
        0,              /*tp_setattr*/
-       stringcompare,  /*tp_compare*/
-       stringrepr,     /*tp_repr*/
+       string_compare, /*tp_compare*/
+       string_repr,    /*tp_repr*/
        0,              /*tp_as_number*/
        &string_as_sequence,    /*tp_as_sequence*/
        0,              /*tp_as_mapping*/
@@ -328,7 +328,7 @@ joinstring(pv, w)
        register object *v;
        if (*pv == NULL || w == NULL || !is_stringobject(*pv))
                return;
-       v = stringconcat((stringobject *) *pv, w);
+       v = string_concat((stringobject *) *pv, w);
        DECREF(*pv);
        *pv = v;
 }
@@ -373,3 +373,344 @@ resizestring(pv, newsize)
        sv->ob_sval[newsize] = '\0';
        return 0;
 }
+
+/* Helpers for formatstring */
+
+static object *
+getnextarg(args, arglen, p_argidx)
+       object *args;
+       int arglen;
+       int *p_argidx;
+{
+       int argidx = *p_argidx;
+       if (argidx < arglen) {
+               (*p_argidx)++;
+               if (arglen < 0)
+                       return args;
+               else
+                       return gettupleitem(args, argidx);
+       }
+       err_setstr(TypeError, "not enough arguments for format string");
+       return NULL;
+}
+
+#define F_LJUST (1<<0)
+#define F_SIGN (1<<1)
+#define F_BLANK (1<<2)
+#define F_ALT  (1<<3)
+#define F_ZERO (1<<4)
+
+extern double fabs PROTO((double));
+
+static char *
+formatfloat(flags, prec, type, v)
+       int flags;
+       int prec;
+       int type;
+       object *v;
+{
+       char fmt[20];
+       static char buf[120];
+       double x;
+       if (!getargs(v, "d;float argument required", &x))
+               return NULL;
+       if (prec < 0)
+               prec = 6;
+       if (prec > 50)
+               prec = 50; /* Arbitrary limitation */
+       if (type == 'f' && fabs(x)/1e25 >= 1e25)
+               type = 'g';
+       sprintf(fmt, "%%%s.%d%c", (flags&F_ALT) ? "#" : "", prec, type);
+       sprintf(buf, fmt, x);
+       return buf;
+}
+
+static char *
+formatint(flags, prec, type, v)
+       int flags;
+       int prec;
+       int type;
+       object *v;
+{
+       char fmt[20];
+       static char buf[50];
+       long x;
+       if (!getargs(v, "l;int argument required", &x))
+               return NULL;
+       if (prec < 0)
+               prec = 1;
+       sprintf(fmt, "%%%s.%dl%c", (flags&F_ALT) ? "#" : "", prec, type);
+       sprintf(buf, fmt, x);
+       return buf;
+}
+
+static char *
+formatchar(v)
+       object *v;
+{
+       static char buf[2];
+       if (is_stringobject(v)) {
+               if (!getargs(v, "c;%c requires int or char", &buf[0]))
+                       return NULL;
+       }
+       else {
+               if (!getargs(v, "b;%c requires int or char", &buf[0]))
+                       return NULL;
+       }
+       buf[1] = '\0';
+       return buf;
+}
+
+/* fmt%(v1,v2,...) is roughly equivalent to sprintf(fmt, v1, v2, ...) */
+
+object *
+formatstring(format, args)
+       object *format;
+       object *args;
+{
+       char *fmt, *res;
+       int fmtcnt, rescnt, reslen, arglen, argidx;
+       object *result;
+       if (format == NULL || !is_stringobject(format) || args == NULL) {
+               err_badcall();
+               return NULL;
+       }
+       reslen = rescnt = 100;
+       result = newsizedstringobject((char *)NULL, reslen);
+       if (result == NULL)
+               return NULL;
+       res = getstringvalue(result);
+       fmt = getstringvalue(format);
+       fmtcnt = getstringsize(format);
+       if (is_tupleobject(args)) {
+               arglen = gettuplesize(args);
+               argidx = 0;
+       }
+       else {
+               arglen = -1;
+               argidx = -2;
+       }
+       while (--fmtcnt >= 0) {
+               if (*fmt != '%') {
+                       if (--rescnt < 0) {
+                               rescnt = reslen;
+                               reslen = reslen * 2; /* Maybe less when big? */
+                               if (resizestring(&result, reslen) < 0)
+                                       return NULL;
+                               res = getstringvalue(result) + rescnt;
+                               rescnt = reslen - rescnt;
+                       }
+                       *res++ = *fmt++;
+               }
+               else {
+                       /* Got a format specifier */
+                       int flags = 0;
+                       char *fmtstart = fmt++;
+                       int width = -1;
+                       int prec = -1;
+                       int size = 0;
+                       int c;
+                       int fill;
+                       object *v;
+                       char *buf;
+                       int sign;
+                       int len;
+                       while (--fmtcnt >= 0) {
+                               switch (c = *fmt++) {
+                               case '-': flags |= F_LJUST; continue;
+                               case '+': flags |= F_SIGN; continue;
+                               case ' ': flags |= F_BLANK; continue;
+                               case '#': flags |= F_ALT; continue;
+                               case '0': flags |= F_ZERO; continue;
+                               }
+                               break;
+                       }
+                       if (c == '*') {
+                               v = getnextarg(args, arglen, &argidx);
+                               if (v == NULL)
+                                       goto error;
+                               if (!is_intobject(v)) {
+                                       err_setstr(TypeError, "* wants int");
+                                       goto error;
+                               }
+                               width = getintvalue(v);
+                               if (width < 0)
+                                       width = 0;
+                               if (--fmtcnt >= 0)
+                                       c = *fmt++;
+                       }
+                       else if (isdigit(c)) {
+                               width = c - '0';
+                               while (--fmtcnt >= 0) {
+                                       c = *fmt++;
+                                       if (!isdigit(c))
+                                               break;
+                                       if ((width*10) / 10 != width) {
+                                               err_setstr(ValueError,
+                                                          "width too big");
+                                               goto error;
+                                       }
+                                       width = width*10 + (c - '0');
+                               }
+                       }
+                       if (c == '.') {
+                               prec = 0;
+                               if (--fmtcnt >= 0)
+                                       c = *fmt++;
+                               if (c == '*') {
+                                       v = getnextarg(args, arglen, &argidx);
+                                       if (v == NULL)
+                                               goto error;
+                                       if (!is_intobject(v)) {
+                                               err_setstr(TypeError,
+                                                          "* wants int");
+                                               goto error;
+                                       }
+                                       prec = getintvalue(v);
+                                       if (prec < 0)
+                                               prec = 0;
+                                       if (--fmtcnt >= 0)
+                                               c = *fmt++;
+                               }
+                               else if (isdigit(c)) {
+                                       prec = c - '0';
+                                       while (--fmtcnt >= 0) {
+                                               c = *fmt++;
+                                               if (!isdigit(c))
+                                                       break;
+                                               if ((prec*10) / 10 != prec) {
+                                                       err_setstr(ValueError,
+                                                           "prec too big");
+                                                       goto error;
+                                               }
+                                               prec = prec*10 + (c - '0');
+                                       }
+                               }
+                       } /* prec */
+                       if (fmtcnt >= 0) {
+                               if (c == 'h' || c == 'l' || c == 'L') {
+                                       size = c;
+                                       if (--fmtcnt >= 0)
+                                               c = *fmt++;
+                               }
+                       }
+                       if (fmtcnt < 0) {
+                               err_setstr(ValueError, "incomplete format");
+                               goto error;
+                       }
+                       if (c != '%') {
+                               v = getnextarg(args, arglen, &argidx);
+                               if (v == NULL)
+                                       goto error;
+                       }
+                       sign = 0;
+                       fill = ' ';
+                       switch (c) {
+                       case '%':
+                               buf = "%";
+                               len = 1;
+                               break;
+                       case 's':
+                               if (!is_stringobject(v)) {
+                                       err_setstr(TypeError,
+                                                  "%s wants string");
+                                       goto error;
+                               }
+                               buf = getstringvalue(v);
+                               len = getstringsize(v);
+                               if (prec >= 0 && len > prec)
+                                       len = prec;
+                               break;
+                       case 'i':
+                       case 'd':
+                       case 'u':
+                       case 'o':
+                       case 'x':
+                       case 'X':
+                               if (c == 'i')
+                                       c = 'd';
+                               buf = formatint(flags, prec, c, v);
+                               if (buf == NULL)
+                                       goto error;
+                               len = strlen(buf);
+                               sign = (c == 'd');
+                               if (flags&F_ZERO)
+                                       fill = '0';
+                               break;
+                       case 'e':
+                       case 'E':
+                       case 'f':
+                       case 'g':
+                       case 'G':
+                               buf = formatfloat(flags, prec, c, v);
+                               if (buf == NULL)
+                                       goto error;
+                               len = strlen(buf);
+                               sign = 1;
+                               if (flags&F_ZERO)
+                                       fill = '0';
+                               break;
+                       case 'c':
+                               buf = formatchar(v);
+                               if (buf == NULL)
+                                       goto error;
+                               len = strlen(buf);
+                               break;
+                       default:
+                               err_setstr(ValueError,
+                                          "unsupported format character");
+                               goto error;
+                       }
+                       if (sign) {
+                               if (*buf == '-' || *buf == '+') {
+                                       sign = *buf++;
+                                       len--;
+                               }
+                               else if (flags & F_SIGN)
+                                       sign = '+';
+                               else if (flags & F_BLANK)
+                                       sign = ' ';
+                               else
+                                       sign = '\0';
+                       }
+                       if (width < len)
+                               width = len;
+                       if (rescnt < width + (sign != '\0')) {
+                               rescnt = reslen;
+                               reslen = reslen + width + 100;
+                               if (resizestring(&result, reslen) < 0)
+                                       return NULL;
+                               res = getstringvalue(result) + rescnt;
+                               rescnt = reslen - rescnt;
+                       }
+                       if (sign) {
+                               *res++ = sign;
+                               rescnt--;
+                               if (width > len)
+                                       width--;
+                       }
+                       if (width > len && !(flags&F_LJUST)) {
+                               do {
+                                       --rescnt;
+                                       *res++ = fill;
+                               } while (--width > len);
+                       }
+                       memcpy(res, buf, len);
+                       res += len;
+                       rescnt -= len;
+                       while (--width >= len) {
+                               --rescnt;
+                               *res++ = ' ';
+                       }
+               } /* '%' */
+       } /* until end */
+       if (argidx < arglen) {
+               err_setstr(TypeError, "not all arguments converted");
+               goto error;
+       }
+       resizestring(&result, reslen - rescnt);
+       return result;
+ error:
+       DECREF(result);
+       return NULL;
+}
index ec0437e3f77618006fcfc23785c50659847b35d2..32bb8b5c32ec795447d7fe0eaf566f8ec96abd18 100644 (file)
@@ -1,6 +1,6 @@
 /***********************************************************
-Copyright 1991, 1992 by Stichting Mathematisch Centrum, Amsterdam, The
-Netherlands.
+Copyright 1991, 1992, 1993 by Stichting Mathematisch Centrum,
+Amsterdam, The Netherlands.
 
                         All Rights Reserved
 
@@ -168,8 +168,11 @@ parsetok(tok, g, start, n_ret)
                                *n_ret = ps->p_tree;
                                ps->p_tree = NULL;
                        }
-                       else if (tok->lineno <= 1 && tok->done == E_EOF)
-                               ret = E_EOF;
+                       else {
+                               *n_ret = NULL;
+                               if (tok->lineno <= 1 && tok->done == E_EOF)
+                                       ret = E_EOF;
+                       }
                        break;
                }
        }
index 97c130353bb7680ee78309ef613eb197960ff509..4213fc38a2b06acc9c5c071ba24e81b615f19bbb 100644 (file)
@@ -1,6 +1,6 @@
 /***********************************************************
-Copyright 1991, 1992 by Stichting Mathematisch Centrum, Amsterdam, The
-Netherlands.
+Copyright 1991, 1992, 1993 by Stichting Mathematisch Centrum,
+Amsterdam, The Netherlands.
 
                         All Rights Reserved
 
index 727bc0c4d7cb003b01b78784ac589ed00759ee12..97f38ab0c0d7c2a3c344256bb60243c26e9f17b9 100644 (file)
@@ -1671,6 +1671,9 @@ rem(v, w)
                DECREF(w);
                return x;
        }
+       if (is_stringobject(v)) {
+               return formatstring(v, w);
+       }
        err_setstr(TypeError, "bad operand type(s) for %");
        return NULL;
 }
index 5814dd749d7f76589c194c2d02453adfa68c375b..9f53255188bf782db9134029c61de72f25dc21d4 100644 (file)
@@ -1,6 +1,6 @@
 /***********************************************************
-Copyright 1991, 1992 by Stichting Mathematisch Centrum, Amsterdam, The
-Netherlands.
+Copyright 1991, 1992, 1993 by Stichting Mathematisch Centrum,
+Amsterdam, The Netherlands.
 
                         All Rights Reserved
 
@@ -56,6 +56,7 @@ OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 */
 
 #include "allobjects.h"
+#include "modsupport.h"
 
 #include <errno.h>
 #ifndef errno
@@ -153,13 +154,11 @@ err_errno(exc)
                err_set(KeyboardInterrupt);
                return NULL;
        }
-       v = newtupleobject(2);
+       v = mkvalue("(is)", errno, strerror(errno));
        if (v != NULL) {
-               settupleitem(v, 0, newintobject((long)errno));
-               settupleitem(v, 1, newstringobject(strerror(errno)));
+               err_setval(exc, v);
+               DECREF(v);
        }
-       err_setval(exc, v);
-       XDECREF(v);
        return NULL;
 }
 
index b464c8e36d0d89a7430bd0b1a35248433a887571..d998ad822f5b7d6a3988e28d453ccc5682d26a3c 100644 (file)
@@ -28,17 +28,6 @@ OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 #include "modsupport.h"
 #include "import.h"
 
-#ifdef HAVE_PROTOTYPES
-#define USE_STDARG
-#endif
-
-#ifdef USE_STDARG
-#include <stdarg.h>
-#else
-#include <varargs.h>
-#endif
-
-
 object *
 initmodule(name, methods)
        char *name;
@@ -454,7 +443,7 @@ do_mkvalue(p_format, p_va)
        case '(':
                return do_mktuple(p_format, p_va, ')',
                                  countformat(*p_format, ')'));
-
+               
        case 'b':
        case 'h':
        case 'i':
@@ -466,7 +455,7 @@ do_mkvalue(p_format, p_va)
        case 'f':
        case 'd':
                return newfloatobject((double)va_arg(*p_va, double));
-
+               
        case 'c':
                {
                        char p[1];
@@ -532,32 +521,34 @@ object *mkvalue(char *format, ...)
 object *mkvalue(va_alist) va_dcl
 #endif
 {
-       int n;
-       char *f;
        va_list va;
        object* retval;
 #ifdef USE_STDARG
        va_start(va, format);
 #else
        char *format;
-       
        va_start(va);
        format = va_arg(va, char *);
 #endif
-       f = format;
-       n = countformat(f, '\0');
-       if (n < 0)
-               retval = NULL; /* Error in the format */
-       else if (n == 0) {
-               retval = None;
-               INCREF(retval);
-       }
-       else if (n == 1)
-               retval = do_mkvalue(&f, &va);
-       else
-               retval = do_mktuple(&f, &va, '\0', n);
+       retval = vmkvalue(format, va);
        va_end(va);
-       if (retval == NULL)
-               fprintf(stderr, "format \"%s\", f \"%s\"\n", format, f);
        return retval;
 }
+
+object *
+vmkvalue(format, va)
+       char *format;
+       va_list va;
+{
+       char *f = format;
+       int n = countformat(f, '\0');
+       if (n < 0)
+               return NULL;
+       if (n == 0) {
+               INCREF(None);
+               return None;
+       }
+       if (n == 1)
+               return do_mkvalue(&f, &va);
+       return do_mktuple(&f, &va, '\0', n);
+}