소스 검색

Add a reset method member to reset the lexer with a new source

mingodad 9 년 전
부모
커밋
4a54906620
1개의 변경된 파일39개의 추가작업 그리고 9개의 파일을 삭제
  1. 39 9
      SquiLu/squirrel/sq_lexer.cpp

+ 39 - 9
SquiLu/squirrel/sq_lexer.cpp

@@ -43,21 +43,41 @@ static SQRESULT SQLexer_release_hook(SQUserPointer p, SQInteger size, void */*ep
 	return 0;
 }
 
-static SQRESULT sq_SQLexer_constructor(HSQUIRRELVM v){
-	SQ_FUNC_VARS_NO_TOP(v);
+static SQRESULT sq_SQLexer_reset_src(HSQUIRRELVM v, sq_lexer_st *self){
+    SQ_FUNC_VARS_NO_TOP(v);
 	SQ_GET_STRING(v, 2, src);
 
-	sq_lexer_st *self = (sq_lexer_st*)sq_malloc(sizeof(sq_lexer_st));//sq_newuserdata(v, sizeof(sq_lexer_st));
+    sq_release(v, &self->source);
     sq_resetobject(&self->source);
     SQRESULT rc = sq_getstackobj(v, 2, &self->source);
-    if(rc == SQ_OK) sq_addref(v, &self->source);
+    if(rc == SQ_OK)
+    {
+        sq_addref(v, &self->source);
+        self->buf.buf = src;
+        self->buf.ptr = 0;
+        self->buf.size = src_size;
+    }
+	return 1;
+}
+
+static SQRESULT sq_SQLexer_constructor(HSQUIRRELVM v){
+
+	sq_lexer_st *self = (sq_lexer_st*)sq_malloc(sizeof(sq_lexer_st));//sq_newuserdata(v, sizeof(sq_lexer_st));
+	memset(self, 0, sizeof(*self));
+
+    sq_SQLexer_reset_src(v, self);
     self->lex = (SQLexer*)sq_malloc(sizeof(SQLexer));
     new (self->lex) SQLexer();
-    self->buf.buf = src;
-    self->buf.ptr = 0;
-    self->buf.size = src_size;
     self->vm = v;
-    self->lex->Init(v->_sharedstate, sq_strbuf_lexfeed, &self->buf, NULL, NULL);
+
+    SQBool want_comments = SQFalse;
+    if(sq_gettop(v) > 2)
+    {
+        //we want comments returned by the lexer
+        sq_getbool(v, 3, &want_comments);
+    }
+
+    self->lex->Init(v->_sharedstate, sq_strbuf_lexfeed, &self->buf, NULL, NULL, want_comments);
 
     sq_setinstanceup(v, 1, self);
     sq_setreleasehook(v,1, SQLexer_release_hook);
@@ -65,6 +85,15 @@ static SQRESULT sq_SQLexer_constructor(HSQUIRRELVM v){
 	return 1;
 }
 
+static SQRESULT sq_SQLexer_reset(HSQUIRRELVM v){
+	SQ_FUNC_VARS_NO_TOP(v);
+	GET_SQLexer_INSTANCE();
+
+	sq_SQLexer_reset_src(v, self);
+    self->lex->ResetReader(sq_strbuf_lexfeed, &self->buf, 1);
+	return 1;
+}
+
 static SQRESULT sq_SQLexer_lasterror(HSQUIRRELVM v){
 	SQ_FUNC_VARS_NO_TOP(v);
 	GET_SQLexer_INSTANCE();
@@ -187,7 +216,8 @@ static SQRESULT sq_SQLexer_last_enum_token(HSQUIRRELVM v){
 #define _DECL_SQLEXER_FUNC(name,nparams,pmask) {_SC(#name),sq_SQLexer_##name,nparams,pmask}
 static SQRegFunction SQLexer_obj_funcs[]={
 
-	_DECL_SQLEXER_FUNC(constructor, 2, _SC("..")),
+	_DECL_SQLEXER_FUNC(constructor, -2, _SC(".sb")),
+	_DECL_SQLEXER_FUNC(reset, 2, _SC(".s")),
 	_DECL_SQLEXER_FUNC(tok2str, 2, _SC(".i")),
 	_DECL_SQLEXER_FUNC(token_name, 2, _SC(".i")),
 	_DECL_SQLEXER_FUNC(lasterror, 1, _SC(".")),