/*	This program toggles the priority for a process between 4 and 5
	with a wait time of 1 second between each toggle. Up to 20
	processes can be handled at one time. When the last process is gone,
	this program terminates.

	To run, you must first define a symbol;

		flip :== $dev:[dir]flipper

	Then you give it the process ids;

		flip 3002a 5001f 70022
*/
# include	<descrip.h>
# include	<jpidef.h>
# include	<ssdef.h>
# include	<ctype.h>

main(argc,argv)
int argc;
char *argv[];
{
int		pid[20];	/* process identification		*/
int		bads;		/* counts procs that have gone away	*/
int		status;		/* returned status			*/
int		prvpri;		/* previous priority			*/
register int	pri;		/* current priority			*/
register int	prib;		/* base priority			*/
register int	sleepytime;	/* number of seconds to sleep		*/
register int	sub;		/* terminal table subscript		*/
register int	limit;		/* points to last entry in pid table	*/

pri = 5;			/* define raised priority	*/
prib = 4;			/* define base priority		*/
sleepytime = 1;			/* define sleep time		*/
argv++;
if (argc > 20)			/* first, get arguments		*/
	{
	printf ("Too many (> 20) arguments!\n");
	exit (SS$_NORMAL);
	}
for(sub=0;sub < argc - 1;sub++)
	{
	sscanf(*argv,"%x",&pid[sub]);
	printf ("%x\n",pid[sub]);
	argv++;
	}
limit = sub - 1;		/* set table limit		*/
status = sys$setpri(&pri);	/* set my priority to raised priority */
for (bads=0;bads < limit + 1;)	/* main loop			*/
	{
	sleep(sleepytime);	/* ZZZZZZZZZZZZZZZZZZZZZZZZZZZ	*/
	for (sub=0;sub <= limit;sub++)	/* raise all the priorities */
		{
		if (pid[sub] == 0)
			break;
		status = sys$setpri(&pid[sub],0,&pri,&prvpri);
		if (status != SS$_NORMAL)
			{
			pid[sub] = 0;
			bads++;
			}
		}
	sleep(sleepytime);	/* ZZZZZZZZZZZZZZZZZZZZZZZZZZZ	*/
	for (sub=0;sub <= limit;sub++)	/* lower all the priorities */
		{
		if (pid[sub] == 0)
			break;
		status = sys$setpri(&pid[sub],0,&prib,&prvpri);
		if (status != SS$_NORMAL)
			{
			pid[sub] = 0;
			bads++;
			}
		}
	}
status = sys$setpri(&prib);	/* lower my priority		*/
}	
