skylib_fluffos_v3/
skylib_fluffos_v3/bin/
skylib_fluffos_v3/bin/db/
skylib_fluffos_v3/fluffos-2.9-ds2.04/
skylib_fluffos_v3/fluffos-2.9-ds2.04/ChangeLog.old/
skylib_fluffos_v3/fluffos-2.9-ds2.04/Win32/
skylib_fluffos_v3/fluffos-2.9-ds2.04/compat/
skylib_fluffos_v3/fluffos-2.9-ds2.04/compat/simuls/
skylib_fluffos_v3/fluffos-2.9-ds2.04/include/
skylib_fluffos_v3/fluffos-2.9-ds2.04/testsuite/
skylib_fluffos_v3/fluffos-2.9-ds2.04/testsuite/clone/
skylib_fluffos_v3/fluffos-2.9-ds2.04/testsuite/command/
skylib_fluffos_v3/fluffos-2.9-ds2.04/testsuite/data/
skylib_fluffos_v3/fluffos-2.9-ds2.04/testsuite/etc/
skylib_fluffos_v3/fluffos-2.9-ds2.04/testsuite/include/
skylib_fluffos_v3/fluffos-2.9-ds2.04/testsuite/inherit/
skylib_fluffos_v3/fluffos-2.9-ds2.04/testsuite/inherit/master/
skylib_fluffos_v3/fluffos-2.9-ds2.04/testsuite/log/
skylib_fluffos_v3/fluffos-2.9-ds2.04/testsuite/single/
skylib_fluffos_v3/fluffos-2.9-ds2.04/testsuite/single/tests/compiler/
skylib_fluffos_v3/fluffos-2.9-ds2.04/testsuite/single/tests/efuns/
skylib_fluffos_v3/fluffos-2.9-ds2.04/testsuite/single/tests/operators/
skylib_fluffos_v3/fluffos-2.9-ds2.04/testsuite/u/
skylib_fluffos_v3/fluffos-2.9-ds2.04/tmp/
skylib_fluffos_v3/fluffos-2.9-ds2.04/windows/
skylib_fluffos_v3/mudlib/
skylib_fluffos_v3/mudlib/cmds/
skylib_fluffos_v3/mudlib/cmds/admin/
skylib_fluffos_v3/mudlib/cmds/guild-race/
skylib_fluffos_v3/mudlib/cmds/living/broken/
skylib_fluffos_v3/mudlib/cmds/player/group_cmds/
skylib_fluffos_v3/mudlib/cmds/playtester/
skylib_fluffos_v3/mudlib/d/admin/
skylib_fluffos_v3/mudlib/d/admin/room/
skylib_fluffos_v3/mudlib/d/admin/room/we_care/
skylib_fluffos_v3/mudlib/d/admin/save/
skylib_fluffos_v3/mudlib/d/admin/text/
skylib_fluffos_v3/mudlib/d/learning/TinyTown/buildings/
skylib_fluffos_v3/mudlib/d/learning/TinyTown/map/
skylib_fluffos_v3/mudlib/d/learning/TinyTown/roads/
skylib_fluffos_v3/mudlib/d/learning/chars/
skylib_fluffos_v3/mudlib/d/learning/functions/
skylib_fluffos_v3/mudlib/d/learning/handlers/
skylib_fluffos_v3/mudlib/d/learning/help_topics/
skylib_fluffos_v3/mudlib/d/learning/help_topics/npcs/
skylib_fluffos_v3/mudlib/d/learning/help_topics/objects/
skylib_fluffos_v3/mudlib/d/learning/help_topics/rcs_demo/
skylib_fluffos_v3/mudlib/d/learning/help_topics/rcs_demo/RCS/
skylib_fluffos_v3/mudlib/d/learning/help_topics/rooms/
skylib_fluffos_v3/mudlib/d/learning/help_topics/rooms/crowd/
skylib_fluffos_v3/mudlib/d/learning/help_topics/rooms/situations/
skylib_fluffos_v3/mudlib/d/learning/save/
skylib_fluffos_v3/mudlib/d/learning/school/
skylib_fluffos_v3/mudlib/d/learning/school/add_sc/
skylib_fluffos_v3/mudlib/d/learning/school/characters/
skylib_fluffos_v3/mudlib/d/learning/school/general/
skylib_fluffos_v3/mudlib/d/learning/school/getting-started/
skylib_fluffos_v3/mudlib/d/learning/school/getting-started/basic_commands/
skylib_fluffos_v3/mudlib/d/learning/school/getting-started/edtutor/
skylib_fluffos_v3/mudlib/d/learning/school/getting-started/unix_tutor/
skylib_fluffos_v3/mudlib/d/learning/school/items/
skylib_fluffos_v3/mudlib/d/learning/school/npc_school/
skylib_fluffos_v3/mudlib/d/learning/school/room_school/
skylib_fluffos_v3/mudlib/d/learning/school/room_school/room_basic/
skylib_fluffos_v3/mudlib/d/learning/school/room_school/situations/
skylib_fluffos_v3/mudlib/d/learning/school/room_school/terrain_tutor/
skylib_fluffos_v3/mudlib/d/learning/text/
skylib_fluffos_v3/mudlib/d/liaison/
skylib_fluffos_v3/mudlib/d/mudlib/
skylib_fluffos_v3/mudlib/d/mudlib/changes/
skylib_fluffos_v3/mudlib/d/playtesters/
skylib_fluffos_v3/mudlib/d/playtesters/effects/
skylib_fluffos_v3/mudlib/d/playtesters/handlers/
skylib_fluffos_v3/mudlib/d/playtesters/items/
skylib_fluffos_v3/mudlib/d/sage/
skylib_fluffos_v3/mudlib/doc/
skylib_fluffos_v3/mudlib/doc/creator/
skylib_fluffos_v3/mudlib/doc/driver/
skylib_fluffos_v3/mudlib/doc/driver/efuns/arrays/
skylib_fluffos_v3/mudlib/doc/driver/efuns/buffers/
skylib_fluffos_v3/mudlib/doc/driver/efuns/calls/
skylib_fluffos_v3/mudlib/doc/driver/efuns/compile/
skylib_fluffos_v3/mudlib/doc/driver/efuns/filesystem/
skylib_fluffos_v3/mudlib/doc/driver/efuns/floats/
skylib_fluffos_v3/mudlib/doc/driver/efuns/functions/
skylib_fluffos_v3/mudlib/doc/driver/efuns/general/
skylib_fluffos_v3/mudlib/doc/driver/efuns/mappings/
skylib_fluffos_v3/mudlib/doc/driver/efuns/mixed/
skylib_fluffos_v3/mudlib/doc/driver/efuns/mudlib/
skylib_fluffos_v3/mudlib/doc/driver/efuns/numbers/
skylib_fluffos_v3/mudlib/doc/driver/efuns/parsing/
skylib_fluffos_v3/mudlib/doc/login/
skylib_fluffos_v3/mudlib/doc/lpc/basic_manual/
skylib_fluffos_v3/mudlib/doc/lpc/intermediate/
skylib_fluffos_v3/mudlib/doc/new/add_command/
skylib_fluffos_v3/mudlib/doc/new/events/
skylib_fluffos_v3/mudlib/doc/new/handlers/
skylib_fluffos_v3/mudlib/doc/new/living/race/
skylib_fluffos_v3/mudlib/doc/new/living/spells/
skylib_fluffos_v3/mudlib/doc/new/object/
skylib_fluffos_v3/mudlib/doc/new/player/
skylib_fluffos_v3/mudlib/doc/new/room/guild/
skylib_fluffos_v3/mudlib/doc/new/room/outside/
skylib_fluffos_v3/mudlib/doc/new/room/storeroom/
skylib_fluffos_v3/mudlib/doc/object/
skylib_fluffos_v3/mudlib/doc/playtesters/
skylib_fluffos_v3/mudlib/doc/policy/
skylib_fluffos_v3/mudlib/doc/weapons/
skylib_fluffos_v3/mudlib/global/
skylib_fluffos_v3/mudlib/global/creator/
skylib_fluffos_v3/mudlib/handlers/
skylib_fluffos_v3/mudlib/include/casino/
skylib_fluffos_v3/mudlib/include/cmds/
skylib_fluffos_v3/mudlib/include/effects/
skylib_fluffos_v3/mudlib/include/npc/
skylib_fluffos_v3/mudlib/include/room/
skylib_fluffos_v3/mudlib/include/shops/
skylib_fluffos_v3/mudlib/net/daemon/
skylib_fluffos_v3/mudlib/net/daemon/chars/
skylib_fluffos_v3/mudlib/net/inherit/
skylib_fluffos_v3/mudlib/net/obj/
skylib_fluffos_v3/mudlib/net/obj/BACKUPS/
skylib_fluffos_v3/mudlib/obj/amulets/
skylib_fluffos_v3/mudlib/obj/armours/plate/
skylib_fluffos_v3/mudlib/obj/b_day/
skylib_fluffos_v3/mudlib/obj/clothes/transport/horse/
skylib_fluffos_v3/mudlib/obj/faith/symbols/
skylib_fluffos_v3/mudlib/obj/fungi/
skylib_fluffos_v3/mudlib/obj/gatherables/
skylib_fluffos_v3/mudlib/obj/instruments/
skylib_fluffos_v3/mudlib/obj/media/
skylib_fluffos_v3/mudlib/obj/misc/player_shop/
skylib_fluffos_v3/mudlib/obj/monster/godmother/
skylib_fluffos_v3/mudlib/obj/monster/transport/
skylib_fluffos_v3/mudlib/obj/rings/
skylib_fluffos_v3/mudlib/obj/scabbards/
skylib_fluffos_v3/mudlib/obj/spells/
skylib_fluffos_v3/mudlib/obj/stationery/
skylib_fluffos_v3/mudlib/obj/stationery/envelopes/
skylib_fluffos_v3/mudlib/obj/toys/
skylib_fluffos_v3/mudlib/obj/vessels/
skylib_fluffos_v3/mudlib/obj/weapons/axes/
skylib_fluffos_v3/mudlib/obj/weapons/chains/
skylib_fluffos_v3/mudlib/obj/weapons/maces/BACKUPS/
skylib_fluffos_v3/mudlib/save/autodoc/
skylib_fluffos_v3/mudlib/save/book_handler/
skylib_fluffos_v3/mudlib/save/books/history/calarien/
skylib_fluffos_v3/mudlib/save/mail/
skylib_fluffos_v3/mudlib/save/new_soul/data/
skylib_fluffos_v3/mudlib/save/parcels/
skylib_fluffos_v3/mudlib/save/playerinfo/
skylib_fluffos_v3/mudlib/save/players/d/
skylib_fluffos_v3/mudlib/save/players/s/
skylib_fluffos_v3/mudlib/save/random_names/
skylib_fluffos_v3/mudlib/save/random_names/data/
skylib_fluffos_v3/mudlib/save/terrains/
skylib_fluffos_v3/mudlib/save/terrains/tutorial_desert/
skylib_fluffos_v3/mudlib/save/terrains/tutorial_grassy_field/
skylib_fluffos_v3/mudlib/save/terrains/tutorial_mountain/
skylib_fluffos_v3/mudlib/save/todo_lists/
skylib_fluffos_v3/mudlib/secure/
skylib_fluffos_v3/mudlib/secure/cmds/admin/
skylib_fluffos_v3/mudlib/secure/cmds/lord/
skylib_fluffos_v3/mudlib/secure/config/
skylib_fluffos_v3/mudlib/secure/handlers/autodoc/
skylib_fluffos_v3/mudlib/secure/handlers/intermud/
skylib_fluffos_v3/mudlib/secure/include/global/
skylib_fluffos_v3/mudlib/secure/save/
skylib_fluffos_v3/mudlib/secure/save/handlers/
skylib_fluffos_v3/mudlib/secure/std/
skylib_fluffos_v3/mudlib/secure/std/classes/
skylib_fluffos_v3/mudlib/secure/std/modules/
skylib_fluffos_v3/mudlib/std/creator/
skylib_fluffos_v3/mudlib/std/dom/
skylib_fluffos_v3/mudlib/std/effects/
skylib_fluffos_v3/mudlib/std/effects/external/
skylib_fluffos_v3/mudlib/std/effects/fighting/
skylib_fluffos_v3/mudlib/std/effects/magic/
skylib_fluffos_v3/mudlib/std/effects/magic/BACKUPS/
skylib_fluffos_v3/mudlib/std/effects/other/BACKUPS/
skylib_fluffos_v3/mudlib/std/effects/priest/
skylib_fluffos_v3/mudlib/std/effects/room/
skylib_fluffos_v3/mudlib/std/environ/
skylib_fluffos_v3/mudlib/std/guilds/
skylib_fluffos_v3/mudlib/std/guilds/old/
skylib_fluffos_v3/mudlib/std/languages/
skylib_fluffos_v3/mudlib/std/liquids/
skylib_fluffos_v3/mudlib/std/npc/
skylib_fluffos_v3/mudlib/std/npc/goals/
skylib_fluffos_v3/mudlib/std/npc/goals/basic/
skylib_fluffos_v3/mudlib/std/npc/goals/misc/
skylib_fluffos_v3/mudlib/std/npc/plans/
skylib_fluffos_v3/mudlib/std/npc/plans/basic/
skylib_fluffos_v3/mudlib/std/npc/types/
skylib_fluffos_v3/mudlib/std/npc/types/helper/
skylib_fluffos_v3/mudlib/std/npcs/
skylib_fluffos_v3/mudlib/std/outsides/
skylib_fluffos_v3/mudlib/std/races/shadows/
skylib_fluffos_v3/mudlib/std/room/basic/BACKUPS/
skylib_fluffos_v3/mudlib/std/room/basic/topography/
skylib_fluffos_v3/mudlib/std/room/controller/
skylib_fluffos_v3/mudlib/std/room/inherit/topography/
skylib_fluffos_v3/mudlib/std/room/topography/area/
skylib_fluffos_v3/mudlib/std/room/topography/iroom/
skylib_fluffos_v3/mudlib/std/room/topography/milestone/
skylib_fluffos_v3/mudlib/std/shadows/curses/
skylib_fluffos_v3/mudlib/std/shadows/disease/
skylib_fluffos_v3/mudlib/std/shadows/fighting/
skylib_fluffos_v3/mudlib/std/shadows/healing/
skylib_fluffos_v3/mudlib/std/shadows/magic/
skylib_fluffos_v3/mudlib/std/shadows/poison/
skylib_fluffos_v3/mudlib/std/shadows/room/
skylib_fluffos_v3/mudlib/std/shops/controllers/
skylib_fluffos_v3/mudlib/std/shops/objs/
skylib_fluffos_v3/mudlib/std/shops/player_shop/
skylib_fluffos_v3/mudlib/std/socket/
skylib_fluffos_v3/mudlib/std/soul/d/
skylib_fluffos_v3/mudlib/std/soul/e/
skylib_fluffos_v3/mudlib/std/soul/i/
skylib_fluffos_v3/mudlib/std/soul/j/
skylib_fluffos_v3/mudlib/std/soul/k/
skylib_fluffos_v3/mudlib/std/soul/l/
skylib_fluffos_v3/mudlib/std/soul/n/
skylib_fluffos_v3/mudlib/std/soul/o/
skylib_fluffos_v3/mudlib/std/soul/q/
skylib_fluffos_v3/mudlib/std/soul/r/
skylib_fluffos_v3/mudlib/std/soul/u/
skylib_fluffos_v3/mudlib/std/soul/v/
skylib_fluffos_v3/mudlib/std/soul/y/
skylib_fluffos_v3/mudlib/std/soul/z/
skylib_fluffos_v3/mudlib/std/stationery/
skylib_fluffos_v3/mudlib/w/
skylib_fluffos_v3/mudlib/w/default/
skylib_fluffos_v3/mudlib/w/default/armour/
skylib_fluffos_v3/mudlib/w/default/clothes/
skylib_fluffos_v3/mudlib/w/default/item/
skylib_fluffos_v3/mudlib/w/default/npc/
skylib_fluffos_v3/mudlib/w/default/room/
skylib_fluffos_v3/mudlib/w/default/weapon/
skylib_fluffos_v3/mudlib/www/
skylib_fluffos_v3/mudlib/www/java/
skylib_fluffos_v3/mudlib/www/secure/
skylib_fluffos_v3/mudlib/www/secure/lpc/advanced/
skylib_fluffos_v3/mudlib/www/secure/lpc/intermediate/
skylib_fluffos_v3/win32/
/*
 * Original by Ember.
 * Improved version by Pinkfish.
 * Debugged by Deutha.
 */

