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

 BX source code; compile with SAS/C (smake)

*/

#include <stdlib.h>
#include <stdio.h>
#include <strings.h>
#include <exec/exec.h>
#include <dos/dosextens.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;

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

    if ((argc >= 2) && strcmp(argv[1], "?"))
    {
        if (BASICBase = OpenLibrary("BASIC.library", BASIC_VERSION))
        {
            static struct TagItem ctags[] = { BASIC_CONSOLE, (ULONG)NULL, TAG_END };

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

            void *context;

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

            if (context)
            {
                static struct TagItem ltags[] = { BASIC_FILENAME, 0, BASIC_COMMANDLINE, 0, TAG_END };

                UBYTE *program;
                UBYTE *arguments;

                program = argv[1];

                // skip over program name and find start of arguments

                if (argc > 2)
                {
                    BOOL quoted = FALSE;

                    for (arguments = ((struct Process *)FindTask(NULL))->pr_Arguments; *arguments; ++arguments)
                    {
                        if (*arguments == '"')
                        {
                            quoted = !quoted;
                        }
                        else if ((quoted == FALSE) && (*arguments == ' '))
                        {
                            ++arguments;

                            break;
                        }
                    }
                }
                else
                    arguments = NULL;

                // set options for basic_rx() command (file name and command line)

                ltags[0].ti_Data = (ULONG)program;

                ltags[1].ti_Data = (ULONG)arguments;

                // load program

                if (rc = basic_load(context, ltags))
                {
                    printf("BASIC load error %d\n", rc);

                    basic_dispose(context);
                }
                else
                {
                    // main loop: execute program synchronously

                    do
                    {
                        rc = basic_iterate(context);

                    } while (rc == BASIC_OK);

                    rc = basic_dispose(context);
                }
            }

            CloseLibrary(BASICBase);
        }
        else
            puts("Can not open BASIC.library");
    }
    else
        puts("Usage: BX PROGRAM/K");

    return(rc);
}
