Ejemplo n.º 1
0
static void
uparse(char *m)
{
	char *p=m;

	if (!p[0] || (p[1]!=' ' && p[1]!=0)) {
	pmsg:
		if (ch==0) return;
		m+=strspn(m, " ");
		if (!*m) return;
		pushf(ch, PFMT, nick, m);
		sndf("PRIVMSG %s :%s", chl[ch].name, m);
		return;
	}
	switch (*p) {
	case 'j': /* Join channels. */
		p+=1+(p[1]==' ');
		p=strtok(p, " ");
		while (p) {
			if (chadd(p)<0) break;
			sndf("JOIN %s", p);
			p=strtok(0, " ");
		}
		tredraw();
		return;
	case 'l': /* Leave channels. */
		p+=1+(p[1]==' ');
		if (!*p) {
			if (ch==0) return; /* Cannot leave server window. */
			strcat(p, chl[ch].name);
		}
		p=strtok(p, " ");
		while (p) {
			if (chdel(p))
				sndf("PART %s", p);
			p=strtok(0, " ");
		}
		tredraw();
		return;
	case 'm': /* Private message. */
		m=p+1+(p[1]==' ');
		if (!(p=strchr(m, ' '))) return;
		*p++ = 0;
		sndf("PRIVMSG %s :%s", m, p);
		return;
	case 'r': /* Send raw. */
		if (p[1])
			sndf("%s", &p[2]);
		return;
	case 'q': /* Quit. */
		quit=1;
		return;
	default: /* Send on current channel. */
		goto pmsg;
	}
}
Ejemplo n.º 2
0
void n_specnames(void)
{

	int	i;

	for (i = 0; spnames[i].n; i++)
		*spnames[i].n = chadd(spnames[i].v, Troffchar, Install);
	if (c_isalnum == 0)
		c_isalnum = NROFFCHARS;
}
Ejemplo n.º 3
0
Tchar get1ch(FILE *fp)	/* get one "character" from input, figure out what alphabet */
{
	wchar_t wc;
	char buf[100], *p;
	int i, n, c;

	for (i = 0, p = buf; i < MB_CUR_MAX; i++) {
		if ((c = getc(fp)) == EOF)
			return c;
		*p++ = c;
		if ((n = mbtowc(&wc, buf, p-buf)) >= 0)
			break;
	}
	if (n == 1)	/* real ascii, presumably */
		return wc;
	if (n == 0)
		return p[-1];	/* illegal, but what else to do? */
	if (c == EOF)
		return EOF;
	*p = 0;
	return chadd(buf, MBchar, Install);	/* add name even if haven't seen it */
}
Ejemplo n.º 4
0
static int getnrfont(FILE *fp)	/* read the nroff description file */
{
	Chwid chtemp[NCHARS];
	static Chwid chinit;
	int i, nw, n, wid, code, type;
	char buf[100], ch[100], s1[100], s2[100];
	wchar_t wc;

	code = 0;
	chinit.wid = 1;
	chinit.str = "";
	for (i = 0; i < ALPHABET; i++) {
		chtemp[i] = chinit;	/* zero out to begin with */
		chtemp[i].num = chtemp[i].code = i;	/* every alphabetic character is itself */
		chtemp[i].wid = 1;	/* default ascii widths */
	}
	skipline(fp);
	nw = ALPHABET;
	while (fgets(buf, sizeof buf, fp) != NULL) {
		sscanf(buf, "%s %s %[^\n]", ch, s1, s2);
		if (!eq(s1, "\"")) {	/* genuine new character */
			sscanf(s1, "%d", &wid);
		} /* else it's a synonym for prev character, */
			/* so leave previous values intact */

		/* decide what kind of alphabet it might come from */

		if (strlen(ch) == 1) {	/* it's ascii */
			n = ch[0];	/* origin includes non-graphics */
			chtemp[n].num = ch[0];
		} else if (ch[0] == '\\' && ch[1] == '0') {
			n = strtol(ch+1, 0, 0);	/* \0octal or \0xhex */
			chtemp[n].num = n;
#ifdef UNICODE
		} else if (mbtowc(&wc, ch, strlen(ch)) > 1) {
			chtemp[nw].num = chadd(ch, MBchar, Install);
			n = nw;
			nw++;
#endif	/*UNICODE*/
		} else {
			if (strcmp(ch, "---") == 0) { /* no name */
				sprintf(ch, "%d", code);
				type = Number;
			} else
				type = Troffchar;
/* BUG in here somewhere when same character occurs twice in table */
			chtemp[nw].num = chadd(ch, type, Install);
			n = nw;
			nw++;
		}
		chtemp[n].wid = wid;
		chtemp[n].str = strdupl(parse(s2, Type));
	}
	t.tfont.nchars = nw;
	t.tfont.wp = (Chwid *) malloc(nw * sizeof(Chwid));
	if (t.tfont.wp == NULL)
		return -1;
	for (i = 0; i < nw; i++)
		t.tfont.wp[i] = chtemp[i];
	return 1;
}
Ejemplo n.º 5
0
int
main(int argc, char *argv[])
{
	const char *user = getenv("USER");
	const char *ircnick = getenv("IRCNICK");
	const char *server = SRV;
	unsigned short port = PORT;
	int o;

	while ((o=getopt(argc, argv, "hn:u:s:p:"))>=0)
		switch (o) {
		case 'h':
		case '?':
		usage:
			fputs("Usage: irc [-n NICK] [-u USER] [-s SERVER] [-p PORT] [-h]\n", stderr);
			exit(0);
		case 'n':
			if (strlen(optarg)>=sizeof nick) goto usage;
			strcpy(nick, optarg);
			break;
		case 'u':
			user = optarg;
			break;
		case 's':
			server = optarg;
			break;
		case 'p':
			if (!(port=strtol(optarg, 0, 0))) goto usage;
			break;
		}
	if (!nick[0] && ircnick && strlen(ircnick)<sizeof nick)
		strcpy(nick, ircnick);
	if (!nick[0]) goto usage;
	if (!user) user = "******";
	tinit();
	sfd = dial(server, port);
	chadd("*server*");
	sndf("NICK %s", nick);
	sndf("USER %s 8 * :%s", user, user);
	sndf("MODE %s +i", nick);
	while (!quit) {
		fd_set rfs, wfs;
		int ret;

		if (winchg)
			tresize();
		FD_ZERO(&wfs);
		FD_ZERO(&rfs);
		FD_SET(0, &rfs);
		FD_SET(sfd, &rfs);
		if (outp!=outb)
			FD_SET(sfd, &wfs);
		ret=select(sfd+1, &rfs, &wfs, 0, 0);
		if (ret<0) {
			if (errno==EINTR) continue;
			panic("Select failed.");
		}
		if (FD_ISSET(sfd, &rfs)) {
			if (!srd())
				quit=1;
		}
		if (FD_ISSET(sfd, &wfs)) {
			int wr;

			wr=write(sfd, outb, outp-outb);
			if (wr<0) {
				if (errno==EINTR) continue;
				panic("Write error.");
			}
			if (wr==0) continue;
			outp-=wr;
			memmove(outb, outb+wr, outp-outb);
		}
		if (FD_ISSET(0, &rfs)) {
			tgetch();
			wrefresh(scr.iw);
		}
	}
	close(sfd);
	while (nch--)
		free(chl[nch].buf);
	treset();
	exit(0);
}