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; } }
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; }
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 */ }
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; }
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); }