static int read_line (lua_State *L, int f) { luaL_Buffer b; luaL_buffinit(L, &b); char *p = luaL_prepbuffer(&b); signed char c = EOF; int i = 0; do{ c = (signed char)fs_getc(f); if(c==EOF){ break; } p[i++] = c; }while((c!=EOF) && (c!='\n') && (i<LUAL_BUFFERSIZE) ); if(i>0 && p[i-1] == '\n') i--; /* do not include `eol' */ if(i==0){ luaL_pushresult(&b); /* close buffer */ return (lua_objlen(L, -1) > 0); /* check whether read something */ } luaL_addsize(&b, i); luaL_pushresult(&b); /* close buffer */ return 1; /* read at least an `eol' */ }
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; }
char *fs_gets(char *dst, int count, fs_file fh) { char *s = dst; int c; assert(dst); assert(count > 0); if (fs_eof(fh)) return NULL; while (count > 1) if ((c = fs_getc(fh)) >= 0) { count--; *s = c; /* Keep a newline and break. */ if (*s == '\n') { s++; break; } /* Ignore carriage returns. */ if (*s == '\r') { count++; s--; } s++; } else if (s == dst) return NULL; else break; *s = '\0'; return dst; }
// g_read() static int file_g_read( lua_State* L, int n, int16_t end_char ) { if(n< 0 || n>LUAL_BUFFERSIZE) n = LUAL_BUFFERSIZE; if(end_char < 0 || end_char >255) end_char = EOF; int ec = (int)end_char; luaL_Buffer b; if((FS_OPEN_OK - 1)==file_fd) return luaL_error(L, "open a file first"); luaL_buffinit(L, &b); char *p = luaL_prepbuffer(&b); int c = EOF; int i = 0; do{ c = fs_getc(file_fd); if(c==EOF){ break; } p[i++] = (char)(0xFF & c); }while((c!=EOF) && (c!=ec) && (i<n) ); #if 0 if(i>0 && p[i-1] == '\n') i--; /* do not include `eol' */ #endif if(i==0){ luaL_pushresult(&b); /* close buffer */ return (lua_objlen(L, -1) > 0); /* check whether read something */ } luaL_addsize(&b, i); luaL_pushresult(&b); /* close buffer */ return 1; /* read at least an `eol' */ }
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); }
int cmd_get(fs_file fp, union cmd *cmd) { int type; short size; if (!fp || !cmd) return 0; if ((type = fs_getc(fp)) >= 0) { get_short(fp, &size); /* Discard unrecognised commands. */ if (type >= CMD_MAX) { fs_seek(fp, size, SEEK_CUR); type = CMD_NONE; } cmd->type = type; switch (cmd->type) { GET_CASE(CMD_END_OF_UPDATE); GET_CASE(CMD_MAKE_BALL); GET_CASE(CMD_MAKE_ITEM); GET_CASE(CMD_PICK_ITEM); GET_CASE(CMD_TILT_ANGLES); GET_CASE(CMD_SOUND); GET_CASE(CMD_TIMER); GET_CASE(CMD_STATUS); GET_CASE(CMD_COINS); GET_CASE(CMD_JUMP_ENTER); GET_CASE(CMD_JUMP_EXIT); GET_CASE(CMD_BODY_PATH); GET_CASE(CMD_BODY_TIME); GET_CASE(CMD_GOAL_OPEN); GET_CASE(CMD_SWCH_ENTER); GET_CASE(CMD_SWCH_TOGGLE); GET_CASE(CMD_SWCH_EXIT); GET_CASE(CMD_UPDATES_PER_SECOND); GET_CASE(CMD_BALL_RADIUS); GET_CASE(CMD_CLEAR_ITEMS); GET_CASE(CMD_CLEAR_BALLS); GET_CASE(CMD_BALL_POSITION); GET_CASE(CMD_BALL_BASIS); GET_CASE(CMD_BALL_PEND_BASIS); GET_CASE(CMD_VIEW_POSITION); GET_CASE(CMD_VIEW_CENTER); GET_CASE(CMD_VIEW_BASIS); GET_CASE(CMD_CURRENT_BALL); GET_CASE(CMD_PATH_FLAG); GET_CASE(CMD_STEP_SIMULATION); GET_CASE(CMD_MAP); GET_CASE(CMD_TILT_AXES); GET_CASE(CMD_MOVE_PATH); GET_CASE(CMD_MOVE_TIME); case CMD_NONE: case CMD_MAX: break; } return !fs_eof(fp); } return 0; }