/* * ret: -1: user cancel input */ int getdata(int line, int col, char *prompt, char *buf, int len, int echo, void *nouse, int clearlabel) { int ch, clen = 0, curr = 0, x, y; bool init=true; char tmp[STRLEN],save[STRLEN]; extern int scr_cols; extern int RMSG; if (clearlabel == true) { buf[0] = 0; } if (scrint) move(line, col); if (prompt) prints("%s", prompt); if (scrint) getyx(&y, &x); clen = strlen(buf); if (clen>=len) clen = len - 1; curr = clen; buf[curr] = '\0'; strncpy(save, buf, STRLEN); save[STRLEN-1]=0; if (!scrint) { prints("%s", buf); while ((ch = igetkey()) != '\r') { /* * TODO: add KEY_REFRESH support */ if (ch == '\n') break; if (ch == '\177' || ch == Ctrl('H')) { if (clen == 0) continue; clen--; ochar(Ctrl('H')); ochar(' '); ochar(Ctrl('H')); oflush(); continue; } if (!isprint2(ch)) continue; if (clen >= len - 1) continue; buf[clen++] = ch; if (echo) ochar(ch); else ochar('*'); } buf[clen] = '\0'; prints("\n"); oflush(); return clen; } ingetdata = true; clrtoeol(); while (1) { int i; move(y, x); if (init) prints("\x1b[4m"); for (i=0; i<clen; i++) if (!echo||buf[i]==KEY_ESC||!isprint2(buf[i])) outc('*'); else outc(buf[i]); resetcolor(); clrtoeol(); move(y, x+curr); ch = igetkey(); if (kicked) { ingetdata = false; return 0; } if (true == RMSG && (KEY_UP == ch || KEY_DOWN == ch)) { ingetdata = false; return -ch; /* Leeward 98.07.30 supporting msgX */ } if ((uinfo.mode == KILLER && (!buf[0]) && (ch==KEY_UP||ch==KEY_DOWN||ch==KEY_PGUP||ch==KEY_PGDN))||(ch>=Ctrl('S')&&ch<=Ctrl('W'))) { ingetdata = false; return -ch; } #if 0 //#ifdef NINE_BUILD if (true == RMSG && ch == Ctrl('Z') && clen == 0) break; #endif if (ch == '\n' || ch == '\r') break; #ifdef CHINESE_CHARACTER if (ch == Ctrl('R')) { SET_CHANGEDEFINE(getCurrentUser(), DEF_CHCHAR); init=false; continue; } #endif if (ch == '\177' || ch == Ctrl('H')) { if (init) { init=false; buf[0]=0; curr=0; clen=0; } if (curr == 0) { continue; } strcpy(tmp, &buf[curr]); buf[--curr] = '\0'; #ifdef CHINESE_CHARACTER if (DEFINE(getCurrentUser(), DEF_CHCHAR)) { int i,j=0; for (i=0; i<curr; i++) if (j) j=0; else if (buf[i]<0) j=1; if (j) { buf[--curr] = '\0'; clen--; } } #endif (void) strcat(buf, tmp); clen--; continue; } if (ch == KEY_ESC&&!enableESC) { strncpy(buf, save, Min(len,STRLEN)); buf[Min(len,STRLEN-1)]=0; curr = strlen(buf); clen = curr; init=true; continue; } if (ch == Ctrl('C')) { buf[0]='\0'; outc('\n'); ingetdata = false; return -1; } if (ch == KEY_DEL) { if (init) { init=false; buf[0]=0; curr=0; clen=0; } if (curr >= clen) { curr = clen; continue; } strcpy(tmp, &buf[curr + 1]); #ifdef CHINESE_CHARACTER if (DEFINE(getCurrentUser(), DEF_CHCHAR)) { int i,j=0; for (i=0; i<curr+1; i++) if (j) j=0; else if (buf[i]<0) j=1; if (j) { strcpy(tmp, &buf[curr + 2]); clen--; } } #endif buf[curr] = '\0'; (void) strcat(buf, tmp); clen--; continue; } if (ch == KEY_LEFT) { init=false; if (curr == 0) { continue; } curr--; #ifdef CHINESE_CHARACTER if (DEFINE(getCurrentUser(), DEF_CHCHAR)) { int i,j=0; for (i=0; i<curr; i++) if (j) j=0; else if (buf[i]<0) j=1; if (j) curr--; } #endif move(y, x + curr); continue; } if (ch == Ctrl('E') || ch == KEY_END) { init=false; curr = clen; move(y, x + curr); continue; } if (ch == Ctrl('A') || ch == KEY_HOME) { init=false; curr = 0; move(y, x + curr); continue; } if (ch == KEY_RIGHT) { init=false; if (curr >= clen) { curr = clen; continue; } curr++; #ifdef CHINESE_CHARACTER if (DEFINE(getCurrentUser(), DEF_CHCHAR)) { int i,j=0; for (i=0; i<curr; i++) if (j) j=0; else if (buf[i]<0) j=1; if (j) curr++; } #endif move(y, x + curr); continue; } if (!isprint2(ch)&&(ch!=KEY_ESC||!enableESC)) { init=false; continue; } if (x + clen >= scr_cols || clen >= len - 1) { if (!init) continue; } if (init) { init=false; buf[0]=0; curr=0; clen=0; } if (!buf[curr]) { buf[curr + 1] = '\0'; buf[curr] = ch; } else { int i; for (i = len - 2; i >= curr; i--) buf[i + 1] = buf[i]; buf[curr] = ch; } curr++; clen++; } buf[clen] = '\0'; outc('\n'); ingetdata = false; return clen; }
static int ent_chat(int chatnum) { /* 进入聊天室 */ chatcontext *pthis; char inbuf[128]; int ch, cmdpos; int currchar; int modified; /* the line is modified? -- wwj */ int newmail; int page_pending = false; int chatting = true; #ifdef NEW_HELP int oldhelpmode=helpmode; #endif if (!strcmp(getCurrentUser()->userid, "guest")) return -1; pthis = (chatcontext *) malloc(sizeof(chatcontext)); bzero(pthis, sizeof(chatcontext)); if (!pthis) return -1; modify_user_mode(CHAT1); ch = ent_chat_conn(pthis, chatnum); if (ch != 1) { free(pthis); return ch; } #ifdef NEW_HELP helpmode=HELP_CHAT; #endif add_io(pthis->cfd, 0); modified = newmail = cmdpos = currchar = 0; /* update uinfo */ uinfo.in_chat = true; strcpy(uinfo.chatid, pthis->chatid); UPDATE_UTMP(in_chat, uinfo); UPDATE_UTMP_STR(chatid, uinfo); /* initiate screen */ clear(); pthis->chatline = 2; move(s_lines, 0); outs(msg_seperator); move(1, 0); outs(msg_seperator); print_chatid(pthis); memset(inbuf, 0, 80); /* chat begin */ while (chatting) { if (chat_checkparse(pthis) == 0) break; move(b_lines, currchar + 10); pthis->outputcount = 0; ch = igetkey(); if (ch==KEY_TALK) { int talkpage = servicepage(0, pthis->buf); if (talkpage != page_pending) { bell(); oflush(); printchatline(pthis, pthis->buf); page_pending = talkpage; } } if (chat_checkparse(pthis) == 0) break; if (ch == I_OTHERDATA) continue; switch (ch) { case KEY_UP: case KEY_DOWN: if (cmdpos == pthis->cmdpos) { strcpy(pthis->lastcmd[cmdpos], inbuf); modified = 0; } if (ch == KEY_UP) { if (cmdpos != (pthis->cmdpos + 1) % MAXLASTCMD) { int i = (cmdpos + MAXLASTCMD - 1) % MAXLASTCMD; if (pthis->lastcmd[i][0]) cmdpos = i; } } if (ch == KEY_DOWN) { if (cmdpos != pthis->cmdpos) cmdpos = (cmdpos + 1) % MAXLASTCMD; } strcpy(inbuf, pthis->lastcmd[cmdpos]); if (cmdpos == pthis->cmdpos) { modified = 1; } move(b_lines, 10); clrtoeol(); ch = inbuf[69]; inbuf[69] = 0; outs(inbuf); inbuf[69] = ch; currchar = strlen(inbuf); continue; #ifdef CHINESE_CHARACTER case Ctrl('R'): SET_CHANGEDEFINE(getCurrentUser(), DEF_CHCHAR); continue; #endif case KEY_LEFT: if (currchar) --currchar; #ifdef CHINESE_CHARACTER if (DEFINE(getCurrentUser(), DEF_CHCHAR)) { int i,j=0; for (i=0;i<currchar;i++) if (j) j=0; else if (inbuf[i]<0) j=1; if (j) { currchar--; } } #endif continue; case KEY_RIGHT: if (inbuf[currchar]) ++currchar; #ifdef CHINESE_CHARACTER if (DEFINE(getCurrentUser(), DEF_CHCHAR)) { int i,j=0; for (i=0;i<currchar;i++) if (j) j=0; else if (inbuf[i]<0) j=1; if (j) { if (inbuf[currchar]) ++currchar; } } #endif continue; case KEY_ESC: case Ctrl('X'): inbuf[0] = 0; currchar = 0; move(b_lines, currchar + 10); clrtoeol(); modified = 1; continue; case Ctrl('A'): currchar = 0; continue; case Ctrl('E'): currchar = strlen(inbuf); continue; } if (!newmail && chkmail(0)) { /* check mail */ newmail = 1; printchatline(pthis, "\033[32m*** \033[31m当!你有新信来啦...\033[m"); } if (isprint2(ch)) { if (currchar < 126) { /* 未满一行,print it */ modified = 1; if (inbuf[currchar]) { /* insert */ int i; for (i = currchar; inbuf[i] && i < 127; i++); inbuf[i + 1] = '\0'; for (; i > currchar; i--) inbuf[i] = inbuf[i - 1]; } else { /* append */ inbuf[currchar + 1] = '\0'; } inbuf[currchar] = ch; ch = inbuf[69]; /* save the end of line */ inbuf[69] = 0; move(b_lines, currchar + 10); outs(&inbuf[currchar++]); inbuf[69] = ch; } continue; } if (ch == '\n' || ch == '\r') { if (currchar) { if (modified) { /* add to command history */ ch = sizeof(pthis->lastcmd[pthis->cmdpos]) - 1; strncpy(pthis->lastcmd[pthis->cmdpos], inbuf, ch); pthis->lastcmd[pthis->cmdpos][ch] = 0; pthis->cmdpos = (pthis->cmdpos + 1) % MAXLASTCMD; cmdpos = pthis->cmdpos; } else { /* use history, so can +1 */ cmdpos = (cmdpos + 1) % MAXLASTCMD; } if (inbuf[0] == '/' && Isspace(inbuf[1])) { /* discard / b */ printchatline(pthis, "\x1b[37m*** \x1b[32m请输入正确的指令,使用/h寻求帮助\x1b[37m ***\x1b[m"); } else { chatting = chat_cmd(pthis, inbuf); /*local命令处理 */ if (chatting == 0) chatting = chat_send(pthis, inbuf); if (inbuf[0] == '/') { ch = 1; while (inbuf[ch] != '\0' && inbuf[ch] != ' ') ch++; if (ch > 1) { if (!strncasecmp(inbuf, "/bye", ch)) break; if (!strncasecmp(inbuf, "/exit", ch)) break; /*added by alex, 96.9.5 */ } } } modified = 0; inbuf[0] = '\0'; currchar = 0; move(b_lines, 10); clrtoeol(); } continue; } if (ch == Ctrl('H') || ch == '\177') { /*Backspace */ if (currchar) { currchar--; inbuf[127] = '\0'; memcpy(&inbuf[currchar], &inbuf[currchar + 1], 127 - currchar); move(b_lines, currchar + 10); clrtoeol(); ch = inbuf[69]; /* save the end of line */ inbuf[69] = 0; outs(&inbuf[currchar]); inbuf[69] = ch; } #ifdef CHINESE_CHARACTER if (DEFINE(getCurrentUser(), DEF_CHCHAR)) { int i,j=0; for (i=0;i<currchar;i++) if (j) j=0; else if (inbuf[i]<0) j=1; if (j) { currchar--; inbuf[127] = '\0'; memcpy(&inbuf[currchar], &inbuf[currchar + 1], 127 - currchar); move(b_lines, currchar + 10); clrtoeol(); ch = inbuf[69]; /* save the end of line */ inbuf[69] = 0; outs(&inbuf[currchar]); inbuf[69] = ch; } } #endif continue; } if (ch == Ctrl('Z')) { r_lastmsg(); /* Leeward 98.07.30 support msgX */ inbuf[0] = '\0'; currchar = 0; move(b_lines, 10); clrtoeol(); continue; } if (ch == Ctrl('C') /*|| ch == Ctrl('D') */) { /* ^C 退出 */ chat_send(pthis, "/b"); if (pthis->rec) set_rec(pthis,NULL); break; } } /* chat end */ if (pthis->rec)set_rec(pthis,NULL); close(pthis->cfd); add_io(0, 0); uinfo.in_chat = false; uinfo.chatid[0] = '\0'; UPDATE_UTMP(in_chat, uinfo); UPDATE_UTMP(chatid[0], uinfo); clear(); free(pthis); #ifdef NEW_HELP helpmode=oldhelpmode; #endif return 0; }
int multi_getdata(int line, int col, int maxcol, char *prompt, char *buf, int len, int maxline, int clearlabel, int textmode) { int ch, x, y, startx, starty, now, i, j, k, i0, chk, cursorx, cursory; char savebuffer[25][LINELEN*3]; bool init=true; char tmp[1024]; extern int RMSG; /*************stiger************ * textmode 0 : ctrl+q换行,enter发表 * textmode 1 : enter换行,ctrl+w发送 *********************************/ if (uinfo.mode!=MSGING && uinfo.mode != POSTTMPL) ingetdata = true; if (clearlabel == true) { buf[0] = 0; } move(line, col); if (prompt) prints("%s", prompt); getyx(&starty, &startx); now = strlen(buf); for (i=0; i<=24; i++) saveline(i, 0, savebuffer[i]); strncpy(tmp, buf, 1024); tmp[1023]=0; cursory = starty; cursorx = startx; while (1) { y = starty; x = startx; move(y, x); chk = 0; if (now==0) { cursory = y; cursorx = x; } for (i=0; i<strlen(buf); i++) { if (chk) chk=0; else if (buf[i]<0) chk=1; if (chk&&x>=maxcol) x++; if (buf[i]!=13&&buf[i]!=10) { if (x>maxcol) { clrtoeol(); x = 0; y++; if (y>=scr_lns) { scroll(); starty--; cursory--; y--; } move(y, x); } if (init) prints("\x1b[4m"); prints("%c", buf[i]); resetcolor(); x++; } else { clrtoeol(); x = 0; y++; if (y>=scr_lns) { scroll(); starty--; cursory--; y--; } move(y, x); } if (i==now-1) { cursory = y; cursorx = x; } } clrtoeol(); move(cursory, cursorx); ch = igetkey(); if (textmode == 0) { if ((ch == '\n' || ch == '\r')) break; } else { if (ch == Ctrl('W')) break; } for (i=starty; i<=y; i++) saveline(i, 1, savebuffer[i]); if (true == RMSG && (KEY_UP == ch || KEY_DOWN == ch) && (!buf[0])) { ingetdata = false; return -ch; } if (true == UPDOWN && (KEY_UP == ch || KEY_DOWN == ch)) { ingetdata = false; return -ch; } #if 0 //#ifdef NINE_BUILD if (RMSG && (ch == Ctrl('Z')) && (!buf[0])) { ingetdata = false; return -ch; } #endif #ifdef CHINESE_CHARACTER if (ch == Ctrl('R')) { init=false; SET_CHANGEDEFINE(getCurrentUser(), DEF_CHCHAR); continue; } #endif switch (ch) { case KEY_ESC: init=true; strncpy(buf, tmp, Min(len,STRLEN)); buf[Min(len,1024-1)]=0; now=strlen(buf); break; case Ctrl('W'): case Ctrl('Q'): case '\n': case '\r': if (init) { init=false; buf[0]=0; now=0; } if (UPDOWN) break; if (y-starty+1<maxline) { for (i=strlen(buf)+1; i>now; i--) buf[i]=buf[i-1]; buf[now++]='\n'; } break; case KEY_UP: init=false; if (cursory>starty) { y = starty; x = startx; chk = 0; if (y==cursory-1&&x<=cursorx) now=0; for (i=0; i<strlen(buf); i++) { if (chk) chk=0; else if (buf[i]<0) chk=1; if (chk&&x>=maxcol) x++; if (buf[i]!=13&&buf[i]!=10) { if (x>maxcol) { x = col; y++; } x++; } else { x = col; y++; } #ifdef CHINESE_CHARACTER if (!DEFINE(getCurrentUser(), DEF_CHCHAR)||!chk) #endif if (y==cursory-1&&x<=cursorx) now=i+1; } } break; case KEY_DOWN: init=false; if (cursory<y) { y = starty; x = startx; chk = 0; if (y==cursory+1&&x<=cursorx) now=0; for (i=0; i<strlen(buf); i++) { if (chk) chk=0; else if (buf[i]<0) chk=1; if (chk&&x>=maxcol) x++; if (buf[i]!=13&&buf[i]!=10) { if (x>maxcol) { x = col; y++; } x++; } else { x = col; y++; } #ifdef CHINESE_CHARACTER if (!DEFINE(getCurrentUser(), DEF_CHCHAR)||!chk) #endif if (y==cursory+1&&x<=cursorx) now=i+1; } } break; case '\177': case Ctrl('H'): if (init) { init=false; buf[0]=0; now=0; } if (now>0) { for (i=now-1; i<strlen(buf); i++) buf[i]=buf[i+1]; now--; #ifdef CHINESE_CHARACTER if (DEFINE(getCurrentUser(), DEF_CHCHAR)) { chk = 0; for (i=0; i<now; i++) { if (chk) chk=0; else if (buf[i]<0) chk=1; } if (chk) { for (i=now-1; i<strlen(buf); i++) buf[i]=buf[i+1]; now--; } } #endif } break; case KEY_DEL: if (init) { init=false; buf[0]=0; now=0; } if (now<strlen(buf)) { #ifdef CHINESE_CHARACTER if (DEFINE(getCurrentUser(), DEF_CHCHAR)) { chk = 0; for (i=0; i<now+1; i++) { if (chk) chk=0; else if (buf[i]<0) chk=1; } if (chk) for (i=now; i<strlen(buf); i++) buf[i]=buf[i+1]; } #endif for (i=now; i<strlen(buf); i++) buf[i]=buf[i+1]; } break; case KEY_LEFT: init=false; if (now>0) { now--; #ifdef CHINESE_CHARACTER if (DEFINE(getCurrentUser(), DEF_CHCHAR)) { chk = 0; for (i=0; i<now; i++) { if (chk) chk=0; else if (buf[i]<0) chk=1; } if (chk) now--; } #endif } break; case KEY_RIGHT: init=false; if (now<strlen(buf)) { now++; #ifdef CHINESE_CHARACTER if (DEFINE(getCurrentUser(), DEF_CHCHAR)) { chk = 0; for (i=0; i<now; i++) { if (chk) chk=0; else if (buf[i]<0) chk=1; } if (chk) now++; } #endif } break; case KEY_HOME: case Ctrl('A'): init=false; now--; while (now>=0&&buf[now]!='\n'&&buf[now]!='\r') now--; now++; break; case KEY_END: case Ctrl('E'): init=false; while (now<strlen(buf)&&buf[now]!='\n'&&buf[now]!='\r') now++; break; case KEY_PGUP: init=false; now=0; break; case KEY_PGDN: init=false; now = strlen(buf); break; case Ctrl('Y'): if (init) { init=false; buf[0]=0; now=0; } i0 = strlen(buf); i=now-1; while (i>=0&&buf[i]!='\n'&&buf[i]!='\r') i--; i++; if (!buf[i]) break; j=now; while (j<i0-1&&buf[j]!='\n'&&buf[j]!='\r') j++; if (j>=i0-1) j=i0-1; j=j-i+1; if (j<0) j=0; for (k=0; k<i0-i-j+1; k++) buf[i+k]=buf[i+j+k]; y = starty; x = startx; chk = 0; if (y==cursory&&x<=cursorx) now=0; for (i=0; i<strlen(buf); i++) { if (chk) chk=0; else if (buf[i]<0) chk=1; if (chk&&x>=maxcol) x++; if (buf[i]!=13&&buf[i]!=10) { if (x>maxcol) { x = col; y++; } x++; } else { x = col; y++; } #ifdef CHINESE_CHARACTER if (!DEFINE(getCurrentUser(), DEF_CHCHAR)||!chk) #endif if (y==cursory&&x<=cursorx) now=i+1; } if (now>strlen(buf)) now=strlen(buf); break; default: if (isprint2(ch)&&strlen(buf)<len-1) { if (init) { init=false; buf[0]=0; now=0; } for (i=strlen(buf)+1; i>now; i--) buf[i]=buf[i-1]; buf[now++]=ch; y = starty; x = startx; chk = 0; for (i=0; i<strlen(buf); i++) { if (chk) chk=0; else if (buf[i]<0) chk=1; if (chk&&x>=maxcol) x++; if (buf[i]!=13&&buf[i]!=10) { if (x>maxcol) { x = col; y++; } x++; } else { x = col; y++; } } if (y-starty+1>maxline) { for (i=now-1; i<strlen(buf); i++) buf[i]=buf[i+1]; now--; } } init=false; break; } } ingetdata = false; return y-starty+1; }