v14i081: ephem, 6 of 6

downey at cs.umn.edu downey at cs.umn.edu
Fri Aug 31 10:56:42 AEST 1990


Posting-number: Volume 14, Issue 81
Submitted-by: downey at cs.umn.edu@dimed1.UUCP
Archive-name: ephem-4.21/part06

#! /bin/sh
# This is a shell archive.  Remove anything before this line, then unpack
# it by saving it into a file and typing "sh file".  To overwrite existing
# files, type "sh file -c".  You can also feed this as standard input via
# unshar, or by typing "sh <file", e.g..  If this archive is complete, you
# will see the following message at the end:
#		"End of archive 6 (of 6)."
# Contents:  main.c sel_fld.c
# Wrapped by allbery at uunet on Thu Aug 30 20:46:38 1990
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'main.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'main.c'\"
else
echo shar: Extracting \"'main.c'\" \(24745 characters\)
sed "s/^X//" >'main.c' <<'END_OF_FILE'
X/* main "ephem" program. 
X * -------------------------------------------------------------------
X * Copyright (c) 1990 by Elwood Charles Downey
X * 
X * Permission is granted to make and distribute copies of this program
X * free of charge, provided the copyright notice and this permission
X * notice are preserved on all copies.  All other rights reserved.
X * -------------------------------------------------------------------
X * set options.
X * init screen and circumstances.
X * enter infinite loop updating screen and allowing operator input.
X */
X
X#include <stdio.h>
X#include <signal.h>
X#include <setjmp.h>
X#include <math.h>
X#ifdef VMS
X#include <stdlib.h>
X#endif
X#include "astro.h"
X#include "circum.h"
X#include "screen.h"
X
Xextern char *strncpy();
Xextern char *getenv();
X
X/* shorthands for fields of a Now structure, now.
X * first undo the ones for a Now pointer from circum.h.
X */
X#undef mjd
X#undef lat
X#undef lng
X#undef tz
X#undef temp
X#undef pressure
X#undef height
X#undef epoch
X#undef tznm
X
X#define mjd	now.n_mjd
X#define lat	now.n_lat
X#define lng	now.n_lng
X#define tz	now.n_tz
X#define temp	now.n_temp
X#define pressure now.n_pressure
X#define height	now.n_height
X#define epoch	now.n_epoch
X#define tznm	now.n_tznm
X
Xstatic jmp_buf fpe_err_jmp;	/* used to recover from SIGFPE */
Xstatic char *cfgfile;		/* !0 if -c used */
Xstatic char cfgdef[] = "ephem.cfg"; /* default configuration file name */
Xstatic Now now;		/* where when and how, right now */
Xstatic double tminc;	/* hrs to inc time by each loop; RTC means use clock */
Xstatic int nstep;	/* steps to go before stopping */
Xstatic int spause;	/* secs to pause between steps */
Xstatic int optwi;	/* set when want to display dawn/dusk/len-of-night */
Xstatic int oppl;	/* mask of (1<<planet) bits; set when want to show it */
X
Xmain (ac, av)
Xint ac;
Xchar *av[];
X{
X	void bye();
X	void on_fpe();
X	static char freerun[] =
X	    "Running... press any key to stop to make changes.";
X	static char prmpt[] =
X"Move to another field, RETURN to change this field, ? for help, or q to run";
X	static char hlp[] =
X	"arrow keys move to field; any key stops running; ^d exits; ^l redraws";
X	int curr = R_NSTEP, curc = C_NSTEPV;	/* must start somewhere */
X	int sflag = 0;	/* not silent, by default */
X	int one = 1;	/* use a variable so optimizer doesn't get disabled */
X	int srchdone = 0; /* true when search funcs say so */
X	int newcir = 2;	/* set when circumstances change - means don't tminc */
X
X	while ((--ac > 0) && (**++av == '-')) {
X	    char *s;
X	    for (s = *av+1; *s != '\0'; s++)
X		switch (*s) {
X		case 's': /* no credits "silent" (don't publish this) */
X		    sflag++;
X		    break;
X		case 'c': /* set name of config file to use */
X		    if (--ac <= 0) usage("-c but no config file");
X		    cfgfile = *++av;
X		    break;
X		case 'd': /* set alternate database file name */
X		    if (--ac <= 0) usage("-d but no database file");
X		    obj_setdbfilename (*++av);
X		    break;
X		default:
X		    usage("Bad - option");
X		}
X	}
X
X	if (!sflag)
X	    credits();
X
X	/* fresh screen.
X	 * crack config file, THEN args so args may override.
X	 */
X	c_erase();
X	read_cfgfile ();
X	read_fieldargs (ac, av);
X
X	/* set up to clean up screen and tty if interrupted.
X	 * also set up to stop if get floating error.
X	 */
X	(void) signal (SIGINT, bye);
X	(void) signal (SIGFPE, on_fpe);
X
X	/* update screen forever (until QUIT) */
X	while (one) {
X
X	    /* if get a floating error, longjmp() here and stop looping */
X	    if (setjmp (fpe_err_jmp))
X		nstep = 0;
X	    else {
X		nstep -= 1;
X
X		/* recalculate everything and update all the fields */
X		redraw_screen (newcir);
X		mm_newcir (0);
X
X		/* let searching functions change tminc and check for done */
X		srchdone = srch_eval (mjd, &tminc) < 0;
X		print_tminc(0);	/* to show possibly new search increment */
X
X		/* update plot and listing files, now that all fields are up
X		 * to date and search function has been evaluated.
X		 */
X		plot();
X		listing();
X
X		/* handle spause if we are really looping */
X		if (nstep > 0)
X		    slp_sync();
X	    }
X
X	    /* stop loop to allow op to change parameters:
X	     * if a search evaluation converges (or errors out),
X	     * or if steps are done,
X	     * or if op hits any key.
X	     */
X	    newcir = 0;
X	    if (srchdone || nstep <= 0 || (chk_char()==0 && read_char()!=0)) {
X		int fld;
X
X		/* update screen with the current stuff if stopped during
X		 * unattended plotting or listing since last redraw_screen()
X		 * didn't.
X		 */
X		if ((plot_ison() || listing_ison()) && nstep > 0)
X		    redraw_screen (1);
X
X		/* return nstep to default of 1 */
X		if (nstep <= 0) {
X		    nstep = 1;
X		    print_nstep (0);
X		}
X
X		/* change fields until END.
X		 * update all time fields if any are changed
X		 * and print NEW CIRCUMSTANCES if any have changed.
X		 * QUIT causes bye() to be called and we never return.
X		 */
X		while(fld = sel_fld(curr,curc,alt_menumask()|F_CHG,prmpt,hlp)) {
X		    if (chg_fld ((char *)0, fld)) {
X			mm_now (&now, 1);
X			mm_newcir(1);
X			newcir = 1;
X		    }
X		    curr = unpackr (fld);
X		    curc = unpackc (fld);
X		}
X		if (nstep > 1)
X		    f_prompt (freerun);
X	    }
X
X	    /* increment time only if op didn't change cirumstances */
X	    if (!newcir)
X		inc_mjd (&now, tminc);
X	}
X
X	return (0);
X}
X
X/* read in ephem's configuration file, if any.
X * if errors in file, call usage() (which exits).
X * if use -d, require it; else try $EPHEMCFG and ephem.cfg but don't
X *   complain if can't find these since, after all, one is not required.
X * skip blank lines and lines that begin with '#', '*', ' ' or '\t'.
X */
Xstatic
Xread_cfgfile()
X{
X	char buf[128];
X	FILE *fp;
X	char *fn;
X
X	/* open the config file. 
X	 * only REQUIRED if used -d option.
X	 * if succcessful, fn points to file name.
X	 */
X	if (cfgfile) {
X	    fn = cfgfile;
X	    fp = fopen (fn, "r");
X	    if (!fp) {
X		(void) sprintf (buf, "Can not open %s", fn);
X		usage (buf);	/* does not return */
X	    }
X	} else {
X	    fn = getenv ("EPHEMCFG");
X	    if (!fn)
X		fn = cfgdef;
X	}
X	fp = fopen (fn, "r");
X	if (!fp)
X	    return;	/* oh well; after all, it's not required */
X
X	while (fgets (buf, sizeof(buf), fp)) {
X	    switch (buf[0]) {
X	    case '#': case '*': case ' ': case '\t': case '\n':
X		continue;
X	    }
X	    buf[strlen(buf)-1] = '\0';		/* discard trailing \n */
X	    if (crack_fieldset (buf) < 0) {
X		char why[NC];
X		(void) sprintf (why, "Bad field spec in %s: %s\n", fn, buf);
X		usage (why);
X	    }
X	}
X	(void) fclose (fp);
X}
X
X
X/* draw all the stuff on the screen, using the current menu.
X * if how_much == 0 then just update fields that need it;
X * if how_much == 1 then redraw all fields;
X * if how_much == 2 then erase the screen and redraw EVERYTHING.
X */
Xredraw_screen (how_much)
Xint how_much;
X{
X	if (how_much == 2)
X	    c_erase();
X
X	/* print the single-step message if this is the last loop */
X	if (nstep < 1)
X	    print_updating();
X
X	if (how_much == 2) {
X	    mm_borders();
X	    mm_labels();
X	    srch_prstate(1);
X	    plot_prstate(1);
X	    listing_prstate(1);
X	    alt_labels();
X	}
X
X	/* if just updating changed fields while plotting or listing
X	 * unattended then suppress most screen updates except
X	 * always show nstep to show plot loops to go and
X	 * always show tminc to show search convergence progress.
X	 */
X	print_nstep(how_much);
X	print_tminc(how_much);
X	print_spause(how_much);
X	if (how_much == 0 && (plot_ison() || listing_ison()) && nstep > 0)
X	    f_off();
X
X	/* print all the time-related fields */
X	mm_now (&now, how_much);
X
X	if (optwi)
X	    mm_twilight (&now, how_much);
X
X	/* print solar system body info */
X	print_bodies (how_much);
X
X	f_on();
X}
X
X/* clean up and exit.
X */
Xvoid
Xbye()
X{
X	c_erase();
X	byetty();
X	exit (0);
X}
X
X/* this gets called when a floating point error occurs.
X * we force a jump back into main() with looping terminated.
X */
Xstatic
Xvoid
Xon_fpe()
X{
X	(void) signal (SIGFPE, on_fpe);
X	f_msg ("Floating point error has occurred - computations aborted.");
X	longjmp (fpe_err_jmp, 1);
X}
X
Xusage(why)
Xchar *why;
X{
X	/* don't advertise -s (silent) option */
X	c_erase();
X	f_string (1, 1, why);
X	f_string (2, 1,
X	    "usage: [-c <configfile>] [-d <database>] [field=value ...]\r\n");
X	byetty();
X	exit (1);
X}
X
X/* process the field specs from the command line.
X * if trouble call usage() (which exits).
X */
Xstatic
Xread_fieldargs (ac, av)
Xint ac;		/* number of such specs */
Xchar *av[];	/* array of strings in form <field_name value> */
X{
X	while (--ac >= 0) {
X	    char *fs = *av++;
X	    if (crack_fieldset (fs) < 0) {
X		char why[NC];
X		(void) sprintf (why, "Bad command line spec: %.*s",
X							sizeof(why)-26, fs);
X		usage (why);
X	    }
X	}
X}
X
X/* process a field spec in buf, either from config file or argv.
X * return 0 if recognized ok, else -1.
X */
Xstatic
Xcrack_fieldset (buf)
Xchar *buf;
X{
X	if (strncmp ("LAT", buf, 3) == 0)
X	    (void) chg_fld (buf+4, rcfpack (R_LAT,C_LATV,0));
X	else if (strncmp ("LONG", buf, 4) == 0)
X	    (void) chg_fld (buf+5, rcfpack (R_LONG,C_LONGV,0));
X	else if (strncmp ("UT", buf, 2) == 0)
X	    (void) chg_fld (buf+3, rcfpack (R_UT,C_UTV,0));
X	else if (strncmp ("UD", buf, 2) == 0)
X	    (void) chg_fld (buf+3, rcfpack (R_UD,C_UD,0));
X	else if (strncmp ("TZONE", buf, 5) == 0)
X	    (void) chg_fld (buf+6, rcfpack (R_TZONE,C_TZONEV,0));
X	else if (strncmp ("TZNAME", buf, 6) == 0)
X	    (void) chg_fld (buf+7, rcfpack (R_TZN,C_TZN,0));
X	else if (strncmp ("HEIGHT", buf, 6) == 0)
X	    (void) chg_fld (buf+7, rcfpack (R_HEIGHT,C_HEIGHTV,0));
X	else if (strncmp ("NSTEP", buf, 5) == 0)
X	    (void) chg_fld (buf+6, rcfpack (R_NSTEP,C_NSTEPV,0));
X	else if (strncmp ("PAUSE", buf, 5) == 0)
X	    (void) chg_fld (buf+6, rcfpack (R_PAUSE,C_PAUSEV,0));
X	else if (strncmp ("STPSZ", buf, 5) == 0)
X	    (void) chg_fld (buf+6, rcfpack (R_STPSZ,C_STPSZV,0));
X	else if (strncmp ("TEMP", buf, 4) == 0)
X	    (void) chg_fld (buf+5, rcfpack (R_TEMP,C_TEMPV,0));
X	else if (strncmp ("PRES", buf, 4) == 0)
X	    (void) chg_fld (buf+5, rcfpack (R_PRES,C_PRESV,0));
X	else if (strncmp ("EPOCH", buf, 5) == 0)
X	    (void) chg_fld (buf+6, rcfpack (R_EPOCH,C_EPOCHV,0));
X	else if (strncmp ("JD", buf, 2) == 0)
X	    (void) chg_fld (buf+3, rcfpack (R_JD,C_JDV,0));
X	else if (strncmp ("OBJX", buf, 4) == 0)
X	    obj_filelookup (OBJX, buf+5);
X	else if (strncmp ("OBJY", buf, 4) == 0)
X	    obj_filelookup (OBJY, buf+5);
X	else if (strncmp ("PROPTS", buf, 6) == 0) {
X	    char *bp = buf+7;
X	    if (buf[6] != '+')
X		optwi = oppl = 0;
X	    while (*bp)
X		switch (*bp++) {
X		case 'T': optwi = 1; break;
X		case 'S': oppl |= (1<<SUN); break;
X		case 'M': oppl |= (1<<MOON); break;
X		case 'e': oppl |= (1<<MERCURY); break;
X		case 'v': oppl |= (1<<VENUS); break;
X		case 'm': oppl |= (1<<MARS); break;
X		case 'j': oppl |= (1<<JUPITER); break;
X		case 's': oppl |= (1<<SATURN); break;
X		case 'u': oppl |= (1<<URANUS); break;
X		case 'n': oppl |= (1<<NEPTUNE); break;
X		case 'p': oppl |= (1<<PLUTO); break;
X		case 'x': oppl |= (1<<OBJX); obj_on(OBJX); break;
X		case 'y': oppl |= (1<<OBJY); obj_on(OBJY); break;
X		}
X	} else if (strncmp ("MENU", buf, 4) == 0) {
X	    if (strncmp (buf+5, "DATA", 4) == 0)
X		altmenu_init (F_MNU1);
X	    else if (strncmp (buf+5, "RISET", 5) == 0)
X		altmenu_init (F_MNU2);
X	    else if (strncmp (buf+5, "SEP", 3) == 0)
X		altmenu_init (F_MNU3);
X	} else
X	    return (-1);
X	return (0);
X}
X
X/* change the field at rcpk according to the optional string input at bp.
X * if bp is != 0 use it, else issue read_line() and use buffer.
X * then sscanf the buffer and update the corresponding (global) variable(s)
X * or do whatever a pick at that field should do.
X * return 1 if we change a field that invalidates any of the times or
X * to update all related fields.
X */
Xstatic
Xchg_fld (bp, rcpk)
Xchar *bp;
Xint rcpk;
X{
X	char buf[NC];
X	int deghrs = 0, mins = 0, secs = 0;
X	int new = 0;
X
X	/* switch on just the row/col portion */
X	switch (unpackrc(rcpk)) {
X	case rcfpack (R_ALTM, C_ALTM, 0):
X	    if (altmenu_setup() == 0) {
X		print_updating();
X		alt_nolabels();
X		clrall_bodies();
X		alt_labels();
X		print_bodies(1);
X	    }
X	    break;
X	case rcfpack (R_JD, C_JDV, 0):
X	    if (!bp) {
X		static char p[] = "Julian Date (or n for Now): ";
X		f_prompt (p);
X		if (read_line (buf, PW-sizeof(p)) <= 0)
X		    break;
X		bp = buf;
X	    }
X	    if (bp[0] == 'n' || bp[0] == 'N')
X		time_fromsys (&now);
X	    else
X		mjd = atof(bp) - 2415020L;
X	    set_t0 (&now);
X	    new = 1;
X	    break;
X	case rcfpack (R_UD, C_UD, 0):
X	    if (!bp) {
X		static char p[] = "utc date (m/d/y, or year.d, or n for Now): ";
X		f_prompt (p);
X		if (read_line (buf, PW-sizeof(p)) <= 0)
X		    break;
X		bp = buf;
X	    }
X	    if (bp[0] == 'n' || bp[0] == 'N')
X		time_fromsys (&now);
X	    else {
X		if (decimal_year(bp)) {
X		    double y = atof (bp);
X		    year_mjd (y, &mjd);
X		} else {
X		    double day, newmjd0;
X		    int month, year;
X		    mjd_cal (mjd, &month, &day, &year); /* init with now */
X		    f_sscandate (bp, &month, &day, &year);
X		    cal_mjd (month, day, year, &newmjd0);
X		    /* if don't give a fractional part to days
X		     * then retain current hours.
X		     */
X		    if ((long)day == day)
X			mjd = newmjd0 + mjd_hr(mjd)/24.0;
X		    else
X			mjd = newmjd0;
X		}
X	    }
X	    set_t0 (&now);
X	    new = 1;
X	    break;
X	case rcfpack (R_UT, C_UTV, 0):
X	    if (!bp) {
X		static char p[] = "utc time (h:m:s, or n for Now): ";
X		f_prompt (p);
X		if (read_line (buf, PW-sizeof(p)) <= 0)
X		    break;
X		bp = buf;
X	    }
X	    if (bp[0] == 'n' || bp[0] == 'N')
X		time_fromsys (&now);
X	    else {
X		double newutc = (mjd-mjd_day(mjd)) * 24.0;
X		f_dec_sexsign (newutc, &deghrs, &mins, &secs);
X		f_sscansex (bp, &deghrs, &mins, &secs);
X		sex_dec (deghrs, mins, secs, &newutc);
X		mjd = mjd_day(mjd) + newutc/24.0;
X	    }
X	    set_t0 (&now);
X	    new = 1;
X	    break;
X	case rcfpack (R_LD, C_LD, 0):
X	    if (!bp) {
X		static char p[] = "local date (m/d/y, or year.d, n for Now): ";
X		f_prompt (p);
X		if (read_line (buf, PW-sizeof(p)) <= 0)
X		    break;
X		bp = buf;
X	    }
X	    if (bp[0] == 'n' || bp[0] == 'N')
X		time_fromsys (&now);
X	    else {
X		if (decimal_year(bp)) {
X		    double y = atof (bp);
X		    year_mjd (y, &mjd);
X		    mjd += tz/24.0;
X		} else {
X		    double day, newlmjd0;
X		    int month, year;
X		    mjd_cal (mjd-tz/24.0, &month, &day, &year); /* now */
X		    f_sscandate (bp, &month, &day, &year);
X		    cal_mjd (month, day, year, &newlmjd0);
X		    /* if don't give a fractional part to days
X		     * then retain current hours.
X		     */
X		    if ((long)day == day)
X			mjd = newlmjd0 + mjd_hr(mjd-tz/24.0)/24.0;
X		    else
X			mjd = newlmjd0;
X		    mjd += tz/24.0;
X		}
X	    }
X	    set_t0 (&now);
X	    new = 1;
X	    break;
X	case rcfpack (R_LT, C_LT, 0):
X	    if (!bp) {
X		static char p[] = "local time (h:m:s, or n for Now): ";
X		f_prompt (p);
X		if (read_line (buf, PW-sizeof(p)) <= 0)
X		    break;
X		bp = buf;
X	    }
X	    if (bp[0] == 'n' || bp[0] == 'N')
X		time_fromsys (&now);
X	    else {
X		double newlt = (mjd-mjd_day(mjd)) * 24.0 - tz;
X		range (&newlt, 24.0);
X		f_dec_sexsign (newlt, &deghrs, &mins, &secs);
X		f_sscansex (bp, &deghrs, &mins, &secs);
X		sex_dec (deghrs, mins, secs, &newlt);
X		mjd = mjd_day(mjd-tz/24.0) + (newlt + tz)/24.0;
X	    }
X	    set_t0 (&now);
X	    new = 1;
X	    break;
X	case rcfpack (R_LST, C_LSTV, 0):
X	    if (!bp) {
X		static char p[] = "local sidereal time (h:m:s, or n for Now): ";
X		f_prompt (p);
X		if (read_line (buf, PW-sizeof(p)) <= 0)
X		    break;
X		bp = buf;
X	    }
X	    if (bp[0] == 'n' || bp[0] == 'N')
X		time_fromsys (&now);
X	    else {
X		double lst, utc;
X		now_lst (&now, &lst);
X		f_dec_sexsign (lst, &deghrs, &mins, &secs);
X		f_sscansex (bp, &deghrs, &mins, &secs);
X		sex_dec (deghrs, mins, secs, &lst);
X		lst -= radhr(lng); /* convert to gst */
X		range (&lst, 24.0);
X		gst_utc (mjd_day(mjd), lst, &utc);
X		mjd = mjd_day(mjd) + utc/24.0;
X	    }
X	    set_t0 (&now);
X	    new = 1;
X	    break;
X	case rcfpack (R_TZN, C_TZN, 0):
X	    if (!bp) {
X		static char p[] = "timezone abbreviation (3 char max): ";
X		f_prompt (p);
X		if (read_line (buf, 3) <= 0)
X		    break;
X		bp = buf;
X	    }
X	    (void) strncpy (tznm, bp, sizeof(tznm)-1);
X	    new = 1;
X	    break;
X	case rcfpack (R_TZONE, C_TZONEV, 0):
X	    if (!bp) {
X		static char p[] = "hours behind utc: ";
X		f_prompt (p);
X		if (read_line (buf, PW-sizeof(p)) <= 0)
X		    break;
X		bp = buf;
X	    }
X	    f_dec_sexsign (tz, &deghrs, &mins, &secs);
X	    f_sscansex (bp, &deghrs, &mins, &secs);
X	    sex_dec (deghrs, mins, secs, &tz);
X	    new = 1;
X	    break;
X	case rcfpack (R_LONG, C_LONGV, 0):
X	    if (!bp) {
X		static char p[] = "longitude (+ west) (d:m:s): ";
X		f_prompt (p);
X		if (read_line (buf, PW-sizeof(p)) <= 0)
X		    break;
X		bp = buf;
X	    }
X	    f_dec_sexsign (-raddeg(lng), &deghrs, &mins, &secs);
X	    f_sscansex (bp, &deghrs, &mins, &secs);
X	    sex_dec (deghrs, mins, secs, &lng);
X	    lng = degrad (-lng); 		/* want - radians west */
X	    new = 1;
X	    break;
X	case rcfpack (R_LAT, C_LATV, 0):
X	    if (!bp) {
X		static char p[] = "latitude (+ north) (d:m:s): ";
X		f_prompt (p);
X		if (read_line (buf, PW-sizeof(p)) <= 0)
X		    break;
X		bp = buf;
X	    }
X	    f_dec_sexsign (raddeg(lat), &deghrs, &mins, &secs);
X	    f_sscansex (bp, &deghrs, &mins, &secs);
X	    sex_dec (deghrs, mins, secs, &lat);
X	    lat = degrad (lat);
X	    new = 1;
X	    break;
X	case rcfpack (R_HEIGHT, C_HEIGHTV, 0):
X	    if (!bp) {
X		static char p[] = "height above sea level (ft): ";
X		f_prompt (p);
X		if (read_line (buf, PW-sizeof(p)) <= 0)
X		    break;
X		bp = buf;
X	    }
X	    (void) sscanf (bp, "%lf", &height);
X	    height /= 2.093e7; /* convert ft to earth radii above sea level */
X	    new = 1;
X	    break;
X	case rcfpack (R_NSTEP, C_NSTEPV, 0):
X	    if (!bp) {
X		static char p[] = "number of steps to run: ";
X		f_prompt (p);
X		if (read_line (buf, 8) <= 0)
X		    break;
X		bp = buf;
X	    }
X	    (void) sscanf (bp, "%d", &nstep);
X	    print_nstep (0);
X	    break;
X	case rcfpack (R_PAUSE, C_PAUSEV, 0):
X	    if (!bp) {
X		static char p[] = "seconds to pause between steps: ";
X		f_prompt (p);
X		if (read_line (buf, 8) <= 0)
X		    break;
X		bp = buf;
X	    }
X	    (void) sscanf (bp, "%d", &spause);
X	    print_spause (0);
X	    break;
X	case rcfpack (R_TEMP, C_TEMPV, 0):
X	    if (!bp) {
X		static char p[] = "temperature (deg.F): ";
X		f_prompt (p);
X		if (read_line (buf, PW-sizeof(p)) <= 0)
X		    break;
X		bp = buf;
X	    }
X	    (void) sscanf (bp, "%lf", &temp);
X	    temp = 5./9.*(temp - 32.0);	/* want degs C */
X	    new = 1;
X	    break;
X	case rcfpack (R_PRES, C_PRESV, 0):
X	    if (!bp) {
X		static char p[] =
X		    "atmos pressure (in. Hg; 0 for no refraction correction): ";
X		f_prompt (p);
X		if (read_line (buf, PW-sizeof(p)) <= 0)
X		    break;
X		bp = buf;
X	    }
X	    (void) sscanf (bp, "%lf", &pressure);
X	    pressure *= 33.86;		/* want mBar */
X	    new = 1;
X	    break;
X	case rcfpack (R_EPOCH, C_EPOCHV, 0):
X	    if (!bp) {
X		static char p[] = "epoch (year, or e for Equinox of Date): ";
X		f_prompt (p);
X		if (read_line (buf, PW-strlen(p)) <= 0)
X		    break;
X		bp = buf;
X	    }
X	    if (bp[0] == 'e' || bp[0] == 'E')
X		epoch = EOD;
X	    else {
X		double e;
X		e = atof(bp);
X		year_mjd (e, &epoch);
X	    }
X	    new = 1;
X	    break;
X	case rcfpack (R_STPSZ, C_STPSZV, 0):
X	    if (!bp) {
X		static char p[] =
X		    "step size increment (h:m:s, or <x>d for x days, or r for RTC): ";
X		f_prompt (p);
X		if (read_line (buf, PW-sizeof(p)) <= 0)
X		    break;
X		bp = buf;
X	    }
X	    if (bp[0] == 'r' || bp[0] == 'R')
X		tminc = RTC;
X	    else {
X		int last = strlen (bp) - 1;
X		if (bp[last] == 'd') {
X		    /* ends in d so treat as a number of days */
X		    double x;
X		    (void) sscanf (bp, "%lf", &x);
X		    tminc = x * 24.0;
X		} else {
X		    if (tminc == RTC)
X			deghrs = mins = secs = 0;
X		    else
X			f_dec_sexsign (tminc, &deghrs, &mins, &secs);
X		    f_sscansex (bp, &deghrs, &mins, &secs);
X		    sex_dec (deghrs, mins, secs, &tminc);
X		}
X	    }
X	    print_tminc(0);
X	    set_t0 (&now);
X	    break;
X	case rcfpack (R_PLOT, C_PLOT, 0):
X	    plot_setup();
X	    if (plot_ison())
X		new = 1;
X	    break;
X	case rcfpack (R_LISTING, C_LISTING, 0):
X	    listing_setup();
X	    if (listing_ison())
X		new = 1;
X	    break;
X	case rcfpack (R_WATCH, C_WATCH, 0):
X	    watch (&now, tminc, oppl);
X	    /* set new reference time to what watch left it.
X	     * no need to set new since watch just did a redraw.
X	     */
X	    set_t0 (&now);
X	    break;
X	case rcfpack (R_DAWN, C_DAWN, 0):
X	case rcfpack (R_DUSK, C_DUSK, 0):
X	case rcfpack (R_LON, C_LON, 0):
X	    if (optwi ^= 1) {
X		print_updating();
X		mm_twilight (&now, 1);
X	    } else {
X		f_blanks (R_DAWN, C_DAWNV, 5);
X		f_blanks (R_DUSK, C_DUSKV, 5);
X		f_blanks (R_LON, C_LONV, 5);
X	    }
X	    break;
X	case rcfpack (R_SRCH, C_SRCH, 0):
X	    srch_setup();
X	    if (srch_ison())
X		new = 1;
X	    break;
X	case rcfpack (R_SUN, C_OBJ, 0):
X	    if ((oppl ^= (1<<SUN)) & (1<<SUN)) {
X		print_updating();
X		alt_body (SUN, 1, &now);
X	    } else
X		alt_nobody (SUN);
X	    break;
X	case rcfpack (R_MOON, C_OBJ, 0):
X	    if ((oppl ^= (1<<MOON)) & (1<<MOON)) {
X		print_updating();
X		alt_body (MOON, 1, &now);
X	    } else
X		alt_nobody (MOON);
X	    break;
X	case rcfpack (R_MERCURY, C_OBJ, 0):
X	    if ((oppl ^= (1<<MERCURY)) & (1<<MERCURY)) {
X		print_updating();
X		alt_body (MERCURY, 1, &now);
X	    } else
X		alt_nobody (MERCURY);
X	    break;
X	case rcfpack (R_VENUS, C_OBJ, 0):
X	    if ((oppl ^= (1<<VENUS)) & (1<<VENUS)) {
X		print_updating();
X		alt_body (VENUS, 1, &now);
X	    } else
X		alt_nobody (VENUS);
X	    break;
X	case rcfpack (R_MARS, C_OBJ, 0):
X	    if ((oppl ^= (1<<MARS)) & (1<<MARS)) {
X		print_updating();
X		alt_body (MARS, 1, &now);
X	    } else
X		alt_nobody (MARS);
X	    break;
X	case rcfpack (R_JUPITER, C_OBJ, 0):
X	    if ((oppl ^= (1<<JUPITER)) & (1<<JUPITER)) {
X		print_updating();
X		alt_body (JUPITER, 1, &now);
X	    } else
X		alt_nobody (JUPITER);
X	    break;
X	case rcfpack (R_SATURN, C_OBJ, 0):
X	    if ((oppl ^= (1<<SATURN)) & (1<<SATURN)) {
X		print_updating();
X		alt_body (SATURN, 1, &now);
X	    } else
X		alt_nobody (SATURN);
X	    break;
X	case rcfpack (R_URANUS, C_OBJ, 0):
X	    if ((oppl ^= (1<<URANUS)) & (1<<URANUS)) {
X		print_updating();
X		alt_body (URANUS, 1, &now);
X	    } else
X		alt_nobody (URANUS);
X	    break;
X	case rcfpack (R_NEPTUNE, C_OBJ, 0):
X	    if ((oppl ^= (1<<NEPTUNE)) & (1<<NEPTUNE)) {
X		print_updating();
X		alt_body (NEPTUNE, 1, &now);
X	    } else
X		alt_nobody (NEPTUNE);
X	    break;
X	case rcfpack (R_PLUTO, C_OBJ, 0):
X	    if ((oppl ^= (1<<PLUTO)) & (1<<PLUTO)) {
X		print_updating();
X		alt_body (PLUTO, 1, &now);
X	    } else
X		alt_nobody (PLUTO);
X	    break;
X	case rcfpack (R_OBJX, C_OBJ, 0):
X	    /* this might change which columns are used so erase all when
X	     * returns and redraw if still on.
X	     */
X	    obj_setup (OBJX);
X	    alt_nobody (OBJX);
X	    if (obj_ison (OBJX)) {
X		oppl |= 1 << OBJX;
X		print_updating();
X		alt_body (OBJX, 1, &now);
X	    } else
X		oppl &= ~(1 << OBJX);	/* already erased; just clear flag */
X	    break;
X	case rcfpack (R_OBJY, C_OBJ, 0):
X	    /* this might change which columns are used so erase all when
X	     * returns and redraw if still on.
X	     */
X	    obj_setup (OBJY);
X	    alt_nobody (OBJY);
X	    if (obj_ison (OBJY)) {
X		oppl |= 1 << OBJY;
X		print_updating();
X		alt_body (OBJY, 1, &now);
X	    } else
X		oppl &= ~(1 << OBJY);	/* already erased; just clear flag */
X	    break;
X	}
X
X	return (new);
X}
X
Xstatic
Xprint_tminc(force)
Xint force;
X{
X	static double last = -123.456;	/* anything unlikely */
X
X	if (force || tminc != last) {
X	    if (tminc == RTC)
X		f_string (R_STPSZ, C_STPSZV, " RT CLOCK");
X	    else if (fabs(tminc) >= 24.0)
X		f_double (R_STPSZ, C_STPSZV, "%6.4g dy", tminc/24.0);
X	    else
X		f_signtime (R_STPSZ, C_STPSZV, tminc);
X	    last = tminc;
X	}
X}
X
Xstatic
Xprint_bodies (force)
Xint force;
X{
X	int p;
X
X	for (p = nxtbody(-1); p != -1; p = nxtbody(p))
X	    if (oppl & (1<<p))
X		alt_body (p, force, &now);
X}
X
Xstatic
Xclrall_bodies ()
X{
X	int p;
X
X	for (p = nxtbody(-1); p != -1; p = nxtbody(p))
X	    if (oppl & (1<<p))
X		alt_nobody (p);
X}
X
Xprint_updating()
X{
X	f_prompt ("Updating...");
X}
X
Xstatic
Xprint_nstep(force)
Xint force;
X{
X	static int last;
X
X	if (force || nstep != last) {
X	    char buf[16];
X	    (void) sprintf (buf, "%8d", nstep);
X	    f_string (R_NSTEP, C_NSTEPV, buf);
X	    last = nstep;
X	}
X}
X
Xstatic
Xprint_spause(force)
Xint force;
X{
X	static int last;
X
X	if (force || spause != last) {
X	    char buf[16];
X	    (void) sprintf (buf, "%8d", spause);
X	    f_string (R_PAUSE, C_PAUSEV, buf);
X	    last = spause;
X	}
X}
X
X/* if not plotting or searching then sleep spause seconds.
X * if time is being based on the real-time clock, sync on the next
X *   integral multiple of spause seconds after the minute.
X * check for keyboard action once each second to let it break out early.
X */
Xslp_sync()
X{
X	if (spause > 0 && !plot_ison() && !srch_ison()) {
X	    extern long time();
X	    int n= (tminc == RTC) ? spause - (time((long *)0)%spause) : spause;
X	    while (--n >= 0)
X		if (chk_char() == 0)
X		    break;
X		else
X		    (void) sleep (1);
X	}
X}
END_OF_FILE
if test 24745 -ne `wc -c <'main.c'`; then
    echo shar: \"'main.c'\" unpacked with wrong size!
