$NetBSD: patch-ah,v 1.6 2011/09/12 06:50:00 dholland Exp $

- support cdrom access on BSDs
- get function decls out of function bodies, which gcc dislikes
- fix mismatched return statements, which clang dislikes
- ...more (?)

--- internals.c.orig	1993-01-12 18:59:45.000000000 +0000
+++ internals.c
@@ -22,6 +22,9 @@
 
 # include "debug.h"
 # include "cdrom_globs.h"
+#if defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__NetBSD__) || defined(__DragonFly__)
+# include "cdrom_freebsd.h"
+#endif
 #ifdef sun
 # include "cdrom_sun.h"
 #endif
@@ -29,13 +32,14 @@
 # include "cdrom_sgi.h"
 #endif
 
-
+static void     scan_update();
 static XtIntervalId	ivid			= -1;
 static XtIntervalId	scanivid		= -1;
 static XtIntervalId	stativid		= -1;
 static unsigned int	timer_mod		= 1000 / TIMER_PERIOD;
 unsigned int		timer_fsecs;
 
+extern AppData app_data;
 
 int
 cdrom_get_curtime() {
@@ -46,7 +50,7 @@ cdrom_get_curtime() {
 
 	if (cdrom_open() == -1) {
 		debug_printf(1, "cdrom_get_curtime: error from cdrom_open\n");
-		return;
+		return 0;
 	}
 
 	switch (cdrom_status()) {
@@ -54,7 +58,7 @@ cdrom_get_curtime() {
 	case CDROM_PLAYING:
 	    if (cdrom_get_curmsf(&curmsf) == -1) {
 		debug_printf(1, "get_curtime: error reading location\n");
-		return;
+		return 0;
 	    }
 
 	    if (((curtrack = cdrom_get_curtrack()) == -1) ||
@@ -76,6 +80,170 @@ cdrom_get_curtime() {
 	}
 }
 
+/*
+ * called by update_track when the cd has hit
+ * the end of the track or the disc.
+ */
+static void
+cdrom_atend() {
+	cdrom_timer_off();
+	leds_stop();
+	debug_printf(1, "cdrom_atend: at end\n");
+
+#ifdef sgi
+	/* Force a stop to kill the child (if any).
+	 * This is due to some sort of weirdness when the SGI runs off the 
+	 * disc during a CDreadda().
+	 */
+	if (cdi.scsi_audio) {
+		cdrom_stop();
+	}
+#endif
+	if (cdi.state & CDROM_STATE_SHUFFLE) {
+
+		if (cdi.currand == cdi.ntracks) {
+			if ((cdi.state & CDROM_STATE_CYCLE) == 0) {
+				debug_printf(1, "cdrom_atend: shuffle done\n");
+
+				cdrom_reset();
+				return;
+			}
+
+			debug_printf(1, "cdrom_atend: shuffle cycling\n");
+			shuffle_setup();
+		}
+
+		cdi.curtrack = shuffle_next_track();
+	}
+	else if (cdi.state & CDROM_STATE_PROGRAM) {
+		if ((cdi.curtrack = program_goto_next_track()) == 0)
+		{
+		    if (cdi.state & CDROM_STATE_CYCLE)
+		    {
+		        debug_printf(1, "cdrom_atend: cycling program\n");
+			cdi.curtrack = program_resume();
+			timer_fsecs = 0;
+			cdi.duration = 0;
+			timer_button_update();
+
+			(void) cdrom_play();
+		    }
+		    else
+		    {
+		        debug_printf(1, "cdrom_atend: all done\n");
+		    	cdrom_reset();
+		    }
+		    return;
+		}
+	}
+			
+	else if ((cdi.curtrack < cdi.maxtrack) && (cdi.curtrack != 0)) {
+		debug_printf(1, "cdrom_atend: continuing\n");
+		cdi.curtrack++;
+	}
+	else if (cdi.state & CDROM_STATE_CYCLE) {
+		debug_printf(1, "cdrom_atend: cycling\n");
+		cdi.curtrack = cdi.mintrack;
+	}
+	else {
+		debug_printf(1, "cdrom_atend: all done\n");
+		buttons_reset();
+		cdrom_reset();
+		return;
+	}
+
+	timer_fsecs = 0;
+	cdi.duration = 0;
+	timer_button_update();
+
+	(void) cdrom_play();
+}
+
+/*
+ * update_track is called when the timeout fires; it updates curtrack and 
+ * calls the label update routine.
+ */
+/*ARGSUSED*/
+static void
+update_track(data, id)
+	XtPointer	*data;
+	XtIntervalId	*id;
+{
+	unsigned int	curtrack;
+	Arg	args[1];
+	Boolean	state;
+
+	extern Widget	rew_button_widget;
+	extern Widget	ff_button_widget;
+#ifdef sgi
+
+	int	vol;
+#endif
+
+	if ((curtrack = cdrom_get_curtrack()) != cdi.curtrack) {
+		if (curtrack == 0) {
+			cdrom_atend();
+
+			return;
+		}
+
+		timer_fsecs = 0;
+		cdi.duration = 0;
+		timer_button_update();
+
+		cdi.curtrack = curtrack;
+		track_button_update();
+	}
+
+#ifdef sgi
+	/* Update the volume control */
+	if ((vol = cdrom_get_volume()) != 0) {
+		set_volume(vol);
+	}
+#endif
+
+	XtSetArg(args[0], XtNstate, &state);
+	XtGetValues(rew_button_widget, args, 1);
+	if (state == True)
+	{
+		cdrom_rewind();
+		leds_update(BACKWARDS);
+		if (cdi.state & CDROM_STATE_PAUSE) {
+			if (cdrom_pause() != -1)
+				 cdi.state &= ~CDROM_STATE_STOP;
+		}
+	        ivid = XtAppAddTimeOut(appc, 
+			(int)(app_data.scanPauseInterval * 1000.0), 
+			update_track, NULL);
+	}
+	else
+	{
+		leds_update(FORWARDS);
+		XtSetArg(args[0], XtNstate, &state);
+		XtGetValues(ff_button_widget, args, 1);
+		if (state == True)
+		{
+			cdrom_ff();
+			if (cdi.state & CDROM_STATE_PAUSE) {
+				if (cdrom_pause() != -1)
+					 cdi.state &= ~CDROM_STATE_STOP;
+			}
+
+			ivid = XtAppAddTimeOut(appc,
+				(int)(app_data.scanPauseInterval * 1000.0),
+				update_track, NULL);
+		}
+		else
+		{
+			if ((timer_fsecs++ % timer_mod) == 0) {
+				timer_button_update();
+			}
+			ivid = XtAppAddTimeOut(appc, TIMER_PERIOD, 
+				update_track, NULL);
+		}
+	}
+}
+
 
 /*
  * we poll the cd-rom drive every TIMER_PERIOD milliseconds to see where 
@@ -83,8 +251,6 @@ cdrom_get_curtime() {
  */
 void
 cdrom_timer_on() {
-	static void	update_track();
-
 	if (cdi.state & CDROM_STATE_PLAY)
 		ivid = XtAppAddTimeOut(appc, TIMER_PERIOD, update_track, NULL);
 }
@@ -170,7 +336,6 @@ cdrom_rewind () {
 	struct msf	track_start;
         struct msf	start_addr, end_addr;
 	int		curtrack;
-	extern void 	scan_update();
 
 	if (cdrom_get_curmsf(&start_addr) == -1) {
 		debug_printf(1, "rew: error reading location\n");
@@ -196,11 +361,11 @@ cdrom_rewind () {
 	    if (((cdi.state & CDROM_STATE_PLAY) && 
 		 ((track_start.minute * 60) + track_start.second) >=
 		 ((start_addr.minute * 60) + start_addr.second - 
-		  scanSkipInterval)) ||
+		  app_data.scanSkipInterval)) ||
 		((cdi.state & CDROM_STATE_PAUSE) &&
 		 ((track_start.minute * 60) + track_start.second) >=
 		 ((start_addr.minute * 60) + start_addr.second -
-		  pauseSkipInterval)))
+		  app_data.pauseSkipInterval)))
 	    {
 	        start_addr = track_start;
 	        start_addr.second++; /* guarantee we never back up too far */
@@ -208,9 +373,9 @@ cdrom_rewind () {
 	    else
 	    {
 		if (cdi.state & CDROM_STATE_PAUSE) {
-			start_addr.second -= pauseSkipInterval; 
+			start_addr.second -= app_data.pauseSkipInterval; 
 		} else if (cdi.state & CDROM_STATE_PLAY) {
-			start_addr.second -= scanSkipInterval; 
+			start_addr.second -= app_data.scanSkipInterval; 
 		}
 	        if ((char) start_addr.second < 0)
 	        {
@@ -223,9 +388,9 @@ cdrom_rewind () {
 	else /* normal case */
 	{
 		if (cdi.state & CDROM_STATE_PAUSE) {
-			start_addr.second -= pauseSkipInterval; 
+			start_addr.second -= app_data.pauseSkipInterval; 
 		} else if (cdi.state & CDROM_STATE_PLAY) {
-			start_addr.second -= scanSkipInterval; 
+			start_addr.second -= app_data.scanSkipInterval; 
 		}
 		if ((char) start_addr.second < 0)
 		{
@@ -274,7 +439,7 @@ cdrom_rewind () {
 	{
 	    if (scanivid == -1)
 		scanivid = XtAppAddTimeOut(appc, 
-			(int)(pausePauseInterval * 1000.0), 
+			(int)(app_data.pausePauseInterval * 1000.0), 
 			scan_update, NULL);
 
 	    cdi.state &= ~CDROM_STATE_PAUSE;	/* allow timer to change */
@@ -304,7 +469,6 @@ cdrom_ff () {
         struct msf	start_addr, end_addr,  next_start;
 	char		t;
 	int		curtrack;
-	extern void 	scan_update();
 
 	if (cdrom_get_curmsf(&start_addr) == -1) {
 		debug_printf(1, "ff: error reading location\n");
@@ -332,11 +496,11 @@ cdrom_ff () {
 	    if (((cdi.state & CDROM_STATE_PLAY) && 
 		 ((next_start.minute * 60) + next_start.second) <=
 		 ((start_addr.minute * 60) + start_addr.second +
-		  scanSkipInterval)) ||
+		  app_data.scanSkipInterval)) ||
 		((cdi.state & CDROM_STATE_PAUSE) &&
 		 ((next_start.minute * 60) + next_start.second) <=
 		 ((start_addr.minute * 60) + start_addr.second +
-		  pauseSkipInterval)))
+		  app_data.pauseSkipInterval)))
 	    {
 	    
 	        /* start at end of current track */
@@ -346,9 +510,9 @@ cdrom_ff () {
 	    else
 	    {
 		    if (cdi.state & CDROM_STATE_PAUSE) {
-			    start_addr.second += pauseSkipInterval; 
+			    start_addr.second += app_data.pauseSkipInterval; 
 		    } else if (cdi.state & CDROM_STATE_PLAY) {
-			    start_addr.second += scanSkipInterval; 
+			    start_addr.second += app_data.scanSkipInterval; 
 		    }
 		    if (start_addr.second >= 60)
 		    {
@@ -360,9 +524,9 @@ cdrom_ff () {
 	else
 	{
 	    if (cdi.state & CDROM_STATE_PAUSE) {
-		start_addr.second += pauseSkipInterval; 
+		start_addr.second += app_data.pauseSkipInterval; 
 	    } else if (cdi.state & CDROM_STATE_PLAY) {
-		start_addr.second += scanSkipInterval; 
+		start_addr.second += app_data.scanSkipInterval; 
 	    }
 	    if (start_addr.second >= 60)
 	    {
@@ -413,7 +577,7 @@ cdrom_ff () {
 	{
 	    if (scanivid == -1)
 		scanivid = XtAppAddTimeOut(appc, 
-			(int)(pausePauseInterval * 1000.0), 
+			(int)(app_data.pausePauseInterval * 1000.0), 
 			scan_update, NULL);
 
 	    cdi.state &= ~CDROM_STATE_PAUSE;	/* allow timer to change */
@@ -435,85 +599,6 @@ cdrom_ff () {
 
 
 /*
- * called by update_track when the cd has hit
- * the end of the track or the disc.
- */
-static void
-cdrom_atend() {
-	cdrom_timer_off();
-	leds_stop();
-	debug_printf(1, "cdrom_atend: at end\n");
-
-#ifdef sgi
-	/* Force a stop to kill the child (if any).
-	 * This is due to some sort of weirdness when the SGI runs off the 
-	 * disc during a CDreadda().
-	 */
-	if (cdi.scsi_audio) {
-		cdrom_stop();
-	}
-#endif
-	if (cdi.state & CDROM_STATE_SHUFFLE) {
-
-		if (cdi.currand == cdi.ntracks) {
-			if ((cdi.state & CDROM_STATE_CYCLE) == 0) {
-				debug_printf(1, "cdrom_atend: shuffle done\n");
-
-				cdrom_reset();
-				return;
-			}
-
-			debug_printf(1, "cdrom_atend: shuffle cycling\n");
-			shuffle_setup();
-		}
-
-		cdi.curtrack = shuffle_next_track();
-	}
-	else if (cdi.state & CDROM_STATE_PROGRAM) {
-		if ((cdi.curtrack = program_goto_next_track()) == 0)
-		{
-		    if (cdi.state & CDROM_STATE_CYCLE)
-		    {
-		        debug_printf(1, "cdrom_atend: cycling program\n");
-			cdi.curtrack = program_resume();
-			timer_fsecs = 0;
-			cdi.duration = 0;
-			timer_button_update();
-
-			(void) cdrom_play();
-		    }
-		    else
-		    {
-		        debug_printf(1, "cdrom_atend: all done\n");
-		    	cdrom_reset();
-		    }
-		    return;
-		}
-	}
-			
-	else if ((cdi.curtrack < cdi.maxtrack) && (cdi.curtrack != 0)) {
-		debug_printf(1, "cdrom_atend: continuing\n");
-		cdi.curtrack++;
-	}
-	else if (cdi.state & CDROM_STATE_CYCLE) {
-		debug_printf(1, "cdrom_atend: cycling\n");
-		cdi.curtrack = cdi.mintrack;
-	}
-	else {
-		debug_printf(1, "cdrom_atend: all done\n");
-		buttons_reset();
-		cdrom_reset();
-		return;
-	}
-
-	timer_fsecs = 0;
-	cdi.duration = 0;
-	timer_button_update();
-
-	(void) cdrom_play();
-}
-
-/*
  * scan_update is called when the scan timeout fires; it updates the timer 
  * and calls the label update routine.
  */
@@ -557,7 +642,7 @@ scan_update(data, id)
 				 cdi.state &= ~CDROM_STATE_STOP;
 		}
 	        ivid = XtAppAddTimeOut(appc, 
-			(int)(scanPauseInterval * 1000.0), 
+			(int)(app_data.scanPauseInterval * 1000.0), 
 			scan_update, NULL);
 	}
 	else
@@ -574,7 +659,7 @@ scan_update(data, id)
 			}
 
 			ivid = XtAppAddTimeOut(appc,
-				(int)(scanPauseInterval * 1000.0),
+				(int)(app_data.scanPauseInterval * 1000.0),
 				scan_update, NULL);
 		}
 		else if (scanivid != -1) {
@@ -607,89 +692,3 @@ update_status(data, id)
 	/* Reset timer */
 	stativid = XtAppAddTimeOut(appc, 1000, update_status, NULL);
 }
-
-/*
- * update_track is called when the timeout fires; it updates curtrack and 
- * calls the label update routine.
- */
-/*ARGSUSED*/
-static void
-update_track(data, id)
-	XtPointer	*data;
-	XtIntervalId	*id;
-{
-	unsigned int	curtrack;
-	Arg	args[1];
-	Boolean	state;
-
-	extern Widget	rew_button_widget;
-	extern Widget	ff_button_widget;
-#ifdef sgi
-
-	int	vol;
-#endif
-
-	if ((curtrack = cdrom_get_curtrack()) != cdi.curtrack) {
-		if (curtrack == 0) {
-			cdrom_atend();
-
-			return;
-		}
-
-		timer_fsecs = 0;
-		cdi.duration = 0;
-		timer_button_update();
-
-		cdi.curtrack = curtrack;
-		track_button_update();
-	}
-
-#ifdef sgi
-	/* Update the volume control */
-	if ((vol = cdrom_get_volume()) != 0) {
-		set_volume(vol);
-	}
-#endif
-
-	XtSetArg(args[0], XtNstate, &state);
-	XtGetValues(rew_button_widget, args, 1);
-	if (state == True)
-	{
-		cdrom_rewind();
-		leds_update(BACKWARDS);
-		if (cdi.state & CDROM_STATE_PAUSE) {
-			if (cdrom_pause() != -1)
-				 cdi.state &= ~CDROM_STATE_STOP;
-		}
-	        ivid = XtAppAddTimeOut(appc, 
-			(int)(scanPauseInterval * 1000.0), 
-			update_track, NULL);
-	}
-	else
-	{
-		leds_update(FORWARDS);
-		XtSetArg(args[0], XtNstate, &state);
-		XtGetValues(ff_button_widget, args, 1);
-		if (state == True)
-		{
-			cdrom_ff();
-			if (cdi.state & CDROM_STATE_PAUSE) {
-				if (cdrom_pause() != -1)
-					 cdi.state &= ~CDROM_STATE_STOP;
-			}
-
-			ivid = XtAppAddTimeOut(appc,
-				(int)(scanPauseInterval * 1000.0),
-				update_track, NULL);
-		}
-		else
-		{
-			if ((timer_fsecs++ % timer_mod) == 0) {
-				timer_button_update();
-			}
-			ivid = XtAppAddTimeOut(appc, TIMER_PERIOD, 
-				update_track, NULL);
-		}
-	}
-}
-
