Tuesday, March 31, 2009

more

more01.c

#include "stdio.h"


#define PAGELEN 24

#define LINELEN 512


void do_more(FILE *);

int see_more();


int main(int ac, char *av[])

{

FILE *fp;

if(ac == 1)

do_more(stdin);

else

while (--ac)

if((fp = fopen(*++av, "r")) != NULL )

{

do_more(fp);

fclose(fp);

}

else

exit(1);

return 0;

}


void do_more(FILE *fp)

{

char line[LINELEN];

int num_of_lines = 0;

int see_more(), reply;

while (fgets(line, LINELEN, fp)){

if(num_of_lines == PAGELEN){

reply = see_more();

if(reply == 0)

break;

num_of_lines -= reply;

}

if(fputs (line, stdout) == EOF)

exit(1);

num_of_lines++;

}

}


int see_more()

{

int c;

printf("\033[7m more? \033[m");

while ((c=getchar()) != EOF)

{

if (c == 'q')

return 0;

if (c == ' ')

return PAGELEN;

if (c == '\n')

return 1;

}

return 0;

}


more01.rb

PAGELEN = 24


def main(ac, argv)

  if ac == 1

    do_more(STDIN)

  else

    while (ac -= 1) >= 0

      if (fp = argv.shift) != nil

        file = File.open(fp, "r")

        do_more(file)

        file.close

      else

        exit(1)

      end

    end

  end

  return 0

end


def do_more(fp)

  num_of_lines = 0

  while line = fp.gets

    if num_of_lines == PAGELEN

      reply = see_more

      if reply == 0

        break

      end

      num_of_lines -= reply

    end

    if line == nil

      exit

    end

    puts line

    num_of_lines += 1

  end

end


def see_more

  printf "\033[7m more? \033[m\n"

  while c = STDIN.getc

    if c == "q"

      return 0

    end

    if c == " "

      return PAGELEN

    end

    if c == "\n"

      return 1

    end

  end

  return 0

end


argv = ARGV

main(argv.length+1, argv)


more02.rb

PAGELEN = 10

def puts_lines

  begin

    next_stop = PAGELEN

    ARGF.each_with_index do |line, i|

      if i == next_stop

        case reply = more?

        when 0

          break

        else

          next_stop += reply

        end

      end

      puts line

    end

  rescue Exception => e

    puts e

    exit(1)

  ensure

    ARGF.close

  end

  0

end


def more?

  printf "\033[7m more? \033[m"

  while c = STDIN.getc

    return case c

    when "q"

      0

    when " "

      PAGELEN

    when "\n"

      1

    end

  end

  0

end


puts_lines

No comments: