Просмотр исходного кода

Use sq_getscratchstr for known size

mingodad 5 лет назад
Родитель
Сommit
b5135b3297
1 измененных файлов с 21 добавлено и 16 удалено
  1. 21 16
      SquiLu-ext/sq_spawnx.cpp

+ 21 - 16
SquiLu-ext/sq_spawnx.cpp

@@ -96,8 +96,8 @@ static SQRESULT sq_spawnx_open(HSQUIRRELVM v, SQ_SpawnX *self, const char *cmd)
 	CloseHandle(hRead2);
 	CloseHandle(hPipeWrite);
 
-	if (running) return 0;
-    return sq_throwerror(v, _SC("unable to spawn process"));
+	if (running) return SQ_OK;
+	return sq_throwerror(v, _SC("unable to spawn process"));
 }
 
 #else
@@ -146,7 +146,7 @@ static SQRESULT sq_spawnx_open(HSQUIRRELVM v, SQ_SpawnX *self, const char *cmd)
         // if we get here, it's an error!
         perror("unable to spawn process");
     } else {
-        return 0;
+        return SQ_OK;
     }
     return sq_throwerror(v, _SC("unable to spawn process"));
 }
@@ -170,9 +170,9 @@ static SQRESULT sq_spawnx_releasehook(SQUserPointer p, SQInteger /*size*/, void
 {
 	SQ_SpawnX *self = ((SQ_SpawnX *)p);
 	if(self)
-    {
-        sq_free(self, sizeof(SQ_SpawnX));
-    }
+	{
+		sq_free(self, sizeof(SQ_SpawnX));
+	}
 	return 1;
 }
 
@@ -181,9 +181,9 @@ static SQRESULT sq_spawnx_constructor(HSQUIRRELVM v)
 	SQ_FUNC_VARS_NO_TOP(v);
 	SQ_GET_STRING(v, 2, cmd);
 
-    SQ_SpawnX *self = (SQ_SpawnX*)sq_malloc(sizeof(SQ_SpawnX));
+	SQ_SpawnX *self = (SQ_SpawnX*)sq_malloc(sizeof(SQ_SpawnX));
 
-    _rc_ = sq_spawnx_open(v, self, cmd);
+	_rc_ = sq_spawnx_open(v, self, cmd);
 
 	sq_setinstanceup(v,1,self);
 	sq_setreleasehook(v,1,sq_spawnx_releasehook);
@@ -194,21 +194,25 @@ static SQRESULT sq_spawnx_read(HSQUIRRELVM v)
 {
     SQ_FUNC_VARS(v);
     GET_sq_spawnx_INSTANCE(v, 1);
-    SQ_OPT_INTEGER(v, 2, read_sz, 2048);
-    SQChar *buf = sq_getscratchpad(v, read_sz);
+#define DEFAULT_BUFFSIZE 2048
+    SQ_OPT_INTEGER(v, 2, read_sz, DEFAULT_BUFFSIZE);
+    int isScratchString = (read_sz == DEFAULT_BUFFSIZE);
+    SQChar *buf =  isScratchString ? sq_getscratchstr(v, read_sz) : sq_getscratchpad(v, read_sz);
 #ifdef WIN32
     DWORD bytesRead;
     int res = ReadFile(self->hPipeRead,buf,read_sz, &bytesRead, NULL);
-    if (res == 0) {
-        sq_pushnull(v);
+    if (res == 0)  {
+	    if(isScratchString) sq_delscratchstr(v, buf);
+	    return sq_throwerror(v, _SC("error reading GetLastError() = %d"), GetLastError());
 #else
     int bytesRead = read(self->spawn_fd, buf, read_sz);
-    if (errno != 0) {
-        sq_pushinteger(v, errno);
-        //sq_pushstring(v,strerror(errno));
+    if(bytesRead < 0) {
+	    if(isScratchString) sq_delscratchstr(v, buf);
+	    return sq_throwerror(v, _SC("error reading %d : %s"), errno, strerror(errno));
 #endif
     } else {
-        sq_pushstring(v,buf, bytesRead);
+	if(isScratchString) sq_pushscratchstr(v);
+        else sq_pushstring(v,buf, bytesRead);
     }
     return 1;
 }
@@ -224,6 +228,7 @@ static SQRESULT sq_spawnx_write(HSQUIRRELVM v)
     sq_pushinteger(v, bytesWrote);
 #else
     ssize_t n = write(self->spawn_fd,str,str_size);
+    //fdatasync(self->spawn_fd);
     sq_pushinteger(v, n);
 #endif
     return 1;