1 °³¿ä
VirtualFileSystem ¾È¿¡ ÀÖ´Â ÆÄÀÏ¿¡¼ ·ç¾Æ ÆÄÀÏÀ» ÀоîµéÀ̱â.
»ý°¢ÇØ º¸¸é ¿©·¯ °¡Áö ¹æ¹ýÀÌ ÀÖ´Ù.
- ÆÑ ÆÄÀÏ ¾È¿¡´Ù ·ç¾Æ ÅØ½ºÆ® ÆÄÀÏÀ» µÎ°í, ±×°É ¸ðµÎ ¸Þ¸ð¸®·Î Àоîµé¿©¼, dostring ȤÀº luaL_loadbuffer ÇÔ¼ö¸¦ ÀÌ¿ëÇÑ´Ù.
- ÆÑ ÆÄÀÏ ¾È¿¡´Ù ·ç¾Æ ÅØ½ºÆ®/ûũ ÆÄÀÏÀ» µÎ°í, ±×°É Àӽà µð·ºÅ丮·Î »©³½ ´ÙÀ½, dofile ȤÀº luaL_loadfile ÇÔ¼ö¸¦ ÀÌ¿ëÇÑ´Ù.
- ÆÑ ÆÄÀÏ ¾È¿¡´Ù ·ç¾Æ ÅØ½ºÆ®/ûũ ÆÄÀÏÀ» µÎ°í, »ç¿ëÀÚ Àбâ ÇÔ¼ö¸¦ Á¦°øÇÏ¿©, lua_load ÇÔ¼ö¸¦ È£ÃâÇÑ´Ù.
¿©±â¼ ´Ù·ç°íÀÚ ÇÏ´Â °ÍÀº, ¸¶Áö¸· °æ¿ì´Ù. ³ª¸§´ë·Î Á¤¼®ÀûÀÎ ¹æ¹ý?
2 lua_load/lua_Reader
typedef const char* (*lua_Reader)(lua_State *L, void* data, size_t* size);
int lua_load (lua_State* L, lua_Reader reader, void* data, const char* chunkname);
lua_load ÇÔ¼ö´Â ÆÑ ÆÄÀÏ °°Àº °É »ç¿ëÇÏÁö ¾Ê´Â ÀÌ»ó, Á÷Á¢ È£ÃâÇÒ ÀÏÀº °ÅÀÇ ¾ø´Â ÇÔ¼ö´Ù. luaL_loadbuffer, loadL_loadfile ÇÔ¼ö ³»ºÎ¿¡¼ ¾Ë¾Æ¼ ó¸®ÇØÁֱ⠶§¹®ÀÌ´Ù. lauxlib.c ÆÄÀÏ¿¡ ÀÌ µÎ ÇÔ¼ö°¡ ±¸ÇöµÇ¾î Àִµ¥, ¹ÙÀ̳ʸ® ÆÄÀÏÀ» ÀоîµéÀÌ´Â ºÎºÐ¸¸ ¿Å°Üº¸ÀÚ¸é ´ÙÀ½°ú °°´Ù.
typedef struct LoadF
{
int extraline;
FILE *f;
char buff[LUAL_BUFFERSIZE];
} LoadF;
static const char *getF (lua_State *L, void *ud, size_t *size)
{
LoadF *lf = (LoadF *)ud;
(void)L;
if (lf->extraline)
{
lf->extraline = 0;
*size = 1;
return "\n";
}
if (feof(lf->f)) return NULL;
*size = fread(lf->buff, 1, LUAL_BUFFERSIZE, lf->f);
return (*size > 0) ? lf->buff : NULL;
}
LUALIB_API int luaL_loadfile (lua_State *L, const char *filename)
{
LoadF lf;
int status, readstatus;
int c;
int fnameindex = lua_gettop(L) + 1; /* index of filename on the stack */
lf.extraline = 0;
if (filename == NULL)
{
lua_pushliteral(L, "=stdin");
lf.f = stdin;
}
else
{
lua_pushfstring(L, "@%s", filename);
lf.f = fopen(filename, "r");
if (lf.f == NULL) return errfile(L, "open", fnameindex);
}
c = getc(lf.f);
if (c == '#') /* Unix exec. file? */
{
lf.extraline = 1;
while ((c = getc(lf.f)) != EOF && c != '\n') ; /* skip first line */
if (c == '\n') c = getc(lf.f);
}
if (c == LUA_SIGNATURE[0] && lf.f != stdin) /* binary file? */
{
fclose(lf.f);
lf.f = fopen(filename, "rb"); /* reopen in binary mode */
if (lf.f == NULL) return errfile(L, "reopen", fnameindex);
/* skip eventual `#!...' */
while ((c = getc(lf.f)) != EOF && c != LUA_SIGNATURE[0]) ;
lf.extraline = 0;
}
ungetc(c, lf.f);
status = lua_load(L, getF, &lf, lua_tostring(L, -1));
readstatus = ferror(lf.f);
if (lf.f != stdin) fclose(lf.f); /* close file (even in case of errors) */
if (readstatus)
{
lua_settop(L, fnameindex); /* ignore results from `lua_load' */
return errfile(L, "read", fnameindex);
}
lua_remove(L, fnameindex);
return status;
} getF ¶ó´Â ÇÔ¼ö°¡ ûũ ¸®´õ ÇÔ¼ö´Ù. ÆÄÀÏ Æ÷ÀÎÅ͸¦ ÀúÀåÇϰí, ÇÔ¼ö È£ÃâÀÌ µé¾î¿Ã ¶§¸¶´Ù ÆÄÀÏ¿¡¼ ³»¿ëÀ» Àоîµé¿© ¹öÆÛ¿¡´Ù º¹»çÇÑ ´ÙÀ½, ¹öÆÛ Æ÷ÀÎÅ͸¦ ¹ÝȯÇÏ´Â °É º¼ ¼ö ÀÖ´Ù. ÆÄÀÏ¿¡ ´õ ÀÌ»ó ÀоîµéÀÏ °ÍÀÌ ¾ø´Ù¸é NULLÀ» ¹ÝȯÇÑ´Ù.
Áï lua_Reader ÇÔ¼ö¿¡¼ ÇØ¾ßÇÏ´Â ÀÏÀº...
- Àμö·Î ¹ÞÀº À¯Àú µ¥ÀÌÅÍ Æ÷ÀÎÅ͸¦ ÀÌ¿ëÇØ, ¾îµð¼ºÎÅÍ µ¥ÀÌÅ͸¦ Àоîµé¿©¾ß ÇÒÁö ÆÇ´ÜÇÑ´Ù.
- ½ºÆ®¸²¿¡ ³²Àº µ¥ÀÌÅͰ¡ ÀÖ´Ù¸é size º¯¼ö °ªÀ» ³²Àº µ¥ÀÌÅÍÀÇ ±æÀÌ·Î ¼¼ÆÃÇϰí, µ¥ÀÌÅÍ Æ÷ÀÎÅÍ Á¦ÀÏ ¾ÕÂÊÀ» ¹ÝȯÇÑ´Ù.
- ½ºÆ®¸²¿¡ ³²Àº µ¥ÀÌÅͰ¡ ¾ø´Ù¸é NULLÀ» ¹ÝȯÇÑ´Ù.
ÀÌ°É Âü°í·Î »ç¿ëÀÚ ÇÔ¼ö¸¦ ¸¸µé¾î º¸ÀÚ¸é...
struct MEMORY_FILE
{
char* start; // °¡»ó ÆÄÀÏ ³»¿ëÀÇ ¸Ç ¾ÕÂÊ Æ÷ÀÎÅÍ
size_t total; // °¡»ó ÆÄÀÏÀÇ Àüü ±æÀÌ
size_t offset; // ÇöÀç±îÁö ÀоîµéÀÎ µ¥ÀÌÅÍÀÇ ±æÀÌ
char buff[1024]; // À̹ø¿¡ ÀоîµéÀÎ µ¥ÀÌÅ͸¦ º¹»çÇÑ ¹öÆÛ
};
static const char* MemoryReader(lua_State* L, void* ud, size_t* size)
{
MEMORY_FILE* file = reinterpret_cast<MEMORY_FILE*>(ud);
*size = std::min(file->total - file->offset, 1024);
if (*size > 0)
{
memcpy(file->buff, file->start + file->offset, *size);
file->offset += *size;
return file->buff;
}
else
{
return NULL;
}
}
int my_loadfile(lua_State* L, vfs* filesystem, const char* filename)
{
MEMORY_FILE file;
file.start = vfs->get_file_start(filename); // VFS¿¡¼ ÆÄÀÏÀ» Àоîµé¿´´Ù°í Ä¡ÀÚ.
file.total = vfs->get_file_size(filename); // VFS¿¡¼ ÆÄÀÏ »çÀÌÁ ¾Ë¾Æ³Â´Ù°í Ä¡ÀÚ.
file.offset = 0;
return lua_load(L, MemoryReader, &file, filename);
} ´ëÃæ ÀÌ·± ´À³¦? ¾µµ¥¾øÀÌ ¸Þ¸ð¸®¿¡ º¹»ç¸¦ Çϰí Àִµ¥, ±×³É »ç¿ë¹ýÀ» Ç¥½ÃÇϱâ À§ÇØ...
3 ¹®Á¦Á¡
¸ðµâ °æ·Î´Â µµ´ëü ¾î¶»°Ô µÇ´Â °ÍÀ̳Ä!
SeriousMoin v1 (koMoinMoin 1.0a4 Modified)