#include <nroff.h>

#define ROWS ( (int)this_player()->query_rows() - 1 )
#define COLS (int)this_player()->query_cols()

private nosave int fsize, topl, botl, charl, real_rows, search_flag;
private nosave mixed mark_data;
private nosave string fname,
              *mark_name,
              *filenames,
              finish_func,
              stat_line,
              last_search;

private void display_file() {
   int i, ncols, nrows;
   string file, *bits, *lines;
   ncols = COLS;
   nrows = ROWS;
   file = read_file( fname, topl, nrows );
   if ( !file )
      return;
   file = replace( file, ({ "\t", "<TAB>", sprintf( "%c", 13 ), "\\n" }) );

   /* We add the extra character and then remove it from the resulting
    * array because this won't work on totally blank lines. :( */
   bits = explode( "x\n" + file, "\n" )[1 .. ];
   if ( charl )
      bits[ 0 ] = bits[ 0 ][ charl .. strlen( bits[ 0 ] ) - 1 ];
   real_rows = 0;
   lines = ({ });
   for ( i = 0; i < sizeof( bits ); i++ ) {
      if ( strlen( bits[ i ] ) > ncols ) {
         lines += ({ bits[ i ][ 0 .. ncols - 1 ] });
         bits[ i ] = bits[ i ][ ncols .. strlen( bits[ i ] ) - 1 ];
         charl += ncols;
         i--;
      } else {
         lines += ({ bits[ i ] });
         charl = 0;
         real_rows++;
      }
      if ( sizeof( lines ) == nrows )
         break;
   }
   printf( "%s\n", implode( lines, "\n" ) );
   botl = topl + real_rows - 1;
   if ( botl > fsize )
      botl = fsize;
} /* display_file() */

