lua.5.2.3源码阅读(01):文件读取相关

Lua在载入lua文件的时候,读取过程中通过cache的方式,默认cache为512字节:

1、cache中包含数据时,直接将cache中数据返回;

2、cache中不包含数据的时候,每次读取512个字节,进行cache;

 

 1 typedef struct LoadF {
 2   int n;  /* number of pre-read characters */
 3   FILE *f;  /* file being read */
 4   char buff[LUAL_BUFFERSIZE];  /* area for reading file */
 5 } LoadF;
 6 
 7 
 8 static const char *getF (lua_State *L, void *ud, size_t *size) {
 9   LoadF *lf = (LoadF *)ud;
10   (void)L;  /* not used */
11   if (lf->n > 0) {  /* are there pre-read characters to be read? */
12     *size = lf->n;  /* return them (chars already in buffer) */
13     lf->n = 0;  /* no more pre-read characters */
14   }
15   else {  /* read a block from file */
16     /* 'fread' can return > 0 *and* set the EOF flag. If next call to
17        'getF' called 'fread', it might still wait for user input.
18        The next check avoids this problem. */
19     if (feof(lf->f)) return NULL;
20     *size = fread(lf->buff, 1, sizeof(lf->buff), lf->f);  /* read block */
21   }
22   return lf->buff;
23 }

 

在载入lua文件,进行解析文件时:

 1 static void f_parser (lua_State *L, void *ud) {
 2   int i;
 3   Closure *cl;
 4   struct SParser *p = cast(struct SParser *, ud);
 5   int c = zgetc(p->z);  /* read first character */
 6 .....
 7 }
 8 
 9 #define zgetc(z)  (((z)->n--)>0 ?  cast_uchar(*(z)->p++) : luaZ_fill(z))
10 
11 struct Zio {
12   size_t n;            /* bytes still unread */
13   const char *p;        /* current position in buffer */
14   lua_Reader reader;        /* reader function */
15   void* data;            /* additional data */
16   lua_State *L;            /* Lua state (for reader) */
17 };
18 
19 int luaZ_fill (ZIO *z) {
20   size_t size;
21   lua_State *L = z->L;
22   const char *buff;
23   lua_unlock(L);
24   buff = z->reader(L, z->data, &size);
25   lua_lock(L);
26   if (buff == NULL || size == 0)
27     return EOZ;
28   z->n = size - 1;  /* discount char being returned */
29   z->p = buff;
30   return cast_uchar(*(z->p++));
31 }

 

lua_Reader reader在初始化是设置为getF,解析过程中采用cache的方式读取lua文件。
posted @ 2014-12-27 21:20  #shany  阅读(1003)  评论(0编辑  收藏  举报