/*
 *	Top - a top users display for Berkeley Unix
 *
 *	General (global) definitions
 *
 *	Copyright (c) 2007-2019, Mark Wong
 */

#ifndef _PG_TOP_H_
#define _PG_TOP_H_

#include "machine.h"
#include "os.h"

/* Log base 2 of 1024 is 10 (2^10 == 1024) */
#define LOG1024		10

/* Special atoi routine returns either a non-negative number or one of: */
#define Infinity	-1
#define Invalid		-2

/* maximum number we can have */
#define Largest		0x7fffffff

struct ext_decl
{
	int			(*f_minibar) (char *, int);
	int			(*f_display) (char *, int);
};

/*
 *	Definitions for things that might vary between installations.
 */

/*
 *	"Table_size" defines the size of the hash tables used to map uid to
 *	username.  Things will work best if the number is a prime number.
 *	We use a number that should be suitable for most installations.
 */
#ifndef Table_size
#define Table_size	8191
#endif

/*
 *	"Nominal_TOPN" is used as the default TOPN when Default_TOPN is Infinity
 *	and the output is a dumb terminal.	If we didn't do this, then
 *	installations who use a default TOPN of Infinity will get every
 *	process in the system when running top on a dumb terminal (or redirected
 *	to a file).  Note that Nominal_TOPN is a default:  it can still be
 *	overridden on the command line, even with the value "infinity".
 */
#ifndef Nominal_TOPN
#define Nominal_TOPN	40
#endif

#ifndef Default_DELAY
#define Default_DELAY	5
#endif

/*
 *	If the local system's getpwnam interface uses random access to retrieve
 *	a record (i.e.: 4.3 systems, Sun "yellow pages"), then defining
 *	RANDOM_PW will take advantage of that fact.  If RANDOM_PW is defined,
 *	then getpwnam is used and the result is cached.  If not, then getpwent
 *	is used to read and cache the password entries sequentially until the
 *	desired one is found.
 *
 *	We initially set RANDOM_PW to something which is controllable by the
 *	Configure script.  Then if its value is 0, we undef it.
 */

#define RANDOM_PW	1
#if RANDOM_PW == 0
#undef RANDOM_PW
#endif

enum pgparams
{
	PG_HOST,
	PG_PORT,
	PG_USER,
	PG_PASSWORD,
	PG_DBNAME
};

struct pg_top_context
{
#ifdef ENABLE_COLOR
	int			color_on;
#endif
	int			delay;
	int			displays;
	void		(*d_header) (char *);
	char		do_unames;
	char		dostates;
	char	   *header_options[2][MODE_TYPES];
	char	   *header_text;
	char		interactive;
	int			mode;
	int			mode_remote;	/* Mode for monitoring a remote database
								 * system. */
	int			order_index;
	char	   *order_name;
	struct db_info db_info;
	struct io_info io_info;
	struct process_select ps;
	char		show_tags;
	struct statics statics;
	struct system_info system_info;
	struct timeval timeout;
	int			topn;
	struct pg_conninfo_ctx conninfo;
};

void		quit(int);
void		reset_display(struct pg_top_context *);

#endif							/* _PG_TOP_H_ */