fi
# end of 'main.c'
fi
if test -f 'sel_fld.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'sel_fld.c'\"
else
echo shar: Extracting \"'sel_fld.c'\" \(24029 characters\)
sed "s/^X//" >'sel_fld.c' <<'END_OF_FILE'
X#include <stdio.h>
X#include "screen.h"
X
X/* define BANG if and only if your system supports the system() function.
X */
X#define	BANG
X
X/* table of the fields, with flags indicating which menu(s) they are on and
X * whether pickable for changing or plotting.
X * N.B. type must be long enough to hold 16 bits.
X */
Xstatic int fields[] = {
X    rcfpack (R_ALTM,	C_ALTM,		F_MMNU|F_CHG),
X    rcfpack (R_DAWN,	C_DAWN,		F_MMNU|F_CHG),
X    rcfpack (R_DAWN,	C_DAWNV,	F_MMNU|F_PLT),
X    rcfpack (R_DUSK,	C_DUSK,		F_MMNU|F_CHG),
X    rcfpack (R_DUSK,	C_DUSKV,	F_MMNU|F_PLT),
X    rcfpack (R_EPOCH,	C_EPOCHV,	F_MMNU|F_CHG),
X    rcfpack (R_HEIGHT,	C_HEIGHTV,	F_MMNU|F_CHG|F_PLT),
X    rcfpack (R_JD,	C_JDV,		F_MMNU|F_CHG|F_PLT),
X    rcfpack (R_JUPITER,	C_ALT,		F_MNU1|F_PLT),
X    rcfpack (R_JUPITER,	C_AZ,		F_MNU1|F_PLT),
X    rcfpack (R_JUPITER,	C_DEC,		F_MNU1|F_PLT),
X    rcfpack (R_JUPITER,	C_EDIST,	F_MNU1|F_PLT),
X    rcfpack (R_JUPITER,	C_ELONG,	F_MNU1|F_PLT),
X    rcfpack (R_JUPITER,	C_HLAT,		F_MNU1|F_PLT),
X    rcfpack (R_JUPITER,	C_HLONG,	F_MNU1|F_PLT),
X    rcfpack (R_JUPITER,	C_MAG,		F_MNU1|F_PLT),
X    rcfpack (R_JUPITER,	C_MARS,		F_MNU3|F_PLT),
X    rcfpack (R_JUPITER,	C_MERCURY,	F_MNU3|F_PLT),
X    rcfpack (R_JUPITER,	C_MOON,		F_MNU3|F_PLT),
X    rcfpack (R_JUPITER,	C_NEPTUNE,	F_MNU3|F_PLT),
X    rcfpack (R_JUPITER,	C_OBJ,		F_MMNU|F_CHG),
X    rcfpack (R_JUPITER,	C_OBJX,		F_MNU3|F_PLT),
X    rcfpack (R_JUPITER,	C_OBJY,		F_MNU3|F_PLT),
X    rcfpack (R_JUPITER,	C_PHASE,	F_MNU1|F_PLT),
X    rcfpack (R_JUPITER,	C_PLUTO,	F_MNU3|F_PLT),
X    rcfpack (R_JUPITER,	C_RA,		F_MNU1|F_PLT),
X    rcfpack (R_JUPITER,	C_RISEAZ,	F_MNU2|F_PLT),
X    rcfpack (R_JUPITER,	C_RISETM,	F_MNU2|F_PLT),
X    rcfpack (R_JUPITER,	C_SATURN,	F_MNU3|F_PLT),
X    rcfpack (R_JUPITER,	C_SDIST,	F_MNU1|F_PLT),
X    rcfpack (R_JUPITER,	C_SETAZ,	F_MNU2|F_PLT),
X    rcfpack (R_JUPITER,	C_SETTM,	F_MNU2|F_PLT),
X    rcfpack (R_JUPITER,	C_SIZE,		F_MNU1|F_PLT),
X    rcfpack (R_JUPITER,	C_SUN,		F_MNU3|F_PLT),
X    rcfpack (R_JUPITER,	C_TRANSALT,	F_MNU2|F_PLT),
X    rcfpack (R_JUPITER,	C_TRANSTM,	F_MNU2|F_PLT),
X    rcfpack (R_JUPITER,	C_TUP,		F_MNU2|F_PLT),
X    rcfpack (R_JUPITER,	C_URANUS,	F_MNU3|F_PLT),
X    rcfpack (R_JUPITER,	C_VENUS,	F_MNU3|F_PLT),
X    rcfpack (R_LAT,	C_LATV,		F_MMNU|F_CHG|F_PLT),
X    rcfpack (R_LD,	C_LD,		F_MMNU|F_PLT|F_CHG),
X    rcfpack (R_LISTING,	C_LISTING,	F_MMNU|F_CHG),
X    rcfpack (R_LON,	C_LON,		F_MMNU|F_CHG),
X    rcfpack (R_LON,	C_LONV,		F_MMNU|F_PLT),
X    rcfpack (R_LONG,	C_LONGV,	F_MMNU|F_CHG|F_PLT),
X    rcfpack (R_LST,	C_LSTV,		F_MMNU|F_CHG|F_PLT),
X    rcfpack (R_LT,	C_LT,		F_MMNU|F_CHG|F_PLT),
X    rcfpack (R_MARS,	C_ALT,		F_MNU1|F_PLT),
X    rcfpack (R_MARS,	C_AZ,		F_MNU1|F_PLT),
X    rcfpack (R_MARS,	C_DEC,		F_MNU1|F_PLT),
X    rcfpack (R_MARS,	C_EDIST,	F_MNU1|F_PLT),
X    rcfpack (R_MARS,	C_ELONG,	F_MNU1|F_PLT),
X    rcfpack (R_MARS,	C_HLAT,		F_MNU1|F_PLT),
X    rcfpack (R_MARS,	C_HLONG,	F_MNU1|F_PLT),
X    rcfpack (R_MARS,	C_JUPITER,	F_MNU3|F_PLT),
X    rcfpack (R_MARS,	C_MAG,		F_MNU1|F_PLT),
X    rcfpack (R_MARS,	C_MERCURY,	F_MNU3|F_PLT),
X    rcfpack (R_MARS,	C_MOON,		F_MNU3|F_PLT),
X    rcfpack (R_MARS,	C_NEPTUNE,	F_MNU3|F_PLT),
X    rcfpack (R_MARS,	C_OBJ,		F_MMNU|F_CHG),
X    rcfpack (R_MARS,	C_OBJX,		F_MNU3|F_PLT),
X    rcfpack (R_MARS,	C_OBJY,		F_MNU3|F_PLT),
X    rcfpack (R_MARS,	C_PHASE,	F_MNU1|F_PLT),
X    rcfpack (R_MARS,	C_PLUTO,	F_MNU3|F_PLT),
X    rcfpack (R_MARS,	C_RA,		F_MNU1|F_PLT),
X    rcfpack (R_MARS,	C_RISEAZ,	F_MNU2|F_PLT),
X    rcfpack (R_MARS,	C_RISETM,	F_MNU2|F_PLT),
X    rcfpack (R_MARS,	C_SATURN,	F_MNU3|F_PLT),
X    rcfpack (R_MARS,	C_SDIST,	F_MNU1|F_PLT),
X    rcfpack (R_MARS,	C_SETAZ,	F_MNU2|F_PLT),
X    rcfpack (R_MARS,	C_SETTM,	F_MNU2|F_PLT),
X    rcfpack (R_MARS,	C_SIZE,		F_MNU1|F_PLT),
X    rcfpack (R_MARS,	C_SUN,		F_MNU3|F_PLT),
X    rcfpack (R_MARS,	C_TRANSALT,	F_MNU2|F_PLT),
X    rcfpack (R_MARS,	C_TRANSTM,	F_MNU2|F_PLT),
X    rcfpack (R_MARS,	C_TUP,		F_MNU2|F_PLT),
X    rcfpack (R_MARS,	C_URANUS,	F_MNU3|F_PLT),
X    rcfpack (R_MARS,	C_VENUS,	F_MNU3|F_PLT),
X    rcfpack (R_MERCURY,	C_ALT,		F_MNU1|F_PLT),
X    rcfpack (R_MERCURY,	C_AZ,		F_MNU1|F_PLT),
X    rcfpack (R_MERCURY,	C_DEC,		F_MNU1|F_PLT),
X    rcfpack (R_MERCURY,	C_EDIST,	F_MNU1|F_PLT),
X    rcfpack (R_MERCURY,	C_ELONG,	F_MNU1|F_PLT),
X    rcfpack (R_MERCURY,	C_HLAT,		F_MNU1|F_PLT),
X    rcfpack (R_MERCURY,	C_HLONG,	F_MNU1|F_PLT),
X    rcfpack (R_MERCURY,	C_JUPITER,	F_MNU3|F_PLT),
X    rcfpack (R_MERCURY,	C_MAG,		F_MNU1|F_PLT),
X    rcfpack (R_MERCURY,	C_MARS,		F_MNU3|F_PLT),
X    rcfpack (R_MERCURY,	C_MOON,		F_MNU3|F_PLT),
X    rcfpack (R_MERCURY,	C_NEPTUNE,	F_MNU3|F_PLT),
X    rcfpack (R_MERCURY,	C_OBJ,		F_MMNU|F_CHG),
X    rcfpack (R_MERCURY,	C_OBJX,		F_MNU3|F_PLT),
X    rcfpack (R_MERCURY,	C_OBJY,		F_MNU3|F_PLT),
X    rcfpack (R_MERCURY,	C_PHASE,	F_MNU1|F_PLT),
X    rcfpack (R_MERCURY,	C_PLUTO,	F_MNU3|F_PLT),
X    rcfpack (R_MERCURY,	C_RA,		F_MNU1|F_PLT),
X    rcfpack (R_MERCURY,	C_RISEAZ,	F_MNU2|F_PLT),
X    rcfpack (R_MERCURY,	C_RISETM,	F_MNU2|F_PLT),
X    rcfpack (R_MERCURY,	C_SATURN,	F_MNU3|F_PLT),
X    rcfpack (R_MERCURY,	C_SDIST,	F_MNU1|F_PLT),
X    rcfpack (R_MERCURY,	C_SETAZ,	F_MNU2|F_PLT),
X    rcfpack (R_MERCURY,	C_SETTM,	F_MNU2|F_PLT),
X    rcfpack (R_MERCURY,	C_SIZE,		F_MNU1|F_PLT),
X    rcfpack (R_MERCURY,	C_SUN,		F_MNU3|F_PLT),
X    rcfpack (R_MERCURY,	C_TRANSALT,	F_MNU2|F_PLT),
X    rcfpack (R_MERCURY,	C_TRANSTM,	F_MNU2|F_PLT),
X    rcfpack (R_MERCURY,	C_TUP,		F_MNU2|F_PLT),
X    rcfpack (R_MERCURY,	C_URANUS,	F_MNU3|F_PLT),
X    rcfpack (R_MERCURY,	C_VENUS,	F_MNU3|F_PLT),
X    rcfpack (R_MOON,	C_ALT,		F_MNU1|F_PLT),
X    rcfpack (R_MOON,	C_AZ,		F_MNU1|F_PLT),
X    rcfpack (R_MOON,	C_DEC,		F_MNU1|F_PLT),
X    rcfpack (R_MOON,	C_EDIST,	F_MNU1|F_PLT),
X    rcfpack (R_MOON,	C_ELONG,	F_MNU1|F_PLT),
X    rcfpack (R_MOON,	C_HLAT,		F_MNU1|F_PLT),
X    rcfpack (R_MOON,	C_HLONG,	F_MNU1|F_PLT),
X    rcfpack (R_MOON,	C_JUPITER,	F_MNU3|F_PLT),
X    rcfpack (R_MOON,	C_MAG,		F_MNU1|F_PLT),
X    rcfpack (R_MOON,	C_MARS,		F_MNU3|F_PLT),
X    rcfpack (R_MOON,	C_MERCURY,	F_MNU3|F_PLT),
X    rcfpack (R_MOON,	C_NEPTUNE,	F_MNU3|F_PLT),
X    rcfpack (R_MOON,	C_OBJ,		F_MMNU|F_CHG),
X    rcfpack (R_MOON,	C_OBJX,		F_MNU3|F_PLT),
X    rcfpack (R_MOON,	C_OBJY,		F_MNU3|F_PLT),
X    rcfpack (R_MOON,	C_PHASE,	F_MNU1|F_PLT),
X    rcfpack (R_MOON,	C_PLUTO,	F_MNU3|F_PLT),
X    rcfpack (R_MOON,	C_RA,		F_MNU1|F_PLT),
X    rcfpack (R_MOON,	C_RISEAZ,	F_MNU2|F_PLT),
X    rcfpack (R_MOON,	C_RISETM,	F_MNU2|F_PLT),
X    rcfpack (R_MOON,	C_SATURN,	F_MNU3|F_PLT),
X    rcfpack (R_MOON,	C_SDIST,	F_MNU1|F_PLT),
X    rcfpack (R_MOON,	C_SETAZ,	F_MNU2|F_PLT),
X    rcfpack (R_MOON,	C_SETTM,	F_MNU2|F_PLT),
X    rcfpack (R_MOON,	C_SIZE,		F_MNU1|F_PLT),
X    rcfpack (R_MOON,	C_SUN,		F_MNU3|F_PLT),
X    rcfpack (R_MOON,	C_TRANSALT,	F_MNU2|F_PLT),
X    rcfpack (R_MOON,	C_TRANSTM,	F_MNU2|F_PLT),
X    rcfpack (R_MOON,	C_TUP,		F_MNU2|F_PLT),
X    rcfpack (R_MOON,	C_URANUS,	F_MNU3|F_PLT),
X    rcfpack (R_MOON,	C_VENUS,	F_MNU3|F_PLT),
X    rcfpack (R_NEPTUNE,	C_ALT,		F_MNU1|F_PLT),
X    rcfpack (R_NEPTUNE,	C_AZ,		F_MNU1|F_PLT),
X    rcfpack (R_NEPTUNE,	C_DEC,		F_MNU1|F_PLT),
X    rcfpack (R_NEPTUNE,	C_EDIST,	F_MNU1|F_PLT),
X    rcfpack (R_NEPTUNE,	C_ELONG,	F_MNU1|F_PLT),
X    rcfpack (R_NEPTUNE,	C_HLAT,		F_MNU1|F_PLT),
X    rcfpack (R_NEPTUNE,	C_HLONG,	F_MNU1|F_PLT),
X    rcfpack (R_NEPTUNE,	C_JUPITER,	F_MNU3|F_PLT),
X    rcfpack (R_NEPTUNE,	C_MAG,		F_MNU1|F_PLT),
X    rcfpack (R_NEPTUNE,	C_MARS,		F_MNU3|F_PLT),
X    rcfpack (R_NEPTUNE,	C_MERCURY,	F_MNU3|F_PLT),
X    rcfpack (R_NEPTUNE,	C_MOON,		F_MNU3|F_PLT),
X    rcfpack (R_NEPTUNE,	C_OBJ,		F_MMNU|F_CHG),
X    rcfpack (R_NEPTUNE,	C_OBJX,		F_MNU3|F_PLT),
X    rcfpack (R_NEPTUNE,	C_OBJY,		F_MNU3|F_PLT),
X    rcfpack (R_NEPTUNE,	C_PHASE,	F_MNU1|F_PLT),
X    rcfpack (R_NEPTUNE,	C_PLUTO,	F_MNU3|F_PLT),
X    rcfpack (R_NEPTUNE,	C_RA,		F_MNU1|F_PLT),
X    rcfpack (R_NEPTUNE,	C_RISEAZ,	F_MNU2|F_PLT),
X    rcfpack (R_NEPTUNE,	C_RISETM,	F_MNU2|F_PLT),
X    rcfpack (R_NEPTUNE,	C_SATURN,	F_MNU3|F_PLT),
X    rcfpack (R_NEPTUNE,	C_SDIST,	F_MNU1|F_PLT),
X    rcfpack (R_NEPTUNE,	C_SETAZ,	F_MNU2|F_PLT),
X    rcfpack (R_NEPTUNE,	C_SETTM,	F_MNU2|F_PLT),
X    rcfpack (R_NEPTUNE,	C_SIZE,		F_MNU1|F_PLT),
X    rcfpack (R_NEPTUNE,	C_SUN,		F_MNU3|F_PLT),
X    rcfpack (R_NEPTUNE,	C_TRANSALT,	F_MNU2|F_PLT),
X    rcfpack (R_NEPTUNE,	C_TRANSTM,	F_MNU2|F_PLT),
X    rcfpack (R_NEPTUNE,	C_TUP,		F_MNU2|F_PLT),
X    rcfpack (R_NEPTUNE,	C_URANUS,	F_MNU3|F_PLT),
X    rcfpack (R_NEPTUNE,	C_VENUS,	F_MNU3|F_PLT),
X    rcfpack (R_NSTEP,	C_NSTEPV,	F_MMNU|F_CHG),
X    rcfpack (R_OBJX,	C_ALT,		F_MNU1|F_PLT),
X    rcfpack (R_OBJX,	C_AZ,		F_MNU1|F_PLT),
X    rcfpack (R_OBJX,	C_DEC,		F_MNU1|F_PLT),
X    rcfpack (R_OBJX,	C_EDIST,	F_MNU1|F_PLT),
X    rcfpack (R_OBJX,	C_ELONG,	F_MNU1|F_PLT),
X    rcfpack (R_OBJX,	C_HLAT,		F_MNU1|F_PLT),
X    rcfpack (R_OBJX,	C_HLONG,	F_MNU1|F_PLT),
X    rcfpack (R_OBJX,	C_JUPITER,	F_MNU3|F_PLT),
X    rcfpack (R_OBJX,	C_MAG,		F_MNU1|F_PLT),
X    rcfpack (R_OBJX,	C_MARS,		F_MNU3|F_PLT),
X    rcfpack (R_OBJX,	C_MERCURY,	F_MNU3|F_PLT),
X    rcfpack (R_OBJX,	C_MOON,		F_MNU3|F_PLT),
X    rcfpack (R_OBJX,	C_NEPTUNE,	F_MNU3|F_PLT),
X    rcfpack (R_OBJX,	C_OBJ,		F_MMNU|F_CHG),
X    rcfpack (R_OBJX,	C_OBJY,		F_MNU3|F_PLT),
X    rcfpack (R_OBJX,	C_PHASE,	F_MNU1|F_PLT),
X    rcfpack (R_OBJX,	C_PLUTO,	F_MNU3|F_PLT),
X    rcfpack (R_OBJX,	C_RA,		F_MNU1|F_PLT),
X    rcfpack (R_OBJX,	C_RISEAZ,	F_MNU2|F_PLT),
X    rcfpack (R_OBJX,	C_RISETM,	F_MNU2|F_PLT),
X    rcfpack (R_OBJX,	C_SATURN,	F_MNU3|F_PLT),
X    rcfpack (R_OBJX,	C_SDIST,	F_MNU1|F_PLT),
X    rcfpack (R_OBJX,	C_SETAZ,	F_MNU2|F_PLT),
X    rcfpack (R_OBJX,	C_SETTM,	F_MNU2|F_PLT),
X    rcfpack (R_OBJX,	C_SUN,		F_MNU3|F_PLT),
X    rcfpack (R_OBJX,	C_TRANSALT,	F_MNU2|F_PLT),
X    rcfpack (R_OBJX,	C_TRANSTM,	F_MNU2|F_PLT),
X    rcfpack (R_OBJX,	C_TUP,		F_MNU2|F_PLT),
X    rcfpack (R_OBJX,	C_URANUS,	F_MNU3|F_PLT),
X    rcfpack (R_OBJX,	C_VENUS,	F_MNU3|F_PLT),
X    rcfpack (R_OBJY,	C_ALT,		F_MNU1|F_PLT),
X    rcfpack (R_OBJY,	C_AZ,		F_MNU1|F_PLT),
X    rcfpack (R_OBJY,	C_DEC,		F_MNU1|F_PLT),
X    rcfpack (R_OBJY,	C_EDIST,	F_MNU1|F_PLT),
X    rcfpack (R_OBJY,	C_ELONG,	F_MNU1|F_PLT),
X    rcfpack (R_OBJY,	C_HLAT,		F_MNU1|F_PLT),
X    rcfpack (R_OBJY,	C_HLONG,	F_MNU1|F_PLT),
X    rcfpack (R_OBJY,	C_JUPITER,	F_MNU3|F_PLT),
X    rcfpack (R_OBJY,	C_MAG,		F_MNU1|F_PLT),
X    rcfpack (R_OBJY,	C_MARS,		F_MNU3|F_PLT),
X    rcfpack (R_OBJY,	C_MERCURY,	F_MNU3|F_PLT),
X    rcfpack (R_OBJY,	C_MOON,		F_MNU3|F_PLT),
X    rcfpack (R_OBJY,	C_NEPTUNE,	F_MNU3|F_PLT),
X    rcfpack (R_OBJY,	C_OBJ,		F_MMNU|F_CHG),
X    rcfpack (R_OBJY,	C_OBJX,		F_MNU3|F_PLT),
X    rcfpack (R_OBJY,	C_PHASE,	F_MNU1|F_PLT),
X    rcfpack (R_OBJY,	C_PLUTO,	F_MNU3|F_PLT),
X    rcfpack (R_OBJY,	C_RA,		F_MNU1|F_PLT),
X    rcfpack (R_OBJY,	C_RISEAZ,	F_MNU2|F_PLT),
X    rcfpack (R_OBJY,	C_RISETM,	F_MNU2|F_PLT),
X    rcfpack (R_OBJY,	C_SATURN,	F_MNU3|F_PLT),
X    rcfpack (R_OBJY,	C_SDIST,	F_MNU1|F_PLT),
X    rcfpack (R_OBJY,	C_SETAZ,	F_MNU2|F_PLT),
X    rcfpack (R_OBJY,	C_SETTM,	F_MNU2|F_PLT),
X    rcfpack (R_OBJY,	C_SUN,		F_MNU3|F_PLT),
X    rcfpack (R_OBJY,	C_TRANSALT,	F_MNU2|F_PLT),
X    rcfpack (R_OBJY,	C_TRANSTM,	F_MNU2|F_PLT),
X    rcfpack (R_OBJY,	C_TUP,		F_MNU2|F_PLT),
X    rcfpack (R_OBJY,	C_URANUS,	F_MNU3|F_PLT),
X    rcfpack (R_OBJY,	C_VENUS,	F_MNU3|F_PLT),
X    rcfpack (R_PAUSE,	C_PAUSEV,	F_MMNU|F_CHG),
X    rcfpack (R_PLOT,	C_PLOT,		F_MMNU|F_CHG),
X    rcfpack (R_PLUTO,	C_ALT,		F_MNU1|F_PLT),
X    rcfpack (R_PLUTO,	C_AZ,		F_MNU1|F_PLT),
X    rcfpack (R_PLUTO,	C_DEC,		F_MNU1|F_PLT),
X    rcfpack (R_PLUTO,	C_EDIST,	F_MNU1|F_PLT),
X    rcfpack (R_PLUTO,	C_ELONG,	F_MNU1|F_PLT),
X    rcfpack (R_PLUTO,	C_HLAT,		F_MNU1|F_PLT),
X    rcfpack (R_PLUTO,	C_HLONG,	F_MNU1|F_PLT),
X    rcfpack (R_PLUTO,	C_JUPITER,	F_MNU3|F_PLT),
X    rcfpack (R_PLUTO,	C_MAG,		F_MNU1|F_PLT),
X    rcfpack (R_PLUTO,	C_MARS,		F_MNU3|F_PLT),
X    rcfpack (R_PLUTO,	C_MERCURY,	F_MNU3|F_PLT),
X    rcfpack (R_PLUTO,	C_MOON,		F_MNU3|F_PLT),
X    rcfpack (R_PLUTO,	C_NEPTUNE,	F_MNU3|F_PLT),
X    rcfpack (R_PLUTO,	C_OBJ,		F_MMNU|F_CHG),
X    rcfpack (R_PLUTO,	C_OBJX,		F_MNU3|F_PLT),
X    rcfpack (R_PLUTO,	C_OBJY,		F_MNU3|F_PLT),
X    rcfpack (R_PLUTO,	C_PHASE,	F_MNU1|F_PLT),
X    rcfpack (R_PLUTO,	C_RA,		F_MNU1|F_PLT),
X    rcfpack (R_PLUTO,	C_RISEAZ,	F_MNU2|F_PLT),
X    rcfpack (R_PLUTO,	C_RISETM,	F_MNU2|F_PLT),
X    rcfpack (R_PLUTO,	C_SATURN,	F_MNU3|F_PLT),
X    rcfpack (R_PLUTO,	C_SDIST,	F_MNU1|F_PLT),
X    rcfpack (R_PLUTO,	C_SETAZ,	F_MNU2|F_PLT),
X    rcfpack (R_PLUTO,	C_SETTM,	F_MNU2|F_PLT),
X    rcfpack (R_PLUTO,	C_SIZE,		F_MNU1|F_PLT),
X    rcfpack (R_PLUTO,	C_SUN,		F_MNU3|F_PLT),
X    rcfpack (R_PLUTO,	C_TRANSALT,	F_MNU2|F_PLT),
X    rcfpack (R_PLUTO,	C_TRANSTM,	F_MNU2|F_PLT),
X    rcfpack (R_PLUTO,	C_TUP,		F_MNU2|F_PLT),
X    rcfpack (R_PLUTO,	C_URANUS,	F_MNU3|F_PLT),
X    rcfpack (R_PLUTO,	C_VENUS,	F_MNU3|F_PLT),
X    rcfpack (R_PRES,	C_PRESV,	F_MMNU|F_CHG|F_PLT),
X    rcfpack (R_SATURN,	C_ALT,		F_MNU1|F_PLT),
X    rcfpack (R_SATURN,	C_AZ,		F_MNU1|F_PLT),
X    rcfpack (R_SATURN,	C_DEC,		F_MNU1|F_PLT),
X    rcfpack (R_SATURN,	C_EDIST,	F_MNU1|F_PLT),
X    rcfpack (R_SATURN,	C_ELONG,	F_MNU1|F_PLT),
X    rcfpack (R_SATURN,	C_HLAT,		F_MNU1|F_PLT),
X    rcfpack (R_SATURN,	C_HLONG,	F_MNU1|F_PLT),
X    rcfpack (R_SATURN,	C_JUPITER,	F_MNU3|F_PLT),
X    rcfpack (R_SATURN,	C_MAG,		F_MNU1|F_PLT),
X    rcfpack (R_SATURN,	C_MARS,		F_MNU3|F_PLT),
X    rcfpack (R_SATURN,	C_MERCURY,	F_MNU3|F_PLT),
X    rcfpack (R_SATURN,	C_MOON,		F_MNU3|F_PLT),
X    rcfpack (R_SATURN,	C_NEPTUNE,	F_MNU3|F_PLT),
X    rcfpack (R_SATURN,	C_OBJ,		F_MMNU|F_CHG),
X    rcfpack (R_SATURN,	C_OBJX,		F_MNU3|F_PLT),
X    rcfpack (R_SATURN,	C_OBJY,		F_MNU3|F_PLT),
X    rcfpack (R_SATURN,	C_PHASE,	F_MNU1|F_PLT),
X    rcfpack (R_SATURN,	C_PLUTO,	F_MNU3|F_PLT),
X    rcfpack (R_SATURN,	C_RA,		F_MNU1|F_PLT),
X    rcfpack (R_SATURN,	C_RISEAZ,	F_MNU2|F_PLT),
X    rcfpack (R_SATURN,	C_RISETM,	F_MNU2|F_PLT),
X    rcfpack (R_SATURN,	C_SDIST,	F_MNU1|F_PLT),
X    rcfpack (R_SATURN,	C_SETAZ,	F_MNU2|F_PLT),
X    rcfpack (R_SATURN,	C_SETTM,	F_MNU2|F_PLT),
X    rcfpack (R_SATURN,	C_SIZE,		F_MNU1|F_PLT),
X    rcfpack (R_SATURN,	C_SUN,		F_MNU3|F_PLT),
X    rcfpack (R_SATURN,	C_TRANSALT,	F_MNU2|F_PLT),
X    rcfpack (R_SATURN,	C_TRANSTM,	F_MNU2|F_PLT),
X    rcfpack (R_SATURN,	C_TUP,		F_MNU2|F_PLT),
X    rcfpack (R_SATURN,	C_URANUS,	F_MNU3|F_PLT),
X    rcfpack (R_SATURN,	C_VENUS,	F_MNU3|F_PLT),
X    rcfpack (R_SRCH,	C_SRCH,		F_MMNU|F_CHG|F_PLT),
X    rcfpack (R_STPSZ,	C_STPSZV,	F_MMNU|F_CHG),
X    rcfpack (R_SUN,	C_ALT,		F_MNU1|F_PLT),
X    rcfpack (R_SUN,	C_AZ,		F_MNU1|F_PLT),
X    rcfpack (R_SUN,	C_DEC,		F_MNU1|F_PLT),
X    rcfpack (R_SUN,	C_EDIST,	F_MNU1|F_PLT),
X    rcfpack (R_SUN,	C_HLONG,	F_MNU1|F_PLT),
X    rcfpack (R_SUN,	C_JUPITER,	F_MNU3|F_PLT),
X    rcfpack (R_SUN,	C_MAG,		F_MNU1|F_PLT),
X    rcfpack (R_SUN,	C_MARS,		F_MNU3|F_PLT),
X    rcfpack (R_SUN,	C_MERCURY,	F_MNU3|F_PLT),
X    rcfpack (R_SUN,	C_MOON,		F_MNU3|F_PLT),
X    rcfpack (R_SUN,	C_NEPTUNE,	F_MNU3|F_PLT),
X    rcfpack (R_SUN,	C_OBJ,		F_MMNU|F_CHG),
X    rcfpack (R_SUN,	C_OBJX,		F_MNU3|F_PLT),
X    rcfpack (R_SUN,	C_OBJY,		F_MNU3|F_PLT),
X    rcfpack (R_SUN,	C_PLUTO,	F_MNU3|F_PLT),
X    rcfpack (R_SUN,	C_RA,		F_MNU1|F_PLT),
X    rcfpack (R_SUN,	C_RISEAZ,	F_MNU2|F_PLT),
X    rcfpack (R_SUN,	C_RISETM,	F_MNU2|F_PLT),
X    rcfpack (R_SUN,	C_SATURN,	F_MNU3|F_PLT),
X    rcfpack (R_SUN,	C_SETAZ,	F_MNU2|F_PLT),
X    rcfpack (R_SUN,	C_SETTM,	F_MNU2|F_PLT),
X    rcfpack (R_SUN,	C_SIZE,		F_MNU1|F_PLT),
X    rcfpack (R_SUN,	C_TRANSALT,	F_MNU2|F_PLT),
X    rcfpack (R_SUN,	C_TRANSTM,	F_MNU2|F_PLT),
X    rcfpack (R_SUN,	C_TUP,		F_MNU2|F_PLT),
X    rcfpack (R_SUN,	C_URANUS,	F_MNU3|F_PLT),
X    rcfpack (R_SUN,	C_VENUS,	F_MNU3|F_PLT),
X    rcfpack (R_TEMP,	C_TEMPV,	F_MMNU|F_CHG|F_PLT),
X    rcfpack (R_TZN,	C_TZN,		F_MMNU|F_CHG),
X    rcfpack (R_TZONE,	C_TZONEV,	F_MMNU|F_CHG),
X    rcfpack (R_UD,	C_UD,		F_MMNU|F_PLT|F_CHG),
X    rcfpack (R_URANUS,	C_ALT,		F_MNU1|F_PLT),
X    rcfpack (R_URANUS,	C_AZ,		F_MNU1|F_PLT),
X    rcfpack (R_URANUS,	C_DEC,		F_MNU1|F_PLT),
X    rcfpack (R_URANUS,	C_EDIST,	F_MNU1|F_PLT),
X    rcfpack (R_URANUS,	C_ELONG,	F_MNU1|F_PLT),
X    rcfpack (R_URANUS,	C_HLAT,		F_MNU1|F_PLT),
X    rcfpack (R_URANUS,	C_HLONG,	F_MNU1|F_PLT),
X    rcfpack (R_URANUS,	C_JUPITER,	F_MNU3|F_PLT),
X    rcfpack (R_URANUS,	C_MAG,		F_MNU1|F_PLT),
X    rcfpack (R_URANUS,	C_MARS,		F_MNU3|F_PLT),
X    rcfpack (R_URANUS,	C_MERCURY,	F_MNU3|F_PLT),
X    rcfpack (R_URANUS,	C_MOON,		F_MNU3|F_PLT),
X    rcfpack (R_URANUS,	C_NEPTUNE,	F_MNU3|F_PLT),
X    rcfpack (R_URANUS,	C_OBJ,		F_MMNU|F_CHG),
X    rcfpack (R_URANUS,	C_OBJX,		F_MNU3|F_PLT),
X    rcfpack (R_URANUS,	C_OBJY,		F_MNU3|F_PLT),
X    rcfpack (R_URANUS,	C_PHASE,	F_MNU1|F_PLT),
X    rcfpack (R_URANUS,	C_PLUTO,	F_MNU3|F_PLT),
X    rcfpack (R_URANUS,	C_RA,		F_MNU1|F_PLT),
X    rcfpack (R_URANUS,	C_RISEAZ,	F_MNU2|F_PLT),
X    rcfpack (R_URANUS,	C_RISETM,	F_MNU2|F_PLT),
X    rcfpack (R_URANUS,	C_SATURN,	F_MNU3|F_PLT),
X    rcfpack (R_URANUS,	C_SDIST,	F_MNU1|F_PLT),
X    rcfpack (R_URANUS,	C_SETAZ,	F_MNU2|F_PLT),
X    rcfpack (R_URANUS,	C_SETTM,	F_MNU2|F_PLT),
X    rcfpack (R_URANUS,	C_SIZE,		F_MNU1|F_PLT),
X    rcfpack (R_URANUS,	C_SUN,		F_MNU3|F_PLT),
X    rcfpack (R_URANUS,	C_TRANSALT,	F_MNU2|F_PLT),
X    rcfpack (R_URANUS,	C_TRANSTM,	F_MNU2|F_PLT),
X    rcfpack (R_URANUS,	C_TUP,		F_MNU2|F_PLT),
X    rcfpack (R_URANUS,	C_VENUS,	F_MNU3|F_PLT),
X    rcfpack (R_UT,	C_UTV,		F_MMNU|F_PLT|F_CHG),
X    rcfpack (R_VENUS,	C_ALT,		F_MNU1|F_PLT),
X    rcfpack (R_VENUS,	C_AZ,		F_MNU1|F_PLT),
X    rcfpack (R_VENUS,	C_DEC,		F_MNU1|F_PLT),
X    rcfpack (R_VENUS,	C_EDIST,	F_MNU1|F_PLT),
X    rcfpack (R_VENUS,	C_ELONG,	F_MNU1|F_PLT),
X    rcfpack (R_VENUS,	C_HLAT,		F_MNU1|F_PLT),
X    rcfpack (R_VENUS,	C_HLONG,	F_MNU1|F_PLT),
X    rcfpack (R_VENUS,	C_JUPITER,	F_MNU3|F_PLT),
X    rcfpack (R_VENUS,	C_MAG,		F_MNU1|F_PLT),
X    rcfpack (R_VENUS,	C_MARS,		F_MNU3|F_PLT),
X    rcfpack (R_VENUS,	C_MERCURY,	F_MNU3|F_PLT),
X    rcfpack (R_VENUS,	C_MOON,		F_MNU3|F_PLT),
X    rcfpack (R_VENUS,	C_NEPTUNE,	F_MNU3|F_PLT),
X    rcfpack (R_VENUS,	C_OBJ,		F_MMNU|F_CHG),
X    rcfpack (R_VENUS,	C_OBJX,		F_MNU3|F_PLT),
X    rcfpack (R_VENUS,	C_OBJY,		F_MNU3|F_PLT),
X    rcfpack (R_VENUS,	C_PHASE,	F_MNU1|F_PLT),
X    rcfpack (R_VENUS,	C_PLUTO,	F_MNU3|F_PLT),
X    rcfpack (R_VENUS,	C_RA,		F_MNU1|F_PLT),
X    rcfpack (R_VENUS,	C_RISEAZ,	F_MNU2|F_PLT),
X    rcfpack (R_VENUS,	C_RISETM,	F_MNU2|F_PLT),
X    rcfpack (R_VENUS,	C_SATURN,	F_MNU3|F_PLT),
X    rcfpack (R_VENUS,	C_SDIST,	F_MNU1|F_PLT),
X    rcfpack (R_VENUS,	C_SETAZ,	F_MNU2|F_PLT),
X    rcfpack (R_VENUS,	C_SETTM,	F_MNU2|F_PLT),
X    rcfpack (R_VENUS,	C_SIZE,		F_MNU1|F_PLT),
X    rcfpack (R_VENUS,	C_SUN,		F_MNU3|F_PLT),
X    rcfpack (R_VENUS,	C_TRANSALT,	F_MNU2|F_PLT),
X    rcfpack (R_VENUS,	C_TRANSTM,	F_MNU2|F_PLT),
X    rcfpack (R_VENUS,	C_TUP,		F_MNU2|F_PLT),
X    rcfpack (R_VENUS,	C_URANUS,	F_MNU3|F_PLT),
X    rcfpack (R_WATCH,	C_WATCH,	F_MMNU|F_CHG),
X};
X#define	NFIELDS (sizeof(fields)/sizeof(fields[0]))
X
X/* let op select a field by moving around and hitting RETURN, or until see END.
X * also allow moving directly to a planet row using its name.
X * only allow fields with the given flag mask.
X * return the rcfpack()'d field, or 0 if typed END.
X * N.B. we might also exit() entirely by calling bye() if op types QUIT.
X */
Xsel_fld (r, c, flag, prmpt, help)
Xint r, c;	/* inial row, col */
Xint flag;
Xchar *prmpt, *help;
X{
X	extern void bye();
X	char *lastp;
X	int ch;
X
X	lastp = 0;
X	while (1) {
X	    if (lastp != prmpt) {
X		lastp = prmpt;
X		f_prompt (lastp);
X	    }
X	    c_pos (r, c);
X	    switch (ch = read_char()) {
X	    case REDRAW:
X		redraw_screen(2);	/* redraw all from scratch */
X		lastp = 0;
X		break;
X	    case VERSION:
X		version();
X		lastp = 0;
X		break;
X	    case HELP:
X		f_msg (help);
X		lastp = 0;
X		break;
X	    case QUIT:
X		f_prompt ("Exit ephem? (y) ");
X		if (read_char() == 'y')
X		    bye();	/* never returns */
X		lastp = 0;
X		break;
X#ifdef BANG
X	    case '!': {
X		char buf[NC];
X		f_prompt ("!");
X		if (read_line (buf, sizeof(buf)-2) > 0) {
X		    c_erase();
X		    byetty();
X		    (void) system (buf);
X		    printf ("\nHit any key to resume ephem...");
X		    (void) read_char();
X		    redraw_screen(2);	/* redraw all from scratch */
X		}
X		lastp = 0;
X		}
X		break;
X#endif
X	    case END:
X		return (0);
X	    case '\r':
X		return (rcfpack (r, c, 0));
X	    default:
X		move_cur (ch, flag, &r, &c);
X		break;
X	    }
X	}
X}
X
X/* move cursor to next field in given direction: hjkl, or directly to a
X * field, and set *rp and *cp.
X * limit eligible fields to those with given flag mask.
X */
Xstatic
Xmove_cur (dirchar, flag, rp, cp)
Xchar dirchar;
Xint flag;
Xint *rp, *cp;
X{
X	int curr = *rp, curc = *cp;
X	int f, newf, *fp;
X	int d, newd;
X
X    wrapped:
X	newf = 0;
X	newd = 1000;
X
X	switch (dirchar) {
X	case 'h': /* left */
X	    /* go to next field to the left, or wrap.  */
X	    for (fp = fields+NFIELDS; --fp >= fields; ) {
X		f = *fp;
X		if (tstpackf(f,flag) && unpackr(f) == curr) {
X		    d = curc - unpackc(f);
X		    if (d > 0 && d < newd) {
X			newf = f;
X			newd = d;
X		    }
X		}
X	    }
X	    if (!newf) {
X		curc = NC;
X		goto wrapped;
X	    }
X	    break;
X
X	case 'j': /* down */
X	    /* go to closest field on next row down with anything on it,
X	     * or wrap.
X	     */
X	    for (fp = fields+NFIELDS; --fp >= fields; ) {
X		f = *fp;
X		if (tstpackf(f,flag)) {
X		    d = unpackr(f) - curr;
X		    if (d > 0 && d < newd) {
X			newf = f;
X			newd = d;
X		    }
X		}
X	    }
X	    if (newf) {
X		/* now find the field closest to current col on that row */
X		newf = nearestfld (unpackr(newf), curc, flag);
X	    } else {
X		curr = 0;
X		goto wrapped;
X	    }
X	    break;
X
X	case 'k': /* up */
X	    /* go to closest field on next row up with anything on it, 
X	     * or wrap.
X	     */
X	    for (fp = fields+NFIELDS; --fp >= fields; ) {
X		f = *fp;
X		if (tstpackf(f,flag)) {
X		    d = curr - unpackr(f);
X		    if (d > 0 && d < newd) {
X			newf = f;
X			newd = d;
X		    }
X		}
X	    }
X	    if (newf) {
X		/* now find the field closest to current col on that row */
X		newf = nearestfld (unpackr(newf), curc, flag);
X	    } else {
X		curr = NR+1;
X		goto wrapped;
X	    }
X	    break;
X
X	case 'l': /* right */
X	    /* go to next field to the right, or wrap.  */
X	    for (fp = fields+NFIELDS; --fp >= fields; ) {
X		f = *fp;
X		if (tstpackf(f,flag) && unpackr(f) == curr) {
X		    d = unpackc(f) - curc;
X		    if (d > 0 && d < newd) {
X			newf = f;
X			newd = d;
X		    }
X		}
X	    }
X	    if (!newf) {
X		curc = 0;
X		goto wrapped;
X	    }
X	    break;
X
X	/* handy shorthands directly to a given spot.
X	 * calling nearestfld() automatically allows for which menu
X	 *   is up now and what is pickable. you can use rcfpack()
X	 *   directly for top half fields that are always up.
X	 * N.B. using nearestfld() can be too aggressive. it will try
X	 *   other fields entirely if one you intend is not eligible.
X	 */
X	case 'S': newf = nearestfld (R_SUN, 1, flag); break;
X	case 'M': newf = nearestfld (R_MOON, 1, flag); break;
X	case 'e': newf = nearestfld (R_MERCURY, 1, flag); break;
X	case 'v': newf = nearestfld (R_VENUS, 1, flag); break;
X	case 'm': newf = nearestfld (R_MARS, 1, flag); break;
X	case cntrl('j'): newf = nearestfld (R_JUPITER, 1, flag); break;
X	case 's': newf = nearestfld (R_SATURN, 1, flag); break;
X	case 'u': newf = nearestfld (R_URANUS, 1, flag); break;
X	case 'n': newf = nearestfld (R_NEPTUNE, 1, flag); break;
X	case 'p': newf = nearestfld (R_PLUTO, 1, flag); break;
X	case 'x': newf = nearestfld (R_OBJX, 1, flag); break;
X	case 'y': newf = nearestfld (R_OBJY, 1, flag); break;
X	case 'c': newf = rcfpack (R_ALTM, C_ALTM, 0); break;
X	case 'd': newf = rcfpack (R_UD, C_UD, 0); break;
X	case 'o': newf = rcfpack (R_EPOCH, C_EPOCHV, 0); break;
X	case 'z': newf = rcfpack (R_STPSZ, C_STPSZV, 0); break;
X	case 'w': newf = rcfpack (R_WATCH, C_WATCH, 0); break;
X	case 'L': newf = rcfpack (R_LISTING, C_LISTING, 0); break;
X	}
X
X	if (newf > 0) {
X	    *rp = unpackr(newf);
X	    *cp = unpackc(newf);
X	}
X}
X
X/* return the nearest field with given flag mask, either way, on this row,
X * else -1 if none.
X */
Xstatic int
Xnearestfld (r, c, flag)
Xint r, c, flag;
X{
X	int nf, f, *fp;
X	int d, d0;
X
X	nf = 0;
X	d0 = 1000;
X
X	for (fp = fields+NFIELDS; --fp >= fields; ) {
X	    f = *fp;
X	    if (tstpackf(f,flag) && unpackr(f) == r) {
X		d = abs(c - unpackc(f));
X		if (d < d0) {
X		    nf = f;
X		    d0 = d;
X		}
X	    }
X	}
X	return (nf ? nf : -1);
X}
END_OF_FILE
if test 24029 -ne `wc -c <'sel_fld.c'`; then
    echo shar: \"'sel_fld.c'\" unpacked with wrong size!
fi
# end of 'sel_fld.c'
fi
echo shar: End of archive 6 \(of 6\).
cp /dev/null ark6isdone
MISSING=""
for I in 1 2 3 4 5 6 ; do
    if test ! -f ark${I}isdone ; then
	MISSING="${MISSING} ${I}"
    fi
done
if test "${MISSING}" = "" ; then
    echo You have unpacked all 6 archives.
    rm -f ark[1-9]isdone
else
    echo You still need to unpack the following archives:
    echo "        " ${MISSING}
fi
##  End of shell archive.
exit 0



More information about the Comp.sources.misc mailing list