void msg() { int x, y; int tmpansi; tmpansi = showansi; showansi = 1; getyx(&x, &y); msgline(); signal(SIGALRM, msg); move(x, y); refresh(); alarm(60); showansi = tmpansi; }
static void near zuzeile (void) //************************************************************************* // //************************************************************************* { char linstr[12]; int l; linstr[0] = 0; if (inputwin("Goto", "Line:", linstr, 10) != ESC) l = atoi(linstr); if (l > 0) gotoline(l-1, 0); else msgline("Invalid line number"); }
static void near contsearch (void) //************************************************************************* // // Sucht nach 'searchstr' und baut den Bildschirm an der gefundenen // Position neu auf // //************************************************************************* { int count = 0; int slines = e->curline; unsigned sindex = e->readindex; int found = 0; int size = strlen(searchstr); unsigned i = linelength(e->readindex); if (e->curcol > i) i += e->readindex - 1; else i = e->readindex + e->curcol + 1; while (i < e->maxbuf) { while (((buf[i+count] ^ searchstr[count]) & 0x5f) == 0) count++; if (count == size) { found++; break; } count = 0; if (buf[i++] == LF) { slines++; sindex = i; } } if (found) { e->curcol = i-sindex; gotoline(slines, 0); testxoffset(); } else msgline("Pattern not found"); }
static void near gotoline (int line, int immer) //************************************************************************* // // Springt zur angegebenen Zeilennummer // // Dabei wird die momentane Cursorposition beruecksichtigt und der // Bildschirm nur neu aufgebaut, wenn die Position ausserhalb liegt. // //************************************************************************* { unsigned i = 0, ok = 1; unsigned max = e->maxbuf; unsigned zeilenzaehler = 0; unsigned yl = e->ylen-1; if (! immer) { if (line == e->curline); // **** Alte Zeile gleich neue Zeile -> nichts machen else if ((line > e->curline) && (line < (e->curline+(yl-1-e->readlines)))) e->readlines += line-e->curline; // **** Neue Zeile unterhalb alter Zeile, aber am gleichen Bildschirm else if ((line < e->curline) && (line > (e->curline-e->readlines))) e->readlines -= e->curline-line; // **** Neue Zeile oberhalb alter Zeile, aber am gleichen Bildschirm else if (line < (yl-2)) { e->index = 0; e->readlines = e->curline=line; // **** Neue Zeile auf der ersten Bildschirmseite im Buffer } else if ((line > (e->maxlines-yl-1)) && (line<e->maxlines)) { e->readindex = e->index = e->maxbuf; e->curline = e->maxlines; lineminus(yl-2); e->readlines = (yl-2-(e->maxlines-line)); // **** Neue Zeile auf der letzten Bildschirmseite im Buffer } else ok = 0; } if (immer || ! ok) { // **** Neue Zeile liegt ganz wo anders im Buffer, Zeile suchen while (i < max) { if (buf[i++] == LF) { zeilenzaehler++; if (zeilenzaehler == line) break; } } if (i >= max) // Zeilennummer nicht gefunden (zu hoch) { msgline("Line not found"); line = zeilenzaehler; // go to last line while (i && buf[i] != LF) i--; } e->index = e->readindex = i; // zur gefundenen Stelle springen if (immer == 2) { e->readlines = yl-1; } else { e->curline = line+(yl/2); // BS-Start wird zurueckgesetzt lineminus(yl/2); // damit die Stelle in Bildmitte kommt e->readlines = yl/2; // Cursor in Bildmitte setzen } } e->curline=line; // Neue Zeile uebernehmen calcrlines(); // Zeiger reorganisieren }