/* ** 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; }
/* ** 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; }
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); }