Mercurial > repo
diff interps/cfunge/cfunge-src/README @ 996:859f9b4339e6
<Gregor> tar xf egobot.tar.xz
author | HackBot |
---|---|
date | Sun, 09 Dec 2012 19:30:08 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/interps/cfunge/cfunge-src/README Sun Dec 09 19:30:08 2012 +0000 @@ -0,0 +1,198 @@ +This is cfunge - a fast Befunge93/98/109 interpreter in C. + +cfunge offers some features that many other standard conforming interpreters +don't. For example: + * Sandbox mode, prevents programs from harming system (more details below). + * Advance tracing support, debugging protocol support system under development. + * Passes mycology (of course other conforming interpreters does this, but most + interpreters are, sadly, not conforming). + * Tested using Valgrind and similar tools. + * Tested with fuzz testing to ensure cfunge does not segfault on random stuff. + * Coded for maximum performance AND correctness. + * Support for selecting either 64-bit or 32-bit integers as datatype in + funge-space at compile time. + + +Dependencies +------------ +REQUIRED: + * cmake (http://www.cmake.org/) to generate Makefile for cfunge. At least + version 2.6 is required. + + * A C99 compiler, or one that supports a large subset of C99, like GCC. + + GCC 3.4.6, 4.1.2, 4.2.1, 4.3.2 and 4.3.3 are known to work, other versions + may or may not work. + + ICC 10.1 is known to work too. + + Open64 4.1 should work, but isn't recommended. + + Very recent SVN versions of clang works on 32-bit x86 (as of 2009-03-28), + but can currently not be recommended since clang is not very stable yet. + - TCC 0.9.24 is known to fail at certain C99 constructs used in cfunge. + Other compilers may or may not work. + + * A POSIX.1-2001 system with the memory mapped file option. It also needs the + function strdup() which is part of the XSI extension. (For POSIX.1-2008 both + strdup() and memory mapped files are mandatory and part of the base.) + Operating systems known to work: + + Linux 2.6.27 (with glibc 2.8) and later (earlier versions unknown but will + probably work unless very old). + + FreeBSD 6.4 or later (earlier versions unknown). + + Mac OS X (unknown version) has been reported to work but I don't have it + myself and thus can't test it. + + OpenBSD 4.4 (sparc64): I have not managed to get cmake 2.6 to compile on + OpenBSD, but I did manage to build cfunge by hand, required some strange + workarounds and defines. + Windows most likely won't work. Nor do I plan to support it. Cygwin may work, + but you are on your own if it doesn't. + +HIGHLY RECOMMENDED: + * Ncurses (http://www.gnu.org/software/ncurses/), needed for the TERM + fingerprint. This is most likely already installed. Ncurses will be + automatically used if found. + + * IEC 60559 floating-point arithmetic. Please see Annex F in ISO/IEC 9899 for + more details. + +OPTIONAL: + * Boehm-GC (http://www.hpl.hp.com/personal/Hans_Boehm/gc/) version 7 or later. + You have to manually enable some compile time options to use Boehm-GC. + + +Configuring +----------- +Warning: Out of tree builds are highly recommended. Building in the source tree +may work but is _completely_ untested. + +To build using cmake, you can run these commands in the top source directory: + mkdir build && cd build + cmake .. + +If you are on a 32-bit system you may want to use 32-bit integers (instead of +64-bit integers) for speed. It is also slightly faster on some 64-bit systems +to use 32-bit integers. This may vary between architectures. To use 32-bit +integers you could use these commands instead of the above ones: + mkdir build && cd build + cmake -DUSE_64BIT=OFF .. + +If you want to see a list of available options use ccmake. It will allow you to +select options in a ncurses based user interface. Help is always shown at the +bottom of the screen. + mkdir build && cd build + ccmake .. + (press c) + (change options - use t to show advanced options) + (press c again) + (press g to generate make file) + +For more information see: + cmake --help +and/or + ccmake --help + +To enable garbage collector you can run cmake with -DUSE_GC=ON. However using a +GC isn't as fast as not using one and it could also cause issues with certain +fingerprints. + + +Compiling +--------- +After having run cmake as described in the above section, just run: + make + + +Installing +---------- +Not needed, cfunge can be run from build directory, but if you want to (after +having compiled cfunge): + make install + + +Fingerprints +------------ +It is planned to implement most or all of the existing fingerprints, +with some exceptions: + * FNGR - Contradicts with 98 standard. + * IMAP - Too intrusive. + * MODE - Intrusive into IP handling. + * TRDS - Exceedingly complex and intrusive. + * WIND - Too complex to implement and not portable. + +Short descriptions of implemented fingerprints: + 3DSP 3D space manipulation extension + BASE I/O for numbers in other bases + CPLI Complex Integer extension + DATE Date Functions + DIRF Directory functions extension + FILE File I/O functions + FING Operate on single fingerprint semantics + FIXP Some useful math functions + FPDP Double precision floating point + FPSP Single precision floating point + FRTH Some common forth commands + HRTI High-Resolution Timer Interface + INDV Pointer functions + JSTR Read and write strings in Funge-Space + MODU Modulo Arithmetic Extension + NCRS Ncurses Extension + NULL Funge-98 Null Fingerprint + ORTH Orthogonal Easement Library + PERL Generic Interface to the Perl Language + REFC Referenced Cells Extension + REXP Regular Expression Matching + ROMA Funge-98 Roman Numerals + SCKE TCP/IP async socket and dns resolving extension + SOCK TCP/IP socket extension + STRN String functions + SUBR Subroutine extension + TERM Terminal control functions + TIME Time and Date functions + TOYS Funge-98 Standard Toys + TURT Simple Turtle Graphics Library +For more details please see the specs for each fingerprint. +In cases of undefined behaviour in fingerprints, cfunge mostly tries to do the +same thing as CCBI. + + +Undefined behaviour +------------------- +The Befunge98 standard leaves some things undefined, here is what we do for +some of those cases: + * y pushes time in UTC not local time. + * k with a negative argument reflects. + * # across edge of funge-space may or may not skip first char after wrapping + depending on exact situation. + * ( and ) with a negative count reflects and doesn't pop any fingerprint. + * Loaded fingerprints are inherited to child IPs at split (t). + * STDOUT is only flushed at: + * Newline (line feed, ASCII 10) printed using , instruction. + * Any input instructions. + * End of program. + * Standard input is read one line at a time and buffered internally. Those + instructions reading chars fetch one char from this buffer, leaving the rest + (if any) including any ending newline. Instructions reading an integer will + leave anything after the integer in the buffer with one exception: if the + next char is a newline it will be discarded. + + +Notes on different standards +---------------------------- +The option -s 93 does not prevent the program from accessing outside the first +80x25 cells. Nor does it disallow instructions that didn't exist in 93. It does +however change space behaviour to match 93 style. + +If a program depends on a instruction that is undefined in 93 to reflect, it +should be easy to replace such instructions with a r for reflect or any in the +range A-Z (and not load any fingerprint). + +Further division by zero always returns 0 in all modes, though the Befunge93 +specs says the interpreter should ask the user what result he/she wants in that +situation. + + +Sandbox mode +------------ +Sandbox mode prevents Funge programs from doing "harmful" things, this includes, +but is not limited to: + * Any file or filesystem IO is forbidden. + * The list of environment variables the program can see in y are restricted. + * Non-safe fingerprints can not be loaded (this includes network and file + system access as well as other things).