From 542659bbd05a16dd77ef0ae4b5d8e562db742466 Mon Sep 17 00:00:00 2001
From: Sjoerd Mullender <sjoerd@acm.org>
Date: Tue, 28 Mar 1995 12:06:23 +0000
Subject: Use newgetargs instead of getargs. Check if objects are closed in
 getattr function instead of in each method. Removed functions sbtoa and
 timetoa. Added functions msftoframe. Added variables that used to be in
 standard module CD.

---
 Modules/cdmodule.c | 313 +++++++++++++++++++++++++----------------------------
 1 file changed, 146 insertions(+), 167 deletions(-)

diff --git a/Modules/cdmodule.c b/Modules/cdmodule.c
index 3e09577..4abef27 100644
--- a/Modules/cdmodule.c
+++ b/Modules/cdmodule.c
@@ -27,6 +27,7 @@ OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 
 #include <sys/types.h>
 #include <cdaudio.h>
+/* #include <sigfpe.h> */
 #include "allobjects.h"
 #include "import.h"
 #include "modsupport.h"
@@ -39,15 +40,6 @@ typedef struct {
 	CDPLAYER *ob_cdplayer;
 } cdplayerobject;
 
-#define CheckPlayer(self)	if ((self)->ob_cdplayer == NULL) { \
-					err_setstr(RuntimeError, "no player active"); \
-					return NULL; \
-				}
-#define CheckParser(self)	if ((self)->ob_cdparser == NULL) { \
-					err_setstr(RuntimeError, "no parser active"); \
-					return NULL; \
-				}
-
 static object *CdError;		/* exception cd.error */
 
 static object *
