lua.c
上传用户:dzyhzl
上传日期:2019-04-29
资源大小:56270k
文件大小:9k
源码类别:

模拟服务器

开发平台:

C/C++

  1. /*
  2. ** $Id: lua.c,v 1.55 2000/10/20 16:36:32 roberto Exp $
  3. ** Lua stand-alone interpreter
  4. ** See Copyright Notice in lua.h
  5. */
  6. #include <signal.h>
  7. #include <stdio.h>
  8. #include <stdlib.h>
  9. #include <string.h>
  10. #include "lua.h"
  11. #include "luadebug.h"
  12. #include "lualib.h"
  13. static lua_State *L = NULL;
  14. #ifndef PROMPT
  15. #define PROMPT "> "
  16. #endif
  17. #ifdef _POSIX_SOURCE
  18. #include <unistd.h>
  19. #else
  20. static int isatty (int x) { return x==0; }  /* assume stdin is a tty */
  21. #endif
  22. /*
  23. ** global options
  24. */
  25. struct Options {
  26.   int toclose;
  27.   int stacksize;
  28. };
  29. typedef void (*handler)(int);  /* type for signal actions */
  30. static void laction (int i);
  31. static lua_Hook old_linehook = NULL;
  32. static lua_Hook old_callhook = NULL;
  33. static void userinit (void) {
  34.   lua_baselibopen(L);
  35.   lua_iolibopen(L);
  36.   lua_strlibopen(L);
  37.   lua_mathlibopen(L);
  38.   lua_dblibopen(L);
  39.   /* add your libraries here */
  40. }
  41. static handler lreset (void) {
  42.   return signal(SIGINT, laction);
  43. }
  44. static void lstop (void) {
  45.   lua_setlinehook(L, old_linehook);
  46.   lua_setcallhook(L, old_callhook);
  47.   lreset();
  48.   lua_error(L, "interrupted!");
  49. }
  50. static void laction (int i) {
  51.   (void)i;  /* to avoid warnings */
  52.   signal(SIGINT, SIG_DFL); /* if another SIGINT happens before lstop,
  53.                               terminate process (default action) */
  54.   old_linehook = lua_setlinehook(L, (lua_Hook)lstop);
  55.   old_callhook = lua_setcallhook(L, (lua_Hook)lstop);
  56. }
  57.  int ldo (int (*f)(lua_State *l, const char *), const char *name) {
  58.   int res;
  59.   handler h = lreset();
  60.   int top = lua_gettop(L);
  61.   res = f(L, name);  /* dostring | dofile */
  62.   lua_settop(L, top);  /* remove eventual results */
  63.   signal(SIGINT, h);  /* restore old action */
  64.   /* Lua gives no message in such cases, so lua.c provides one */
  65.   if (res == LUA_ERRMEM) {
  66.     fprintf(stderr, "lua: memory allocation errorn");
  67.   }
  68.   else if (res == LUA_ERRERR)
  69.     fprintf(stderr, "lua: error in error messagen");
  70.   return res;
  71. }
  72. FILE *sout = NULL;
  73. FILE *serr = NULL;
  74.  //ByRomandou
  75. LUA_API int lua_setdebugout(const char * szoutfile, const char * szerrfile)
  76. {
  77. #ifdef _DEBUG
  78. if (szoutfile)
  79. sout = freopen( szoutfile, "a", stdout);
  80. if (szerrfile)
  81. serr = freopen( szerrfile, "a", stderr );
  82. if (sout == NULL || serr == NULL) return 0;
  83. return 1;
  84. #endif
  85. return 1;
  86. }
  87. LUA_API void lua_outerrmsg(const char * szerrmsg)
  88. {
  89. fprintf(stderr, szerrmsg);
  90. }
  91. LUA_API void lua_outoutmsg(const char * szoutmsg)
  92. {
  93. fprintf(stdout, szoutmsg);
  94. }
  95. static void print_message (void) {
  96.   fprintf(stderr,
  97.   "usage: lua [options].  Available options are:n"
  98.   "  -        execute stdin as a filen"
  99.   "  -c       close Lua when exitingn"
  100.   "  -e stat  execute string `stat'n"
  101.   "  -f name  execute file `name' with remaining arguments in table `arg'n"
  102.   "  -i       enter interactive mode with promptn"
  103.   "  -q       enter interactive mode without promptn"
  104.   "  -sNUM    set stack size to NUM (must be the first option)n"
  105.   "  -v       print version informationn"
  106.   "  a=b      set global `a' to string `b'n"
  107.   "  name     execute file `name'n"
  108. );
  109. }
  110. static void print_version (void) {
  111.   printf("%.80s  %.80sn", LUA_VERSION, LUA_COPYRIGHT);
  112. }
  113. static void assign (char *arg) {
  114.   char *eq = strchr(arg, '=');
  115.   *eq = '';  /* spilt `arg' in two strings (name & value) */
  116.   lua_pushstring(L, eq+1);
  117.   lua_setglobal(L, arg);
  118. }
  119. static void getargs (char *argv[]) {
  120.   int i;
  121.   lua_newtable(L);
  122.   for (i=0; argv[i]; i++) {
  123.     /* arg[i] = argv[i] */
  124.     lua_pushnumber(L, i);
  125.     lua_pushstring(L, argv[i]);
  126.     lua_settable(L, -3);
  127.   }
  128.   /* arg.n = maximum index in table `arg' */
  129.   lua_pushstring(L, "n");
  130.   lua_pushnumber(L, i-1);
  131.   lua_settable(L, -3);
  132. }
  133. static int l_getargs (lua_State *l) {
  134.   char **argv = (char **)lua_touserdata(l, -1);
  135.   getargs(argv);
  136.   return 1;
  137. }
  138. static int file_input (const char *argv) {
  139.   int result = ldo(lua_dofile, argv);
  140.   if (result) {
  141.     if (result == LUA_ERRFILE) {
  142.       fprintf(stderr, "lua: cannot execute file ");
  143.       perror(argv);
  144.     }
  145.     return EXIT_FAILURE;
  146.   }
  147.   else
  148.     return EXIT_SUCCESS;
  149. }
  150. /* maximum length of an input string */
  151. #ifndef MAXINPUT
  152. #define MAXINPUT BUFSIZ
  153. #endif
  154. static void manual_input (int version, int prompt) {
  155.   int cont = 1;
  156.   if (version) print_version();
  157.   while (cont) {
  158.     char buffer[MAXINPUT];
  159.     int i = 0;
  160.     if (prompt) {
  161.       const char *s;
  162.       lua_getglobal(L, "_PROMPT");
  163.       s = lua_tostring(L, -1);
  164.       if (!s) s = PROMPT;
  165.       fputs(s, stdout);
  166.       lua_pop(L, 1);  /* remove global */
  167.     }
  168.     for(;;) {
  169.       int c = getchar();
  170.       if (c == EOF) {
  171.         cont = 0;
  172.         break;
  173.       }
  174.       else if (c == 'n') {
  175.         if (i>0 && buffer[i-1] == '\')
  176.           buffer[i-1] = 'n';
  177.         else break;
  178.       }
  179.       else if (i >= MAXINPUT-1) {
  180.         fprintf(stderr, "lua: input line too longn");
  181.         break;
  182.       }
  183.       else buffer[i++] = (char)c;
  184.     }
  185.     buffer[i] = '';
  186.     ldo(lua_dostring, buffer);
  187.     lua_settop(L, 0);  /* remove eventual results */
  188.   }
  189.   printf("n");
  190. }
  191. static int handle_argv (char *argv[], struct Options *opt) {
  192.   if (opt->stacksize > 0) argv++;  /* skip option `-s' (if present) */
  193.   if (*argv == NULL) {  /* no more arguments? */
  194.     if (isatty(0)) {
  195.       manual_input(1, 1);
  196.     }
  197.     else
  198.       ldo(lua_dofile, NULL);  /* executes stdin as a file */
  199.   }
  200.   else {  /* other arguments; loop over them */
  201.     int i;
  202.     for (i = 0; argv[i] != NULL; i++) {
  203.       if (argv[i][0] != '-') {  /* not an option? */
  204.         if (strchr(argv[i], '='))
  205.           assign(argv[i]);
  206.         else
  207.           if (file_input(argv[i]) != EXIT_SUCCESS)
  208.             return EXIT_FAILURE;  /* stop if file fails */
  209.         }
  210.         else switch (argv[i][1]) {  /* option */
  211.           case 0: {
  212.             ldo(lua_dofile, NULL);  /* executes stdin as a file */
  213.             break;
  214.           }
  215.           case 'i': {
  216.             manual_input(0, 1);
  217.             break;
  218.           }
  219.           case 'q': {
  220.             manual_input(0, 0);
  221.             break;
  222.           }
  223.           case 'c': {
  224.             opt->toclose = 1;
  225.             break;
  226.           }
  227.           case 'v': {
  228.             print_version();
  229.             break;
  230.           }
  231.           case 'e': {
  232.             i++;
  233.             if (argv[i] == NULL) {
  234.               print_message();
  235.               return EXIT_FAILURE;
  236.             }
  237.             if (ldo(lua_dostring, argv[i]) != 0) {
  238.               fprintf(stderr, "lua: error running argument `%.99s'n", argv[i]);
  239.               return EXIT_FAILURE;
  240.             }
  241.             break;
  242.           }
  243.           case 'f': {
  244.             i++;
  245.             if (argv[i] == NULL) {
  246.               print_message();
  247.               return EXIT_FAILURE;
  248.             }
  249.             getargs(argv+i);  /* collect remaining arguments */
  250.             lua_setglobal(L, "arg");
  251.             return file_input(argv[i]);  /* stop scanning arguments */
  252.           }
  253.           case 's': {
  254.             fprintf(stderr, "lua: stack size (`-s') must be the first optionn");
  255.             return EXIT_FAILURE;
  256.           }
  257.           default: {
  258.             print_message();
  259.             return EXIT_FAILURE;
  260.           }
  261.         }
  262.     }
  263.   }
  264.   return EXIT_SUCCESS;
  265. }
  266. static void getstacksize (int argc, char *argv[], struct Options *opt) {
  267. FILE * pFile = NULL;
  268.   if (argc >= 2 && argv[1][0] == '-' && argv[1][1] == 's') {
  269.     int stacksize = atoi(&argv[1][2]);
  270.     if (stacksize <= 0) {
  271.       fprintf(stderr, "lua: invalid stack size ('%.20s')n", &argv[1][2]);
  272.   printf("LUA ERROR!!!!!!!!!!!!!!!!!!!!!!!!!! getstatcksizen");
  273.     printf("LUA ERROR!!!!!!!!!!!!!!!!!!!!!!!!!! getstatcksizen");
  274.   printf("LUA ERROR!!!!!!!!!!!!!!!!!!!!!!!!!! getstatcksizen");
  275.   
  276.   if(pFile  = fopen( "c:\luaerror1.txt", "wa" ))
  277.   {
  278.   char szStr[] = "LUA ERROR!!!!!!!!!!!!!!!!!!!!!!!!!! getstatcksizen";
  279.   fwrite(szStr, sizeof(char ), strlen(szStr), pFile);
  280.   fclose(pFile);
  281.   }
  282.       //exit(EXIT_FAILURE);
  283.     }
  284.     opt->stacksize = stacksize;
  285.   }
  286.   else
  287.     opt->stacksize = 0;  /* no stack size */
  288. }
  289. static void register_getargs (char *argv[]) {
  290.   lua_pushuserdata(L, argv);
  291.   lua_pushcclosure(L, l_getargs, 1);
  292.   lua_setglobal(L, "getargs");
  293. }
  294. int main (int argc, char *argv[]) {
  295.   struct Options opt;
  296.   int status;
  297.   opt.toclose = 0;
  298.   getstacksize(argc, argv, &opt);  /* handle option `-s' */
  299.   L = lua_open(opt.stacksize);  /* create state */
  300.   userinit();  /* open libraries */
  301.   register_getargs(argv);  /* create `getargs' function */
  302.   status = handle_argv(argv+1, &opt);
  303.   if (opt.toclose)
  304.     lua_close(L);
  305.   return status;
  306. }