private void get_next_filename() {
  string str;

  fname = filenames[0];
  fsize = file_length( fname );
  if( !file_size( fname ) ) {
    printf( "Empty file.\n" );
    if(sizeof(filenames) > 1) {
      filenames = filenames[1..sizeof(filenames) - 1];
      get_next_filename();
      return;
    }
    else
      return;
  }
  if (fsize == -1) {
    printf( "File does not exist.\n" );
    if(sizeof(filenames) > 1) {
      filenames = filenames[1..sizeof(filenames) - 1];
      get_next_filename();
      return;
    }
    else
      return;
  }
  if (fsize == -2) {
    printf( "You cannot more a directory.\n" );
    if(sizeof(filenames) > 1) {
      filenames = filenames[1..sizeof(filenames)-1];
      get_next_filename();
      return;
    }
    else
      return;
  }
  topl = 1;
  if(sizeof(filenames) > 1)
    filenames = filenames[1..sizeof(filenames) - 1];
  else
    filenames = ({ });
  printf( "\n" );
  str = read_file(fname, 1, 1);
  if(!str)
    return;

  if (str[0] == '.') {
    string s2;

/*
 * Nroff file...  do horrible things!  Turn into a mushroom!  Blow up
 * all the hairy crater eating womble doovalacies...
 * In the case of a nroff file we push the file through nroff then shove it
 * through more_string...
 */
    str = "/tmp/nroffed_file";
    if (NROFF_HAND->create_nroff(fname, "/tmp/nroffed_file")) {
      s2 = NROFF_HAND->cat_file("/tmp/nroffed_file");
      rm("/tmp/nroffed_file.o");
      if (s2) {
        this_player()->more_string(s2, fname);
        fsize = ROWS-3;
        return ;
      }
    }
  }
  display_file();
} /* get_next_file_name() */