@@ -55,9 +47,7 @@ CD_allowremoval(self, args)
 	cdplayerobject *self;
 	object *args;
 {
-	CheckPlayer(self);
-
-	if (!getnoarg(args))
+	if (!newgetargs(args, ""))
 		return NULL;
 
 	CDallowremoval(self->ob_cdplayer);
@@ -71,9 +61,7 @@ CD_preventremoval(self, args)
 	cdplayerobject *self;
 	object *args;
 {
-	CheckPlayer(self);
-
-	if (!getnoarg(args))
+	if (!newgetargs(args, ""))
 		return NULL;
 
 	CDpreventremoval(self->ob_cdplayer);
@@ -87,9 +75,7 @@ CD_bestreadsize(self, args)
 	cdplayerobject *self;
 	object *args;
 {
-	CheckPlayer(self);
-
-	if (!getnoarg(args))
+	if (!newgetargs(args, ""))
 		return NULL;
 
 	return newintobject((long) CDbestreadsize(self->ob_cdplayer));
@@ -100,9 +86,7 @@ CD_close(self, args)
 	cdplayerobject *self;
 	object *args;
 {
-	CheckPlayer(self);
-
-	if (!getnoarg(args))
+	if (!newgetargs(args, ""))
 		return NULL;
 
 	if (!CDclose(self->ob_cdplayer)) {
@@ -122,9 +106,7 @@ CD_eject(self, args)
 {
 	CDSTATUS status;
 
-	CheckPlayer(self);
-
-	if (!getnoarg(args))
+	if (!newgetargs(args, ""))
 		return NULL;
 
 	if (!CDeject(self->ob_cdplayer)) {
@@ -147,9 +129,7 @@ CD_getstatus(self, args)
 {
 	CDSTATUS status;
 
-	CheckPlayer(self);
-
-	if (!getnoarg(args))
+	if (!newgetargs(args, ""))
 		return NULL;
 
 	if (!CDgetstatus(self->ob_cdplayer, &status)) {
@@ -157,13 +137,12 @@ CD_getstatus(self, args)
 		return NULL;
 	}
 
-	return mkvalue("(ii(iii)(iii)(iii)iiii(iii))", status.state,
+	return mkvalue("(ii(iii)(iii)(iii)iiii)", status.state,
 		       status.track, status.min, status.sec, status.frame,
 		       status.abs_min, status.abs_sec, status.abs_frame,
 		       status.total_min, status.total_sec, status.total_frame,
 		       status.first, status.last, status.scsi_audio,
-		       status.cur_block, status.polyfilla[0],
-		       status.polyfilla[1], status.polyfilla[2]);
+		       status.cur_block);
 }
 	
 static object *
@@ -175,9 +154,7 @@ CD_gettrackinfo(self, args)
 	CDTRACKINFO info;
 	CDSTATUS status;
 
-	CheckPlayer(self);
-
-	if (!getargs(args, "i", &track))
+	if (!newgetargs(args, "i", &track))
 		return NULL;
 
 	if (!CDgettrackinfo(self->ob_cdplayer, track, &info)) {
@@ -200,15 +177,12 @@ CD_msftoblock(self, args)
 	object *args;
 {
 	int min, sec, frame;
-	unsigned long block;
-
-	CheckPlayer(self);
 
-	if (!getargs(args, "(iii)", &min, &sec, &frame))
+	if (!newgetargs(args, "iii", &min, &sec, &frame))
 		return NULL;
 
-	block = CDmsftoblock(self->ob_cdplayer, min, sec, frame);
-	return newintobject((long) block);
+	return newintobject((long) CDmsftoblock(self->ob_cdplayer,
+						min, sec, frame));
 }
 	
 static object *
@@ -219,9 +193,7 @@ CD_play(self, args)
 	int start, play;
 	CDSTATUS status;
 
-	CheckPlayer(self);
-
-	if (!getargs(args, "(ii)", &start, &play))
+	if (!newgetargs(args, "ii", &start, &play))
 		return NULL;
 
 	if (!CDplay(self->ob_cdplayer, start, play)) {
@@ -245,9 +217,7 @@ CD_playabs(self, args)
 	int min, sec, frame, play;
 	CDSTATUS status;
 
-	CheckPlayer(self);
-
-	if (!getargs(args, "(iiii)", &min, &sec, &frame, &play))
+	if (!newgetargs(args, "iiii", &min, &sec, &frame, &play))
 		return NULL;
 
 	if (!CDplayabs(self->ob_cdplayer, min, sec, frame, play)) {
@@ -271,9 +241,7 @@ CD_playtrack(self, args)
 	int start, play;
 	CDSTATUS status;
 
-	CheckPlayer(self);
-
-	if (!getargs(args, "(ii)", &start, &play))
+	if (!newgetargs(args, "ii", &start, &play))
 		return NULL;
 
 	if (!CDplaytrack(self->ob_cdplayer, start, play)) {
@@ -297,9 +265,7 @@ CD_playtrackabs(self, args)
 	int track, min, sec, frame, play;
 	CDSTATUS status;
 
-	CheckPlayer(self);
-
-	if (!getargs(args, "(iiiii)", &track, &min, &sec, &frame, &play))
+	if (!newgetargs(args, "iiiii", &track, &min, &sec, &frame, &play))
 		return NULL;
 
 	if (!CDplaytrackabs(self->ob_cdplayer, track, min, sec, frame, play)) {
@@ -323,9 +289,7 @@ CD_readda(self, args)
 	int numframes, n;
 	object *result;
 
-	CheckPlayer(self);
-
-	if (!getargs(args, "i", &numframes))
+	if (!newgetargs(args, "i", &numframes))
 		return NULL;
 
 	result = newsizedstringobject(NULL, numframes * sizeof(CDFRAME));
@@ -353,9 +317,7 @@ CD_seek(self, args)
 	int min, sec, frame;
 	long block;
 
-	CheckPlayer(self);
-
-	if (!getargs(args, "(iii)", &min, &sec, &frame))
+	if (!newgetargs(args, "iii", &min, &sec, &frame))
 		return NULL;
 
 	block = CDseek(self->ob_cdplayer, min, sec, frame);
@@ -375,9 +337,7 @@ CD_seektrack(self, args)
 	int track;
 	long block;
 
-	CheckPlayer(self);
-
-	if (!getargs(args, "i", &track))
+	if (!newgetargs(args, "i", &track))
 		return NULL;
 
 	block = CDseektrack(self->ob_cdplayer, track);
@@ -390,15 +350,32 @@ CD_seektrack(self, args)
 }
 	
 static object *
+CD_seekblock(self, args)
+	cdplayerobject *self;
+	object *args;
+{
+	unsigned long block;
+
+	if (!newgetargs(args, "l", &block))
+		return NULL;
+
+	block = CDseekblock(self->ob_cdplayer, block);
+	if (block == (unsigned long) -1) {
+		err_errno(CdError);
+		return NULL;
+	}
+
+	return newintobject(block);
+}
+	
+static object *
 CD_stop(self, args)
 	cdplayerobject *self;
 	object *args;
 {
 	CDSTATUS status;
 
-	CheckPlayer(self);
-
-	if (!getnoarg(args))
+	if (!newgetargs(args, ""))
 		return NULL;
 
 	if (!CDstop(self->ob_cdplayer)) {
@@ -421,9 +398,7 @@ CD_togglepause(self, args)
 {
 	CDSTATUS status;
 
-	CheckPlayer(self);
-
-	if (!getnoarg(args))
+	if (!newgetargs(args, ""))
 		return NULL;
 
 	if (!CDtogglepause(self->ob_cdplayer)) {
@@ -440,23 +415,24 @@ CD_togglepause(self, args)
 }
 	
 static struct methodlist cdplayer_methods[] = {
-	{"allowremoval",	(method)CD_allowremoval},
-	{"bestreadsize",	(method)CD_bestreadsize},
-	{"close",		(method)CD_close},
-	{"eject",		(method)CD_eject},
-	{"getstatus",		(method)CD_getstatus},
-	{"gettrackinfo",	(method)CD_gettrackinfo},
-	{"msftoblock",		(method)CD_msftoblock},
-	{"play",		(method)CD_play},
-	{"playabs",		(method)CD_playabs},
-	{"playtrack",		(method)CD_playtrack},
-	{"playtrackabs",	(method)CD_playtrackabs},
-	{"preventremoval",	(method)CD_preventremoval},
-	{"readda",		(method)CD_readda},
-	{"seek",		(method)CD_seek},
-	{"seektrack",		(method)CD_seektrack},
-	{"stop",		(method)CD_stop},
-	{"togglepause",		(method)CD_togglepause},
+	{"allowremoval",	(method)CD_allowremoval,	1},
+	{"bestreadsize",	(method)CD_bestreadsize,	1},
+	{"close",		(method)CD_close,		1},
+	{"eject",		(method)CD_eject,		1},
+	{"getstatus",		(method)CD_getstatus,		1},
+	{"gettrackinfo",	(method)CD_gettrackinfo,	1},
+	{"msftoblock",		(method)CD_msftoblock,		1},
+	{"play",		(method)CD_play,		1},
+	{"playabs",		(method)CD_playabs,		1},
+	{"playtrack",		(method)CD_playtrack,		1},
+	{"playtrackabs",	(method)CD_playtrackabs,	1},
+	{"preventremoval",	(method)CD_preventremoval,	1},
+	{"readda",		(method)CD_readda,		1},
+	{"seek",		(method)CD_seek,		1},
+	{"seekblock",		(method)CD_seekblock,		1},
+	{"seektrack",		(method)CD_seektrack,		1},
+	{"stop",		(method)CD_stop,		1},
+	{"togglepause",		(method)CD_togglepause,		1},
 	{NULL,			NULL} 		/* sentinel */
 };
 
@@ -470,11 +446,15 @@ cdplayer_dealloc(self)
 }
 
 static object *
-cdplayer_getattr(cdp, name)
-	cdplayerobject *cdp;
+cdplayer_getattr(self, name)
+	cdplayerobject *self;
 	char *name;
 {
-	return findmethod(cdplayer_methods, (object *)cdp, name);
+	if (self->ob_cdplayer == NULL) {
+		err_setstr(RuntimeError, "no player active");
+		return NULL;
+	}
+	return findmethod(cdplayer_methods, (object *)self, name);
 }
 
 typeobject CdPlayertype = {
@@ -518,14 +498,8 @@ CD_open(self, args)
 	 */
 	dev = NULL;
 	direction = "r";
-	if (!getnoarg(args)) {
-		err_clear();
-		if (!getargs(args, "z", &dev)) {
-			err_clear();
-			if (!getargs(args, "(zs)", &dev, &direction))
-				return NULL;
-		}
-	}
+	if (!newgetargs(args, "|zs", &dev, &direction))
+		return NULL;
 
 	cdp = CDopen(dev, direction);
 	if (cdp == NULL) {
@@ -574,7 +548,8 @@ CD_callback(arg, type, data)
 	case cd_ptime:
 	case cd_atime:
 #define ptr ((struct cdtimecode *) data)
-		v = mkvalue("(iii)", ptr->mhi * 10 + ptr->mlo,
+		v = mkvalue("(iii)",
+			    ptr->mhi * 10 + ptr->mlo,
 			    ptr->shi * 10 + ptr->slo,
 			    ptr->fhi * 10 + ptr->flo);
 #undef ptr
@@ -586,19 +561,21 @@ CD_callback(arg, type, data)
 			*p++ = ((char *) data)[i] + '0';
 		break;
 	case cd_ident:
+#define ptr ((struct cdident *) data)
 		v = newsizedstringobject(NULL, 12);
 		p = getstringvalue(v);
-		CDsbtoa(p, ((struct cdident *) data)->country, 2);
+		CDsbtoa(p, ptr->country, 2);
 		p += 2;
-		CDsbtoa(p, ((struct cdident *) data)->owner, 3);
+		CDsbtoa(p, ptr->owner, 3);
 		p += 3;
-		*p++ = ((struct cdident *) data)->year[0] + '0';
-		*p++ = ((struct cdident *) data)->year[1] + '0';
-		*p++ = ((struct cdident *) data)->serial[0] + '0';
-		*p++ = ((struct cdident *) data)->serial[1] + '0';
-		*p++ = ((struct cdident *) data)->serial[2] + '0';
-		*p++ = ((struct cdident *) data)->serial[3] + '0';
-		*p++ = ((struct cdident *) data)->serial[4] + '0';
+		*p++ = ptr->year[0] + '0';
+		*p++ = ptr->year[1] + '0';
+		*p++ = ptr->serial[0] + '0';
+		*p++ = ptr->serial[1] + '0';
+		*p++ = ptr->serial[2] + '0';
+		*p++ = ptr->serial[3] + '0';
+		*p++ = ptr->serial[4] + '0';
+#undef ptr
 		break;
 	case cd_control:
 		v = newintobject((long) *((unchar *) data));
@@ -622,9 +599,7 @@ CD_deleteparser(self, args)
 {
 	int i;
 
-	CheckParser(self);
-
-	if (!getnoarg(args))
+	if (!newgetargs(args, ""))
 		return NULL;
 
 	CDdeleteparser(self->ob_cdparser);
@@ -651,9 +626,7 @@ CD_parseframe(self, args)
 	int length;
 	CDFRAME *p;
 
-	CheckParser(self);
-
-	if (!getargs(args, "s#", &cdfp, &length))
+	if (!newgetargs(args, "s#", &cdfp, &length))
 		return NULL;
 
 	if (length % sizeof(CDFRAME) != 0) {
@@ -681,9 +654,7 @@ CD_removecallback(self, args)
 {
 	int type;
 
-	CheckParser(self);
-
-	if (!getargs(args, "i", &type))
+	if (!newgetargs(args, "i", &type))
 		return NULL;
 
 	if (type < 0 || type >= NCALLBACKS) {
@@ -708,9 +679,7 @@ CD_resetparser(self, args)
 	cdparserobject *self;
 	object *args;
 {
-	CheckParser(self);
-
-	if (!getnoarg(args))
+	if (!newgetargs(args, ""))
 		return NULL;
 
 	CDresetparser(self->ob_cdparser);
@@ -727,10 +696,8 @@ CD_addcallback(self, args)
 	int type;
 	object *func, *funcarg;
 
-	CheckParser(self);
-
 	/* XXX - more work here */
-	if (!getargs(args, "(iOO)", &type, &func, &funcarg))
+	if (!newgetargs(args, "iOO", &type, &func, &funcarg))
 		return NULL;
 
 	if (type < 0 || type >= NCALLBACKS) {
@@ -750,17 +717,24 @@ CD_addcallback(self, args)
 	INCREF(funcarg);
 	self->ob_cdcallbacks[type].ob_cdcallbackarg = funcarg;
 
+/*
+	if (type == cd_audio) {
+		sigfpe_[_UNDERFL].repls = _ZERO;
+		handle_sigfpes(_ON, _EN_UNDERFL, NULL, _ABORT_ON_ERROR, NULL);
+	}
+*/
+
 	INCREF(None);
 	return None;
 }
 
 static struct methodlist cdparser_methods[] = {
-	{"addcallback",		(method)CD_addcallback},
-	{"deleteparser",	(method)CD_deleteparser},
-	{"parseframe",		(method)CD_parseframe},
-	{"removecallback",	(method)CD_removecallback},
-	{"resetparser",		(method)CD_resetparser},
-	{"setcallback",		(method)CD_addcallback}, /* backward compatibility */
+	{"addcallback",		(method)CD_addcallback,		1},
+	{"deleteparser",	(method)CD_deleteparser,	1},
+	{"parseframe",		(method)CD_parseframe,		1},
+	{"removecallback",	(method)CD_removecallback,	1},
+	{"resetparser",		(method)CD_resetparser,		1},
+	{"setcallback",		(method)CD_addcallback,		1}, /* backward compatibility */
 	{NULL,			NULL} 		/* sentinel */
 };
 
@@ -781,11 +755,16 @@ cdparser_dealloc(self)
 }
 
 static object *
-cdparser_getattr(cdp, name)
-	cdparserobject *cdp;
+cdparser_getattr(self, name)
+	cdparserobject *self;
 	char *name;
 {
-	return findmethod(cdparser_methods, (object *)cdp, name);
+	if (self->ob_cdparser == NULL) {
+		err_setstr(RuntimeError, "no parser active");
+		return NULL;
+	}
+
+	return findmethod(cdparser_methods, (object *)self, name);
 }
 
 typeobject CdParsertype = {
@@ -827,7 +806,7 @@ CD_createparser(self, args)
 {
 	CDPARSER *cdp;
 
-	if (!getnoarg(args))
+	if (!newgetargs(args, ""))
 		return NULL;
 	cdp = CDcreateparser();
 	if (cdp == NULL) {
@@ -839,48 +818,21 @@ CD_createparser(self, args)
 }
 
 static object *
-CD_sbtoa(self, args)
-	object *self;
-	object *args;
-{
-	char *sb;
-	int length;
-	object *result;
-
-	if (!getargs(args, "s#", &sb, &length))
-		return NULL;
-	result = newsizedstringobject(NULL, length);
-	CDsbtoa(getstringvalue(result), (unchar *) sb, length);
-	return result;
-}
-
-static object *
-CD_timetoa(self, args)
-	object *self;
-	object *args;
+CD_msftoframe(self, args)
+	object *self, *args;
 {
-	char *tc;
-	int length;
-	object *result;
-
-	if (!getargs(args, "s#", &tc, &length))
-		return NULL;
+	int min, sec, frame;
 
-	if (length != sizeof(struct cdtimecode)) {
-		err_setstr(TypeError, "bad length");
+	if (!newgetargs(args, "iii", &min, &sec, &frame))
 		return NULL;
-	}
 
-	result = newsizedstringobject(NULL, 8);
-	CDtimetoa(getstringvalue(result), (struct cdtimecode *) tc);
-	return result;
+	return newintobject((long) CDmsftoframe(min, sec, frame));
 }
-
+	
 static struct methodlist CD_methods[] = {
-	{"sbtoa",	(method)CD_sbtoa},
-	{"open",	(method)CD_open},
-	{"createparser",(method)CD_createparser},
-	{"timetoa",	(method)CD_timetoa},
+	{"open",		(method)CD_open,		1},
+	{"createparser",	(method)CD_createparser,	1},
+	{"msftoframe",		(method)CD_msftoframe,		1},
 	{NULL,		NULL}	/* Sentinel */
 };
 
@@ -893,6 +845,33 @@ initcd()
 	d = getmoduledict(m);
 
 	CdError = newstringobject("cd.error");
-	if (CdError == NULL || dictinsert(d, "error", CdError) != 0)
-		fatal("can't define cd.error");
+	dictinsert(d, "error", CdError);
+
+	/* Identifiers for the different types of callbacks from the parser */
+	dictinsert(d, "audio", newintobject((long) cd_audio));
+	dictinsert(d, "pnum", newintobject((long) cd_pnum));
+	dictinsert(d, "index", newintobject((long) cd_index));
+	dictinsert(d, "ptime", newintobject((long) cd_ptime));
+	dictinsert(d, "atime", newintobject((long) cd_atime));
+	dictinsert(d, "catalog", newintobject((long) cd_catalog));
+	dictinsert(d, "ident", newintobject((long) cd_ident));
+	dictinsert(d, "control", newintobject((long) cd_control));
+
+	/* Block size information for digital audio data */
+	dictinsert(d, "DATASIZE", newintobject((long) CDDA_DATASIZE));
+	dictinsert(d, "BLOCKSIZE", newintobject((long) CDDA_BLOCKSIZE));
+
+	/* Possible states for the cd player */
+	dictinsert(d, "ERROR", newintobject((long) CD_ERROR));
+	dictinsert(d, "NODISC", newintobject((long) CD_NODISC));
+	dictinsert(d, "READY", newintobject((long) CD_READY));
+	dictinsert(d, "PLAYING", newintobject((long) CD_PLAYING));
+	dictinsert(d, "PAUSED", newintobject((long) CD_PAUSED));
+	dictinsert(d, "STILL", newintobject((long) CD_STILL));
+#ifdef CD_CDROM			/* only newer versions of the library */
+	dictinsert(d, "CDROM", newintobject((long) CD_CDROM));
+#endif
+
+	if (err_occurred())
+		fatal("can't initialize module cd");
 }
-- 
cgit v0.12

