ftp.nice.ch/pub/next/science/astronomy/ephem_NISH_bs.tar.gz#/ephem/Source/popup.c

This is popup.c in view mode; [Download] [Up]

/* put up a one-line menu consisting of the given fields and let op move
 * between them with the same methods as sel_fld().
 * return index of which he picked, or -1 if hit END.
 */

#include <stdio.h>
#include "screen.h"

extern void bye();

#define	FLDGAP	2	/* inter-field gap */
#define	MAXFLDS	32	/* max number of fields we can handle */

static char pup[] = "Select: ";

/* put up an array of strings on prompt line and let op pick one.
 * start with field fn.
 * N.B. we do not do much error/bounds checking.
 */
popup (fields, fn, nfields)
char *fields[];
int fn;
int nfields;
{
	int fcols[MAXFLDS];	/* column to use for each field */
	int i;

	if (nfields > MAXFLDS)
	    return (-1);

    again:
	/* erase the prompt line; we are going to take it over */
	c_pos (R_PROMPT, C_PROMPT);
	c_eol();

	/* compute starting column for each field */
	fcols[0] = sizeof(pup);
	for (i = 1; i < nfields; i++)
	    fcols[i] = fcols[i-1] + strlen (fields[i-1]) + FLDGAP;

	/* draw each field, with comma after all but last */
	c_pos (R_PROMPT, 1);
	(void) fputs (pup, stdout);
	for (i = 0; i < nfields; i++) {
	    c_pos (R_PROMPT, fcols[i]);
	    printf (i < nfields-1 ? "%s," : "%s", fields[i]);
	}

	/* let op choose one now; begin at fn.
	 */
	while (1) {
	    c_pos (R_PROMPT, fcols[fn]);
	    switch (read_char()) {
	    case END: return (-1);
	    case QUIT:
		f_prompt ("Exit ephem? (y) ");
		if (read_char() == 'y')
		    bye();	/* never returns */
		goto again;
	    case REDRAW: redraw_screen(2); goto again;
	    case VERSION: version(); goto again;
	    case '\r': case ' ': return (fn);
	    case 'h':
		if (--fn < 0)
		    fn = nfields - 1;
		break;
	    case 'l':
		if (++fn >= nfields)
		    fn = 0;
		break;
	    }
	}
}

These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.