Esempio n. 1
0
/*
** buffer:__gc
*/
static int lbuffer_gc(lua_State *L) 
{
	Buffer *buffer = buffer_lcheck(L, 1);
	
	if (buffer->rd || buffer->wr) {
		lua_pushlightuserdata(L, buffer);
		
		if (buffer->rd) {
			lua_getfield(L, LUA_REGISTRYINDEX, BUFFER_READERS);
			lua_pushvalue(L, -2);
			lua_pushnil(L);
			lua_rawset(L, -3);
			lua_pop(L, 1);
		}
		
		if (buffer->wr) {
			lua_getfield(L, LUA_REGISTRYINDEX, BUFFER_WRITERS);
			lua_pushvalue(L, -2);
			lua_pushnil(L);
			lua_rawset(L, -3);
			lua_pop(L, 1);
		}
		
		lua_pop(L, 1);
	}
	
	buffer_finalize(buffer);
	return 0;
}
Esempio n. 2
0
/* 
** str/nil, addr/nil, port/nil, err = socket.recvfrom(fd)
**
** won't block even if the fd is working in blocking mode.
*/
static int lsocket_recvfrom(lua_State *L) {
	int fd = luaL_checkint(L, 1);
	char addr[MAX_ADDRSTRLEN];
	int port;
	Buffer buf;
	size_t navaiable = 0;
	int err = 0;
	
	buffer_init(&buf, 0);
	err = os_getnread(fd, &navaiable);
	if (navaiable > 0) {
		uint8 *p = buffer_grow(&buf, (size_t)navaiable);
		size_t nread = 0;
		err = socket_recvfrom(fd, p, navaiable, 0, addr, &port, &nread);
		
		if (nread < navaiable)
			buffer_pop(&buf, navaiable - nread);
	}
	
	if (err != 0 || navaiable == 0) {
		lua_pushnil(L);
		lua_pushnil(L);
		lua_pushnil(L);
		lua_pushinteger(L, err);
	} else {
		lua_pushlstring(L, (const char*)buf.data, buf.datasiz);
		lua_pushstring(L, addr);
		lua_pushinteger(L, port);
		lua_pushinteger(L, 0);
	}
	buffer_finalize(&buf);
		
	return 4;
}
Esempio n. 3
0
void mexFunction( int nlhs, mxArray *plhs[], 
		  int nrhs, const mxArray*prhs[] )
     
{ 
  S2Grid S2G;
  double *xtheta, *xrho; 
  double epsilon;
  mwSize nx,nytheta,nyrho; 
  buffer ind;
  int ix, *indx;
  mxLogical *sr;
  mwIndex *irs,*jcs;
  
  
  int *iytheta;
     
  /* Check for proper number of arguments */
    
  if (nrhs != 7) { 
    mexErrMsgTxt("Seven input arguments required."); 
  } else if (nlhs > 1) {
    mexErrMsgTxt("Too many output arguments."); 
  } 

  /* get input dimensions */ 
  nx = mxGetM(xtheta_IN) * mxGetN(xtheta_IN);
  nytheta = mxGetM(ytheta_IN) * mxGetN(ytheta_IN);
  nyrho = mxGetM(yrho_IN) * mxGetN(yrho_IN);

  /* Assign pointers to the various parameters */
  S2Grid_init(&S2G, mxGetPr(yrho_IN), mxGetPr(ytheta_IN), nytheta,
	      (int*) mxGetData(iytheta_IN), *((double*) mxGetPr(prho_IN)));

  xtheta = mxGetPr(xtheta_IN); 
  xrho = mxGetPr(xrho_IN);
  epsilon = *(double*) mxGetPr(e_IN);

  /* init buffers */
  buffer_init(&ind,50*nx);
  indx = (int*) mxCalloc(nx+1,sizeof(int));


  /* find */
  for (ix=0;ix<nx;ix++){
    indx[ix] = ind.used;
    S2Grid_find_region(&S2G, xtheta[ix], xrho[ix], epsilon, &ind);
  }
  indx[nx] = ind.used;



  /*printf("found: %d - ",ind.used);
    print_int(ind.data,ind.used);*/



  /* generate sparse output matrix */
  plhs[0] = mxCreateSparseLogicalMatrix(nyrho,nx,1+indx[nx]);

  sr  = mxGetLogicals(plhs[0]); /* elements */
  irs = mxGetIr(plhs[0]); /* rows  - y */
  jcs = mxGetJc(plhs[0]); /* columns - x */

  for (ix=0;ix<indx[nx];ix++){
    sr[ix] = 1;
    irs[ix] = ind.data[ix];
  }
  for (ix=0;ix<=nx;ix++)
    jcs[ix] = indx[ix];

  
  /* free memory */
  mxFree(indx);
  buffer_finalize(&ind);
  S2Grid_finalize(&S2G);

}