📄 terminal.c
字号:
for (i=0;i<10;i++){ if (DeviceInit[CurrentTerm.Device-1][i] >= 0){ if (DeviceInit[CurrentTerm.Device-1][i] == 0) strcpy(Temp, Strings[InitStr0]); else strcpy(Temp, Strings[InitStr1+DeviceInit[CurrentTerm.Device-1][i]-1]); ReplaceM(Temp); mwriteblock(Temp, strlen(Temp)); } if (charwaiting() == TRUE){ BytesRead = mreadblock((char *)&CurrentBuffer[CurrentBufferFilled], 128-CurrentBufferFilled); for (j=CurrentBufferFilled;j<CurrentBufferFilled+BytesRead;j++) if (CurrentBuffer[j] != '\r') swaddch(Screen, CurrentBuffer[j]); if (BytesRead == 128) CurrentBufferFilled = 0; wrefresh(Screen); } } Emupos = 0; Quit = 0; Warned = 0; CurrentBufferFilled = 0; time(&Time); LastTime = Time; Ansi = 1; Avatar = 1; vt100 = 0; strcpy(EMSI_CHT+1, "**EMSI_CHTF5D4\15"); strcpy(EMSI_TCH+1, "**EMSI_TCH3C60\15"); strcpy(EMSI_ACK+1, "**EMSI_ACKA490\15"); EMSI_CHT[0]=0; EMSI_TCH[0]=0; EMSI_ACK[0]=0; strcpy(RingStr, Strings[Ring]); ReplaceM(RingStr); RING[0]=strlen(RingStr); RING[1]=0; CaptureOn = 0; CurrentEntry = NULL; PhonebookChanged = 0; Remote = newwin(LINES/2, COLS, 0, 0); Local = newwin(LINES/2-1, COLS, LINES/2+1, 0); textAttr(Remote, Integers[cRemote]); textAttr(Local, Integers[cLocal]); wbkgdset(Remote, ' ' | Remote->_attrs); wbkgdset(Local, ' ' | Local->_attrs); wmove(Remote, 0, 0); wmove(Local, 0, 0); scrollok(Remote, TRUE); scrollok(Local, TRUE); clearok(Remote, TRUE); clearok(Local, TRUE); CurrentTerm.Password[0] = 5; strcpy(CurrentTerm.Password+1, "Nopwd"); j=0; if (NameOfDialEntry != NULL) CommandLineDialer(); if (DialIndex > 0) CommandLineIndexDialer(); if (NameOfDialEntry != NULL || DialIndex > 0){ Dialer(TermHeader.Num); clearok(Screen, TRUE); redrawwin(Screen); wrefresh(Screen); } if (Integers[StartInPhone]) Phone(); while (!Quit){ if (chwait() == TRUE){ Key = getEscChar(); CommandKey = 1; switch(Key){ case KEY_HOME: if (Online){ Integers[StatusStartOn]++; if (Integers[StatusStartOn] == 3) Integers[StatusStartOn] = 0; } else{ Integers[StatusStartOff]++; if (Integers[StatusStartOff] == 3) Integers[StatusStartOff] = 0; } PrintStatus(); break; case KEY_END: if (Online){ Integers[StatusEndOn]++; if (Integers[StatusEndOn] == 2) Integers[StatusEndOn] = 0; } if (Offline){ Integers[StatusEndOff]++; if (Integers[StatusEndOff] == 1) Integers[StatusEndOff] = 0; } PrintStatus(); break; case KEY_PPAGE: Upload(); break; case KEY_NPAGE: Download(); break; case KEY_UP: if (Ansi == 1 || vt100 == 1) { msendchar(0x1B); msendchar('['); msendchar('A'); } else if (Avatar == 1) { msendchar(3); } break; case KEY_DOWN: if (Ansi == 1 || vt100 == 1) { msendchar(0x1B); msendchar('['); msendchar('B'); } else if (Avatar == 1) { msendchar(4); } break; case KEY_RIGHT: if (Ansi == 1 || vt100 == 1) { msendchar(0x1B); msendchar('['); msendchar('C'); } else if (Avatar == 1) { msendchar(6); } break; case KEY_LEFT: if (Ansi == 1 || vt100 == 1) { msendchar(0x1B); msendchar('['); msendchar('D'); } else if (Avatar == 1) { msendchar(5); } break; case KEY_F(1): case KEY_F(2): case KEY_F(3): case KEY_F(4): case KEY_F(5): case KEY_F(6): case KEY_F(7): case KEY_F(8): case KEY_F(9): case KEY_F(10): for (j=1;j<11;j++) if (Key == KEY_F(j)){ strcpy(Temp, Strings[Macro1+j-1]); MacroParser(Temp, Strings[User1+CurrentTerm.User-1], CurrentTerm.Password); mwriteblock(Temp, strlen(Temp)); } break; case 27: Key = getEscChar(); if (Integers[EscType] == 0) if (Key > 64 && Key < 91) Key -= 64; else if (Key > 96 && Key < 123) Key -= 96; CommandKey = 1; if (Key == 25){ if (EMSI_CHT[0] != 15){ EMSI_CHT[0] = 15; mwriteblock(EMSI_CHT+1, 15); wmove(Remote, 0 ,0); wmove(Local, 0, 0); textAttr(Remote, Integers[cRemote]); textAttr(Local, Integers[cLocal]); wbkgdset(Remote, ' ' | Remote->_attrs); wbkgdset(Local, ' ' | Local->_attrs); werase(Remote); werase(Local); wrefresh(Remote); wrefresh(Local); } else { EMSI_CHT[0]=0; EMSI_TCH[0]=15; mwriteblock(EMSI_TCH+1, 15); clearok(Screen, TRUE); redrawwin(Screen); wrefresh(Screen); } } else if (EMSI_CHT[0] != 15) switch(Key){ case 1: Help(); break; case 2: Scrl = ScrollStart; for (j=0;j<LINES;j++) for (k=0;k<COLS;k++) mvwaddch(ScrollScreen, j, k, *Scrl++); Scrl = ScrollStart; clearok(ScrollScreen, TRUE); redrawwin(ScrollScreen); wrefresh(ScrollScreen); while (Key != ' '){ Key = getEscChar(); switch(Key){ case 't': case 'T': Tagger(ScrollScreen); break; case 27: Key = getEscChar(); if (Key == 9){ nl(); ImageSave(ScrollScreen); nonl(); } break; case KEY_DOWN: if (Scrl+(LINES-1)*COLS<ScrollBuffer+ScrollBackLength) Scrl += COLS; break; case KEY_UP: if (Scrl>ScrollBuffer) Scrl -= COLS; break; case KEY_HOME: HOME: Scrl = ScrollBuffer; break; case KEY_END: END: Scrl = ScrollBuffer+ScrollBackLength-(LINES-1)*COLS; break; case KEY_PPAGE: if (Scrl>=ScrollBuffer+(LINES-1)*COLS) Scrl -= (LINES-1)*COLS; else goto HOME; break; case KEY_NPAGE: if (Scrl+(LINES-1)*COLS*2<ScrollBuffer+ScrollBackLength) Scrl += (LINES-1)*COLS; else goto END; break; default:break; } for (j=0;j<LINES-1;j++) for (k=0;k<COLS;k++) mvwaddch(ScrollScreen, j, k, *(Scrl+j*COLS+k)); wrefresh(ScrollScreen); } redrawwin(Screen); wrefresh(Screen); break; case 3: swclear(Screen); swmove(Screen, 0, 0); wrefresh(Screen); break; case 4: Phone(); break; case 5: CurrentTerm.LocalEcho ^= 1; Integers[GlobalLocalEcho] ^= 1; ShowEcho(); break; case 8: if (Integers[AskOnHang]){ nl(); curs_set(0); if (ChooseYesno(Screen, " Hangup? ")) Hangup(); curs_set(1); nonl(); } else Hangup(); break; case 9: nl(); ImageSave(Screen); nonl(); break; case 12: nl(); OpenCapture(Screen); nonl(); break; case 14: curs_set(0); SendTags(); curs_set(1); break; case 16: nl(); curs_set(0); ChangeDevice(); curs_set(1); nonl(); break; case 17: if (Integers[AskOnExit]){ nl(); curs_set(0); Quit = ChooseYesno(Screen, " Exit without closing port? "); curs_set(1); nonl(); } else Quit=1; ClosePort = Quit ^ 1; break; case 18: CurrentTerm.StripHigh ^= 1; Integers[GlobalStripHigh] ^= 1; ShowStrip(); break; case 20: nl(); curs_set(0); CurrentTerm.Terminal = ChooseTerminal(Screen, CurrentTerm.Terminal); curs_set(1); nonl(); SetTerminal(); wrefresh(Screen); break; case 22: Tagger(Screen); break; case 23: nl(); curs_set(0); Setup(); InitVars(); curs_set(1); nonl(); break; case 24: if (Integers[AskOnExit]){ nl(); curs_set(0); Quit = ChooseYesno(Screen, " Exit? "); curs_set(1); nonl(); } else Quit = 1; break; case 26: SendBreak(); break; default: CommandKey = 0; break; } break; default: CommandKey = 0; break; } if (!CommandKey) if (EMSI_CHT[0] != 15){ if (Integers[CaptureKeys] && CaptureOn) write(CaptureHandle, &Key, 1); if (Key == KEY_BACKSPACE) Key = '\b'; if (CurrentTerm.LocalEcho){ if (Key == '\r') swaddch(Screen, '\n'); else if (Key != '\b') swaddch(Screen, Key); } msendchar(Key); } else { if (Key == KEY_BACKSPACE || Key == '\b'){ getyx(Local, k, j); if (j>0){ j--; wmove(Local, k, j); if (CurrentTerm.RcvdBSdest){ waddch(Local, ' '); wmove(Local, k, j); } wrefresh(Local); msendchar('\b'); } } else { if (Key != '\r') waddch(Local, Key); else{ waddch(Local, '\n'); msendchar('\r'); Key = '\n'; } msendchar(Key); } } } if (CAR && !Online){ Online = 1; Offline = 0; time(&Starttime); SetTerminal(); if (CurrentTerm.Device != Device){ resetModem(); closeModem(); unlock(Strings[Device1+Device-1]); Device = CurrentTerm.Device; initModem(Strings[Device1+Device-1], Integers[Bauds1+Device-1]); setparms(CurrentTerm.Baud, CurrentTerm.Parity, CurrentTerm.Databits, CurrentTerm.Stopbits, Integers[FlowCtrl1+Device-1]); } Printlogln("Online"); Warned = 0; } if (!CAR && Online){ Online = 0; Offline = 1; CurrentTerm.Parity = Integers[Parities1+CurrentTerm.Device-1]; CurrentTerm.Baud = Integers[Bauds1+CurrentTerm.Device-1]; CurrentTerm.Stopbits = Integers[Stopbits1+CurrentTerm.Device-1]; CurrentTerm.Databits = Integers[Databits1+CurrentTerm.Device-1]; strncpy(CurrentTerm.Name+1,"Manual mode", 11); setparms(CurrentTerm.Baud, CurrentTerm.Parity, CurrentTerm.Databits, CurrentTerm.Stopbits, Integers[FlowCtrl1+CurrentTerm.Device-1]); CurrentTerm.Name[0] = 11; Printlogln("Offline"); Warned = 0; if (CaptureOn){ write(CaptureHandle, CaptureStart, CapturePtr-CaptureStart); close(CaptureHandle); } CaptureOn = 0; if (CurrentEntry != NULL){ CurrentEntry->Connects++; CurrentEntry->SecUsed+=Time-Starttime; CurrentEntry->Calcmin=(Time-Starttime) / 60; CurrentEntry = NULL; PhonebookChanged = 1; } if (Integers[PhoneBookOnDrop]) Phone(); } if (charwaiting() == TRUE){ BytesRead = mreadblock((char *)&CurrentBuffer[CurrentBufferFilled], 128-CurrentBufferFilled); j+=BytesRead; if (Integers[SaveControl] && CaptureOn){ write(CaptureHandle, &CurrentBuffer[CurrentBufferFilled], BytesRead); } CurrentBufferFilled += BytesRead; for (BufferCounter=CurrentBufferFilled-BytesRead;BufferCounter<CurrentBufferFilled;BufferCounter++) { if (CurrentTerm.StripHigh) CurrentBuffer[BufferCounter] &= 0x7F; if (EMSI_CHT[0] == 15){ if (EMSI_TCH[EMSI_TCH[0]+1] == CurrentBuffer[BufferCounter]) EMSI_TCH[0]++; else EMSI_TCH[0]=0; if (CurrentBuffer[BufferCounter] != '\r') waddch(Remote, CurrentBuffer[BufferCounter]); wrefresh(Remote); wrefresh(Local); if (EMSI_TCH[0] == 15){ EMSI_CHT[0]=0; clearok(Screen, TRUE); redrawwin(Screen); wrefresh(Screen); } } else { EmulationReturn[0]=SEND; EmulationReturn[1]=SEND; EmulationReturn[2]=SEND; UsedGetChar=0; if (Ansi){ EmulationReturn[0] = ANSI(CurrentBuffer[BufferCounter]); if (EmulationReturn[0] == DUMP) DumpEmu(); } if (Avatar){ EmulationReturn[1] = AVATAR(CurrentBuffer[BufferCounter]); if (EmulationReturn[1] == DUMP) DumpEmu(); if (UsedGetChar) BufferCounter--; } if (vt100){ EmulationReturn[2] = VT100(CurrentBuffer[BufferCounter]); if (EmulationReturn[2] == DUMP) DumpEmu(); } if ((Ansi && EmulationReturn[0] == SAVE) || (Avatar && EmulationReturn[1] == SAVE) || (vt100 && EmulationReturn[2] == SAVE)){ Emu[Emupos++] = CurrentBuffer[BufferCounter]; if (Emupos == 20) DumpEmu(); } if (EmulationReturn[0] == SEND && EmulationReturn[1] == SEND && EmulationReturn[2] == SEND){ for (j=0;j<5;j++){ if (Signature[j][Signature[j][1]+2] == CurrentBuffer[BufferCounter]) Signature[j][1]++; else Signature[j][1]=0; if (Signature[j][0] == Signature[j][1] && Signature[j][0] != 0){ AutoDownload(j); } } if (*(RingStr+RING[1]) == CurrentBuffer[BufferCounter]) RING[1]++; else RING[1]=0; if (EMSI_CHT[EMSI_CHT[0]+1]==CurrentBuffer[BufferCounter]) EMSI_CHT[0]++; else EMSI_CHT[0]=0; if (EMSI_CHT[0] == 15){ werase(Remote); werase(Local); wmove(Remote, 0, 0); wmove(Local, 0, 0); wrefresh(Remote); wrefresh(Local); mwriteblock(EMSI_ACK, 15); } if (CurrentBuffer[BufferCounter] == '\b'){ getyx(Screen, k, j); if (j>0){ j--; wmove(Screen, k, j); if (CurrentTerm.RcvdBSdest){ waddch(Screen, ' '); wmove(Screen, k, j); } } } else if (CurrentBuffer[BufferCounter] != '\r' && CurrentBuffer[BufferCounter] != '\n') swaddch(Screen, CurrentBuffer[BufferCounter]); if (CurrentBuffer[BufferCounter] == '\n'){ getyx(Screen, y, x); x = 0; if (y < LINES-2){ y++; swmove(Screen, y, x); } else swaddch(Screen, '\n'); } } } } if (charwaiting() == FALSE && EMSI_CHT[0] != 15 || CurrentBufferFilled == 128){ wrefresh(Screen); } } if (CurrentBufferFilled == 128){ CurrentBufferFilled = 0; } time(&Time); if (Time != LastTime || LastStatus != linestatus()){ PrintStatus(); if ((Time-Starttime) / 60 >= Integers[OnlineWarn] && Online && !Warned) WarnOnline(); LastTime = Time; LastStatus = linestatus(); } if (RNG && RING[0] == RING[1]){ RING[1]=0; linestatus(); strcpy(Temp, Strings[AutoAnswerStr]); ReplaceM(Temp); if (Integers[AutoAnswer]){ mwriteblock(Temp, strlen(Temp)); } else { nl(); curs_set(0); if (ChooseYesno(Screen, "Answer incomming call?") == 1) mwriteblock(Temp, strlen(Temp)); RNG = 0; curs_set(1); nonl(); } } } delwin(Local); delwin(Remote); Printlogln("End"); CloseLog(); if (CaptureOn){ write(CaptureHandle, CaptureStart, CapturePtr-CaptureStart); close(CaptureHandle); } if (ClosePort) sethup(TRUE); else sethup(FALSE); if (PhonebookChanged) switch(WhichBook){ case 0: if (WriteTerminate(CurrentPhonebook) < 0) WindowError(PhoneScreen, "Unable to write phonebook"); break; case 1: if (WriteTelix(CurrentPhonebook) < 0) WindowError(PhoneScreen, "Unable to write phonebook"); break; default:break; }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -