Python 0.9.1 part 16/21

Guido van Rossum guido at cwi.nl
Wed Feb 20 04:42:30 AEST 1991


: This is a shell archive.
: Extract with 'sh this_file'.
:
: Extract part 01 first since it makes all directories
echo 'Start of pack.out, part 16 out of 21:'
if test -s 'demo/sgi/gl_panel/flying/materials.s'
then echo '*** I will not over-write existing file demo/sgi/gl_panel/flying/materials.s'
else
echo 'x - demo/sgi/gl_panel/flying/materials.s'
sed 's/^X//' > 'demo/sgi/gl_panel/flying/materials.s' << 'EOF'
X;;; This file was automatically generated by the panel editor.
X;;; If you read it into gnu emacs, it will automagically format itself.
X
X(panel (prop help creator:user-panel-help)
X(prop user-panel #t)
X(label "Materials")
X(al (pnl_label (prop help creator:user-act-help)
X(label "specular")
X(x 4)
X(y 0.5)
X(downfunc move-then-resize)
X)
X(pnl_label (prop help creator:user-act-help)
X(label "diffuse")
X(x 4)
X(y 4)
X(downfunc move-then-resize)
X)
X(pnl_radio_button (name "m7")
X(prop help creator:user-act-help)
X(label "material 7")
X(x 6.5)
X(y 1.5)
X(h 0.36)
X(downfunc move-then-resize)
X)
X(pnl_radio_button (name "m9")
X(prop help creator:user-act-help)
X(label "material 9")
X(x 6.5)
X(y 0.5)
X(h 0.36)
X(downfunc move-then-resize)
X)
X(pnl_radio_button (name "m8")
X(prop help creator:user-act-help)
X(label "material 8")
X(x 6.5)
X(y 1)
X(h 0.36)
X(downfunc move-then-resize)
X)
X(pnl_radio_button (name "m6")
X(prop help creator:user-act-help)
X(label "material 6")
X(x 6.5)
X(y 2)
X(h 0.36)
X(downfunc move-then-resize)
X)
X(pnl_radio_button (name "m5")
X(prop help creator:user-act-help)
X(label "material 5")
X(x 6.5)
X(y 2.5)
X(h 0.36)
X(downfunc move-then-resize)
X)
X(pnl_radio_button  (name "m4")
X(prop help creator:user-act-help)
X(label "material 4")
X(x 6.5)
X(y 3)
X(h 0.36)
X(downfunc move-then-resize)
X)
X(pnl_radio_button (name "m3")
X(prop help creator:user-act-help)
X(label "material 3")
X(x 6.5)
X(y 3.5)
X(h 0.36)
X(downfunc move-then-resize)
X)
X(pnl_radio_button (name "m2")
X(prop help creator:user-act-help)
X(label "material 2")
X(x 6.5)
X(y 4)
X(h 0.36)
X(downfunc move-then-resize)
X)
X(pnl_radio_button  (name "m1")
X(prop help creator:user-act-help)
X(label "material 1")
X(x 6.5)
X(y 4.5)
X(h 0.36)
X(downfunc move-then-resize)
X)
X(pnl_filled_hslider (name "diffB")
X(prop help creator:user-act-help)
X(label "B")
X(y 3.5)
X(w 3.3)
X(h 0.4)
X(labeltype 0)
X(downfunc move-then-resize)
X)
X(pnl_filled_hslider (name "diffG")
X(prop help creator:user-act-help)
X(label "G")
X(y 4)
X(w 3.3)
X(h 0.4)
X(labeltype 0)
X(downfunc move-then-resize)
X)
X(pnl_filled_hslider (name "diffR")
X(prop help creator:user-act-help)
X(label "R")
X(y 4.5)
X(w 3.3)
X(h 0.4)
X(labeltype 0)
X(downfunc move-then-resize)
X)
X(pnl_filled_hslider (name "specB")
X(prop help creator:user-act-help)
X(label "B")
X(w 3.3)
X(h 0.4)
X(labeltype 0)
X(downfunc move-then-resize)
X)
X(pnl_filled_hslider (name "specG")
X(prop help creator:user-act-help)
X(label "G")
X(y 0.5)
X(w 3.3)
X(h 0.4)
X(labeltype 0)
X(downfunc move-then-resize)
X)
X(pnl_filled_hslider (name "specR")
X(prop help creator:user-act-help)
X(label "R")
X(y 1)
X(w 3.3)
X(h 0.4)
X(labeltype 0)
X(downfunc move-then-resize)
X)
X(pnl_filled_hslider (name "shine")
X(prop help creator:user-act-help)
X(label "shininess")
X(y 2.25)
X(w 3.3)
X(h 0.4)
X(labeltype 0)
X(downfunc move-then-resize)
X)
X)
X)
X;;; Local Variables:
X;;; mode: scheme
X;;; eval: (save-excursion (goto-char (point-min)) (kill-line 3))
X;;; eval: (save-excursion (goto-char (point-min)) (replace-regexp "[ \n]*)" ")"))
X;;; eval: (indent-region (point-min) (point-max) nil)
X;;; eval: (progn (kill-line -3) (delete-backward-char 1) (save-buffer))
X;;; End:
EOF
fi
if test -s 'src/config.c'
then echo '*** I will not over-write existing file src/config.c'
else
echo 'x - src/config.c'
sed 's/^X//' > 'src/config.c' << 'EOF'
X/***********************************************************
XCopyright 1991 by Stichting Mathematisch Centrum, Amsterdam, The
XNetherlands.
X
X                        All Rights Reserved
X
XPermission to use, copy, modify, and distribute this software and its 
Xdocumentation for any purpose and without fee is hereby granted, 
Xprovided that the above copyright notice appear in all copies and that
Xboth that copyright notice and this permission notice appear in 
Xsupporting documentation, and that the names of Stichting Mathematisch
XCentrum or CWI not be used in advertising or publicity pertaining to
Xdistribution of the software without specific, written prior permission.
X
XSTICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO
XTHIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
XFITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE
XFOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
XWHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
XACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
XOF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
X
X******************************************************************/
X
X/* Configurable Python configuration file */
X
X#include <stdio.h>
X
X#ifdef USE_STDWIN
X#include <stdwin.h>
X
Xstatic int use_stdwin;
X#endif
X
X/*ARGSUSED*/
Xvoid
Xinitargs(p_argc, p_argv)
X	int *p_argc;
X	char ***p_argv;
X{
X#ifdef USE_STDWIN
X	extern char *getenv();
X	char *display;
X
X	/* Ignore an initial argument of '-s', for backward compatibility */
X	if (*p_argc > 1 && strcmp((*p_argv)[1], "-s") == 0) {
X		(*p_argv)[1] = (*p_argv)[0];
X		(*p_argc)--, (*p_argv)++;
X	}
X
X	/* Assume we have to initialize stdwin if either of the following
X	   conditions holds:
X	   - the environment variable $DISPLAY is set
X	   - there is an argument "-display" somewhere
X	*/
X	
X	display = getenv("DISPLAY");
X	if (display != 0)
X		use_stdwin = 1;
X	else {
X		int i;
X		/* Scan through the arguments looking for "-display" */
X		for (i = 1; i < *p_argc; i++) {
X			if (strcmp((*p_argv)[i], "-display") == 0) {
X				use_stdwin = 1;
X				break;
X			}
X		}
X	}
X	
X	if (use_stdwin)
X		wargs(p_argc, p_argv);
X#endif
X}
X
Xvoid
Xinitcalls()
X{
X}
X
Xvoid
Xdonecalls()
X{
X#ifdef USE_STDWIN
X	if (use_stdwin)
X		wdone();
X#endif
X#ifdef USE_AUDIO
X	asa_done();
X#endif
X}
X
X#ifdef USE_STDWIN
Xstatic void
Xmaybeinitstdwin()
X{
X	if (use_stdwin)
X		initstdwin();
X	else
X		fprintf(stderr,
X		 "No $DISPLAY nor -display arg -- stdwin not available\n");
X}
X#endif
X
X#ifndef PYTHONPATH
X#define PYTHONPATH ".:/usr/local/lib/python"
X#endif
X
Xextern char *getenv();
X
Xchar *
Xgetpythonpath()
X{
X	char *path = getenv("PYTHONPATH");
X	if (path == 0)
X		path = PYTHONPATH;
X	return path;
X}
X
X
X/* Table of built-in modules.
X   These are initialized when first imported. */
X
X/* Standard modules */
Xextern void inittime();
Xextern void initmath();
Xextern void initregexp();
Xextern void initposix();
X#ifdef USE_AUDIO
Xextern void initaudio();
X#endif
X#ifdef USE_AMOEBA
Xextern void initamoeba();
X#endif
X#ifdef USE_GL
Xextern void initgl();
X#ifdef USE_PANEL
Xextern void initpanel();
X#endif
X#endif
X#ifdef USE_STDWIN
Xextern void maybeinitstdwin();
X#endif
X
Xstruct {
X	char *name;
X	void (*initfunc)();
X} inittab[] = {
X
X	/* Standard modules */
X
X	{"time",	inittime},
X	{"math",	initmath},
X	{"regexp",	initregexp},
X	{"posix",	initposix},
X
X
X	/* Optional modules */
X
X#ifdef USE_AUDIO
X	{"audio",	initaudio},
X#endif
X
X#ifdef USE_AMOEBA
X	{"amoeba",	initamoeba},
X#endif
X
X#ifdef USE_GL
X	{"gl",		initgl},
X#ifdef USE_PANEL
X	{"pnl",		initpanel},
X#endif
X#endif
X
X#ifdef USE_STDWIN
X	{"stdwin",	maybeinitstdwin},
X#endif
X
X	{0,		0}		/* Sentinel */
X};
EOF
fi
if test -s 'src/frameobject.c'
then echo '*** I will not over-write existing file src/frameobject.c'
else
echo 'x - src/frameobject.c'
sed 's/^X//' > 'src/frameobject.c' << 'EOF'
X/***********************************************************
XCopyright 1991 by Stichting Mathematisch Centrum, Amsterdam, The
XNetherlands.
X
X                        All Rights Reserved
X
XPermission to use, copy, modify, and distribute this software and its 
Xdocumentation for any purpose and without fee is hereby granted, 
Xprovided that the above copyright notice appear in all copies and that
Xboth that copyright notice and this permission notice appear in 
Xsupporting documentation, and that the names of Stichting Mathematisch
XCentrum or CWI not be used in advertising or publicity pertaining to
Xdistribution of the software without specific, written prior permission.
X
XSTICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO
XTHIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
XFITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE
XFOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
XWHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
XACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
XOF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
X
X******************************************************************/
X
X/* Frame object implementation */
X
X#include "allobjects.h"
X
X#include "compile.h"
X#include "frameobject.h"
X#include "opcode.h"
X#include "structmember.h"
X
X#define OFF(x) offsetof(frameobject, x)
X
Xstatic struct memberlist frame_memberlist[] = {
X	{"f_back",	T_OBJECT,	OFF(f_back)},
X	{"f_code",	T_OBJECT,	OFF(f_code)},
X	{"f_globals",	T_OBJECT,	OFF(f_globals)},
X	{"f_locals",	T_OBJECT,	OFF(f_locals)},
X	{NULL}	/* Sentinel */
X};
X
Xstatic object *
Xframe_getattr(f, name)
X	frameobject *f;
X	char *name;
X{
X	return getmember((char *)f, frame_memberlist, name);
X}
X
Xstatic void
Xframe_dealloc(f)
X	frameobject *f;
X{
X	XDECREF(f->f_back);
X	XDECREF(f->f_code);
X	XDECREF(f->f_globals);
X	XDECREF(f->f_locals);
X	XDEL(f->f_valuestack);
X	XDEL(f->f_blockstack);
X	DEL(f);
X}
X
Xtypeobject Frametype = {
X	OB_HEAD_INIT(&Typetype)
X	0,
X	"frame",
X	sizeof(frameobject),
X	0,
X	frame_dealloc,	/*tp_dealloc*/
X	0,		/*tp_print*/
X	frame_getattr,	/*tp_getattr*/
X	0,		/*tp_setattr*/
X	0,		/*tp_compare*/
X	0,		/*tp_repr*/
X	0,		/*tp_as_number*/
X	0,		/*tp_as_sequence*/
X	0,		/*tp_as_mapping*/
X};
X
Xframeobject *
Xnewframeobject(back, code, globals, locals, nvalues, nblocks)
X	frameobject *back;
X	codeobject *code;
X	object *globals;
X	object *locals;
X	int nvalues;
X	int nblocks;
X{
X	frameobject *f;
X	if ((back != NULL && !is_frameobject(back)) ||
X		code == NULL || !is_codeobject(code) ||
X		globals == NULL || !is_dictobject(globals) ||
X		locals == NULL || !is_dictobject(locals) ||
X		nvalues < 0 || nblocks < 0) {
X		err_badcall();
X		return NULL;
X	}
X	f = NEWOBJ(frameobject, &Frametype);
X	if (f != NULL) {
X		if (back)
X			INCREF(back);
X		f->f_back = back;
X		INCREF(code);
X		f->f_code = code;
X		INCREF(globals);
X		f->f_globals = globals;
X		INCREF(locals);
X		f->f_locals = locals;
X		f->f_valuestack = NEW(object *, nvalues+1);
X		f->f_blockstack = NEW(block, nblocks+1);
X		f->f_nvalues = nvalues;
X		f->f_nblocks = nblocks;
X		f->f_iblock = 0;
X		if (f->f_valuestack == NULL || f->f_blockstack == NULL) {
X			err_nomem();
X			DECREF(f);
X			f = NULL;
X		}
X	}
X	return f;
X}
X
X/* Block management */
X
Xvoid
Xsetup_block(f, type, handler, level)
X	frameobject *f;
X	int type;
X	int handler;
X	int level;
X{
X	block *b;
X	if (f->f_iblock >= f->f_nblocks) {
X		fprintf(stderr, "XXX block stack overflow\n");
X		abort();
X	}
X	b = &f->f_blockstack[f->f_iblock++];
X	b->b_type = type;
X	b->b_level = level;
X	b->b_handler = handler;
X}
X
Xblock *
Xpop_block(f)
X	frameobject *f;
X{
X	block *b;
X	if (f->f_iblock <= 0) {
X		fprintf(stderr, "XXX block stack underflow\n");
X		abort();
X	}
X	b = &f->f_blockstack[--f->f_iblock];
X	return b;
X}
EOF
fi
if test -s 'src/metagrammar.c'
then echo '*** I will not over-write existing file src/metagrammar.c'
else
echo 'x - src/metagrammar.c'
sed 's/^X//' > 'src/metagrammar.c' << 'EOF'
X/***********************************************************
XCopyright 1991 by Stichting Mathematisch Centrum, Amsterdam, The
XNetherlands.
X
X                        All Rights Reserved
X
XPermission to use, copy, modify, and distribute this software and its 
Xdocumentation for any purpose and without fee is hereby granted, 
Xprovided that the above copyright notice appear in all copies and that
Xboth that copyright notice and this permission notice appear in 
Xsupporting documentation, and that the names of Stichting Mathematisch
XCentrum or CWI not be used in advertising or publicity pertaining to
Xdistribution of the software without specific, written prior permission.
X
XSTICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO
XTHIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
XFITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE
XFOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
XWHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
XACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
XOF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
X
X******************************************************************/
X
X#include "pgenheaders.h"
X#include "metagrammar.h"
X#include "grammar.h"
X#include "pgen.h"
Xstatic arc arcs_0_0[3] = {
X	{2, 0},
X	{3, 0},
X	{4, 1},
X};
Xstatic arc arcs_0_1[1] = {
X	{0, 1},
X};
Xstatic state states_0[2] = {
X	{3, arcs_0_0},
X	{1, arcs_0_1},
X};
Xstatic arc arcs_1_0[1] = {
X	{5, 1},
X};
Xstatic arc arcs_1_1[1] = {
X	{6, 2},
X};
Xstatic arc arcs_1_2[1] = {
X	{7, 3},
X};
Xstatic arc arcs_1_3[1] = {
X	{3, 4},
X};
Xstatic arc arcs_1_4[1] = {
X	{0, 4},
X};
Xstatic state states_1[5] = {
X	{1, arcs_1_0},
X	{1, arcs_1_1},
X	{1, arcs_1_2},
X	{1, arcs_1_3},
X	{1, arcs_1_4},
X};
Xstatic arc arcs_2_0[1] = {
X	{8, 1},
X};
Xstatic arc arcs_2_1[2] = {
X	{9, 0},
X	{0, 1},
X};
Xstatic state states_2[2] = {
X	{1, arcs_2_0},
X	{2, arcs_2_1},
X};
Xstatic arc arcs_3_0[1] = {
X	{10, 1},
X};
Xstatic arc arcs_3_1[2] = {
X	{10, 1},
X	{0, 1},
X};
Xstatic state states_3[2] = {
X	{1, arcs_3_0},
X	{2, arcs_3_1},
X};
Xstatic arc arcs_4_0[2] = {
X	{11, 1},
X	{13, 2},
X};
Xstatic arc arcs_4_1[1] = {
X	{7, 3},
X};
Xstatic arc arcs_4_2[3] = {
X	{14, 4},
X	{15, 4},
X	{0, 2},
X};
Xstatic arc arcs_4_3[1] = {
X	{12, 4},
X};
Xstatic arc arcs_4_4[1] = {
X	{0, 4},
X};
Xstatic state states_4[5] = {
X	{2, arcs_4_0},
X	{1, arcs_4_1},
X	{3, arcs_4_2},
X	{1, arcs_4_3},
X	{1, arcs_4_4},
X};
Xstatic arc arcs_5_0[3] = {
X	{5, 1},
X	{16, 1},
X	{17, 2},
X};
Xstatic arc arcs_5_1[1] = {
X	{0, 1},
X};
Xstatic arc arcs_5_2[1] = {
X	{7, 3},
X};
Xstatic arc arcs_5_3[1] = {
X	{18, 1},
X};
Xstatic state states_5[4] = {
X	{3, arcs_5_0},
X	{1, arcs_5_1},
X	{1, arcs_5_2},
X	{1, arcs_5_3},
X};
Xstatic dfa dfas[6] = {
X	{256, "MSTART", 0, 2, states_0,
X	 "\070\000\000"},
X	{257, "RULE", 0, 5, states_1,
X	 "\040\000\000"},
X	{258, "RHS", 0, 2, states_2,
X	 "\040\010\003"},
X	{259, "ALT", 0, 2, states_3,
X	 "\040\010\003"},
X	{260, "ITEM", 0, 5, states_4,
X	 "\040\010\003"},
X	{261, "ATOM", 0, 4, states_5,
X	 "\040\000\003"},
X};
Xstatic label labels[19] = {
X	{0, "EMPTY"},
X	{256, 0},
X	{257, 0},
X	{4, 0},
X	{0, 0},
X	{1, 0},
X	{11, 0},
X	{258, 0},
X	{259, 0},
X	{18, 0},
X	{260, 0},
X	{9, 0},
X	{10, 0},
X	{261, 0},
X	{16, 0},
X	{14, 0},
X	{3, 0},
X	{7, 0},
X	{8, 0},
X};
Xstatic grammar gram = {
X	6,
X	dfas,
X	{19, labels},
X	256
X};
X
Xgrammar *
Xmeta_grammar()
X{
X	return &gram;
X}
EOF
fi
if test -s 'src/methodobject.c'
then echo '*** I will not over-write existing file src/methodobject.c'
else
echo 'x - src/methodobject.c'
sed 's/^X//' > 'src/methodobject.c' << 'EOF'
X/***********************************************************
XCopyright 1991 by Stichting Mathematisch Centrum, Amsterdam, The
XNetherlands.
X
X                        All Rights Reserved
X
XPermission to use, copy, modify, and distribute this software and its 
Xdocumentation for any purpose and without fee is hereby granted, 
Xprovided that the above copyright notice appear in all copies and that
Xboth that copyright notice and this permission notice appear in 
Xsupporting documentation, and that the names of Stichting Mathematisch
XCentrum or CWI not be used in advertising or publicity pertaining to
Xdistribution of the software without specific, written prior permission.
X
XSTICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO
XTHIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
XFITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE
XFOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
XWHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
XACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
XOF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
X
X******************************************************************/
X
X/* Method object implementation */
X
X#include "allobjects.h"
X
X#include "token.h"
X
Xtypedef struct {
X	OB_HEAD
X	char *m_name;
X	method m_meth;
X	object *m_self;
X} methodobject;
X
Xobject *
Xnewmethodobject(name, meth, self)
X	char *name; /* static string */
X	method meth;
X	object *self;
X{
X	methodobject *op = NEWOBJ(methodobject, &Methodtype);
X	if (op != NULL) {
X		op->m_name = name;
X		op->m_meth = meth;
X		if (self != NULL)
X			INCREF(self);
X		op->m_self = self;
X	}
X	return (object *)op;
X}
X
Xmethod
Xgetmethod(op)
X	object *op;
X{
X	if (!is_methodobject(op)) {
X		err_badcall();
X		return NULL;
X	}
X	return ((methodobject *)op) -> m_meth;
X}
X
Xobject *
Xgetself(op)
X	object *op;
X{
X	if (!is_methodobject(op)) {
X		err_badcall();
X		return NULL;
X	}
X	return ((methodobject *)op) -> m_self;
X}
X
X/* Methods (the standard built-in methods, that is) */
X
Xstatic void
Xmeth_dealloc(m)
X	methodobject *m;
X{
X	if (m->m_self != NULL)
X		DECREF(m->m_self);
X	free((char *)m);
X}
X
Xstatic void
Xmeth_print(m, fp, flags)
X	methodobject *m;
X	FILE *fp;
X	int flags;
X{
X	if (m->m_self == NULL)
X		fprintf(fp, "<built-in function '%s'>", m->m_name);
X	else
X		fprintf(fp, "<built-in method '%s' of some %s object>",
X			m->m_name, m->m_self->ob_type->tp_name);
X}
X
Xstatic object *
Xmeth_repr(m)
X	methodobject *m;
X{
X	char buf[200];
X	if (m->m_self == NULL)
X		sprintf(buf, "<built-in function '%.80s'>", m->m_name);
X	else
X		sprintf(buf,
X			"<built-in method '%.80s' of some %.80s object>",
X			m->m_name, m->m_self->ob_type->tp_name);
X	return newstringobject(buf);
X}
X
Xtypeobject Methodtype = {
X	OB_HEAD_INIT(&Typetype)
X	0,
X	"method",
X	sizeof(methodobject),
X	0,
X	meth_dealloc,	/*tp_dealloc*/
X	meth_print,	/*tp_print*/
X	0,		/*tp_getattr*/
X	0,		/*tp_setattr*/
X	0,		/*tp_compare*/
X	meth_repr,	/*tp_repr*/
X	0,		/*tp_as_number*/
X	0,		/*tp_as_sequence*/
X	0,		/*tp_as_mapping*/
X};
X
X/* Find a method in a module's method table.
X   Usually called from an object's getattr method. */
X
Xobject *
Xfindmethod(ml, op, name)
X	struct methodlist *ml;
X	object *op;
X	char *name;
X{
X	for (; ml->ml_name != NULL; ml++) {
X		if (strcmp(name, ml->ml_name) == 0)
X			return newmethodobject(ml->ml_name, ml->ml_meth, op);
X	}
X	err_setstr(NameError, name);
X	return NULL;
X}
EOF
fi
if test -s 'src/moduleobject.c'
then echo '*** I will not over-write existing file src/moduleobject.c'
else
echo 'x - src/moduleobject.c'
sed 's/^X//' > 'src/moduleobject.c' << 'EOF'
X/***********************************************************
XCopyright 1991 by Stichting Mathematisch Centrum, Amsterdam, The
XNetherlands.
X
X                        All Rights Reserved
X
XPermission to use, copy, modify, and distribute this software and its 
Xdocumentation for any purpose and without fee is hereby granted, 
Xprovided that the above copyright notice appear in all copies and that
Xboth that copyright notice and this permission notice appear in 
Xsupporting documentation, and that the names of Stichting Mathematisch
XCentrum or CWI not be used in advertising or publicity pertaining to
Xdistribution of the software without specific, written prior permission.
X
XSTICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO
XTHIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
XFITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE
XFOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
XWHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
XACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
XOF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
X
X******************************************************************/
X
X/* Module object implementation */
X
X#include "allobjects.h"
X
Xtypedef struct {
X	OB_HEAD
X	object *md_name;
X	object *md_dict;
X} moduleobject;
X
Xobject *
Xnewmoduleobject(name)
X	char *name;
X{
X	moduleobject *m = NEWOBJ(moduleobject, &Moduletype);
X	if (m == NULL)
X		return NULL;
X	m->md_name = newstringobject(name);
X	m->md_dict = newdictobject();
X	if (m->md_name == NULL || m->md_dict == NULL) {
X		DECREF(m);
X		return NULL;
X	}
X	return (object *)m;
X}
X
Xobject *
Xgetmoduledict(m)
X	object *m;
X{
X	if (!is_moduleobject(m)) {
X		err_badcall();
X		return NULL;
X	}
X	return ((moduleobject *)m) -> md_dict;
X}
X
Xchar *
Xgetmodulename(m)
X	object *m;
X{
X	if (!is_moduleobject(m)) {
X		err_badarg();
X		return NULL;
X	}
X	return getstringvalue(((moduleobject *)m) -> md_name);
X}
X
X/* Methods */
X
Xstatic void
Xmodule_dealloc(m)
X	moduleobject *m;
X{
X	if (m->md_name != NULL)
X		DECREF(m->md_name);
X	if (m->md_dict != NULL)
X		DECREF(m->md_dict);
X	free((char *)m);
X}
X
Xstatic void
Xmodule_print(m, fp, flags)
X	moduleobject *m;
X	FILE *fp;
X	int flags;
X{
X	fprintf(fp, "<module '%s'>", getstringvalue(m->md_name));
X}
X
Xstatic object *
Xmodule_repr(m)
X	moduleobject *m;
X{
X	char buf[100];
X	sprintf(buf, "<module '%.80s'>", getstringvalue(m->md_name));
X	return newstringobject(buf);
X}
X
Xstatic object *
Xmodule_getattr(m, name)
X	moduleobject *m;
X	char *name;
X{
X	object *res;
X	if (strcmp(name, "__dict__") == 0) {
X		INCREF(m->md_dict);
X		return m->md_dict;
X	}
X	if (strcmp(name, "__name__") == 0) {
X		INCREF(m->md_name);
X		return m->md_name;
X	}
X	res = dictlookup(m->md_dict, name);
X	if (res == NULL)
X		err_setstr(NameError, name);
X	else
X		INCREF(res);
X	return res;
X}
X
Xstatic int
Xmodule_setattr(m, name, v)
X	moduleobject *m;
X	char *name;
X	object *v;
X{
X	if (strcmp(name, "__dict__") == 0 || strcmp(name, "__name__") == 0) {
X		err_setstr(NameError, "can't assign to reserved member name");
X		return -1;
X	}
X	if (v == NULL)
X		return dictremove(m->md_dict, name);
X	else
X		return dictinsert(m->md_dict, name, v);
X}
X
Xtypeobject Moduletype = {
X	OB_HEAD_INIT(&Typetype)
X	0,			/*ob_size*/
X	"module",		/*tp_name*/
X	sizeof(moduleobject),	/*tp_size*/
X	0,			/*tp_itemsize*/
X	module_dealloc,		/*tp_dealloc*/
X	module_print,		/*tp_print*/
X	module_getattr,		/*tp_getattr*/
X	module_setattr,		/*tp_setattr*/
X	0,			/*tp_compare*/
X	module_repr,		/*tp_repr*/
X};
EOF
fi
if test -s 'src/opcode.h'
then echo '*** I will not over-write existing file src/opcode.h'
else
echo 'x - src/opcode.h'
sed 's/^X//' > 'src/opcode.h' << 'EOF'
X/***********************************************************
XCopyright 1991 by Stichting Mathematisch Centrum, Amsterdam, The
XNetherlands.
X
X                        All Rights Reserved
X
XPermission to use, copy, modify, and distribute this software and its 
Xdocumentation for any purpose and without fee is hereby granted, 
Xprovided that the above copyright notice appear in all copies and that
Xboth that copyright notice and this permission notice appear in 
Xsupporting documentation, and that the names of Stichting Mathematisch
XCentrum or CWI not be used in advertising or publicity pertaining to
Xdistribution of the software without specific, written prior permission.
X
XSTICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO
XTHIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
XFITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE
XFOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
XWHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
XACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
XOF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
X
X******************************************************************/
X
X/* Instruction opcodes for compiled code */
X
X#define STOP_CODE	0
X#define POP_TOP		1
X#define ROT_TWO		2
X#define ROT_THREE	3
X#define DUP_TOP		4
X
X#define UNARY_POSITIVE	10
X#define UNARY_NEGATIVE	11
X#define UNARY_NOT	12
X#define UNARY_CONVERT	13
X#define UNARY_CALL	14
X
X#define BINARY_MULTIPLY	20
X#define BINARY_DIVIDE	21
X#define BINARY_MODULO	22
X#define BINARY_ADD	23
X#define BINARY_SUBTRACT	24
X#define BINARY_SUBSCR	25
X#define BINARY_CALL	26
X
X#define SLICE		30
X/* Also uses 31-33 */
X
X#define STORE_SLICE	40
X/* Also uses 41-43 */
X
X#define DELETE_SLICE	50
X/* Also uses 51-53 */
X
X#define STORE_SUBSCR	60
X#define DELETE_SUBSCR	61
X
X#define PRINT_EXPR	70
X#define PRINT_ITEM	71
X#define PRINT_NEWLINE	72
X
X#define BREAK_LOOP	80
X#define RAISE_EXCEPTION	81
X#define LOAD_LOCALS	82
X#define RETURN_VALUE	83
X#define REQUIRE_ARGS	84
X#define REFUSE_ARGS	85
X#define BUILD_FUNCTION	86
X#define POP_BLOCK	87
X#define END_FINALLY	88
X#define BUILD_CLASS	89
X
X#define HAVE_ARGUMENT	90	/* Opcodes from here have an argument: */
X
X#define STORE_NAME	90	/* Index in name list */
X#define DELETE_NAME	91	/* "" */
X#define UNPACK_TUPLE	92	/* Number of tuple items */
X#define UNPACK_LIST	93	/* Number of list items */
X/* unused:		94 */
X#define STORE_ATTR	95	/* Index in name list */
X#define DELETE_ATTR	96	/* "" */
X
X#define LOAD_CONST	100	/* Index in const list */
X#define LOAD_NAME	101	/* Index in name list */
X#define BUILD_TUPLE	102	/* Number of tuple items */
X#define BUILD_LIST	103	/* Number of list items */
X#define BUILD_MAP	104	/* Always zero for now */
X#define LOAD_ATTR	105	/* Index in name list */
X#define COMPARE_OP	106	/* Comparison operator */
X#define IMPORT_NAME	107	/* Index in name list */
X#define IMPORT_FROM	108	/* Index in name list */
X
X#define JUMP_FORWARD	110	/* Number of bytes to skip */
X#define JUMP_IF_FALSE	111	/* "" */
X#define JUMP_IF_TRUE	112	/* "" */
X#define JUMP_ABSOLUTE	113	/* Target byte offset from beginning of code */
X#define FOR_LOOP	114	/* Number of bytes to skip */
X
X#define SETUP_LOOP	120	/* Target address (absolute) */
X#define SETUP_EXCEPT	121	/* "" */
X#define SETUP_FINALLY	122	/* "" */
X
X#define SET_LINENO	127	/* Current line number */
X
X/* Comparison operator codes (argument to COMPARE_OP) */
Xenum cmp_op {LT, LE, EQ, NE, GT, GE, IN, NOT_IN, IS, IS_NOT, EXC_MATCH, BAD};
X
X#define HAS_ARG(op) ((op) >= HAVE_ARGUMENT)
EOF
fi
if test -s 'src/parsetok.c'
then echo '*** I will not over-write existing file src/parsetok.c'
else
echo 'x - src/parsetok.c'
sed 's/^X//' > 'src/parsetok.c' << 'EOF'
X/***********************************************************
XCopyright 1991 by Stichting Mathematisch Centrum, Amsterdam, The
XNetherlands.
X
X                        All Rights Reserved
X
XPermission to use, copy, modify, and distribute this software and its 
Xdocumentation for any purpose and without fee is hereby granted, 
Xprovided that the above copyright notice appear in all copies and that
Xboth that copyright notice and this permission notice appear in 
Xsupporting documentation, and that the names of Stichting Mathematisch
XCentrum or CWI not be used in advertising or publicity pertaining to
Xdistribution of the software without specific, written prior permission.
X
XSTICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO
XTHIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
XFITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE
XFOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
XWHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
XACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
XOF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
X
X******************************************************************/
X
X/* Parser-tokenizer link implementation */
X
X#include "pgenheaders.h"
X#include "tokenizer.h"
X#include "node.h"
X#include "grammar.h"
X#include "parser.h"
X#include "parsetok.h"
X#include "errcode.h"
X
X
X/* Forward */
Xstatic int parsetok PROTO((struct tok_state *, grammar *, int, node **));
X
X
X/* Parse input coming from a string.  Return error code, print some errors. */
X
Xint
Xparsestring(s, g, start, n_ret)
X	char *s;
X	grammar *g;
X	int start;
X	node **n_ret;
X{
X	struct tok_state *tok = tok_setups(s);
X	int ret;
X	
X	if (tok == NULL) {
X		fprintf(stderr, "no mem for tok_setups\n");
X		return E_NOMEM;
X	}
X	ret = parsetok(tok, g, start, n_ret);
X	if (ret == E_TOKEN || ret == E_SYNTAX) {
X		fprintf(stderr, "String parsing error at line %d\n",
X			tok->lineno);
X	}
X	tok_free(tok);
X	return ret;
X}
X
X
X/* Parse input coming from a file.  Return error code, print some errors. */
X
Xint
Xparsefile(fp, filename, g, start, ps1, ps2, n_ret)
X	FILE *fp;
X	char *filename;
X	grammar *g;
X	int start;
X	char *ps1, *ps2;
X	node **n_ret;
X{
X	struct tok_state *tok = tok_setupf(fp, ps1, ps2);
X	int ret;
X	
X	if (tok == NULL) {
X		fprintf(stderr, "no mem for tok_setupf\n");
X		return E_NOMEM;
X	}
X	ret = parsetok(tok, g, start, n_ret);
X	if (ret == E_TOKEN || ret == E_SYNTAX) {
X		char *p;
X		fprintf(stderr, "Parsing error: file %s, line %d:\n",
X						filename, tok->lineno);
X		*tok->inp = '\0';
X		if (tok->inp > tok->buf && tok->inp[-1] == '\n')
X			tok->inp[-1] = '\0';
X		fprintf(stderr, "%s\n", tok->buf);
X		for (p = tok->buf; p < tok->cur; p++) {
X			if (*p == '\t')
X				putc('\t', stderr);
X			else
X				putc(' ', stderr);
X		}
X		fprintf(stderr, "^\n");
X	}
X	tok_free(tok);
X	return ret;
X}
X
X
X/* Parse input coming from the given tokenizer structure.
X   Return error code. */
X
Xstatic int
Xparsetok(tok, g, start, n_ret)
X	struct tok_state *tok;
X	grammar *g;
X	int start;
X	node **n_ret;
X{
X	parser_state *ps;
X	int ret;
X	
X	if ((ps = newparser(g, start)) == NULL) {
X		fprintf(stderr, "no mem for new parser\n");
X		return E_NOMEM;
X	}
X	
X	for (;;) {
X		char *a, *b;
X		int type;
X		int len;
X		char *str;
X		
X		type = tok_get(tok, &a, &b);
X		if (type == ERRORTOKEN) {
X			ret = tok->done;
X			break;
X		}
X		len = b - a;
X		str = NEW(char, len + 1);
X		if (str == NULL) {
X			fprintf(stderr, "no mem for next token\n");
X			ret = E_NOMEM;
X			break;
X		}
X		strncpy(str, a, len);
X		str[len] = '\0';
X		ret = addtoken(ps, (int)type, str, tok->lineno);
X		if (ret != E_OK) {
X			if (ret == E_DONE) {
X				*n_ret = ps->p_tree;
X				ps->p_tree = NULL;
X			}
X			else if (tok->lineno <= 1 && tok->done == E_EOF)
X				ret = E_EOF;
X			break;
X		}
X	}
X	
X	delparser(ps);
X	return ret;
X}
EOF
fi
if test -s 'src/pgenmain.c'
then echo '*** I will not over-write existing file src/pgenmain.c'
else
echo 'x - src/pgenmain.c'
sed 's/^X//' > 'src/pgenmain.c' << 'EOF'
X/***********************************************************
XCopyright 1991 by Stichting Mathematisch Centrum, Amsterdam, The
XNetherlands.
X
X                        All Rights Reserved
X
XPermission to use, copy, modify, and distribute this software and its 
Xdocumentation for any purpose and without fee is hereby granted, 
Xprovided that the above copyright notice appear in all copies and that
Xboth that copyright notice and this permission notice appear in 
Xsupporting documentation, and that the names of Stichting Mathematisch
XCentrum or CWI not be used in advertising or publicity pertaining to
Xdistribution of the software without specific, written prior permission.
X
XSTICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO
XTHIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
XFITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE
XFOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
XWHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
XACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
XOF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
X
X******************************************************************/
X
X/* Parser generator main program */
X
X/* This expects a filename containing the grammar as argv[1] (UNIX)
X   or asks the console for such a file name (THINK C).
X   It writes its output on two files in the current directory:
X   - "graminit.c" gets the grammar as a bunch of initialized data
X   - "graminit.h" gets the grammar's non-terminals as #defines.
X   Error messages and status info during the generation process are
X   written to stdout, or sometimes to stderr. */
X
X#include "pgenheaders.h"
X#include "grammar.h"
X#include "node.h"
X#include "parsetok.h"
X#include "pgen.h"
X
Xint debugging;
X
X/* Forward */
Xgrammar *getgrammar PROTO((char *filename));
X#ifdef THINK_C
Xint main PROTO((int, char **));
Xchar *askfile PROTO((void));
X#endif
X
Xint
Xmain(argc, argv)
X	int argc;
X	char **argv;
X{
X	grammar *g;
X	node *n;
X	FILE *fp;
X	char *filename;
X	
X#ifdef THINK_C
X	filename = askfile();
X#else
X	if (argc != 2) {
X		fprintf(stderr, "usage: %s grammar\n", argv[0]);
X		exit(2);
X	}
X	filename = argv[1];
X#endif
X	g = getgrammar(filename);
X	fp = fopen("graminit.c", "w");
X	if (fp == NULL) {
X		perror("graminit.c");
X		exit(1);
X	}
X	printf("Writing graminit.c ...\n");
X	printgrammar(g, fp);
X	fclose(fp);
X	fp = fopen("graminit.h", "w");
X	if (fp == NULL) {
X		perror("graminit.h");
X		exit(1);
X	}
X	printf("Writing graminit.h ...\n");
X	printnonterminals(g, fp);
X	fclose(fp);
X	exit(0);
X}
X
Xgrammar *
Xgetgrammar(filename)
X	char *filename;
X{
X	FILE *fp;
X	node *n;
X	grammar *g0, *g;
X	
X	fp = fopen(filename, "r");
X	if (fp == NULL) {
X		perror(filename);
X		exit(1);
X	}
X	g0 = meta_grammar();
X	n = NULL;
X	parsefile(fp, filename, g0, g0->g_start, (char *)NULL, (char *)NULL, &n);
X	fclose(fp);
X	if (n == NULL) {
X		fprintf(stderr, "Parsing error.\n");
X		exit(1);
X	}
X	g = pgen(n);
X	if (g == NULL) {
X		printf("Bad grammar.\n");
X		exit(1);
X	}
X	return g;
X}
X
X#ifdef THINK_C
Xchar *
Xaskfile()
X{
X	char buf[256];
X	static char name[256];
X	printf("Input file name: ");
X	if (fgets(buf, sizeof buf, stdin) == NULL) {
X		printf("EOF\n");
X		exit(1);
X	}
X	/* XXX The (unsigned char *) case is needed by THINK C 3.0 */
X	if (sscanf(/*(unsigned char *)*/buf, " %s ", name) != 1) {
X		printf("No file\n");
X		exit(1);
X	}
X	return name;
X}
X#endif
X
Xvoid
Xfatal(msg)
X	char *msg;
X{
X	fprintf(stderr, "pgen: FATAL ERROR: %s\n", msg);
X	exit(1);
X}
X
X/* XXX TO DO:
X   - check for duplicate definitions of names (instead of fatal err)
X*/
EOF
fi
if test -s 'src/printgrammar.c'
then echo '*** I will not over-write existing file src/printgrammar.c'
else
echo 'x - src/printgrammar.c'
sed 's/^X//' > 'src/printgrammar.c' << 'EOF'
X/***********************************************************
XCopyright 1991 by Stichting Mathematisch Centrum, Amsterdam, The
XNetherlands.
X
X                        All Rights Reserved
X
XPermission to use, copy, modify, and distribute this software and its 
Xdocumentation for any purpose and without fee is hereby granted, 
Xprovided that the above copyright notice appear in all copies and that
Xboth that copyright notice and this permission notice appear in 
Xsupporting documentation, and that the names of Stichting Mathematisch
XCentrum or CWI not be used in advertising or publicity pertaining to
Xdistribution of the software without specific, written prior permission.
X
XSTICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO
XTHIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
XFITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE
XFOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
XWHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
XACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
XOF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
X
X******************************************************************/
X
X/* Print a bunch of C initializers that represent a grammar */
X
X#include "pgenheaders.h"
X#include "grammar.h"
X
X/* Forward */
Xstatic void printarcs PROTO((int, dfa *, FILE *));
Xstatic void printstates PROTO((grammar *, FILE *));
Xstatic void printdfas PROTO((grammar *, FILE *));
Xstatic void printlabels PROTO((grammar *, FILE *));
X
Xvoid
Xprintgrammar(g, fp)
X	grammar *g;
X	FILE *fp;
X{
X	fprintf(fp, "#include \"pgenheaders.h\"\n");
X	fprintf(fp, "#include \"grammar.h\"\n");
X	printdfas(g, fp);
X	printlabels(g, fp);
X	fprintf(fp, "grammar gram = {\n");
X	fprintf(fp, "\t%d,\n", g->g_ndfas);
X	fprintf(fp, "\tdfas,\n");
X	fprintf(fp, "\t{%d, labels},\n", g->g_ll.ll_nlabels);
X	fprintf(fp, "\t%d\n", g->g_start);
X	fprintf(fp, "};\n");
X}
X
Xvoid
Xprintnonterminals(g, fp)
X	grammar *g;
X	FILE *fp;
X{
X	dfa *d;
X	int i;
X	
X	d = g->g_dfa;
X	for (i = g->g_ndfas; --i >= 0; d++)
X		fprintf(fp, "#define %s %d\n", d->d_name, d->d_type);
X}
X
Xstatic void
Xprintarcs(i, d, fp)
X	int i;
X	dfa *d;
X	FILE *fp;
X{
X	arc *a;
X	state *s;
X	int j, k;
X	
X	s = d->d_state;
X	for (j = 0; j < d->d_nstates; j++, s++) {
X		fprintf(fp, "static arc arcs_%d_%d[%d] = {\n",
X			i, j, s->s_narcs);
X		a = s->s_arc;
X		for (k = 0; k < s->s_narcs; k++, a++)
X			fprintf(fp, "\t{%d, %d},\n", a->a_lbl, a->a_arrow);
X		fprintf(fp, "};\n");
X	}
X}
X
Xstatic void
Xprintstates(g, fp)
X	grammar *g;
X	FILE *fp;
X{
X	state *s;
X	dfa *d;
X	int i, j;
X	
X	d = g->g_dfa;
X	for (i = 0; i < g->g_ndfas; i++, d++) {
X		printarcs(i, d, fp);
X		fprintf(fp, "static state states_%d[%d] = {\n",
X			i, d->d_nstates);
X		s = d->d_state;
X		for (j = 0; j < d->d_nstates; j++, s++)
X			fprintf(fp, "\t{%d, arcs_%d_%d},\n",
X				s->s_narcs, i, j);
X		fprintf(fp, "};\n");
X	}
X}
X
Xstatic void
Xprintdfas(g, fp)
X	grammar *g;
X	FILE *fp;
X{
X	dfa *d;
X	int i, j;
X	
X	printstates(g, fp);
X	fprintf(fp, "static dfa dfas[%d] = {\n", g->g_ndfas);
X	d = g->g_dfa;
X	for (i = 0; i < g->g_ndfas; i++, d++) {
X		fprintf(fp, "\t{%d, \"%s\", %d, %d, states_%d,\n",
X			d->d_type, d->d_name, d->d_initial, d->d_nstates, i);
X		fprintf(fp, "\t \"");
X		for (j = 0; j < NBYTES(g->g_ll.ll_nlabels); j++)
X			fprintf(fp, "\\%03o", d->d_first[j] & 0xff);
X		fprintf(fp, "\"},\n");
X	}
X	fprintf(fp, "};\n");
X}
X
Xstatic void
Xprintlabels(g, fp)
X	grammar *g;
X	FILE *fp;
X{
X	label *l;
X	int i;
X	
X	fprintf(fp, "static label labels[%d] = {\n", g->g_ll.ll_nlabels);
X	l = g->g_ll.ll_label;
X	for (i = g->g_ll.ll_nlabels; --i >= 0; l++) {
X		if (l->lb_str == NULL)
X			fprintf(fp, "\t{%d, 0},\n", l->lb_type);
X		else
X			fprintf(fp, "\t{%d, \"%s\"},\n",
X				l->lb_type, l->lb_str);
X	}
X	fprintf(fp, "};\n");
X}
EOF
fi
if test -s 'src/regsub.c'
then echo '*** I will not over-write existing file src/regsub.c'
else
echo 'x - src/regsub.c'
sed 's/^X//' > 'src/regsub.c' << 'EOF'
X/***********************************************************
XCopyright 1991 by Stichting Mathematisch Centrum, Amsterdam, The
XNetherlands.
X
X                        All Rights Reserved
X
XPermission to use, copy, modify, and distribute this software and its 
Xdocumentation for any purpose and without fee is hereby granted, 
Xprovided that the above copyright notice appear in all copies and that
Xboth that copyright notice and this permission notice appear in 
Xsupporting documentation, and that the names of Stichting Mathematisch
XCentrum or CWI not be used in advertising or publicity pertaining to
Xdistribution of the software without specific, written prior permission.
X
XSTICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO
XTHIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
XFITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE
XFOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
XWHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
XACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
XOF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
X
X******************************************************************/
X
X/*
X * regsub
X *
X *	Copyright (c) 1986 by University of Toronto.
X *	Written by Henry Spencer.  Not derived from licensed software.
X#ifdef MULTILINE
X *	Changed by Guido van Rossum, CWI, Amsterdam
X *	for multi-line support.
X#endif
X *
X *	Permission is granted to anyone to use this software for any
X *	purpose on any computer system, and to redistribute it freely,
X *	subject to the following restrictions:
X *
X *	1. The author is not responsible for the consequences of use of
X *		this software, no matter how awful, even if they arise
X *		from defects in it.
X *
X *	2. The origin of this software must not be misrepresented, either
X *		by explicit claim or by omission.
X *
X *	3. Altered versions must be plainly marked as such, and must not
X *		be misrepresented as being the original software.
X */
X#include <stdio.h>
X#include "regexp.h"
X#include "regmagic.h"
X
X#ifndef CHARBITS
X#define	UCHARAT(p)	((int)*(unsigned char *)(p))
X#else
X#define	UCHARAT(p)	((int)*(p)&CHARBITS)
X#endif
X
X/*
X - regsub - perform substitutions after a regexp match
X */
Xvoid
Xregsub(prog, source, dest)
Xregexp *prog;
Xchar *source;
Xchar *dest;
X{
X	register char *src;
X	register char *dst;
X	register char c;
X	register int no;
X	register int len;
X	extern char *strncpy();
X
X	if (prog == NULL || source == NULL || dest == NULL) {
X		regerror("NULL parm to regsub");
X		return;
X	}
X	if (UCHARAT(prog->program) != MAGIC) {
X		regerror("damaged regexp fed to regsub");
X		return;
X	}
X
X	src = source;
X	dst = dest;
X	while ((c = *src++) != '\0') {
X		if (c == '&')
X			no = 0;
X		else if (c == '\\' && '0' <= *src && *src <= '9')
X			no = *src++ - '0';
X		else
X			no = -1;
X
X		if (no < 0) {	/* Ordinary character. */
X			if (c == '\\' && (*src == '\\' || *src == '&'))
X				c = *src++;
X#ifdef MULTILINE
X			else if (c == '\\' && *src == 'n') {
X				c = '\n';
X				src++;
X			}
X#endif
X			*dst++ = c;
X		} else if (prog->startp[no] != NULL && prog->endp[no] != NULL) {
X			len = prog->endp[no] - prog->startp[no];
X			(void) strncpy(dst, prog->startp[no], len);
X			dst += len;
X			if (len != 0 && *(dst-1) == '\0') {	/* strncpy hit NUL. */
X				regerror("damaged match string");
X				return;
X			}
X		}
X	}
X	*dst++ = '\0';
X}
EOF
fi
if test -s 'src/sc_errors.c'
then echo '*** I will not over-write existing file src/sc_errors.c'
else
echo 'x - src/sc_errors.c'
sed 's/^X//' > 'src/sc_errors.c' << 'EOF'
X/***********************************************************
XCopyright 1991 by Stichting Mathematisch Centrum, Amsterdam, The
XNetherlands.
X
X                        All Rights Reserved
X
XPermission to use, copy, modify, and distribute this software and its 
Xdocumentation for any purpose and without fee is hereby granted, 
Xprovided that the above copyright notice appear in all copies and that
Xboth that copyright notice and this permission notice appear in 
Xsupporting documentation, and that the names of Stichting Mathematisch
XCentrum or CWI not be used in advertising or publicity pertaining to
Xdistribution of the software without specific, written prior permission.
X
XSTICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO
XTHIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
XFITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE
XFOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
XWHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
XACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
XOF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
X
X******************************************************************/
X
X
X#include <stdio.h>
X
X#include "PROTO.h"
X#include "object.h"
X#include "errors.h"
X#include "sc_errors.h"
X#include "stringobject.h"
X#include "tupleobject.h"
X
Xobject *
Xerr_scerr(sc_errno)
X	int sc_errno;
X{
X	switch(sc_errno) {
X	
X	case NoBufSize:
X		err_setstr(StubcodeError, "Stubcode didn't start with BufSize");
X		break;
X	
X	case TwoBufSize:
X		err_setstr(StubcodeError, "Stubcode can't have more then one BufSize");
X		break;
X
X	case ElementIsNull:
X		err_setstr(StubcodeError, "Trying to access an NIL object");
X		break;
X	
X	case StackOverflow:
X		err_setstr(StubcodeError, "Stack overflow");
X		return NULL;
X	
X	case StackUnderflow:
X		err_setstr(StubcodeError, "Stack underflow");
X		return NULL;
X	
X	case NoEndLoop:
X		err_setstr(StubcodeError, "LoopXXX with no EndLoop");
X		return NULL;
X	
X	case BufferOverflow:
X		err_setstr(StubcodeError, "Buffer overflow");
X		return NULL;
X	
X	}
X	return NULL;
X}
X
Xerr_scerrset(sc_errno, value, instr)
X	int sc_errno;
X	object *value;
X	char *instr;
X{
X	object *str, *str1, *t;
X
X	if ((t = newtupleobject(3)) == NULL) {
X		return -1;
X	}
X	if ((str = newstringobject(instr)) == NULL) {
X		return -1;
X	}
X	if (settupleitem(t, 2, str) != 0) {
X		return -1;
X	}
X	INCREF(value);
X	if (settupleitem(t, 1, value) != 0) {
X		DECREF(t);
X		return -1;
X	}
X	switch(sc_errno) {
X	
X	case TypeFailure:
X		if ((str1 = newstringobject("Unexpected type")) == NULL) {
X			DECREF(t);
X			return -1;
X		}
X		break;
X	
X	case RangeError:
X		if ((str1 = newstringobject("Value out of range")) == NULL) {
X			DECREF(t);
X			return -1;
X		}
X		break;
X	
X	case SizeError:
X		if ((str1 = newstringobject("Value doesn't have the right size")) == NULL) {
X			DECREF(t);
X			return -1;
X		}
X		break;
X	
X	case FlagError:
X		if ((str1 = newstringobject("Illegal flag value")) == NULL) {
X			DECREF(t);
X			return -1;
X		}
X		break;
X
X	case TransError:
X		if ((str1 = newstringobject("hdr.h_status != 0")) == NULL) {
X			DECREF(t);
X			return -1;
X		}
X		break;
X
X	default:
X		if ((str1 = newstringobject("sc_errno not found")) == NULL) {
X			DECREF(t);
X			return -1;
X		}
X		break;
X	}
X	if (settupleitem(t, 0, str1) != 0) {
X		DECREF(t);
X		return -1;
X	}
X	err_setval(StubcodeError, t);
X	DECREF(t);
X	return -1;
X}
EOF
fi
if test -s 'src/sc_global.h'
then echo '*** I will not over-write existing file src/sc_global.h'
else
echo 'x - src/sc_global.h'
sed 's/^X//' > 'src/sc_global.h' << 'EOF'
X/***********************************************************
XCopyright 1991 by Stichting Mathematisch Centrum, Amsterdam, The
XNetherlands.
X
X                        All Rights Reserved
X
XPermission to use, copy, modify, and distribute this software and its 
Xdocumentation for any purpose and without fee is hereby granted, 
Xprovided that the above copyright notice appear in all copies and that
Xboth that copyright notice and this permission notice appear in 
Xsupporting documentation, and that the names of Stichting Mathematisch
XCentrum or CWI not be used in advertising or publicity pertaining to
Xdistribution of the software without specific, written prior permission.
X
XSTICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO
XTHIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
XFITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE
XFOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
XWHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
XACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
XOF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
X
X******************************************************************/
X
X
X/*
X**	This file contains the data used in Ail, Python and sc2txt.
X**
X**	If you want to add an instuction to the instructions just define
X**	it here and add the instruction in the function sc_interpreter in
X**	the file sc_interpreter.c in the switch. You also have to make a
X**	new function with the name x{instruction_name} in the file
X**	sc_interpreter.
X*/
X
X/*
X**	When you want to change the types of the opcode or the operand
X**	you maybe need to adjust the options to mypf. And the defines :
X**	SwapOpcode, SwapOperand.
X*/
X
Xtypedef unsigned char TscOpcode;
Xtypedef long TscOperand;
X
X#define SC_MAGIC	0x19901991
X
X#define SwapOpcode(x)	x = x
X#define SwapOperand(l)	((l))=(((((l))>>24)&0xFF)|((((l))>>8)&0xFF00)|((((l))<<8)&0xFF0000)|((((l))<<24)&0xFF000000))
X
X#define STKSIZE		256
X
X#define OPERAND		0x80
X#define FLAGS		0x40
X
X/*
X**	The headerfields. The value of the flag is the index of the fields 
X**	array from the file mhdr.c plus one
X*/
X
X#define H_EXTRA		0x00000001
X#define H_SIZE		0x00000002
X#define H_OFFSET	0x00000003
X#define H_PORT		0x00000004
X#define H_PRIV		0x00000005
X#define PSEUDOFIELD	0x00000006
X#define ALL_FIELDS	0x000000ff
X
X/*
X**	The specefiers for the integers
X*/
X
X#define NOSIGN		0x00000100
X#define INT32		0x00000200
X#define ALLTYPES	0xffffff00
X
X/*
X**	The opcode with no operand	
X*/
X
X#define ListS		0x00
X#define PutVS		0x01
X#define GetVS		0x02
X#define StringS		0x03
X#define	Equal		0x04
X#define NoArgs		0x05
X
X/*
X *    Between 0x10 and 0x3f there is space for predefined marshal
X *    and unmarshal functions or macros that do not have an operand
X */
X
X#define MarshTC		0x10
X#define UnMarshTC	0x11
X
X/*
X**	The opcode with a number as operand
X*/
X
X#define BufSize		0x80
X#define Trans		0x81
X#define TTupleS		0x82
X#define Unpack		0x83
X#define PutFS		0x84
X#define TStringSeq	0x85
X#define TStringSlt	0x86
X#define TListSeq	0x87
X#define TListSlt	0x88
X#define LoopPut		0x89
X#define EndLoop		0x8a
X#define Dup		0x8b
X#define Pop		0x8c
X#define Align		0x8d
X#define Pack		0x8e
X#define LoopGet		0x8f
X#define GetFS		0x90
X#define PushI		0x91
X
X/*
X**      Between 0xa0 and 0xbf there is space for predefined marshal
X**      and unmarshal functions or macros with a numberas operand
X*/
X
X
X/*
X**	The opcodes with flags as operand
X*/
X
X#define AilWord		0xc0
X#define PutI		0xc1
X#define PutC		0xc2
X#define GetI		0xc3
X#define GetC		0xc4
X
X/*
X**	Between 0xe0 and 0xff there is space for predefined marshal
X**	and unmarshal functions or macros with flags as operand
X*/
EOF
fi
if test -s 'src/scdbg.c'
then echo '*** I will not over-write existing file src/scdbg.c'
else
echo 'x - src/scdbg.c'
sed 's/^X//' > 'src/scdbg.c' << 'EOF'
X/***********************************************************
XCopyright 1991 by Stichting Mathematisch Centrum, Amsterdam, The
XNetherlands.
X
X                        All Rights Reserved
X
XPermission to use, copy, modify, and distribute this software and its 
Xdocumentation for any purpose and without fee is hereby granted, 
Xprovided that the above copyright notice appear in all copies and that
Xboth that copyright notice and this permission notice appear in 
Xsupporting documentation, and that the names of Stichting Mathematisch
XCentrum or CWI not be used in advertising or publicity pertaining to
Xdistribution of the software without specific, written prior permission.
X
XSTICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO
XTHIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
XFITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE
XFOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
XWHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
XACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
XOF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
X
X******************************************************************/
X
X
X#include "sc_global.h"
X
Xvoid xPrintNum(Num)
XTscOperand Num;
X{
X
X    printf(" %ld",(long)Num);
X}
X
Xvoid xPrintFlags(Flags)
XTscOperand Flags;
X{
Xlong x;
X
X    x = (long)Flags;
X    x = x & 0x0000000F;
X    if (x == H_EXTRA) printf(" h_extra");
X    if (x == H_SIZE) printf(" h_size");
X    if (x == H_OFFSET) printf(" h_offset");
X    if (x == H_PORT) printf(" h_port");
X    if (x == H_PRIV) printf(" h_priv");
X    if (x == PSEUDOFIELD) printf(" h_port and h_priv");
X    x = (long)Flags;
X    if (x & NOSIGN) printf(" unsigned");
X    if (x & INT32) printf(" int32");
X}
X
Xvoid xPrintCode(Opcode)
XTscOpcode Opcode;
X{
X
X    switch (Opcode) {
X    
X    case BufSize:	printf("BufSize");
X    			break;
X
X    case Trans:		printf("Trans");
X    			break;
X
X    case TTupleS:	printf("TTupleS");
X    			break;
X
X    case Unpack:	printf("Unpack");
X    			break;
X
X    case AilWord:	printf("AilWord");
X    			break;
X
X    case ListS:		printf("ListS");
X    			break;
X
X    case StringS:	printf("StringS");
X    			break;
X
X    case PutFS:		printf("PutFS");
X    			break;
X
X    case TStringSeq:	printf("TStringSeq");
X    			break;
X
X    case TStringSlt:	printf("TStringSlt");
X    			break;
X
X    case PutVS:		printf("PutVS");
X    			break;
X
X    case TListSeq:	printf("TListSeq");
X    			break;
X
X    case TListSlt:	printf("TListSlt");
X    			break;
X
X    case LoopPut:	printf("LoopPut");
X    			break;
X
X    case EndLoop:	printf("EndLoop");
X    			break;
X
X    case PutI:		printf("PutI");
X    			break;
X
X    case PutC:		printf("PutC");
X    			break;
X
X    case Dup:		printf("Dup");
X    			break;
X
X    case Pop:		printf("Pop");
X    			break;
X
X    case Align:		printf("Align");
X    			break;
X    
X    case Pack:		printf("Pack");
X    			break;
X
X    case GetVS:		printf("GetVS");
X    			break;
X    
X    case LoopGet:	printf("LoopGet");
X    			break;
X    
X    case GetFS:		printf("GetFS");
X    			break;
X    
X    case GetI:		printf("GetI");
X    			break;
X    
X    case GetC:		printf("GetC");
X    			break;
X    
X    case PushI:		printf("PushI");
X    			break;
X    
X    case MarshTC:	printf("MarshTC");
X    			break;
X    
X    case UnMarshTC:	printf("UnMarshTC");
X    			break;
X
X    case Equal:		printf("Equal");
X    			break;
X
X    default:		printf("Unknown opcode %04x",(int)Opcode);
X    			break;
X    }
X}
EOF
fi
if test -s 'src/structmember.c'
then echo '*** I will not over-write existing file src/structmember.c'
else
echo 'x - src/structmember.c'
sed 's/^X//' > 'src/structmember.c' << 'EOF'
X/***********************************************************
XCopyright 1991 by Stichting Mathematisch Centrum, Amsterdam, The
XNetherlands.
X
X                        All Rights Reserved
X
XPermission to use, copy, modify, and distribute this software and its 
Xdocumentation for any purpose and without fee is hereby granted, 
Xprovided that the above copyright notice appear in all copies and that
Xboth that copyright notice and this permission notice appear in 
Xsupporting documentation, and that the names of Stichting Mathematisch
XCentrum or CWI not be used in advertising or publicity pertaining to
Xdistribution of the software without specific, written prior permission.
X
XSTICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO
XTHIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
XFITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE
XFOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
XWHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
XACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
XOF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
X
X******************************************************************/
X
X/* Map C struct members to Python object attributes */
X
X#include "allobjects.h"
X
X#include "structmember.h"
X
Xobject *
Xgetmember(addr, mlist, name)
X	char *addr;
X	struct memberlist *mlist;
X	char *name;
X{
X	struct memberlist *l;
X	
X	for (l = mlist; l->name != NULL; l++) {
X		if (strcmp(l->name, name) == 0) {
X			object *v;
X			addr += l->offset;
X			switch (l->type) {
X			case T_SHORT:
X				v = newintobject((long) *(short*)addr);
X				break;
X			case T_INT:
X				v = newintobject((long) *(int*)addr);
X				break;
X			case T_LONG:
X				v = newintobject(*(long*)addr);
X				break;
X			case T_FLOAT:
X				v = newfloatobject((double)*(float*)addr);
X				break;
X			case T_DOUBLE:
X				v = newfloatobject(*(double*)addr);
X				break;
X			case T_STRING:
X				if (*(char**)addr == NULL) {
X					INCREF(None);
X					v = None;
X				}
X				else
X					v = newstringobject(*(char**)addr);
X				break;
X			case T_OBJECT:
X				v = *(object **)addr;
X				if (v == NULL)
X					v = None;
X				INCREF(v);
X				break;
X			default:
X				err_setstr(SystemError, "bad memberlist type");
X				v = NULL;
X			}
X			return v;
X		}
X	}
X	
X	err_setstr(NameError, name);
X	return NULL;
X}
X
Xint
Xsetmember(addr, mlist, name, v)
X	char *addr;
X	struct memberlist *mlist;
X	char *name;
X	object *v;
X{
X	struct memberlist *l;
X	
X	for (l = mlist; l->name != NULL; l++) {
X		if (strcmp(l->name, name) == 0) {
X			if (l->readonly || l->type == T_STRING) {
X				err_setstr(RuntimeError, "readonly attribute");
X				return -1;
X			}
X			addr += l->offset;
X			switch (l->type) {
X			case T_SHORT:
X				if (!is_intobject(v)) {
X					err_badarg();
X					return -1;
X				}
X				*(short*)addr = getintvalue(v);
X				break;
X			case T_INT:
X				if (!is_intobject(v)) {
X					err_badarg();
X					return -1;
X				}
X				*(int*)addr = getintvalue(v);
X				break;
X			case T_LONG:
X				if (!is_intobject(v)) {
X					err_badarg();
X					return -1;
X				}
X				*(long*)addr = getintvalue(v);
X				break;
X			case T_FLOAT:
X				if (is_intobject(v))
X					*(float*)addr = getintvalue(v);
X				else if (is_floatobject(v))
X					*(float*)addr = getfloatvalue(v);
X				else {
X					err_badarg();
X					return -1;
X				}
X				break;
X			case T_DOUBLE:
X				if (is_intobject(v))
X					*(double*)addr = getintvalue(v);
X				else if (is_floatobject(v))
X					*(double*)addr = getfloatvalue(v);
X				else {
X					err_badarg();
X					return -1;
X				}
X				break;
X			case T_OBJECT:
X				XDECREF(*(object **)addr);
X				XINCREF(v);
X				*(object **)addr = v;
X				break;
X			default:
X				err_setstr(SystemError, "bad memberlist type");
X				return -1;
X			}
X			return 0;
X		}
X	}
X	
X	err_setstr(NameError, name);
X	return -1;
X}
EOF
fi
if test -s 'src/xxobject.c'
then echo '*** I will not over-write existing file src/xxobject.c'
else
echo 'x - src/xxobject.c'
sed 's/^X//' > 'src/xxobject.c' << 'EOF'
X/***********************************************************
XCopyright 1991 by Stichting Mathematisch Centrum, Amsterdam, The
XNetherlands.
X
X                        All Rights Reserved
X
XPermission to use, copy, modify, and distribute this software and its 
Xdocumentation for any purpose and without fee is hereby granted, 
Xprovided that the above copyright notice appear in all copies and that
Xboth that copyright notice and this permission notice appear in 
Xsupporting documentation, and that the names of Stichting Mathematisch
XCentrum or CWI not be used in advertising or publicity pertaining to
Xdistribution of the software without specific, written prior permission.
X
XSTICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO
XTHIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
XFITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE
XFOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
XWHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
XACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
XOF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
X
X******************************************************************/
X
X/* Use this file as a template to start implementing a new object type.
X   If your objects will be called foobar, start by copying this file to
X   foobarobject.c, changing all occurrences of xx to foobar and all
X   occurrences of Xx by Foobar.  You will probably want to delete all
X   references to 'x_attr' and add your own types of attributes
X   instead.  Maybe you want to name your local variables other than
X   'xp'.  If your object type is needed in other files, you'll have to
X   create a file "foobarobject.h"; see intobject.h for an example. */
X
X
X/* Xx objects */
X
X#include "allobjects.h"
X
Xtypedef struct {
X	OB_HEAD
X	object	*x_attr;	/* Attributes dictionary */
X} xxobject;
X
Xextern typeobject Xxtype;	/* Really static, forward */
X
X#define is_xxobject(v)		((v)->ob_type == &Xxtype)
X
Xstatic xxobject *
Xnewxxobject(arg)
X	object *arg;
X{
X	xxobject *xp;
X	xp = NEWOBJ(xxobject, &Xxtype);
X	if (xp == NULL)
X		return NULL;
X	xp->x_attr = NULL;
X	return xp;
X}
X
X/* Xx methods */
X
Xstatic void
Xxx_dealloc(xp)
X	xxobject *xp;
X{
X	XDECREF(xp->x_attr);
X	DEL(xp);
X}
X
Xstatic object *
Xxx_demo(self, args)
X	xxobject *self;
X	object *args;
X{
X	if (!getnoarg(args))
X		return NULL;
X	INCREF(None);
X	return None;
X}
X
Xstatic struct methodlist xx_methods[] = {
X	"demo",		xx_demo,
X	{NULL,		NULL}		/* sentinel */
X};
X
Xstatic object *
Xxx_getattr(xp, name)
X	xxobject *xp;
X	char *name;
X{
X	if (xp->x_attr != NULL) {
X		object *v = dictlookup(xp->x_attr, name);
X		if (v != NULL) {
X			INCREF(v);
X			return v;
X		}
X	}
X	return findmethod(xx_methods, (object *)xp, name);
X}
X
Xstatic int
Xxx_setattr(xp, name, v)
X	xxobject *xp;
X	char *name;
X	object *v;
X{
X	if (xp->x_attr == NULL) {
X		xp->x_attr = newdictobject();
X		if (xp->x_attr == NULL)
X			return -1;
X	}
X	if (v == NULL)
X		return dictremove(xp->x_attr, name);
X	else
X		return dictinsert(xp->x_attr, name, v);
X}
X
Xstatic typeobject Xxtype = {
X	OB_HEAD_INIT(&Typetype)
X	0,			/*ob_size*/
X	"xx",			/*tp_name*/
X	sizeof(xxobject),	/*tp_size*/
X	0,			/*tp_itemsize*/
X	/* methods */
X	xx_dealloc,	/*tp_dealloc*/
X	0,		/*tp_print*/
X	xx_getattr,	/*tp_getattr*/
X	xx_setattr,	/*tp_setattr*/
X	0,		/*tp_compare*/
X	0,		/*tp_repr*/
X};
EOF
fi
echo 'Part 16 out of 21 of pack.out complete.'
exit 0



More information about the Alt.sources mailing list