LUALIB_API int luaL_loadfsfile (lua_State *L, const char *filename) {
  LoadFSF lf;
  int status, readstatus;
  int c;
  int fnameindex = lua_gettop(L) + 1;  /* index of filename on the stack */
  lf.extraline = 0;
  if (filename == NULL) {
    return luaL_error(L, "filename is NULL");
  }
  else {
    lua_pushfstring(L, "@%s", filename);
    lf.f = fs_open(filename, FS_RDONLY);
    if (lf.f < FS_OPEN_OK) return errfsfile(L, "open", fnameindex);
  }
  // if(fs_size(lf.f)>LUAL_BUFFERSIZE)
  //   return luaL_error(L, "file is too big");
  c = fs_getc(lf.f);
  if (c == '#') {  /* Unix exec. file? */
    lf.extraline = 1;
    while ((c = fs_getc(lf.f)) != EOF && c != '\n') ;  /* skip first line */
    if (c == '\n') c = fs_getc(lf.f);
  }
  if (c == LUA_SIGNATURE[0] && filename) {  /* binary file? */
    fs_close(lf.f);
    lf.f = fs_open(filename, FS_RDONLY);  /* reopen in binary mode */
    if (lf.f < FS_OPEN_OK) return errfsfile(L, "reopen", fnameindex);
    /* skip eventual `#!...' */
   while ((c = fs_getc(lf.f)) != EOF && c != LUA_SIGNATURE[0]) ;
    lf.extraline = 0;
  }
  fs_ungetc(c, lf.f);
  status = lua_load(L, getFSF, &lf, lua_tostring(L, -1));

  if (filename) fs_close(lf.f);  /* close file (even in case of errors) */
  lua_remove(L, fnameindex);
  return status;
}
Exemple #2
0
static int test_eof (lua_State *L, int f) {
  int c = fs_getc(f);
  fs_ungetc(c, f);
  lua_pushlstring(L, NULL, 0);
  return (c != EOF);
}