/*------------------------------------------------------------------------------

 Example demonstrating how to runa program multiple times

*/

#include <stdlib.h>
#include <stdio.h>
#include <exec/exec.h>
#include <utility/tagitem.h>
#include <clib/exec_protos.h>
#include <pragmas/exec_pragmas.h>

#include "//include/basic.h"
#include "//clib/basiclib_protos.h"
#include "//pragmas/basiclib_pragmas.h"

struct Library *BASICBase;

// BASIC source code (each line LF-terminated or 0-terminated)

UBYTE source[] = "INC n\0PRINT n,";

int
main(int argc, char **argv)
{
    int rc = 20;

    if (BASICBase = OpenLibrary("BASIC.library", BASIC_VERSION))
    {
        static struct TagItem ctags[] = { BASIC_CONSOLE, (ULONG)NULL, BASIC_ADDRESS, (ULONG)source, BASIC_SIZE, sizeof(source), TAG_END };

        void *context;

        // create interactive interpreter; use current console (BASIC_CONSOLE, NULL) if not started via wb, ie. if argc != 0

        if (argc)
            context = basic_context(&ctags[0]);
        else
            context = basic_context(&ctags[1]);

        if (context)
        {
            UWORD n;

            // run test program 32 times

            for (n = 0; n < 32; ++n)
            {
                // main loop: execute program synchronously

                do
                {
                    rc = basic_iterate(context);

                } while (rc == BASIC_OK);

                // resume execution in first line if execution terminated normally

                if (rc == BASIC_ERROR_END)
                {
                    basic_run(context, BASIC_SHARED);
                }
            }

            rc = basic_dispose(context);
        }
        else
            puts("Failed to create interpreter context");

        CloseLibrary(BASICBase);
    }
    else
        puts("Can not open BASIC.library");

    return(rc);
}
