ftp.nice.ch/pub/next/unix/macintosh/uw.4.2.N.bs.tar.gz#/uw/utility/uwplot.c

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

/*
 *	uwplot
 *
 * Copyright 1986 by John D. Bruner.  All rights reserved.  Permission to
 * copy this program is given provided that the copy is not sold and that
 * this copyright notice is included.
 */

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <sys/signal.h>
#include <sys/errno.h>
#include <ctype.h>
#include <stdio.h>

#include "uwlib.h"

char *argv0;
UWIN uwin;

main(argc, argv)
char **argv;
{
	register int c, len;
	register char *cp;
	register char *title;
	register struct sockaddr_in *sin;
	auto struct sockaddr_in sa;
	auto char buf[4096];
	extern char *optarg;
	extern int errno;
	extern onintr();

	/*
	 * Options which are recognized directly are:
	 *
	 *	-ninet	connect to server at address "inet"
	 *	-ttitle	label window with "title" (default is argv[0])
	 */
	argv0 = argv[0];
	sin = (struct sockaddr_in *)0;
	title = argv0;
	while ((c = getopt(argc, argv, "n:t:")) != EOF) {
		switch (c) {
		case 'n':
			sa.sin_family = AF_INET;
			sa.sin_addr.s_addr = 0;
			sa.sin_port = 0;
			bzero(sa.sin_zero, sizeof sa.sin_zero);
			for (cp=optarg; isxdigit(c = *cp); cp++) {
				/* Pyramid compiler botch */
				/* sa.sin_addr.s_addr *= 16; */
				sa.sin_addr.s_addr <<= 4;
				if (isdigit(c))
					sa.sin_addr.s_addr += c - '0';
				else if (islower(c))
					sa.sin_addr.s_addr += c-'a' + 10;
				else
					sa.sin_addr.s_addr += c-'A' + 10;
			}
			if (c == '.')
				for (cp++; isdigit(c = *cp); cp++)
					sa.sin_port = sa.sin_port*10 + c-'0';
			if (sa.sin_addr.s_addr == 0 || sa.sin_port == 0) {
				fprintf(stderr,
				    "%s: bad Internet address: %s\n",
				    argv0, optarg);
				return(1);
			}
			sa.sin_addr.s_addr = htonl(sa.sin_addr.s_addr);
			sa.sin_port = htons(sa.sin_port);
			sin = &sa;
			break;
		case 't':
			title = optarg;
			break;
		}
	}

	/*
	 * Catch hangup, interrupt, quit, and termination signals.  Kill
	 * the window if one of these is received.
	 */
	(void)signal(SIGHUP, onintr);
	(void)signal(SIGINT, onintr);
	(void)signal(SIGQUIT, onintr);
	(void)signal(SIGTERM, onintr);

	/*
	 * Create a new plot window, title it, and make it visible.
	 */
	if ((uwin = uw_new(UWT_PLOT, sin)) == (UWIN)0) {
		uw_perror(argv[0], uwerrno, errno);
		return(1);
	}
	(void)uw_stitle(uwin, title);
	(void)uw_svis(uwin, 1);

	/*
	 * Copy the standard input to the plot window.
	 */
	while ((len = read(0, buf, sizeof buf)) > 0 ||
	    (len < 0 && errno == EINTR)) {
		if (len > 0)
			(void)write(UW_DATAFD(uwin), buf, len);
	}

	/*
	 * This is something of a hack.  We don't expect to be able to
	 * read anything from the window.  The read will hang until the
	 * window is killed.
	 */
	while ((len = read(UW_DATAFD(uwin), buf, sizeof buf)) > 0 ||
	    len < 0 && errno == EINTR)
		;
	return(0);
}

onintr()
{
	uw_kill(uwin);
	exit(0);
}

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