** Look for a C function named 'sym' in a dynamically loaded library ** 'path'. ** First, check whether the library is already loaded; if not, try ** to load it. ** Then, if 'sym' is '*', return true (as library has been loaded). ** Otherwise, look for symbol 'sym' in the library and push a ** C function with that symbol. ** Return 0 and 'true' or a function in the stack; in case of ** errors, ret
| 336 | ** errors, return an error code and an error message in the stack. |
| 337 | */ |
| 338 | static int lookforfunc(lua_State *L, const char *path, const char *sym) { |
| 339 | void *reg = checkclib(L, path); /* check loaded C libraries */ |
| 340 | if (reg == nullptr) { /* must load library? */ |
| 341 | reg = lsys_load(L, path, *sym == '*'); /* global symbols if 'sym'=='*' */ |
| 342 | if (reg == nullptr) return ERRLIB; /* unable to load library */ |
| 343 | addtoclib(L, path, reg); |
| 344 | } |
| 345 | if (*sym == '*') { /* loading only library (no function)? */ |
| 346 | lua_pushboolean(L, 1); /* return 'true' */ |
| 347 | return 0; /* no errors */ |
| 348 | } |
| 349 | else { |
| 350 | lua_CFunction f = lsys_sym(L, reg, sym); |
| 351 | if (f == nullptr) |
| 352 | return ERRFUNC; /* unable to find function */ |
| 353 | lua_pushcfunction(L, f); /* else create new function */ |
| 354 | return 0; /* no errors */ |
| 355 | } |
| 356 | } |
| 357 | |
| 358 | |
| 359 | static int ll_loadlib(lua_State *L) { |
no test coverage detected