| // MorgenGrauen MUDlib |
| // |
| // more.c -- more files |
| // |
| // $Id: more.c 9142 2015-02-04 22:17:29Z Zesstra $ |
| |
| #pragma strict_types |
| #pragma save_types |
| #pragma no_clone |
| #pragma range_check |
| |
| inherit "/std/util/pager"; |
| |
| #include <pager.h> |
| |
| #ifdef GERMAN |
| # define MSG_WRAPPED " VOM ANFANG" |
| # define MSG_NOT_FOUND " NICHTS GEFUNDEN" |
| # define MSG_NO_REGX " FEHLENDER REG. AUSDRUCK" |
| # define MSG_ILLEGAL " ILLEGALE ZEILENZAHL" |
| # define MSG_HELP "\ |
| Hilfe fuer more:\n\ |
| \n\ |
| b,B -- Eine Seite zurueck.\n\ |
| u,U -- Eine halbe Seite zurueck.\n\ |
| f,F -- Eine Seite vorwaerts.\n\ |
| d,D -- Eine halbe Seite vorwaerts.\n\ |
| <Zeile> -- Springe zu Zeile <Zeile>\n\ |
| q,x -- Verlassen von more.\n\ |
| /<RegExp> -- Nach dem regulaeren Ausdruck <RegExp> suchen.\n" |
| #else |
| # define MSG_WRAPPED " WRAPPED" |
| # define MSG_NOT_FOUND " NOTHING FOUND" |
| # define MSG_NO_REGX " NO PREV REGULAR EXPR" |
| # define MSG_ILLEGAL " ILLEGAL LINE NUMBER" |
| # define MSG_HELP "\ |
| Help for more:\n\ |
| \n\ |
| b,B -- One page back.\n\ |
| u,U -- Half a page back.\n\ |
| f,F -- One page forward.\n\ |
| d,D -- Half a page forward.\n\ |
| <line> -- Jump to line number <line>\n\ |
| q,x -- Quit or eXit more.\n\ |
| /<regexp> -- Search for the regular expression <regexp>.\n" |
| #endif |
| |
| private nosave string cprompt = ""; |
| |
| string prompt(mixed pinfo, string add) |
| { |
| int line,max; max = 1; |
| if(pointerp(pinfo)) |
| { |
| if(pinfo[CURL] + pinfo[PAGE] >= pinfo[MAXL]) line = pinfo[MAXL]; |
| else line = pinfo[CURL] + pinfo[PAGE]; |
| max = pinfo[MAXL]; |
| } |
| if (pinfo[FLAG] & E_ABS) |
| return sprintf("%s (%d/%d)%s %s", |
| ::prompt(pinfo, ""), |
| line-1, pinfo[MAXL], |
| cprompt, stringp(add)?add:""); |
| else |
| return sprintf("%s(%d%%)%s %s", |
| ::prompt(pinfo, ""), |
| line*100/max, |
| cprompt, stringp(add)?add:""); |
| } |
| |
| int search(mixed pinfo) |
| { |
| int l, lines; |
| mixed tmp; |
| l = pinfo[CURL]; |
| while((tmp = fread(pinfo, l, pinfo[PAGE])) && |
| !sizeof(regexp(old_explode(tmp, "\n"), pinfo[REGX]))) |
| l += pinfo[PAGE]; |
| if(!tmp) |
| { |
| cprompt += MSG_WRAPPED; |
| l = 1; |
| while(l < pinfo[CURL] && |
| (tmp = fread(pinfo, l, pinfo[PAGE])) && |
| !sizeof(regexp(old_explode(tmp, "\n"), pinfo[REGX]))) |
| l += pinfo[PAGE]; |
| if(l >= pinfo[CURL]) return 0; |
| } |
| return l; |
| } |
| |
| varargs int eval_command(mixed in, mixed pinfo) |
| { |
| cprompt = ""; |
| if(stringp(in)) |
| switch(in) |
| { |
| case "?": |
| write(MSG_HELP+"\n"); |
| return 0; |
| case "b": |
| case "B": |
| pinfo[CURL] -= pinfo[PAGE]; |
| break; |
| case "u": |
| case "U": |
| pinfo[CURL] -= pinfo[PAGE] / 2; |
| break; |
| case "f": |
| case "F": |
| pinfo[CURL] += pinfo[PAGE]; |
| break; |
| case "d": |
| case "D": |
| pinfo[CURL] += pinfo[PAGE] / 2; |
| break; |
| default: |
| { |
| int l; |
| if(l = to_int(in)) |
| { |
| if(l > pinfo[MAXL] || l < 1) return (cprompt = MSG_ILLEGAL, 0); |
| pinfo[CURL] = l; |
| break; |
| } |
| if(sizeof(in) && in[0] == '/') |
| { |
| if(sizeof(in) == 1) |
| { |
| if(!pinfo[REGX]) return (cprompt = MSG_NO_REGX, 0); |
| } |
| else pinfo[REGX] = in[1..]; |
| if(l = search(pinfo)) pinfo[CURL] = l; |
| else return (cprompt = MSG_NOT_FOUND, 0); |
| } |
| else return ::eval_command(in, pinfo); |
| break; |
| } |
| } |
| else return ::eval_command(in, pinfo); |
| return ::eval_command(-1, pinfo); |
| } |