print file by kt3k

,23-"/* Copyright (C) 1991,92,93,94,95,96,97,2002 Free Software Foundation, Inc.
   This file is part of the GNU C Library.

   The GNU C Library is free software; you can redistribute it and/or
   modify it under the terms of the GNU Lesser General Public
   License as published by the Free Software Foundation; either
   version 2.1 of the License, or (at your option) any later version.

   The GNU C Library is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   Lesser General Public License for more details.

   You should have received a copy of the GNU Lesser General Public
   License along with the GNU C Library; if not, write to the Free
   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
   02111-1307 USA.  */

/*
 *\x09ISO C99 Standard: 7.5 Errors\x09<errno.h>
 */

#ifndef\x09_ERRNO_H

/* The includer defined __need_Emath if he wants only the definitions
   of EDOM and ERANGE, and not everything else.  */
#ifndef\x09__need_Emath
# define _ERRNO_H\x091
# include <features.h>
#endif

__BEGIN_DECLS

/* Get the error number constants from the system-specific file.
   This file will test __need_Emath and _ERRNO_H.  */
#include <bits/errno.h>
#undef\x09__need_Emath

#ifdef\x09_ERRNO_H

/* Declare the `errno' variable, unless it's defined as a macro by
   bits/errno.h.  This is the case in GNU, where it is a per-thread
   variable.  This redeclaration using the macro still works, but it
   will be a function declaration without a prototype and may trigger
   a -Wstrict-prototypes warning.  */
#ifndef\x09errno
extern int errno;
#endif

#ifdef __USE_GNU

/* The full and simple forms of the name with which the program was
   invoked.  These variables are set up automatically at startup based on
   the value of ARGV[0] (this works only if you use GNU ld).  */
extern char *program_invocation_name, *program_invocation_short_name;
#endif /* __USE_GNU */
#endif /* _ERRNO_H */

__END_DECLS

#endif /* _ERRNO_H */

/* The Hurd <bits/errno.h> defines `error_t' as an enumerated type so
   that printing `error_t' values in the debugger shows the names.  We
   might need this definition sometimes even if this file was included
   before.  */
#if defined __USE_GNU || defined __need_error_t
# ifndef __error_t_defined
typedef int error_t;
#  define __error_t_defined\x091
# endif
# undef __need_error_t
#endif"'#!/usr/bin/env ruby

def step
  @x = (@vx + @x) % @mx
  @y = (@vy + @y) % @my
end

def push(x)
  @s << x
end
def pop
  @s.pop || 0
end

def scanint
  c = STDIN.getc
  r = 0
  while c >= ?0 && c <= ?9
    r = r * 10 + c - ?0
    c = STDIN.getc
  end
  STDIN.ungetc(c)
  r
end

ops = {
  ?< => proc { @vx=-1; @vy=0 },
  ?> => proc { @vx=1; @vy=0 },
  ?^ => proc { @vx=0; @vy=-1 },
  ?v => proc { @vx=0; @vy=1 },
  ?_ => proc { @vy = 0; pop == 0 ? @vx=1 : @vx=-1 },
  ?| => proc { @vx = 0; pop == 0 ? @vy=1 : @vy=-1 },
  ?? => proc {
    r=rand(4)
    ops[r<1??v:r<2??^:r<3??<:?>].call
  },
  ?\ => proc {},
  ?# => proc { step },
  ?@ => proc { exit },

  ?" => proc {
    step
    while (c=@c[@y][@x]) != ?"
      push(c)
      step
    end
  },

  ?& => proc { push(scanint) },
  ?~ => proc { push(STDIN.getc) },
  ?. => proc { print(pop) },
  ?, => proc { putc(pop) },

  ?+ => proc { push(pop+pop) },
  ?- => proc { y=pop; push(pop-y) },
  ?* => proc { push(pop*pop) },
  ?/ => proc { y=pop; push(pop/y) },
  ?% => proc { y=pop; push(pop%y) },
  ?` => proc { push(pop-pop<0?1:0) },
  ?! => proc { push(pop==0?1:0) },

  ?: => proc { t=pop; push(t); push(t) },
  ?\\\\=> proc { y=pop; x=pop; push(y); push(x) },
  ?$ => proc { pop },

  ?g => proc { y=pop; x=pop; push(@c[y][x]) },
  ?p => proc { y=pop; x=pop; @c[y][x] = pop },
}



@c = ARGF.read.split(/\n/)

@mx = @c.map{|l|l.size}.max
@my = @c.size

@c = @c.map{|l|l.ljust(@mx)}

@x=@y=@vy=0
@vx=1
@s = []

while true
  opc = @c[@y][@x]
  op = ops[opc]
  if op
    op.call
  elsif opc.chr =~ /\d/
    push(opc-?0)
  else
    if opc
      raise "unknown command #{opc.chr}(#{opc})"
    else
      raise "out of bounds"
    end
  end

  step
#  puts "x=#@x y=#@y vx=#@vx vy=#@vy"
end
'if

Note that non-ascii characters in the above source code will be escaped (such as \x9f).

download

return to the top page