private string *expand_path(string s) {
  string *s1;

  s1 = (string *)this_player()->get_files(s);
  if (!s1)
    return ({ s });
  return s1;
} /* expand_path() */

int set_mark(string s) {
   int i;

   if (!mark_name) {
      mark_name = ({ });
      mark_data = ({ });
   }
   if ((i=member_array(s,mark_name))!=-1)
      mark_data[i] = ({ fname, topl });
   else {
      mark_name += ({ s });
      mark_data += ({ ({ fname, topl }) });
   }
   return 1;
} /* set_mark() */

private void status_line() {
   string *frog;
   string s;
   int i, percentage;

   if (!stat_line)
      stat_line = "$N From $T to $B of $S ($%%) - h for help. ";
   s = "";
   frog = explode(stat_line, "$");
   for (i=0;i<sizeof(frog);i++) {
      if (frog[i] == "") {
         s += "$";
         i ++;
      } else switch (frog[i][0]) {
       case 'N' :
         s += fname+frog[i][1..1000];
         break;
       case 'T' :
         s += topl+frog[i][1..1000];
         break;
       case 'B' :
         if (botl > fsize)
            s += fsize+frog[i][1..100];
         else
            s += botl+frog[i][1..100];
         break;
       case '%' : {
          percentage = (botl*100)/fsize;
          if(percentage > 100) percentage = 100;
          s += percentage+frog[i][1..100];
          break;
       }
       case 'S' :
         s += fsize+frog[i][1..1000];
         break;
      }
   }
   printf( "%s", s );
   return;
   printf( fname +" From "+ topl +" to "+ botl +" of "+ fsize +" ("+
          ( ( botl * 100 ) / fsize ) +"%) - h for help. " );
} /* status_line() */

void next_page(string str) {
   int num, noargs, i, j, k, redraw;
   string s1, *s3;

   if (!str)
      str = "";

   if (sscanf(str,"%d%s", num, str)!=2)
      noargs = 1;
   s1 = extract(str,1);
   /* case statements WEEEEEE */
   switch(str[0..0]) {
    case "" :
    case " " :
      topl += real_rows;
      redraw = 1;
      break;
    case "f" :
      /* go on a number of pages... */
      if (noargs)
         num = 1;
      topl += ROWS * num;
      redraw = 1;
      break;
    case "q" :
      printf( "Ok.\n" );
      return ;
    case "/" :
      /* sigh */
      search_flag = 0;
      j = topl+4;
      if (s1[0] == '!') {
         search_flag = 1;
         s1 = extract(s1,1);
      }
      set_mark("'");
      if (s1=="" || !s1)
         s1 = last_search;
      if (s1 == "") {
         printf( "No previous search string.\n" );
         break;
      }
      do {
         i = j;
         j = i+900;
         if (j>fsize)
            j = fsize;
         s3 = explode(read_file(fname,i,j),"\n");
         for (k=0;k<sizeof(s3);k++)
            if (!search_flag) {
               if (sscanf(s3[k],"%*s"+s1+"%*s")==2)
                  if (num--<=0)
                     break;
            } else
            if (sscanf(s3[k],"%*s"+s1+"%*s")!=2)
               if (num--<=0)
                  break;
      } while (j<fsize && k == sizeof(s3));
      if (k==sizeof(s3))
         printf( "Sorry "+ s1 +" not found.\n" );
      else {
         topl = i+k-3;
         redraw = 1;
      }
      last_search = s1;
      break;
    case "?" :
      i = topl;
      if (s1[0] == '!') {
         s1 = extract(s1,1);
         search_flag = 3;
      } else
         search_flag = 2;
      set_mark("'");
      if (s1=="" || !s1)
         s1 = last_search;
      if (s1 == "") {
         printf( "No previous search string.\n" );
         break;
      }
      do {
         j = i-900;
         if (j<0)
            j = 0;
         s3 = explode(read_file(fname,j,i),"\n");
         for (k=0;k<sizeof(s3);k++)
            if (search_flag == 2) {
               if (sscanf(s3[k],"%*s"+s1+"%*s")==2)
                  if (num--<=0)
                     break;
            } else
            if (sscanf(s3[k],"%*s"+s1+"%*s")!=2)
               if (num--<=0)
                  break;
         i = j;
      } while (j>0 && k == sizeof(s3));
      if (k==sizeof(s3))
         printf( "Sorry "+ s1 +" not found.\n" );
      else {
         topl = k+i-2;
         redraw = 1;
      }
      last_search = s1;
      break;
    case "n" :
      switch (search_flag) {
       case 0 : next_page(num+"/");
         break;
       case 1 : next_page(num+"/!");
         break;
       case 2 : next_page(num+"?");
         break;
       case 3 : next_page(num+"?!");
         break;
      }
      return;
    case "b" :
      if (noargs)
         num = 1;
      if (topl>0) {
         topl -= ROWS * num;
         redraw = 1;
         if (topl<0)
            topl = 0;
      }
      break;
    case "G" :
      if (noargs)
         num = fsize-ROWS+1;
    case "g" :
      set_mark("'");
      topl = num;
      if (topl>=fsize)
         topl = fsize-2;
      redraw = 1;
      break;
    case "P" :
      if (noargs)
         num = 100;
    case "p" :
    case "%" :
      redraw = 1;
      set_mark("'");
      topl = (num*fsize)/100;
      if (topl+ROWS-1>fsize)
         topl -= ROWS-1;
      break;
    case "d" :
      if (noargs)
         num = ROWS/2;
      topl += num;
      redraw = 1;
      break;
    case "u" :
      if (noargs)
         num = ROWS/2;
      topl -= num;
      redraw = 1;
      break;
    case "r" :
      redraw = 1;
      break;
    case "m" :
      if (s1=="") {
         printf( "Sorry, you must specify a name.\n" );
         break;
      }
      set_mark(s1);
      printf( "Okay, mark "+ s1 +" set.\n" );
      break;
    case "'" :
      if (!mark_name) {
         printf( "Sorry, must go to a mark.\n" );
         break;
      }
      if ((i=member_array(s1,mark_name))!=-1) {
         if (fname != mark_data[i][0]) {
            fname = mark_data[i][0];
            redraw = 1;
         }
         if (topl != mark_data[i][1]) {
            topl = mark_data[i][1];
            redraw = 1;
         }
      } else
         printf( "Mark "+ s1 +" not set.\n" );
      break;
    case "F" :
      filenames = expand_path(str);
      if (!sizeof(filenames)) {
         printf( "No matching files.\n" );
         break;
      }
      last_search = "";
      get_next_filename();
      redraw = 1;
      break;
    case "h" :
      cat("/doc/helpdir/more");
      break;
   }
   if (redraw)
      display_file();
   if ( ( botl < fsize ) || charl ) {
      status_line();
      input_to( "next_page" );
   } else
      if(sizeof(filenames)) {
         get_next_filename();
         input_to("next_page");
      } else {
         if (finish_func)
            call_other(this_player(), finish_func);
      }
} /* next_page() */

int more_file(string str) {
   filenames = expand_path(str);
   if (!sizeof(filenames)) {
      notify_fail("No matching files.\n");
      return 0;
   }
   last_search = "";
   get_next_filename();
   if ( ( botl < fsize ) || charl ) {
      status_line();
      input_to( "next_page" );
   } else
      if (finish_func)
         call_other(this_player(), finish_func);
   return 1;
} /* more_file() */