/*
** lua.c
** Linguagem para Usuarios de Aplicacao
*/

char *rcs_lua="$Id: lua.c,v 1.18 1997/06/19 18:55:40 roberto Exp roberto $";

#include <stdio.h>
#include <string.h>

#include "lualoc.h"
#include "lua.h"
#include "auxlib.h"
#include "lualib.h"


#ifdef _POSIX_SOURCE
#include <unistd.h>
#else
#define isatty(x)       (x==0)  /* assume stdin is a tty */
#endif


#define DEBUG	0

static void testC (void)
{
#if DEBUG
#define getnum(s)	((*s++) - '0')
#define getname(s)	(nome[0] = *s++, nome)

  static int locks[10];
  lua_Object reg[10];
  char nome[2];
  char *s = luaL_check_string(1);
  nome[1] = 0;
  while (1) {
    switch (*s++) {
      case '0': case '1': case '2': case '3': case '4':
      case '5': case '6': case '7': case '8': case '9':
        lua_pushnumber(*(s-1) - '0');
        break;

      case 'c': reg[getnum(s)] = lua_createtable(); break;

      case 'P': reg[getnum(s)] = lua_pop(); break;

      case 'g': { int n = getnum(s); reg[n] = lua_getglobal(getname(s)); break; }

      case 'G': { int n = getnum(s);
                  reg[n] = lua_rawgetglobal(getname(s));
                  break;
                }

      case 'l': locks[getnum(s)] = lua_ref(1); break;
      case 'L': locks[getnum(s)] = lua_ref(0); break;

      case 'r': { int n = getnum(s); reg[n] = lua_getref(locks[getnum(s)]); break; }

      case 'u': lua_unref(locks[getnum(s)]); break;

      case 'p': { int n = getnum(s); reg[n] = lua_getparam(getnum(s)); break; }

      case '=': lua_setglobal(getname(s)); break;

      case 's': lua_pushstring(getname(s)); break;

      case 'o': lua_pushobject(reg[getnum(s)]); break;

      case 'f': lua_call(getname(s)); break;

      case 'i': reg[getnum(s)] = lua_gettable(); break;

      case 'I': reg[getnum(s)] = lua_rawgettable(); break;

      case 't': lua_settable(); break;

      case 'T': lua_rawsettable(); break;

      default: luaL_verror("unknown command in `testC': %c", *(s-1));

    }
  if (*s == 0) return;
  if (*s++ != ' ') lua_error("missing ` ' between commands in `testC'");
  }
#else
  lua_error("`testC' not active");
#endif
}


static void manual_input (void)
{
  if (isatty(0)) {
    char buffer[250];
    while (fgets(buffer, sizeof(buffer), stdin) != 0) {
      lua_beginblock();
      lua_dostring(buffer);
      lua_endblock();
    }
  }
  else
    lua_dofile(NULL);  /* executes stdin as a file */
}


int main (int argc, char *argv[])
{
  int i;
  int result = 0;
  setlocale(LC_ALL, "");
  iolib_open ();
  strlib_open ();
  mathlib_open ();
  lua_register("testC", testC);
  if (argc < 2)
    manual_input();
  else for (i=1; i<argc; i++) {
    if (strcmp(argv[i], "-") == 0)
      manual_input();
    else if (strcmp(argv[i], "-v") == 0)
      printf("%s  %s\n(written by %s)\n\n",
             LUA_VERSION, LUA_COPYRIGHT, LUA_AUTHORS);
    else if ((strcmp(argv[i], "-e") == 0 && i++) || strchr(argv[i], '=')) {
      if (lua_dostring(argv[i]) != 0) {
        fprintf(stderr, "lua: error running argument `%s'\n", argv[i]);
        return 1;
      }
    }
    else {
      result = lua_dofile (argv[i]);
      if (result) {
        if (result == 2) {
          fprintf(stderr, "lua: cannot execute file ");
          perror(argv[i]);
        }
        return 1;
      }
    }
  }
  return result;
}

