summaryrefslogtreecommitdiffstats
path: root/Modules/stdwinmodule.c
diff options
context:
space:
mode:
authorGuido van Rossum <guido@python.org>1993-10-18 11:44:47 (GMT)
committerGuido van Rossum <guido@python.org>1993-10-18 11:44:47 (GMT)
commitcacd9579d48cb1e2acc3536c9701987b118edf8c (patch)
treea3d31a150228428d44866f8a5e6fe496c5c9dbff /Modules/stdwinmodule.c
parent842d2ccdcd540399501a918b9724d2eaf5599f39 (diff)
downloadcpython-cacd9579d48cb1e2acc3536c9701987b118edf8c.zip
cpython-cacd9579d48cb1e2acc3536c9701987b118edf8c.tar.gz
cpython-cacd9579d48cb1e2acc3536c9701987b118edf8c.tar.bz2
* stdwinmodule.c (stdwin_done): interface to shutdown stdwin (now this is
no longer done by config.c). * stdwinmodule.c (initstdwin), config.c (initall): get command line arguments from sys.argv instead of special-casing stdwin in config.c * import.c (get_module): fix core dump when foomodule.o does not define initfoo(). * ChangeLog: documented changes by Sjoerd.
Diffstat (limited to 'Modules/stdwinmodule.c')
-rw-r--r--Modules/stdwinmodule.c91
1 files changed, 90 insertions, 1 deletions
diff --git a/Modules/stdwinmodule.c b/Modules/stdwinmodule.c
index a6f6fba..1fff814 100644
--- a/Modules/stdwinmodule.c
+++ b/Modules/stdwinmodule.c
@@ -66,6 +66,7 @@ OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
#include "allobjects.h"
#include "modsupport.h"
#include "ceval.h"
+#include "sysmodule.h"
#ifdef macintosh
#include ":::stdwin:H:stdwin.h"
@@ -1943,6 +1944,21 @@ typeobject Windowtype = {
/* Stdwin methods */
static object *
+stdwin_done(sw, args)
+ object *sw;
+ object *args;
+{
+ if (!getnoarg(args))
+ return NULL;
+ wdone();
+ /* XXX There is no protection against continued use of
+ XXX stdwin functions or objects after this call is made.
+ XXX Use at own risk */
+ INCREF(None);
+ return None;
+}
+
+static object *
stdwin_open(sw, args)
object *sw;
object *args;
@@ -2467,6 +2483,7 @@ static struct methodlist stdwin_methods[] = {
{"askfile", stdwin_askfile},
{"askstr", stdwin_askstr},
{"askync", stdwin_askync},
+ {"done", stdwin_done},
{"fetchcolor", stdwin_fetchcolor},
#ifdef unix
{"fileno", stdwin_connectionnumber},
@@ -2515,6 +2532,67 @@ static struct methodlist stdwin_methods[] = {
{NULL, NULL} /* sentinel */
};
+static int
+checkstringlist(args, ps, pn)
+ object *args;
+ char ***ps;
+ int *pn;
+{
+ int i, n;
+ char **s;
+ if (!is_listobject(args)) {
+ err_setstr(TypeError, "list of strings expected");
+ return 0;
+ }
+ n = getlistsize(args);
+ s = NEW(char *, n+1);
+ if (s == NULL) {
+ err_nomem();
+ return 0;
+ }
+ for (i = 0; i < n; i++) {
+ object *item = getlistitem(args, i);
+ if (!is_stringobject(item)) {
+ err_setstr(TypeError, "list of strings expected");
+ return 0;
+ }
+ s[i] = getstringvalue(item);
+ }
+ s[n] = NULL; /* In case caller wants a NULL-terminated list */
+ *ps = s;
+ *pn = n;
+ return 1;
+}
+
+static int
+putbackstringlist(list, s, n)
+ object *list;
+ char **s;
+ int n;
+{
+ int oldsize = getlistsize(list);
+ object *newlist;
+ int i;
+ if (n == oldsize)
+ return 1;
+ newlist = newlistobject(n);
+ for (i = 0; i < n && newlist != NULL; i++) {
+ object *item = newstringobject(s[i]);
+ if (item == NULL) {
+ DECREF(newlist);
+ newlist = NULL;
+ }
+ else
+ setlistitem(newlist, i, item);
+ }
+ if (newlist == NULL)
+ return 0;
+ (*list->ob_type->tp_as_sequence->sq_ass_slice)
+ (list, 0, oldsize, newlist);
+ DECREF(newlist);
+ return 1;
+}
+
void
initstdwin()
{
@@ -2522,7 +2600,18 @@ initstdwin()
static int inited = 0;
if (!inited) {
- winit();
+ int argc = 0;
+ char **argv = NULL;
+ object *sys_argv = sysget("argv");
+ if (sys_argv != NULL) {
+ if (!checkstringlist(sys_argv, &argv, &argc))
+ err_clear();
+ }
+ winitargs(&argc, &argv);
+ if (argv != NULL) {
+ if (!putbackstringlist(sys_argv, argv, argc))
+ err_clear();
+ }
inited = 1;
}
m = initmodule("stdwin", stdwin_methods);