From b4b5594a5d6b390474246ef3758d41c94872a5a9 Mon Sep 17 00:00:00 2001 From: "zik.saleeba" Date: Sat, 3 Jul 2010 15:20:29 +0000 Subject: [PATCH] Added hanoi test program. Now programs can be run without having to explicitly call main(). git-svn-id: http://picoc.googlecode.com/svn/trunk@452 21eae674-98b7-11dd-bd71-f92a316d2d60 --- picoc.c | 24 +++++++- tests/30_hanoi.c | 126 ++++++++++++++++++++++++++++++++++++++++++ tests/30_hanoi.expect | 71 ++++++++++++++++++++++++ tests/Makefile | 3 +- 4 files changed, 220 insertions(+), 4 deletions(-) create mode 100644 tests/30_hanoi.c create mode 100644 tests/30_hanoi.expect diff --git a/picoc.c b/picoc.c index 3fb5794..a3a4d01 100644 --- a/picoc.c +++ b/picoc.c @@ -1,5 +1,8 @@ #include "picoc.h" +#define CALL_MAIN "main();" + + /* initialise everything */ void Initialise() { @@ -33,15 +36,26 @@ void Cleanup() #ifdef UNIX_HOST int main(int argc, char **argv) { + int ParamCount = 1; + int DontRunMain = FALSE; + if (argc < 2) { - printf("Format: picoc - run a program\n picoc -i - interactive mode\n"); + printf("Format: picoc ... - run a program (calls main to start it)\n" + " picoc -i - interactive mode\n" + " picoc -m ... - run a program without calling main\n"); exit(1); } Initialise(); - if (strcmp(argv[1], "-i") == 0) + if (strcmp(argv[ParamCount], "-m") == 0) + { + DontRunMain = TRUE; + ParamCount++; + } + + if (strcmp(argv[ParamCount], "-i") == 0) ParseInteractive(); else { @@ -51,7 +65,11 @@ int main(int argc, char **argv) return 1; } - PlatformScanFile(argv[1]); + for (; ParamCount < argc; ParamCount++) + PlatformScanFile(argv[ParamCount]); + + if (!DontRunMain) + Parse("startup", CALL_MAIN, strlen(CALL_MAIN), TRUE); } Cleanup(); diff --git a/tests/30_hanoi.c b/tests/30_hanoi.c new file mode 100644 index 0000000..02ff6d2 --- /dev/null +++ b/tests/30_hanoi.c @@ -0,0 +1,126 @@ +/* example from http://barnyard.syr.edu/quickies/hanoi.c */ + +/* hanoi.c: solves the tower of hanoi problem. (Programming exercise.) */ +/* By Terry R. McConnell (12/2/97) */ +/* Compile: cc -o hanoi hanoi.c */ + +/* This program does no error checking. But then, if it's right, +it's right ... right ? */ + + +/* The original towers of hanoi problem seems to have been originally posed +by one M. Claus in 1883. There is a popular legend that goes along with +it that has been often repeated and paraphrased. It goes something like this: +In the great temple at Benares there are 3 golden spikes. On one of them, +God placed 64 disks increasing in size from bottom to top, at the beginning +of time. Since then, and to this day, the priest on duty constantly transfers +disks, one at a time, in such a way that no larger disk is ever put on top +of a smaller one. When the disks have been transferred entirely to another +spike the Universe will come to an end in a large thunderclap. + +This paraphrases the original legend due to DeParville, La Nature, Paris 1884, +Part I, 285-286. For this and further information see: Mathematical +Recreations & Essays, W.W. Rouse Ball, MacMillan, NewYork, 11th Ed. 1967, +303-305. +* +* +*/ + +#include +#include + +#define N 4 /* This is the number of "disks" on tower A initially. */ + /* Taken to be 64 in the legend. The number of moves + required, in general, is 2^N - 1. For N = 64, this is + 18,446,744,073,709,551,615 */ + +int A[N], B[N], C[N]; /* These are the three towers. For example if the +state of A is 0,1,3,4, that means that there are three discs on A of sizes +1, 3, and 4. (Think of right as being the "down" direction.) */ + +void Hanoi(int,int*,int*,int*); + +/* Print the current configuration of A, B, and C to the screen */ + +void +PrintAll() +{ + int i; + + printf("A: "); + for(i=0;i&1 >$*.output + -@../picoc -m $*.c 2>&1 >$*.output @if [ "x`diff -qbu $*.expect $*.output`" != "x" ]; \ then \ echo "error in test $*"; \