diff options
| author | Mitja Felicijan <mitja.felicijan@gmail.com> | 2025-08-06 04:42:52 +0200 |
|---|---|---|
| committer | Mitja Felicijan <mitja.felicijan@gmail.com> | 2025-08-06 04:42:52 +0200 |
| commit | 9b7a4a71f36486a8b186339f60befc3ea1bac6f1 (patch) | |
| tree | ec5733a40d531b906e15e8168b60050b4439c673 | |
| download | bidi-9b7a4a71f36486a8b186339f60befc3ea1bac6f1.tar.gz | |
Engage!
83 files changed, 49139 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..c743b46 --- /dev/null +++ b/.gitignore @@ -0,0 +1,6 @@ +# Bianry files +bidi + +# Build artefacts +vendor/lua*/**/*.o +vendor/lua*/**/*.a diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..8bd52b9 --- /dev/null +++ b/Makefile @@ -0,0 +1,13 @@ +RAYLIB := raylib-5.5_linux_amd64 +LUA := lua-5.4.8 + +CC ?= tcc +CFLAGS := -std=c99 -v -g -I./vendor/$(RAYLIB)/include -I./vendor/$(LUA)/src +LDFLAGS := -L./vendor/$(RAYLIB)/lib -lraylib -L./vendor/$(LUA)/src -llua -lm +PROG := bidi + +$(PROG): lua *.c + $(CC) $(CFLAGS) *.c -o $(PROG) $(LDFLAGS) + +lua: + cd vendor/$(LUA) && make diff --git a/README.md b/README.md new file mode 100644 index 0000000..405d4a3 --- /dev/null +++ b/README.md @@ -0,0 +1,19 @@ +# Bidi - Game development framework + +Bidi is a tiny framework for developing small video games for recreational +purpose. It takes heavy inspiration from LÖVE and Pico8. + +You develop your games in Lua and you are only allowed to have one Lua file +where all your code lives. You can then load external assets like images and +sounds. + +## Libraries + +- https://github.com/rxi/microtar +- https://github.com/lua/lua +- https://github.com/raysan5/raylib + +## Inspiration & Materials + +https://www.love2d.org/wiki/Main_Page +https://www.lexaloffle.com/dl/docs/pico-8_manual.html diff --git a/archive/lua-5.4.8.tar.gz b/archive/lua-5.4.8.tar.gz Binary files differnew file mode 100644 index 0000000..d715bac --- /dev/null +++ b/archive/lua-5.4.8.tar.gz diff --git a/archive/raylib-5.5_linux_amd64.tar.gz b/archive/raylib-5.5_linux_amd64.tar.gz Binary files differnew file mode 100644 index 0000000..f923d96 --- /dev/null +++ b/archive/raylib-5.5_linux_amd64.tar.gz @@ -0,0 +1,83 @@ +#include <stdio.h> + +#include "raylib.h" +#include "lua.h" +#include "lualib.h" +#include "lauxlib.h" + +#define IN_FILE "test/main.lua" +#define DEBUG_LEVEL LOG_DEBUG + +static int l_open_window(lua_State *L) { + int width = luaL_checknumber(L, 1); + int height = luaL_checknumber(L, 2); + const char *title = luaL_checkstring(L, 3); + SetConfigFlags(FLAG_WINDOW_RESIZABLE | FLAG_VSYNC_HINT | FLAG_WINDOW_HIGHDPI); + InitWindow(width, height, title); + TraceLog(LOG_DEBUG, "l_open_window"); + return 0; +} + +static int l_window_should_close(lua_State *L) { + lua_pushboolean(L, WindowShouldClose()); + return 1; +} + +static int l_set_fps(lua_State *L) { + int fps = luaL_checknumber(L, 1); + SetTargetFPS(fps); + TraceLog(LOG_DEBUG, "l_set_fps"); + return 0; +} + +static int l_close_window(lua_State *L) { + CloseWindow(); + TraceLog(LOG_DEBUG, "l_close_window"); + return 0; +} + +static int l_begin_drawing(lua_State *L) { + BeginDrawing(); + return 0; +} + +static int l_end_drawing(lua_State *L) { + EndDrawing(); + return 0; +} + +static int l_clear_window(lua_State *L) { + ClearBackground(BLACK); + return 0; +} + +static int l_draw_fps(lua_State *L) { + DrawFPS(GetScreenWidth() - 100, 20); + return 0; +} + +int main(void) { + SetTraceLogLevel(DEBUG_LEVEL); + + lua_State *L = luaL_newstate(); + luaL_openlibs(L); + + lua_register(L, "open_window", l_open_window); + lua_register(L, "close_window", l_close_window); + lua_register(L, "window_should_close", l_window_should_close); + lua_register(L, "begin_drawing", l_begin_drawing); + lua_register(L, "end_drawing", l_end_drawing); + lua_register(L, "set_fps", l_set_fps); + lua_register(L, "draw_fps", l_draw_fps); + lua_register(L, "clear_window", l_clear_window); + + // TODO: This should probably use loadbuffer instead. + // https://www.lua.org/manual/5.4/manual.html#luaL_loadbuffer + if (luaL_loadfile(L, IN_FILE) || lua_pcall(L, 0, 0, 0)) { + fprintf(stderr, "Error: %s\n", lua_tostring(L, -1)); + return 1; + } + + lua_close(L); + return 0; +} diff --git a/stdlib/tilemap.lua b/stdlib/tilemap.lua new file mode 100644 index 0000000..e2dad67 --- /dev/null +++ b/stdlib/tilemap.lua @@ -0,0 +1,2 @@ +-- This is a placeholder file for potential standard library that extends the +-- framework with additional functionalities. @@ -0,0 +1,5858 @@ +!_TAG_FILE_FORMAT 2 /extended format; --format=1 will not append ;" to lines/ +!_TAG_FILE_SORTED 1 /0=unsorted, 1=sorted, 2=foldcase/ +!_TAG_OUTPUT_EXCMD mixed /number, pattern, mixed, or combineV2/ +!_TAG_OUTPUT_FILESEP slash /slash or backslash/ +!_TAG_OUTPUT_MODE u-ctags /u-ctags or e-ctags/ +!_TAG_PATTERN_LENGTH_LIMIT 96 /0 for no limit/ +!_TAG_PROC_CWD /home/m/Projects/bidi/ // +!_TAG_PROGRAM_AUTHOR Universal Ctags Team // +!_TAG_PROGRAM_NAME Universal Ctags /Derived from Exuberant Ctags/ +!_TAG_PROGRAM_URL https://ctags.io/ /official site/ +!_TAG_PROGRAM_VERSION 5.9.0 // +$(LUAC_T) vendor/lua-5.4.8/src/Makefile /^$(LUAC_T): $(LUAC_O) $(LUA_A)$/;" t +$(LUA_A) vendor/lua-5.4.8/src/Makefile /^$(LUA_A): $(BASE_O)$/;" t +$(LUA_T) vendor/lua-5.4.8/src/Makefile /^$(LUA_T): $(LUA_O) $(LUA_A)$/;" t +$(PLATS) vendor/lua-5.4.8/Makefile /^$(PLATS) help test clean:$/;" t +$(PROG) Makefile /^$(PROG): lua *.c$/;" t +ABSLINEINFO vendor/lua-5.4.8/src/ldebug.h /^#define ABSLINEINFO /;" d +ABSTKEYCONSTANT vendor/lua-5.4.8/src/lobject.h /^#define ABSTKEYCONSTANT /;" d +AGEBITS vendor/lua-5.4.8/src/lgc.h /^#define AGEBITS /;" d +AIX vendor/lua-5.4.8/src/Makefile /^AIX aix:$/;" t +ALL vendor/lua-5.4.8/src/Makefile /^ALL= all$/;" m +ALL_A vendor/lua-5.4.8/src/Makefile /^ALL_A= $(LUA_A)$/;" m +ALL_O vendor/lua-5.4.8/src/Makefile /^ALL_O= $(BASE_O) $(LUA_O) $(LUAC_O)$/;" m +ALL_T vendor/lua-5.4.8/src/Makefile /^ALL_T= $(LUA_A) $(LUA_T) $(LUAC_T)$/;" m +ALPHABIT vendor/lua-5.4.8/src/lctype.h /^#define ALPHABIT /;" d +APIENTRY vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ #define APIENTRY /;" d +APIENTRY vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ #define APIENTRY$/;" d +AR vendor/lua-5.4.8/src/Makefile /^AR= ar rcu$/;" m +AbsLineInfo vendor/lua-5.4.8/src/lobject.h /^typedef struct AbsLineInfo {$/;" s +AbsLineInfo vendor/lua-5.4.8/src/lobject.h /^} AbsLineInfo;$/;" t typeref:struct:AbsLineInfo +AttachAudioMixedProcessor vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void AttachAudioMixedProcessor(AudioCallback processor); \/\/ Attach audio stream processo/;" p typeref:typename:RLAPI void +AttachAudioStreamProcessor vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void AttachAudioStreamProcessor(AudioStream stream, AudioCallback processor); \/\/ Attach /;" p typeref:typename:RLAPI void +AudioCallback vendor/raylib-5.5_linux_amd64/include/raylib.h /^typedef void (*AudioCallback)(void *bufferData, unsigned int frames);$/;" t typeref:typename:void (*)(void * bufferData,unsigned int frames) +AudioStream vendor/raylib-5.5_linux_amd64/include/raylib.h /^typedef struct AudioStream {$/;" s +AudioStream vendor/raylib-5.5_linux_amd64/include/raylib.h /^} AudioStream;$/;" t typeref:struct:AudioStream +AutomationEvent vendor/raylib-5.5_linux_amd64/include/raylib.h /^typedef struct AutomationEvent {$/;" s +AutomationEvent vendor/raylib-5.5_linux_amd64/include/raylib.h /^} AutomationEvent;$/;" t typeref:struct:AutomationEvent +AutomationEventList vendor/raylib-5.5_linux_amd64/include/raylib.h /^typedef struct AutomationEventList {$/;" s +AutomationEventList vendor/raylib-5.5_linux_amd64/include/raylib.h /^} AutomationEventList;$/;" t typeref:struct:AutomationEventList +B vendor/lua-5.4.8/src/lstrlib.c /^ luaL_Buffer B;$/;" m struct:str_Writer typeref:typename:luaL_Buffer file: +BASE_O vendor/lua-5.4.8/src/Makefile /^BASE_O= $(CORE_O) $(LIB_O) $(MYOBJS)$/;" m +BASIC_STACK_SIZE vendor/lua-5.4.8/src/lstate.h /^#define BASIC_STACK_SIZE /;" d +BEIGE vendor/raylib-5.5_linux_amd64/include/raylib.h /^#define BEIGE /;" d +BITRAS vendor/lua-5.4.8/src/lobject.h /^#define BITRAS /;" d +BIT_ISCOLLECTABLE vendor/lua-5.4.8/src/lobject.h /^#define BIT_ISCOLLECTABLE /;" d +BLACK vendor/raylib-5.5_linux_amd64/include/raylib.h /^#define BLACK /;" d +BLACKBIT vendor/lua-5.4.8/src/lgc.h /^#define BLACKBIT /;" d +BLANK vendor/raylib-5.5_linux_amd64/include/raylib.h /^#define BLANK /;" d +BLEND_ADDITIVE vendor/raylib-5.5_linux_amd64/include/raylib.h /^ BLEND_ADDITIVE, \/\/ Blend textures adding colors$/;" e enum:__anon77d6622f1203 +BLEND_ADD_COLORS vendor/raylib-5.5_linux_amd64/include/raylib.h /^ BLEND_ADD_COLORS, \/\/ Blend textures adding colors (alternative)$/;" e enum:__anon77d6622f1203 +BLEND_ALPHA vendor/raylib-5.5_linux_amd64/include/raylib.h /^ BLEND_ALPHA = 0, \/\/ Blend textures considering alpha (default)$/;" e enum:__anon77d6622f1203 +BLEND_ALPHA_PREMULTIPLY vendor/raylib-5.5_linux_amd64/include/raylib.h /^ BLEND_ALPHA_PREMULTIPLY, \/\/ Blend premultiplied textures considering alpha$/;" e enum:__anon77d6622f1203 +BLEND_CUSTOM vendor/raylib-5.5_linux_amd64/include/raylib.h /^ BLEND_CUSTOM, \/\/ Blend textures using custom src\/dst factors (use rlSet/;" e enum:__anon77d6622f1203 +BLEND_CUSTOM_SEPARATE vendor/raylib-5.5_linux_amd64/include/raylib.h /^ BLEND_CUSTOM_SEPARATE \/\/ Blend textures using custom rgb\/alpha separate src\/ds/;" e enum:__anon77d6622f1203 +BLEND_MULTIPLIED vendor/raylib-5.5_linux_amd64/include/raylib.h /^ BLEND_MULTIPLIED, \/\/ Blend textures multiplying colors$/;" e enum:__anon77d6622f1203 +BLEND_SUBTRACT_COLORS vendor/raylib-5.5_linux_amd64/include/raylib.h /^ BLEND_SUBTRACT_COLORS, \/\/ Blend textures subtracting colors (alternative)$/;" e enum:__anon77d6622f1203 +BLUE vendor/raylib-5.5_linux_amd64/include/raylib.h /^#define BLUE /;" d +BROWN vendor/raylib-5.5_linux_amd64/include/raylib.h /^#define BROWN /;" d +BUFVFS vendor/lua-5.4.8/src/lobject.c /^#define BUFVFS /;" d file: +BeginBlendMode vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void BeginBlendMode(int mode); \/\/ Begin blending mode (alph/;" p typeref:typename:RLAPI void +BeginDrawing vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void BeginDrawing(void); \/\/ Setup canvas (framebuffer/;" p typeref:typename:RLAPI void +BeginMode2D vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void BeginMode2D(Camera2D camera); \/\/ Begin 2D mode with custom/;" p typeref:typename:RLAPI void +BeginMode3D vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void BeginMode3D(Camera3D camera); \/\/ Begin 3D mode with custom/;" p typeref:typename:RLAPI void +BeginScissorMode vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void BeginScissorMode(int x, int y, int width, int height); \/\/ Begin scissor mode (defin/;" p typeref:typename:RLAPI void +BeginShaderMode vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void BeginShaderMode(Shader shader); \/\/ Begin custom shader drawi/;" p typeref:typename:RLAPI void +BeginTextureMode vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void BeginTextureMode(RenderTexture2D target); \/\/ Begin drawing to render t/;" p typeref:typename:RLAPI void +BeginVrStereoMode vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void BeginVrStereoMode(VrStereoConfig config); \/\/ Begin stereo rendering (r/;" p typeref:typename:RLAPI void +Bidi - Game development framework README.md /^# Bidi - Game development framework$/;" c +BinOpr vendor/lua-5.4.8/src/lcode.h /^typedef enum BinOpr {$/;" g +BinOpr vendor/lua-5.4.8/src/lcode.h /^} BinOpr;$/;" t typeref:enum:BinOpr +BlendMode vendor/raylib-5.5_linux_amd64/include/raylib.h /^} BlendMode;$/;" t typeref:enum:__anon77d6622f1203 +BlockCnt vendor/lua-5.4.8/src/lparser.c /^typedef struct BlockCnt {$/;" s file: +BlockCnt vendor/lua-5.4.8/src/lparser.c /^} BlockCnt;$/;" t typeref:struct:BlockCnt file: +BoneInfo vendor/raylib-5.5_linux_amd64/include/raylib.h /^typedef struct BoneInfo {$/;" s +BoneInfo vendor/raylib-5.5_linux_amd64/include/raylib.h /^} BoneInfo;$/;" t typeref:struct:BoneInfo +BoundingBox vendor/raylib-5.5_linux_amd64/include/raylib.h /^typedef struct BoundingBox {$/;" s +BoundingBox vendor/raylib-5.5_linux_amd64/include/raylib.h /^} BoundingBox;$/;" t typeref:struct:BoundingBox +BuffFS vendor/lua-5.4.8/src/lobject.c /^typedef struct BuffFS {$/;" s file: +BuffFS vendor/lua-5.4.8/src/lobject.c /^} BuffFS;$/;" t typeref:struct:BuffFS file: +CAMERA_CUSTOM vendor/raylib-5.5_linux_amd64/include/raylib.h /^ CAMERA_CUSTOM = 0, \/\/ Camera custom, controlled by user (UpdateCamera() does /;" e enum:__anon77d6622f1403 +CAMERA_FIRST_PERSON vendor/raylib-5.5_linux_amd64/include/raylib.h /^ CAMERA_FIRST_PERSON, \/\/ Camera first person$/;" e enum:__anon77d6622f1403 +CAMERA_FREE vendor/raylib-5.5_linux_amd64/include/raylib.h /^ CAMERA_FREE, \/\/ Camera free mode$/;" e enum:__anon77d6622f1403 +CAMERA_ORBITAL vendor/raylib-5.5_linux_amd64/include/raylib.h /^ CAMERA_ORBITAL, \/\/ Camera orbital, around target, zoom supported$/;" e enum:__anon77d6622f1403 +CAMERA_ORTHOGRAPHIC vendor/raylib-5.5_linux_amd64/include/raylib.h /^ CAMERA_ORTHOGRAPHIC \/\/ Orthographic projection$/;" e enum:__anon77d6622f1503 +CAMERA_PERSPECTIVE vendor/raylib-5.5_linux_amd64/include/raylib.h /^ CAMERA_PERSPECTIVE = 0, \/\/ Perspective projection$/;" e enum:__anon77d6622f1503 +CAMERA_THIRD_PERSON vendor/raylib-5.5_linux_amd64/include/raylib.h /^ CAMERA_THIRD_PERSON \/\/ Camera third person$/;" e enum:__anon77d6622f1403 +CAP_POSITION vendor/lua-5.4.8/src/lstrlib.c /^#define CAP_POSITION /;" d file: +CAP_UNFINISHED vendor/lua-5.4.8/src/lstrlib.c /^#define CAP_UNFINISHED /;" d file: +CC Makefile /^CC ?= tcc$/;" m +CC vendor/lua-5.4.8/src/Makefile /^CC= gcc -std=gnu99$/;" m +CClosure vendor/lua-5.4.8/src/lobject.h /^typedef struct CClosure {$/;" s +CClosure vendor/lua-5.4.8/src/lobject.h /^} CClosure;$/;" t typeref:struct:CClosure +CFLAGS Makefile /^CFLAGS := -std=c99 -v -g -I.\/vendor\/$(RAYLIB)\/include -I.\/vendor\/$(LUA)\/src$/;" m +CFLAGS vendor/lua-5.4.8/src/Makefile /^CFLAGS= -O2 -Wall -Wextra -DLUA_COMPAT_5_3 $(SYSCFLAGS) $(MYCFLAGS)$/;" m +CIST_C vendor/lua-5.4.8/src/lstate.h /^#define CIST_C /;" d +CIST_CLSRET vendor/lua-5.4.8/src/lstate.h /^#define CIST_CLSRET /;" d +CIST_FIN vendor/lua-5.4.8/src/lstate.h /^#define CIST_FIN /;" d +CIST_FRESH vendor/lua-5.4.8/src/lstate.h /^#define CIST_FRESH /;" d +CIST_HOOKED vendor/lua-5.4.8/src/lstate.h /^#define CIST_HOOKED /;" d +CIST_HOOKYIELD vendor/lua-5.4.8/src/lstate.h /^#define CIST_HOOKYIELD /;" d +CIST_LEQ vendor/lua-5.4.8/src/lstate.h /^#define CIST_LEQ /;" d +CIST_OAH vendor/lua-5.4.8/src/lstate.h /^#define CIST_OAH /;" d +CIST_RECST vendor/lua-5.4.8/src/lstate.h /^#define CIST_RECST /;" d +CIST_TAIL vendor/lua-5.4.8/src/lstate.h /^#define CIST_TAIL /;" d +CIST_TRAN vendor/lua-5.4.8/src/lstate.h /^#define CIST_TRAN /;" d +CIST_YPCALL vendor/lua-5.4.8/src/lstate.h /^#define CIST_YPCALL /;" d +CLIBS vendor/lua-5.4.8/src/loadlib.c /^static const char *const CLIBS = "_CLIBS";$/;" v typeref:typename:const char * const file: +CLITERAL vendor/raylib-5.5_linux_amd64/include/raylib.h /^ #define CLITERAL(/;" d +CLOSEKTOP vendor/lua-5.4.8/src/lfunc.h /^#define CLOSEKTOP /;" d +CMCFLAGS vendor/lua-5.4.8/src/Makefile /^CMCFLAGS= $/;" m +COMMENT vendor/lua-5.4.8/src/luac.c /^#define COMMENT /;" d file: +CORE_O vendor/lua-5.4.8/src/Makefile /^CORE_O= lapi.o lcode.o lctype.o ldebug.o ldo.o ldump.o lfunc.o lgc.o llex.o lmem.o lobject.o lop/;" m +COS_DEAD vendor/lua-5.4.8/src/lcorolib.c /^#define COS_DEAD /;" d file: +COS_NORM vendor/lua-5.4.8/src/lcorolib.c /^#define COS_NORM /;" d file: +COS_RUN vendor/lua-5.4.8/src/lcorolib.c /^#define COS_RUN /;" d file: +COS_YIELD vendor/lua-5.4.8/src/lcorolib.c /^#define COS_YIELD /;" d file: +CREATE_ABCk vendor/lua-5.4.8/src/lopcodes.h /^#define CREATE_ABCk(/;" d +CREATE_ABx vendor/lua-5.4.8/src/lopcodes.h /^#define CREATE_ABx(/;" d +CREATE_Ax vendor/lua-5.4.8/src/lopcodes.h /^#define CREATE_Ax(/;" d +CREATE_sJ vendor/lua-5.4.8/src/lopcodes.h /^#define CREATE_sJ(/;" d +CUBEMAP_LAYOUT_AUTO_DETECT vendor/raylib-5.5_linux_amd64/include/raylib.h /^ CUBEMAP_LAYOUT_AUTO_DETECT = 0, \/\/ Automatically detect layout type$/;" e enum:__anon77d6622f1003 +CUBEMAP_LAYOUT_CROSS_FOUR_BY_THREE vendor/raylib-5.5_linux_amd64/include/raylib.h /^ CUBEMAP_LAYOUT_CROSS_FOUR_BY_THREE \/\/ Layout is defined by a 4x3 cross with cubemap fa/;" e enum:__anon77d6622f1003 +CUBEMAP_LAYOUT_CROSS_THREE_BY_FOUR vendor/raylib-5.5_linux_amd64/include/raylib.h /^ CUBEMAP_LAYOUT_CROSS_THREE_BY_FOUR, \/\/ Layout is defined by a 3x4 cross with cubemap f/;" e enum:__anon77d6622f1003 +CUBEMAP_LAYOUT_LINE_HORIZONTAL vendor/raylib-5.5_linux_amd64/include/raylib.h /^ CUBEMAP_LAYOUT_LINE_HORIZONTAL, \/\/ Layout is defined by a horizontal line with fac/;" e enum:__anon77d6622f1003 +CUBEMAP_LAYOUT_LINE_VERTICAL vendor/raylib-5.5_linux_amd64/include/raylib.h /^ CUBEMAP_LAYOUT_LINE_VERTICAL, \/\/ Layout is defined by a vertical line with faces$/;" e enum:__anon77d6622f1003 +CallInfo vendor/lua-5.4.8/src/lstate.h /^struct CallInfo {$/;" s +CallInfo vendor/lua-5.4.8/src/lstate.h /^typedef struct CallInfo CallInfo;$/;" t typeref:struct:CallInfo +CallS vendor/lua-5.4.8/src/lapi.c /^struct CallS { \/* data to 'f_call' *\/$/;" s file: +Camera vendor/raylib-5.5_linux_amd64/include/raylib.h /^typedef Camera3D Camera; \/\/ Camera type fallback, defaults to Camera3D$/;" t typeref:typename:Camera3D +Camera2D vendor/raylib-5.5_linux_amd64/include/raylib.h /^typedef struct Camera2D {$/;" s +Camera2D vendor/raylib-5.5_linux_amd64/include/raylib.h /^} Camera2D;$/;" t typeref:struct:Camera2D +Camera3D vendor/raylib-5.5_linux_amd64/include/raylib.h /^typedef struct Camera3D {$/;" s +Camera3D vendor/raylib-5.5_linux_amd64/include/raylib.h /^} Camera3D;$/;" t typeref:struct:Camera3D +CameraMode vendor/raylib-5.5_linux_amd64/include/raylib.h /^} CameraMode;$/;" t typeref:enum:__anon77d6622f1403 +CameraProjection vendor/raylib-5.5_linux_amd64/include/raylib.h /^} CameraProjection;$/;" t typeref:enum:__anon77d6622f1503 +ChangeDirectory vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI bool ChangeDirectory(const char *dir); \/\/ Change working directory,/;" p typeref:typename:RLAPI bool +CheckCollisionBoxSphere vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI bool CheckCollisionBoxSphere(BoundingBox box, Vector3 center, float radius); /;" p typeref:typename:RLAPI bool +CheckCollisionBoxes vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI bool CheckCollisionBoxes(BoundingBox box1, BoundingBox box2); /;" p typeref:typename:RLAPI bool +CheckCollisionCircleLine vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI bool CheckCollisionCircleLine(Vector2 center, float radius, Vector2 p1, Vector2 p2); /;" p typeref:typename:RLAPI bool +CheckCollisionCircleRec vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI bool CheckCollisionCircleRec(Vector2 center, float radius, Rectangle rec); /;" p typeref:typename:RLAPI bool +CheckCollisionCircles vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI bool CheckCollisionCircles(Vector2 center1, float radius1, Vector2 center2, float radius2)/;" p typeref:typename:RLAPI bool +CheckCollisionLines vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI bool CheckCollisionLines(Vector2 startPos1, Vector2 endPos1, Vector2 startPos2, Vector2 en/;" p typeref:typename:RLAPI bool +CheckCollisionPointCircle vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI bool CheckCollisionPointCircle(Vector2 point, Vector2 center, float radius); /;" p typeref:typename:RLAPI bool +CheckCollisionPointLine vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI bool CheckCollisionPointLine(Vector2 point, Vector2 p1, Vector2 p2, int threshold); /;" p typeref:typename:RLAPI bool +CheckCollisionPointPoly vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI bool CheckCollisionPointPoly(Vector2 point, const Vector2 *points, int pointCount); /;" p typeref:typename:RLAPI bool +CheckCollisionPointRec vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI bool CheckCollisionPointRec(Vector2 point, Rectangle rec); /;" p typeref:typename:RLAPI bool +CheckCollisionPointTriangle vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI bool CheckCollisionPointTriangle(Vector2 point, Vector2 p1, Vector2 p2, Vector2 p3); /;" p typeref:typename:RLAPI bool +CheckCollisionRecs vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI bool CheckCollisionRecs(Rectangle rec1, Rectangle rec2); /;" p typeref:typename:RLAPI bool +CheckCollisionSpheres vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI bool CheckCollisionSpheres(Vector3 center1, float radius1, Vector3 center2, float radius2)/;" p typeref:typename:RLAPI bool +Clamp vendor/raylib-5.5_linux_amd64/include/raymath.h /^RMAPI float Clamp(float value, float min, float max)$/;" f typeref:typename:RMAPI float +ClearBackground vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void ClearBackground(Color color); \/\/ Set background color (fra/;" p typeref:typename:RLAPI void +ClearWindowState vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void ClearWindowState(unsigned int flags); \/\/ Clear window configuratio/;" p typeref:typename:RLAPI void +CloseAudioDevice vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void CloseAudioDevice(void); \/\/ Close the audio devic/;" p typeref:typename:RLAPI void +CloseP vendor/lua-5.4.8/src/ldo.c /^struct CloseP {$/;" s file: +CloseWindow vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void CloseWindow(void); \/\/ Close window and unload O/;" p typeref:typename:RLAPI void +Closure vendor/lua-5.4.8/src/lobject.h /^typedef union Closure {$/;" u +Closure vendor/lua-5.4.8/src/lobject.h /^} Closure;$/;" t typeref:union:Closure +ClosureHeader vendor/lua-5.4.8/src/lobject.h /^#define ClosureHeader /;" d +CodepointToUTF8 vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI const char *CodepointToUTF8(int codepoint, int *utf8Size); \/\/ Encode one codepoin/;" p typeref:typename:RLAPI const char * +Color vendor/raylib-5.5_linux_amd64/include/raylib.h /^typedef struct Color {$/;" s +Color vendor/raylib-5.5_linux_amd64/include/raylib.h /^} Color;$/;" t typeref:struct:Color +ColorAlpha vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI Color ColorAlpha(Color color, float alpha); \/\/ Get color with /;" p typeref:typename:RLAPI Color +ColorAlphaBlend vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI Color ColorAlphaBlend(Color dst, Color src, Color tint); \/\/ Get src alpha-b/;" p typeref:typename:RLAPI Color +ColorBrightness vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI Color ColorBrightness(Color color, float factor); \/\/ Get color with /;" p typeref:typename:RLAPI Color +ColorContrast vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI Color ColorContrast(Color color, float contrast); \/\/ Get color with /;" p typeref:typename:RLAPI Color +ColorFromHSV vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI Color ColorFromHSV(float hue, float saturation, float value); \/\/ Get a Color fro/;" p typeref:typename:RLAPI Color +ColorFromNormalized vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI Color ColorFromNormalized(Vector4 normalized); \/\/ Get Color from /;" p typeref:typename:RLAPI Color +ColorIsEqual vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI bool ColorIsEqual(Color col1, Color col2); \/\/ Check if two co/;" p typeref:typename:RLAPI bool +ColorLerp vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI Color ColorLerp(Color color1, Color color2, float factor); \/\/ Get color lerp /;" p typeref:typename:RLAPI Color +ColorNormalize vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI Vector4 ColorNormalize(Color color); \/\/ Get Color norma/;" p typeref:typename:RLAPI Vector4 +ColorTint vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI Color ColorTint(Color color, Color tint); \/\/ Get color multi/;" p typeref:typename:RLAPI Color +ColorToHSV vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI Vector3 ColorToHSV(Color color); \/\/ Get HSV values /;" p typeref:typename:RLAPI Vector3 +ColorToInt vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI int ColorToInt(Color color); \/\/ Get hexadecimal/;" p typeref:typename:RLAPI int +CommonHeader vendor/lua-5.4.8/src/lobject.h /^#define CommonHeader /;" d +CompressData vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI unsigned char *CompressData(const unsigned char *data, int dataSize, int *compDataSize); /;" p typeref:typename:RLAPI unsigned char * +ComputeCRC32 vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI unsigned int ComputeCRC32(unsigned char *data, int dataSize); \/\/ Compute CRC32 hash /;" p typeref:typename:RLAPI unsigned int +ComputeMD5 vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI unsigned int *ComputeMD5(unsigned char *data, int dataSize); \/\/ Compute MD5 hash co/;" p typeref:typename:RLAPI unsigned int * +ComputeSHA1 vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI unsigned int *ComputeSHA1(unsigned char *data, int dataSize); \/\/ Compute SHA1 hash /;" p typeref:typename:RLAPI unsigned int * +ConfigFlags vendor/raylib-5.5_linux_amd64/include/raylib.h /^} ConfigFlags;$/;" t typeref:enum:__anon77d6622f0203 +ConsControl vendor/lua-5.4.8/src/lparser.c /^typedef struct ConsControl {$/;" s file: +ConsControl vendor/lua-5.4.8/src/lparser.c /^} ConsControl;$/;" t typeref:struct:ConsControl file: +CubemapLayout vendor/raylib-5.5_linux_amd64/include/raylib.h /^} CubemapLayout;$/;" t typeref:enum:__anon77d6622f1003 +DARKBLUE vendor/raylib-5.5_linux_amd64/include/raylib.h /^#define DARKBLUE /;" d +DARKBROWN vendor/raylib-5.5_linux_amd64/include/raylib.h /^#define DARKBROWN /;" d +DARKGRAY vendor/raylib-5.5_linux_amd64/include/raylib.h /^#define DARKGRAY /;" d +DARKGREEN vendor/raylib-5.5_linux_amd64/include/raylib.h /^#define DARKGREEN /;" d +DARKPURPLE vendor/raylib-5.5_linux_amd64/include/raylib.h /^#define DARKPURPLE /;" d +DEBUG_LEVEL main.c /^#define DEBUG_LEVEL /;" d file: +DEG2RAD vendor/raylib-5.5_linux_amd64/include/raylib.h /^ #define DEG2RAD /;" d +DEG2RAD vendor/raylib-5.5_linux_amd64/include/raymath.h /^ #define DEG2RAD /;" d +DEG2RAD vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ #define DEG2RAD /;" d +DIBS vendor/lua-5.4.8/src/ldump.c /^#define DIBS /;" d file: +DIGITBIT vendor/lua-5.4.8/src/lctype.h /^#define DIGITBIT /;" d +DLMSG vendor/lua-5.4.8/src/loadlib.c /^#define DLMSG /;" d file: +Darwin vendor/lua-5.4.8/src/Makefile /^Darwin macos macosx:$/;" t +DecodeDataBase64 vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI unsigned char *DecodeDataBase64(const unsigned char *data, int *outputSize); /;" p typeref:typename:RLAPI unsigned char * +DecompressData vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI unsigned char *DecompressData(const unsigned char *compData, int compDataSize, int *dataSi/;" p typeref:typename:RLAPI unsigned char * +DetachAudioMixedProcessor vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void DetachAudioMixedProcessor(AudioCallback processor); \/\/ Detach audio stream processo/;" p typeref:typename:RLAPI void +DetachAudioStreamProcessor vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void DetachAudioStreamProcessor(AudioStream stream, AudioCallback processor); \/\/ Detach /;" p typeref:typename:RLAPI void +DirectoryExists vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI bool DirectoryExists(const char *dirPath); \/\/ Check if a directory path/;" p typeref:typename:RLAPI bool +DisableCursor vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void DisableCursor(void); \/\/ Disables cursor (lock cur/;" p typeref:typename:RLAPI void +DisableEventWaiting vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void DisableEventWaiting(void); \/\/ Disable waiting for event/;" p typeref:typename:RLAPI void +DrawBillboard vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void DrawBillboard(Camera camera, Texture2D texture, Vector3 position, float scale, Color /;" p typeref:typename:RLAPI void +DrawBillboardPro vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void DrawBillboardPro(Camera camera, Texture2D texture, Rectangle source, Vector3 position/;" p typeref:typename:RLAPI void +DrawBillboardRec vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void DrawBillboardRec(Camera camera, Texture2D texture, Rectangle source, Vector3 position/;" p typeref:typename:RLAPI void +DrawBoundingBox vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void DrawBoundingBox(BoundingBox box, Color color); \/\//;" p typeref:typename:RLAPI void +DrawCapsule vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void DrawCapsule(Vector3 startPos, Vector3 endPos, float radius, int slices, int rings, Co/;" p typeref:typename:RLAPI void +DrawCapsuleWires vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void DrawCapsuleWires(Vector3 startPos, Vector3 endPos, float radius, int slices, int ring/;" p typeref:typename:RLAPI void +DrawCircle vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void DrawCircle(int centerX, int centerY, float radius, Color color); /;" p typeref:typename:RLAPI void +DrawCircle3D vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void DrawCircle3D(Vector3 center, float radius, Vector3 rotationAxis, float rotationAngle,/;" p typeref:typename:RLAPI void +DrawCircleGradient vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void DrawCircleGradient(int centerX, int centerY, float radius, Color inner, Color outer);/;" p typeref:typename:RLAPI void +DrawCircleLines vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void DrawCircleLines(int centerX, int centerY, float radius, Color color); /;" p typeref:typename:RLAPI void +DrawCircleLinesV vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void DrawCircleLinesV(Vector2 center, float radius, Color color); /;" p typeref:typename:RLAPI void +DrawCircleSector vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void DrawCircleSector(Vector2 center, float radius, float startAngle, float endAngle, int /;" p typeref:typename:RLAPI void +DrawCircleSectorLines vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void DrawCircleSectorLines(Vector2 center, float radius, float startAngle, float endAngle,/;" p typeref:typename:RLAPI void +DrawCircleV vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void DrawCircleV(Vector2 center, float radius, Color color); /;" p typeref:typename:RLAPI void +DrawCube vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void DrawCube(Vector3 position, float width, float height, float length, Color color); /;" p typeref:typename:RLAPI void +DrawCubeV vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void DrawCubeV(Vector3 position, Vector3 size, Color color); /;" p typeref:typename:RLAPI void +DrawCubeWires vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void DrawCubeWires(Vector3 position, float width, float height, float length, Color color)/;" p typeref:typename:RLAPI void +DrawCubeWiresV vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void DrawCubeWiresV(Vector3 position, Vector3 size, Color color); /;" p typeref:typename:RLAPI void +DrawCylinder vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void DrawCylinder(Vector3 position, float radiusTop, float radiusBottom, float height, int/;" p typeref:typename:RLAPI void +DrawCylinderEx vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void DrawCylinderEx(Vector3 startPos, Vector3 endPos, float startRadius, float endRadius, /;" p typeref:typename:RLAPI void +DrawCylinderWires vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void DrawCylinderWires(Vector3 position, float radiusTop, float radiusBottom, float height/;" p typeref:typename:RLAPI void +DrawCylinderWiresEx vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void DrawCylinderWiresEx(Vector3 startPos, Vector3 endPos, float startRadius, float endRad/;" p typeref:typename:RLAPI void +DrawEllipse vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void DrawEllipse(int centerX, int centerY, float radiusH, float radiusV, Color color); /;" p typeref:typename:RLAPI void +DrawEllipseLines vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void DrawEllipseLines(int centerX, int centerY, float radiusH, float radiusV, Color color)/;" p typeref:typename:RLAPI void +DrawFPS vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void DrawFPS(int posX, int posY); \/\//;" p typeref:typename:RLAPI void +DrawGrid vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void DrawGrid(int slices, float spacing); /;" p typeref:typename:RLAPI void +DrawLine vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void DrawLine(int startPosX, int startPosY, int endPosX, int endPosY, Color color); /;" p typeref:typename:RLAPI void +DrawLine3D vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void DrawLine3D(Vector3 startPos, Vector3 endPos, Color color); /;" p typeref:typename:RLAPI void +DrawLineBezier vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void DrawLineBezier(Vector2 startPos, Vector2 endPos, float thick, Color color); /;" p typeref:typename:RLAPI void +DrawLineEx vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void DrawLineEx(Vector2 startPos, Vector2 endPos, float thick, Color color); /;" p typeref:typename:RLAPI void +DrawLineStrip vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void DrawLineStrip(const Vector2 *points, int pointCount, Color color); /;" p typeref:typename:RLAPI void +DrawLineV vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void DrawLineV(Vector2 startPos, Vector2 endPos, Color color); /;" p typeref:typename:RLAPI void +DrawMesh vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void DrawMesh(Mesh mesh, Material material, Matrix transform); \/\//;" p typeref:typename:RLAPI void +DrawMeshInstanced vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void DrawMeshInstanced(Mesh mesh, Material material, const Matrix *transforms, int instanc/;" p typeref:typename:RLAPI void +DrawModel vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void DrawModel(Model model, Vector3 position, float scale, Color tint); \/\//;" p typeref:typename:RLAPI void +DrawModelEx vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void DrawModelEx(Model model, Vector3 position, Vector3 rotationAxis, float rotationAngle,/;" p typeref:typename:RLAPI void +DrawModelPoints vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void DrawModelPoints(Model model, Vector3 position, float scale, Color tint); \/\/ Draw a /;" p typeref:typename:RLAPI void +DrawModelPointsEx vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void DrawModelPointsEx(Model model, Vector3 position, Vector3 rotationAxis, float rotation/;" p typeref:typename:RLAPI void +DrawModelWires vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void DrawModelWires(Model model, Vector3 position, float scale, Color tint); \/\//;" p typeref:typename:RLAPI void +DrawModelWiresEx vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void DrawModelWiresEx(Model model, Vector3 position, Vector3 rotationAxis, float rotationA/;" p typeref:typename:RLAPI void +DrawPixel vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void DrawPixel(int posX, int posY, Color color); /;" p typeref:typename:RLAPI void +DrawPixelV vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void DrawPixelV(Vector2 position, Color color); /;" p typeref:typename:RLAPI void +DrawPlane vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void DrawPlane(Vector3 centerPos, Vector2 size, Color color); /;" p typeref:typename:RLAPI void +DrawPoint3D vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void DrawPoint3D(Vector3 position, Color color); /;" p typeref:typename:RLAPI void +DrawPoly vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void DrawPoly(Vector2 center, int sides, float radius, float rotation, Color color); /;" p typeref:typename:RLAPI void +DrawPolyLines vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void DrawPolyLines(Vector2 center, int sides, float radius, float rotation, Color color); /;" p typeref:typename:RLAPI void +DrawPolyLinesEx vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void DrawPolyLinesEx(Vector2 center, int sides, float radius, float rotation, float lineTh/;" p typeref:typename:RLAPI void +DrawRay vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void DrawRay(Ray ray, Color color); /;" p typeref:typename:RLAPI void +DrawRectangle vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void DrawRectangle(int posX, int posY, int width, int height, Color color); /;" p typeref:typename:RLAPI void +DrawRectangleGradientEx vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void DrawRectangleGradientEx(Rectangle rec, Color topLeft, Color bottomLeft, Color topRigh/;" p typeref:typename:RLAPI void +DrawRectangleGradientH vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void DrawRectangleGradientH(int posX, int posY, int width, int height, Color left, Color r/;" p typeref:typename:RLAPI void +DrawRectangleGradientV vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void DrawRectangleGradientV(int posX, int posY, int width, int height, Color top, Color bo/;" p typeref:typename:RLAPI void +DrawRectangleLines vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void DrawRectangleLines(int posX, int posY, int width, int height, Color color); /;" p typeref:typename:RLAPI void +DrawRectangleLinesEx vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void DrawRectangleLinesEx(Rectangle rec, float lineThick, Color color); /;" p typeref:typename:RLAPI void +DrawRectanglePro vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void DrawRectanglePro(Rectangle rec, Vector2 origin, float rotation, Color color); /;" p typeref:typename:RLAPI void +DrawRectangleRec vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void DrawRectangleRec(Rectangle rec, Color color); /;" p typeref:typename:RLAPI void +DrawRectangleRounded vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void DrawRectangleRounded(Rectangle rec, float roundness, int segments, Color color); /;" p typeref:typename:RLAPI void +DrawRectangleRoundedLines vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void DrawRectangleRoundedLines(Rectangle rec, float roundness, int segments, Color color);/;" p typeref:typename:RLAPI void +DrawRectangleRoundedLinesEx vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void DrawRectangleRoundedLinesEx(Rectangle rec, float roundness, int segments, float lineT/;" p typeref:typename:RLAPI void +DrawRectangleV vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void DrawRectangleV(Vector2 position, Vector2 size, Color color); /;" p typeref:typename:RLAPI void +DrawRing vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void DrawRing(Vector2 center, float innerRadius, float outerRadius, float startAngle, floa/;" p typeref:typename:RLAPI void +DrawRingLines vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void DrawRingLines(Vector2 center, float innerRadius, float outerRadius, float startAngle,/;" p typeref:typename:RLAPI void +DrawSphere vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void DrawSphere(Vector3 centerPos, float radius, Color color); /;" p typeref:typename:RLAPI void +DrawSphereEx vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void DrawSphereEx(Vector3 centerPos, float radius, int rings, int slices, Color color); /;" p typeref:typename:RLAPI void +DrawSphereWires vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void DrawSphereWires(Vector3 centerPos, float radius, int rings, int slices, Color color);/;" p typeref:typename:RLAPI void +DrawSplineBasis vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void DrawSplineBasis(const Vector2 *points, int pointCount, float thick, Color color); /;" p typeref:typename:RLAPI void +DrawSplineBezierCubic vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void DrawSplineBezierCubic(const Vector2 *points, int pointCount, float thick, Color color/;" p typeref:typename:RLAPI void +DrawSplineBezierQuadratic vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void DrawSplineBezierQuadratic(const Vector2 *points, int pointCount, float thick, Color c/;" p typeref:typename:RLAPI void +DrawSplineCatmullRom vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void DrawSplineCatmullRom(const Vector2 *points, int pointCount, float thick, Color color)/;" p typeref:typename:RLAPI void +DrawSplineLinear vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void DrawSplineLinear(const Vector2 *points, int pointCount, float thick, Color color); /;" p typeref:typename:RLAPI void +DrawSplineSegmentBasis vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void DrawSplineSegmentBasis(Vector2 p1, Vector2 p2, Vector2 p3, Vector2 p4, float thick, C/;" p typeref:typename:RLAPI void +DrawSplineSegmentBezierCubic vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void DrawSplineSegmentBezierCubic(Vector2 p1, Vector2 c2, Vector2 c3, Vector2 p4, float th/;" p typeref:typename:RLAPI void +DrawSplineSegmentBezierQuadratic vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void DrawSplineSegmentBezierQuadratic(Vector2 p1, Vector2 c2, Vector2 p3, float thick, Col/;" p typeref:typename:RLAPI void +DrawSplineSegmentCatmullRom vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void DrawSplineSegmentCatmullRom(Vector2 p1, Vector2 p2, Vector2 p3, Vector2 p4, float thi/;" p typeref:typename:RLAPI void +DrawSplineSegmentLinear vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void DrawSplineSegmentLinear(Vector2 p1, Vector2 p2, float thick, Color color); /;" p typeref:typename:RLAPI void +DrawText vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void DrawText(const char *text, int posX, int posY, int fontSize, Color color); \/\//;" p typeref:typename:RLAPI void +DrawTextCodepoint vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void DrawTextCodepoint(Font font, int codepoint, Vector2 position, float fontSize, Color t/;" p typeref:typename:RLAPI void +DrawTextCodepoints vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void DrawTextCodepoints(Font font, const int *codepoints, int codepointCount, Vector2 posi/;" p typeref:typename:RLAPI void +DrawTextEx vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void DrawTextEx(Font font, const char *text, Vector2 position, float fontSize, float spaci/;" p typeref:typename:RLAPI void +DrawTextPro vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void DrawTextPro(Font font, const char *text, Vector2 position, Vector2 origin, float rota/;" p typeref:typename:RLAPI void +DrawTexture vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void DrawTexture(Texture2D texture, int posX, int posY, Color tint); /;" p typeref:typename:RLAPI void +DrawTextureEx vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void DrawTextureEx(Texture2D texture, Vector2 position, float rotation, float scale, Color/;" p typeref:typename:RLAPI void +DrawTextureNPatch vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void DrawTextureNPatch(Texture2D texture, NPatchInfo nPatchInfo, Rectangle dest, Vector2 o/;" p typeref:typename:RLAPI void +DrawTexturePro vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void DrawTexturePro(Texture2D texture, Rectangle source, Rectangle dest, Vector2 origin, f/;" p typeref:typename:RLAPI void +DrawTextureRec vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void DrawTextureRec(Texture2D texture, Rectangle source, Vector2 position, Color tint); /;" p typeref:typename:RLAPI void +DrawTextureV vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void DrawTextureV(Texture2D texture, Vector2 position, Color tint); /;" p typeref:typename:RLAPI void +DrawTriangle vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void DrawTriangle(Vector2 v1, Vector2 v2, Vector2 v3, Color color); /;" p typeref:typename:RLAPI void +DrawTriangle3D vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void DrawTriangle3D(Vector3 v1, Vector3 v2, Vector3 v3, Color color); /;" p typeref:typename:RLAPI void +DrawTriangleFan vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void DrawTriangleFan(const Vector2 *points, int pointCount, Color color); /;" p typeref:typename:RLAPI void +DrawTriangleLines vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void DrawTriangleLines(Vector2 v1, Vector2 v2, Vector2 v3, Color color); /;" p typeref:typename:RLAPI void +DrawTriangleStrip vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void DrawTriangleStrip(const Vector2 *points, int pointCount, Color color); /;" p typeref:typename:RLAPI void +DrawTriangleStrip3D vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void DrawTriangleStrip3D(const Vector3 *points, int pointCount, Color color); /;" p typeref:typename:RLAPI void +DumpState vendor/lua-5.4.8/src/ldump.c /^} DumpState;$/;" t typeref:struct:__anon6dcdaf670108 file: +Dyndata vendor/lua-5.4.8/src/lparser.h /^typedef struct Dyndata {$/;" s +Dyndata vendor/lua-5.4.8/src/lparser.h /^} Dyndata;$/;" t typeref:struct:Dyndata +EOFMARK vendor/lua-5.4.8/src/lua.c /^#define EOFMARK /;" d file: +EOZ vendor/lua-5.4.8/src/lzio.h /^#define EOZ /;" d +EPSILON vendor/raylib-5.5_linux_amd64/include/raymath.h /^ #define EPSILON /;" d +ERRFUNC vendor/lua-5.4.8/src/loadlib.c /^#define ERRFUNC /;" d file: +ERRLIB vendor/lua-5.4.8/src/loadlib.c /^#define ERRLIB /;" d file: +ERRORSTACKSIZE vendor/lua-5.4.8/src/ldo.c /^#define ERRORSTACKSIZE /;" d file: +EXTRAARG vendor/lua-5.4.8/src/luac.c /^#define EXTRAARG /;" d file: +EXTRAARGC vendor/lua-5.4.8/src/luac.c /^#define EXTRAARGC /;" d file: +EXTRA_STACK vendor/lua-5.4.8/src/lstate.h /^#define EXTRA_STACK /;" d +EnableCursor vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void EnableCursor(void); \/\/ Enables cursor (unlock cu/;" p typeref:typename:RLAPI void +EnableEventWaiting vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void EnableEventWaiting(void); \/\/ Enable waiting for events/;" p typeref:typename:RLAPI void +EncodeDataBase64 vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI char *EncodeDataBase64(const unsigned char *data, int dataSize, int *outputSize); /;" p typeref:typename:RLAPI char * +EndBlendMode vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void EndBlendMode(void); \/\/ End blending mode (reset /;" p typeref:typename:RLAPI void +EndDrawing vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void EndDrawing(void); \/\/ End canvas drawing and sw/;" p typeref:typename:RLAPI void +EndMode2D vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void EndMode2D(void); \/\/ Ends 2D mode with custom /;" p typeref:typename:RLAPI void +EndMode3D vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void EndMode3D(void); \/\/ Ends 3D mode and returns /;" p typeref:typename:RLAPI void +EndScissorMode vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void EndScissorMode(void); \/\/ End scissor mode$/;" p typeref:typename:RLAPI void +EndShaderMode vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void EndShaderMode(void); \/\/ End custom shader drawing/;" p typeref:typename:RLAPI void +EndTextureMode vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void EndTextureMode(void); \/\/ Ends drawing to render te/;" p typeref:typename:RLAPI void +EndVrStereoMode vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void EndVrStereoMode(void); \/\/ End stereo rendering (req/;" p typeref:typename:RLAPI void +ExportAutomationEventList vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI bool ExportAutomationEventList(AutomationEventList list, const char *fileName); \/\/ Exp/;" p typeref:typename:RLAPI bool +ExportDataAsCode vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI bool ExportDataAsCode(const unsigned char *data, int dataSize, const char *fileName); \/\//;" p typeref:typename:RLAPI bool +ExportFontAsCode vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI bool ExportFontAsCode(Font font, const char *fileName); \/\//;" p typeref:typename:RLAPI bool +ExportImage vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI bool ExportImage(Image image, const char *fileName); /;" p typeref:typename:RLAPI bool +ExportImageAsCode vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI bool ExportImageAsCode(Image image, const char *fileName); /;" p typeref:typename:RLAPI bool +ExportImageToMemory vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI unsigned char *ExportImageToMemory(Image image, const char *fileType, int *fileSize); /;" p typeref:typename:RLAPI unsigned char * +ExportMesh vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI bool ExportMesh(Mesh mesh, const char *fileName); \/\//;" p typeref:typename:RLAPI bool +ExportMeshAsCode vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI bool ExportMeshAsCode(Mesh mesh, const char *fileName); \/\//;" p typeref:typename:RLAPI bool +ExportWave vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI bool ExportWave(Wave wave, const char *fileName); \/\/ Export wave data to f/;" p typeref:typename:RLAPI bool +ExportWaveAsCode vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI bool ExportWaveAsCode(Wave wave, const char *fileName); \/\/ Export wave sample da/;" p typeref:typename:RLAPI bool +ExtSupported vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ } ExtSupported; \/\/ Extensions supported flags$/;" m struct:rlglData typeref:struct:rlglData::__anon1f68b8bd0e08 +F2Iceil vendor/lua-5.4.8/src/lvm.h /^ F2Iceil \/* takes the ceil of the number *\/$/;" e enum:__anon9b0e20390103 +F2Ieq vendor/lua-5.4.8/src/lvm.h /^ F2Ieq, \/* no rounding; accepts only integral values *\/$/;" e enum:__anon9b0e20390103 +F2Ifloor vendor/lua-5.4.8/src/lvm.h /^ F2Ifloor, \/* takes the floor of the number *\/$/;" e enum:__anon9b0e20390103 +F2Imod vendor/lua-5.4.8/src/lvm.h /^} F2Imod;$/;" t typeref:enum:__anon9b0e20390103 +FIGS vendor/lua-5.4.8/src/lmathlib.c /^#define FIGS /;" d file: +FINALIZEDBIT vendor/lua-5.4.8/src/lgc.h /^#define FINALIZEDBIT /;" d +FIRST_RESERVED vendor/lua-5.4.8/src/llex.h /^#define FIRST_RESERVED /;" d +FLAG_BORDERLESS_WINDOWED_MODE vendor/raylib-5.5_linux_amd64/include/raylib.h /^ FLAG_BORDERLESS_WINDOWED_MODE = 0x00008000, \/\/ Set to run program in borderless windowed m/;" e enum:__anon77d6622f0203 +FLAG_FULLSCREEN_MODE vendor/raylib-5.5_linux_amd64/include/raylib.h /^ FLAG_FULLSCREEN_MODE = 0x00000002, \/\/ Set to run program in fullscreen$/;" e enum:__anon77d6622f0203 +FLAG_INTERLACED_HINT vendor/raylib-5.5_linux_amd64/include/raylib.h /^ FLAG_INTERLACED_HINT = 0x00010000 \/\/ Set to try enabling interlaced video format (fo/;" e enum:__anon77d6622f0203 +FLAG_MSAA_4X_HINT vendor/raylib-5.5_linux_amd64/include/raylib.h /^ FLAG_MSAA_4X_HINT = 0x00000020, \/\/ Set to try enabling MSAA 4X$/;" e enum:__anon77d6622f0203 +FLAG_VSYNC_HINT vendor/raylib-5.5_linux_amd64/include/raylib.h /^ FLAG_VSYNC_HINT = 0x00000040, \/\/ Set to try enabling V-Sync on GPU$/;" e enum:__anon77d6622f0203 +FLAG_WINDOW_ALWAYS_RUN vendor/raylib-5.5_linux_amd64/include/raylib.h /^ FLAG_WINDOW_ALWAYS_RUN = 0x00000100, \/\/ Set to allow windows running while minimized$/;" e enum:__anon77d6622f0203 +FLAG_WINDOW_HIDDEN vendor/raylib-5.5_linux_amd64/include/raylib.h /^ FLAG_WINDOW_HIDDEN = 0x00000080, \/\/ Set to hide window$/;" e enum:__anon77d6622f0203 +FLAG_WINDOW_HIGHDPI vendor/raylib-5.5_linux_amd64/include/raylib.h /^ FLAG_WINDOW_HIGHDPI = 0x00002000, \/\/ Set to support HighDPI$/;" e enum:__anon77d6622f0203 +FLAG_WINDOW_MAXIMIZED vendor/raylib-5.5_linux_amd64/include/raylib.h /^ FLAG_WINDOW_MAXIMIZED = 0x00000400, \/\/ Set to maximize window (expanded to monitor)$/;" e enum:__anon77d6622f0203 +FLAG_WINDOW_MINIMIZED vendor/raylib-5.5_linux_amd64/include/raylib.h /^ FLAG_WINDOW_MINIMIZED = 0x00000200, \/\/ Set to minimize window (iconify)$/;" e enum:__anon77d6622f0203 +FLAG_WINDOW_MOUSE_PASSTHROUGH vendor/raylib-5.5_linux_amd64/include/raylib.h /^ FLAG_WINDOW_MOUSE_PASSTHROUGH = 0x00004000, \/\/ Set to support mouse passthrough, only supp/;" e enum:__anon77d6622f0203 +FLAG_WINDOW_RESIZABLE vendor/raylib-5.5_linux_amd64/include/raylib.h /^ FLAG_WINDOW_RESIZABLE = 0x00000004, \/\/ Set to allow resizable window$/;" e enum:__anon77d6622f0203 +FLAG_WINDOW_TOPMOST vendor/raylib-5.5_linux_amd64/include/raylib.h /^ FLAG_WINDOW_TOPMOST = 0x00001000, \/\/ Set to window always on top$/;" e enum:__anon77d6622f0203 +FLAG_WINDOW_TRANSPARENT vendor/raylib-5.5_linux_amd64/include/raylib.h /^ FLAG_WINDOW_TRANSPARENT = 0x00000010, \/\/ Set to allow transparent framebuffer$/;" e enum:__anon77d6622f0203 +FLAG_WINDOW_UNDECORATED vendor/raylib-5.5_linux_amd64/include/raylib.h /^ FLAG_WINDOW_UNDECORATED = 0x00000008, \/\/ Set to disable window decoration (frame and but/;" e enum:__anon77d6622f0203 +FLAG_WINDOW_UNFOCUSED vendor/raylib-5.5_linux_amd64/include/raylib.h /^ FLAG_WINDOW_UNFOCUSED = 0x00000800, \/\/ Set to window non focused$/;" e enum:__anon77d6622f0203 +FONT_BITMAP vendor/raylib-5.5_linux_amd64/include/raylib.h /^ FONT_BITMAP, \/\/ Bitmap font generation, no anti-aliasing$/;" e enum:__anon77d6622f1103 +FONT_DEFAULT vendor/raylib-5.5_linux_amd64/include/raylib.h /^ FONT_DEFAULT = 0, \/\/ Default font generation, anti-aliased$/;" e enum:__anon77d6622f1103 +FONT_SDF vendor/raylib-5.5_linux_amd64/include/raylib.h /^ FONT_SDF \/\/ SDF font generation, requires external shader$/;" e enum:__anon77d6622f1103 +FUNCTION vendor/lua-5.4.8/src/luac.c /^#define FUNCTION /;" d file: +Fade vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI Color Fade(Color color, float alpha); \/\/ Get color with /;" p typeref:typename:RLAPI Color +FileExists vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI bool FileExists(const char *fileName); \/\/ Check if file exists$/;" p typeref:typename:RLAPI bool +FilePathList vendor/raylib-5.5_linux_amd64/include/raylib.h /^typedef struct FilePathList {$/;" s +FilePathList vendor/raylib-5.5_linux_amd64/include/raylib.h /^} FilePathList;$/;" t typeref:struct:FilePathList +FloatEquals vendor/raylib-5.5_linux_amd64/include/raymath.h /^RMAPI int FloatEquals(float x, float y)$/;" f typeref:typename:RMAPI int +Font vendor/raylib-5.5_linux_amd64/include/raylib.h /^typedef struct Font {$/;" s +Font vendor/raylib-5.5_linux_amd64/include/raylib.h /^} Font;$/;" t typeref:struct:Font +FontType vendor/raylib-5.5_linux_amd64/include/raylib.h /^} FontType;$/;" t typeref:enum:__anon77d6622f1103 +FreeBSD vendor/lua-5.4.8/src/Makefile /^FreeBSD NetBSD OpenBSD freebsd:$/;" t +FuncState vendor/lua-5.4.8/src/lparser.h /^typedef struct FuncState {$/;" s +FuncState vendor/lua-5.4.8/src/lparser.h /^} FuncState;$/;" t typeref:struct:FuncState +G vendor/lua-5.4.8/src/lstate.h /^#define G(/;" d +GAMEPAD_AXIS_LEFT_TRIGGER vendor/raylib-5.5_linux_amd64/include/raylib.h /^ GAMEPAD_AXIS_LEFT_TRIGGER = 4, \/\/ Gamepad back trigger left, pressure level: [1..-1]$/;" e enum:__anon77d6622f0803 +GAMEPAD_AXIS_LEFT_X vendor/raylib-5.5_linux_amd64/include/raylib.h /^ GAMEPAD_AXIS_LEFT_X = 0, \/\/ Gamepad left stick X axis$/;" e enum:__anon77d6622f0803 +GAMEPAD_AXIS_LEFT_Y vendor/raylib-5.5_linux_amd64/include/raylib.h /^ GAMEPAD_AXIS_LEFT_Y = 1, \/\/ Gamepad left stick Y axis$/;" e enum:__anon77d6622f0803 +GAMEPAD_AXIS_RIGHT_TRIGGER vendor/raylib-5.5_linux_amd64/include/raylib.h /^ GAMEPAD_AXIS_RIGHT_TRIGGER = 5 \/\/ Gamepad back trigger right, pressure level: [1..-1]$/;" e enum:__anon77d6622f0803 +GAMEPAD_AXIS_RIGHT_X vendor/raylib-5.5_linux_amd64/include/raylib.h /^ GAMEPAD_AXIS_RIGHT_X = 2, \/\/ Gamepad right stick X axis$/;" e enum:__anon77d6622f0803 +GAMEPAD_AXIS_RIGHT_Y vendor/raylib-5.5_linux_amd64/include/raylib.h /^ GAMEPAD_AXIS_RIGHT_Y = 3, \/\/ Gamepad right stick Y axis$/;" e enum:__anon77d6622f0803 +GAMEPAD_BUTTON_LEFT_FACE_DOWN vendor/raylib-5.5_linux_amd64/include/raylib.h /^ GAMEPAD_BUTTON_LEFT_FACE_DOWN, \/\/ Gamepad left DPAD down button$/;" e enum:__anon77d6622f0703 +GAMEPAD_BUTTON_LEFT_FACE_LEFT vendor/raylib-5.5_linux_amd64/include/raylib.h /^ GAMEPAD_BUTTON_LEFT_FACE_LEFT, \/\/ Gamepad left DPAD left button$/;" e enum:__anon77d6622f0703 +GAMEPAD_BUTTON_LEFT_FACE_RIGHT vendor/raylib-5.5_linux_amd64/include/raylib.h /^ GAMEPAD_BUTTON_LEFT_FACE_RIGHT, \/\/ Gamepad left DPAD right button$/;" e enum:__anon77d6622f0703 +GAMEPAD_BUTTON_LEFT_FACE_UP vendor/raylib-5.5_linux_amd64/include/raylib.h /^ GAMEPAD_BUTTON_LEFT_FACE_UP, \/\/ Gamepad left DPAD up button$/;" e enum:__anon77d6622f0703 +GAMEPAD_BUTTON_LEFT_THUMB vendor/raylib-5.5_linux_amd64/include/raylib.h /^ GAMEPAD_BUTTON_LEFT_THUMB, \/\/ Gamepad joystick pressed button left$/;" e enum:__anon77d6622f0703 +GAMEPAD_BUTTON_LEFT_TRIGGER_1 vendor/raylib-5.5_linux_amd64/include/raylib.h /^ GAMEPAD_BUTTON_LEFT_TRIGGER_1, \/\/ Gamepad top\/back trigger left (first), it could be/;" e enum:__anon77d6622f0703 +GAMEPAD_BUTTON_LEFT_TRIGGER_2 vendor/raylib-5.5_linux_amd64/include/raylib.h /^ GAMEPAD_BUTTON_LEFT_TRIGGER_2, \/\/ Gamepad top\/back trigger left (second), it could b/;" e enum:__anon77d6622f0703 +GAMEPAD_BUTTON_MIDDLE vendor/raylib-5.5_linux_amd64/include/raylib.h /^ GAMEPAD_BUTTON_MIDDLE, \/\/ Gamepad center buttons, middle one (i.e. PS3: PS, X/;" e enum:__anon77d6622f0703 +GAMEPAD_BUTTON_MIDDLE_LEFT vendor/raylib-5.5_linux_amd64/include/raylib.h /^ GAMEPAD_BUTTON_MIDDLE_LEFT, \/\/ Gamepad center buttons, left one (i.e. PS3: Select)$/;" e enum:__anon77d6622f0703 +GAMEPAD_BUTTON_MIDDLE_RIGHT vendor/raylib-5.5_linux_amd64/include/raylib.h /^ GAMEPAD_BUTTON_MIDDLE_RIGHT, \/\/ Gamepad center buttons, right one (i.e. PS3: Start)$/;" e enum:__anon77d6622f0703 +GAMEPAD_BUTTON_RIGHT_FACE_DOWN vendor/raylib-5.5_linux_amd64/include/raylib.h /^ GAMEPAD_BUTTON_RIGHT_FACE_DOWN, \/\/ Gamepad right button down (i.e. PS3: Cross, Xbox: A/;" e enum:__anon77d6622f0703 +GAMEPAD_BUTTON_RIGHT_FACE_LEFT vendor/raylib-5.5_linux_amd64/include/raylib.h /^ GAMEPAD_BUTTON_RIGHT_FACE_LEFT, \/\/ Gamepad right button left (i.e. PS3: Square, Xbox: /;" e enum:__anon77d6622f0703 +GAMEPAD_BUTTON_RIGHT_FACE_RIGHT vendor/raylib-5.5_linux_amd64/include/raylib.h /^ GAMEPAD_BUTTON_RIGHT_FACE_RIGHT, \/\/ Gamepad right button right (i.e. PS3: Circle, Xbox:/;" e enum:__anon77d6622f0703 +GAMEPAD_BUTTON_RIGHT_FACE_UP vendor/raylib-5.5_linux_amd64/include/raylib.h /^ GAMEPAD_BUTTON_RIGHT_FACE_UP, \/\/ Gamepad right button up (i.e. PS3: Triangle, Xbox: /;" e enum:__anon77d6622f0703 +GAMEPAD_BUTTON_RIGHT_THUMB vendor/raylib-5.5_linux_amd64/include/raylib.h /^ GAMEPAD_BUTTON_RIGHT_THUMB \/\/ Gamepad joystick pressed button right$/;" e enum:__anon77d6622f0703 +GAMEPAD_BUTTON_RIGHT_TRIGGER_1 vendor/raylib-5.5_linux_amd64/include/raylib.h /^ GAMEPAD_BUTTON_RIGHT_TRIGGER_1, \/\/ Gamepad top\/back trigger right (first), it could b/;" e enum:__anon77d6622f0703 +GAMEPAD_BUTTON_RIGHT_TRIGGER_2 vendor/raylib-5.5_linux_amd64/include/raylib.h /^ GAMEPAD_BUTTON_RIGHT_TRIGGER_2, \/\/ Gamepad top\/back trigger right (second), it could /;" e enum:__anon77d6622f0703 +GAMEPAD_BUTTON_UNKNOWN vendor/raylib-5.5_linux_amd64/include/raylib.h /^ GAMEPAD_BUTTON_UNKNOWN = 0, \/\/ Unknown button, just for error checking$/;" e enum:__anon77d6622f0703 +GCFINALIZECOST vendor/lua-5.4.8/src/lgc.c /^#define GCFINALIZECOST /;" d file: +GCFINMAX vendor/lua-5.4.8/src/lgc.c /^#define GCFINMAX /;" d file: +GCObject vendor/lua-5.4.8/src/lobject.h /^typedef struct GCObject {$/;" s +GCObject vendor/lua-5.4.8/src/lobject.h /^} GCObject;$/;" t typeref:struct:GCObject +GCSTPCLS vendor/lua-5.4.8/src/lgc.h /^#define GCSTPCLS /;" d +GCSTPGC vendor/lua-5.4.8/src/lgc.h /^#define GCSTPGC /;" d +GCSTPUSR vendor/lua-5.4.8/src/lgc.h /^#define GCSTPUSR /;" d +GCSWEEPMAX vendor/lua-5.4.8/src/lgc.c /^#define GCSWEEPMAX /;" d file: +GCSatomic vendor/lua-5.4.8/src/lgc.h /^#define GCSatomic /;" d +GCScallfin vendor/lua-5.4.8/src/lgc.h /^#define GCScallfin /;" d +GCSenteratomic vendor/lua-5.4.8/src/lgc.h /^#define GCSenteratomic /;" d +GCSpause vendor/lua-5.4.8/src/lgc.h /^#define GCSpause /;" d +GCSpropagate vendor/lua-5.4.8/src/lgc.h /^#define GCSpropagate /;" d +GCSswpallgc vendor/lua-5.4.8/src/lgc.h /^#define GCSswpallgc /;" d +GCSswpend vendor/lua-5.4.8/src/lgc.h /^#define GCSswpend /;" d +GCSswpfinobj vendor/lua-5.4.8/src/lgc.h /^#define GCSswpfinobj /;" d +GCSswptobefnz vendor/lua-5.4.8/src/lgc.h /^#define GCSswptobefnz /;" d +GCTM vendor/lua-5.4.8/src/lgc.c /^static void GCTM (lua_State *L) {$/;" f typeref:typename:void file: +GCUnion vendor/lua-5.4.8/src/lstate.h /^union GCUnion {$/;" u +GCdebt vendor/lua-5.4.8/src/lstate.h /^ l_mem GCdebt; \/* bytes allocated not yet compensated by the collector *\/$/;" m struct:global_State typeref:typename:l_mem +GCestimate vendor/lua-5.4.8/src/lstate.h /^ lu_mem GCestimate; \/* an estimate of the non-garbage memory in use *\/$/;" m struct:global_State typeref:typename:lu_mem +GESTURE_DOUBLETAP vendor/raylib-5.5_linux_amd64/include/raylib.h /^ GESTURE_DOUBLETAP = 2, \/\/ Double tap gesture$/;" e enum:__anon77d6622f1303 +GESTURE_DRAG vendor/raylib-5.5_linux_amd64/include/raylib.h /^ GESTURE_DRAG = 8, \/\/ Drag gesture$/;" e enum:__anon77d6622f1303 +GESTURE_HOLD vendor/raylib-5.5_linux_amd64/include/raylib.h /^ GESTURE_HOLD = 4, \/\/ Hold gesture$/;" e enum:__anon77d6622f1303 +GESTURE_NONE vendor/raylib-5.5_linux_amd64/include/raylib.h /^ GESTURE_NONE = 0, \/\/ No gesture$/;" e enum:__anon77d6622f1303 +GESTURE_PINCH_IN vendor/raylib-5.5_linux_amd64/include/raylib.h /^ GESTURE_PINCH_IN = 256, \/\/ Pinch in gesture$/;" e enum:__anon77d6622f1303 +GESTURE_PINCH_OUT vendor/raylib-5.5_linux_amd64/include/raylib.h /^ GESTURE_PINCH_OUT = 512 \/\/ Pinch out gesture$/;" e enum:__anon77d6622f1303 +GESTURE_SWIPE_DOWN vendor/raylib-5.5_linux_amd64/include/raylib.h /^ GESTURE_SWIPE_DOWN = 128, \/\/ Swipe down gesture$/;" e enum:__anon77d6622f1303 +GESTURE_SWIPE_LEFT vendor/raylib-5.5_linux_amd64/include/raylib.h /^ GESTURE_SWIPE_LEFT = 32, \/\/ Swipe left gesture$/;" e enum:__anon77d6622f1303 +GESTURE_SWIPE_RIGHT vendor/raylib-5.5_linux_amd64/include/raylib.h /^ GESTURE_SWIPE_RIGHT = 16, \/\/ Swipe right gesture$/;" e enum:__anon77d6622f1303 +GESTURE_SWIPE_UP vendor/raylib-5.5_linux_amd64/include/raylib.h /^ GESTURE_SWIPE_UP = 64, \/\/ Swipe up gesture$/;" e enum:__anon77d6622f1303 +GESTURE_TAP vendor/raylib-5.5_linux_amd64/include/raylib.h /^ GESTURE_TAP = 1, \/\/ Tap gesture$/;" e enum:__anon77d6622f1303 +GETARG_A vendor/lua-5.4.8/src/lopcodes.h /^#define GETARG_A(/;" d +GETARG_Ax vendor/lua-5.4.8/src/lopcodes.h /^#define GETARG_Ax(/;" d +GETARG_B vendor/lua-5.4.8/src/lopcodes.h /^#define GETARG_B(/;" d +GETARG_Bx vendor/lua-5.4.8/src/lopcodes.h /^#define GETARG_Bx(/;" d +GETARG_C vendor/lua-5.4.8/src/lopcodes.h /^#define GETARG_C(/;" d +GETARG_k vendor/lua-5.4.8/src/lopcodes.h /^#define GETARG_k(/;" d +GETARG_sB vendor/lua-5.4.8/src/lopcodes.h /^#define GETARG_sB(/;" d +GETARG_sBx vendor/lua-5.4.8/src/lopcodes.h /^#define GETARG_sBx(/;" d +GETARG_sC vendor/lua-5.4.8/src/lopcodes.h /^#define GETARG_sC(/;" d +GETARG_sJ vendor/lua-5.4.8/src/lopcodes.h /^#define GETARG_sJ(/;" d +GET_OPCODE vendor/lua-5.4.8/src/lopcodes.h /^#define GET_OPCODE(/;" d +GLAD_API_CALL_EXPORT vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ #define GLAD_API_CALL_EXPORT$/;" d +GLAD_API_CALL_EXPORT_BUILD vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ #define GLAD_API_CALL_EXPORT_BUILD$/;" d +GLAD_FREE vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ #define GLAD_FREE /;" d +GLAD_GLES2_IMPLEMENTATION vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ #define GLAD_GLES2_IMPLEMENTATION$/;" d +GLAD_GL_IMPLEMENTATION vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ #define GLAD_GL_IMPLEMENTATION$/;" d +GLAD_MALLOC vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ #define GLAD_MALLOC /;" d +GL_COMPRESSED_RGB8_ETC2 vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ #define GL_COMPRESSED_RGB8_ETC2 /;" d +GL_COMPRESSED_RGBA8_ETC2_EAC vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ #define GL_COMPRESSED_RGBA8_ETC2_EAC /;" d +GL_COMPRESSED_RGBA_ASTC_4x4_KHR vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ #define GL_COMPRESSED_RGBA_ASTC_4x4_KHR /;" d +GL_COMPRESSED_RGBA_ASTC_8x8_KHR vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ #define GL_COMPRESSED_RGBA_ASTC_8x8_KHR /;" d +GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ #define GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG /;" d +GL_COMPRESSED_RGBA_S3TC_DXT1_EXT vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ #define GL_COMPRESSED_RGBA_S3TC_DXT1_EXT /;" d +GL_COMPRESSED_RGBA_S3TC_DXT3_EXT vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ #define GL_COMPRESSED_RGBA_S3TC_DXT3_EXT /;" d +GL_COMPRESSED_RGBA_S3TC_DXT5_EXT vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ #define GL_COMPRESSED_RGBA_S3TC_DXT5_EXT /;" d +GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ #define GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG /;" d +GL_COMPRESSED_RGB_S3TC_DXT1_EXT vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ #define GL_COMPRESSED_RGB_S3TC_DXT1_EXT /;" d +GL_DRAW_FRAMEBUFFER vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ #define GL_DRAW_FRAMEBUFFER /;" d +GL_ETC1_RGB8_OES vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ #define GL_ETC1_RGB8_OES /;" d +GL_GLEXT_PROTOTYPES vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ #define GL_GLEXT_PROTOTYPES$/;" d +GL_GLEXT_PROTOTYPES vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ #define GL_GLEXT_PROTOTYPES$/;" d +GL_LINE_WIDTH vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ #define GL_LINE_WIDTH /;" d +GL_LUMINANCE vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ #define GL_LUMINANCE /;" d +GL_LUMINANCE_ALPHA vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ #define GL_LUMINANCE_ALPHA /;" d +GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ #define GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT /;" d +GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ #define GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT /;" d +GL_PROGRAM_POINT_SIZE vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ #define GL_PROGRAM_POINT_SIZE /;" d +GL_READ_FRAMEBUFFER vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ #define GL_READ_FRAMEBUFFER /;" d +GL_SHADING_LANGUAGE_VERSION vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ #define GL_SHADING_LANGUAGE_VERSION /;" d +GL_TEXTURE_MAX_ANISOTROPY_EXT vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ #define GL_TEXTURE_MAX_ANISOTROPY_EXT /;" d +GL_UNSIGNED_SHORT_4_4_4_4 vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ #define GL_UNSIGNED_SHORT_4_4_4_4 /;" d +GL_UNSIGNED_SHORT_5_5_5_1 vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ #define GL_UNSIGNED_SHORT_5_5_5_1 /;" d +GL_UNSIGNED_SHORT_5_6_5 vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ #define GL_UNSIGNED_SHORT_5_6_5 /;" d +GMatchState vendor/lua-5.4.8/src/lstrlib.c /^typedef struct GMatchState {$/;" s file: +GMatchState vendor/lua-5.4.8/src/lstrlib.c /^} GMatchState;$/;" t typeref:struct:GMatchState file: +GOLD vendor/raylib-5.5_linux_amd64/include/raylib.h /^#define GOLD /;" d +GRAPHICS_API_OPENGL_33 vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ #define GRAPHICS_API_OPENGL_33$/;" d +GRAPHICS_API_OPENGL_33 vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ #define GRAPHICS_API_OPENGL_33$/;" d +GRAPHICS_API_OPENGL_ES2 vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ #define GRAPHICS_API_OPENGL_ES2$/;" d +GRAY vendor/raylib-5.5_linux_amd64/include/raylib.h /^#define GRAY /;" d +GREEN vendor/raylib-5.5_linux_amd64/include/raylib.h /^#define GREEN /;" d +G_NEW vendor/lua-5.4.8/src/lgc.h /^#define G_NEW /;" d +G_OLD vendor/lua-5.4.8/src/lgc.h /^#define G_OLD /;" d +G_OLD0 vendor/lua-5.4.8/src/lgc.h /^#define G_OLD0 /;" d +G_OLD1 vendor/lua-5.4.8/src/lgc.h /^#define G_OLD1 /;" d +G_SURVIVAL vendor/lua-5.4.8/src/lgc.h /^#define G_SURVIVAL /;" d +G_TOUCHED1 vendor/lua-5.4.8/src/lgc.h /^#define G_TOUCHED1 /;" d +G_TOUCHED2 vendor/lua-5.4.8/src/lgc.h /^#define G_TOUCHED2 /;" d +GamepadAxis vendor/raylib-5.5_linux_amd64/include/raylib.h /^} GamepadAxis;$/;" t typeref:enum:__anon77d6622f0803 +GamepadButton vendor/raylib-5.5_linux_amd64/include/raylib.h /^} GamepadButton;$/;" t typeref:enum:__anon77d6622f0703 +GenImageCellular vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI Image GenImageCellular(int width, int height, int tileSize); /;" p typeref:typename:RLAPI Image +GenImageChecked vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI Image GenImageChecked(int width, int height, int checksX, int checksY, Color col1, Color c/;" p typeref:typename:RLAPI Image +GenImageColor vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI Image GenImageColor(int width, int height, Color color); /;" p typeref:typename:RLAPI Image +GenImageFontAtlas vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI Image GenImageFontAtlas(const GlyphInfo *glyphs, Rectangle **glyphRecs, int glyphCount, in/;" p typeref:typename:RLAPI Image +GenImageGradientLinear vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI Image GenImageGradientLinear(int width, int height, int direction, Color start, Color end)/;" p typeref:typename:RLAPI Image +GenImageGradientRadial vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI Image GenImageGradientRadial(int width, int height, float density, Color inner, Color oute/;" p typeref:typename:RLAPI Image +GenImageGradientSquare vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI Image GenImageGradientSquare(int width, int height, float density, Color inner, Color oute/;" p typeref:typename:RLAPI Image +GenImagePerlinNoise vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI Image GenImagePerlinNoise(int width, int height, int offsetX, int offsetY, float scale); /;" p typeref:typename:RLAPI Image +GenImageText vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI Image GenImageText(int width, int height, const char *text); /;" p typeref:typename:RLAPI Image +GenImageWhiteNoise vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI Image GenImageWhiteNoise(int width, int height, float factor); /;" p typeref:typename:RLAPI Image +GenMeshCone vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI Mesh GenMeshCone(float radius, float height, int slices); \/\//;" p typeref:typename:RLAPI Mesh +GenMeshCube vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI Mesh GenMeshCube(float width, float height, float length); \/\//;" p typeref:typename:RLAPI Mesh +GenMeshCubicmap vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI Mesh GenMeshCubicmap(Image cubicmap, Vector3 cubeSize); \/\//;" p typeref:typename:RLAPI Mesh +GenMeshCylinder vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI Mesh GenMeshCylinder(float radius, float height, int slices); \/\//;" p typeref:typename:RLAPI Mesh +GenMeshHeightmap vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI Mesh GenMeshHeightmap(Image heightmap, Vector3 size); \/\//;" p typeref:typename:RLAPI Mesh +GenMeshHemiSphere vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI Mesh GenMeshHemiSphere(float radius, int rings, int slices); \/\//;" p typeref:typename:RLAPI Mesh +GenMeshKnot vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI Mesh GenMeshKnot(float radius, float size, int radSeg, int sides); \/\//;" p typeref:typename:RLAPI Mesh +GenMeshPlane vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI Mesh GenMeshPlane(float width, float length, int resX, int resZ); \/\//;" p typeref:typename:RLAPI Mesh +GenMeshPoly vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI Mesh GenMeshPoly(int sides, float radius); \/\//;" p typeref:typename:RLAPI Mesh +GenMeshSphere vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI Mesh GenMeshSphere(float radius, int rings, int slices); \/\//;" p typeref:typename:RLAPI Mesh +GenMeshTangents vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void GenMeshTangents(Mesh *mesh); \/\//;" p typeref:typename:RLAPI void +GenMeshTorus vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI Mesh GenMeshTorus(float radius, float size, int radSeg, int sides); \/\//;" p typeref:typename:RLAPI Mesh +GenTextureMipmaps vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void GenTextureMipmaps(Texture2D *texture); /;" p typeref:typename:RLAPI void +Gesture vendor/raylib-5.5_linux_amd64/include/raylib.h /^} Gesture;$/;" t typeref:enum:__anon77d6622f1303 +GetApplicationDirectory vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI const char *GetApplicationDirectory(void); \/\/ Get the directory of the /;" p typeref:typename:RLAPI const char * +GetCameraMatrix vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI Matrix GetCameraMatrix(Camera camera); \/\/ Get camera transfor/;" p typeref:typename:RLAPI Matrix +GetCameraMatrix2D vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI Matrix GetCameraMatrix2D(Camera2D camera); \/\/ Get camera 2d trans/;" p typeref:typename:RLAPI Matrix +GetCharPressed vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI int GetCharPressed(void); \/\/ Get char pressed (unicode), c/;" p typeref:typename:RLAPI int +GetClipboardImage vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI Image GetClipboardImage(void); \/\/ Get clipboard image conte/;" p typeref:typename:RLAPI Image +GetClipboardText vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI const char *GetClipboardText(void); \/\/ Get clipboard text conten/;" p typeref:typename:RLAPI const char * +GetCodepoint vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI int GetCodepoint(const char *text, int *codepointSize); \/\/ Get next codepoint /;" p typeref:typename:RLAPI int +GetCodepointCount vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI int GetCodepointCount(const char *text); \/\/ Get total number of/;" p typeref:typename:RLAPI int +GetCodepointNext vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI int GetCodepointNext(const char *text, int *codepointSize); \/\/ Get next codepoint /;" p typeref:typename:RLAPI int +GetCodepointPrevious vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI int GetCodepointPrevious(const char *text, int *codepointSize); \/\/ Get previous codepo/;" p typeref:typename:RLAPI int +GetCollisionRec vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI Rectangle GetCollisionRec(Rectangle rec1, Rectangle rec2); /;" p typeref:typename:RLAPI Rectangle +GetColor vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI Color GetColor(unsigned int hexValue); \/\/ Get Color struc/;" p typeref:typename:RLAPI Color +GetCurrentMonitor vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI int GetCurrentMonitor(void); \/\/ Get current monitor where/;" p typeref:typename:RLAPI int +GetDirectoryPath vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI const char *GetDirectoryPath(const char *filePath); \/\/ Get full path for a given/;" p typeref:typename:RLAPI const char * +GetFPS vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI int GetFPS(void); \/\/ Get current FPS$/;" p typeref:typename:RLAPI int +GetFileExtension vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI const char *GetFileExtension(const char *fileName); \/\/ Get pointer to extension /;" p typeref:typename:RLAPI const char * +GetFileLength vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI int GetFileLength(const char *fileName); \/\/ Get file length in bytes /;" p typeref:typename:RLAPI int +GetFileModTime vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI long GetFileModTime(const char *fileName); \/\/ Get file modification tim/;" p typeref:typename:RLAPI long +GetFileName vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI const char *GetFileName(const char *filePath); \/\/ Get pointer to filename f/;" p typeref:typename:RLAPI const char * +GetFileNameWithoutExt vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI const char *GetFileNameWithoutExt(const char *filePath); \/\/ Get filename string witho/;" p typeref:typename:RLAPI const char * +GetFontDefault vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI Font GetFontDefault(void); \/\//;" p typeref:typename:RLAPI Font +GetFrameTime vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI float GetFrameTime(void); \/\/ Get time in seconds for l/;" p typeref:typename:RLAPI float +GetGamepadAxisCount vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI int GetGamepadAxisCount(int gamepad); \/\/ Get game/;" p typeref:typename:RLAPI int +GetGamepadAxisMovement vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI float GetGamepadAxisMovement(int gamepad, int axis); \/\/ Get axis/;" p typeref:typename:RLAPI float +GetGamepadButtonPressed vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI int GetGamepadButtonPressed(void); \/\/ Get the /;" p typeref:typename:RLAPI int +GetGamepadName vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI const char *GetGamepadName(int gamepad); \/\/ Get game/;" p typeref:typename:RLAPI const char * +GetGestureDetected vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI int GetGestureDetected(void); \/\/ Get latest detected gesture$/;" p typeref:typename:RLAPI int +GetGestureDragAngle vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI float GetGestureDragAngle(void); \/\/ Get gesture drag angle$/;" p typeref:typename:RLAPI float +GetGestureDragVector vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI Vector2 GetGestureDragVector(void); \/\/ Get gesture drag vector$/;" p typeref:typename:RLAPI Vector2 +GetGestureHoldDuration vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI float GetGestureHoldDuration(void); \/\/ Get gesture hold time in seconds$/;" p typeref:typename:RLAPI float +GetGesturePinchAngle vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI float GetGesturePinchAngle(void); \/\/ Get gesture pinch angle$/;" p typeref:typename:RLAPI float +GetGesturePinchVector vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI Vector2 GetGesturePinchVector(void); \/\/ Get gesture pinch delta$/;" p typeref:typename:RLAPI Vector2 +GetGlyphAtlasRec vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI Rectangle GetGlyphAtlasRec(Font font, int codepoint); \/\//;" p typeref:typename:RLAPI Rectangle +GetGlyphIndex vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI int GetGlyphIndex(Font font, int codepoint); \/\//;" p typeref:typename:RLAPI int +GetGlyphInfo vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI GlyphInfo GetGlyphInfo(Font font, int codepoint); \/\//;" p typeref:typename:RLAPI GlyphInfo +GetImageAlphaBorder vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI Rectangle GetImageAlphaBorder(Image image, float threshold); /;" p typeref:typename:RLAPI Rectangle +GetImageColor vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI Color GetImageColor(Image image, int x, int y); /;" p typeref:typename:RLAPI Color +GetKeyPressed vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI int GetKeyPressed(void); \/\/ Get key pressed (keycode), ca/;" p typeref:typename:RLAPI int +GetMasterVolume vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI float GetMasterVolume(void); \/\/ Get master volume (li/;" p typeref:typename:RLAPI float +GetMeshBoundingBox vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI BoundingBox GetMeshBoundingBox(Mesh mesh); \/\//;" p typeref:typename:RLAPI BoundingBox +GetModelBoundingBox vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI BoundingBox GetModelBoundingBox(Model model); \/\//;" p typeref:typename:RLAPI BoundingBox +GetMonitorCount vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI int GetMonitorCount(void); \/\/ Get number of connected m/;" p typeref:typename:RLAPI int +GetMonitorHeight vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI int GetMonitorHeight(int monitor); \/\/ Get specified monitor hei/;" p typeref:typename:RLAPI int +GetMonitorName vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI const char *GetMonitorName(int monitor); \/\/ Get the human-readable, U/;" p typeref:typename:RLAPI const char * +GetMonitorPhysicalHeight vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI int GetMonitorPhysicalHeight(int monitor); \/\/ Get specified monitor phy/;" p typeref:typename:RLAPI int +GetMonitorPhysicalWidth vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI int GetMonitorPhysicalWidth(int monitor); \/\/ Get specified monitor phy/;" p typeref:typename:RLAPI int +GetMonitorPosition vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI Vector2 GetMonitorPosition(int monitor); \/\/ Get specified monitor pos/;" p typeref:typename:RLAPI Vector2 +GetMonitorRefreshRate vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI int GetMonitorRefreshRate(int monitor); \/\/ Get specified monitor ref/;" p typeref:typename:RLAPI int +GetMonitorWidth vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI int GetMonitorWidth(int monitor); \/\/ Get specified monitor wid/;" p typeref:typename:RLAPI int +GetMouseDelta vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI Vector2 GetMouseDelta(void); \/\/ Get mouse delta between frame/;" p typeref:typename:RLAPI Vector2 +GetMousePosition vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI Vector2 GetMousePosition(void); \/\/ Get mouse position XY$/;" p typeref:typename:RLAPI Vector2 +GetMouseRay vendor/raylib-5.5_linux_amd64/include/raylib.h /^#define GetMouseRay /;" d +GetMouseWheelMove vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI float GetMouseWheelMove(void); \/\/ Get mouse wheel movement for /;" p typeref:typename:RLAPI float +GetMouseWheelMoveV vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI Vector2 GetMouseWheelMoveV(void); \/\/ Get mouse wheel movement for /;" p typeref:typename:RLAPI Vector2 +GetMouseX vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI int GetMouseX(void); \/\/ Get mouse position X$/;" p typeref:typename:RLAPI int +GetMouseY vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI int GetMouseY(void); \/\/ Get mouse position Y$/;" p typeref:typename:RLAPI int +GetMusicTimeLength vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI float GetMusicTimeLength(Music music); \/\/ Get music time length/;" p typeref:typename:RLAPI float +GetMusicTimePlayed vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI float GetMusicTimePlayed(Music music); \/\/ Get current music tim/;" p typeref:typename:RLAPI float +GetPixelColor vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI Color GetPixelColor(void *srcPtr, int format); \/\/ Get Color from /;" p typeref:typename:RLAPI Color +GetPixelDataSize vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI int GetPixelDataSize(int width, int height, int format); \/\/ Get pixel data /;" p typeref:typename:RLAPI int +GetPrevDirectoryPath vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI const char *GetPrevDirectoryPath(const char *dirPath); \/\/ Get previous directory pa/;" p typeref:typename:RLAPI const char * +GetRandomValue vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI int GetRandomValue(int min, int max); \/\/ Get a random value betwee/;" p typeref:typename:RLAPI int +GetRayCollisionBox vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI RayCollision GetRayCollisionBox(Ray ray, BoundingBox box); /;" p typeref:typename:RLAPI RayCollision +GetRayCollisionMesh vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI RayCollision GetRayCollisionMesh(Ray ray, Mesh mesh, Matrix transform); /;" p typeref:typename:RLAPI RayCollision +GetRayCollisionQuad vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI RayCollision GetRayCollisionQuad(Ray ray, Vector3 p1, Vector3 p2, Vector3 p3, Vector3 p4);/;" p typeref:typename:RLAPI RayCollision +GetRayCollisionSphere vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI RayCollision GetRayCollisionSphere(Ray ray, Vector3 center, float radius); /;" p typeref:typename:RLAPI RayCollision +GetRayCollisionTriangle vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI RayCollision GetRayCollisionTriangle(Ray ray, Vector3 p1, Vector3 p2, Vector3 p3); /;" p typeref:typename:RLAPI RayCollision +GetRenderHeight vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI int GetRenderHeight(void); \/\/ Get current render height/;" p typeref:typename:RLAPI int +GetRenderWidth vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI int GetRenderWidth(void); \/\/ Get current render width /;" p typeref:typename:RLAPI int +GetScreenHeight vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI int GetScreenHeight(void); \/\/ Get current screen height$/;" p typeref:typename:RLAPI int +GetScreenToWorld2D vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI Vector2 GetScreenToWorld2D(Vector2 position, Camera2D camera); \/\/ Get the world space/;" p typeref:typename:RLAPI Vector2 +GetScreenToWorldRay vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI Ray GetScreenToWorldRay(Vector2 position, Camera camera); \/\/ Get a ray trace fro/;" p typeref:typename:RLAPI Ray +GetScreenToWorldRayEx vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI Ray GetScreenToWorldRayEx(Vector2 position, Camera camera, int width, int height); \/\/ Ge/;" p typeref:typename:RLAPI Ray +GetScreenWidth vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI int GetScreenWidth(void); \/\/ Get current screen width$/;" p typeref:typename:RLAPI int +GetShaderLocation vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI int GetShaderLocation(Shader shader, const char *uniformName); \/\/ Get shader unifo/;" p typeref:typename:RLAPI int +GetShaderLocationAttrib vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI int GetShaderLocationAttrib(Shader shader, const char *attribName); \/\/ Get shader attri/;" p typeref:typename:RLAPI int +GetShapesTexture vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI Texture2D GetShapesTexture(void); \/\/ Get texture that is/;" p typeref:typename:RLAPI Texture2D +GetShapesTextureRectangle vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI Rectangle GetShapesTextureRectangle(void); \/\/ Get texture source /;" p typeref:typename:RLAPI Rectangle +GetSplinePointBasis vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI Vector2 GetSplinePointBasis(Vector2 p1, Vector2 p2, Vector2 p3, Vector2 p4, float t); /;" p typeref:typename:RLAPI Vector2 +GetSplinePointBezierCubic vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI Vector2 GetSplinePointBezierCubic(Vector2 p1, Vector2 c2, Vector2 c3, Vector2 p4, float t)/;" p typeref:typename:RLAPI Vector2 +GetSplinePointBezierQuad vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI Vector2 GetSplinePointBezierQuad(Vector2 p1, Vector2 c2, Vector2 p3, float t); /;" p typeref:typename:RLAPI Vector2 +GetSplinePointCatmullRom vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI Vector2 GetSplinePointCatmullRom(Vector2 p1, Vector2 p2, Vector2 p3, Vector2 p4, float t);/;" p typeref:typename:RLAPI Vector2 +GetSplinePointLinear vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI Vector2 GetSplinePointLinear(Vector2 startPos, Vector2 endPos, float t); /;" p typeref:typename:RLAPI Vector2 +GetTime vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI double GetTime(void); \/\/ Get elapsed time in secon/;" p typeref:typename:RLAPI double +GetTouchPointCount vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI int GetTouchPointCount(void); \/\/ Get number of touch points$/;" p typeref:typename:RLAPI int +GetTouchPointId vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI int GetTouchPointId(int index); \/\/ Get touch point identifier fo/;" p typeref:typename:RLAPI int +GetTouchPosition vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI Vector2 GetTouchPosition(int index); \/\/ Get touch position XY for a t/;" p typeref:typename:RLAPI Vector2 +GetTouchX vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI int GetTouchX(void); \/\/ Get touch position X for touc/;" p typeref:typename:RLAPI int +GetTouchY vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI int GetTouchY(void); \/\/ Get touch position Y for touc/;" p typeref:typename:RLAPI int +GetWindowHandle vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void *GetWindowHandle(void); \/\/ Get native window handle$/;" p typeref:typename:RLAPI void * +GetWindowPosition vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI Vector2 GetWindowPosition(void); \/\/ Get window position XY on/;" p typeref:typename:RLAPI Vector2 +GetWindowScaleDPI vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI Vector2 GetWindowScaleDPI(void); \/\/ Get window scale DPI fact/;" p typeref:typename:RLAPI Vector2 +GetWorkingDirectory vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI const char *GetWorkingDirectory(void); \/\/ Get current working direc/;" p typeref:typename:RLAPI const char * +GetWorldToScreen vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI Vector2 GetWorldToScreen(Vector3 position, Camera camera); \/\/ Get the screen spac/;" p typeref:typename:RLAPI Vector2 +GetWorldToScreen2D vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI Vector2 GetWorldToScreen2D(Vector2 position, Camera2D camera); \/\/ Get the screen spac/;" p typeref:typename:RLAPI Vector2 +GetWorldToScreenEx vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI Vector2 GetWorldToScreenEx(Vector3 position, Camera camera, int width, int height); \/\/ G/;" p typeref:typename:RLAPI Vector2 +GlyphInfo vendor/raylib-5.5_linux_amd64/include/raylib.h /^typedef struct GlyphInfo {$/;" s +GlyphInfo vendor/raylib-5.5_linux_amd64/include/raylib.h /^} GlyphInfo;$/;" t typeref:struct:GlyphInfo +HOOKKEY vendor/lua-5.4.8/src/ldblib.c /^static const char *const HOOKKEY = "_HOOKKEY";$/;" v typeref:typename:const char * const file: +Header vendor/lua-5.4.8/src/lstrlib.c /^typedef struct Header {$/;" s file: +Header vendor/lua-5.4.8/src/lstrlib.c /^} Header;$/;" t typeref:struct:Header file: +HideCursor vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void HideCursor(void); \/\/ Hides cursor$/;" p typeref:typename:RLAPI void +I2UInt vendor/lua-5.4.8/src/lmathlib.c /^#define I2UInt(/;" d file: +I2UInt vendor/lua-5.4.8/src/lmathlib.c /^static lua_Unsigned I2UInt (Rand64 x) {$/;" f typeref:typename:lua_Unsigned file: +I2d vendor/lua-5.4.8/src/lmathlib.c /^static lua_Number I2d (Rand64 x) {$/;" f typeref:typename:lua_Number file: +INSTALL vendor/lua-5.4.8/Makefile /^INSTALL= install -p$/;" m +INSTALL_BIN vendor/lua-5.4.8/Makefile /^INSTALL_BIN= $(INSTALL_TOP)\/bin$/;" m +INSTALL_CMOD vendor/lua-5.4.8/Makefile /^INSTALL_CMOD= $(INSTALL_TOP)\/lib\/lua\/$V$/;" m +INSTALL_DATA vendor/lua-5.4.8/Makefile /^INSTALL_DATA= $(INSTALL) -m 0644$/;" m +INSTALL_EXEC vendor/lua-5.4.8/Makefile /^INSTALL_EXEC= $(INSTALL) -m 0755$/;" m +INSTALL_INC vendor/lua-5.4.8/Makefile /^INSTALL_INC= $(INSTALL_TOP)\/include$/;" m +INSTALL_LIB vendor/lua-5.4.8/Makefile /^INSTALL_LIB= $(INSTALL_TOP)\/lib$/;" m +INSTALL_LMOD vendor/lua-5.4.8/Makefile /^INSTALL_LMOD= $(INSTALL_TOP)\/share\/lua\/$V$/;" m +INSTALL_MAN vendor/lua-5.4.8/Makefile /^INSTALL_MAN= $(INSTALL_TOP)\/man\/man1$/;" m +INSTALL_TOP vendor/lua-5.4.8/Makefile /^INSTALL_TOP= \/usr\/local$/;" m +IN_FILE main.c /^#define IN_FILE /;" d file: +IOPREF_LEN vendor/lua-5.4.8/src/liolib.c /^#define IOPREF_LEN /;" d file: +IO_INPUT vendor/lua-5.4.8/src/liolib.c /^#define IO_INPUT /;" d file: +IO_OUTPUT vendor/lua-5.4.8/src/liolib.c /^#define IO_OUTPUT /;" d file: +IO_PREFIX vendor/lua-5.4.8/src/liolib.c /^#define IO_PREFIX /;" d file: +IS vendor/lua-5.4.8/src/luac.c /^#define IS(/;" d file: +ISK vendor/lua-5.4.8/src/luac.c /^#define ISK /;" d file: +Iadd vendor/lua-5.4.8/src/lmathlib.c /^static Rand64 Iadd (Rand64 i1, Rand64 i2) {$/;" f typeref:typename:Rand64 file: +IdxT vendor/lua-5.4.8/src/ltablib.c /^typedef unsigned int IdxT;$/;" t typeref:typename:unsigned int file: +Image vendor/raylib-5.5_linux_amd64/include/raylib.h /^typedef struct Image {$/;" s +Image vendor/raylib-5.5_linux_amd64/include/raylib.h /^} Image;$/;" t typeref:struct:Image +ImageAlphaClear vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void ImageAlphaClear(Image *image, Color color, float threshold); /;" p typeref:typename:RLAPI void +ImageAlphaCrop vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void ImageAlphaCrop(Image *image, float threshold); /;" p typeref:typename:RLAPI void +ImageAlphaMask vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void ImageAlphaMask(Image *image, Image alphaMask); /;" p typeref:typename:RLAPI void +ImageAlphaPremultiply vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void ImageAlphaPremultiply(Image *image); /;" p typeref:typename:RLAPI void +ImageBlurGaussian vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void ImageBlurGaussian(Image *image, int blurSize); /;" p typeref:typename:RLAPI void +ImageClearBackground vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void ImageClearBackground(Image *dst, Color color); /;" p typeref:typename:RLAPI void +ImageColorBrightness vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void ImageColorBrightness(Image *image, int brightness); /;" p typeref:typename:RLAPI void +ImageColorContrast vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void ImageColorContrast(Image *image, float contrast); /;" p typeref:typename:RLAPI void +ImageColorGrayscale vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void ImageColorGrayscale(Image *image); /;" p typeref:typename:RLAPI void +ImageColorInvert vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void ImageColorInvert(Image *image); /;" p typeref:typename:RLAPI void +ImageColorReplace vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void ImageColorReplace(Image *image, Color color, Color replace); /;" p typeref:typename:RLAPI void +ImageColorTint vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void ImageColorTint(Image *image, Color color); /;" p typeref:typename:RLAPI void +ImageCopy vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI Image ImageCopy(Image image); /;" p typeref:typename:RLAPI Image +ImageCrop vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void ImageCrop(Image *image, Rectangle crop); /;" p typeref:typename:RLAPI void +ImageDither vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void ImageDither(Image *image, int rBpp, int gBpp, int bBpp, int aBpp); /;" p typeref:typename:RLAPI void +ImageDraw vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void ImageDraw(Image *dst, Image src, Rectangle srcRec, Rectangle dstRec, Color tint); /;" p typeref:typename:RLAPI void +ImageDrawCircle vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void ImageDrawCircle(Image *dst, int centerX, int centerY, int radius, Color color); /;" p typeref:typename:RLAPI void +ImageDrawCircleLines vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void ImageDrawCircleLines(Image *dst, int centerX, int centerY, int radius, Color color); /;" p typeref:typename:RLAPI void +ImageDrawCircleLinesV vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void ImageDrawCircleLinesV(Image *dst, Vector2 center, int radius, Color color); /;" p typeref:typename:RLAPI void +ImageDrawCircleV vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void ImageDrawCircleV(Image *dst, Vector2 center, int radius, Color color); /;" p typeref:typename:RLAPI void +ImageDrawLine vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void ImageDrawLine(Image *dst, int startPosX, int startPosY, int endPosX, int endPosY, Col/;" p typeref:typename:RLAPI void +ImageDrawLineEx vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void ImageDrawLineEx(Image *dst, Vector2 start, Vector2 end, int thick, Color color); /;" p typeref:typename:RLAPI void +ImageDrawLineV vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void ImageDrawLineV(Image *dst, Vector2 start, Vector2 end, Color color); /;" p typeref:typename:RLAPI void +ImageDrawPixel vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void ImageDrawPixel(Image *dst, int posX, int posY, Color color); /;" p typeref:typename:RLAPI void +ImageDrawPixelV vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void ImageDrawPixelV(Image *dst, Vector2 position, Color color); /;" p typeref:typename:RLAPI void +ImageDrawRectangle vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void ImageDrawRectangle(Image *dst, int posX, int posY, int width, int height, Color color/;" p typeref:typename:RLAPI void +ImageDrawRectangleLines vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void ImageDrawRectangleLines(Image *dst, Rectangle rec, int thick, Color color); /;" p typeref:typename:RLAPI void +ImageDrawRectangleRec vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void ImageDrawRectangleRec(Image *dst, Rectangle rec, Color color); /;" p typeref:typename:RLAPI void +ImageDrawRectangleV vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void ImageDrawRectangleV(Image *dst, Vector2 position, Vector2 size, Color color); /;" p typeref:typename:RLAPI void +ImageDrawText vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void ImageDrawText(Image *dst, const char *text, int posX, int posY, int fontSize, Color c/;" p typeref:typename:RLAPI void +ImageDrawTextEx vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void ImageDrawTextEx(Image *dst, Font font, const char *text, Vector2 position, float font/;" p typeref:typename:RLAPI void +ImageDrawTriangle vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void ImageDrawTriangle(Image *dst, Vector2 v1, Vector2 v2, Vector2 v3, Color color); /;" p typeref:typename:RLAPI void +ImageDrawTriangleEx vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void ImageDrawTriangleEx(Image *dst, Vector2 v1, Vector2 v2, Vector2 v3, Color c1, Color c/;" p typeref:typename:RLAPI void +ImageDrawTriangleFan vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void ImageDrawTriangleFan(Image *dst, Vector2 *points, int pointCount, Color color); /;" p typeref:typename:RLAPI void +ImageDrawTriangleLines vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void ImageDrawTriangleLines(Image *dst, Vector2 v1, Vector2 v2, Vector2 v3, Color color); /;" p typeref:typename:RLAPI void +ImageDrawTriangleStrip vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void ImageDrawTriangleStrip(Image *dst, Vector2 *points, int pointCount, Color color); /;" p typeref:typename:RLAPI void +ImageFlipHorizontal vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void ImageFlipHorizontal(Image *image); /;" p typeref:typename:RLAPI void +ImageFlipVertical vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void ImageFlipVertical(Image *image); /;" p typeref:typename:RLAPI void +ImageFormat vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void ImageFormat(Image *image, int newFormat); /;" p typeref:typename:RLAPI void +ImageFromChannel vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI Image ImageFromChannel(Image image, int selectedChannel); /;" p typeref:typename:RLAPI Image +ImageFromImage vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI Image ImageFromImage(Image image, Rectangle rec); /;" p typeref:typename:RLAPI Image +ImageKernelConvolution vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void ImageKernelConvolution(Image *image, const float *kernel, int kernelSize); /;" p typeref:typename:RLAPI void +ImageMipmaps vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void ImageMipmaps(Image *image); /;" p typeref:typename:RLAPI void +ImageResize vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void ImageResize(Image *image, int newWidth, int newHeight); /;" p typeref:typename:RLAPI void +ImageResizeCanvas vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void ImageResizeCanvas(Image *image, int newWidth, int newHeight, int offsetX, int offsetY/;" p typeref:typename:RLAPI void +ImageResizeNN vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void ImageResizeNN(Image *image, int newWidth,int newHeight); /;" p typeref:typename:RLAPI void +ImageRotate vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void ImageRotate(Image *image, int degrees); /;" p typeref:typename:RLAPI void +ImageRotateCCW vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void ImageRotateCCW(Image *image); /;" p typeref:typename:RLAPI void +ImageRotateCW vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void ImageRotateCW(Image *image); /;" p typeref:typename:RLAPI void +ImageText vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI Image ImageText(const char *text, int fontSize, Color color); /;" p typeref:typename:RLAPI Image +ImageTextEx vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI Image ImageTextEx(Font font, const char *text, float fontSize, float spacing, Color tint);/;" p typeref:typename:RLAPI Image +ImageToPOT vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void ImageToPOT(Image *image, Color fill); /;" p typeref:typename:RLAPI void +InitAudioDevice vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void InitAudioDevice(void); \/\/ Initialize audio devi/;" p typeref:typename:RLAPI void +InitWindow vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void InitWindow(int width, int height, const char *title); \/\/ Initialize window and Ope/;" p typeref:typename:RLAPI void +Inspiration & Materials README.md /^## Inspiration & Materials$/;" s chapter:Bidi - Game development framework +Installing and building raylib on multiple platforms vendor/raylib-5.5_linux_amd64/README.md /^#### Installing and building raylib on multiple platforms$/;" t section:build and installation +Instruction vendor/lua-5.4.8/src/llimits.h /^typedef l_uint32 Instruction;$/;" t typeref:typename:l_uint32 +Int2I vendor/lua-5.4.8/src/lmathlib.c /^#define Int2I(/;" d file: +Int2I vendor/lua-5.4.8/src/lmathlib.c /^static Rand64 Int2I (lua_Unsigned n) {$/;" f typeref:typename:Rand64 file: +IsAudioDeviceReady vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI bool IsAudioDeviceReady(void); \/\/ Check if audio device/;" p typeref:typename:RLAPI bool +IsAudioStreamPlaying vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI bool IsAudioStreamPlaying(AudioStream stream); \/\/ Check if audio stream/;" p typeref:typename:RLAPI bool +IsAudioStreamProcessed vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI bool IsAudioStreamProcessed(AudioStream stream); \/\/ Check if any audio st/;" p typeref:typename:RLAPI bool +IsAudioStreamValid vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI bool IsAudioStreamValid(AudioStream stream); \/\/ Checks if an audio st/;" p typeref:typename:RLAPI bool +IsCursorHidden vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI bool IsCursorHidden(void); \/\/ Check if cursor is not vi/;" p typeref:typename:RLAPI bool +IsCursorOnScreen vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI bool IsCursorOnScreen(void); \/\/ Check if cursor is on the/;" p typeref:typename:RLAPI bool +IsFileDropped vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI bool IsFileDropped(void); \/\/ Check if a file has been /;" p typeref:typename:RLAPI bool +IsFileExtension vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI bool IsFileExtension(const char *fileName, const char *ext); \/\/ Check file extension (in/;" p typeref:typename:RLAPI bool +IsFileNameValid vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI bool IsFileNameValid(const char *fileName); \/\/ Check if fileName is vali/;" p typeref:typename:RLAPI bool +IsFontValid vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI bool IsFontValid(Font font); \/\//;" p typeref:typename:RLAPI bool +IsGamepadAvailable vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI bool IsGamepadAvailable(int gamepad); \/\/ Check if/;" p typeref:typename:RLAPI bool +IsGamepadButtonDown vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI bool IsGamepadButtonDown(int gamepad, int button); \/\/ Check if/;" p typeref:typename:RLAPI bool +IsGamepadButtonPressed vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI bool IsGamepadButtonPressed(int gamepad, int button); \/\/ Check if/;" p typeref:typename:RLAPI bool +IsGamepadButtonReleased vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI bool IsGamepadButtonReleased(int gamepad, int button); \/\/ Check if/;" p typeref:typename:RLAPI bool +IsGamepadButtonUp vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI bool IsGamepadButtonUp(int gamepad, int button); \/\/ Check if/;" p typeref:typename:RLAPI bool +IsGestureDetected vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI bool IsGestureDetected(unsigned int gesture); \/\/ Check if a gesture have been detect/;" p typeref:typename:RLAPI bool +IsImageValid vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI bool IsImageValid(Image image); /;" p typeref:typename:RLAPI bool +IsKeyDown vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI bool IsKeyDown(int key); \/\/ Check if a key is being press/;" p typeref:typename:RLAPI bool +IsKeyPressed vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI bool IsKeyPressed(int key); \/\/ Check if a key has been press/;" p typeref:typename:RLAPI bool +IsKeyPressedRepeat vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI bool IsKeyPressedRepeat(int key); \/\/ Check if a key has been press/;" p typeref:typename:RLAPI bool +IsKeyReleased vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI bool IsKeyReleased(int key); \/\/ Check if a key has been relea/;" p typeref:typename:RLAPI bool +IsKeyUp vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI bool IsKeyUp(int key); \/\/ Check if a key is NOT being p/;" p typeref:typename:RLAPI bool +IsMaterialValid vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI bool IsMaterialValid(Material material); \/\//;" p typeref:typename:RLAPI bool +IsModelAnimationValid vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI bool IsModelAnimationValid(Model model, ModelAnimation anim); \/\//;" p typeref:typename:RLAPI bool +IsModelValid vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI bool IsModelValid(Model model); \/\//;" p typeref:typename:RLAPI bool +IsMouseButtonDown vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI bool IsMouseButtonDown(int button); \/\/ Check if a mouse button is be/;" p typeref:typename:RLAPI bool +IsMouseButtonPressed vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI bool IsMouseButtonPressed(int button); \/\/ Check if a mouse button has b/;" p typeref:typename:RLAPI bool +IsMouseButtonReleased vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI bool IsMouseButtonReleased(int button); \/\/ Check if a mouse button has b/;" p typeref:typename:RLAPI bool +IsMouseButtonUp vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI bool IsMouseButtonUp(int button); \/\/ Check if a mouse button is NO/;" p typeref:typename:RLAPI bool +IsMusicStreamPlaying vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI bool IsMusicStreamPlaying(Music music); \/\/ Check if music is pla/;" p typeref:typename:RLAPI bool +IsMusicValid vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI bool IsMusicValid(Music music); \/\/ Checks if a music str/;" p typeref:typename:RLAPI bool +IsPathFile vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI bool IsPathFile(const char *path); \/\/ Check if a given path is /;" p typeref:typename:RLAPI bool +IsRenderTextureValid vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI bool IsRenderTextureValid(RenderTexture2D target); /;" p typeref:typename:RLAPI bool +IsShaderValid vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI bool IsShaderValid(Shader shader); \/\/ Check if a shade/;" p typeref:typename:RLAPI bool +IsSoundPlaying vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI bool IsSoundPlaying(Sound sound); \/\/ Check if a sound is c/;" p typeref:typename:RLAPI bool +IsSoundValid vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI bool IsSoundValid(Sound sound); \/\/ Checks if a sound is /;" p typeref:typename:RLAPI bool +IsTextureValid vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI bool IsTextureValid(Texture2D texture); /;" p typeref:typename:RLAPI bool +IsWaveValid vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI bool IsWaveValid(Wave wave); \/\/ Checks if wave data i/;" p typeref:typename:RLAPI bool +IsWindowFocused vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI bool IsWindowFocused(void); \/\/ Check if window is curren/;" p typeref:typename:RLAPI bool +IsWindowFullscreen vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI bool IsWindowFullscreen(void); \/\/ Check if window is curren/;" p typeref:typename:RLAPI bool +IsWindowHidden vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI bool IsWindowHidden(void); \/\/ Check if window is curren/;" p typeref:typename:RLAPI bool +IsWindowMaximized vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI bool IsWindowMaximized(void); \/\/ Check if window is curren/;" p typeref:typename:RLAPI bool +IsWindowMinimized vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI bool IsWindowMinimized(void); \/\/ Check if window is curren/;" p typeref:typename:RLAPI bool +IsWindowReady vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI bool IsWindowReady(void); \/\/ Check if window has been /;" p typeref:typename:RLAPI bool +IsWindowResized vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI bool IsWindowResized(void); \/\/ Check if window has been /;" p typeref:typename:RLAPI bool +IsWindowState vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI bool IsWindowState(unsigned int flag); \/\/ Check if one specific win/;" p typeref:typename:RLAPI bool +Ishl vendor/lua-5.4.8/src/lmathlib.c /^static Rand64 Ishl (Rand64 i, int n) {$/;" f typeref:typename:Rand64 file: +Ixor vendor/lua-5.4.8/src/lmathlib.c /^static void Ixor (Rand64 *i1, Rand64 i2) {$/;" f typeref:typename:void file: +KB vendor/lua-5.4.8/src/lvm.c /^#define KB(/;" d file: +KC vendor/lua-5.4.8/src/lvm.c /^#define KC(/;" d file: +KEY_A vendor/raylib-5.5_linux_amd64/include/raylib.h /^ KEY_A = 65, \/\/ Key: A | a$/;" e enum:__anon77d6622f0403 +KEY_APOSTROPHE vendor/raylib-5.5_linux_amd64/include/raylib.h /^ KEY_APOSTROPHE = 39, \/\/ Key: '$/;" e enum:__anon77d6622f0403 +KEY_B vendor/raylib-5.5_linux_amd64/include/raylib.h /^ KEY_B = 66, \/\/ Key: B | b$/;" e enum:__anon77d6622f0403 +KEY_BACK vendor/raylib-5.5_linux_amd64/include/raylib.h /^ KEY_BACK = 4, \/\/ Key: Android back button$/;" e enum:__anon77d6622f0403 +KEY_BACKSLASH vendor/raylib-5.5_linux_amd64/include/raylib.h /^ KEY_BACKSLASH = 92, \/\/ Key: '\\'$/;" e enum:__anon77d6622f0403 +KEY_BACKSPACE vendor/raylib-5.5_linux_amd64/include/raylib.h /^ KEY_BACKSPACE = 259, \/\/ Key: Backspace$/;" e enum:__anon77d6622f0403 +KEY_C vendor/raylib-5.5_linux_amd64/include/raylib.h /^ KEY_C = 67, \/\/ Key: C | c$/;" e enum:__anon77d6622f0403 +KEY_CAPS_LOCK vendor/raylib-5.5_linux_amd64/include/raylib.h /^ KEY_CAPS_LOCK = 280, \/\/ Key: Caps lock$/;" e enum:__anon77d6622f0403 +KEY_COMMA vendor/raylib-5.5_linux_amd64/include/raylib.h /^ KEY_COMMA = 44, \/\/ Key: ,$/;" e enum:__anon77d6622f0403 +KEY_D vendor/raylib-5.5_linux_amd64/include/raylib.h /^ KEY_D = 68, \/\/ Key: D | d$/;" e enum:__anon77d6622f0403 +KEY_DELETE vendor/raylib-5.5_linux_amd64/include/raylib.h /^ KEY_DELETE = 261, \/\/ Key: Del$/;" e enum:__anon77d6622f0403 +KEY_DOWN vendor/raylib-5.5_linux_amd64/include/raylib.h /^ KEY_DOWN = 264, \/\/ Key: Cursor down$/;" e enum:__anon77d6622f0403 +KEY_E vendor/raylib-5.5_linux_amd64/include/raylib.h /^ KEY_E = 69, \/\/ Key: E | e$/;" e enum:__anon77d6622f0403 +KEY_EIGHT vendor/raylib-5.5_linux_amd64/include/raylib.h /^ KEY_EIGHT = 56, \/\/ Key: 8$/;" e enum:__anon77d6622f0403 +KEY_END vendor/raylib-5.5_linux_amd64/include/raylib.h /^ KEY_END = 269, \/\/ Key: End$/;" e enum:__anon77d6622f0403 +KEY_ENTER vendor/raylib-5.5_linux_amd64/include/raylib.h /^ KEY_ENTER = 257, \/\/ Key: Enter$/;" e enum:__anon77d6622f0403 +KEY_EQUAL vendor/raylib-5.5_linux_amd64/include/raylib.h /^ KEY_EQUAL = 61, \/\/ Key: =$/;" e enum:__anon77d6622f0403 +KEY_ESCAPE vendor/raylib-5.5_linux_amd64/include/raylib.h /^ KEY_ESCAPE = 256, \/\/ Key: Esc$/;" e enum:__anon77d6622f0403 +KEY_F vendor/raylib-5.5_linux_amd64/include/raylib.h /^ KEY_F = 70, \/\/ Key: F | f$/;" e enum:__anon77d6622f0403 +KEY_F1 vendor/raylib-5.5_linux_amd64/include/raylib.h /^ KEY_F1 = 290, \/\/ Key: F1$/;" e enum:__anon77d6622f0403 +KEY_F10 vendor/raylib-5.5_linux_amd64/include/raylib.h /^ KEY_F10 = 299, \/\/ Key: F10$/;" e enum:__anon77d6622f0403 +KEY_F11 vendor/raylib-5.5_linux_amd64/include/raylib.h /^ KEY_F11 = 300, \/\/ Key: F11$/;" e enum:__anon77d6622f0403 +KEY_F12 vendor/raylib-5.5_linux_amd64/include/raylib.h /^ KEY_F12 = 301, \/\/ Key: F12$/;" e enum:__anon77d6622f0403 +KEY_F2 vendor/raylib-5.5_linux_amd64/include/raylib.h /^ KEY_F2 = 291, \/\/ Key: F2$/;" e enum:__anon77d6622f0403 +KEY_F3 vendor/raylib-5.5_linux_amd64/include/raylib.h /^ KEY_F3 = 292, \/\/ Key: F3$/;" e enum:__anon77d6622f0403 +KEY_F4 vendor/raylib-5.5_linux_amd64/include/raylib.h /^ KEY_F4 = 293, \/\/ Key: F4$/;" e enum:__anon77d6622f0403 +KEY_F5 vendor/raylib-5.5_linux_amd64/include/raylib.h /^ KEY_F5 = 294, \/\/ Key: F5$/;" e enum:__anon77d6622f0403 +KEY_F6 vendor/raylib-5.5_linux_amd64/include/raylib.h /^ KEY_F6 = 295, \/\/ Key: F6$/;" e enum:__anon77d6622f0403 +KEY_F7 vendor/raylib-5.5_linux_amd64/include/raylib.h /^ KEY_F7 = 296, \/\/ Key: F7$/;" e enum:__anon77d6622f0403 +KEY_F8 vendor/raylib-5.5_linux_amd64/include/raylib.h /^ KEY_F8 = 297, \/\/ Key: F8$/;" e enum:__anon77d6622f0403 +KEY_F9 vendor/raylib-5.5_linux_amd64/include/raylib.h /^ KEY_F9 = 298, \/\/ Key: F9$/;" e enum:__anon77d6622f0403 +KEY_FIVE vendor/raylib-5.5_linux_amd64/include/raylib.h /^ KEY_FIVE = 53, \/\/ Key: 5$/;" e enum:__anon77d6622f0403 +KEY_FOUR vendor/raylib-5.5_linux_amd64/include/raylib.h /^ KEY_FOUR = 52, \/\/ Key: 4$/;" e enum:__anon77d6622f0403 +KEY_G vendor/raylib-5.5_linux_amd64/include/raylib.h /^ KEY_G = 71, \/\/ Key: G | g$/;" e enum:__anon77d6622f0403 +KEY_GRAVE vendor/raylib-5.5_linux_amd64/include/raylib.h /^ KEY_GRAVE = 96, \/\/ Key: `$/;" e enum:__anon77d6622f0403 +KEY_H vendor/raylib-5.5_linux_amd64/include/raylib.h /^ KEY_H = 72, \/\/ Key: H | h$/;" e enum:__anon77d6622f0403 +KEY_HOME vendor/raylib-5.5_linux_amd64/include/raylib.h /^ KEY_HOME = 268, \/\/ Key: Home$/;" e enum:__anon77d6622f0403 +KEY_I vendor/raylib-5.5_linux_amd64/include/raylib.h /^ KEY_I = 73, \/\/ Key: I | i$/;" e enum:__anon77d6622f0403 +KEY_INSERT vendor/raylib-5.5_linux_amd64/include/raylib.h /^ KEY_INSERT = 260, \/\/ Key: Ins$/;" e enum:__anon77d6622f0403 +KEY_J vendor/raylib-5.5_linux_amd64/include/raylib.h /^ KEY_J = 74, \/\/ Key: J | j$/;" e enum:__anon77d6622f0403 +KEY_K vendor/raylib-5.5_linux_amd64/include/raylib.h /^ KEY_K = 75, \/\/ Key: K | k$/;" e enum:__anon77d6622f0403 +KEY_KB_MENU vendor/raylib-5.5_linux_amd64/include/raylib.h /^ KEY_KB_MENU = 348, \/\/ Key: KB menu$/;" e enum:__anon77d6622f0403 +KEY_KP_0 vendor/raylib-5.5_linux_amd64/include/raylib.h /^ KEY_KP_0 = 320, \/\/ Key: Keypad 0$/;" e enum:__anon77d6622f0403 +KEY_KP_1 vendor/raylib-5.5_linux_amd64/include/raylib.h /^ KEY_KP_1 = 321, \/\/ Key: Keypad 1$/;" e enum:__anon77d6622f0403 +KEY_KP_2 vendor/raylib-5.5_linux_amd64/include/raylib.h /^ KEY_KP_2 = 322, \/\/ Key: Keypad 2$/;" e enum:__anon77d6622f0403 +KEY_KP_3 vendor/raylib-5.5_linux_amd64/include/raylib.h /^ KEY_KP_3 = 323, \/\/ Key: Keypad 3$/;" e enum:__anon77d6622f0403 +KEY_KP_4 vendor/raylib-5.5_linux_amd64/include/raylib.h /^ KEY_KP_4 = 324, \/\/ Key: Keypad 4$/;" e enum:__anon77d6622f0403 +KEY_KP_5 vendor/raylib-5.5_linux_amd64/include/raylib.h /^ KEY_KP_5 = 325, \/\/ Key: Keypad 5$/;" e enum:__anon77d6622f0403 +KEY_KP_6 vendor/raylib-5.5_linux_amd64/include/raylib.h /^ KEY_KP_6 = 326, \/\/ Key: Keypad 6$/;" e enum:__anon77d6622f0403 +KEY_KP_7 vendor/raylib-5.5_linux_amd64/include/raylib.h /^ KEY_KP_7 = 327, \/\/ Key: Keypad 7$/;" e enum:__anon77d6622f0403 +KEY_KP_8 vendor/raylib-5.5_linux_amd64/include/raylib.h /^ KEY_KP_8 = 328, \/\/ Key: Keypad 8$/;" e enum:__anon77d6622f0403 +KEY_KP_9 vendor/raylib-5.5_linux_amd64/include/raylib.h /^ KEY_KP_9 = 329, \/\/ Key: Keypad 9$/;" e enum:__anon77d6622f0403 +KEY_KP_ADD vendor/raylib-5.5_linux_amd64/include/raylib.h /^ KEY_KP_ADD = 334, \/\/ Key: Keypad +$/;" e enum:__anon77d6622f0403 +KEY_KP_DECIMAL vendor/raylib-5.5_linux_amd64/include/raylib.h /^ KEY_KP_DECIMAL = 330, \/\/ Key: Keypad .$/;" e enum:__anon77d6622f0403 +KEY_KP_DIVIDE vendor/raylib-5.5_linux_amd64/include/raylib.h /^ KEY_KP_DIVIDE = 331, \/\/ Key: Keypad \/$/;" e enum:__anon77d6622f0403 +KEY_KP_ENTER vendor/raylib-5.5_linux_amd64/include/raylib.h /^ KEY_KP_ENTER = 335, \/\/ Key: Keypad Enter$/;" e enum:__anon77d6622f0403 +KEY_KP_EQUAL vendor/raylib-5.5_linux_amd64/include/raylib.h /^ KEY_KP_EQUAL = 336, \/\/ Key: Keypad =$/;" e enum:__anon77d6622f0403 +KEY_KP_MULTIPLY vendor/raylib-5.5_linux_amd64/include/raylib.h /^ KEY_KP_MULTIPLY = 332, \/\/ Key: Keypad *$/;" e enum:__anon77d6622f0403 +KEY_KP_SUBTRACT vendor/raylib-5.5_linux_amd64/include/raylib.h /^ KEY_KP_SUBTRACT = 333, \/\/ Key: Keypad -$/;" e enum:__anon77d6622f0403 +KEY_L vendor/raylib-5.5_linux_amd64/include/raylib.h /^ KEY_L = 76, \/\/ Key: L | l$/;" e enum:__anon77d6622f0403 +KEY_LEFT vendor/raylib-5.5_linux_amd64/include/raylib.h /^ KEY_LEFT = 263, \/\/ Key: Cursor left$/;" e enum:__anon77d6622f0403 +KEY_LEFT_ALT vendor/raylib-5.5_linux_amd64/include/raylib.h /^ KEY_LEFT_ALT = 342, \/\/ Key: Alt left$/;" e enum:__anon77d6622f0403 +KEY_LEFT_BRACKET vendor/raylib-5.5_linux_amd64/include/raylib.h /^ KEY_LEFT_BRACKET = 91, \/\/ Key: [$/;" e enum:__anon77d6622f0403 +KEY_LEFT_CONTROL vendor/raylib-5.5_linux_amd64/include/raylib.h /^ KEY_LEFT_CONTROL = 341, \/\/ Key: Control left$/;" e enum:__anon77d6622f0403 +KEY_LEFT_SHIFT vendor/raylib-5.5_linux_amd64/include/raylib.h /^ KEY_LEFT_SHIFT = 340, \/\/ Key: Shift left$/;" e enum:__anon77d6622f0403 +KEY_LEFT_SUPER vendor/raylib-5.5_linux_amd64/include/raylib.h /^ KEY_LEFT_SUPER = 343, \/\/ Key: Super left$/;" e enum:__anon77d6622f0403 +KEY_M vendor/raylib-5.5_linux_amd64/include/raylib.h /^ KEY_M = 77, \/\/ Key: M | m$/;" e enum:__anon77d6622f0403 +KEY_MENU vendor/raylib-5.5_linux_amd64/include/raylib.h /^ KEY_MENU = 5, \/\/ Key: Android menu button$/;" e enum:__anon77d6622f0403 +KEY_MINUS vendor/raylib-5.5_linux_amd64/include/raylib.h /^ KEY_MINUS = 45, \/\/ Key: -$/;" e enum:__anon77d6622f0403 +KEY_N vendor/raylib-5.5_linux_amd64/include/raylib.h /^ KEY_N = 78, \/\/ Key: N | n$/;" e enum:__anon77d6622f0403 +KEY_NINE vendor/raylib-5.5_linux_amd64/include/raylib.h /^ KEY_NINE = 57, \/\/ Key: 9$/;" e enum:__anon77d6622f0403 +KEY_NULL vendor/raylib-5.5_linux_amd64/include/raylib.h /^ KEY_NULL = 0, \/\/ Key: NULL, used for no key pressed$/;" e enum:__anon77d6622f0403 +KEY_NUM_LOCK vendor/raylib-5.5_linux_amd64/include/raylib.h /^ KEY_NUM_LOCK = 282, \/\/ Key: Num lock$/;" e enum:__anon77d6622f0403 +KEY_O vendor/raylib-5.5_linux_amd64/include/raylib.h /^ KEY_O = 79, \/\/ Key: O | o$/;" e enum:__anon77d6622f0403 +KEY_ONE vendor/raylib-5.5_linux_amd64/include/raylib.h /^ KEY_ONE = 49, \/\/ Key: 1$/;" e enum:__anon77d6622f0403 +KEY_P vendor/raylib-5.5_linux_amd64/include/raylib.h /^ KEY_P = 80, \/\/ Key: P | p$/;" e enum:__anon77d6622f0403 +KEY_PAGE_DOWN vendor/raylib-5.5_linux_amd64/include/raylib.h /^ KEY_PAGE_DOWN = 267, \/\/ Key: Page down$/;" e enum:__anon77d6622f0403 +KEY_PAGE_UP vendor/raylib-5.5_linux_amd64/include/raylib.h /^ KEY_PAGE_UP = 266, \/\/ Key: Page up$/;" e enum:__anon77d6622f0403 +KEY_PAUSE vendor/raylib-5.5_linux_amd64/include/raylib.h /^ KEY_PAUSE = 284, \/\/ Key: Pause$/;" e enum:__anon77d6622f0403 +KEY_PERIOD vendor/raylib-5.5_linux_amd64/include/raylib.h /^ KEY_PERIOD = 46, \/\/ Key: .$/;" e enum:__anon77d6622f0403 +KEY_PRINT_SCREEN vendor/raylib-5.5_linux_amd64/include/raylib.h /^ KEY_PRINT_SCREEN = 283, \/\/ Key: Print screen$/;" e enum:__anon77d6622f0403 +KEY_Q vendor/raylib-5.5_linux_amd64/include/raylib.h /^ KEY_Q = 81, \/\/ Key: Q | q$/;" e enum:__anon77d6622f0403 +KEY_R vendor/raylib-5.5_linux_amd64/include/raylib.h /^ KEY_R = 82, \/\/ Key: R | r$/;" e enum:__anon77d6622f0403 +KEY_RIGHT vendor/raylib-5.5_linux_amd64/include/raylib.h /^ KEY_RIGHT = 262, \/\/ Key: Cursor right$/;" e enum:__anon77d6622f0403 +KEY_RIGHT_ALT vendor/raylib-5.5_linux_amd64/include/raylib.h /^ KEY_RIGHT_ALT = 346, \/\/ Key: Alt right$/;" e enum:__anon77d6622f0403 +KEY_RIGHT_BRACKET vendor/raylib-5.5_linux_amd64/include/raylib.h /^ KEY_RIGHT_BRACKET = 93, \/\/ Key: ]$/;" e enum:__anon77d6622f0403 +KEY_RIGHT_CONTROL vendor/raylib-5.5_linux_amd64/include/raylib.h /^ KEY_RIGHT_CONTROL = 345, \/\/ Key: Control right$/;" e enum:__anon77d6622f0403 +KEY_RIGHT_SHIFT vendor/raylib-5.5_linux_amd64/include/raylib.h /^ KEY_RIGHT_SHIFT = 344, \/\/ Key: Shift right$/;" e enum:__anon77d6622f0403 +KEY_RIGHT_SUPER vendor/raylib-5.5_linux_amd64/include/raylib.h /^ KEY_RIGHT_SUPER = 347, \/\/ Key: Super right$/;" e enum:__anon77d6622f0403 +KEY_S vendor/raylib-5.5_linux_amd64/include/raylib.h /^ KEY_S = 83, \/\/ Key: S | s$/;" e enum:__anon77d6622f0403 +KEY_SCROLL_LOCK vendor/raylib-5.5_linux_amd64/include/raylib.h /^ KEY_SCROLL_LOCK = 281, \/\/ Key: Scroll down$/;" e enum:__anon77d6622f0403 +KEY_SEMICOLON vendor/raylib-5.5_linux_amd64/include/raylib.h /^ KEY_SEMICOLON = 59, \/\/ Key: ;$/;" e enum:__anon77d6622f0403 +KEY_SEVEN vendor/raylib-5.5_linux_amd64/include/raylib.h /^ KEY_SEVEN = 55, \/\/ Key: 7$/;" e enum:__anon77d6622f0403 +KEY_SIX vendor/raylib-5.5_linux_amd64/include/raylib.h /^ KEY_SIX = 54, \/\/ Key: 6$/;" e enum:__anon77d6622f0403 +KEY_SLASH vendor/raylib-5.5_linux_amd64/include/raylib.h /^ KEY_SLASH = 47, \/\/ Key: \/$/;" e enum:__anon77d6622f0403 +KEY_SPACE vendor/raylib-5.5_linux_amd64/include/raylib.h /^ KEY_SPACE = 32, \/\/ Key: Space$/;" e enum:__anon77d6622f0403 +KEY_T vendor/raylib-5.5_linux_amd64/include/raylib.h /^ KEY_T = 84, \/\/ Key: T | t$/;" e enum:__anon77d6622f0403 +KEY_TAB vendor/raylib-5.5_linux_amd64/include/raylib.h /^ KEY_TAB = 258, \/\/ Key: Tab$/;" e enum:__anon77d6622f0403 +KEY_THREE vendor/raylib-5.5_linux_amd64/include/raylib.h /^ KEY_THREE = 51, \/\/ Key: 3$/;" e enum:__anon77d6622f0403 +KEY_TWO vendor/raylib-5.5_linux_amd64/include/raylib.h /^ KEY_TWO = 50, \/\/ Key: 2$/;" e enum:__anon77d6622f0403 +KEY_U vendor/raylib-5.5_linux_amd64/include/raylib.h /^ KEY_U = 85, \/\/ Key: U | u$/;" e enum:__anon77d6622f0403 +KEY_UP vendor/raylib-5.5_linux_amd64/include/raylib.h /^ KEY_UP = 265, \/\/ Key: Cursor up$/;" e enum:__anon77d6622f0403 +KEY_V vendor/raylib-5.5_linux_amd64/include/raylib.h /^ KEY_V = 86, \/\/ Key: V | v$/;" e enum:__anon77d6622f0403 +KEY_VOLUME_DOWN vendor/raylib-5.5_linux_amd64/include/raylib.h /^ KEY_VOLUME_DOWN = 25 \/\/ Key: Android volume down button$/;" e enum:__anon77d6622f0403 +KEY_VOLUME_UP vendor/raylib-5.5_linux_amd64/include/raylib.h /^ KEY_VOLUME_UP = 24, \/\/ Key: Android volume up button$/;" e enum:__anon77d6622f0403 +KEY_W vendor/raylib-5.5_linux_amd64/include/raylib.h /^ KEY_W = 87, \/\/ Key: W | w$/;" e enum:__anon77d6622f0403 +KEY_X vendor/raylib-5.5_linux_amd64/include/raylib.h /^ KEY_X = 88, \/\/ Key: X | x$/;" e enum:__anon77d6622f0403 +KEY_Y vendor/raylib-5.5_linux_amd64/include/raylib.h /^ KEY_Y = 89, \/\/ Key: Y | y$/;" e enum:__anon77d6622f0403 +KEY_Z vendor/raylib-5.5_linux_amd64/include/raylib.h /^ KEY_Z = 90, \/\/ Key: Z | z$/;" e enum:__anon77d6622f0403 +KEY_ZERO vendor/raylib-5.5_linux_amd64/include/raylib.h /^ KEY_ZERO = 48, \/\/ Key: 0$/;" e enum:__anon77d6622f0403 +KGC_GEN vendor/lua-5.4.8/src/lstate.h /^#define KGC_GEN /;" d +KGC_INC vendor/lua-5.4.8/src/lstate.h /^#define KGC_INC /;" d +KOption vendor/lua-5.4.8/src/lstrlib.c /^typedef enum KOption {$/;" g file: +KOption vendor/lua-5.4.8/src/lstrlib.c /^} KOption;$/;" t typeref:enum:KOption file: +Kchar vendor/lua-5.4.8/src/lstrlib.c /^ Kchar, \/* fixed-length strings *\/$/;" e enum:KOption file: +Kdouble vendor/lua-5.4.8/src/lstrlib.c /^ Kdouble, \/* double-precision floating-point numbers *\/$/;" e enum:KOption file: +KeyboardKey vendor/raylib-5.5_linux_amd64/include/raylib.h /^} KeyboardKey;$/;" t typeref:enum:__anon77d6622f0403 +Kfloat vendor/lua-5.4.8/src/lstrlib.c /^ Kfloat, \/* single-precision floating-point numbers *\/$/;" e enum:KOption file: +Kint vendor/lua-5.4.8/src/lstrlib.c /^ Kint, \/* signed integers *\/$/;" e enum:KOption file: +Knop vendor/lua-5.4.8/src/lstrlib.c /^ Knop \/* no-op (configuration or spaces) *\/$/;" e enum:KOption file: +Knumber vendor/lua-5.4.8/src/lstrlib.c /^ Knumber, \/* Lua "native" floating-point numbers *\/$/;" e enum:KOption file: +Kpaddalign vendor/lua-5.4.8/src/lstrlib.c /^ Kpaddalign, \/* padding for alignment *\/$/;" e enum:KOption file: +Kpadding vendor/lua-5.4.8/src/lstrlib.c /^ Kpadding, \/* padding *\/$/;" e enum:KOption file: +Kstring vendor/lua-5.4.8/src/lstrlib.c /^ Kstring, \/* strings with prefixed length *\/$/;" e enum:KOption file: +Kuint vendor/lua-5.4.8/src/lstrlib.c /^ Kuint, \/* unsigned integers *\/$/;" e enum:KOption file: +Kzstr vendor/lua-5.4.8/src/lstrlib.c /^ Kzstr, \/* zero-terminated strings *\/$/;" e enum:KOption file: +L vendor/lua-5.4.8/src/lauxlib.h /^ lua_State *L;$/;" m struct:luaL_Buffer typeref:typename:lua_State * +L vendor/lua-5.4.8/src/ldump.c /^ lua_State *L;$/;" m struct:__anon6dcdaf670108 typeref:typename:lua_State * file: +L vendor/lua-5.4.8/src/llex.h /^ struct lua_State *L;$/;" m struct:LexState typeref:struct:lua_State * +L vendor/lua-5.4.8/src/lobject.c /^ lua_State *L;$/;" m struct:BuffFS typeref:typename:lua_State * file: +L vendor/lua-5.4.8/src/lstrlib.c /^ lua_State *L;$/;" m struct:Header typeref:typename:lua_State * file: +L vendor/lua-5.4.8/src/lstrlib.c /^ lua_State *L;$/;" m struct:MatchState typeref:typename:lua_State * file: +L vendor/lua-5.4.8/src/lundump.c /^ lua_State *L;$/;" m struct:__anon98fd752a0108 typeref:typename:lua_State * file: +L vendor/lua-5.4.8/src/lzio.h /^ lua_State *L; \/* Lua state (for reader) *\/$/;" m struct:Zio typeref:typename:lua_State * +LClosure vendor/lua-5.4.8/src/lobject.h /^typedef struct LClosure {$/;" s +LClosure vendor/lua-5.4.8/src/lobject.h /^} LClosure;$/;" t typeref:struct:LClosure +LDFLAGS Makefile /^LDFLAGS := -L.\/vendor\/$(RAYLIB)\/lib -lraylib -L.\/vendor\/$(LUA)\/src -llua -lm$/;" m +LDFLAGS vendor/lua-5.4.8/src/Makefile /^LDFLAGS= $(SYSLDFLAGS) $(MYLDFLAGS)$/;" m +LEVELS1 vendor/lua-5.4.8/src/lauxlib.c /^#define LEVELS1 /;" d file: +LEVELS2 vendor/lua-5.4.8/src/lauxlib.c /^#define LEVELS2 /;" d file: +LEfloatint vendor/lua-5.4.8/src/lvm.c /^l_sinline int LEfloatint (lua_Number f, lua_Integer i) {$/;" f typeref:typename:l_sinline int +LEintfloat vendor/lua-5.4.8/src/lvm.c /^l_sinline int LEintfloat (lua_Integer i, lua_Number f) {$/;" f typeref:typename:l_sinline int +LEnum vendor/lua-5.4.8/src/lvm.c /^l_sinline int LEnum (const TValue *l, const TValue *r) {$/;" f typeref:typename:l_sinline int +LFIELDS_PER_FLUSH vendor/lua-5.4.8/src/lopcodes.h /^#define LFIELDS_PER_FLUSH /;" d +LG vendor/lua-5.4.8/src/lstate.c /^typedef struct LG {$/;" s file: +LG vendor/lua-5.4.8/src/lstate.c /^} LG;$/;" t typeref:struct:LG file: +LHS_assign vendor/lua-5.4.8/src/lparser.c /^struct LHS_assign {$/;" s file: +LIBS vendor/lua-5.4.8/src/Makefile /^LIBS= -lm $(SYSLIBS) $(MYLIBS)$/;" m +LIB_FAIL vendor/lua-5.4.8/src/loadlib.c /^#define LIB_FAIL /;" d file: +LIB_O vendor/lua-5.4.8/src/Makefile /^LIB_O= lauxlib.o lbaselib.o lcorolib.o ldblib.o liolib.o lmathlib.o loadlib.o loslib.o lstrlib.o/;" m +LIGHTGRAY vendor/raylib-5.5_linux_amd64/include/raylib.h /^#define LIGHTGRAY /;" d +LIME vendor/raylib-5.5_linux_amd64/include/raylib.h /^#define LIME /;" d +LIMLINEDIFF vendor/lua-5.4.8/src/lcode.c /^#define LIMLINEDIFF /;" d file: +LL vendor/lua-5.4.8/src/llimits.h /^#define LL(/;" d +LOG_ALL vendor/raylib-5.5_linux_amd64/include/raylib.h /^ LOG_ALL = 0, \/\/ Display all logs$/;" e enum:__anon77d6622f0303 +LOG_DEBUG vendor/raylib-5.5_linux_amd64/include/raylib.h /^ LOG_DEBUG, \/\/ Debug logging, used for internal debugging, it should be disabled o/;" e enum:__anon77d6622f0303 +LOG_ERROR vendor/raylib-5.5_linux_amd64/include/raylib.h /^ LOG_ERROR, \/\/ Error logging, used on unrecoverable failures$/;" e enum:__anon77d6622f0303 +LOG_FATAL vendor/raylib-5.5_linux_amd64/include/raylib.h /^ LOG_FATAL, \/\/ Fatal logging, used to abort program: exit(EXIT_FAILURE)$/;" e enum:__anon77d6622f0303 +LOG_INFO vendor/raylib-5.5_linux_amd64/include/raylib.h /^ LOG_INFO, \/\/ Info logging, used for program execution info$/;" e enum:__anon77d6622f0303 +LOG_NONE vendor/raylib-5.5_linux_amd64/include/raylib.h /^ LOG_NONE \/\/ Disable logging$/;" e enum:__anon77d6622f0303 +LOG_TRACE vendor/raylib-5.5_linux_amd64/include/raylib.h /^ LOG_TRACE, \/\/ Trace logging, intended for internal use only$/;" e enum:__anon77d6622f0303 +LOG_WARNING vendor/raylib-5.5_linux_amd64/include/raylib.h /^ LOG_WARNING, \/\/ Warning logging, used on recoverable failures$/;" e enum:__anon77d6622f0303 +LStream vendor/lua-5.4.8/src/liolib.c /^typedef luaL_Stream LStream;$/;" t typeref:typename:luaL_Stream file: +LTfloatint vendor/lua-5.4.8/src/lvm.c /^l_sinline int LTfloatint (lua_Number f, lua_Integer i) {$/;" f typeref:typename:l_sinline int +LTintfloat vendor/lua-5.4.8/src/lvm.c /^l_sinline int LTintfloat (lua_Integer i, lua_Number f) {$/;" f typeref:typename:l_sinline int +LTnum vendor/lua-5.4.8/src/lvm.c /^l_sinline int LTnum (const TValue *l, const TValue *r) {$/;" f typeref:typename:l_sinline int +LUA Makefile /^LUA := lua-5.4.8$/;" m +LUAC_DATA vendor/lua-5.4.8/src/lundump.h /^#define LUAC_DATA /;" d +LUAC_FORMAT vendor/lua-5.4.8/src/lundump.h /^#define LUAC_FORMAT /;" d +LUAC_INT vendor/lua-5.4.8/src/lundump.h /^#define LUAC_INT /;" d +LUAC_NUM vendor/lua-5.4.8/src/lundump.h /^#define LUAC_NUM /;" d +LUAC_O vendor/lua-5.4.8/src/Makefile /^LUAC_O= luac.o$/;" m +LUAC_T vendor/lua-5.4.8/src/Makefile /^LUAC_T= luac$/;" m +LUAC_VERSION vendor/lua-5.4.8/src/lundump.h /^#define LUAC_VERSION /;" d +LUAI_DDEC vendor/lua-5.4.8/src/ltm.h /^LUAI_DDEC(const char *const luaT_typenames_[LUA_TOTALTYPES];)$/;" p +LUAI_DDEC vendor/lua-5.4.8/src/luaconf.h /^#define LUAI_DDEC(/;" d +LUAI_DDEF vendor/lua-5.4.8/src/luaconf.h /^#define LUAI_DDEF /;" d +LUAI_FUNC vendor/lua-5.4.8/src/luaconf.h /^#define LUAI_FUNC /;" d +LUAI_GCMUL vendor/lua-5.4.8/src/lgc.h /^#define LUAI_GCMUL /;" d +LUAI_GCPAUSE vendor/lua-5.4.8/src/lgc.h /^#define LUAI_GCPAUSE /;" d +LUAI_GCSTEPSIZE vendor/lua-5.4.8/src/lgc.h /^#define LUAI_GCSTEPSIZE /;" d +LUAI_GENMAJORMUL vendor/lua-5.4.8/src/lgc.h /^#define LUAI_GENMAJORMUL /;" d +LUAI_GENMINORMUL vendor/lua-5.4.8/src/lgc.h /^#define LUAI_GENMINORMUL /;" d +LUAI_IS32INT vendor/lua-5.4.8/src/luaconf.h /^#define LUAI_IS32INT /;" d +LUAI_MAXALIGN vendor/lua-5.4.8/src/luaconf.h /^#define LUAI_MAXALIGN /;" d +LUAI_MAXCCALLS vendor/lua-5.4.8/src/llimits.h /^#define LUAI_MAXCCALLS /;" d +LUAI_MAXSHORTLEN vendor/lua-5.4.8/src/llimits.h /^#define LUAI_MAXSHORTLEN /;" d +LUAI_MAXSTACK vendor/lua-5.4.8/src/luaconf.h /^#define LUAI_MAXSTACK /;" d +LUAI_THROW vendor/lua-5.4.8/src/ldo.c /^#define LUAI_THROW(/;" d file: +LUAI_TRY vendor/lua-5.4.8/src/ldo.c /^#define LUAI_TRY(/;" d file: +LUAI_UACINT vendor/lua-5.4.8/src/luaconf.h /^#define LUAI_UACINT /;" d +LUAI_UACNUMBER vendor/lua-5.4.8/src/luaconf.h /^#define LUAI_UACNUMBER /;" d +LUALIB_API vendor/lua-5.4.8/src/luaconf.h /^#define LUALIB_API /;" d +LUAL_BUFFERSIZE vendor/lua-5.4.8/src/luaconf.h /^#define LUAL_BUFFERSIZE /;" d +LUAL_NUMSIZES vendor/lua-5.4.8/src/lauxlib.h /^#define LUAL_NUMSIZES /;" d +LUAL_PACKPADBYTE vendor/lua-5.4.8/src/lstrlib.c /^#define LUAL_PACKPADBYTE /;" d file: +LUAMOD_API vendor/lua-5.4.8/src/luaconf.h /^#define LUAMOD_API /;" d +LUA_32BITS vendor/lua-5.4.8/src/luaconf.h /^#define LUA_32BITS /;" d +LUA_A vendor/lua-5.4.8/src/Makefile /^LUA_A= liblua.a$/;" m +LUA_API vendor/lua-5.4.8/src/luaconf.h /^#define LUA_API /;" d +LUA_API vendor/lua-5.4.8/src/luaconf.h /^#define LUA_API /;" d +LUA_AUTHORS vendor/lua-5.4.8/src/lua.h /^#define LUA_AUTHORS /;" d +LUA_C89_NUMBERS vendor/lua-5.4.8/src/luaconf.h /^#define LUA_C89_NUMBERS /;" d +LUA_CDIR vendor/lua-5.4.8/src/luaconf.h /^#define LUA_CDIR /;" d +LUA_COLIBNAME vendor/lua-5.4.8/src/lualib.h /^#define LUA_COLIBNAME /;" d +LUA_COMPAT_APIINTCASTS vendor/lua-5.4.8/src/luaconf.h /^#define LUA_COMPAT_APIINTCASTS$/;" d +LUA_COMPAT_LT_LE vendor/lua-5.4.8/src/luaconf.h /^#define LUA_COMPAT_LT_LE$/;" d +LUA_COMPAT_MATHLIB vendor/lua-5.4.8/src/luaconf.h /^#define LUA_COMPAT_MATHLIB$/;" d +LUA_COPYRIGHT vendor/lua-5.4.8/src/lua.h /^#define LUA_COPYRIGHT /;" d +LUA_CORE vendor/lua-5.4.8/src/lapi.c /^#define LUA_CORE$/;" d file: +LUA_CORE vendor/lua-5.4.8/src/lcode.c /^#define LUA_CORE$/;" d file: +LUA_CORE vendor/lua-5.4.8/src/lctype.c /^#define LUA_CORE$/;" d file: +LUA_CORE vendor/lua-5.4.8/src/ldebug.c /^#define LUA_CORE$/;" d file: +LUA_CORE vendor/lua-5.4.8/src/ldo.c /^#define LUA_CORE$/;" d file: +LUA_CORE vendor/lua-5.4.8/src/ldump.c /^#define LUA_CORE$/;" d file: +LUA_CORE vendor/lua-5.4.8/src/lfunc.c /^#define LUA_CORE$/;" d file: +LUA_CORE vendor/lua-5.4.8/src/lgc.c /^#define LUA_CORE$/;" d file: +LUA_CORE vendor/lua-5.4.8/src/llex.c /^#define LUA_CORE$/;" d file: +LUA_CORE vendor/lua-5.4.8/src/lmem.c /^#define LUA_CORE$/;" d file: +LUA_CORE vendor/lua-5.4.8/src/lobject.c /^#define LUA_CORE$/;" d file: +LUA_CORE vendor/lua-5.4.8/src/lopcodes.c /^#define LUA_CORE$/;" d file: +LUA_CORE vendor/lua-5.4.8/src/lparser.c /^#define LUA_CORE$/;" d file: +LUA_CORE vendor/lua-5.4.8/src/lstate.c /^#define LUA_CORE$/;" d file: +LUA_CORE vendor/lua-5.4.8/src/lstring.c /^#define LUA_CORE$/;" d file: +LUA_CORE vendor/lua-5.4.8/src/ltable.c /^#define LUA_CORE$/;" d file: +LUA_CORE vendor/lua-5.4.8/src/ltm.c /^#define LUA_CORE$/;" d file: +LUA_CORE vendor/lua-5.4.8/src/luac.c /^#define LUA_CORE$/;" d file: +LUA_CORE vendor/lua-5.4.8/src/lundump.c /^#define LUA_CORE$/;" d file: +LUA_CORE vendor/lua-5.4.8/src/lvm.c /^#define LUA_CORE$/;" d file: +LUA_CORE vendor/lua-5.4.8/src/lzio.c /^#define LUA_CORE$/;" d file: +LUA_CPATH_DEFAULT vendor/lua-5.4.8/src/luaconf.h /^#define LUA_CPATH_DEFAULT /;" d +LUA_CPATH_VAR vendor/lua-5.4.8/src/loadlib.c /^#define LUA_CPATH_VAR /;" d file: +LUA_CSUBSEP vendor/lua-5.4.8/src/loadlib.c /^#define LUA_CSUBSEP /;" d file: +LUA_DBLIBNAME vendor/lua-5.4.8/src/lualib.h /^#define LUA_DBLIBNAME /;" d +LUA_DIRSEP vendor/lua-5.4.8/src/luaconf.h /^#define LUA_DIRSEP /;" d +LUA_DL_DLL vendor/lua-5.4.8/src/luaconf.h /^#define LUA_DL_DLL /;" d +LUA_ENV vendor/lua-5.4.8/src/llex.h /^#define LUA_ENV /;" d +LUA_ERRERR vendor/lua-5.4.8/src/lua.h /^#define LUA_ERRERR /;" d +LUA_ERRFILE vendor/lua-5.4.8/src/lauxlib.h /^#define LUA_ERRFILE /;" d +LUA_ERRMEM vendor/lua-5.4.8/src/lua.h /^#define LUA_ERRMEM /;" d +LUA_ERRRUN vendor/lua-5.4.8/src/lua.h /^#define LUA_ERRRUN /;" d +LUA_ERRSYNTAX vendor/lua-5.4.8/src/lua.h /^#define LUA_ERRSYNTAX /;" d +LUA_EXEC_DIR vendor/lua-5.4.8/src/luaconf.h /^#define LUA_EXEC_DIR /;" d +LUA_EXTRASPACE vendor/lua-5.4.8/src/luaconf.h /^#define LUA_EXTRASPACE /;" d +LUA_FILEHANDLE vendor/lua-5.4.8/src/lauxlib.h /^#define LUA_FILEHANDLE /;" d +LUA_FLOAT_DEFAULT vendor/lua-5.4.8/src/luaconf.h /^#define LUA_FLOAT_DEFAULT /;" d +LUA_FLOAT_DOUBLE vendor/lua-5.4.8/src/luaconf.h /^#define LUA_FLOAT_DOUBLE /;" d +LUA_FLOAT_FLOAT vendor/lua-5.4.8/src/luaconf.h /^#define LUA_FLOAT_FLOAT /;" d +LUA_FLOAT_LONGDOUBLE vendor/lua-5.4.8/src/luaconf.h /^#define LUA_FLOAT_LONGDOUBLE /;" d +LUA_FLOAT_TYPE vendor/lua-5.4.8/src/luaconf.h /^#define LUA_FLOAT_TYPE /;" d +LUA_FLOORN2I vendor/lua-5.4.8/src/lvm.h /^#define LUA_FLOORN2I /;" d +LUA_GCCOLLECT vendor/lua-5.4.8/src/lua.h /^#define LUA_GCCOLLECT /;" d +LUA_GCCOUNT vendor/lua-5.4.8/src/lua.h /^#define LUA_GCCOUNT /;" d +LUA_GCCOUNTB vendor/lua-5.4.8/src/lua.h /^#define LUA_GCCOUNTB /;" d +LUA_GCGEN vendor/lua-5.4.8/src/lua.h /^#define LUA_GCGEN /;" d +LUA_GCINC vendor/lua-5.4.8/src/lua.h /^#define LUA_GCINC /;" d +LUA_GCISRUNNING vendor/lua-5.4.8/src/lua.h /^#define LUA_GCISRUNNING /;" d +LUA_GCRESTART vendor/lua-5.4.8/src/lua.h /^#define LUA_GCRESTART /;" d +LUA_GCSETPAUSE vendor/lua-5.4.8/src/lua.h /^#define LUA_GCSETPAUSE /;" d +LUA_GCSETSTEPMUL vendor/lua-5.4.8/src/lua.h /^#define LUA_GCSETSTEPMUL /;" d +LUA_GCSTEP vendor/lua-5.4.8/src/lua.h /^#define LUA_GCSTEP /;" d +LUA_GCSTOP vendor/lua-5.4.8/src/lua.h /^#define LUA_GCSTOP /;" d +LUA_GNAME vendor/lua-5.4.8/src/lauxlib.h /^#define LUA_GNAME /;" d +LUA_HOOKCALL vendor/lua-5.4.8/src/lua.h /^#define LUA_HOOKCALL /;" d +LUA_HOOKCOUNT vendor/lua-5.4.8/src/lua.h /^#define LUA_HOOKCOUNT /;" d +LUA_HOOKLINE vendor/lua-5.4.8/src/lua.h /^#define LUA_HOOKLINE /;" d +LUA_HOOKRET vendor/lua-5.4.8/src/lua.h /^#define LUA_HOOKRET /;" d +LUA_HOOKTAILCALL vendor/lua-5.4.8/src/lua.h /^#define LUA_HOOKTAILCALL /;" d +LUA_IDSIZE vendor/lua-5.4.8/src/luaconf.h /^#define LUA_IDSIZE /;" d +LUA_IGMARK vendor/lua-5.4.8/src/luaconf.h /^#define LUA_IGMARK /;" d +LUA_INITVARVERSION vendor/lua-5.4.8/src/lua.c /^#define LUA_INITVARVERSION /;" d file: +LUA_INIT_VAR vendor/lua-5.4.8/src/lua.c /^#define LUA_INIT_VAR /;" d file: +LUA_INTEGER vendor/lua-5.4.8/src/luaconf.h /^#define LUA_INTEGER /;" d +LUA_INTEGER_FMT vendor/lua-5.4.8/src/luaconf.h /^#define LUA_INTEGER_FMT /;" d +LUA_INTEGER_FRMLEN vendor/lua-5.4.8/src/luaconf.h /^#define LUA_INTEGER_FRMLEN /;" d +LUA_INT_DEFAULT vendor/lua-5.4.8/src/luaconf.h /^#define LUA_INT_DEFAULT /;" d +LUA_INT_INT vendor/lua-5.4.8/src/luaconf.h /^#define LUA_INT_INT /;" d +LUA_INT_LONG vendor/lua-5.4.8/src/luaconf.h /^#define LUA_INT_LONG /;" d +LUA_INT_LONGLONG vendor/lua-5.4.8/src/luaconf.h /^#define LUA_INT_LONGLONG /;" d +LUA_INT_TYPE vendor/lua-5.4.8/src/luaconf.h /^#define LUA_INT_TYPE /;" d +LUA_IOLIBNAME vendor/lua-5.4.8/src/lualib.h /^#define LUA_IOLIBNAME /;" d +LUA_KCONTEXT vendor/lua-5.4.8/src/luaconf.h /^#define LUA_KCONTEXT /;" d +LUA_LDIR vendor/lua-5.4.8/src/luaconf.h /^#define LUA_LDIR /;" d +LUA_LIB vendor/lua-5.4.8/src/lauxlib.c /^#define LUA_LIB$/;" d file: +LUA_LIB vendor/lua-5.4.8/src/lbaselib.c /^#define LUA_LIB$/;" d file: +LUA_LIB vendor/lua-5.4.8/src/lcorolib.c /^#define LUA_LIB$/;" d file: +LUA_LIB vendor/lua-5.4.8/src/ldblib.c /^#define LUA_LIB$/;" d file: +LUA_LIB vendor/lua-5.4.8/src/linit.c /^#define LUA_LIB$/;" d file: +LUA_LIB vendor/lua-5.4.8/src/liolib.c /^#define LUA_LIB$/;" d file: +LUA_LIB vendor/lua-5.4.8/src/lmathlib.c /^#define LUA_LIB$/;" d file: +LUA_LIB vendor/lua-5.4.8/src/loadlib.c /^#define LUA_LIB$/;" d file: +LUA_LIB vendor/lua-5.4.8/src/loslib.c /^#define LUA_LIB$/;" d file: +LUA_LIB vendor/lua-5.4.8/src/lstrlib.c /^#define LUA_LIB$/;" d file: +LUA_LIB vendor/lua-5.4.8/src/ltablib.c /^#define LUA_LIB$/;" d file: +LUA_LIB vendor/lua-5.4.8/src/lutf8lib.c /^#define LUA_LIB$/;" d file: +LUA_LLE_FLAGS vendor/lua-5.4.8/src/loadlib.c /^#define LUA_LLE_FLAGS /;" d file: +LUA_LOADED_TABLE vendor/lua-5.4.8/src/lauxlib.h /^#define LUA_LOADED_TABLE /;" d +LUA_LOADLIBNAME vendor/lua-5.4.8/src/lualib.h /^#define LUA_LOADLIBNAME /;" d +LUA_LSUBSEP vendor/lua-5.4.8/src/loadlib.c /^#define LUA_LSUBSEP /;" d file: +LUA_MASKCALL vendor/lua-5.4.8/src/lua.h /^#define LUA_MASKCALL /;" d +LUA_MASKCOUNT vendor/lua-5.4.8/src/lua.h /^#define LUA_MASKCOUNT /;" d +LUA_MASKLINE vendor/lua-5.4.8/src/lua.h /^#define LUA_MASKLINE /;" d +LUA_MASKRET vendor/lua-5.4.8/src/lua.h /^#define LUA_MASKRET /;" d +LUA_MATHLIBNAME vendor/lua-5.4.8/src/lualib.h /^#define LUA_MATHLIBNAME /;" d +LUA_MAXCAPTURES vendor/lua-5.4.8/src/lstrlib.c /^#define LUA_MAXCAPTURES /;" d file: +LUA_MAXINPUT vendor/lua-5.4.8/src/lua.c /^#define LUA_MAXINPUT /;" d file: +LUA_MAXINTEGER vendor/lua-5.4.8/src/luaconf.h /^#define LUA_MAXINTEGER /;" d +LUA_MAXUNSIGNED vendor/lua-5.4.8/src/luaconf.h /^#define LUA_MAXUNSIGNED /;" d +LUA_MINBUFFER vendor/lua-5.4.8/src/llimits.h /^#define LUA_MINBUFFER /;" d +LUA_MININTEGER vendor/lua-5.4.8/src/luaconf.h /^#define LUA_MININTEGER /;" d +LUA_MINSTACK vendor/lua-5.4.8/src/lua.h /^#define LUA_MINSTACK /;" d +LUA_MULTRET vendor/lua-5.4.8/src/lua.h /^#define LUA_MULTRET /;" d +LUA_NOREF vendor/lua-5.4.8/src/lauxlib.h /^#define LUA_NOREF /;" d +LUA_NUMBER vendor/lua-5.4.8/src/luaconf.h /^#define LUA_NUMBER /;" d +LUA_NUMBER_FMT vendor/lua-5.4.8/src/luaconf.h /^#define LUA_NUMBER_FMT /;" d +LUA_NUMBER_FRMLEN vendor/lua-5.4.8/src/luaconf.h /^#define LUA_NUMBER_FRMLEN /;" d +LUA_NUMTAGS vendor/lua-5.4.8/src/lua.h /^#define LUA_NUMTAGS /;" d +LUA_NUMTYPES vendor/lua-5.4.8/src/lua.h /^#define LUA_NUMTYPES /;" d +LUA_O vendor/lua-5.4.8/src/Makefile /^LUA_O= lua.o$/;" m +LUA_OFSEP vendor/lua-5.4.8/src/loadlib.c /^#define LUA_OFSEP /;" d file: +LUA_OK vendor/lua-5.4.8/src/lua.h /^#define LUA_OK /;" d +LUA_OPADD vendor/lua-5.4.8/src/lua.h /^#define LUA_OPADD /;" d +LUA_OPBAND vendor/lua-5.4.8/src/lua.h /^#define LUA_OPBAND /;" d +LUA_OPBNOT vendor/lua-5.4.8/src/lua.h /^#define LUA_OPBNOT /;" d +LUA_OPBOR vendor/lua-5.4.8/src/lua.h /^#define LUA_OPBOR /;" d +LUA_OPBXOR vendor/lua-5.4.8/src/lua.h /^#define LUA_OPBXOR /;" d +LUA_OPDIV vendor/lua-5.4.8/src/lua.h /^#define LUA_OPDIV /;" d +LUA_OPEQ vendor/lua-5.4.8/src/lua.h /^#define LUA_OPEQ /;" d +LUA_OPIDIV vendor/lua-5.4.8/src/lua.h /^#define LUA_OPIDIV /;" d +LUA_OPLE vendor/lua-5.4.8/src/lua.h /^#define LUA_OPLE /;" d +LUA_OPLT vendor/lua-5.4.8/src/lua.h /^#define LUA_OPLT /;" d +LUA_OPMOD vendor/lua-5.4.8/src/lua.h /^#define LUA_OPMOD /;" d +LUA_OPMUL vendor/lua-5.4.8/src/lua.h /^#define LUA_OPMUL /;" d +LUA_OPPOW vendor/lua-5.4.8/src/lua.h /^#define LUA_OPPOW /;" d +LUA_OPSHL vendor/lua-5.4.8/src/lua.h /^#define LUA_OPSHL /;" d +LUA_OPSHR vendor/lua-5.4.8/src/lua.h /^#define LUA_OPSHR /;" d +LUA_OPSUB vendor/lua-5.4.8/src/lua.h /^#define LUA_OPSUB /;" d +LUA_OPUNM vendor/lua-5.4.8/src/lua.h /^#define LUA_OPUNM /;" d +LUA_OSLIBNAME vendor/lua-5.4.8/src/lualib.h /^#define LUA_OSLIBNAME /;" d +LUA_PATH_DEFAULT vendor/lua-5.4.8/src/luaconf.h /^#define LUA_PATH_DEFAULT /;" d +LUA_PATH_MARK vendor/lua-5.4.8/src/luaconf.h /^#define LUA_PATH_MARK /;" d +LUA_PATH_SEP vendor/lua-5.4.8/src/luaconf.h /^#define LUA_PATH_SEP /;" d +LUA_PATH_VAR vendor/lua-5.4.8/src/loadlib.c /^#define LUA_PATH_VAR /;" d file: +LUA_POF vendor/lua-5.4.8/src/loadlib.c /^#define LUA_POF /;" d file: +LUA_PRELOAD_TABLE vendor/lua-5.4.8/src/lauxlib.h /^#define LUA_PRELOAD_TABLE /;" d +LUA_PROGNAME vendor/lua-5.4.8/src/lua.c /^#define LUA_PROGNAME /;" d file: +LUA_PROMPT vendor/lua-5.4.8/src/lua.c /^#define LUA_PROMPT /;" d file: +LUA_PROMPT2 vendor/lua-5.4.8/src/lua.c /^#define LUA_PROMPT2 /;" d file: +LUA_REFNIL vendor/lua-5.4.8/src/lauxlib.h /^#define LUA_REFNIL /;" d +LUA_REGISTRYINDEX vendor/lua-5.4.8/src/lua.h /^#define LUA_REGISTRYINDEX /;" d +LUA_RELEASE vendor/lua-5.4.8/src/lua.h /^#define LUA_RELEASE /;" d +LUA_RIDX_GLOBALS vendor/lua-5.4.8/src/lua.h /^#define LUA_RIDX_GLOBALS /;" d +LUA_RIDX_LAST vendor/lua-5.4.8/src/lua.h /^#define LUA_RIDX_LAST /;" d +LUA_RIDX_MAINTHREAD vendor/lua-5.4.8/src/lua.h /^#define LUA_RIDX_MAINTHREAD /;" d +LUA_ROOT vendor/lua-5.4.8/src/luaconf.h /^#define LUA_ROOT /;" d +LUA_SHRDIR vendor/lua-5.4.8/src/luaconf.h /^#define LUA_SHRDIR /;" d +LUA_SIGNATURE vendor/lua-5.4.8/src/lua.h /^#define LUA_SIGNATURE /;" d +LUA_STRFTIMEOPTIONS vendor/lua-5.4.8/src/loslib.c /^#define LUA_STRFTIMEOPTIONS /;" d file: +LUA_STRLIBNAME vendor/lua-5.4.8/src/lualib.h /^#define LUA_STRLIBNAME /;" d +LUA_T vendor/lua-5.4.8/src/Makefile /^LUA_T= lua$/;" m +LUA_TABLIBNAME vendor/lua-5.4.8/src/lualib.h /^#define LUA_TABLIBNAME /;" d +LUA_TBOOLEAN vendor/lua-5.4.8/src/lua.h /^#define LUA_TBOOLEAN /;" d +LUA_TDEADKEY vendor/lua-5.4.8/src/lobject.h /^#define LUA_TDEADKEY /;" d +LUA_TFUNCTION vendor/lua-5.4.8/src/lua.h /^#define LUA_TFUNCTION /;" d +LUA_TLIGHTUSERDATA vendor/lua-5.4.8/src/lua.h /^#define LUA_TLIGHTUSERDATA /;" d +LUA_TMPNAMBUFSIZE vendor/lua-5.4.8/src/loslib.c /^#define LUA_TMPNAMBUFSIZE /;" d file: +LUA_TMPNAMTEMPLATE vendor/lua-5.4.8/src/loslib.c /^#define LUA_TMPNAMTEMPLATE /;" d file: +LUA_TNIL vendor/lua-5.4.8/src/lua.h /^#define LUA_TNIL /;" d +LUA_TNONE vendor/lua-5.4.8/src/lua.h /^#define LUA_TNONE /;" d +LUA_TNUMBER vendor/lua-5.4.8/src/lua.h /^#define LUA_TNUMBER /;" d +LUA_TOTALTYPES vendor/lua-5.4.8/src/lobject.h /^#define LUA_TOTALTYPES /;" d +LUA_TPROTO vendor/lua-5.4.8/src/lobject.h /^#define LUA_TPROTO /;" d +LUA_TSTRING vendor/lua-5.4.8/src/lua.h /^#define LUA_TSTRING /;" d +LUA_TTABLE vendor/lua-5.4.8/src/lua.h /^#define LUA_TTABLE /;" d +LUA_TTHREAD vendor/lua-5.4.8/src/lua.h /^#define LUA_TTHREAD /;" d +LUA_TUPVAL vendor/lua-5.4.8/src/lobject.h /^#define LUA_TUPVAL /;" d +LUA_TUSERDATA vendor/lua-5.4.8/src/lua.h /^#define LUA_TUSERDATA /;" d +LUA_UNSIGNED vendor/lua-5.4.8/src/luaconf.h /^#define LUA_UNSIGNED /;" d +LUA_USE_C89 vendor/lua-5.4.8/src/luaconf.h /^#define LUA_USE_C89 /;" d +LUA_USE_CTYPE vendor/lua-5.4.8/src/lctype.h /^#define LUA_USE_CTYPE /;" d +LUA_USE_DLOPEN vendor/lua-5.4.8/src/luaconf.h /^#define LUA_USE_DLOPEN /;" d +LUA_USE_DLOPEN vendor/lua-5.4.8/src/luaconf.h /^#define LUA_USE_DLOPEN$/;" d +LUA_USE_JUMPTABLE vendor/lua-5.4.8/src/lvm.c /^#define LUA_USE_JUMPTABLE /;" d file: +LUA_USE_POSIX vendor/lua-5.4.8/src/luaconf.h /^#define LUA_USE_POSIX$/;" d +LUA_USE_WINDOWS vendor/lua-5.4.8/src/luaconf.h /^#define LUA_USE_WINDOWS /;" d +LUA_UTF8LIBNAME vendor/lua-5.4.8/src/lualib.h /^#define LUA_UTF8LIBNAME /;" d +LUA_VABSTKEY vendor/lua-5.4.8/src/lobject.h /^#define LUA_VABSTKEY /;" d +LUA_VCCL vendor/lua-5.4.8/src/lobject.h /^#define LUA_VCCL /;" d +LUA_VDIR vendor/lua-5.4.8/src/luaconf.h /^#define LUA_VDIR /;" d +LUA_VEMPTY vendor/lua-5.4.8/src/lobject.h /^#define LUA_VEMPTY /;" d +LUA_VERSION vendor/lua-5.4.8/src/lua.h /^#define LUA_VERSION /;" d +LUA_VERSION_MAJOR vendor/lua-5.4.8/src/lua.h /^#define LUA_VERSION_MAJOR /;" d +LUA_VERSION_MINOR vendor/lua-5.4.8/src/lua.h /^#define LUA_VERSION_MINOR /;" d +LUA_VERSION_NUM vendor/lua-5.4.8/src/lua.h /^#define LUA_VERSION_NUM /;" d +LUA_VERSION_RELEASE vendor/lua-5.4.8/src/lua.h /^#define LUA_VERSION_RELEASE /;" d +LUA_VERSION_RELEASE_NUM vendor/lua-5.4.8/src/lua.h /^#define LUA_VERSION_RELEASE_NUM /;" d +LUA_VERSUFFIX vendor/lua-5.4.8/src/lualib.h /^#define LUA_VERSUFFIX /;" d +LUA_VFALSE vendor/lua-5.4.8/src/lobject.h /^#define LUA_VFALSE /;" d +LUA_VLCF vendor/lua-5.4.8/src/lobject.h /^#define LUA_VLCF /;" d +LUA_VLCL vendor/lua-5.4.8/src/lobject.h /^#define LUA_VLCL /;" d +LUA_VLIGHTUSERDATA vendor/lua-5.4.8/src/lobject.h /^#define LUA_VLIGHTUSERDATA /;" d +LUA_VLNGSTR vendor/lua-5.4.8/src/lobject.h /^#define LUA_VLNGSTR /;" d +LUA_VNIL vendor/lua-5.4.8/src/lobject.h /^#define LUA_VNIL /;" d +LUA_VNUMFLT vendor/lua-5.4.8/src/lobject.h /^#define LUA_VNUMFLT /;" d +LUA_VNUMINT vendor/lua-5.4.8/src/lobject.h /^#define LUA_VNUMINT /;" d +LUA_VPROTO vendor/lua-5.4.8/src/lobject.h /^#define LUA_VPROTO /;" d +LUA_VSHRSTR vendor/lua-5.4.8/src/lobject.h /^#define LUA_VSHRSTR /;" d +LUA_VTABLE vendor/lua-5.4.8/src/lobject.h /^#define LUA_VTABLE /;" d +LUA_VTHREAD vendor/lua-5.4.8/src/lobject.h /^#define LUA_VTHREAD /;" d +LUA_VTRUE vendor/lua-5.4.8/src/lobject.h /^#define LUA_VTRUE /;" d +LUA_VUPVAL vendor/lua-5.4.8/src/lobject.h /^#define LUA_VUPVAL /;" d +LUA_VUSERDATA vendor/lua-5.4.8/src/lobject.h /^#define LUA_VUSERDATA /;" d +LUA_YIELD vendor/lua-5.4.8/src/lua.h /^#define LUA_YIELD /;" d +LX vendor/lua-5.4.8/src/lstate.c /^typedef struct LX {$/;" s file: +LX vendor/lua-5.4.8/src/lstate.c /^} LX;$/;" t typeref:struct:LX file: +L_ESC vendor/lua-5.4.8/src/lstrlib.c /^#define L_ESC /;" d file: +L_FMTFLAGSC vendor/lua-5.4.8/src/lstrlib.c /^#define L_FMTFLAGSC /;" d file: +L_FMTFLAGSF vendor/lua-5.4.8/src/lstrlib.c /^#define L_FMTFLAGSF /;" d file: +L_FMTFLAGSI vendor/lua-5.4.8/src/lstrlib.c /^#define L_FMTFLAGSI /;" d file: +L_FMTFLAGSU vendor/lua-5.4.8/src/lstrlib.c /^#define L_FMTFLAGSU /;" d file: +L_FMTFLAGSX vendor/lua-5.4.8/src/lstrlib.c /^#define L_FMTFLAGSX /;" d file: +L_INTHASBITS vendor/lua-5.4.8/src/lopcodes.h /^#define L_INTHASBITS(/;" d +L_MAXLENNUM vendor/lua-5.4.8/src/liolib.c /^#define L_MAXLENNUM /;" d file: +L_MAXLENNUM vendor/lua-5.4.8/src/lobject.c /^#define L_MAXLENNUM /;" d file: +L_MODEEXT vendor/lua-5.4.8/src/liolib.c /^#define L_MODEEXT /;" d file: +L_NBFD vendor/lua-5.4.8/src/lstrlib.c /^#define L_NBFD /;" d file: +L_P2I vendor/lua-5.4.8/src/llimits.h /^#define L_P2I /;" d +Labeldesc vendor/lua-5.4.8/src/lparser.h /^typedef struct Labeldesc {$/;" s +Labeldesc vendor/lua-5.4.8/src/lparser.h /^} Labeldesc;$/;" t typeref:struct:Labeldesc +Labellist vendor/lua-5.4.8/src/lparser.h /^typedef struct Labellist {$/;" s +Labellist vendor/lua-5.4.8/src/lparser.h /^} Labellist;$/;" t typeref:struct:Labellist +Lerp vendor/raylib-5.5_linux_amd64/include/raymath.h /^RMAPI float Lerp(float start, float end, float amount)$/;" f typeref:typename:RMAPI float +LexState vendor/lua-5.4.8/src/llex.h /^typedef struct LexState {$/;" s +LexState vendor/lua-5.4.8/src/llex.h /^} LexState;$/;" t typeref:struct:LexState +Libraries README.md /^## Libraries$/;" s chapter:Bidi - Game development framework +Linux vendor/lua-5.4.8/src/Makefile /^Linux linux: linux-noreadline$/;" t +LoadAudioStream vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI AudioStream LoadAudioStream(unsigned int sampleRate, unsigned int sampleSize, unsigned int/;" p typeref:typename:RLAPI AudioStream +LoadAutomationEventList vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI AutomationEventList LoadAutomationEventList(const char *fileName); \/\/ Loa/;" p typeref:typename:RLAPI AutomationEventList +LoadCodepoints vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI int *LoadCodepoints(const char *text, int *count); \/\/ Load all codepoints/;" p typeref:typename:RLAPI int * +LoadDirectoryFiles vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI FilePathList LoadDirectoryFiles(const char *dirPath); \/\/ Load directory filepaths$/;" p typeref:typename:RLAPI FilePathList +LoadDirectoryFilesEx vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI FilePathList LoadDirectoryFilesEx(const char *basePath, const char *filter, bool scanSubdi/;" p typeref:typename:RLAPI FilePathList +LoadDroppedFiles vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI FilePathList LoadDroppedFiles(void); \/\/ Load dropped filepaths$/;" p typeref:typename:RLAPI FilePathList +LoadF vendor/lua-5.4.8/src/lauxlib.c /^typedef struct LoadF {$/;" s file: +LoadF vendor/lua-5.4.8/src/lauxlib.c /^} LoadF;$/;" t typeref:struct:LoadF file: +LoadFileData vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI unsigned char *LoadFileData(const char *fileName, int *dataSize); \/\/ Load file data as b/;" p typeref:typename:RLAPI unsigned char * +LoadFileDataCallback vendor/raylib-5.5_linux_amd64/include/raylib.h /^typedef unsigned char *(*LoadFileDataCallback)(const char *fileName, int *dataSize); \/\/ Fil/;" t typeref:typename:unsigned char * (*)(const char * fileName,int * dataSize) +LoadFileText vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI char *LoadFileText(const char *fileName); \/\/ Load text data from file /;" p typeref:typename:RLAPI char * +LoadFileTextCallback vendor/raylib-5.5_linux_amd64/include/raylib.h /^typedef char *(*LoadFileTextCallback)(const char *fileName); \/\/ FileIO: Load text d/;" t typeref:typename:char * (*)(const char * fileName) +LoadFont vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI Font LoadFont(const char *fileName); \/\//;" p typeref:typename:RLAPI Font +LoadFontData vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI GlyphInfo *LoadFontData(const unsigned char *fileData, int dataSize, int fontSize, int *co/;" p typeref:typename:RLAPI GlyphInfo * +LoadFontEx vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI Font LoadFontEx(const char *fileName, int fontSize, int *codepoints, int codepointCount); /;" p typeref:typename:RLAPI Font +LoadFontFromImage vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI Font LoadFontFromImage(Image image, Color key, int firstChar); \/\//;" p typeref:typename:RLAPI Font +LoadFontFromMemory vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI Font LoadFontFromMemory(const char *fileType, const unsigned char *fileData, int dataSize,/;" p typeref:typename:RLAPI Font +LoadImage vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI Image LoadImage(const char *fileName); /;" p typeref:typename:RLAPI Image +LoadImageAnim vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI Image LoadImageAnim(const char *fileName, int *frames); /;" p typeref:typename:RLAPI Image +LoadImageAnimFromMemory vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI Image LoadImageAnimFromMemory(const char *fileType, const unsigned char *fileData, int dat/;" p typeref:typename:RLAPI Image +LoadImageColors vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI Color *LoadImageColors(Image image); /;" p typeref:typename:RLAPI Color * +LoadImageFromMemory vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI Image LoadImageFromMemory(const char *fileType, const unsigned char *fileData, int dataSiz/;" p typeref:typename:RLAPI Image +LoadImageFromScreen vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI Image LoadImageFromScreen(void); /;" p typeref:typename:RLAPI Image +LoadImageFromTexture vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI Image LoadImageFromTexture(Texture2D texture); /;" p typeref:typename:RLAPI Image +LoadImagePalette vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI Color *LoadImagePalette(Image image, int maxPaletteSize, int *colorCount); /;" p typeref:typename:RLAPI Color * +LoadImageRaw vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI Image LoadImageRaw(const char *fileName, int width, int height, int format, int headerSize/;" p typeref:typename:RLAPI Image +LoadMaterialDefault vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI Material LoadMaterialDefault(void); \/\//;" p typeref:typename:RLAPI Material +LoadMaterials vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI Material *LoadMaterials(const char *fileName, int *materialCount); \/\//;" p typeref:typename:RLAPI Material * +LoadModel vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI Model LoadModel(const char *fileName); \/\//;" p typeref:typename:RLAPI Model +LoadModelAnimations vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI ModelAnimation *LoadModelAnimations(const char *fileName, int *animCount); \/\//;" p typeref:typename:RLAPI ModelAnimation * +LoadModelFromMesh vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI Model LoadModelFromMesh(Mesh mesh); \/\//;" p typeref:typename:RLAPI Model +LoadMusicStream vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI Music LoadMusicStream(const char *fileName); \/\/ Load music stream fro/;" p typeref:typename:RLAPI Music +LoadMusicStreamFromMemory vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI Music LoadMusicStreamFromMemory(const char *fileType, const unsigned char *data, int dataS/;" p typeref:typename:RLAPI Music +LoadRandomSequence vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI int *LoadRandomSequence(unsigned int count, int min, int max); \/\/ Load random values seq/;" p typeref:typename:RLAPI int * +LoadRenderTexture vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI RenderTexture2D LoadRenderTexture(int width, int height); /;" p typeref:typename:RLAPI RenderTexture2D +LoadS vendor/lua-5.4.8/src/lauxlib.c /^typedef struct LoadS {$/;" s file: +LoadS vendor/lua-5.4.8/src/lauxlib.c /^} LoadS;$/;" t typeref:struct:LoadS file: +LoadShader vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI Shader LoadShader(const char *vsFileName, const char *fsFileName); \/\/ Load shader from/;" p typeref:typename:RLAPI Shader +LoadShaderFromMemory vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI Shader LoadShaderFromMemory(const char *vsCode, const char *fsCode); \/\/ Load shader from/;" p typeref:typename:RLAPI Shader +LoadSound vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI Sound LoadSound(const char *fileName); \/\/ Load sound from file$/;" p typeref:typename:RLAPI Sound +LoadSoundAlias vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI Sound LoadSoundAlias(Sound source); \/\/ Create a new sound th/;" p typeref:typename:RLAPI Sound +LoadSoundFromWave vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI Sound LoadSoundFromWave(Wave wave); \/\/ Load sound from wave /;" p typeref:typename:RLAPI Sound +LoadState vendor/lua-5.4.8/src/lundump.c /^} LoadState;$/;" t typeref:struct:__anon98fd752a0108 file: +LoadTexture vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI Texture2D LoadTexture(const char *fileName); /;" p typeref:typename:RLAPI Texture2D +LoadTextureCubemap vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI TextureCubemap LoadTextureCubemap(Image image, int layout); /;" p typeref:typename:RLAPI TextureCubemap +LoadTextureFromImage vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI Texture2D LoadTextureFromImage(Image image); /;" p typeref:typename:RLAPI Texture2D +LoadUTF8 vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI char *LoadUTF8(const int *codepoints, int length); \/\/ Load UTF-8 text enc/;" p typeref:typename:RLAPI char * +LoadVrStereoConfig vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI VrStereoConfig LoadVrStereoConfig(VrDeviceInfo device); \/\/ Load VR stereo config for/;" p typeref:typename:RLAPI VrStereoConfig +LoadWave vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI Wave LoadWave(const char *fileName); \/\/ Load wave data from f/;" p typeref:typename:RLAPI Wave +LoadWaveFromMemory vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI Wave LoadWaveFromMemory(const char *fileType, const unsigned char *fileData, int dataSize)/;" p typeref:typename:RLAPI Wave +LoadWaveSamples vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI float *LoadWaveSamples(Wave wave); \/\/ Load samples data fro/;" p typeref:typename:RLAPI float * +LocVar vendor/lua-5.4.8/src/lobject.h /^typedef struct LocVar {$/;" s +LocVar vendor/lua-5.4.8/src/lobject.h /^} LocVar;$/;" t typeref:struct:LocVar +LuaClosure vendor/lua-5.4.8/src/ldebug.c /^#define LuaClosure(/;" d file: +MAGENTA vendor/raylib-5.5_linux_amd64/include/raylib.h /^#define MAGENTA /;" d +MAROON vendor/raylib-5.5_linux_amd64/include/raylib.h /^#define MAROON /;" d +MASK vendor/lua-5.4.8/src/lctype.h /^#define MASK(/;" d +MASK0 vendor/lua-5.4.8/src/lopcodes.h /^#define MASK0(/;" d +MASK1 vendor/lua-5.4.8/src/lopcodes.h /^#define MASK1(/;" d +MATERIAL_MAP_ALBEDO vendor/raylib-5.5_linux_amd64/include/raylib.h /^ MATERIAL_MAP_ALBEDO = 0, \/\/ Albedo material (same as: MATERIAL_MAP_DIFFUSE)$/;" e enum:__anon77d6622f0903 +MATERIAL_MAP_BRDF vendor/raylib-5.5_linux_amd64/include/raylib.h /^ MATERIAL_MAP_BRDF \/\/ Brdf material$/;" e enum:__anon77d6622f0903 +MATERIAL_MAP_CUBEMAP vendor/raylib-5.5_linux_amd64/include/raylib.h /^ MATERIAL_MAP_CUBEMAP, \/\/ Cubemap material (NOTE: Uses GL_TEXTURE_CUBE_MAP)$/;" e enum:__anon77d6622f0903 +MATERIAL_MAP_DIFFUSE vendor/raylib-5.5_linux_amd64/include/raylib.h /^#define MATERIAL_MAP_DIFFUSE /;" d +MATERIAL_MAP_EMISSION vendor/raylib-5.5_linux_amd64/include/raylib.h /^ MATERIAL_MAP_EMISSION, \/\/ Emission material$/;" e enum:__anon77d6622f0903 +MATERIAL_MAP_HEIGHT vendor/raylib-5.5_linux_amd64/include/raylib.h /^ MATERIAL_MAP_HEIGHT, \/\/ Heightmap material$/;" e enum:__anon77d6622f0903 +MATERIAL_MAP_IRRADIANCE vendor/raylib-5.5_linux_amd64/include/raylib.h /^ MATERIAL_MAP_IRRADIANCE, \/\/ Irradiance material (NOTE: Uses GL_TEXTURE_CUBE_MAP)$/;" e enum:__anon77d6622f0903 +MATERIAL_MAP_METALNESS vendor/raylib-5.5_linux_amd64/include/raylib.h /^ MATERIAL_MAP_METALNESS, \/\/ Metalness material (same as: MATERIAL_MAP_SPECULAR)$/;" e enum:__anon77d6622f0903 +MATERIAL_MAP_NORMAL vendor/raylib-5.5_linux_amd64/include/raylib.h /^ MATERIAL_MAP_NORMAL, \/\/ Normal material$/;" e enum:__anon77d6622f0903 +MATERIAL_MAP_OCCLUSION vendor/raylib-5.5_linux_amd64/include/raylib.h /^ MATERIAL_MAP_OCCLUSION, \/\/ Ambient occlusion material$/;" e enum:__anon77d6622f0903 +MATERIAL_MAP_PREFILTER vendor/raylib-5.5_linux_amd64/include/raylib.h /^ MATERIAL_MAP_PREFILTER, \/\/ Prefilter material (NOTE: Uses GL_TEXTURE_CUBE_MAP)$/;" e enum:__anon77d6622f0903 +MATERIAL_MAP_ROUGHNESS vendor/raylib-5.5_linux_amd64/include/raylib.h /^ MATERIAL_MAP_ROUGHNESS, \/\/ Roughness material$/;" e enum:__anon77d6622f0903 +MATERIAL_MAP_SPECULAR vendor/raylib-5.5_linux_amd64/include/raylib.h /^#define MATERIAL_MAP_SPECULAR /;" d +MAX vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ #define MAX(/;" d +MAXABITS vendor/lua-5.4.8/src/ltable.c /^#define MAXABITS /;" d file: +MAXARGLINE vendor/lua-5.4.8/src/liolib.c /^#define MAXARGLINE /;" d file: +MAXARG_A vendor/lua-5.4.8/src/lopcodes.h /^#define MAXARG_A /;" d +MAXARG_Ax vendor/lua-5.4.8/src/lopcodes.h /^#define MAXARG_Ax /;" d +MAXARG_B vendor/lua-5.4.8/src/lopcodes.h /^#define MAXARG_B /;" d +MAXARG_Bx vendor/lua-5.4.8/src/lopcodes.h /^#define MAXARG_Bx /;" d +MAXARG_C vendor/lua-5.4.8/src/lopcodes.h /^#define MAXARG_C /;" d +MAXARG_sJ vendor/lua-5.4.8/src/lopcodes.h /^#define MAXARG_sJ /;" d +MAXASIZE vendor/lua-5.4.8/src/ltable.c /^#define MAXASIZE /;" d file: +MAXBY10 vendor/lua-5.4.8/src/lobject.c /^#define MAXBY10 /;" d file: +MAXCCALLS vendor/lua-5.4.8/src/lstrlib.c /^#define MAXCCALLS /;" d file: +MAXDELTA vendor/lua-5.4.8/src/lfunc.c /^#define MAXDELTA /;" d file: +MAXHBITS vendor/lua-5.4.8/src/ltable.c /^#define MAXHBITS /;" d file: +MAXHSIZE vendor/lua-5.4.8/src/ltable.c /^#define MAXHSIZE /;" d file: +MAXINDEXRK vendor/lua-5.4.8/src/lopcodes.h /^#define MAXINDEXRK /;" d +MAXINTFITSF vendor/lua-5.4.8/src/lvm.c /^#define MAXINTFITSF /;" d file: +MAXINTSIZE vendor/lua-5.4.8/src/lstrlib.c /^#define MAXINTSIZE /;" d file: +MAXIWTHABS vendor/lua-5.4.8/src/ldebug.h /^#define MAXIWTHABS /;" d +MAXLASTD vendor/lua-5.4.8/src/lobject.c /^#define MAXLASTD /;" d file: +MAXMISS vendor/lua-5.4.8/src/lfunc.h /^#define MAXMISS /;" d +MAXNUMBER2STR vendor/lua-5.4.8/src/lobject.c /^#define MAXNUMBER2STR /;" d file: +MAXREGS vendor/lua-5.4.8/src/lcode.c /^#define MAXREGS /;" d file: +MAXSIGDIG vendor/lua-5.4.8/src/lobject.c /^#define MAXSIGDIG /;" d file: +MAXSIZE vendor/lua-5.4.8/src/lstrlib.c /^#define MAXSIZE /;" d file: +MAXSTRTB vendor/lua-5.4.8/src/lstring.c /^#define MAXSTRTB /;" d file: +MAXTAGLOOP vendor/lua-5.4.8/src/lvm.c /^#define MAXTAGLOOP /;" d file: +MAXUNICODE vendor/lua-5.4.8/src/lutf8lib.c /^#define MAXUNICODE /;" d file: +MAXUPVAL vendor/lua-5.4.8/src/lfunc.h /^#define MAXUPVAL /;" d +MAXUTF vendor/lua-5.4.8/src/lutf8lib.c /^#define MAXUTF /;" d file: +MAXVARS vendor/lua-5.4.8/src/lparser.c /^#define MAXVARS /;" d file: +MAX_FORMAT vendor/lua-5.4.8/src/lstrlib.c /^#define MAX_FORMAT /;" d file: +MAX_INT vendor/lua-5.4.8/src/llimits.h /^#define MAX_INT /;" d +MAX_ITEM vendor/lua-5.4.8/src/lstrlib.c /^#define MAX_ITEM /;" d file: +MAX_ITEMF vendor/lua-5.4.8/src/lstrlib.c /^#define MAX_ITEMF /;" d file: +MAX_LMEM vendor/lua-5.4.8/src/llimits.h /^#define MAX_LMEM /;" d +MAX_LUMEM vendor/lua-5.4.8/src/llimits.h /^#define MAX_LUMEM /;" d +MAX_SIZE vendor/lua-5.4.8/src/llimits.h /^#define MAX_SIZE /;" d +MAX_SIZET vendor/lua-5.4.8/src/lauxlib.c /^#define MAX_SIZET /;" d file: +MAX_SIZET vendor/lua-5.4.8/src/llimits.h /^#define MAX_SIZET /;" d +MAX_SIZET vendor/lua-5.4.8/src/lstrlib.c /^#define MAX_SIZET /;" d file: +MC vendor/lua-5.4.8/src/lstrlib.c /^#define MC /;" d file: +MEMERRMSG vendor/lua-5.4.8/src/lstring.h /^#define MEMERRMSG /;" d +MIN vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ #define MIN(/;" d +MINSIZEARRAY vendor/lua-5.4.8/src/lmem.c /^#define MINSIZEARRAY /;" d file: +MINSTRTABSIZE vendor/lua-5.4.8/src/llimits.h /^#define MINSTRTABSIZE /;" d +MKDIR vendor/lua-5.4.8/Makefile /^MKDIR= mkdir -p$/;" m +MOUSE_BUTTON_BACK vendor/raylib-5.5_linux_amd64/include/raylib.h /^ MOUSE_BUTTON_BACK = 6, \/\/ Mouse button back (advanced mouse device)$/;" e enum:__anon77d6622f0503 +MOUSE_BUTTON_EXTRA vendor/raylib-5.5_linux_amd64/include/raylib.h /^ MOUSE_BUTTON_EXTRA = 4, \/\/ Mouse button extra (advanced mouse device)$/;" e enum:__anon77d6622f0503 +MOUSE_BUTTON_FORWARD vendor/raylib-5.5_linux_amd64/include/raylib.h /^ MOUSE_BUTTON_FORWARD = 5, \/\/ Mouse button forward (advanced mouse device)$/;" e enum:__anon77d6622f0503 +MOUSE_BUTTON_LEFT vendor/raylib-5.5_linux_amd64/include/raylib.h /^ MOUSE_BUTTON_LEFT = 0, \/\/ Mouse button left$/;" e enum:__anon77d6622f0503 +MOUSE_BUTTON_MIDDLE vendor/raylib-5.5_linux_amd64/include/raylib.h /^ MOUSE_BUTTON_MIDDLE = 2, \/\/ Mouse button middle (pressed wheel)$/;" e enum:__anon77d6622f0503 +MOUSE_BUTTON_RIGHT vendor/raylib-5.5_linux_amd64/include/raylib.h /^ MOUSE_BUTTON_RIGHT = 1, \/\/ Mouse button right$/;" e enum:__anon77d6622f0503 +MOUSE_BUTTON_SIDE vendor/raylib-5.5_linux_amd64/include/raylib.h /^ MOUSE_BUTTON_SIDE = 3, \/\/ Mouse button side (advanced mouse device)$/;" e enum:__anon77d6622f0503 +MOUSE_CURSOR_ARROW vendor/raylib-5.5_linux_amd64/include/raylib.h /^ MOUSE_CURSOR_ARROW = 1, \/\/ Arrow shape$/;" e enum:__anon77d6622f0603 +MOUSE_CURSOR_CROSSHAIR vendor/raylib-5.5_linux_amd64/include/raylib.h /^ MOUSE_CURSOR_CROSSHAIR = 3, \/\/ Cross shape$/;" e enum:__anon77d6622f0603 +MOUSE_CURSOR_DEFAULT vendor/raylib-5.5_linux_amd64/include/raylib.h /^ MOUSE_CURSOR_DEFAULT = 0, \/\/ Default pointer shape$/;" e enum:__anon77d6622f0603 +MOUSE_CURSOR_IBEAM vendor/raylib-5.5_linux_amd64/include/raylib.h /^ MOUSE_CURSOR_IBEAM = 2, \/\/ Text writing cursor shape$/;" e enum:__anon77d6622f0603 +MOUSE_CURSOR_NOT_ALLOWED vendor/raylib-5.5_linux_amd64/include/raylib.h /^ MOUSE_CURSOR_NOT_ALLOWED = 10 \/\/ The operation-not-allowed shape$/;" e enum:__anon77d6622f0603 +MOUSE_CURSOR_POINTING_HAND vendor/raylib-5.5_linux_amd64/include/raylib.h /^ MOUSE_CURSOR_POINTING_HAND = 4, \/\/ Pointing hand cursor$/;" e enum:__anon77d6622f0603 +MOUSE_CURSOR_RESIZE_ALL vendor/raylib-5.5_linux_amd64/include/raylib.h /^ MOUSE_CURSOR_RESIZE_ALL = 9, \/\/ The omnidirectional resize\/move cursor shape$/;" e enum:__anon77d6622f0603 +MOUSE_CURSOR_RESIZE_EW vendor/raylib-5.5_linux_amd64/include/raylib.h /^ MOUSE_CURSOR_RESIZE_EW = 5, \/\/ Horizontal resize\/move arrow shape$/;" e enum:__anon77d6622f0603 +MOUSE_CURSOR_RESIZE_NESW vendor/raylib-5.5_linux_amd64/include/raylib.h /^ MOUSE_CURSOR_RESIZE_NESW = 8, \/\/ The top-right to bottom-left diagonal resize\/move /;" e enum:__anon77d6622f0603 +MOUSE_CURSOR_RESIZE_NS vendor/raylib-5.5_linux_amd64/include/raylib.h /^ MOUSE_CURSOR_RESIZE_NS = 6, \/\/ Vertical resize\/move arrow shape$/;" e enum:__anon77d6622f0603 +MOUSE_CURSOR_RESIZE_NWSE vendor/raylib-5.5_linux_amd64/include/raylib.h /^ MOUSE_CURSOR_RESIZE_NWSE = 7, \/\/ Top-left to bottom-right diagonal resize\/move arro/;" e enum:__anon77d6622f0603 +MOUSE_LEFT_BUTTON vendor/raylib-5.5_linux_amd64/include/raylib.h /^#define MOUSE_LEFT_BUTTON /;" d +MOUSE_MIDDLE_BUTTON vendor/raylib-5.5_linux_amd64/include/raylib.h /^#define MOUSE_MIDDLE_BUTTON /;" d +MOUSE_RIGHT_BUTTON vendor/raylib-5.5_linux_amd64/include/raylib.h /^#define MOUSE_RIGHT_BUTTON /;" d +MSGInvalid vendor/lua-5.4.8/src/lutf8lib.c /^#define MSGInvalid /;" d file: +MYCFLAGS vendor/lua-5.4.8/src/Makefile /^MYCFLAGS=$/;" m +MYLDFLAGS vendor/lua-5.4.8/src/Makefile /^MYLDFLAGS=$/;" m +MYLIBS vendor/lua-5.4.8/src/Makefile /^MYLIBS=$/;" m +MYOBJS vendor/lua-5.4.8/src/Makefile /^MYOBJS=$/;" m +MakeDirectory vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI int MakeDirectory(const char *dirPath); \/\/ Create directories (inclu/;" p typeref:typename:RLAPI int +MatchState vendor/lua-5.4.8/src/lstrlib.c /^typedef struct MatchState {$/;" s file: +MatchState vendor/lua-5.4.8/src/lstrlib.c /^} MatchState;$/;" t typeref:struct:MatchState file: +Material vendor/raylib-5.5_linux_amd64/include/raylib.h /^typedef struct Material {$/;" s +Material vendor/raylib-5.5_linux_amd64/include/raylib.h /^} Material;$/;" t typeref:struct:Material +MaterialMap vendor/raylib-5.5_linux_amd64/include/raylib.h /^typedef struct MaterialMap {$/;" s +MaterialMap vendor/raylib-5.5_linux_amd64/include/raylib.h /^} MaterialMap;$/;" t typeref:struct:MaterialMap +MaterialMapIndex vendor/raylib-5.5_linux_amd64/include/raylib.h /^} MaterialMapIndex;$/;" t typeref:enum:__anon77d6622f0903 +Matrix vendor/raylib-5.5_linux_amd64/include/raylib.h /^typedef struct Matrix {$/;" s +Matrix vendor/raylib-5.5_linux_amd64/include/raylib.h /^} Matrix;$/;" t typeref:struct:Matrix +Matrix vendor/raylib-5.5_linux_amd64/include/raymath.h /^typedef struct Matrix {$/;" s +Matrix vendor/raylib-5.5_linux_amd64/include/raymath.h /^} Matrix;$/;" t typeref:struct:Matrix +Matrix vendor/raylib-5.5_linux_amd64/include/rlgl.h /^typedef struct Matrix {$/;" s +Matrix vendor/raylib-5.5_linux_amd64/include/rlgl.h /^} Matrix;$/;" t typeref:struct:Matrix +MatrixAdd vendor/raylib-5.5_linux_amd64/include/raymath.h /^RMAPI Matrix MatrixAdd(Matrix left, Matrix right)$/;" f typeref:typename:RMAPI Matrix +MatrixDecompose vendor/raylib-5.5_linux_amd64/include/raymath.h /^RMAPI void MatrixDecompose(Matrix mat, Vector3 *translation, Quaternion *rotation, Vector3 *scal/;" f typeref:typename:RMAPI void +MatrixDeterminant vendor/raylib-5.5_linux_amd64/include/raymath.h /^RMAPI float MatrixDeterminant(Matrix mat)$/;" f typeref:typename:RMAPI float +MatrixFrustum vendor/raylib-5.5_linux_amd64/include/raymath.h /^RMAPI Matrix MatrixFrustum(double left, double right, double bottom, double top, double nearPlan/;" f typeref:typename:RMAPI Matrix +MatrixIdentity vendor/raylib-5.5_linux_amd64/include/raymath.h /^RMAPI Matrix MatrixIdentity(void)$/;" f typeref:typename:RMAPI Matrix +MatrixInvert vendor/raylib-5.5_linux_amd64/include/raymath.h /^RMAPI Matrix MatrixInvert(Matrix mat)$/;" f typeref:typename:RMAPI Matrix +MatrixLookAt vendor/raylib-5.5_linux_amd64/include/raymath.h /^RMAPI Matrix MatrixLookAt(Vector3 eye, Vector3 target, Vector3 up)$/;" f typeref:typename:RMAPI Matrix +MatrixMultiply vendor/raylib-5.5_linux_amd64/include/raymath.h /^RMAPI Matrix MatrixMultiply(Matrix left, Matrix right)$/;" f typeref:typename:RMAPI Matrix +MatrixOrtho vendor/raylib-5.5_linux_amd64/include/raymath.h /^RMAPI Matrix MatrixOrtho(double left, double right, double bottom, double top, double nearPlane,/;" f typeref:typename:RMAPI Matrix +MatrixPerspective vendor/raylib-5.5_linux_amd64/include/raymath.h /^RMAPI Matrix MatrixPerspective(double fovY, double aspect, double nearPlane, double farPlane)$/;" f typeref:typename:RMAPI Matrix +MatrixRotate vendor/raylib-5.5_linux_amd64/include/raymath.h /^RMAPI Matrix MatrixRotate(Vector3 axis, float angle)$/;" f typeref:typename:RMAPI Matrix +MatrixRotateX vendor/raylib-5.5_linux_amd64/include/raymath.h /^RMAPI Matrix MatrixRotateX(float angle)$/;" f typeref:typename:RMAPI Matrix +MatrixRotateXYZ vendor/raylib-5.5_linux_amd64/include/raymath.h /^RMAPI Matrix MatrixRotateXYZ(Vector3 angle)$/;" f typeref:typename:RMAPI Matrix +MatrixRotateY vendor/raylib-5.5_linux_amd64/include/raymath.h /^RMAPI Matrix MatrixRotateY(float angle)$/;" f typeref:typename:RMAPI Matrix +MatrixRotateZ vendor/raylib-5.5_linux_amd64/include/raymath.h /^RMAPI Matrix MatrixRotateZ(float angle)$/;" f typeref:typename:RMAPI Matrix +MatrixRotateZYX vendor/raylib-5.5_linux_amd64/include/raymath.h /^RMAPI Matrix MatrixRotateZYX(Vector3 angle)$/;" f typeref:typename:RMAPI Matrix +MatrixScale vendor/raylib-5.5_linux_amd64/include/raymath.h /^RMAPI Matrix MatrixScale(float x, float y, float z)$/;" f typeref:typename:RMAPI Matrix +MatrixSubtract vendor/raylib-5.5_linux_amd64/include/raymath.h /^RMAPI Matrix MatrixSubtract(Matrix left, Matrix right)$/;" f typeref:typename:RMAPI Matrix +MatrixToFloat vendor/raylib-5.5_linux_amd64/include/raymath.h /^ #define MatrixToFloat(/;" d +MatrixToFloatV vendor/raylib-5.5_linux_amd64/include/raymath.h /^RMAPI float16 MatrixToFloatV(Matrix mat)$/;" f typeref:typename:RMAPI float16 +MatrixTrace vendor/raylib-5.5_linux_amd64/include/raymath.h /^RMAPI float MatrixTrace(Matrix mat)$/;" f typeref:typename:RMAPI float +MatrixTranslate vendor/raylib-5.5_linux_amd64/include/raymath.h /^RMAPI Matrix MatrixTranslate(float x, float y, float z)$/;" f typeref:typename:RMAPI Matrix +MatrixTranspose vendor/raylib-5.5_linux_amd64/include/raymath.h /^RMAPI Matrix MatrixTranspose(Matrix mat)$/;" f typeref:typename:RMAPI Matrix +MaximizeWindow vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void MaximizeWindow(void); \/\/ Set window state: maximiz/;" p typeref:typename:RLAPI void +Mbuffer vendor/lua-5.4.8/src/lzio.h /^typedef struct Mbuffer {$/;" s +Mbuffer vendor/lua-5.4.8/src/lzio.h /^} Mbuffer;$/;" t typeref:struct:Mbuffer +MeasureText vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI int MeasureText(const char *text, int fontSize); \/\//;" p typeref:typename:RLAPI int +MeasureTextEx vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI Vector2 MeasureTextEx(Font font, const char *text, float fontSize, float spacing); \/\//;" p typeref:typename:RLAPI Vector2 +MemAlloc vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void *MemAlloc(unsigned int size); \/\/ Internal memory allocator$/;" p typeref:typename:RLAPI void * +MemFree vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void MemFree(void *ptr); \/\/ Internal memory free$/;" p typeref:typename:RLAPI void +MemRealloc vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void *MemRealloc(void *ptr, unsigned int size); \/\/ Internal memory reallocat/;" p typeref:typename:RLAPI void * +Mesh vendor/raylib-5.5_linux_amd64/include/raylib.h /^typedef struct Mesh {$/;" s +Mesh vendor/raylib-5.5_linux_amd64/include/raylib.h /^} Mesh;$/;" t typeref:struct:Mesh +MinimizeWindow vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void MinimizeWindow(void); \/\/ Set window state: minimiz/;" p typeref:typename:RLAPI void +Model vendor/raylib-5.5_linux_amd64/include/raylib.h /^typedef struct Model {$/;" s +Model vendor/raylib-5.5_linux_amd64/include/raylib.h /^} Model;$/;" t typeref:struct:Model +ModelAnimation vendor/raylib-5.5_linux_amd64/include/raylib.h /^typedef struct ModelAnimation {$/;" s +ModelAnimation vendor/raylib-5.5_linux_amd64/include/raylib.h /^} ModelAnimation;$/;" t typeref:struct:ModelAnimation +MouseButton vendor/raylib-5.5_linux_amd64/include/raylib.h /^} MouseButton;$/;" t typeref:enum:__anon77d6622f0503 +MouseCursor vendor/raylib-5.5_linux_amd64/include/raylib.h /^} MouseCursor;$/;" t typeref:enum:__anon77d6622f0603 +Music vendor/raylib-5.5_linux_amd64/include/raylib.h /^typedef struct Music {$/;" s +Music vendor/raylib-5.5_linux_amd64/include/raylib.h /^} Music;$/;" t typeref:struct:Music +NB vendor/lua-5.4.8/src/lstrlib.c /^#define NB /;" d file: +NBITS vendor/lua-5.4.8/src/lvm.c /^#define NBITS /;" d file: +NBM vendor/lua-5.4.8/src/lvm.c /^#define NBM /;" d file: +NONA vendor/lua-5.4.8/src/lctype.c /^#define NONA /;" d file: +NO_JUMP vendor/lua-5.4.8/src/lcode.h /^#define NO_JUMP /;" d +NO_REG vendor/lua-5.4.8/src/lopcodes.h /^#define NO_REG /;" d +NPATCH_NINE_PATCH vendor/raylib-5.5_linux_amd64/include/raylib.h /^ NPATCH_NINE_PATCH = 0, \/\/ Npatch layout: 3x3 tiles$/;" e enum:__anon77d6622f1603 +NPATCH_THREE_PATCH_HORIZONTAL vendor/raylib-5.5_linux_amd64/include/raylib.h /^ NPATCH_THREE_PATCH_HORIZONTAL \/\/ Npatch layout: 3x1 tiles$/;" e enum:__anon77d6622f1603 +NPATCH_THREE_PATCH_VERTICAL vendor/raylib-5.5_linux_amd64/include/raylib.h /^ NPATCH_THREE_PATCH_VERTICAL, \/\/ Npatch layout: 1x3 tiles$/;" e enum:__anon77d6622f1603 +NPatchInfo vendor/raylib-5.5_linux_amd64/include/raylib.h /^typedef struct NPatchInfo {$/;" s +NPatchInfo vendor/raylib-5.5_linux_amd64/include/raylib.h /^} NPatchInfo;$/;" t typeref:struct:NPatchInfo +NPatchLayout vendor/raylib-5.5_linux_amd64/include/raylib.h /^} NPatchLayout;$/;" t typeref:enum:__anon77d6622f1603 +NUM_OPCODES vendor/lua-5.4.8/src/lopcodes.h /^#define NUM_OPCODES /;" d +NUM_RESERVED vendor/lua-5.4.8/src/llex.h /^#define NUM_RESERVED /;" d +NetBSD vendor/lua-5.4.8/src/Makefile /^FreeBSD NetBSD OpenBSD freebsd:$/;" t +Node vendor/lua-5.4.8/src/lobject.h /^typedef union Node {$/;" u +Node vendor/lua-5.4.8/src/lobject.h /^} Node;$/;" t typeref:union:Node +NodeKey vendor/lua-5.4.8/src/lobject.h /^ struct NodeKey {$/;" s union:Node +Normalize vendor/raylib-5.5_linux_amd64/include/raymath.h /^RMAPI float Normalize(float value, float start, float end)$/;" f typeref:typename:RMAPI float +OFFSET_sBx vendor/lua-5.4.8/src/lopcodes.h /^#define OFFSET_sBx /;" d +OFFSET_sC vendor/lua-5.4.8/src/lopcodes.h /^#define OFFSET_sC /;" d +OFFSET_sJ vendor/lua-5.4.8/src/lopcodes.h /^#define OFFSET_sJ /;" d +OPR_ADD vendor/lua-5.4.8/src/lcode.h /^ OPR_ADD, OPR_SUB, OPR_MUL, OPR_MOD, OPR_POW,$/;" e enum:BinOpr +OPR_AND vendor/lua-5.4.8/src/lcode.h /^ OPR_AND, OPR_OR,$/;" e enum:BinOpr +OPR_BAND vendor/lua-5.4.8/src/lcode.h /^ OPR_BAND, OPR_BOR, OPR_BXOR,$/;" e enum:BinOpr +OPR_BNOT vendor/lua-5.4.8/src/lcode.h /^typedef enum UnOpr { OPR_MINUS, OPR_BNOT, OPR_NOT, OPR_LEN, OPR_NOUNOPR } UnOpr;$/;" e enum:UnOpr +OPR_BOR vendor/lua-5.4.8/src/lcode.h /^ OPR_BAND, OPR_BOR, OPR_BXOR,$/;" e enum:BinOpr +OPR_BXOR vendor/lua-5.4.8/src/lcode.h /^ OPR_BAND, OPR_BOR, OPR_BXOR,$/;" e enum:BinOpr +OPR_CONCAT vendor/lua-5.4.8/src/lcode.h /^ OPR_CONCAT,$/;" e enum:BinOpr +OPR_DIV vendor/lua-5.4.8/src/lcode.h /^ OPR_DIV, OPR_IDIV,$/;" e enum:BinOpr +OPR_EQ vendor/lua-5.4.8/src/lcode.h /^ OPR_EQ, OPR_LT, OPR_LE,$/;" e enum:BinOpr +OPR_GE vendor/lua-5.4.8/src/lcode.h /^ OPR_NE, OPR_GT, OPR_GE,$/;" e enum:BinOpr +OPR_GT vendor/lua-5.4.8/src/lcode.h /^ OPR_NE, OPR_GT, OPR_GE,$/;" e enum:BinOpr +OPR_IDIV vendor/lua-5.4.8/src/lcode.h /^ OPR_DIV, OPR_IDIV,$/;" e enum:BinOpr +OPR_LE vendor/lua-5.4.8/src/lcode.h /^ OPR_EQ, OPR_LT, OPR_LE,$/;" e enum:BinOpr +OPR_LEN vendor/lua-5.4.8/src/lcode.h /^typedef enum UnOpr { OPR_MINUS, OPR_BNOT, OPR_NOT, OPR_LEN, OPR_NOUNOPR } UnOpr;$/;" e enum:UnOpr +OPR_LT vendor/lua-5.4.8/src/lcode.h /^ OPR_EQ, OPR_LT, OPR_LE,$/;" e enum:BinOpr +OPR_MINUS vendor/lua-5.4.8/src/lcode.h /^typedef enum UnOpr { OPR_MINUS, OPR_BNOT, OPR_NOT, OPR_LEN, OPR_NOUNOPR } UnOpr;$/;" e enum:UnOpr +OPR_MOD vendor/lua-5.4.8/src/lcode.h /^ OPR_ADD, OPR_SUB, OPR_MUL, OPR_MOD, OPR_POW,$/;" e enum:BinOpr +OPR_MUL vendor/lua-5.4.8/src/lcode.h /^ OPR_ADD, OPR_SUB, OPR_MUL, OPR_MOD, OPR_POW,$/;" e enum:BinOpr +OPR_NE vendor/lua-5.4.8/src/lcode.h /^ OPR_NE, OPR_GT, OPR_GE,$/;" e enum:BinOpr +OPR_NOBINOPR vendor/lua-5.4.8/src/lcode.h /^ OPR_NOBINOPR$/;" e enum:BinOpr +OPR_NOT vendor/lua-5.4.8/src/lcode.h /^typedef enum UnOpr { OPR_MINUS, OPR_BNOT, OPR_NOT, OPR_LEN, OPR_NOUNOPR } UnOpr;$/;" e enum:UnOpr +OPR_NOUNOPR vendor/lua-5.4.8/src/lcode.h /^typedef enum UnOpr { OPR_MINUS, OPR_BNOT, OPR_NOT, OPR_LEN, OPR_NOUNOPR } UnOpr;$/;" e enum:UnOpr +OPR_OR vendor/lua-5.4.8/src/lcode.h /^ OPR_AND, OPR_OR,$/;" e enum:BinOpr +OPR_POW vendor/lua-5.4.8/src/lcode.h /^ OPR_ADD, OPR_SUB, OPR_MUL, OPR_MOD, OPR_POW,$/;" e enum:BinOpr +OPR_SHL vendor/lua-5.4.8/src/lcode.h /^ OPR_SHL, OPR_SHR,$/;" e enum:BinOpr +OPR_SHR vendor/lua-5.4.8/src/lcode.h /^ OPR_SHL, OPR_SHR,$/;" e enum:BinOpr +OPR_SUB vendor/lua-5.4.8/src/lcode.h /^ OPR_ADD, OPR_SUB, OPR_MUL, OPR_MOD, OPR_POW,$/;" e enum:BinOpr +OP_ADD vendor/lua-5.4.8/src/lopcodes.h /^OP_ADD,\/* A B C R[A] := R[B] + R[C] *\/$/;" e enum:__anon7aa428030103 +OP_ADDI vendor/lua-5.4.8/src/lopcodes.h /^OP_ADDI,\/* A B sC R[A] := R[B] + sC *\/$/;" e enum:__anon7aa428030103 +OP_ADDK vendor/lua-5.4.8/src/lopcodes.h /^OP_ADDK,\/* A B C R[A] := R[B] + K[C]:number *\/$/;" e enum:__anon7aa428030103 +OP_BAND vendor/lua-5.4.8/src/lopcodes.h /^OP_BAND,\/* A B C R[A] := R[B] & R[C] *\/$/;" e enum:__anon7aa428030103 +OP_BANDK vendor/lua-5.4.8/src/lopcodes.h /^OP_BANDK,\/* A B C R[A] := R[B] & K[C]:integer *\/$/;" e enum:__anon7aa428030103 +OP_BNOT vendor/lua-5.4.8/src/lopcodes.h /^OP_BNOT,\/* A B R[A] := ~R[B] *\/$/;" e enum:__anon7aa428030103 +OP_BOR vendor/lua-5.4.8/src/lopcodes.h /^OP_BOR,\/* A B C R[A] := R[B] | R[C] *\/$/;" e enum:__anon7aa428030103 +OP_BORK vendor/lua-5.4.8/src/lopcodes.h /^OP_BORK,\/* A B C R[A] := R[B] | K[C]:integer *\/$/;" e enum:__anon7aa428030103 +OP_BXOR vendor/lua-5.4.8/src/lopcodes.h /^OP_BXOR,\/* A B C R[A] := R[B] ~ R[C] *\/$/;" e enum:__anon7aa428030103 +OP_BXORK vendor/lua-5.4.8/src/lopcodes.h /^OP_BXORK,\/* A B C R[A] := R[B] ~ K[C]:integer *\/$/;" e enum:__anon7aa428030103 +OP_CALL vendor/lua-5.4.8/src/lopcodes.h /^OP_CALL,\/* A B C R[A], ... ,R[A+C-2] := R[A](R[A+1], ... ,R[A+B-1]) *\/$/;" e enum:__anon7aa428030103 +OP_CLOSE vendor/lua-5.4.8/src/lopcodes.h /^OP_CLOSE,\/* A close all upvalues >= R[A] *\/$/;" e enum:__anon7aa428030103 +OP_CLOSURE vendor/lua-5.4.8/src/lopcodes.h /^OP_CLOSURE,\/* A Bx R[A] := closure(KPROTO[Bx]) *\/$/;" e enum:__anon7aa428030103 +OP_CONCAT vendor/lua-5.4.8/src/lopcodes.h /^OP_CONCAT,\/* A B R[A] := R[A].. ... ..R[A + B - 1] *\/$/;" e enum:__anon7aa428030103 +OP_DIV vendor/lua-5.4.8/src/lopcodes.h /^OP_DIV,\/* A B C R[A] := R[B] \/ R[C] *\/$/;" e enum:__anon7aa428030103 +OP_DIVK vendor/lua-5.4.8/src/lopcodes.h /^OP_DIVK,\/* A B C R[A] := R[B] \/ K[C]:number *\/$/;" e enum:__anon7aa428030103 +OP_EQ vendor/lua-5.4.8/src/lopcodes.h /^OP_EQ,\/* A B k if ((R[A] == R[B]) ~= k) then pc++ *\/$/;" e enum:__anon7aa428030103 +OP_EQI vendor/lua-5.4.8/src/lopcodes.h /^OP_EQI,\/* A sB k if ((R[A] == sB) ~= k) then pc++ *\/$/;" e enum:__anon7aa428030103 +OP_EQK vendor/lua-5.4.8/src/lopcodes.h /^OP_EQK,\/* A B k if ((R[A] == K[B]) ~= k) then pc++ *\/$/;" e enum:__anon7aa428030103 +OP_EXTRAARG vendor/lua-5.4.8/src/lopcodes.h /^OP_EXTRAARG\/* Ax extra (larger) argument for previous opcode *\/$/;" e enum:__anon7aa428030103 +OP_FORLOOP vendor/lua-5.4.8/src/lopcodes.h /^OP_FORLOOP,\/* A Bx update counters; if loop continues then pc-=Bx; *\/$/;" e enum:__anon7aa428030103 +OP_FORPREP vendor/lua-5.4.8/src/lopcodes.h /^OP_FORPREP,\/* A Bx <check values and prepare counters>;$/;" e enum:__anon7aa428030103 +OP_GEI vendor/lua-5.4.8/src/lopcodes.h /^OP_GEI,\/* A sB k if ((R[A] >= sB) ~= k) then pc++ *\/$/;" e enum:__anon7aa428030103 +OP_GETFIELD vendor/lua-5.4.8/src/lopcodes.h /^OP_GETFIELD,\/* A B C R[A] := R[B][K[C]:shortstring] *\/$/;" e enum:__anon7aa428030103 +OP_GETI vendor/lua-5.4.8/src/lopcodes.h /^OP_GETI,\/* A B C R[A] := R[B][C] *\/$/;" e enum:__anon7aa428030103 +OP_GETTABLE vendor/lua-5.4.8/src/lopcodes.h /^OP_GETTABLE,\/* A B C R[A] := R[B][R[C]] *\/$/;" e enum:__anon7aa428030103 +OP_GETTABUP vendor/lua-5.4.8/src/lopcodes.h /^OP_GETTABUP,\/* A B C R[A] := UpValue[B][K[C]:shortstring] *\/$/;" e enum:__anon7aa428030103 +OP_GETUPVAL vendor/lua-5.4.8/src/lopcodes.h /^OP_GETUPVAL,\/* A B R[A] := UpValue[B] *\/$/;" e enum:__anon7aa428030103 +OP_GTI vendor/lua-5.4.8/src/lopcodes.h /^OP_GTI,\/* A sB k if ((R[A] > sB) ~= k) then pc++ *\/$/;" e enum:__anon7aa428030103 +OP_IDIV vendor/lua-5.4.8/src/lopcodes.h /^OP_IDIV,\/* A B C R[A] := R[B] \/\/ R[C] *\/$/;" e enum:__anon7aa428030103 +OP_IDIVK vendor/lua-5.4.8/src/lopcodes.h /^OP_IDIVK,\/* A B C R[A] := R[B] \/\/ K[C]:number *\/$/;" e enum:__anon7aa428030103 +OP_JMP vendor/lua-5.4.8/src/lopcodes.h /^OP_JMP,\/* sJ pc += sJ *\/$/;" e enum:__anon7aa428030103 +OP_LE vendor/lua-5.4.8/src/lopcodes.h /^OP_LE,\/* A B k if ((R[A] <= R[B]) ~= k) then pc++ *\/$/;" e enum:__anon7aa428030103 +OP_LEI vendor/lua-5.4.8/src/lopcodes.h /^OP_LEI,\/* A sB k if ((R[A] <= sB) ~= k) then pc++ *\/$/;" e enum:__anon7aa428030103 +OP_LEN vendor/lua-5.4.8/src/lopcodes.h /^OP_LEN,\/* A B R[A] := #R[B] (length operator) *\/$/;" e enum:__anon7aa428030103 +OP_LFALSESKIP vendor/lua-5.4.8/src/lopcodes.h /^OP_LFALSESKIP,\/*A R[A] := false; pc++ (*) *\/$/;" e enum:__anon7aa428030103 +OP_LOADF vendor/lua-5.4.8/src/lopcodes.h /^OP_LOADF,\/* A sBx R[A] := (lua_Number)sBx *\/$/;" e enum:__anon7aa428030103 +OP_LOADFALSE vendor/lua-5.4.8/src/lopcodes.h /^OP_LOADFALSE,\/* A R[A] := false *\/$/;" e enum:__anon7aa428030103 +OP_LOADI vendor/lua-5.4.8/src/lopcodes.h /^OP_LOADI,\/* A sBx R[A] := sBx *\/$/;" e enum:__anon7aa428030103 +OP_LOADK vendor/lua-5.4.8/src/lopcodes.h /^OP_LOADK,\/* A Bx R[A] := K[Bx] *\/$/;" e enum:__anon7aa428030103 +OP_LOADKX vendor/lua-5.4.8/src/lopcodes.h /^OP_LOADKX,\/* A R[A] := K[extra arg] *\/$/;" e enum:__anon7aa428030103 +OP_LOADNIL vendor/lua-5.4.8/src/lopcodes.h /^OP_LOADNIL,\/* A B R[A], R[A+1], ..., R[A+B] := nil *\/$/;" e enum:__anon7aa428030103 +OP_LOADTRUE vendor/lua-5.4.8/src/lopcodes.h /^OP_LOADTRUE,\/* A R[A] := true *\/$/;" e enum:__anon7aa428030103 +OP_LT vendor/lua-5.4.8/src/lopcodes.h /^OP_LT,\/* A B k if ((R[A] < R[B]) ~= k) then pc++ *\/$/;" e enum:__anon7aa428030103 +OP_LTI vendor/lua-5.4.8/src/lopcodes.h /^OP_LTI,\/* A sB k if ((R[A] < sB) ~= k) then pc++ *\/$/;" e enum:__anon7aa428030103 +OP_MMBIN vendor/lua-5.4.8/src/lopcodes.h /^OP_MMBIN,\/* A B C call C metamethod over R[A] and R[B] (*) *\/$/;" e enum:__anon7aa428030103 +OP_MMBINI vendor/lua-5.4.8/src/lopcodes.h /^OP_MMBINI,\/* A sB C k call C metamethod over R[A] and sB *\/$/;" e enum:__anon7aa428030103 +OP_MMBINK vendor/lua-5.4.8/src/lopcodes.h /^OP_MMBINK,\/* A B C k call C metamethod over R[A] and K[B] *\/$/;" e enum:__anon7aa428030103 +OP_MOD vendor/lua-5.4.8/src/lopcodes.h /^OP_MOD,\/* A B C R[A] := R[B] % R[C] *\/$/;" e enum:__anon7aa428030103 +OP_MODK vendor/lua-5.4.8/src/lopcodes.h /^OP_MODK,\/* A B C R[A] := R[B] % K[C]:number *\/$/;" e enum:__anon7aa428030103 +OP_MOVE vendor/lua-5.4.8/src/lopcodes.h /^OP_MOVE,\/* A B R[A] := R[B] *\/$/;" e enum:__anon7aa428030103 +OP_MUL vendor/lua-5.4.8/src/lopcodes.h /^OP_MUL,\/* A B C R[A] := R[B] * R[C] *\/$/;" e enum:__anon7aa428030103 +OP_MULK vendor/lua-5.4.8/src/lopcodes.h /^OP_MULK,\/* A B C R[A] := R[B] * K[C]:number *\/$/;" e enum:__anon7aa428030103 +OP_NEWTABLE vendor/lua-5.4.8/src/lopcodes.h /^OP_NEWTABLE,\/* A B C k R[A] := {} *\/$/;" e enum:__anon7aa428030103 +OP_NOT vendor/lua-5.4.8/src/lopcodes.h /^OP_NOT,\/* A B R[A] := not R[B] *\/$/;" e enum:__anon7aa428030103 +OP_POW vendor/lua-5.4.8/src/lopcodes.h /^OP_POW,\/* A B C R[A] := R[B] ^ R[C] *\/$/;" e enum:__anon7aa428030103 +OP_POWK vendor/lua-5.4.8/src/lopcodes.h /^OP_POWK,\/* A B C R[A] := R[B] ^ K[C]:number *\/$/;" e enum:__anon7aa428030103 +OP_RETURN vendor/lua-5.4.8/src/lopcodes.h /^OP_RETURN,\/* A B C k return R[A], ... ,R[A+B-2] (see note) *\/$/;" e enum:__anon7aa428030103 +OP_RETURN0 vendor/lua-5.4.8/src/lopcodes.h /^OP_RETURN0,\/* return *\/$/;" e enum:__anon7aa428030103 +OP_RETURN1 vendor/lua-5.4.8/src/lopcodes.h /^OP_RETURN1,\/* A return R[A] *\/$/;" e enum:__anon7aa428030103 +OP_SELF vendor/lua-5.4.8/src/lopcodes.h /^OP_SELF,\/* A B C R[A+1] := R[B]; R[A] := R[B][RK(C):string] *\/$/;" e enum:__anon7aa428030103 +OP_SETFIELD vendor/lua-5.4.8/src/lopcodes.h /^OP_SETFIELD,\/* A B C R[A][K[B]:shortstring] := RK(C) *\/$/;" e enum:__anon7aa428030103 +OP_SETI vendor/lua-5.4.8/src/lopcodes.h /^OP_SETI,\/* A B C R[A][B] := RK(C) *\/$/;" e enum:__anon7aa428030103 +OP_SETLIST vendor/lua-5.4.8/src/lopcodes.h /^OP_SETLIST,\/* A B C k R[A][C+i] := R[A+i], 1 <= i <= B *\/$/;" e enum:__anon7aa428030103 +OP_SETTABLE vendor/lua-5.4.8/src/lopcodes.h /^OP_SETTABLE,\/* A B C R[A][R[B]] := RK(C) *\/$/;" e enum:__anon7aa428030103 +OP_SETTABUP vendor/lua-5.4.8/src/lopcodes.h /^OP_SETTABUP,\/* A B C UpValue[A][K[B]:shortstring] := RK(C) *\/$/;" e enum:__anon7aa428030103 +OP_SETUPVAL vendor/lua-5.4.8/src/lopcodes.h /^OP_SETUPVAL,\/* A B UpValue[B] := R[A] *\/$/;" e enum:__anon7aa428030103 +OP_SHL vendor/lua-5.4.8/src/lopcodes.h /^OP_SHL,\/* A B C R[A] := R[B] << R[C] *\/$/;" e enum:__anon7aa428030103 +OP_SHLI vendor/lua-5.4.8/src/lopcodes.h /^OP_SHLI,\/* A B sC R[A] := sC << R[B] *\/$/;" e enum:__anon7aa428030103 +OP_SHR vendor/lua-5.4.8/src/lopcodes.h /^OP_SHR,\/* A B C R[A] := R[B] >> R[C] *\/$/;" e enum:__anon7aa428030103 +OP_SHRI vendor/lua-5.4.8/src/lopcodes.h /^OP_SHRI,\/* A B sC R[A] := R[B] >> sC *\/$/;" e enum:__anon7aa428030103 +OP_SUB vendor/lua-5.4.8/src/lopcodes.h /^OP_SUB,\/* A B C R[A] := R[B] - R[C] *\/$/;" e enum:__anon7aa428030103 +OP_SUBK vendor/lua-5.4.8/src/lopcodes.h /^OP_SUBK,\/* A B C R[A] := R[B] - K[C]:number *\/$/;" e enum:__anon7aa428030103 +OP_TAILCALL vendor/lua-5.4.8/src/lopcodes.h /^OP_TAILCALL,\/* A B C k return R[A](R[A+1], ... ,R[A+B-1]) *\/$/;" e enum:__anon7aa428030103 +OP_TBC vendor/lua-5.4.8/src/lopcodes.h /^OP_TBC,\/* A mark variable A "to be closed" *\/$/;" e enum:__anon7aa428030103 +OP_TEST vendor/lua-5.4.8/src/lopcodes.h /^OP_TEST,\/* A k if (not R[A] == k) then pc++ *\/$/;" e enum:__anon7aa428030103 +OP_TESTSET vendor/lua-5.4.8/src/lopcodes.h /^OP_TESTSET,\/* A B k if (not R[B] == k) then pc++ else R[A] := R[B] (*) *\/$/;" e enum:__anon7aa428030103 +OP_TFORCALL vendor/lua-5.4.8/src/lopcodes.h /^OP_TFORCALL,\/* A C R[A+4], ... ,R[A+3+C] := R[A](R[A+1], R[A+2]); *\/$/;" e enum:__anon7aa428030103 +OP_TFORLOOP vendor/lua-5.4.8/src/lopcodes.h /^OP_TFORLOOP,\/* A Bx if R[A+2] ~= nil then { R[A]=R[A+2]; pc -= Bx } *\/$/;" e enum:__anon7aa428030103 +OP_TFORPREP vendor/lua-5.4.8/src/lopcodes.h /^OP_TFORPREP,\/* A Bx create upvalue for R[A + 3]; pc+=Bx *\/$/;" e enum:__anon7aa428030103 +OP_UNM vendor/lua-5.4.8/src/lopcodes.h /^OP_UNM,\/* A B R[A] := -R[B] *\/$/;" e enum:__anon7aa428030103 +OP_VARARG vendor/lua-5.4.8/src/lopcodes.h /^OP_VARARG,\/* A C R[A], R[A+1], ..., R[A+C-2] = vararg *\/$/;" e enum:__anon7aa428030103 +OP_VARARGPREP vendor/lua-5.4.8/src/lopcodes.h /^OP_VARARGPREP,\/*A (adjust vararg parameters) *\/$/;" e enum:__anon7aa428030103 +ORANGE vendor/raylib-5.5_linux_amd64/include/raylib.h /^#define ORANGE /;" d +OUTPUT vendor/lua-5.4.8/src/luac.c /^#define OUTPUT /;" d file: +OpCode vendor/lua-5.4.8/src/lopcodes.h /^} OpCode;$/;" t typeref:enum:__anon7aa428030103 +OpMode vendor/lua-5.4.8/src/lopcodes.h /^enum OpMode {iABC, iABx, iAsBx, iAx, isJ}; \/* basic instruction formats *\/$/;" g +OpenBSD vendor/lua-5.4.8/src/Makefile /^FreeBSD NetBSD OpenBSD freebsd:$/;" t +OpenURL vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void OpenURL(const char *url); \/\/ Open URL with default sys/;" p typeref:typename:RLAPI void +Output vendor/lua-5.4.8/src/luac.c /^static char Output[]={ OUTPUT }; \/* default output file name *\/$/;" v typeref:typename:char[] file: +PAUSEADJ vendor/lua-5.4.8/src/lgc.c /^#define PAUSEADJ /;" d file: +PFNGLDRAWARRAYSINSTANCEDEXTPROC vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ typedef void (GL_APIENTRYP PFNGLDRAWARRAYSINSTANCEDEXTPROC) (GLenum mode, GLint start, GLsiz/;" t typeref:typename:void (GL_APIENTRYP)(GLenum mode,GLint start,GLsizei count,GLsizei primcount) +PFNGLDRAWELEMENTSINSTANCEDEXTPROC vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ typedef void (GL_APIENTRYP PFNGLDRAWELEMENTSINSTANCEDEXTPROC) (GLenum mode, GLsizei count, G/;" t typeref:typename:void (GL_APIENTRYP)(GLenum mode,GLsizei count,GLenum type,const void * indices,GLsizei primcount) +PFNGLVERTEXATTRIBDIVISOREXTPROC vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ typedef void (GL_APIENTRYP PFNGLVERTEXATTRIBDIVISOREXTPROC) (GLuint index, GLuint divisor);$/;" t typeref:typename:void (GL_APIENTRYP)(GLuint index,GLuint divisor) +PI vendor/lua-5.4.8/src/lmathlib.c /^#define PI /;" d file: +PI vendor/raylib-5.5_linux_amd64/include/raylib.h /^ #define PI /;" d +PI vendor/raylib-5.5_linux_amd64/include/raymath.h /^ #define PI /;" d +PI vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ #define PI /;" d +PINK vendor/raylib-5.5_linux_amd64/include/raylib.h /^#define PINK /;" d +PIXELFORMAT_COMPRESSED_ASTC_4x4_RGBA vendor/raylib-5.5_linux_amd64/include/raylib.h /^ PIXELFORMAT_COMPRESSED_ASTC_4x4_RGBA, \/\/ 8 bpp$/;" e enum:__anon77d6622f0d03 +PIXELFORMAT_COMPRESSED_ASTC_8x8_RGBA vendor/raylib-5.5_linux_amd64/include/raylib.h /^ PIXELFORMAT_COMPRESSED_ASTC_8x8_RGBA \/\/ 2 bpp$/;" e enum:__anon77d6622f0d03 +PIXELFORMAT_COMPRESSED_DXT1_RGB vendor/raylib-5.5_linux_amd64/include/raylib.h /^ PIXELFORMAT_COMPRESSED_DXT1_RGB, \/\/ 4 bpp (no alpha)$/;" e enum:__anon77d6622f0d03 +PIXELFORMAT_COMPRESSED_DXT1_RGBA vendor/raylib-5.5_linux_amd64/include/raylib.h /^ PIXELFORMAT_COMPRESSED_DXT1_RGBA, \/\/ 4 bpp (1 bit alpha)$/;" e enum:__anon77d6622f0d03 +PIXELFORMAT_COMPRESSED_DXT3_RGBA vendor/raylib-5.5_linux_amd64/include/raylib.h /^ PIXELFORMAT_COMPRESSED_DXT3_RGBA, \/\/ 8 bpp$/;" e enum:__anon77d6622f0d03 +PIXELFORMAT_COMPRESSED_DXT5_RGBA vendor/raylib-5.5_linux_amd64/include/raylib.h /^ PIXELFORMAT_COMPRESSED_DXT5_RGBA, \/\/ 8 bpp$/;" e enum:__anon77d6622f0d03 +PIXELFORMAT_COMPRESSED_ETC1_RGB vendor/raylib-5.5_linux_amd64/include/raylib.h /^ PIXELFORMAT_COMPRESSED_ETC1_RGB, \/\/ 4 bpp$/;" e enum:__anon77d6622f0d03 +PIXELFORMAT_COMPRESSED_ETC2_EAC_RGBA vendor/raylib-5.5_linux_amd64/include/raylib.h /^ PIXELFORMAT_COMPRESSED_ETC2_EAC_RGBA, \/\/ 8 bpp$/;" e enum:__anon77d6622f0d03 +PIXELFORMAT_COMPRESSED_ETC2_RGB vendor/raylib-5.5_linux_amd64/include/raylib.h /^ PIXELFORMAT_COMPRESSED_ETC2_RGB, \/\/ 4 bpp$/;" e enum:__anon77d6622f0d03 +PIXELFORMAT_COMPRESSED_PVRT_RGB vendor/raylib-5.5_linux_amd64/include/raylib.h /^ PIXELFORMAT_COMPRESSED_PVRT_RGB, \/\/ 4 bpp$/;" e enum:__anon77d6622f0d03 +PIXELFORMAT_COMPRESSED_PVRT_RGBA vendor/raylib-5.5_linux_amd64/include/raylib.h /^ PIXELFORMAT_COMPRESSED_PVRT_RGBA, \/\/ 4 bpp$/;" e enum:__anon77d6622f0d03 +PIXELFORMAT_UNCOMPRESSED_GRAYSCALE vendor/raylib-5.5_linux_amd64/include/raylib.h /^ PIXELFORMAT_UNCOMPRESSED_GRAYSCALE = 1, \/\/ 8 bit per pixel (no alpha)$/;" e enum:__anon77d6622f0d03 +PIXELFORMAT_UNCOMPRESSED_GRAY_ALPHA vendor/raylib-5.5_linux_amd64/include/raylib.h /^ PIXELFORMAT_UNCOMPRESSED_GRAY_ALPHA, \/\/ 8*2 bpp (2 channels)$/;" e enum:__anon77d6622f0d03 +PIXELFORMAT_UNCOMPRESSED_R16 vendor/raylib-5.5_linux_amd64/include/raylib.h /^ PIXELFORMAT_UNCOMPRESSED_R16, \/\/ 16 bpp (1 channel - half float)$/;" e enum:__anon77d6622f0d03 +PIXELFORMAT_UNCOMPRESSED_R16G16B16 vendor/raylib-5.5_linux_amd64/include/raylib.h /^ PIXELFORMAT_UNCOMPRESSED_R16G16B16, \/\/ 16*3 bpp (3 channels - half float)$/;" e enum:__anon77d6622f0d03 +PIXELFORMAT_UNCOMPRESSED_R16G16B16A16 vendor/raylib-5.5_linux_amd64/include/raylib.h /^ PIXELFORMAT_UNCOMPRESSED_R16G16B16A16, \/\/ 16*4 bpp (4 channels - half float)$/;" e enum:__anon77d6622f0d03 +PIXELFORMAT_UNCOMPRESSED_R32 vendor/raylib-5.5_linux_amd64/include/raylib.h /^ PIXELFORMAT_UNCOMPRESSED_R32, \/\/ 32 bpp (1 channel - float)$/;" e enum:__anon77d6622f0d03 +PIXELFORMAT_UNCOMPRESSED_R32G32B32 vendor/raylib-5.5_linux_amd64/include/raylib.h /^ PIXELFORMAT_UNCOMPRESSED_R32G32B32, \/\/ 32*3 bpp (3 channels - float)$/;" e enum:__anon77d6622f0d03 +PIXELFORMAT_UNCOMPRESSED_R32G32B32A32 vendor/raylib-5.5_linux_amd64/include/raylib.h /^ PIXELFORMAT_UNCOMPRESSED_R32G32B32A32, \/\/ 32*4 bpp (4 channels - float)$/;" e enum:__anon77d6622f0d03 +PIXELFORMAT_UNCOMPRESSED_R4G4B4A4 vendor/raylib-5.5_linux_amd64/include/raylib.h /^ PIXELFORMAT_UNCOMPRESSED_R4G4B4A4, \/\/ 16 bpp (4 bit alpha)$/;" e enum:__anon77d6622f0d03 +PIXELFORMAT_UNCOMPRESSED_R5G5B5A1 vendor/raylib-5.5_linux_amd64/include/raylib.h /^ PIXELFORMAT_UNCOMPRESSED_R5G5B5A1, \/\/ 16 bpp (1 bit alpha)$/;" e enum:__anon77d6622f0d03 +PIXELFORMAT_UNCOMPRESSED_R5G6B5 vendor/raylib-5.5_linux_amd64/include/raylib.h /^ PIXELFORMAT_UNCOMPRESSED_R5G6B5, \/\/ 16 bpp$/;" e enum:__anon77d6622f0d03 +PIXELFORMAT_UNCOMPRESSED_R8G8B8 vendor/raylib-5.5_linux_amd64/include/raylib.h /^ PIXELFORMAT_UNCOMPRESSED_R8G8B8, \/\/ 24 bpp$/;" e enum:__anon77d6622f0d03 +PIXELFORMAT_UNCOMPRESSED_R8G8B8A8 vendor/raylib-5.5_linux_amd64/include/raylib.h /^ PIXELFORMAT_UNCOMPRESSED_R8G8B8A8, \/\/ 32 bpp$/;" e enum:__anon77d6622f0d03 +PLAT vendor/lua-5.4.8/Makefile /^PLAT= guess$/;" m +PLAT vendor/lua-5.4.8/src/Makefile /^PLAT= guess$/;" m +PLATS vendor/lua-5.4.8/Makefile /^PLATS= guess aix bsd c89 freebsd generic ios linux linux-readline macosx mingw posix solaris$/;" m +PLATS vendor/lua-5.4.8/src/Makefile /^PLATS= guess aix bsd c89 freebsd generic ios linux linux-readline macosx mingw posix solaris$/;" m +POS vendor/lua-5.4.8/src/lobject.c /^#define POS /;" d file: +POS_A vendor/lua-5.4.8/src/lopcodes.h /^#define POS_A /;" d +POS_Ax vendor/lua-5.4.8/src/lopcodes.h /^#define POS_Ax /;" d +POS_B vendor/lua-5.4.8/src/lopcodes.h /^#define POS_B /;" d +POS_Bx vendor/lua-5.4.8/src/lopcodes.h /^#define POS_Bx /;" d +POS_C vendor/lua-5.4.8/src/lopcodes.h /^#define POS_C /;" d +POS_OP vendor/lua-5.4.8/src/lopcodes.h /^#define POS_OP /;" d +POS_k vendor/lua-5.4.8/src/lopcodes.h /^#define POS_k /;" d +POS_sJ vendor/lua-5.4.8/src/lopcodes.h /^#define POS_sJ /;" d +PRE vendor/lua-5.4.8/src/lobject.c /^#define PRE /;" d file: +PRINTBIT vendor/lua-5.4.8/src/lctype.h /^#define PRINTBIT /;" d +PROG Makefile /^PROG := bidi$/;" m +PROGNAME vendor/lua-5.4.8/src/luac.c /^#define PROGNAME /;" d file: +PURPLE vendor/raylib-5.5_linux_amd64/include/raylib.h /^#define PURPLE /;" d +PauseAudioStream vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void PauseAudioStream(AudioStream stream); \/\/ Pause audio stream$/;" p typeref:typename:RLAPI void +PauseMusicStream vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void PauseMusicStream(Music music); \/\/ Pause music playing$/;" p typeref:typename:RLAPI void +PauseSound vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void PauseSound(Sound sound); \/\/ Pause a sound$/;" p typeref:typename:RLAPI void +Pfunc vendor/lua-5.4.8/src/ldo.h /^typedef void (*Pfunc) (lua_State *L, void *ud);$/;" t typeref:typename:void (*)(lua_State * L,void * ud) +PixelFormat vendor/raylib-5.5_linux_amd64/include/raylib.h /^} PixelFormat;$/;" t typeref:enum:__anon77d6622f0d03 +PlayAudioStream vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void PlayAudioStream(AudioStream stream); \/\/ Play audio stream$/;" p typeref:typename:RLAPI void +PlayAutomationEvent vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void PlayAutomationEvent(AutomationEvent event); \/\/ Pla/;" p typeref:typename:RLAPI void +PlayMusicStream vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void PlayMusicStream(Music music); \/\/ Start music playing$/;" p typeref:typename:RLAPI void +PlaySound vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void PlaySound(Sound sound); \/\/ Play a sound$/;" p typeref:typename:RLAPI void +PollInputEvents vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void PollInputEvents(void); \/\/ Register all input events$/;" p typeref:typename:RLAPI void +PrintCode vendor/lua-5.4.8/src/luac.c /^static void PrintCode(const Proto* f)$/;" f typeref:typename:void file: +PrintConstant vendor/lua-5.4.8/src/luac.c /^static void PrintConstant(const Proto* f, int i)$/;" f typeref:typename:void file: +PrintDebug vendor/lua-5.4.8/src/luac.c /^static void PrintDebug(const Proto* f)$/;" f typeref:typename:void file: +PrintFunction vendor/lua-5.4.8/src/luac.c /^static void PrintFunction(const Proto* f, int full)$/;" f typeref:typename:void file: +PrintFunction vendor/lua-5.4.8/src/luac.c /^static void PrintFunction(const Proto* f, int full);$/;" p typeref:typename:void file: +PrintHeader vendor/lua-5.4.8/src/luac.c /^static void PrintHeader(const Proto* f)$/;" f typeref:typename:void file: +PrintString vendor/lua-5.4.8/src/luac.c /^static void PrintString(const TString* ts)$/;" f typeref:typename:void file: +PrintType vendor/lua-5.4.8/src/luac.c /^static void PrintType(const Proto* f, int i)$/;" f typeref:typename:void file: +Protect vendor/lua-5.4.8/src/lvm.c /^#define Protect(/;" d file: +ProtectNT vendor/lua-5.4.8/src/lvm.c /^#define ProtectNT(/;" d file: +Proto vendor/lua-5.4.8/src/lobject.h /^typedef struct Proto {$/;" s +Proto vendor/lua-5.4.8/src/lobject.h /^} Proto;$/;" t typeref:struct:Proto +Quaternion vendor/raylib-5.5_linux_amd64/include/raylib.h /^typedef Vector4 Quaternion;$/;" t typeref:typename:Vector4 +Quaternion vendor/raylib-5.5_linux_amd64/include/raymath.h /^typedef Vector4 Quaternion;$/;" t typeref:typename:Vector4 +QuaternionAdd vendor/raylib-5.5_linux_amd64/include/raymath.h /^RMAPI Quaternion QuaternionAdd(Quaternion q1, Quaternion q2)$/;" f typeref:typename:RMAPI Quaternion +QuaternionAddValue vendor/raylib-5.5_linux_amd64/include/raymath.h /^RMAPI Quaternion QuaternionAddValue(Quaternion q, float add)$/;" f typeref:typename:RMAPI Quaternion +QuaternionCubicHermiteSpline vendor/raylib-5.5_linux_amd64/include/raymath.h /^RMAPI Quaternion QuaternionCubicHermiteSpline(Quaternion q1, Quaternion outTangent1, Quaternion /;" f typeref:typename:RMAPI Quaternion +QuaternionDivide vendor/raylib-5.5_linux_amd64/include/raymath.h /^RMAPI Quaternion QuaternionDivide(Quaternion q1, Quaternion q2)$/;" f typeref:typename:RMAPI Quaternion +QuaternionEquals vendor/raylib-5.5_linux_amd64/include/raymath.h /^RMAPI int QuaternionEquals(Quaternion p, Quaternion q)$/;" f typeref:typename:RMAPI int +QuaternionFromAxisAngle vendor/raylib-5.5_linux_amd64/include/raymath.h /^RMAPI Quaternion QuaternionFromAxisAngle(Vector3 axis, float angle)$/;" f typeref:typename:RMAPI Quaternion +QuaternionFromEuler vendor/raylib-5.5_linux_amd64/include/raymath.h /^RMAPI Quaternion QuaternionFromEuler(float pitch, float yaw, float roll)$/;" f typeref:typename:RMAPI Quaternion +QuaternionFromMatrix vendor/raylib-5.5_linux_amd64/include/raymath.h /^RMAPI Quaternion QuaternionFromMatrix(Matrix mat)$/;" f typeref:typename:RMAPI Quaternion +QuaternionFromVector3ToVector3 vendor/raylib-5.5_linux_amd64/include/raymath.h /^RMAPI Quaternion QuaternionFromVector3ToVector3(Vector3 from, Vector3 to)$/;" f typeref:typename:RMAPI Quaternion +QuaternionIdentity vendor/raylib-5.5_linux_amd64/include/raymath.h /^RMAPI Quaternion QuaternionIdentity(void)$/;" f typeref:typename:RMAPI Quaternion +QuaternionInvert vendor/raylib-5.5_linux_amd64/include/raymath.h /^RMAPI Quaternion QuaternionInvert(Quaternion q)$/;" f typeref:typename:RMAPI Quaternion +QuaternionLength vendor/raylib-5.5_linux_amd64/include/raymath.h /^RMAPI float QuaternionLength(Quaternion q)$/;" f typeref:typename:RMAPI float +QuaternionLerp vendor/raylib-5.5_linux_amd64/include/raymath.h /^RMAPI Quaternion QuaternionLerp(Quaternion q1, Quaternion q2, float amount)$/;" f typeref:typename:RMAPI Quaternion +QuaternionMultiply vendor/raylib-5.5_linux_amd64/include/raymath.h /^RMAPI Quaternion QuaternionMultiply(Quaternion q1, Quaternion q2)$/;" f typeref:typename:RMAPI Quaternion +QuaternionNlerp vendor/raylib-5.5_linux_amd64/include/raymath.h /^RMAPI Quaternion QuaternionNlerp(Quaternion q1, Quaternion q2, float amount)$/;" f typeref:typename:RMAPI Quaternion +QuaternionNormalize vendor/raylib-5.5_linux_amd64/include/raymath.h /^RMAPI Quaternion QuaternionNormalize(Quaternion q)$/;" f typeref:typename:RMAPI Quaternion +QuaternionOnes vendor/raylib-5.5_linux_amd64/include/raymath.h /^static constexpr Quaternion QuaternionOnes = { 1, 1, 1, 1 };$/;" v typeref:typename:Quaternion +QuaternionScale vendor/raylib-5.5_linux_amd64/include/raymath.h /^RMAPI Quaternion QuaternionScale(Quaternion q, float mul)$/;" f typeref:typename:RMAPI Quaternion +QuaternionSlerp vendor/raylib-5.5_linux_amd64/include/raymath.h /^RMAPI Quaternion QuaternionSlerp(Quaternion q1, Quaternion q2, float amount)$/;" f typeref:typename:RMAPI Quaternion +QuaternionSubtract vendor/raylib-5.5_linux_amd64/include/raymath.h /^RMAPI Quaternion QuaternionSubtract(Quaternion q1, Quaternion q2)$/;" f typeref:typename:RMAPI Quaternion +QuaternionSubtractValue vendor/raylib-5.5_linux_amd64/include/raymath.h /^RMAPI Quaternion QuaternionSubtractValue(Quaternion q, float sub)$/;" f typeref:typename:RMAPI Quaternion +QuaternionToAxisAngle vendor/raylib-5.5_linux_amd64/include/raymath.h /^RMAPI void QuaternionToAxisAngle(Quaternion q, Vector3 *outAxis, float *outAngle)$/;" f typeref:typename:RMAPI void +QuaternionToEuler vendor/raylib-5.5_linux_amd64/include/raymath.h /^RMAPI Vector3 QuaternionToEuler(Quaternion q)$/;" f typeref:typename:RMAPI Vector3 +QuaternionToMatrix vendor/raylib-5.5_linux_amd64/include/raymath.h /^RMAPI Matrix QuaternionToMatrix(Quaternion q)$/;" f typeref:typename:RMAPI Matrix +QuaternionTransform vendor/raylib-5.5_linux_amd64/include/raymath.h /^RMAPI Quaternion QuaternionTransform(Quaternion q, Matrix mat)$/;" f typeref:typename:RMAPI Quaternion +QuaternionUnitX vendor/raylib-5.5_linux_amd64/include/raymath.h /^static constexpr Quaternion QuaternionUnitX = { 0, 0, 0, 1 };$/;" v typeref:typename:Quaternion +QuaternionZeros vendor/raylib-5.5_linux_amd64/include/raymath.h /^static constexpr Quaternion QuaternionZeros = { 0, 0, 0, 0 };$/;" v typeref:typename:Quaternion +R vendor/lua-5.4.8/Makefile /^R= $V.8$/;" m +RA vendor/lua-5.4.8/src/lvm.c /^#define RA(/;" d file: +RAD2DEG vendor/raylib-5.5_linux_amd64/include/raylib.h /^ #define RAD2DEG /;" d +RAD2DEG vendor/raylib-5.5_linux_amd64/include/raymath.h /^ #define RAD2DEG /;" d +RAD2DEG vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ #define RAD2DEG /;" d +RANLIB vendor/lua-5.4.8/src/Makefile /^RANLIB= ranlib$/;" m +RANLIMIT vendor/lua-5.4.8/src/ltablib.c /^#define RANLIMIT /;" d file: +RAYLIB Makefile /^RAYLIB := raylib-5.5_linux_amd64$/;" m +RAYLIB_H vendor/raylib-5.5_linux_amd64/include/raylib.h /^#define RAYLIB_H$/;" d +RAYLIB_VERSION vendor/raylib-5.5_linux_amd64/include/raylib.h /^#define RAYLIB_VERSION /;" d +RAYLIB_VERSION_MAJOR vendor/raylib-5.5_linux_amd64/include/raylib.h /^#define RAYLIB_VERSION_MAJOR /;" d +RAYLIB_VERSION_MINOR vendor/raylib-5.5_linux_amd64/include/raylib.h /^#define RAYLIB_VERSION_MINOR /;" d +RAYLIB_VERSION_PATCH vendor/raylib-5.5_linux_amd64/include/raylib.h /^#define RAYLIB_VERSION_PATCH /;" d +RAYMATH_H vendor/raylib-5.5_linux_amd64/include/raymath.h /^#define RAYMATH_H$/;" d +RAYWHITE vendor/raylib-5.5_linux_amd64/include/raylib.h /^#define RAYWHITE /;" d +RB vendor/lua-5.4.8/src/lvm.c /^#define RB(/;" d file: +RC vendor/lua-5.4.8/src/lvm.c /^#define RC(/;" d file: +RDKCONST vendor/lua-5.4.8/src/lparser.h /^#define RDKCONST /;" d +RDKCTC vendor/lua-5.4.8/src/lparser.h /^#define RDKCTC /;" d +RDKTOCLOSE vendor/lua-5.4.8/src/lparser.h /^#define RDKTOCLOSE /;" d +RED vendor/raylib-5.5_linux_amd64/include/raylib.h /^#define RED /;" d +RESERVED vendor/lua-5.4.8/src/llex.h /^enum RESERVED {$/;" g +RESERVEDSLOT vendor/lua-5.4.8/src/lbaselib.c /^#define RESERVEDSLOT /;" d file: +RETS vendor/lua-5.4.8/src/lobject.c /^#define RETS /;" d file: +RKC vendor/lua-5.4.8/src/lvm.c /^#define RKC(/;" d file: +RLAPI vendor/raylib-5.5_linux_amd64/include/raylib.h /^ #define RLAPI /;" d +RLAPI vendor/raylib-5.5_linux_amd64/include/raylib.h /^ #define RLAPI /;" d +RLAPI vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ #define RLAPI /;" d +RLGL vendor/raylib-5.5_linux_amd64/include/rlgl.h /^static rlglData RLGL = { 0 };$/;" v typeref:typename:rlglData +RLGL_H vendor/raylib-5.5_linux_amd64/include/rlgl.h /^#define RLGL_H$/;" d +RLGL_RENDER_TEXTURES_HINT vendor/raylib-5.5_linux_amd64/include/rlgl.h /^#define RLGL_RENDER_TEXTURES_HINT$/;" d +RLGL_VERSION vendor/raylib-5.5_linux_amd64/include/rlgl.h /^#define RLGL_VERSION /;" d +RL_ATTACHMENT_COLOR_CHANNEL0 vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ RL_ATTACHMENT_COLOR_CHANNEL0 = 0, \/\/ Framebuffer attachment type: color 0$/;" e enum:__anon1f68b8bd0a03 +RL_ATTACHMENT_COLOR_CHANNEL1 vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ RL_ATTACHMENT_COLOR_CHANNEL1 = 1, \/\/ Framebuffer attachment type: color 1$/;" e enum:__anon1f68b8bd0a03 +RL_ATTACHMENT_COLOR_CHANNEL2 vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ RL_ATTACHMENT_COLOR_CHANNEL2 = 2, \/\/ Framebuffer attachment type: color 2$/;" e enum:__anon1f68b8bd0a03 +RL_ATTACHMENT_COLOR_CHANNEL3 vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ RL_ATTACHMENT_COLOR_CHANNEL3 = 3, \/\/ Framebuffer attachment type: color 3$/;" e enum:__anon1f68b8bd0a03 +RL_ATTACHMENT_COLOR_CHANNEL4 vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ RL_ATTACHMENT_COLOR_CHANNEL4 = 4, \/\/ Framebuffer attachment type: color 4$/;" e enum:__anon1f68b8bd0a03 +RL_ATTACHMENT_COLOR_CHANNEL5 vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ RL_ATTACHMENT_COLOR_CHANNEL5 = 5, \/\/ Framebuffer attachment type: color 5$/;" e enum:__anon1f68b8bd0a03 +RL_ATTACHMENT_COLOR_CHANNEL6 vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ RL_ATTACHMENT_COLOR_CHANNEL6 = 6, \/\/ Framebuffer attachment type: color 6$/;" e enum:__anon1f68b8bd0a03 +RL_ATTACHMENT_COLOR_CHANNEL7 vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ RL_ATTACHMENT_COLOR_CHANNEL7 = 7, \/\/ Framebuffer attachment type: color 7$/;" e enum:__anon1f68b8bd0a03 +RL_ATTACHMENT_CUBEMAP_NEGATIVE_X vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ RL_ATTACHMENT_CUBEMAP_NEGATIVE_X = 1, \/\/ Framebuffer texture attachment type: cubemap, -/;" e enum:__anon1f68b8bd0b03 +RL_ATTACHMENT_CUBEMAP_NEGATIVE_Y vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ RL_ATTACHMENT_CUBEMAP_NEGATIVE_Y = 3, \/\/ Framebuffer texture attachment type: cubemap, -/;" e enum:__anon1f68b8bd0b03 +RL_ATTACHMENT_CUBEMAP_NEGATIVE_Z vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ RL_ATTACHMENT_CUBEMAP_NEGATIVE_Z = 5, \/\/ Framebuffer texture attachment type: cubemap, -/;" e enum:__anon1f68b8bd0b03 +RL_ATTACHMENT_CUBEMAP_POSITIVE_X vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ RL_ATTACHMENT_CUBEMAP_POSITIVE_X = 0, \/\/ Framebuffer texture attachment type: cubemap, +/;" e enum:__anon1f68b8bd0b03 +RL_ATTACHMENT_CUBEMAP_POSITIVE_Y vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ RL_ATTACHMENT_CUBEMAP_POSITIVE_Y = 2, \/\/ Framebuffer texture attachment type: cubemap, +/;" e enum:__anon1f68b8bd0b03 +RL_ATTACHMENT_CUBEMAP_POSITIVE_Z vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ RL_ATTACHMENT_CUBEMAP_POSITIVE_Z = 4, \/\/ Framebuffer texture attachment type: cubemap, +/;" e enum:__anon1f68b8bd0b03 +RL_ATTACHMENT_DEPTH vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ RL_ATTACHMENT_DEPTH = 100, \/\/ Framebuffer attachment type: depth$/;" e enum:__anon1f68b8bd0a03 +RL_ATTACHMENT_RENDERBUFFER vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ RL_ATTACHMENT_RENDERBUFFER = 200, \/\/ Framebuffer texture attachment type: renderbuff/;" e enum:__anon1f68b8bd0b03 +RL_ATTACHMENT_STENCIL vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ RL_ATTACHMENT_STENCIL = 200, \/\/ Framebuffer attachment type: stencil$/;" e enum:__anon1f68b8bd0a03 +RL_ATTACHMENT_TEXTURE2D vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ RL_ATTACHMENT_TEXTURE2D = 100, \/\/ Framebuffer texture attachment type: texture2d$/;" e enum:__anon1f68b8bd0b03 +RL_BLEND_ADDITIVE vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ RL_BLEND_ADDITIVE, \/\/ Blend textures adding colors$/;" e enum:__anon1f68b8bd0603 +RL_BLEND_ADD_COLORS vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ RL_BLEND_ADD_COLORS, \/\/ Blend textures adding colors (alternative)$/;" e enum:__anon1f68b8bd0603 +RL_BLEND_ALPHA vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ RL_BLEND_ALPHA = 0, \/\/ Blend textures considering alpha (default)$/;" e enum:__anon1f68b8bd0603 +RL_BLEND_ALPHA_PREMULTIPLY vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ RL_BLEND_ALPHA_PREMULTIPLY, \/\/ Blend premultiplied textures considering alpha$/;" e enum:__anon1f68b8bd0603 +RL_BLEND_COLOR vendor/raylib-5.5_linux_amd64/include/rlgl.h /^#define RL_BLEND_COLOR /;" d +RL_BLEND_CUSTOM vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ RL_BLEND_CUSTOM, \/\/ Blend textures using custom src\/dst factors (use r/;" e enum:__anon1f68b8bd0603 +RL_BLEND_CUSTOM_SEPARATE vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ RL_BLEND_CUSTOM_SEPARATE \/\/ Blend textures using custom src\/dst factors (use r/;" e enum:__anon1f68b8bd0603 +RL_BLEND_DST_ALPHA vendor/raylib-5.5_linux_amd64/include/rlgl.h /^#define RL_BLEND_DST_ALPHA /;" d +RL_BLEND_DST_RGB vendor/raylib-5.5_linux_amd64/include/rlgl.h /^#define RL_BLEND_DST_RGB /;" d +RL_BLEND_EQUATION vendor/raylib-5.5_linux_amd64/include/rlgl.h /^#define RL_BLEND_EQUATION /;" d +RL_BLEND_EQUATION_ALPHA vendor/raylib-5.5_linux_amd64/include/rlgl.h /^#define RL_BLEND_EQUATION_ALPHA /;" d +RL_BLEND_EQUATION_RGB vendor/raylib-5.5_linux_amd64/include/rlgl.h /^#define RL_BLEND_EQUATION_RGB /;" d +RL_BLEND_MULTIPLIED vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ RL_BLEND_MULTIPLIED, \/\/ Blend textures multiplying colors$/;" e enum:__anon1f68b8bd0603 +RL_BLEND_SRC_ALPHA vendor/raylib-5.5_linux_amd64/include/rlgl.h /^#define RL_BLEND_SRC_ALPHA /;" d +RL_BLEND_SRC_RGB vendor/raylib-5.5_linux_amd64/include/rlgl.h /^#define RL_BLEND_SRC_RGB /;" d +RL_BLEND_SUBTRACT_COLORS vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ RL_BLEND_SUBTRACT_COLORS, \/\/ Blend textures subtracting colors (alternative)$/;" e enum:__anon1f68b8bd0603 +RL_BOOL_TYPE vendor/raylib-5.5_linux_amd64/include/raylib.h /^ #define RL_BOOL_TYPE$/;" d +RL_CALLOC vendor/raylib-5.5_linux_amd64/include/raylib.h /^ #define RL_CALLOC(/;" d +RL_CALLOC vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ #define RL_CALLOC(/;" d +RL_COLOR_TYPE vendor/raylib-5.5_linux_amd64/include/raylib.h /^#define RL_COLOR_TYPE$/;" d +RL_COMPUTE_SHADER vendor/raylib-5.5_linux_amd64/include/rlgl.h /^#define RL_COMPUTE_SHADER /;" d +RL_CONSTANT_ALPHA vendor/raylib-5.5_linux_amd64/include/rlgl.h /^#define RL_CONSTANT_ALPHA /;" d +RL_CONSTANT_COLOR vendor/raylib-5.5_linux_amd64/include/rlgl.h /^#define RL_CONSTANT_COLOR /;" d +RL_CULL_DISTANCE_FAR vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ #define RL_CULL_DISTANCE_FAR /;" d +RL_CULL_DISTANCE_NEAR vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ #define RL_CULL_DISTANCE_NEAR /;" d +RL_CULL_FACE_BACK vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ RL_CULL_FACE_BACK$/;" e enum:__anon1f68b8bd0c03 +RL_CULL_FACE_FRONT vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ RL_CULL_FACE_FRONT = 0,$/;" e enum:__anon1f68b8bd0c03 +RL_DEFAULT_BATCH_BUFFERS vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ #define RL_DEFAULT_BATCH_BUFFERS /;" d +RL_DEFAULT_BATCH_BUFFER_ELEMENTS vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ #define RL_DEFAULT_BATCH_BUFFER_ELEMENTS /;" d +RL_DEFAULT_BATCH_DRAWCALLS vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ #define RL_DEFAULT_BATCH_DRAWCALLS /;" d +RL_DEFAULT_BATCH_MAX_TEXTURE_UNITS vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ #define RL_DEFAULT_BATCH_MAX_TEXTURE_UNITS /;" d +RL_DEFAULT_SHADER_ATTRIB_LOCATION_BONEIDS vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ #define RL_DEFAULT_SHADER_ATTRIB_LOCATION_BONEIDS /;" d +RL_DEFAULT_SHADER_ATTRIB_LOCATION_BONEWEIGHTS vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ #define RL_DEFAULT_SHADER_ATTRIB_LOCATION_BONEWEIGHTS /;" d +RL_DEFAULT_SHADER_ATTRIB_LOCATION_COLOR vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ #define RL_DEFAULT_SHADER_ATTRIB_LOCATION_COLOR /;" d +RL_DEFAULT_SHADER_ATTRIB_LOCATION_INDICES vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ #define RL_DEFAULT_SHADER_ATTRIB_LOCATION_INDICES /;" d +RL_DEFAULT_SHADER_ATTRIB_LOCATION_NORMAL vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ #define RL_DEFAULT_SHADER_ATTRIB_LOCATION_NORMAL /;" d +RL_DEFAULT_SHADER_ATTRIB_LOCATION_POSITION vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ #define RL_DEFAULT_SHADER_ATTRIB_LOCATION_POSITION /;" d +RL_DEFAULT_SHADER_ATTRIB_LOCATION_TANGENT vendor/raylib-5.5_linux_amd64/include/rlgl.h /^#define RL_DEFAULT_SHADER_ATTRIB_LOCATION_TANGENT /;" d +RL_DEFAULT_SHADER_ATTRIB_LOCATION_TEXCOORD vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ #define RL_DEFAULT_SHADER_ATTRIB_LOCATION_TEXCOORD /;" d +RL_DEFAULT_SHADER_ATTRIB_LOCATION_TEXCOORD2 vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ #define RL_DEFAULT_SHADER_ATTRIB_LOCATION_TEXCOORD2 /;" d +RL_DEFAULT_SHADER_ATTRIB_NAME_BONEIDS vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ #define RL_DEFAULT_SHADER_ATTRIB_NAME_BONEIDS /;" d +RL_DEFAULT_SHADER_ATTRIB_NAME_BONEWEIGHTS vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ #define RL_DEFAULT_SHADER_ATTRIB_NAME_BONEWEIGHTS /;" d +RL_DEFAULT_SHADER_ATTRIB_NAME_COLOR vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ #define RL_DEFAULT_SHADER_ATTRIB_NAME_COLOR /;" d +RL_DEFAULT_SHADER_ATTRIB_NAME_NORMAL vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ #define RL_DEFAULT_SHADER_ATTRIB_NAME_NORMAL /;" d +RL_DEFAULT_SHADER_ATTRIB_NAME_POSITION vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ #define RL_DEFAULT_SHADER_ATTRIB_NAME_POSITION /;" d +RL_DEFAULT_SHADER_ATTRIB_NAME_TANGENT vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ #define RL_DEFAULT_SHADER_ATTRIB_NAME_TANGENT /;" d +RL_DEFAULT_SHADER_ATTRIB_NAME_TEXCOORD vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ #define RL_DEFAULT_SHADER_ATTRIB_NAME_TEXCOORD /;" d +RL_DEFAULT_SHADER_ATTRIB_NAME_TEXCOORD2 vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ #define RL_DEFAULT_SHADER_ATTRIB_NAME_TEXCOORD2 /;" d +RL_DEFAULT_SHADER_SAMPLER2D_NAME_TEXTURE0 vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ #define RL_DEFAULT_SHADER_SAMPLER2D_NAME_TEXTURE0 /;" d +RL_DEFAULT_SHADER_SAMPLER2D_NAME_TEXTURE1 vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ #define RL_DEFAULT_SHADER_SAMPLER2D_NAME_TEXTURE1 /;" d +RL_DEFAULT_SHADER_SAMPLER2D_NAME_TEXTURE2 vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ #define RL_DEFAULT_SHADER_SAMPLER2D_NAME_TEXTURE2 /;" d +RL_DEFAULT_SHADER_UNIFORM_NAME_BONE_MATRICES vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ #define RL_DEFAULT_SHADER_UNIFORM_NAME_BONE_MATRICES /;" d +RL_DEFAULT_SHADER_UNIFORM_NAME_COLOR vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ #define RL_DEFAULT_SHADER_UNIFORM_NAME_COLOR /;" d +RL_DEFAULT_SHADER_UNIFORM_NAME_MODEL vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ #define RL_DEFAULT_SHADER_UNIFORM_NAME_MODEL /;" d +RL_DEFAULT_SHADER_UNIFORM_NAME_MVP vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ #define RL_DEFAULT_SHADER_UNIFORM_NAME_MVP /;" d +RL_DEFAULT_SHADER_UNIFORM_NAME_NORMAL vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ #define RL_DEFAULT_SHADER_UNIFORM_NAME_NORMAL /;" d +RL_DEFAULT_SHADER_UNIFORM_NAME_PROJECTION vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ #define RL_DEFAULT_SHADER_UNIFORM_NAME_PROJECTION /;" d +RL_DEFAULT_SHADER_UNIFORM_NAME_VIEW vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ #define RL_DEFAULT_SHADER_UNIFORM_NAME_VIEW /;" d +RL_DRAW_FRAMEBUFFER vendor/raylib-5.5_linux_amd64/include/rlgl.h /^#define RL_DRAW_FRAMEBUFFER /;" d +RL_DST_ALPHA vendor/raylib-5.5_linux_amd64/include/rlgl.h /^#define RL_DST_ALPHA /;" d +RL_DST_COLOR vendor/raylib-5.5_linux_amd64/include/rlgl.h /^#define RL_DST_COLOR /;" d +RL_DYNAMIC_COPY vendor/raylib-5.5_linux_amd64/include/rlgl.h /^#define RL_DYNAMIC_COPY /;" d +RL_DYNAMIC_DRAW vendor/raylib-5.5_linux_amd64/include/rlgl.h /^#define RL_DYNAMIC_DRAW /;" d +RL_DYNAMIC_READ vendor/raylib-5.5_linux_amd64/include/rlgl.h /^#define RL_DYNAMIC_READ /;" d +RL_FLOAT vendor/raylib-5.5_linux_amd64/include/rlgl.h /^#define RL_FLOAT /;" d +RL_FRAGMENT_SHADER vendor/raylib-5.5_linux_amd64/include/rlgl.h /^#define RL_FRAGMENT_SHADER /;" d +RL_FREE vendor/raylib-5.5_linux_amd64/include/raylib.h /^ #define RL_FREE(/;" d +RL_FREE vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ #define RL_FREE(/;" d +RL_FUNC_ADD vendor/raylib-5.5_linux_amd64/include/rlgl.h /^#define RL_FUNC_ADD /;" d +RL_FUNC_REVERSE_SUBTRACT vendor/raylib-5.5_linux_amd64/include/rlgl.h /^#define RL_FUNC_REVERSE_SUBTRACT /;" d +RL_FUNC_SUBTRACT vendor/raylib-5.5_linux_amd64/include/rlgl.h /^#define RL_FUNC_SUBTRACT /;" d +RL_LINES vendor/raylib-5.5_linux_amd64/include/rlgl.h /^#define RL_LINES /;" d +RL_LOG_ALL vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ RL_LOG_ALL = 0, \/\/ Display all logs$/;" e enum:__anon1f68b8bd0303 +RL_LOG_DEBUG vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ RL_LOG_DEBUG, \/\/ Debug logging, used for internal debugging, it should be di/;" e enum:__anon1f68b8bd0303 +RL_LOG_ERROR vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ RL_LOG_ERROR, \/\/ Error logging, used on unrecoverable failures$/;" e enum:__anon1f68b8bd0303 +RL_LOG_FATAL vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ RL_LOG_FATAL, \/\/ Fatal logging, used to abort program: exit(EXIT_FAILURE)$/;" e enum:__anon1f68b8bd0303 +RL_LOG_INFO vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ RL_LOG_INFO, \/\/ Info logging, used for program execution info$/;" e enum:__anon1f68b8bd0303 +RL_LOG_NONE vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ RL_LOG_NONE \/\/ Disable logging$/;" e enum:__anon1f68b8bd0303 +RL_LOG_TRACE vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ RL_LOG_TRACE, \/\/ Trace logging, intended for internal use only$/;" e enum:__anon1f68b8bd0303 +RL_LOG_WARNING vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ RL_LOG_WARNING, \/\/ Warning logging, used on recoverable failures$/;" e enum:__anon1f68b8bd0303 +RL_MALLOC vendor/raylib-5.5_linux_amd64/include/raylib.h /^ #define RL_MALLOC(/;" d +RL_MALLOC vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ #define RL_MALLOC(/;" d +RL_MATRIX_TYPE vendor/raylib-5.5_linux_amd64/include/raylib.h /^#define RL_MATRIX_TYPE$/;" d +RL_MATRIX_TYPE vendor/raylib-5.5_linux_amd64/include/raymath.h /^#define RL_MATRIX_TYPE$/;" d +RL_MATRIX_TYPE vendor/raylib-5.5_linux_amd64/include/rlgl.h /^#define RL_MATRIX_TYPE$/;" d +RL_MAX vendor/raylib-5.5_linux_amd64/include/rlgl.h /^#define RL_MAX /;" d +RL_MAX_MATRIX_STACK_SIZE vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ #define RL_MAX_MATRIX_STACK_SIZE /;" d +RL_MAX_SHADER_LOCATIONS vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ #define RL_MAX_SHADER_LOCATIONS /;" d +RL_MIN vendor/raylib-5.5_linux_amd64/include/rlgl.h /^#define RL_MIN /;" d +RL_MODELVIEW vendor/raylib-5.5_linux_amd64/include/rlgl.h /^#define RL_MODELVIEW /;" d +RL_ONE vendor/raylib-5.5_linux_amd64/include/rlgl.h /^#define RL_ONE /;" d +RL_ONE_MINUS_CONSTANT_ALPHA vendor/raylib-5.5_linux_amd64/include/rlgl.h /^#define RL_ONE_MINUS_CONSTANT_ALPHA /;" d +RL_ONE_MINUS_CONSTANT_COLOR vendor/raylib-5.5_linux_amd64/include/rlgl.h /^#define RL_ONE_MINUS_CONSTANT_COLOR /;" d +RL_ONE_MINUS_DST_ALPHA vendor/raylib-5.5_linux_amd64/include/rlgl.h /^#define RL_ONE_MINUS_DST_ALPHA /;" d +RL_ONE_MINUS_DST_COLOR vendor/raylib-5.5_linux_amd64/include/rlgl.h /^#define RL_ONE_MINUS_DST_COLOR /;" d +RL_ONE_MINUS_SRC_ALPHA vendor/raylib-5.5_linux_amd64/include/rlgl.h /^#define RL_ONE_MINUS_SRC_ALPHA /;" d +RL_ONE_MINUS_SRC_COLOR vendor/raylib-5.5_linux_amd64/include/rlgl.h /^#define RL_ONE_MINUS_SRC_COLOR /;" d +RL_OPENGL_11 vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ RL_OPENGL_11 = 1, \/\/ OpenGL 1.1$/;" e enum:__anon1f68b8bd0203 +RL_OPENGL_21 vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ RL_OPENGL_21, \/\/ OpenGL 2.1 (GLSL 120)$/;" e enum:__anon1f68b8bd0203 +RL_OPENGL_33 vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ RL_OPENGL_33, \/\/ OpenGL 3.3 (GLSL 330)$/;" e enum:__anon1f68b8bd0203 +RL_OPENGL_43 vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ RL_OPENGL_43, \/\/ OpenGL 4.3 (using GLSL 330)$/;" e enum:__anon1f68b8bd0203 +RL_OPENGL_ES_20 vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ RL_OPENGL_ES_20, \/\/ OpenGL ES 2.0 (GLSL 100)$/;" e enum:__anon1f68b8bd0203 +RL_OPENGL_ES_30 vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ RL_OPENGL_ES_30 \/\/ OpenGL ES 3.0 (GLSL 300 es)$/;" e enum:__anon1f68b8bd0203 +RL_PIXELFORMAT_COMPRESSED_ASTC_4x4_RGBA vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ RL_PIXELFORMAT_COMPRESSED_ASTC_4x4_RGBA, \/\/ 8 bpp$/;" e enum:__anon1f68b8bd0403 +RL_PIXELFORMAT_COMPRESSED_ASTC_8x8_RGBA vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ RL_PIXELFORMAT_COMPRESSED_ASTC_8x8_RGBA \/\/ 2 bpp$/;" e enum:__anon1f68b8bd0403 +RL_PIXELFORMAT_COMPRESSED_DXT1_RGB vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ RL_PIXELFORMAT_COMPRESSED_DXT1_RGB, \/\/ 4 bpp (no alpha)$/;" e enum:__anon1f68b8bd0403 +RL_PIXELFORMAT_COMPRESSED_DXT1_RGBA vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ RL_PIXELFORMAT_COMPRESSED_DXT1_RGBA, \/\/ 4 bpp (1 bit alpha)$/;" e enum:__anon1f68b8bd0403 +RL_PIXELFORMAT_COMPRESSED_DXT3_RGBA vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ RL_PIXELFORMAT_COMPRESSED_DXT3_RGBA, \/\/ 8 bpp$/;" e enum:__anon1f68b8bd0403 +RL_PIXELFORMAT_COMPRESSED_DXT5_RGBA vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ RL_PIXELFORMAT_COMPRESSED_DXT5_RGBA, \/\/ 8 bpp$/;" e enum:__anon1f68b8bd0403 +RL_PIXELFORMAT_COMPRESSED_ETC1_RGB vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ RL_PIXELFORMAT_COMPRESSED_ETC1_RGB, \/\/ 4 bpp$/;" e enum:__anon1f68b8bd0403 +RL_PIXELFORMAT_COMPRESSED_ETC2_EAC_RGBA vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ RL_PIXELFORMAT_COMPRESSED_ETC2_EAC_RGBA, \/\/ 8 bpp$/;" e enum:__anon1f68b8bd0403 +RL_PIXELFORMAT_COMPRESSED_ETC2_RGB vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ RL_PIXELFORMAT_COMPRESSED_ETC2_RGB, \/\/ 4 bpp$/;" e enum:__anon1f68b8bd0403 +RL_PIXELFORMAT_COMPRESSED_PVRT_RGB vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ RL_PIXELFORMAT_COMPRESSED_PVRT_RGB, \/\/ 4 bpp$/;" e enum:__anon1f68b8bd0403 +RL_PIXELFORMAT_COMPRESSED_PVRT_RGBA vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ RL_PIXELFORMAT_COMPRESSED_PVRT_RGBA, \/\/ 4 bpp$/;" e enum:__anon1f68b8bd0403 +RL_PIXELFORMAT_UNCOMPRESSED_GRAYSCALE vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ RL_PIXELFORMAT_UNCOMPRESSED_GRAYSCALE = 1, \/\/ 8 bit per pixel (no alpha)$/;" e enum:__anon1f68b8bd0403 +RL_PIXELFORMAT_UNCOMPRESSED_GRAY_ALPHA vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ RL_PIXELFORMAT_UNCOMPRESSED_GRAY_ALPHA, \/\/ 8*2 bpp (2 channels)$/;" e enum:__anon1f68b8bd0403 +RL_PIXELFORMAT_UNCOMPRESSED_R16 vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ RL_PIXELFORMAT_UNCOMPRESSED_R16, \/\/ 16 bpp (1 channel - half float)$/;" e enum:__anon1f68b8bd0403 +RL_PIXELFORMAT_UNCOMPRESSED_R16G16B16 vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ RL_PIXELFORMAT_UNCOMPRESSED_R16G16B16, \/\/ 16*3 bpp (3 channels - half float)$/;" e enum:__anon1f68b8bd0403 +RL_PIXELFORMAT_UNCOMPRESSED_R16G16B16A16 vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ RL_PIXELFORMAT_UNCOMPRESSED_R16G16B16A16, \/\/ 16*4 bpp (4 channels - half float)$/;" e enum:__anon1f68b8bd0403 +RL_PIXELFORMAT_UNCOMPRESSED_R32 vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ RL_PIXELFORMAT_UNCOMPRESSED_R32, \/\/ 32 bpp (1 channel - float)$/;" e enum:__anon1f68b8bd0403 +RL_PIXELFORMAT_UNCOMPRESSED_R32G32B32 vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ RL_PIXELFORMAT_UNCOMPRESSED_R32G32B32, \/\/ 32*3 bpp (3 channels - float)$/;" e enum:__anon1f68b8bd0403 +RL_PIXELFORMAT_UNCOMPRESSED_R32G32B32A32 vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ RL_PIXELFORMAT_UNCOMPRESSED_R32G32B32A32, \/\/ 32*4 bpp (4 channels - float)$/;" e enum:__anon1f68b8bd0403 +RL_PIXELFORMAT_UNCOMPRESSED_R4G4B4A4 vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ RL_PIXELFORMAT_UNCOMPRESSED_R4G4B4A4, \/\/ 16 bpp (4 bit alpha)$/;" e enum:__anon1f68b8bd0403 +RL_PIXELFORMAT_UNCOMPRESSED_R5G5B5A1 vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ RL_PIXELFORMAT_UNCOMPRESSED_R5G5B5A1, \/\/ 16 bpp (1 bit alpha)$/;" e enum:__anon1f68b8bd0403 +RL_PIXELFORMAT_UNCOMPRESSED_R5G6B5 vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ RL_PIXELFORMAT_UNCOMPRESSED_R5G6B5, \/\/ 16 bpp$/;" e enum:__anon1f68b8bd0403 +RL_PIXELFORMAT_UNCOMPRESSED_R8G8B8 vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ RL_PIXELFORMAT_UNCOMPRESSED_R8G8B8, \/\/ 24 bpp$/;" e enum:__anon1f68b8bd0403 +RL_PIXELFORMAT_UNCOMPRESSED_R8G8B8A8 vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ RL_PIXELFORMAT_UNCOMPRESSED_R8G8B8A8, \/\/ 32 bpp$/;" e enum:__anon1f68b8bd0403 +RL_PROJECTION vendor/raylib-5.5_linux_amd64/include/rlgl.h /^#define RL_PROJECTION /;" d +RL_QUADS vendor/raylib-5.5_linux_amd64/include/rlgl.h /^#define RL_QUADS /;" d +RL_QUATERNION_TYPE vendor/raylib-5.5_linux_amd64/include/raylib.h /^#define RL_QUATERNION_TYPE$/;" d +RL_QUATERNION_TYPE vendor/raylib-5.5_linux_amd64/include/raymath.h /^#define RL_QUATERNION_TYPE$/;" d +RL_READ_FRAMEBUFFER vendor/raylib-5.5_linux_amd64/include/rlgl.h /^#define RL_READ_FRAMEBUFFER /;" d +RL_REALLOC vendor/raylib-5.5_linux_amd64/include/raylib.h /^ #define RL_REALLOC(/;" d +RL_REALLOC vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ #define RL_REALLOC(/;" d +RL_RECTANGLE_TYPE vendor/raylib-5.5_linux_amd64/include/raylib.h /^#define RL_RECTANGLE_TYPE$/;" d +RL_SHADER_ATTRIB_FLOAT vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ RL_SHADER_ATTRIB_FLOAT = 0, \/\/ Shader attribute type: float$/;" e enum:__anon1f68b8bd0903 +RL_SHADER_ATTRIB_VEC2 vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ RL_SHADER_ATTRIB_VEC2, \/\/ Shader attribute type: vec2 (2 float)$/;" e enum:__anon1f68b8bd0903 +RL_SHADER_ATTRIB_VEC3 vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ RL_SHADER_ATTRIB_VEC3, \/\/ Shader attribute type: vec3 (3 float)$/;" e enum:__anon1f68b8bd0903 +RL_SHADER_ATTRIB_VEC4 vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ RL_SHADER_ATTRIB_VEC4 \/\/ Shader attribute type: vec4 (4 float)$/;" e enum:__anon1f68b8bd0903 +RL_SHADER_LOC_COLOR_AMBIENT vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ RL_SHADER_LOC_COLOR_AMBIENT, \/\/ Shader location: vector uniform: ambient color$/;" e enum:__anon1f68b8bd0703 +RL_SHADER_LOC_COLOR_DIFFUSE vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ RL_SHADER_LOC_COLOR_DIFFUSE, \/\/ Shader location: vector uniform: diffuse color$/;" e enum:__anon1f68b8bd0703 +RL_SHADER_LOC_COLOR_SPECULAR vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ RL_SHADER_LOC_COLOR_SPECULAR, \/\/ Shader location: vector uniform: specular color$/;" e enum:__anon1f68b8bd0703 +RL_SHADER_LOC_MAP_ALBEDO vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ RL_SHADER_LOC_MAP_ALBEDO, \/\/ Shader location: sampler2d texture: albedo (same as/;" e enum:__anon1f68b8bd0703 +RL_SHADER_LOC_MAP_BRDF vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ RL_SHADER_LOC_MAP_BRDF \/\/ Shader location: sampler2d texture: brdf$/;" e enum:__anon1f68b8bd0703 +RL_SHADER_LOC_MAP_CUBEMAP vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ RL_SHADER_LOC_MAP_CUBEMAP, \/\/ Shader location: samplerCube texture: cubemap$/;" e enum:__anon1f68b8bd0703 +RL_SHADER_LOC_MAP_DIFFUSE vendor/raylib-5.5_linux_amd64/include/rlgl.h /^#define RL_SHADER_LOC_MAP_DIFFUSE /;" d +RL_SHADER_LOC_MAP_EMISSION vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ RL_SHADER_LOC_MAP_EMISSION, \/\/ Shader location: sampler2d texture: emission$/;" e enum:__anon1f68b8bd0703 +RL_SHADER_LOC_MAP_HEIGHT vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ RL_SHADER_LOC_MAP_HEIGHT, \/\/ Shader location: sampler2d texture: height$/;" e enum:__anon1f68b8bd0703 +RL_SHADER_LOC_MAP_IRRADIANCE vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ RL_SHADER_LOC_MAP_IRRADIANCE, \/\/ Shader location: samplerCube texture: irradiance$/;" e enum:__anon1f68b8bd0703 +RL_SHADER_LOC_MAP_METALNESS vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ RL_SHADER_LOC_MAP_METALNESS, \/\/ Shader location: sampler2d texture: metalness (same/;" e enum:__anon1f68b8bd0703 +RL_SHADER_LOC_MAP_NORMAL vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ RL_SHADER_LOC_MAP_NORMAL, \/\/ Shader location: sampler2d texture: normal$/;" e enum:__anon1f68b8bd0703 +RL_SHADER_LOC_MAP_OCCLUSION vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ RL_SHADER_LOC_MAP_OCCLUSION, \/\/ Shader location: sampler2d texture: occlusion$/;" e enum:__anon1f68b8bd0703 +RL_SHADER_LOC_MAP_PREFILTER vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ RL_SHADER_LOC_MAP_PREFILTER, \/\/ Shader location: samplerCube texture: prefilter$/;" e enum:__anon1f68b8bd0703 +RL_SHADER_LOC_MAP_ROUGHNESS vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ RL_SHADER_LOC_MAP_ROUGHNESS, \/\/ Shader location: sampler2d texture: roughness$/;" e enum:__anon1f68b8bd0703 +RL_SHADER_LOC_MAP_SPECULAR vendor/raylib-5.5_linux_amd64/include/rlgl.h /^#define RL_SHADER_LOC_MAP_SPECULAR /;" d +RL_SHADER_LOC_MATRIX_MODEL vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ RL_SHADER_LOC_MATRIX_MODEL, \/\/ Shader location: matrix uniform: model (transform)$/;" e enum:__anon1f68b8bd0703 +RL_SHADER_LOC_MATRIX_MVP vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ RL_SHADER_LOC_MATRIX_MVP, \/\/ Shader location: matrix uniform: model-view-project/;" e enum:__anon1f68b8bd0703 +RL_SHADER_LOC_MATRIX_NORMAL vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ RL_SHADER_LOC_MATRIX_NORMAL, \/\/ Shader location: matrix uniform: normal$/;" e enum:__anon1f68b8bd0703 +RL_SHADER_LOC_MATRIX_PROJECTION vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ RL_SHADER_LOC_MATRIX_PROJECTION, \/\/ Shader location: matrix uniform: projection$/;" e enum:__anon1f68b8bd0703 +RL_SHADER_LOC_MATRIX_VIEW vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ RL_SHADER_LOC_MATRIX_VIEW, \/\/ Shader location: matrix uniform: view (camera trans/;" e enum:__anon1f68b8bd0703 +RL_SHADER_LOC_VECTOR_VIEW vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ RL_SHADER_LOC_VECTOR_VIEW, \/\/ Shader location: vector uniform: view$/;" e enum:__anon1f68b8bd0703 +RL_SHADER_LOC_VERTEX_COLOR vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ RL_SHADER_LOC_VERTEX_COLOR, \/\/ Shader location: vertex attribute: color$/;" e enum:__anon1f68b8bd0703 +RL_SHADER_LOC_VERTEX_NORMAL vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ RL_SHADER_LOC_VERTEX_NORMAL, \/\/ Shader location: vertex attribute: normal$/;" e enum:__anon1f68b8bd0703 +RL_SHADER_LOC_VERTEX_POSITION vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ RL_SHADER_LOC_VERTEX_POSITION = 0, \/\/ Shader location: vertex attribute: position$/;" e enum:__anon1f68b8bd0703 +RL_SHADER_LOC_VERTEX_TANGENT vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ RL_SHADER_LOC_VERTEX_TANGENT, \/\/ Shader location: vertex attribute: tangent$/;" e enum:__anon1f68b8bd0703 +RL_SHADER_LOC_VERTEX_TEXCOORD01 vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ RL_SHADER_LOC_VERTEX_TEXCOORD01, \/\/ Shader location: vertex attribute: texcoord01$/;" e enum:__anon1f68b8bd0703 +RL_SHADER_LOC_VERTEX_TEXCOORD02 vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ RL_SHADER_LOC_VERTEX_TEXCOORD02, \/\/ Shader location: vertex attribute: texcoord02$/;" e enum:__anon1f68b8bd0703 +RL_SHADER_UNIFORM_FLOAT vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ RL_SHADER_UNIFORM_FLOAT = 0, \/\/ Shader uniform type: float$/;" e enum:__anon1f68b8bd0803 +RL_SHADER_UNIFORM_INT vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ RL_SHADER_UNIFORM_INT, \/\/ Shader uniform type: int$/;" e enum:__anon1f68b8bd0803 +RL_SHADER_UNIFORM_IVEC2 vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ RL_SHADER_UNIFORM_IVEC2, \/\/ Shader uniform type: ivec2 (2 int)$/;" e enum:__anon1f68b8bd0803 +RL_SHADER_UNIFORM_IVEC3 vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ RL_SHADER_UNIFORM_IVEC3, \/\/ Shader uniform type: ivec3 (3 int)$/;" e enum:__anon1f68b8bd0803 +RL_SHADER_UNIFORM_IVEC4 vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ RL_SHADER_UNIFORM_IVEC4, \/\/ Shader uniform type: ivec4 (4 int)$/;" e enum:__anon1f68b8bd0803 +RL_SHADER_UNIFORM_SAMPLER2D vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ RL_SHADER_UNIFORM_SAMPLER2D \/\/ Shader uniform type: sampler2d$/;" e enum:__anon1f68b8bd0803 +RL_SHADER_UNIFORM_UINT vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ RL_SHADER_UNIFORM_UINT, \/\/ Shader uniform type: unsigned int$/;" e enum:__anon1f68b8bd0803 +RL_SHADER_UNIFORM_UIVEC2 vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ RL_SHADER_UNIFORM_UIVEC2, \/\/ Shader uniform type: uivec2 (2 unsigned int)$/;" e enum:__anon1f68b8bd0803 +RL_SHADER_UNIFORM_UIVEC3 vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ RL_SHADER_UNIFORM_UIVEC3, \/\/ Shader uniform type: uivec3 (3 unsigned int)$/;" e enum:__anon1f68b8bd0803 +RL_SHADER_UNIFORM_UIVEC4 vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ RL_SHADER_UNIFORM_UIVEC4, \/\/ Shader uniform type: uivec4 (4 unsigned int)$/;" e enum:__anon1f68b8bd0803 +RL_SHADER_UNIFORM_VEC2 vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ RL_SHADER_UNIFORM_VEC2, \/\/ Shader uniform type: vec2 (2 float)$/;" e enum:__anon1f68b8bd0803 +RL_SHADER_UNIFORM_VEC3 vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ RL_SHADER_UNIFORM_VEC3, \/\/ Shader uniform type: vec3 (3 float)$/;" e enum:__anon1f68b8bd0803 +RL_SHADER_UNIFORM_VEC4 vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ RL_SHADER_UNIFORM_VEC4, \/\/ Shader uniform type: vec4 (4 float)$/;" e enum:__anon1f68b8bd0803 +RL_SRC_ALPHA vendor/raylib-5.5_linux_amd64/include/rlgl.h /^#define RL_SRC_ALPHA /;" d +RL_SRC_ALPHA_SATURATE vendor/raylib-5.5_linux_amd64/include/rlgl.h /^#define RL_SRC_ALPHA_SATURATE /;" d +RL_SRC_COLOR vendor/raylib-5.5_linux_amd64/include/rlgl.h /^#define RL_SRC_COLOR /;" d +RL_STATIC_COPY vendor/raylib-5.5_linux_amd64/include/rlgl.h /^#define RL_STATIC_COPY /;" d +RL_STATIC_DRAW vendor/raylib-5.5_linux_amd64/include/rlgl.h /^#define RL_STATIC_DRAW /;" d +RL_STATIC_READ vendor/raylib-5.5_linux_amd64/include/rlgl.h /^#define RL_STATIC_READ /;" d +RL_STREAM_COPY vendor/raylib-5.5_linux_amd64/include/rlgl.h /^#define RL_STREAM_COPY /;" d +RL_STREAM_DRAW vendor/raylib-5.5_linux_amd64/include/rlgl.h /^#define RL_STREAM_DRAW /;" d +RL_STREAM_READ vendor/raylib-5.5_linux_amd64/include/rlgl.h /^#define RL_STREAM_READ /;" d +RL_TEXTURE vendor/raylib-5.5_linux_amd64/include/rlgl.h /^#define RL_TEXTURE /;" d +RL_TEXTURE_FILTER_ANISOTROPIC vendor/raylib-5.5_linux_amd64/include/rlgl.h /^#define RL_TEXTURE_FILTER_ANISOTROPIC /;" d +RL_TEXTURE_FILTER_ANISOTROPIC_16X vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ RL_TEXTURE_FILTER_ANISOTROPIC_16X, \/\/ Anisotropic filtering 16x$/;" e enum:__anon1f68b8bd0503 +RL_TEXTURE_FILTER_ANISOTROPIC_4X vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ RL_TEXTURE_FILTER_ANISOTROPIC_4X, \/\/ Anisotropic filtering 4x$/;" e enum:__anon1f68b8bd0503 +RL_TEXTURE_FILTER_ANISOTROPIC_8X vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ RL_TEXTURE_FILTER_ANISOTROPIC_8X, \/\/ Anisotropic filtering 8x$/;" e enum:__anon1f68b8bd0503 +RL_TEXTURE_FILTER_BILINEAR vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ RL_TEXTURE_FILTER_BILINEAR, \/\/ Linear filtering$/;" e enum:__anon1f68b8bd0503 +RL_TEXTURE_FILTER_LINEAR vendor/raylib-5.5_linux_amd64/include/rlgl.h /^#define RL_TEXTURE_FILTER_LINEAR /;" d +RL_TEXTURE_FILTER_LINEAR_MIP_NEAREST vendor/raylib-5.5_linux_amd64/include/rlgl.h /^#define RL_TEXTURE_FILTER_LINEAR_MIP_NEAREST /;" d +RL_TEXTURE_FILTER_MIP_LINEAR vendor/raylib-5.5_linux_amd64/include/rlgl.h /^#define RL_TEXTURE_FILTER_MIP_LINEAR /;" d +RL_TEXTURE_FILTER_MIP_NEAREST vendor/raylib-5.5_linux_amd64/include/rlgl.h /^#define RL_TEXTURE_FILTER_MIP_NEAREST /;" d +RL_TEXTURE_FILTER_NEAREST vendor/raylib-5.5_linux_amd64/include/rlgl.h /^#define RL_TEXTURE_FILTER_NEAREST /;" d +RL_TEXTURE_FILTER_NEAREST_MIP_LINEAR vendor/raylib-5.5_linux_amd64/include/rlgl.h /^#define RL_TEXTURE_FILTER_NEAREST_MIP_LINEAR /;" d +RL_TEXTURE_FILTER_POINT vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ RL_TEXTURE_FILTER_POINT = 0, \/\/ No filter, just pixel approximation$/;" e enum:__anon1f68b8bd0503 +RL_TEXTURE_FILTER_TRILINEAR vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ RL_TEXTURE_FILTER_TRILINEAR, \/\/ Trilinear filtering (linear with mipmaps)$/;" e enum:__anon1f68b8bd0503 +RL_TEXTURE_MAG_FILTER vendor/raylib-5.5_linux_amd64/include/rlgl.h /^#define RL_TEXTURE_MAG_FILTER /;" d +RL_TEXTURE_MIN_FILTER vendor/raylib-5.5_linux_amd64/include/rlgl.h /^#define RL_TEXTURE_MIN_FILTER /;" d +RL_TEXTURE_MIPMAP_BIAS_RATIO vendor/raylib-5.5_linux_amd64/include/rlgl.h /^#define RL_TEXTURE_MIPMAP_BIAS_RATIO /;" d +RL_TEXTURE_WRAP_CLAMP vendor/raylib-5.5_linux_amd64/include/rlgl.h /^#define RL_TEXTURE_WRAP_CLAMP /;" d +RL_TEXTURE_WRAP_MIRROR_CLAMP vendor/raylib-5.5_linux_amd64/include/rlgl.h /^#define RL_TEXTURE_WRAP_MIRROR_CLAMP /;" d +RL_TEXTURE_WRAP_MIRROR_REPEAT vendor/raylib-5.5_linux_amd64/include/rlgl.h /^#define RL_TEXTURE_WRAP_MIRROR_REPEAT /;" d +RL_TEXTURE_WRAP_REPEAT vendor/raylib-5.5_linux_amd64/include/rlgl.h /^#define RL_TEXTURE_WRAP_REPEAT /;" d +RL_TEXTURE_WRAP_S vendor/raylib-5.5_linux_amd64/include/rlgl.h /^#define RL_TEXTURE_WRAP_S /;" d +RL_TEXTURE_WRAP_T vendor/raylib-5.5_linux_amd64/include/rlgl.h /^#define RL_TEXTURE_WRAP_T /;" d +RL_TRIANGLES vendor/raylib-5.5_linux_amd64/include/rlgl.h /^#define RL_TRIANGLES /;" d +RL_UNSIGNED_BYTE vendor/raylib-5.5_linux_amd64/include/rlgl.h /^#define RL_UNSIGNED_BYTE /;" d +RL_VECTOR2_TYPE vendor/raylib-5.5_linux_amd64/include/raylib.h /^#define RL_VECTOR2_TYPE$/;" d +RL_VECTOR2_TYPE vendor/raylib-5.5_linux_amd64/include/raymath.h /^#define RL_VECTOR2_TYPE$/;" d +RL_VECTOR3_TYPE vendor/raylib-5.5_linux_amd64/include/raylib.h /^#define RL_VECTOR3_TYPE$/;" d +RL_VECTOR3_TYPE vendor/raylib-5.5_linux_amd64/include/raymath.h /^#define RL_VECTOR3_TYPE$/;" d +RL_VECTOR4_TYPE vendor/raylib-5.5_linux_amd64/include/raylib.h /^#define RL_VECTOR4_TYPE$/;" d +RL_VECTOR4_TYPE vendor/raylib-5.5_linux_amd64/include/raymath.h /^#define RL_VECTOR4_TYPE$/;" d +RL_VERTEX_SHADER vendor/raylib-5.5_linux_amd64/include/rlgl.h /^#define RL_VERTEX_SHADER /;" d +RL_ZERO vendor/raylib-5.5_linux_amd64/include/rlgl.h /^#define RL_ZERO /;" d +RM vendor/lua-5.4.8/Makefile /^RM= rm -f$/;" m +RM vendor/lua-5.4.8/src/Makefile /^RM= rm -f$/;" m +RMAPI vendor/raylib-5.5_linux_amd64/include/raymath.h /^ #define RMAPI /;" d +RMAPI vendor/raylib-5.5_linux_amd64/include/raymath.h /^ #define RMAPI /;" d +RN vendor/lua-5.4.8/src/liolib.c /^} RN;$/;" t typeref:struct:__anon9a52bfe00108 file: +RanState vendor/lua-5.4.8/src/lmathlib.c /^} RanState;$/;" t typeref:struct:__anonc6ac66720108 file: +Rand64 vendor/lua-5.4.8/src/lmathlib.c /^#define Rand64 /;" d file: +Rand64 vendor/lua-5.4.8/src/lmathlib.c /^typedef struct Rand64 {$/;" s file: +Rand64 vendor/lua-5.4.8/src/lmathlib.c /^} Rand64;$/;" t typeref:struct:Rand64 file: +Ray vendor/raylib-5.5_linux_amd64/include/raylib.h /^typedef struct Ray {$/;" s +Ray vendor/raylib-5.5_linux_amd64/include/raylib.h /^} Ray;$/;" t typeref:struct:Ray +RayCollision vendor/raylib-5.5_linux_amd64/include/raylib.h /^typedef struct RayCollision {$/;" s +RayCollision vendor/raylib-5.5_linux_amd64/include/raylib.h /^} RayCollision;$/;" t typeref:struct:RayCollision +Rectangle vendor/raylib-5.5_linux_amd64/include/raylib.h /^typedef struct Rectangle {$/;" s +Rectangle vendor/raylib-5.5_linux_amd64/include/raylib.h /^} Rectangle;$/;" t typeref:struct:Rectangle +Remap vendor/raylib-5.5_linux_amd64/include/raymath.h /^RMAPI float Remap(float value, float inputStart, float inputEnd, float outputStart, float output/;" f typeref:typename:RMAPI float +RenderTexture vendor/raylib-5.5_linux_amd64/include/raylib.h /^typedef struct RenderTexture {$/;" s +RenderTexture vendor/raylib-5.5_linux_amd64/include/raylib.h /^} RenderTexture;$/;" t typeref:struct:RenderTexture +RenderTexture2D vendor/raylib-5.5_linux_amd64/include/raylib.h /^typedef RenderTexture RenderTexture2D;$/;" t typeref:typename:RenderTexture +RestoreWindow vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void RestoreWindow(void); \/\/ Set window state: not min/;" p typeref:typename:RLAPI void +ResumeAudioStream vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void ResumeAudioStream(AudioStream stream); \/\/ Resume audio stream$/;" p typeref:typename:RLAPI void +ResumeMusicStream vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void ResumeMusicStream(Music music); \/\/ Resume playing paused/;" p typeref:typename:RLAPI void +ResumeSound vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void ResumeSound(Sound sound); \/\/ Resume a paused sound$/;" p typeref:typename:RLAPI void +S vendor/lua-5.4.8/src/luac.c /^#define S(/;" d file: +SETARG_A vendor/lua-5.4.8/src/lopcodes.h /^#define SETARG_A(/;" d +SETARG_Ax vendor/lua-5.4.8/src/lopcodes.h /^#define SETARG_Ax(/;" d +SETARG_B vendor/lua-5.4.8/src/lopcodes.h /^#define SETARG_B(/;" d +SETARG_Bx vendor/lua-5.4.8/src/lopcodes.h /^#define SETARG_Bx(/;" d +SETARG_C vendor/lua-5.4.8/src/lopcodes.h /^#define SETARG_C(/;" d +SETARG_k vendor/lua-5.4.8/src/lopcodes.h /^#define SETARG_k(/;" d +SETARG_sBx vendor/lua-5.4.8/src/lopcodes.h /^#define SETARG_sBx(/;" d +SETARG_sJ vendor/lua-5.4.8/src/lopcodes.h /^#define SETARG_sJ(/;" d +SET_OPCODE vendor/lua-5.4.8/src/lopcodes.h /^#define SET_OPCODE(/;" d +SHADER_ATTRIB_FLOAT vendor/raylib-5.5_linux_amd64/include/raylib.h /^ SHADER_ATTRIB_FLOAT = 0, \/\/ Shader attribute type: float$/;" e enum:__anon77d6622f0c03 +SHADER_ATTRIB_VEC2 vendor/raylib-5.5_linux_amd64/include/raylib.h /^ SHADER_ATTRIB_VEC2, \/\/ Shader attribute type: vec2 (2 float)$/;" e enum:__anon77d6622f0c03 +SHADER_ATTRIB_VEC3 vendor/raylib-5.5_linux_amd64/include/raylib.h /^ SHADER_ATTRIB_VEC3, \/\/ Shader attribute type: vec3 (3 float)$/;" e enum:__anon77d6622f0c03 +SHADER_ATTRIB_VEC4 vendor/raylib-5.5_linux_amd64/include/raylib.h /^ SHADER_ATTRIB_VEC4 \/\/ Shader attribute type: vec4 (4 float)$/;" e enum:__anon77d6622f0c03 +SHADER_LOC_BONE_MATRICES vendor/raylib-5.5_linux_amd64/include/raylib.h /^ SHADER_LOC_BONE_MATRICES \/\/ Shader location: array of matrices uniform: boneMatrice/;" e enum:__anon77d6622f0a03 +SHADER_LOC_COLOR_AMBIENT vendor/raylib-5.5_linux_amd64/include/raylib.h /^ SHADER_LOC_COLOR_AMBIENT, \/\/ Shader location: vector uniform: ambient color$/;" e enum:__anon77d6622f0a03 +SHADER_LOC_COLOR_DIFFUSE vendor/raylib-5.5_linux_amd64/include/raylib.h /^ SHADER_LOC_COLOR_DIFFUSE, \/\/ Shader location: vector uniform: diffuse color$/;" e enum:__anon77d6622f0a03 +SHADER_LOC_COLOR_SPECULAR vendor/raylib-5.5_linux_amd64/include/raylib.h /^ SHADER_LOC_COLOR_SPECULAR, \/\/ Shader location: vector uniform: specular color$/;" e enum:__anon77d6622f0a03 +SHADER_LOC_MAP_ALBEDO vendor/raylib-5.5_linux_amd64/include/raylib.h /^ SHADER_LOC_MAP_ALBEDO, \/\/ Shader location: sampler2d texture: albedo (same as: SH/;" e enum:__anon77d6622f0a03 +SHADER_LOC_MAP_BRDF vendor/raylib-5.5_linux_amd64/include/raylib.h /^ SHADER_LOC_MAP_BRDF, \/\/ Shader location: sampler2d texture: brdf$/;" e enum:__anon77d6622f0a03 +SHADER_LOC_MAP_CUBEMAP vendor/raylib-5.5_linux_amd64/include/raylib.h /^ SHADER_LOC_MAP_CUBEMAP, \/\/ Shader location: samplerCube texture: cubemap$/;" e enum:__anon77d6622f0a03 +SHADER_LOC_MAP_DIFFUSE vendor/raylib-5.5_linux_amd64/include/raylib.h /^#define SHADER_LOC_MAP_DIFFUSE /;" d +SHADER_LOC_MAP_EMISSION vendor/raylib-5.5_linux_amd64/include/raylib.h /^ SHADER_LOC_MAP_EMISSION, \/\/ Shader location: sampler2d texture: emission$/;" e enum:__anon77d6622f0a03 +SHADER_LOC_MAP_HEIGHT vendor/raylib-5.5_linux_amd64/include/raylib.h /^ SHADER_LOC_MAP_HEIGHT, \/\/ Shader location: sampler2d texture: height$/;" e enum:__anon77d6622f0a03 +SHADER_LOC_MAP_IRRADIANCE vendor/raylib-5.5_linux_amd64/include/raylib.h /^ SHADER_LOC_MAP_IRRADIANCE, \/\/ Shader location: samplerCube texture: irradiance$/;" e enum:__anon77d6622f0a03 +SHADER_LOC_MAP_METALNESS vendor/raylib-5.5_linux_amd64/include/raylib.h /^ SHADER_LOC_MAP_METALNESS, \/\/ Shader location: sampler2d texture: metalness (same as:/;" e enum:__anon77d6622f0a03 +SHADER_LOC_MAP_NORMAL vendor/raylib-5.5_linux_amd64/include/raylib.h /^ SHADER_LOC_MAP_NORMAL, \/\/ Shader location: sampler2d texture: normal$/;" e enum:__anon77d6622f0a03 +SHADER_LOC_MAP_OCCLUSION vendor/raylib-5.5_linux_amd64/include/raylib.h /^ SHADER_LOC_MAP_OCCLUSION, \/\/ Shader location: sampler2d texture: occlusion$/;" e enum:__anon77d6622f0a03 +SHADER_LOC_MAP_PREFILTER vendor/raylib-5.5_linux_amd64/include/raylib.h /^ SHADER_LOC_MAP_PREFILTER, \/\/ Shader location: samplerCube texture: prefilter$/;" e enum:__anon77d6622f0a03 +SHADER_LOC_MAP_ROUGHNESS vendor/raylib-5.5_linux_amd64/include/raylib.h /^ SHADER_LOC_MAP_ROUGHNESS, \/\/ Shader location: sampler2d texture: roughness$/;" e enum:__anon77d6622f0a03 +SHADER_LOC_MAP_SPECULAR vendor/raylib-5.5_linux_amd64/include/raylib.h /^#define SHADER_LOC_MAP_SPECULAR /;" d +SHADER_LOC_MATRIX_MODEL vendor/raylib-5.5_linux_amd64/include/raylib.h /^ SHADER_LOC_MATRIX_MODEL, \/\/ Shader location: matrix uniform: model (transform)$/;" e enum:__anon77d6622f0a03 +SHADER_LOC_MATRIX_MVP vendor/raylib-5.5_linux_amd64/include/raylib.h /^ SHADER_LOC_MATRIX_MVP, \/\/ Shader location: matrix uniform: model-view-projection$/;" e enum:__anon77d6622f0a03 +SHADER_LOC_MATRIX_NORMAL vendor/raylib-5.5_linux_amd64/include/raylib.h /^ SHADER_LOC_MATRIX_NORMAL, \/\/ Shader location: matrix uniform: normal$/;" e enum:__anon77d6622f0a03 +SHADER_LOC_MATRIX_PROJECTION vendor/raylib-5.5_linux_amd64/include/raylib.h /^ SHADER_LOC_MATRIX_PROJECTION, \/\/ Shader location: matrix uniform: projection$/;" e enum:__anon77d6622f0a03 +SHADER_LOC_MATRIX_VIEW vendor/raylib-5.5_linux_amd64/include/raylib.h /^ SHADER_LOC_MATRIX_VIEW, \/\/ Shader location: matrix uniform: view (camera transform/;" e enum:__anon77d6622f0a03 +SHADER_LOC_VECTOR_VIEW vendor/raylib-5.5_linux_amd64/include/raylib.h /^ SHADER_LOC_VECTOR_VIEW, \/\/ Shader location: vector uniform: view$/;" e enum:__anon77d6622f0a03 +SHADER_LOC_VERTEX_BONEIDS vendor/raylib-5.5_linux_amd64/include/raylib.h /^ SHADER_LOC_VERTEX_BONEIDS, \/\/ Shader location: vertex attribute: boneIds$/;" e enum:__anon77d6622f0a03 +SHADER_LOC_VERTEX_BONEWEIGHTS vendor/raylib-5.5_linux_amd64/include/raylib.h /^ SHADER_LOC_VERTEX_BONEWEIGHTS, \/\/ Shader location: vertex attribute: boneWeights$/;" e enum:__anon77d6622f0a03 +SHADER_LOC_VERTEX_COLOR vendor/raylib-5.5_linux_amd64/include/raylib.h /^ SHADER_LOC_VERTEX_COLOR, \/\/ Shader location: vertex attribute: color$/;" e enum:__anon77d6622f0a03 +SHADER_LOC_VERTEX_NORMAL vendor/raylib-5.5_linux_amd64/include/raylib.h /^ SHADER_LOC_VERTEX_NORMAL, \/\/ Shader location: vertex attribute: normal$/;" e enum:__anon77d6622f0a03 +SHADER_LOC_VERTEX_POSITION vendor/raylib-5.5_linux_amd64/include/raylib.h /^ SHADER_LOC_VERTEX_POSITION = 0, \/\/ Shader location: vertex attribute: position$/;" e enum:__anon77d6622f0a03 +SHADER_LOC_VERTEX_TANGENT vendor/raylib-5.5_linux_amd64/include/raylib.h /^ SHADER_LOC_VERTEX_TANGENT, \/\/ Shader location: vertex attribute: tangent$/;" e enum:__anon77d6622f0a03 +SHADER_LOC_VERTEX_TEXCOORD01 vendor/raylib-5.5_linux_amd64/include/raylib.h /^ SHADER_LOC_VERTEX_TEXCOORD01, \/\/ Shader location: vertex attribute: texcoord01$/;" e enum:__anon77d6622f0a03 +SHADER_LOC_VERTEX_TEXCOORD02 vendor/raylib-5.5_linux_amd64/include/raylib.h /^ SHADER_LOC_VERTEX_TEXCOORD02, \/\/ Shader location: vertex attribute: texcoord02$/;" e enum:__anon77d6622f0a03 +SHADER_UNIFORM_FLOAT vendor/raylib-5.5_linux_amd64/include/raylib.h /^ SHADER_UNIFORM_FLOAT = 0, \/\/ Shader uniform type: float$/;" e enum:__anon77d6622f0b03 +SHADER_UNIFORM_INT vendor/raylib-5.5_linux_amd64/include/raylib.h /^ SHADER_UNIFORM_INT, \/\/ Shader uniform type: int$/;" e enum:__anon77d6622f0b03 +SHADER_UNIFORM_IVEC2 vendor/raylib-5.5_linux_amd64/include/raylib.h /^ SHADER_UNIFORM_IVEC2, \/\/ Shader uniform type: ivec2 (2 int)$/;" e enum:__anon77d6622f0b03 +SHADER_UNIFORM_IVEC3 vendor/raylib-5.5_linux_amd64/include/raylib.h /^ SHADER_UNIFORM_IVEC3, \/\/ Shader uniform type: ivec3 (3 int)$/;" e enum:__anon77d6622f0b03 +SHADER_UNIFORM_IVEC4 vendor/raylib-5.5_linux_amd64/include/raylib.h /^ SHADER_UNIFORM_IVEC4, \/\/ Shader uniform type: ivec4 (4 int)$/;" e enum:__anon77d6622f0b03 +SHADER_UNIFORM_SAMPLER2D vendor/raylib-5.5_linux_amd64/include/raylib.h /^ SHADER_UNIFORM_SAMPLER2D \/\/ Shader uniform type: sampler2d$/;" e enum:__anon77d6622f0b03 +SHADER_UNIFORM_VEC2 vendor/raylib-5.5_linux_amd64/include/raylib.h /^ SHADER_UNIFORM_VEC2, \/\/ Shader uniform type: vec2 (2 float)$/;" e enum:__anon77d6622f0b03 +SHADER_UNIFORM_VEC3 vendor/raylib-5.5_linux_amd64/include/raylib.h /^ SHADER_UNIFORM_VEC3, \/\/ Shader uniform type: vec3 (3 float)$/;" e enum:__anon77d6622f0b03 +SHADER_UNIFORM_VEC4 vendor/raylib-5.5_linux_amd64/include/raylib.h /^ SHADER_UNIFORM_VEC4, \/\/ Shader uniform type: vec4 (4 float)$/;" e enum:__anon77d6622f0b03 +SIZELENMOD vendor/lua-5.4.8/src/lstrlib.c /^#define SIZELENMOD /;" d file: +SIZETIMEFMT vendor/lua-5.4.8/src/loslib.c /^#define SIZETIMEFMT /;" d file: +SIZE_A vendor/lua-5.4.8/src/lopcodes.h /^#define SIZE_A /;" d +SIZE_Ax vendor/lua-5.4.8/src/lopcodes.h /^#define SIZE_Ax /;" d +SIZE_B vendor/lua-5.4.8/src/lopcodes.h /^#define SIZE_B /;" d +SIZE_Bx vendor/lua-5.4.8/src/lopcodes.h /^#define SIZE_Bx /;" d +SIZE_C vendor/lua-5.4.8/src/lopcodes.h /^#define SIZE_C /;" d +SIZE_OP vendor/lua-5.4.8/src/lopcodes.h /^#define SIZE_OP /;" d +SIZE_sJ vendor/lua-5.4.8/src/lopcodes.h /^#define SIZE_sJ /;" d +SKYBLUE vendor/raylib-5.5_linux_amd64/include/raylib.h /^#define SKYBLUE /;" d +SPACEBIT vendor/lua-5.4.8/src/lctype.h /^#define SPACEBIT /;" d +SPACECHARS vendor/lua-5.4.8/src/lbaselib.c /^#define SPACECHARS /;" d file: +SPECIALS vendor/lua-5.4.8/src/lstrlib.c /^#define SPECIALS /;" d file: +SParser vendor/lua-5.4.8/src/ldo.c /^struct SParser { \/* data to 'f_parser' *\/$/;" s file: +SRand64 vendor/lua-5.4.8/src/lmathlib.c /^#define SRand64 /;" d file: +SS vendor/lua-5.4.8/src/luac.c /^#define SS(/;" d file: +STRCACHE_M vendor/lua-5.4.8/src/llimits.h /^#define STRCACHE_M /;" d +STRCACHE_N vendor/lua-5.4.8/src/llimits.h /^#define STRCACHE_N /;" d +SYSCFLAGS vendor/lua-5.4.8/src/Makefile /^SYSCFLAGS=$/;" m +SYSLDFLAGS vendor/lua-5.4.8/src/Makefile /^SYSLDFLAGS=$/;" m +SYSLIBS vendor/lua-5.4.8/src/Makefile /^SYSLIBS=$/;" m +SZINT vendor/lua-5.4.8/src/lstrlib.c /^#define SZINT /;" d file: +SaveFileData vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI bool SaveFileData(const char *fileName, void *data, int dataSize); \/\/ Save data to file /;" p typeref:typename:RLAPI bool +SaveFileDataCallback vendor/raylib-5.5_linux_amd64/include/raylib.h /^typedef bool (*SaveFileDataCallback)(const char *fileName, void *data, int dataSize); \/\/ Fil/;" t typeref:typename:bool (*)(const char * fileName,void * data,int dataSize) +SaveFileText vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI bool SaveFileText(const char *fileName, char *text); \/\/ Save text data to file (w/;" p typeref:typename:RLAPI bool +SaveFileTextCallback vendor/raylib-5.5_linux_amd64/include/raylib.h /^typedef bool (*SaveFileTextCallback)(const char *fileName, char *text); \/\/ FileIO: Save text d/;" t typeref:typename:bool (*)(const char * fileName,char * text) +SeekMusicStream vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void SeekMusicStream(Music music, float position); \/\/ Seek music to a posit/;" p typeref:typename:RLAPI void +SemInfo vendor/lua-5.4.8/src/llex.h /^} SemInfo; \/* semantics information *\/$/;" t typeref:union:__anonfc1a02ff010a +SetAudioStreamBufferSizeDefault vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void SetAudioStreamBufferSizeDefault(int size); \/\/ Default size for new /;" p typeref:typename:RLAPI void +SetAudioStreamCallback vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void SetAudioStreamCallback(AudioStream stream, AudioCallback callback); \/\/ Audio thread/;" p typeref:typename:RLAPI void +SetAudioStreamPan vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void SetAudioStreamPan(AudioStream stream, float pan); \/\/ Set pan for audio str/;" p typeref:typename:RLAPI void +SetAudioStreamPitch vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void SetAudioStreamPitch(AudioStream stream, float pitch); \/\/ Set pitch for audio s/;" p typeref:typename:RLAPI void +SetAudioStreamVolume vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void SetAudioStreamVolume(AudioStream stream, float volume); \/\/ Set volume for audio /;" p typeref:typename:RLAPI void +SetAutomationEventBaseFrame vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void SetAutomationEventBaseFrame(int frame); \/\/ Set/;" p typeref:typename:RLAPI void +SetAutomationEventList vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void SetAutomationEventList(AutomationEventList *list); \/\/ Set/;" p typeref:typename:RLAPI void +SetClipboardText vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void SetClipboardText(const char *text); \/\/ Set clipboard text conten/;" p typeref:typename:RLAPI void +SetConfigFlags vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void SetConfigFlags(unsigned int flags); \/\/ Setup init configuration /;" p typeref:typename:RLAPI void +SetExitKey vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void SetExitKey(int key); \/\/ Set a custom key to exit prog/;" p typeref:typename:RLAPI void +SetGamepadMappings vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI int SetGamepadMappings(const char *mappings); \/\/ Set inte/;" p typeref:typename:RLAPI int +SetGamepadVibration vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void SetGamepadVibration(int gamepad, float leftMotor, float rightMotor, float duration); /;" p typeref:typename:RLAPI void +SetGesturesEnabled vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void SetGesturesEnabled(unsigned int flags); \/\/ Enable a set of gestures using flag/;" p typeref:typename:RLAPI void +SetLoadFileDataCallback vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void SetLoadFileDataCallback(LoadFileDataCallback callback); \/\/ Set custom file binary d/;" p typeref:typename:RLAPI void +SetLoadFileTextCallback vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void SetLoadFileTextCallback(LoadFileTextCallback callback); \/\/ Set custom file text dat/;" p typeref:typename:RLAPI void +SetMasterVolume vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void SetMasterVolume(float volume); \/\/ Set master volume (li/;" p typeref:typename:RLAPI void +SetMaterialTexture vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void SetMaterialTexture(Material *material, int mapType, Texture2D texture); \/\//;" p typeref:typename:RLAPI void +SetModelMeshMaterial vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void SetModelMeshMaterial(Model *model, int meshId, int materialId); \/\//;" p typeref:typename:RLAPI void +SetMouseCursor vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void SetMouseCursor(int cursor); \/\/ Set mouse cursor$/;" p typeref:typename:RLAPI void +SetMouseOffset vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void SetMouseOffset(int offsetX, int offsetY); \/\/ Set mouse offset$/;" p typeref:typename:RLAPI void +SetMousePosition vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void SetMousePosition(int x, int y); \/\/ Set mouse position XY$/;" p typeref:typename:RLAPI void +SetMouseScale vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void SetMouseScale(float scaleX, float scaleY); \/\/ Set mouse scaling$/;" p typeref:typename:RLAPI void +SetMusicPan vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void SetMusicPan(Music music, float pan); \/\/ Set pan for a music (/;" p typeref:typename:RLAPI void +SetMusicPitch vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void SetMusicPitch(Music music, float pitch); \/\/ Set pitch for a music/;" p typeref:typename:RLAPI void +SetMusicVolume vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void SetMusicVolume(Music music, float volume); \/\/ Set volume for music /;" p typeref:typename:RLAPI void +SetPixelColor vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void SetPixelColor(void *dstPtr, Color color, int format); \/\/ Set color forma/;" p typeref:typename:RLAPI void +SetRandomSeed vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void SetRandomSeed(unsigned int seed); \/\/ Set the seed for the rand/;" p typeref:typename:RLAPI void +SetSaveFileDataCallback vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void SetSaveFileDataCallback(SaveFileDataCallback callback); \/\/ Set custom file binary d/;" p typeref:typename:RLAPI void +SetSaveFileTextCallback vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void SetSaveFileTextCallback(SaveFileTextCallback callback); \/\/ Set custom file text dat/;" p typeref:typename:RLAPI void +SetShaderValue vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void SetShaderValue(Shader shader, int locIndex, const void *value, int uniformType); /;" p typeref:typename:RLAPI void +SetShaderValueMatrix vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void SetShaderValueMatrix(Shader shader, int locIndex, Matrix mat); \/\/ Set shade/;" p typeref:typename:RLAPI void +SetShaderValueTexture vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void SetShaderValueTexture(Shader shader, int locIndex, Texture2D texture); \/\/ Set shade/;" p typeref:typename:RLAPI void +SetShaderValueV vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void SetShaderValueV(Shader shader, int locIndex, const void *value, int uniformType, int /;" p typeref:typename:RLAPI void +SetShapesTexture vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void SetShapesTexture(Texture2D texture, Rectangle source); \/\/ Set texture and rec/;" p typeref:typename:RLAPI void +SetSoundPan vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void SetSoundPan(Sound sound, float pan); \/\/ Set pan for a sound (/;" p typeref:typename:RLAPI void +SetSoundPitch vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void SetSoundPitch(Sound sound, float pitch); \/\/ Set pitch for a sound/;" p typeref:typename:RLAPI void +SetSoundVolume vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void SetSoundVolume(Sound sound, float volume); \/\/ Set volume for a soun/;" p typeref:typename:RLAPI void +SetTargetFPS vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void SetTargetFPS(int fps); \/\/ Set target FPS (maximum)$/;" p typeref:typename:RLAPI void +SetTextLineSpacing vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void SetTextLineSpacing(int spacing); \/\//;" p typeref:typename:RLAPI void +SetTextureFilter vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void SetTextureFilter(Texture2D texture, int filter); /;" p typeref:typename:RLAPI void +SetTextureWrap vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void SetTextureWrap(Texture2D texture, int wrap); /;" p typeref:typename:RLAPI void +SetTraceLogCallback vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void SetTraceLogCallback(TraceLogCallback callback); \/\/ Set custom trace log$/;" p typeref:typename:RLAPI void +SetTraceLogLevel vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void SetTraceLogLevel(int logLevel); \/\/ Set the current threshold/;" p typeref:typename:RLAPI void +SetWindowFocused vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void SetWindowFocused(void); \/\/ Set window focused$/;" p typeref:typename:RLAPI void +SetWindowIcon vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void SetWindowIcon(Image image); \/\/ Set icon for window (sing/;" p typeref:typename:RLAPI void +SetWindowIcons vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void SetWindowIcons(Image *images, int count); \/\/ Set icon for window (mult/;" p typeref:typename:RLAPI void +SetWindowMaxSize vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void SetWindowMaxSize(int width, int height); \/\/ Set window maximum dimens/;" p typeref:typename:RLAPI void +SetWindowMinSize vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void SetWindowMinSize(int width, int height); \/\/ Set window minimum dimens/;" p typeref:typename:RLAPI void +SetWindowMonitor vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void SetWindowMonitor(int monitor); \/\/ Set monitor for the curre/;" p typeref:typename:RLAPI void +SetWindowOpacity vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void SetWindowOpacity(float opacity); \/\/ Set window opacity [0.0f./;" p typeref:typename:RLAPI void +SetWindowPosition vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void SetWindowPosition(int x, int y); \/\/ Set window position on sc/;" p typeref:typename:RLAPI void +SetWindowSize vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void SetWindowSize(int width, int height); \/\/ Set window dimensions$/;" p typeref:typename:RLAPI void +SetWindowState vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void SetWindowState(unsigned int flags); \/\/ Set window configuration /;" p typeref:typename:RLAPI void +SetWindowTitle vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void SetWindowTitle(const char *title); \/\/ Set title for window$/;" p typeref:typename:RLAPI void +Setup raylib with multiple IDEs vendor/raylib-5.5_linux_amd64/README.md /^#### Setup raylib with multiple IDEs$/;" t section:build and installation +Shader vendor/raylib-5.5_linux_amd64/include/raylib.h /^typedef struct Shader {$/;" s +Shader vendor/raylib-5.5_linux_amd64/include/raylib.h /^} Shader;$/;" t typeref:struct:Shader +ShaderAttributeDataType vendor/raylib-5.5_linux_amd64/include/raylib.h /^} ShaderAttributeDataType;$/;" t typeref:enum:__anon77d6622f0c03 +ShaderLocationIndex vendor/raylib-5.5_linux_amd64/include/raylib.h /^} ShaderLocationIndex;$/;" t typeref:enum:__anon77d6622f0a03 +ShaderUniformDataType vendor/raylib-5.5_linux_amd64/include/raylib.h /^} ShaderUniformDataType;$/;" t typeref:enum:__anon77d6622f0b03 +ShowCursor vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void ShowCursor(void); \/\/ Shows cursor$/;" p typeref:typename:RLAPI void +Sound vendor/raylib-5.5_linux_amd64/include/raylib.h /^typedef struct Sound {$/;" s +Sound vendor/raylib-5.5_linux_amd64/include/raylib.h /^} Sound;$/;" t typeref:struct:Sound +StackValue vendor/lua-5.4.8/src/lobject.h /^typedef union StackValue {$/;" u +StackValue vendor/lua-5.4.8/src/lobject.h /^} StackValue;$/;" t typeref:union:StackValue +StartAutomationEventRecording vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void StartAutomationEventRecording(void); \/\/ Sta/;" p typeref:typename:RLAPI void +State vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ } State; \/\/ Renderer state$/;" m struct:rlglData typeref:struct:rlglData::__anon1f68b8bd0d08 +StkId vendor/lua-5.4.8/src/lobject.h /^typedef StackValue *StkId;$/;" t typeref:typename:StackValue * +StkIdRel vendor/lua-5.4.8/src/lobject.h /^} StkIdRel;$/;" t typeref:union:__anon808f9fcd020a +StopAudioStream vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void StopAudioStream(AudioStream stream); \/\/ Stop audio stream$/;" p typeref:typename:RLAPI void +StopAutomationEventRecording vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void StopAutomationEventRecording(void); \/\/ Sto/;" p typeref:typename:RLAPI void +StopMusicStream vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void StopMusicStream(Music music); \/\/ Stop music playing$/;" p typeref:typename:RLAPI void +StopSound vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void StopSound(Sound sound); \/\/ Stop playing a sound$/;" p typeref:typename:RLAPI void +SunOS vendor/lua-5.4.8/src/Makefile /^SunOS solaris:$/;" t +SwapScreenBuffer vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void SwapScreenBuffer(void); \/\/ Swap back buffer with fro/;" p typeref:typename:RLAPI void +TAB_L vendor/lua-5.4.8/src/ltablib.c /^#define TAB_L /;" d file: +TAB_R vendor/lua-5.4.8/src/ltablib.c /^#define TAB_R /;" d file: +TAB_RW vendor/lua-5.4.8/src/ltablib.c /^#define TAB_RW /;" d file: +TAB_W vendor/lua-5.4.8/src/ltablib.c /^#define TAB_W /;" d file: +TESTARG_k vendor/lua-5.4.8/src/lopcodes.h /^#define TESTARG_k(/;" d +TESTBIT vendor/lua-5.4.8/src/lgc.h /^#define TESTBIT /;" d +TEXTURE_FILTER_ANISOTROPIC_16X vendor/raylib-5.5_linux_amd64/include/raylib.h /^ TEXTURE_FILTER_ANISOTROPIC_16X, \/\/ Anisotropic filtering 16x$/;" e enum:__anon77d6622f0e03 +TEXTURE_FILTER_ANISOTROPIC_4X vendor/raylib-5.5_linux_amd64/include/raylib.h /^ TEXTURE_FILTER_ANISOTROPIC_4X, \/\/ Anisotropic filtering 4x$/;" e enum:__anon77d6622f0e03 +TEXTURE_FILTER_ANISOTROPIC_8X vendor/raylib-5.5_linux_amd64/include/raylib.h /^ TEXTURE_FILTER_ANISOTROPIC_8X, \/\/ Anisotropic filtering 8x$/;" e enum:__anon77d6622f0e03 +TEXTURE_FILTER_BILINEAR vendor/raylib-5.5_linux_amd64/include/raylib.h /^ TEXTURE_FILTER_BILINEAR, \/\/ Linear filtering$/;" e enum:__anon77d6622f0e03 +TEXTURE_FILTER_POINT vendor/raylib-5.5_linux_amd64/include/raylib.h /^ TEXTURE_FILTER_POINT = 0, \/\/ No filter, just pixel approximation$/;" e enum:__anon77d6622f0e03 +TEXTURE_FILTER_TRILINEAR vendor/raylib-5.5_linux_amd64/include/raylib.h /^ TEXTURE_FILTER_TRILINEAR, \/\/ Trilinear filtering (linear with mipmaps)$/;" e enum:__anon77d6622f0e03 +TEXTURE_WRAP_CLAMP vendor/raylib-5.5_linux_amd64/include/raylib.h /^ TEXTURE_WRAP_CLAMP, \/\/ Clamps texture to edge pixel in tiled mode$/;" e enum:__anon77d6622f0f03 +TEXTURE_WRAP_MIRROR_CLAMP vendor/raylib-5.5_linux_amd64/include/raylib.h /^ TEXTURE_WRAP_MIRROR_CLAMP \/\/ Mirrors and clamps to border the texture in til/;" e enum:__anon77d6622f0f03 +TEXTURE_WRAP_MIRROR_REPEAT vendor/raylib-5.5_linux_amd64/include/raylib.h /^ TEXTURE_WRAP_MIRROR_REPEAT, \/\/ Mirrors and repeats the texture in tiled mode$/;" e enum:__anon77d6622f0f03 +TEXTURE_WRAP_REPEAT vendor/raylib-5.5_linux_amd64/include/raylib.h /^ TEXTURE_WRAP_REPEAT = 0, \/\/ Repeats texture in tiled mode$/;" e enum:__anon77d6622f0f03 +TK_AND vendor/lua-5.4.8/src/llex.h /^ TK_AND = FIRST_RESERVED, TK_BREAK,$/;" e enum:RESERVED +TK_BREAK vendor/lua-5.4.8/src/llex.h /^ TK_AND = FIRST_RESERVED, TK_BREAK,$/;" e enum:RESERVED +TK_CONCAT vendor/lua-5.4.8/src/llex.h /^ TK_IDIV, TK_CONCAT, TK_DOTS, TK_EQ, TK_GE, TK_LE, TK_NE,$/;" e enum:RESERVED +TK_DBCOLON vendor/lua-5.4.8/src/llex.h /^ TK_DBCOLON, TK_EOS,$/;" e enum:RESERVED +TK_DO vendor/lua-5.4.8/src/llex.h /^ TK_DO, TK_ELSE, TK_ELSEIF, TK_END, TK_FALSE, TK_FOR, TK_FUNCTION,$/;" e enum:RESERVED +TK_DOTS vendor/lua-5.4.8/src/llex.h /^ TK_IDIV, TK_CONCAT, TK_DOTS, TK_EQ, TK_GE, TK_LE, TK_NE,$/;" e enum:RESERVED +TK_ELSE vendor/lua-5.4.8/src/llex.h /^ TK_DO, TK_ELSE, TK_ELSEIF, TK_END, TK_FALSE, TK_FOR, TK_FUNCTION,$/;" e enum:RESERVED +TK_ELSEIF vendor/lua-5.4.8/src/llex.h /^ TK_DO, TK_ELSE, TK_ELSEIF, TK_END, TK_FALSE, TK_FOR, TK_FUNCTION,$/;" e enum:RESERVED +TK_END vendor/lua-5.4.8/src/llex.h /^ TK_DO, TK_ELSE, TK_ELSEIF, TK_END, TK_FALSE, TK_FOR, TK_FUNCTION,$/;" e enum:RESERVED +TK_EOS vendor/lua-5.4.8/src/llex.h /^ TK_DBCOLON, TK_EOS,$/;" e enum:RESERVED +TK_EQ vendor/lua-5.4.8/src/llex.h /^ TK_IDIV, TK_CONCAT, TK_DOTS, TK_EQ, TK_GE, TK_LE, TK_NE,$/;" e enum:RESERVED +TK_FALSE vendor/lua-5.4.8/src/llex.h /^ TK_DO, TK_ELSE, TK_ELSEIF, TK_END, TK_FALSE, TK_FOR, TK_FUNCTION,$/;" e enum:RESERVED +TK_FLT vendor/lua-5.4.8/src/llex.h /^ TK_FLT, TK_INT, TK_NAME, TK_STRING$/;" e enum:RESERVED +TK_FOR vendor/lua-5.4.8/src/llex.h /^ TK_DO, TK_ELSE, TK_ELSEIF, TK_END, TK_FALSE, TK_FOR, TK_FUNCTION,$/;" e enum:RESERVED +TK_FUNCTION vendor/lua-5.4.8/src/llex.h /^ TK_DO, TK_ELSE, TK_ELSEIF, TK_END, TK_FALSE, TK_FOR, TK_FUNCTION,$/;" e enum:RESERVED +TK_GE vendor/lua-5.4.8/src/llex.h /^ TK_IDIV, TK_CONCAT, TK_DOTS, TK_EQ, TK_GE, TK_LE, TK_NE,$/;" e enum:RESERVED +TK_GOTO vendor/lua-5.4.8/src/llex.h /^ TK_GOTO, TK_IF, TK_IN, TK_LOCAL, TK_NIL, TK_NOT, TK_OR, TK_REPEAT,$/;" e enum:RESERVED +TK_IDIV vendor/lua-5.4.8/src/llex.h /^ TK_IDIV, TK_CONCAT, TK_DOTS, TK_EQ, TK_GE, TK_LE, TK_NE,$/;" e enum:RESERVED +TK_IF vendor/lua-5.4.8/src/llex.h /^ TK_GOTO, TK_IF, TK_IN, TK_LOCAL, TK_NIL, TK_NOT, TK_OR, TK_REPEAT,$/;" e enum:RESERVED +TK_IN vendor/lua-5.4.8/src/llex.h /^ TK_GOTO, TK_IF, TK_IN, TK_LOCAL, TK_NIL, TK_NOT, TK_OR, TK_REPEAT,$/;" e enum:RESERVED +TK_INT vendor/lua-5.4.8/src/llex.h /^ TK_FLT, TK_INT, TK_NAME, TK_STRING$/;" e enum:RESERVED +TK_LE vendor/lua-5.4.8/src/llex.h /^ TK_IDIV, TK_CONCAT, TK_DOTS, TK_EQ, TK_GE, TK_LE, TK_NE,$/;" e enum:RESERVED +TK_LOCAL vendor/lua-5.4.8/src/llex.h /^ TK_GOTO, TK_IF, TK_IN, TK_LOCAL, TK_NIL, TK_NOT, TK_OR, TK_REPEAT,$/;" e enum:RESERVED +TK_NAME vendor/lua-5.4.8/src/llex.h /^ TK_FLT, TK_INT, TK_NAME, TK_STRING$/;" e enum:RESERVED +TK_NE vendor/lua-5.4.8/src/llex.h /^ TK_IDIV, TK_CONCAT, TK_DOTS, TK_EQ, TK_GE, TK_LE, TK_NE,$/;" e enum:RESERVED +TK_NIL vendor/lua-5.4.8/src/llex.h /^ TK_GOTO, TK_IF, TK_IN, TK_LOCAL, TK_NIL, TK_NOT, TK_OR, TK_REPEAT,$/;" e enum:RESERVED +TK_NOT vendor/lua-5.4.8/src/llex.h /^ TK_GOTO, TK_IF, TK_IN, TK_LOCAL, TK_NIL, TK_NOT, TK_OR, TK_REPEAT,$/;" e enum:RESERVED +TK_OR vendor/lua-5.4.8/src/llex.h /^ TK_GOTO, TK_IF, TK_IN, TK_LOCAL, TK_NIL, TK_NOT, TK_OR, TK_REPEAT,$/;" e enum:RESERVED +TK_REPEAT vendor/lua-5.4.8/src/llex.h /^ TK_GOTO, TK_IF, TK_IN, TK_LOCAL, TK_NIL, TK_NOT, TK_OR, TK_REPEAT,$/;" e enum:RESERVED +TK_RETURN vendor/lua-5.4.8/src/llex.h /^ TK_RETURN, TK_THEN, TK_TRUE, TK_UNTIL, TK_WHILE,$/;" e enum:RESERVED +TK_SHL vendor/lua-5.4.8/src/llex.h /^ TK_SHL, TK_SHR,$/;" e enum:RESERVED +TK_SHR vendor/lua-5.4.8/src/llex.h /^ TK_SHL, TK_SHR,$/;" e enum:RESERVED +TK_STRING vendor/lua-5.4.8/src/llex.h /^ TK_FLT, TK_INT, TK_NAME, TK_STRING$/;" e enum:RESERVED +TK_THEN vendor/lua-5.4.8/src/llex.h /^ TK_RETURN, TK_THEN, TK_TRUE, TK_UNTIL, TK_WHILE,$/;" e enum:RESERVED +TK_TRUE vendor/lua-5.4.8/src/llex.h /^ TK_RETURN, TK_THEN, TK_TRUE, TK_UNTIL, TK_WHILE,$/;" e enum:RESERVED +TK_UNTIL vendor/lua-5.4.8/src/llex.h /^ TK_RETURN, TK_THEN, TK_TRUE, TK_UNTIL, TK_WHILE,$/;" e enum:RESERVED +TK_WHILE vendor/lua-5.4.8/src/llex.h /^ TK_RETURN, TK_THEN, TK_TRUE, TK_UNTIL, TK_WHILE,$/;" e enum:RESERVED +TMS vendor/lua-5.4.8/src/ltm.h /^} TMS;$/;" t typeref:enum:__anon9b0d07770103 +TM_ADD vendor/lua-5.4.8/src/ltm.h /^ TM_ADD,$/;" e enum:__anon9b0d07770103 +TM_BAND vendor/lua-5.4.8/src/ltm.h /^ TM_BAND,$/;" e enum:__anon9b0d07770103 +TM_BNOT vendor/lua-5.4.8/src/ltm.h /^ TM_BNOT,$/;" e enum:__anon9b0d07770103 +TM_BOR vendor/lua-5.4.8/src/ltm.h /^ TM_BOR,$/;" e enum:__anon9b0d07770103 +TM_BXOR vendor/lua-5.4.8/src/ltm.h /^ TM_BXOR,$/;" e enum:__anon9b0d07770103 +TM_CALL vendor/lua-5.4.8/src/ltm.h /^ TM_CALL,$/;" e enum:__anon9b0d07770103 +TM_CLOSE vendor/lua-5.4.8/src/ltm.h /^ TM_CLOSE,$/;" e enum:__anon9b0d07770103 +TM_CONCAT vendor/lua-5.4.8/src/ltm.h /^ TM_CONCAT,$/;" e enum:__anon9b0d07770103 +TM_DIV vendor/lua-5.4.8/src/ltm.h /^ TM_DIV,$/;" e enum:__anon9b0d07770103 +TM_EQ vendor/lua-5.4.8/src/ltm.h /^ TM_EQ, \/* last tag method with fast access *\/$/;" e enum:__anon9b0d07770103 +TM_GC vendor/lua-5.4.8/src/ltm.h /^ TM_GC,$/;" e enum:__anon9b0d07770103 +TM_IDIV vendor/lua-5.4.8/src/ltm.h /^ TM_IDIV,$/;" e enum:__anon9b0d07770103 +TM_INDEX vendor/lua-5.4.8/src/ltm.h /^ TM_INDEX,$/;" e enum:__anon9b0d07770103 +TM_LE vendor/lua-5.4.8/src/ltm.h /^ TM_LE,$/;" e enum:__anon9b0d07770103 +TM_LEN vendor/lua-5.4.8/src/ltm.h /^ TM_LEN,$/;" e enum:__anon9b0d07770103 +TM_LT vendor/lua-5.4.8/src/ltm.h /^ TM_LT,$/;" e enum:__anon9b0d07770103 +TM_MOD vendor/lua-5.4.8/src/ltm.h /^ TM_MOD,$/;" e enum:__anon9b0d07770103 +TM_MODE vendor/lua-5.4.8/src/ltm.h /^ TM_MODE,$/;" e enum:__anon9b0d07770103 +TM_MUL vendor/lua-5.4.8/src/ltm.h /^ TM_MUL,$/;" e enum:__anon9b0d07770103 +TM_N vendor/lua-5.4.8/src/ltm.h /^ TM_N \/* number of elements in the enum *\/$/;" e enum:__anon9b0d07770103 +TM_NEWINDEX vendor/lua-5.4.8/src/ltm.h /^ TM_NEWINDEX,$/;" e enum:__anon9b0d07770103 +TM_POW vendor/lua-5.4.8/src/ltm.h /^ TM_POW,$/;" e enum:__anon9b0d07770103 +TM_SHL vendor/lua-5.4.8/src/ltm.h /^ TM_SHL,$/;" e enum:__anon9b0d07770103 +TM_SHR vendor/lua-5.4.8/src/ltm.h /^ TM_SHR,$/;" e enum:__anon9b0d07770103 +TM_SUB vendor/lua-5.4.8/src/ltm.h /^ TM_SUB,$/;" e enum:__anon9b0d07770103 +TM_UNM vendor/lua-5.4.8/src/ltm.h /^ TM_UNM,$/;" e enum:__anon9b0d07770103 +TO_BIN vendor/lua-5.4.8/Makefile /^TO_BIN= lua luac$/;" m +TO_INC vendor/lua-5.4.8/Makefile /^TO_INC= lua.h luaconf.h lualib.h lauxlib.h lua.hpp$/;" m +TO_LIB vendor/lua-5.4.8/Makefile /^TO_LIB= liblua.a$/;" m +TO_MAN vendor/lua-5.4.8/Makefile /^TO_MAN= lua.1 luac.1$/;" m +TRACELOG vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ #define TRACELOG(/;" d +TRACELOGD vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ #define TRACELOGD(/;" d +TString vendor/lua-5.4.8/src/lobject.h /^typedef struct TString {$/;" s +TString vendor/lua-5.4.8/src/lobject.h /^} TString;$/;" t typeref:struct:TString +TValue vendor/lua-5.4.8/src/lobject.h /^typedef struct TValue {$/;" s +TValue vendor/lua-5.4.8/src/lobject.h /^} TValue;$/;" t typeref:struct:TValue +TValuefields vendor/lua-5.4.8/src/lobject.h /^#define TValuefields /;" d +Table vendor/lua-5.4.8/src/lobject.h /^typedef struct Table {$/;" s +Table vendor/lua-5.4.8/src/lobject.h /^} Table;$/;" t typeref:struct:Table +TakeScreenshot vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void TakeScreenshot(const char *fileName); \/\/ Takes a screenshot of cur/;" p typeref:typename:RLAPI void +TextAppend vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void TextAppend(char *text, const char *append, int *position); \/\//;" p typeref:typename:RLAPI void +TextCopy vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI int TextCopy(char *dst, const char *src); \/\//;" p typeref:typename:RLAPI int +TextFindIndex vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI int TextFindIndex(const char *text, const char *find); \/\//;" p typeref:typename:RLAPI int +TextFormat vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI const char *TextFormat(const char *text, ...); \/\//;" p typeref:typename:RLAPI const char * +TextInsert vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI char *TextInsert(const char *text, const char *insert, int position); \/\//;" p typeref:typename:RLAPI char * +TextIsEqual vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI bool TextIsEqual(const char *text1, const char *text2); \/\//;" p typeref:typename:RLAPI bool +TextJoin vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI const char *TextJoin(const char **textList, int count, const char *delimiter); \/\//;" p typeref:typename:RLAPI const char * +TextLength vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI unsigned int TextLength(const char *text); \/\//;" p typeref:typename:RLAPI unsigned int +TextReplace vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI char *TextReplace(const char *text, const char *replace, const char *by); \/\//;" p typeref:typename:RLAPI char * +TextSplit vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI const char **TextSplit(const char *text, char delimiter, int *count); \/\//;" p typeref:typename:RLAPI const char ** +TextSubtext vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI const char *TextSubtext(const char *text, int position, int length); \/\//;" p typeref:typename:RLAPI const char * +TextToCamel vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI const char *TextToCamel(const char *text); \/\/ Get Camel case notati/;" p typeref:typename:RLAPI const char * +TextToFloat vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI float TextToFloat(const char *text); \/\/ Get float value from /;" p typeref:typename:RLAPI float +TextToInteger vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI int TextToInteger(const char *text); \/\/ Get integer value fro/;" p typeref:typename:RLAPI int +TextToLower vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI const char *TextToLower(const char *text); \/\/ Get lower case versio/;" p typeref:typename:RLAPI const char * +TextToPascal vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI const char *TextToPascal(const char *text); \/\/ Get Pascal case notat/;" p typeref:typename:RLAPI const char * +TextToSnake vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI const char *TextToSnake(const char *text); \/\/ Get Snake case notati/;" p typeref:typename:RLAPI const char * +TextToUpper vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI const char *TextToUpper(const char *text); \/\/ Get upper case versio/;" p typeref:typename:RLAPI const char * +Texture vendor/raylib-5.5_linux_amd64/include/raylib.h /^typedef struct Texture {$/;" s +Texture vendor/raylib-5.5_linux_amd64/include/raylib.h /^} Texture;$/;" t typeref:struct:Texture +Texture2D vendor/raylib-5.5_linux_amd64/include/raylib.h /^typedef Texture Texture2D;$/;" t typeref:typename:Texture +TextureCubemap vendor/raylib-5.5_linux_amd64/include/raylib.h /^typedef Texture TextureCubemap;$/;" t typeref:typename:Texture +TextureFilter vendor/raylib-5.5_linux_amd64/include/raylib.h /^} TextureFilter;$/;" t typeref:enum:__anon77d6622f0e03 +TextureWrap vendor/raylib-5.5_linux_amd64/include/raylib.h /^} TextureWrap;$/;" t typeref:enum:__anon77d6622f0f03 +ToggleBorderlessWindowed vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void ToggleBorderlessWindowed(void); \/\/ Toggle window state: bord/;" p typeref:typename:RLAPI void +ToggleFullscreen vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void ToggleFullscreen(void); \/\/ Toggle window state: full/;" p typeref:typename:RLAPI void +Token vendor/lua-5.4.8/src/llex.h /^typedef struct Token {$/;" s +Token vendor/lua-5.4.8/src/llex.h /^} Token;$/;" t typeref:struct:Token +TraceLog vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void TraceLog(int logLevel, const char *text, ...); \/\/ Show trace log messages (/;" p typeref:typename:RLAPI void +TraceLogCallback vendor/raylib-5.5_linux_amd64/include/raylib.h /^typedef void (*TraceLogCallback)(int logLevel, const char *text, va_list args); \/\/ Logging: R/;" t typeref:typename:void (*)(int logLevel,const char * text,va_list args) +TraceLogLevel vendor/raylib-5.5_linux_amd64/include/raylib.h /^} TraceLogLevel;$/;" t typeref:enum:__anon77d6622f0303 +Transform vendor/raylib-5.5_linux_amd64/include/raylib.h /^typedef struct Transform {$/;" s +Transform vendor/raylib-5.5_linux_amd64/include/raylib.h /^} Transform;$/;" t typeref:struct:Transform +UBox vendor/lua-5.4.8/src/lauxlib.c /^typedef struct UBox {$/;" s file: +UBox vendor/lua-5.4.8/src/lauxlib.c /^} UBox;$/;" t typeref:struct:UBox file: +UNAME vendor/lua-5.4.8/src/Makefile /^UNAME= uname$/;" m +UNARY_PRIORITY vendor/lua-5.4.8/src/lparser.c /^#define UNARY_PRIORITY /;" d file: +UNUSED vendor/lua-5.4.8/src/llimits.h /^#define UNUSED(/;" d +UONE vendor/lua-5.4.8/src/lmathlib.c /^#define UONE /;" d file: +UPVALNAME vendor/lua-5.4.8/src/luac.c /^#define UPVALNAME(/;" d file: +UTF8BUFFSZ vendor/lua-5.4.8/src/lobject.h /^#define UTF8BUFFSZ /;" d +UTF8PATT vendor/lua-5.4.8/src/lutf8lib.c /^#define UTF8PATT /;" d file: +UValue vendor/lua-5.4.8/src/lobject.h /^typedef union UValue {$/;" u +UValue vendor/lua-5.4.8/src/lobject.h /^} UValue;$/;" t typeref:union:UValue +Udata vendor/lua-5.4.8/src/lobject.h /^typedef struct Udata {$/;" s +Udata vendor/lua-5.4.8/src/lobject.h /^} Udata;$/;" t typeref:struct:Udata +Udata0 vendor/lua-5.4.8/src/lobject.h /^typedef struct Udata0 {$/;" s +Udata0 vendor/lua-5.4.8/src/lobject.h /^} Udata0;$/;" t typeref:struct:Udata0 +UnOpr vendor/lua-5.4.8/src/lcode.h /^typedef enum UnOpr { OPR_MINUS, OPR_BNOT, OPR_NOT, OPR_LEN, OPR_NOUNOPR } UnOpr;$/;" g +UnOpr vendor/lua-5.4.8/src/lcode.h /^typedef enum UnOpr { OPR_MINUS, OPR_BNOT, OPR_NOT, OPR_LEN, OPR_NOUNOPR } UnOpr;$/;" t typeref:enum:UnOpr +UnloadAudioStream vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void UnloadAudioStream(AudioStream stream); \/\/ Unload audio stream a/;" p typeref:typename:RLAPI void +UnloadAutomationEventList vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void UnloadAutomationEventList(AutomationEventList list); \/\/ Unl/;" p typeref:typename:RLAPI void +UnloadCodepoints vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void UnloadCodepoints(int *codepoints); \/\/ Unload codepoints d/;" p typeref:typename:RLAPI void +UnloadDirectoryFiles vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void UnloadDirectoryFiles(FilePathList files); \/\/ Unload filepaths$/;" p typeref:typename:RLAPI void +UnloadDroppedFiles vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void UnloadDroppedFiles(FilePathList files); \/\/ Unload dropped filepaths$/;" p typeref:typename:RLAPI void +UnloadFileData vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void UnloadFileData(unsigned char *data); \/\/ Unload file data allocate/;" p typeref:typename:RLAPI void +UnloadFileText vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void UnloadFileText(char *text); \/\/ Unload file text data all/;" p typeref:typename:RLAPI void +UnloadFont vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void UnloadFont(Font font); \/\//;" p typeref:typename:RLAPI void +UnloadFontData vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void UnloadFontData(GlyphInfo *glyphs, int glyphCount); \/\//;" p typeref:typename:RLAPI void +UnloadImage vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void UnloadImage(Image image); /;" p typeref:typename:RLAPI void +UnloadImageColors vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void UnloadImageColors(Color *colors); /;" p typeref:typename:RLAPI void +UnloadImagePalette vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void UnloadImagePalette(Color *colors); /;" p typeref:typename:RLAPI void +UnloadMaterial vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void UnloadMaterial(Material material); \/\//;" p typeref:typename:RLAPI void +UnloadMesh vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void UnloadMesh(Mesh mesh); \/\//;" p typeref:typename:RLAPI void +UnloadModel vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void UnloadModel(Model model); \/\//;" p typeref:typename:RLAPI void +UnloadModelAnimation vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void UnloadModelAnimation(ModelAnimation anim); \/\//;" p typeref:typename:RLAPI void +UnloadModelAnimations vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void UnloadModelAnimations(ModelAnimation *animations, int animCount); \/\//;" p typeref:typename:RLAPI void +UnloadMusicStream vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void UnloadMusicStream(Music music); \/\/ Unload music stream$/;" p typeref:typename:RLAPI void +UnloadRandomSequence vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void UnloadRandomSequence(int *sequence); \/\/ Unload random values sequ/;" p typeref:typename:RLAPI void +UnloadRenderTexture vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void UnloadRenderTexture(RenderTexture2D target); /;" p typeref:typename:RLAPI void +UnloadShader vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void UnloadShader(Shader shader); \/\/ Unload shader fr/;" p typeref:typename:RLAPI void +UnloadSound vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void UnloadSound(Sound sound); \/\/ Unload sound$/;" p typeref:typename:RLAPI void +UnloadSoundAlias vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void UnloadSoundAlias(Sound alias); \/\/ Unload a sound alias /;" p typeref:typename:RLAPI void +UnloadTexture vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void UnloadTexture(Texture2D texture); /;" p typeref:typename:RLAPI void +UnloadUTF8 vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void UnloadUTF8(char *text); \/\/ Unload UTF-8 text e/;" p typeref:typename:RLAPI void +UnloadVrStereoConfig vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void UnloadVrStereoConfig(VrStereoConfig config); \/\/ Unload VR stereo config$/;" p typeref:typename:RLAPI void +UnloadWave vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void UnloadWave(Wave wave); \/\/ Unload wave data$/;" p typeref:typename:RLAPI void +UnloadWaveSamples vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void UnloadWaveSamples(float *samples); \/\/ Unload samples data l/;" p typeref:typename:RLAPI void +UpVal vendor/lua-5.4.8/src/lobject.h /^typedef struct UpVal {$/;" s +UpVal vendor/lua-5.4.8/src/lobject.h /^} UpVal;$/;" t typeref:struct:UpVal +UpdateAudioStream vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void UpdateAudioStream(AudioStream stream, const void *data, int frameCount); \/\/ Update /;" p typeref:typename:RLAPI void +UpdateCamera vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void UpdateCamera(Camera *camera, int mode); \/\/ Update camera position for selected/;" p typeref:typename:RLAPI void +UpdateCameraPro vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void UpdateCameraPro(Camera *camera, Vector3 movement, Vector3 rotation, float zoom); \/\//;" p typeref:typename:RLAPI void +UpdateMeshBuffer vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void UpdateMeshBuffer(Mesh mesh, int index, const void *data, int dataSize, int offset); \//;" p typeref:typename:RLAPI void +UpdateModelAnimation vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void UpdateModelAnimation(Model model, ModelAnimation anim, int frame); \/\//;" p typeref:typename:RLAPI void +UpdateModelAnimationBones vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void UpdateModelAnimationBones(Model model, ModelAnimation anim, int frame); \/\//;" p typeref:typename:RLAPI void +UpdateMusicStream vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void UpdateMusicStream(Music music); \/\/ Updates buffers for m/;" p typeref:typename:RLAPI void +UpdateSound vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void UpdateSound(Sound sound, const void *data, int sampleCount); \/\/ Update sound buffer/;" p typeref:typename:RLAPI void +UpdateTexture vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void UpdateTexture(Texture2D texture, const void *pixels); /;" p typeref:typename:RLAPI void +UpdateTextureRec vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void UpdateTextureRec(Texture2D texture, Rectangle rec, const void *pixels); /;" p typeref:typename:RLAPI void +UploadMesh vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void UploadMesh(Mesh *mesh, bool dynamic); \/\//;" p typeref:typename:RLAPI void +Upvaldesc vendor/lua-5.4.8/src/lobject.h /^typedef struct Upvaldesc {$/;" s +Upvaldesc vendor/lua-5.4.8/src/lobject.h /^} Upvaldesc;$/;" t typeref:struct:Upvaldesc +V vendor/lua-5.4.8/Makefile /^V= 5.4$/;" m +VCALL vendor/lua-5.4.8/src/lparser.h /^ VCALL, \/* expression is a function call; info = instruction pc *\/$/;" e enum:__anon337ee4430103 +VCONST vendor/lua-5.4.8/src/lparser.h /^ VCONST, \/* compile-time <const> variable;$/;" e enum:__anon337ee4430103 +VDKREG vendor/lua-5.4.8/src/lparser.h /^#define VDKREG /;" d +VFALSE vendor/lua-5.4.8/src/lparser.h /^ VFALSE, \/* constant false *\/$/;" e enum:__anon337ee4430103 +VINDEXED vendor/lua-5.4.8/src/lparser.h /^ VINDEXED, \/* indexed variable;$/;" e enum:__anon337ee4430103 +VINDEXI vendor/lua-5.4.8/src/lparser.h /^ VINDEXI, \/* indexed variable with constant integer;$/;" e enum:__anon337ee4430103 +VINDEXSTR vendor/lua-5.4.8/src/lparser.h /^ VINDEXSTR, \/* indexed variable with literal string;$/;" e enum:__anon337ee4430103 +VINDEXUP vendor/lua-5.4.8/src/lparser.h /^ VINDEXUP, \/* indexed upvalue;$/;" e enum:__anon337ee4430103 +VIOLET vendor/raylib-5.5_linux_amd64/include/raylib.h /^#define VIOLET /;" d +VJMP vendor/lua-5.4.8/src/lparser.h /^ VJMP, \/* expression is a test\/comparison;$/;" e enum:__anon337ee4430103 +VK vendor/lua-5.4.8/src/lparser.h /^ VK, \/* constant in 'k'; info = index of constant in 'k' *\/$/;" e enum:__anon337ee4430103 +VKFLT vendor/lua-5.4.8/src/lparser.h /^ VKFLT, \/* floating constant; nval = numerical float value *\/$/;" e enum:__anon337ee4430103 +VKINT vendor/lua-5.4.8/src/lparser.h /^ VKINT, \/* integer constant; ival = numerical integer value *\/$/;" e enum:__anon337ee4430103 +VKSTR vendor/lua-5.4.8/src/lparser.h /^ VKSTR, \/* string constant; strval = TString address;$/;" e enum:__anon337ee4430103 +VLOCAL vendor/lua-5.4.8/src/lparser.h /^ VLOCAL, \/* local variable; var.ridx = register index;$/;" e enum:__anon337ee4430103 +VNIL vendor/lua-5.4.8/src/lparser.h /^ VNIL, \/* constant nil *\/$/;" e enum:__anon337ee4430103 +VNONRELOC vendor/lua-5.4.8/src/lparser.h /^ VNONRELOC, \/* expression has its value in a fixed register;$/;" e enum:__anon337ee4430103 +VOID vendor/lua-5.4.8/src/luac.c /^#define VOID(/;" d file: +VRELOC vendor/lua-5.4.8/src/lparser.h /^ VRELOC, \/* expression can put result in any register;$/;" e enum:__anon337ee4430103 +VTRUE vendor/lua-5.4.8/src/lparser.h /^ VTRUE, \/* constant true *\/$/;" e enum:__anon337ee4430103 +VUPVAL vendor/lua-5.4.8/src/lparser.h /^ VUPVAL, \/* upvalue variable; info = index of upvalue in 'upvalues' *\/$/;" e enum:__anon337ee4430103 +VVARARG vendor/lua-5.4.8/src/lparser.h /^ VVARARG \/* vararg expression; info = instruction pc *\/$/;" e enum:__anon337ee4430103 +VVOID vendor/lua-5.4.8/src/lparser.h /^ VVOID, \/* when 'expdesc' describes the last expression of a list,$/;" e enum:__anon337ee4430103 +Value vendor/lua-5.4.8/src/lobject.h /^typedef union Value {$/;" u +Value vendor/lua-5.4.8/src/lobject.h /^} Value;$/;" t typeref:union:Value +Vardesc vendor/lua-5.4.8/src/lparser.h /^typedef union Vardesc {$/;" u +Vardesc vendor/lua-5.4.8/src/lparser.h /^} Vardesc;$/;" t typeref:union:Vardesc +Vector2 vendor/raylib-5.5_linux_amd64/include/raylib.h /^typedef struct Vector2 {$/;" s +Vector2 vendor/raylib-5.5_linux_amd64/include/raylib.h /^} Vector2;$/;" t typeref:struct:Vector2 +Vector2 vendor/raylib-5.5_linux_amd64/include/raymath.h /^typedef struct Vector2 {$/;" s +Vector2 vendor/raylib-5.5_linux_amd64/include/raymath.h /^} Vector2;$/;" t typeref:struct:Vector2 +Vector2Add vendor/raylib-5.5_linux_amd64/include/raymath.h /^RMAPI Vector2 Vector2Add(Vector2 v1, Vector2 v2)$/;" f typeref:typename:RMAPI Vector2 +Vector2AddValue vendor/raylib-5.5_linux_amd64/include/raymath.h /^RMAPI Vector2 Vector2AddValue(Vector2 v, float add)$/;" f typeref:typename:RMAPI Vector2 +Vector2Angle vendor/raylib-5.5_linux_amd64/include/raymath.h /^RMAPI float Vector2Angle(Vector2 v1, Vector2 v2)$/;" f typeref:typename:RMAPI float +Vector2Clamp vendor/raylib-5.5_linux_amd64/include/raymath.h /^RMAPI Vector2 Vector2Clamp(Vector2 v, Vector2 min, Vector2 max)$/;" f typeref:typename:RMAPI Vector2 +Vector2ClampValue vendor/raylib-5.5_linux_amd64/include/raymath.h /^RMAPI Vector2 Vector2ClampValue(Vector2 v, float min, float max)$/;" f typeref:typename:RMAPI Vector2 +Vector2Distance vendor/raylib-5.5_linux_amd64/include/raymath.h /^RMAPI float Vector2Distance(Vector2 v1, Vector2 v2)$/;" f typeref:typename:RMAPI float +Vector2DistanceSqr vendor/raylib-5.5_linux_amd64/include/raymath.h /^RMAPI float Vector2DistanceSqr(Vector2 v1, Vector2 v2)$/;" f typeref:typename:RMAPI float +Vector2Divide vendor/raylib-5.5_linux_amd64/include/raymath.h /^RMAPI Vector2 Vector2Divide(Vector2 v1, Vector2 v2)$/;" f typeref:typename:RMAPI Vector2 +Vector2DotProduct vendor/raylib-5.5_linux_amd64/include/raymath.h /^RMAPI float Vector2DotProduct(Vector2 v1, Vector2 v2)$/;" f typeref:typename:RMAPI float +Vector2Equals vendor/raylib-5.5_linux_amd64/include/raymath.h /^RMAPI int Vector2Equals(Vector2 p, Vector2 q)$/;" f typeref:typename:RMAPI int +Vector2Invert vendor/raylib-5.5_linux_amd64/include/raymath.h /^RMAPI Vector2 Vector2Invert(Vector2 v)$/;" f typeref:typename:RMAPI Vector2 +Vector2Length vendor/raylib-5.5_linux_amd64/include/raymath.h /^RMAPI float Vector2Length(Vector2 v)$/;" f typeref:typename:RMAPI float +Vector2LengthSqr vendor/raylib-5.5_linux_amd64/include/raymath.h /^RMAPI float Vector2LengthSqr(Vector2 v)$/;" f typeref:typename:RMAPI float +Vector2Lerp vendor/raylib-5.5_linux_amd64/include/raymath.h /^RMAPI Vector2 Vector2Lerp(Vector2 v1, Vector2 v2, float amount)$/;" f typeref:typename:RMAPI Vector2 +Vector2LineAngle vendor/raylib-5.5_linux_amd64/include/raymath.h /^RMAPI float Vector2LineAngle(Vector2 start, Vector2 end)$/;" f typeref:typename:RMAPI float +Vector2Max vendor/raylib-5.5_linux_amd64/include/raymath.h /^RMAPI Vector2 Vector2Max(Vector2 v1, Vector2 v2)$/;" f typeref:typename:RMAPI Vector2 +Vector2Min vendor/raylib-5.5_linux_amd64/include/raymath.h /^RMAPI Vector2 Vector2Min(Vector2 v1, Vector2 v2)$/;" f typeref:typename:RMAPI Vector2 +Vector2MoveTowards vendor/raylib-5.5_linux_amd64/include/raymath.h /^RMAPI Vector2 Vector2MoveTowards(Vector2 v, Vector2 target, float maxDistance)$/;" f typeref:typename:RMAPI Vector2 +Vector2Multiply vendor/raylib-5.5_linux_amd64/include/raymath.h /^RMAPI Vector2 Vector2Multiply(Vector2 v1, Vector2 v2)$/;" f typeref:typename:RMAPI Vector2 +Vector2Negate vendor/raylib-5.5_linux_amd64/include/raymath.h /^RMAPI Vector2 Vector2Negate(Vector2 v)$/;" f typeref:typename:RMAPI Vector2 +Vector2Normalize vendor/raylib-5.5_linux_amd64/include/raymath.h /^RMAPI Vector2 Vector2Normalize(Vector2 v)$/;" f typeref:typename:RMAPI Vector2 +Vector2One vendor/raylib-5.5_linux_amd64/include/raymath.h /^RMAPI Vector2 Vector2One(void)$/;" f typeref:typename:RMAPI Vector2 +Vector2Ones vendor/raylib-5.5_linux_amd64/include/raymath.h /^static constexpr Vector2 Vector2Ones = { 1, 1 };$/;" v typeref:typename:Vector2 +Vector2Reflect vendor/raylib-5.5_linux_amd64/include/raymath.h /^RMAPI Vector2 Vector2Reflect(Vector2 v, Vector2 normal)$/;" f typeref:typename:RMAPI Vector2 +Vector2Refract vendor/raylib-5.5_linux_amd64/include/raymath.h /^RMAPI Vector2 Vector2Refract(Vector2 v, Vector2 n, float r)$/;" f typeref:typename:RMAPI Vector2 +Vector2Rotate vendor/raylib-5.5_linux_amd64/include/raymath.h /^RMAPI Vector2 Vector2Rotate(Vector2 v, float angle)$/;" f typeref:typename:RMAPI Vector2 +Vector2Scale vendor/raylib-5.5_linux_amd64/include/raymath.h /^RMAPI Vector2 Vector2Scale(Vector2 v, float scale)$/;" f typeref:typename:RMAPI Vector2 +Vector2Subtract vendor/raylib-5.5_linux_amd64/include/raymath.h /^RMAPI Vector2 Vector2Subtract(Vector2 v1, Vector2 v2)$/;" f typeref:typename:RMAPI Vector2 +Vector2SubtractValue vendor/raylib-5.5_linux_amd64/include/raymath.h /^RMAPI Vector2 Vector2SubtractValue(Vector2 v, float sub)$/;" f typeref:typename:RMAPI Vector2 +Vector2Transform vendor/raylib-5.5_linux_amd64/include/raymath.h /^RMAPI Vector2 Vector2Transform(Vector2 v, Matrix mat)$/;" f typeref:typename:RMAPI Vector2 +Vector2UnitX vendor/raylib-5.5_linux_amd64/include/raymath.h /^static constexpr Vector2 Vector2UnitX = { 1, 0 };$/;" v typeref:typename:Vector2 +Vector2UnitY vendor/raylib-5.5_linux_amd64/include/raymath.h /^static constexpr Vector2 Vector2UnitY = { 0, 1 };$/;" v typeref:typename:Vector2 +Vector2Zero vendor/raylib-5.5_linux_amd64/include/raymath.h /^RMAPI Vector2 Vector2Zero(void)$/;" f typeref:typename:RMAPI Vector2 +Vector2Zeros vendor/raylib-5.5_linux_amd64/include/raymath.h /^static constexpr Vector2 Vector2Zeros = { 0, 0 };$/;" v typeref:typename:Vector2 +Vector3 vendor/raylib-5.5_linux_amd64/include/raylib.h /^typedef struct Vector3 {$/;" s +Vector3 vendor/raylib-5.5_linux_amd64/include/raylib.h /^} Vector3;$/;" t typeref:struct:Vector3 +Vector3 vendor/raylib-5.5_linux_amd64/include/raymath.h /^typedef struct Vector3 {$/;" s +Vector3 vendor/raylib-5.5_linux_amd64/include/raymath.h /^} Vector3;$/;" t typeref:struct:Vector3 +Vector3Add vendor/raylib-5.5_linux_amd64/include/raymath.h /^RMAPI Vector3 Vector3Add(Vector3 v1, Vector3 v2)$/;" f typeref:typename:RMAPI Vector3 +Vector3AddValue vendor/raylib-5.5_linux_amd64/include/raymath.h /^RMAPI Vector3 Vector3AddValue(Vector3 v, float add)$/;" f typeref:typename:RMAPI Vector3 +Vector3Angle vendor/raylib-5.5_linux_amd64/include/raymath.h /^RMAPI float Vector3Angle(Vector3 v1, Vector3 v2)$/;" f typeref:typename:RMAPI float +Vector3Barycenter vendor/raylib-5.5_linux_amd64/include/raymath.h /^RMAPI Vector3 Vector3Barycenter(Vector3 p, Vector3 a, Vector3 b, Vector3 c)$/;" f typeref:typename:RMAPI Vector3 +Vector3Clamp vendor/raylib-5.5_linux_amd64/include/raymath.h /^RMAPI Vector3 Vector3Clamp(Vector3 v, Vector3 min, Vector3 max)$/;" f typeref:typename:RMAPI Vector3 +Vector3ClampValue vendor/raylib-5.5_linux_amd64/include/raymath.h /^RMAPI Vector3 Vector3ClampValue(Vector3 v, float min, float max)$/;" f typeref:typename:RMAPI Vector3 +Vector3CrossProduct vendor/raylib-5.5_linux_amd64/include/raymath.h /^RMAPI Vector3 Vector3CrossProduct(Vector3 v1, Vector3 v2)$/;" f typeref:typename:RMAPI Vector3 +Vector3CubicHermite vendor/raylib-5.5_linux_amd64/include/raymath.h /^RMAPI Vector3 Vector3CubicHermite(Vector3 v1, Vector3 tangent1, Vector3 v2, Vector3 tangent2, fl/;" f typeref:typename:RMAPI Vector3 +Vector3Distance vendor/raylib-5.5_linux_amd64/include/raymath.h /^RMAPI float Vector3Distance(Vector3 v1, Vector3 v2)$/;" f typeref:typename:RMAPI float +Vector3DistanceSqr vendor/raylib-5.5_linux_amd64/include/raymath.h /^RMAPI float Vector3DistanceSqr(Vector3 v1, Vector3 v2)$/;" f typeref:typename:RMAPI float +Vector3Divide vendor/raylib-5.5_linux_amd64/include/raymath.h /^RMAPI Vector3 Vector3Divide(Vector3 v1, Vector3 v2)$/;" f typeref:typename:RMAPI Vector3 +Vector3DotProduct vendor/raylib-5.5_linux_amd64/include/raymath.h /^RMAPI float Vector3DotProduct(Vector3 v1, Vector3 v2)$/;" f typeref:typename:RMAPI float +Vector3Equals vendor/raylib-5.5_linux_amd64/include/raymath.h /^RMAPI int Vector3Equals(Vector3 p, Vector3 q)$/;" f typeref:typename:RMAPI int +Vector3Invert vendor/raylib-5.5_linux_amd64/include/raymath.h /^RMAPI Vector3 Vector3Invert(Vector3 v)$/;" f typeref:typename:RMAPI Vector3 +Vector3Length vendor/raylib-5.5_linux_amd64/include/raymath.h /^RMAPI float Vector3Length(const Vector3 v)$/;" f typeref:typename:RMAPI float +Vector3LengthSqr vendor/raylib-5.5_linux_amd64/include/raymath.h /^RMAPI float Vector3LengthSqr(const Vector3 v)$/;" f typeref:typename:RMAPI float +Vector3Lerp vendor/raylib-5.5_linux_amd64/include/raymath.h /^RMAPI Vector3 Vector3Lerp(Vector3 v1, Vector3 v2, float amount)$/;" f typeref:typename:RMAPI Vector3 +Vector3Max vendor/raylib-5.5_linux_amd64/include/raymath.h /^RMAPI Vector3 Vector3Max(Vector3 v1, Vector3 v2)$/;" f typeref:typename:RMAPI Vector3 +Vector3Min vendor/raylib-5.5_linux_amd64/include/raymath.h /^RMAPI Vector3 Vector3Min(Vector3 v1, Vector3 v2)$/;" f typeref:typename:RMAPI Vector3 +Vector3MoveTowards vendor/raylib-5.5_linux_amd64/include/raymath.h /^RMAPI Vector3 Vector3MoveTowards(Vector3 v, Vector3 target, float maxDistance)$/;" f typeref:typename:RMAPI Vector3 +Vector3Multiply vendor/raylib-5.5_linux_amd64/include/raymath.h /^RMAPI Vector3 Vector3Multiply(Vector3 v1, Vector3 v2)$/;" f typeref:typename:RMAPI Vector3 +Vector3Negate vendor/raylib-5.5_linux_amd64/include/raymath.h /^RMAPI Vector3 Vector3Negate(Vector3 v)$/;" f typeref:typename:RMAPI Vector3 +Vector3Normalize vendor/raylib-5.5_linux_amd64/include/raymath.h /^RMAPI Vector3 Vector3Normalize(Vector3 v)$/;" f typeref:typename:RMAPI Vector3 +Vector3One vendor/raylib-5.5_linux_amd64/include/raymath.h /^RMAPI Vector3 Vector3One(void)$/;" f typeref:typename:RMAPI Vector3 +Vector3Ones vendor/raylib-5.5_linux_amd64/include/raymath.h /^static constexpr Vector3 Vector3Ones = { 1, 1, 1 };$/;" v typeref:typename:Vector3 +Vector3OrthoNormalize vendor/raylib-5.5_linux_amd64/include/raymath.h /^RMAPI void Vector3OrthoNormalize(Vector3 *v1, Vector3 *v2)$/;" f typeref:typename:RMAPI void +Vector3Perpendicular vendor/raylib-5.5_linux_amd64/include/raymath.h /^RMAPI Vector3 Vector3Perpendicular(Vector3 v)$/;" f typeref:typename:RMAPI Vector3 +Vector3Project vendor/raylib-5.5_linux_amd64/include/raymath.h /^RMAPI Vector3 Vector3Project(Vector3 v1, Vector3 v2)$/;" f typeref:typename:RMAPI Vector3 +Vector3Reflect vendor/raylib-5.5_linux_amd64/include/raymath.h /^RMAPI Vector3 Vector3Reflect(Vector3 v, Vector3 normal)$/;" f typeref:typename:RMAPI Vector3 +Vector3Refract vendor/raylib-5.5_linux_amd64/include/raymath.h /^RMAPI Vector3 Vector3Refract(Vector3 v, Vector3 n, float r)$/;" f typeref:typename:RMAPI Vector3 +Vector3Reject vendor/raylib-5.5_linux_amd64/include/raymath.h /^RMAPI Vector3 Vector3Reject(Vector3 v1, Vector3 v2)$/;" f typeref:typename:RMAPI Vector3 +Vector3RotateByAxisAngle vendor/raylib-5.5_linux_amd64/include/raymath.h /^RMAPI Vector3 Vector3RotateByAxisAngle(Vector3 v, Vector3 axis, float angle)$/;" f typeref:typename:RMAPI Vector3 +Vector3RotateByQuaternion vendor/raylib-5.5_linux_amd64/include/raymath.h /^RMAPI Vector3 Vector3RotateByQuaternion(Vector3 v, Quaternion q)$/;" f typeref:typename:RMAPI Vector3 +Vector3Scale vendor/raylib-5.5_linux_amd64/include/raymath.h /^RMAPI Vector3 Vector3Scale(Vector3 v, float scalar)$/;" f typeref:typename:RMAPI Vector3 +Vector3Subtract vendor/raylib-5.5_linux_amd64/include/raymath.h /^RMAPI Vector3 Vector3Subtract(Vector3 v1, Vector3 v2)$/;" f typeref:typename:RMAPI Vector3 +Vector3SubtractValue vendor/raylib-5.5_linux_amd64/include/raymath.h /^RMAPI Vector3 Vector3SubtractValue(Vector3 v, float sub)$/;" f typeref:typename:RMAPI Vector3 +Vector3ToFloat vendor/raylib-5.5_linux_amd64/include/raymath.h /^ #define Vector3ToFloat(/;" d +Vector3ToFloatV vendor/raylib-5.5_linux_amd64/include/raymath.h /^RMAPI float3 Vector3ToFloatV(Vector3 v)$/;" f typeref:typename:RMAPI float3 +Vector3Transform vendor/raylib-5.5_linux_amd64/include/raymath.h /^RMAPI Vector3 Vector3Transform(Vector3 v, Matrix mat)$/;" f typeref:typename:RMAPI Vector3 +Vector3UnitX vendor/raylib-5.5_linux_amd64/include/raymath.h /^static constexpr Vector3 Vector3UnitX = { 1, 0, 0 };$/;" v typeref:typename:Vector3 +Vector3UnitY vendor/raylib-5.5_linux_amd64/include/raymath.h /^static constexpr Vector3 Vector3UnitY = { 0, 1, 0 };$/;" v typeref:typename:Vector3 +Vector3UnitZ vendor/raylib-5.5_linux_amd64/include/raymath.h /^static constexpr Vector3 Vector3UnitZ = { 0, 0, 1 };$/;" v typeref:typename:Vector3 +Vector3Unproject vendor/raylib-5.5_linux_amd64/include/raymath.h /^RMAPI Vector3 Vector3Unproject(Vector3 source, Matrix projection, Matrix view)$/;" f typeref:typename:RMAPI Vector3 +Vector3Zero vendor/raylib-5.5_linux_amd64/include/raymath.h /^RMAPI Vector3 Vector3Zero(void)$/;" f typeref:typename:RMAPI Vector3 +Vector3Zeros vendor/raylib-5.5_linux_amd64/include/raymath.h /^static constexpr Vector3 Vector3Zeros = { 0, 0, 0 };$/;" v typeref:typename:Vector3 +Vector4 vendor/raylib-5.5_linux_amd64/include/raylib.h /^typedef struct Vector4 {$/;" s +Vector4 vendor/raylib-5.5_linux_amd64/include/raylib.h /^} Vector4;$/;" t typeref:struct:Vector4 +Vector4 vendor/raylib-5.5_linux_amd64/include/raymath.h /^typedef struct Vector4 {$/;" s +Vector4 vendor/raylib-5.5_linux_amd64/include/raymath.h /^} Vector4;$/;" t typeref:struct:Vector4 +Vector4Add vendor/raylib-5.5_linux_amd64/include/raymath.h /^RMAPI Vector4 Vector4Add(Vector4 v1, Vector4 v2)$/;" f typeref:typename:RMAPI Vector4 +Vector4AddValue vendor/raylib-5.5_linux_amd64/include/raymath.h /^RMAPI Vector4 Vector4AddValue(Vector4 v, float add)$/;" f typeref:typename:RMAPI Vector4 +Vector4Distance vendor/raylib-5.5_linux_amd64/include/raymath.h /^RMAPI float Vector4Distance(Vector4 v1, Vector4 v2)$/;" f typeref:typename:RMAPI float +Vector4DistanceSqr vendor/raylib-5.5_linux_amd64/include/raymath.h /^RMAPI float Vector4DistanceSqr(Vector4 v1, Vector4 v2)$/;" f typeref:typename:RMAPI float +Vector4Divide vendor/raylib-5.5_linux_amd64/include/raymath.h /^RMAPI Vector4 Vector4Divide(Vector4 v1, Vector4 v2)$/;" f typeref:typename:RMAPI Vector4 +Vector4DotProduct vendor/raylib-5.5_linux_amd64/include/raymath.h /^RMAPI float Vector4DotProduct(Vector4 v1, Vector4 v2)$/;" f typeref:typename:RMAPI float +Vector4Equals vendor/raylib-5.5_linux_amd64/include/raymath.h /^RMAPI int Vector4Equals(Vector4 p, Vector4 q)$/;" f typeref:typename:RMAPI int +Vector4Invert vendor/raylib-5.5_linux_amd64/include/raymath.h /^RMAPI Vector4 Vector4Invert(Vector4 v)$/;" f typeref:typename:RMAPI Vector4 +Vector4Length vendor/raylib-5.5_linux_amd64/include/raymath.h /^RMAPI float Vector4Length(Vector4 v)$/;" f typeref:typename:RMAPI float +Vector4LengthSqr vendor/raylib-5.5_linux_amd64/include/raymath.h /^RMAPI float Vector4LengthSqr(Vector4 v)$/;" f typeref:typename:RMAPI float +Vector4Lerp vendor/raylib-5.5_linux_amd64/include/raymath.h /^RMAPI Vector4 Vector4Lerp(Vector4 v1, Vector4 v2, float amount)$/;" f typeref:typename:RMAPI Vector4 +Vector4Max vendor/raylib-5.5_linux_amd64/include/raymath.h /^RMAPI Vector4 Vector4Max(Vector4 v1, Vector4 v2)$/;" f typeref:typename:RMAPI Vector4 +Vector4Min vendor/raylib-5.5_linux_amd64/include/raymath.h /^RMAPI Vector4 Vector4Min(Vector4 v1, Vector4 v2)$/;" f typeref:typename:RMAPI Vector4 +Vector4MoveTowards vendor/raylib-5.5_linux_amd64/include/raymath.h /^RMAPI Vector4 Vector4MoveTowards(Vector4 v, Vector4 target, float maxDistance)$/;" f typeref:typename:RMAPI Vector4 +Vector4Multiply vendor/raylib-5.5_linux_amd64/include/raymath.h /^RMAPI Vector4 Vector4Multiply(Vector4 v1, Vector4 v2)$/;" f typeref:typename:RMAPI Vector4 +Vector4Negate vendor/raylib-5.5_linux_amd64/include/raymath.h /^RMAPI Vector4 Vector4Negate(Vector4 v)$/;" f typeref:typename:RMAPI Vector4 +Vector4Normalize vendor/raylib-5.5_linux_amd64/include/raymath.h /^RMAPI Vector4 Vector4Normalize(Vector4 v)$/;" f typeref:typename:RMAPI Vector4 +Vector4One vendor/raylib-5.5_linux_amd64/include/raymath.h /^RMAPI Vector4 Vector4One(void)$/;" f typeref:typename:RMAPI Vector4 +Vector4Ones vendor/raylib-5.5_linux_amd64/include/raymath.h /^static constexpr Vector4 Vector4Ones = { 1, 1, 1, 1 };$/;" v typeref:typename:Vector4 +Vector4Scale vendor/raylib-5.5_linux_amd64/include/raymath.h /^RMAPI Vector4 Vector4Scale(Vector4 v, float scale)$/;" f typeref:typename:RMAPI Vector4 +Vector4Subtract vendor/raylib-5.5_linux_amd64/include/raymath.h /^RMAPI Vector4 Vector4Subtract(Vector4 v1, Vector4 v2)$/;" f typeref:typename:RMAPI Vector4 +Vector4SubtractValue vendor/raylib-5.5_linux_amd64/include/raymath.h /^RMAPI Vector4 Vector4SubtractValue(Vector4 v, float add)$/;" f typeref:typename:RMAPI Vector4 +Vector4UnitW vendor/raylib-5.5_linux_amd64/include/raymath.h /^static constexpr Vector4 Vector4UnitW = { 0, 0, 0, 1 };$/;" v typeref:typename:Vector4 +Vector4UnitX vendor/raylib-5.5_linux_amd64/include/raymath.h /^static constexpr Vector4 Vector4UnitX = { 1, 0, 0, 0 };$/;" v typeref:typename:Vector4 +Vector4UnitY vendor/raylib-5.5_linux_amd64/include/raymath.h /^static constexpr Vector4 Vector4UnitY = { 0, 1, 0, 0 };$/;" v typeref:typename:Vector4 +Vector4UnitZ vendor/raylib-5.5_linux_amd64/include/raymath.h /^static constexpr Vector4 Vector4UnitZ = { 0, 0, 1, 0 };$/;" v typeref:typename:Vector4 +Vector4Zero vendor/raylib-5.5_linux_amd64/include/raymath.h /^RMAPI Vector4 Vector4Zero(void)$/;" f typeref:typename:RMAPI Vector4 +Vector4Zeros vendor/raylib-5.5_linux_amd64/include/raymath.h /^static constexpr Vector4 Vector4Zeros = { 0, 0, 0, 0 };$/;" v typeref:typename:Vector4 +VrDeviceInfo vendor/raylib-5.5_linux_amd64/include/raylib.h /^typedef struct VrDeviceInfo {$/;" s +VrDeviceInfo vendor/raylib-5.5_linux_amd64/include/raylib.h /^} VrDeviceInfo;$/;" t typeref:struct:VrDeviceInfo +VrStereoConfig vendor/raylib-5.5_linux_amd64/include/raylib.h /^typedef struct VrStereoConfig {$/;" s +VrStereoConfig vendor/raylib-5.5_linux_amd64/include/raylib.h /^} VrStereoConfig;$/;" t typeref:struct:VrStereoConfig +WHITE vendor/raylib-5.5_linux_amd64/include/raylib.h /^#define WHITE /;" d +WHITE0BIT vendor/lua-5.4.8/src/lgc.h /^#define WHITE0BIT /;" d +WHITE1BIT vendor/lua-5.4.8/src/lgc.h /^#define WHITE1BIT /;" d +WHITEBITS vendor/lua-5.4.8/src/lgc.h /^#define WHITEBITS /;" d +WINGDIAPI vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ #define WINGDIAPI /;" d +WORK2MEM vendor/lua-5.4.8/src/lgc.c /^#define WORK2MEM /;" d file: +WaitTime vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void WaitTime(double seconds); \/\/ Wait for some time (halt /;" p typeref:typename:RLAPI void +Wave vendor/raylib-5.5_linux_amd64/include/raylib.h /^typedef struct Wave {$/;" s +Wave vendor/raylib-5.5_linux_amd64/include/raylib.h /^} Wave;$/;" t typeref:struct:Wave +WaveCopy vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI Wave WaveCopy(Wave wave); \/\/ Copy a wave to a new /;" p typeref:typename:RLAPI Wave +WaveCrop vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void WaveCrop(Wave *wave, int initFrame, int finalFrame); \/\/ Crop a wave to define/;" p typeref:typename:RLAPI void +WaveFormat vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI void WaveFormat(Wave *wave, int sampleRate, int sampleSize, int channels); \/\/ Convert wa/;" p typeref:typename:RLAPI void +WindowShouldClose vendor/raylib-5.5_linux_amd64/include/raylib.h /^RLAPI bool WindowShouldClose(void); \/\/ Check if application shou/;" p typeref:typename:RLAPI bool +Wrap vendor/raylib-5.5_linux_amd64/include/raymath.h /^RMAPI float Wrap(float value, float min, float max)$/;" f typeref:typename:RMAPI float +XDIGITBIT vendor/lua-5.4.8/src/lctype.h /^#define XDIGITBIT /;" d +YELLOW vendor/raylib-5.5_linux_amd64/include/raylib.h /^#define YELLOW /;" d +Z vendor/lua-5.4.8/src/lundump.c /^ ZIO *Z;$/;" m struct:__anon98fd752a0108 typeref:typename:ZIO * file: +ZIO vendor/lua-5.4.8/src/lzio.h /^typedef struct Zio ZIO;$/;" t typeref:struct:Zio +Zio vendor/lua-5.4.8/src/lzio.h /^struct Zio {$/;" s +_CRT_SECURE_NO_WARNINGS vendor/lua-5.4.8/src/lprefix.h /^#define _CRT_SECURE_NO_WARNINGS /;" d +_FILE_OFFSET_BITS vendor/lua-5.4.8/src/lprefix.h /^#define _FILE_OFFSET_BITS /;" d +_LARGEFILE_SOURCE vendor/lua-5.4.8/src/lprefix.h /^#define _LARGEFILE_SOURCE /;" d +_XOPEN_SOURCE vendor/lua-5.4.8/src/lprefix.h /^#define _XOPEN_SOURCE /;" d +__anon1f68b8bd0103 vendor/raylib-5.5_linux_amd64/include/rlgl.h /^typedef enum bool { false = 0, true = !false } bool;$/;" g +__anon1f68b8bd0103 vendor/raylib-5.5_linux_amd64/include/rlgl.h /^typedef enum bool { false = 0, true = !false } bool;$/;" t typeref:enum:bool +__anon1f68b8bd0203 vendor/raylib-5.5_linux_amd64/include/rlgl.h /^typedef enum {$/;" g +__anon1f68b8bd0303 vendor/raylib-5.5_linux_amd64/include/rlgl.h /^typedef enum {$/;" g +__anon1f68b8bd0403 vendor/raylib-5.5_linux_amd64/include/rlgl.h /^typedef enum {$/;" g +__anon1f68b8bd0503 vendor/raylib-5.5_linux_amd64/include/rlgl.h /^typedef enum {$/;" g +__anon1f68b8bd0603 vendor/raylib-5.5_linux_amd64/include/rlgl.h /^typedef enum {$/;" g +__anon1f68b8bd0703 vendor/raylib-5.5_linux_amd64/include/rlgl.h /^typedef enum {$/;" g +__anon1f68b8bd0803 vendor/raylib-5.5_linux_amd64/include/rlgl.h /^typedef enum {$/;" g +__anon1f68b8bd0903 vendor/raylib-5.5_linux_amd64/include/rlgl.h /^typedef enum {$/;" g +__anon1f68b8bd0a03 vendor/raylib-5.5_linux_amd64/include/rlgl.h /^typedef enum {$/;" g +__anon1f68b8bd0b03 vendor/raylib-5.5_linux_amd64/include/rlgl.h /^typedef enum {$/;" g +__anon1f68b8bd0c03 vendor/raylib-5.5_linux_amd64/include/rlgl.h /^typedef enum {$/;" g +__anon1f68b8bd0d08 vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ struct {$/;" s struct:rlglData +__anon1f68b8bd0e08 vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ struct {$/;" s struct:rlglData +__anon337ee43e0108 vendor/lua-5.4.8/src/lparser.c /^static const struct {$/;" s file: +__anon337ee4430103 vendor/lua-5.4.8/src/lparser.h /^typedef enum {$/;" g +__anon337ee443020a vendor/lua-5.4.8/src/lparser.h /^ union {$/;" u struct:expdesc +__anon337ee4430308 vendor/lua-5.4.8/src/lparser.h /^ struct { \/* for indexed variables *\/$/;" s union:expdesc::__anon337ee443020a +__anon337ee4430408 vendor/lua-5.4.8/src/lparser.h /^ struct { \/* for local variables *\/$/;" s union:expdesc::__anon337ee443020a +__anon337ee4430508 vendor/lua-5.4.8/src/lparser.h /^ struct {$/;" s union:Vardesc +__anon337ee4430608 vendor/lua-5.4.8/src/lparser.h /^ struct { \/* list of all active local variables *\/$/;" s struct:Dyndata +__anon6cb25fdb010a vendor/lua-5.4.8/src/lauxlib.h /^ union {$/;" u struct:luaL_Buffer +__anon6dcdaf670108 vendor/lua-5.4.8/src/ldump.c /^typedef struct {$/;" s file: +__anon77d6622f0103 vendor/raylib-5.5_linux_amd64/include/raylib.h /^ typedef enum bool { false = 0, true = !false } bool;$/;" g +__anon77d6622f0103 vendor/raylib-5.5_linux_amd64/include/raylib.h /^ typedef enum bool { false = 0, true = !false } bool;$/;" t typeref:enum:bool +__anon77d6622f0203 vendor/raylib-5.5_linux_amd64/include/raylib.h /^typedef enum {$/;" g +__anon77d6622f0303 vendor/raylib-5.5_linux_amd64/include/raylib.h /^typedef enum {$/;" g +__anon77d6622f0403 vendor/raylib-5.5_linux_amd64/include/raylib.h /^typedef enum {$/;" g +__anon77d6622f0503 vendor/raylib-5.5_linux_amd64/include/raylib.h /^typedef enum {$/;" g +__anon77d6622f0603 vendor/raylib-5.5_linux_amd64/include/raylib.h /^typedef enum {$/;" g +__anon77d6622f0703 vendor/raylib-5.5_linux_amd64/include/raylib.h /^typedef enum {$/;" g +__anon77d6622f0803 vendor/raylib-5.5_linux_amd64/include/raylib.h /^typedef enum {$/;" g +__anon77d6622f0903 vendor/raylib-5.5_linux_amd64/include/raylib.h /^typedef enum {$/;" g +__anon77d6622f0a03 vendor/raylib-5.5_linux_amd64/include/raylib.h /^typedef enum {$/;" g +__anon77d6622f0b03 vendor/raylib-5.5_linux_amd64/include/raylib.h /^typedef enum {$/;" g +__anon77d6622f0c03 vendor/raylib-5.5_linux_amd64/include/raylib.h /^typedef enum {$/;" g +__anon77d6622f0d03 vendor/raylib-5.5_linux_amd64/include/raylib.h /^typedef enum {$/;" g +__anon77d6622f0e03 vendor/raylib-5.5_linux_amd64/include/raylib.h /^typedef enum {$/;" g +__anon77d6622f0f03 vendor/raylib-5.5_linux_amd64/include/raylib.h /^typedef enum {$/;" g +__anon77d6622f1003 vendor/raylib-5.5_linux_amd64/include/raylib.h /^typedef enum {$/;" g +__anon77d6622f1103 vendor/raylib-5.5_linux_amd64/include/raylib.h /^typedef enum {$/;" g +__anon77d6622f1203 vendor/raylib-5.5_linux_amd64/include/raylib.h /^typedef enum {$/;" g +__anon77d6622f1303 vendor/raylib-5.5_linux_amd64/include/raylib.h /^typedef enum {$/;" g +__anon77d6622f1403 vendor/raylib-5.5_linux_amd64/include/raylib.h /^typedef enum {$/;" g +__anon77d6622f1503 vendor/raylib-5.5_linux_amd64/include/raylib.h /^typedef enum {$/;" g +__anon77d6622f1603 vendor/raylib-5.5_linux_amd64/include/raylib.h /^typedef enum {$/;" g +__anon7aa428030103 vendor/lua-5.4.8/src/lopcodes.h /^typedef enum {$/;" g +__anon808f9fcd0108 vendor/lua-5.4.8/src/lobject.h /^ struct {$/;" s union:StackValue +__anon808f9fcd020a vendor/lua-5.4.8/src/lobject.h /^typedef union {$/;" u +__anon808f9fcd030a vendor/lua-5.4.8/src/lobject.h /^ union {$/;" u struct:TString +__anon808f9fcd040a vendor/lua-5.4.8/src/lobject.h /^ union {LUAI_MAXALIGN;} bindata;$/;" u struct:Udata0 +__anon808f9fcd050a vendor/lua-5.4.8/src/lobject.h /^ union {$/;" u struct:UpVal +__anon808f9fcd060a vendor/lua-5.4.8/src/lobject.h /^ union {$/;" u struct:UpVal +__anon808f9fcd0708 vendor/lua-5.4.8/src/lobject.h /^ struct { \/* (when open) *\/$/;" s union:UpVal::__anon808f9fcd060a +__anon98fd752a0108 vendor/lua-5.4.8/src/lundump.c /^typedef struct {$/;" s file: +__anon9a52bfe00108 vendor/lua-5.4.8/src/liolib.c /^typedef struct {$/;" s file: +__anon9b0d07770103 vendor/lua-5.4.8/src/ltm.h /^typedef enum {$/;" g +__anon9b0e20390103 vendor/lua-5.4.8/src/lvm.h /^typedef enum {$/;" g +__anona701f1f7010a vendor/lua-5.4.8/src/lstate.h /^ union {$/;" u struct:CallInfo +__anona701f1f70208 vendor/lua-5.4.8/src/lstate.h /^ struct { \/* only for Lua functions *\/$/;" s union:CallInfo::__anona701f1f7010a +__anona701f1f70308 vendor/lua-5.4.8/src/lstate.h /^ struct { \/* only for C functions *\/$/;" s union:CallInfo::__anona701f1f7010a +__anona701f1f7040a vendor/lua-5.4.8/src/lstate.h /^ union {$/;" u struct:CallInfo +__anona701f1f70508 vendor/lua-5.4.8/src/lstate.h /^ struct { \/* info about transferred values (for call\/return hooks) *\/$/;" s union:CallInfo::__anona701f1f7040a +__anonae5a27210108 vendor/lua-5.4.8/src/lstrlib.c /^ struct {$/;" s struct:MatchState file: +__anonae5a2721020a vendor/lua-5.4.8/src/lstrlib.c /^static const union {$/;" u file: +__anonae5a2721030a vendor/lua-5.4.8/src/lstrlib.c /^ struct cD { char c; union { LUAI_MAXALIGN; } u; };$/;" u struct:getoption::cD file: +__anonc6ac66720108 vendor/lua-5.4.8/src/lmathlib.c /^typedef struct {$/;" s file: +__anonfc1a02ff010a vendor/lua-5.4.8/src/llex.h /^typedef union {$/;" u +__declspec vendor/raylib-5.5_linux_amd64/include/raylib.h /^ #define __declspec(/;" d +a vendor/lua-5.4.8/src/Makefile /^a: $(ALL_A)$/;" t +a vendor/raylib-5.5_linux_amd64/include/raylib.h /^ unsigned char a; \/\/ Color alpha value$/;" m struct:Color typeref:typename:unsigned char +absentkey vendor/lua-5.4.8/src/ltable.c /^static const TValue absentkey = {ABSTKEYCONSTANT};$/;" v typeref:typename:const TValue file: +abslineinfo vendor/lua-5.4.8/src/lobject.h /^ AbsLineInfo *abslineinfo; \/* idem *\/$/;" m struct:Proto typeref:typename:AbsLineInfo * +activeTextureId vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ unsigned int activeTextureId[RL_DEFAULT_BATCH_MAX_TEXTURE_UNITS]; \/\/ Active texture/;" m struct:rlglData::__anon1f68b8bd0d08 typeref:typename:unsigned int[] +actvar vendor/lua-5.4.8/src/lparser.h /^ } actvar;$/;" m struct:Dyndata typeref:struct:Dyndata::__anon337ee4430608 +add_s vendor/lua-5.4.8/src/lstrlib.c /^static void add_s (MatchState *ms, luaL_Buffer *b, const char *s,$/;" f typeref:typename:void file: +add_value vendor/lua-5.4.8/src/lstrlib.c /^static int add_value (MatchState *ms, luaL_Buffer *b, const char *s,$/;" f typeref:typename:int file: +addbuff vendor/lua-5.4.8/src/lstate.c /^#define addbuff(/;" d file: +adddigit vendor/lua-5.4.8/src/lstrlib.c /^static lua_Number adddigit (char *buff, int n, lua_Number x) {$/;" f typeref:typename:lua_Number file: +addfield vendor/lua-5.4.8/src/ltablib.c /^static void addfield (lua_State *L, luaL_Buffer *b, lua_Integer i) {$/;" f typeref:typename:void file: +addk vendor/lua-5.4.8/src/lcode.c /^static int addk (FuncState *fs, TValue *key, TValue *v) {$/;" f typeref:typename:int file: +addlenmod vendor/lua-5.4.8/src/lstrlib.c /^static void addlenmod (char *form, const char *lenmod) {$/;" f typeref:typename:void file: +addliteral vendor/lua-5.4.8/src/lstrlib.c /^static void addliteral (lua_State *L, luaL_Buffer *b, int arg) {$/;" f typeref:typename:void file: +addnum2buff vendor/lua-5.4.8/src/lobject.c /^static void addnum2buff (BuffFS *buff, TValue *num) {$/;" f typeref:typename:void file: +addprototype vendor/lua-5.4.8/src/lparser.c /^static Proto *addprototype (LexState *ls) {$/;" f typeref:typename:Proto * file: +addquoted vendor/lua-5.4.8/src/lstrlib.c /^static void addquoted (luaL_Buffer *b, const char *s, size_t len) {$/;" f typeref:typename:void file: +addreturn vendor/lua-5.4.8/src/lua.c /^static int addreturn (lua_State *L) {$/;" f typeref:typename:int file: +addsize vendor/lua-5.4.8/src/lobject.c /^#define addsize(/;" d file: +addstr vendor/lua-5.4.8/src/lobject.c /^#define addstr(/;" d file: +addstr2buff vendor/lua-5.4.8/src/lobject.c /^static void addstr2buff (BuffFS *buff, const char *str, size_t slen) {$/;" f typeref:typename:void file: +addtoclib vendor/lua-5.4.8/src/loadlib.c /^static void addtoclib (lua_State *L, const char *path, void *plib) {$/;" f typeref:typename:void file: +adjust_assign vendor/lua-5.4.8/src/lparser.c /^static void adjust_assign (LexState *ls, int nvars, int nexps, expdesc *e) {$/;" f typeref:typename:void file: +adjustlocalvars vendor/lua-5.4.8/src/lparser.c /^static void adjustlocalvars (LexState *ls, int nvars) {$/;" f typeref:typename:void file: +adjustresults vendor/lua-5.4.8/src/lapi.h /^#define adjustresults(/;" d +advanceX vendor/raylib-5.5_linux_amd64/include/raylib.h /^ int advanceX; \/\/ Character advance position X$/;" m struct:GlyphInfo typeref:typename:int +aix vendor/lua-5.4.8/src/Makefile /^AIX aix:$/;" t +alimit vendor/lua-5.4.8/src/lobject.h /^ unsigned int alimit; \/* "limit" of 'array' array *\/$/;" m struct:Table typeref:typename:unsigned int +all vendor/lua-5.4.8/Makefile /^all: $(PLAT)$/;" t +all vendor/lua-5.4.8/src/Makefile /^all: $(ALL_T)$/;" t +allgc vendor/lua-5.4.8/src/lstate.h /^ GCObject *allgc; \/* list of all collectable objects *\/$/;" m struct:global_State typeref:typename:GCObject * +allocsizenode vendor/lua-5.4.8/src/ltable.h /^#define allocsizenode(/;" d +allocupvalue vendor/lua-5.4.8/src/lparser.c /^static Upvaldesc *allocupvalue (FuncState *fs) {$/;" f typeref:typename:Upvaldesc * file: +allowhook vendor/lua-5.4.8/src/lstate.h /^ lu_byte allowhook;$/;" m struct:lua_State typeref:typename:lu_byte +allweak vendor/lua-5.4.8/src/lstate.h /^ GCObject *allweak; \/* list of all-weak tables *\/$/;" m struct:global_State typeref:typename:GCObject * +animNormals vendor/raylib-5.5_linux_amd64/include/raylib.h /^ float *animNormals; \/\/ Animated normals (after bones transformations)$/;" m struct:Mesh typeref:typename:float * +animVertices vendor/raylib-5.5_linux_amd64/include/raylib.h /^ float *animVertices; \/\/ Animated vertex positions (after bones transformations)$/;" m struct:Mesh typeref:typename:float * +api_check vendor/lua-5.4.8/src/llimits.h /^#define api_check(/;" d +api_checknelems vendor/lua-5.4.8/src/lapi.h /^#define api_checknelems(/;" d +api_incr_top vendor/lua-5.4.8/src/lapi.h /^#define api_incr_top(/;" d +arith vendor/lua-5.4.8/src/lstrlib.c /^static int arith (lua_State *L, int op, const char *mtname) {$/;" f typeref:typename:int file: +arith_add vendor/lua-5.4.8/src/lstrlib.c /^static int arith_add (lua_State *L) {$/;" f typeref:typename:int file: +arith_div vendor/lua-5.4.8/src/lstrlib.c /^static int arith_div (lua_State *L) {$/;" f typeref:typename:int file: +arith_idiv vendor/lua-5.4.8/src/lstrlib.c /^static int arith_idiv (lua_State *L) {$/;" f typeref:typename:int file: +arith_mod vendor/lua-5.4.8/src/lstrlib.c /^static int arith_mod (lua_State *L) {$/;" f typeref:typename:int file: +arith_mul vendor/lua-5.4.8/src/lstrlib.c /^static int arith_mul (lua_State *L) {$/;" f typeref:typename:int file: +arith_pow vendor/lua-5.4.8/src/lstrlib.c /^static int arith_pow (lua_State *L) {$/;" f typeref:typename:int file: +arith_sub vendor/lua-5.4.8/src/lstrlib.c /^static int arith_sub (lua_State *L) {$/;" f typeref:typename:int file: +arith_unm vendor/lua-5.4.8/src/lstrlib.c /^static int arith_unm (lua_State *L) {$/;" f typeref:typename:int file: +arr vendor/lua-5.4.8/src/lparser.h /^ Vardesc *arr;$/;" m struct:Dyndata::__anon337ee4430608 typeref:typename:Vardesc * +arr vendor/lua-5.4.8/src/lparser.h /^ Labeldesc *arr; \/* array *\/$/;" m struct:Labellist typeref:typename:Labeldesc * +array vendor/lua-5.4.8/src/lobject.h /^ TValue *array; \/* array part *\/$/;" m struct:Table typeref:typename:TValue * +arrayindex vendor/lua-5.4.8/src/ltable.c /^static unsigned int arrayindex (lua_Integer k) {$/;" f typeref:typename:unsigned int file: +atomic vendor/lua-5.4.8/src/lgc.c /^static lu_mem atomic (lua_State *L) {$/;" f typeref:typename:lu_mem file: +atomic vendor/lua-5.4.8/src/lgc.c /^static lu_mem atomic (lua_State *L);$/;" p typeref:typename:lu_mem file: +atomic2gen vendor/lua-5.4.8/src/lgc.c /^static void atomic2gen (lua_State *L, global_State *g) {$/;" f typeref:typename:void file: +aux_close vendor/lua-5.4.8/src/liolib.c /^static int aux_close (lua_State *L) {$/;" f typeref:typename:int file: +aux_getn vendor/lua-5.4.8/src/ltablib.c /^#define aux_getn(/;" d file: +aux_lines vendor/lua-5.4.8/src/liolib.c /^static void aux_lines (lua_State *L, int toclose) {$/;" f typeref:typename:void file: +aux_rawset vendor/lua-5.4.8/src/lapi.c /^static void aux_rawset (lua_State *L, int idx, TValue *key, int n) {$/;" f typeref:typename:void file: +aux_upvalue vendor/lua-5.4.8/src/lapi.c /^static const char *aux_upvalue (TValue *fi, int n, TValue **val,$/;" f typeref:typename:const char * file: +auxgetinfo vendor/lua-5.4.8/src/ldebug.c /^static int auxgetinfo (lua_State *L, const char *what, lua_Debug *ar,$/;" f typeref:typename:int file: +auxgetstr vendor/lua-5.4.8/src/lapi.c /^l_sinline int auxgetstr (lua_State *L, const TValue *t, const char *k) {$/;" f typeref:typename:l_sinline int +auxresume vendor/lua-5.4.8/src/lcorolib.c /^static int auxresume (lua_State *L, lua_State *co, int narg) {$/;" f typeref:typename:int file: +auxsetstr vendor/lua-5.4.8/src/lapi.c /^static void auxsetstr (lua_State *L, const TValue *t, const char *k) {$/;" f typeref:typename:void file: +auxsort vendor/lua-5.4.8/src/ltablib.c /^static void auxsort (lua_State *L, IdxT lo, IdxT up,$/;" f typeref:typename:void file: +auxstatus vendor/lua-5.4.8/src/lcorolib.c /^static int auxstatus (lua_State *L, lua_State *co) {$/;" f typeref:typename:int file: +auxupvalue vendor/lua-5.4.8/src/ldblib.c /^static int auxupvalue (lua_State *L, int get) {$/;" f typeref:typename:int file: +b vendor/lua-5.4.8/src/lauxlib.h /^ char b[LUAL_BUFFERSIZE]; \/* initial buffer *\/$/;" m union:luaL_Buffer::__anon6cb25fdb010a typeref:typename:char[] +b vendor/lua-5.4.8/src/lauxlib.h /^ char *b; \/* buffer address *\/$/;" m struct:luaL_Buffer typeref:typename:char * +b vendor/lua-5.4.8/src/ldo.c /^ luai_jmpbuf b;$/;" m struct:lua_longjmp typeref:typename:luai_jmpbuf file: +b vendor/raylib-5.5_linux_amd64/include/raylib.h /^ unsigned char b; \/\/ Color blue value$/;" m struct:Color typeref:typename:unsigned char +b_str2int vendor/lua-5.4.8/src/lbaselib.c /^static const char *b_str2int (const char *s, int base, lua_Integer *pn) {$/;" f typeref:typename:const char * file: +baseSize vendor/raylib-5.5_linux_amd64/include/raylib.h /^ int baseSize; \/\/ Base size (default chars height)$/;" m struct:Font typeref:typename:int +base_ci vendor/lua-5.4.8/src/lstate.h /^ CallInfo base_ci; \/* CallInfo for first level (C calling Lua) *\/$/;" m struct:lua_State typeref:typename:CallInfo +base_funcs vendor/lua-5.4.8/src/lbaselib.c /^static const luaL_Reg base_funcs[] = {$/;" v typeref:typename:const luaL_Reg[] file: +basehookcount vendor/lua-5.4.8/src/lstate.h /^ int basehookcount;$/;" m struct:lua_State typeref:typename:int +basic example vendor/raylib-5.5_linux_amd64/README.md /^basic example$/;" s +basicgetobjname vendor/lua-5.4.8/src/ldebug.c /^static const char *basicgetobjname (const Proto *p, int *ppc, int reg,$/;" f typeref:typename:const char * file: +bindPose vendor/raylib-5.5_linux_amd64/include/raylib.h /^ Transform *bindPose; \/\/ Bones base transformation (pose)$/;" m struct:Model typeref:typename:Transform * +bindata vendor/lua-5.4.8/src/lobject.h /^ union {LUAI_MAXALIGN;} bindata;$/;" m struct:Udata0 typeref:union:Udata0::__anon808f9fcd040a +binopr2TM vendor/lua-5.4.8/src/lcode.c /^l_sinline TMS binopr2TM (BinOpr opr) {$/;" f typeref:typename:l_sinline TMS +binopr2op vendor/lua-5.4.8/src/lcode.c /^l_sinline OpCode binopr2op (BinOpr opr, BinOpr baser, OpCode base) {$/;" f typeref:typename:l_sinline OpCode +binsearch vendor/lua-5.4.8/src/ltable.c /^static unsigned int binsearch (const TValue *array, unsigned int i,$/;" f typeref:typename:unsigned int file: +bit2mask vendor/lua-5.4.8/src/lgc.h /^#define bit2mask(/;" d +bitmask vendor/lua-5.4.8/src/lgc.h /^#define bitmask(/;" d +bl vendor/lua-5.4.8/src/lparser.h /^ struct BlockCnt *bl; \/* chain of current blocks *\/$/;" m struct:FuncState typeref:struct:BlockCnt * +blen vendor/lua-5.4.8/src/lobject.c /^ int blen; \/* length of partial string in 'space' *\/$/;" m struct:BuffFS typeref:typename:int file: +block vendor/lua-5.4.8/src/lparser.c /^static void block (LexState *ls) {$/;" f typeref:typename:void file: +block_follow vendor/lua-5.4.8/src/lparser.c /^static int block_follow (LexState *ls, int withuntil) {$/;" f typeref:typename:int file: +body vendor/lua-5.4.8/src/lparser.c /^static void body (LexState *ls, expdesc *e, int ismethod, int line) {$/;" f typeref:typename:void file: +boneCount vendor/raylib-5.5_linux_amd64/include/raylib.h /^ int boneCount; \/\/ Number of bones$/;" m struct:Mesh typeref:typename:int +boneCount vendor/raylib-5.5_linux_amd64/include/raylib.h /^ int boneCount; \/\/ Number of bones$/;" m struct:Model typeref:typename:int +boneCount vendor/raylib-5.5_linux_amd64/include/raylib.h /^ int boneCount; \/\/ Number of bones$/;" m struct:ModelAnimation typeref:typename:int +boneIds vendor/raylib-5.5_linux_amd64/include/raylib.h /^ unsigned char *boneIds; \/\/ Vertex bone ids, max 255 bone ids, up to 4 bones influence by v/;" m struct:Mesh typeref:typename:unsigned char * +boneMatrices vendor/raylib-5.5_linux_amd64/include/raylib.h /^ Matrix *boneMatrices; \/\/ Bones animated transformation matrices$/;" m struct:Mesh typeref:typename:Matrix * +boneWeights vendor/raylib-5.5_linux_amd64/include/raylib.h /^ float *boneWeights; \/\/ Vertex bone weight, up to 4 bones influence by vertex (skinning/;" m struct:Mesh typeref:typename:float * +bones vendor/raylib-5.5_linux_amd64/include/raylib.h /^ BoneInfo *bones; \/\/ Bones information (skeleton)$/;" m struct:Model typeref:typename:BoneInfo * +bones vendor/raylib-5.5_linux_amd64/include/raylib.h /^ BoneInfo *bones; \/\/ Bones information (skeleton)$/;" m struct:ModelAnimation typeref:typename:BoneInfo * +boolF vendor/lua-5.4.8/src/lcode.c /^static int boolF (FuncState *fs) {$/;" f typeref:typename:int file: +boolT vendor/lua-5.4.8/src/lcode.c /^static int boolT (FuncState *fs) {$/;" f typeref:typename:int file: +bottom vendor/raylib-5.5_linux_amd64/include/raylib.h /^ int bottom; \/\/ Bottom border offset$/;" m struct:NPatchInfo typeref:typename:int +box vendor/lua-5.4.8/src/lauxlib.c /^ void *box;$/;" m struct:UBox typeref:typename:void * file: +boxgc vendor/lua-5.4.8/src/lauxlib.c /^static int boxgc (lua_State *L) {$/;" f typeref:typename:int file: +boxmt vendor/lua-5.4.8/src/lauxlib.c /^static const luaL_Reg boxmt[] = { \/* box metamethods *\/$/;" v typeref:typename:const luaL_Reg[] file: +breakstat vendor/lua-5.4.8/src/lparser.c /^static void breakstat (LexState *ls) {$/;" f typeref:typename:void file: +bsd vendor/lua-5.4.8/src/Makefile /^bsd:$/;" t +bsize vendor/lua-5.4.8/src/lauxlib.c /^ size_t bsize;$/;" m struct:UBox typeref:typename:size_t file: +buff vendor/lua-5.4.8/src/lauxlib.c /^ char buff[BUFSIZ]; \/* area for reading file *\/$/;" m struct:LoadF typeref:typename:char[] file: +buff vendor/lua-5.4.8/src/ldo.c /^ Mbuffer buff; \/* dynamic structure used by the scanner *\/$/;" m struct:SParser typeref:typename:Mbuffer file: +buff vendor/lua-5.4.8/src/liolib.c /^ char buff[L_MAXLENNUM + 1]; \/* +1 for ending '\\0' *\/$/;" m struct:__anon9a52bfe00108 typeref:typename:char[] file: +buff vendor/lua-5.4.8/src/llex.h /^ Mbuffer *buff; \/* buffer for tokens *\/$/;" m struct:LexState typeref:typename:Mbuffer * +buffer vendor/lua-5.4.8/src/lzio.h /^ char *buffer;$/;" m struct:Mbuffer typeref:typename:char * +buffer vendor/raylib-5.5_linux_amd64/include/raylib.h /^ rAudioBuffer *buffer; \/\/ Pointer to internal data used by the audio system$/;" m struct:AudioStream typeref:typename:rAudioBuffer * +bufferCount vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ int bufferCount; \/\/ Number of vertex buffers (multi-buffering support)$/;" m struct:rlRenderBatch typeref:typename:int +buffonstack vendor/lua-5.4.8/src/lauxlib.c /^#define buffonstack(/;" d file: +buffsize vendor/lua-5.4.8/src/lzio.h /^ size_t buffsize;$/;" m struct:Mbuffer typeref:typename:size_t +build and installation vendor/raylib-5.5_linux_amd64/README.md /^build and installation$/;" s +byteoffset vendor/lua-5.4.8/src/lutf8lib.c /^static int byteoffset (lua_State *L) {$/;" f typeref:typename:int file: +c vendor/lua-5.4.8/src/liolib.c /^ int c; \/* current character (look ahead) *\/$/;" m struct:__anon9a52bfe00108 typeref:typename:int file: +c vendor/lua-5.4.8/src/lobject.h /^ CClosure c;$/;" m union:Closure typeref:typename:CClosure +c vendor/lua-5.4.8/src/lstate.h /^ } c;$/;" m union:CallInfo::__anona701f1f7010a typeref:struct:CallInfo::__anona701f1f7010a::__anona701f1f70308 +c vendor/lua-5.4.8/src/lstrlib.c /^ struct cD { char c; union { LUAI_MAXALIGN; } u; };$/;" m struct:getoption::cD typeref:typename:char file: +c89 vendor/lua-5.4.8/src/Makefile /^c89:$/;" t +cD vendor/lua-5.4.8/src/lstrlib.c /^ struct cD { char c; union { LUAI_MAXALIGN; } u; };$/;" s function:getoption file: +callallpendingfinalizers vendor/lua-5.4.8/src/lgc.c /^static void callallpendingfinalizers (lua_State *L) {$/;" f typeref:typename:void file: +callbinTM vendor/lua-5.4.8/src/ltm.c /^static int callbinTM (lua_State *L, const TValue *p1, const TValue *p2,$/;" f typeref:typename:int file: +callclosemethod vendor/lua-5.4.8/src/lfunc.c /^static void callclosemethod (lua_State *L, TValue *obj, TValue *err, int yy) {$/;" f typeref:typename:void file: +callfrealloc vendor/lua-5.4.8/src/lmem.c /^#define callfrealloc(/;" d file: +callstatus vendor/lua-5.4.8/src/lstate.h /^ unsigned short callstatus;$/;" m struct:CallInfo typeref:typename:unsigned short +cannot vendor/lua-5.4.8/src/luac.c /^static void cannot(const char* what)$/;" f typeref:typename:void file: +cantryagain vendor/lua-5.4.8/src/lmem.c /^#define cantryagain(/;" d file: +capacity vendor/raylib-5.5_linux_amd64/include/raylib.h /^ unsigned int capacity; \/\/ Events max entries (MAX_AUTOMATION_EVENTS)$/;" m struct:AutomationEventList typeref:typename:unsigned int +capacity vendor/raylib-5.5_linux_amd64/include/raylib.h /^ unsigned int capacity; \/\/ Filepaths max entries$/;" m struct:FilePathList typeref:typename:unsigned int +capture vendor/lua-5.4.8/src/lstrlib.c /^ } capture[LUA_MAXCAPTURES];$/;" m struct:MatchState typeref:struct:MatchState::__anonae5a27210108[] file: +capture_to_close vendor/lua-5.4.8/src/lstrlib.c /^static int capture_to_close (MatchState *ms) {$/;" f typeref:typename:int file: +cast vendor/lua-5.4.8/src/llimits.h /^#define cast(/;" d +cast_byte vendor/lua-5.4.8/src/llimits.h /^#define cast_byte(/;" d +cast_char vendor/lua-5.4.8/src/llimits.h /^#define cast_char(/;" d +cast_charp vendor/lua-5.4.8/src/llimits.h /^#define cast_charp(/;" d +cast_func vendor/lua-5.4.8/src/loadlib.c /^#define cast_func(/;" d file: +cast_int vendor/lua-5.4.8/src/llimits.h /^#define cast_int(/;" d +cast_num vendor/lua-5.4.8/src/llimits.h /^#define cast_num(/;" d +cast_sizet vendor/lua-5.4.8/src/llimits.h /^#define cast_sizet(/;" d +cast_u vendor/lua-5.4.8/src/lstate.h /^#define cast_u(/;" d +cast_uchar vendor/lua-5.4.8/src/llimits.h /^#define cast_uchar(/;" d +cast_uint vendor/lua-5.4.8/src/llimits.h /^#define cast_uint(/;" d +cast_void vendor/lua-5.4.8/src/llimits.h /^#define cast_void(/;" d +cast_voidp vendor/lua-5.4.8/src/llimits.h /^#define cast_voidp(/;" d +ccall vendor/lua-5.4.8/src/ldo.c /^l_sinline void ccall (lua_State *L, StkId func, int nResults, l_uint32 inc) {$/;" f typeref:typename:l_sinline void +changeage vendor/lua-5.4.8/src/lgc.h /^#define changeage(/;" d +changedline vendor/lua-5.4.8/src/ldebug.c /^static int changedline (const Proto *p, int oldpc, int newpc) {$/;" f typeref:typename:int file: +changewhite vendor/lua-5.4.8/src/lgc.h /^#define changewhite(/;" d +channels vendor/raylib-5.5_linux_amd64/include/raylib.h /^ unsigned int channels; \/\/ Number of channels (1-mono, 2-stereo, ...)$/;" m struct:AudioStream typeref:typename:unsigned int +channels vendor/raylib-5.5_linux_amd64/include/raylib.h /^ unsigned int channels; \/\/ Number of channels (1-mono, 2-stereo, ...)$/;" m struct:Wave typeref:typename:unsigned int +check vendor/lua-5.4.8/src/lparser.c /^static void check (LexState *ls, int c) {$/;" f typeref:typename:void file: +checkGC vendor/lua-5.4.8/src/lvm.c /^#define checkGC(/;" d file: +checkHeader vendor/lua-5.4.8/src/lundump.c /^static void checkHeader (LoadState *S) {$/;" f typeref:typename:void file: +checkSizes vendor/lua-5.4.8/src/lgc.c /^static void checkSizes (lua_State *L, global_State *g) {$/;" f typeref:typename:void file: +check_capture vendor/lua-5.4.8/src/lstrlib.c /^static int check_capture (MatchState *ms, int l) {$/;" f typeref:typename:int file: +check_condition vendor/lua-5.4.8/src/lparser.c /^#define check_condition(/;" d file: +check_conflict vendor/lua-5.4.8/src/lparser.c /^static void check_conflict (LexState *ls, struct LHS_assign *lh, expdesc *v) {$/;" f typeref:typename:void file: +check_exp vendor/lua-5.4.8/src/llimits.h /^#define check_exp(/;" d +check_match vendor/lua-5.4.8/src/lparser.c /^static void check_match (LexState *ls, int what, int who, int where) {$/;" f typeref:typename:void file: +check_next1 vendor/lua-5.4.8/src/llex.c /^static int check_next1 (LexState *ls, int c) {$/;" f typeref:typename:int file: +check_next2 vendor/lua-5.4.8/src/llex.c /^static int check_next2 (LexState *ls, const char *set) {$/;" f typeref:typename:int file: +check_readonly vendor/lua-5.4.8/src/lparser.c /^static void check_readonly (LexState *ls, expdesc *e) {$/;" f typeref:typename:void file: +checkbufferlevel vendor/lua-5.4.8/src/lauxlib.c /^#define checkbufferlevel(/;" d file: +checkclib vendor/lua-5.4.8/src/loadlib.c /^static void *checkclib (lua_State *L, const char *path) {$/;" f typeref:typename:void * file: +checkclosemth vendor/lua-5.4.8/src/lfunc.c /^static void checkclosemth (lua_State *L, StkId level) {$/;" f typeref:typename:void file: +checkcontrol vendor/lua-5.4.8/src/lauxlib.c /^static int checkcontrol (lua_State *L, const char *message, int tocont) {$/;" f typeref:typename:int file: +checkfield vendor/lua-5.4.8/src/ltablib.c /^static int checkfield (lua_State *L, const char *key, int n) {$/;" f typeref:typename:int file: +checkformat vendor/lua-5.4.8/src/lstrlib.c /^static void checkformat (lua_State *L, const char *form, const char *flags,$/;" f typeref:typename:void file: +checklimit vendor/lua-5.4.8/src/lparser.c /^static void checklimit (FuncState *fs, int v, int l, const char *what) {$/;" f typeref:typename:void file: +checkliteral vendor/lua-5.4.8/src/lundump.c /^static void checkliteral (LoadState *S, const char *s, const char *msg) {$/;" f typeref:typename:void file: +checkliveness vendor/lua-5.4.8/src/lobject.h /^#define checkliveness(/;" d +checkload vendor/lua-5.4.8/src/loadlib.c /^static int checkload (lua_State *L, int stat, const char *filename) {$/;" f typeref:typename:int file: +checkmode vendor/lua-5.4.8/src/ldo.c /^static void checkmode (lua_State *L, const char *mode, const char *x) {$/;" f typeref:typename:void file: +checknext vendor/lua-5.4.8/src/lparser.c /^static void checknext (LexState *ls, int c) {$/;" f typeref:typename:void file: +checkopm vendor/lua-5.4.8/src/lopcodes.h /^#define checkopm(/;" d +checkoption vendor/lua-5.4.8/src/loslib.c /^static const char *checkoption (lua_State *L, const char *conv,$/;" f typeref:typename:const char * file: +checkpointer vendor/lua-5.4.8/src/lgc.c /^static void checkpointer (GCObject **p, GCObject *o) {$/;" f typeref:typename:void file: +checkrepeated vendor/lua-5.4.8/src/lparser.c /^static void checkrepeated (LexState *ls, TString *name) {$/;" f typeref:typename:void file: +checkresults vendor/lua-5.4.8/src/lapi.c /^#define checkresults(/;" d file: +checksize vendor/lua-5.4.8/src/lundump.c /^#define checksize(/;" d file: +checkstack vendor/lua-5.4.8/src/ldblib.c /^static void checkstack (lua_State *L, lua_State *L1, int n) {$/;" f typeref:typename:void file: +checkstackGC vendor/lua-5.4.8/src/ldo.h /^#define checkstackGC(/;" d +checkstackGCp vendor/lua-5.4.8/src/ldo.h /^#define checkstackGCp(/;" d +checkstackp vendor/lua-5.4.8/src/ldo.h /^#define checkstackp(/;" d +checktab vendor/lua-5.4.8/src/ltablib.c /^static void checktab (lua_State *L, int arg, int what) {$/;" f typeref:typename:void file: +checktag vendor/lua-5.4.8/src/lobject.h /^#define checktag(/;" d +checktoclose vendor/lua-5.4.8/src/lparser.c /^static void checktoclose (FuncState *fs, int level) {$/;" f typeref:typename:void file: +checktype vendor/lua-5.4.8/src/lobject.h /^#define checktype(/;" d +checkupval vendor/lua-5.4.8/src/ldblib.c /^static void *checkupval (lua_State *L, int argf, int argnup, int *pnup) {$/;" f typeref:typename:void * file: +checkvalres vendor/lua-5.4.8/src/lbaselib.c /^#define checkvalres(/;" d file: +chgfltvalue vendor/lua-5.4.8/src/lobject.h /^#define chgfltvalue(/;" d +chgivalue vendor/lua-5.4.8/src/lobject.h /^#define chgivalue(/;" d +choosePivot vendor/lua-5.4.8/src/ltablib.c /^static IdxT choosePivot (IdxT lo, IdxT up, unsigned int rnd) {$/;" f typeref:typename:IdxT file: +chromaAbCorrection vendor/raylib-5.5_linux_amd64/include/raylib.h /^ float chromaAbCorrection[4]; \/\/ Chromatic aberration correction parameters$/;" m struct:VrDeviceInfo typeref:typename:float[4] +ci vendor/lua-5.4.8/src/lstate.h /^ CallInfo *ci; \/* call info for current function *\/$/;" m struct:lua_State typeref:typename:CallInfo * +ci_func vendor/lua-5.4.8/src/ldebug.h /^#define ci_func(/;" d +cl vendor/lua-5.4.8/src/lstate.h /^ union Closure cl;$/;" m union:GCUnion typeref:union:Closure +clCvalue vendor/lua-5.4.8/src/lobject.h /^#define clCvalue(/;" d +clLvalue vendor/lua-5.4.8/src/lobject.h /^#define clLvalue(/;" d +classend vendor/lua-5.4.8/src/lstrlib.c /^static const char *classend (MatchState *ms, const char *p) {$/;" f typeref:typename:const char * file: +clean vendor/lua-5.4.8/Makefile /^$(PLATS) help test clean:$/;" t +clean vendor/lua-5.4.8/src/Makefile /^clean:$/;" t +clearbuff vendor/lua-5.4.8/src/lobject.c /^static void clearbuff (BuffFS *buff) {$/;" f typeref:typename:void file: +clearbykeys vendor/lua-5.4.8/src/lgc.c /^static void clearbykeys (global_State *g, GCObject *l) {$/;" f typeref:typename:void file: +clearbyvalues vendor/lua-5.4.8/src/lgc.c /^static void clearbyvalues (global_State *g, GCObject *l, GCObject *f) {$/;" f typeref:typename:void file: +cleargraylists vendor/lua-5.4.8/src/lgc.c /^static void cleargraylists (global_State *g) {$/;" f typeref:typename:void file: +clearkey vendor/lua-5.4.8/src/lgc.c /^static void clearkey (Node *n) {$/;" f typeref:typename:void file: +close vendor/lua-5.4.8/src/lparser.h /^ lu_byte close; \/* goto that escapes upvalues *\/$/;" m struct:Labeldesc typeref:typename:lu_byte +close_func vendor/lua-5.4.8/src/lparser.c /^static void close_func (LexState *ls) {$/;" f typeref:typename:void file: +close_state vendor/lua-5.4.8/src/lstate.c /^static void close_state (lua_State *L) {$/;" f typeref:typename:void file: +closef vendor/lua-5.4.8/src/lauxlib.h /^ lua_CFunction closef; \/* to close stream (NULL for closed streams) *\/$/;" m struct:luaL_Stream typeref:typename:lua_CFunction +closelistfield vendor/lua-5.4.8/src/lparser.c /^static void closelistfield (FuncState *fs, ConsControl *cc) {$/;" f typeref:typename:void file: +closepaux vendor/lua-5.4.8/src/ldo.c /^static void closepaux (lua_State *L, void *ud) {$/;" f typeref:typename:void file: +clvalue vendor/lua-5.4.8/src/lobject.h /^#define clvalue(/;" d +co_funcs vendor/lua-5.4.8/src/lcorolib.c /^static const luaL_Reg co_funcs[] = {$/;" v typeref:typename:const luaL_Reg[] file: +code vendor/lua-5.4.8/src/lobject.h /^ Instruction *code; \/* opcodes *\/$/;" m struct:Proto typeref:typename:Instruction * +codeABRK vendor/lua-5.4.8/src/lcode.c /^static void codeABRK (FuncState *fs, OpCode o, int a, int b,$/;" f typeref:typename:void file: +codeAsBx vendor/lua-5.4.8/src/lcode.c /^static int codeAsBx (FuncState *fs, OpCode o, int a, int bc) {$/;" f typeref:typename:int file: +codeNresults vendor/lua-5.4.8/src/lapi.h /^#define codeNresults(/;" d +code_loadbool vendor/lua-5.4.8/src/lcode.c /^static int code_loadbool (FuncState *fs, int A, OpCode op) {$/;" f typeref:typename:int file: +codearith vendor/lua-5.4.8/src/lcode.c /^static void codearith (FuncState *fs, BinOpr opr,$/;" f typeref:typename:void file: +codebinK vendor/lua-5.4.8/src/lcode.c /^static void codebinK (FuncState *fs, BinOpr opr,$/;" f typeref:typename:void file: +codebinNoK vendor/lua-5.4.8/src/lcode.c /^static void codebinNoK (FuncState *fs, BinOpr opr,$/;" f typeref:typename:void file: +codebinexpval vendor/lua-5.4.8/src/lcode.c /^static void codebinexpval (FuncState *fs, BinOpr opr,$/;" f typeref:typename:void file: +codebini vendor/lua-5.4.8/src/lcode.c /^static void codebini (FuncState *fs, OpCode op,$/;" f typeref:typename:void file: +codebitwise vendor/lua-5.4.8/src/lcode.c /^static void codebitwise (FuncState *fs, BinOpr opr,$/;" f typeref:typename:void file: +codeclosure vendor/lua-5.4.8/src/lparser.c /^static void codeclosure (LexState *ls, expdesc *v) {$/;" f typeref:typename:void file: +codecommutative vendor/lua-5.4.8/src/lcode.c /^static void codecommutative (FuncState *fs, BinOpr op,$/;" f typeref:typename:void file: +codeconcat vendor/lua-5.4.8/src/lcode.c /^static void codeconcat (FuncState *fs, expdesc *e1, expdesc *e2, int line) {$/;" f typeref:typename:void file: +codeeq vendor/lua-5.4.8/src/lcode.c /^static void codeeq (FuncState *fs, BinOpr opr, expdesc *e1, expdesc *e2) {$/;" f typeref:typename:void file: +codeextraarg vendor/lua-5.4.8/src/lcode.c /^static int codeextraarg (FuncState *fs, int a) {$/;" f typeref:typename:int file: +codename vendor/lua-5.4.8/src/lparser.c /^static void codename (LexState *ls, expdesc *e) {$/;" f typeref:typename:void file: +codenot vendor/lua-5.4.8/src/lcode.c /^static void codenot (FuncState *fs, expdesc *e) {$/;" f typeref:typename:void file: +codeorder vendor/lua-5.4.8/src/lcode.c /^static void codeorder (FuncState *fs, BinOpr opr, expdesc *e1, expdesc *e2) {$/;" f typeref:typename:void file: +codepoint vendor/lua-5.4.8/src/lutf8lib.c /^static int codepoint (lua_State *L) {$/;" f typeref:typename:int file: +codesJ vendor/lua-5.4.8/src/lcode.c /^static int codesJ (FuncState *fs, OpCode o, int sj, int k) {$/;" f typeref:typename:int file: +codesJ vendor/lua-5.4.8/src/lcode.c /^static int codesJ (FuncState *fs, OpCode o, int sj, int k);$/;" p typeref:typename:int file: +codestring vendor/lua-5.4.8/src/lparser.c /^static void codestring (expdesc *e, TString *s) {$/;" f typeref:typename:void file: +codeunexpval vendor/lua-5.4.8/src/lcode.c /^static void codeunexpval (FuncState *fs, OpCode op, expdesc *e, int line) {$/;" f typeref:typename:void file: +collectargs vendor/lua-5.4.8/src/lua.c /^static int collectargs (char **argv, int *first) {$/;" f typeref:typename:int file: +collectvalidlines vendor/lua-5.4.8/src/ldebug.c /^static void collectvalidlines (lua_State *L, Closure *f) {$/;" f typeref:typename:void file: +color vendor/raylib-5.5_linux_amd64/include/raylib.h /^ Color color; \/\/ Material map color$/;" m struct:MaterialMap typeref:typename:Color +colora vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ unsigned char colorr, colorg, colorb, colora; \/\/ Current active color (added on glVe/;" m struct:rlglData::__anon1f68b8bd0d08 typeref:typename:unsigned char +colorb vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ unsigned char colorr, colorg, colorb, colora; \/\/ Current active color (added on glVe/;" m struct:rlglData::__anon1f68b8bd0d08 typeref:typename:unsigned char +colorg vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ unsigned char colorr, colorg, colorb, colora; \/\/ Current active color (added on glVe/;" m struct:rlglData::__anon1f68b8bd0d08 typeref:typename:unsigned char +colorr vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ unsigned char colorr, colorg, colorb, colora; \/\/ Current active color (added on glVe/;" m struct:rlglData::__anon1f68b8bd0d08 typeref:typename:unsigned char +colors vendor/raylib-5.5_linux_amd64/include/raylib.h /^ unsigned char *colors; \/\/ Vertex colors (RGBA - 4 components per vertex) (shader-loca/;" m struct:Mesh typeref:typename:unsigned char * +colors vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ unsigned char *colors; \/\/ Vertex colors (RGBA - 4 components per vertex) (shader-loca/;" m struct:rlVertexBuffer typeref:typename:unsigned char * +combine vendor/lua-5.4.8/src/luac.c /^static const Proto* combine(lua_State* L, int n)$/;" f typeref:typename:const Proto * file: +completestate vendor/lua-5.4.8/src/lstate.h /^#define completestate(/;" d +computeShader vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ bool computeShader; \/\/ Compute shaders support (GL_ARB_compute_shader)$/;" m struct:rlglData::__anon1f68b8bd0e08 typeref:typename:bool +computesizes vendor/lua-5.4.8/src/ltable.c /^static unsigned int computesizes (unsigned int nums[], unsigned int *pna) {$/;" f typeref:typename:unsigned int file: +cond vendor/lua-5.4.8/src/lparser.c /^static int cond (LexState *ls) {$/;" f typeref:typename:int file: +condchangemem vendor/lua-5.4.8/src/llimits.h /^#define condchangemem(/;" d +condjump vendor/lua-5.4.8/src/lcode.c /^static int condjump (FuncState *fs, OpCode op, int A, int B, int C, int k) {$/;" f typeref:typename:int file: +condmovestack vendor/lua-5.4.8/src/llimits.h /^#define condmovestack(/;" d +const2exp vendor/lua-5.4.8/src/lcode.c /^static void const2exp (TValue *v, expdesc *e) {$/;" f typeref:typename:void file: +const2val vendor/lua-5.4.8/src/lcode.c /^static TValue *const2val (FuncState *fs, const expdesc *e) {$/;" f typeref:typename:TValue * file: +constfolding vendor/lua-5.4.8/src/lcode.c /^static int constfolding (FuncState *fs, int op, expdesc *e1,$/;" f typeref:typename:int file: +constructor vendor/lua-5.4.8/src/lparser.c /^static void constructor (LexState *ls, expdesc *t) {$/;" f typeref:typename:void file: +contact and networks vendor/raylib-5.5_linux_amd64/README.md /^contact and networks$/;" s +contents vendor/lua-5.4.8/src/lobject.h /^ char contents[1];$/;" m struct:TString typeref:typename:char[1] +contributors vendor/raylib-5.5_linux_amd64/README.md /^contributors$/;" s +convergeephemerons vendor/lua-5.4.8/src/lgc.c /^static void convergeephemerons (global_State *g) {$/;" f typeref:typename:void file: +copy2buff vendor/lua-5.4.8/src/lvm.c /^static void copy2buff (StkId top, int n, char *buff) {$/;" f typeref:typename:void file: +copywithendian vendor/lua-5.4.8/src/lstrlib.c /^static void copywithendian (char *dest, const char *src,$/;" f typeref:typename:void file: +correctgraylist vendor/lua-5.4.8/src/lgc.c /^static GCObject **correctgraylist (GCObject **p) {$/;" f typeref:typename:GCObject ** file: +correctgraylists vendor/lua-5.4.8/src/lgc.c /^static void correctgraylists (global_State *g) {$/;" f typeref:typename:void file: +correctpointers vendor/lua-5.4.8/src/lgc.c /^static void correctpointers (global_State *g, GCObject *o) {$/;" f typeref:typename:void file: +correctstack vendor/lua-5.4.8/src/ldo.c /^static void correctstack (lua_State *L) {$/;" f typeref:typename:void file: +count vendor/raylib-5.5_linux_amd64/include/raylib.h /^ unsigned int count; \/\/ Events entries count$/;" m struct:AutomationEventList typeref:typename:unsigned int +count vendor/raylib-5.5_linux_amd64/include/raylib.h /^ unsigned int count; \/\/ Filepaths entries count$/;" m struct:FilePathList typeref:typename:unsigned int +countint vendor/lua-5.4.8/src/ltable.c /^static int countint (lua_Integer key, unsigned int *nums) {$/;" f typeref:typename:int file: +createargtable vendor/lua-5.4.8/src/lua.c /^static void createargtable (lua_State *L, char **argv, int argc, int script) {$/;" f typeref:typename:void file: +createclibstable vendor/lua-5.4.8/src/loadlib.c /^static void createclibstable (lua_State *L) {$/;" f typeref:typename:void file: +createlabel vendor/lua-5.4.8/src/lparser.c /^static int createlabel (LexState *ls, TString *name, int line,$/;" f typeref:typename:int file: +createmeta vendor/lua-5.4.8/src/liolib.c /^static void createmeta (lua_State *L) {$/;" f typeref:typename:void file: +createmetatable vendor/lua-5.4.8/src/lstrlib.c /^static void createmetatable (lua_State *L) {$/;" f typeref:typename:void file: +createsearcherstable vendor/lua-5.4.8/src/loadlib.c /^static void createsearcherstable (lua_State *L) {$/;" f typeref:typename:void file: +createstdfile vendor/lua-5.4.8/src/liolib.c /^static void createstdfile (lua_State *L, FILE *f, const char *k,$/;" f typeref:typename:void file: +createstrobj vendor/lua-5.4.8/src/lstring.c /^static TString *createstrobj (lua_State *L, size_t l, int tag, unsigned int h) {$/;" f typeref:typename:TString * file: +ctb vendor/lua-5.4.8/src/lobject.h /^#define ctb(/;" d +ctx vendor/lua-5.4.8/src/lstate.h /^ lua_KContext ctx; \/* context info. in case of yields *\/$/;" m struct:CallInfo::__anona701f1f7010a::__anona701f1f70308 typeref:typename:lua_KContext +ctxData vendor/raylib-5.5_linux_amd64/include/raylib.h /^ void *ctxData; \/\/ Audio context data, depends on type$/;" m struct:Music typeref:typename:void * +ctxType vendor/raylib-5.5_linux_amd64/include/raylib.h /^ int ctxType; \/\/ Type of music context (audio filetype)$/;" m struct:Music typeref:typename:int +currIsNewline vendor/lua-5.4.8/src/llex.c /^#define currIsNewline(/;" d file: +current vendor/lua-5.4.8/src/llex.h /^ int current; \/* current character (charint) *\/$/;" m struct:LexState typeref:typename:int +currentBatch vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ rlRenderBatch *currentBatch; \/\/ Current render batch$/;" m struct:rlglData typeref:typename:rlRenderBatch * +currentBlendMode vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ int currentBlendMode; \/\/ Blending mode active$/;" m struct:rlglData::__anon1f68b8bd0d08 typeref:typename:int +currentBuffer vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ int currentBuffer; \/\/ Current buffer tracking in case of multi-buffering$/;" m struct:rlRenderBatch typeref:typename:int +currentDepth vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ float currentDepth; \/\/ Current depth value for next draw$/;" m struct:rlRenderBatch typeref:typename:float +currentMatrix vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ Matrix *currentMatrix; \/\/ Current matrix pointer$/;" m struct:rlglData::__anon1f68b8bd0d08 typeref:typename:Matrix * +currentMatrixMode vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ int currentMatrixMode; \/\/ Current matrix mode$/;" m struct:rlglData::__anon1f68b8bd0d08 typeref:typename:int +currentShaderId vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ unsigned int currentShaderId; \/\/ Current shader id to be used on rendering (by d/;" m struct:rlglData::__anon1f68b8bd0d08 typeref:typename:unsigned int +currentShaderLocs vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ int *currentShaderLocs; \/\/ Current shader locations pointer to be used on /;" m struct:rlglData::__anon1f68b8bd0d08 typeref:typename:int * +currentline vendor/lua-5.4.8/src/lua.h /^ int currentline; \/* (l) *\/$/;" m struct:lua_Debug typeref:typename:int +currentpc vendor/lua-5.4.8/src/ldebug.c /^static int currentpc (CallInfo *ci) {$/;" f typeref:typename:int file: +currentwhite vendor/lua-5.4.8/src/lstate.h /^ lu_byte currentwhite;$/;" m struct:global_State typeref:typename:lu_byte +cvt2num vendor/lua-5.4.8/src/lvm.h /^#define cvt2num(/;" d +cvt2str vendor/lua-5.4.8/src/lvm.h /^#define cvt2str(/;" d +data vendor/lua-5.4.8/src/ldump.c /^ void *data;$/;" m struct:__anon6dcdaf670108 typeref:typename:void * file: +data vendor/lua-5.4.8/src/lzio.h /^ void *data; \/* additional data *\/$/;" m struct:Zio typeref:typename:void * +data vendor/raylib-5.5_linux_amd64/include/raylib.h /^ void *data; \/\/ Buffer data pointer$/;" m struct:Wave typeref:typename:void * +data vendor/raylib-5.5_linux_amd64/include/raylib.h /^ void *data; \/\/ Image raw data$/;" m struct:Image typeref:typename:void * +db_debug vendor/lua-5.4.8/src/ldblib.c /^static int db_debug (lua_State *L) {$/;" f typeref:typename:int file: +db_gethook vendor/lua-5.4.8/src/ldblib.c /^static int db_gethook (lua_State *L) {$/;" f typeref:typename:int file: +db_getinfo vendor/lua-5.4.8/src/ldblib.c /^static int db_getinfo (lua_State *L) {$/;" f typeref:typename:int file: +db_getlocal vendor/lua-5.4.8/src/ldblib.c /^static int db_getlocal (lua_State *L) {$/;" f typeref:typename:int file: +db_getmetatable vendor/lua-5.4.8/src/ldblib.c /^static int db_getmetatable (lua_State *L) {$/;" f typeref:typename:int file: +db_getregistry vendor/lua-5.4.8/src/ldblib.c /^static int db_getregistry (lua_State *L) {$/;" f typeref:typename:int file: +db_getupvalue vendor/lua-5.4.8/src/ldblib.c /^static int db_getupvalue (lua_State *L) {$/;" f typeref:typename:int file: +db_getuservalue vendor/lua-5.4.8/src/ldblib.c /^static int db_getuservalue (lua_State *L) {$/;" f typeref:typename:int file: +db_setcstacklimit vendor/lua-5.4.8/src/ldblib.c /^static int db_setcstacklimit (lua_State *L) {$/;" f typeref:typename:int file: +db_sethook vendor/lua-5.4.8/src/ldblib.c /^static int db_sethook (lua_State *L) {$/;" f typeref:typename:int file: +db_setlocal vendor/lua-5.4.8/src/ldblib.c /^static int db_setlocal (lua_State *L) {$/;" f typeref:typename:int file: +db_setmetatable vendor/lua-5.4.8/src/ldblib.c /^static int db_setmetatable (lua_State *L) {$/;" f typeref:typename:int file: +db_setupvalue vendor/lua-5.4.8/src/ldblib.c /^static int db_setupvalue (lua_State *L) {$/;" f typeref:typename:int file: +db_setuservalue vendor/lua-5.4.8/src/ldblib.c /^static int db_setuservalue (lua_State *L) {$/;" f typeref:typename:int file: +db_traceback vendor/lua-5.4.8/src/ldblib.c /^static int db_traceback (lua_State *L) {$/;" f typeref:typename:int file: +db_upvalueid vendor/lua-5.4.8/src/ldblib.c /^static int db_upvalueid (lua_State *L) {$/;" f typeref:typename:int file: +db_upvaluejoin vendor/lua-5.4.8/src/ldblib.c /^static int db_upvaluejoin (lua_State *L) {$/;" f typeref:typename:int file: +dblib vendor/lua-5.4.8/src/ldblib.c /^static const luaL_Reg dblib[] = {$/;" v typeref:typename:const luaL_Reg[] file: +decnny vendor/lua-5.4.8/src/lstate.h /^#define decnny(/;" d +decodeNresults vendor/lua-5.4.8/src/lapi.h /^#define decodeNresults(/;" d +default vendor/lua-5.4.8/src/Makefile /^default: $(PLAT)$/;" t +defaultBatch vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ rlRenderBatch defaultBatch; \/\/ Default internal render batch$/;" m struct:rlglData typeref:typename:rlRenderBatch +defaultFShaderId vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ unsigned int defaultFShaderId; \/\/ Default fragment shader id (used by default sha/;" m struct:rlglData::__anon1f68b8bd0d08 typeref:typename:unsigned int +defaultShaderId vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ unsigned int defaultShaderId; \/\/ Default shader program id, supports vertex colo/;" m struct:rlglData::__anon1f68b8bd0d08 typeref:typename:unsigned int +defaultShaderLocs vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ int *defaultShaderLocs; \/\/ Default shader locations pointer to be used on /;" m struct:rlglData::__anon1f68b8bd0d08 typeref:typename:int * +defaultTextureId vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ unsigned int defaultTextureId; \/\/ Default texture used on shapes\/poly drawing (r/;" m struct:rlglData::__anon1f68b8bd0d08 typeref:typename:unsigned int +defaultVShaderId vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ unsigned int defaultVShaderId; \/\/ Default vertex shader id (used by default shade/;" m struct:rlglData::__anon1f68b8bd0d08 typeref:typename:unsigned int +deletelist vendor/lua-5.4.8/src/lgc.c /^static void deletelist (lua_State *L, GCObject *p, GCObject *limit) {$/;" f typeref:typename:void file: +delta vendor/lua-5.4.8/src/lobject.h /^ unsigned short delta;$/;" m struct:StackValue::__anon808f9fcd0108 typeref:typename:unsigned short +depend vendor/lua-5.4.8/src/Makefile /^depend:$/;" t +depth vendor/raylib-5.5_linux_amd64/include/raylib.h /^ Texture depth; \/\/ Depth buffer attachment texture$/;" m struct:RenderTexture typeref:typename:Texture +digit vendor/lua-5.4.8/src/lstrlib.c /^static int digit (int c) { return '0' <= c && c <= '9'; }$/;" f typeref:typename:int file: +direction vendor/raylib-5.5_linux_amd64/include/raylib.h /^ Vector3 direction; \/\/ Ray direction (normalized)$/;" m struct:Ray typeref:typename:Vector3 +discharge2anyreg vendor/lua-5.4.8/src/lcode.c /^static void discharge2anyreg (FuncState *fs, expdesc *e) {$/;" f typeref:typename:void file: +discharge2reg vendor/lua-5.4.8/src/lcode.c /^static void discharge2reg (FuncState *fs, expdesc *e, int reg) {$/;" f typeref:typename:void file: +disptab vendor/lua-5.4.8/src/ljumptab.h /^static const void *const disptab[NUM_OPCODES] = {$/;" v typeref:typename:const void * const[] +distance vendor/raylib-5.5_linux_amd64/include/raylib.h /^ float distance; \/\/ Distance to the nearest hit$/;" m struct:RayCollision typeref:typename:float +doREPL vendor/lua-5.4.8/src/lua.c /^static void doREPL (lua_State *L) {$/;" f typeref:typename:void file: +doargs vendor/lua-5.4.8/src/luac.c /^static int doargs(int argc, char* argv[])$/;" f typeref:typename:int file: +docall vendor/lua-5.4.8/src/lua.c /^static int docall (lua_State *L, int narg, int nres) {$/;" f typeref:typename:int file: +dochunk vendor/lua-5.4.8/src/lua.c /^static int dochunk (lua_State *L, int status) {$/;" f typeref:typename:int file: +docondjump vendor/lua-5.4.8/src/lvm.c /^#define docondjump(/;" d file: +dofile vendor/lua-5.4.8/src/lua.c /^static int dofile (lua_State *L, const char *name) {$/;" f typeref:typename:int file: +dofilecont vendor/lua-5.4.8/src/lbaselib.c /^static int dofilecont (lua_State *L, int d1, lua_KContext d2) {$/;" f typeref:typename:int file: +dojump vendor/lua-5.4.8/src/lvm.c /^#define dojump(/;" d file: +dolibrary vendor/lua-5.4.8/src/lua.c /^static int dolibrary (lua_State *L, char *globname) {$/;" f typeref:typename:int file: +donextjump vendor/lua-5.4.8/src/lvm.c /^#define donextjump(/;" d file: +dostring vendor/lua-5.4.8/src/lua.c /^static int dostring (lua_State *L, const char *s, const char *name) {$/;" f typeref:typename:int file: +dothecall vendor/lua-5.4.8/src/lgc.c /^static void dothecall (lua_State *L, void *ud) {$/;" f typeref:typename:void file: +drawCounter vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ int drawCounter; \/\/ Draw calls counter$/;" m struct:rlRenderBatch typeref:typename:int +draws vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ rlDrawCall *draws; \/\/ Draw calls array, depends on textureId$/;" m struct:rlRenderBatch typeref:typename:rlDrawCall * +dummy vendor/lua-5.4.8/Makefile /^dummy:$/;" t +dummy vendor/lua-5.4.8/src/lstrlib.c /^ int dummy;$/;" m union:__anonae5a2721020a typeref:typename:int file: +dummynode vendor/lua-5.4.8/src/ltable.c /^#define dummynode /;" d file: +dummynode_ vendor/lua-5.4.8/src/ltable.c /^static const Node dummynode_ = {$/;" v typeref:typename:const Node file: +dumpBlock vendor/lua-5.4.8/src/ldump.c /^static void dumpBlock (DumpState *D, const void *b, size_t size) {$/;" f typeref:typename:void file: +dumpByte vendor/lua-5.4.8/src/ldump.c /^static void dumpByte (DumpState *D, int y) {$/;" f typeref:typename:void file: +dumpCode vendor/lua-5.4.8/src/ldump.c /^static void dumpCode (DumpState *D, const Proto *f) {$/;" f typeref:typename:void file: +dumpConstants vendor/lua-5.4.8/src/ldump.c /^static void dumpConstants (DumpState *D, const Proto *f) {$/;" f typeref:typename:void file: +dumpDebug vendor/lua-5.4.8/src/ldump.c /^static void dumpDebug (DumpState *D, const Proto *f) {$/;" f typeref:typename:void file: +dumpFunction vendor/lua-5.4.8/src/ldump.c /^static void dumpFunction (DumpState *D, const Proto *f, TString *psource) {$/;" f typeref:typename:void file: +dumpFunction vendor/lua-5.4.8/src/ldump.c /^static void dumpFunction(DumpState *D, const Proto *f, TString *psource);$/;" p typeref:typename:void file: +dumpHeader vendor/lua-5.4.8/src/ldump.c /^static void dumpHeader (DumpState *D) {$/;" f typeref:typename:void file: +dumpInt vendor/lua-5.4.8/src/ldump.c /^static void dumpInt (DumpState *D, int x) {$/;" f typeref:typename:void file: +dumpInteger vendor/lua-5.4.8/src/ldump.c /^static void dumpInteger (DumpState *D, lua_Integer x) {$/;" f typeref:typename:void file: +dumpLiteral vendor/lua-5.4.8/src/ldump.c /^#define dumpLiteral(/;" d file: +dumpNumber vendor/lua-5.4.8/src/ldump.c /^static void dumpNumber (DumpState *D, lua_Number x) {$/;" f typeref:typename:void file: +dumpProtos vendor/lua-5.4.8/src/ldump.c /^static void dumpProtos (DumpState *D, const Proto *f) {$/;" f typeref:typename:void file: +dumpSize vendor/lua-5.4.8/src/ldump.c /^static void dumpSize (DumpState *D, size_t x) {$/;" f typeref:typename:void file: +dumpString vendor/lua-5.4.8/src/ldump.c /^static void dumpString (DumpState *D, const TString *s) {$/;" f typeref:typename:void file: +dumpUpvalues vendor/lua-5.4.8/src/ldump.c /^static void dumpUpvalues (DumpState *D, const Proto *f) {$/;" f typeref:typename:void file: +dumpVar vendor/lua-5.4.8/src/ldump.c /^#define dumpVar(/;" d file: +dumpVector vendor/lua-5.4.8/src/ldump.c /^#define dumpVector(/;" d file: +dumping vendor/lua-5.4.8/src/luac.c /^static int dumping=1; \/* dump bytecodes? *\/$/;" v typeref:typename:int file: +dyd vendor/lua-5.4.8/src/ldo.c /^ Dyndata dyd; \/* dynamic structures used by the parser *\/$/;" m struct:SParser typeref:typename:Dyndata file: +dyd vendor/lua-5.4.8/src/llex.h /^ struct Dyndata *dyd; \/* dynamic structures used by the parser *\/$/;" m struct:LexState typeref:struct:Dyndata * +echo vendor/lua-5.4.8/Makefile /^echo:$/;" t +echo vendor/lua-5.4.8/src/Makefile /^echo:$/;" t +elementCount vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ int elementCount; \/\/ Number of elements in the buffer (QUADS)$/;" m struct:rlVertexBuffer typeref:typename:int +end_capture vendor/lua-5.4.8/src/lstrlib.c /^static const char *end_capture (MatchState *ms, const char *s,$/;" f typeref:typename:const char * file: +endpc vendor/lua-5.4.8/src/lobject.h /^ int endpc; \/* first point where variable is dead *\/$/;" m struct:LocVar typeref:typename:int +enterblock vendor/lua-5.4.8/src/lparser.c /^static void enterblock (FuncState *fs, BlockCnt *bl, lu_byte isloop) {$/;" f typeref:typename:void file: +entergen vendor/lua-5.4.8/src/lgc.c /^static lu_mem entergen (lua_State *L, global_State *g) {$/;" f typeref:typename:lu_mem file: +enterinc vendor/lua-5.4.8/src/lgc.c /^static void enterinc (global_State *g) {$/;" f typeref:typename:void file: +enterlevel vendor/lua-5.4.8/src/lparser.c /^#define enterlevel(/;" d file: +entersweep vendor/lua-5.4.8/src/lgc.c /^static void entersweep (lua_State *L) {$/;" f typeref:typename:void file: +entersweep vendor/lua-5.4.8/src/lgc.c /^static void entersweep (lua_State *L);$/;" p typeref:typename:void file: +envn vendor/lua-5.4.8/src/llex.h /^ TString *envn; \/* environment variable name *\/$/;" m struct:LexState typeref:typename:TString * +ephemeron vendor/lua-5.4.8/src/lstate.h /^ GCObject *ephemeron; \/* list of ephemeron tables (weak keys) *\/$/;" m struct:global_State typeref:typename:GCObject * +eqshrstr vendor/lua-5.4.8/src/lstring.h /^#define eqshrstr(/;" d +eqstr vendor/lua-5.4.8/src/lparser.c /^#define eqstr(/;" d file: +equalkey vendor/lua-5.4.8/src/ltable.c /^static int equalkey (const TValue *k1, const Node *n2, int deadok) {$/;" f typeref:typename:int file: +errfile vendor/lua-5.4.8/src/lauxlib.c /^static int errfile (lua_State *L, const char *what, int fnameindex) {$/;" f typeref:typename:int file: +errfunc vendor/lua-5.4.8/src/lstate.h /^ ptrdiff_t errfunc; \/* current error handling function (stack index) *\/$/;" m struct:lua_State typeref:typename:ptrdiff_t +error vendor/lua-5.4.8/src/lundump.c /^static l_noret error (LoadState *S, const char *why) {$/;" f typeref:typename:l_noret file: +errorJmp vendor/lua-5.4.8/src/lstate.h /^ struct lua_longjmp *errorJmp; \/* current error recover point *\/$/;" m struct:lua_State typeref:struct:lua_longjmp * +error_expected vendor/lua-5.4.8/src/lparser.c /^static l_noret error_expected (LexState *ls, int token) {$/;" f typeref:typename:l_noret file: +errorlimit vendor/lua-5.4.8/src/lparser.c /^static l_noret errorlimit (FuncState *fs, int limit, const char *what) {$/;" f typeref:typename:l_noret file: +errorstatus vendor/lua-5.4.8/src/ldo.c /^#define errorstatus(/;" d file: +esccheck vendor/lua-5.4.8/src/llex.c /^static void esccheck (LexState *ls, int c, const char *msg) {$/;" f typeref:typename:void file: +event vendor/lua-5.4.8/src/lua.h /^ int event;$/;" m struct:lua_Debug typeref:typename:int +eventname vendor/lua-5.4.8/src/luac.c /^#define eventname(/;" d file: +events vendor/raylib-5.5_linux_amd64/include/raylib.h /^ AutomationEvent *events; \/\/ Events entries$/;" m struct:AutomationEventList typeref:typename:AutomationEvent * +exchangehashpart vendor/lua-5.4.8/src/ltable.c /^static void exchangehashpart (Table *t1, Table *t2) {$/;" f typeref:typename:void file: +exp1 vendor/lua-5.4.8/src/lparser.c /^static void exp1 (LexState *ls) {$/;" f typeref:typename:void file: +exp2RK vendor/lua-5.4.8/src/lcode.c /^static int exp2RK (FuncState *fs, expdesc *e) {$/;" f typeref:typename:int file: +exp2reg vendor/lua-5.4.8/src/lcode.c /^static void exp2reg (FuncState *fs, expdesc *e, int reg) {$/;" f typeref:typename:void file: +expdesc vendor/lua-5.4.8/src/lparser.h /^typedef struct expdesc {$/;" s +expdesc vendor/lua-5.4.8/src/lparser.h /^} expdesc;$/;" t typeref:struct:expdesc +expkind vendor/lua-5.4.8/src/lparser.h /^} expkind;$/;" t typeref:enum:__anon337ee4430103 +explist vendor/lua-5.4.8/src/lparser.c /^static int explist (LexState *ls, expdesc *v) {$/;" f typeref:typename:int file: +expr vendor/lua-5.4.8/src/lparser.c /^static void expr (LexState *ls, expdesc *v) {$/;" f typeref:typename:void file: +expr vendor/lua-5.4.8/src/lparser.c /^static void expr (LexState *ls, expdesc *v);$/;" p typeref:typename:void file: +exprstat vendor/lua-5.4.8/src/lparser.c /^static void exprstat (LexState *ls) {$/;" f typeref:typename:void file: +extra vendor/lua-5.4.8/src/lobject.h /^ lu_byte extra; \/* reserved words for short strings; "has hash" for longs *\/$/;" m struct:TString typeref:typename:lu_byte +extra_ vendor/lua-5.4.8/src/lstate.c /^ lu_byte extra_[LUA_EXTRASPACE];$/;" m struct:LX typeref:typename:lu_byte[] file: +eyeToScreenDistance vendor/raylib-5.5_linux_amd64/include/raylib.h /^ float eyeToScreenDistance; \/\/ Distance between eye and display in meters$/;" m struct:VrDeviceInfo typeref:typename:float +f vendor/lua-5.4.8/src/lauxlib.c /^ FILE *f; \/* file being read *\/$/;" m struct:LoadF typeref:typename:FILE * file: +f vendor/lua-5.4.8/src/lauxlib.h /^ FILE *f; \/* stream (NULL for incompletely created streams) *\/$/;" m struct:luaL_Stream typeref:typename:FILE * +f vendor/lua-5.4.8/src/liolib.c /^ FILE *f; \/* file being read *\/$/;" m struct:__anon9a52bfe00108 typeref:typename:FILE * file: +f vendor/lua-5.4.8/src/lobject.h /^ lua_CFunction f; \/* light C functions *\/$/;" m union:Value typeref:typename:lua_CFunction +f vendor/lua-5.4.8/src/lobject.h /^ lua_CFunction f;$/;" m struct:CClosure typeref:typename:lua_CFunction +f vendor/lua-5.4.8/src/lparser.h /^ Proto *f; \/* current function header *\/$/;" m struct:FuncState typeref:typename:Proto * +f vendor/lua-5.4.8/src/lparser.h /^ int f; \/* patch list of 'exit when false' *\/$/;" m struct:expdesc typeref:typename:int +f_call vendor/lua-5.4.8/src/lapi.c /^static void f_call (lua_State *L, void *ud) {$/;" f typeref:typename:void file: +f_close vendor/lua-5.4.8/src/liolib.c /^static int f_close (lua_State *L) {$/;" f typeref:typename:int file: +f_flush vendor/lua-5.4.8/src/liolib.c /^static int f_flush (lua_State *L) {$/;" f typeref:typename:int file: +f_gc vendor/lua-5.4.8/src/liolib.c /^static int f_gc (lua_State *L) {$/;" f typeref:typename:int file: +f_lines vendor/lua-5.4.8/src/liolib.c /^static int f_lines (lua_State *L) {$/;" f typeref:typename:int file: +f_luaopen vendor/lua-5.4.8/src/lstate.c /^static void f_luaopen (lua_State *L, void *ud) {$/;" f typeref:typename:void file: +f_parser vendor/lua-5.4.8/src/ldo.c /^static void f_parser (lua_State *L, void *ud) {$/;" f typeref:typename:void file: +f_read vendor/lua-5.4.8/src/liolib.c /^static int f_read (lua_State *L) {$/;" f typeref:typename:int file: +f_seek vendor/lua-5.4.8/src/liolib.c /^static int f_seek (lua_State *L) {$/;" f typeref:typename:int file: +f_setvbuf vendor/lua-5.4.8/src/liolib.c /^static int f_setvbuf (lua_State *L) {$/;" f typeref:typename:int file: +f_tostring vendor/lua-5.4.8/src/liolib.c /^static int f_tostring (lua_State *L) {$/;" f typeref:typename:int file: +f_write vendor/lua-5.4.8/src/liolib.c /^static int f_write (lua_State *L) {$/;" f typeref:typename:int file: +fasttm vendor/lua-5.4.8/src/ltm.h /^#define fasttm(/;" d +fatal vendor/lua-5.4.8/src/luac.c /^static void fatal(const char* message)$/;" f typeref:typename:void file: +fchecksize vendor/lua-5.4.8/src/lundump.c /^static void fchecksize (LoadState *S, size_t size, const char *tname) {$/;" f typeref:typename:void file: +features vendor/raylib-5.5_linux_amd64/README.md /^features$/;" s +field vendor/lua-5.4.8/src/lparser.c /^static void field (LexState *ls, ConsControl *cc) {$/;" f typeref:typename:void file: +fieldsel vendor/lua-5.4.8/src/lparser.c /^static void fieldsel (LexState *ls, expdesc *v) {$/;" f typeref:typename:void file: +filterpc vendor/lua-5.4.8/src/ldebug.c /^static int filterpc (int pc, int jmptarget) {$/;" f typeref:typename:int file: +finaltarget vendor/lua-5.4.8/src/lcode.c /^static int finaltarget (Instruction *code, int i) {$/;" f typeref:typename:int file: +findfield vendor/lua-5.4.8/src/lauxlib.c /^static int findfield (lua_State *L, int objidx, int level) {$/;" f typeref:typename:int file: +findfile vendor/lua-5.4.8/src/loadlib.c /^static const char *findfile (lua_State *L, const char *name,$/;" f typeref:typename:const char * file: +findindex vendor/lua-5.4.8/src/ltable.c /^static unsigned int findindex (lua_State *L, Table *t, TValue *key,$/;" f typeref:typename:unsigned int file: +findlabel vendor/lua-5.4.8/src/lparser.c /^static Labeldesc *findlabel (LexState *ls, TString *name) {$/;" f typeref:typename:Labeldesc * file: +findlast vendor/lua-5.4.8/src/lgc.c /^static GCObject **findlast (GCObject **p) {$/;" f typeref:typename:GCObject ** file: +findloader vendor/lua-5.4.8/src/loadlib.c /^static void findloader (lua_State *L, const char *name) {$/;" f typeref:typename:void file: +findpcall vendor/lua-5.4.8/src/ldo.c /^static CallInfo *findpcall (lua_State *L) {$/;" f typeref:typename:CallInfo * file: +findsetreg vendor/lua-5.4.8/src/ldebug.c /^static int findsetreg (const Proto *p, int lastpc, int reg) {$/;" f typeref:typename:int file: +findvararg vendor/lua-5.4.8/src/ldebug.c /^static const char *findvararg (CallInfo *ci, int n, StkId *pos) {$/;" f typeref:typename:const char * file: +finishCcall vendor/lua-5.4.8/src/ldo.c /^static void finishCcall (lua_State *L, CallInfo *ci) {$/;" f typeref:typename:void file: +finishbinexpneg vendor/lua-5.4.8/src/lcode.c /^static int finishbinexpneg (FuncState *fs, expdesc *e1, expdesc *e2,$/;" f typeref:typename:int file: +finishbinexpval vendor/lua-5.4.8/src/lcode.c /^static void finishbinexpval (FuncState *fs, expdesc *e1, expdesc *e2,$/;" f typeref:typename:void file: +finishgencycle vendor/lua-5.4.8/src/lgc.c /^static void finishgencycle (lua_State *L, global_State *g) {$/;" f typeref:typename:void file: +finishpcall vendor/lua-5.4.8/src/lbaselib.c /^static int finishpcall (lua_State *L, int status, lua_KContext extra) {$/;" f typeref:typename:int file: +finishpcallk vendor/lua-5.4.8/src/ldo.c /^static int finishpcallk (lua_State *L, CallInfo *ci) {$/;" f typeref:typename:int file: +finishrawget vendor/lua-5.4.8/src/lapi.c /^l_sinline int finishrawget (lua_State *L, const TValue *val) {$/;" f typeref:typename:l_sinline int +finobj vendor/lua-5.4.8/src/lstate.h /^ GCObject *finobj; \/* list of collectable objects with finalizers *\/$/;" m struct:global_State typeref:typename:GCObject * +finobjold1 vendor/lua-5.4.8/src/lstate.h /^ GCObject *finobjold1; \/* list of old1 objects with finalizers *\/$/;" m struct:global_State typeref:typename:GCObject * +finobjrold vendor/lua-5.4.8/src/lstate.h /^ GCObject *finobjrold; \/* list of really old objects with finalizers *\/$/;" m struct:global_State typeref:typename:GCObject * +finobjsur vendor/lua-5.4.8/src/lstate.h /^ GCObject *finobjsur; \/* list of survival objects with finalizers *\/$/;" m struct:global_State typeref:typename:GCObject * +firstgoto vendor/lua-5.4.8/src/lparser.c /^ int firstgoto; \/* index of first pending goto in this block *\/$/;" m struct:BlockCnt typeref:typename:int file: +firstlabel vendor/lua-5.4.8/src/lparser.c /^ int firstlabel; \/* index of first label in this block *\/$/;" m struct:BlockCnt typeref:typename:int file: +firstlabel vendor/lua-5.4.8/src/lparser.h /^ int firstlabel; \/* index of first label (in 'dyd->label->arr') *\/$/;" m struct:FuncState typeref:typename:int +firstlocal vendor/lua-5.4.8/src/lparser.h /^ int firstlocal; \/* index of first local var (in Dyndata array) *\/$/;" m struct:FuncState typeref:typename:int +firstold1 vendor/lua-5.4.8/src/lstate.h /^ GCObject *firstold1; \/* first OLD1 object in the list (if any) *\/$/;" m struct:global_State typeref:typename:GCObject * +firsttry vendor/lua-5.4.8/src/lmem.c /^#define firsttry(/;" d file: +firsttry vendor/lua-5.4.8/src/lmem.c /^static void *firsttry (global_State *g, void *block, size_t os, size_t ns) {$/;" f typeref:typename:void * file: +fitsBx vendor/lua-5.4.8/src/lcode.c /^static int fitsBx (lua_Integer i) {$/;" f typeref:typename:int file: +fitsC vendor/lua-5.4.8/src/lcode.c /^static int fitsC (lua_Integer i) {$/;" f typeref:typename:int file: +fixedgc vendor/lua-5.4.8/src/lstate.h /^ GCObject *fixedgc; \/* list of objects not to be collected *\/$/;" m struct:global_State typeref:typename:GCObject * +fixforjump vendor/lua-5.4.8/src/lparser.c /^static void fixforjump (FuncState *fs, int pc, int dest, int back) {$/;" f typeref:typename:void file: +fixjump vendor/lua-5.4.8/src/lcode.c /^static void fixjump (FuncState *fs, int pc, int dest) {$/;" f typeref:typename:void file: +flags vendor/lua-5.4.8/src/lobject.h /^ lu_byte flags; \/* 1<<p means tagmethod(p) is not present *\/$/;" m struct:Table typeref:typename:lu_byte +float16 vendor/raylib-5.5_linux_amd64/include/raymath.h /^typedef struct float16 {$/;" s +float16 vendor/raylib-5.5_linux_amd64/include/raymath.h /^} float16;$/;" t typeref:struct:float16 +float3 vendor/raylib-5.5_linux_amd64/include/raymath.h /^typedef struct float3 {$/;" s +float3 vendor/raylib-5.5_linux_amd64/include/raymath.h /^} float3;$/;" t typeref:struct:float3 +floatforloop vendor/lua-5.4.8/src/lvm.c /^static int floatforloop (StkId ra) {$/;" f typeref:typename:int file: +fltvalue vendor/lua-5.4.8/src/lobject.h /^#define fltvalue(/;" d +fltvalueraw vendor/lua-5.4.8/src/lobject.h /^#define fltvalueraw(/;" d +foldbinop vendor/lua-5.4.8/src/lcode.h /^#define foldbinop(/;" d +forbody vendor/lua-5.4.8/src/lparser.c /^static void forbody (LexState *ls, int base, int line, int nvars, int isgen) {$/;" f typeref:typename:void file: +forlimit vendor/lua-5.4.8/src/lvm.c /^static int forlimit (lua_State *L, lua_Integer init, const TValue *lim,$/;" f typeref:typename:int file: +forlist vendor/lua-5.4.8/src/lparser.c /^static void forlist (LexState *ls, TString *indexname) {$/;" f typeref:typename:void file: +format vendor/raylib-5.5_linux_amd64/include/raylib.h /^ int format; \/\/ Data format (PixelFormat type)$/;" m struct:Image typeref:typename:int +format vendor/raylib-5.5_linux_amd64/include/raylib.h /^ int format; \/\/ Data format (PixelFormat type)$/;" m struct:Texture typeref:typename:int +formatvarinfo vendor/lua-5.4.8/src/ldebug.c /^static const char *formatvarinfo (lua_State *L, const char *kind,$/;" f typeref:typename:const char * file: +fornum vendor/lua-5.4.8/src/lparser.c /^static void fornum (LexState *ls, TString *varname, int line) {$/;" f typeref:typename:void file: +forprep vendor/lua-5.4.8/src/lvm.c /^static int forprep (lua_State *L, StkId ra) {$/;" f typeref:typename:int file: +forstat vendor/lua-5.4.8/src/lparser.c /^static void forstat (LexState *ls, int line) {$/;" f typeref:typename:void file: +fovy vendor/raylib-5.5_linux_amd64/include/raylib.h /^ float fovy; \/\/ Camera field-of-view aperture in Y (degrees) in perspective, us/;" m struct:Camera3D typeref:typename:float +frame vendor/raylib-5.5_linux_amd64/include/raylib.h /^ unsigned int frame; \/\/ Event frame$/;" m struct:AutomationEvent typeref:typename:unsigned int +frameCount vendor/raylib-5.5_linux_amd64/include/raylib.h /^ int frameCount; \/\/ Number of animation frames$/;" m struct:ModelAnimation typeref:typename:int +frameCount vendor/raylib-5.5_linux_amd64/include/raylib.h /^ unsigned int frameCount; \/\/ Total number of frames (considering channels)$/;" m struct:Music typeref:typename:unsigned int +frameCount vendor/raylib-5.5_linux_amd64/include/raylib.h /^ unsigned int frameCount; \/\/ Total number of frames (considering channels)$/;" m struct:Sound typeref:typename:unsigned int +frameCount vendor/raylib-5.5_linux_amd64/include/raylib.h /^ unsigned int frameCount; \/\/ Total number of frames (considering channels)$/;" m struct:Wave typeref:typename:unsigned int +framePoses vendor/raylib-5.5_linux_amd64/include/raylib.h /^ Transform **framePoses; \/\/ Poses array by frame$/;" m struct:ModelAnimation typeref:typename:Transform ** +framebufferHeight vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ int framebufferHeight; \/\/ Current framebuffer height$/;" m struct:rlglData::__anon1f68b8bd0d08 typeref:typename:int +framebufferWidth vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ int framebufferWidth; \/\/ Current framebuffer width$/;" m struct:rlglData::__anon1f68b8bd0d08 typeref:typename:int +frealloc vendor/lua-5.4.8/src/lstate.h /^ lua_Alloc frealloc; \/* function to reallocate memory *\/$/;" m struct:global_State typeref:typename:lua_Alloc +freeCI vendor/lua-5.4.8/src/lstate.c /^static void freeCI (lua_State *L) {$/;" f typeref:typename:void file: +freebsd vendor/lua-5.4.8/src/Makefile /^FreeBSD NetBSD OpenBSD freebsd:$/;" t +freeexp vendor/lua-5.4.8/src/lcode.c /^static void freeexp (FuncState *fs, expdesc *e) {$/;" f typeref:typename:void file: +freeexps vendor/lua-5.4.8/src/lcode.c /^static void freeexps (FuncState *fs, expdesc *e1, expdesc *e2) {$/;" f typeref:typename:void file: +freehash vendor/lua-5.4.8/src/ltable.c /^static void freehash (lua_State *L, Table *t) {$/;" f typeref:typename:void file: +freelist vendor/lua-5.4.8/src/lauxlib.c /^#define freelist /;" d file: +freeobj vendor/lua-5.4.8/src/lgc.c /^static void freeobj (lua_State *L, GCObject *o) {$/;" f typeref:typename:void file: +freereg vendor/lua-5.4.8/src/lcode.c /^static void freereg (FuncState *fs, int reg) {$/;" f typeref:typename:void file: +freereg vendor/lua-5.4.8/src/lparser.h /^ lu_byte freereg; \/* first free register *\/$/;" m struct:FuncState typeref:typename:lu_byte +freeregs vendor/lua-5.4.8/src/lcode.c /^static void freeregs (FuncState *fs, int r1, int r2) {$/;" f typeref:typename:void file: +freestack vendor/lua-5.4.8/src/lstate.c /^static void freestack (lua_State *L) {$/;" f typeref:typename:void file: +freeupval vendor/lua-5.4.8/src/lgc.c /^static void freeupval (lua_State *L, UpVal *uv) {$/;" f typeref:typename:void file: +fromstate vendor/lua-5.4.8/src/lstate.c /^#define fromstate(/;" d file: +fs vendor/lua-5.4.8/src/llex.h /^ struct FuncState *fs; \/* current function (parser) *\/$/;" m struct:LexState typeref:struct:FuncState * +ftransfer vendor/lua-5.4.8/src/lstate.h /^ unsigned short ftransfer; \/* offset of first value transferred *\/$/;" m struct:CallInfo::__anona701f1f7040a::__anona701f1f70508 typeref:typename:unsigned short +ftransfer vendor/lua-5.4.8/src/lua.h /^ unsigned short ftransfer; \/* (r) index of first value transferred *\/$/;" m struct:lua_Debug typeref:typename:unsigned short +fullgen vendor/lua-5.4.8/src/lgc.c /^static lu_mem fullgen (lua_State *L, global_State *g) {$/;" f typeref:typename:lu_mem file: +fullinc vendor/lua-5.4.8/src/lgc.c /^static void fullinc (lua_State *L, global_State *g) {$/;" f typeref:typename:void file: +func vendor/lua-5.4.8/src/lapi.c /^ StkId func;$/;" m struct:CallS typeref:typename:StkId file: +func vendor/lua-5.4.8/src/lauxlib.h /^ lua_CFunction func;$/;" m struct:luaL_Reg typeref:typename:lua_CFunction +func vendor/lua-5.4.8/src/lstate.h /^ StkIdRel func; \/* function index in the stack *\/$/;" m struct:CallInfo typeref:typename:StkIdRel +funcargs vendor/lua-5.4.8/src/lparser.c /^static void funcargs (LexState *ls, expdesc *f) {$/;" f typeref:typename:void file: +funcidx vendor/lua-5.4.8/src/lstate.h /^ int funcidx; \/* called-function index *\/$/;" m union:CallInfo::__anona701f1f7040a typeref:typename:int +funcinfo vendor/lua-5.4.8/src/ldebug.c /^static void funcinfo (lua_Debug *ar, Closure *cl) {$/;" f typeref:typename:void file: +funcname vendor/lua-5.4.8/src/lparser.c /^static int funcname (LexState *ls, expdesc *v) {$/;" f typeref:typename:int file: +funcnamefromcall vendor/lua-5.4.8/src/ldebug.c /^static const char *funcnamefromcall (lua_State *L, CallInfo *ci,$/;" f typeref:typename:const char * file: +funcnamefromcall vendor/lua-5.4.8/src/ldebug.c /^static const char *funcnamefromcall (lua_State *L, CallInfo *ci,$/;" p typeref:typename:const char * file: +funcnamefromcode vendor/lua-5.4.8/src/ldebug.c /^static const char *funcnamefromcode (lua_State *L, const Proto *p,$/;" f typeref:typename:const char * file: +funcs vendor/lua-5.4.8/src/lutf8lib.c /^static const luaL_Reg funcs[] = {$/;" v typeref:typename:const luaL_Reg[] file: +funcstat vendor/lua-5.4.8/src/lparser.c /^static void funcstat (LexState *ls, int line) {$/;" f typeref:typename:void file: +fvalue vendor/lua-5.4.8/src/lobject.h /^#define fvalue(/;" d +fvalueraw vendor/lua-5.4.8/src/lobject.h /^#define fvalueraw(/;" d +g vendor/lua-5.4.8/src/lstate.c /^ global_State g;$/;" m struct:LG typeref:typename:global_State file: +g vendor/raylib-5.5_linux_amd64/include/raylib.h /^ unsigned char g; \/\/ Color green value$/;" m struct:Color typeref:typename:unsigned char +g_iofile vendor/lua-5.4.8/src/liolib.c /^static int g_iofile (lua_State *L, const char *f, const char *mode) {$/;" f typeref:typename:int file: +g_read vendor/lua-5.4.8/src/liolib.c /^static int g_read (lua_State *L, FILE *f, int first) {$/;" f typeref:typename:int file: +g_write vendor/lua-5.4.8/src/liolib.c /^static int g_write (lua_State *L, FILE *f, int arg) {$/;" f typeref:typename:int file: +gc vendor/lua-5.4.8/src/lobject.h /^ struct GCObject *gc; \/* collectable objects *\/$/;" m union:Value typeref:struct:GCObject * +gc vendor/lua-5.4.8/src/lstate.h /^ GCObject gc; \/* common header *\/$/;" m union:GCUnion typeref:typename:GCObject +gcemergency vendor/lua-5.4.8/src/lstate.h /^ lu_byte gcemergency; \/* true if this is an emergency collection *\/$/;" m struct:global_State typeref:typename:lu_byte +gckey vendor/lua-5.4.8/src/lobject.h /^#define gckey(/;" d +gckeyN vendor/lua-5.4.8/src/lobject.h /^#define gckeyN(/;" d +gckind vendor/lua-5.4.8/src/lstate.h /^ lu_byte gckind; \/* kind of GC running *\/$/;" m struct:global_State typeref:typename:lu_byte +gclist vendor/lua-5.4.8/src/lobject.h /^ GCObject *gclist;$/;" m struct:Proto typeref:typename:GCObject * +gclist vendor/lua-5.4.8/src/lobject.h /^ GCObject *gclist;$/;" m struct:Table typeref:typename:GCObject * +gclist vendor/lua-5.4.8/src/lobject.h /^ GCObject *gclist;$/;" m struct:Udata typeref:typename:GCObject * +gclist vendor/lua-5.4.8/src/lstate.h /^ GCObject *gclist;$/;" m struct:lua_State typeref:typename:GCObject * +gco2ccl vendor/lua-5.4.8/src/lstate.h /^#define gco2ccl(/;" d +gco2cl vendor/lua-5.4.8/src/lstate.h /^#define gco2cl(/;" d +gco2lcl vendor/lua-5.4.8/src/lstate.h /^#define gco2lcl(/;" d +gco2p vendor/lua-5.4.8/src/lstate.h /^#define gco2p(/;" d +gco2t vendor/lua-5.4.8/src/lstate.h /^#define gco2t(/;" d +gco2th vendor/lua-5.4.8/src/lstate.h /^#define gco2th(/;" d +gco2ts vendor/lua-5.4.8/src/lstate.h /^#define gco2ts(/;" d +gco2u vendor/lua-5.4.8/src/lstate.h /^#define gco2u(/;" d +gco2upv vendor/lua-5.4.8/src/lstate.h /^#define gco2upv(/;" d +gcpause vendor/lua-5.4.8/src/lstate.h /^ lu_byte gcpause; \/* size of pause between successive GCs *\/$/;" m struct:global_State typeref:typename:lu_byte +gcrunning vendor/lua-5.4.8/src/lgc.h /^#define gcrunning(/;" d +gcstate vendor/lua-5.4.8/src/lstate.h /^ lu_byte gcstate; \/* state of garbage collector *\/$/;" m struct:global_State typeref:typename:lu_byte +gcstepmul vendor/lua-5.4.8/src/lstate.h /^ lu_byte gcstepmul; \/* GC "speed" *\/$/;" m struct:global_State typeref:typename:lu_byte +gcstepsize vendor/lua-5.4.8/src/lstate.h /^ lu_byte gcstepsize; \/* (log2 of) GC granularity *\/$/;" m struct:global_State typeref:typename:lu_byte +gcstopem vendor/lua-5.4.8/src/lstate.h /^ lu_byte gcstopem; \/* stops emergency collections *\/$/;" m struct:global_State typeref:typename:lu_byte +gcstp vendor/lua-5.4.8/src/lstate.h /^ lu_byte gcstp; \/* control whether GC is running *\/$/;" m struct:global_State typeref:typename:lu_byte +gctm vendor/lua-5.4.8/src/loadlib.c /^static int gctm (lua_State *L) {$/;" f typeref:typename:int file: +gcvalue vendor/lua-5.4.8/src/lobject.h /^#define gcvalue(/;" d +gcvalueN vendor/lua-5.4.8/src/lgc.c /^#define gcvalueN(/;" d file: +gcvalueraw vendor/lua-5.4.8/src/lobject.h /^#define gcvalueraw(/;" d +generic vendor/lua-5.4.8/src/Makefile /^generic: $(ALL)$/;" t +generic_reader vendor/lua-5.4.8/src/lbaselib.c /^static const char *generic_reader (lua_State *L, void *ud, size_t *size) {$/;" f typeref:typename:const char * file: +genlink vendor/lua-5.4.8/src/lgc.c /^static void genlink (global_State *g, GCObject *o) {$/;" f typeref:typename:void file: +genmajormul vendor/lua-5.4.8/src/lstate.h /^ lu_byte genmajormul; \/* control for major generational collections *\/$/;" m struct:global_State typeref:typename:lu_byte +genminormul vendor/lua-5.4.8/src/lstate.h /^ lu_byte genminormul; \/* control for minor generational collections *\/$/;" m struct:global_State typeref:typename:lu_byte +genstep vendor/lua-5.4.8/src/lgc.c /^static void genstep (lua_State *L, global_State *g) {$/;" f typeref:typename:void file: +get2digits vendor/lua-5.4.8/src/lstrlib.c /^static const char *get2digits (const char *s) {$/;" f typeref:typename:const char * file: +getCcalls vendor/lua-5.4.8/src/lstate.h /^#define getCcalls(/;" d +getF vendor/lua-5.4.8/src/lauxlib.c /^static const char *getF (lua_State *L, void *ud, size_t *size) {$/;" f typeref:typename:const char * file: +getGtable vendor/lua-5.4.8/src/lapi.c /^#define getGtable(/;" d file: +getOpMode vendor/lua-5.4.8/src/lopcodes.h /^#define getOpMode(/;" d +getS vendor/lua-5.4.8/src/lauxlib.c /^static const char *getS (lua_State *L, void *ud, size_t *size) {$/;" f typeref:typename:const char * file: +get_onecapture vendor/lua-5.4.8/src/lstrlib.c /^static size_t get_onecapture (MatchState *ms, int i, const char *s,$/;" f typeref:typename:size_t file: +get_prompt vendor/lua-5.4.8/src/lua.c /^static const char *get_prompt (lua_State *L, int firstline) {$/;" f typeref:typename:const char * file: +getage vendor/lua-5.4.8/src/lgc.h /^#define getage(/;" d +getarg vendor/lua-5.4.8/src/lopcodes.h /^#define getarg(/;" d +getbaseline vendor/lua-5.4.8/src/ldebug.c /^static int getbaseline (const Proto *f, int pc, int *basepc) {$/;" f typeref:typename:int file: +getbinopr vendor/lua-5.4.8/src/lparser.c /^static BinOpr getbinopr (int op) {$/;" f typeref:typename:BinOpr file: +getboolfield vendor/lua-5.4.8/src/loslib.c /^static int getboolfield (lua_State *L, const char *key) {$/;" f typeref:typename:int file: +getbuff vendor/lua-5.4.8/src/lobject.c /^static char *getbuff (BuffFS *buff, int sz) {$/;" f typeref:typename:char * file: +getcistrecst vendor/lua-5.4.8/src/lstate.h /^#define getcistrecst(/;" d +getco vendor/lua-5.4.8/src/lcorolib.c /^static lua_State *getco (lua_State *L) {$/;" f typeref:typename:lua_State * file: +getcurrentline vendor/lua-5.4.8/src/ldebug.c /^static int getcurrentline (CallInfo *ci) {$/;" f typeref:typename:int file: +getdetails vendor/lua-5.4.8/src/lstrlib.c /^static KOption getdetails (Header *h, size_t totalsize,$/;" f typeref:typename:KOption file: +getendpos vendor/lua-5.4.8/src/lstrlib.c /^static size_t getendpos (lua_State *L, int arg, lua_Integer def,$/;" f typeref:typename:size_t file: +getfield vendor/lua-5.4.8/src/loslib.c /^static int getfield (lua_State *L, const char *key, int d, int delta) {$/;" f typeref:typename:int file: +getformat vendor/lua-5.4.8/src/lstrlib.c /^static const char *getformat (lua_State *L, const char *strfrmt,$/;" f typeref:typename:const char * file: +getfreepos vendor/lua-5.4.8/src/ltable.c /^static Node *getfreepos (Table *t) {$/;" f typeref:typename:Node * file: +getfuncname vendor/lua-5.4.8/src/ldebug.c /^static const char *getfuncname (lua_State *L, CallInfo *ci, const char **name) {$/;" f typeref:typename:const char * file: +getgclist vendor/lua-5.4.8/src/lgc.c /^static GCObject **getgclist (GCObject *o) {$/;" f typeref:typename:GCObject ** file: +getgcparam vendor/lua-5.4.8/src/lgc.h /^#define getgcparam(/;" d +getgeneric vendor/lua-5.4.8/src/ltable.c /^static const TValue *getgeneric (Table *t, const TValue *key, int deadok) {$/;" f typeref:typename:const TValue * file: +gethexa vendor/lua-5.4.8/src/llex.c /^static int gethexa (LexState *ls) {$/;" f typeref:typename:int file: +getinstruction vendor/lua-5.4.8/src/lcode.h /^#define getinstruction(/;" d +getiofile vendor/lua-5.4.8/src/liolib.c /^static FILE *getiofile (lua_State *L, const char *findex) {$/;" f typeref:typename:FILE * file: +getjump vendor/lua-5.4.8/src/lcode.c /^static int getjump (FuncState *fs, int pc) {$/;" f typeref:typename:int file: +getjumpcontrol vendor/lua-5.4.8/src/lcode.c /^static Instruction *getjumpcontrol (FuncState *fs, int pc) {$/;" f typeref:typename:Instruction * file: +getlngstr vendor/lua-5.4.8/src/lobject.h /^#define getlngstr(/;" d +getlocalattribute vendor/lua-5.4.8/src/lparser.c /^static int getlocalattribute (LexState *ls) {$/;" f typeref:typename:int file: +getlocalvardesc vendor/lua-5.4.8/src/lparser.c /^static Vardesc *getlocalvardesc (FuncState *fs, int vidx) {$/;" f typeref:typename:Vardesc * file: +getnextfilename vendor/lua-5.4.8/src/loadlib.c /^static const char *getnextfilename (char **path, char *end) {$/;" f typeref:typename:const char * file: +getnodekey vendor/lua-5.4.8/src/lobject.h /^#define getnodekey(/;" d +getnum vendor/lua-5.4.8/src/lstrlib.c /^static int getnum (const char **fmt, int df) {$/;" f typeref:typename:int file: +getnumlimit vendor/lua-5.4.8/src/lstrlib.c /^static int getnumlimit (Header *h, const char **fmt, int df) {$/;" f typeref:typename:int file: +getoah vendor/lua-5.4.8/src/lstate.h /^#define getoah(/;" d +getobjname vendor/lua-5.4.8/src/ldebug.c /^static const char *getobjname (const Proto *p, int lastpc, int reg,$/;" f typeref:typename:const char * file: +getoption vendor/lua-5.4.8/src/lstrlib.c /^static KOption getoption (Header *h, const char **fmt, int *size) {$/;" f typeref:typename:KOption file: +getproto vendor/lua-5.4.8/src/lobject.h /^#define getproto(/;" d +getshrstr vendor/lua-5.4.8/src/lobject.h /^#define getshrstr(/;" d +getstr vendor/lua-5.4.8/src/lobject.h /^#define getstr(/;" d +gettable vendor/lua-5.4.8/src/lapi.c /^static Table *gettable (lua_State *L, int idx) {$/;" f typeref:typename:Table * file: +getthread vendor/lua-5.4.8/src/ldblib.c /^static lua_State *getthread (lua_State *L, int *arg) {$/;" f typeref:typename:lua_State * file: +gettotalbytes vendor/lua-5.4.8/src/lstate.h /^#define gettotalbytes(/;" d +getudatamem vendor/lua-5.4.8/src/lobject.h /^#define getudatamem(/;" d +getunopr vendor/lua-5.4.8/src/lparser.c /^static UnOpr getunopr (int op) {$/;" f typeref:typename:UnOpr file: +getupvalname vendor/lua-5.4.8/src/ldebug.c /^static const char *getupvalname (CallInfo *ci, const TValue *o,$/;" f typeref:typename:const char * file: +getupvalref vendor/lua-5.4.8/src/lapi.c /^static UpVal **getupvalref (lua_State *L, int fidx, int n, LClosure **pf) {$/;" f typeref:typename:UpVal ** file: +gfasttm vendor/lua-5.4.8/src/ltm.h /^#define gfasttm(/;" d +glBindVertexArray vendor/raylib-5.5_linux_amd64/include/rlgl.h /^static PFNGLBINDVERTEXARRAYOESPROC glBindVertexArray = NULL;$/;" v typeref:typename:PFNGLBINDVERTEXARRAYOESPROC +glBlendDestFactorAlpha vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ int glBlendDestFactorAlpha; \/\/ Blending destination alpha factor$/;" m struct:rlglData::__anon1f68b8bd0d08 typeref:typename:int +glBlendDestFactorRGB vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ int glBlendDestFactorRGB; \/\/ Blending destination RGB factor$/;" m struct:rlglData::__anon1f68b8bd0d08 typeref:typename:int +glBlendDstFactor vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ int glBlendDstFactor; \/\/ Blending destination factor$/;" m struct:rlglData::__anon1f68b8bd0d08 typeref:typename:int +glBlendEquation vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ int glBlendEquation; \/\/ Blending equation$/;" m struct:rlglData::__anon1f68b8bd0d08 typeref:typename:int +glBlendEquationAlpha vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ int glBlendEquationAlpha; \/\/ Blending equation for alpha$/;" m struct:rlglData::__anon1f68b8bd0d08 typeref:typename:int +glBlendEquationRGB vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ int glBlendEquationRGB; \/\/ Blending equation for RGB$/;" m struct:rlglData::__anon1f68b8bd0d08 typeref:typename:int +glBlendSrcFactor vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ int glBlendSrcFactor; \/\/ Blending source factor$/;" m struct:rlglData::__anon1f68b8bd0d08 typeref:typename:int +glBlendSrcFactorAlpha vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ int glBlendSrcFactorAlpha; \/\/ Blending source alpha factor$/;" m struct:rlglData::__anon1f68b8bd0d08 typeref:typename:int +glBlendSrcFactorRGB vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ int glBlendSrcFactorRGB; \/\/ Blending source RGB factor$/;" m struct:rlglData::__anon1f68b8bd0d08 typeref:typename:int +glClearDepth vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ #define glClearDepth /;" d +glCustomBlendModeModified vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ bool glCustomBlendModeModified; \/\/ Custom blending factor and equation modificatio/;" m struct:rlglData::__anon1f68b8bd0d08 typeref:typename:bool +glDeleteVertexArrays vendor/raylib-5.5_linux_amd64/include/rlgl.h /^static PFNGLDELETEVERTEXARRAYSOESPROC glDeleteVertexArrays = NULL;$/;" v typeref:typename:PFNGLDELETEVERTEXARRAYSOESPROC +glDrawArraysInstanced vendor/raylib-5.5_linux_amd64/include/rlgl.h /^static PFNGLDRAWARRAYSINSTANCEDEXTPROC glDrawArraysInstanced = NULL;$/;" v typeref:typename:PFNGLDRAWARRAYSINSTANCEDEXTPROC +glDrawElementsInstanced vendor/raylib-5.5_linux_amd64/include/rlgl.h /^static PFNGLDRAWELEMENTSINSTANCEDEXTPROC glDrawElementsInstanced = NULL;$/;" v typeref:typename:PFNGLDRAWELEMENTSINSTANCEDEXTPROC +glGenVertexArrays vendor/raylib-5.5_linux_amd64/include/rlgl.h /^static PFNGLGENVERTEXARRAYSOESPROC glGenVertexArrays = NULL;$/;" v typeref:typename:PFNGLGENVERTEXARRAYSOESPROC +glVertexAttribDivisor vendor/raylib-5.5_linux_amd64/include/rlgl.h /^static PFNGLVERTEXATTRIBDIVISOREXTPROC glVertexAttribDivisor = NULL;$/;" v typeref:typename:PFNGLVERTEXATTRIBDIVISOREXTPROC +globalL vendor/lua-5.4.8/src/lua.c /^static lua_State *globalL = NULL;$/;" v typeref:typename:lua_State * file: +global_State vendor/lua-5.4.8/src/lstate.h /^typedef struct global_State {$/;" s +global_State vendor/lua-5.4.8/src/lstate.h /^} global_State;$/;" t typeref:struct:global_State +glyphCount vendor/raylib-5.5_linux_amd64/include/raylib.h /^ int glyphCount; \/\/ Number of glyph characters$/;" m struct:Font typeref:typename:int +glyphPadding vendor/raylib-5.5_linux_amd64/include/raylib.h /^ int glyphPadding; \/\/ Padding around the glyph characters$/;" m struct:Font typeref:typename:int +glyphs vendor/raylib-5.5_linux_amd64/include/raylib.h /^ GlyphInfo *glyphs; \/\/ Glyphs info data$/;" m struct:Font typeref:typename:GlyphInfo * +gmatch vendor/lua-5.4.8/src/lstrlib.c /^static int gmatch (lua_State *L) {$/;" f typeref:typename:int file: +gmatch_aux vendor/lua-5.4.8/src/lstrlib.c /^static int gmatch_aux (lua_State *L) {$/;" f typeref:typename:int file: +gnext vendor/lua-5.4.8/src/ltable.h /^#define gnext(/;" d +gnode vendor/lua-5.4.8/src/ltable.h /^#define gnode(/;" d +gnodelast vendor/lua-5.4.8/src/lgc.c /^#define gnodelast(/;" d file: +gotostat vendor/lua-5.4.8/src/lparser.c /^static void gotostat (LexState *ls) {$/;" f typeref:typename:void file: +gray vendor/lua-5.4.8/src/lstate.h /^ GCObject *gray; \/* list of gray objects *\/$/;" m struct:global_State typeref:typename:GCObject * +grayagain vendor/lua-5.4.8/src/lstate.h /^ GCObject *grayagain; \/* list of objects to be traversed atomically *\/$/;" m struct:global_State typeref:typename:GCObject * +growstrtab vendor/lua-5.4.8/src/lstring.c /^static void growstrtab (lua_State *L, stringtable *tb) {$/;" f typeref:typename:void file: +gt vendor/lua-5.4.8/src/lparser.h /^ Labellist gt; \/* list of pending gotos *\/$/;" m struct:Dyndata typeref:typename:Labellist +guess vendor/lua-5.4.8/src/Makefile /^guess:$/;" t +gval vendor/lua-5.4.8/src/ltable.h /^#define gval(/;" d +h vendor/lua-5.4.8/src/llex.h /^ Table *h; \/* to avoid collection\/reuse strings *\/$/;" m struct:LexState typeref:typename:Table * +h vendor/lua-5.4.8/src/lmathlib.c /^ lu_int32 h; \/* higher half *\/$/;" m struct:Rand64 typeref:typename:lu_int32 file: +h vendor/lua-5.4.8/src/lstate.h /^ struct Table h;$/;" m union:GCUnion typeref:struct:Table +hResolution vendor/raylib-5.5_linux_amd64/include/raylib.h /^ int hResolution; \/\/ Horizontal resolution in pixels$/;" m struct:VrDeviceInfo typeref:typename:int +hScreenSize vendor/raylib-5.5_linux_amd64/include/raylib.h /^ float hScreenSize; \/\/ Horizontal size in meters$/;" m struct:VrDeviceInfo typeref:typename:float +halfProtect vendor/lua-5.4.8/src/lvm.c /^#define halfProtect(/;" d file: +handle_luainit vendor/lua-5.4.8/src/lua.c /^static int handle_luainit (lua_State *L) {$/;" f typeref:typename:int file: +handle_script vendor/lua-5.4.8/src/lua.c /^static int handle_script (lua_State *L, char **argv) {$/;" f typeref:typename:int file: +has_E vendor/lua-5.4.8/src/lua.c /^#define has_E /;" d file: +has_e vendor/lua-5.4.8/src/lua.c /^#define has_e /;" d file: +has_error vendor/lua-5.4.8/src/lua.c /^#define has_error /;" d file: +has_i vendor/lua-5.4.8/src/lua.c /^#define has_i /;" d file: +has_v vendor/lua-5.4.8/src/lua.c /^#define has_v /;" d file: +hash vendor/lua-5.4.8/src/lobject.h /^ unsigned int hash;$/;" m struct:TString typeref:typename:unsigned int +hash vendor/lua-5.4.8/src/lstate.h /^ TString **hash;$/;" m struct:stringtable typeref:typename:TString ** +hash_search vendor/lua-5.4.8/src/ltable.c /^static lua_Unsigned hash_search (Table *t, lua_Unsigned j) {$/;" f typeref:typename:lua_Unsigned file: +hashboolean vendor/lua-5.4.8/src/ltable.c /^#define hashboolean(/;" d file: +hashint vendor/lua-5.4.8/src/ltable.c /^static Node *hashint (const Table *t, lua_Integer i) {$/;" f typeref:typename:Node * file: +hashmod vendor/lua-5.4.8/src/ltable.c /^#define hashmod(/;" d file: +hashpointer vendor/lua-5.4.8/src/ltable.c /^#define hashpointer(/;" d file: +hashpow2 vendor/lua-5.4.8/src/ltable.c /^#define hashpow2(/;" d file: +hashstr vendor/lua-5.4.8/src/ltable.c /^#define hashstr(/;" d file: +hasjumps vendor/lua-5.4.8/src/lcode.c /^#define hasjumps(/;" d file: +hasmultret vendor/lua-5.4.8/src/lparser.c /^#define hasmultret(/;" d file: +hastocloseCfunc vendor/lua-5.4.8/src/lapi.h /^#define hastocloseCfunc(/;" d +height vendor/raylib-5.5_linux_amd64/include/raylib.h /^ float height; \/\/ Rectangle height$/;" m struct:Rectangle typeref:typename:float +height vendor/raylib-5.5_linux_amd64/include/raylib.h /^ int height; \/\/ Image base height$/;" m struct:Image typeref:typename:int +height vendor/raylib-5.5_linux_amd64/include/raylib.h /^ int height; \/\/ Texture base height$/;" m struct:Texture typeref:typename:int +help vendor/lua-5.4.8/Makefile /^$(PLATS) help test clean:$/;" t +help vendor/lua-5.4.8/src/Makefile /^help:$/;" t +hit vendor/raylib-5.5_linux_amd64/include/raylib.h /^ bool hit; \/\/ Did the ray hit something?$/;" m struct:RayCollision typeref:typename:bool +hnext vendor/lua-5.4.8/src/lobject.h /^ struct TString *hnext; \/* linked list for hash table *\/$/;" m union:TString::__anon808f9fcd030a typeref:struct:TString * +hook vendor/lua-5.4.8/src/lstate.h /^ volatile lua_Hook hook;$/;" m struct:lua_State typeref:typename:volatile lua_Hook +hookcount vendor/lua-5.4.8/src/lstate.h /^ int hookcount;$/;" m struct:lua_State typeref:typename:int +hookf vendor/lua-5.4.8/src/ldblib.c /^static void hookf (lua_State *L, lua_Debug *ar) {$/;" f typeref:typename:void file: +hookmask vendor/lua-5.4.8/src/lstate.h /^ volatile l_signalT hookmask;$/;" m struct:lua_State typeref:typename:volatile l_signalT +hvalue vendor/lua-5.4.8/src/lobject.h /^#define hvalue(/;" d +i vendor/lua-5.4.8/src/llex.h /^ lua_Integer i;$/;" m union:__anonfc1a02ff010a typeref:typename:lua_Integer +i vendor/lua-5.4.8/src/lobject.h /^ lua_Integer i; \/* integer numbers *\/$/;" m union:Value typeref:typename:lua_Integer +iABC vendor/lua-5.4.8/src/lopcodes.h /^enum OpMode {iABC, iABx, iAsBx, iAx, isJ}; \/* basic instruction formats *\/$/;" e enum:OpMode +iABx vendor/lua-5.4.8/src/lopcodes.h /^enum OpMode {iABC, iABx, iAsBx, iAx, isJ}; \/* basic instruction formats *\/$/;" e enum:OpMode +iAsBx vendor/lua-5.4.8/src/lopcodes.h /^enum OpMode {iABC, iABx, iAsBx, iAx, isJ}; \/* basic instruction formats *\/$/;" e enum:OpMode +iAx vendor/lua-5.4.8/src/lopcodes.h /^enum OpMode {iABC, iABx, iAsBx, iAx, isJ}; \/* basic instruction formats *\/$/;" e enum:OpMode +i_ci vendor/lua-5.4.8/src/lua.h /^ struct CallInfo *i_ci; \/* active function *\/$/;" m struct:lua_Debug typeref:struct:CallInfo * +i_val vendor/lua-5.4.8/src/lobject.h /^ TValue i_val; \/* direct access to node's value as a proper 'TValue' *\/$/;" m union:Node typeref:typename:TValue +id vendor/raylib-5.5_linux_amd64/include/raylib.h /^ unsigned int id; \/\/ OpenGL framebuffer object id$/;" m struct:RenderTexture typeref:typename:unsigned int +id vendor/raylib-5.5_linux_amd64/include/raylib.h /^ unsigned int id; \/\/ OpenGL texture id$/;" m struct:Texture typeref:typename:unsigned int +id vendor/raylib-5.5_linux_amd64/include/raylib.h /^ unsigned int id; \/\/ Shader program id$/;" m struct:Shader typeref:typename:unsigned int +idx vendor/lua-5.4.8/src/lobject.h /^ lu_byte idx; \/* index of upvalue (in stack or in outer function's list) *\/$/;" m struct:Upvaldesc typeref:typename:lu_byte +idx vendor/lua-5.4.8/src/lparser.h /^ short idx; \/* index (R or "long" K) *\/$/;" m struct:expdesc::__anon337ee443020a::__anon337ee4430308 typeref:typename:short +ifstat vendor/lua-5.4.8/src/lparser.c /^static void ifstat (LexState *ls, int line) {$/;" f typeref:typename:void file: +image vendor/raylib-5.5_linux_amd64/include/raylib.h /^ Image image; \/\/ Character image data$/;" m struct:GlyphInfo typeref:typename:Image +inclinenumber vendor/lua-5.4.8/src/llex.c /^static void inclinenumber (LexState *ls) {$/;" f typeref:typename:void file: +incnny vendor/lua-5.4.8/src/lstate.h /^#define incnny(/;" d +incomplete vendor/lua-5.4.8/src/lua.c /^static int incomplete (lua_State *L, int status) {$/;" f typeref:typename:int file: +incstep vendor/lua-5.4.8/src/lgc.c /^static void incstep (lua_State *L, global_State *g) {$/;" f typeref:typename:void file: +ind vendor/lua-5.4.8/src/lparser.h /^ } ind;$/;" m union:expdesc::__anon337ee443020a typeref:struct:expdesc::__anon337ee443020a::__anon337ee4430308 +index2stack vendor/lua-5.4.8/src/lapi.c /^l_sinline StkId index2stack (lua_State *L, int idx) {$/;" f typeref:typename:l_sinline StkId +index2value vendor/lua-5.4.8/src/lapi.c /^static TValue *index2value (lua_State *L, int idx) {$/;" f typeref:typename:TValue * file: +indices vendor/raylib-5.5_linux_amd64/include/raylib.h /^ unsigned short *indices; \/\/ Vertex indices (in case vertex data comes indexed)$/;" m struct:Mesh typeref:typename:unsigned short * +indices vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ unsigned int *indices; \/\/ Vertex indices (in case vertex data comes indexed) (6 indic/;" m struct:rlVertexBuffer typeref:typename:unsigned int * +indices vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ unsigned short *indices; \/\/ Vertex indices (in case vertex data comes indexed) (6 indic/;" m struct:rlVertexBuffer typeref:typename:unsigned short * +info vendor/lua-5.4.8/src/lparser.h /^ int info; \/* for generic use *\/$/;" m union:expdesc::__anon337ee443020a typeref:typename:int +init vendor/lua-5.4.8/src/lauxlib.h /^ } init;$/;" m struct:luaL_Buffer typeref:union:luaL_Buffer::__anon6cb25fdb010a +init vendor/lua-5.4.8/src/lstrlib.c /^ const char *init;$/;" m struct:MatchState::__anonae5a27210108 typeref:typename:const char * file: +init vendor/lua-5.4.8/src/lstrlib.c /^ int init; \/* true iff buffer has been initialized *\/$/;" m struct:str_Writer typeref:typename:int file: +init_exp vendor/lua-5.4.8/src/lparser.c /^static void init_exp (expdesc *e, expkind k, int i) {$/;" f typeref:typename:void file: +init_registry vendor/lua-5.4.8/src/lstate.c /^static void init_registry (lua_State *L, global_State *g) {$/;" f typeref:typename:void file: +init_var vendor/lua-5.4.8/src/lparser.c /^static void init_var (FuncState *fs, expdesc *e, int vidx) {$/;" f typeref:typename:void file: +initheader vendor/lua-5.4.8/src/lstrlib.c /^static void initheader (lua_State *L, Header *h) {$/;" f typeref:typename:void file: +insidetbc vendor/lua-5.4.8/src/lparser.c /^ lu_byte insidetbc; \/* true if inside the scope of a to-be-closed var. *\/$/;" m struct:BlockCnt typeref:typename:lu_byte file: +instack vendor/lua-5.4.8/src/ldebug.c /^static int instack (CallInfo *ci, const TValue *o) {$/;" f typeref:typename:int file: +instack vendor/lua-5.4.8/src/lobject.h /^ lu_byte instack; \/* whether it is in stack (register) *\/$/;" m struct:Upvaldesc typeref:typename:lu_byte +install vendor/lua-5.4.8/Makefile /^install: dummy$/;" t +instancing vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ bool instancing; \/\/ Instancing supported (GL_ANGLE_instanced_arrays/;" m struct:rlglData::__anon1f68b8bd0e08 typeref:typename:bool +int2sC vendor/lua-5.4.8/src/lopcodes.h /^#define int2sC(/;" d +intarith vendor/lua-5.4.8/src/lobject.c /^static lua_Integer intarith (lua_State *L, int op, lua_Integer v1,$/;" f typeref:typename:lua_Integer file: +internshrstr vendor/lua-5.4.8/src/lstring.c /^static TString *internshrstr (lua_State *L, const char *str, size_t l) {$/;" f typeref:typename:TString * file: +interpupillaryDistance vendor/raylib-5.5_linux_amd64/include/raylib.h /^ float interpupillaryDistance; \/\/ IPD (distance between pupils) in meters$/;" m struct:VrDeviceInfo typeref:typename:float +interror vendor/lua-5.4.8/src/lauxlib.c /^static void interror (lua_State *L, int arg) {$/;" f typeref:typename:void file: +intop vendor/lua-5.4.8/src/lvm.h /^#define intop(/;" d +invalidateTMcache vendor/lua-5.4.8/src/ltable.h /^#define invalidateTMcache(/;" d +io_close vendor/lua-5.4.8/src/liolib.c /^static int io_close (lua_State *L) {$/;" f typeref:typename:int file: +io_fclose vendor/lua-5.4.8/src/liolib.c /^static int io_fclose (lua_State *L) {$/;" f typeref:typename:int file: +io_flush vendor/lua-5.4.8/src/liolib.c /^static int io_flush (lua_State *L) {$/;" f typeref:typename:int file: +io_input vendor/lua-5.4.8/src/liolib.c /^static int io_input (lua_State *L) {$/;" f typeref:typename:int file: +io_lines vendor/lua-5.4.8/src/liolib.c /^static int io_lines (lua_State *L) {$/;" f typeref:typename:int file: +io_noclose vendor/lua-5.4.8/src/liolib.c /^static int io_noclose (lua_State *L) {$/;" f typeref:typename:int file: +io_open vendor/lua-5.4.8/src/liolib.c /^static int io_open (lua_State *L) {$/;" f typeref:typename:int file: +io_output vendor/lua-5.4.8/src/liolib.c /^static int io_output (lua_State *L) {$/;" f typeref:typename:int file: +io_pclose vendor/lua-5.4.8/src/liolib.c /^static int io_pclose (lua_State *L) {$/;" f typeref:typename:int file: +io_popen vendor/lua-5.4.8/src/liolib.c /^static int io_popen (lua_State *L) {$/;" f typeref:typename:int file: +io_read vendor/lua-5.4.8/src/liolib.c /^static int io_read (lua_State *L) {$/;" f typeref:typename:int file: +io_readline vendor/lua-5.4.8/src/liolib.c /^static int io_readline (lua_State *L) {$/;" f typeref:typename:int file: +io_readline vendor/lua-5.4.8/src/liolib.c /^static int io_readline (lua_State *L);$/;" p typeref:typename:int file: +io_tmpfile vendor/lua-5.4.8/src/liolib.c /^static int io_tmpfile (lua_State *L) {$/;" f typeref:typename:int file: +io_type vendor/lua-5.4.8/src/liolib.c /^static int io_type (lua_State *L) {$/;" f typeref:typename:int file: +io_write vendor/lua-5.4.8/src/liolib.c /^static int io_write (lua_State *L) {$/;" f typeref:typename:int file: +iolib vendor/lua-5.4.8/src/liolib.c /^static const luaL_Reg iolib[] = {$/;" v typeref:typename:const luaL_Reg[] file: +ios vendor/lua-5.4.8/src/Makefile /^ios:$/;" t +ipairsaux vendor/lua-5.4.8/src/lbaselib.c /^static int ipairsaux (lua_State *L) {$/;" f typeref:typename:int file: +isCint vendor/lua-5.4.8/src/lcode.c /^static int isCint (expdesc *e) {$/;" f typeref:typename:int file: +isEnv vendor/lua-5.4.8/src/ldebug.c /^static const char *isEnv (const Proto *p, int pc, Instruction i, int isup) {$/;" f typeref:typename:const char * file: +isIT vendor/lua-5.4.8/src/lopcodes.h /^#define isIT(/;" d +isJ vendor/lua-5.4.8/src/lopcodes.h /^enum OpMode {iABC, iABx, iAsBx, iAx, isJ}; \/* basic instruction formats *\/$/;" e enum:OpMode +isKint vendor/lua-5.4.8/src/lcode.c /^static int isKint (expdesc *e) {$/;" f typeref:typename:int file: +isKstr vendor/lua-5.4.8/src/lcode.c /^static int isKstr (FuncState *fs, expdesc *e) {$/;" f typeref:typename:int file: +isLfunction vendor/lua-5.4.8/src/lobject.h /^#define isLfunction(/;" d +isLua vendor/lua-5.4.8/src/lstate.h /^#define isLua(/;" d +isLuacode vendor/lua-5.4.8/src/lstate.h /^#define isLuacode(/;" d +isOT vendor/lua-5.4.8/src/lopcodes.h /^#define isOT(/;" d +isSCint vendor/lua-5.4.8/src/lcode.c /^static int isSCint (expdesc *e) {$/;" f typeref:typename:int file: +isSCnumber vendor/lua-5.4.8/src/lcode.c /^static int isSCnumber (expdesc *e, int *pi, int *isfloat) {$/;" f typeref:typename:int file: +is_vararg vendor/lua-5.4.8/src/lobject.h /^ lu_byte is_vararg;$/;" m struct:Proto typeref:typename:lu_byte +isabstkey vendor/lua-5.4.8/src/lobject.h /^#define isabstkey(/;" d +isblack vendor/lua-5.4.8/src/lgc.h /^#define isblack(/;" d +iscleared vendor/lua-5.4.8/src/lgc.c /^static int iscleared (global_State *g, const GCObject *o) {$/;" f typeref:typename:int file: +isclosed vendor/lua-5.4.8/src/liolib.c /^#define isclosed(/;" d file: +iscollectable vendor/lua-5.4.8/src/lobject.h /^#define iscollectable(/;" d +iscont vendor/lua-5.4.8/src/lutf8lib.c /^#define iscont(/;" d file: +iscontp vendor/lua-5.4.8/src/lutf8lib.c /^#define iscontp(/;" d file: +isdead vendor/lua-5.4.8/src/lgc.h /^#define isdead(/;" d +isdeadm vendor/lua-5.4.8/src/lgc.h /^#define isdeadm(/;" d +isdecGCmodegen vendor/lua-5.4.8/src/lgc.h /^#define isdecGCmodegen(/;" d +isdummy vendor/lua-5.4.8/src/ltable.h /^#define isdummy(/;" d +isempty vendor/lua-5.4.8/src/lobject.h /^#define isempty(/;" d +isemptystr vendor/lua-5.4.8/src/lvm.c /^#define isemptystr(/;" d file: +isgray vendor/lua-5.4.8/src/lgc.h /^#define isgray(/;" d +isintwups vendor/lua-5.4.8/src/lfunc.h /^#define isintwups(/;" d +islittle vendor/lua-5.4.8/src/lstrlib.c /^ int islittle;$/;" m struct:Header typeref:typename:int file: +isloop vendor/lua-5.4.8/src/lparser.c /^ lu_byte isloop; \/* true if 'block' is a loop *\/$/;" m struct:BlockCnt typeref:typename:lu_byte file: +isneg vendor/lua-5.4.8/src/lobject.c /^static int isneg (const char **s) {$/;" f typeref:typename:int file: +isnonstrictnil vendor/lua-5.4.8/src/lobject.h /^#define isnonstrictnil(/;" d +isold vendor/lua-5.4.8/src/lgc.h /^#define isold(/;" d +ispow2 vendor/lua-5.4.8/src/llimits.h /^#define ispow2(/;" d +ispow2realasize vendor/lua-5.4.8/src/ltable.c /^static int ispow2realasize (const Table *t) {$/;" f typeref:typename:int file: +ispseudo vendor/lua-5.4.8/src/lapi.c /^#define ispseudo(/;" d file: +isrealasize vendor/lua-5.4.8/src/lobject.h /^#define isrealasize(/;" d +isreserved vendor/lua-5.4.8/src/lstring.h /^#define isreserved(/;" d +issweepphase vendor/lua-5.4.8/src/lgc.h /^#define issweepphase(/;" d +istailcall vendor/lua-5.4.8/src/lua.h /^ char istailcall; \/* (t) *\/$/;" m struct:lua_Debug typeref:typename:char +isupvalue vendor/lua-5.4.8/src/lapi.c /^#define isupvalue(/;" d file: +isvalid vendor/lua-5.4.8/src/lapi.c /^#define isvalid(/;" d file: +isvararg vendor/lua-5.4.8/src/lua.h /^ char isvararg; \/* (u) *\/$/;" m struct:lua_Debug typeref:typename:char +iswhite vendor/lua-5.4.8/src/lgc.h /^#define iswhite(/;" d +iter_aux vendor/lua-5.4.8/src/lutf8lib.c /^static int iter_aux (lua_State *L, int strict) {$/;" f typeref:typename:int file: +iter_auxlax vendor/lua-5.4.8/src/lutf8lib.c /^static int iter_auxlax (lua_State *L) {$/;" f typeref:typename:int file: +iter_auxstrict vendor/lua-5.4.8/src/lutf8lib.c /^static int iter_auxstrict (lua_State *L) {$/;" f typeref:typename:int file: +iter_codes vendor/lua-5.4.8/src/lutf8lib.c /^static int iter_codes (lua_State *L) {$/;" f typeref:typename:int file: +ival vendor/lua-5.4.8/src/lparser.h /^ lua_Integer ival; \/* for VKINT *\/$/;" m union:expdesc::__anon337ee443020a typeref:typename:lua_Integer +ivalue vendor/lua-5.4.8/src/lobject.h /^#define ivalue(/;" d +ivalueraw vendor/lua-5.4.8/src/lobject.h /^#define ivalueraw(/;" d +iwthabs vendor/lua-5.4.8/src/lparser.h /^ lu_byte iwthabs; \/* instructions issued since last absolute line info *\/$/;" m struct:FuncState typeref:typename:lu_byte +jumponcond vendor/lua-5.4.8/src/lcode.c /^static int jumponcond (FuncState *fs, expdesc *e, int cond) {$/;" f typeref:typename:int file: +jumpscopeerror vendor/lua-5.4.8/src/lparser.c /^static l_noret jumpscopeerror (LexState *ls, Labeldesc *gt) {$/;" f typeref:typename:l_noret file: +k vendor/lua-5.4.8/src/lobject.h /^ TValue *k; \/* constants used by the function *\/$/;" m struct:Proto typeref:typename:TValue * +k vendor/lua-5.4.8/src/lparser.h /^ TValue k; \/* constant value (if any) *\/$/;" m union:Vardesc typeref:typename:TValue +k vendor/lua-5.4.8/src/lparser.h /^ expkind k;$/;" m struct:expdesc typeref:typename:expkind +k vendor/lua-5.4.8/src/lstate.h /^ lua_KFunction k; \/* continuation in case of yields *\/$/;" m struct:CallInfo::__anona701f1f7010a::__anona701f1f70308 typeref:typename:lua_KFunction +keepinvariant vendor/lua-5.4.8/src/lgc.h /^#define keepinvariant(/;" d +key_tt vendor/lua-5.4.8/src/lobject.h /^ lu_byte key_tt; \/* key type *\/$/;" m struct:Node::NodeKey typeref:typename:lu_byte +key_val vendor/lua-5.4.8/src/lobject.h /^ Value key_val; \/* key value *\/$/;" m struct:Node::NodeKey typeref:typename:Value +keyiscollectable vendor/lua-5.4.8/src/lobject.h /^#define keyiscollectable(/;" d +keyisdead vendor/lua-5.4.8/src/lobject.h /^#define keyisdead(/;" d +keyisinteger vendor/lua-5.4.8/src/lobject.h /^#define keyisinteger(/;" d +keyisnil vendor/lua-5.4.8/src/lobject.h /^#define keyisnil(/;" d +keyisshrstr vendor/lua-5.4.8/src/lobject.h /^#define keyisshrstr(/;" d +keyiswhite vendor/lua-5.4.8/src/lgc.c /^#define keyiswhite(/;" d file: +keyival vendor/lua-5.4.8/src/lobject.h /^#define keyival(/;" d +keystrval vendor/lua-5.4.8/src/lobject.h /^#define keystrval(/;" d +keytt vendor/lua-5.4.8/src/lobject.h /^#define keytt(/;" d +keyval vendor/lua-5.4.8/src/lobject.h /^#define keyval(/;" d +kind vendor/lua-5.4.8/src/lobject.h /^ lu_byte kind; \/* kind of corresponding variable *\/$/;" m struct:Upvaldesc typeref:typename:lu_byte +kind vendor/lua-5.4.8/src/lparser.h /^ lu_byte kind;$/;" m struct:Vardesc::__anon337ee4430508 typeref:typename:lu_byte +kname vendor/lua-5.4.8/src/ldebug.c /^static const char *kname (const Proto *p, int index, const char **name) {$/;" f typeref:typename:const char * file: +l vendor/lua-5.4.8/src/lmathlib.c /^ lu_int32 l; \/* lower half *\/$/;" m struct:Rand64 typeref:typename:lu_int32 file: +l vendor/lua-5.4.8/src/lobject.h /^ LClosure l;$/;" m union:Closure typeref:typename:LClosure +l vendor/lua-5.4.8/src/lstate.c /^ LX l;$/;" m struct:LG typeref:typename:LX file: +l vendor/lua-5.4.8/src/lstate.c /^ lua_State l;$/;" m struct:LX typeref:typename:lua_State file: +l vendor/lua-5.4.8/src/lstate.h /^ } l;$/;" m union:CallInfo::__anona701f1f7010a typeref:struct:CallInfo::__anona701f1f7010a::__anona701f1f70208 +l_G vendor/lua-5.4.8/src/lstate.h /^ global_State *l_G;$/;" m struct:lua_State typeref:typename:global_State * +l_addi vendor/lua-5.4.8/src/lvm.c /^#define l_addi(/;" d file: +l_alloc vendor/lua-5.4.8/src/lauxlib.c /^static void *l_alloc (void *ud, void *ptr, size_t osize, size_t nsize) {$/;" f typeref:typename:void * file: +l_band vendor/lua-5.4.8/src/lvm.c /^#define l_band(/;" d file: +l_begin_drawing main.c /^static int l_begin_drawing(lua_State *L) {$/;" f typeref:typename:int file: +l_bor vendor/lua-5.4.8/src/lvm.c /^#define l_bor(/;" d file: +l_bxor vendor/lua-5.4.8/src/lvm.c /^#define l_bxor(/;" d file: +l_castS2U vendor/lua-5.4.8/src/llimits.h /^#define l_castS2U(/;" d +l_castU2S vendor/lua-5.4.8/src/llimits.h /^#define l_castU2S(/;" d +l_checkmode vendor/lua-5.4.8/src/liolib.c /^static int l_checkmode (const char *mode) {$/;" f typeref:typename:int file: +l_checkmodep vendor/lua-5.4.8/src/liolib.c /^#define l_checkmodep(/;" d file: +l_checktime vendor/lua-5.4.8/src/loslib.c /^static time_t l_checktime (lua_State *L, int arg) {$/;" f typeref:typename:time_t file: +l_clear_window main.c /^static int l_clear_window(lua_State *L) {$/;" f typeref:typename:int file: +l_close_window main.c /^static int l_close_window(lua_State *L) {$/;" f typeref:typename:int file: +l_draw_fps main.c /^static int l_draw_fps(lua_State *L) {$/;" f typeref:typename:int file: +l_end_drawing main.c /^static int l_end_drawing(lua_State *L) {$/;" f typeref:typename:int file: +l_floatatt vendor/lua-5.4.8/src/luaconf.h /^#define l_floatatt(/;" d +l_floor vendor/lua-5.4.8/src/luaconf.h /^#define l_floor(/;" d +l_fseek vendor/lua-5.4.8/src/liolib.c /^#define l_fseek(/;" d file: +l_ftell vendor/lua-5.4.8/src/liolib.c /^#define l_ftell(/;" d file: +l_gei vendor/lua-5.4.8/src/lvm.c /^#define l_gei(/;" d file: +l_getc vendor/lua-5.4.8/src/liolib.c /^#define l_getc(/;" d file: +l_gettime vendor/lua-5.4.8/src/loslib.c /^#define l_gettime(/;" d file: +l_gmtime vendor/lua-5.4.8/src/loslib.c /^#define l_gmtime(/;" d file: +l_gti vendor/lua-5.4.8/src/lvm.c /^#define l_gti(/;" d file: +l_hashfloat vendor/lua-5.4.8/src/ltable.c /^static int l_hashfloat (lua_Number n) {$/;" f typeref:typename:int file: +l_inline vendor/lua-5.4.8/src/llimits.h /^#define l_inline /;" d +l_inspectstat vendor/lua-5.4.8/src/lauxlib.c /^#define l_inspectstat(/;" d file: +l_intfitsf vendor/lua-5.4.8/src/lvm.c /^#define l_intfitsf(/;" d file: +l_isfalse vendor/lua-5.4.8/src/lobject.h /^#define l_isfalse(/;" d +l_lei vendor/lua-5.4.8/src/lvm.c /^#define l_lei(/;" d file: +l_likely vendor/lua-5.4.8/src/luaconf.h /^#define l_likely(/;" d +l_localtime vendor/lua-5.4.8/src/loslib.c /^#define l_localtime(/;" d file: +l_lockfile vendor/lua-5.4.8/src/liolib.c /^#define l_lockfile(/;" d file: +l_lti vendor/lua-5.4.8/src/lvm.c /^#define l_lti(/;" d file: +l_mathop vendor/lua-5.4.8/src/luaconf.h /^#define l_mathop(/;" d +l_mem vendor/lua-5.4.8/src/llimits.h /^typedef LUAI_MEM l_mem;$/;" t typeref:typename:LUAI_MEM +l_mem vendor/lua-5.4.8/src/llimits.h /^typedef long l_mem;$/;" t typeref:typename:long +l_mem vendor/lua-5.4.8/src/llimits.h /^typedef ptrdiff_t l_mem;$/;" t typeref:typename:ptrdiff_t +l_message vendor/lua-5.4.8/src/lua.c /^static void l_message (const char *pname, const char *msg) {$/;" f typeref:typename:void file: +l_muli vendor/lua-5.4.8/src/lvm.c /^#define l_muli(/;" d file: +l_noret vendor/lua-5.4.8/src/llimits.h /^#define l_noret /;" d +l_open_window main.c /^static int l_open_window(lua_State *L) {$/;" f typeref:typename:int file: +l_pclose vendor/lua-5.4.8/src/liolib.c /^#define l_pclose(/;" d file: +l_popen vendor/lua-5.4.8/src/liolib.c /^#define l_popen(/;" d file: +l_print vendor/lua-5.4.8/src/lua.c /^static void l_print (lua_State *L) {$/;" f typeref:typename:void file: +l_pushtime vendor/lua-5.4.8/src/loslib.c /^#define l_pushtime(/;" d file: +l_randomizePivot vendor/lua-5.4.8/src/ltablib.c /^static unsigned int l_randomizePivot (void) {$/;" f typeref:typename:unsigned int file: +l_registry vendor/lua-5.4.8/src/lstate.h /^ TValue l_registry;$/;" m struct:global_State typeref:typename:TValue +l_seeknum vendor/lua-5.4.8/src/liolib.c /^#define l_seeknum /;" d file: +l_set_fps main.c /^static int l_set_fps(lua_State *L) {$/;" f typeref:typename:int file: +l_setbit vendor/lua-5.4.8/src/lgc.h /^#define l_setbit(/;" d +l_signalT vendor/lua-5.4.8/src/lstate.h /^#define l_signalT /;" d +l_sinline vendor/lua-5.4.8/src/llimits.h /^#define l_sinline /;" d +l_sprintf vendor/lua-5.4.8/src/luaconf.h /^#define l_sprintf(/;" d +l_str2d vendor/lua-5.4.8/src/lobject.c /^static const char *l_str2d (const char *s, lua_Number *result) {$/;" f typeref:typename:const char * file: +l_str2dloc vendor/lua-5.4.8/src/lobject.c /^static const char *l_str2dloc (const char *s, lua_Number *result, int mode) {$/;" f typeref:typename:const char * file: +l_str2int vendor/lua-5.4.8/src/lobject.c /^static const char *l_str2int (const char *s, lua_Integer *result) {$/;" f typeref:typename:const char * file: +l_strcmp vendor/lua-5.4.8/src/lvm.c /^static int l_strcmp (const TString *ts1, const TString *ts2) {$/;" f typeref:typename:int file: +l_strton vendor/lua-5.4.8/src/lvm.c /^static int l_strton (const TValue *obj, TValue *result) {$/;" f typeref:typename:int file: +l_subi vendor/lua-5.4.8/src/lvm.c /^#define l_subi(/;" d file: +l_system vendor/lua-5.4.8/src/loslib.c /^#define l_system(/;" d file: +l_timet vendor/lua-5.4.8/src/loslib.c /^#define l_timet /;" d file: +l_uacInt vendor/lua-5.4.8/src/llimits.h /^typedef LUAI_UACINT l_uacInt;$/;" t typeref:typename:LUAI_UACINT +l_uacNumber vendor/lua-5.4.8/src/llimits.h /^typedef LUAI_UACNUMBER l_uacNumber;$/;" t typeref:typename:LUAI_UACNUMBER +l_uint32 vendor/lua-5.4.8/src/llimits.h /^typedef unsigned int l_uint32;$/;" t typeref:typename:unsigned int +l_uint32 vendor/lua-5.4.8/src/llimits.h /^typedef unsigned long l_uint32;$/;" t typeref:typename:unsigned long +l_unlikely vendor/lua-5.4.8/src/luaconf.h /^#define l_unlikely(/;" d +l_unlockfile vendor/lua-5.4.8/src/liolib.c /^#define l_unlockfile(/;" d file: +l_window_should_close main.c /^static int l_window_should_close(lua_State *L) {$/;" f typeref:typename:int file: +label vendor/lua-5.4.8/src/lparser.h /^ Labellist label; \/* list of active labels *\/$/;" m struct:Dyndata typeref:typename:Labellist +labelstat vendor/lua-5.4.8/src/lparser.c /^static void labelstat (LexState *ls, TString *name, int line) {$/;" f typeref:typename:void file: +laction vendor/lua-5.4.8/src/lua.c /^static void laction (int i) {$/;" f typeref:typename:void file: +lapi.o vendor/lua-5.4.8/src/Makefile /^lapi.o: lapi.c lprefix.h lua.h luaconf.h lapi.h llimits.h lstate.h \\$/;" t +lapi_c vendor/lua-5.4.8/src/lapi.c /^#define lapi_c$/;" d file: +lapi_h vendor/lua-5.4.8/src/lapi.h /^#define lapi_h$/;" d +lastatomic vendor/lua-5.4.8/src/lstate.h /^ lu_mem lastatomic; \/* see function 'genstep' in file 'lgc.c' *\/$/;" m struct:global_State typeref:typename:lu_mem +lastfree vendor/lua-5.4.8/src/lobject.h /^ Node *lastfree; \/* any free position is before this position *\/$/;" m struct:Table typeref:typename:Node * +lastlevel vendor/lua-5.4.8/src/lauxlib.c /^static int lastlevel (lua_State *L) {$/;" f typeref:typename:int file: +lastline vendor/lua-5.4.8/src/llex.h /^ int lastline; \/* line of last token 'consumed' *\/$/;" m struct:LexState typeref:typename:int +lastlinedefined vendor/lua-5.4.8/src/lobject.h /^ int lastlinedefined; \/* debug information *\/$/;" m struct:Proto typeref:typename:int +lastlinedefined vendor/lua-5.4.8/src/lua.h /^ int lastlinedefined; \/* (S) *\/$/;" m struct:lua_Debug typeref:typename:int +lastlistfield vendor/lua-5.4.8/src/lparser.c /^static void lastlistfield (FuncState *fs, ConsControl *cc) {$/;" f typeref:typename:void file: +lastmatch vendor/lua-5.4.8/src/lstrlib.c /^ const char *lastmatch; \/* end of last match *\/$/;" m struct:GMatchState typeref:typename:const char * file: +lasttarget vendor/lua-5.4.8/src/lparser.h /^ int lasttarget; \/* 'label' of last 'jump label' *\/$/;" m struct:FuncState typeref:typename:int +lauxlib.o vendor/lua-5.4.8/src/Makefile /^lauxlib.o: lauxlib.c lprefix.h lua.h luaconf.h lauxlib.h$/;" t +lauxlib_c vendor/lua-5.4.8/src/lauxlib.c /^#define lauxlib_c$/;" d file: +lauxlib_h vendor/lua-5.4.8/src/lauxlib.h /^#define lauxlib_h$/;" d +layout vendor/raylib-5.5_linux_amd64/include/raylib.h /^ int layout; \/\/ Layout of the n-patch: 3x3, 1x3 or 3x1$/;" m struct:NPatchInfo typeref:typename:int +lbaselib.o vendor/lua-5.4.8/src/Makefile /^lbaselib.o: lbaselib.c lprefix.h lua.h luaconf.h lauxlib.h lualib.h$/;" t +lbaselib_c vendor/lua-5.4.8/src/lbaselib.c /^#define lbaselib_c$/;" d file: +lcode.o vendor/lua-5.4.8/src/Makefile /^lcode.o: lcode.c lprefix.h lua.h luaconf.h lcode.h llex.h lobject.h \\$/;" t +lcode.o vendor/lua-5.4.8/src/Makefile /^lcode.o:$/;" t +lcode_c vendor/lua-5.4.8/src/lcode.c /^#define lcode_c$/;" d file: +lcode_h vendor/lua-5.4.8/src/lcode.h /^#define lcode_h$/;" d +lcorolib.o vendor/lua-5.4.8/src/Makefile /^lcorolib.o: lcorolib.c lprefix.h lua.h luaconf.h lauxlib.h lualib.h$/;" t +lcorolib_c vendor/lua-5.4.8/src/lcorolib.c /^#define lcorolib_c$/;" d file: +lctype.o vendor/lua-5.4.8/src/Makefile /^lctype.o: lctype.c lprefix.h lctype.h lua.h luaconf.h llimits.h$/;" t +lctype_c vendor/lua-5.4.8/src/lctype.c /^#define lctype_c$/;" d file: +lctype_h vendor/lua-5.4.8/src/lctype.h /^#define lctype_h$/;" d +ldblib.o vendor/lua-5.4.8/src/Makefile /^ldblib.o: ldblib.c lprefix.h lua.h luaconf.h lauxlib.h lualib.h$/;" t +ldblib_c vendor/lua-5.4.8/src/ldblib.c /^#define ldblib_c$/;" d file: +ldebug.o vendor/lua-5.4.8/src/Makefile /^ldebug.o: ldebug.c lprefix.h lua.h luaconf.h lapi.h llimits.h lstate.h \\$/;" t +ldebug_c vendor/lua-5.4.8/src/ldebug.c /^#define ldebug_c$/;" d file: +ldebug_h vendor/lua-5.4.8/src/ldebug.h /^#define ldebug_h$/;" d +ldo.o vendor/lua-5.4.8/src/Makefile /^ldo.o: ldo.c lprefix.h lua.h luaconf.h lapi.h llimits.h lstate.h \\$/;" t +ldo_c vendor/lua-5.4.8/src/ldo.c /^#define ldo_c$/;" d file: +ldo_h vendor/lua-5.4.8/src/ldo.h /^#define ldo_h$/;" d +ldump.o vendor/lua-5.4.8/src/Makefile /^ldump.o: ldump.c lprefix.h lua.h luaconf.h lobject.h llimits.h lstate.h \\$/;" t +ldump_c vendor/lua-5.4.8/src/ldump.c /^#define ldump_c$/;" d file: +learning and docs vendor/raylib-5.5_linux_amd64/README.md /^learning and docs$/;" s +leaveblock vendor/lua-5.4.8/src/lparser.c /^static void leaveblock (FuncState *fs) {$/;" f typeref:typename:void file: +leavelevel vendor/lua-5.4.8/src/lparser.c /^#define leavelevel(/;" d file: +left vendor/lua-5.4.8/src/lparser.c /^ lu_byte left; \/* left priority for each binary operator *\/$/;" m struct:__anon337ee43e0108 typeref:typename:lu_byte file: +left vendor/raylib-5.5_linux_amd64/include/raylib.h /^ int left; \/\/ Left border offset$/;" m struct:NPatchInfo typeref:typename:int +leftLensCenter vendor/raylib-5.5_linux_amd64/include/raylib.h /^ float leftLensCenter[2]; \/\/ VR left lens center$/;" m struct:VrStereoConfig typeref:typename:float[2] +leftScreenCenter vendor/raylib-5.5_linux_amd64/include/raylib.h /^ float leftScreenCenter[2]; \/\/ VR left screen center$/;" m struct:VrStereoConfig typeref:typename:float[2] +len vendor/lua-5.4.8/src/lobject.h /^ size_t len; \/* number of bytes *\/$/;" m struct:Udata typeref:typename:size_t +len vendor/lua-5.4.8/src/lobject.h /^ size_t len; \/* number of bytes *\/$/;" m struct:Udata0 typeref:typename:size_t +len vendor/lua-5.4.8/src/lstrlib.c /^ ptrdiff_t len;$/;" m struct:MatchState::__anonae5a27210108 typeref:typename:ptrdiff_t file: +lensDistortionValues vendor/raylib-5.5_linux_amd64/include/raylib.h /^ float lensDistortionValues[4]; \/\/ Lens distortion constant parameters$/;" m struct:VrDeviceInfo typeref:typename:float[4] +lensSeparationDistance vendor/raylib-5.5_linux_amd64/include/raylib.h /^ float lensSeparationDistance; \/\/ Lens separation distance in meters$/;" m struct:VrDeviceInfo typeref:typename:float +lessequalothers vendor/lua-5.4.8/src/lvm.c /^static int lessequalothers (lua_State *L, const TValue *l, const TValue *r) {$/;" f typeref:typename:int file: +lessthanothers vendor/lua-5.4.8/src/lvm.c /^static int lessthanothers (lua_State *L, const TValue *l, const TValue *r) {$/;" f typeref:typename:int file: +level vendor/lua-5.4.8/src/ldo.c /^ StkId level;$/;" m struct:CloseP typeref:typename:StkId file: +level vendor/lua-5.4.8/src/lstrlib.c /^ unsigned char level; \/* total number of captures (finished or unfinished) *\/$/;" m struct:MatchState typeref:typename:unsigned char file: +lexerror vendor/lua-5.4.8/src/llex.c /^static l_noret lexerror (LexState *ls, const char *msg, int token) {$/;" f typeref:typename:l_noret file: +lexerror vendor/lua-5.4.8/src/llex.c /^static l_noret lexerror (LexState *ls, const char *msg, int token);$/;" p typeref:typename:l_noret file: +lfunc.o vendor/lua-5.4.8/src/Makefile /^lfunc.o: lfunc.c lprefix.h lua.h luaconf.h ldebug.h lstate.h lobject.h \\$/;" t +lfunc_c vendor/lua-5.4.8/src/lfunc.c /^#define lfunc_c$/;" d file: +lfunc_h vendor/lua-5.4.8/src/lfunc.h /^#define lfunc_h$/;" d +lgc.o vendor/lua-5.4.8/src/Makefile /^lgc.o: lgc.c lprefix.h lua.h luaconf.h ldebug.h lstate.h lobject.h \\$/;" t +lgc_c vendor/lua-5.4.8/src/lgc.c /^#define lgc_c$/;" d file: +lgc_h vendor/lua-5.4.8/src/lgc.h /^#define lgc_h$/;" d +license vendor/raylib-5.5_linux_amd64/README.md /^license$/;" s +limitasasize vendor/lua-5.4.8/src/ltable.c /^#define limitasasize(/;" d file: +limitequalsasize vendor/lua-5.4.8/src/ltable.c /^#define limitequalsasize(/;" d file: +line vendor/lua-5.4.8/src/lobject.h /^ int line;$/;" m struct:AbsLineInfo typeref:typename:int +line vendor/lua-5.4.8/src/lparser.h /^ int line; \/* line where it appeared *\/$/;" m struct:Labeldesc typeref:typename:int +linedefined vendor/lua-5.4.8/src/lobject.h /^ int linedefined; \/* debug information *\/$/;" m struct:Proto typeref:typename:int +linedefined vendor/lua-5.4.8/src/lua.h /^ int linedefined; \/* (S) *\/$/;" m struct:lua_Debug typeref:typename:int +lineinfo vendor/lua-5.4.8/src/lobject.h /^ ls_byte *lineinfo; \/* information about source lines (debug information) *\/$/;" m struct:Proto typeref:typename:ls_byte * +linenumber vendor/lua-5.4.8/src/llex.h /^ int linenumber; \/* input line counter *\/$/;" m struct:LexState typeref:typename:int +linit.o vendor/lua-5.4.8/src/Makefile /^linit.o: linit.c lprefix.h lua.h luaconf.h lualib.h lauxlib.h$/;" t +linit_c vendor/lua-5.4.8/src/linit.c /^#define linit_c$/;" d file: +linkgclist vendor/lua-5.4.8/src/lgc.c /^#define linkgclist(/;" d file: +linkgclist_ vendor/lua-5.4.8/src/lgc.c /^static void linkgclist_ (GCObject *o, GCObject **pnext, GCObject **list) {$/;" f typeref:typename:void file: +linkobjgclist vendor/lua-5.4.8/src/lgc.c /^#define linkobjgclist(/;" d file: +linux vendor/lua-5.4.8/src/Makefile /^Linux linux: linux-noreadline$/;" t +linux-noreadline vendor/lua-5.4.8/src/Makefile /^linux-noreadline:$/;" t +linux-readline vendor/lua-5.4.8/src/Makefile /^linux-readline:$/;" t +liolib.o vendor/lua-5.4.8/src/Makefile /^liolib.o: liolib.c lprefix.h lua.h luaconf.h lauxlib.h lualib.h$/;" t +liolib_c vendor/lua-5.4.8/src/liolib.c /^#define liolib_c$/;" d file: +lisdigit vendor/lua-5.4.8/src/lctype.h /^#define lisdigit(/;" d +lislalnum vendor/lua-5.4.8/src/lctype.h /^#define lislalnum(/;" d +lislalpha vendor/lua-5.4.8/src/lctype.h /^#define lislalpha(/;" d +lisprint vendor/lua-5.4.8/src/lctype.h /^#define lisprint(/;" d +lisspace vendor/lua-5.4.8/src/lctype.h /^#define lisspace(/;" d +listfield vendor/lua-5.4.8/src/lparser.c /^static void listfield (LexState *ls, ConsControl *cc) {$/;" f typeref:typename:void file: +listing vendor/lua-5.4.8/src/luac.c /^static int listing=0; \/* list bytecodes? *\/$/;" v typeref:typename:int file: +lisxdigit vendor/lua-5.4.8/src/lctype.h /^#define lisxdigit(/;" d +little vendor/lua-5.4.8/src/lstrlib.c /^ char little; \/* true iff machine is little endian *\/$/;" m union:__anonae5a2721020a typeref:typename:char file: +ll_funcs vendor/lua-5.4.8/src/loadlib.c /^static const luaL_Reg ll_funcs[] = {$/;" v typeref:typename:const luaL_Reg[] file: +ll_loadlib vendor/lua-5.4.8/src/loadlib.c /^static int ll_loadlib (lua_State *L) {$/;" f typeref:typename:int file: +ll_require vendor/lua-5.4.8/src/loadlib.c /^static int ll_require (lua_State *L) {$/;" f typeref:typename:int file: +ll_searchpath vendor/lua-5.4.8/src/loadlib.c /^static int ll_searchpath (lua_State *L) {$/;" f typeref:typename:int file: +llex vendor/lua-5.4.8/src/llex.c /^static int llex (LexState *ls, SemInfo *seminfo) {$/;" f typeref:typename:int file: +llex.o vendor/lua-5.4.8/src/Makefile /^llex.o: llex.c lprefix.h lua.h luaconf.h lctype.h llimits.h ldebug.h \\$/;" t +llex.o vendor/lua-5.4.8/src/Makefile /^llex.o:$/;" t +llex_c vendor/lua-5.4.8/src/llex.c /^#define llex_c$/;" d file: +llex_h vendor/lua-5.4.8/src/llex.h /^#define llex_h$/;" d +llimits_h vendor/lua-5.4.8/src/llimits.h /^#define llimits_h$/;" d +lmathlib.o vendor/lua-5.4.8/src/Makefile /^lmathlib.o: lmathlib.c lprefix.h lua.h luaconf.h lauxlib.h lualib.h$/;" t +lmathlib_c vendor/lua-5.4.8/src/lmathlib.c /^#define lmathlib_c$/;" d file: +lmem.o vendor/lua-5.4.8/src/Makefile /^lmem.o: lmem.c lprefix.h lua.h luaconf.h ldebug.h lstate.h lobject.h \\$/;" t +lmem_c vendor/lua-5.4.8/src/lmem.c /^#define lmem_c$/;" d file: +lmem_h vendor/lua-5.4.8/src/lmem.h /^#define lmem_h$/;" d +lmemfind vendor/lua-5.4.8/src/lstrlib.c /^static const char *lmemfind (const char *s1, size_t l1,$/;" f typeref:typename:const char * file: +lmod vendor/lua-5.4.8/src/lobject.h /^#define lmod(/;" d +lnglen vendor/lua-5.4.8/src/lobject.h /^ size_t lnglen; \/* length for long strings *\/$/;" m union:TString::__anon808f9fcd030a typeref:typename:size_t +loadBlock vendor/lua-5.4.8/src/lundump.c /^static void loadBlock (LoadState *S, void *b, size_t size) {$/;" f typeref:typename:void file: +loadByte vendor/lua-5.4.8/src/lundump.c /^static lu_byte loadByte (LoadState *S) {$/;" f typeref:typename:lu_byte file: +loadCode vendor/lua-5.4.8/src/lundump.c /^static void loadCode (LoadState *S, Proto *f) {$/;" f typeref:typename:void file: +loadConstants vendor/lua-5.4.8/src/lundump.c /^static void loadConstants (LoadState *S, Proto *f) {$/;" f typeref:typename:void file: +loadDebug vendor/lua-5.4.8/src/lundump.c /^static void loadDebug (LoadState *S, Proto *f) {$/;" f typeref:typename:void file: +loadFunction vendor/lua-5.4.8/src/lundump.c /^static void loadFunction (LoadState *S, Proto *f, TString *psource) {$/;" f typeref:typename:void file: +loadFunction vendor/lua-5.4.8/src/lundump.c /^static void loadFunction(LoadState *S, Proto *f, TString *psource);$/;" p typeref:typename:void file: +loadInt vendor/lua-5.4.8/src/lundump.c /^static int loadInt (LoadState *S) {$/;" f typeref:typename:int file: +loadInteger vendor/lua-5.4.8/src/lundump.c /^static lua_Integer loadInteger (LoadState *S) {$/;" f typeref:typename:lua_Integer file: +loadNumber vendor/lua-5.4.8/src/lundump.c /^static lua_Number loadNumber (LoadState *S) {$/;" f typeref:typename:lua_Number file: +loadProtos vendor/lua-5.4.8/src/lundump.c /^static void loadProtos (LoadState *S, Proto *f) {$/;" f typeref:typename:void file: +loadSize vendor/lua-5.4.8/src/lundump.c /^static size_t loadSize (LoadState *S) {$/;" f typeref:typename:size_t file: +loadString vendor/lua-5.4.8/src/lundump.c /^static TString *loadString (LoadState *S, Proto *p) {$/;" f typeref:typename:TString * file: +loadStringN vendor/lua-5.4.8/src/lundump.c /^static TString *loadStringN (LoadState *S, Proto *p) {$/;" f typeref:typename:TString * file: +loadUnsigned vendor/lua-5.4.8/src/lundump.c /^static size_t loadUnsigned (LoadState *S, size_t limit) {$/;" f typeref:typename:size_t file: +loadUpvalues vendor/lua-5.4.8/src/lundump.c /^static void loadUpvalues (LoadState *S, Proto *f) {$/;" f typeref:typename:void file: +loadVar vendor/lua-5.4.8/src/lundump.c /^#define loadVar(/;" d file: +loadVector vendor/lua-5.4.8/src/lundump.c /^#define loadVector(/;" d file: +load_aux vendor/lua-5.4.8/src/lbaselib.c /^static int load_aux (lua_State *L, int status, int envidx) {$/;" f typeref:typename:int file: +loadedlibs vendor/lua-5.4.8/src/linit.c /^static const luaL_Reg loadedlibs[] = {$/;" v typeref:typename:const luaL_Reg[] file: +loadfunc vendor/lua-5.4.8/src/loadlib.c /^static int loadfunc (lua_State *L, const char *filename, const char *modname) {$/;" f typeref:typename:int file: +loadlib.o vendor/lua-5.4.8/src/Makefile /^loadlib.o: loadlib.c lprefix.h lua.h luaconf.h lauxlib.h lualib.h$/;" t +loadlib_c vendor/lua-5.4.8/src/loadlib.c /^#define loadlib_c$/;" d file: +loadline vendor/lua-5.4.8/src/lua.c /^static int loadline (lua_State *L) {$/;" f typeref:typename:int file: +lobject.o vendor/lua-5.4.8/src/Makefile /^lobject.o: lobject.c lprefix.h lua.h luaconf.h lctype.h llimits.h \\$/;" t +lobject_c vendor/lua-5.4.8/src/lobject.c /^#define lobject_c$/;" d file: +lobject_h vendor/lua-5.4.8/src/lobject.h /^#define lobject_h$/;" d +local vendor/lua-5.4.8/Makefile /^local:$/;" t +localdebuginfo vendor/lua-5.4.8/src/lparser.c /^static LocVar *localdebuginfo (FuncState *fs, int vidx) {$/;" f typeref:typename:LocVar * file: +localfunc vendor/lua-5.4.8/src/lparser.c /^static void localfunc (LexState *ls) {$/;" f typeref:typename:void file: +localstat vendor/lua-5.4.8/src/lparser.c /^static void localstat (LexState *ls) {$/;" f typeref:typename:void file: +locs vendor/raylib-5.5_linux_amd64/include/raylib.h /^ int *locs; \/\/ Shader locations array (RL_MAX_SHADER_LOCATIONS)$/;" m struct:Shader typeref:typename:int * +locvars vendor/lua-5.4.8/src/lobject.h /^ LocVar *locvars; \/* information about local variables (debug information) *\/$/;" m struct:Proto typeref:typename:LocVar * +log2maxs vendor/lua-5.4.8/src/llimits.h /^#define log2maxs(/;" d +lookahead vendor/lua-5.4.8/src/llex.h /^ Token lookahead; \/* look ahead token *\/$/;" m struct:LexState typeref:typename:Token +lookforfunc vendor/lua-5.4.8/src/loadlib.c /^static int lookforfunc (lua_State *L, const char *path, const char *sym) {$/;" f typeref:typename:int file: +looping vendor/raylib-5.5_linux_amd64/include/raylib.h /^ bool looping; \/\/ Music looping enable$/;" m struct:Music typeref:typename:bool +lopcodes.o vendor/lua-5.4.8/src/Makefile /^lopcodes.o: lopcodes.c lprefix.h lopcodes.h llimits.h lua.h luaconf.h$/;" t +lopcodes_c vendor/lua-5.4.8/src/lopcodes.c /^#define lopcodes_c$/;" d file: +lopcodes_h vendor/lua-5.4.8/src/lopcodes.h /^#define lopcodes_h$/;" d +lopnames_h vendor/lua-5.4.8/src/lopnames.h /^#define lopnames_h$/;" d +loslib.o vendor/lua-5.4.8/src/Makefile /^loslib.o: loslib.c lprefix.h lua.h luaconf.h lauxlib.h lualib.h$/;" t +loslib_c vendor/lua-5.4.8/src/loslib.c /^#define loslib_c$/;" d file: +lparser.o vendor/lua-5.4.8/src/Makefile /^lparser.o: lparser.c lprefix.h lua.h luaconf.h lcode.h llex.h lobject.h \\$/;" t +lparser.o vendor/lua-5.4.8/src/Makefile /^lparser.o:$/;" t +lparser_c vendor/lua-5.4.8/src/lparser.c /^#define lparser_c$/;" d file: +lparser_h vendor/lua-5.4.8/src/lparser.h /^#define lparser_h$/;" d +lprefix_h vendor/lua-5.4.8/src/lprefix.h /^#define lprefix_h$/;" d +ls vendor/lua-5.4.8/src/lparser.h /^ struct LexState *ls; \/* lexical state *\/$/;" m struct:FuncState typeref:struct:LexState * +ls_byte vendor/lua-5.4.8/src/llimits.h /^typedef signed char ls_byte;$/;" t typeref:typename:signed char +lsizenode vendor/lua-5.4.8/src/lobject.h /^ lu_byte lsizenode; \/* log2 of size of 'node' array *\/$/;" m struct:Table typeref:typename:lu_byte +lstate.o vendor/lua-5.4.8/src/Makefile /^lstate.o: lstate.c lprefix.h lua.h luaconf.h lapi.h llimits.h lstate.h \\$/;" t +lstate_c vendor/lua-5.4.8/src/lstate.c /^#define lstate_c$/;" d file: +lstate_h vendor/lua-5.4.8/src/lstate.h /^#define lstate_h$/;" d +lstop vendor/lua-5.4.8/src/lua.c /^static void lstop (lua_State *L, lua_Debug *ar) {$/;" f typeref:typename:void file: +lstring.o vendor/lua-5.4.8/src/Makefile /^lstring.o: lstring.c lprefix.h lua.h luaconf.h ldebug.h lstate.h \\$/;" t +lstring_c vendor/lua-5.4.8/src/lstring.c /^#define lstring_c$/;" d file: +lstring_h vendor/lua-5.4.8/src/lstring.h /^#define lstring_h$/;" d +lstrlib.o vendor/lua-5.4.8/src/Makefile /^lstrlib.o: lstrlib.c lprefix.h lua.h luaconf.h lauxlib.h lualib.h$/;" t +lstrlib_c vendor/lua-5.4.8/src/lstrlib.c /^#define lstrlib_c$/;" d file: +lsys_load vendor/lua-5.4.8/src/loadlib.c /^static void *lsys_load (lua_State *L, const char *path, int seeglb) {$/;" f typeref:typename:void * file: +lsys_load vendor/lua-5.4.8/src/loadlib.c /^static void *lsys_load (lua_State *L, const char *path, int seeglb);$/;" p typeref:typename:void * file: +lsys_sym vendor/lua-5.4.8/src/loadlib.c /^static lua_CFunction lsys_sym (lua_State *L, void *lib, const char *sym) {$/;" f typeref:typename:lua_CFunction file: +lsys_sym vendor/lua-5.4.8/src/loadlib.c /^static lua_CFunction lsys_sym (lua_State *L, void *lib, const char *sym);$/;" p typeref:typename:lua_CFunction file: +lsys_unloadlib vendor/lua-5.4.8/src/loadlib.c /^static void lsys_unloadlib (void *lib) {$/;" f typeref:typename:void file: +lsys_unloadlib vendor/lua-5.4.8/src/loadlib.c /^static void lsys_unloadlib (void *lib);$/;" p typeref:typename:void file: +ltable.o vendor/lua-5.4.8/src/Makefile /^ltable.o: ltable.c lprefix.h lua.h luaconf.h ldebug.h lstate.h lobject.h \\$/;" t +ltable_c vendor/lua-5.4.8/src/ltable.c /^#define ltable_c$/;" d file: +ltable_h vendor/lua-5.4.8/src/ltable.h /^#define ltable_h$/;" d +ltablib.o vendor/lua-5.4.8/src/Makefile /^ltablib.o: ltablib.c lprefix.h lua.h luaconf.h lauxlib.h lualib.h$/;" t +ltablib_c vendor/lua-5.4.8/src/ltablib.c /^#define ltablib_c$/;" d file: +ltm.o vendor/lua-5.4.8/src/Makefile /^ltm.o: ltm.c lprefix.h lua.h luaconf.h ldebug.h lstate.h lobject.h \\$/;" t +ltm_c vendor/lua-5.4.8/src/ltm.c /^#define ltm_c$/;" d file: +ltm_h vendor/lua-5.4.8/src/ltm.h /^#define ltm_h$/;" d +ltolower vendor/lua-5.4.8/src/lctype.h /^#define ltolower(/;" d +lu_byte vendor/lua-5.4.8/src/llimits.h /^typedef unsigned char lu_byte;$/;" t typeref:typename:unsigned char +lu_int32 vendor/lua-5.4.8/src/lmathlib.c /^typedef unsigned int lu_int32;$/;" t typeref:typename:unsigned int file: +lu_int32 vendor/lua-5.4.8/src/lmathlib.c /^typedef unsigned long lu_int32;$/;" t typeref:typename:unsigned long file: +lu_mem vendor/lua-5.4.8/src/llimits.h /^typedef LUAI_UMEM lu_mem;$/;" t typeref:typename:LUAI_UMEM +lu_mem vendor/lua-5.4.8/src/llimits.h /^typedef size_t lu_mem;$/;" t typeref:typename:size_t +lu_mem vendor/lua-5.4.8/src/llimits.h /^typedef unsigned long lu_mem;$/;" t typeref:typename:unsigned long +lua Makefile /^lua:$/;" t +lua.o vendor/lua-5.4.8/src/Makefile /^lua.o: lua.c lprefix.h lua.h luaconf.h lauxlib.h lualib.h$/;" t +luaB_assert vendor/lua-5.4.8/src/lbaselib.c /^static int luaB_assert (lua_State *L) {$/;" f typeref:typename:int file: +luaB_auxwrap vendor/lua-5.4.8/src/lcorolib.c /^static int luaB_auxwrap (lua_State *L) {$/;" f typeref:typename:int file: +luaB_close vendor/lua-5.4.8/src/lcorolib.c /^static int luaB_close (lua_State *L) {$/;" f typeref:typename:int file: +luaB_cocreate vendor/lua-5.4.8/src/lcorolib.c /^static int luaB_cocreate (lua_State *L) {$/;" f typeref:typename:int file: +luaB_collectgarbage vendor/lua-5.4.8/src/lbaselib.c /^static int luaB_collectgarbage (lua_State *L) {$/;" f typeref:typename:int file: +luaB_coresume vendor/lua-5.4.8/src/lcorolib.c /^static int luaB_coresume (lua_State *L) {$/;" f typeref:typename:int file: +luaB_corunning vendor/lua-5.4.8/src/lcorolib.c /^static int luaB_corunning (lua_State *L) {$/;" f typeref:typename:int file: +luaB_costatus vendor/lua-5.4.8/src/lcorolib.c /^static int luaB_costatus (lua_State *L) {$/;" f typeref:typename:int file: +luaB_cowrap vendor/lua-5.4.8/src/lcorolib.c /^static int luaB_cowrap (lua_State *L) {$/;" f typeref:typename:int file: +luaB_dofile vendor/lua-5.4.8/src/lbaselib.c /^static int luaB_dofile (lua_State *L) {$/;" f typeref:typename:int file: +luaB_error vendor/lua-5.4.8/src/lbaselib.c /^static int luaB_error (lua_State *L) {$/;" f typeref:typename:int file: +luaB_getmetatable vendor/lua-5.4.8/src/lbaselib.c /^static int luaB_getmetatable (lua_State *L) {$/;" f typeref:typename:int file: +luaB_ipairs vendor/lua-5.4.8/src/lbaselib.c /^static int luaB_ipairs (lua_State *L) {$/;" f typeref:typename:int file: +luaB_load vendor/lua-5.4.8/src/lbaselib.c /^static int luaB_load (lua_State *L) {$/;" f typeref:typename:int file: +luaB_loadfile vendor/lua-5.4.8/src/lbaselib.c /^static int luaB_loadfile (lua_State *L) {$/;" f typeref:typename:int file: +luaB_next vendor/lua-5.4.8/src/lbaselib.c /^static int luaB_next (lua_State *L) {$/;" f typeref:typename:int file: +luaB_pairs vendor/lua-5.4.8/src/lbaselib.c /^static int luaB_pairs (lua_State *L) {$/;" f typeref:typename:int file: +luaB_pcall vendor/lua-5.4.8/src/lbaselib.c /^static int luaB_pcall (lua_State *L) {$/;" f typeref:typename:int file: +luaB_print vendor/lua-5.4.8/src/lbaselib.c /^static int luaB_print (lua_State *L) {$/;" f typeref:typename:int file: +luaB_rawequal vendor/lua-5.4.8/src/lbaselib.c /^static int luaB_rawequal (lua_State *L) {$/;" f typeref:typename:int file: +luaB_rawget vendor/lua-5.4.8/src/lbaselib.c /^static int luaB_rawget (lua_State *L) {$/;" f typeref:typename:int file: +luaB_rawlen vendor/lua-5.4.8/src/lbaselib.c /^static int luaB_rawlen (lua_State *L) {$/;" f typeref:typename:int file: +luaB_rawset vendor/lua-5.4.8/src/lbaselib.c /^static int luaB_rawset (lua_State *L) {$/;" f typeref:typename:int file: +luaB_select vendor/lua-5.4.8/src/lbaselib.c /^static int luaB_select (lua_State *L) {$/;" f typeref:typename:int file: +luaB_setmetatable vendor/lua-5.4.8/src/lbaselib.c /^static int luaB_setmetatable (lua_State *L) {$/;" f typeref:typename:int file: +luaB_tonumber vendor/lua-5.4.8/src/lbaselib.c /^static int luaB_tonumber (lua_State *L) {$/;" f typeref:typename:int file: +luaB_tostring vendor/lua-5.4.8/src/lbaselib.c /^static int luaB_tostring (lua_State *L) {$/;" f typeref:typename:int file: +luaB_type vendor/lua-5.4.8/src/lbaselib.c /^static int luaB_type (lua_State *L) {$/;" f typeref:typename:int file: +luaB_warn vendor/lua-5.4.8/src/lbaselib.c /^static int luaB_warn (lua_State *L) {$/;" f typeref:typename:int file: +luaB_xpcall vendor/lua-5.4.8/src/lbaselib.c /^static int luaB_xpcall (lua_State *L) {$/;" f typeref:typename:int file: +luaB_yield vendor/lua-5.4.8/src/lcorolib.c /^static int luaB_yield (lua_State *L) {$/;" f typeref:typename:int file: +luaB_yieldable vendor/lua-5.4.8/src/lcorolib.c /^static int luaB_yieldable (lua_State *L) {$/;" f typeref:typename:int file: +luaC_barrier vendor/lua-5.4.8/src/lgc.h /^#define luaC_barrier(/;" d +luaC_barrier_ vendor/lua-5.4.8/src/lgc.c /^void luaC_barrier_ (lua_State *L, GCObject *o, GCObject *v) {$/;" f typeref:typename:void +luaC_barrier_ vendor/lua-5.4.8/src/lgc.h /^LUAI_FUNC void luaC_barrier_ (lua_State *L, GCObject *o, GCObject *v);$/;" p typeref:typename:LUAI_FUNC void +luaC_barrierback vendor/lua-5.4.8/src/lgc.h /^#define luaC_barrierback(/;" d +luaC_barrierback_ vendor/lua-5.4.8/src/lgc.c /^void luaC_barrierback_ (lua_State *L, GCObject *o) {$/;" f typeref:typename:void +luaC_barrierback_ vendor/lua-5.4.8/src/lgc.h /^LUAI_FUNC void luaC_barrierback_ (lua_State *L, GCObject *o);$/;" p typeref:typename:LUAI_FUNC void +luaC_changemode vendor/lua-5.4.8/src/lgc.c /^void luaC_changemode (lua_State *L, int newmode) {$/;" f typeref:typename:void +luaC_changemode vendor/lua-5.4.8/src/lgc.h /^LUAI_FUNC void luaC_changemode (lua_State *L, int newmode);$/;" p typeref:typename:LUAI_FUNC void +luaC_checkGC vendor/lua-5.4.8/src/lgc.h /^#define luaC_checkGC(/;" d +luaC_checkfinalizer vendor/lua-5.4.8/src/lgc.c /^void luaC_checkfinalizer (lua_State *L, GCObject *o, Table *mt) {$/;" f typeref:typename:void +luaC_checkfinalizer vendor/lua-5.4.8/src/lgc.h /^LUAI_FUNC void luaC_checkfinalizer (lua_State *L, GCObject *o, Table *mt);$/;" p typeref:typename:LUAI_FUNC void +luaC_condGC vendor/lua-5.4.8/src/lgc.h /^#define luaC_condGC(/;" d +luaC_fix vendor/lua-5.4.8/src/lgc.c /^void luaC_fix (lua_State *L, GCObject *o) {$/;" f typeref:typename:void +luaC_fix vendor/lua-5.4.8/src/lgc.h /^LUAI_FUNC void luaC_fix (lua_State *L, GCObject *o);$/;" p typeref:typename:LUAI_FUNC void +luaC_freeallobjects vendor/lua-5.4.8/src/lgc.c /^void luaC_freeallobjects (lua_State *L) {$/;" f typeref:typename:void +luaC_freeallobjects vendor/lua-5.4.8/src/lgc.h /^LUAI_FUNC void luaC_freeallobjects (lua_State *L);$/;" p typeref:typename:LUAI_FUNC void +luaC_fullgc vendor/lua-5.4.8/src/lgc.c /^void luaC_fullgc (lua_State *L, int isemergency) {$/;" f typeref:typename:void +luaC_fullgc vendor/lua-5.4.8/src/lgc.h /^LUAI_FUNC void luaC_fullgc (lua_State *L, int isemergency);$/;" p typeref:typename:LUAI_FUNC void +luaC_newobj vendor/lua-5.4.8/src/lgc.c /^GCObject *luaC_newobj (lua_State *L, int tt, size_t sz) {$/;" f typeref:typename:GCObject * +luaC_newobj vendor/lua-5.4.8/src/lgc.h /^LUAI_FUNC GCObject *luaC_newobj (lua_State *L, int tt, size_t sz);$/;" p typeref:typename:LUAI_FUNC GCObject * +luaC_newobjdt vendor/lua-5.4.8/src/lgc.c /^GCObject *luaC_newobjdt (lua_State *L, int tt, size_t sz, size_t offset) {$/;" f typeref:typename:GCObject * +luaC_newobjdt vendor/lua-5.4.8/src/lgc.h /^LUAI_FUNC GCObject *luaC_newobjdt (lua_State *L, int tt, size_t sz,$/;" p typeref:typename:LUAI_FUNC GCObject * +luaC_objbarrier vendor/lua-5.4.8/src/lgc.h /^#define luaC_objbarrier(/;" d +luaC_objbarrierback vendor/lua-5.4.8/src/lgc.h /^#define luaC_objbarrierback(/;" d +luaC_runtilstate vendor/lua-5.4.8/src/lgc.c /^void luaC_runtilstate (lua_State *L, int statesmask) {$/;" f typeref:typename:void +luaC_runtilstate vendor/lua-5.4.8/src/lgc.h /^LUAI_FUNC void luaC_runtilstate (lua_State *L, int statesmask);$/;" p typeref:typename:LUAI_FUNC void +luaC_step vendor/lua-5.4.8/src/lgc.c /^void luaC_step (lua_State *L) {$/;" f typeref:typename:void +luaC_step vendor/lua-5.4.8/src/lgc.h /^LUAI_FUNC void luaC_step (lua_State *L);$/;" p typeref:typename:LUAI_FUNC void +luaC_white vendor/lua-5.4.8/src/lgc.h /^#define luaC_white(/;" d +luaD_call vendor/lua-5.4.8/src/ldo.c /^void luaD_call (lua_State *L, StkId func, int nResults) {$/;" f typeref:typename:void +luaD_call vendor/lua-5.4.8/src/ldo.h /^LUAI_FUNC void luaD_call (lua_State *L, StkId func, int nResults);$/;" p typeref:typename:LUAI_FUNC void +luaD_callnoyield vendor/lua-5.4.8/src/ldo.c /^void luaD_callnoyield (lua_State *L, StkId func, int nResults) {$/;" f typeref:typename:void +luaD_callnoyield vendor/lua-5.4.8/src/ldo.h /^LUAI_FUNC void luaD_callnoyield (lua_State *L, StkId func, int nResults);$/;" p typeref:typename:LUAI_FUNC void +luaD_checkstack vendor/lua-5.4.8/src/ldo.h /^#define luaD_checkstack(/;" d +luaD_checkstackaux vendor/lua-5.4.8/src/ldo.h /^#define luaD_checkstackaux(/;" d +luaD_closeprotected vendor/lua-5.4.8/src/ldo.c /^int luaD_closeprotected (lua_State *L, ptrdiff_t level, int status) {$/;" f typeref:typename:int +luaD_closeprotected vendor/lua-5.4.8/src/ldo.h /^LUAI_FUNC int luaD_closeprotected (lua_State *L, ptrdiff_t level, int status);$/;" p typeref:typename:LUAI_FUNC int +luaD_errerr vendor/lua-5.4.8/src/ldo.c /^l_noret luaD_errerr (lua_State *L) {$/;" f typeref:typename:l_noret +luaD_errerr vendor/lua-5.4.8/src/ldo.h /^LUAI_FUNC l_noret luaD_errerr (lua_State *L);$/;" p typeref:typename:LUAI_FUNC l_noret +luaD_growstack vendor/lua-5.4.8/src/ldo.c /^int luaD_growstack (lua_State *L, int n, int raiseerror) {$/;" f typeref:typename:int +luaD_growstack vendor/lua-5.4.8/src/ldo.h /^LUAI_FUNC int luaD_growstack (lua_State *L, int n, int raiseerror);$/;" p typeref:typename:LUAI_FUNC int +luaD_hook vendor/lua-5.4.8/src/ldo.c /^void luaD_hook (lua_State *L, int event, int line,$/;" f typeref:typename:void +luaD_hook vendor/lua-5.4.8/src/ldo.h /^LUAI_FUNC void luaD_hook (lua_State *L, int event, int line,$/;" p typeref:typename:LUAI_FUNC void +luaD_hookcall vendor/lua-5.4.8/src/ldo.c /^void luaD_hookcall (lua_State *L, CallInfo *ci) {$/;" f typeref:typename:void +luaD_hookcall vendor/lua-5.4.8/src/ldo.h /^LUAI_FUNC void luaD_hookcall (lua_State *L, CallInfo *ci);$/;" p typeref:typename:LUAI_FUNC void +luaD_inctop vendor/lua-5.4.8/src/ldo.c /^void luaD_inctop (lua_State *L) {$/;" f typeref:typename:void +luaD_inctop vendor/lua-5.4.8/src/ldo.h /^LUAI_FUNC void luaD_inctop (lua_State *L);$/;" p typeref:typename:LUAI_FUNC void +luaD_pcall vendor/lua-5.4.8/src/ldo.c /^int luaD_pcall (lua_State *L, Pfunc func, void *u,$/;" f typeref:typename:int +luaD_pcall vendor/lua-5.4.8/src/ldo.h /^LUAI_FUNC int luaD_pcall (lua_State *L, Pfunc func, void *u,$/;" p typeref:typename:LUAI_FUNC int +luaD_poscall vendor/lua-5.4.8/src/ldo.c /^void luaD_poscall (lua_State *L, CallInfo *ci, int nres) {$/;" f typeref:typename:void +luaD_poscall vendor/lua-5.4.8/src/ldo.h /^LUAI_FUNC void luaD_poscall (lua_State *L, CallInfo *ci, int nres);$/;" p typeref:typename:LUAI_FUNC void +luaD_precall vendor/lua-5.4.8/src/ldo.c /^CallInfo *luaD_precall (lua_State *L, StkId func, int nresults) {$/;" f typeref:typename:CallInfo * +luaD_precall vendor/lua-5.4.8/src/ldo.h /^LUAI_FUNC CallInfo *luaD_precall (lua_State *L, StkId func, int nResults);$/;" p typeref:typename:LUAI_FUNC CallInfo * +luaD_pretailcall vendor/lua-5.4.8/src/ldo.c /^int luaD_pretailcall (lua_State *L, CallInfo *ci, StkId func,$/;" f typeref:typename:int +luaD_pretailcall vendor/lua-5.4.8/src/ldo.h /^LUAI_FUNC int luaD_pretailcall (lua_State *L, CallInfo *ci, StkId func,$/;" p typeref:typename:LUAI_FUNC int +luaD_protectedparser vendor/lua-5.4.8/src/ldo.c /^int luaD_protectedparser (lua_State *L, ZIO *z, const char *name,$/;" f typeref:typename:int +luaD_protectedparser vendor/lua-5.4.8/src/ldo.h /^LUAI_FUNC int luaD_protectedparser (lua_State *L, ZIO *z, const char *name,$/;" p typeref:typename:LUAI_FUNC int +luaD_rawrunprotected vendor/lua-5.4.8/src/ldo.c /^int luaD_rawrunprotected (lua_State *L, Pfunc f, void *ud) {$/;" f typeref:typename:int +luaD_rawrunprotected vendor/lua-5.4.8/src/ldo.h /^LUAI_FUNC int luaD_rawrunprotected (lua_State *L, Pfunc f, void *ud);$/;" p typeref:typename:LUAI_FUNC int +luaD_reallocstack vendor/lua-5.4.8/src/ldo.c /^int luaD_reallocstack (lua_State *L, int newsize, int raiseerror) {$/;" f typeref:typename:int +luaD_reallocstack vendor/lua-5.4.8/src/ldo.h /^LUAI_FUNC int luaD_reallocstack (lua_State *L, int newsize, int raiseerror);$/;" p typeref:typename:LUAI_FUNC int +luaD_seterrorobj vendor/lua-5.4.8/src/ldo.c /^void luaD_seterrorobj (lua_State *L, int errcode, StkId oldtop) {$/;" f typeref:typename:void +luaD_seterrorobj vendor/lua-5.4.8/src/ldo.h /^LUAI_FUNC void luaD_seterrorobj (lua_State *L, int errcode, StkId oldtop);$/;" p typeref:typename:LUAI_FUNC void +luaD_shrinkstack vendor/lua-5.4.8/src/ldo.c /^void luaD_shrinkstack (lua_State *L) {$/;" f typeref:typename:void +luaD_shrinkstack vendor/lua-5.4.8/src/ldo.h /^LUAI_FUNC void luaD_shrinkstack (lua_State *L);$/;" p typeref:typename:LUAI_FUNC void +luaD_throw vendor/lua-5.4.8/src/ldo.c /^l_noret luaD_throw (lua_State *L, int errcode) {$/;" f typeref:typename:l_noret +luaD_throw vendor/lua-5.4.8/src/ldo.h /^LUAI_FUNC l_noret luaD_throw (lua_State *L, int errcode);$/;" p typeref:typename:LUAI_FUNC l_noret +luaE_checkcstack vendor/lua-5.4.8/src/lstate.c /^void luaE_checkcstack (lua_State *L) {$/;" f typeref:typename:void +luaE_checkcstack vendor/lua-5.4.8/src/lstate.h /^LUAI_FUNC void luaE_checkcstack (lua_State *L);$/;" p typeref:typename:LUAI_FUNC void +luaE_extendCI vendor/lua-5.4.8/src/lstate.c /^CallInfo *luaE_extendCI (lua_State *L) {$/;" f typeref:typename:CallInfo * +luaE_extendCI vendor/lua-5.4.8/src/lstate.h /^LUAI_FUNC CallInfo *luaE_extendCI (lua_State *L);$/;" p typeref:typename:LUAI_FUNC CallInfo * +luaE_freethread vendor/lua-5.4.8/src/lstate.c /^void luaE_freethread (lua_State *L, lua_State *L1) {$/;" f typeref:typename:void +luaE_freethread vendor/lua-5.4.8/src/lstate.h /^LUAI_FUNC void luaE_freethread (lua_State *L, lua_State *L1);$/;" p typeref:typename:LUAI_FUNC void +luaE_incCstack vendor/lua-5.4.8/src/lstate.c /^LUAI_FUNC void luaE_incCstack (lua_State *L) {$/;" f typeref:typename:LUAI_FUNC void +luaE_incCstack vendor/lua-5.4.8/src/lstate.h /^LUAI_FUNC void luaE_incCstack (lua_State *L);$/;" p typeref:typename:LUAI_FUNC void +luaE_resetthread vendor/lua-5.4.8/src/lstate.c /^int luaE_resetthread (lua_State *L, int status) {$/;" f typeref:typename:int +luaE_resetthread vendor/lua-5.4.8/src/lstate.h /^LUAI_FUNC int luaE_resetthread (lua_State *L, int status);$/;" p typeref:typename:LUAI_FUNC int +luaE_setdebt vendor/lua-5.4.8/src/lstate.c /^void luaE_setdebt (global_State *g, l_mem debt) {$/;" f typeref:typename:void +luaE_setdebt vendor/lua-5.4.8/src/lstate.h /^LUAI_FUNC void luaE_setdebt (global_State *g, l_mem debt);$/;" p typeref:typename:LUAI_FUNC void +luaE_shrinkCI vendor/lua-5.4.8/src/lstate.c /^void luaE_shrinkCI (lua_State *L) {$/;" f typeref:typename:void +luaE_shrinkCI vendor/lua-5.4.8/src/lstate.h /^LUAI_FUNC void luaE_shrinkCI (lua_State *L);$/;" p typeref:typename:LUAI_FUNC void +luaE_warnerror vendor/lua-5.4.8/src/lstate.c /^void luaE_warnerror (lua_State *L, const char *where) {$/;" f typeref:typename:void +luaE_warnerror vendor/lua-5.4.8/src/lstate.h /^LUAI_FUNC void luaE_warnerror (lua_State *L, const char *where);$/;" p typeref:typename:LUAI_FUNC void +luaE_warning vendor/lua-5.4.8/src/lstate.c /^void luaE_warning (lua_State *L, const char *msg, int tocont) {$/;" f typeref:typename:void +luaE_warning vendor/lua-5.4.8/src/lstate.h /^LUAI_FUNC void luaE_warning (lua_State *L, const char *msg, int tocont);$/;" p typeref:typename:LUAI_FUNC void +luaF_close vendor/lua-5.4.8/src/lfunc.c /^StkId luaF_close (lua_State *L, StkId level, int status, int yy) {$/;" f typeref:typename:StkId +luaF_close vendor/lua-5.4.8/src/lfunc.h /^LUAI_FUNC StkId luaF_close (lua_State *L, StkId level, int status, int yy);$/;" p typeref:typename:LUAI_FUNC StkId +luaF_closeupval vendor/lua-5.4.8/src/lfunc.c /^void luaF_closeupval (lua_State *L, StkId level) {$/;" f typeref:typename:void +luaF_closeupval vendor/lua-5.4.8/src/lfunc.h /^LUAI_FUNC void luaF_closeupval (lua_State *L, StkId level);$/;" p typeref:typename:LUAI_FUNC void +luaF_findupval vendor/lua-5.4.8/src/lfunc.c /^UpVal *luaF_findupval (lua_State *L, StkId level) {$/;" f typeref:typename:UpVal * +luaF_findupval vendor/lua-5.4.8/src/lfunc.h /^LUAI_FUNC UpVal *luaF_findupval (lua_State *L, StkId level);$/;" p typeref:typename:LUAI_FUNC UpVal * +luaF_freeproto vendor/lua-5.4.8/src/lfunc.c /^void luaF_freeproto (lua_State *L, Proto *f) {$/;" f typeref:typename:void +luaF_freeproto vendor/lua-5.4.8/src/lfunc.h /^LUAI_FUNC void luaF_freeproto (lua_State *L, Proto *f);$/;" p typeref:typename:LUAI_FUNC void +luaF_getlocalname vendor/lua-5.4.8/src/lfunc.c /^const char *luaF_getlocalname (const Proto *f, int local_number, int pc) {$/;" f typeref:typename:const char * +luaF_getlocalname vendor/lua-5.4.8/src/lfunc.h /^LUAI_FUNC const char *luaF_getlocalname (const Proto *func, int local_number,$/;" p typeref:typename:LUAI_FUNC const char * +luaF_initupvals vendor/lua-5.4.8/src/lfunc.c /^void luaF_initupvals (lua_State *L, LClosure *cl) {$/;" f typeref:typename:void +luaF_initupvals vendor/lua-5.4.8/src/lfunc.h /^LUAI_FUNC void luaF_initupvals (lua_State *L, LClosure *cl);$/;" p typeref:typename:LUAI_FUNC void +luaF_newCclosure vendor/lua-5.4.8/src/lfunc.c /^CClosure *luaF_newCclosure (lua_State *L, int nupvals) {$/;" f typeref:typename:CClosure * +luaF_newCclosure vendor/lua-5.4.8/src/lfunc.h /^LUAI_FUNC CClosure *luaF_newCclosure (lua_State *L, int nupvals);$/;" p typeref:typename:LUAI_FUNC CClosure * +luaF_newLclosure vendor/lua-5.4.8/src/lfunc.c /^LClosure *luaF_newLclosure (lua_State *L, int nupvals) {$/;" f typeref:typename:LClosure * +luaF_newLclosure vendor/lua-5.4.8/src/lfunc.h /^LUAI_FUNC LClosure *luaF_newLclosure (lua_State *L, int nupvals);$/;" p typeref:typename:LUAI_FUNC LClosure * +luaF_newproto vendor/lua-5.4.8/src/lfunc.c /^Proto *luaF_newproto (lua_State *L) {$/;" f typeref:typename:Proto * +luaF_newproto vendor/lua-5.4.8/src/lfunc.h /^LUAI_FUNC Proto *luaF_newproto (lua_State *L);$/;" p typeref:typename:LUAI_FUNC Proto * +luaF_newtbcupval vendor/lua-5.4.8/src/lfunc.c /^void luaF_newtbcupval (lua_State *L, StkId level) {$/;" f typeref:typename:void +luaF_newtbcupval vendor/lua-5.4.8/src/lfunc.h /^LUAI_FUNC void luaF_newtbcupval (lua_State *L, StkId level);$/;" p typeref:typename:LUAI_FUNC void +luaF_unlinkupval vendor/lua-5.4.8/src/lfunc.c /^void luaF_unlinkupval (UpVal *uv) {$/;" f typeref:typename:void +luaF_unlinkupval vendor/lua-5.4.8/src/lfunc.h /^LUAI_FUNC void luaF_unlinkupval (UpVal *uv);$/;" p typeref:typename:LUAI_FUNC void +luaG_addinfo vendor/lua-5.4.8/src/ldebug.c /^const char *luaG_addinfo (lua_State *L, const char *msg, TString *src,$/;" f typeref:typename:const char * +luaG_addinfo vendor/lua-5.4.8/src/ldebug.h /^LUAI_FUNC const char *luaG_addinfo (lua_State *L, const char *msg,$/;" p typeref:typename:LUAI_FUNC const char * +luaG_callerror vendor/lua-5.4.8/src/ldebug.c /^l_noret luaG_callerror (lua_State *L, const TValue *o) {$/;" f typeref:typename:l_noret +luaG_callerror vendor/lua-5.4.8/src/ldebug.h /^LUAI_FUNC l_noret luaG_callerror (lua_State *L, const TValue *o);$/;" p typeref:typename:LUAI_FUNC l_noret +luaG_concaterror vendor/lua-5.4.8/src/ldebug.c /^l_noret luaG_concaterror (lua_State *L, const TValue *p1, const TValue *p2) {$/;" f typeref:typename:l_noret +luaG_concaterror vendor/lua-5.4.8/src/ldebug.h /^LUAI_FUNC l_noret luaG_concaterror (lua_State *L, const TValue *p1,$/;" p typeref:typename:LUAI_FUNC l_noret +luaG_errormsg vendor/lua-5.4.8/src/ldebug.c /^l_noret luaG_errormsg (lua_State *L) {$/;" f typeref:typename:l_noret +luaG_errormsg vendor/lua-5.4.8/src/ldebug.h /^LUAI_FUNC l_noret luaG_errormsg (lua_State *L);$/;" p typeref:typename:LUAI_FUNC l_noret +luaG_findlocal vendor/lua-5.4.8/src/ldebug.c /^const char *luaG_findlocal (lua_State *L, CallInfo *ci, int n, StkId *pos) {$/;" f typeref:typename:const char * +luaG_findlocal vendor/lua-5.4.8/src/ldebug.h /^LUAI_FUNC const char *luaG_findlocal (lua_State *L, CallInfo *ci, int n,$/;" p typeref:typename:LUAI_FUNC const char * +luaG_forerror vendor/lua-5.4.8/src/ldebug.c /^l_noret luaG_forerror (lua_State *L, const TValue *o, const char *what) {$/;" f typeref:typename:l_noret +luaG_forerror vendor/lua-5.4.8/src/ldebug.h /^LUAI_FUNC l_noret luaG_forerror (lua_State *L, const TValue *o,$/;" p typeref:typename:LUAI_FUNC l_noret +luaG_getfuncline vendor/lua-5.4.8/src/ldebug.c /^int luaG_getfuncline (const Proto *f, int pc) {$/;" f typeref:typename:int +luaG_getfuncline vendor/lua-5.4.8/src/ldebug.h /^LUAI_FUNC int luaG_getfuncline (const Proto *f, int pc);$/;" p typeref:typename:LUAI_FUNC int +luaG_opinterror vendor/lua-5.4.8/src/ldebug.c /^l_noret luaG_opinterror (lua_State *L, const TValue *p1,$/;" f typeref:typename:l_noret +luaG_opinterror vendor/lua-5.4.8/src/ldebug.h /^LUAI_FUNC l_noret luaG_opinterror (lua_State *L, const TValue *p1,$/;" p typeref:typename:LUAI_FUNC l_noret +luaG_ordererror vendor/lua-5.4.8/src/ldebug.c /^l_noret luaG_ordererror (lua_State *L, const TValue *p1, const TValue *p2) {$/;" f typeref:typename:l_noret +luaG_ordererror vendor/lua-5.4.8/src/ldebug.h /^LUAI_FUNC l_noret luaG_ordererror (lua_State *L, const TValue *p1,$/;" p typeref:typename:LUAI_FUNC l_noret +luaG_runerror vendor/lua-5.4.8/src/ldebug.c /^l_noret luaG_runerror (lua_State *L, const char *fmt, ...) {$/;" f typeref:typename:l_noret +luaG_runerror vendor/lua-5.4.8/src/ldebug.h /^LUAI_FUNC l_noret luaG_runerror (lua_State *L, const char *fmt, ...);$/;" p typeref:typename:LUAI_FUNC l_noret +luaG_tointerror vendor/lua-5.4.8/src/ldebug.c /^l_noret luaG_tointerror (lua_State *L, const TValue *p1, const TValue *p2) {$/;" f typeref:typename:l_noret +luaG_tointerror vendor/lua-5.4.8/src/ldebug.h /^LUAI_FUNC l_noret luaG_tointerror (lua_State *L, const TValue *p1,$/;" p typeref:typename:LUAI_FUNC l_noret +luaG_tracecall vendor/lua-5.4.8/src/ldebug.c /^int luaG_tracecall (lua_State *L) {$/;" f typeref:typename:int +luaG_tracecall vendor/lua-5.4.8/src/ldebug.h /^LUAI_FUNC int luaG_tracecall (lua_State *L);$/;" p typeref:typename:LUAI_FUNC int +luaG_traceexec vendor/lua-5.4.8/src/ldebug.c /^int luaG_traceexec (lua_State *L, const Instruction *pc) {$/;" f typeref:typename:int +luaG_traceexec vendor/lua-5.4.8/src/ldebug.h /^LUAI_FUNC int luaG_traceexec (lua_State *L, const Instruction *pc);$/;" p typeref:typename:LUAI_FUNC int +luaG_typeerror vendor/lua-5.4.8/src/ldebug.c /^l_noret luaG_typeerror (lua_State *L, const TValue *o, const char *op) {$/;" f typeref:typename:l_noret +luaG_typeerror vendor/lua-5.4.8/src/ldebug.h /^LUAI_FUNC l_noret luaG_typeerror (lua_State *L, const TValue *o,$/;" p typeref:typename:LUAI_FUNC l_noret +luaH_finishset vendor/lua-5.4.8/src/ltable.c /^void luaH_finishset (lua_State *L, Table *t, const TValue *key,$/;" f typeref:typename:void +luaH_finishset vendor/lua-5.4.8/src/ltable.h /^LUAI_FUNC void luaH_finishset (lua_State *L, Table *t, const TValue *key,$/;" p typeref:typename:LUAI_FUNC void +luaH_free vendor/lua-5.4.8/src/ltable.c /^void luaH_free (lua_State *L, Table *t) {$/;" f typeref:typename:void +luaH_free vendor/lua-5.4.8/src/ltable.h /^LUAI_FUNC void luaH_free (lua_State *L, Table *t);$/;" p typeref:typename:LUAI_FUNC void +luaH_get vendor/lua-5.4.8/src/ltable.c /^const TValue *luaH_get (Table *t, const TValue *key) {$/;" f typeref:typename:const TValue * +luaH_get vendor/lua-5.4.8/src/ltable.h /^LUAI_FUNC const TValue *luaH_get (Table *t, const TValue *key);$/;" p typeref:typename:LUAI_FUNC const TValue * +luaH_getint vendor/lua-5.4.8/src/ltable.c /^const TValue *luaH_getint (Table *t, lua_Integer key) {$/;" f typeref:typename:const TValue * +luaH_getint vendor/lua-5.4.8/src/ltable.h /^LUAI_FUNC const TValue *luaH_getint (Table *t, lua_Integer key);$/;" p typeref:typename:LUAI_FUNC const TValue * +luaH_getn vendor/lua-5.4.8/src/ltable.c /^lua_Unsigned luaH_getn (Table *t) {$/;" f typeref:typename:lua_Unsigned +luaH_getn vendor/lua-5.4.8/src/ltable.h /^LUAI_FUNC lua_Unsigned luaH_getn (Table *t);$/;" p typeref:typename:LUAI_FUNC lua_Unsigned +luaH_getshortstr vendor/lua-5.4.8/src/ltable.c /^const TValue *luaH_getshortstr (Table *t, TString *key) {$/;" f typeref:typename:const TValue * +luaH_getshortstr vendor/lua-5.4.8/src/ltable.h /^LUAI_FUNC const TValue *luaH_getshortstr (Table *t, TString *key);$/;" p typeref:typename:LUAI_FUNC const TValue * +luaH_getstr vendor/lua-5.4.8/src/ltable.c /^const TValue *luaH_getstr (Table *t, TString *key) {$/;" f typeref:typename:const TValue * +luaH_getstr vendor/lua-5.4.8/src/ltable.h /^LUAI_FUNC const TValue *luaH_getstr (Table *t, TString *key);$/;" p typeref:typename:LUAI_FUNC const TValue * +luaH_mainposition vendor/lua-5.4.8/src/ltable.c /^Node *luaH_mainposition (const Table *t, const TValue *key) {$/;" f typeref:typename:Node * +luaH_mainposition vendor/lua-5.4.8/src/ltable.h /^LUAI_FUNC Node *luaH_mainposition (const Table *t, const TValue *key);$/;" p typeref:typename:LUAI_FUNC Node * +luaH_new vendor/lua-5.4.8/src/ltable.c /^Table *luaH_new (lua_State *L) {$/;" f typeref:typename:Table * +luaH_new vendor/lua-5.4.8/src/ltable.h /^LUAI_FUNC Table *luaH_new (lua_State *L);$/;" p typeref:typename:LUAI_FUNC Table * +luaH_newkey vendor/lua-5.4.8/src/ltable.c /^static void luaH_newkey (lua_State *L, Table *t, const TValue *key,$/;" f typeref:typename:void file: +luaH_next vendor/lua-5.4.8/src/ltable.c /^int luaH_next (lua_State *L, Table *t, StkId key) {$/;" f typeref:typename:int +luaH_next vendor/lua-5.4.8/src/ltable.h /^LUAI_FUNC int luaH_next (lua_State *L, Table *t, StkId key);$/;" p typeref:typename:LUAI_FUNC int +luaH_realasize vendor/lua-5.4.8/src/ltable.c /^LUAI_FUNC unsigned int luaH_realasize (const Table *t) {$/;" f typeref:typename:LUAI_FUNC unsigned int +luaH_realasize vendor/lua-5.4.8/src/ltable.h /^LUAI_FUNC unsigned int luaH_realasize (const Table *t);$/;" p typeref:typename:LUAI_FUNC unsigned int +luaH_resize vendor/lua-5.4.8/src/ltable.c /^void luaH_resize (lua_State *L, Table *t, unsigned int newasize,$/;" f typeref:typename:void +luaH_resize vendor/lua-5.4.8/src/ltable.h /^LUAI_FUNC void luaH_resize (lua_State *L, Table *t, unsigned int nasize,$/;" p typeref:typename:LUAI_FUNC void +luaH_resizearray vendor/lua-5.4.8/src/ltable.c /^void luaH_resizearray (lua_State *L, Table *t, unsigned int nasize) {$/;" f typeref:typename:void +luaH_resizearray vendor/lua-5.4.8/src/ltable.h /^LUAI_FUNC void luaH_resizearray (lua_State *L, Table *t, unsigned int nasize);$/;" p typeref:typename:LUAI_FUNC void +luaH_set vendor/lua-5.4.8/src/ltable.c /^void luaH_set (lua_State *L, Table *t, const TValue *key, TValue *value) {$/;" f typeref:typename:void +luaH_set vendor/lua-5.4.8/src/ltable.h /^LUAI_FUNC void luaH_set (lua_State *L, Table *t, const TValue *key,$/;" p typeref:typename:LUAI_FUNC void +luaH_setint vendor/lua-5.4.8/src/ltable.c /^void luaH_setint (lua_State *L, Table *t, lua_Integer key, TValue *value) {$/;" f typeref:typename:void +luaH_setint vendor/lua-5.4.8/src/ltable.h /^LUAI_FUNC void luaH_setint (lua_State *L, Table *t, lua_Integer key,$/;" p typeref:typename:LUAI_FUNC void +luaK_checkstack vendor/lua-5.4.8/src/lcode.c /^void luaK_checkstack (FuncState *fs, int n) {$/;" f typeref:typename:void +luaK_checkstack vendor/lua-5.4.8/src/lcode.h /^LUAI_FUNC void luaK_checkstack (FuncState *fs, int n);$/;" p typeref:typename:LUAI_FUNC void +luaK_code vendor/lua-5.4.8/src/lcode.c /^int luaK_code (FuncState *fs, Instruction i) {$/;" f typeref:typename:int +luaK_code vendor/lua-5.4.8/src/lcode.h /^LUAI_FUNC int luaK_code (FuncState *fs, Instruction i);$/;" p typeref:typename:LUAI_FUNC int +luaK_codeABC vendor/lua-5.4.8/src/lcode.h /^#define luaK_codeABC(/;" d +luaK_codeABCk vendor/lua-5.4.8/src/lcode.c /^int luaK_codeABCk (FuncState *fs, OpCode o, int a, int b, int c, int k) {$/;" f typeref:typename:int +luaK_codeABCk vendor/lua-5.4.8/src/lcode.h /^LUAI_FUNC int luaK_codeABCk (FuncState *fs, OpCode o, int A,$/;" p typeref:typename:LUAI_FUNC int +luaK_codeABx vendor/lua-5.4.8/src/lcode.c /^int luaK_codeABx (FuncState *fs, OpCode o, int a, unsigned int bc) {$/;" f typeref:typename:int +luaK_codeABx vendor/lua-5.4.8/src/lcode.h /^LUAI_FUNC int luaK_codeABx (FuncState *fs, OpCode o, int A, unsigned int Bx);$/;" p typeref:typename:LUAI_FUNC int +luaK_codek vendor/lua-5.4.8/src/lcode.c /^static int luaK_codek (FuncState *fs, int reg, int k) {$/;" f typeref:typename:int file: +luaK_concat vendor/lua-5.4.8/src/lcode.c /^void luaK_concat (FuncState *fs, int *l1, int l2) {$/;" f typeref:typename:void +luaK_concat vendor/lua-5.4.8/src/lcode.h /^LUAI_FUNC void luaK_concat (FuncState *fs, int *l1, int l2);$/;" p typeref:typename:LUAI_FUNC void +luaK_dischargevars vendor/lua-5.4.8/src/lcode.c /^void luaK_dischargevars (FuncState *fs, expdesc *e) {$/;" f typeref:typename:void +luaK_dischargevars vendor/lua-5.4.8/src/lcode.h /^LUAI_FUNC void luaK_dischargevars (FuncState *fs, expdesc *e);$/;" p typeref:typename:LUAI_FUNC void +luaK_exp2K vendor/lua-5.4.8/src/lcode.c /^static int luaK_exp2K (FuncState *fs, expdesc *e) {$/;" f typeref:typename:int file: +luaK_exp2anyreg vendor/lua-5.4.8/src/lcode.c /^int luaK_exp2anyreg (FuncState *fs, expdesc *e) {$/;" f typeref:typename:int +luaK_exp2anyreg vendor/lua-5.4.8/src/lcode.h /^LUAI_FUNC int luaK_exp2anyreg (FuncState *fs, expdesc *e);$/;" p typeref:typename:LUAI_FUNC int +luaK_exp2anyregup vendor/lua-5.4.8/src/lcode.c /^void luaK_exp2anyregup (FuncState *fs, expdesc *e) {$/;" f typeref:typename:void +luaK_exp2anyregup vendor/lua-5.4.8/src/lcode.h /^LUAI_FUNC void luaK_exp2anyregup (FuncState *fs, expdesc *e);$/;" p typeref:typename:LUAI_FUNC void +luaK_exp2const vendor/lua-5.4.8/src/lcode.c /^int luaK_exp2const (FuncState *fs, const expdesc *e, TValue *v) {$/;" f typeref:typename:int +luaK_exp2const vendor/lua-5.4.8/src/lcode.h /^LUAI_FUNC int luaK_exp2const (FuncState *fs, const expdesc *e, TValue *v);$/;" p typeref:typename:LUAI_FUNC int +luaK_exp2nextreg vendor/lua-5.4.8/src/lcode.c /^void luaK_exp2nextreg (FuncState *fs, expdesc *e) {$/;" f typeref:typename:void +luaK_exp2nextreg vendor/lua-5.4.8/src/lcode.h /^LUAI_FUNC void luaK_exp2nextreg (FuncState *fs, expdesc *e);$/;" p typeref:typename:LUAI_FUNC void +luaK_exp2val vendor/lua-5.4.8/src/lcode.c /^void luaK_exp2val (FuncState *fs, expdesc *e) {$/;" f typeref:typename:void +luaK_exp2val vendor/lua-5.4.8/src/lcode.h /^LUAI_FUNC void luaK_exp2val (FuncState *fs, expdesc *e);$/;" p typeref:typename:LUAI_FUNC void +luaK_finish vendor/lua-5.4.8/src/lcode.c /^void luaK_finish (FuncState *fs) {$/;" f typeref:typename:void +luaK_finish vendor/lua-5.4.8/src/lcode.h /^LUAI_FUNC void luaK_finish (FuncState *fs);$/;" p typeref:typename:LUAI_FUNC void +luaK_fixline vendor/lua-5.4.8/src/lcode.c /^void luaK_fixline (FuncState *fs, int line) {$/;" f typeref:typename:void +luaK_fixline vendor/lua-5.4.8/src/lcode.h /^LUAI_FUNC void luaK_fixline (FuncState *fs, int line);$/;" p typeref:typename:LUAI_FUNC void +luaK_float vendor/lua-5.4.8/src/lcode.c /^static void luaK_float (FuncState *fs, int reg, lua_Number f) {$/;" f typeref:typename:void file: +luaK_getlabel vendor/lua-5.4.8/src/lcode.c /^int luaK_getlabel (FuncState *fs) {$/;" f typeref:typename:int +luaK_getlabel vendor/lua-5.4.8/src/lcode.h /^LUAI_FUNC int luaK_getlabel (FuncState *fs);$/;" p typeref:typename:LUAI_FUNC int +luaK_goiffalse vendor/lua-5.4.8/src/lcode.c /^void luaK_goiffalse (FuncState *fs, expdesc *e) {$/;" f typeref:typename:void +luaK_goiffalse vendor/lua-5.4.8/src/lcode.h /^LUAI_FUNC void luaK_goiffalse (FuncState *fs, expdesc *e);$/;" p typeref:typename:LUAI_FUNC void +luaK_goiftrue vendor/lua-5.4.8/src/lcode.c /^void luaK_goiftrue (FuncState *fs, expdesc *e) {$/;" f typeref:typename:void +luaK_goiftrue vendor/lua-5.4.8/src/lcode.h /^LUAI_FUNC void luaK_goiftrue (FuncState *fs, expdesc *e);$/;" p typeref:typename:LUAI_FUNC void +luaK_indexed vendor/lua-5.4.8/src/lcode.c /^void luaK_indexed (FuncState *fs, expdesc *t, expdesc *k) {$/;" f typeref:typename:void +luaK_indexed vendor/lua-5.4.8/src/lcode.h /^LUAI_FUNC void luaK_indexed (FuncState *fs, expdesc *t, expdesc *k);$/;" p typeref:typename:LUAI_FUNC void +luaK_infix vendor/lua-5.4.8/src/lcode.c /^void luaK_infix (FuncState *fs, BinOpr op, expdesc *v) {$/;" f typeref:typename:void +luaK_infix vendor/lua-5.4.8/src/lcode.h /^LUAI_FUNC void luaK_infix (FuncState *fs, BinOpr op, expdesc *v);$/;" p typeref:typename:LUAI_FUNC void +luaK_int vendor/lua-5.4.8/src/lcode.c /^void luaK_int (FuncState *fs, int reg, lua_Integer i) {$/;" f typeref:typename:void +luaK_int vendor/lua-5.4.8/src/lcode.h /^LUAI_FUNC void luaK_int (FuncState *fs, int reg, lua_Integer n);$/;" p typeref:typename:LUAI_FUNC void +luaK_intK vendor/lua-5.4.8/src/lcode.c /^static int luaK_intK (FuncState *fs, lua_Integer n) {$/;" f typeref:typename:int file: +luaK_jump vendor/lua-5.4.8/src/lcode.c /^int luaK_jump (FuncState *fs) {$/;" f typeref:typename:int +luaK_jump vendor/lua-5.4.8/src/lcode.h /^LUAI_FUNC int luaK_jump (FuncState *fs);$/;" p typeref:typename:LUAI_FUNC int +luaK_jumpto vendor/lua-5.4.8/src/lcode.h /^#define luaK_jumpto(/;" d +luaK_nil vendor/lua-5.4.8/src/lcode.c /^void luaK_nil (FuncState *fs, int from, int n) {$/;" f typeref:typename:void +luaK_nil vendor/lua-5.4.8/src/lcode.h /^LUAI_FUNC void luaK_nil (FuncState *fs, int from, int n);$/;" p typeref:typename:LUAI_FUNC void +luaK_numberK vendor/lua-5.4.8/src/lcode.c /^static int luaK_numberK (FuncState *fs, lua_Number r) {$/;" f typeref:typename:int file: +luaK_patchlist vendor/lua-5.4.8/src/lcode.c /^void luaK_patchlist (FuncState *fs, int list, int target) {$/;" f typeref:typename:void +luaK_patchlist vendor/lua-5.4.8/src/lcode.h /^LUAI_FUNC void luaK_patchlist (FuncState *fs, int list, int target);$/;" p typeref:typename:LUAI_FUNC void +luaK_patchtohere vendor/lua-5.4.8/src/lcode.c /^void luaK_patchtohere (FuncState *fs, int list) {$/;" f typeref:typename:void +luaK_patchtohere vendor/lua-5.4.8/src/lcode.h /^LUAI_FUNC void luaK_patchtohere (FuncState *fs, int list);$/;" p typeref:typename:LUAI_FUNC void +luaK_posfix vendor/lua-5.4.8/src/lcode.c /^void luaK_posfix (FuncState *fs, BinOpr opr,$/;" f typeref:typename:void +luaK_posfix vendor/lua-5.4.8/src/lcode.h /^LUAI_FUNC void luaK_posfix (FuncState *fs, BinOpr op, expdesc *v1,$/;" p typeref:typename:LUAI_FUNC void +luaK_prefix vendor/lua-5.4.8/src/lcode.c /^void luaK_prefix (FuncState *fs, UnOpr opr, expdesc *e, int line) {$/;" f typeref:typename:void +luaK_prefix vendor/lua-5.4.8/src/lcode.h /^LUAI_FUNC void luaK_prefix (FuncState *fs, UnOpr op, expdesc *v, int line);$/;" p typeref:typename:LUAI_FUNC void +luaK_reserveregs vendor/lua-5.4.8/src/lcode.c /^void luaK_reserveregs (FuncState *fs, int n) {$/;" f typeref:typename:void +luaK_reserveregs vendor/lua-5.4.8/src/lcode.h /^LUAI_FUNC void luaK_reserveregs (FuncState *fs, int n);$/;" p typeref:typename:LUAI_FUNC void +luaK_ret vendor/lua-5.4.8/src/lcode.c /^void luaK_ret (FuncState *fs, int first, int nret) {$/;" f typeref:typename:void +luaK_ret vendor/lua-5.4.8/src/lcode.h /^LUAI_FUNC void luaK_ret (FuncState *fs, int first, int nret);$/;" p typeref:typename:LUAI_FUNC void +luaK_self vendor/lua-5.4.8/src/lcode.c /^void luaK_self (FuncState *fs, expdesc *e, expdesc *key) {$/;" f typeref:typename:void +luaK_self vendor/lua-5.4.8/src/lcode.h /^LUAI_FUNC void luaK_self (FuncState *fs, expdesc *e, expdesc *key);$/;" p typeref:typename:LUAI_FUNC void +luaK_semerror vendor/lua-5.4.8/src/lcode.c /^l_noret luaK_semerror (LexState *ls, const char *msg) {$/;" f typeref:typename:l_noret +luaK_semerror vendor/lua-5.4.8/src/lcode.h /^LUAI_FUNC l_noret luaK_semerror (LexState *ls, const char *msg);$/;" p typeref:typename:LUAI_FUNC l_noret +luaK_setlist vendor/lua-5.4.8/src/lcode.c /^void luaK_setlist (FuncState *fs, int base, int nelems, int tostore) {$/;" f typeref:typename:void +luaK_setlist vendor/lua-5.4.8/src/lcode.h /^LUAI_FUNC void luaK_setlist (FuncState *fs, int base, int nelems, int tostore);$/;" p typeref:typename:LUAI_FUNC void +luaK_setmultret vendor/lua-5.4.8/src/lcode.h /^#define luaK_setmultret(/;" d +luaK_setoneret vendor/lua-5.4.8/src/lcode.c /^void luaK_setoneret (FuncState *fs, expdesc *e) {$/;" f typeref:typename:void +luaK_setoneret vendor/lua-5.4.8/src/lcode.h /^LUAI_FUNC void luaK_setoneret (FuncState *fs, expdesc *e);$/;" p typeref:typename:LUAI_FUNC void +luaK_setreturns vendor/lua-5.4.8/src/lcode.c /^void luaK_setreturns (FuncState *fs, expdesc *e, int nresults) {$/;" f typeref:typename:void +luaK_setreturns vendor/lua-5.4.8/src/lcode.h /^LUAI_FUNC void luaK_setreturns (FuncState *fs, expdesc *e, int nresults);$/;" p typeref:typename:LUAI_FUNC void +luaK_settablesize vendor/lua-5.4.8/src/lcode.c /^void luaK_settablesize (FuncState *fs, int pc, int ra, int asize, int hsize) {$/;" f typeref:typename:void +luaK_settablesize vendor/lua-5.4.8/src/lcode.h /^LUAI_FUNC void luaK_settablesize (FuncState *fs, int pc,$/;" p typeref:typename:LUAI_FUNC void +luaK_storevar vendor/lua-5.4.8/src/lcode.c /^void luaK_storevar (FuncState *fs, expdesc *var, expdesc *ex) {$/;" f typeref:typename:void +luaK_storevar vendor/lua-5.4.8/src/lcode.h /^LUAI_FUNC void luaK_storevar (FuncState *fs, expdesc *var, expdesc *e);$/;" p typeref:typename:LUAI_FUNC void +luaL_Buffer vendor/lua-5.4.8/src/lauxlib.h /^struct luaL_Buffer {$/;" s +luaL_Buffer vendor/lua-5.4.8/src/lauxlib.h /^typedef struct luaL_Buffer luaL_Buffer;$/;" t typeref:struct:luaL_Buffer +luaL_Reg vendor/lua-5.4.8/src/lauxlib.h /^typedef struct luaL_Reg {$/;" s +luaL_Reg vendor/lua-5.4.8/src/lauxlib.h /^} luaL_Reg;$/;" t typeref:struct:luaL_Reg +luaL_Stream vendor/lua-5.4.8/src/lauxlib.h /^typedef struct luaL_Stream {$/;" s +luaL_Stream vendor/lua-5.4.8/src/lauxlib.h /^} luaL_Stream;$/;" t typeref:struct:luaL_Stream +luaL_addchar vendor/lua-5.4.8/src/lauxlib.h /^#define luaL_addchar(/;" d +luaL_addgsub vendor/lua-5.4.8/src/lauxlib.c /^LUALIB_API void luaL_addgsub (luaL_Buffer *b, const char *s,$/;" f typeref:typename:LUALIB_API void +luaL_addgsub vendor/lua-5.4.8/src/lauxlib.h /^LUALIB_API void (luaL_addgsub) (luaL_Buffer *b, const char *s,$/;" v typeref:typename:LUALIB_API void ()(luaL_Buffer * b,const char * s,const char * p,const char * r) +luaL_addlstring vendor/lua-5.4.8/src/lauxlib.c /^LUALIB_API void luaL_addlstring (luaL_Buffer *B, const char *s, size_t l) {$/;" f typeref:typename:LUALIB_API void +luaL_addlstring vendor/lua-5.4.8/src/lauxlib.h /^LUALIB_API void (luaL_addlstring) (luaL_Buffer *B, const char *s, size_t l);$/;" v typeref:typename:LUALIB_API void ()(luaL_Buffer * B,const char * s,size_t l) +luaL_addsize vendor/lua-5.4.8/src/lauxlib.h /^#define luaL_addsize(/;" d +luaL_addstring vendor/lua-5.4.8/src/lauxlib.c /^LUALIB_API void luaL_addstring (luaL_Buffer *B, const char *s) {$/;" f typeref:typename:LUALIB_API void +luaL_addstring vendor/lua-5.4.8/src/lauxlib.h /^LUALIB_API void (luaL_addstring) (luaL_Buffer *B, const char *s);$/;" v typeref:typename:LUALIB_API void ()(luaL_Buffer * B,const char * s) +luaL_addvalue vendor/lua-5.4.8/src/lauxlib.c /^LUALIB_API void luaL_addvalue (luaL_Buffer *B) {$/;" f typeref:typename:LUALIB_API void +luaL_addvalue vendor/lua-5.4.8/src/lauxlib.h /^LUALIB_API void (luaL_addvalue) (luaL_Buffer *B);$/;" v typeref:typename:LUALIB_API void ()(luaL_Buffer * B) +luaL_argcheck vendor/lua-5.4.8/src/lauxlib.h /^#define luaL_argcheck(/;" d +luaL_argerror vendor/lua-5.4.8/src/lauxlib.c /^LUALIB_API int luaL_argerror (lua_State *L, int arg, const char *extramsg) {$/;" f typeref:typename:LUALIB_API int +luaL_argerror vendor/lua-5.4.8/src/lauxlib.h /^LUALIB_API int (luaL_argerror) (lua_State *L, int arg, const char *extramsg);$/;" v typeref:typename:LUALIB_API int ()(lua_State * L,int arg,const char * extramsg) +luaL_argexpected vendor/lua-5.4.8/src/lauxlib.h /^#define luaL_argexpected(/;" d +luaL_buffaddr vendor/lua-5.4.8/src/lauxlib.h /^#define luaL_buffaddr(/;" d +luaL_buffinit vendor/lua-5.4.8/src/lauxlib.c /^LUALIB_API void luaL_buffinit (lua_State *L, luaL_Buffer *B) {$/;" f typeref:typename:LUALIB_API void +luaL_buffinit vendor/lua-5.4.8/src/lauxlib.h /^LUALIB_API void (luaL_buffinit) (lua_State *L, luaL_Buffer *B);$/;" v typeref:typename:LUALIB_API void ()(lua_State * L,luaL_Buffer * B) +luaL_buffinitsize vendor/lua-5.4.8/src/lauxlib.c /^LUALIB_API char *luaL_buffinitsize (lua_State *L, luaL_Buffer *B, size_t sz) {$/;" f typeref:typename:LUALIB_API char * +luaL_buffinitsize vendor/lua-5.4.8/src/lauxlib.h /^LUALIB_API char *(luaL_buffinitsize) (lua_State *L, luaL_Buffer *B, size_t sz);$/;" v typeref:typename:LUALIB_API char * ()(lua_State * L,luaL_Buffer * B,size_t sz) +luaL_bufflen vendor/lua-5.4.8/src/lauxlib.h /^#define luaL_bufflen(/;" d +luaL_buffsub vendor/lua-5.4.8/src/lauxlib.h /^#define luaL_buffsub(/;" d +luaL_callmeta vendor/lua-5.4.8/src/lauxlib.c /^LUALIB_API int luaL_callmeta (lua_State *L, int obj, const char *event) {$/;" f typeref:typename:LUALIB_API int +luaL_callmeta vendor/lua-5.4.8/src/lauxlib.h /^LUALIB_API int (luaL_callmeta) (lua_State *L, int obj, const char *e);$/;" v typeref:typename:LUALIB_API int ()(lua_State * L,int obj,const char * e) +luaL_checkany vendor/lua-5.4.8/src/lauxlib.c /^LUALIB_API void luaL_checkany (lua_State *L, int arg) {$/;" f typeref:typename:LUALIB_API void +luaL_checkany vendor/lua-5.4.8/src/lauxlib.h /^LUALIB_API void (luaL_checkany) (lua_State *L, int arg);$/;" v typeref:typename:LUALIB_API void ()(lua_State * L,int arg) +luaL_checkint vendor/lua-5.4.8/src/lauxlib.h /^#define luaL_checkint(/;" d +luaL_checkinteger vendor/lua-5.4.8/src/lauxlib.c /^LUALIB_API lua_Integer luaL_checkinteger (lua_State *L, int arg) {$/;" f typeref:typename:LUALIB_API lua_Integer +luaL_checklong vendor/lua-5.4.8/src/lauxlib.h /^#define luaL_checklong(/;" d +luaL_checklstring vendor/lua-5.4.8/src/lauxlib.c /^LUALIB_API const char *luaL_checklstring (lua_State *L, int arg, size_t *len) {$/;" f typeref:typename:LUALIB_API const char * +luaL_checklstring vendor/lua-5.4.8/src/lauxlib.h /^LUALIB_API const char *(luaL_checklstring) (lua_State *L, int arg,$/;" v typeref:typename:LUALIB_API const char * ()(lua_State * L,int arg,size_t * l) +luaL_checknumber vendor/lua-5.4.8/src/lauxlib.c /^LUALIB_API lua_Number luaL_checknumber (lua_State *L, int arg) {$/;" f typeref:typename:LUALIB_API lua_Number +luaL_checkoption vendor/lua-5.4.8/src/lauxlib.c /^LUALIB_API int luaL_checkoption (lua_State *L, int arg, const char *def,$/;" f typeref:typename:LUALIB_API int +luaL_checkoption vendor/lua-5.4.8/src/lauxlib.h /^LUALIB_API int (luaL_checkoption) (lua_State *L, int arg, const char *def,$/;" v typeref:typename:LUALIB_API int ()(lua_State * L,int arg,const char * def,const char * const lst[]) +luaL_checkstack vendor/lua-5.4.8/src/lauxlib.c /^LUALIB_API void luaL_checkstack (lua_State *L, int space, const char *msg) {$/;" f typeref:typename:LUALIB_API void +luaL_checkstack vendor/lua-5.4.8/src/lauxlib.h /^LUALIB_API void (luaL_checkstack) (lua_State *L, int sz, const char *msg);$/;" v typeref:typename:LUALIB_API void ()(lua_State * L,int sz,const char * msg) +luaL_checkstring vendor/lua-5.4.8/src/lauxlib.h /^#define luaL_checkstring(/;" d +luaL_checktype vendor/lua-5.4.8/src/lauxlib.c /^LUALIB_API void luaL_checktype (lua_State *L, int arg, int t) {$/;" f typeref:typename:LUALIB_API void +luaL_checktype vendor/lua-5.4.8/src/lauxlib.h /^LUALIB_API void (luaL_checktype) (lua_State *L, int arg, int t);$/;" v typeref:typename:LUALIB_API void ()(lua_State * L,int arg,int t) +luaL_checkudata vendor/lua-5.4.8/src/lauxlib.c /^LUALIB_API void *luaL_checkudata (lua_State *L, int ud, const char *tname) {$/;" f typeref:typename:LUALIB_API void * +luaL_checkudata vendor/lua-5.4.8/src/lauxlib.h /^LUALIB_API void *(luaL_checkudata) (lua_State *L, int ud, const char *tname);$/;" v typeref:typename:LUALIB_API void * ()(lua_State * L,int ud,const char * tname) +luaL_checkunsigned vendor/lua-5.4.8/src/lauxlib.h /^#define luaL_checkunsigned(/;" d +luaL_checkversion vendor/lua-5.4.8/src/lauxlib.h /^#define luaL_checkversion(/;" d +luaL_checkversion_ vendor/lua-5.4.8/src/lauxlib.c /^LUALIB_API void luaL_checkversion_ (lua_State *L, lua_Number ver, size_t sz) {$/;" f typeref:typename:LUALIB_API void +luaL_checkversion_ vendor/lua-5.4.8/src/lauxlib.h /^LUALIB_API void (luaL_checkversion_) (lua_State *L, lua_Number ver, size_t sz);$/;" v typeref:typename:LUALIB_API void ()(lua_State * L,lua_Number ver,size_t sz) +luaL_dofile vendor/lua-5.4.8/src/lauxlib.h /^#define luaL_dofile(/;" d +luaL_dostring vendor/lua-5.4.8/src/lauxlib.h /^#define luaL_dostring(/;" d +luaL_error vendor/lua-5.4.8/src/lauxlib.c /^LUALIB_API int luaL_error (lua_State *L, const char *fmt, ...) {$/;" f typeref:typename:LUALIB_API int +luaL_error vendor/lua-5.4.8/src/lauxlib.h /^LUALIB_API int (luaL_error) (lua_State *L, const char *fmt, ...);$/;" v typeref:typename:LUALIB_API int ()(lua_State * L,const char * fmt,...) +luaL_execresult vendor/lua-5.4.8/src/lauxlib.c /^LUALIB_API int luaL_execresult (lua_State *L, int stat) {$/;" f typeref:typename:LUALIB_API int +luaL_execresult vendor/lua-5.4.8/src/lauxlib.h /^LUALIB_API int (luaL_execresult) (lua_State *L, int stat);$/;" v typeref:typename:LUALIB_API int ()(lua_State * L,int stat) +luaL_fileresult vendor/lua-5.4.8/src/lauxlib.c /^LUALIB_API int luaL_fileresult (lua_State *L, int stat, const char *fname) {$/;" f typeref:typename:LUALIB_API int +luaL_fileresult vendor/lua-5.4.8/src/lauxlib.h /^LUALIB_API int (luaL_fileresult) (lua_State *L, int stat, const char *fname);$/;" v typeref:typename:LUALIB_API int ()(lua_State * L,int stat,const char * fname) +luaL_getmetafield vendor/lua-5.4.8/src/lauxlib.c /^LUALIB_API int luaL_getmetafield (lua_State *L, int obj, const char *event) {$/;" f typeref:typename:LUALIB_API int +luaL_getmetafield vendor/lua-5.4.8/src/lauxlib.h /^LUALIB_API int (luaL_getmetafield) (lua_State *L, int obj, const char *e);$/;" v typeref:typename:LUALIB_API int ()(lua_State * L,int obj,const char * e) +luaL_getmetatable vendor/lua-5.4.8/src/lauxlib.h /^#define luaL_getmetatable(/;" d +luaL_getsubtable vendor/lua-5.4.8/src/lauxlib.c /^LUALIB_API int luaL_getsubtable (lua_State *L, int idx, const char *fname) {$/;" f typeref:typename:LUALIB_API int +luaL_getsubtable vendor/lua-5.4.8/src/lauxlib.h /^LUALIB_API int (luaL_getsubtable) (lua_State *L, int idx, const char *fname);$/;" v typeref:typename:LUALIB_API int ()(lua_State * L,int idx,const char * fname) +luaL_gsub vendor/lua-5.4.8/src/lauxlib.c /^LUALIB_API const char *luaL_gsub (lua_State *L, const char *s,$/;" f typeref:typename:LUALIB_API const char * +luaL_gsub vendor/lua-5.4.8/src/lauxlib.h /^LUALIB_API const char *(luaL_gsub) (lua_State *L, const char *s,$/;" v typeref:typename:LUALIB_API const char * ()(lua_State * L,const char * s,const char * p,const char * r) +luaL_intop vendor/lua-5.4.8/src/lauxlib.h /^#define luaL_intop(/;" d +luaL_len vendor/lua-5.4.8/src/lauxlib.c /^LUALIB_API lua_Integer luaL_len (lua_State *L, int idx) {$/;" f typeref:typename:LUALIB_API lua_Integer +luaL_loadbuffer vendor/lua-5.4.8/src/lauxlib.h /^#define luaL_loadbuffer(/;" d +luaL_loadbufferx vendor/lua-5.4.8/src/lauxlib.c /^LUALIB_API int luaL_loadbufferx (lua_State *L, const char *buff, size_t size,$/;" f typeref:typename:LUALIB_API int +luaL_loadbufferx vendor/lua-5.4.8/src/lauxlib.h /^LUALIB_API int (luaL_loadbufferx) (lua_State *L, const char *buff, size_t sz,$/;" v typeref:typename:LUALIB_API int ()(lua_State * L,const char * buff,size_t sz,const char * name,const char * mode) +luaL_loadfile vendor/lua-5.4.8/src/lauxlib.h /^#define luaL_loadfile(/;" d +luaL_loadfilex vendor/lua-5.4.8/src/lauxlib.c /^LUALIB_API int luaL_loadfilex (lua_State *L, const char *filename,$/;" f typeref:typename:LUALIB_API int +luaL_loadfilex vendor/lua-5.4.8/src/lauxlib.h /^LUALIB_API int (luaL_loadfilex) (lua_State *L, const char *filename,$/;" v typeref:typename:LUALIB_API int ()(lua_State * L,const char * filename,const char * mode) +luaL_loadstring vendor/lua-5.4.8/src/lauxlib.c /^LUALIB_API int luaL_loadstring (lua_State *L, const char *s) {$/;" f typeref:typename:LUALIB_API int +luaL_loadstring vendor/lua-5.4.8/src/lauxlib.h /^LUALIB_API int (luaL_loadstring) (lua_State *L, const char *s);$/;" v typeref:typename:LUALIB_API int ()(lua_State * L,const char * s) +luaL_newlib vendor/lua-5.4.8/src/lauxlib.h /^#define luaL_newlib(/;" d +luaL_newlibtable vendor/lua-5.4.8/src/lauxlib.h /^#define luaL_newlibtable(/;" d +luaL_newmetatable vendor/lua-5.4.8/src/lauxlib.c /^LUALIB_API int luaL_newmetatable (lua_State *L, const char *tname) {$/;" f typeref:typename:LUALIB_API int +luaL_newmetatable vendor/lua-5.4.8/src/lauxlib.h /^LUALIB_API int (luaL_newmetatable) (lua_State *L, const char *tname);$/;" v typeref:typename:LUALIB_API int ()(lua_State * L,const char * tname) +luaL_newstate vendor/lua-5.4.8/src/lauxlib.c /^LUALIB_API lua_State *luaL_newstate (void) {$/;" f typeref:typename:LUALIB_API lua_State * +luaL_newstate vendor/lua-5.4.8/src/lauxlib.h /^LUALIB_API lua_State *(luaL_newstate) (void);$/;" v typeref:typename:LUALIB_API lua_State * ()(void) +luaL_openlibs vendor/lua-5.4.8/src/linit.c /^LUALIB_API void luaL_openlibs (lua_State *L) {$/;" f typeref:typename:LUALIB_API void +luaL_openlibs vendor/lua-5.4.8/src/lualib.h /^LUALIB_API void (luaL_openlibs) (lua_State *L);$/;" v typeref:typename:LUALIB_API void ()(lua_State * L) +luaL_opt vendor/lua-5.4.8/src/lauxlib.h /^#define luaL_opt(/;" d +luaL_optint vendor/lua-5.4.8/src/lauxlib.h /^#define luaL_optint(/;" d +luaL_optinteger vendor/lua-5.4.8/src/lauxlib.c /^LUALIB_API lua_Integer luaL_optinteger (lua_State *L, int arg,$/;" f typeref:typename:LUALIB_API lua_Integer +luaL_optlong vendor/lua-5.4.8/src/lauxlib.h /^#define luaL_optlong(/;" d +luaL_optlstring vendor/lua-5.4.8/src/lauxlib.c /^LUALIB_API const char *luaL_optlstring (lua_State *L, int arg,$/;" f typeref:typename:LUALIB_API const char * +luaL_optlstring vendor/lua-5.4.8/src/lauxlib.h /^LUALIB_API const char *(luaL_optlstring) (lua_State *L, int arg,$/;" v typeref:typename:LUALIB_API const char * ()(lua_State * L,int arg,const char * def,size_t * l) +luaL_optnumber vendor/lua-5.4.8/src/lauxlib.c /^LUALIB_API lua_Number luaL_optnumber (lua_State *L, int arg, lua_Number def) {$/;" f typeref:typename:LUALIB_API lua_Number +luaL_optstring vendor/lua-5.4.8/src/lauxlib.h /^#define luaL_optstring(/;" d +luaL_optunsigned vendor/lua-5.4.8/src/lauxlib.h /^#define luaL_optunsigned(/;" d +luaL_prepbuffer vendor/lua-5.4.8/src/lauxlib.h /^#define luaL_prepbuffer(/;" d +luaL_prepbuffsize vendor/lua-5.4.8/src/lauxlib.c /^LUALIB_API char *luaL_prepbuffsize (luaL_Buffer *B, size_t sz) {$/;" f typeref:typename:LUALIB_API char * +luaL_prepbuffsize vendor/lua-5.4.8/src/lauxlib.h /^LUALIB_API char *(luaL_prepbuffsize) (luaL_Buffer *B, size_t sz);$/;" v typeref:typename:LUALIB_API char * ()(luaL_Buffer * B,size_t sz) +luaL_pushfail vendor/lua-5.4.8/src/lauxlib.h /^#define luaL_pushfail(/;" d +luaL_pushresult vendor/lua-5.4.8/src/lauxlib.c /^LUALIB_API void luaL_pushresult (luaL_Buffer *B) {$/;" f typeref:typename:LUALIB_API void +luaL_pushresult vendor/lua-5.4.8/src/lauxlib.h /^LUALIB_API void (luaL_pushresult) (luaL_Buffer *B);$/;" v typeref:typename:LUALIB_API void ()(luaL_Buffer * B) +luaL_pushresultsize vendor/lua-5.4.8/src/lauxlib.c /^LUALIB_API void luaL_pushresultsize (luaL_Buffer *B, size_t sz) {$/;" f typeref:typename:LUALIB_API void +luaL_pushresultsize vendor/lua-5.4.8/src/lauxlib.h /^LUALIB_API void (luaL_pushresultsize) (luaL_Buffer *B, size_t sz);$/;" v typeref:typename:LUALIB_API void ()(luaL_Buffer * B,size_t sz) +luaL_ref vendor/lua-5.4.8/src/lauxlib.c /^LUALIB_API int luaL_ref (lua_State *L, int t) {$/;" f typeref:typename:LUALIB_API int +luaL_ref vendor/lua-5.4.8/src/lauxlib.h /^LUALIB_API int (luaL_ref) (lua_State *L, int t);$/;" v typeref:typename:LUALIB_API int ()(lua_State * L,int t) +luaL_requiref vendor/lua-5.4.8/src/lauxlib.c /^LUALIB_API void luaL_requiref (lua_State *L, const char *modname,$/;" f typeref:typename:LUALIB_API void +luaL_requiref vendor/lua-5.4.8/src/lauxlib.h /^LUALIB_API void (luaL_requiref) (lua_State *L, const char *modname,$/;" v typeref:typename:LUALIB_API void ()(lua_State * L,const char * modname,lua_CFunction openf,int glb) +luaL_setfuncs vendor/lua-5.4.8/src/lauxlib.c /^LUALIB_API void luaL_setfuncs (lua_State *L, const luaL_Reg *l, int nup) {$/;" f typeref:typename:LUALIB_API void +luaL_setfuncs vendor/lua-5.4.8/src/lauxlib.h /^LUALIB_API void (luaL_setfuncs) (lua_State *L, const luaL_Reg *l, int nup);$/;" v typeref:typename:LUALIB_API void ()(lua_State * L,const luaL_Reg * l,int nup) +luaL_setmetatable vendor/lua-5.4.8/src/lauxlib.c /^LUALIB_API void luaL_setmetatable (lua_State *L, const char *tname) {$/;" f typeref:typename:LUALIB_API void +luaL_setmetatable vendor/lua-5.4.8/src/lauxlib.h /^LUALIB_API void (luaL_setmetatable) (lua_State *L, const char *tname);$/;" v typeref:typename:LUALIB_API void ()(lua_State * L,const char * tname) +luaL_testudata vendor/lua-5.4.8/src/lauxlib.c /^LUALIB_API void *luaL_testudata (lua_State *L, int ud, const char *tname) {$/;" f typeref:typename:LUALIB_API void * +luaL_testudata vendor/lua-5.4.8/src/lauxlib.h /^LUALIB_API void *(luaL_testudata) (lua_State *L, int ud, const char *tname);$/;" v typeref:typename:LUALIB_API void * ()(lua_State * L,int ud,const char * tname) +luaL_tolstring vendor/lua-5.4.8/src/lauxlib.c /^LUALIB_API const char *luaL_tolstring (lua_State *L, int idx, size_t *len) {$/;" f typeref:typename:LUALIB_API const char * +luaL_tolstring vendor/lua-5.4.8/src/lauxlib.h /^LUALIB_API const char *(luaL_tolstring) (lua_State *L, int idx, size_t *len);$/;" v typeref:typename:LUALIB_API const char * ()(lua_State * L,int idx,size_t * len) +luaL_traceback vendor/lua-5.4.8/src/lauxlib.c /^LUALIB_API void luaL_traceback (lua_State *L, lua_State *L1,$/;" f typeref:typename:LUALIB_API void +luaL_traceback vendor/lua-5.4.8/src/lauxlib.h /^LUALIB_API void (luaL_traceback) (lua_State *L, lua_State *L1,$/;" v typeref:typename:LUALIB_API void ()(lua_State * L,lua_State * L1,const char * msg,int level) +luaL_typeerror vendor/lua-5.4.8/src/lauxlib.c /^LUALIB_API int luaL_typeerror (lua_State *L, int arg, const char *tname) {$/;" f typeref:typename:LUALIB_API int +luaL_typeerror vendor/lua-5.4.8/src/lauxlib.h /^LUALIB_API int (luaL_typeerror) (lua_State *L, int arg, const char *tname);$/;" v typeref:typename:LUALIB_API int ()(lua_State * L,int arg,const char * tname) +luaL_typename vendor/lua-5.4.8/src/lauxlib.h /^#define luaL_typename(/;" d +luaL_unref vendor/lua-5.4.8/src/lauxlib.c /^LUALIB_API void luaL_unref (lua_State *L, int t, int ref) {$/;" f typeref:typename:LUALIB_API void +luaL_unref vendor/lua-5.4.8/src/lauxlib.h /^LUALIB_API void (luaL_unref) (lua_State *L, int t, int ref);$/;" v typeref:typename:LUALIB_API void ()(lua_State * L,int t,int ref) +luaL_where vendor/lua-5.4.8/src/lauxlib.c /^LUALIB_API void luaL_where (lua_State *L, int level) {$/;" f typeref:typename:LUALIB_API void +luaL_where vendor/lua-5.4.8/src/lauxlib.h /^LUALIB_API void (luaL_where) (lua_State *L, int lvl);$/;" v typeref:typename:LUALIB_API void ()(lua_State * L,int lvl) +luaM_checksize vendor/lua-5.4.8/src/lmem.h /^#define luaM_checksize(/;" d +luaM_error vendor/lua-5.4.8/src/lmem.h /^#define luaM_error(/;" d +luaM_free vendor/lua-5.4.8/src/lmem.h /^#define luaM_free(/;" d +luaM_free_ vendor/lua-5.4.8/src/lmem.c /^void luaM_free_ (lua_State *L, void *block, size_t osize) {$/;" f typeref:typename:void +luaM_free_ vendor/lua-5.4.8/src/lmem.h /^LUAI_FUNC void luaM_free_ (lua_State *L, void *block, size_t osize);$/;" p typeref:typename:LUAI_FUNC void +luaM_freearray vendor/lua-5.4.8/src/lmem.h /^#define luaM_freearray(/;" d +luaM_freemem vendor/lua-5.4.8/src/lmem.h /^#define luaM_freemem(/;" d +luaM_growaux_ vendor/lua-5.4.8/src/lmem.c /^void *luaM_growaux_ (lua_State *L, void *block, int nelems, int *psize,$/;" f typeref:typename:void * +luaM_growaux_ vendor/lua-5.4.8/src/lmem.h /^LUAI_FUNC void *luaM_growaux_ (lua_State *L, void *block, int nelems,$/;" p typeref:typename:LUAI_FUNC void * +luaM_growvector vendor/lua-5.4.8/src/lmem.h /^#define luaM_growvector(/;" d +luaM_limitN vendor/lua-5.4.8/src/lmem.h /^#define luaM_limitN(/;" d +luaM_malloc_ vendor/lua-5.4.8/src/lmem.c /^void *luaM_malloc_ (lua_State *L, size_t size, int tag) {$/;" f typeref:typename:void * +luaM_malloc_ vendor/lua-5.4.8/src/lmem.h /^LUAI_FUNC void *luaM_malloc_ (lua_State *L, size_t size, int tag);$/;" p typeref:typename:LUAI_FUNC void * +luaM_new vendor/lua-5.4.8/src/lmem.h /^#define luaM_new(/;" d +luaM_newobject vendor/lua-5.4.8/src/lmem.h /^#define luaM_newobject(/;" d +luaM_newvector vendor/lua-5.4.8/src/lmem.h /^#define luaM_newvector(/;" d +luaM_newvectorchecked vendor/lua-5.4.8/src/lmem.h /^#define luaM_newvectorchecked(/;" d +luaM_realloc_ vendor/lua-5.4.8/src/lmem.c /^void *luaM_realloc_ (lua_State *L, void *block, size_t osize, size_t nsize) {$/;" f typeref:typename:void * +luaM_realloc_ vendor/lua-5.4.8/src/lmem.h /^LUAI_FUNC void *luaM_realloc_ (lua_State *L, void *block, size_t oldsize,$/;" p typeref:typename:LUAI_FUNC void * +luaM_reallocvchar vendor/lua-5.4.8/src/lmem.h /^#define luaM_reallocvchar(/;" d +luaM_reallocvector vendor/lua-5.4.8/src/lmem.h /^#define luaM_reallocvector(/;" d +luaM_saferealloc_ vendor/lua-5.4.8/src/lmem.c /^void *luaM_saferealloc_ (lua_State *L, void *block, size_t osize,$/;" f typeref:typename:void * +luaM_saferealloc_ vendor/lua-5.4.8/src/lmem.h /^LUAI_FUNC void *luaM_saferealloc_ (lua_State *L, void *block, size_t oldsize,$/;" p typeref:typename:LUAI_FUNC void * +luaM_shrinkvector vendor/lua-5.4.8/src/lmem.h /^#define luaM_shrinkvector(/;" d +luaM_shrinkvector_ vendor/lua-5.4.8/src/lmem.c /^void *luaM_shrinkvector_ (lua_State *L, void *block, int *size,$/;" f typeref:typename:void * +luaM_shrinkvector_ vendor/lua-5.4.8/src/lmem.h /^LUAI_FUNC void *luaM_shrinkvector_ (lua_State *L, void *block, int *nelem,$/;" p typeref:typename:LUAI_FUNC void * +luaM_testsize vendor/lua-5.4.8/src/lmem.h /^#define luaM_testsize(/;" d +luaM_toobig vendor/lua-5.4.8/src/lmem.c /^l_noret luaM_toobig (lua_State *L) {$/;" f typeref:typename:l_noret +luaM_toobig vendor/lua-5.4.8/src/lmem.h /^LUAI_FUNC l_noret luaM_toobig (lua_State *L);$/;" p typeref:typename:LUAI_FUNC l_noret +luaO_arith vendor/lua-5.4.8/src/lobject.c /^void luaO_arith (lua_State *L, int op, const TValue *p1, const TValue *p2,$/;" f typeref:typename:void +luaO_arith vendor/lua-5.4.8/src/lobject.h /^LUAI_FUNC void luaO_arith (lua_State *L, int op, const TValue *p1,$/;" p typeref:typename:LUAI_FUNC void +luaO_ceillog2 vendor/lua-5.4.8/src/lobject.c /^int luaO_ceillog2 (unsigned int x) {$/;" f typeref:typename:int +luaO_ceillog2 vendor/lua-5.4.8/src/lobject.h /^LUAI_FUNC int luaO_ceillog2 (unsigned int x);$/;" p typeref:typename:LUAI_FUNC int +luaO_chunkid vendor/lua-5.4.8/src/lobject.c /^void luaO_chunkid (char *out, const char *source, size_t srclen) {$/;" f typeref:typename:void +luaO_chunkid vendor/lua-5.4.8/src/lobject.h /^LUAI_FUNC void luaO_chunkid (char *out, const char *source, size_t srclen);$/;" p typeref:typename:LUAI_FUNC void +luaO_hexavalue vendor/lua-5.4.8/src/lobject.c /^int luaO_hexavalue (int c) {$/;" f typeref:typename:int +luaO_hexavalue vendor/lua-5.4.8/src/lobject.h /^LUAI_FUNC int luaO_hexavalue (int c);$/;" p typeref:typename:LUAI_FUNC int +luaO_pushfstring vendor/lua-5.4.8/src/lobject.c /^const char *luaO_pushfstring (lua_State *L, const char *fmt, ...) {$/;" f typeref:typename:const char * +luaO_pushfstring vendor/lua-5.4.8/src/lobject.h /^LUAI_FUNC const char *luaO_pushfstring (lua_State *L, const char *fmt, ...);$/;" p typeref:typename:LUAI_FUNC const char * +luaO_pushvfstring vendor/lua-5.4.8/src/lobject.c /^const char *luaO_pushvfstring (lua_State *L, const char *fmt, va_list argp) {$/;" f typeref:typename:const char * +luaO_pushvfstring vendor/lua-5.4.8/src/lobject.h /^LUAI_FUNC const char *luaO_pushvfstring (lua_State *L, const char *fmt,$/;" p typeref:typename:LUAI_FUNC const char * +luaO_rawarith vendor/lua-5.4.8/src/lobject.c /^int luaO_rawarith (lua_State *L, int op, const TValue *p1, const TValue *p2,$/;" f typeref:typename:int +luaO_rawarith vendor/lua-5.4.8/src/lobject.h /^LUAI_FUNC int luaO_rawarith (lua_State *L, int op, const TValue *p1,$/;" p typeref:typename:LUAI_FUNC int +luaO_str2num vendor/lua-5.4.8/src/lobject.c /^size_t luaO_str2num (const char *s, TValue *o) {$/;" f typeref:typename:size_t +luaO_str2num vendor/lua-5.4.8/src/lobject.h /^LUAI_FUNC size_t luaO_str2num (const char *s, TValue *o);$/;" p typeref:typename:LUAI_FUNC size_t +luaO_tostring vendor/lua-5.4.8/src/lobject.c /^void luaO_tostring (lua_State *L, TValue *obj) {$/;" f typeref:typename:void +luaO_tostring vendor/lua-5.4.8/src/lobject.h /^LUAI_FUNC void luaO_tostring (lua_State *L, TValue *obj);$/;" p typeref:typename:LUAI_FUNC void +luaO_utf8esc vendor/lua-5.4.8/src/lobject.c /^int luaO_utf8esc (char *buff, unsigned long x) {$/;" f typeref:typename:int +luaO_utf8esc vendor/lua-5.4.8/src/lobject.h /^LUAI_FUNC int luaO_utf8esc (char *buff, unsigned long x);$/;" p typeref:typename:LUAI_FUNC int +luaP_opmodes vendor/lua-5.4.8/src/lopcodes.c /^LUAI_DDEF const lu_byte luaP_opmodes[NUM_OPCODES] = {$/;" v typeref:typename:LUAI_DDEF const lu_byte[] +luaS_clearcache vendor/lua-5.4.8/src/lstring.c /^void luaS_clearcache (global_State *g) {$/;" f typeref:typename:void +luaS_clearcache vendor/lua-5.4.8/src/lstring.h /^LUAI_FUNC void luaS_clearcache (global_State *g);$/;" p typeref:typename:LUAI_FUNC void +luaS_createlngstrobj vendor/lua-5.4.8/src/lstring.c /^TString *luaS_createlngstrobj (lua_State *L, size_t l) {$/;" f typeref:typename:TString * +luaS_createlngstrobj vendor/lua-5.4.8/src/lstring.h /^LUAI_FUNC TString *luaS_createlngstrobj (lua_State *L, size_t l);$/;" p typeref:typename:LUAI_FUNC TString * +luaS_eqlngstr vendor/lua-5.4.8/src/lstring.c /^int luaS_eqlngstr (TString *a, TString *b) {$/;" f typeref:typename:int +luaS_eqlngstr vendor/lua-5.4.8/src/lstring.h /^LUAI_FUNC int luaS_eqlngstr (TString *a, TString *b);$/;" p typeref:typename:LUAI_FUNC int +luaS_hash vendor/lua-5.4.8/src/lstring.c /^unsigned int luaS_hash (const char *str, size_t l, unsigned int seed) {$/;" f typeref:typename:unsigned int +luaS_hash vendor/lua-5.4.8/src/lstring.h /^LUAI_FUNC unsigned int luaS_hash (const char *str, size_t l, unsigned int seed);$/;" p typeref:typename:LUAI_FUNC unsigned int +luaS_hashlongstr vendor/lua-5.4.8/src/lstring.c /^unsigned int luaS_hashlongstr (TString *ts) {$/;" f typeref:typename:unsigned int +luaS_hashlongstr vendor/lua-5.4.8/src/lstring.h /^LUAI_FUNC unsigned int luaS_hashlongstr (TString *ts);$/;" p typeref:typename:LUAI_FUNC unsigned int +luaS_init vendor/lua-5.4.8/src/lstring.c /^void luaS_init (lua_State *L) {$/;" f typeref:typename:void +luaS_init vendor/lua-5.4.8/src/lstring.h /^LUAI_FUNC void luaS_init (lua_State *L);$/;" p typeref:typename:LUAI_FUNC void +luaS_new vendor/lua-5.4.8/src/lstring.c /^TString *luaS_new (lua_State *L, const char *str) {$/;" f typeref:typename:TString * +luaS_new vendor/lua-5.4.8/src/lstring.h /^LUAI_FUNC TString *luaS_new (lua_State *L, const char *str);$/;" p typeref:typename:LUAI_FUNC TString * +luaS_newliteral vendor/lua-5.4.8/src/lstring.h /^#define luaS_newliteral(/;" d +luaS_newlstr vendor/lua-5.4.8/src/lstring.c /^TString *luaS_newlstr (lua_State *L, const char *str, size_t l) {$/;" f typeref:typename:TString * +luaS_newlstr vendor/lua-5.4.8/src/lstring.h /^LUAI_FUNC TString *luaS_newlstr (lua_State *L, const char *str, size_t l);$/;" p typeref:typename:LUAI_FUNC TString * +luaS_newudata vendor/lua-5.4.8/src/lstring.c /^Udata *luaS_newudata (lua_State *L, size_t s, int nuvalue) {$/;" f typeref:typename:Udata * +luaS_newudata vendor/lua-5.4.8/src/lstring.h /^LUAI_FUNC Udata *luaS_newudata (lua_State *L, size_t s, int nuvalue);$/;" p typeref:typename:LUAI_FUNC Udata * +luaS_remove vendor/lua-5.4.8/src/lstring.c /^void luaS_remove (lua_State *L, TString *ts) {$/;" f typeref:typename:void +luaS_remove vendor/lua-5.4.8/src/lstring.h /^LUAI_FUNC void luaS_remove (lua_State *L, TString *ts);$/;" p typeref:typename:LUAI_FUNC void +luaS_resize vendor/lua-5.4.8/src/lstring.c /^void luaS_resize (lua_State *L, int nsize) {$/;" f typeref:typename:void +luaS_resize vendor/lua-5.4.8/src/lstring.h /^LUAI_FUNC void luaS_resize (lua_State *L, int newsize);$/;" p typeref:typename:LUAI_FUNC void +luaT_adjustvarargs vendor/lua-5.4.8/src/ltm.c /^void luaT_adjustvarargs (lua_State *L, int nfixparams, CallInfo *ci,$/;" f typeref:typename:void +luaT_adjustvarargs vendor/lua-5.4.8/src/ltm.h /^LUAI_FUNC void luaT_adjustvarargs (lua_State *L, int nfixparams,$/;" p typeref:typename:LUAI_FUNC void +luaT_callTM vendor/lua-5.4.8/src/ltm.c /^void luaT_callTM (lua_State *L, const TValue *f, const TValue *p1,$/;" f typeref:typename:void +luaT_callTM vendor/lua-5.4.8/src/ltm.h /^LUAI_FUNC void luaT_callTM (lua_State *L, const TValue *f, const TValue *p1,$/;" p typeref:typename:LUAI_FUNC void +luaT_callTMres vendor/lua-5.4.8/src/ltm.c /^void luaT_callTMres (lua_State *L, const TValue *f, const TValue *p1,$/;" f typeref:typename:void +luaT_callTMres vendor/lua-5.4.8/src/ltm.h /^LUAI_FUNC void luaT_callTMres (lua_State *L, const TValue *f,$/;" p typeref:typename:LUAI_FUNC void +luaT_callorderTM vendor/lua-5.4.8/src/ltm.c /^int luaT_callorderTM (lua_State *L, const TValue *p1, const TValue *p2,$/;" f typeref:typename:int +luaT_callorderTM vendor/lua-5.4.8/src/ltm.h /^LUAI_FUNC int luaT_callorderTM (lua_State *L, const TValue *p1,$/;" p typeref:typename:LUAI_FUNC int +luaT_callorderiTM vendor/lua-5.4.8/src/ltm.c /^int luaT_callorderiTM (lua_State *L, const TValue *p1, int v2,$/;" f typeref:typename:int +luaT_callorderiTM vendor/lua-5.4.8/src/ltm.h /^LUAI_FUNC int luaT_callorderiTM (lua_State *L, const TValue *p1, int v2,$/;" p typeref:typename:LUAI_FUNC int +luaT_gettm vendor/lua-5.4.8/src/ltm.c /^const TValue *luaT_gettm (Table *events, TMS event, TString *ename) {$/;" f typeref:typename:const TValue * +luaT_gettm vendor/lua-5.4.8/src/ltm.h /^LUAI_FUNC const TValue *luaT_gettm (Table *events, TMS event, TString *ename);$/;" p typeref:typename:LUAI_FUNC const TValue * +luaT_gettmbyobj vendor/lua-5.4.8/src/ltm.c /^const TValue *luaT_gettmbyobj (lua_State *L, const TValue *o, TMS event) {$/;" f typeref:typename:const TValue * +luaT_gettmbyobj vendor/lua-5.4.8/src/ltm.h /^LUAI_FUNC const TValue *luaT_gettmbyobj (lua_State *L, const TValue *o,$/;" p typeref:typename:LUAI_FUNC const TValue * +luaT_getvarargs vendor/lua-5.4.8/src/ltm.c /^void luaT_getvarargs (lua_State *L, CallInfo *ci, StkId where, int wanted) {$/;" f typeref:typename:void +luaT_getvarargs vendor/lua-5.4.8/src/ltm.h /^LUAI_FUNC void luaT_getvarargs (lua_State *L, struct CallInfo *ci,$/;" p typeref:typename:LUAI_FUNC void +luaT_init vendor/lua-5.4.8/src/ltm.c /^void luaT_init (lua_State *L) {$/;" f typeref:typename:void +luaT_init vendor/lua-5.4.8/src/ltm.h /^LUAI_FUNC void luaT_init (lua_State *L);$/;" p typeref:typename:LUAI_FUNC void +luaT_objtypename vendor/lua-5.4.8/src/ltm.c /^const char *luaT_objtypename (lua_State *L, const TValue *o) {$/;" f typeref:typename:const char * +luaT_trybinTM vendor/lua-5.4.8/src/ltm.c /^void luaT_trybinTM (lua_State *L, const TValue *p1, const TValue *p2,$/;" f typeref:typename:void +luaT_trybinTM vendor/lua-5.4.8/src/ltm.h /^LUAI_FUNC void luaT_trybinTM (lua_State *L, const TValue *p1, const TValue *p2,$/;" p typeref:typename:LUAI_FUNC void +luaT_trybinassocTM vendor/lua-5.4.8/src/ltm.c /^void luaT_trybinassocTM (lua_State *L, const TValue *p1, const TValue *p2,$/;" f typeref:typename:void +luaT_trybinassocTM vendor/lua-5.4.8/src/ltm.h /^LUAI_FUNC void luaT_trybinassocTM (lua_State *L, const TValue *p1,$/;" p typeref:typename:LUAI_FUNC void +luaT_trybiniTM vendor/lua-5.4.8/src/ltm.c /^void luaT_trybiniTM (lua_State *L, const TValue *p1, lua_Integer i2,$/;" f typeref:typename:void +luaT_trybiniTM vendor/lua-5.4.8/src/ltm.h /^LUAI_FUNC void luaT_trybiniTM (lua_State *L, const TValue *p1, lua_Integer i2,$/;" p typeref:typename:LUAI_FUNC void +luaT_tryconcatTM vendor/lua-5.4.8/src/ltm.c /^void luaT_tryconcatTM (lua_State *L) {$/;" f typeref:typename:void +luaT_tryconcatTM vendor/lua-5.4.8/src/ltm.h /^LUAI_FUNC void luaT_tryconcatTM (lua_State *L);$/;" p typeref:typename:LUAI_FUNC void +luaT_typenames_ vendor/lua-5.4.8/src/ltm.c /^LUAI_DDEF const char *const luaT_typenames_[LUA_TOTALTYPES] = {$/;" v typeref:typename:LUAI_DDEF const char * const[] +luaU_dump vendor/lua-5.4.8/src/ldump.c /^int luaU_dump(lua_State *L, const Proto *f, lua_Writer w, void *data,$/;" f typeref:typename:int +luaU_dump vendor/lua-5.4.8/src/lundump.h /^LUAI_FUNC int luaU_dump (lua_State* L, const Proto* f, lua_Writer w,$/;" p typeref:typename:LUAI_FUNC int +luaU_print vendor/lua-5.4.8/src/luac.c /^#define luaU_print /;" d file: +luaU_undump vendor/lua-5.4.8/src/lundump.c /^LClosure *luaU_undump(lua_State *L, ZIO *Z, const char *name) {$/;" f typeref:typename:LClosure * +luaU_undump vendor/lua-5.4.8/src/lundump.h /^LUAI_FUNC LClosure* luaU_undump (lua_State* L, ZIO* Z, const char* name);$/;" p typeref:typename:LUAI_FUNC LClosure * +luaV_concat vendor/lua-5.4.8/src/lvm.c /^void luaV_concat (lua_State *L, int total) {$/;" f typeref:typename:void +luaV_concat vendor/lua-5.4.8/src/lvm.h /^LUAI_FUNC void luaV_concat (lua_State *L, int total);$/;" p typeref:typename:LUAI_FUNC void +luaV_equalobj vendor/lua-5.4.8/src/lvm.c /^int luaV_equalobj (lua_State *L, const TValue *t1, const TValue *t2) {$/;" f typeref:typename:int +luaV_equalobj vendor/lua-5.4.8/src/lvm.h /^LUAI_FUNC int luaV_equalobj (lua_State *L, const TValue *t1, const TValue *t2);$/;" p typeref:typename:LUAI_FUNC int +luaV_execute vendor/lua-5.4.8/src/lvm.c /^void luaV_execute (lua_State *L, CallInfo *ci) {$/;" f typeref:typename:void +luaV_execute vendor/lua-5.4.8/src/lvm.h /^LUAI_FUNC void luaV_execute (lua_State *L, CallInfo *ci);$/;" p typeref:typename:LUAI_FUNC void +luaV_fastget vendor/lua-5.4.8/src/lvm.h /^#define luaV_fastget(/;" d +luaV_fastgeti vendor/lua-5.4.8/src/lvm.h /^#define luaV_fastgeti(/;" d +luaV_finishOp vendor/lua-5.4.8/src/lvm.c /^void luaV_finishOp (lua_State *L) {$/;" f typeref:typename:void +luaV_finishOp vendor/lua-5.4.8/src/lvm.h /^LUAI_FUNC void luaV_finishOp (lua_State *L);$/;" p typeref:typename:LUAI_FUNC void +luaV_finishfastset vendor/lua-5.4.8/src/lvm.h /^#define luaV_finishfastset(/;" d +luaV_finishget vendor/lua-5.4.8/src/lvm.c /^void luaV_finishget (lua_State *L, const TValue *t, TValue *key, StkId val,$/;" f typeref:typename:void +luaV_finishget vendor/lua-5.4.8/src/lvm.h /^LUAI_FUNC void luaV_finishget (lua_State *L, const TValue *t, TValue *key,$/;" p typeref:typename:LUAI_FUNC void +luaV_finishset vendor/lua-5.4.8/src/lvm.c /^void luaV_finishset (lua_State *L, const TValue *t, TValue *key,$/;" f typeref:typename:void +luaV_finishset vendor/lua-5.4.8/src/lvm.h /^LUAI_FUNC void luaV_finishset (lua_State *L, const TValue *t, TValue *key,$/;" p typeref:typename:LUAI_FUNC void +luaV_flttointeger vendor/lua-5.4.8/src/lvm.c /^int luaV_flttointeger (lua_Number n, lua_Integer *p, F2Imod mode) {$/;" f typeref:typename:int +luaV_flttointeger vendor/lua-5.4.8/src/lvm.h /^LUAI_FUNC int luaV_flttointeger (lua_Number n, lua_Integer *p, F2Imod mode);$/;" p typeref:typename:LUAI_FUNC int +luaV_idiv vendor/lua-5.4.8/src/lvm.c /^lua_Integer luaV_idiv (lua_State *L, lua_Integer m, lua_Integer n) {$/;" f typeref:typename:lua_Integer +luaV_idiv vendor/lua-5.4.8/src/lvm.h /^LUAI_FUNC lua_Integer luaV_idiv (lua_State *L, lua_Integer x, lua_Integer y);$/;" p typeref:typename:LUAI_FUNC lua_Integer +luaV_lessequal vendor/lua-5.4.8/src/lvm.c /^int luaV_lessequal (lua_State *L, const TValue *l, const TValue *r) {$/;" f typeref:typename:int +luaV_lessequal vendor/lua-5.4.8/src/lvm.h /^LUAI_FUNC int luaV_lessequal (lua_State *L, const TValue *l, const TValue *r);$/;" p typeref:typename:LUAI_FUNC int +luaV_lessthan vendor/lua-5.4.8/src/lvm.c /^int luaV_lessthan (lua_State *L, const TValue *l, const TValue *r) {$/;" f typeref:typename:int +luaV_lessthan vendor/lua-5.4.8/src/lvm.h /^LUAI_FUNC int luaV_lessthan (lua_State *L, const TValue *l, const TValue *r);$/;" p typeref:typename:LUAI_FUNC int +luaV_mod vendor/lua-5.4.8/src/lvm.c /^lua_Integer luaV_mod (lua_State *L, lua_Integer m, lua_Integer n) {$/;" f typeref:typename:lua_Integer +luaV_mod vendor/lua-5.4.8/src/lvm.h /^LUAI_FUNC lua_Integer luaV_mod (lua_State *L, lua_Integer x, lua_Integer y);$/;" p typeref:typename:LUAI_FUNC lua_Integer +luaV_modf vendor/lua-5.4.8/src/lvm.c /^lua_Number luaV_modf (lua_State *L, lua_Number m, lua_Number n) {$/;" f typeref:typename:lua_Number +luaV_modf vendor/lua-5.4.8/src/lvm.h /^LUAI_FUNC lua_Number luaV_modf (lua_State *L, lua_Number x, lua_Number y);$/;" p typeref:typename:LUAI_FUNC lua_Number +luaV_objlen vendor/lua-5.4.8/src/lvm.c /^void luaV_objlen (lua_State *L, StkId ra, const TValue *rb) {$/;" f typeref:typename:void +luaV_objlen vendor/lua-5.4.8/src/lvm.h /^LUAI_FUNC void luaV_objlen (lua_State *L, StkId ra, const TValue *rb);$/;" p typeref:typename:LUAI_FUNC void +luaV_rawequalobj vendor/lua-5.4.8/src/lvm.h /^#define luaV_rawequalobj(/;" d +luaV_shiftl vendor/lua-5.4.8/src/lvm.c /^lua_Integer luaV_shiftl (lua_Integer x, lua_Integer y) {$/;" f typeref:typename:lua_Integer +luaV_shiftl vendor/lua-5.4.8/src/lvm.h /^LUAI_FUNC lua_Integer luaV_shiftl (lua_Integer x, lua_Integer y);$/;" p typeref:typename:LUAI_FUNC lua_Integer +luaV_shiftr vendor/lua-5.4.8/src/lvm.h /^#define luaV_shiftr(/;" d +luaV_tointeger vendor/lua-5.4.8/src/lvm.c /^int luaV_tointeger (const TValue *obj, lua_Integer *p, F2Imod mode) {$/;" f typeref:typename:int +luaV_tointeger vendor/lua-5.4.8/src/lvm.h /^LUAI_FUNC int luaV_tointeger (const TValue *obj, lua_Integer *p, F2Imod mode);$/;" p typeref:typename:LUAI_FUNC int +luaV_tointegerns vendor/lua-5.4.8/src/lvm.c /^int luaV_tointegerns (const TValue *obj, lua_Integer *p, F2Imod mode) {$/;" f typeref:typename:int +luaV_tointegerns vendor/lua-5.4.8/src/lvm.h /^LUAI_FUNC int luaV_tointegerns (const TValue *obj, lua_Integer *p,$/;" p typeref:typename:LUAI_FUNC int +luaV_tonumber_ vendor/lua-5.4.8/src/lvm.c /^int luaV_tonumber_ (const TValue *obj, lua_Number *n) {$/;" f typeref:typename:int +luaV_tonumber_ vendor/lua-5.4.8/src/lvm.h /^LUAI_FUNC int luaV_tonumber_ (const TValue *obj, lua_Number *n);$/;" p typeref:typename:LUAI_FUNC int +luaX_init vendor/lua-5.4.8/src/llex.c /^void luaX_init (lua_State *L) {$/;" f typeref:typename:void +luaX_init vendor/lua-5.4.8/src/llex.h /^LUAI_FUNC void luaX_init (lua_State *L);$/;" p typeref:typename:LUAI_FUNC void +luaX_lookahead vendor/lua-5.4.8/src/llex.c /^int luaX_lookahead (LexState *ls) {$/;" f typeref:typename:int +luaX_lookahead vendor/lua-5.4.8/src/llex.h /^LUAI_FUNC int luaX_lookahead (LexState *ls);$/;" p typeref:typename:LUAI_FUNC int +luaX_newstring vendor/lua-5.4.8/src/llex.c /^TString *luaX_newstring (LexState *ls, const char *str, size_t l) {$/;" f typeref:typename:TString * +luaX_newstring vendor/lua-5.4.8/src/llex.h /^LUAI_FUNC TString *luaX_newstring (LexState *ls, const char *str, size_t l);$/;" p typeref:typename:LUAI_FUNC TString * +luaX_next vendor/lua-5.4.8/src/llex.c /^void luaX_next (LexState *ls) {$/;" f typeref:typename:void +luaX_next vendor/lua-5.4.8/src/llex.h /^LUAI_FUNC void luaX_next (LexState *ls);$/;" p typeref:typename:LUAI_FUNC void +luaX_setinput vendor/lua-5.4.8/src/llex.c /^void luaX_setinput (lua_State *L, LexState *ls, ZIO *z, TString *source,$/;" f typeref:typename:void +luaX_setinput vendor/lua-5.4.8/src/llex.h /^LUAI_FUNC void luaX_setinput (lua_State *L, LexState *ls, ZIO *z,$/;" p typeref:typename:LUAI_FUNC void +luaX_syntaxerror vendor/lua-5.4.8/src/llex.c /^l_noret luaX_syntaxerror (LexState *ls, const char *msg) {$/;" f typeref:typename:l_noret +luaX_syntaxerror vendor/lua-5.4.8/src/llex.h /^LUAI_FUNC l_noret luaX_syntaxerror (LexState *ls, const char *s);$/;" p typeref:typename:LUAI_FUNC l_noret +luaX_token2str vendor/lua-5.4.8/src/llex.c /^const char *luaX_token2str (LexState *ls, int token) {$/;" f typeref:typename:const char * +luaX_token2str vendor/lua-5.4.8/src/llex.h /^LUAI_FUNC const char *luaX_token2str (LexState *ls, int token);$/;" p typeref:typename:LUAI_FUNC const char * +luaX_tokens vendor/lua-5.4.8/src/llex.c /^static const char *const luaX_tokens [] = {$/;" v typeref:typename:const char * const[] file: +luaY_nvarstack vendor/lua-5.4.8/src/lparser.c /^int luaY_nvarstack (FuncState *fs) {$/;" f typeref:typename:int +luaY_nvarstack vendor/lua-5.4.8/src/lparser.h /^LUAI_FUNC int luaY_nvarstack (FuncState *fs);$/;" p typeref:typename:LUAI_FUNC int +luaY_parser vendor/lua-5.4.8/src/lparser.c /^LClosure *luaY_parser (lua_State *L, ZIO *z, Mbuffer *buff,$/;" f typeref:typename:LClosure * +luaY_parser vendor/lua-5.4.8/src/lparser.h /^LUAI_FUNC LClosure *luaY_parser (lua_State *L, ZIO *z, Mbuffer *buff,$/;" p typeref:typename:LUAI_FUNC LClosure * +luaZ_buffer vendor/lua-5.4.8/src/lzio.h /^#define luaZ_buffer(/;" d +luaZ_bufflen vendor/lua-5.4.8/src/lzio.h /^#define luaZ_bufflen(/;" d +luaZ_buffremove vendor/lua-5.4.8/src/lzio.h /^#define luaZ_buffremove(/;" d +luaZ_fill vendor/lua-5.4.8/src/lzio.c /^int luaZ_fill (ZIO *z) {$/;" f typeref:typename:int +luaZ_fill vendor/lua-5.4.8/src/lzio.h /^LUAI_FUNC int luaZ_fill (ZIO *z);$/;" p typeref:typename:LUAI_FUNC int +luaZ_freebuffer vendor/lua-5.4.8/src/lzio.h /^#define luaZ_freebuffer(/;" d +luaZ_init vendor/lua-5.4.8/src/lzio.c /^void luaZ_init (lua_State *L, ZIO *z, lua_Reader reader, void *data) {$/;" f typeref:typename:void +luaZ_init vendor/lua-5.4.8/src/lzio.h /^LUAI_FUNC void luaZ_init (lua_State *L, ZIO *z, lua_Reader reader,$/;" p typeref:typename:LUAI_FUNC void +luaZ_initbuffer vendor/lua-5.4.8/src/lzio.h /^#define luaZ_initbuffer(/;" d +luaZ_read vendor/lua-5.4.8/src/lzio.c /^size_t luaZ_read (ZIO *z, void *b, size_t n) {$/;" f typeref:typename:size_t +luaZ_read vendor/lua-5.4.8/src/lzio.h /^LUAI_FUNC size_t luaZ_read (ZIO* z, void *b, size_t n); \/* read next n bytes *\/$/;" p typeref:typename:LUAI_FUNC size_t +luaZ_resetbuffer vendor/lua-5.4.8/src/lzio.h /^#define luaZ_resetbuffer(/;" d +luaZ_resizebuffer vendor/lua-5.4.8/src/lzio.h /^#define luaZ_resizebuffer(/;" d +luaZ_sizebuffer vendor/lua-5.4.8/src/lzio.h /^#define luaZ_sizebuffer(/;" d +lua_Alloc vendor/lua-5.4.8/src/lua.h /^LUA_API lua_Alloc (lua_getallocf) (lua_State *L, void **ud);$/;" p typeref:typename:LUA_API +lua_Alloc vendor/lua-5.4.8/src/lua.h /^typedef void * (*lua_Alloc) (void *ud, void *ptr, size_t osize, size_t nsize);$/;" t typeref:typename:void * (*)(void * ud,void * ptr,size_t osize,size_t nsize) +lua_CFunction vendor/lua-5.4.8/src/lua.h /^LUA_API lua_CFunction (lua_tocfunction) (lua_State *L, int idx);$/;" p typeref:typename:LUA_API +lua_CFunction vendor/lua-5.4.8/src/lua.h /^LUA_API lua_CFunction (lua_atpanic) (lua_State *L, lua_CFunction panicf);$/;" p typeref:typename:LUA_API +lua_CFunction vendor/lua-5.4.8/src/lua.h /^typedef int (*lua_CFunction) (lua_State *L);$/;" t typeref:typename:int (*)(lua_State * L) +lua_Debug vendor/lua-5.4.8/src/lua.h /^struct lua_Debug {$/;" s +lua_Debug vendor/lua-5.4.8/src/lua.h /^typedef struct lua_Debug lua_Debug;$/;" t typeref:struct:lua_Debug +lua_Hook vendor/lua-5.4.8/src/lua.h /^LUA_API lua_Hook (lua_gethook) (lua_State *L);$/;" p typeref:typename:LUA_API +lua_Hook vendor/lua-5.4.8/src/lua.h /^typedef void (*lua_Hook) (lua_State *L, lua_Debug *ar);$/;" t typeref:typename:void (*)(lua_State * L,lua_Debug * ar) +lua_Integer vendor/lua-5.4.8/src/lauxlib.h /^LUALIB_API lua_Integer (luaL_checkinteger) (lua_State *L, int arg);$/;" p typeref:typename:LUALIB_API +lua_Integer vendor/lua-5.4.8/src/lauxlib.h /^LUALIB_API lua_Integer (luaL_len) (lua_State *L, int idx);$/;" p typeref:typename:LUALIB_API +lua_Integer vendor/lua-5.4.8/src/lauxlib.h /^LUALIB_API lua_Integer (luaL_optinteger) (lua_State *L, int arg,$/;" p typeref:typename:LUALIB_API +lua_Integer vendor/lua-5.4.8/src/lua.h /^LUA_API lua_Integer (lua_tointegerx) (lua_State *L, int idx, int *isnum);$/;" p typeref:typename:LUA_API +lua_Integer vendor/lua-5.4.8/src/lua.h /^typedef LUA_INTEGER lua_Integer;$/;" t typeref:typename:LUA_INTEGER +lua_KContext vendor/lua-5.4.8/src/lua.h /^typedef LUA_KCONTEXT lua_KContext;$/;" t typeref:typename:LUA_KCONTEXT +lua_KFunction vendor/lua-5.4.8/src/lua.h /^typedef int (*lua_KFunction) (lua_State *L, int status, lua_KContext ctx);$/;" t typeref:typename:int (*)(lua_State * L,int status,lua_KContext ctx) +lua_Number vendor/lua-5.4.8/src/lauxlib.h /^LUALIB_API lua_Number (luaL_checknumber) (lua_State *L, int arg);$/;" p typeref:typename:LUALIB_API +lua_Number vendor/lua-5.4.8/src/lauxlib.h /^LUALIB_API lua_Number (luaL_optnumber) (lua_State *L, int arg, lua_Number def);$/;" p typeref:typename:LUALIB_API +lua_Number vendor/lua-5.4.8/src/lua.h /^LUA_API lua_Number (lua_tonumberx) (lua_State *L, int idx, int *isnum);$/;" p typeref:typename:LUA_API +lua_Number vendor/lua-5.4.8/src/lua.h /^LUA_API lua_Number (lua_version) (lua_State *L);$/;" p typeref:typename:LUA_API +lua_Number vendor/lua-5.4.8/src/lua.h /^typedef LUA_NUMBER lua_Number;$/;" t typeref:typename:LUA_NUMBER +lua_Reader vendor/lua-5.4.8/src/lua.h /^typedef const char * (*lua_Reader) (lua_State *L, void *ud, size_t *sz);$/;" t typeref:typename:const char * (*)(lua_State * L,void * ud,size_t * sz) +lua_State vendor/lua-5.4.8/src/lstate.h /^struct lua_State {$/;" s +lua_State vendor/lua-5.4.8/src/lua.h /^typedef struct lua_State lua_State;$/;" t typeref:struct:lua_State +lua_Unsigned vendor/lua-5.4.8/src/lua.h /^LUA_API lua_Unsigned (lua_rawlen) (lua_State *L, int idx);$/;" p typeref:typename:LUA_API +lua_Unsigned vendor/lua-5.4.8/src/lua.h /^typedef LUA_UNSIGNED lua_Unsigned;$/;" t typeref:typename:LUA_UNSIGNED +lua_WarnFunction vendor/lua-5.4.8/src/lua.h /^typedef void (*lua_WarnFunction) (void *ud, const char *msg, int tocont);$/;" t typeref:typename:void (*)(void * ud,const char * msg,int tocont) +lua_Writer vendor/lua-5.4.8/src/lua.h /^typedef int (*lua_Writer) (lua_State *L, const void *p, size_t sz, void *ud);$/;" t typeref:typename:int (*)(lua_State * L,const void * p,size_t sz,void * ud) +lua_absindex vendor/lua-5.4.8/src/lapi.c /^LUA_API int lua_absindex (lua_State *L, int idx) {$/;" f typeref:typename:LUA_API int +lua_absindex vendor/lua-5.4.8/src/lua.h /^LUA_API int (lua_absindex) (lua_State *L, int idx);$/;" v typeref:typename:LUA_API int ()(lua_State * L,int idx) +lua_arith vendor/lua-5.4.8/src/lapi.c /^LUA_API void lua_arith (lua_State *L, int op) {$/;" f typeref:typename:LUA_API void +lua_arith vendor/lua-5.4.8/src/lua.h /^LUA_API void (lua_arith) (lua_State *L, int op);$/;" v typeref:typename:LUA_API void ()(lua_State * L,int op) +lua_assert vendor/lua-5.4.8/src/lauxlib.h /^ #define lua_assert(/;" d +lua_assert vendor/lua-5.4.8/src/llimits.h /^#define lua_assert(/;" d +lua_atpanic vendor/lua-5.4.8/src/lapi.c /^LUA_API lua_CFunction lua_atpanic (lua_State *L, lua_CFunction panicf) {$/;" f typeref:typename:LUA_API lua_CFunction +lua_c vendor/lua-5.4.8/src/lua.c /^#define lua_c$/;" d file: +lua_call vendor/lua-5.4.8/src/lua.h /^#define lua_call(/;" d +lua_callk vendor/lua-5.4.8/src/lapi.c /^LUA_API void lua_callk (lua_State *L, int nargs, int nresults,$/;" f typeref:typename:LUA_API void +lua_callk vendor/lua-5.4.8/src/lua.h /^LUA_API void (lua_callk) (lua_State *L, int nargs, int nresults,$/;" v typeref:typename:LUA_API void ()(lua_State * L,int nargs,int nresults,lua_KContext ctx,lua_KFunction k) +lua_checkstack vendor/lua-5.4.8/src/lapi.c /^LUA_API int lua_checkstack (lua_State *L, int n) {$/;" f typeref:typename:LUA_API int +lua_checkstack vendor/lua-5.4.8/src/lua.h /^LUA_API int (lua_checkstack) (lua_State *L, int n);$/;" v typeref:typename:LUA_API int ()(lua_State * L,int n) +lua_close vendor/lua-5.4.8/src/lstate.c /^LUA_API void lua_close (lua_State *L) {$/;" f typeref:typename:LUA_API void +lua_close vendor/lua-5.4.8/src/lua.h /^LUA_API void (lua_close) (lua_State *L);$/;" v typeref:typename:LUA_API void ()(lua_State * L) +lua_closeslot vendor/lua-5.4.8/src/lapi.c /^LUA_API void lua_closeslot (lua_State *L, int idx) {$/;" f typeref:typename:LUA_API void +lua_closeslot vendor/lua-5.4.8/src/lua.h /^LUA_API void (lua_closeslot) (lua_State *L, int idx);$/;" v typeref:typename:LUA_API void ()(lua_State * L,int idx) +lua_closethread vendor/lua-5.4.8/src/lstate.c /^LUA_API int lua_closethread (lua_State *L, lua_State *from) {$/;" f typeref:typename:LUA_API int +lua_closethread vendor/lua-5.4.8/src/lua.h /^LUA_API int (lua_closethread) (lua_State *L, lua_State *from);$/;" v typeref:typename:LUA_API int ()(lua_State * L,lua_State * from) +lua_compare vendor/lua-5.4.8/src/lapi.c /^LUA_API int lua_compare (lua_State *L, int index1, int index2, int op) {$/;" f typeref:typename:LUA_API int +lua_compare vendor/lua-5.4.8/src/lua.h /^LUA_API int (lua_compare) (lua_State *L, int idx1, int idx2, int op);$/;" v typeref:typename:LUA_API int ()(lua_State * L,int idx1,int idx2,int op) +lua_concat vendor/lua-5.4.8/src/lapi.c /^LUA_API void lua_concat (lua_State *L, int n) {$/;" f typeref:typename:LUA_API void +lua_concat vendor/lua-5.4.8/src/lua.h /^LUA_API void (lua_concat) (lua_State *L, int n);$/;" v typeref:typename:LUA_API void ()(lua_State * L,int n) +lua_copy vendor/lua-5.4.8/src/lapi.c /^LUA_API void lua_copy (lua_State *L, int fromidx, int toidx) {$/;" f typeref:typename:LUA_API void +lua_copy vendor/lua-5.4.8/src/lua.h /^LUA_API void (lua_copy) (lua_State *L, int fromidx, int toidx);$/;" v typeref:typename:LUA_API void ()(lua_State * L,int fromidx,int toidx) +lua_createtable vendor/lua-5.4.8/src/lapi.c /^LUA_API void lua_createtable (lua_State *L, int narray, int nrec) {$/;" f typeref:typename:LUA_API void +lua_createtable vendor/lua-5.4.8/src/lua.h /^LUA_API void (lua_createtable) (lua_State *L, int narr, int nrec);$/;" v typeref:typename:LUA_API void ()(lua_State * L,int narr,int nrec) +lua_dump vendor/lua-5.4.8/src/lapi.c /^LUA_API int lua_dump (lua_State *L, lua_Writer writer, void *data, int strip) {$/;" f typeref:typename:LUA_API int +lua_dump vendor/lua-5.4.8/src/lua.h /^LUA_API int (lua_dump) (lua_State *L, lua_Writer writer, void *data, int strip);$/;" v typeref:typename:LUA_API int ()(lua_State * L,lua_Writer writer,void * data,int strip) +lua_equal vendor/lua-5.4.8/src/luaconf.h /^#define lua_equal(/;" d +lua_error vendor/lua-5.4.8/src/lapi.c /^LUA_API int lua_error (lua_State *L) {$/;" f typeref:typename:LUA_API int +lua_error vendor/lua-5.4.8/src/lua.h /^LUA_API int (lua_error) (lua_State *L);$/;" v typeref:typename:LUA_API int ()(lua_State * L) +lua_freeline vendor/lua-5.4.8/src/lua.c /^#define lua_freeline(/;" d file: +lua_gc vendor/lua-5.4.8/src/lapi.c /^LUA_API int lua_gc (lua_State *L, int what, ...) {$/;" f typeref:typename:LUA_API int +lua_gc vendor/lua-5.4.8/src/lua.h /^LUA_API int (lua_gc) (lua_State *L, int what, ...);$/;" v typeref:typename:LUA_API int ()(lua_State * L,int what,...) +lua_getallocf vendor/lua-5.4.8/src/lapi.c /^LUA_API lua_Alloc lua_getallocf (lua_State *L, void **ud) {$/;" f typeref:typename:LUA_API lua_Alloc +lua_getextraspace vendor/lua-5.4.8/src/lua.h /^#define lua_getextraspace(/;" d +lua_getfield vendor/lua-5.4.8/src/lapi.c /^LUA_API int lua_getfield (lua_State *L, int idx, const char *k) {$/;" f typeref:typename:LUA_API int +lua_getfield vendor/lua-5.4.8/src/lua.h /^LUA_API int (lua_getfield) (lua_State *L, int idx, const char *k);$/;" v typeref:typename:LUA_API int ()(lua_State * L,int idx,const char * k) +lua_getglobal vendor/lua-5.4.8/src/lapi.c /^LUA_API int lua_getglobal (lua_State *L, const char *name) {$/;" f typeref:typename:LUA_API int +lua_getglobal vendor/lua-5.4.8/src/lua.h /^LUA_API int (lua_getglobal) (lua_State *L, const char *name);$/;" v typeref:typename:LUA_API int ()(lua_State * L,const char * name) +lua_gethook vendor/lua-5.4.8/src/ldebug.c /^LUA_API lua_Hook lua_gethook (lua_State *L) {$/;" f typeref:typename:LUA_API lua_Hook +lua_gethookcount vendor/lua-5.4.8/src/ldebug.c /^LUA_API int lua_gethookcount (lua_State *L) {$/;" f typeref:typename:LUA_API int +lua_gethookcount vendor/lua-5.4.8/src/lua.h /^LUA_API int (lua_gethookcount) (lua_State *L);$/;" v typeref:typename:LUA_API int ()(lua_State * L) +lua_gethookmask vendor/lua-5.4.8/src/ldebug.c /^LUA_API int lua_gethookmask (lua_State *L) {$/;" f typeref:typename:LUA_API int +lua_gethookmask vendor/lua-5.4.8/src/lua.h /^LUA_API int (lua_gethookmask) (lua_State *L);$/;" v typeref:typename:LUA_API int ()(lua_State * L) +lua_geti vendor/lua-5.4.8/src/lapi.c /^LUA_API int lua_geti (lua_State *L, int idx, lua_Integer n) {$/;" f typeref:typename:LUA_API int +lua_geti vendor/lua-5.4.8/src/lua.h /^LUA_API int (lua_geti) (lua_State *L, int idx, lua_Integer n);$/;" v typeref:typename:LUA_API int ()(lua_State * L,int idx,lua_Integer n) +lua_getinfo vendor/lua-5.4.8/src/ldebug.c /^LUA_API int lua_getinfo (lua_State *L, const char *what, lua_Debug *ar) {$/;" f typeref:typename:LUA_API int +lua_getinfo vendor/lua-5.4.8/src/lua.h /^LUA_API int (lua_getinfo) (lua_State *L, const char *what, lua_Debug *ar);$/;" v typeref:typename:LUA_API int ()(lua_State * L,const char * what,lua_Debug * ar) +lua_getiuservalue vendor/lua-5.4.8/src/lapi.c /^LUA_API int lua_getiuservalue (lua_State *L, int idx, int n) {$/;" f typeref:typename:LUA_API int +lua_getiuservalue vendor/lua-5.4.8/src/lua.h /^LUA_API int (lua_getiuservalue) (lua_State *L, int idx, int n);$/;" v typeref:typename:LUA_API int ()(lua_State * L,int idx,int n) +lua_getlocal vendor/lua-5.4.8/src/ldebug.c /^LUA_API const char *lua_getlocal (lua_State *L, const lua_Debug *ar, int n) {$/;" f typeref:typename:LUA_API const char * +lua_getlocal vendor/lua-5.4.8/src/lua.h /^LUA_API const char *(lua_getlocal) (lua_State *L, const lua_Debug *ar, int n);$/;" v typeref:typename:LUA_API const char * ()(lua_State * L,const lua_Debug * ar,int n) +lua_getlocaledecpoint vendor/lua-5.4.8/src/luaconf.h /^#define lua_getlocaledecpoint(/;" d +lua_getmetatable vendor/lua-5.4.8/src/lapi.c /^LUA_API int lua_getmetatable (lua_State *L, int objindex) {$/;" f typeref:typename:LUA_API int +lua_getmetatable vendor/lua-5.4.8/src/lua.h /^LUA_API int (lua_getmetatable) (lua_State *L, int objindex);$/;" v typeref:typename:LUA_API int ()(lua_State * L,int objindex) +lua_getstack vendor/lua-5.4.8/src/ldebug.c /^LUA_API int lua_getstack (lua_State *L, int level, lua_Debug *ar) {$/;" f typeref:typename:LUA_API int +lua_getstack vendor/lua-5.4.8/src/lua.h /^LUA_API int (lua_getstack) (lua_State *L, int level, lua_Debug *ar);$/;" v typeref:typename:LUA_API int ()(lua_State * L,int level,lua_Debug * ar) +lua_gettable vendor/lua-5.4.8/src/lapi.c /^LUA_API int lua_gettable (lua_State *L, int idx) {$/;" f typeref:typename:LUA_API int +lua_gettable vendor/lua-5.4.8/src/lua.h /^LUA_API int (lua_gettable) (lua_State *L, int idx);$/;" v typeref:typename:LUA_API int ()(lua_State * L,int idx) +lua_gettop vendor/lua-5.4.8/src/lapi.c /^LUA_API int lua_gettop (lua_State *L) {$/;" f typeref:typename:LUA_API int +lua_gettop vendor/lua-5.4.8/src/lua.h /^LUA_API int (lua_gettop) (lua_State *L);$/;" v typeref:typename:LUA_API int ()(lua_State * L) +lua_getupvalue vendor/lua-5.4.8/src/lapi.c /^LUA_API const char *lua_getupvalue (lua_State *L, int funcindex, int n) {$/;" f typeref:typename:LUA_API const char * +lua_getupvalue vendor/lua-5.4.8/src/lua.h /^LUA_API const char *(lua_getupvalue) (lua_State *L, int funcindex, int n);$/;" v typeref:typename:LUA_API const char * ()(lua_State * L,int funcindex,int n) +lua_getuservalue vendor/lua-5.4.8/src/lua.h /^#define lua_getuservalue(/;" d +lua_h vendor/lua-5.4.8/src/lua.h /^#define lua_h$/;" d +lua_ident vendor/lua-5.4.8/src/lapi.c /^const char lua_ident[] =$/;" v typeref:typename:const char[] +lua_initreadline vendor/lua-5.4.8/src/lua.c /^#define lua_initreadline(/;" d file: +lua_insert vendor/lua-5.4.8/src/lua.h /^#define lua_insert(/;" d +lua_integer2str vendor/lua-5.4.8/src/luaconf.h /^#define lua_integer2str(/;" d +lua_isboolean vendor/lua-5.4.8/src/lua.h /^#define lua_isboolean(/;" d +lua_iscfunction vendor/lua-5.4.8/src/lapi.c /^LUA_API int lua_iscfunction (lua_State *L, int idx) {$/;" f typeref:typename:LUA_API int +lua_iscfunction vendor/lua-5.4.8/src/lua.h /^LUA_API int (lua_iscfunction) (lua_State *L, int idx);$/;" v typeref:typename:LUA_API int ()(lua_State * L,int idx) +lua_isfunction vendor/lua-5.4.8/src/lua.h /^#define lua_isfunction(/;" d +lua_isinteger vendor/lua-5.4.8/src/lapi.c /^LUA_API int lua_isinteger (lua_State *L, int idx) {$/;" f typeref:typename:LUA_API int +lua_isinteger vendor/lua-5.4.8/src/lua.h /^LUA_API int (lua_isinteger) (lua_State *L, int idx);$/;" v typeref:typename:LUA_API int ()(lua_State * L,int idx) +lua_islightuserdata vendor/lua-5.4.8/src/lua.h /^#define lua_islightuserdata(/;" d +lua_isnil vendor/lua-5.4.8/src/lua.h /^#define lua_isnil(/;" d +lua_isnone vendor/lua-5.4.8/src/lua.h /^#define lua_isnone(/;" d +lua_isnoneornil vendor/lua-5.4.8/src/lua.h /^#define lua_isnoneornil(/;" d +lua_isnumber vendor/lua-5.4.8/src/lapi.c /^LUA_API int lua_isnumber (lua_State *L, int idx) {$/;" f typeref:typename:LUA_API int +lua_isnumber vendor/lua-5.4.8/src/lua.h /^LUA_API int (lua_isnumber) (lua_State *L, int idx);$/;" v typeref:typename:LUA_API int ()(lua_State * L,int idx) +lua_isstring vendor/lua-5.4.8/src/lapi.c /^LUA_API int lua_isstring (lua_State *L, int idx) {$/;" f typeref:typename:LUA_API int +lua_isstring vendor/lua-5.4.8/src/lua.h /^LUA_API int (lua_isstring) (lua_State *L, int idx);$/;" v typeref:typename:LUA_API int ()(lua_State * L,int idx) +lua_istable vendor/lua-5.4.8/src/lua.h /^#define lua_istable(/;" d +lua_isthread vendor/lua-5.4.8/src/lua.h /^#define lua_isthread(/;" d +lua_isuserdata vendor/lua-5.4.8/src/lapi.c /^LUA_API int lua_isuserdata (lua_State *L, int idx) {$/;" f typeref:typename:LUA_API int +lua_isuserdata vendor/lua-5.4.8/src/lua.h /^LUA_API int (lua_isuserdata) (lua_State *L, int idx);$/;" v typeref:typename:LUA_API int ()(lua_State * L,int idx) +lua_isyieldable vendor/lua-5.4.8/src/ldo.c /^LUA_API int lua_isyieldable (lua_State *L) {$/;" f typeref:typename:LUA_API int +lua_isyieldable vendor/lua-5.4.8/src/lua.h /^LUA_API int (lua_isyieldable) (lua_State *L);$/;" v typeref:typename:LUA_API int ()(lua_State * L) +lua_len vendor/lua-5.4.8/src/lapi.c /^LUA_API void lua_len (lua_State *L, int idx) {$/;" f typeref:typename:LUA_API void +lua_len vendor/lua-5.4.8/src/lua.h /^LUA_API void (lua_len) (lua_State *L, int idx);$/;" v typeref:typename:LUA_API void ()(lua_State * L,int idx) +lua_lessthan vendor/lua-5.4.8/src/luaconf.h /^#define lua_lessthan(/;" d +lua_load vendor/lua-5.4.8/src/lapi.c /^LUA_API int lua_load (lua_State *L, lua_Reader reader, void *data,$/;" f typeref:typename:LUA_API int +lua_load vendor/lua-5.4.8/src/lua.h /^LUA_API int (lua_load) (lua_State *L, lua_Reader reader, void *dt,$/;" v typeref:typename:LUA_API int ()(lua_State * L,lua_Reader reader,void * dt,const char * chunkname,const char * mode) +lua_lock vendor/lua-5.4.8/src/llimits.h /^#define lua_lock(/;" d +lua_longassert vendor/lua-5.4.8/src/llimits.h /^#define lua_longassert(/;" d +lua_longjmp vendor/lua-5.4.8/src/ldo.c /^struct lua_longjmp {$/;" s file: +lua_newstate vendor/lua-5.4.8/src/lstate.c /^LUA_API lua_State *lua_newstate (lua_Alloc f, void *ud) {$/;" f typeref:typename:LUA_API lua_State * +lua_newstate vendor/lua-5.4.8/src/lua.h /^LUA_API lua_State *(lua_newstate) (lua_Alloc f, void *ud);$/;" v typeref:typename:LUA_API lua_State * ()(lua_Alloc f,void * ud) +lua_newtable vendor/lua-5.4.8/src/lua.h /^#define lua_newtable(/;" d +lua_newthread vendor/lua-5.4.8/src/lstate.c /^LUA_API lua_State *lua_newthread (lua_State *L) {$/;" f typeref:typename:LUA_API lua_State * +lua_newthread vendor/lua-5.4.8/src/lua.h /^LUA_API lua_State *(lua_newthread) (lua_State *L);$/;" v typeref:typename:LUA_API lua_State * ()(lua_State * L) +lua_newuserdata vendor/lua-5.4.8/src/lua.h /^#define lua_newuserdata(/;" d +lua_newuserdatauv vendor/lua-5.4.8/src/lapi.c /^LUA_API void *lua_newuserdatauv (lua_State *L, size_t size, int nuvalue) {$/;" f typeref:typename:LUA_API void * +lua_newuserdatauv vendor/lua-5.4.8/src/lua.h /^LUA_API void *(lua_newuserdatauv) (lua_State *L, size_t sz, int nuvalue);$/;" v typeref:typename:LUA_API void * ()(lua_State * L,size_t sz,int nuvalue) +lua_next vendor/lua-5.4.8/src/lapi.c /^LUA_API int lua_next (lua_State *L, int idx) {$/;" f typeref:typename:LUA_API int +lua_next vendor/lua-5.4.8/src/lua.h /^LUA_API int (lua_next) (lua_State *L, int idx);$/;" v typeref:typename:LUA_API int ()(lua_State * L,int idx) +lua_number2str vendor/lua-5.4.8/src/luaconf.h /^#define lua_number2str(/;" d +lua_number2strx vendor/lua-5.4.8/src/lstrlib.c /^static int lua_number2strx (lua_State *L, char *buff, int sz,$/;" f typeref:typename:int file: +lua_number2strx vendor/lua-5.4.8/src/luaconf.h /^#define lua_number2strx(/;" d +lua_numbertointeger vendor/lua-5.4.8/src/luaconf.h /^#define lua_numbertointeger(/;" d +lua_objlen vendor/lua-5.4.8/src/luaconf.h /^#define lua_objlen(/;" d +lua_pcall vendor/lua-5.4.8/src/lua.h /^#define lua_pcall(/;" d +lua_pcallk vendor/lua-5.4.8/src/lapi.c /^LUA_API int lua_pcallk (lua_State *L, int nargs, int nresults, int errfunc,$/;" f typeref:typename:LUA_API int +lua_pcallk vendor/lua-5.4.8/src/lua.h /^LUA_API int (lua_pcallk) (lua_State *L, int nargs, int nresults, int errfunc,$/;" v typeref:typename:LUA_API int ()(lua_State * L,int nargs,int nresults,int errfunc,lua_KContext ctx,lua_KFunction k) +lua_pointer2str vendor/lua-5.4.8/src/luaconf.h /^#define lua_pointer2str(/;" d +lua_pop vendor/lua-5.4.8/src/lua.h /^#define lua_pop(/;" d +lua_pushboolean vendor/lua-5.4.8/src/lapi.c /^LUA_API void lua_pushboolean (lua_State *L, int b) {$/;" f typeref:typename:LUA_API void +lua_pushboolean vendor/lua-5.4.8/src/lua.h /^LUA_API void (lua_pushboolean) (lua_State *L, int b);$/;" v typeref:typename:LUA_API void ()(lua_State * L,int b) +lua_pushcclosure vendor/lua-5.4.8/src/lapi.c /^LUA_API void lua_pushcclosure (lua_State *L, lua_CFunction fn, int n) {$/;" f typeref:typename:LUA_API void +lua_pushcclosure vendor/lua-5.4.8/src/lua.h /^LUA_API void (lua_pushcclosure) (lua_State *L, lua_CFunction fn, int n);$/;" v typeref:typename:LUA_API void ()(lua_State * L,lua_CFunction fn,int n) +lua_pushcfunction vendor/lua-5.4.8/src/lua.h /^#define lua_pushcfunction(/;" d +lua_pushfstring vendor/lua-5.4.8/src/lapi.c /^LUA_API const char *lua_pushfstring (lua_State *L, const char *fmt, ...) {$/;" f typeref:typename:LUA_API const char * +lua_pushfstring vendor/lua-5.4.8/src/lua.h /^LUA_API const char *(lua_pushfstring) (lua_State *L, const char *fmt, ...);$/;" v typeref:typename:LUA_API const char * ()(lua_State * L,const char * fmt,...) +lua_pushglobaltable vendor/lua-5.4.8/src/lua.h /^#define lua_pushglobaltable(/;" d +lua_pushinteger vendor/lua-5.4.8/src/lapi.c /^LUA_API void lua_pushinteger (lua_State *L, lua_Integer n) {$/;" f typeref:typename:LUA_API void +lua_pushinteger vendor/lua-5.4.8/src/lua.h /^LUA_API void (lua_pushinteger) (lua_State *L, lua_Integer n);$/;" v typeref:typename:LUA_API void ()(lua_State * L,lua_Integer n) +lua_pushlightuserdata vendor/lua-5.4.8/src/lapi.c /^LUA_API void lua_pushlightuserdata (lua_State *L, void *p) {$/;" f typeref:typename:LUA_API void +lua_pushlightuserdata vendor/lua-5.4.8/src/lua.h /^LUA_API void (lua_pushlightuserdata) (lua_State *L, void *p);$/;" v typeref:typename:LUA_API void ()(lua_State * L,void * p) +lua_pushliteral vendor/lua-5.4.8/src/lua.h /^#define lua_pushliteral(/;" d +lua_pushlstring vendor/lua-5.4.8/src/lapi.c /^LUA_API const char *lua_pushlstring (lua_State *L, const char *s, size_t len) {$/;" f typeref:typename:LUA_API const char * +lua_pushlstring vendor/lua-5.4.8/src/lua.h /^LUA_API const char *(lua_pushlstring) (lua_State *L, const char *s, size_t len);$/;" v typeref:typename:LUA_API const char * ()(lua_State * L,const char * s,size_t len) +lua_pushnil vendor/lua-5.4.8/src/lapi.c /^LUA_API void lua_pushnil (lua_State *L) {$/;" f typeref:typename:LUA_API void +lua_pushnil vendor/lua-5.4.8/src/lua.h /^LUA_API void (lua_pushnil) (lua_State *L);$/;" v typeref:typename:LUA_API void ()(lua_State * L) +lua_pushnumber vendor/lua-5.4.8/src/lapi.c /^LUA_API void lua_pushnumber (lua_State *L, lua_Number n) {$/;" f typeref:typename:LUA_API void +lua_pushnumber vendor/lua-5.4.8/src/lua.h /^LUA_API void (lua_pushnumber) (lua_State *L, lua_Number n);$/;" v typeref:typename:LUA_API void ()(lua_State * L,lua_Number n) +lua_pushstring vendor/lua-5.4.8/src/lapi.c /^LUA_API const char *lua_pushstring (lua_State *L, const char *s) {$/;" f typeref:typename:LUA_API const char * +lua_pushstring vendor/lua-5.4.8/src/lua.h /^LUA_API const char *(lua_pushstring) (lua_State *L, const char *s);$/;" v typeref:typename:LUA_API const char * ()(lua_State * L,const char * s) +lua_pushthread vendor/lua-5.4.8/src/lapi.c /^LUA_API int lua_pushthread (lua_State *L) {$/;" f typeref:typename:LUA_API int +lua_pushthread vendor/lua-5.4.8/src/lua.h /^LUA_API int (lua_pushthread) (lua_State *L);$/;" v typeref:typename:LUA_API int ()(lua_State * L) +lua_pushunsigned vendor/lua-5.4.8/src/lua.h /^#define lua_pushunsigned(/;" d +lua_pushvalue vendor/lua-5.4.8/src/lapi.c /^LUA_API void lua_pushvalue (lua_State *L, int idx) {$/;" f typeref:typename:LUA_API void +lua_pushvalue vendor/lua-5.4.8/src/lua.h /^LUA_API void (lua_pushvalue) (lua_State *L, int idx);$/;" v typeref:typename:LUA_API void ()(lua_State * L,int idx) +lua_pushvfstring vendor/lua-5.4.8/src/lapi.c /^LUA_API const char *lua_pushvfstring (lua_State *L, const char *fmt,$/;" f typeref:typename:LUA_API const char * +lua_pushvfstring vendor/lua-5.4.8/src/lua.h /^LUA_API const char *(lua_pushvfstring) (lua_State *L, const char *fmt,$/;" v typeref:typename:LUA_API const char * ()(lua_State * L,const char * fmt,va_list argp) +lua_rawequal vendor/lua-5.4.8/src/lapi.c /^LUA_API int lua_rawequal (lua_State *L, int index1, int index2) {$/;" f typeref:typename:LUA_API int +lua_rawequal vendor/lua-5.4.8/src/lua.h /^LUA_API int (lua_rawequal) (lua_State *L, int idx1, int idx2);$/;" v typeref:typename:LUA_API int ()(lua_State * L,int idx1,int idx2) +lua_rawget vendor/lua-5.4.8/src/lapi.c /^LUA_API int lua_rawget (lua_State *L, int idx) {$/;" f typeref:typename:LUA_API int +lua_rawget vendor/lua-5.4.8/src/lua.h /^LUA_API int (lua_rawget) (lua_State *L, int idx);$/;" v typeref:typename:LUA_API int ()(lua_State * L,int idx) +lua_rawgeti vendor/lua-5.4.8/src/lapi.c /^LUA_API int lua_rawgeti (lua_State *L, int idx, lua_Integer n) {$/;" f typeref:typename:LUA_API int +lua_rawgeti vendor/lua-5.4.8/src/lua.h /^LUA_API int (lua_rawgeti) (lua_State *L, int idx, lua_Integer n);$/;" v typeref:typename:LUA_API int ()(lua_State * L,int idx,lua_Integer n) +lua_rawgetp vendor/lua-5.4.8/src/lapi.c /^LUA_API int lua_rawgetp (lua_State *L, int idx, const void *p) {$/;" f typeref:typename:LUA_API int +lua_rawgetp vendor/lua-5.4.8/src/lua.h /^LUA_API int (lua_rawgetp) (lua_State *L, int idx, const void *p);$/;" v typeref:typename:LUA_API int ()(lua_State * L,int idx,const void * p) +lua_rawlen vendor/lua-5.4.8/src/lapi.c /^LUA_API lua_Unsigned lua_rawlen (lua_State *L, int idx) {$/;" f typeref:typename:LUA_API lua_Unsigned +lua_rawset vendor/lua-5.4.8/src/lapi.c /^LUA_API void lua_rawset (lua_State *L, int idx) {$/;" f typeref:typename:LUA_API void +lua_rawset vendor/lua-5.4.8/src/lua.h /^LUA_API void (lua_rawset) (lua_State *L, int idx);$/;" v typeref:typename:LUA_API void ()(lua_State * L,int idx) +lua_rawseti vendor/lua-5.4.8/src/lapi.c /^LUA_API void lua_rawseti (lua_State *L, int idx, lua_Integer n) {$/;" f typeref:typename:LUA_API void +lua_rawseti vendor/lua-5.4.8/src/lua.h /^LUA_API void (lua_rawseti) (lua_State *L, int idx, lua_Integer n);$/;" v typeref:typename:LUA_API void ()(lua_State * L,int idx,lua_Integer n) +lua_rawsetp vendor/lua-5.4.8/src/lapi.c /^LUA_API void lua_rawsetp (lua_State *L, int idx, const void *p) {$/;" f typeref:typename:LUA_API void +lua_rawsetp vendor/lua-5.4.8/src/lua.h /^LUA_API void (lua_rawsetp) (lua_State *L, int idx, const void *p);$/;" v typeref:typename:LUA_API void ()(lua_State * L,int idx,const void * p) +lua_readline vendor/lua-5.4.8/src/lua.c /^#define lua_readline(/;" d file: +lua_register vendor/lua-5.4.8/src/lua.h /^#define lua_register(/;" d +lua_remove vendor/lua-5.4.8/src/lua.h /^#define lua_remove(/;" d +lua_replace vendor/lua-5.4.8/src/lua.h /^#define lua_replace(/;" d +lua_resetthread vendor/lua-5.4.8/src/lstate.c /^LUA_API int lua_resetthread (lua_State *L) {$/;" f typeref:typename:LUA_API int +lua_resetthread vendor/lua-5.4.8/src/lua.h /^LUA_API int (lua_resetthread) (lua_State *L); \/* Deprecated! *\/$/;" v typeref:typename:LUA_API int ()(lua_State * L) +lua_resume vendor/lua-5.4.8/src/ldo.c /^LUA_API int lua_resume (lua_State *L, lua_State *from, int nargs,$/;" f typeref:typename:LUA_API int +lua_resume vendor/lua-5.4.8/src/lua.h /^LUA_API int (lua_resume) (lua_State *L, lua_State *from, int narg,$/;" v typeref:typename:LUA_API int ()(lua_State * L,lua_State * from,int narg,int * nres) +lua_rotate vendor/lua-5.4.8/src/lapi.c /^LUA_API void lua_rotate (lua_State *L, int idx, int n) {$/;" f typeref:typename:LUA_API void +lua_rotate vendor/lua-5.4.8/src/lua.h /^LUA_API void (lua_rotate) (lua_State *L, int idx, int n);$/;" v typeref:typename:LUA_API void ()(lua_State * L,int idx,int n) +lua_saveline vendor/lua-5.4.8/src/lua.c /^#define lua_saveline(/;" d file: +lua_setallocf vendor/lua-5.4.8/src/lapi.c /^LUA_API void lua_setallocf (lua_State *L, lua_Alloc f, void *ud) {$/;" f typeref:typename:LUA_API void +lua_setallocf vendor/lua-5.4.8/src/lua.h /^LUA_API void (lua_setallocf) (lua_State *L, lua_Alloc f, void *ud);$/;" v typeref:typename:LUA_API void ()(lua_State * L,lua_Alloc f,void * ud) +lua_setcstacklimit vendor/lua-5.4.8/src/lstate.c /^LUA_API int lua_setcstacklimit (lua_State *L, unsigned int limit) {$/;" f typeref:typename:LUA_API int +lua_setcstacklimit vendor/lua-5.4.8/src/lua.h /^LUA_API int (lua_setcstacklimit) (lua_State *L, unsigned int limit);$/;" v typeref:typename:LUA_API int ()(lua_State * L,unsigned int limit) +lua_setfield vendor/lua-5.4.8/src/lapi.c /^LUA_API void lua_setfield (lua_State *L, int idx, const char *k) {$/;" f typeref:typename:LUA_API void +lua_setfield vendor/lua-5.4.8/src/lua.h /^LUA_API void (lua_setfield) (lua_State *L, int idx, const char *k);$/;" v typeref:typename:LUA_API void ()(lua_State * L,int idx,const char * k) +lua_setglobal vendor/lua-5.4.8/src/lapi.c /^LUA_API void lua_setglobal (lua_State *L, const char *name) {$/;" f typeref:typename:LUA_API void +lua_setglobal vendor/lua-5.4.8/src/lua.h /^LUA_API void (lua_setglobal) (lua_State *L, const char *name);$/;" v typeref:typename:LUA_API void ()(lua_State * L,const char * name) +lua_sethook vendor/lua-5.4.8/src/ldebug.c /^LUA_API void lua_sethook (lua_State *L, lua_Hook func, int mask, int count) {$/;" f typeref:typename:LUA_API void +lua_sethook vendor/lua-5.4.8/src/lua.h /^LUA_API void (lua_sethook) (lua_State *L, lua_Hook func, int mask, int count);$/;" v typeref:typename:LUA_API void ()(lua_State * L,lua_Hook func,int mask,int count) +lua_seti vendor/lua-5.4.8/src/lapi.c /^LUA_API void lua_seti (lua_State *L, int idx, lua_Integer n) {$/;" f typeref:typename:LUA_API void +lua_seti vendor/lua-5.4.8/src/lua.h /^LUA_API void (lua_seti) (lua_State *L, int idx, lua_Integer n);$/;" v typeref:typename:LUA_API void ()(lua_State * L,int idx,lua_Integer n) +lua_setiuservalue vendor/lua-5.4.8/src/lapi.c /^LUA_API int lua_setiuservalue (lua_State *L, int idx, int n) {$/;" f typeref:typename:LUA_API int +lua_setiuservalue vendor/lua-5.4.8/src/lua.h /^LUA_API int (lua_setiuservalue) (lua_State *L, int idx, int n);$/;" v typeref:typename:LUA_API int ()(lua_State * L,int idx,int n) +lua_setlocal vendor/lua-5.4.8/src/ldebug.c /^LUA_API const char *lua_setlocal (lua_State *L, const lua_Debug *ar, int n) {$/;" f typeref:typename:LUA_API const char * +lua_setlocal vendor/lua-5.4.8/src/lua.h /^LUA_API const char *(lua_setlocal) (lua_State *L, const lua_Debug *ar, int n);$/;" v typeref:typename:LUA_API const char * ()(lua_State * L,const lua_Debug * ar,int n) +lua_setmetatable vendor/lua-5.4.8/src/lapi.c /^LUA_API int lua_setmetatable (lua_State *L, int objindex) {$/;" f typeref:typename:LUA_API int +lua_setmetatable vendor/lua-5.4.8/src/lua.h /^LUA_API int (lua_setmetatable) (lua_State *L, int objindex);$/;" v typeref:typename:LUA_API int ()(lua_State * L,int objindex) +lua_settable vendor/lua-5.4.8/src/lapi.c /^LUA_API void lua_settable (lua_State *L, int idx) {$/;" f typeref:typename:LUA_API void +lua_settable vendor/lua-5.4.8/src/lua.h /^LUA_API void (lua_settable) (lua_State *L, int idx);$/;" v typeref:typename:LUA_API void ()(lua_State * L,int idx) +lua_settop vendor/lua-5.4.8/src/lapi.c /^LUA_API void lua_settop (lua_State *L, int idx) {$/;" f typeref:typename:LUA_API void +lua_settop vendor/lua-5.4.8/src/lua.h /^LUA_API void (lua_settop) (lua_State *L, int idx);$/;" v typeref:typename:LUA_API void ()(lua_State * L,int idx) +lua_setupvalue vendor/lua-5.4.8/src/lapi.c /^LUA_API const char *lua_setupvalue (lua_State *L, int funcindex, int n) {$/;" f typeref:typename:LUA_API const char * +lua_setupvalue vendor/lua-5.4.8/src/lua.h /^LUA_API const char *(lua_setupvalue) (lua_State *L, int funcindex, int n);$/;" v typeref:typename:LUA_API const char * ()(lua_State * L,int funcindex,int n) +lua_setuservalue vendor/lua-5.4.8/src/lua.h /^#define lua_setuservalue(/;" d +lua_setwarnf vendor/lua-5.4.8/src/lapi.c /^void lua_setwarnf (lua_State *L, lua_WarnFunction f, void *ud) {$/;" f typeref:typename:void +lua_setwarnf vendor/lua-5.4.8/src/lua.h /^LUA_API void (lua_setwarnf) (lua_State *L, lua_WarnFunction f, void *ud);$/;" v typeref:typename:LUA_API void ()(lua_State * L,lua_WarnFunction f,void * ud) +lua_status vendor/lua-5.4.8/src/lapi.c /^LUA_API int lua_status (lua_State *L) {$/;" f typeref:typename:LUA_API int +lua_status vendor/lua-5.4.8/src/lua.h /^LUA_API int (lua_status) (lua_State *L);$/;" v typeref:typename:LUA_API int ()(lua_State * L) +lua_stdin_is_tty vendor/lua-5.4.8/src/lua.c /^#define lua_stdin_is_tty(/;" d file: +lua_str2number vendor/lua-5.4.8/src/luaconf.h /^#define lua_str2number(/;" d +lua_stringtonumber vendor/lua-5.4.8/src/lapi.c /^LUA_API size_t lua_stringtonumber (lua_State *L, const char *s) {$/;" f typeref:typename:LUA_API size_t +lua_strlen vendor/lua-5.4.8/src/luaconf.h /^#define lua_strlen(/;" d +lua_strx2number vendor/lua-5.4.8/src/lobject.c /^static lua_Number lua_strx2number (const char *s, char **endptr) {$/;" f typeref:typename:lua_Number file: +lua_strx2number vendor/lua-5.4.8/src/luaconf.h /^#define lua_strx2number(/;" d +lua_tmpnam vendor/lua-5.4.8/src/loslib.c /^#define lua_tmpnam(/;" d file: +lua_toboolean vendor/lua-5.4.8/src/lapi.c /^LUA_API int lua_toboolean (lua_State *L, int idx) {$/;" f typeref:typename:LUA_API int +lua_toboolean vendor/lua-5.4.8/src/lua.h /^LUA_API int (lua_toboolean) (lua_State *L, int idx);$/;" v typeref:typename:LUA_API int ()(lua_State * L,int idx) +lua_tocfunction vendor/lua-5.4.8/src/lapi.c /^LUA_API lua_CFunction lua_tocfunction (lua_State *L, int idx) {$/;" f typeref:typename:LUA_API lua_CFunction +lua_toclose vendor/lua-5.4.8/src/lapi.c /^LUA_API void lua_toclose (lua_State *L, int idx) {$/;" f typeref:typename:LUA_API void +lua_toclose vendor/lua-5.4.8/src/lua.h /^LUA_API void (lua_toclose) (lua_State *L, int idx);$/;" v typeref:typename:LUA_API void ()(lua_State * L,int idx) +lua_tointeger vendor/lua-5.4.8/src/lua.h /^#define lua_tointeger(/;" d +lua_tointegerx vendor/lua-5.4.8/src/lapi.c /^LUA_API lua_Integer lua_tointegerx (lua_State *L, int idx, int *pisnum) {$/;" f typeref:typename:LUA_API lua_Integer +lua_tolstring vendor/lua-5.4.8/src/lapi.c /^LUA_API const char *lua_tolstring (lua_State *L, int idx, size_t *len) {$/;" f typeref:typename:LUA_API const char * +lua_tolstring vendor/lua-5.4.8/src/lua.h /^LUA_API const char *(lua_tolstring) (lua_State *L, int idx, size_t *len);$/;" v typeref:typename:LUA_API const char * ()(lua_State * L,int idx,size_t * len) +lua_tonumber vendor/lua-5.4.8/src/lua.h /^#define lua_tonumber(/;" d +lua_tonumberx vendor/lua-5.4.8/src/lapi.c /^LUA_API lua_Number lua_tonumberx (lua_State *L, int idx, int *pisnum) {$/;" f typeref:typename:LUA_API lua_Number +lua_topointer vendor/lua-5.4.8/src/lapi.c /^LUA_API const void *lua_topointer (lua_State *L, int idx) {$/;" f typeref:typename:LUA_API const void * +lua_topointer vendor/lua-5.4.8/src/lua.h /^LUA_API const void *(lua_topointer) (lua_State *L, int idx);$/;" v typeref:typename:LUA_API const void * ()(lua_State * L,int idx) +lua_tostring vendor/lua-5.4.8/src/lua.h /^#define lua_tostring(/;" d +lua_tothread vendor/lua-5.4.8/src/lapi.c /^LUA_API lua_State *lua_tothread (lua_State *L, int idx) {$/;" f typeref:typename:LUA_API lua_State * +lua_tothread vendor/lua-5.4.8/src/lua.h /^LUA_API lua_State *(lua_tothread) (lua_State *L, int idx);$/;" v typeref:typename:LUA_API lua_State * ()(lua_State * L,int idx) +lua_tounsigned vendor/lua-5.4.8/src/lua.h /^#define lua_tounsigned(/;" d +lua_tounsignedx vendor/lua-5.4.8/src/lua.h /^#define lua_tounsignedx(/;" d +lua_touserdata vendor/lua-5.4.8/src/lapi.c /^LUA_API void *lua_touserdata (lua_State *L, int idx) {$/;" f typeref:typename:LUA_API void * +lua_touserdata vendor/lua-5.4.8/src/lua.h /^LUA_API void *(lua_touserdata) (lua_State *L, int idx);$/;" v typeref:typename:LUA_API void * ()(lua_State * L,int idx) +lua_type vendor/lua-5.4.8/src/lapi.c /^LUA_API int lua_type (lua_State *L, int idx) {$/;" f typeref:typename:LUA_API int +lua_type vendor/lua-5.4.8/src/lua.h /^LUA_API int (lua_type) (lua_State *L, int idx);$/;" v typeref:typename:LUA_API int ()(lua_State * L,int idx) +lua_typename vendor/lua-5.4.8/src/lapi.c /^LUA_API const char *lua_typename (lua_State *L, int t) {$/;" f typeref:typename:LUA_API const char * +lua_typename vendor/lua-5.4.8/src/lua.h /^LUA_API const char *(lua_typename) (lua_State *L, int tp);$/;" v typeref:typename:LUA_API const char * ()(lua_State * L,int tp) +lua_unlock vendor/lua-5.4.8/src/llimits.h /^#define lua_unlock(/;" d +lua_upvalueid vendor/lua-5.4.8/src/lapi.c /^LUA_API void *lua_upvalueid (lua_State *L, int fidx, int n) {$/;" f typeref:typename:LUA_API void * +lua_upvalueid vendor/lua-5.4.8/src/lua.h /^LUA_API void *(lua_upvalueid) (lua_State *L, int fidx, int n);$/;" v typeref:typename:LUA_API void * ()(lua_State * L,int fidx,int n) +lua_upvalueindex vendor/lua-5.4.8/src/lua.h /^#define lua_upvalueindex(/;" d +lua_upvaluejoin vendor/lua-5.4.8/src/lapi.c /^LUA_API void lua_upvaluejoin (lua_State *L, int fidx1, int n1,$/;" f typeref:typename:LUA_API void +lua_upvaluejoin vendor/lua-5.4.8/src/lua.h /^LUA_API void (lua_upvaluejoin) (lua_State *L, int fidx1, int n1,$/;" v typeref:typename:LUA_API void ()(lua_State * L,int fidx1,int n1,int fidx2,int n2) +lua_version vendor/lua-5.4.8/src/lapi.c /^LUA_API lua_Number lua_version (lua_State *L) {$/;" f typeref:typename:LUA_API lua_Number +lua_warning vendor/lua-5.4.8/src/lapi.c /^void lua_warning (lua_State *L, const char *msg, int tocont) {$/;" f typeref:typename:void +lua_warning vendor/lua-5.4.8/src/lua.h /^LUA_API void (lua_warning) (lua_State *L, const char *msg, int tocont);$/;" v typeref:typename:LUA_API void ()(lua_State * L,const char * msg,int tocont) +lua_writeline vendor/lua-5.4.8/src/lauxlib.h /^#define lua_writeline(/;" d +lua_writestring vendor/lua-5.4.8/src/lauxlib.h /^#define lua_writestring(/;" d +lua_writestringerror vendor/lua-5.4.8/src/lauxlib.h /^#define lua_writestringerror(/;" d +lua_xmove vendor/lua-5.4.8/src/lapi.c /^LUA_API void lua_xmove (lua_State *from, lua_State *to, int n) {$/;" f typeref:typename:LUA_API void +lua_xmove vendor/lua-5.4.8/src/lua.h /^LUA_API void (lua_xmove) (lua_State *from, lua_State *to, int n);$/;" v typeref:typename:LUA_API void ()(lua_State * from,lua_State * to,int n) +lua_yield vendor/lua-5.4.8/src/lua.h /^#define lua_yield(/;" d +lua_yieldk vendor/lua-5.4.8/src/ldo.c /^LUA_API int lua_yieldk (lua_State *L, int nresults, lua_KContext ctx,$/;" f typeref:typename:LUA_API int +lua_yieldk vendor/lua-5.4.8/src/lua.h /^LUA_API int (lua_yieldk) (lua_State *L, int nresults, lua_KContext ctx,$/;" v typeref:typename:LUA_API int ()(lua_State * L,int nresults,lua_KContext ctx,lua_KFunction k) +luac.o vendor/lua-5.4.8/src/Makefile /^luac.o: luac.c lprefix.h lua.h luaconf.h lauxlib.h ldebug.h lstate.h \\$/;" t +luac_c vendor/lua-5.4.8/src/luac.c /^#define luac_c$/;" d file: +luaconf_h vendor/lua-5.4.8/src/luaconf.h /^#define luaconf_h$/;" d +luai_apicheck vendor/lua-5.4.8/src/llimits.h /^#define luai_apicheck(/;" d +luai_apicheck vendor/lua-5.4.8/src/luaconf.h /^#define luai_apicheck(/;" d +luai_ctype_ vendor/lua-5.4.8/src/lctype.c /^LUAI_DDEF const lu_byte luai_ctype_[UCHAR_MAX + 2] = {$/;" v typeref:typename:LUAI_DDEF const lu_byte[] +luai_jmpbuf vendor/lua-5.4.8/src/ldo.c /^#define luai_jmpbuf /;" d file: +luai_likely vendor/lua-5.4.8/src/luaconf.h /^#define luai_likely(/;" d +luai_makeseed vendor/lua-5.4.8/src/lstate.c /^static unsigned int luai_makeseed (lua_State *L) {$/;" f typeref:typename:unsigned int file: +luai_numadd vendor/lua-5.4.8/src/llimits.h /^#define luai_numadd(/;" d +luai_numdiv vendor/lua-5.4.8/src/llimits.h /^#define luai_numdiv(/;" d +luai_numeq vendor/lua-5.4.8/src/llimits.h /^#define luai_numeq(/;" d +luai_numge vendor/lua-5.4.8/src/llimits.h /^#define luai_numge(/;" d +luai_numgt vendor/lua-5.4.8/src/llimits.h /^#define luai_numgt(/;" d +luai_numidiv vendor/lua-5.4.8/src/llimits.h /^#define luai_numidiv(/;" d +luai_numisnan vendor/lua-5.4.8/src/llimits.h /^#define luai_numisnan(/;" d +luai_numle vendor/lua-5.4.8/src/llimits.h /^#define luai_numle(/;" d +luai_numlt vendor/lua-5.4.8/src/llimits.h /^#define luai_numlt(/;" d +luai_nummod vendor/lua-5.4.8/src/llimits.h /^#define luai_nummod(/;" d +luai_nummul vendor/lua-5.4.8/src/llimits.h /^#define luai_nummul(/;" d +luai_numpow vendor/lua-5.4.8/src/llimits.h /^#define luai_numpow(/;" d +luai_numsub vendor/lua-5.4.8/src/llimits.h /^#define luai_numsub(/;" d +luai_numunm vendor/lua-5.4.8/src/llimits.h /^#define luai_numunm(/;" d +luai_threadyield vendor/lua-5.4.8/src/llimits.h /^#define luai_threadyield(/;" d +luai_unlikely vendor/lua-5.4.8/src/luaconf.h /^#define luai_unlikely(/;" d +luai_userstateclose vendor/lua-5.4.8/src/llimits.h /^#define luai_userstateclose(/;" d +luai_userstatefree vendor/lua-5.4.8/src/llimits.h /^#define luai_userstatefree(/;" d +luai_userstateopen vendor/lua-5.4.8/src/llimits.h /^#define luai_userstateopen(/;" d +luai_userstateresume vendor/lua-5.4.8/src/llimits.h /^#define luai_userstateresume(/;" d +luai_userstatethread vendor/lua-5.4.8/src/llimits.h /^#define luai_userstatethread(/;" d +luai_userstateyield vendor/lua-5.4.8/src/llimits.h /^#define luai_userstateyield(/;" d +luai_verifycode vendor/lua-5.4.8/src/lundump.c /^#define luai_verifycode(/;" d file: +lualib_h vendor/lua-5.4.8/src/lualib.h /^#define lualib_h$/;" d +luaopen_base vendor/lua-5.4.8/src/lbaselib.c /^LUAMOD_API int luaopen_base (lua_State *L) {$/;" f typeref:typename:LUAMOD_API int +luaopen_base vendor/lua-5.4.8/src/lualib.h /^LUAMOD_API int (luaopen_base) (lua_State *L);$/;" v typeref:typename:LUAMOD_API int ()(lua_State * L) +luaopen_coroutine vendor/lua-5.4.8/src/lcorolib.c /^LUAMOD_API int luaopen_coroutine (lua_State *L) {$/;" f typeref:typename:LUAMOD_API int +luaopen_coroutine vendor/lua-5.4.8/src/lualib.h /^LUAMOD_API int (luaopen_coroutine) (lua_State *L);$/;" v typeref:typename:LUAMOD_API int ()(lua_State * L) +luaopen_debug vendor/lua-5.4.8/src/ldblib.c /^LUAMOD_API int luaopen_debug (lua_State *L) {$/;" f typeref:typename:LUAMOD_API int +luaopen_debug vendor/lua-5.4.8/src/lualib.h /^LUAMOD_API int (luaopen_debug) (lua_State *L);$/;" v typeref:typename:LUAMOD_API int ()(lua_State * L) +luaopen_io vendor/lua-5.4.8/src/liolib.c /^LUAMOD_API int luaopen_io (lua_State *L) {$/;" f typeref:typename:LUAMOD_API int +luaopen_io vendor/lua-5.4.8/src/lualib.h /^LUAMOD_API int (luaopen_io) (lua_State *L);$/;" v typeref:typename:LUAMOD_API int ()(lua_State * L) +luaopen_math vendor/lua-5.4.8/src/lmathlib.c /^LUAMOD_API int luaopen_math (lua_State *L) {$/;" f typeref:typename:LUAMOD_API int +luaopen_math vendor/lua-5.4.8/src/lualib.h /^LUAMOD_API int (luaopen_math) (lua_State *L);$/;" v typeref:typename:LUAMOD_API int ()(lua_State * L) +luaopen_os vendor/lua-5.4.8/src/loslib.c /^LUAMOD_API int luaopen_os (lua_State *L) {$/;" f typeref:typename:LUAMOD_API int +luaopen_os vendor/lua-5.4.8/src/lualib.h /^LUAMOD_API int (luaopen_os) (lua_State *L);$/;" v typeref:typename:LUAMOD_API int ()(lua_State * L) +luaopen_package vendor/lua-5.4.8/src/loadlib.c /^LUAMOD_API int luaopen_package (lua_State *L) {$/;" f typeref:typename:LUAMOD_API int +luaopen_package vendor/lua-5.4.8/src/lualib.h /^LUAMOD_API int (luaopen_package) (lua_State *L);$/;" v typeref:typename:LUAMOD_API int ()(lua_State * L) +luaopen_string vendor/lua-5.4.8/src/lstrlib.c /^LUAMOD_API int luaopen_string (lua_State *L) {$/;" f typeref:typename:LUAMOD_API int +luaopen_string vendor/lua-5.4.8/src/lualib.h /^LUAMOD_API int (luaopen_string) (lua_State *L);$/;" v typeref:typename:LUAMOD_API int ()(lua_State * L) +luaopen_table vendor/lua-5.4.8/src/ltablib.c /^LUAMOD_API int luaopen_table (lua_State *L) {$/;" f typeref:typename:LUAMOD_API int +luaopen_table vendor/lua-5.4.8/src/lualib.h /^LUAMOD_API int (luaopen_table) (lua_State *L);$/;" v typeref:typename:LUAMOD_API int ()(lua_State * L) +luaopen_utf8 vendor/lua-5.4.8/src/lualib.h /^LUAMOD_API int (luaopen_utf8) (lua_State *L);$/;" v typeref:typename:LUAMOD_API int ()(lua_State * L) +luaopen_utf8 vendor/lua-5.4.8/src/lutf8lib.c /^LUAMOD_API int luaopen_utf8 (lua_State *L) {$/;" f typeref:typename:LUAMOD_API int +lundump.o vendor/lua-5.4.8/src/Makefile /^lundump.o: lundump.c lprefix.h lua.h luaconf.h ldebug.h lstate.h \\$/;" t +lundump_c vendor/lua-5.4.8/src/lundump.c /^#define lundump_c$/;" d file: +lundump_h vendor/lua-5.4.8/src/lundump.h /^#define lundump_h$/;" d +lutf8lib.o vendor/lua-5.4.8/src/Makefile /^lutf8lib.o: lutf8lib.c lprefix.h lua.h luaconf.h lauxlib.h lualib.h$/;" t +lutf8lib_c vendor/lua-5.4.8/src/lutf8lib.c /^#define lutf8lib_c$/;" d file: +lvm.o vendor/lua-5.4.8/src/Makefile /^lvm.o: lvm.c lprefix.h lua.h luaconf.h ldebug.h lstate.h lobject.h \\$/;" t +lvm_c vendor/lua-5.4.8/src/lvm.c /^#define lvm_c$/;" d file: +lvm_h vendor/lua-5.4.8/src/lvm.h /^#define lvm_h$/;" d +lzio.o vendor/lua-5.4.8/src/Makefile /^lzio.o: lzio.c lprefix.h lua.h luaconf.h llimits.h lmem.h lstate.h \\$/;" t +lzio_c vendor/lua-5.4.8/src/lzio.c /^#define lzio_c$/;" d file: +lzio_h vendor/lua-5.4.8/src/lzio.h /^#define lzio_h$/;" d +m0 vendor/raylib-5.5_linux_amd64/include/raylib.h /^ float m0, m4, m8, m12; \/\/ Matrix first row (4 components)$/;" m struct:Matrix typeref:typename:float +m0 vendor/raylib-5.5_linux_amd64/include/raymath.h /^ float m0, m4, m8, m12; \/\/ Matrix first row (4 components)$/;" m struct:Matrix typeref:typename:float +m0 vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ float m0, m4, m8, m12; \/\/ Matrix first row (4 components)$/;" m struct:Matrix typeref:typename:float +m1 vendor/raylib-5.5_linux_amd64/include/raylib.h /^ float m1, m5, m9, m13; \/\/ Matrix second row (4 components)$/;" m struct:Matrix typeref:typename:float +m1 vendor/raylib-5.5_linux_amd64/include/raymath.h /^ float m1, m5, m9, m13; \/\/ Matrix second row (4 components)$/;" m struct:Matrix typeref:typename:float +m1 vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ float m1, m5, m9, m13; \/\/ Matrix second row (4 components)$/;" m struct:Matrix typeref:typename:float +m10 vendor/raylib-5.5_linux_amd64/include/raylib.h /^ float m2, m6, m10, m14; \/\/ Matrix third row (4 components)$/;" m struct:Matrix typeref:typename:float +m10 vendor/raylib-5.5_linux_amd64/include/raymath.h /^ float m2, m6, m10, m14; \/\/ Matrix third row (4 components)$/;" m struct:Matrix typeref:typename:float +m10 vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ float m2, m6, m10, m14; \/\/ Matrix third row (4 components)$/;" m struct:Matrix typeref:typename:float +m11 vendor/raylib-5.5_linux_amd64/include/raylib.h /^ float m3, m7, m11, m15; \/\/ Matrix fourth row (4 components)$/;" m struct:Matrix typeref:typename:float +m11 vendor/raylib-5.5_linux_amd64/include/raymath.h /^ float m3, m7, m11, m15; \/\/ Matrix fourth row (4 components)$/;" m struct:Matrix typeref:typename:float +m11 vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ float m3, m7, m11, m15; \/\/ Matrix fourth row (4 components)$/;" m struct:Matrix typeref:typename:float +m12 vendor/raylib-5.5_linux_amd64/include/raylib.h /^ float m0, m4, m8, m12; \/\/ Matrix first row (4 components)$/;" m struct:Matrix typeref:typename:float +m12 vendor/raylib-5.5_linux_amd64/include/raymath.h /^ float m0, m4, m8, m12; \/\/ Matrix first row (4 components)$/;" m struct:Matrix typeref:typename:float +m12 vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ float m0, m4, m8, m12; \/\/ Matrix first row (4 components)$/;" m struct:Matrix typeref:typename:float +m13 vendor/raylib-5.5_linux_amd64/include/raylib.h /^ float m1, m5, m9, m13; \/\/ Matrix second row (4 components)$/;" m struct:Matrix typeref:typename:float +m13 vendor/raylib-5.5_linux_amd64/include/raymath.h /^ float m1, m5, m9, m13; \/\/ Matrix second row (4 components)$/;" m struct:Matrix typeref:typename:float +m13 vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ float m1, m5, m9, m13; \/\/ Matrix second row (4 components)$/;" m struct:Matrix typeref:typename:float +m14 vendor/raylib-5.5_linux_amd64/include/raylib.h /^ float m2, m6, m10, m14; \/\/ Matrix third row (4 components)$/;" m struct:Matrix typeref:typename:float +m14 vendor/raylib-5.5_linux_amd64/include/raymath.h /^ float m2, m6, m10, m14; \/\/ Matrix third row (4 components)$/;" m struct:Matrix typeref:typename:float +m14 vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ float m2, m6, m10, m14; \/\/ Matrix third row (4 components)$/;" m struct:Matrix typeref:typename:float +m15 vendor/raylib-5.5_linux_amd64/include/raylib.h /^ float m3, m7, m11, m15; \/\/ Matrix fourth row (4 components)$/;" m struct:Matrix typeref:typename:float +m15 vendor/raylib-5.5_linux_amd64/include/raymath.h /^ float m3, m7, m11, m15; \/\/ Matrix fourth row (4 components)$/;" m struct:Matrix typeref:typename:float +m15 vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ float m3, m7, m11, m15; \/\/ Matrix fourth row (4 components)$/;" m struct:Matrix typeref:typename:float +m2 vendor/raylib-5.5_linux_amd64/include/raylib.h /^ float m2, m6, m10, m14; \/\/ Matrix third row (4 components)$/;" m struct:Matrix typeref:typename:float +m2 vendor/raylib-5.5_linux_amd64/include/raymath.h /^ float m2, m6, m10, m14; \/\/ Matrix third row (4 components)$/;" m struct:Matrix typeref:typename:float +m2 vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ float m2, m6, m10, m14; \/\/ Matrix third row (4 components)$/;" m struct:Matrix typeref:typename:float +m3 vendor/raylib-5.5_linux_amd64/include/raylib.h /^ float m3, m7, m11, m15; \/\/ Matrix fourth row (4 components)$/;" m struct:Matrix typeref:typename:float +m3 vendor/raylib-5.5_linux_amd64/include/raymath.h /^ float m3, m7, m11, m15; \/\/ Matrix fourth row (4 components)$/;" m struct:Matrix typeref:typename:float +m3 vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ float m3, m7, m11, m15; \/\/ Matrix fourth row (4 components)$/;" m struct:Matrix typeref:typename:float +m4 vendor/raylib-5.5_linux_amd64/include/raylib.h /^ float m0, m4, m8, m12; \/\/ Matrix first row (4 components)$/;" m struct:Matrix typeref:typename:float +m4 vendor/raylib-5.5_linux_amd64/include/raymath.h /^ float m0, m4, m8, m12; \/\/ Matrix first row (4 components)$/;" m struct:Matrix typeref:typename:float +m4 vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ float m0, m4, m8, m12; \/\/ Matrix first row (4 components)$/;" m struct:Matrix typeref:typename:float +m5 vendor/raylib-5.5_linux_amd64/include/raylib.h /^ float m1, m5, m9, m13; \/\/ Matrix second row (4 components)$/;" m struct:Matrix typeref:typename:float +m5 vendor/raylib-5.5_linux_amd64/include/raymath.h /^ float m1, m5, m9, m13; \/\/ Matrix second row (4 components)$/;" m struct:Matrix typeref:typename:float +m5 vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ float m1, m5, m9, m13; \/\/ Matrix second row (4 components)$/;" m struct:Matrix typeref:typename:float +m6 vendor/raylib-5.5_linux_amd64/include/raylib.h /^ float m2, m6, m10, m14; \/\/ Matrix third row (4 components)$/;" m struct:Matrix typeref:typename:float +m6 vendor/raylib-5.5_linux_amd64/include/raymath.h /^ float m2, m6, m10, m14; \/\/ Matrix third row (4 components)$/;" m struct:Matrix typeref:typename:float +m6 vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ float m2, m6, m10, m14; \/\/ Matrix third row (4 components)$/;" m struct:Matrix typeref:typename:float +m7 vendor/raylib-5.5_linux_amd64/include/raylib.h /^ float m3, m7, m11, m15; \/\/ Matrix fourth row (4 components)$/;" m struct:Matrix typeref:typename:float +m7 vendor/raylib-5.5_linux_amd64/include/raymath.h /^ float m3, m7, m11, m15; \/\/ Matrix fourth row (4 components)$/;" m struct:Matrix typeref:typename:float +m7 vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ float m3, m7, m11, m15; \/\/ Matrix fourth row (4 components)$/;" m struct:Matrix typeref:typename:float +m8 vendor/raylib-5.5_linux_amd64/include/raylib.h /^ float m0, m4, m8, m12; \/\/ Matrix first row (4 components)$/;" m struct:Matrix typeref:typename:float +m8 vendor/raylib-5.5_linux_amd64/include/raymath.h /^ float m0, m4, m8, m12; \/\/ Matrix first row (4 components)$/;" m struct:Matrix typeref:typename:float +m8 vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ float m0, m4, m8, m12; \/\/ Matrix first row (4 components)$/;" m struct:Matrix typeref:typename:float +m9 vendor/raylib-5.5_linux_amd64/include/raylib.h /^ float m1, m5, m9, m13; \/\/ Matrix second row (4 components)$/;" m struct:Matrix typeref:typename:float +m9 vendor/raylib-5.5_linux_amd64/include/raymath.h /^ float m1, m5, m9, m13; \/\/ Matrix second row (4 components)$/;" m struct:Matrix typeref:typename:float +m9 vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ float m1, m5, m9, m13; \/\/ Matrix second row (4 components)$/;" m struct:Matrix typeref:typename:float +macos vendor/lua-5.4.8/src/Makefile /^Darwin macos macosx:$/;" t +macosx vendor/lua-5.4.8/src/Makefile /^Darwin macos macosx:$/;" t +main main.c /^int main(void) {$/;" f typeref:typename:int +main vendor/lua-5.4.8/src/lua.c /^int main (int argc, char **argv) {$/;" f typeref:typename:int +main vendor/lua-5.4.8/src/luac.c /^int main(int argc, char* argv[])$/;" f typeref:typename:int +mainfunc vendor/lua-5.4.8/src/lparser.c /^static void mainfunc (LexState *ls, FuncState *fs) {$/;" f typeref:typename:void file: +mainpositionTV vendor/lua-5.4.8/src/ltable.c /^static Node *mainpositionTV (const Table *t, const TValue *key) {$/;" f typeref:typename:Node * file: +mainpositionfromnode vendor/lua-5.4.8/src/ltable.c /^l_sinline Node *mainpositionfromnode (const Table *t, Node *nd) {$/;" f typeref:typename:l_sinline Node * +mainthread vendor/lua-5.4.8/src/lstate.h /^ struct lua_State *mainthread;$/;" m struct:global_State typeref:struct:lua_State * +makemask vendor/lua-5.4.8/src/ldblib.c /^static int makemask (const char *smask, int count) {$/;" f typeref:typename:int file: +makevariant vendor/lua-5.4.8/src/lobject.h /^#define makevariant(/;" d +makewhite vendor/lua-5.4.8/src/lgc.c /^#define makewhite(/;" d file: +maps vendor/raylib-5.5_linux_amd64/include/raylib.h /^ MaterialMap *maps; \/\/ Material maps array (MAX_MATERIAL_MAPS)$/;" m struct:Material typeref:typename:MaterialMap * +markbeingfnz vendor/lua-5.4.8/src/lgc.c /^static lu_mem markbeingfnz (global_State *g) {$/;" f typeref:typename:lu_mem file: +markkey vendor/lua-5.4.8/src/lgc.c /^#define markkey(/;" d file: +marklen vendor/lua-5.4.8/src/lua.c /^#define marklen /;" d file: +markmt vendor/lua-5.4.8/src/lgc.c /^static void markmt (global_State *g) {$/;" f typeref:typename:void file: +markobject vendor/lua-5.4.8/src/lgc.c /^#define markobject(/;" d file: +markobjectN vendor/lua-5.4.8/src/lgc.c /^#define markobjectN(/;" d file: +markold vendor/lua-5.4.8/src/lgc.c /^static void markold (global_State *g, GCObject *from, GCObject *to) {$/;" f typeref:typename:void file: +marktobeclosed vendor/lua-5.4.8/src/lparser.c /^static void marktobeclosed (FuncState *fs) {$/;" f typeref:typename:void file: +markupval vendor/lua-5.4.8/src/lparser.c /^static void markupval (FuncState *fs, int level) {$/;" f typeref:typename:void file: +markvalue vendor/lua-5.4.8/src/lgc.c /^#define markvalue(/;" d file: +maskcolors vendor/lua-5.4.8/src/lgc.c /^#define maskcolors /;" d file: +maskflags vendor/lua-5.4.8/src/ltm.h /^#define maskflags /;" d +maskgcbits vendor/lua-5.4.8/src/lgc.c /^#define maskgcbits /;" d file: +match vendor/lua-5.4.8/src/lstrlib.c /^static const char *match (MatchState *ms, const char *s, const char *p) {$/;" f typeref:typename:const char * file: +match vendor/lua-5.4.8/src/lstrlib.c /^static const char *match (MatchState *ms, const char *s, const char *p);$/;" p typeref:typename:const char * file: +match_capture vendor/lua-5.4.8/src/lstrlib.c /^static const char *match_capture (MatchState *ms, const char *s, int l) {$/;" f typeref:typename:const char * file: +match_class vendor/lua-5.4.8/src/lstrlib.c /^static int match_class (int c, int cl) {$/;" f typeref:typename:int file: +matchbalance vendor/lua-5.4.8/src/lstrlib.c /^static const char *matchbalance (MatchState *ms, const char *s,$/;" f typeref:typename:const char * file: +matchbracketclass vendor/lua-5.4.8/src/lstrlib.c /^static int matchbracketclass (int c, const char *p, const char *ec) {$/;" f typeref:typename:int file: +matchdepth vendor/lua-5.4.8/src/lstrlib.c /^ int matchdepth; \/* control for recursive depth (to avoid C stack overflow) *\/$/;" m struct:MatchState typeref:typename:int file: +materialCount vendor/raylib-5.5_linux_amd64/include/raylib.h /^ int materialCount; \/\/ Number of materials$/;" m struct:Model typeref:typename:int +materials vendor/raylib-5.5_linux_amd64/include/raylib.h /^ Material *materials; \/\/ Materials array$/;" m struct:Model typeref:typename:Material * +math_abs vendor/lua-5.4.8/src/lmathlib.c /^static int math_abs (lua_State *L) {$/;" f typeref:typename:int file: +math_acos vendor/lua-5.4.8/src/lmathlib.c /^static int math_acos (lua_State *L) {$/;" f typeref:typename:int file: +math_asin vendor/lua-5.4.8/src/lmathlib.c /^static int math_asin (lua_State *L) {$/;" f typeref:typename:int file: +math_atan vendor/lua-5.4.8/src/lmathlib.c /^static int math_atan (lua_State *L) {$/;" f typeref:typename:int file: +math_ceil vendor/lua-5.4.8/src/lmathlib.c /^static int math_ceil (lua_State *L) {$/;" f typeref:typename:int file: +math_cos vendor/lua-5.4.8/src/lmathlib.c /^static int math_cos (lua_State *L) {$/;" f typeref:typename:int file: +math_cosh vendor/lua-5.4.8/src/lmathlib.c /^static int math_cosh (lua_State *L) {$/;" f typeref:typename:int file: +math_deg vendor/lua-5.4.8/src/lmathlib.c /^static int math_deg (lua_State *L) {$/;" f typeref:typename:int file: +math_exp vendor/lua-5.4.8/src/lmathlib.c /^static int math_exp (lua_State *L) {$/;" f typeref:typename:int file: +math_floor vendor/lua-5.4.8/src/lmathlib.c /^static int math_floor (lua_State *L) {$/;" f typeref:typename:int file: +math_fmod vendor/lua-5.4.8/src/lmathlib.c /^static int math_fmod (lua_State *L) {$/;" f typeref:typename:int file: +math_frexp vendor/lua-5.4.8/src/lmathlib.c /^static int math_frexp (lua_State *L) {$/;" f typeref:typename:int file: +math_ldexp vendor/lua-5.4.8/src/lmathlib.c /^static int math_ldexp (lua_State *L) {$/;" f typeref:typename:int file: +math_log vendor/lua-5.4.8/src/lmathlib.c /^static int math_log (lua_State *L) {$/;" f typeref:typename:int file: +math_log10 vendor/lua-5.4.8/src/lmathlib.c /^static int math_log10 (lua_State *L) {$/;" f typeref:typename:int file: +math_max vendor/lua-5.4.8/src/lmathlib.c /^static int math_max (lua_State *L) {$/;" f typeref:typename:int file: +math_min vendor/lua-5.4.8/src/lmathlib.c /^static int math_min (lua_State *L) {$/;" f typeref:typename:int file: +math_modf vendor/lua-5.4.8/src/lmathlib.c /^static int math_modf (lua_State *L) {$/;" f typeref:typename:int file: +math_pow vendor/lua-5.4.8/src/lmathlib.c /^static int math_pow (lua_State *L) {$/;" f typeref:typename:int file: +math_rad vendor/lua-5.4.8/src/lmathlib.c /^static int math_rad (lua_State *L) {$/;" f typeref:typename:int file: +math_random vendor/lua-5.4.8/src/lmathlib.c /^static int math_random (lua_State *L) {$/;" f typeref:typename:int file: +math_randomseed vendor/lua-5.4.8/src/lmathlib.c /^static int math_randomseed (lua_State *L) {$/;" f typeref:typename:int file: +math_sin vendor/lua-5.4.8/src/lmathlib.c /^static int math_sin (lua_State *L) {$/;" f typeref:typename:int file: +math_sinh vendor/lua-5.4.8/src/lmathlib.c /^static int math_sinh (lua_State *L) {$/;" f typeref:typename:int file: +math_sqrt vendor/lua-5.4.8/src/lmathlib.c /^static int math_sqrt (lua_State *L) {$/;" f typeref:typename:int file: +math_tan vendor/lua-5.4.8/src/lmathlib.c /^static int math_tan (lua_State *L) {$/;" f typeref:typename:int file: +math_tanh vendor/lua-5.4.8/src/lmathlib.c /^static int math_tanh (lua_State *L) {$/;" f typeref:typename:int file: +math_toint vendor/lua-5.4.8/src/lmathlib.c /^static int math_toint (lua_State *L) {$/;" f typeref:typename:int file: +math_type vendor/lua-5.4.8/src/lmathlib.c /^static int math_type (lua_State *L) {$/;" f typeref:typename:int file: +math_ult vendor/lua-5.4.8/src/lmathlib.c /^static int math_ult (lua_State *L) {$/;" f typeref:typename:int file: +mathlib vendor/lua-5.4.8/src/lmathlib.c /^static const luaL_Reg mathlib[] = {$/;" v typeref:typename:const luaL_Reg[] file: +max vendor/raylib-5.5_linux_amd64/include/raylib.h /^ Vector3 max; \/\/ Maximum vertex box-corner$/;" m struct:BoundingBox typeref:typename:Vector3 +maxAnisotropyLevel vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ float maxAnisotropyLevel; \/\/ Maximum anisotropy level supported (minimum is /;" m struct:rlglData::__anon1f68b8bd0e08 typeref:typename:float +maxDepthBits vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ int maxDepthBits; \/\/ Maximum bits for depth component$/;" m struct:rlglData::__anon1f68b8bd0e08 typeref:typename:int +max_expand vendor/lua-5.4.8/src/lstrlib.c /^static const char *max_expand (MatchState *ms, const char *s,$/;" f typeref:typename:const char * file: +maxalign vendor/lua-5.4.8/src/lstrlib.c /^ int maxalign;$/;" m struct:Header typeref:typename:int file: +maxstacksize vendor/lua-5.4.8/src/lobject.h /^ lu_byte maxstacksize; \/* number of registers needed by this function *\/$/;" m struct:Proto typeref:typename:lu_byte +memerrmsg vendor/lua-5.4.8/src/lstate.h /^ TString *memerrmsg; \/* message for memory-allocation errors *\/$/;" m struct:global_State typeref:typename:TString * +meshCount vendor/raylib-5.5_linux_amd64/include/raylib.h /^ int meshCount; \/\/ Number of meshes$/;" m struct:Model typeref:typename:int +meshMaterial vendor/raylib-5.5_linux_amd64/include/raylib.h /^ int *meshMaterial; \/\/ Mesh material number$/;" m struct:Model typeref:typename:int * +meshes vendor/raylib-5.5_linux_amd64/include/raylib.h /^ Mesh *meshes; \/\/ Meshes array$/;" m struct:Model typeref:typename:Mesh * +metameth vendor/lua-5.4.8/src/liolib.c /^static const luaL_Reg metameth[] = {$/;" v typeref:typename:const luaL_Reg[] file: +metatable vendor/lua-5.4.8/src/lobject.h /^ struct Table *metatable;$/;" m struct:Table typeref:struct:Table * +metatable vendor/lua-5.4.8/src/lobject.h /^ struct Table *metatable;$/;" m struct:Udata typeref:struct:Table * +metatable vendor/lua-5.4.8/src/lobject.h /^ struct Table *metatable;$/;" m struct:Udata0 typeref:struct:Table * +meth vendor/lua-5.4.8/src/liolib.c /^static const luaL_Reg meth[] = {$/;" v typeref:typename:const luaL_Reg[] file: +min vendor/raylib-5.5_linux_amd64/include/raylib.h /^ Vector3 min; \/\/ Minimum vertex box-corner$/;" m struct:BoundingBox typeref:typename:Vector3 +min_expand vendor/lua-5.4.8/src/lstrlib.c /^static const char *min_expand (MatchState *ms, const char *s,$/;" f typeref:typename:const char * file: +mingw vendor/lua-5.4.8/src/Makefile /^mingw:$/;" t +mipmaps vendor/raylib-5.5_linux_amd64/include/raylib.h /^ int mipmaps; \/\/ Mipmap levels, 1 by default$/;" m struct:Image typeref:typename:int +mipmaps vendor/raylib-5.5_linux_amd64/include/raylib.h /^ int mipmaps; \/\/ Mipmap levels, 1 by default$/;" m struct:Texture typeref:typename:int +mode vendor/lua-5.4.8/src/ldo.c /^ const char *mode;$/;" m struct:SParser typeref:typename:const char * file: +mode vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ int mode; \/\/ Drawing mode: LINES, TRIANGLES, QUADS$/;" m struct:rlDrawCall typeref:typename:int +modelview vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ Matrix modelview; \/\/ Default modelview matrix$/;" m struct:rlglData::__anon1f68b8bd0d08 typeref:typename:Matrix +movegotosout vendor/lua-5.4.8/src/lparser.c /^static void movegotosout (FuncState *fs, BlockCnt *bl) {$/;" f typeref:typename:void file: +moveresults vendor/lua-5.4.8/src/ldo.c /^l_sinline void moveresults (lua_State *L, StkId res, int nres, int wanted) {$/;" f typeref:typename:l_sinline void +ms vendor/lua-5.4.8/src/lstrlib.c /^ MatchState ms; \/* match state *\/$/;" m struct:GMatchState typeref:typename:MatchState file: +msghandler vendor/lua-5.4.8/src/lua.c /^static int msghandler (lua_State *L) {$/;" f typeref:typename:int file: +mt vendor/lua-5.4.8/src/lstate.h /^ struct Table *mt[LUA_NUMTYPES]; \/* metatables for basic types *\/$/;" m struct:global_State typeref:struct:Table * [] +multiline vendor/lua-5.4.8/src/lua.c /^static int multiline (lua_State *L) {$/;" f typeref:typename:int file: +n vendor/lua-5.4.8/src/lauxlib.c /^ int n; \/* number of pre-read characters *\/$/;" m struct:LoadF typeref:typename:int file: +n vendor/lua-5.4.8/src/lauxlib.h /^ size_t n; \/* number of characters in buffer *\/$/;" m struct:luaL_Buffer typeref:typename:size_t +n vendor/lua-5.4.8/src/liolib.c /^ int n; \/* number of elements in buffer 'buff' *\/$/;" m struct:__anon9a52bfe00108 typeref:typename:int file: +n vendor/lua-5.4.8/src/lobject.h /^ lua_Number n; \/* float numbers *\/$/;" m union:Value typeref:typename:lua_Number +n vendor/lua-5.4.8/src/lparser.h /^ int n;$/;" m struct:Dyndata::__anon337ee4430608 typeref:typename:int +n vendor/lua-5.4.8/src/lparser.h /^ int n; \/* number of entries in use *\/$/;" m struct:Labellist typeref:typename:int +n vendor/lua-5.4.8/src/lzio.h /^ size_t n; \/* bytes still unread *\/$/;" m struct:Zio typeref:typename:size_t +n vendor/lua-5.4.8/src/lzio.h /^ size_t n;$/;" m struct:Mbuffer typeref:typename:size_t +nCcalls vendor/lua-5.4.8/src/lstate.h /^ l_uint32 nCcalls; \/* number of nested (non-yieldable | C) calls *\/$/;" m struct:lua_State typeref:typename:l_uint32 +na vendor/lua-5.4.8/src/lparser.c /^ int na; \/* number of array elements already stored *\/$/;" m struct:ConsControl typeref:typename:int file: +nabslineinfo vendor/lua-5.4.8/src/lparser.h /^ int nabslineinfo; \/* number of elements in 'abslineinfo' *\/$/;" m struct:FuncState typeref:typename:int +nactvar vendor/lua-5.4.8/src/lparser.c /^ lu_byte nactvar; \/* # active locals outside the block *\/$/;" m struct:BlockCnt typeref:typename:lu_byte file: +nactvar vendor/lua-5.4.8/src/lparser.h /^ lu_byte nactvar; \/* number of active local variables *\/$/;" m struct:FuncState typeref:typename:lu_byte +nactvar vendor/lua-5.4.8/src/lparser.h /^ lu_byte nactvar; \/* number of active variables in that position *\/$/;" m struct:Labeldesc typeref:typename:lu_byte +name vendor/lua-5.4.8/src/lauxlib.h /^ const char *name;$/;" m struct:luaL_Reg typeref:typename:const char * +name vendor/lua-5.4.8/src/ldo.c /^ const char *name;$/;" m struct:SParser typeref:typename:const char * file: +name vendor/lua-5.4.8/src/lobject.h /^ TString *name; \/* upvalue name (for debug information) *\/$/;" m struct:Upvaldesc typeref:typename:TString * +name vendor/lua-5.4.8/src/lparser.h /^ TString *name; \/* variable name *\/$/;" m struct:Vardesc::__anon337ee4430508 typeref:typename:TString * +name vendor/lua-5.4.8/src/lparser.h /^ TString *name; \/* label identifier *\/$/;" m struct:Labeldesc typeref:typename:TString * +name vendor/lua-5.4.8/src/lua.h /^ const char *name; \/* (n) *\/$/;" m struct:lua_Debug typeref:typename:const char * +name vendor/lua-5.4.8/src/lundump.c /^ const char *name;$/;" m struct:__anon98fd752a0108 typeref:typename:const char * file: +name vendor/raylib-5.5_linux_amd64/include/raylib.h /^ char name[32]; \/\/ Animation name$/;" m struct:ModelAnimation typeref:typename:char[32] +name vendor/raylib-5.5_linux_amd64/include/raylib.h /^ char name[32]; \/\/ Bone name$/;" m struct:BoneInfo typeref:typename:char[32] +namewhat vendor/lua-5.4.8/src/lua.h /^ const char *namewhat; \/* (n) 'global', 'local', 'field', 'method' *\/$/;" m struct:lua_Debug typeref:typename:const char * +nativeendian vendor/lua-5.4.8/src/lstrlib.c /^} nativeendian = {1};$/;" v typeref:typename:const union __anonae5a2721020a +nci vendor/lua-5.4.8/src/lstate.h /^ unsigned short nci; \/* number of items in 'ci' list *\/$/;" m struct:lua_State typeref:typename:unsigned short +ndebugvars vendor/lua-5.4.8/src/lparser.h /^ short ndebugvars; \/* number of elements in 'f->locvars' *\/$/;" m struct:FuncState typeref:typename:short +need_value vendor/lua-5.4.8/src/lcode.c /^static int need_value (FuncState *fs, int list) {$/;" f typeref:typename:int file: +needclose vendor/lua-5.4.8/src/lparser.h /^ lu_byte needclose; \/* function needs to close upvalues when returning *\/$/;" m struct:FuncState typeref:typename:lu_byte +negatecondition vendor/lua-5.4.8/src/lcode.c /^static void negatecondition (FuncState *fs, expdesc *e) {$/;" f typeref:typename:void file: +new_localvar vendor/lua-5.4.8/src/lparser.c /^static int new_localvar (LexState *ls, TString *name) {$/;" f typeref:typename:int file: +new_localvarliteral vendor/lua-5.4.8/src/lparser.c /^#define new_localvarliteral(/;" d file: +newbox vendor/lua-5.4.8/src/lauxlib.c /^static void newbox (lua_State *L) {$/;" f typeref:typename:void file: +newbuffsize vendor/lua-5.4.8/src/lauxlib.c /^static size_t newbuffsize (luaL_Buffer *B, size_t sz) {$/;" f typeref:typename:size_t file: +newfile vendor/lua-5.4.8/src/liolib.c /^static LStream *newfile (lua_State *L) {$/;" f typeref:typename:LStream * file: +newgotoentry vendor/lua-5.4.8/src/lparser.c /^static int newgotoentry (LexState *ls, TString *name, int line, int pc) {$/;" f typeref:typename:int file: +newlabelentry vendor/lua-5.4.8/src/lparser.c /^static int newlabelentry (LexState *ls, Labellist *l, TString *name,$/;" f typeref:typename:int file: +newprefile vendor/lua-5.4.8/src/liolib.c /^static LStream *newprefile (lua_State *L) {$/;" f typeref:typename:LStream * file: +newupval vendor/lua-5.4.8/src/lfunc.c /^static UpVal *newupval (lua_State *L, StkId level, UpVal **prev) {$/;" f typeref:typename:UpVal * file: +newupvalue vendor/lua-5.4.8/src/lparser.c /^static int newupvalue (FuncState *fs, TString *name, expdesc *v) {$/;" f typeref:typename:int file: +next vendor/lua-5.4.8/src/llex.c /^#define next(/;" d file: +next vendor/lua-5.4.8/src/lobject.h /^ struct UpVal *next; \/* linked list *\/$/;" m struct:UpVal::__anon808f9fcd060a::__anon808f9fcd0708 typeref:struct:UpVal * +next vendor/lua-5.4.8/src/lobject.h /^ int next; \/* for chaining *\/$/;" m struct:Node::NodeKey typeref:typename:int +next vendor/lua-5.4.8/src/lstate.h /^ struct CallInfo *previous, *next; \/* dynamic call link *\/$/;" m struct:CallInfo typeref:struct:CallInfo * +next_ci vendor/lua-5.4.8/src/ldo.c /^#define next_ci(/;" d file: +nextc vendor/lua-5.4.8/src/liolib.c /^static int nextc (RN *rn) {$/;" f typeref:typename:int file: +nextline vendor/lua-5.4.8/src/ldebug.c /^static int nextline (const Proto *p, int currentline, int pc) {$/;" f typeref:typename:int file: +nextraargs vendor/lua-5.4.8/src/lstate.h /^ int nextraargs; \/* # of extra arguments in vararg functions *\/$/;" m struct:CallInfo::__anona701f1f7010a::__anona701f1f70208 typeref:typename:int +nextrand vendor/lua-5.4.8/src/lmathlib.c /^static Rand64 nextrand (Rand64 *state) {$/;" f typeref:typename:Rand64 file: +nh vendor/lua-5.4.8/src/lparser.c /^ int nh; \/* total number of 'record' elements *\/$/;" m struct:ConsControl typeref:typename:int file: +nilK vendor/lua-5.4.8/src/lcode.c /^static int nilK (FuncState *fs) {$/;" f typeref:typename:int file: +nilvalue vendor/lua-5.4.8/src/lstate.h /^ TValue nilvalue; \/* a nil value *\/$/;" m struct:global_State typeref:typename:TValue +nk vendor/lua-5.4.8/src/lparser.h /^ int nk; \/* number of elements in 'k' *\/$/;" m struct:FuncState typeref:typename:int +node vendor/lua-5.4.8/src/lobject.h /^ Node *node;$/;" m struct:Table typeref:typename:Node * +nodefromval vendor/lua-5.4.8/src/ltable.h /^#define nodefromval(/;" d +noenv vendor/lua-5.4.8/src/loadlib.c /^static int noenv (lua_State *L) {$/;" f typeref:typename:int file: +normal vendor/raylib-5.5_linux_amd64/include/raylib.h /^ Vector3 normal; \/\/ Surface normal of hit$/;" m struct:RayCollision typeref:typename:Vector3 +normals vendor/raylib-5.5_linux_amd64/include/raylib.h /^ float *normals; \/\/ Vertex normals (XYZ - 3 components per vertex) (shader-location/;" m struct:Mesh typeref:typename:float * +normals vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ float *normals; \/\/ Vertex normal (XYZ - 3 components per vertex) (shader-locat/;" m struct:rlVertexBuffer typeref:typename:float * +normalx vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ float normalx, normaly, normalz; \/\/ Current active normal (added on glVertex*())$/;" m struct:rlglData::__anon1f68b8bd0d08 typeref:typename:float +normaly vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ float normalx, normaly, normalz; \/\/ Current active normal (added on glVertex*())$/;" m struct:rlglData::__anon1f68b8bd0d08 typeref:typename:float +normalz vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ float normalx, normaly, normalz; \/\/ Current active normal (added on glVertex*())$/;" m struct:rlglData::__anon1f68b8bd0d08 typeref:typename:float +nospecials vendor/lua-5.4.8/src/lstrlib.c /^static int nospecials (const char *p, size_t l) {$/;" f typeref:typename:int file: +notm vendor/lua-5.4.8/src/ltm.h /^#define notm(/;" d +novariant vendor/lua-5.4.8/src/lobject.h /^#define novariant(/;" d +np vendor/lua-5.4.8/src/lparser.h /^ int np; \/* number of elements in 'p' *\/$/;" m struct:FuncState typeref:typename:int +nparams vendor/lua-5.4.8/src/lua.h /^ unsigned char nparams;\/* (u) number of parameters *\/$/;" m struct:lua_Debug typeref:typename:unsigned char +nres vendor/lua-5.4.8/src/lstate.h /^ int nres; \/* number of values returned *\/$/;" m union:CallInfo::__anona701f1f7040a typeref:typename:int +nresults vendor/lua-5.4.8/src/lapi.c /^ int nresults;$/;" m struct:CallS typeref:typename:int file: +nresults vendor/lua-5.4.8/src/lstate.h /^ short nresults; \/* expected number of results from this function *\/$/;" m struct:CallInfo typeref:typename:short +ntransfer vendor/lua-5.4.8/src/lstate.h /^ unsigned short ntransfer; \/* number of values transferred *\/$/;" m struct:CallInfo::__anona701f1f7040a::__anona701f1f70508 typeref:typename:unsigned short +ntransfer vendor/lua-5.4.8/src/lua.h /^ unsigned short ntransfer; \/* (r) number of transferred values *\/$/;" m struct:lua_Debug typeref:typename:unsigned short +num2straux vendor/lua-5.4.8/src/lstrlib.c /^static int num2straux (char *buff, int sz, lua_Number x) {$/;" f typeref:typename:int file: +numarith vendor/lua-5.4.8/src/lobject.c /^static lua_Number numarith (lua_State *L, int op, lua_Number v1,$/;" f typeref:typename:lua_Number file: +numparams vendor/lua-5.4.8/src/lobject.h /^ lu_byte numparams; \/* number of fixed (named) parameters *\/$/;" m struct:Proto typeref:typename:lu_byte +numusearray vendor/lua-5.4.8/src/ltable.c /^static unsigned int numusearray (const Table *t, unsigned int *nums) {$/;" f typeref:typename:unsigned int file: +numusehash vendor/lua-5.4.8/src/ltable.c /^static int numusehash (const Table *t, unsigned int *nums, unsigned int *pna) {$/;" f typeref:typename:int file: +nups vendor/lua-5.4.8/src/lparser.h /^ lu_byte nups; \/* number of upvalues *\/$/;" m struct:FuncState typeref:typename:lu_byte +nups vendor/lua-5.4.8/src/lua.h /^ unsigned char nups; \/* (u) number of upvalues *\/$/;" m struct:lua_Debug typeref:typename:unsigned char +nuse vendor/lua-5.4.8/src/lstate.h /^ int nuse; \/* number of elements *\/$/;" m struct:stringtable typeref:typename:int +nuvalue vendor/lua-5.4.8/src/lobject.h /^ unsigned short nuvalue; \/* number of user values *\/$/;" m struct:Udata typeref:typename:unsigned short +nuvalue vendor/lua-5.4.8/src/lobject.h /^ unsigned short nuvalue; \/* number of user values *\/$/;" m struct:Udata0 typeref:typename:unsigned short +nval vendor/lua-5.4.8/src/lparser.h /^ lua_Number nval; \/* for VKFLT *\/$/;" m union:expdesc::__anon337ee443020a typeref:typename:lua_Number +nvalue vendor/lua-5.4.8/src/lobject.h /^#define nvalue(/;" d +nw2black vendor/lua-5.4.8/src/lgc.h /^#define nw2black(/;" d +nyci vendor/lua-5.4.8/src/lstate.h /^#define nyci /;" d +nyield vendor/lua-5.4.8/src/lstate.h /^ int nyield; \/* number of values yielded *\/$/;" m union:CallInfo::__anona701f1f7040a typeref:typename:int +o vendor/lua-5.4.8/src/Makefile /^o: $(ALL_O)$/;" t +obj2gco vendor/lua-5.4.8/src/lstate.h /^#define obj2gco(/;" d +offset vendor/lua-5.4.8/src/lobject.h /^ ptrdiff_t offset; \/* used while the stack is being reallocated *\/$/;" m union:UpVal::__anon808f9fcd050a typeref:typename:ptrdiff_t +offset vendor/lua-5.4.8/src/lobject.h /^ ptrdiff_t offset; \/* used while the stack is being reallocated *\/$/;" m union:__anon808f9fcd020a typeref:typename:ptrdiff_t +offset vendor/raylib-5.5_linux_amd64/include/raylib.h /^ Vector2 offset; \/\/ Camera offset (displacement from target)$/;" m struct:Camera2D typeref:typename:Vector2 +offsetX vendor/raylib-5.5_linux_amd64/include/raylib.h /^ int offsetX; \/\/ Character offset X when drawing$/;" m struct:GlyphInfo typeref:typename:int +offsetY vendor/raylib-5.5_linux_amd64/include/raylib.h /^ int offsetY; \/\/ Character offset Y when drawing$/;" m struct:GlyphInfo typeref:typename:int +old1 vendor/lua-5.4.8/src/lstate.h /^ GCObject *old1; \/* start of old1 objects *\/$/;" m struct:global_State typeref:typename:GCObject * +old_errfunc vendor/lua-5.4.8/src/lstate.h /^ ptrdiff_t old_errfunc;$/;" m struct:CallInfo::__anona701f1f7010a::__anona701f1f70308 typeref:typename:ptrdiff_t +oldpc vendor/lua-5.4.8/src/lstate.h /^ int oldpc; \/* last pc traced *\/$/;" m struct:lua_State typeref:typename:int +op_arith vendor/lua-5.4.8/src/lvm.c /^#define op_arith(/;" d file: +op_arithI vendor/lua-5.4.8/src/lvm.c /^#define op_arithI(/;" d file: +op_arithK vendor/lua-5.4.8/src/lvm.c /^#define op_arithK(/;" d file: +op_arith_aux vendor/lua-5.4.8/src/lvm.c /^#define op_arith_aux(/;" d file: +op_arithf vendor/lua-5.4.8/src/lvm.c /^#define op_arithf(/;" d file: +op_arithfK vendor/lua-5.4.8/src/lvm.c /^#define op_arithfK(/;" d file: +op_arithf_aux vendor/lua-5.4.8/src/lvm.c /^#define op_arithf_aux(/;" d file: +op_bitwise vendor/lua-5.4.8/src/lvm.c /^#define op_bitwise(/;" d file: +op_bitwiseK vendor/lua-5.4.8/src/lvm.c /^#define op_bitwiseK(/;" d file: +op_order vendor/lua-5.4.8/src/lvm.c /^#define op_order(/;" d file: +op_orderI vendor/lua-5.4.8/src/lvm.c /^#define op_orderI(/;" d file: +open vendor/lua-5.4.8/src/lobject.h /^ } open;$/;" m union:UpVal::__anon808f9fcd060a typeref:struct:UpVal::__anon808f9fcd060a::__anon808f9fcd0708 +open_func vendor/lua-5.4.8/src/lparser.c /^static void open_func (LexState *ls, FuncState *fs, BlockCnt *bl) {$/;" f typeref:typename:void file: +opencheck vendor/lua-5.4.8/src/liolib.c /^static void opencheck (lua_State *L, const char *fname, const char *mode) {$/;" f typeref:typename:void file: +openupval vendor/lua-5.4.8/src/lstate.h /^ UpVal *openupval; \/* list of open upvalues in this stack *\/$/;" m struct:lua_State typeref:typename:UpVal * +operator != vendor/raylib-5.5_linux_amd64/include/raymath.h /^inline bool operator != (const Vector2& lhs, const Vector2& rhs)$/;" f typeref:typename:bool +operator != vendor/raylib-5.5_linux_amd64/include/raymath.h /^inline bool operator != (const Vector3& lhs, const Vector3& rhs)$/;" f typeref:typename:bool +operator != vendor/raylib-5.5_linux_amd64/include/raymath.h /^inline bool operator != (const Vector4& lhs, const Vector4& rhs)$/;" f typeref:typename:bool +operator * vendor/raylib-5.5_linux_amd64/include/raymath.h /^inline Matrix operator * (const Matrix& lhs, const Matrix& rhs)$/;" f typeref:typename:Matrix +operator * vendor/raylib-5.5_linux_amd64/include/raymath.h /^inline Quaternion operator * (const Quaternion& lhs, const Matrix& rhs)$/;" f typeref:typename:Quaternion +operator * vendor/raylib-5.5_linux_amd64/include/raymath.h /^inline Vector2 operator * (const Vector2& lhs, const Matrix& rhs)$/;" f typeref:typename:Vector2 +operator * vendor/raylib-5.5_linux_amd64/include/raymath.h /^inline Vector2 operator * (const Vector2& lhs, const Vector2& rhs)$/;" f typeref:typename:Vector2 +operator * vendor/raylib-5.5_linux_amd64/include/raymath.h /^inline Vector2 operator * (const Vector2& lhs, const float& rhs)$/;" f typeref:typename:Vector2 +operator * vendor/raylib-5.5_linux_amd64/include/raymath.h /^inline Vector3 operator * (const Vector3& lhs, const Matrix& rhs)$/;" f typeref:typename:Vector3 +operator * vendor/raylib-5.5_linux_amd64/include/raymath.h /^inline Vector3 operator * (const Vector3& lhs, const Vector3& rhs)$/;" f typeref:typename:Vector3 +operator * vendor/raylib-5.5_linux_amd64/include/raymath.h /^inline Vector3 operator * (const Vector3& lhs, const float& rhs)$/;" f typeref:typename:Vector3 +operator * vendor/raylib-5.5_linux_amd64/include/raymath.h /^inline Vector4 operator * (const Vector4& lhs, const Vector4& rhs)$/;" f typeref:typename:Vector4 +operator * vendor/raylib-5.5_linux_amd64/include/raymath.h /^inline Vector4 operator * (const Vector4& lhs, const float& rhs)$/;" f typeref:typename:Vector4 +operator *= vendor/raylib-5.5_linux_amd64/include/raymath.h /^inline const Matrix& operator *= (Matrix& lhs, const Matrix& rhs)$/;" f typeref:typename:const Matrix & +operator *= vendor/raylib-5.5_linux_amd64/include/raymath.h /^inline const Quaternion& operator *= (Quaternion& lhs, const Matrix& rhs)$/;" f typeref:typename:const Quaternion & +operator *= vendor/raylib-5.5_linux_amd64/include/raymath.h /^inline const Vector2& operator *= (Vector2& lhs, const Vector2& rhs)$/;" f typeref:typename:const Vector2 & +operator *= vendor/raylib-5.5_linux_amd64/include/raymath.h /^inline const Vector2& operator *= (Vector2& lhs, const float& rhs)$/;" f typeref:typename:const Vector2 & +operator *= vendor/raylib-5.5_linux_amd64/include/raymath.h /^inline const Vector3& operator *= (Vector3& lhs, const Vector3& rhs)$/;" f typeref:typename:const Vector3 & +operator *= vendor/raylib-5.5_linux_amd64/include/raymath.h /^inline const Vector3& operator *= (Vector3& lhs, const float& rhs)$/;" f typeref:typename:const Vector3 & +operator *= vendor/raylib-5.5_linux_amd64/include/raymath.h /^inline const Vector4& operator *= (Vector4& lhs, const Vector4& rhs)$/;" f typeref:typename:const Vector4 & +operator *= vendor/raylib-5.5_linux_amd64/include/raymath.h /^inline const Vector4& operator *= (Vector4& lhs, const float& rhs)$/;" f typeref:typename:const Vector4 & +operator + vendor/raylib-5.5_linux_amd64/include/raymath.h /^inline Matrix operator + (const Matrix& lhs, const Matrix& rhs)$/;" f typeref:typename:Matrix +operator + vendor/raylib-5.5_linux_amd64/include/raymath.h /^inline Quaternion operator + (const Quaternion& lhs, const float& rhs)$/;" f typeref:typename:Quaternion +operator + vendor/raylib-5.5_linux_amd64/include/raymath.h /^inline Vector2 operator + (const Vector2& lhs, const Vector2& rhs)$/;" f typeref:typename:Vector2 +operator + vendor/raylib-5.5_linux_amd64/include/raymath.h /^inline Vector3 operator + (const Vector3& lhs, const Vector3& rhs)$/;" f typeref:typename:Vector3 +operator + vendor/raylib-5.5_linux_amd64/include/raymath.h /^inline Vector4 operator + (const Vector4& lhs, const Vector4& rhs)$/;" f typeref:typename:Vector4 +operator += vendor/raylib-5.5_linux_amd64/include/raymath.h /^inline const Matrix& operator += (Matrix& lhs, const Matrix& rhs)$/;" f typeref:typename:const Matrix & +operator += vendor/raylib-5.5_linux_amd64/include/raymath.h /^inline const Quaternion& operator += (Quaternion& lhs, const float& rhs)$/;" f typeref:typename:const Quaternion & +operator += vendor/raylib-5.5_linux_amd64/include/raymath.h /^inline const Vector2& operator += (Vector2& lhs, const Vector2& rhs)$/;" f typeref:typename:const Vector2 & +operator += vendor/raylib-5.5_linux_amd64/include/raymath.h /^inline const Vector3& operator += (Vector3& lhs, const Vector3& rhs)$/;" f typeref:typename:const Vector3 & +operator += vendor/raylib-5.5_linux_amd64/include/raymath.h /^inline const Vector4& operator += (Vector4& lhs, const Vector4& rhs)$/;" f typeref:typename:const Vector4 & +operator - vendor/raylib-5.5_linux_amd64/include/raymath.h /^inline Matrix operator - (const Matrix& lhs, const Matrix& rhs)$/;" f typeref:typename:Matrix +operator - vendor/raylib-5.5_linux_amd64/include/raymath.h /^inline Quaternion operator - (const Quaternion& lhs, const float& rhs)$/;" f typeref:typename:Quaternion +operator - vendor/raylib-5.5_linux_amd64/include/raymath.h /^inline Vector2 operator - (const Vector2& lhs, const Vector2& rhs)$/;" f typeref:typename:Vector2 +operator - vendor/raylib-5.5_linux_amd64/include/raymath.h /^inline Vector3 operator - (const Vector3& lhs, const Vector3& rhs)$/;" f typeref:typename:Vector3 +operator - vendor/raylib-5.5_linux_amd64/include/raymath.h /^inline Vector4 operator - (const Vector4& lhs, const Vector4& rhs)$/;" f typeref:typename:Vector4 +operator -= vendor/raylib-5.5_linux_amd64/include/raymath.h /^inline const Matrix& operator -= (Matrix& lhs, const Matrix& rhs)$/;" f typeref:typename:const Matrix & +operator -= vendor/raylib-5.5_linux_amd64/include/raymath.h /^inline const Quaternion& operator -= (Quaternion& lhs, const float& rhs)$/;" f typeref:typename:const Quaternion & +operator -= vendor/raylib-5.5_linux_amd64/include/raymath.h /^inline const Vector2& operator -= (Vector2& lhs, const Matrix& rhs)$/;" f typeref:typename:const Vector2 & +operator -= vendor/raylib-5.5_linux_amd64/include/raymath.h /^inline const Vector2& operator -= (Vector2& lhs, const Vector2& rhs)$/;" f typeref:typename:const Vector2 & +operator -= vendor/raylib-5.5_linux_amd64/include/raymath.h /^inline const Vector3& operator -= (Vector3& lhs, const Matrix& rhs)$/;" f typeref:typename:const Vector3 & +operator -= vendor/raylib-5.5_linux_amd64/include/raymath.h /^inline const Vector3& operator -= (Vector3& lhs, const Vector3& rhs)$/;" f typeref:typename:const Vector3 & +operator -= vendor/raylib-5.5_linux_amd64/include/raymath.h /^inline const Vector4& operator -= (Vector4& lhs, const Vector4& rhs)$/;" f typeref:typename:const Vector4 & +operator / vendor/raylib-5.5_linux_amd64/include/raymath.h /^inline Vector2 operator \/ (const Vector2& lhs, const Vector2& rhs)$/;" f typeref:typename:Vector2 +operator / vendor/raylib-5.5_linux_amd64/include/raymath.h /^inline Vector2 operator \/ (const Vector2& lhs, const float& rhs)$/;" f typeref:typename:Vector2 +operator / vendor/raylib-5.5_linux_amd64/include/raymath.h /^inline Vector3 operator \/ (const Vector3& lhs, const Vector3& rhs)$/;" f typeref:typename:Vector3 +operator / vendor/raylib-5.5_linux_amd64/include/raymath.h /^inline Vector3 operator \/ (const Vector3& lhs, const float& rhs)$/;" f typeref:typename:Vector3 +operator / vendor/raylib-5.5_linux_amd64/include/raymath.h /^inline Vector4 operator \/ (const Vector4& lhs, const Vector4& rhs)$/;" f typeref:typename:Vector4 +operator / vendor/raylib-5.5_linux_amd64/include/raymath.h /^inline Vector4 operator \/ (const Vector4& lhs, const float& rhs)$/;" f typeref:typename:Vector4 +operator /= vendor/raylib-5.5_linux_amd64/include/raymath.h /^inline const Vector2& operator \/= (Vector2& lhs, const Vector2& rhs)$/;" f typeref:typename:const Vector2 & +operator /= vendor/raylib-5.5_linux_amd64/include/raymath.h /^inline const Vector2& operator \/= (Vector2& lhs, const float& rhs)$/;" f typeref:typename:const Vector2 & +operator /= vendor/raylib-5.5_linux_amd64/include/raymath.h /^inline const Vector3& operator \/= (Vector3& lhs, const Vector3& rhs)$/;" f typeref:typename:const Vector3 & +operator /= vendor/raylib-5.5_linux_amd64/include/raymath.h /^inline const Vector3& operator \/= (Vector3& lhs, const float& rhs)$/;" f typeref:typename:const Vector3 & +operator /= vendor/raylib-5.5_linux_amd64/include/raymath.h /^inline const Vector4& operator \/= (Vector4& lhs, const Vector4& rhs)$/;" f typeref:typename:const Vector4 & +operator /= vendor/raylib-5.5_linux_amd64/include/raymath.h /^inline const Vector4& operator \/= (Vector4& lhs, const float& rhs)$/;" f typeref:typename:const Vector4 & +operator == vendor/raylib-5.5_linux_amd64/include/raymath.h /^inline bool operator == (const Vector2& lhs, const Vector2& rhs)$/;" f typeref:typename:bool +operator == vendor/raylib-5.5_linux_amd64/include/raymath.h /^inline bool operator == (const Vector3& lhs, const Vector3& rhs)$/;" f typeref:typename:bool +operator == vendor/raylib-5.5_linux_amd64/include/raymath.h /^inline bool operator == (const Vector4& lhs, const Vector4& rhs)$/;" f typeref:typename:bool +opmode vendor/lua-5.4.8/src/lopcodes.h /^#define opmode(/;" d +opnames vendor/lua-5.4.8/src/lopnames.h /^static const char *const opnames[] = {$/;" v typeref:typename:const char * const[] +os_clock vendor/lua-5.4.8/src/loslib.c /^static int os_clock (lua_State *L) {$/;" f typeref:typename:int file: +os_date vendor/lua-5.4.8/src/loslib.c /^static int os_date (lua_State *L) {$/;" f typeref:typename:int file: +os_difftime vendor/lua-5.4.8/src/loslib.c /^static int os_difftime (lua_State *L) {$/;" f typeref:typename:int file: +os_execute vendor/lua-5.4.8/src/loslib.c /^static int os_execute (lua_State *L) {$/;" f typeref:typename:int file: +os_exit vendor/lua-5.4.8/src/loslib.c /^static int os_exit (lua_State *L) {$/;" f typeref:typename:int file: +os_getenv vendor/lua-5.4.8/src/loslib.c /^static int os_getenv (lua_State *L) {$/;" f typeref:typename:int file: +os_remove vendor/lua-5.4.8/src/loslib.c /^static int os_remove (lua_State *L) {$/;" f typeref:typename:int file: +os_rename vendor/lua-5.4.8/src/loslib.c /^static int os_rename (lua_State *L) {$/;" f typeref:typename:int file: +os_setlocale vendor/lua-5.4.8/src/loslib.c /^static int os_setlocale (lua_State *L) {$/;" f typeref:typename:int file: +os_time vendor/lua-5.4.8/src/loslib.c /^static int os_time (lua_State *L) {$/;" f typeref:typename:int file: +os_tmpname vendor/lua-5.4.8/src/loslib.c /^static int os_tmpname (lua_State *L) {$/;" f typeref:typename:int file: +otherwhite vendor/lua-5.4.8/src/lgc.h /^#define otherwhite(/;" d +output vendor/lua-5.4.8/src/luac.c /^static const char* output=Output; \/* actual output file name *\/$/;" v typeref:typename:const char * file: +p vendor/lua-5.4.8/src/lobject.h /^ TValue *p; \/* points to stack or to its own value *\/$/;" m union:UpVal::__anon808f9fcd050a typeref:typename:TValue * +p vendor/lua-5.4.8/src/lobject.h /^ StkId p; \/* actual pointer *\/$/;" m union:__anon808f9fcd020a typeref:typename:StkId +p vendor/lua-5.4.8/src/lobject.h /^ struct Proto **p; \/* functions defined inside the function *\/$/;" m struct:Proto typeref:struct:Proto ** +p vendor/lua-5.4.8/src/lobject.h /^ struct Proto *p;$/;" m struct:LClosure typeref:struct:Proto * +p vendor/lua-5.4.8/src/lobject.h /^ void *p; \/* light userdata *\/$/;" m union:Value typeref:typename:void * +p vendor/lua-5.4.8/src/lstate.h /^ struct Proto p;$/;" m union:GCUnion typeref:struct:Proto +p vendor/lua-5.4.8/src/lstrlib.c /^ const char *p; \/* pattern *\/$/;" m struct:GMatchState typeref:typename:const char * file: +p vendor/lua-5.4.8/src/lzio.h /^ const char *p; \/* current position in buffer *\/$/;" m struct:Zio typeref:typename:const char * +p_end vendor/lua-5.4.8/src/lstrlib.c /^ const char *p_end; \/* end ('\\0') of pattern *\/$/;" m struct:MatchState typeref:typename:const char * file: +packI vendor/lua-5.4.8/src/lmathlib.c /^static Rand64 packI (lu_int32 h, lu_int32 l) {$/;" f typeref:typename:Rand64 file: +packint vendor/lua-5.4.8/src/lstrlib.c /^static void packint (luaL_Buffer *b, lua_Unsigned n,$/;" f typeref:typename:void file: +pairscont vendor/lua-5.4.8/src/lbaselib.c /^static int pairscont (lua_State *L, int status, lua_KContext k) {$/;" f typeref:typename:int file: +panic vendor/lua-5.4.8/src/lauxlib.c /^static int panic (lua_State *L) {$/;" f typeref:typename:int file: +panic vendor/lua-5.4.8/src/lstate.h /^ lua_CFunction panic; \/* to be called in unprotected errors *\/$/;" m struct:global_State typeref:typename:lua_CFunction +params vendor/raylib-5.5_linux_amd64/include/raylib.h /^ float params[4]; \/\/ Material generic parameters (if required)$/;" m struct:Material typeref:typename:float[4] +params vendor/raylib-5.5_linux_amd64/include/raylib.h /^ int params[4]; \/\/ Event parameters (if required)$/;" m struct:AutomationEvent typeref:typename:int[4] +parent vendor/raylib-5.5_linux_amd64/include/raylib.h /^ int parent; \/\/ Bone parent$/;" m struct:BoneInfo typeref:typename:int +parlist vendor/lua-5.4.8/src/lparser.c /^static void parlist (LexState *ls) {$/;" f typeref:typename:void file: +partition vendor/lua-5.4.8/src/ltablib.c /^static IdxT partition (lua_State *L, IdxT lo, IdxT up) {$/;" f typeref:typename:IdxT file: +patchlistaux vendor/lua-5.4.8/src/lcode.c /^static void patchlistaux (FuncState *fs, int list, int vtarget, int reg,$/;" f typeref:typename:void file: +patchtestreg vendor/lua-5.4.8/src/lcode.c /^static int patchtestreg (FuncState *fs, int node, int reg) {$/;" f typeref:typename:int file: +paths vendor/raylib-5.5_linux_amd64/include/raylib.h /^ char **paths; \/\/ Filepaths entries$/;" m struct:FilePathList typeref:typename:char ** +pc vendor/lua-5.4.8/Makefile /^pc:$/;" t +pc vendor/lua-5.4.8/src/lobject.h /^ int pc;$/;" m struct:AbsLineInfo typeref:typename:int +pc vendor/lua-5.4.8/src/lparser.h /^ int pc; \/* next position to code (equivalent to 'ncode') *\/$/;" m struct:FuncState typeref:typename:int +pc vendor/lua-5.4.8/src/lparser.h /^ int pc; \/* position in code *\/$/;" m struct:Labeldesc typeref:typename:int +pcRel vendor/lua-5.4.8/src/ldebug.h /^#define pcRel(/;" d +pidx vendor/lua-5.4.8/src/lparser.h /^ short pidx; \/* index of the variable in the Proto's 'locvars' array *\/$/;" m struct:Vardesc::__anon337ee4430508 typeref:typename:short +pk_funcs vendor/lua-5.4.8/src/loadlib.c /^static const luaL_Reg pk_funcs[] = {$/;" v typeref:typename:const luaL_Reg[] file: +pmain vendor/lua-5.4.8/src/lua.c /^static int pmain (lua_State *L) {$/;" f typeref:typename:int file: +pmain vendor/lua-5.4.8/src/luac.c /^static int pmain(lua_State* L)$/;" f typeref:typename:int file: +point vendor/raylib-5.5_linux_amd64/include/raylib.h /^ Vector3 point; \/\/ Point of the nearest hit$/;" m struct:RayCollision typeref:typename:Vector3 +point2uint vendor/lua-5.4.8/src/llimits.h /^#define point2uint(/;" d +poptbclist vendor/lua-5.4.8/src/lfunc.c /^static void poptbclist (lua_State *L) {$/;" f typeref:typename:void file: +position vendor/raylib-5.5_linux_amd64/include/raylib.h /^ Vector3 position; \/\/ Camera position$/;" m struct:Camera3D typeref:typename:Vector3 +position vendor/raylib-5.5_linux_amd64/include/raylib.h /^ Vector3 position; \/\/ Ray position (origin)$/;" m struct:Ray typeref:typename:Vector3 +posix vendor/lua-5.4.8/src/Makefile /^posix:$/;" t +posrelatI vendor/lua-5.4.8/src/lstrlib.c /^static size_t posrelatI (lua_Integer pos, size_t len) {$/;" f typeref:typename:size_t file: +precallC vendor/lua-5.4.8/src/ldo.c /^l_sinline int precallC (lua_State *L, StkId func, int nresults,$/;" f typeref:typename:l_sinline int +precover vendor/lua-5.4.8/src/ldo.c /^static int precover (lua_State *L, int status) {$/;" f typeref:typename:int file: +preinit_thread vendor/lua-5.4.8/src/lstate.c /^static void preinit_thread (lua_State *L, global_State *g) {$/;" f typeref:typename:void file: +prepCallInfo vendor/lua-5.4.8/src/ldo.c /^l_sinline CallInfo *prepCallInfo (lua_State *L, StkId func, int nret,$/;" f typeref:typename:l_sinline CallInfo * +prepbuffsize vendor/lua-5.4.8/src/lauxlib.c /^static char *prepbuffsize (luaL_Buffer *B, size_t sz, int boxidx) {$/;" f typeref:typename:char * file: +prepcallclosemth vendor/lua-5.4.8/src/lfunc.c /^static void prepcallclosemth (lua_State *L, StkId level, int status, int yy) {$/;" f typeref:typename:void file: +prepstate vendor/lua-5.4.8/src/lstrlib.c /^static void prepstate (MatchState *ms, lua_State *L,$/;" f typeref:typename:void file: +prev vendor/lua-5.4.8/src/lparser.c /^ struct LHS_assign *prev;$/;" m struct:LHS_assign typeref:struct:LHS_assign * file: +prev vendor/lua-5.4.8/src/lparser.h /^ struct FuncState *prev; \/* enclosing function *\/$/;" m struct:FuncState typeref:struct:FuncState * +previous vendor/lua-5.4.8/src/ldo.c /^ struct lua_longjmp *previous;$/;" m struct:lua_longjmp typeref:struct:lua_longjmp * file: +previous vendor/lua-5.4.8/src/lobject.h /^ struct UpVal **previous;$/;" m struct:UpVal::__anon808f9fcd060a::__anon808f9fcd0708 typeref:struct:UpVal ** +previous vendor/lua-5.4.8/src/lparser.c /^ struct BlockCnt *previous; \/* chain *\/$/;" m struct:BlockCnt typeref:struct:BlockCnt * file: +previous vendor/lua-5.4.8/src/lstate.h /^ struct CallInfo *previous, *next; \/* dynamic call link *\/$/;" m struct:CallInfo typeref:struct:CallInfo * +previousinstruction vendor/lua-5.4.8/src/lcode.c /^static Instruction *previousinstruction (FuncState *fs) {$/;" f typeref:typename:Instruction * file: +previousline vendor/lua-5.4.8/src/lparser.h /^ int previousline; \/* last line that was saved in 'lineinfo' *\/$/;" m struct:FuncState typeref:typename:int +primaryexp vendor/lua-5.4.8/src/lparser.c /^static void primaryexp (LexState *ls, expdesc *v) {$/;" f typeref:typename:void file: +print_usage vendor/lua-5.4.8/src/lua.c /^static void print_usage (const char *badoption) {$/;" f typeref:typename:void file: +print_version vendor/lua-5.4.8/src/lua.c /^static void print_version (void) {$/;" f typeref:typename:void file: +priority vendor/lua-5.4.8/src/lparser.c /^} priority[] = { \/* ORDER OPR *\/$/;" v typeref:typename:const struct __anon337ee43e0108[] +processor vendor/raylib-5.5_linux_amd64/include/raylib.h /^ rAudioProcessor *processor; \/\/ Pointer to internal data processor, useful for audio effect/;" m struct:AudioStream typeref:typename:rAudioProcessor * +progname vendor/lua-5.4.8/src/lua.c /^static const char *progname = LUA_PROGNAME;$/;" v typeref:typename:const char * file: +progname vendor/lua-5.4.8/src/luac.c /^static const char* progname=PROGNAME; \/* actual program name *\/$/;" v typeref:typename:const char * file: +project vendor/lua-5.4.8/src/lmathlib.c /^static lua_Unsigned project (lua_Unsigned ran, lua_Unsigned n,$/;" f typeref:typename:lua_Unsigned file: +projection vendor/raylib-5.5_linux_amd64/include/raylib.h /^ Matrix projection[2]; \/\/ VR projection matrices (per eye)$/;" m struct:VrStereoConfig typeref:typename:Matrix[2] +projection vendor/raylib-5.5_linux_amd64/include/raylib.h /^ int projection; \/\/ Camera projection: CAMERA_PERSPECTIVE or CAMERA_ORTHOGRAPHIC$/;" m struct:Camera3D typeref:typename:int +projection vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ Matrix projection; \/\/ Default projection matrix$/;" m struct:rlglData::__anon1f68b8bd0d08 typeref:typename:Matrix +projectionStereo vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ Matrix projectionStereo[2]; \/\/ VR stereo rendering eyes projection matrices$/;" m struct:rlglData::__anon1f68b8bd0d08 typeref:typename:Matrix[2] +propagateall vendor/lua-5.4.8/src/lgc.c /^static lu_mem propagateall (global_State *g) {$/;" f typeref:typename:lu_mem file: +propagatemark vendor/lua-5.4.8/src/lgc.c /^static lu_mem propagatemark (global_State *g) {$/;" f typeref:typename:lu_mem file: +push_captures vendor/lua-5.4.8/src/lstrlib.c /^static int push_captures (MatchState *ms, const char *s, const char *e) {$/;" f typeref:typename:int file: +push_onecapture vendor/lua-5.4.8/src/lstrlib.c /^static void push_onecapture (MatchState *ms, int i, const char *s,$/;" f typeref:typename:void file: +pushargs vendor/lua-5.4.8/src/lua.c /^static int pushargs (lua_State *L) {$/;" f typeref:typename:int file: +pushclosure vendor/lua-5.4.8/src/lvm.c /^static void pushclosure (lua_State *L, Proto *p, UpVal **encup, StkId base,$/;" f typeref:typename:void file: +pushed vendor/lua-5.4.8/src/lobject.c /^ int pushed; \/* true if there is a part of the result on the stack *\/$/;" m struct:BuffFS typeref:typename:int file: +pusherror vendor/lua-5.4.8/src/loadlib.c /^static void pusherror (lua_State *L) {$/;" f typeref:typename:void file: +pusherrornotfound vendor/lua-5.4.8/src/loadlib.c /^static void pusherrornotfound (lua_State *L, const char *path) {$/;" f typeref:typename:void file: +pushfuncname vendor/lua-5.4.8/src/lauxlib.c /^static void pushfuncname (lua_State *L, lua_Debug *ar) {$/;" f typeref:typename:void file: +pushglobalfuncname vendor/lua-5.4.8/src/lauxlib.c /^static int pushglobalfuncname (lua_State *L, lua_Debug *ar) {$/;" f typeref:typename:int file: +pushline vendor/lua-5.4.8/src/lua.c /^static int pushline (lua_State *L, int firstline) {$/;" f typeref:typename:int file: +pushmode vendor/lua-5.4.8/src/lbaselib.c /^static int pushmode (lua_State *L, int oldmode) {$/;" f typeref:typename:int file: +pushnumint vendor/lua-5.4.8/src/lmathlib.c /^static void pushnumint (lua_State *L, lua_Number d) {$/;" f typeref:typename:void file: +pushstr vendor/lua-5.4.8/src/lobject.c /^static void pushstr (BuffFS *buff, const char *str, size_t lstr) {$/;" f typeref:typename:void file: +pushutfchar vendor/lua-5.4.8/src/lutf8lib.c /^static void pushutfchar (lua_State *L, int arg) {$/;" f typeref:typename:void file: +pvalue vendor/lua-5.4.8/src/lobject.h /^#define pvalue(/;" d +pvalueraw vendor/lua-5.4.8/src/lobject.h /^#define pvalueraw(/;" d +quotefloat vendor/lua-5.4.8/src/lstrlib.c /^static int quotefloat (lua_State *L, char *buff, lua_Number n) {$/;" f typeref:typename:int file: +r vendor/lua-5.4.8/src/llex.h /^ lua_Number r;$/;" m union:__anonfc1a02ff010a typeref:typename:lua_Number +r vendor/raylib-5.5_linux_amd64/include/raylib.h /^ unsigned char r; \/\/ Color red value$/;" m struct:Color typeref:typename:unsigned char +rAudioBuffer vendor/raylib-5.5_linux_amd64/include/raylib.h /^typedef struct rAudioBuffer rAudioBuffer;$/;" t typeref:struct:rAudioBuffer +rAudioProcessor vendor/raylib-5.5_linux_amd64/include/raylib.h /^typedef struct rAudioProcessor rAudioProcessor;$/;" t typeref:struct:rAudioProcessor +randfuncs vendor/lua-5.4.8/src/lmathlib.c /^static const luaL_Reg randfuncs[] = {$/;" v typeref:typename:const luaL_Reg[] file: +randseed vendor/lua-5.4.8/src/lmathlib.c /^static void randseed (lua_State *L, RanState *state) {$/;" f typeref:typename:void file: +rawtt vendor/lua-5.4.8/src/lobject.h /^#define rawtt(/;" d +read_all vendor/lua-5.4.8/src/liolib.c /^static void read_all (lua_State *L, FILE *f) {$/;" f typeref:typename:void file: +read_chars vendor/lua-5.4.8/src/liolib.c /^static int read_chars (lua_State *L, FILE *f, size_t n) {$/;" f typeref:typename:int file: +read_line vendor/lua-5.4.8/src/liolib.c /^static int read_line (lua_State *L, FILE *f, int chop) {$/;" f typeref:typename:int file: +read_long_string vendor/lua-5.4.8/src/llex.c /^static void read_long_string (LexState *ls, SemInfo *seminfo, size_t sep) {$/;" f typeref:typename:void file: +read_number vendor/lua-5.4.8/src/liolib.c /^static int read_number (lua_State *L, FILE *f) {$/;" f typeref:typename:int file: +read_numeral vendor/lua-5.4.8/src/llex.c /^static int read_numeral (LexState *ls, SemInfo *seminfo) {$/;" f typeref:typename:int file: +read_string vendor/lua-5.4.8/src/llex.c /^static void read_string (LexState *ls, int del, SemInfo *seminfo) {$/;" f typeref:typename:void file: +readable vendor/lua-5.4.8/src/loadlib.c /^static int readable (const char *filename) {$/;" f typeref:typename:int file: +readdecesc vendor/lua-5.4.8/src/llex.c /^static int readdecesc (LexState *ls) {$/;" f typeref:typename:int file: +readdigits vendor/lua-5.4.8/src/liolib.c /^static int readdigits (RN *rn, int hex) {$/;" f typeref:typename:int file: +reader vendor/lua-5.4.8/src/luac.c /^static const char* reader(lua_State* L, void* ud, size_t* size)$/;" f typeref:typename:const char * file: +reader vendor/lua-5.4.8/src/lzio.h /^ lua_Reader reader; \/* reader function *\/$/;" m struct:Zio typeref:typename:lua_Reader +readhexaesc vendor/lua-5.4.8/src/llex.c /^static int readhexaesc (LexState *ls) {$/;" f typeref:typename:int file: +readutf8esc vendor/lua-5.4.8/src/llex.c /^static unsigned long readutf8esc (LexState *ls) {$/;" f typeref:typename:unsigned long file: +reallymarkobject vendor/lua-5.4.8/src/lgc.c /^static void reallymarkobject (global_State *g, GCObject *o) {$/;" f typeref:typename:void file: +reallymarkobject vendor/lua-5.4.8/src/lgc.c /^static void reallymarkobject (global_State *g, GCObject *o);$/;" p typeref:typename:void file: +reallyold vendor/lua-5.4.8/src/lstate.h /^ GCObject *reallyold; \/* objects more than one cycle old ("really old") *\/$/;" m struct:global_State typeref:typename:GCObject * +recfield vendor/lua-5.4.8/src/lparser.c /^static void recfield (LexState *ls, ConsControl *cc) {$/;" f typeref:typename:void file: +recs vendor/raylib-5.5_linux_amd64/include/raylib.h /^ Rectangle *recs; \/\/ Rectangles in texture for the glyphs$/;" m struct:Font typeref:typename:Rectangle * +registerlocalvar vendor/lua-5.4.8/src/lparser.c /^static int registerlocalvar (LexState *ls, FuncState *fs, TString *varname) {$/;" f typeref:typename:int file: +reglevel vendor/lua-5.4.8/src/lparser.c /^static int reglevel (FuncState *fs, int nvar) {$/;" f typeref:typename:int file: +rehash vendor/lua-5.4.8/src/ltable.c /^static void rehash (lua_State *L, Table *t, const TValue *ek) {$/;" f typeref:typename:void file: +reinsert vendor/lua-5.4.8/src/ltable.c /^static void reinsert (lua_State *L, Table *ot, Table *t) {$/;" f typeref:typename:void file: +relstack vendor/lua-5.4.8/src/ldo.c /^static void relstack (lua_State *L) {$/;" f typeref:typename:void file: +remarkupvals vendor/lua-5.4.8/src/lgc.c /^static int remarkupvals (global_State *g) {$/;" f typeref:typename:int file: +removelastinstruction vendor/lua-5.4.8/src/lcode.c /^static void removelastinstruction (FuncState *fs) {$/;" f typeref:typename:void file: +removelastlineinfo vendor/lua-5.4.8/src/lcode.c /^static void removelastlineinfo (FuncState *fs) {$/;" f typeref:typename:void file: +removevalues vendor/lua-5.4.8/src/lcode.c /^static void removevalues (FuncState *fs, int list) {$/;" f typeref:typename:void file: +removevars vendor/lua-5.4.8/src/lparser.c /^static void removevars (FuncState *fs, int tolevel) {$/;" f typeref:typename:void file: +repeatstat vendor/lua-5.4.8/src/lparser.c /^static void repeatstat (LexState *ls, int line) {$/;" f typeref:typename:void file: +report vendor/lua-5.4.8/src/lua.c /^static int report (lua_State *L, int status) {$/;" f typeref:typename:int file: +reprepstate vendor/lua-5.4.8/src/lstrlib.c /^static void reprepstate (MatchState *ms) {$/;" f typeref:typename:void file: +resetbit vendor/lua-5.4.8/src/lgc.h /^#define resetbit(/;" d +resetbits vendor/lua-5.4.8/src/lgc.h /^#define resetbits(/;" d +resethookcount vendor/lua-5.4.8/src/ldebug.h /^#define resethookcount(/;" d +resizebox vendor/lua-5.4.8/src/lauxlib.c /^static void *resizebox (lua_State *L, int idx, size_t newsize) {$/;" f typeref:typename:void * file: +restartcollection vendor/lua-5.4.8/src/lgc.c /^static void restartcollection (global_State *g) {$/;" f typeref:typename:void file: +restassign vendor/lua-5.4.8/src/lparser.c /^static void restassign (LexState *ls, struct LHS_assign *lh, int nvars) {$/;" f typeref:typename:void file: +restorestack vendor/lua-5.4.8/src/ldo.h /^#define restorestack(/;" d +resume vendor/lua-5.4.8/src/ldo.c /^static void resume (lua_State *L, void *ud) {$/;" f typeref:typename:void file: +resume_error vendor/lua-5.4.8/src/ldo.c /^static int resume_error (lua_State *L, const char *msg, int narg) {$/;" f typeref:typename:int file: +rethook vendor/lua-5.4.8/src/ldo.c /^static void rethook (lua_State *L, CallInfo *ci, int nres) {$/;" f typeref:typename:void file: +retstat vendor/lua-5.4.8/src/lparser.c /^static void retstat (LexState *ls) {$/;" f typeref:typename:void file: +reverse vendor/lua-5.4.8/src/lapi.c /^l_sinline void reverse (lua_State *L, StkId from, StkId to) {$/;" f typeref:typename:l_sinline void +ridx vendor/lua-5.4.8/src/lparser.h /^ lu_byte ridx; \/* register holding the variable *\/$/;" m struct:expdesc::__anon337ee443020a::__anon337ee4430408 typeref:typename:lu_byte +ridx vendor/lua-5.4.8/src/lparser.h /^ lu_byte ridx; \/* register holding the variable *\/$/;" m struct:Vardesc::__anon337ee4430508 typeref:typename:lu_byte +right vendor/lua-5.4.8/src/lparser.c /^ lu_byte right; \/* right priority *\/$/;" m struct:__anon337ee43e0108 typeref:typename:lu_byte file: +right vendor/raylib-5.5_linux_amd64/include/raylib.h /^ int right; \/\/ Right border offset$/;" m struct:NPatchInfo typeref:typename:int +rightLensCenter vendor/raylib-5.5_linux_amd64/include/raylib.h /^ float rightLensCenter[2]; \/\/ VR right lens center$/;" m struct:VrStereoConfig typeref:typename:float[2] +rightScreenCenter vendor/raylib-5.5_linux_amd64/include/raylib.h /^ float rightScreenCenter[2]; \/\/ VR right screen center$/;" m struct:VrStereoConfig typeref:typename:float[2] +righttt vendor/lua-5.4.8/src/lobject.h /^#define righttt(/;" d +rkname vendor/lua-5.4.8/src/ldebug.c /^static void rkname (const Proto *p, int pc, Instruction i, const char **name) {$/;" f typeref:typename:void file: +rlActiveDrawBuffers vendor/raylib-5.5_linux_amd64/include/rlgl.h /^RLAPI void rlActiveDrawBuffers(int count); \/\/ Activate multiple draw color buffer/;" p typeref:typename:RLAPI void +rlActiveDrawBuffers vendor/raylib-5.5_linux_amd64/include/rlgl.h /^void rlActiveDrawBuffers(int count)$/;" f typeref:typename:void +rlActiveTextureSlot vendor/raylib-5.5_linux_amd64/include/rlgl.h /^RLAPI void rlActiveTextureSlot(int slot); \/\/ Select and active a texture slot$/;" p typeref:typename:RLAPI void +rlActiveTextureSlot vendor/raylib-5.5_linux_amd64/include/rlgl.h /^void rlActiveTextureSlot(int slot)$/;" f typeref:typename:void +rlBegin vendor/raylib-5.5_linux_amd64/include/rlgl.h /^RLAPI void rlBegin(int mode); \/\/ Initialize drawing mode (how to org/;" p typeref:typename:RLAPI void +rlBegin vendor/raylib-5.5_linux_amd64/include/rlgl.h /^void rlBegin(int mode)$/;" f typeref:typename:void +rlBindFramebuffer vendor/raylib-5.5_linux_amd64/include/rlgl.h /^RLAPI void rlBindFramebuffer(unsigned int target, unsigned int framebuffer); \/\/ Bind framebuff/;" p typeref:typename:RLAPI void +rlBindFramebuffer vendor/raylib-5.5_linux_amd64/include/rlgl.h /^void rlBindFramebuffer(unsigned int target, unsigned int framebuffer)$/;" f typeref:typename:void +rlBindImageTexture vendor/raylib-5.5_linux_amd64/include/rlgl.h /^RLAPI void rlBindImageTexture(unsigned int id, unsigned int index, int format, bool readonly); /;" p typeref:typename:RLAPI void +rlBindImageTexture vendor/raylib-5.5_linux_amd64/include/rlgl.h /^void rlBindImageTexture(unsigned int id, unsigned int index, int format, bool readonly)$/;" f typeref:typename:void +rlBindShaderBuffer vendor/raylib-5.5_linux_amd64/include/rlgl.h /^RLAPI void rlBindShaderBuffer(unsigned int id, unsigned int index); \/\/ Bind SSBO b/;" p typeref:typename:RLAPI void +rlBindShaderBuffer vendor/raylib-5.5_linux_amd64/include/rlgl.h /^void rlBindShaderBuffer(unsigned int id, unsigned int index)$/;" f typeref:typename:void +rlBlendMode vendor/raylib-5.5_linux_amd64/include/rlgl.h /^} rlBlendMode;$/;" t typeref:enum:__anon1f68b8bd0603 +rlBlitFramebuffer vendor/raylib-5.5_linux_amd64/include/rlgl.h /^RLAPI void rlBlitFramebuffer(int srcX, int srcY, int srcWidth, int srcHeight, int dstX, int dstY/;" p typeref:typename:RLAPI void +rlBlitFramebuffer vendor/raylib-5.5_linux_amd64/include/rlgl.h /^void rlBlitFramebuffer(int srcX, int srcY, int srcWidth, int srcHeight, int dstX, int dstY, int /;" f typeref:typename:void +rlCheckErrors vendor/raylib-5.5_linux_amd64/include/rlgl.h /^RLAPI void rlCheckErrors(void); \/\/ Check and log OpenGL error codes$/;" p typeref:typename:RLAPI void +rlCheckErrors vendor/raylib-5.5_linux_amd64/include/rlgl.h /^void rlCheckErrors(void)$/;" f typeref:typename:void +rlCheckRenderBatchLimit vendor/raylib-5.5_linux_amd64/include/rlgl.h /^RLAPI bool rlCheckRenderBatchLimit(int vCount); \/\/ Check internal buffer overflow for /;" p typeref:typename:RLAPI bool +rlCheckRenderBatchLimit vendor/raylib-5.5_linux_amd64/include/rlgl.h /^bool rlCheckRenderBatchLimit(int vCount)$/;" f typeref:typename:bool +rlClearColor vendor/raylib-5.5_linux_amd64/include/rlgl.h /^RLAPI void rlClearColor(unsigned char r, unsigned char g, unsigned char b, unsigned char a); \/\//;" p typeref:typename:RLAPI void +rlClearColor vendor/raylib-5.5_linux_amd64/include/rlgl.h /^void rlClearColor(unsigned char r, unsigned char g, unsigned char b, unsigned char a)$/;" f typeref:typename:void +rlClearScreenBuffers vendor/raylib-5.5_linux_amd64/include/rlgl.h /^RLAPI void rlClearScreenBuffers(void); \/\/ Clear used screen buffers (color an/;" p typeref:typename:RLAPI void +rlClearScreenBuffers vendor/raylib-5.5_linux_amd64/include/rlgl.h /^void rlClearScreenBuffers(void)$/;" f typeref:typename:void +rlColor3f vendor/raylib-5.5_linux_amd64/include/rlgl.h /^RLAPI void rlColor3f(float x, float y, float z); \/\/ Define one vertex (color) - 3 float$/;" p typeref:typename:RLAPI void +rlColor3f vendor/raylib-5.5_linux_amd64/include/rlgl.h /^void rlColor3f(float x, float y, float z) { glColor3f(x, y, z); }$/;" f typeref:typename:void +rlColor3f vendor/raylib-5.5_linux_amd64/include/rlgl.h /^void rlColor3f(float x, float y, float z)$/;" f typeref:typename:void +rlColor4f vendor/raylib-5.5_linux_amd64/include/rlgl.h /^RLAPI void rlColor4f(float x, float y, float z, float w); \/\/ Define one vertex (color) - 4 flo/;" p typeref:typename:RLAPI void +rlColor4f vendor/raylib-5.5_linux_amd64/include/rlgl.h /^void rlColor4f(float r, float g, float b, float a)$/;" f typeref:typename:void +rlColor4f vendor/raylib-5.5_linux_amd64/include/rlgl.h /^void rlColor4f(float x, float y, float z, float w) { glColor4f(x, y, z, w); }$/;" f typeref:typename:void +rlColor4ub vendor/raylib-5.5_linux_amd64/include/rlgl.h /^RLAPI void rlColor4ub(unsigned char r, unsigned char g, unsigned char b, unsigned char a); \/\/ /;" p typeref:typename:RLAPI void +rlColor4ub vendor/raylib-5.5_linux_amd64/include/rlgl.h /^void rlColor4ub(unsigned char r, unsigned char g, unsigned char b, unsigned char a) { glColor4ub/;" f typeref:typename:void +rlColor4ub vendor/raylib-5.5_linux_amd64/include/rlgl.h /^void rlColor4ub(unsigned char x, unsigned char y, unsigned char z, unsigned char w)$/;" f typeref:typename:void +rlColorMask vendor/raylib-5.5_linux_amd64/include/rlgl.h /^RLAPI void rlColorMask(bool r, bool g, bool b, bool a); \/\/ Color mask control$/;" p typeref:typename:RLAPI void +rlColorMask vendor/raylib-5.5_linux_amd64/include/rlgl.h /^void rlColorMask(bool r, bool g, bool b, bool a) { glColorMask(r, g, b, a); }$/;" f typeref:typename:void +rlCompileShader vendor/raylib-5.5_linux_amd64/include/rlgl.h /^RLAPI unsigned int rlCompileShader(const char *shaderCode, int type); \/\/ Compile cus/;" p typeref:typename:RLAPI unsigned int +rlCompileShader vendor/raylib-5.5_linux_amd64/include/rlgl.h /^unsigned int rlCompileShader(const char *shaderCode, int type)$/;" f typeref:typename:unsigned int +rlComputeShaderDispatch vendor/raylib-5.5_linux_amd64/include/rlgl.h /^RLAPI void rlComputeShaderDispatch(unsigned int groupX, unsigned int groupY, unsigned int groupZ/;" p typeref:typename:RLAPI void +rlComputeShaderDispatch vendor/raylib-5.5_linux_amd64/include/rlgl.h /^void rlComputeShaderDispatch(unsigned int groupX, unsigned int groupY, unsigned int groupZ)$/;" f typeref:typename:void +rlCopyShaderBuffer vendor/raylib-5.5_linux_amd64/include/rlgl.h /^RLAPI void rlCopyShaderBuffer(unsigned int destId, unsigned int srcId, unsigned int destOffset, /;" p typeref:typename:RLAPI void +rlCopyShaderBuffer vendor/raylib-5.5_linux_amd64/include/rlgl.h /^void rlCopyShaderBuffer(unsigned int destId, unsigned int srcId, unsigned int destOffset, unsign/;" f typeref:typename:void +rlCubemapParameters vendor/raylib-5.5_linux_amd64/include/rlgl.h /^RLAPI void rlCubemapParameters(unsigned int id, int param, int value); \/\/ Set cubemap paramete/;" p typeref:typename:RLAPI void +rlCubemapParameters vendor/raylib-5.5_linux_amd64/include/rlgl.h /^void rlCubemapParameters(unsigned int id, int param, int value)$/;" f typeref:typename:void +rlCullDistanceFar vendor/raylib-5.5_linux_amd64/include/rlgl.h /^static double rlCullDistanceFar = RL_CULL_DISTANCE_FAR;$/;" v typeref:typename:double +rlCullDistanceNear vendor/raylib-5.5_linux_amd64/include/rlgl.h /^static double rlCullDistanceNear = RL_CULL_DISTANCE_NEAR;$/;" v typeref:typename:double +rlCullMode vendor/raylib-5.5_linux_amd64/include/rlgl.h /^} rlCullMode;$/;" t typeref:enum:__anon1f68b8bd0c03 +rlDebugMessageCallback vendor/raylib-5.5_linux_amd64/include/rlgl.h /^static void GLAPIENTRY rlDebugMessageCallback(GLenum source, GLenum type, GLuint id, GLenum seve/;" f typeref:typename:void GLAPIENTRY +rlDisableBackfaceCulling vendor/raylib-5.5_linux_amd64/include/rlgl.h /^RLAPI void rlDisableBackfaceCulling(void); \/\/ Disable backface culling$/;" p typeref:typename:RLAPI void +rlDisableBackfaceCulling vendor/raylib-5.5_linux_amd64/include/rlgl.h /^void rlDisableBackfaceCulling(void) { glDisable(GL_CULL_FACE); }$/;" f typeref:typename:void +rlDisableColorBlend vendor/raylib-5.5_linux_amd64/include/rlgl.h /^RLAPI void rlDisableColorBlend(void); \/\/ Disable color blending$/;" p typeref:typename:RLAPI void +rlDisableColorBlend vendor/raylib-5.5_linux_amd64/include/rlgl.h /^void rlDisableColorBlend(void) { glDisable(GL_BLEND); }$/;" f typeref:typename:void +rlDisableDepthMask vendor/raylib-5.5_linux_amd64/include/rlgl.h /^RLAPI void rlDisableDepthMask(void); \/\/ Disable depth write$/;" p typeref:typename:RLAPI void +rlDisableDepthMask vendor/raylib-5.5_linux_amd64/include/rlgl.h /^void rlDisableDepthMask(void) { glDepthMask(GL_FALSE); }$/;" f typeref:typename:void +rlDisableDepthTest vendor/raylib-5.5_linux_amd64/include/rlgl.h /^RLAPI void rlDisableDepthTest(void); \/\/ Disable depth test$/;" p typeref:typename:RLAPI void +rlDisableDepthTest vendor/raylib-5.5_linux_amd64/include/rlgl.h /^void rlDisableDepthTest(void) { glDisable(GL_DEPTH_TEST); }$/;" f typeref:typename:void +rlDisableFramebuffer vendor/raylib-5.5_linux_amd64/include/rlgl.h /^RLAPI void rlDisableFramebuffer(void); \/\/ Disable render texture (fbo), retur/;" p typeref:typename:RLAPI void +rlDisableFramebuffer vendor/raylib-5.5_linux_amd64/include/rlgl.h /^void rlDisableFramebuffer(void)$/;" f typeref:typename:void +rlDisableScissorTest vendor/raylib-5.5_linux_amd64/include/rlgl.h /^RLAPI void rlDisableScissorTest(void); \/\/ Disable scissor test$/;" p typeref:typename:RLAPI void +rlDisableScissorTest vendor/raylib-5.5_linux_amd64/include/rlgl.h /^void rlDisableScissorTest(void) { glDisable(GL_SCISSOR_TEST); }$/;" f typeref:typename:void +rlDisableShader vendor/raylib-5.5_linux_amd64/include/rlgl.h /^RLAPI void rlDisableShader(void); \/\/ Disable shader program$/;" p typeref:typename:RLAPI void +rlDisableShader vendor/raylib-5.5_linux_amd64/include/rlgl.h /^void rlDisableShader(void)$/;" f typeref:typename:void +rlDisableSmoothLines vendor/raylib-5.5_linux_amd64/include/rlgl.h /^RLAPI void rlDisableSmoothLines(void); \/\/ Disable line aliasing$/;" p typeref:typename:RLAPI void +rlDisableSmoothLines vendor/raylib-5.5_linux_amd64/include/rlgl.h /^void rlDisableSmoothLines(void)$/;" f typeref:typename:void +rlDisableStatePointer vendor/raylib-5.5_linux_amd64/include/rlgl.h /^RLAPI void rlDisableStatePointer(int vertexAttribType); \/\/ Disable attribute state pointer$/;" p typeref:typename:RLAPI void +rlDisableStatePointer vendor/raylib-5.5_linux_amd64/include/rlgl.h /^void rlDisableStatePointer(int vertexAttribType)$/;" f typeref:typename:void +rlDisableStereoRender vendor/raylib-5.5_linux_amd64/include/rlgl.h /^RLAPI void rlDisableStereoRender(void); \/\/ Disable stereo rendering$/;" p typeref:typename:RLAPI void +rlDisableStereoRender vendor/raylib-5.5_linux_amd64/include/rlgl.h /^void rlDisableStereoRender(void)$/;" f typeref:typename:void +rlDisableTexture vendor/raylib-5.5_linux_amd64/include/rlgl.h /^RLAPI void rlDisableTexture(void); \/\/ Disable texture$/;" p typeref:typename:RLAPI void +rlDisableTexture vendor/raylib-5.5_linux_amd64/include/rlgl.h /^void rlDisableTexture(void)$/;" f typeref:typename:void +rlDisableTextureCubemap vendor/raylib-5.5_linux_amd64/include/rlgl.h /^RLAPI void rlDisableTextureCubemap(void); \/\/ Disable texture cubemap$/;" p typeref:typename:RLAPI void +rlDisableTextureCubemap vendor/raylib-5.5_linux_amd64/include/rlgl.h /^void rlDisableTextureCubemap(void)$/;" f typeref:typename:void +rlDisableVertexArray vendor/raylib-5.5_linux_amd64/include/rlgl.h /^RLAPI void rlDisableVertexArray(void); \/\/ Disable vertex array (VAO, if suppo/;" p typeref:typename:RLAPI void +rlDisableVertexArray vendor/raylib-5.5_linux_amd64/include/rlgl.h /^void rlDisableVertexArray(void)$/;" f typeref:typename:void +rlDisableVertexAttribute vendor/raylib-5.5_linux_amd64/include/rlgl.h /^RLAPI void rlDisableVertexAttribute(unsigned int index); \/\/ Disable vertex attribute index$/;" p typeref:typename:RLAPI void +rlDisableVertexAttribute vendor/raylib-5.5_linux_amd64/include/rlgl.h /^void rlDisableVertexAttribute(unsigned int index)$/;" f typeref:typename:void +rlDisableVertexBuffer vendor/raylib-5.5_linux_amd64/include/rlgl.h /^RLAPI void rlDisableVertexBuffer(void); \/\/ Disable vertex buffer (VBO)$/;" p typeref:typename:RLAPI void +rlDisableVertexBuffer vendor/raylib-5.5_linux_amd64/include/rlgl.h /^void rlDisableVertexBuffer(void)$/;" f typeref:typename:void +rlDisableVertexBufferElement vendor/raylib-5.5_linux_amd64/include/rlgl.h /^RLAPI void rlDisableVertexBufferElement(void); \/\/ Disable vertex buffer element (VBO /;" p typeref:typename:RLAPI void +rlDisableVertexBufferElement vendor/raylib-5.5_linux_amd64/include/rlgl.h /^void rlDisableVertexBufferElement(void)$/;" f typeref:typename:void +rlDisableWireMode vendor/raylib-5.5_linux_amd64/include/rlgl.h /^RLAPI void rlDisableWireMode(void); \/\/ Disable wire (and point) mode$/;" p typeref:typename:RLAPI void +rlDisableWireMode vendor/raylib-5.5_linux_amd64/include/rlgl.h /^void rlDisableWireMode(void)$/;" f typeref:typename:void +rlDrawCall vendor/raylib-5.5_linux_amd64/include/rlgl.h /^typedef struct rlDrawCall {$/;" s +rlDrawCall vendor/raylib-5.5_linux_amd64/include/rlgl.h /^} rlDrawCall;$/;" t typeref:struct:rlDrawCall +rlDrawRenderBatch vendor/raylib-5.5_linux_amd64/include/rlgl.h /^RLAPI void rlDrawRenderBatch(rlRenderBatch *batch); \/\/ Draw render batch data (Update->Dra/;" p typeref:typename:RLAPI void +rlDrawRenderBatch vendor/raylib-5.5_linux_amd64/include/rlgl.h /^void rlDrawRenderBatch(rlRenderBatch *batch)$/;" f typeref:typename:void +rlDrawRenderBatchActive vendor/raylib-5.5_linux_amd64/include/rlgl.h /^RLAPI void rlDrawRenderBatchActive(void); \/\/ Update and draw internal render bat/;" p typeref:typename:RLAPI void +rlDrawRenderBatchActive vendor/raylib-5.5_linux_amd64/include/rlgl.h /^void rlDrawRenderBatchActive(void)$/;" f typeref:typename:void +rlDrawVertexArray vendor/raylib-5.5_linux_amd64/include/rlgl.h /^RLAPI void rlDrawVertexArray(int offset, int count); \/\/ Draw vertex array (currently active/;" p typeref:typename:RLAPI void +rlDrawVertexArray vendor/raylib-5.5_linux_amd64/include/rlgl.h /^void rlDrawVertexArray(int offset, int count)$/;" f typeref:typename:void +rlDrawVertexArrayElements vendor/raylib-5.5_linux_amd64/include/rlgl.h /^RLAPI void rlDrawVertexArrayElements(int offset, int count, const void *buffer); \/\/ Draw verte/;" p typeref:typename:RLAPI void +rlDrawVertexArrayElements vendor/raylib-5.5_linux_amd64/include/rlgl.h /^void rlDrawVertexArrayElements(int offset, int count, const void *buffer)$/;" f typeref:typename:void +rlDrawVertexArrayElementsInstanced vendor/raylib-5.5_linux_amd64/include/rlgl.h /^RLAPI void rlDrawVertexArrayElementsInstanced(int offset, int count, const void *buffer, int ins/;" p typeref:typename:RLAPI void +rlDrawVertexArrayElementsInstanced vendor/raylib-5.5_linux_amd64/include/rlgl.h /^void rlDrawVertexArrayElementsInstanced(int offset, int count, const void *buffer, int instances/;" f typeref:typename:void +rlDrawVertexArrayInstanced vendor/raylib-5.5_linux_amd64/include/rlgl.h /^RLAPI void rlDrawVertexArrayInstanced(int offset, int count, int instances); \/\/ Draw vertex ar/;" p typeref:typename:RLAPI void +rlDrawVertexArrayInstanced vendor/raylib-5.5_linux_amd64/include/rlgl.h /^void rlDrawVertexArrayInstanced(int offset, int count, int instances)$/;" f typeref:typename:void +rlEnableBackfaceCulling vendor/raylib-5.5_linux_amd64/include/rlgl.h /^RLAPI void rlEnableBackfaceCulling(void); \/\/ Enable backface culling$/;" p typeref:typename:RLAPI void +rlEnableBackfaceCulling vendor/raylib-5.5_linux_amd64/include/rlgl.h /^void rlEnableBackfaceCulling(void) { glEnable(GL_CULL_FACE); }$/;" f typeref:typename:void +rlEnableColorBlend vendor/raylib-5.5_linux_amd64/include/rlgl.h /^RLAPI void rlEnableColorBlend(void); \/\/ Enable color blending$/;" p typeref:typename:RLAPI void +rlEnableColorBlend vendor/raylib-5.5_linux_amd64/include/rlgl.h /^void rlEnableColorBlend(void) { glEnable(GL_BLEND); }$/;" f typeref:typename:void +rlEnableDepthMask vendor/raylib-5.5_linux_amd64/include/rlgl.h /^RLAPI void rlEnableDepthMask(void); \/\/ Enable depth write$/;" p typeref:typename:RLAPI void +rlEnableDepthMask vendor/raylib-5.5_linux_amd64/include/rlgl.h /^void rlEnableDepthMask(void) { glDepthMask(GL_TRUE); }$/;" f typeref:typename:void +rlEnableDepthTest vendor/raylib-5.5_linux_amd64/include/rlgl.h /^RLAPI void rlEnableDepthTest(void); \/\/ Enable depth test$/;" p typeref:typename:RLAPI void +rlEnableDepthTest vendor/raylib-5.5_linux_amd64/include/rlgl.h /^void rlEnableDepthTest(void) { glEnable(GL_DEPTH_TEST); }$/;" f typeref:typename:void +rlEnableFramebuffer vendor/raylib-5.5_linux_amd64/include/rlgl.h /^RLAPI void rlEnableFramebuffer(unsigned int id); \/\/ Enable render texture (fbo)$/;" p typeref:typename:RLAPI void +rlEnableFramebuffer vendor/raylib-5.5_linux_amd64/include/rlgl.h /^void rlEnableFramebuffer(unsigned int id)$/;" f typeref:typename:void +rlEnablePointMode vendor/raylib-5.5_linux_amd64/include/rlgl.h /^RLAPI void rlEnablePointMode(void); \/\/ Enable point mode$/;" p typeref:typename:RLAPI void +rlEnablePointMode vendor/raylib-5.5_linux_amd64/include/rlgl.h /^void rlEnablePointMode(void)$/;" f typeref:typename:void +rlEnableScissorTest vendor/raylib-5.5_linux_amd64/include/rlgl.h /^RLAPI void rlEnableScissorTest(void); \/\/ Enable scissor test$/;" p typeref:typename:RLAPI void +rlEnableScissorTest vendor/raylib-5.5_linux_amd64/include/rlgl.h /^void rlEnableScissorTest(void) { glEnable(GL_SCISSOR_TEST); }$/;" f typeref:typename:void +rlEnableShader vendor/raylib-5.5_linux_amd64/include/rlgl.h /^RLAPI void rlEnableShader(unsigned int id); \/\/ Enable shader program$/;" p typeref:typename:RLAPI void +rlEnableShader vendor/raylib-5.5_linux_amd64/include/rlgl.h /^void rlEnableShader(unsigned int id)$/;" f typeref:typename:void +rlEnableSmoothLines vendor/raylib-5.5_linux_amd64/include/rlgl.h /^RLAPI void rlEnableSmoothLines(void); \/\/ Enable line aliasing$/;" p typeref:typename:RLAPI void +rlEnableSmoothLines vendor/raylib-5.5_linux_amd64/include/rlgl.h /^void rlEnableSmoothLines(void)$/;" f typeref:typename:void +rlEnableStatePointer vendor/raylib-5.5_linux_amd64/include/rlgl.h /^RLAPI void rlEnableStatePointer(int vertexAttribType, void *buffer); \/\/ Enable attribute state/;" p typeref:typename:RLAPI void +rlEnableStatePointer vendor/raylib-5.5_linux_amd64/include/rlgl.h /^void rlEnableStatePointer(int vertexAttribType, void *buffer)$/;" f typeref:typename:void +rlEnableStereoRender vendor/raylib-5.5_linux_amd64/include/rlgl.h /^RLAPI void rlEnableStereoRender(void); \/\/ Enable stereo rendering$/;" p typeref:typename:RLAPI void +rlEnableStereoRender vendor/raylib-5.5_linux_amd64/include/rlgl.h /^void rlEnableStereoRender(void)$/;" f typeref:typename:void +rlEnableTexture vendor/raylib-5.5_linux_amd64/include/rlgl.h /^RLAPI void rlEnableTexture(unsigned int id); \/\/ Enable texture$/;" p typeref:typename:RLAPI void +rlEnableTexture vendor/raylib-5.5_linux_amd64/include/rlgl.h /^void rlEnableTexture(unsigned int id)$/;" f typeref:typename:void +rlEnableTextureCubemap vendor/raylib-5.5_linux_amd64/include/rlgl.h /^RLAPI void rlEnableTextureCubemap(unsigned int id); \/\/ Enable texture cubemap$/;" p typeref:typename:RLAPI void +rlEnableTextureCubemap vendor/raylib-5.5_linux_amd64/include/rlgl.h /^void rlEnableTextureCubemap(unsigned int id)$/;" f typeref:typename:void +rlEnableVertexArray vendor/raylib-5.5_linux_amd64/include/rlgl.h /^RLAPI bool rlEnableVertexArray(unsigned int vaoId); \/\/ Enable vertex array (VAO, if suppor/;" p typeref:typename:RLAPI bool +rlEnableVertexArray vendor/raylib-5.5_linux_amd64/include/rlgl.h /^bool rlEnableVertexArray(unsigned int vaoId)$/;" f typeref:typename:bool +rlEnableVertexAttribute vendor/raylib-5.5_linux_amd64/include/rlgl.h /^RLAPI void rlEnableVertexAttribute(unsigned int index); \/\/ Enable vertex attribute index$/;" p typeref:typename:RLAPI void +rlEnableVertexAttribute vendor/raylib-5.5_linux_amd64/include/rlgl.h /^void rlEnableVertexAttribute(unsigned int index)$/;" f typeref:typename:void +rlEnableVertexBuffer vendor/raylib-5.5_linux_amd64/include/rlgl.h /^RLAPI void rlEnableVertexBuffer(unsigned int id); \/\/ Enable vertex buffer (VBO)$/;" p typeref:typename:RLAPI void +rlEnableVertexBuffer vendor/raylib-5.5_linux_amd64/include/rlgl.h /^void rlEnableVertexBuffer(unsigned int id)$/;" f typeref:typename:void +rlEnableVertexBufferElement vendor/raylib-5.5_linux_amd64/include/rlgl.h /^RLAPI void rlEnableVertexBufferElement(unsigned int id); \/\/ Enable vertex buffer element (VBO /;" p typeref:typename:RLAPI void +rlEnableVertexBufferElement vendor/raylib-5.5_linux_amd64/include/rlgl.h /^void rlEnableVertexBufferElement(unsigned int id)$/;" f typeref:typename:void +rlEnableWireMode vendor/raylib-5.5_linux_amd64/include/rlgl.h /^RLAPI void rlEnableWireMode(void); \/\/ Enable wire mode$/;" p typeref:typename:RLAPI void +rlEnableWireMode vendor/raylib-5.5_linux_amd64/include/rlgl.h /^void rlEnableWireMode(void)$/;" f typeref:typename:void +rlEnd vendor/raylib-5.5_linux_amd64/include/rlgl.h /^RLAPI void rlEnd(void); \/\/ Finish vertex providing$/;" p typeref:typename:RLAPI void +rlEnd vendor/raylib-5.5_linux_amd64/include/rlgl.h /^void rlEnd(void) { glEnd(); }$/;" f typeref:typename:void +rlEnd vendor/raylib-5.5_linux_amd64/include/rlgl.h /^void rlEnd(void)$/;" f typeref:typename:void +rlFramebufferAttach vendor/raylib-5.5_linux_amd64/include/rlgl.h /^RLAPI void rlFramebufferAttach(unsigned int fboId, unsigned int texId, int attachType, int texTy/;" p typeref:typename:RLAPI void +rlFramebufferAttach vendor/raylib-5.5_linux_amd64/include/rlgl.h /^void rlFramebufferAttach(unsigned int fboId, unsigned int texId, int attachType, int texType, in/;" f typeref:typename:void +rlFramebufferAttachTextureType vendor/raylib-5.5_linux_amd64/include/rlgl.h /^} rlFramebufferAttachTextureType;$/;" t typeref:enum:__anon1f68b8bd0b03 +rlFramebufferAttachType vendor/raylib-5.5_linux_amd64/include/rlgl.h /^} rlFramebufferAttachType;$/;" t typeref:enum:__anon1f68b8bd0a03 +rlFramebufferComplete vendor/raylib-5.5_linux_amd64/include/rlgl.h /^RLAPI bool rlFramebufferComplete(unsigned int id); \/\/ Verify framebuffe/;" p typeref:typename:RLAPI bool +rlFramebufferComplete vendor/raylib-5.5_linux_amd64/include/rlgl.h /^bool rlFramebufferComplete(unsigned int id)$/;" f typeref:typename:bool +rlFrustum vendor/raylib-5.5_linux_amd64/include/rlgl.h /^RLAPI void rlFrustum(double left, double right, double bottom, double top, double znear, double /;" p typeref:typename:RLAPI void +rlFrustum vendor/raylib-5.5_linux_amd64/include/rlgl.h /^void rlFrustum(double left, double right, double bottom, double top, double znear, double zfar)$/;" f typeref:typename:void +rlGenTextureMipmaps vendor/raylib-5.5_linux_amd64/include/rlgl.h /^RLAPI void rlGenTextureMipmaps(unsigned int id, int width, int height, int format, int *mipmaps)/;" p typeref:typename:RLAPI void +rlGenTextureMipmaps vendor/raylib-5.5_linux_amd64/include/rlgl.h /^void rlGenTextureMipmaps(unsigned int id, int width, int height, int format, int *mipmaps)$/;" f typeref:typename:void +rlGetActiveFramebuffer vendor/raylib-5.5_linux_amd64/include/rlgl.h /^RLAPI unsigned int rlGetActiveFramebuffer(void); \/\/ Get the currently active render tex/;" p typeref:typename:RLAPI unsigned int +rlGetActiveFramebuffer vendor/raylib-5.5_linux_amd64/include/rlgl.h /^unsigned int rlGetActiveFramebuffer(void)$/;" f typeref:typename:unsigned int +rlGetCompressedFormatName vendor/raylib-5.5_linux_amd64/include/rlgl.h /^static const char *rlGetCompressedFormatName(int format)$/;" f typeref:typename:const char * +rlGetCompressedFormatName vendor/raylib-5.5_linux_amd64/include/rlgl.h /^static const char *rlGetCompressedFormatName(int format); \/\/ Get compressed format official GL/;" p typeref:typename:const char * +rlGetCullDistanceFar vendor/raylib-5.5_linux_amd64/include/rlgl.h /^RLAPI double rlGetCullDistanceFar(void); \/\/ Get cull plane distance far$/;" p typeref:typename:RLAPI double +rlGetCullDistanceFar vendor/raylib-5.5_linux_amd64/include/rlgl.h /^double rlGetCullDistanceFar(void)$/;" f typeref:typename:double +rlGetCullDistanceNear vendor/raylib-5.5_linux_amd64/include/rlgl.h /^RLAPI double rlGetCullDistanceNear(void); \/\/ Get cull plane distance near$/;" p typeref:typename:RLAPI double +rlGetCullDistanceNear vendor/raylib-5.5_linux_amd64/include/rlgl.h /^double rlGetCullDistanceNear(void)$/;" f typeref:typename:double +rlGetFramebufferHeight vendor/raylib-5.5_linux_amd64/include/rlgl.h /^RLAPI int rlGetFramebufferHeight(void); \/\/ Get default framebuffer height$/;" p typeref:typename:RLAPI int +rlGetFramebufferHeight vendor/raylib-5.5_linux_amd64/include/rlgl.h /^int rlGetFramebufferHeight(void)$/;" f typeref:typename:int +rlGetFramebufferWidth vendor/raylib-5.5_linux_amd64/include/rlgl.h /^RLAPI int rlGetFramebufferWidth(void); \/\/ Get default framebuffer width$/;" p typeref:typename:RLAPI int +rlGetFramebufferWidth vendor/raylib-5.5_linux_amd64/include/rlgl.h /^int rlGetFramebufferWidth(void)$/;" f typeref:typename:int +rlGetGlTextureFormats vendor/raylib-5.5_linux_amd64/include/rlgl.h /^RLAPI void rlGetGlTextureFormats(int format, unsigned int *glInternalFormat, unsigned int *glFor/;" p typeref:typename:RLAPI void +rlGetGlTextureFormats vendor/raylib-5.5_linux_amd64/include/rlgl.h /^void rlGetGlTextureFormats(int format, unsigned int *glInternalFormat, unsigned int *glFormat, u/;" f typeref:typename:void +rlGetLineWidth vendor/raylib-5.5_linux_amd64/include/rlgl.h /^RLAPI float rlGetLineWidth(void); \/\/ Get the line drawing width$/;" p typeref:typename:RLAPI float +rlGetLineWidth vendor/raylib-5.5_linux_amd64/include/rlgl.h /^float rlGetLineWidth(void)$/;" f typeref:typename:float +rlGetLocationAttrib vendor/raylib-5.5_linux_amd64/include/rlgl.h /^RLAPI int rlGetLocationAttrib(unsigned int shaderId, const char *attribName); \/\/ Get shader /;" p typeref:typename:RLAPI int +rlGetLocationAttrib vendor/raylib-5.5_linux_amd64/include/rlgl.h /^int rlGetLocationAttrib(unsigned int shaderId, const char *attribName)$/;" f typeref:typename:int +rlGetLocationUniform vendor/raylib-5.5_linux_amd64/include/rlgl.h /^RLAPI int rlGetLocationUniform(unsigned int shaderId, const char *uniformName); \/\/ Get shader /;" p typeref:typename:RLAPI int +rlGetLocationUniform vendor/raylib-5.5_linux_amd64/include/rlgl.h /^int rlGetLocationUniform(unsigned int shaderId, const char *uniformName)$/;" f typeref:typename:int +rlGetMatrixModelview vendor/raylib-5.5_linux_amd64/include/rlgl.h /^Matrix rlGetMatrixModelview(void)$/;" f typeref:typename:Matrix +rlGetMatrixModelview vendor/raylib-5.5_linux_amd64/include/rlgl.h /^RLAPI Matrix rlGetMatrixModelview(void); \/\/ Get internal mode/;" p typeref:typename:RLAPI Matrix +rlGetMatrixProjection vendor/raylib-5.5_linux_amd64/include/rlgl.h /^Matrix rlGetMatrixProjection(void)$/;" f typeref:typename:Matrix +rlGetMatrixProjection vendor/raylib-5.5_linux_amd64/include/rlgl.h /^RLAPI Matrix rlGetMatrixProjection(void); \/\/ Get internal proj/;" p typeref:typename:RLAPI Matrix +rlGetMatrixProjectionStereo vendor/raylib-5.5_linux_amd64/include/rlgl.h /^Matrix rlGetMatrixProjectionStereo(int eye)$/;" f typeref:typename:Matrix +rlGetMatrixProjectionStereo vendor/raylib-5.5_linux_amd64/include/rlgl.h /^RLAPI Matrix rlGetMatrixProjectionStereo(int eye); \/\/ Get internal proj/;" p typeref:typename:RLAPI Matrix +rlGetMatrixTransform vendor/raylib-5.5_linux_amd64/include/rlgl.h /^Matrix rlGetMatrixTransform(void)$/;" f typeref:typename:Matrix +rlGetMatrixTransform vendor/raylib-5.5_linux_amd64/include/rlgl.h /^RLAPI Matrix rlGetMatrixTransform(void); \/\/ Get internal accu/;" p typeref:typename:RLAPI Matrix +rlGetMatrixViewOffsetStereo vendor/raylib-5.5_linux_amd64/include/rlgl.h /^Matrix rlGetMatrixViewOffsetStereo(int eye)$/;" f typeref:typename:Matrix +rlGetMatrixViewOffsetStereo vendor/raylib-5.5_linux_amd64/include/rlgl.h /^RLAPI Matrix rlGetMatrixViewOffsetStereo(int eye); \/\/ Get internal view/;" p typeref:typename:RLAPI Matrix +rlGetPixelDataSize vendor/raylib-5.5_linux_amd64/include/rlgl.h /^static int rlGetPixelDataSize(int width, int height, int format)$/;" f typeref:typename:int +rlGetPixelDataSize vendor/raylib-5.5_linux_amd64/include/rlgl.h /^static int rlGetPixelDataSize(int width, int height, int format); \/\/ Get pixel data size in /;" p typeref:typename:int +rlGetPixelFormatName vendor/raylib-5.5_linux_amd64/include/rlgl.h /^RLAPI const char *rlGetPixelFormatName(unsigned int format); \/\/ Get name string f/;" p typeref:typename:RLAPI const char * +rlGetPixelFormatName vendor/raylib-5.5_linux_amd64/include/rlgl.h /^const char *rlGetPixelFormatName(unsigned int format)$/;" f typeref:typename:const char * +rlGetShaderBufferSize vendor/raylib-5.5_linux_amd64/include/rlgl.h /^RLAPI unsigned int rlGetShaderBufferSize(unsigned int id); \/\/ Get SSBO bu/;" p typeref:typename:RLAPI unsigned int +rlGetShaderBufferSize vendor/raylib-5.5_linux_amd64/include/rlgl.h /^unsigned int rlGetShaderBufferSize(unsigned int id)$/;" f typeref:typename:unsigned int +rlGetShaderIdDefault vendor/raylib-5.5_linux_amd64/include/rlgl.h /^RLAPI unsigned int rlGetShaderIdDefault(void); \/\/ Get default shader id$/;" p typeref:typename:RLAPI unsigned int +rlGetShaderIdDefault vendor/raylib-5.5_linux_amd64/include/rlgl.h /^unsigned int rlGetShaderIdDefault(void)$/;" f typeref:typename:unsigned int +rlGetShaderLocsDefault vendor/raylib-5.5_linux_amd64/include/rlgl.h /^RLAPI int *rlGetShaderLocsDefault(void); \/\/ Get default shader locations$/;" p typeref:typename:RLAPI int * +rlGetShaderLocsDefault vendor/raylib-5.5_linux_amd64/include/rlgl.h /^int *rlGetShaderLocsDefault(void)$/;" f typeref:typename:int * +rlGetTextureIdDefault vendor/raylib-5.5_linux_amd64/include/rlgl.h /^RLAPI unsigned int rlGetTextureIdDefault(void); \/\/ Get default texture id$/;" p typeref:typename:RLAPI unsigned int +rlGetTextureIdDefault vendor/raylib-5.5_linux_amd64/include/rlgl.h /^unsigned int rlGetTextureIdDefault(void)$/;" f typeref:typename:unsigned int +rlGetVersion vendor/raylib-5.5_linux_amd64/include/rlgl.h /^RLAPI int rlGetVersion(void); \/\/ Get current OpenGL version$/;" p typeref:typename:RLAPI int +rlGetVersion vendor/raylib-5.5_linux_amd64/include/rlgl.h /^int rlGetVersion(void)$/;" f typeref:typename:int +rlGlVersion vendor/raylib-5.5_linux_amd64/include/rlgl.h /^} rlGlVersion;$/;" t typeref:enum:__anon1f68b8bd0203 +rlIsStereoRenderEnabled vendor/raylib-5.5_linux_amd64/include/rlgl.h /^RLAPI bool rlIsStereoRenderEnabled(void); \/\/ Check if stereo render is enabled$/;" p typeref:typename:RLAPI bool +rlIsStereoRenderEnabled vendor/raylib-5.5_linux_amd64/include/rlgl.h /^bool rlIsStereoRenderEnabled(void)$/;" f typeref:typename:bool +rlLoadComputeShaderProgram vendor/raylib-5.5_linux_amd64/include/rlgl.h /^RLAPI unsigned int rlLoadComputeShaderProgram(unsigned int shaderId); \/\/ Load comput/;" p typeref:typename:RLAPI unsigned int +rlLoadComputeShaderProgram vendor/raylib-5.5_linux_amd64/include/rlgl.h /^unsigned int rlLoadComputeShaderProgram(unsigned int shaderId)$/;" f typeref:typename:unsigned int +rlLoadDrawCube vendor/raylib-5.5_linux_amd64/include/rlgl.h /^RLAPI void rlLoadDrawCube(void); \/\/ Load and draw a cube$/;" p typeref:typename:RLAPI void +rlLoadDrawCube vendor/raylib-5.5_linux_amd64/include/rlgl.h /^void rlLoadDrawCube(void)$/;" f typeref:typename:void +rlLoadDrawQuad vendor/raylib-5.5_linux_amd64/include/rlgl.h /^RLAPI void rlLoadDrawQuad(void); \/\/ Load and draw a quad$/;" p typeref:typename:RLAPI void +rlLoadDrawQuad vendor/raylib-5.5_linux_amd64/include/rlgl.h /^void rlLoadDrawQuad(void)$/;" f typeref:typename:void +rlLoadExtensions vendor/raylib-5.5_linux_amd64/include/rlgl.h /^RLAPI void rlLoadExtensions(void *loader); \/\/ Load OpenGL extensions (loader func/;" p typeref:typename:RLAPI void +rlLoadExtensions vendor/raylib-5.5_linux_amd64/include/rlgl.h /^void rlLoadExtensions(void *loader)$/;" f typeref:typename:void +rlLoadFramebuffer vendor/raylib-5.5_linux_amd64/include/rlgl.h /^RLAPI unsigned int rlLoadFramebuffer(void); \/\/ Load an empty fra/;" p typeref:typename:RLAPI unsigned int +rlLoadFramebuffer vendor/raylib-5.5_linux_amd64/include/rlgl.h /^unsigned int rlLoadFramebuffer(void)$/;" f typeref:typename:unsigned int +rlLoadIdentity vendor/raylib-5.5_linux_amd64/include/rlgl.h /^RLAPI void rlLoadIdentity(void); \/\/ Reset current matrix to identity ma/;" p typeref:typename:RLAPI void +rlLoadIdentity vendor/raylib-5.5_linux_amd64/include/rlgl.h /^void rlLoadIdentity(void) { glLoadIdentity(); }$/;" f typeref:typename:void +rlLoadIdentity vendor/raylib-5.5_linux_amd64/include/rlgl.h /^void rlLoadIdentity(void)$/;" f typeref:typename:void +rlLoadRenderBatch vendor/raylib-5.5_linux_amd64/include/rlgl.h /^RLAPI rlRenderBatch rlLoadRenderBatch(int numBuffers, int bufferElements); \/\/ Load a render ba/;" p typeref:typename:RLAPI rlRenderBatch +rlLoadRenderBatch vendor/raylib-5.5_linux_amd64/include/rlgl.h /^rlRenderBatch rlLoadRenderBatch(int numBuffers, int bufferElements)$/;" f typeref:typename:rlRenderBatch +rlLoadShaderBuffer vendor/raylib-5.5_linux_amd64/include/rlgl.h /^RLAPI unsigned int rlLoadShaderBuffer(unsigned int size, const void *data, int usageHint); \/\/ /;" p typeref:typename:RLAPI unsigned int +rlLoadShaderBuffer vendor/raylib-5.5_linux_amd64/include/rlgl.h /^unsigned int rlLoadShaderBuffer(unsigned int size, const void *data, int usageHint)$/;" f typeref:typename:unsigned int +rlLoadShaderCode vendor/raylib-5.5_linux_amd64/include/rlgl.h /^RLAPI unsigned int rlLoadShaderCode(const char *vsCode, const char *fsCode); \/\/ Load shader/;" p typeref:typename:RLAPI unsigned int +rlLoadShaderCode vendor/raylib-5.5_linux_amd64/include/rlgl.h /^unsigned int rlLoadShaderCode(const char *vsCode, const char *fsCode)$/;" f typeref:typename:unsigned int +rlLoadShaderDefault vendor/raylib-5.5_linux_amd64/include/rlgl.h /^static void rlLoadShaderDefault(void)$/;" f typeref:typename:void +rlLoadShaderDefault vendor/raylib-5.5_linux_amd64/include/rlgl.h /^static void rlLoadShaderDefault(void); \/\/ Load default shader$/;" p typeref:typename:void +rlLoadShaderProgram vendor/raylib-5.5_linux_amd64/include/rlgl.h /^RLAPI unsigned int rlLoadShaderProgram(unsigned int vShaderId, unsigned int fShaderId); \/\/ Loa/;" p typeref:typename:RLAPI unsigned int +rlLoadShaderProgram vendor/raylib-5.5_linux_amd64/include/rlgl.h /^unsigned int rlLoadShaderProgram(unsigned int vShaderId, unsigned int fShaderId)$/;" f typeref:typename:unsigned int +rlLoadTexture vendor/raylib-5.5_linux_amd64/include/rlgl.h /^RLAPI unsigned int rlLoadTexture(const void *data, int width, int height, int format, int mipmap/;" p typeref:typename:RLAPI unsigned int +rlLoadTexture vendor/raylib-5.5_linux_amd64/include/rlgl.h /^unsigned int rlLoadTexture(const void *data, int width, int height, int format, int mipmapCount)$/;" f typeref:typename:unsigned int +rlLoadTextureCubemap vendor/raylib-5.5_linux_amd64/include/rlgl.h /^RLAPI unsigned int rlLoadTextureCubemap(const void *data, int size, int format, int mipmapCount)/;" p typeref:typename:RLAPI unsigned int +rlLoadTextureCubemap vendor/raylib-5.5_linux_amd64/include/rlgl.h /^unsigned int rlLoadTextureCubemap(const void *data, int size, int format, int mipmapCount)$/;" f typeref:typename:unsigned int +rlLoadTextureDepth vendor/raylib-5.5_linux_amd64/include/rlgl.h /^RLAPI unsigned int rlLoadTextureDepth(int width, int height, bool useRenderBuffer); \/\/ Load de/;" p typeref:typename:RLAPI unsigned int +rlLoadTextureDepth vendor/raylib-5.5_linux_amd64/include/rlgl.h /^unsigned int rlLoadTextureDepth(int width, int height, bool useRenderBuffer)$/;" f typeref:typename:unsigned int +rlLoadVertexArray vendor/raylib-5.5_linux_amd64/include/rlgl.h /^RLAPI unsigned int rlLoadVertexArray(void); \/\/ Load vertex array (vao) if supporte/;" p typeref:typename:RLAPI unsigned int +rlLoadVertexArray vendor/raylib-5.5_linux_amd64/include/rlgl.h /^unsigned int rlLoadVertexArray(void)$/;" f typeref:typename:unsigned int +rlLoadVertexBuffer vendor/raylib-5.5_linux_amd64/include/rlgl.h /^RLAPI unsigned int rlLoadVertexBuffer(const void *buffer, int size, bool dynamic); \/\/ Load a v/;" p typeref:typename:RLAPI unsigned int +rlLoadVertexBuffer vendor/raylib-5.5_linux_amd64/include/rlgl.h /^unsigned int rlLoadVertexBuffer(const void *buffer, int size, bool dynamic)$/;" f typeref:typename:unsigned int +rlLoadVertexBufferElement vendor/raylib-5.5_linux_amd64/include/rlgl.h /^RLAPI unsigned int rlLoadVertexBufferElement(const void *buffer, int size, bool dynamic); \/\/ L/;" p typeref:typename:RLAPI unsigned int +rlLoadVertexBufferElement vendor/raylib-5.5_linux_amd64/include/rlgl.h /^unsigned int rlLoadVertexBufferElement(const void *buffer, int size, bool dynamic)$/;" f typeref:typename:unsigned int +rlMatrixIdentity vendor/raylib-5.5_linux_amd64/include/rlgl.h /^static Matrix rlMatrixIdentity(void)$/;" f typeref:typename:Matrix +rlMatrixIdentity vendor/raylib-5.5_linux_amd64/include/rlgl.h /^static Matrix rlMatrixIdentity(void); \/\/ Get identity matrix$/;" p typeref:typename:Matrix +rlMatrixInvert vendor/raylib-5.5_linux_amd64/include/rlgl.h /^static Matrix rlMatrixInvert(Matrix mat)$/;" f typeref:typename:Matrix +rlMatrixInvert vendor/raylib-5.5_linux_amd64/include/rlgl.h /^static Matrix rlMatrixInvert(Matrix mat); \/\/ Invert provided matrix$/;" p typeref:typename:Matrix +rlMatrixMode vendor/raylib-5.5_linux_amd64/include/rlgl.h /^RLAPI void rlMatrixMode(int mode); \/\/ Choose the current matrix to be tra/;" p typeref:typename:RLAPI void +rlMatrixMode vendor/raylib-5.5_linux_amd64/include/rlgl.h /^void rlMatrixMode(int mode)$/;" f typeref:typename:void +rlMatrixMultiply vendor/raylib-5.5_linux_amd64/include/rlgl.h /^static Matrix rlMatrixMultiply(Matrix left, Matrix right)$/;" f typeref:typename:Matrix +rlMatrixMultiply vendor/raylib-5.5_linux_amd64/include/rlgl.h /^static Matrix rlMatrixMultiply(Matrix left, Matrix right); \/\/ Multiply two matrices$/;" p typeref:typename:Matrix +rlMatrixToFloat vendor/raylib-5.5_linux_amd64/include/rlgl.h /^#define rlMatrixToFloat(/;" d +rlMatrixToFloatV vendor/raylib-5.5_linux_amd64/include/rlgl.h /^static rl_float16 rlMatrixToFloatV(Matrix mat)$/;" f typeref:typename:rl_float16 +rlMatrixToFloatV vendor/raylib-5.5_linux_amd64/include/rlgl.h /^static rl_float16 rlMatrixToFloatV(Matrix mat); \/\/ Get float array of matrix data$/;" p typeref:typename:rl_float16 +rlMatrixTranspose vendor/raylib-5.5_linux_amd64/include/rlgl.h /^static Matrix rlMatrixTranspose(Matrix mat)$/;" f typeref:typename:Matrix +rlMatrixTranspose vendor/raylib-5.5_linux_amd64/include/rlgl.h /^static Matrix rlMatrixTranspose(Matrix mat); \/\/ Transposes provided matrix$/;" p typeref:typename:Matrix +rlMultMatrixf vendor/raylib-5.5_linux_amd64/include/rlgl.h /^RLAPI void rlMultMatrixf(const float *matf); \/\/ Multiply the current matrix by anot/;" p typeref:typename:RLAPI void +rlMultMatrixf vendor/raylib-5.5_linux_amd64/include/rlgl.h /^void rlMultMatrixf(const float *matf) { glMultMatrixf(matf); }$/;" f typeref:typename:void +rlMultMatrixf vendor/raylib-5.5_linux_amd64/include/rlgl.h /^void rlMultMatrixf(const float *matf)$/;" f typeref:typename:void +rlNormal3f vendor/raylib-5.5_linux_amd64/include/rlgl.h /^RLAPI void rlNormal3f(float x, float y, float z); \/\/ Define one vertex (normal) - 3 floa/;" p typeref:typename:RLAPI void +rlNormal3f vendor/raylib-5.5_linux_amd64/include/rlgl.h /^void rlNormal3f(float x, float y, float z) { glNormal3f(x, y, z); }$/;" f typeref:typename:void +rlNormal3f vendor/raylib-5.5_linux_amd64/include/rlgl.h /^void rlNormal3f(float x, float y, float z)$/;" f typeref:typename:void +rlOrtho vendor/raylib-5.5_linux_amd64/include/rlgl.h /^RLAPI void rlOrtho(double left, double right, double bottom, double top, double znear, double zf/;" p typeref:typename:RLAPI void +rlOrtho vendor/raylib-5.5_linux_amd64/include/rlgl.h /^void rlOrtho(double left, double right, double bottom, double top, double znear, double zfar)$/;" f typeref:typename:void +rlPixelFormat vendor/raylib-5.5_linux_amd64/include/rlgl.h /^} rlPixelFormat;$/;" t typeref:enum:__anon1f68b8bd0403 +rlPopMatrix vendor/raylib-5.5_linux_amd64/include/rlgl.h /^RLAPI void rlPopMatrix(void); \/\/ Pop latest inserted matrix from sta/;" p typeref:typename:RLAPI void +rlPopMatrix vendor/raylib-5.5_linux_amd64/include/rlgl.h /^void rlPopMatrix(void) { glPopMatrix(); }$/;" f typeref:typename:void +rlPopMatrix vendor/raylib-5.5_linux_amd64/include/rlgl.h /^void rlPopMatrix(void)$/;" f typeref:typename:void +rlPushMatrix vendor/raylib-5.5_linux_amd64/include/rlgl.h /^RLAPI void rlPushMatrix(void); \/\/ Push the current matrix to stack$/;" p typeref:typename:RLAPI void +rlPushMatrix vendor/raylib-5.5_linux_amd64/include/rlgl.h /^void rlPushMatrix(void) { glPushMatrix(); }$/;" f typeref:typename:void +rlPushMatrix vendor/raylib-5.5_linux_amd64/include/rlgl.h /^void rlPushMatrix(void)$/;" f typeref:typename:void +rlReadScreenPixels vendor/raylib-5.5_linux_amd64/include/rlgl.h /^RLAPI unsigned char *rlReadScreenPixels(int width, int height); \/\/ Read screen pixel/;" p typeref:typename:RLAPI unsigned char * +rlReadScreenPixels vendor/raylib-5.5_linux_amd64/include/rlgl.h /^unsigned char *rlReadScreenPixels(int width, int height)$/;" f typeref:typename:unsigned char * +rlReadShaderBuffer vendor/raylib-5.5_linux_amd64/include/rlgl.h /^RLAPI void rlReadShaderBuffer(unsigned int id, void *dest, unsigned int count, unsigned int offs/;" p typeref:typename:RLAPI void +rlReadShaderBuffer vendor/raylib-5.5_linux_amd64/include/rlgl.h /^void rlReadShaderBuffer(unsigned int id, void *dest, unsigned int count, unsigned int offset)$/;" f typeref:typename:void +rlReadTexturePixels vendor/raylib-5.5_linux_amd64/include/rlgl.h /^RLAPI void *rlReadTexturePixels(unsigned int id, int width, int height, int format); \/\/ Read t/;" p typeref:typename:RLAPI void * +rlReadTexturePixels vendor/raylib-5.5_linux_amd64/include/rlgl.h /^void *rlReadTexturePixels(unsigned int id, int width, int height, int format)$/;" f typeref:typename:void * +rlRenderBatch vendor/raylib-5.5_linux_amd64/include/rlgl.h /^typedef struct rlRenderBatch {$/;" s +rlRenderBatch vendor/raylib-5.5_linux_amd64/include/rlgl.h /^} rlRenderBatch;$/;" t typeref:struct:rlRenderBatch +rlRotatef vendor/raylib-5.5_linux_amd64/include/rlgl.h /^RLAPI void rlRotatef(float angle, float x, float y, float z); \/\/ Multiply the current matrix b/;" p typeref:typename:RLAPI void +rlRotatef vendor/raylib-5.5_linux_amd64/include/rlgl.h /^void rlRotatef(float angle, float x, float y, float z) { glRotatef(angle, x, y, z); }$/;" f typeref:typename:void +rlRotatef vendor/raylib-5.5_linux_amd64/include/rlgl.h /^void rlRotatef(float angle, float x, float y, float z)$/;" f typeref:typename:void +rlScalef vendor/raylib-5.5_linux_amd64/include/rlgl.h /^RLAPI void rlScalef(float x, float y, float z); \/\/ Multiply the current matrix by a sc/;" p typeref:typename:RLAPI void +rlScalef vendor/raylib-5.5_linux_amd64/include/rlgl.h /^void rlScalef(float x, float y, float z) { glScalef(x, y, z); }$/;" f typeref:typename:void +rlScalef vendor/raylib-5.5_linux_amd64/include/rlgl.h /^void rlScalef(float x, float y, float z)$/;" f typeref:typename:void +rlScissor vendor/raylib-5.5_linux_amd64/include/rlgl.h /^RLAPI void rlScissor(int x, int y, int width, int height); \/\/ Scissor test$/;" p typeref:typename:RLAPI void +rlScissor vendor/raylib-5.5_linux_amd64/include/rlgl.h /^void rlScissor(int x, int y, int width, int height) { glScissor(x, y, width, height); }$/;" f typeref:typename:void +rlSetBlendFactors vendor/raylib-5.5_linux_amd64/include/rlgl.h /^RLAPI void rlSetBlendFactors(int glSrcFactor, int glDstFactor, int glEquation); \/\/ Set blendin/;" p typeref:typename:RLAPI void +rlSetBlendFactors vendor/raylib-5.5_linux_amd64/include/rlgl.h /^void rlSetBlendFactors(int glSrcFactor, int glDstFactor, int glEquation)$/;" f typeref:typename:void +rlSetBlendFactorsSeparate vendor/raylib-5.5_linux_amd64/include/rlgl.h /^RLAPI void rlSetBlendFactorsSeparate(int glSrcRGB, int glDstRGB, int glSrcAlpha, int glDstAlpha,/;" p typeref:typename:RLAPI void +rlSetBlendFactorsSeparate vendor/raylib-5.5_linux_amd64/include/rlgl.h /^void rlSetBlendFactorsSeparate(int glSrcRGB, int glDstRGB, int glSrcAlpha, int glDstAlpha, int g/;" f typeref:typename:void +rlSetBlendMode vendor/raylib-5.5_linux_amd64/include/rlgl.h /^RLAPI void rlSetBlendMode(int mode); \/\/ Set blending mode$/;" p typeref:typename:RLAPI void +rlSetBlendMode vendor/raylib-5.5_linux_amd64/include/rlgl.h /^void rlSetBlendMode(int mode)$/;" f typeref:typename:void +rlSetClipPlanes vendor/raylib-5.5_linux_amd64/include/rlgl.h /^RLAPI void rlSetClipPlanes(double nearPlane, double farPlane); \/\/ Set clip planes distances$/;" p typeref:typename:RLAPI void +rlSetClipPlanes vendor/raylib-5.5_linux_amd64/include/rlgl.h /^void rlSetClipPlanes(double nearPlane, double farPlane)$/;" f typeref:typename:void +rlSetCullFace vendor/raylib-5.5_linux_amd64/include/rlgl.h /^RLAPI void rlSetCullFace(int mode); \/\/ Set face culling mode$/;" p typeref:typename:RLAPI void +rlSetCullFace vendor/raylib-5.5_linux_amd64/include/rlgl.h /^void rlSetCullFace(int mode)$/;" f typeref:typename:void +rlSetFramebufferHeight vendor/raylib-5.5_linux_amd64/include/rlgl.h /^RLAPI void rlSetFramebufferHeight(int height); \/\/ Set current framebuffer height$/;" p typeref:typename:RLAPI void +rlSetFramebufferHeight vendor/raylib-5.5_linux_amd64/include/rlgl.h /^void rlSetFramebufferHeight(int height)$/;" f typeref:typename:void +rlSetFramebufferWidth vendor/raylib-5.5_linux_amd64/include/rlgl.h /^RLAPI void rlSetFramebufferWidth(int width); \/\/ Set current framebuffer width$/;" p typeref:typename:RLAPI void +rlSetFramebufferWidth vendor/raylib-5.5_linux_amd64/include/rlgl.h /^void rlSetFramebufferWidth(int width)$/;" f typeref:typename:void +rlSetLineWidth vendor/raylib-5.5_linux_amd64/include/rlgl.h /^RLAPI void rlSetLineWidth(float width); \/\/ Set the line drawing width$/;" p typeref:typename:RLAPI void +rlSetLineWidth vendor/raylib-5.5_linux_amd64/include/rlgl.h /^void rlSetLineWidth(float width) { glLineWidth(width); }$/;" f typeref:typename:void +rlSetMatrixModelview vendor/raylib-5.5_linux_amd64/include/rlgl.h /^RLAPI void rlSetMatrixModelview(Matrix view); \/\/ Set a custom mode/;" p typeref:typename:RLAPI void +rlSetMatrixModelview vendor/raylib-5.5_linux_amd64/include/rlgl.h /^void rlSetMatrixModelview(Matrix view)$/;" f typeref:typename:void +rlSetMatrixProjection vendor/raylib-5.5_linux_amd64/include/rlgl.h /^RLAPI void rlSetMatrixProjection(Matrix proj); \/\/ Set a custom proj/;" p typeref:typename:RLAPI void +rlSetMatrixProjection vendor/raylib-5.5_linux_amd64/include/rlgl.h /^void rlSetMatrixProjection(Matrix projection)$/;" f typeref:typename:void +rlSetMatrixProjectionStereo vendor/raylib-5.5_linux_amd64/include/rlgl.h /^RLAPI void rlSetMatrixProjectionStereo(Matrix right, Matrix left); \/\/ Set eyes projecti/;" p typeref:typename:RLAPI void +rlSetMatrixProjectionStereo vendor/raylib-5.5_linux_amd64/include/rlgl.h /^void rlSetMatrixProjectionStereo(Matrix right, Matrix left)$/;" f typeref:typename:void +rlSetMatrixViewOffsetStereo vendor/raylib-5.5_linux_amd64/include/rlgl.h /^RLAPI void rlSetMatrixViewOffsetStereo(Matrix right, Matrix left); \/\/ Set eyes view off/;" p typeref:typename:RLAPI void +rlSetMatrixViewOffsetStereo vendor/raylib-5.5_linux_amd64/include/rlgl.h /^void rlSetMatrixViewOffsetStereo(Matrix right, Matrix left)$/;" f typeref:typename:void +rlSetRenderBatchActive vendor/raylib-5.5_linux_amd64/include/rlgl.h /^RLAPI void rlSetRenderBatchActive(rlRenderBatch *batch); \/\/ Set the active render batch for rl/;" p typeref:typename:RLAPI void +rlSetRenderBatchActive vendor/raylib-5.5_linux_amd64/include/rlgl.h /^void rlSetRenderBatchActive(rlRenderBatch *batch)$/;" f typeref:typename:void +rlSetShader vendor/raylib-5.5_linux_amd64/include/rlgl.h /^RLAPI void rlSetShader(unsigned int id, int *locs); \/\/ Set shader /;" p typeref:typename:RLAPI void +rlSetShader vendor/raylib-5.5_linux_amd64/include/rlgl.h /^void rlSetShader(unsigned int id, int *locs)$/;" f typeref:typename:void +rlSetTexture vendor/raylib-5.5_linux_amd64/include/rlgl.h /^RLAPI void rlSetTexture(unsigned int id); \/\/ Set current texture for render batc/;" p typeref:typename:RLAPI void +rlSetTexture vendor/raylib-5.5_linux_amd64/include/rlgl.h /^void rlSetTexture(unsigned int id)$/;" f typeref:typename:void +rlSetUniform vendor/raylib-5.5_linux_amd64/include/rlgl.h /^RLAPI void rlSetUniform(int locIndex, const void *value, int uniformType, int count); \/\/ Set s/;" p typeref:typename:RLAPI void +rlSetUniform vendor/raylib-5.5_linux_amd64/include/rlgl.h /^void rlSetUniform(int locIndex, const void *value, int uniformType, int count)$/;" f typeref:typename:void +rlSetUniformMatrices vendor/raylib-5.5_linux_amd64/include/rlgl.h /^RLAPI void rlSetUniformMatrices(int locIndex, const Matrix *mat, int count); \/\/ Set shader /;" p typeref:typename:RLAPI void +rlSetUniformMatrices vendor/raylib-5.5_linux_amd64/include/rlgl.h /^void rlSetUniformMatrices(int locIndex, const Matrix *matrices, int count)$/;" f typeref:typename:void +rlSetUniformMatrix vendor/raylib-5.5_linux_amd64/include/rlgl.h /^RLAPI void rlSetUniformMatrix(int locIndex, Matrix mat); \/\/ Set shader /;" p typeref:typename:RLAPI void +rlSetUniformMatrix vendor/raylib-5.5_linux_amd64/include/rlgl.h /^void rlSetUniformMatrix(int locIndex, Matrix mat)$/;" f typeref:typename:void +rlSetUniformSampler vendor/raylib-5.5_linux_amd64/include/rlgl.h /^RLAPI void rlSetUniformSampler(int locIndex, unsigned int textureId); \/\/ Set shader /;" p typeref:typename:RLAPI void +rlSetUniformSampler vendor/raylib-5.5_linux_amd64/include/rlgl.h /^void rlSetUniformSampler(int locIndex, unsigned int textureId)$/;" f typeref:typename:void +rlSetVertexAttribute vendor/raylib-5.5_linux_amd64/include/rlgl.h /^RLAPI void rlSetVertexAttribute(unsigned int index, int compSize, int type, bool normalized, int/;" p typeref:typename:RLAPI void +rlSetVertexAttribute vendor/raylib-5.5_linux_amd64/include/rlgl.h /^void rlSetVertexAttribute(unsigned int index, int compSize, int type, bool normalized, int strid/;" f typeref:typename:void +rlSetVertexAttributeDefault vendor/raylib-5.5_linux_amd64/include/rlgl.h /^RLAPI void rlSetVertexAttributeDefault(int locIndex, const void *value, int attribType, int coun/;" p typeref:typename:RLAPI void +rlSetVertexAttributeDefault vendor/raylib-5.5_linux_amd64/include/rlgl.h /^void rlSetVertexAttributeDefault(int locIndex, const void *value, int attribType, int count)$/;" f typeref:typename:void +rlSetVertexAttributeDivisor vendor/raylib-5.5_linux_amd64/include/rlgl.h /^RLAPI void rlSetVertexAttributeDivisor(unsigned int index, int divisor); \/\/ Set vertex attribu/;" p typeref:typename:RLAPI void +rlSetVertexAttributeDivisor vendor/raylib-5.5_linux_amd64/include/rlgl.h /^void rlSetVertexAttributeDivisor(unsigned int index, int divisor)$/;" f typeref:typename:void +rlShaderAttributeDataType vendor/raylib-5.5_linux_amd64/include/rlgl.h /^} rlShaderAttributeDataType;$/;" t typeref:enum:__anon1f68b8bd0903 +rlShaderLocationIndex vendor/raylib-5.5_linux_amd64/include/rlgl.h /^} rlShaderLocationIndex;$/;" t typeref:enum:__anon1f68b8bd0703 +rlShaderUniformDataType vendor/raylib-5.5_linux_amd64/include/rlgl.h /^} rlShaderUniformDataType;$/;" t typeref:enum:__anon1f68b8bd0803 +rlTexCoord2f vendor/raylib-5.5_linux_amd64/include/rlgl.h /^RLAPI void rlTexCoord2f(float x, float y); \/\/ Define one vertex (texture coordina/;" p typeref:typename:RLAPI void +rlTexCoord2f vendor/raylib-5.5_linux_amd64/include/rlgl.h /^void rlTexCoord2f(float x, float y) { glTexCoord2f(x, y); }$/;" f typeref:typename:void +rlTexCoord2f vendor/raylib-5.5_linux_amd64/include/rlgl.h /^void rlTexCoord2f(float x, float y)$/;" f typeref:typename:void +rlTextureFilter vendor/raylib-5.5_linux_amd64/include/rlgl.h /^} rlTextureFilter;$/;" t typeref:enum:__anon1f68b8bd0503 +rlTextureParameters vendor/raylib-5.5_linux_amd64/include/rlgl.h /^RLAPI void rlTextureParameters(unsigned int id, int param, int value); \/\/ Set texture paramete/;" p typeref:typename:RLAPI void +rlTextureParameters vendor/raylib-5.5_linux_amd64/include/rlgl.h /^void rlTextureParameters(unsigned int id, int param, int value)$/;" f typeref:typename:void +rlTraceLogLevel vendor/raylib-5.5_linux_amd64/include/rlgl.h /^} rlTraceLogLevel;$/;" t typeref:enum:__anon1f68b8bd0303 +rlTranslatef vendor/raylib-5.5_linux_amd64/include/rlgl.h /^RLAPI void rlTranslatef(float x, float y, float z); \/\/ Multiply the current matrix by a tr/;" p typeref:typename:RLAPI void +rlTranslatef vendor/raylib-5.5_linux_amd64/include/rlgl.h /^void rlTranslatef(float x, float y, float z) { glTranslatef(x, y, z); }$/;" f typeref:typename:void +rlTranslatef vendor/raylib-5.5_linux_amd64/include/rlgl.h /^void rlTranslatef(float x, float y, float z)$/;" f typeref:typename:void +rlUnloadFramebuffer vendor/raylib-5.5_linux_amd64/include/rlgl.h /^RLAPI void rlUnloadFramebuffer(unsigned int id); \/\/ Delete framebuffe/;" p typeref:typename:RLAPI void +rlUnloadFramebuffer vendor/raylib-5.5_linux_amd64/include/rlgl.h /^void rlUnloadFramebuffer(unsigned int id)$/;" f typeref:typename:void +rlUnloadRenderBatch vendor/raylib-5.5_linux_amd64/include/rlgl.h /^RLAPI void rlUnloadRenderBatch(rlRenderBatch batch); \/\/ Unload render batch system$/;" p typeref:typename:RLAPI void +rlUnloadRenderBatch vendor/raylib-5.5_linux_amd64/include/rlgl.h /^void rlUnloadRenderBatch(rlRenderBatch batch)$/;" f typeref:typename:void +rlUnloadShaderBuffer vendor/raylib-5.5_linux_amd64/include/rlgl.h /^RLAPI void rlUnloadShaderBuffer(unsigned int ssboId); \/\/ Unload shad/;" p typeref:typename:RLAPI void +rlUnloadShaderBuffer vendor/raylib-5.5_linux_amd64/include/rlgl.h /^void rlUnloadShaderBuffer(unsigned int ssboId)$/;" f typeref:typename:void +rlUnloadShaderDefault vendor/raylib-5.5_linux_amd64/include/rlgl.h /^static void rlUnloadShaderDefault(void)$/;" f typeref:typename:void +rlUnloadShaderDefault vendor/raylib-5.5_linux_amd64/include/rlgl.h /^static void rlUnloadShaderDefault(void); \/\/ Unload default shader$/;" p typeref:typename:void +rlUnloadShaderProgram vendor/raylib-5.5_linux_amd64/include/rlgl.h /^RLAPI void rlUnloadShaderProgram(unsigned int id); \/\/ Unload shad/;" p typeref:typename:RLAPI void +rlUnloadShaderProgram vendor/raylib-5.5_linux_amd64/include/rlgl.h /^void rlUnloadShaderProgram(unsigned int id)$/;" f typeref:typename:void +rlUnloadTexture vendor/raylib-5.5_linux_amd64/include/rlgl.h /^RLAPI void rlUnloadTexture(unsigned int id); \/\/ Unload texture fr/;" p typeref:typename:RLAPI void +rlUnloadTexture vendor/raylib-5.5_linux_amd64/include/rlgl.h /^void rlUnloadTexture(unsigned int id)$/;" f typeref:typename:void +rlUnloadVertexArray vendor/raylib-5.5_linux_amd64/include/rlgl.h /^RLAPI void rlUnloadVertexArray(unsigned int vaoId); \/\/ Unload vertex array (vao)$/;" p typeref:typename:RLAPI void +rlUnloadVertexArray vendor/raylib-5.5_linux_amd64/include/rlgl.h /^void rlUnloadVertexArray(unsigned int vaoId)$/;" f typeref:typename:void +rlUnloadVertexBuffer vendor/raylib-5.5_linux_amd64/include/rlgl.h /^RLAPI void rlUnloadVertexBuffer(unsigned int vboId); \/\/ Unload vertex buffer object$/;" p typeref:typename:RLAPI void +rlUnloadVertexBuffer vendor/raylib-5.5_linux_amd64/include/rlgl.h /^void rlUnloadVertexBuffer(unsigned int vboId)$/;" f typeref:typename:void +rlUpdateShaderBuffer vendor/raylib-5.5_linux_amd64/include/rlgl.h /^RLAPI void rlUpdateShaderBuffer(unsigned int id, const void *data, unsigned int dataSize, unsign/;" p typeref:typename:RLAPI void +rlUpdateShaderBuffer vendor/raylib-5.5_linux_amd64/include/rlgl.h /^void rlUpdateShaderBuffer(unsigned int id, const void *data, unsigned int dataSize, unsigned int/;" f typeref:typename:void +rlUpdateTexture vendor/raylib-5.5_linux_amd64/include/rlgl.h /^RLAPI void rlUpdateTexture(unsigned int id, int offsetX, int offsetY, int width, int height, int/;" p typeref:typename:RLAPI void +rlUpdateTexture vendor/raylib-5.5_linux_amd64/include/rlgl.h /^void rlUpdateTexture(unsigned int id, int offsetX, int offsetY, int width, int height, int forma/;" f typeref:typename:void +rlUpdateVertexBuffer vendor/raylib-5.5_linux_amd64/include/rlgl.h /^RLAPI void rlUpdateVertexBuffer(unsigned int bufferId, const void *data, int dataSize, int offse/;" p typeref:typename:RLAPI void +rlUpdateVertexBuffer vendor/raylib-5.5_linux_amd64/include/rlgl.h /^void rlUpdateVertexBuffer(unsigned int id, const void *data, int dataSize, int offset)$/;" f typeref:typename:void +rlUpdateVertexBufferElements vendor/raylib-5.5_linux_amd64/include/rlgl.h /^RLAPI void rlUpdateVertexBufferElements(unsigned int id, const void *data, int dataSize, int off/;" p typeref:typename:RLAPI void +rlUpdateVertexBufferElements vendor/raylib-5.5_linux_amd64/include/rlgl.h /^void rlUpdateVertexBufferElements(unsigned int id, const void *data, int dataSize, int offset)$/;" f typeref:typename:void +rlVertex2f vendor/raylib-5.5_linux_amd64/include/rlgl.h /^RLAPI void rlVertex2f(float x, float y); \/\/ Define one vertex (position) - 2 fl/;" p typeref:typename:RLAPI void +rlVertex2f vendor/raylib-5.5_linux_amd64/include/rlgl.h /^void rlVertex2f(float x, float y) { glVertex2f(x, y); }$/;" f typeref:typename:void +rlVertex2f vendor/raylib-5.5_linux_amd64/include/rlgl.h /^void rlVertex2f(float x, float y)$/;" f typeref:typename:void +rlVertex2i vendor/raylib-5.5_linux_amd64/include/rlgl.h /^RLAPI void rlVertex2i(int x, int y); \/\/ Define one vertex (position) - 2 in/;" p typeref:typename:RLAPI void +rlVertex2i vendor/raylib-5.5_linux_amd64/include/rlgl.h /^void rlVertex2i(int x, int y) { glVertex2i(x, y); }$/;" f typeref:typename:void +rlVertex2i vendor/raylib-5.5_linux_amd64/include/rlgl.h /^void rlVertex2i(int x, int y)$/;" f typeref:typename:void +rlVertex3f vendor/raylib-5.5_linux_amd64/include/rlgl.h /^RLAPI void rlVertex3f(float x, float y, float z); \/\/ Define one vertex (position) - 3 fl/;" p typeref:typename:RLAPI void +rlVertex3f vendor/raylib-5.5_linux_amd64/include/rlgl.h /^void rlVertex3f(float x, float y, float z) { glVertex3f(x, y, z); }$/;" f typeref:typename:void +rlVertex3f vendor/raylib-5.5_linux_amd64/include/rlgl.h /^void rlVertex3f(float x, float y, float z)$/;" f typeref:typename:void +rlVertexBuffer vendor/raylib-5.5_linux_amd64/include/rlgl.h /^typedef struct rlVertexBuffer {$/;" s +rlVertexBuffer vendor/raylib-5.5_linux_amd64/include/rlgl.h /^} rlVertexBuffer;$/;" t typeref:struct:rlVertexBuffer +rlViewport vendor/raylib-5.5_linux_amd64/include/rlgl.h /^RLAPI void rlViewport(int x, int y, int width, int height); \/\/ Set the viewport area$/;" p typeref:typename:RLAPI void +rlViewport vendor/raylib-5.5_linux_amd64/include/rlgl.h /^void rlViewport(int x, int y, int width, int height)$/;" f typeref:typename:void +rl_float16 vendor/raylib-5.5_linux_amd64/include/rlgl.h /^typedef struct rl_float16 {$/;" s +rl_float16 vendor/raylib-5.5_linux_amd64/include/rlgl.h /^} rl_float16;$/;" t typeref:struct:rl_float16 +rlglClose vendor/raylib-5.5_linux_amd64/include/rlgl.h /^RLAPI void rlglClose(void); \/\/ De-initialize rlgl (buffers, shader/;" p typeref:typename:RLAPI void +rlglClose vendor/raylib-5.5_linux_amd64/include/rlgl.h /^void rlglClose(void)$/;" f typeref:typename:void +rlglData vendor/raylib-5.5_linux_amd64/include/rlgl.h /^typedef struct rlglData {$/;" s +rlglData vendor/raylib-5.5_linux_amd64/include/rlgl.h /^} rlglData;$/;" t typeref:struct:rlglData +rlglInit vendor/raylib-5.5_linux_amd64/include/rlgl.h /^RLAPI void rlglInit(int width, int height); \/\/ Initialize rlgl (buffers, shaders, /;" p typeref:typename:RLAPI void +rlglInit vendor/raylib-5.5_linux_amd64/include/rlgl.h /^void rlglInit(int width, int height)$/;" f typeref:typename:void +rlglLoadProc vendor/raylib-5.5_linux_amd64/include/rlgl.h /^typedef void *(*rlglLoadProc)(const char *name); \/\/ OpenGL extension functions loader signat/;" t typeref:typename:void * (*)(const char * name) +rname vendor/lua-5.4.8/src/ldebug.c /^static void rname (const Proto *p, int pc, int c, const char **name) {$/;" f typeref:typename:void file: +rotation vendor/raylib-5.5_linux_amd64/include/raylib.h /^ Quaternion rotation; \/\/ Rotation$/;" m struct:Transform typeref:typename:Quaternion +rotation vendor/raylib-5.5_linux_amd64/include/raylib.h /^ float rotation; \/\/ Camera rotation in degrees$/;" m struct:Camera2D typeref:typename:float +rotl vendor/lua-5.4.8/src/lmathlib.c /^static Rand64 rotl (Rand64 i, int n) {$/;" f typeref:typename:Rand64 file: +rotl vendor/lua-5.4.8/src/lmathlib.c /^static Rand64 rotl (Rand64 x, int n) {$/;" f typeref:typename:Rand64 file: +rotl1 vendor/lua-5.4.8/src/lmathlib.c /^static Rand64 rotl1 (Rand64 i, int n) {$/;" f typeref:typename:Rand64 file: +runafewfinalizers vendor/lua-5.4.8/src/lgc.c /^static int runafewfinalizers (lua_State *L, int n) {$/;" f typeref:typename:int file: +runargs vendor/lua-5.4.8/src/lua.c /^static int runargs (lua_State *L, char **argv, int n) {$/;" f typeref:typename:int file: +s vendor/lua-5.4.8/src/lauxlib.c /^ const char *s;$/;" m struct:LoadS typeref:typename:const char * file: +s vendor/lua-5.4.8/src/lmathlib.c /^ Rand64 s[4];$/;" m struct:__anonc6ac66720108 typeref:typename:Rand64[4] file: +s2v vendor/lua-5.4.8/src/lobject.h /^#define s2v(/;" d +sC2int vendor/lua-5.4.8/src/lopcodes.h /^#define sC2int(/;" d +sampleRate vendor/raylib-5.5_linux_amd64/include/raylib.h /^ unsigned int sampleRate; \/\/ Frequency (samples per second)$/;" m struct:AudioStream typeref:typename:unsigned int +sampleRate vendor/raylib-5.5_linux_amd64/include/raylib.h /^ unsigned int sampleRate; \/\/ Frequency (samples per second)$/;" m struct:Wave typeref:typename:unsigned int +sampleSize vendor/raylib-5.5_linux_amd64/include/raylib.h /^ unsigned int sampleSize; \/\/ Bit depth (bits per sample): 8, 16, 32 (24 not supported)$/;" m struct:AudioStream typeref:typename:unsigned int +sampleSize vendor/raylib-5.5_linux_amd64/include/raylib.h /^ unsigned int sampleSize; \/\/ Bit depth (bits per sample): 8, 16, 32 (24 not supported)$/;" m struct:Wave typeref:typename:unsigned int +save vendor/lua-5.4.8/src/llex.c /^static void save (LexState *ls, int c) {$/;" f typeref:typename:void file: +save_and_next vendor/lua-5.4.8/src/llex.c /^#define save_and_next(/;" d file: +savedpc vendor/lua-5.4.8/src/lstate.h /^ const Instruction *savedpc;$/;" m struct:CallInfo::__anona701f1f7010a::__anona701f1f70208 typeref:typename:const Instruction * +savelineinfo vendor/lua-5.4.8/src/lcode.c /^static void savelineinfo (FuncState *fs, Proto *f, int line) {$/;" f typeref:typename:void file: +savepc vendor/lua-5.4.8/src/lvm.c /^#define savepc(/;" d file: +savestack vendor/lua-5.4.8/src/ldo.h /^#define savestack(/;" d +savestate vendor/lua-5.4.8/src/lvm.c /^#define savestate(/;" d file: +scale vendor/raylib-5.5_linux_amd64/include/raylib.h /^ Vector3 scale; \/\/ Scale$/;" m struct:Transform typeref:typename:Vector3 +scale vendor/raylib-5.5_linux_amd64/include/raylib.h /^ float scale[2]; \/\/ VR distortion scale$/;" m struct:VrStereoConfig typeref:typename:float[2] +scaleFIG vendor/lua-5.4.8/src/lmathlib.c /^#define scaleFIG /;" d file: +scaleFIG vendor/lua-5.4.8/src/lmathlib.c /^#define scaleFIG /;" d file: +scaleIn vendor/raylib-5.5_linux_amd64/include/raylib.h /^ float scaleIn[2]; \/\/ VR distortion scale in$/;" m struct:VrStereoConfig typeref:typename:float[2] +searcher_C vendor/lua-5.4.8/src/loadlib.c /^static int searcher_C (lua_State *L) {$/;" f typeref:typename:int file: +searcher_Croot vendor/lua-5.4.8/src/loadlib.c /^static int searcher_Croot (lua_State *L) {$/;" f typeref:typename:int file: +searcher_Lua vendor/lua-5.4.8/src/loadlib.c /^static int searcher_Lua (lua_State *L) {$/;" f typeref:typename:int file: +searcher_preload vendor/lua-5.4.8/src/loadlib.c /^static int searcher_preload (lua_State *L) {$/;" f typeref:typename:int file: +searchpath vendor/lua-5.4.8/src/loadlib.c /^static const char *searchpath (lua_State *L, const char *name,$/;" f typeref:typename:const char * file: +searchupvalue vendor/lua-5.4.8/src/lparser.c /^static int searchupvalue (FuncState *fs, TString *name) {$/;" f typeref:typename:int file: +searchvar vendor/lua-5.4.8/src/lparser.c /^static int searchvar (FuncState *fs, TString *n, expdesc *var) {$/;" f typeref:typename:int file: +seed vendor/lua-5.4.8/src/lstate.h /^ unsigned int seed; \/* randomized seed for hashes *\/$/;" m struct:global_State typeref:typename:unsigned int +seminfo vendor/lua-5.4.8/src/llex.h /^ SemInfo seminfo;$/;" m struct:Token typeref:typename:SemInfo +separatetobefnz vendor/lua-5.4.8/src/lgc.c /^static void separatetobefnz (global_State *g, int all) {$/;" f typeref:typename:void file: +set2 vendor/lua-5.4.8/src/ltablib.c /^static void set2 (lua_State *L, IdxT i, IdxT j) {$/;" f typeref:typename:void file: +set2black vendor/lua-5.4.8/src/lgc.c /^#define set2black(/;" d file: +set2gray vendor/lua-5.4.8/src/lgc.c /^#define set2gray(/;" d file: +setage vendor/lua-5.4.8/src/lgc.h /^#define setage(/;" d +setallfields vendor/lua-5.4.8/src/loslib.c /^static void setallfields (lua_State *L, struct tm *stm) {$/;" f typeref:typename:void file: +setarg vendor/lua-5.4.8/src/lopcodes.h /^#define setarg(/;" d +setbfvalue vendor/lua-5.4.8/src/lobject.h /^#define setbfvalue(/;" d +setbits vendor/lua-5.4.8/src/lgc.h /^#define setbits(/;" d +setboolfield vendor/lua-5.4.8/src/loslib.c /^static void setboolfield (lua_State *L, const char *key, int value) {$/;" f typeref:typename:void file: +setbtvalue vendor/lua-5.4.8/src/lobject.h /^#define setbtvalue(/;" d +setcistrecst vendor/lua-5.4.8/src/lstate.h /^#define setcistrecst(/;" d +setclCvalue vendor/lua-5.4.8/src/lobject.h /^#define setclCvalue(/;" d +setclLvalue vendor/lua-5.4.8/src/lobject.h /^#define setclLvalue(/;" d +setclLvalue2s vendor/lua-5.4.8/src/lobject.h /^#define setclLvalue2s(/;" d +setdeadkey vendor/lua-5.4.8/src/lobject.h /^#define setdeadkey(/;" d +setempty vendor/lua-5.4.8/src/lobject.h /^#define setempty(/;" d +setfield vendor/lua-5.4.8/src/loslib.c /^static void setfield (lua_State *L, const char *key, int value, int delta) {$/;" f typeref:typename:void file: +setfltvalue vendor/lua-5.4.8/src/lobject.h /^#define setfltvalue(/;" d +setfvalue vendor/lua-5.4.8/src/lobject.h /^#define setfvalue(/;" d +setgcovalue vendor/lua-5.4.8/src/lobject.h /^#define setgcovalue(/;" d +setgcparam vendor/lua-5.4.8/src/lgc.h /^#define setgcparam(/;" d +sethvalue vendor/lua-5.4.8/src/lobject.h /^#define sethvalue(/;" d +sethvalue2s vendor/lua-5.4.8/src/lobject.h /^#define sethvalue2s(/;" d +setivalue vendor/lua-5.4.8/src/lobject.h /^#define setivalue(/;" d +setlimittosize vendor/lua-5.4.8/src/ltable.c /^static unsigned int setlimittosize (Table *t) {$/;" f typeref:typename:unsigned int file: +setminordebt vendor/lua-5.4.8/src/lgc.c /^static void setminordebt (global_State *g) {$/;" f typeref:typename:void file: +setnilkey vendor/lua-5.4.8/src/lobject.h /^#define setnilkey(/;" d +setnilvalue vendor/lua-5.4.8/src/lobject.h /^#define setnilvalue(/;" d +setnodekey vendor/lua-5.4.8/src/lobject.h /^#define setnodekey(/;" d +setnodevector vendor/lua-5.4.8/src/ltable.c /^static void setnodevector (lua_State *L, Table *t, unsigned int size) {$/;" f typeref:typename:void file: +setnorealasize vendor/lua-5.4.8/src/lobject.h /^#define setnorealasize(/;" d +setoah vendor/lua-5.4.8/src/lstate.h /^#define setoah(/;" d +setobj vendor/lua-5.4.8/src/lobject.h /^#define setobj(/;" d +setobj2n vendor/lua-5.4.8/src/lobject.h /^#define setobj2n /;" d +setobj2s vendor/lua-5.4.8/src/lobject.h /^#define setobj2s(/;" d +setobj2t vendor/lua-5.4.8/src/lobject.h /^#define setobj2t /;" d +setobjs2s vendor/lua-5.4.8/src/lobject.h /^#define setobjs2s(/;" d +setobjt2t vendor/lua-5.4.8/src/lobject.h /^#define setobjt2t /;" d +setpath vendor/lua-5.4.8/src/loadlib.c /^static void setpath (lua_State *L, const char *fieldname,$/;" f typeref:typename:void file: +setpause vendor/lua-5.4.8/src/lgc.c /^static void setpause (global_State *g) {$/;" f typeref:typename:void file: +setprogdir vendor/lua-5.4.8/src/loadlib.c /^#define setprogdir(/;" d file: +setprogdir vendor/lua-5.4.8/src/loadlib.c /^static void setprogdir (lua_State *L) {$/;" f typeref:typename:void file: +setpvalue vendor/lua-5.4.8/src/lobject.h /^#define setpvalue(/;" d +setrandfunc vendor/lua-5.4.8/src/lmathlib.c /^static void setrandfunc (lua_State *L) {$/;" f typeref:typename:void file: +setrealasize vendor/lua-5.4.8/src/lobject.h /^#define setrealasize(/;" d +setseed vendor/lua-5.4.8/src/lmathlib.c /^static void setseed (lua_State *L, Rand64 *state,$/;" f typeref:typename:void file: +setsignal vendor/lua-5.4.8/src/lua.c /^#define setsignal /;" d file: +setsignal vendor/lua-5.4.8/src/lua.c /^static void setsignal (int sig, void (*handler)(int)) {$/;" f typeref:typename:void file: +setsvalue vendor/lua-5.4.8/src/lobject.h /^#define setsvalue(/;" d +setsvalue2n vendor/lua-5.4.8/src/lobject.h /^#define setsvalue2n /;" d +setsvalue2s vendor/lua-5.4.8/src/lobject.h /^#define setsvalue2s(/;" d +settabsb vendor/lua-5.4.8/src/ldblib.c /^static void settabsb (lua_State *L, const char *k, int v) {$/;" f typeref:typename:void file: +settabsi vendor/lua-5.4.8/src/ldblib.c /^static void settabsi (lua_State *L, const char *k, int v) {$/;" f typeref:typename:void file: +settabss vendor/lua-5.4.8/src/ldblib.c /^static void settabss (lua_State *L, const char *k, const char *v) {$/;" f typeref:typename:void file: +setthvalue vendor/lua-5.4.8/src/lobject.h /^#define setthvalue(/;" d +setthvalue2s vendor/lua-5.4.8/src/lobject.h /^#define setthvalue2s(/;" d +settraps vendor/lua-5.4.8/src/ldebug.c /^static void settraps (CallInfo *ci) {$/;" f typeref:typename:void file: +settt_ vendor/lua-5.4.8/src/lobject.h /^#define settt_(/;" d +setuvalue vendor/lua-5.4.8/src/lobject.h /^#define setuvalue(/;" d +setvararg vendor/lua-5.4.8/src/lparser.c /^static void setvararg (FuncState *fs, int nparams) {$/;" f typeref:typename:void file: +shader vendor/raylib-5.5_linux_amd64/include/raylib.h /^ Shader shader; \/\/ Material shader$/;" m struct:Material typeref:typename:Shader +shift64_FIG vendor/lua-5.4.8/src/lmathlib.c /^#define shift64_FIG /;" d file: +shiftHI vendor/lua-5.4.8/src/lmathlib.c /^#define shiftHI /;" d file: +shiftLOW vendor/lua-5.4.8/src/lmathlib.c /^#define shiftLOW /;" d file: +short_src vendor/lua-5.4.8/src/lua.h /^ char short_src[LUA_IDSIZE]; \/* (S) *\/$/;" m struct:lua_Debug typeref:typename:char[] +shrlen vendor/lua-5.4.8/src/lobject.h /^ lu_byte shrlen; \/* length for short strings, 0xFF for long strings *\/$/;" m struct:TString typeref:typename:lu_byte +simpleexp vendor/lua-5.4.8/src/lparser.c /^static void simpleexp (LexState *ls, expdesc *v) {$/;" f typeref:typename:void file: +singlematch vendor/lua-5.4.8/src/lstrlib.c /^static int singlematch (MatchState *ms, const char *s, const char *p,$/;" f typeref:typename:int file: +singlestep vendor/lua-5.4.8/src/lgc.c /^static lu_mem singlestep (lua_State *L) {$/;" f typeref:typename:lu_mem file: +singlevar vendor/lua-5.4.8/src/lparser.c /^static void singlevar (LexState *ls, expdesc *var) {$/;" f typeref:typename:void file: +singlevaraux vendor/lua-5.4.8/src/lparser.c /^static void singlevaraux (FuncState *fs, TString *n, expdesc *var, int base) {$/;" f typeref:typename:void file: +size vendor/lua-5.4.8/src/lauxlib.c /^ size_t size;$/;" m struct:LoadS typeref:typename:size_t file: +size vendor/lua-5.4.8/src/lauxlib.h /^ size_t size; \/* buffer size *\/$/;" m struct:luaL_Buffer typeref:typename:size_t +size vendor/lua-5.4.8/src/lparser.h /^ int size;$/;" m struct:Dyndata::__anon337ee4430608 typeref:typename:int +size vendor/lua-5.4.8/src/lparser.h /^ int size; \/* array size *\/$/;" m struct:Labellist typeref:typename:int +size vendor/lua-5.4.8/src/lstate.h /^ int size;$/;" m struct:stringtable typeref:typename:int +sizeCclosure vendor/lua-5.4.8/src/lfunc.h /^#define sizeCclosure(/;" d +sizeLclosure vendor/lua-5.4.8/src/lfunc.h /^#define sizeLclosure(/;" d +size_t vendor/lua-5.4.8/src/lua.h /^LUA_API size_t (lua_stringtonumber) (lua_State *L, const char *s);$/;" p typeref:typename:LUA_API +sizeabslineinfo vendor/lua-5.4.8/src/lobject.h /^ int sizeabslineinfo; \/* size of 'abslineinfo' *\/$/;" m struct:Proto typeref:typename:int +sizecode vendor/lua-5.4.8/src/lobject.h /^ int sizecode;$/;" m struct:Proto typeref:typename:int +sizek vendor/lua-5.4.8/src/lobject.h /^ int sizek; \/* size of 'k' *\/$/;" m struct:Proto typeref:typename:int +sizelineinfo vendor/lua-5.4.8/src/lobject.h /^ int sizelineinfo;$/;" m struct:Proto typeref:typename:int +sizelocvars vendor/lua-5.4.8/src/lobject.h /^ int sizelocvars;$/;" m struct:Proto typeref:typename:int +sizelstring vendor/lua-5.4.8/src/lstring.h /^#define sizelstring(/;" d +sizenode vendor/lua-5.4.8/src/lobject.h /^#define sizenode(/;" d +sizep vendor/lua-5.4.8/src/lobject.h /^ int sizep; \/* size of 'p' *\/$/;" m struct:Proto typeref:typename:int +sizeudata vendor/lua-5.4.8/src/lobject.h /^#define sizeudata(/;" d +sizeupvalues vendor/lua-5.4.8/src/lobject.h /^ int sizeupvalues; \/* size of 'upvalues' *\/$/;" m struct:Proto typeref:typename:int +skipBOM vendor/lua-5.4.8/src/lauxlib.c /^static int skipBOM (FILE *f) {$/;" f typeref:typename:int file: +skip_sep vendor/lua-5.4.8/src/llex.c /^static size_t skip_sep (LexState *ls) {$/;" f typeref:typename:size_t file: +skipcomment vendor/lua-5.4.8/src/lauxlib.c /^static int skipcomment (FILE *f, int *cp) {$/;" f typeref:typename:int file: +sof vendor/lua-5.4.8/src/ltablib.c /^#define sof(/;" d file: +solaris vendor/lua-5.4.8/src/Makefile /^SunOS solaris:$/;" t +solvegoto vendor/lua-5.4.8/src/lparser.c /^static void solvegoto (LexState *ls, int g, Labeldesc *label) {$/;" f typeref:typename:void file: +solvegotos vendor/lua-5.4.8/src/lparser.c /^static int solvegotos (LexState *ls, Labeldesc *lb) {$/;" f typeref:typename:int file: +sort vendor/lua-5.4.8/src/ltablib.c /^static int sort (lua_State *L) {$/;" f typeref:typename:int file: +sort_comp vendor/lua-5.4.8/src/ltablib.c /^static int sort_comp (lua_State *L, int a, int b) {$/;" f typeref:typename:int file: +source vendor/lua-5.4.8/src/llex.h /^ TString *source; \/* current source name *\/$/;" m struct:LexState typeref:typename:TString * +source vendor/lua-5.4.8/src/lobject.h /^ TString *source; \/* used for debug information *\/$/;" m struct:Proto typeref:typename:TString * +source vendor/lua-5.4.8/src/lua.h /^ const char *source; \/* (S) *\/$/;" m struct:lua_Debug typeref:typename:const char * +source vendor/raylib-5.5_linux_amd64/include/raylib.h /^ Rectangle source; \/\/ Texture source rectangle$/;" m struct:NPatchInfo typeref:typename:Rectangle +space vendor/lua-5.4.8/src/lobject.c /^ char space[BUFVFS]; \/* holds last part of the result *\/$/;" m struct:BuffFS typeref:typename:char[] file: +src vendor/lua-5.4.8/src/lstrlib.c /^ const char *src; \/* current position *\/$/;" m struct:GMatchState typeref:typename:const char * file: +src_end vendor/lua-5.4.8/src/lstrlib.c /^ const char *src_end; \/* end ('\\0') of source string *\/$/;" m struct:MatchState typeref:typename:const char * file: +src_init vendor/lua-5.4.8/src/lstrlib.c /^ const char *src_init; \/* init of source string *\/$/;" m struct:MatchState typeref:typename:const char * file: +srclen vendor/lua-5.4.8/src/lua.h /^ size_t srclen; \/* (S) *\/$/;" m struct:lua_Debug typeref:typename:size_t +ssbo vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ bool ssbo; \/\/ Shader storage buffer object support (GL_ARB_sh/;" m struct:rlglData::__anon1f68b8bd0e08 typeref:typename:bool +stack vendor/lua-5.4.8/src/lstate.h /^ StkIdRel stack; \/* stack base *\/$/;" m struct:lua_State typeref:typename:StkIdRel +stack vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ Matrix stack[RL_MAX_MATRIX_STACK_SIZE];\/\/ Matrix stack for push\/pop$/;" m struct:rlglData::__anon1f68b8bd0d08 typeref:typename:Matrix[] +stackCounter vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ int stackCounter; \/\/ Matrix stack counter$/;" m struct:rlglData::__anon1f68b8bd0d08 typeref:typename:int +stack_init vendor/lua-5.4.8/src/lstate.c /^static void stack_init (lua_State *L1, lua_State *L) {$/;" f typeref:typename:void file: +stack_last vendor/lua-5.4.8/src/lstate.h /^ StkIdRel stack_last; \/* end of stack (last element + 1) *\/$/;" m struct:lua_State typeref:typename:StkIdRel +stackinuse vendor/lua-5.4.8/src/ldo.c /^static int stackinuse (lua_State *L) {$/;" f typeref:typename:int file: +stacksize vendor/lua-5.4.8/src/lstate.h /^#define stacksize(/;" d +start_capture vendor/lua-5.4.8/src/lstrlib.c /^static const char *start_capture (MatchState *ms, const char *s,$/;" f typeref:typename:const char * file: +startpc vendor/lua-5.4.8/src/lobject.h /^ int startpc; \/* first point where variable is active *\/$/;" m struct:LocVar typeref:typename:int +statement vendor/lua-5.4.8/src/lparser.c /^static void statement (LexState *ls) {$/;" f typeref:typename:void file: +statement vendor/lua-5.4.8/src/lparser.c /^static void statement (LexState *ls);$/;" p typeref:typename:void file: +statlist vendor/lua-5.4.8/src/lparser.c /^static void statlist (LexState *ls) {$/;" f typeref:typename:void file: +statname vendor/lua-5.4.8/src/lcorolib.c /^static const char *const statname[] =$/;" v typeref:typename:const char * const[] file: +status vendor/lua-5.4.8/src/ldo.c /^ int status;$/;" m struct:CloseP typeref:typename:int file: +status vendor/lua-5.4.8/src/ldo.c /^ volatile int status; \/* error code *\/$/;" m struct:lua_longjmp typeref:typename:volatile int file: +status vendor/lua-5.4.8/src/ldump.c /^ int status;$/;" m struct:__anon6dcdaf670108 typeref:typename:int file: +status vendor/lua-5.4.8/src/lstate.h /^ lu_byte status;$/;" m struct:lua_State typeref:typename:lu_byte +stepgenfull vendor/lua-5.4.8/src/lgc.c /^static void stepgenfull (lua_State *L, global_State *g) {$/;" f typeref:typename:void file: +stereoRender vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ bool stereoRender; \/\/ Stereo rendering flag$/;" m struct:rlglData::__anon1f68b8bd0d08 typeref:typename:bool +str2K vendor/lua-5.4.8/src/lcode.c /^static void str2K (FuncState *fs, expdesc *e) {$/;" f typeref:typename:void file: +str_Writer vendor/lua-5.4.8/src/lstrlib.c /^struct str_Writer {$/;" s file: +str_byte vendor/lua-5.4.8/src/lstrlib.c /^static int str_byte (lua_State *L) {$/;" f typeref:typename:int file: +str_char vendor/lua-5.4.8/src/lstrlib.c /^static int str_char (lua_State *L) {$/;" f typeref:typename:int file: +str_checkname vendor/lua-5.4.8/src/lparser.c /^static TString *str_checkname (LexState *ls) {$/;" f typeref:typename:TString * file: +str_dump vendor/lua-5.4.8/src/lstrlib.c /^static int str_dump (lua_State *L) {$/;" f typeref:typename:int file: +str_find vendor/lua-5.4.8/src/lstrlib.c /^static int str_find (lua_State *L) {$/;" f typeref:typename:int file: +str_find_aux vendor/lua-5.4.8/src/lstrlib.c /^static int str_find_aux (lua_State *L, int find) {$/;" f typeref:typename:int file: +str_format vendor/lua-5.4.8/src/lstrlib.c /^static int str_format (lua_State *L) {$/;" f typeref:typename:int file: +str_gsub vendor/lua-5.4.8/src/lstrlib.c /^static int str_gsub (lua_State *L) {$/;" f typeref:typename:int file: +str_len vendor/lua-5.4.8/src/lstrlib.c /^static int str_len (lua_State *L) {$/;" f typeref:typename:int file: +str_lower vendor/lua-5.4.8/src/lstrlib.c /^static int str_lower (lua_State *L) {$/;" f typeref:typename:int file: +str_match vendor/lua-5.4.8/src/lstrlib.c /^static int str_match (lua_State *L) {$/;" f typeref:typename:int file: +str_pack vendor/lua-5.4.8/src/lstrlib.c /^static int str_pack (lua_State *L) {$/;" f typeref:typename:int file: +str_packsize vendor/lua-5.4.8/src/lstrlib.c /^static int str_packsize (lua_State *L) {$/;" f typeref:typename:int file: +str_rep vendor/lua-5.4.8/src/lstrlib.c /^static int str_rep (lua_State *L) {$/;" f typeref:typename:int file: +str_reverse vendor/lua-5.4.8/src/lstrlib.c /^static int str_reverse (lua_State *L) {$/;" f typeref:typename:int file: +str_sub vendor/lua-5.4.8/src/lstrlib.c /^static int str_sub (lua_State *L) {$/;" f typeref:typename:int file: +str_unpack vendor/lua-5.4.8/src/lstrlib.c /^static int str_unpack (lua_State *L) {$/;" f typeref:typename:int file: +str_upper vendor/lua-5.4.8/src/lstrlib.c /^static int str_upper (lua_State *L) {$/;" f typeref:typename:int file: +strcache vendor/lua-5.4.8/src/lstate.h /^ TString *strcache[STRCACHE_N][STRCACHE_M]; \/* cache for strings in API *\/$/;" m struct:global_State typeref:typename:TString * [][] +stream vendor/raylib-5.5_linux_amd64/include/raylib.h /^ AudioStream stream; \/\/ Audio stream$/;" m struct:Music typeref:typename:AudioStream +stream vendor/raylib-5.5_linux_amd64/include/raylib.h /^ AudioStream stream; \/\/ Audio stream$/;" m struct:Sound typeref:typename:AudioStream +stringK vendor/lua-5.4.8/src/lcode.c /^static int stringK (FuncState *fs, TString *s) {$/;" f typeref:typename:int file: +stringmetamethods vendor/lua-5.4.8/src/lstrlib.c /^static const luaL_Reg stringmetamethods[] = {$/;" v typeref:typename:const luaL_Reg[] file: +stringtable vendor/lua-5.4.8/src/lstate.h /^typedef struct stringtable {$/;" s +stringtable vendor/lua-5.4.8/src/lstate.h /^} stringtable;$/;" t typeref:struct:stringtable +strip vendor/lua-5.4.8/src/ldump.c /^ int strip;$/;" m struct:__anon6dcdaf670108 typeref:typename:int file: +stripping vendor/lua-5.4.8/src/luac.c /^static int stripping=0; \/* strip debug information? *\/$/;" v typeref:typename:int file: +strlib vendor/lua-5.4.8/src/lstrlib.c /^static const luaL_Reg strlib[] = {$/;" v typeref:typename:const luaL_Reg[] file: +strlocal vendor/lua-5.4.8/src/ldebug.c /^static const char strlocal[] = "local";$/;" v typeref:typename:const char[] file: +strt vendor/lua-5.4.8/src/lstate.h /^ stringtable strt; \/* hash table for strings *\/$/;" m struct:global_State typeref:typename:stringtable +strupval vendor/lua-5.4.8/src/ldebug.c /^static const char strupval[] = "upvalue";$/;" v typeref:typename:const char[] file: +strval vendor/lua-5.4.8/src/lparser.h /^ TString *strval; \/* for VKSTR *\/$/;" m union:expdesc::__anon337ee443020a typeref:typename:TString * +subexpr vendor/lua-5.4.8/src/lparser.c /^static BinOpr subexpr (LexState *ls, expdesc *v, int limit) {$/;" f typeref:typename:BinOpr file: +suffixedexp vendor/lua-5.4.8/src/lparser.c /^static void suffixedexp (LexState *ls, expdesc *v) {$/;" f typeref:typename:void file: +survival vendor/lua-5.4.8/src/lstate.h /^ GCObject *survival; \/* start of objects that survived one GC cycle *\/$/;" m struct:global_State typeref:typename:GCObject * +swapexps vendor/lua-5.4.8/src/lcode.c /^static void swapexps (expdesc *e1, expdesc *e2) {$/;" f typeref:typename:void file: +sweep2old vendor/lua-5.4.8/src/lgc.c /^static void sweep2old (lua_State *L, GCObject **p) {$/;" f typeref:typename:void file: +sweepgc vendor/lua-5.4.8/src/lstate.h /^ GCObject **sweepgc; \/* current position of sweep in list *\/$/;" m struct:global_State typeref:typename:GCObject ** +sweepgen vendor/lua-5.4.8/src/lgc.c /^static GCObject **sweepgen (lua_State *L, global_State *g, GCObject **p,$/;" f typeref:typename:GCObject ** file: +sweeplist vendor/lua-5.4.8/src/lgc.c /^static GCObject **sweeplist (lua_State *L, GCObject **p, int countin,$/;" f typeref:typename:GCObject ** file: +sweepstep vendor/lua-5.4.8/src/lgc.c /^static int sweepstep (lua_State *L, global_State *g,$/;" f typeref:typename:int file: +sweeptolive vendor/lua-5.4.8/src/lgc.c /^static GCObject **sweeptolive (lua_State *L, GCObject **p) {$/;" f typeref:typename:GCObject ** file: +syslib vendor/lua-5.4.8/src/loslib.c /^static const luaL_Reg syslib[] = {$/;" v typeref:typename:const luaL_Reg[] file: +t vendor/lua-5.4.8/src/llex.h /^ Token t; \/* current token *\/$/;" m struct:LexState typeref:typename:Token +t vendor/lua-5.4.8/src/lparser.c /^ expdesc *t; \/* table descriptor *\/$/;" m struct:ConsControl typeref:typename:expdesc * file: +t vendor/lua-5.4.8/src/lparser.h /^ lu_byte t; \/* table (register or upvalue) *\/$/;" m struct:expdesc::__anon337ee443020a::__anon337ee4430308 typeref:typename:lu_byte +t vendor/lua-5.4.8/src/lparser.h /^ int t; \/* patch list of 'exit when true' *\/$/;" m struct:expdesc typeref:typename:int +tab_funcs vendor/lua-5.4.8/src/ltablib.c /^static const luaL_Reg tab_funcs[] = {$/;" v typeref:typename:const luaL_Reg[] file: +tablerehash vendor/lua-5.4.8/src/lstring.c /^static void tablerehash (TString **vect, int osize, int nsize) {$/;" f typeref:typename:void file: +tag_error vendor/lua-5.4.8/src/lauxlib.c /^static void tag_error (lua_State *L, int arg, int tag) {$/;" f typeref:typename:void file: +tangents vendor/raylib-5.5_linux_amd64/include/raylib.h /^ float *tangents; \/\/ Vertex tangents (XYZW - 4 components per vertex) (shader-locati/;" m struct:Mesh typeref:typename:float * +target vendor/raylib-5.5_linux_amd64/include/raylib.h /^ Vector2 target; \/\/ Camera target (rotation and zoom origin)$/;" m struct:Camera2D typeref:typename:Vector2 +target vendor/raylib-5.5_linux_amd64/include/raylib.h /^ Vector3 target; \/\/ Camera target it looks-at$/;" m struct:Camera3D typeref:typename:Vector3 +tbclist vendor/lua-5.4.8/src/lobject.h /^ } tbclist;$/;" m union:StackValue typeref:struct:StackValue::__anon808f9fcd0108 +tbclist vendor/lua-5.4.8/src/lstate.h /^ StkIdRel tbclist; \/* list of to-be-closed variables *\/$/;" m struct:lua_State typeref:typename:StkIdRel +tconcat vendor/lua-5.4.8/src/ltablib.c /^static int tconcat (lua_State *L) {$/;" f typeref:typename:int file: +test vendor/lua-5.4.8/Makefile /^$(PLATS) help test clean:$/;" t +test vendor/lua-5.4.8/src/Makefile /^test:$/;" t +test2 vendor/lua-5.4.8/src/liolib.c /^static int test2 (RN *rn, const char *set) {$/;" f typeref:typename:int file: +testAMode vendor/lua-5.4.8/src/lopcodes.h /^#define testAMode(/;" d +testITMode vendor/lua-5.4.8/src/lopcodes.h /^#define testITMode(/;" d +testMMMode vendor/lua-5.4.8/src/lopcodes.h /^#define testMMMode(/;" d +testOTMode vendor/lua-5.4.8/src/lopcodes.h /^#define testOTMode(/;" d +testTMode vendor/lua-5.4.8/src/lopcodes.h /^#define testTMode(/;" d +test_eof vendor/lua-5.4.8/src/liolib.c /^static int test_eof (lua_State *L, FILE *f) {$/;" f typeref:typename:int file: +test_then_block vendor/lua-5.4.8/src/lparser.c /^static void test_then_block (LexState *ls, int *escapelist) {$/;" f typeref:typename:void file: +testbit vendor/lua-5.4.8/src/lgc.h /^#define testbit(/;" d +testbits vendor/lua-5.4.8/src/lgc.h /^#define testbits(/;" d +testnext vendor/lua-5.4.8/src/lparser.c /^static int testnext (LexState *ls, int c) {$/;" f typeref:typename:int file: +testprop vendor/lua-5.4.8/src/lctype.h /^#define testprop(/;" d +texAnisoFilter vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ bool texAnisoFilter; \/\/ Anisotropic texture filtering support (GL_EXT_t/;" m struct:rlglData::__anon1f68b8bd0e08 typeref:typename:bool +texCompASTC vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ bool texCompASTC; \/\/ ASTC texture compression support (GL_KHR_textur/;" m struct:rlglData::__anon1f68b8bd0e08 typeref:typename:bool +texCompDXT vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ bool texCompDXT; \/\/ DDS texture compression support (GL_EXT_texture/;" m struct:rlglData::__anon1f68b8bd0e08 typeref:typename:bool +texCompETC1 vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ bool texCompETC1; \/\/ ETC1 texture compression support (GL_OES_compre/;" m struct:rlglData::__anon1f68b8bd0e08 typeref:typename:bool +texCompETC2 vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ bool texCompETC2; \/\/ ETC2\/EAC texture compression support (GL_ARB_E/;" m struct:rlglData::__anon1f68b8bd0e08 typeref:typename:bool +texCompPVRT vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ bool texCompPVRT; \/\/ PVR texture compression support (GL_IMG_texture/;" m struct:rlglData::__anon1f68b8bd0e08 typeref:typename:bool +texDepth vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ bool texDepth; \/\/ Depth textures supported (GL_ARB_depth_texture,/;" m struct:rlglData::__anon1f68b8bd0e08 typeref:typename:bool +texDepthWebGL vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ bool texDepthWebGL; \/\/ Depth textures supported WebGL specific (GL_WEB/;" m struct:rlglData::__anon1f68b8bd0e08 typeref:typename:bool +texFloat16 vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ bool texFloat16; \/\/ half float textures support (16 bit per channel/;" m struct:rlglData::__anon1f68b8bd0e08 typeref:typename:bool +texFloat32 vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ bool texFloat32; \/\/ float textures support (32 bit per channel) (GL/;" m struct:rlglData::__anon1f68b8bd0e08 typeref:typename:bool +texMirrorClamp vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ bool texMirrorClamp; \/\/ Clamp mirror wrap mode supported (GL_EXT_textur/;" m struct:rlglData::__anon1f68b8bd0e08 typeref:typename:bool +texNPOT vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ bool texNPOT; \/\/ NPOT textures full support (GL_ARB_texture_non_/;" m struct:rlglData::__anon1f68b8bd0e08 typeref:typename:bool +texcoords vendor/raylib-5.5_linux_amd64/include/raylib.h /^ float *texcoords; \/\/ Vertex texture coordinates (UV - 2 components per vertex) (shad/;" m struct:Mesh typeref:typename:float * +texcoords vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ float *texcoords; \/\/ Vertex texture coordinates (UV - 2 components per vertex) (/;" m struct:rlVertexBuffer typeref:typename:float * +texcoords2 vendor/raylib-5.5_linux_amd64/include/raylib.h /^ float *texcoords2; \/\/ Vertex texture second coordinates (UV - 2 components per vertex/;" m struct:Mesh typeref:typename:float * +texcoordx vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ float texcoordx, texcoordy; \/\/ Current active texture coordinate (added on glV/;" m struct:rlglData::__anon1f68b8bd0d08 typeref:typename:float +texcoordy vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ float texcoordx, texcoordy; \/\/ Current active texture coordinate (added on glV/;" m struct:rlglData::__anon1f68b8bd0d08 typeref:typename:float +texture vendor/raylib-5.5_linux_amd64/include/raylib.h /^ Texture texture; \/\/ Color buffer attachment texture$/;" m struct:RenderTexture typeref:typename:Texture +texture vendor/raylib-5.5_linux_amd64/include/raylib.h /^ Texture2D texture; \/\/ Material map texture$/;" m struct:MaterialMap typeref:typename:Texture2D +texture vendor/raylib-5.5_linux_amd64/include/raylib.h /^ Texture2D texture; \/\/ Texture atlas containing the glyphs$/;" m struct:Font typeref:typename:Texture2D +textureId vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ unsigned int textureId; \/\/ Texture id to be used on the draw -> Use to create new draw/;" m struct:rlDrawCall typeref:typename:unsigned int +th vendor/lua-5.4.8/src/lstate.h /^ struct lua_State th; \/* thread *\/$/;" m union:GCUnion typeref:struct:lua_State +thvalue vendor/lua-5.4.8/src/lobject.h /^#define thvalue(/;" d +times5 vendor/lua-5.4.8/src/lmathlib.c /^static Rand64 times5 (Rand64 i) {$/;" f typeref:typename:Rand64 file: +times9 vendor/lua-5.4.8/src/lmathlib.c /^static Rand64 times9 (Rand64 i) {$/;" f typeref:typename:Rand64 file: +tinsert vendor/lua-5.4.8/src/ltablib.c /^static int tinsert (lua_State *L) {$/;" f typeref:typename:int file: +tmname vendor/lua-5.4.8/src/lstate.h /^ TString *tmname[TM_N]; \/* array with tag-method names *\/$/;" m struct:global_State typeref:typename:TString * [] +tmname vendor/lua-5.4.8/src/luac.c /^static TString **tmname;$/;" v typeref:typename:TString ** file: +tmove vendor/lua-5.4.8/src/ltablib.c /^static int tmove (lua_State *L) {$/;" f typeref:typename:int file: +tobefnz vendor/lua-5.4.8/src/lstate.h /^ GCObject *tobefnz; \/* list of userdata to be GC *\/$/;" m struct:global_State typeref:typename:GCObject * +tofile vendor/lua-5.4.8/src/liolib.c /^static FILE *tofile (lua_State *L) {$/;" f typeref:typename:FILE * file: +tofinalize vendor/lua-5.4.8/src/lgc.h /^#define tofinalize(/;" d +tointeger vendor/lua-5.4.8/src/lvm.h /^#define tointeger(/;" d +tointegerns vendor/lua-5.4.8/src/lvm.h /^#define tointegerns(/;" d +token vendor/lua-5.4.8/src/llex.h /^ int token;$/;" m struct:Token typeref:typename:int +tolstream vendor/lua-5.4.8/src/liolib.c /^#define tolstream(/;" d file: +tonum vendor/lua-5.4.8/src/lstrlib.c /^static int tonum (lua_State *L, int arg) {$/;" f typeref:typename:int file: +tonumber vendor/lua-5.4.8/src/lvm.h /^#define tonumber(/;" d +tonumberns vendor/lua-5.4.8/src/lvm.h /^#define tonumberns(/;" d +tonumeral vendor/lua-5.4.8/src/lcode.c /^static int tonumeral (const expdesc *e, TValue *v) {$/;" f typeref:typename:int file: +top vendor/lua-5.4.8/src/lstate.h /^ StkIdRel top; \/* top for this function *\/$/;" m struct:CallInfo typeref:typename:StkIdRel +top vendor/lua-5.4.8/src/lstate.h /^ StkIdRel top; \/* first free slot in the stack *\/$/;" m struct:lua_State typeref:typename:StkIdRel +top vendor/raylib-5.5_linux_amd64/include/raylib.h /^ int top; \/\/ Top border offset$/;" m struct:NPatchInfo typeref:typename:int +toproto vendor/lua-5.4.8/src/luac.c /^#define toproto(/;" d file: +tostore vendor/lua-5.4.8/src/lparser.c /^ int tostore; \/* number of array elements pending to be stored *\/$/;" m struct:ConsControl typeref:typename:int file: +tostring vendor/lua-5.4.8/src/lvm.c /^#define tostring(/;" d file: +tostringbuff vendor/lua-5.4.8/src/lobject.c /^static int tostringbuff (TValue *obj, char *buff) {$/;" f typeref:typename:int file: +totalbytes vendor/lua-5.4.8/src/lstate.h /^ l_mem totalbytes; \/* number of bytes currently allocated - GCdebt *\/$/;" m struct:global_State typeref:typename:l_mem +touserdata vendor/lua-5.4.8/src/lapi.c /^l_sinline void *touserdata (const TValue *o) {$/;" f typeref:typename:l_sinline void * +tpack vendor/lua-5.4.8/src/ltablib.c /^static int tpack (lua_State *L) {$/;" f typeref:typename:int file: +transferinfo vendor/lua-5.4.8/src/lstate.h /^ } transferinfo;$/;" m union:CallInfo::__anona701f1f7040a typeref:struct:CallInfo::__anona701f1f7040a::__anona701f1f70508 +transform vendor/raylib-5.5_linux_amd64/include/raylib.h /^ Matrix transform; \/\/ Local transform matrix$/;" m struct:Model typeref:typename:Matrix +transform vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ Matrix transform; \/\/ Transform matrix to be used with rlTranslate, r/;" m struct:rlglData::__anon1f68b8bd0d08 typeref:typename:Matrix +transformRequired vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ bool transformRequired; \/\/ Require transform matrix application to current/;" m struct:rlglData::__anon1f68b8bd0d08 typeref:typename:bool +translation vendor/raylib-5.5_linux_amd64/include/raylib.h /^ Vector3 translation; \/\/ Translation$/;" m struct:Transform typeref:typename:Vector3 +trap vendor/lua-5.4.8/src/lstate.h /^ volatile l_signalT trap; \/* function is tracing lines\/counts *\/$/;" m struct:CallInfo::__anona701f1f7010a::__anona701f1f70208 typeref:typename:volatile l_signalT +traverseCclosure vendor/lua-5.4.8/src/lgc.c /^static int traverseCclosure (global_State *g, CClosure *cl) {$/;" f typeref:typename:int file: +traverseLclosure vendor/lua-5.4.8/src/lgc.c /^static int traverseLclosure (global_State *g, LClosure *cl) {$/;" f typeref:typename:int file: +traverseephemeron vendor/lua-5.4.8/src/lgc.c /^static int traverseephemeron (global_State *g, Table *h, int inv) {$/;" f typeref:typename:int file: +traverseproto vendor/lua-5.4.8/src/lgc.c /^static int traverseproto (global_State *g, Proto *f) {$/;" f typeref:typename:int file: +traversestrongtable vendor/lua-5.4.8/src/lgc.c /^static void traversestrongtable (global_State *g, Table *h) {$/;" f typeref:typename:void file: +traversetable vendor/lua-5.4.8/src/lgc.c /^static lu_mem traversetable (global_State *g, Table *h) {$/;" f typeref:typename:lu_mem file: +traversethread vendor/lua-5.4.8/src/lgc.c /^static int traversethread (global_State *g, lua_State *th) {$/;" f typeref:typename:int file: +traverseudata vendor/lua-5.4.8/src/lgc.c /^static int traverseudata (global_State *g, Udata *u) {$/;" f typeref:typename:int file: +traverseweakvalue vendor/lua-5.4.8/src/lgc.c /^static void traverseweakvalue (global_State *g, Table *h) {$/;" f typeref:typename:void file: +treatstackoption vendor/lua-5.4.8/src/ldblib.c /^static void treatstackoption (lua_State *L, lua_State *L1, const char *fname) {$/;" f typeref:typename:void file: +tremove vendor/lua-5.4.8/src/ltablib.c /^static int tremove (lua_State *L) {$/;" f typeref:typename:int file: +triangleCount vendor/raylib-5.5_linux_amd64/include/raylib.h /^ int triangleCount; \/\/ Number of triangles stored (indexed or not)$/;" m struct:Mesh typeref:typename:int +trim32 vendor/lua-5.4.8/src/lmathlib.c /^#define trim32(/;" d file: +trim64 vendor/lua-5.4.8/src/lmathlib.c /^#define trim64(/;" d file: +tryagain vendor/lua-5.4.8/src/lmem.c /^static void *tryagain (lua_State *L, void *block,$/;" f typeref:typename:void * file: +tryfuncTM vendor/lua-5.4.8/src/ldo.c /^static StkId tryfuncTM (lua_State *L, StkId func) {$/;" f typeref:typename:StkId file: +trymt vendor/lua-5.4.8/src/lstrlib.c /^static void trymt (lua_State *L, const char *mtname) {$/;" f typeref:typename:void file: +ts vendor/lua-5.4.8/src/llex.h /^ TString *ts;$/;" m union:__anonfc1a02ff010a typeref:typename:TString * +ts vendor/lua-5.4.8/src/lstate.h /^ struct TString ts;$/;" m union:GCUnion typeref:struct:TString +tsslen vendor/lua-5.4.8/src/lobject.h /^#define tsslen(/;" d +tsvalue vendor/lua-5.4.8/src/lobject.h /^#define tsvalue(/;" d +tsvalueraw vendor/lua-5.4.8/src/lobject.h /^#define tsvalueraw(/;" d +ttisCclosure vendor/lua-5.4.8/src/lobject.h /^#define ttisCclosure(/;" d +ttisLclosure vendor/lua-5.4.8/src/lobject.h /^#define ttisLclosure(/;" d +ttisboolean vendor/lua-5.4.8/src/lobject.h /^#define ttisboolean(/;" d +ttisclosure vendor/lua-5.4.8/src/lobject.h /^#define ttisclosure(/;" d +ttisfalse vendor/lua-5.4.8/src/lobject.h /^#define ttisfalse(/;" d +ttisfloat vendor/lua-5.4.8/src/lobject.h /^#define ttisfloat(/;" d +ttisfulluserdata vendor/lua-5.4.8/src/lobject.h /^#define ttisfulluserdata(/;" d +ttisfunction vendor/lua-5.4.8/src/lobject.h /^#define ttisfunction(/;" d +ttisinteger vendor/lua-5.4.8/src/lobject.h /^#define ttisinteger(/;" d +ttislcf vendor/lua-5.4.8/src/lobject.h /^#define ttislcf(/;" d +ttislightuserdata vendor/lua-5.4.8/src/lobject.h /^#define ttislightuserdata(/;" d +ttislngstring vendor/lua-5.4.8/src/lobject.h /^#define ttislngstring(/;" d +ttisnil vendor/lua-5.4.8/src/lobject.h /^#define ttisnil(/;" d +ttisnumber vendor/lua-5.4.8/src/lobject.h /^#define ttisnumber(/;" d +ttisshrstring vendor/lua-5.4.8/src/lobject.h /^#define ttisshrstring(/;" d +ttisstrictnil vendor/lua-5.4.8/src/lobject.h /^#define ttisstrictnil(/;" d +ttisstring vendor/lua-5.4.8/src/lobject.h /^#define ttisstring(/;" d +ttistable vendor/lua-5.4.8/src/lobject.h /^#define ttistable(/;" d +ttisthread vendor/lua-5.4.8/src/lobject.h /^#define ttisthread(/;" d +ttistrue vendor/lua-5.4.8/src/lobject.h /^#define ttistrue(/;" d +ttype vendor/lua-5.4.8/src/lobject.h /^#define ttype(/;" d +ttypename vendor/lua-5.4.8/src/ltm.h /^#define ttypename(/;" d +ttypetag vendor/lua-5.4.8/src/lobject.h /^#define ttypetag(/;" d +tunpack vendor/lua-5.4.8/src/ltablib.c /^static int tunpack (lua_State *L) {$/;" f typeref:typename:int file: +twoto vendor/lua-5.4.8/src/lobject.h /^#define twoto(/;" d +twups vendor/lua-5.4.8/src/lstate.h /^ struct lua_State *twups; \/* list of threads with open upvalues *\/$/;" m struct:global_State typeref:struct:lua_State * +twups vendor/lua-5.4.8/src/lstate.h /^ struct lua_State *twups; \/* list of threads with open upvalues *\/$/;" m struct:lua_State typeref:struct:lua_State * +txtToken vendor/lua-5.4.8/src/llex.c /^static const char *txtToken (LexState *ls, int token) {$/;" f typeref:typename:const char * file: +type vendor/raylib-5.5_linux_amd64/include/raylib.h /^ unsigned int type; \/\/ Event type (AutomationEventType)$/;" m struct:AutomationEvent typeref:typename:unsigned int +typeerror vendor/lua-5.4.8/src/ldebug.c /^static l_noret typeerror (lua_State *L, const TValue *o, const char *op,$/;" f typeref:typename:l_noret file: +u vendor/lua-5.4.8/src/lobject.h /^ } u;$/;" m struct:TString typeref:union:TString::__anon808f9fcd030a +u vendor/lua-5.4.8/src/lobject.h /^ } u;$/;" m struct:UpVal typeref:union:UpVal::__anon808f9fcd060a +u vendor/lua-5.4.8/src/lobject.h /^ } u;$/;" m union:Node typeref:struct:Node::NodeKey +u vendor/lua-5.4.8/src/lparser.h /^ } u;$/;" m struct:expdesc typeref:union:expdesc::__anon337ee443020a +u vendor/lua-5.4.8/src/lstate.h /^ struct Udata u;$/;" m union:GCUnion typeref:struct:Udata +u vendor/lua-5.4.8/src/lstate.h /^ } u;$/;" m struct:CallInfo typeref:union:CallInfo::__anona701f1f7010a +u vendor/lua-5.4.8/src/lstrlib.c /^ struct cD { char c; union { LUAI_MAXALIGN; } u; };$/;" m struct:getoption::cD typeref:union:getoption::cD::__anonae5a2721030a file: +u2 vendor/lua-5.4.8/src/lstate.h /^ } u2;$/;" m struct:CallInfo typeref:union:CallInfo::__anona701f1f7040a +u_posrelat vendor/lua-5.4.8/src/lutf8lib.c /^static lua_Integer u_posrelat (lua_Integer pos, size_t len) {$/;" f typeref:typename:lua_Integer file: +ub vendor/lua-5.4.8/src/lobject.h /^ lu_byte ub;$/;" m union:Value typeref:typename:lu_byte +uchar vendor/lua-5.4.8/src/lstrlib.c /^#define uchar(/;" d file: +ud vendor/lua-5.4.8/src/lstate.h /^ void *ud; \/* auxiliary data to 'frealloc' *\/$/;" m struct:global_State typeref:typename:void * +ud_warn vendor/lua-5.4.8/src/lstate.h /^ void *ud_warn; \/* auxiliary data to 'warnf' *\/$/;" m struct:global_State typeref:typename:void * +udata2finalize vendor/lua-5.4.8/src/lgc.c /^static GCObject *udata2finalize (global_State *g) {$/;" f typeref:typename:GCObject * file: +udatamemoffset vendor/lua-5.4.8/src/lobject.h /^#define udatamemoffset(/;" d +udatatypename vendor/lua-5.4.8/src/ltm.c /^static const char udatatypename[] = "userdata";$/;" v typeref:typename:const char[] file: +undefgoto vendor/lua-5.4.8/src/lparser.c /^static l_noret undefgoto (LexState *ls, Labeldesc *gt) {$/;" f typeref:typename:l_noret file: +uninstall vendor/lua-5.4.8/Makefile /^uninstall:$/;" t +unmakemask vendor/lua-5.4.8/src/ldblib.c /^static char *unmakemask (int mask, char *smask) {$/;" f typeref:typename:char * file: +unopr2op vendor/lua-5.4.8/src/lcode.c /^l_sinline OpCode unopr2op (UnOpr opr) {$/;" f typeref:typename:l_sinline OpCode +unpackint vendor/lua-5.4.8/src/lstrlib.c /^static lua_Integer unpackint (lua_State *L, const char *str,$/;" f typeref:typename:lua_Integer file: +unroll vendor/lua-5.4.8/src/ldo.c /^static void unroll (lua_State *L, void *ud) {$/;" f typeref:typename:void file: +up vendor/raylib-5.5_linux_amd64/include/raylib.h /^ Vector3 up; \/\/ Camera up vector (rotation over its axis)$/;" m struct:Camera3D typeref:typename:Vector3 +updatebase vendor/lua-5.4.8/src/lvm.c /^#define updatebase(/;" d file: +updatestack vendor/lua-5.4.8/src/lvm.c /^#define updatestack(/;" d file: +updatetrap vendor/lua-5.4.8/src/lvm.c /^#define updatetrap(/;" d file: +upisopen vendor/lua-5.4.8/src/lfunc.h /^#define upisopen(/;" d +uplevel vendor/lua-5.4.8/src/lfunc.h /^#define uplevel(/;" d +upv vendor/lua-5.4.8/src/lstate.h /^ struct UpVal upv;$/;" m union:GCUnion typeref:struct:UpVal +upval vendor/lua-5.4.8/src/lparser.c /^ lu_byte upval; \/* true if some variable in the block is an upvalue *\/$/;" m struct:BlockCnt typeref:typename:lu_byte file: +upvalname vendor/lua-5.4.8/src/ldebug.c /^static const char *upvalname (const Proto *p, int uv) {$/;" f typeref:typename:const char * file: +upvals vendor/lua-5.4.8/src/lobject.h /^ UpVal *upvals[1]; \/* list of upvalues *\/$/;" m struct:LClosure typeref:typename:UpVal * [1] +upvalue vendor/lua-5.4.8/src/lobject.h /^ TValue upvalue[1]; \/* list of upvalues *\/$/;" m struct:CClosure typeref:typename:TValue[1] +upvalues vendor/lua-5.4.8/src/lobject.h /^ Upvaldesc *upvalues; \/* upvalue information *\/$/;" m struct:Proto typeref:typename:Upvaldesc * +usage vendor/lua-5.4.8/src/luac.c /^static void usage(const char* message)$/;" f typeref:typename:void file: +utf8_decode vendor/lua-5.4.8/src/lutf8lib.c /^static const char *utf8_decode (const char *s, utfint *val, int strict) {$/;" f typeref:typename:const char * file: +utf8esc vendor/lua-5.4.8/src/llex.c /^static void utf8esc (LexState *ls) {$/;" f typeref:typename:void file: +utfchar vendor/lua-5.4.8/src/lutf8lib.c /^static int utfchar (lua_State *L) {$/;" f typeref:typename:int file: +utfint vendor/lua-5.4.8/src/lutf8lib.c /^typedef unsigned int utfint;$/;" t typeref:typename:unsigned int file: +utfint vendor/lua-5.4.8/src/lutf8lib.c /^typedef unsigned long utfint;$/;" t typeref:typename:unsigned long file: +utflen vendor/lua-5.4.8/src/lutf8lib.c /^static int utflen (lua_State *L) {$/;" f typeref:typename:int file: +uv vendor/lua-5.4.8/src/lobject.h /^ TValue uv;$/;" m union:UValue typeref:typename:TValue +uv vendor/lua-5.4.8/src/lobject.h /^ UValue uv[1]; \/* user values *\/$/;" m struct:Udata typeref:typename:UValue[1] +uvalue vendor/lua-5.4.8/src/lobject.h /^#define uvalue(/;" d +v vendor/lua-5.4.8/src/lobject.h /^ } v;$/;" m struct:UpVal typeref:union:UpVal::__anon808f9fcd050a +v vendor/lua-5.4.8/src/lparser.c /^ expdesc v; \/* last list item read *\/$/;" m struct:ConsControl typeref:typename:expdesc file: +v vendor/lua-5.4.8/src/lparser.c /^ expdesc v; \/* variable (global, local, upvalue, or indexed) *\/$/;" m struct:LHS_assign typeref:typename:expdesc file: +v vendor/raylib-5.5_linux_amd64/include/raymath.h /^ float v[16];$/;" m struct:float16 typeref:typename:float[16] +v vendor/raylib-5.5_linux_amd64/include/raymath.h /^ float v[3];$/;" m struct:float3 typeref:typename:float[3] +v vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ float v[16];$/;" m struct:rl_float16 typeref:typename:float[16] +vRB vendor/lua-5.4.8/src/lvm.c /^#define vRB(/;" d file: +vRC vendor/lua-5.4.8/src/lvm.c /^#define vRC(/;" d file: +vResolution vendor/raylib-5.5_linux_amd64/include/raylib.h /^ int vResolution; \/\/ Vertical resolution in pixels$/;" m struct:VrDeviceInfo typeref:typename:int +vScreenSize vendor/raylib-5.5_linux_amd64/include/raylib.h /^ float vScreenSize; \/\/ Vertical size in meters$/;" m struct:VrDeviceInfo typeref:typename:float +val vendor/lua-5.4.8/src/lobject.h /^ TValue val;$/;" m union:StackValue typeref:typename:TValue +val_ vendor/lua-5.4.8/src/lobject.h /^#define val_(/;" d +validop vendor/lua-5.4.8/src/lcode.c /^static int validop (int op, TValue *v1, TValue *v2) {$/;" f typeref:typename:int file: +valiswhite vendor/lua-5.4.8/src/lgc.c /^#define valiswhite(/;" d file: +valraw vendor/lua-5.4.8/src/lobject.h /^#define valraw(/;" d +value vendor/lua-5.4.8/src/lobject.h /^ TValue value; \/* the value (when closed) *\/$/;" m union:UpVal::__anon808f9fcd060a typeref:typename:TValue +value vendor/raylib-5.5_linux_amd64/include/raylib.h /^ float value; \/\/ Material map value$/;" m struct:MaterialMap typeref:typename:float +value vendor/raylib-5.5_linux_amd64/include/raylib.h /^ int value; \/\/ Character value (Unicode)$/;" m struct:GlyphInfo typeref:typename:int +vao vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ bool vao; \/\/ VAO support (OpenGL ES2 could not support VAO e/;" m struct:rlglData::__anon1f68b8bd0e08 typeref:typename:bool +vaoId vendor/raylib-5.5_linux_amd64/include/raylib.h /^ unsigned int vaoId; \/\/ OpenGL Vertex Array Object id$/;" m struct:Mesh typeref:typename:unsigned int +vaoId vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ unsigned int vaoId; \/\/ OpenGL Vertex Array Object id$/;" m struct:rlVertexBuffer typeref:typename:unsigned int +var vendor/lua-5.4.8/src/lparser.h /^ } var;$/;" m union:expdesc::__anon337ee443020a typeref:struct:expdesc::__anon337ee443020a::__anon337ee4430408 +varinfo vendor/lua-5.4.8/src/ldebug.c /^static const char *varinfo (lua_State *L, const TValue *o) {$/;" f typeref:typename:const char * file: +varname vendor/lua-5.4.8/src/lobject.h /^ TString *varname;$/;" m struct:LocVar typeref:typename:TString * +vboId vendor/raylib-5.5_linux_amd64/include/raylib.h /^ unsigned int *vboId; \/\/ OpenGL Vertex Buffer Objects id (default vertex data)$/;" m struct:Mesh typeref:typename:unsigned int * +vboId vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ unsigned int vboId[5]; \/\/ OpenGL Vertex Buffer Objects id (5 types of vertex data)$/;" m struct:rlVertexBuffer typeref:typename:unsigned int[5] +vd vendor/lua-5.4.8/src/lparser.h /^ } vd;$/;" m union:Vardesc typeref:struct:Vardesc::__anon337ee4430508 +vertexAlignment vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ int vertexAlignment; \/\/ Number of vertex required for index alignment (LINES, TRIAN/;" m struct:rlDrawCall typeref:typename:int +vertexBuffer vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ rlVertexBuffer *vertexBuffer; \/\/ Dynamic buffer(s) for vertex data$/;" m struct:rlRenderBatch typeref:typename:rlVertexBuffer * +vertexCount vendor/raylib-5.5_linux_amd64/include/raylib.h /^ int vertexCount; \/\/ Number of vertices stored in arrays$/;" m struct:Mesh typeref:typename:int +vertexCount vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ int vertexCount; \/\/ Number of vertex of the draw$/;" m struct:rlDrawCall typeref:typename:int +vertexCounter vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ int vertexCounter; \/\/ Current active render batch vertex counter (gen/;" m struct:rlglData::__anon1f68b8bd0d08 typeref:typename:int +vertices vendor/raylib-5.5_linux_amd64/include/raylib.h /^ float *vertices; \/\/ Vertex position (XYZ - 3 components per vertex) (shader-locatio/;" m struct:Mesh typeref:typename:float * +vertices vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ float *vertices; \/\/ Vertex position (XYZ - 3 components per vertex) (shader-loc/;" m struct:rlVertexBuffer typeref:typename:float * +vidx vendor/lua-5.4.8/src/lparser.h /^ unsigned short vidx; \/* compiler index (in 'actvar.arr') *\/$/;" m struct:expdesc::__anon337ee443020a::__anon337ee4430408 typeref:typename:unsigned short +viewOffset vendor/raylib-5.5_linux_amd64/include/raylib.h /^ Matrix viewOffset[2]; \/\/ VR view offset matrices (per eye)$/;" m struct:VrStereoConfig typeref:typename:Matrix[2] +viewOffsetStereo vendor/raylib-5.5_linux_amd64/include/rlgl.h /^ Matrix viewOffsetStereo[2]; \/\/ VR stereo rendering eyes view offset matrices$/;" m struct:rlglData::__anon1f68b8bd0d08 typeref:typename:Matrix[2] +vkisindexed vendor/lua-5.4.8/src/lparser.h /^#define vkisindexed(/;" d +vkisvar vendor/lua-5.4.8/src/lparser.h /^#define vkisvar(/;" d +vmbreak vendor/lua-5.4.8/src/ljumptab.h /^#define vmbreak /;" d +vmbreak vendor/lua-5.4.8/src/lvm.c /^#define vmbreak /;" d file: +vmcase vendor/lua-5.4.8/src/ljumptab.h /^#define vmcase(/;" d +vmcase vendor/lua-5.4.8/src/lvm.c /^#define vmcase(/;" d file: +vmdispatch vendor/lua-5.4.8/src/ljumptab.h /^#define vmdispatch(/;" d +vmdispatch vendor/lua-5.4.8/src/lvm.c /^#define vmdispatch(/;" d file: +vmfetch vendor/lua-5.4.8/src/lvm.c /^#define vmfetch(/;" d file: +voidf vendor/lua-5.4.8/src/loadlib.c /^typedef void (*voidf)(void);$/;" t typeref:typename:void (*)(void) file: +w vendor/raylib-5.5_linux_amd64/include/raylib.h /^ float w; \/\/ Vector w component$/;" m struct:Vector4 typeref:typename:float +w vendor/raylib-5.5_linux_amd64/include/raymath.h /^ float w;$/;" m struct:Vector4 typeref:typename:float +warnf vendor/lua-5.4.8/src/lstate.h /^ lua_WarnFunction warnf; \/* warning function *\/$/;" m struct:global_State typeref:typename:lua_WarnFunction +warnfcont vendor/lua-5.4.8/src/lauxlib.c /^static void warnfcont (void *ud, const char *message, int tocont) {$/;" f typeref:typename:void file: +warnfcont vendor/lua-5.4.8/src/lauxlib.c /^static void warnfcont (void *ud, const char *message, int tocont);$/;" p typeref:typename:void file: +warnfoff vendor/lua-5.4.8/src/lauxlib.c /^static void warnfoff (void *ud, const char *message, int tocont) {$/;" f typeref:typename:void file: +warnfoff vendor/lua-5.4.8/src/lauxlib.c /^static void warnfoff (void *ud, const char *message, int tocont);$/;" p typeref:typename:void file: +warnfon vendor/lua-5.4.8/src/lauxlib.c /^static void warnfon (void *ud, const char *message, int tocont) {$/;" f typeref:typename:void file: +warnfon vendor/lua-5.4.8/src/lauxlib.c /^static void warnfon (void *ud, const char *message, int tocont);$/;" p typeref:typename:void file: +weak vendor/lua-5.4.8/src/lstate.h /^ GCObject *weak; \/* list of tables with weak values *\/$/;" m struct:global_State typeref:typename:GCObject * +what vendor/lua-5.4.8/src/lua.h /^ const char *what; \/* (S) 'Lua', 'C', 'main', 'tail' *\/$/;" m struct:lua_Debug typeref:typename:const char * +whilestat vendor/lua-5.4.8/src/lparser.c /^static void whilestat (LexState *ls, int line) {$/;" f typeref:typename:void file: +whitelist vendor/lua-5.4.8/src/lgc.c /^static void whitelist (global_State *g, GCObject *p) {$/;" f typeref:typename:void file: +width vendor/raylib-5.5_linux_amd64/include/raylib.h /^ float width; \/\/ Rectangle width$/;" m struct:Rectangle typeref:typename:float +width vendor/raylib-5.5_linux_amd64/include/raylib.h /^ int width; \/\/ Image base width$/;" m struct:Image typeref:typename:int +width vendor/raylib-5.5_linux_amd64/include/raylib.h /^ int width; \/\/ Texture base width$/;" m struct:Texture typeref:typename:int +withvariant vendor/lua-5.4.8/src/lobject.h /^#define withvariant(/;" d +writer vendor/lua-5.4.8/src/ldump.c /^ lua_Writer writer;$/;" m struct:__anon6dcdaf670108 typeref:typename:lua_Writer file: +writer vendor/lua-5.4.8/src/lstrlib.c /^static int writer (lua_State *L, const void *b, size_t size, void *ud) {$/;" f typeref:typename:int file: +writer vendor/lua-5.4.8/src/luac.c /^static int writer(lua_State* L, const void* p, size_t size, void* u)$/;" f typeref:typename:int file: +x vendor/raylib-5.5_linux_amd64/include/raylib.h /^ float x; \/\/ Rectangle top-left corner position x$/;" m struct:Rectangle typeref:typename:float +x vendor/raylib-5.5_linux_amd64/include/raylib.h /^ float x; \/\/ Vector x component$/;" m struct:Vector2 typeref:typename:float +x vendor/raylib-5.5_linux_amd64/include/raylib.h /^ float x; \/\/ Vector x component$/;" m struct:Vector3 typeref:typename:float +x vendor/raylib-5.5_linux_amd64/include/raylib.h /^ float x; \/\/ Vector x component$/;" m struct:Vector4 typeref:typename:float +x vendor/raylib-5.5_linux_amd64/include/raymath.h /^ float x;$/;" m struct:Vector2 typeref:typename:float +x vendor/raylib-5.5_linux_amd64/include/raymath.h /^ float x;$/;" m struct:Vector3 typeref:typename:float +x vendor/raylib-5.5_linux_amd64/include/raymath.h /^ float x;$/;" m struct:Vector4 typeref:typename:float +y vendor/raylib-5.5_linux_amd64/include/raylib.h /^ float y; \/\/ Rectangle top-left corner position y$/;" m struct:Rectangle typeref:typename:float +y vendor/raylib-5.5_linux_amd64/include/raylib.h /^ float y; \/\/ Vector y component$/;" m struct:Vector2 typeref:typename:float +y vendor/raylib-5.5_linux_amd64/include/raylib.h /^ float y; \/\/ Vector y component$/;" m struct:Vector3 typeref:typename:float +y vendor/raylib-5.5_linux_amd64/include/raylib.h /^ float y; \/\/ Vector y component$/;" m struct:Vector4 typeref:typename:float +y vendor/raylib-5.5_linux_amd64/include/raymath.h /^ float y;$/;" m struct:Vector2 typeref:typename:float +y vendor/raylib-5.5_linux_amd64/include/raymath.h /^ float y;$/;" m struct:Vector3 typeref:typename:float +y vendor/raylib-5.5_linux_amd64/include/raymath.h /^ float y;$/;" m struct:Vector4 typeref:typename:float +yieldable vendor/lua-5.4.8/src/lstate.h /^#define yieldable(/;" d +yindex vendor/lua-5.4.8/src/lparser.c /^static void yindex (LexState *ls, expdesc *v) {$/;" f typeref:typename:void file: +youngcollection vendor/lua-5.4.8/src/lgc.c /^static void youngcollection (lua_State *L, global_State *g) {$/;" f typeref:typename:void file: +z vendor/lua-5.4.8/src/ldo.c /^ ZIO *z;$/;" m struct:SParser typeref:typename:ZIO * file: +z vendor/lua-5.4.8/src/llex.h /^ ZIO *z; \/* input stream *\/$/;" m struct:LexState typeref:typename:ZIO * +z vendor/raylib-5.5_linux_amd64/include/raylib.h /^ float z; \/\/ Vector z component$/;" m struct:Vector3 typeref:typename:float +z vendor/raylib-5.5_linux_amd64/include/raylib.h /^ float z; \/\/ Vector z component$/;" m struct:Vector4 typeref:typename:float +z vendor/raylib-5.5_linux_amd64/include/raymath.h /^ float z;$/;" m struct:Vector3 typeref:typename:float +z vendor/raylib-5.5_linux_amd64/include/raymath.h /^ float z;$/;" m struct:Vector4 typeref:typename:float +zgetc vendor/lua-5.4.8/src/lzio.h /^#define zgetc(/;" d +zoom vendor/raylib-5.5_linux_amd64/include/raylib.h /^ float zoom; \/\/ Camera zoom (scaling), should be 1.0f by default$/;" m struct:Camera2D typeref:typename:float diff --git a/test/main.lua b/test/main.lua new file mode 100644 index 0000000..d444192 --- /dev/null +++ b/test/main.lua @@ -0,0 +1,21 @@ +for i = 0, 3 do + print(string.format("Hi %d times", i)) +end + +local file = io.open("test/test.txt", "r") +local content = file:read("*a") +print(content) +file:close() + +open_window(600, 600, "My Game") +set_fps(60) + +while not window_should_close() do + begin_drawing() + clear_window() + + draw_fps() + end_drawing() +end + +close_window() diff --git a/test/test.txt b/test/test.txt new file mode 100644 index 0000000..37ed904 --- /dev/null +++ b/test/test.txt @@ -0,0 +1 @@ +This is the contents of test.txt file. diff --git a/vendor/lua-5.4.8/Makefile b/vendor/lua-5.4.8/Makefile new file mode 100644 index 0000000..6e21588 --- /dev/null +++ b/vendor/lua-5.4.8/Makefile @@ -0,0 +1,106 @@ +# Makefile for installing Lua +# See doc/readme.html for installation and customization instructions. + +# == CHANGE THE SETTINGS BELOW TO SUIT YOUR ENVIRONMENT ======================= + +# Your platform. See PLATS for possible values. +PLAT= guess + +# Where to install. The installation starts in the src and doc directories, +# so take care if INSTALL_TOP is not an absolute path. See the local target. +# You may want to make INSTALL_LMOD and INSTALL_CMOD consistent with +# LUA_ROOT, LUA_LDIR, and LUA_CDIR in luaconf.h. +INSTALL_TOP= /usr/local +INSTALL_BIN= $(INSTALL_TOP)/bin +INSTALL_INC= $(INSTALL_TOP)/include +INSTALL_LIB= $(INSTALL_TOP)/lib +INSTALL_MAN= $(INSTALL_TOP)/man/man1 +INSTALL_LMOD= $(INSTALL_TOP)/share/lua/$V +INSTALL_CMOD= $(INSTALL_TOP)/lib/lua/$V + +# How to install. If your install program does not support "-p", then +# you may have to run ranlib on the installed liblua.a. +INSTALL= install -p +INSTALL_EXEC= $(INSTALL) -m 0755 +INSTALL_DATA= $(INSTALL) -m 0644 +# +# If you don't have "install" you can use "cp" instead. +# INSTALL= cp -p +# INSTALL_EXEC= $(INSTALL) +# INSTALL_DATA= $(INSTALL) + +# Other utilities. +MKDIR= mkdir -p +RM= rm -f + +# == END OF USER SETTINGS -- NO NEED TO CHANGE ANYTHING BELOW THIS LINE ======= + +# Convenience platforms targets. +PLATS= guess aix bsd c89 freebsd generic ios linux linux-readline macosx mingw posix solaris + +# What to install. +TO_BIN= lua luac +TO_INC= lua.h luaconf.h lualib.h lauxlib.h lua.hpp +TO_LIB= liblua.a +TO_MAN= lua.1 luac.1 + +# Lua version and release. +V= 5.4 +R= $V.8 + +# Targets start here. +all: $(PLAT) + +$(PLATS) help test clean: + @cd src && $(MAKE) $@ + +install: dummy + cd src && $(MKDIR) $(INSTALL_BIN) $(INSTALL_INC) $(INSTALL_LIB) $(INSTALL_MAN) $(INSTALL_LMOD) $(INSTALL_CMOD) + cd src && $(INSTALL_EXEC) $(TO_BIN) $(INSTALL_BIN) + cd src && $(INSTALL_DATA) $(TO_INC) $(INSTALL_INC) + cd src && $(INSTALL_DATA) $(TO_LIB) $(INSTALL_LIB) + cd doc && $(INSTALL_DATA) $(TO_MAN) $(INSTALL_MAN) + +uninstall: + cd src && cd $(INSTALL_BIN) && $(RM) $(TO_BIN) + cd src && cd $(INSTALL_INC) && $(RM) $(TO_INC) + cd src && cd $(INSTALL_LIB) && $(RM) $(TO_LIB) + cd doc && cd $(INSTALL_MAN) && $(RM) $(TO_MAN) + +local: + $(MAKE) install INSTALL_TOP=../install + +# make may get confused with install/ if it does not support .PHONY. +dummy: + +# Echo config parameters. +echo: + @cd src && $(MAKE) -s echo + @echo "PLAT= $(PLAT)" + @echo "V= $V" + @echo "R= $R" + @echo "TO_BIN= $(TO_BIN)" + @echo "TO_INC= $(TO_INC)" + @echo "TO_LIB= $(TO_LIB)" + @echo "TO_MAN= $(TO_MAN)" + @echo "INSTALL_TOP= $(INSTALL_TOP)" + @echo "INSTALL_BIN= $(INSTALL_BIN)" + @echo "INSTALL_INC= $(INSTALL_INC)" + @echo "INSTALL_LIB= $(INSTALL_LIB)" + @echo "INSTALL_MAN= $(INSTALL_MAN)" + @echo "INSTALL_LMOD= $(INSTALL_LMOD)" + @echo "INSTALL_CMOD= $(INSTALL_CMOD)" + @echo "INSTALL_EXEC= $(INSTALL_EXEC)" + @echo "INSTALL_DATA= $(INSTALL_DATA)" + +# Echo pkg-config data. +pc: + @echo "version=$R" + @echo "prefix=$(INSTALL_TOP)" + @echo "libdir=$(INSTALL_LIB)" + @echo "includedir=$(INSTALL_INC)" + +# Targets that do not create files (not all makes understand .PHONY). +.PHONY: all $(PLATS) help test clean install uninstall local dummy echo pc + +# (end of Makefile) diff --git a/vendor/lua-5.4.8/src/Makefile b/vendor/lua-5.4.8/src/Makefile new file mode 100644 index 0000000..b771196 --- /dev/null +++ b/vendor/lua-5.4.8/src/Makefile @@ -0,0 +1,225 @@ +# Makefile for building Lua +# See ../doc/readme.html for installation and customization instructions. + +# == CHANGE THE SETTINGS BELOW TO SUIT YOUR ENVIRONMENT ======================= + +# Your platform. See PLATS for possible values. +PLAT= guess + +CC= gcc -std=gnu99 +CFLAGS= -O2 -Wall -Wextra -DLUA_COMPAT_5_3 $(SYSCFLAGS) $(MYCFLAGS) +LDFLAGS= $(SYSLDFLAGS) $(MYLDFLAGS) +LIBS= -lm $(SYSLIBS) $(MYLIBS) + +AR= ar rcu +RANLIB= ranlib +RM= rm -f +UNAME= uname + +SYSCFLAGS= +SYSLDFLAGS= +SYSLIBS= + +MYCFLAGS= +MYLDFLAGS= +MYLIBS= +MYOBJS= + +# Special flags for compiler modules; -Os reduces code size. +CMCFLAGS= + +# == END OF USER SETTINGS -- NO NEED TO CHANGE ANYTHING BELOW THIS LINE ======= + +PLATS= guess aix bsd c89 freebsd generic ios linux linux-readline macosx mingw posix solaris + +LUA_A= liblua.a +CORE_O= lapi.o lcode.o lctype.o ldebug.o ldo.o ldump.o lfunc.o lgc.o llex.o lmem.o lobject.o lopcodes.o lparser.o lstate.o lstring.o ltable.o ltm.o lundump.o lvm.o lzio.o +LIB_O= lauxlib.o lbaselib.o lcorolib.o ldblib.o liolib.o lmathlib.o loadlib.o loslib.o lstrlib.o ltablib.o lutf8lib.o linit.o +BASE_O= $(CORE_O) $(LIB_O) $(MYOBJS) + +LUA_T= lua +LUA_O= lua.o + +LUAC_T= luac +LUAC_O= luac.o + +ALL_O= $(BASE_O) $(LUA_O) $(LUAC_O) +ALL_T= $(LUA_A) $(LUA_T) $(LUAC_T) +ALL_A= $(LUA_A) + +# Targets start here. +default: $(PLAT) + +all: $(ALL_T) + +o: $(ALL_O) + +a: $(ALL_A) + +$(LUA_A): $(BASE_O) + $(AR) $@ $(BASE_O) + $(RANLIB) $@ + +$(LUA_T): $(LUA_O) $(LUA_A) + $(CC) -o $@ $(LDFLAGS) $(LUA_O) $(LUA_A) $(LIBS) + +$(LUAC_T): $(LUAC_O) $(LUA_A) + $(CC) -o $@ $(LDFLAGS) $(LUAC_O) $(LUA_A) $(LIBS) + +test: + ./$(LUA_T) -v + +clean: + $(RM) $(ALL_T) $(ALL_O) + +depend: + @$(CC) $(CFLAGS) -MM l*.c + +echo: + @echo "PLAT= $(PLAT)" + @echo "CC= $(CC)" + @echo "CFLAGS= $(CFLAGS)" + @echo "LDFLAGS= $(LDFLAGS)" + @echo "LIBS= $(LIBS)" + @echo "AR= $(AR)" + @echo "RANLIB= $(RANLIB)" + @echo "RM= $(RM)" + @echo "UNAME= $(UNAME)" + +# Convenience targets for popular platforms. +ALL= all + +help: + @echo "Do 'make PLATFORM' where PLATFORM is one of these:" + @echo " $(PLATS)" + @echo "See doc/readme.html for complete instructions." + +guess: + @echo Guessing `$(UNAME)` + @$(MAKE) `$(UNAME)` + +AIX aix: + $(MAKE) $(ALL) CC="xlc" CFLAGS="-O2 -DLUA_USE_POSIX -DLUA_USE_DLOPEN" SYSLIBS="-ldl" SYSLDFLAGS="-brtl -bexpall" + +bsd: + $(MAKE) $(ALL) SYSCFLAGS="-DLUA_USE_POSIX -DLUA_USE_DLOPEN" SYSLIBS="-Wl,-E" + +c89: + $(MAKE) $(ALL) SYSCFLAGS="-DLUA_USE_C89" CC="gcc -std=c89" + @echo '' + @echo '*** C89 does not guarantee 64-bit integers for Lua.' + @echo '*** Make sure to compile all external Lua libraries' + @echo '*** with LUA_USE_C89 to ensure consistency' + @echo '' + +FreeBSD NetBSD OpenBSD freebsd: + $(MAKE) $(ALL) SYSCFLAGS="-DLUA_USE_LINUX -DLUA_USE_READLINE -I/usr/include/edit" SYSLIBS="-Wl,-E -ledit" CC="cc" + +generic: $(ALL) + +ios: + $(MAKE) $(ALL) SYSCFLAGS="-DLUA_USE_IOS" + +Linux linux: linux-noreadline + +linux-noreadline: + $(MAKE) $(ALL) SYSCFLAGS="-DLUA_USE_LINUX" SYSLIBS="-Wl,-E -ldl" + +linux-readline: + $(MAKE) $(ALL) SYSCFLAGS="-DLUA_USE_LINUX -DLUA_USE_READLINE" SYSLIBS="-Wl,-E -ldl -lreadline" + +Darwin macos macosx: + $(MAKE) $(ALL) SYSCFLAGS="-DLUA_USE_MACOSX -DLUA_USE_READLINE" SYSLIBS="-lreadline" + +mingw: + $(MAKE) "LUA_A=lua54.dll" "LUA_T=lua.exe" \ + "AR=$(CC) -shared -o" "RANLIB=strip --strip-unneeded" \ + "SYSCFLAGS=-DLUA_BUILD_AS_DLL" "SYSLIBS=" "SYSLDFLAGS=-s" lua.exe + $(MAKE) "LUAC_T=luac.exe" luac.exe + +posix: + $(MAKE) $(ALL) SYSCFLAGS="-DLUA_USE_POSIX" + +SunOS solaris: + $(MAKE) $(ALL) SYSCFLAGS="-DLUA_USE_POSIX -DLUA_USE_DLOPEN -D_REENTRANT" SYSLIBS="-ldl" + +# Targets that do not create files (not all makes understand .PHONY). +.PHONY: all $(PLATS) help test clean default o a depend echo + +# Compiler modules may use special flags. +llex.o: + $(CC) $(CFLAGS) $(CMCFLAGS) -c llex.c + +lparser.o: + $(CC) $(CFLAGS) $(CMCFLAGS) -c lparser.c + +lcode.o: + $(CC) $(CFLAGS) $(CMCFLAGS) -c lcode.c + +# DO NOT DELETE + +lapi.o: lapi.c lprefix.h lua.h luaconf.h lapi.h llimits.h lstate.h \ + lobject.h ltm.h lzio.h lmem.h ldebug.h ldo.h lfunc.h lgc.h lstring.h \ + ltable.h lundump.h lvm.h +lauxlib.o: lauxlib.c lprefix.h lua.h luaconf.h lauxlib.h +lbaselib.o: lbaselib.c lprefix.h lua.h luaconf.h lauxlib.h lualib.h +lcode.o: lcode.c lprefix.h lua.h luaconf.h lcode.h llex.h lobject.h \ + llimits.h lzio.h lmem.h lopcodes.h lparser.h ldebug.h lstate.h ltm.h \ + ldo.h lgc.h lstring.h ltable.h lvm.h +lcorolib.o: lcorolib.c lprefix.h lua.h luaconf.h lauxlib.h lualib.h +lctype.o: lctype.c lprefix.h lctype.h lua.h luaconf.h llimits.h +ldblib.o: ldblib.c lprefix.h lua.h luaconf.h lauxlib.h lualib.h +ldebug.o: ldebug.c lprefix.h lua.h luaconf.h lapi.h llimits.h lstate.h \ + lobject.h ltm.h lzio.h lmem.h lcode.h llex.h lopcodes.h lparser.h \ + ldebug.h ldo.h lfunc.h lstring.h lgc.h ltable.h lvm.h +ldo.o: ldo.c lprefix.h lua.h luaconf.h lapi.h llimits.h lstate.h \ + lobject.h ltm.h lzio.h lmem.h ldebug.h ldo.h lfunc.h lgc.h lopcodes.h \ + lparser.h lstring.h ltable.h lundump.h lvm.h +ldump.o: ldump.c lprefix.h lua.h luaconf.h lobject.h llimits.h lstate.h \ + ltm.h lzio.h lmem.h lundump.h +lfunc.o: lfunc.c lprefix.h lua.h luaconf.h ldebug.h lstate.h lobject.h \ + llimits.h ltm.h lzio.h lmem.h ldo.h lfunc.h lgc.h +lgc.o: lgc.c lprefix.h lua.h luaconf.h ldebug.h lstate.h lobject.h \ + llimits.h ltm.h lzio.h lmem.h ldo.h lfunc.h lgc.h lstring.h ltable.h +linit.o: linit.c lprefix.h lua.h luaconf.h lualib.h lauxlib.h +liolib.o: liolib.c lprefix.h lua.h luaconf.h lauxlib.h lualib.h +llex.o: llex.c lprefix.h lua.h luaconf.h lctype.h llimits.h ldebug.h \ + lstate.h lobject.h ltm.h lzio.h lmem.h ldo.h lgc.h llex.h lparser.h \ + lstring.h ltable.h +lmathlib.o: lmathlib.c lprefix.h lua.h luaconf.h lauxlib.h lualib.h +lmem.o: lmem.c lprefix.h lua.h luaconf.h ldebug.h lstate.h lobject.h \ + llimits.h ltm.h lzio.h lmem.h ldo.h lgc.h +loadlib.o: loadlib.c lprefix.h lua.h luaconf.h lauxlib.h lualib.h +lobject.o: lobject.c lprefix.h lua.h luaconf.h lctype.h llimits.h \ + ldebug.h lstate.h lobject.h ltm.h lzio.h lmem.h ldo.h lstring.h lgc.h \ + lvm.h +lopcodes.o: lopcodes.c lprefix.h lopcodes.h llimits.h lua.h luaconf.h +loslib.o: loslib.c lprefix.h lua.h luaconf.h lauxlib.h lualib.h +lparser.o: lparser.c lprefix.h lua.h luaconf.h lcode.h llex.h lobject.h \ + llimits.h lzio.h lmem.h lopcodes.h lparser.h ldebug.h lstate.h ltm.h \ + ldo.h lfunc.h lstring.h lgc.h ltable.h +lstate.o: lstate.c lprefix.h lua.h luaconf.h lapi.h llimits.h lstate.h \ + lobject.h ltm.h lzio.h lmem.h ldebug.h ldo.h lfunc.h lgc.h llex.h \ + lstring.h ltable.h +lstring.o: lstring.c lprefix.h lua.h luaconf.h ldebug.h lstate.h \ + lobject.h llimits.h ltm.h lzio.h lmem.h ldo.h lstring.h lgc.h +lstrlib.o: lstrlib.c lprefix.h lua.h luaconf.h lauxlib.h lualib.h +ltable.o: ltable.c lprefix.h lua.h luaconf.h ldebug.h lstate.h lobject.h \ + llimits.h ltm.h lzio.h lmem.h ldo.h lgc.h lstring.h ltable.h lvm.h +ltablib.o: ltablib.c lprefix.h lua.h luaconf.h lauxlib.h lualib.h +ltm.o: ltm.c lprefix.h lua.h luaconf.h ldebug.h lstate.h lobject.h \ + llimits.h ltm.h lzio.h lmem.h ldo.h lgc.h lstring.h ltable.h lvm.h +lua.o: lua.c lprefix.h lua.h luaconf.h lauxlib.h lualib.h +luac.o: luac.c lprefix.h lua.h luaconf.h lauxlib.h ldebug.h lstate.h \ + lobject.h llimits.h ltm.h lzio.h lmem.h lopcodes.h lopnames.h lundump.h +lundump.o: lundump.c lprefix.h lua.h luaconf.h ldebug.h lstate.h \ + lobject.h llimits.h ltm.h lzio.h lmem.h ldo.h lfunc.h lstring.h lgc.h \ + lundump.h +lutf8lib.o: lutf8lib.c lprefix.h lua.h luaconf.h lauxlib.h lualib.h +lvm.o: lvm.c lprefix.h lua.h luaconf.h ldebug.h lstate.h lobject.h \ + llimits.h ltm.h lzio.h lmem.h ldo.h lfunc.h lgc.h lopcodes.h lstring.h \ + ltable.h lvm.h ljumptab.h +lzio.o: lzio.c lprefix.h lua.h luaconf.h llimits.h lmem.h lstate.h \ + lobject.h ltm.h lzio.h + +# (end of Makefile) diff --git a/vendor/lua-5.4.8/src/lapi.c b/vendor/lua-5.4.8/src/lapi.c new file mode 100644 index 0000000..04e09cf --- /dev/null +++ b/vendor/lua-5.4.8/src/lapi.c @@ -0,0 +1,1463 @@ +/* +** $Id: lapi.c $ +** Lua API +** See Copyright Notice in lua.h +*/ + +#define lapi_c +#define LUA_CORE + +#include "lprefix.h" + + +#include <limits.h> +#include <stdarg.h> +#include <string.h> + +#include "lua.h" + +#include "lapi.h" +#include "ldebug.h" +#include "ldo.h" +#include "lfunc.h" +#include "lgc.h" +#include "lmem.h" +#include "lobject.h" +#include "lstate.h" +#include "lstring.h" +#include "ltable.h" +#include "ltm.h" +#include "lundump.h" +#include "lvm.h" + + + +const char lua_ident[] = + "$LuaVersion: " LUA_COPYRIGHT " $" + "$LuaAuthors: " LUA_AUTHORS " $"; + + + +/* +** Test for a valid index (one that is not the 'nilvalue'). +** '!ttisnil(o)' implies 'o != &G(L)->nilvalue', so it is not needed. +** However, it covers the most common cases in a faster way. +*/ +#define isvalid(L, o) (!ttisnil(o) || o != &G(L)->nilvalue) + + +/* test for pseudo index */ +#define ispseudo(i) ((i) <= LUA_REGISTRYINDEX) + +/* test for upvalue */ +#define isupvalue(i) ((i) < LUA_REGISTRYINDEX) + + +/* +** Convert an acceptable index to a pointer to its respective value. +** Non-valid indices return the special nil value 'G(L)->nilvalue'. +*/ +static TValue *index2value (lua_State *L, int idx) { + CallInfo *ci = L->ci; + if (idx > 0) { + StkId o = ci->func.p + idx; + api_check(L, idx <= ci->top.p - (ci->func.p + 1), "unacceptable index"); + if (o >= L->top.p) return &G(L)->nilvalue; + else return s2v(o); + } + else if (!ispseudo(idx)) { /* negative index */ + api_check(L, idx != 0 && -idx <= L->top.p - (ci->func.p + 1), + "invalid index"); + return s2v(L->top.p + idx); + } + else if (idx == LUA_REGISTRYINDEX) + return &G(L)->l_registry; + else { /* upvalues */ + idx = LUA_REGISTRYINDEX - idx; + api_check(L, idx <= MAXUPVAL + 1, "upvalue index too large"); + if (ttisCclosure(s2v(ci->func.p))) { /* C closure? */ + CClosure *func = clCvalue(s2v(ci->func.p)); + return (idx <= func->nupvalues) ? &func->upvalue[idx-1] + : &G(L)->nilvalue; + } + else { /* light C function or Lua function (through a hook)?) */ + api_check(L, ttislcf(s2v(ci->func.p)), "caller not a C function"); + return &G(L)->nilvalue; /* no upvalues */ + } + } +} + + + +/* +** Convert a valid actual index (not a pseudo-index) to its address. +*/ +l_sinline StkId index2stack (lua_State *L, int idx) { + CallInfo *ci = L->ci; + if (idx > 0) { + StkId o = ci->func.p + idx; + api_check(L, o < L->top.p, "invalid index"); + return o; + } + else { /* non-positive index */ + api_check(L, idx != 0 && -idx <= L->top.p - (ci->func.p + 1), + "invalid index"); + api_check(L, !ispseudo(idx), "invalid index"); + return L->top.p + idx; + } +} + + +LUA_API int lua_checkstack (lua_State *L, int n) { + int res; + CallInfo *ci; + lua_lock(L); + ci = L->ci; + api_check(L, n >= 0, "negative 'n'"); + if (L->stack_last.p - L->top.p > n) /* stack large enough? */ + res = 1; /* yes; check is OK */ + else /* need to grow stack */ + res = luaD_growstack(L, n, 0); + if (res && ci->top.p < L->top.p + n) + ci->top.p = L->top.p + n; /* adjust frame top */ + lua_unlock(L); + return res; +} + + +LUA_API void lua_xmove (lua_State *from, lua_State *to, int n) { + int i; + if (from == to) return; + lua_lock(to); + api_checknelems(from, n); + api_check(from, G(from) == G(to), "moving among independent states"); + api_check(from, to->ci->top.p - to->top.p >= n, "stack overflow"); + from->top.p -= n; + for (i = 0; i < n; i++) { + setobjs2s(to, to->top.p, from->top.p + i); + to->top.p++; /* stack already checked by previous 'api_check' */ + } + lua_unlock(to); +} + + +LUA_API lua_CFunction lua_atpanic (lua_State *L, lua_CFunction panicf) { + lua_CFunction old; + lua_lock(L); + old = G(L)->panic; + G(L)->panic = panicf; + lua_unlock(L); + return old; +} + + +LUA_API lua_Number lua_version (lua_State *L) { + UNUSED(L); + return LUA_VERSION_NUM; +} + + + +/* +** basic stack manipulation +*/ + + +/* +** convert an acceptable stack index into an absolute index +*/ +LUA_API int lua_absindex (lua_State *L, int idx) { + return (idx > 0 || ispseudo(idx)) + ? idx + : cast_int(L->top.p - L->ci->func.p) + idx; +} + + +LUA_API int lua_gettop (lua_State *L) { + return cast_int(L->top.p - (L->ci->func.p + 1)); +} + + +LUA_API void lua_settop (lua_State *L, int idx) { + CallInfo *ci; + StkId func, newtop; + ptrdiff_t diff; /* difference for new top */ + lua_lock(L); + ci = L->ci; + func = ci->func.p; + if (idx >= 0) { + api_check(L, idx <= ci->top.p - (func + 1), "new top too large"); + diff = ((func + 1) + idx) - L->top.p; + for (; diff > 0; diff--) + setnilvalue(s2v(L->top.p++)); /* clear new slots */ + } + else { + api_check(L, -(idx+1) <= (L->top.p - (func + 1)), "invalid new top"); + diff = idx + 1; /* will "subtract" index (as it is negative) */ + } + api_check(L, L->tbclist.p < L->top.p, "previous pop of an unclosed slot"); + newtop = L->top.p + diff; + if (diff < 0 && L->tbclist.p >= newtop) { + lua_assert(hastocloseCfunc(ci->nresults)); + newtop = luaF_close(L, newtop, CLOSEKTOP, 0); + } + L->top.p = newtop; /* correct top only after closing any upvalue */ + lua_unlock(L); +} + + +LUA_API void lua_closeslot (lua_State *L, int idx) { + StkId level; + lua_lock(L); + level = index2stack(L, idx); + api_check(L, hastocloseCfunc(L->ci->nresults) && L->tbclist.p == level, + "no variable to close at given level"); + level = luaF_close(L, level, CLOSEKTOP, 0); + setnilvalue(s2v(level)); + lua_unlock(L); +} + + +/* +** Reverse the stack segment from 'from' to 'to' +** (auxiliary to 'lua_rotate') +** Note that we move(copy) only the value inside the stack. +** (We do not move additional fields that may exist.) +*/ +l_sinline void reverse (lua_State *L, StkId from, StkId to) { + for (; from < to; from++, to--) { + TValue temp; + setobj(L, &temp, s2v(from)); + setobjs2s(L, from, to); + setobj2s(L, to, &temp); + } +} + + +/* +** Let x = AB, where A is a prefix of length 'n'. Then, +** rotate x n == BA. But BA == (A^r . B^r)^r. +*/ +LUA_API void lua_rotate (lua_State *L, int idx, int n) { + StkId p, t, m; + lua_lock(L); + t = L->top.p - 1; /* end of stack segment being rotated */ + p = index2stack(L, idx); /* start of segment */ + api_check(L, (n >= 0 ? n : -n) <= (t - p + 1), "invalid 'n'"); + m = (n >= 0 ? t - n : p - n - 1); /* end of prefix */ + reverse(L, p, m); /* reverse the prefix with length 'n' */ + reverse(L, m + 1, t); /* reverse the suffix */ + reverse(L, p, t); /* reverse the entire segment */ + lua_unlock(L); +} + + +LUA_API void lua_copy (lua_State *L, int fromidx, int toidx) { + TValue *fr, *to; + lua_lock(L); + fr = index2value(L, fromidx); + to = index2value(L, toidx); + api_check(L, isvalid(L, to), "invalid index"); + setobj(L, to, fr); + if (isupvalue(toidx)) /* function upvalue? */ + luaC_barrier(L, clCvalue(s2v(L->ci->func.p)), fr); + /* LUA_REGISTRYINDEX does not need gc barrier + (collector revisits it before finishing collection) */ + lua_unlock(L); +} + + +LUA_API void lua_pushvalue (lua_State *L, int idx) { + lua_lock(L); + setobj2s(L, L->top.p, index2value(L, idx)); + api_incr_top(L); + lua_unlock(L); +} + + + +/* +** access functions (stack -> C) +*/ + + +LUA_API int lua_type (lua_State *L, int idx) { + const TValue *o = index2value(L, idx); + return (isvalid(L, o) ? ttype(o) : LUA_TNONE); +} + + +LUA_API const char *lua_typename (lua_State *L, int t) { + UNUSED(L); + api_check(L, LUA_TNONE <= t && t < LUA_NUMTYPES, "invalid type"); + return ttypename(t); +} + + +LUA_API int lua_iscfunction (lua_State *L, int idx) { + const TValue *o = index2value(L, idx); + return (ttislcf(o) || (ttisCclosure(o))); +} + + +LUA_API int lua_isinteger (lua_State *L, int idx) { + const TValue *o = index2value(L, idx); + return ttisinteger(o); +} + + +LUA_API int lua_isnumber (lua_State *L, int idx) { + lua_Number n; + const TValue *o = index2value(L, idx); + return tonumber(o, &n); +} + + +LUA_API int lua_isstring (lua_State *L, int idx) { + const TValue *o = index2value(L, idx); + return (ttisstring(o) || cvt2str(o)); +} + + +LUA_API int lua_isuserdata (lua_State *L, int idx) { + const TValue *o = index2value(L, idx); + return (ttisfulluserdata(o) || ttislightuserdata(o)); +} + + +LUA_API int lua_rawequal (lua_State *L, int index1, int index2) { + const TValue *o1 = index2value(L, index1); + const TValue *o2 = index2value(L, index2); + return (isvalid(L, o1) && isvalid(L, o2)) ? luaV_rawequalobj(o1, o2) : 0; +} + + +LUA_API void lua_arith (lua_State *L, int op) { + lua_lock(L); + if (op != LUA_OPUNM && op != LUA_OPBNOT) + api_checknelems(L, 2); /* all other operations expect two operands */ + else { /* for unary operations, add fake 2nd operand */ + api_checknelems(L, 1); + setobjs2s(L, L->top.p, L->top.p - 1); + api_incr_top(L); + } + /* first operand at top - 2, second at top - 1; result go to top - 2 */ + luaO_arith(L, op, s2v(L->top.p - 2), s2v(L->top.p - 1), L->top.p - 2); + L->top.p--; /* remove second operand */ + lua_unlock(L); +} + + +LUA_API int lua_compare (lua_State *L, int index1, int index2, int op) { + const TValue *o1; + const TValue *o2; + int i = 0; + lua_lock(L); /* may call tag method */ + o1 = index2value(L, index1); + o2 = index2value(L, index2); + if (isvalid(L, o1) && isvalid(L, o2)) { + switch (op) { + case LUA_OPEQ: i = luaV_equalobj(L, o1, o2); break; + case LUA_OPLT: i = luaV_lessthan(L, o1, o2); break; + case LUA_OPLE: i = luaV_lessequal(L, o1, o2); break; + default: api_check(L, 0, "invalid option"); + } + } + lua_unlock(L); + return i; +} + + +LUA_API size_t lua_stringtonumber (lua_State *L, const char *s) { + size_t sz = luaO_str2num(s, s2v(L->top.p)); + if (sz != 0) + api_incr_top(L); + return sz; +} + + +LUA_API lua_Number lua_tonumberx (lua_State *L, int idx, int *pisnum) { + lua_Number n = 0; + const TValue *o = index2value(L, idx); + int isnum = tonumber(o, &n); + if (pisnum) + *pisnum = isnum; + return n; +} + + +LUA_API lua_Integer lua_tointegerx (lua_State *L, int idx, int *pisnum) { + lua_Integer res = 0; + const TValue *o = index2value(L, idx); + int isnum = tointeger(o, &res); + if (pisnum) + *pisnum = isnum; + return res; +} + + +LUA_API int lua_toboolean (lua_State *L, int idx) { + const TValue *o = index2value(L, idx); + return !l_isfalse(o); +} + + +LUA_API const char *lua_tolstring (lua_State *L, int idx, size_t *len) { + TValue *o; + lua_lock(L); + o = index2value(L, idx); + if (!ttisstring(o)) { + if (!cvt2str(o)) { /* not convertible? */ + if (len != NULL) *len = 0; + lua_unlock(L); + return NULL; + } + luaO_tostring(L, o); + luaC_checkGC(L); + o = index2value(L, idx); /* previous call may reallocate the stack */ + } + if (len != NULL) + *len = tsslen(tsvalue(o)); + lua_unlock(L); + return getstr(tsvalue(o)); +} + + +LUA_API lua_Unsigned lua_rawlen (lua_State *L, int idx) { + const TValue *o = index2value(L, idx); + switch (ttypetag(o)) { + case LUA_VSHRSTR: return tsvalue(o)->shrlen; + case LUA_VLNGSTR: return tsvalue(o)->u.lnglen; + case LUA_VUSERDATA: return uvalue(o)->len; + case LUA_VTABLE: return luaH_getn(hvalue(o)); + default: return 0; + } +} + + +LUA_API lua_CFunction lua_tocfunction (lua_State *L, int idx) { + const TValue *o = index2value(L, idx); + if (ttislcf(o)) return fvalue(o); + else if (ttisCclosure(o)) + return clCvalue(o)->f; + else return NULL; /* not a C function */ +} + + +l_sinline void *touserdata (const TValue *o) { + switch (ttype(o)) { + case LUA_TUSERDATA: return getudatamem(uvalue(o)); + case LUA_TLIGHTUSERDATA: return pvalue(o); + default: return NULL; + } +} + + +LUA_API void *lua_touserdata (lua_State *L, int idx) { + const TValue *o = index2value(L, idx); + return touserdata(o); +} + + +LUA_API lua_State *lua_tothread (lua_State *L, int idx) { + const TValue *o = index2value(L, idx); + return (!ttisthread(o)) ? NULL : thvalue(o); +} + + +/* +** Returns a pointer to the internal representation of an object. +** Note that ANSI C does not allow the conversion of a pointer to +** function to a 'void*', so the conversion here goes through +** a 'size_t'. (As the returned pointer is only informative, this +** conversion should not be a problem.) +*/ +LUA_API const void *lua_topointer (lua_State *L, int idx) { + const TValue *o = index2value(L, idx); + switch (ttypetag(o)) { + case LUA_VLCF: return cast_voidp(cast_sizet(fvalue(o))); + case LUA_VUSERDATA: case LUA_VLIGHTUSERDATA: + return touserdata(o); + default: { + if (iscollectable(o)) + return gcvalue(o); + else + return NULL; + } + } +} + + + +/* +** push functions (C -> stack) +*/ + + +LUA_API void lua_pushnil (lua_State *L) { + lua_lock(L); + setnilvalue(s2v(L->top.p)); + api_incr_top(L); + lua_unlock(L); +} + + +LUA_API void lua_pushnumber (lua_State *L, lua_Number n) { + lua_lock(L); + setfltvalue(s2v(L->top.p), n); + api_incr_top(L); + lua_unlock(L); +} + + +LUA_API void lua_pushinteger (lua_State *L, lua_Integer n) { + lua_lock(L); + setivalue(s2v(L->top.p), n); + api_incr_top(L); + lua_unlock(L); +} + + +/* +** Pushes on the stack a string with given length. Avoid using 's' when +** 'len' == 0 (as 's' can be NULL in that case), due to later use of +** 'memcmp' and 'memcpy'. +*/ +LUA_API const char *lua_pushlstring (lua_State *L, const char *s, size_t len) { + TString *ts; + lua_lock(L); + ts = (len == 0) ? luaS_new(L, "") : luaS_newlstr(L, s, len); + setsvalue2s(L, L->top.p, ts); + api_incr_top(L); + luaC_checkGC(L); + lua_unlock(L); + return getstr(ts); +} + + +LUA_API const char *lua_pushstring (lua_State *L, const char *s) { + lua_lock(L); + if (s == NULL) + setnilvalue(s2v(L->top.p)); + else { + TString *ts; + ts = luaS_new(L, s); + setsvalue2s(L, L->top.p, ts); + s = getstr(ts); /* internal copy's address */ + } + api_incr_top(L); + luaC_checkGC(L); + lua_unlock(L); + return s; +} + + +LUA_API const char *lua_pushvfstring (lua_State *L, const char *fmt, + va_list argp) { + const char *ret; + lua_lock(L); + ret = luaO_pushvfstring(L, fmt, argp); + luaC_checkGC(L); + lua_unlock(L); + return ret; +} + + +LUA_API const char *lua_pushfstring (lua_State *L, const char *fmt, ...) { + const char *ret; + va_list argp; + lua_lock(L); + va_start(argp, fmt); + ret = luaO_pushvfstring(L, fmt, argp); + va_end(argp); + luaC_checkGC(L); + lua_unlock(L); + return ret; +} + + +LUA_API void lua_pushcclosure (lua_State *L, lua_CFunction fn, int n) { + lua_lock(L); + if (n == 0) { + setfvalue(s2v(L->top.p), fn); + api_incr_top(L); + } + else { + CClosure *cl; + api_checknelems(L, n); + api_check(L, n <= MAXUPVAL, "upvalue index too large"); + cl = luaF_newCclosure(L, n); + cl->f = fn; + L->top.p -= n; + while (n--) { + setobj2n(L, &cl->upvalue[n], s2v(L->top.p + n)); + /* does not need barrier because closure is white */ + lua_assert(iswhite(cl)); + } + setclCvalue(L, s2v(L->top.p), cl); + api_incr_top(L); + luaC_checkGC(L); + } + lua_unlock(L); +} + + +LUA_API void lua_pushboolean (lua_State *L, int b) { + lua_lock(L); + if (b) + setbtvalue(s2v(L->top.p)); + else + setbfvalue(s2v(L->top.p)); + api_incr_top(L); + lua_unlock(L); +} + + +LUA_API void lua_pushlightuserdata (lua_State *L, void *p) { + lua_lock(L); + setpvalue(s2v(L->top.p), p); + api_incr_top(L); + lua_unlock(L); +} + + +LUA_API int lua_pushthread (lua_State *L) { + lua_lock(L); + setthvalue(L, s2v(L->top.p), L); + api_incr_top(L); + lua_unlock(L); + return (G(L)->mainthread == L); +} + + + +/* +** get functions (Lua -> stack) +*/ + + +l_sinline int auxgetstr (lua_State *L, const TValue *t, const char *k) { + const TValue *slot; + TString *str = luaS_new(L, k); + if (luaV_fastget(L, t, str, slot, luaH_getstr)) { + setobj2s(L, L->top.p, slot); + api_incr_top(L); + } + else { + setsvalue2s(L, L->top.p, str); + api_incr_top(L); + luaV_finishget(L, t, s2v(L->top.p - 1), L->top.p - 1, slot); + } + lua_unlock(L); + return ttype(s2v(L->top.p - 1)); +} + + +/* +** Get the global table in the registry. Since all predefined +** indices in the registry were inserted right when the registry +** was created and never removed, they must always be in the array +** part of the registry. +*/ +#define getGtable(L) \ + (&hvalue(&G(L)->l_registry)->array[LUA_RIDX_GLOBALS - 1]) + + +LUA_API int lua_getglobal (lua_State *L, const char *name) { + const TValue *G; + lua_lock(L); + G = getGtable(L); + return auxgetstr(L, G, name); +} + + +LUA_API int lua_gettable (lua_State *L, int idx) { + const TValue *slot; + TValue *t; + lua_lock(L); + t = index2value(L, idx); + if (luaV_fastget(L, t, s2v(L->top.p - 1), slot, luaH_get)) { + setobj2s(L, L->top.p - 1, slot); + } + else + luaV_finishget(L, t, s2v(L->top.p - 1), L->top.p - 1, slot); + lua_unlock(L); + return ttype(s2v(L->top.p - 1)); +} + + +LUA_API int lua_getfield (lua_State *L, int idx, const char *k) { + lua_lock(L); + return auxgetstr(L, index2value(L, idx), k); +} + + +LUA_API int lua_geti (lua_State *L, int idx, lua_Integer n) { + TValue *t; + const TValue *slot; + lua_lock(L); + t = index2value(L, idx); + if (luaV_fastgeti(L, t, n, slot)) { + setobj2s(L, L->top.p, slot); + } + else { + TValue aux; + setivalue(&aux, n); + luaV_finishget(L, t, &aux, L->top.p, slot); + } + api_incr_top(L); + lua_unlock(L); + return ttype(s2v(L->top.p - 1)); +} + + +l_sinline int finishrawget (lua_State *L, const TValue *val) { + if (isempty(val)) /* avoid copying empty items to the stack */ + setnilvalue(s2v(L->top.p)); + else + setobj2s(L, L->top.p, val); + api_incr_top(L); + lua_unlock(L); + return ttype(s2v(L->top.p - 1)); +} + + +static Table *gettable (lua_State *L, int idx) { + TValue *t = index2value(L, idx); + api_check(L, ttistable(t), "table expected"); + return hvalue(t); +} + + +LUA_API int lua_rawget (lua_State *L, int idx) { + Table *t; + const TValue *val; + lua_lock(L); + api_checknelems(L, 1); + t = gettable(L, idx); + val = luaH_get(t, s2v(L->top.p - 1)); + L->top.p--; /* remove key */ + return finishrawget(L, val); +} + + +LUA_API int lua_rawgeti (lua_State *L, int idx, lua_Integer n) { + Table *t; + lua_lock(L); + t = gettable(L, idx); + return finishrawget(L, luaH_getint(t, n)); +} + + +LUA_API int lua_rawgetp (lua_State *L, int idx, const void *p) { + Table *t; + TValue k; + lua_lock(L); + t = gettable(L, idx); + setpvalue(&k, cast_voidp(p)); + return finishrawget(L, luaH_get(t, &k)); +} + + +LUA_API void lua_createtable (lua_State *L, int narray, int nrec) { + Table *t; + lua_lock(L); + t = luaH_new(L); + sethvalue2s(L, L->top.p, t); + api_incr_top(L); + if (narray > 0 || nrec > 0) + luaH_resize(L, t, narray, nrec); + luaC_checkGC(L); + lua_unlock(L); +} + + +LUA_API int lua_getmetatable (lua_State *L, int objindex) { + const TValue *obj; + Table *mt; + int res = 0; + lua_lock(L); + obj = index2value(L, objindex); + switch (ttype(obj)) { + case LUA_TTABLE: + mt = hvalue(obj)->metatable; + break; + case LUA_TUSERDATA: + mt = uvalue(obj)->metatable; + break; + default: + mt = G(L)->mt[ttype(obj)]; + break; + } + if (mt != NULL) { + sethvalue2s(L, L->top.p, mt); + api_incr_top(L); + res = 1; + } + lua_unlock(L); + return res; +} + + +LUA_API int lua_getiuservalue (lua_State *L, int idx, int n) { + TValue *o; + int t; + lua_lock(L); + o = index2value(L, idx); + api_check(L, ttisfulluserdata(o), "full userdata expected"); + if (n <= 0 || n > uvalue(o)->nuvalue) { + setnilvalue(s2v(L->top.p)); + t = LUA_TNONE; + } + else { + setobj2s(L, L->top.p, &uvalue(o)->uv[n - 1].uv); + t = ttype(s2v(L->top.p)); + } + api_incr_top(L); + lua_unlock(L); + return t; +} + + +/* +** set functions (stack -> Lua) +*/ + +/* +** t[k] = value at the top of the stack (where 'k' is a string) +*/ +static void auxsetstr (lua_State *L, const TValue *t, const char *k) { + const TValue *slot; + TString *str = luaS_new(L, k); + api_checknelems(L, 1); + if (luaV_fastget(L, t, str, slot, luaH_getstr)) { + luaV_finishfastset(L, t, slot, s2v(L->top.p - 1)); + L->top.p--; /* pop value */ + } + else { + setsvalue2s(L, L->top.p, str); /* push 'str' (to make it a TValue) */ + api_incr_top(L); + luaV_finishset(L, t, s2v(L->top.p - 1), s2v(L->top.p - 2), slot); + L->top.p -= 2; /* pop value and key */ + } + lua_unlock(L); /* lock done by caller */ +} + + +LUA_API void lua_setglobal (lua_State *L, const char *name) { + const TValue *G; + lua_lock(L); /* unlock done in 'auxsetstr' */ + G = getGtable(L); + auxsetstr(L, G, name); +} + + +LUA_API void lua_settable (lua_State *L, int idx) { + TValue *t; + const TValue *slot; + lua_lock(L); + api_checknelems(L, 2); + t = index2value(L, idx); + if (luaV_fastget(L, t, s2v(L->top.p - 2), slot, luaH_get)) { + luaV_finishfastset(L, t, slot, s2v(L->top.p - 1)); + } + else + luaV_finishset(L, t, s2v(L->top.p - 2), s2v(L->top.p - 1), slot); + L->top.p -= 2; /* pop index and value */ + lua_unlock(L); +} + + +LUA_API void lua_setfield (lua_State *L, int idx, const char *k) { + lua_lock(L); /* unlock done in 'auxsetstr' */ + auxsetstr(L, index2value(L, idx), k); +} + + +LUA_API void lua_seti (lua_State *L, int idx, lua_Integer n) { + TValue *t; + const TValue *slot; + lua_lock(L); + api_checknelems(L, 1); + t = index2value(L, idx); + if (luaV_fastgeti(L, t, n, slot)) { + luaV_finishfastset(L, t, slot, s2v(L->top.p - 1)); + } + else { + TValue aux; + setivalue(&aux, n); + luaV_finishset(L, t, &aux, s2v(L->top.p - 1), slot); + } + L->top.p--; /* pop value */ + lua_unlock(L); +} + + +static void aux_rawset (lua_State *L, int idx, TValue *key, int n) { + Table *t; + lua_lock(L); + api_checknelems(L, n); + t = gettable(L, idx); + luaH_set(L, t, key, s2v(L->top.p - 1)); + invalidateTMcache(t); + luaC_barrierback(L, obj2gco(t), s2v(L->top.p - 1)); + L->top.p -= n; + lua_unlock(L); +} + + +LUA_API void lua_rawset (lua_State *L, int idx) { + aux_rawset(L, idx, s2v(L->top.p - 2), 2); +} + + +LUA_API void lua_rawsetp (lua_State *L, int idx, const void *p) { + TValue k; + setpvalue(&k, cast_voidp(p)); + aux_rawset(L, idx, &k, 1); +} + + +LUA_API void lua_rawseti (lua_State *L, int idx, lua_Integer n) { + Table *t; + lua_lock(L); + api_checknelems(L, 1); + t = gettable(L, idx); + luaH_setint(L, t, n, s2v(L->top.p - 1)); + luaC_barrierback(L, obj2gco(t), s2v(L->top.p - 1)); + L->top.p--; + lua_unlock(L); +} + + +LUA_API int lua_setmetatable (lua_State *L, int objindex) { + TValue *obj; + Table *mt; + lua_lock(L); + api_checknelems(L, 1); + obj = index2value(L, objindex); + if (ttisnil(s2v(L->top.p - 1))) + mt = NULL; + else { + api_check(L, ttistable(s2v(L->top.p - 1)), "table expected"); + mt = hvalue(s2v(L->top.p - 1)); + } + switch (ttype(obj)) { + case LUA_TTABLE: { + hvalue(obj)->metatable = mt; + if (mt) { + luaC_objbarrier(L, gcvalue(obj), mt); + luaC_checkfinalizer(L, gcvalue(obj), mt); + } + break; + } + case LUA_TUSERDATA: { + uvalue(obj)->metatable = mt; + if (mt) { + luaC_objbarrier(L, uvalue(obj), mt); + luaC_checkfinalizer(L, gcvalue(obj), mt); + } + break; + } + default: { + G(L)->mt[ttype(obj)] = mt; + break; + } + } + L->top.p--; + lua_unlock(L); + return 1; +} + + +LUA_API int lua_setiuservalue (lua_State *L, int idx, int n) { + TValue *o; + int res; + lua_lock(L); + api_checknelems(L, 1); + o = index2value(L, idx); + api_check(L, ttisfulluserdata(o), "full userdata expected"); + if (!(cast_uint(n) - 1u < cast_uint(uvalue(o)->nuvalue))) + res = 0; /* 'n' not in [1, uvalue(o)->nuvalue] */ + else { + setobj(L, &uvalue(o)->uv[n - 1].uv, s2v(L->top.p - 1)); + luaC_barrierback(L, gcvalue(o), s2v(L->top.p - 1)); + res = 1; + } + L->top.p--; + lua_unlock(L); + return res; +} + + +/* +** 'load' and 'call' functions (run Lua code) +*/ + + +#define checkresults(L,na,nr) \ + api_check(L, (nr) == LUA_MULTRET \ + || (L->ci->top.p - L->top.p >= (nr) - (na)), \ + "results from function overflow current stack size") + + +LUA_API void lua_callk (lua_State *L, int nargs, int nresults, + lua_KContext ctx, lua_KFunction k) { + StkId func; + lua_lock(L); + api_check(L, k == NULL || !isLua(L->ci), + "cannot use continuations inside hooks"); + api_checknelems(L, nargs+1); + api_check(L, L->status == LUA_OK, "cannot do calls on non-normal thread"); + checkresults(L, nargs, nresults); + func = L->top.p - (nargs+1); + if (k != NULL && yieldable(L)) { /* need to prepare continuation? */ + L->ci->u.c.k = k; /* save continuation */ + L->ci->u.c.ctx = ctx; /* save context */ + luaD_call(L, func, nresults); /* do the call */ + } + else /* no continuation or no yieldable */ + luaD_callnoyield(L, func, nresults); /* just do the call */ + adjustresults(L, nresults); + lua_unlock(L); +} + + + +/* +** Execute a protected call. +*/ +struct CallS { /* data to 'f_call' */ + StkId func; + int nresults; +}; + + +static void f_call (lua_State *L, void *ud) { + struct CallS *c = cast(struct CallS *, ud); + luaD_callnoyield(L, c->func, c->nresults); +} + + + +LUA_API int lua_pcallk (lua_State *L, int nargs, int nresults, int errfunc, + lua_KContext ctx, lua_KFunction k) { + struct CallS c; + int status; + ptrdiff_t func; + lua_lock(L); + api_check(L, k == NULL || !isLua(L->ci), + "cannot use continuations inside hooks"); + api_checknelems(L, nargs+1); + api_check(L, L->status == LUA_OK, "cannot do calls on non-normal thread"); + checkresults(L, nargs, nresults); + if (errfunc == 0) + func = 0; + else { + StkId o = index2stack(L, errfunc); + api_check(L, ttisfunction(s2v(o)), "error handler must be a function"); + func = savestack(L, o); + } + c.func = L->top.p - (nargs+1); /* function to be called */ + if (k == NULL || !yieldable(L)) { /* no continuation or no yieldable? */ + c.nresults = nresults; /* do a 'conventional' protected call */ + status = luaD_pcall(L, f_call, &c, savestack(L, c.func), func); + } + else { /* prepare continuation (call is already protected by 'resume') */ + CallInfo *ci = L->ci; + ci->u.c.k = k; /* save continuation */ + ci->u.c.ctx = ctx; /* save context */ + /* save information for error recovery */ + ci->u2.funcidx = cast_int(savestack(L, c.func)); + ci->u.c.old_errfunc = L->errfunc; + L->errfunc = func; + setoah(ci->callstatus, L->allowhook); /* save value of 'allowhook' */ + ci->callstatus |= CIST_YPCALL; /* function can do error recovery */ + luaD_call(L, c.func, nresults); /* do the call */ + ci->callstatus &= ~CIST_YPCALL; + L->errfunc = ci->u.c.old_errfunc; + status = LUA_OK; /* if it is here, there were no errors */ + } + adjustresults(L, nresults); + lua_unlock(L); + return status; +} + + +LUA_API int lua_load (lua_State *L, lua_Reader reader, void *data, + const char *chunkname, const char *mode) { + ZIO z; + int status; + lua_lock(L); + if (!chunkname) chunkname = "?"; + luaZ_init(L, &z, reader, data); + status = luaD_protectedparser(L, &z, chunkname, mode); + if (status == LUA_OK) { /* no errors? */ + LClosure *f = clLvalue(s2v(L->top.p - 1)); /* get new function */ + if (f->nupvalues >= 1) { /* does it have an upvalue? */ + /* get global table from registry */ + const TValue *gt = getGtable(L); + /* set global table as 1st upvalue of 'f' (may be LUA_ENV) */ + setobj(L, f->upvals[0]->v.p, gt); + luaC_barrier(L, f->upvals[0], gt); + } + } + lua_unlock(L); + return status; +} + + +LUA_API int lua_dump (lua_State *L, lua_Writer writer, void *data, int strip) { + int status; + TValue *o; + lua_lock(L); + api_checknelems(L, 1); + o = s2v(L->top.p - 1); + if (isLfunction(o)) + status = luaU_dump(L, getproto(o), writer, data, strip); + else + status = 1; + lua_unlock(L); + return status; +} + + +LUA_API int lua_status (lua_State *L) { + return L->status; +} + + +/* +** Garbage-collection function +*/ +LUA_API int lua_gc (lua_State *L, int what, ...) { + va_list argp; + int res = 0; + global_State *g = G(L); + if (g->gcstp & GCSTPGC) /* internal stop? */ + return -1; /* all options are invalid when stopped */ + lua_lock(L); + va_start(argp, what); + switch (what) { + case LUA_GCSTOP: { + g->gcstp = GCSTPUSR; /* stopped by the user */ + break; + } + case LUA_GCRESTART: { + luaE_setdebt(g, 0); + g->gcstp = 0; /* (GCSTPGC must be already zero here) */ + break; + } + case LUA_GCCOLLECT: { + luaC_fullgc(L, 0); + break; + } + case LUA_GCCOUNT: { + /* GC values are expressed in Kbytes: #bytes/2^10 */ + res = cast_int(gettotalbytes(g) >> 10); + break; + } + case LUA_GCCOUNTB: { + res = cast_int(gettotalbytes(g) & 0x3ff); + break; + } + case LUA_GCSTEP: { + int data = va_arg(argp, int); + l_mem debt = 1; /* =1 to signal that it did an actual step */ + lu_byte oldstp = g->gcstp; + g->gcstp = 0; /* allow GC to run (GCSTPGC must be zero here) */ + if (data == 0) { + luaE_setdebt(g, 0); /* do a basic step */ + luaC_step(L); + } + else { /* add 'data' to total debt */ + debt = cast(l_mem, data) * 1024 + g->GCdebt; + luaE_setdebt(g, debt); + luaC_checkGC(L); + } + g->gcstp = oldstp; /* restore previous state */ + if (debt > 0 && g->gcstate == GCSpause) /* end of cycle? */ + res = 1; /* signal it */ + break; + } + case LUA_GCSETPAUSE: { + int data = va_arg(argp, int); + res = getgcparam(g->gcpause); + setgcparam(g->gcpause, data); + break; + } + case LUA_GCSETSTEPMUL: { + int data = va_arg(argp, int); + res = getgcparam(g->gcstepmul); + setgcparam(g->gcstepmul, data); + break; + } + case LUA_GCISRUNNING: { + res = gcrunning(g); + break; + } + case LUA_GCGEN: { + int minormul = va_arg(argp, int); + int majormul = va_arg(argp, int); + res = isdecGCmodegen(g) ? LUA_GCGEN : LUA_GCINC; + if (minormul != 0) + g->genminormul = minormul; + if (majormul != 0) + setgcparam(g->genmajormul, majormul); + luaC_changemode(L, KGC_GEN); + break; + } + case LUA_GCINC: { + int pause = va_arg(argp, int); + int stepmul = va_arg(argp, int); + int stepsize = va_arg(argp, int); + res = isdecGCmodegen(g) ? LUA_GCGEN : LUA_GCINC; + if (pause != 0) + setgcparam(g->gcpause, pause); + if (stepmul != 0) + setgcparam(g->gcstepmul, stepmul); + if (stepsize != 0) + g->gcstepsize = stepsize; + luaC_changemode(L, KGC_INC); + break; + } + default: res = -1; /* invalid option */ + } + va_end(argp); + lua_unlock(L); + return res; +} + + + +/* +** miscellaneous functions +*/ + + +LUA_API int lua_error (lua_State *L) { + TValue *errobj; + lua_lock(L); + errobj = s2v(L->top.p - 1); + api_checknelems(L, 1); + /* error object is the memory error message? */ + if (ttisshrstring(errobj) && eqshrstr(tsvalue(errobj), G(L)->memerrmsg)) + luaM_error(L); /* raise a memory error */ + else + luaG_errormsg(L); /* raise a regular error */ + /* code unreachable; will unlock when control actually leaves the kernel */ + return 0; /* to avoid warnings */ +} + + +LUA_API int lua_next (lua_State *L, int idx) { + Table *t; + int more; + lua_lock(L); + api_checknelems(L, 1); + t = gettable(L, idx); + more = luaH_next(L, t, L->top.p - 1); + if (more) { + api_incr_top(L); + } + else /* no more elements */ + L->top.p -= 1; /* remove key */ + lua_unlock(L); + return more; +} + + +LUA_API void lua_toclose (lua_State *L, int idx) { + int nresults; + StkId o; + lua_lock(L); + o = index2stack(L, idx); + nresults = L->ci->nresults; + api_check(L, L->tbclist.p < o, "given index below or equal a marked one"); + luaF_newtbcupval(L, o); /* create new to-be-closed upvalue */ + if (!hastocloseCfunc(nresults)) /* function not marked yet? */ + L->ci->nresults = codeNresults(nresults); /* mark it */ + lua_assert(hastocloseCfunc(L->ci->nresults)); + lua_unlock(L); +} + + +LUA_API void lua_concat (lua_State *L, int n) { + lua_lock(L); + api_checknelems(L, n); + if (n > 0) + luaV_concat(L, n); + else { /* nothing to concatenate */ + setsvalue2s(L, L->top.p, luaS_newlstr(L, "", 0)); /* push empty string */ + api_incr_top(L); + } + luaC_checkGC(L); + lua_unlock(L); +} + + +LUA_API void lua_len (lua_State *L, int idx) { + TValue *t; + lua_lock(L); + t = index2value(L, idx); + luaV_objlen(L, L->top.p, t); + api_incr_top(L); + lua_unlock(L); +} + + +LUA_API lua_Alloc lua_getallocf (lua_State *L, void **ud) { + lua_Alloc f; + lua_lock(L); + if (ud) *ud = G(L)->ud; + f = G(L)->frealloc; + lua_unlock(L); + return f; +} + + +LUA_API void lua_setallocf (lua_State *L, lua_Alloc f, void *ud) { + lua_lock(L); + G(L)->ud = ud; + G(L)->frealloc = f; + lua_unlock(L); +} + + +void lua_setwarnf (lua_State *L, lua_WarnFunction f, void *ud) { + lua_lock(L); + G(L)->ud_warn = ud; + G(L)->warnf = f; + lua_unlock(L); +} + + +void lua_warning (lua_State *L, const char *msg, int tocont) { + lua_lock(L); + luaE_warning(L, msg, tocont); + lua_unlock(L); +} + + + +LUA_API void *lua_newuserdatauv (lua_State *L, size_t size, int nuvalue) { + Udata *u; + lua_lock(L); + api_check(L, 0 <= nuvalue && nuvalue < SHRT_MAX, "invalid value"); + u = luaS_newudata(L, size, nuvalue); + setuvalue(L, s2v(L->top.p), u); + api_incr_top(L); + luaC_checkGC(L); + lua_unlock(L); + return getudatamem(u); +} + + + +static const char *aux_upvalue (TValue *fi, int n, TValue **val, + GCObject **owner) { + switch (ttypetag(fi)) { + case LUA_VCCL: { /* C closure */ + CClosure *f = clCvalue(fi); + if (!(cast_uint(n) - 1u < cast_uint(f->nupvalues))) + return NULL; /* 'n' not in [1, f->nupvalues] */ + *val = &f->upvalue[n-1]; + if (owner) *owner = obj2gco(f); + return ""; + } + case LUA_VLCL: { /* Lua closure */ + LClosure *f = clLvalue(fi); + TString *name; + Proto *p = f->p; + if (!(cast_uint(n) - 1u < cast_uint(p->sizeupvalues))) + return NULL; /* 'n' not in [1, p->sizeupvalues] */ + *val = f->upvals[n-1]->v.p; + if (owner) *owner = obj2gco(f->upvals[n - 1]); + name = p->upvalues[n-1].name; + return (name == NULL) ? "(no name)" : getstr(name); + } + default: return NULL; /* not a closure */ + } +} + + +LUA_API const char *lua_getupvalue (lua_State *L, int funcindex, int n) { + const char *name; + TValue *val = NULL; /* to avoid warnings */ + lua_lock(L); + name = aux_upvalue(index2value(L, funcindex), n, &val, NULL); + if (name) { + setobj2s(L, L->top.p, val); + api_incr_top(L); + } + lua_unlock(L); + return name; +} + + +LUA_API const char *lua_setupvalue (lua_State *L, int funcindex, int n) { + const char *name; + TValue *val = NULL; /* to avoid warnings */ + GCObject *owner = NULL; /* to avoid warnings */ + TValue *fi; + lua_lock(L); + fi = index2value(L, funcindex); + api_checknelems(L, 1); + name = aux_upvalue(fi, n, &val, &owner); + if (name) { + L->top.p--; + setobj(L, val, s2v(L->top.p)); + luaC_barrier(L, owner, val); + } + lua_unlock(L); + return name; +} + + +static UpVal **getupvalref (lua_State *L, int fidx, int n, LClosure **pf) { + static const UpVal *const nullup = NULL; + LClosure *f; + TValue *fi = index2value(L, fidx); + api_check(L, ttisLclosure(fi), "Lua function expected"); + f = clLvalue(fi); + if (pf) *pf = f; + if (1 <= n && n <= f->p->sizeupvalues) + return &f->upvals[n - 1]; /* get its upvalue pointer */ + else + return (UpVal**)&nullup; +} + + +LUA_API void *lua_upvalueid (lua_State *L, int fidx, int n) { + TValue *fi = index2value(L, fidx); + switch (ttypetag(fi)) { + case LUA_VLCL: { /* lua closure */ + return *getupvalref(L, fidx, n, NULL); + } + case LUA_VCCL: { /* C closure */ + CClosure *f = clCvalue(fi); + if (1 <= n && n <= f->nupvalues) + return &f->upvalue[n - 1]; + /* else */ + } /* FALLTHROUGH */ + case LUA_VLCF: + return NULL; /* light C functions have no upvalues */ + default: { + api_check(L, 0, "function expected"); + return NULL; + } + } +} + + +LUA_API void lua_upvaluejoin (lua_State *L, int fidx1, int n1, + int fidx2, int n2) { + LClosure *f1; + UpVal **up1 = getupvalref(L, fidx1, n1, &f1); + UpVal **up2 = getupvalref(L, fidx2, n2, NULL); + api_check(L, *up1 != NULL && *up2 != NULL, "invalid upvalue index"); + *up1 = *up2; + luaC_objbarrier(L, f1, *up1); +} + + diff --git a/vendor/lua-5.4.8/src/lapi.h b/vendor/lua-5.4.8/src/lapi.h new file mode 100644 index 0000000..a742427 --- /dev/null +++ b/vendor/lua-5.4.8/src/lapi.h @@ -0,0 +1,52 @@ +/* +** $Id: lapi.h $ +** Auxiliary functions from Lua API +** See Copyright Notice in lua.h +*/ + +#ifndef lapi_h +#define lapi_h + + +#include "llimits.h" +#include "lstate.h" + + +/* Increments 'L->top.p', checking for stack overflows */ +#define api_incr_top(L) {L->top.p++; \ + api_check(L, L->top.p <= L->ci->top.p, \ + "stack overflow");} + + +/* +** If a call returns too many multiple returns, the callee may not have +** stack space to accommodate all results. In this case, this macro +** increases its stack space ('L->ci->top.p'). +*/ +#define adjustresults(L,nres) \ + { if ((nres) <= LUA_MULTRET && L->ci->top.p < L->top.p) \ + L->ci->top.p = L->top.p; } + + +/* Ensure the stack has at least 'n' elements */ +#define api_checknelems(L,n) \ + api_check(L, (n) < (L->top.p - L->ci->func.p), \ + "not enough elements in the stack") + + +/* +** To reduce the overhead of returning from C functions, the presence of +** to-be-closed variables in these functions is coded in the CallInfo's +** field 'nresults', in a way that functions with no to-be-closed variables +** with zero, one, or "all" wanted results have no overhead. Functions +** with other number of wanted results, as well as functions with +** variables to be closed, have an extra check. +*/ + +#define hastocloseCfunc(n) ((n) < LUA_MULTRET) + +/* Map [-1, inf) (range of 'nresults') into (-inf, -2] */ +#define codeNresults(n) (-(n) - 3) +#define decodeNresults(n) (-(n) - 3) + +#endif diff --git a/vendor/lua-5.4.8/src/lauxlib.c b/vendor/lua-5.4.8/src/lauxlib.c new file mode 100644 index 0000000..923105e --- /dev/null +++ b/vendor/lua-5.4.8/src/lauxlib.c @@ -0,0 +1,1126 @@ +/* +** $Id: lauxlib.c $ +** Auxiliary functions for building Lua libraries +** See Copyright Notice in lua.h +*/ + +#define lauxlib_c +#define LUA_LIB + +#include "lprefix.h" + + +#include <errno.h> +#include <stdarg.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + + +/* +** This file uses only the official API of Lua. +** Any function declared here could be written as an application function. +*/ + +#include "lua.h" + +#include "lauxlib.h" + + +#if !defined(MAX_SIZET) +/* maximum value for size_t */ +#define MAX_SIZET ((size_t)(~(size_t)0)) +#endif + + +/* +** {====================================================== +** Traceback +** ======================================================= +*/ + + +#define LEVELS1 10 /* size of the first part of the stack */ +#define LEVELS2 11 /* size of the second part of the stack */ + + + +/* +** Search for 'objidx' in table at index -1. ('objidx' must be an +** absolute index.) Return 1 + string at top if it found a good name. +*/ +static int findfield (lua_State *L, int objidx, int level) { + if (level == 0 || !lua_istable(L, -1)) + return 0; /* not found */ + lua_pushnil(L); /* start 'next' loop */ + while (lua_next(L, -2)) { /* for each pair in table */ + if (lua_type(L, -2) == LUA_TSTRING) { /* ignore non-string keys */ + if (lua_rawequal(L, objidx, -1)) { /* found object? */ + lua_pop(L, 1); /* remove value (but keep name) */ + return 1; + } + else if (findfield(L, objidx, level - 1)) { /* try recursively */ + /* stack: lib_name, lib_table, field_name (top) */ + lua_pushliteral(L, "."); /* place '.' between the two names */ + lua_replace(L, -3); /* (in the slot occupied by table) */ + lua_concat(L, 3); /* lib_name.field_name */ + return 1; + } + } + lua_pop(L, 1); /* remove value */ + } + return 0; /* not found */ +} + + +/* +** Search for a name for a function in all loaded modules +*/ +static int pushglobalfuncname (lua_State *L, lua_Debug *ar) { + int top = lua_gettop(L); + lua_getinfo(L, "f", ar); /* push function */ + lua_getfield(L, LUA_REGISTRYINDEX, LUA_LOADED_TABLE); + luaL_checkstack(L, 6, "not enough stack"); /* slots for 'findfield' */ + if (findfield(L, top + 1, 2)) { + const char *name = lua_tostring(L, -1); + if (strncmp(name, LUA_GNAME ".", 3) == 0) { /* name start with '_G.'? */ + lua_pushstring(L, name + 3); /* push name without prefix */ + lua_remove(L, -2); /* remove original name */ + } + lua_copy(L, -1, top + 1); /* copy name to proper place */ + lua_settop(L, top + 1); /* remove table "loaded" and name copy */ + return 1; + } + else { + lua_settop(L, top); /* remove function and global table */ + return 0; + } +} + + +static void pushfuncname (lua_State *L, lua_Debug *ar) { + if (pushglobalfuncname(L, ar)) { /* try first a global name */ + lua_pushfstring(L, "function '%s'", lua_tostring(L, -1)); + lua_remove(L, -2); /* remove name */ + } + else if (*ar->namewhat != '\0') /* is there a name from code? */ + lua_pushfstring(L, "%s '%s'", ar->namewhat, ar->name); /* use it */ + else if (*ar->what == 'm') /* main? */ + lua_pushliteral(L, "main chunk"); + else if (*ar->what != 'C') /* for Lua functions, use <file:line> */ + lua_pushfstring(L, "function <%s:%d>", ar->short_src, ar->linedefined); + else /* nothing left... */ + lua_pushliteral(L, "?"); +} + + +static int lastlevel (lua_State *L) { + lua_Debug ar; + int li = 1, le = 1; + /* find an upper bound */ + while (lua_getstack(L, le, &ar)) { li = le; le *= 2; } + /* do a binary search */ + while (li < le) { + int m = (li + le)/2; + if (lua_getstack(L, m, &ar)) li = m + 1; + else le = m; + } + return le - 1; +} + + +LUALIB_API void luaL_traceback (lua_State *L, lua_State *L1, + const char *msg, int level) { + luaL_Buffer b; + lua_Debug ar; + int last = lastlevel(L1); + int limit2show = (last - level > LEVELS1 + LEVELS2) ? LEVELS1 : -1; + luaL_buffinit(L, &b); + if (msg) { + luaL_addstring(&b, msg); + luaL_addchar(&b, '\n'); + } + luaL_addstring(&b, "stack traceback:"); + while (lua_getstack(L1, level++, &ar)) { + if (limit2show-- == 0) { /* too many levels? */ + int n = last - level - LEVELS2 + 1; /* number of levels to skip */ + lua_pushfstring(L, "\n\t...\t(skipping %d levels)", n); + luaL_addvalue(&b); /* add warning about skip */ + level += n; /* and skip to last levels */ + } + else { + lua_getinfo(L1, "Slnt", &ar); + if (ar.currentline <= 0) + lua_pushfstring(L, "\n\t%s: in ", ar.short_src); + else + lua_pushfstring(L, "\n\t%s:%d: in ", ar.short_src, ar.currentline); + luaL_addvalue(&b); + pushfuncname(L, &ar); + luaL_addvalue(&b); + if (ar.istailcall) + luaL_addstring(&b, "\n\t(...tail calls...)"); + } + } + luaL_pushresult(&b); +} + +/* }====================================================== */ + + +/* +** {====================================================== +** Error-report functions +** ======================================================= +*/ + +LUALIB_API int luaL_argerror (lua_State *L, int arg, const char *extramsg) { + lua_Debug ar; + if (!lua_getstack(L, 0, &ar)) /* no stack frame? */ + return luaL_error(L, "bad argument #%d (%s)", arg, extramsg); + lua_getinfo(L, "n", &ar); + if (strcmp(ar.namewhat, "method") == 0) { + arg--; /* do not count 'self' */ + if (arg == 0) /* error is in the self argument itself? */ + return luaL_error(L, "calling '%s' on bad self (%s)", + ar.name, extramsg); + } + if (ar.name == NULL) + ar.name = (pushglobalfuncname(L, &ar)) ? lua_tostring(L, -1) : "?"; + return luaL_error(L, "bad argument #%d to '%s' (%s)", + arg, ar.name, extramsg); +} + + +LUALIB_API int luaL_typeerror (lua_State *L, int arg, const char *tname) { + const char *msg; + const char *typearg; /* name for the type of the actual argument */ + if (luaL_getmetafield(L, arg, "__name") == LUA_TSTRING) + typearg = lua_tostring(L, -1); /* use the given type name */ + else if (lua_type(L, arg) == LUA_TLIGHTUSERDATA) + typearg = "light userdata"; /* special name for messages */ + else + typearg = luaL_typename(L, arg); /* standard name */ + msg = lua_pushfstring(L, "%s expected, got %s", tname, typearg); + return luaL_argerror(L, arg, msg); +} + + +static void tag_error (lua_State *L, int arg, int tag) { + luaL_typeerror(L, arg, lua_typename(L, tag)); +} + + +/* +** The use of 'lua_pushfstring' ensures this function does not +** need reserved stack space when called. +*/ +LUALIB_API void luaL_where (lua_State *L, int level) { + lua_Debug ar; + if (lua_getstack(L, level, &ar)) { /* check function at level */ + lua_getinfo(L, "Sl", &ar); /* get info about it */ + if (ar.currentline > 0) { /* is there info? */ + lua_pushfstring(L, "%s:%d: ", ar.short_src, ar.currentline); + return; + } + } + lua_pushfstring(L, ""); /* else, no information available... */ +} + + +/* +** Again, the use of 'lua_pushvfstring' ensures this function does +** not need reserved stack space when called. (At worst, it generates +** an error with "stack overflow" instead of the given message.) +*/ +LUALIB_API int luaL_error (lua_State *L, const char *fmt, ...) { + va_list argp; + va_start(argp, fmt); + luaL_where(L, 1); + lua_pushvfstring(L, fmt, argp); + va_end(argp); + lua_concat(L, 2); + return lua_error(L); +} + + +LUALIB_API int luaL_fileresult (lua_State *L, int stat, const char *fname) { + int en = errno; /* calls to Lua API may change this value */ + if (stat) { + lua_pushboolean(L, 1); + return 1; + } + else { + const char *msg; + luaL_pushfail(L); + msg = (en != 0) ? strerror(en) : "(no extra info)"; + if (fname) + lua_pushfstring(L, "%s: %s", fname, msg); + else + lua_pushstring(L, msg); + lua_pushinteger(L, en); + return 3; + } +} + + +#if !defined(l_inspectstat) /* { */ + +#if defined(LUA_USE_POSIX) + +#include <sys/wait.h> + +/* +** use appropriate macros to interpret 'pclose' return status +*/ +#define l_inspectstat(stat,what) \ + if (WIFEXITED(stat)) { stat = WEXITSTATUS(stat); } \ + else if (WIFSIGNALED(stat)) { stat = WTERMSIG(stat); what = "signal"; } + +#else + +#define l_inspectstat(stat,what) /* no op */ + +#endif + +#endif /* } */ + + +LUALIB_API int luaL_execresult (lua_State *L, int stat) { + if (stat != 0 && errno != 0) /* error with an 'errno'? */ + return luaL_fileresult(L, 0, NULL); + else { + const char *what = "exit"; /* type of termination */ + l_inspectstat(stat, what); /* interpret result */ + if (*what == 'e' && stat == 0) /* successful termination? */ + lua_pushboolean(L, 1); + else + luaL_pushfail(L); + lua_pushstring(L, what); + lua_pushinteger(L, stat); + return 3; /* return true/fail,what,code */ + } +} + +/* }====================================================== */ + + + +/* +** {====================================================== +** Userdata's metatable manipulation +** ======================================================= +*/ + +LUALIB_API int luaL_newmetatable (lua_State *L, const char *tname) { + if (luaL_getmetatable(L, tname) != LUA_TNIL) /* name already in use? */ + return 0; /* leave previous value on top, but return 0 */ + lua_pop(L, 1); + lua_createtable(L, 0, 2); /* create metatable */ + lua_pushstring(L, tname); + lua_setfield(L, -2, "__name"); /* metatable.__name = tname */ + lua_pushvalue(L, -1); + lua_setfield(L, LUA_REGISTRYINDEX, tname); /* registry.name = metatable */ + return 1; +} + + +LUALIB_API void luaL_setmetatable (lua_State *L, const char *tname) { + luaL_getmetatable(L, tname); + lua_setmetatable(L, -2); +} + + +LUALIB_API void *luaL_testudata (lua_State *L, int ud, const char *tname) { + void *p = lua_touserdata(L, ud); + if (p != NULL) { /* value is a userdata? */ + if (lua_getmetatable(L, ud)) { /* does it have a metatable? */ + luaL_getmetatable(L, tname); /* get correct metatable */ + if (!lua_rawequal(L, -1, -2)) /* not the same? */ + p = NULL; /* value is a userdata with wrong metatable */ + lua_pop(L, 2); /* remove both metatables */ + return p; + } + } + return NULL; /* value is not a userdata with a metatable */ +} + + +LUALIB_API void *luaL_checkudata (lua_State *L, int ud, const char *tname) { + void *p = luaL_testudata(L, ud, tname); + luaL_argexpected(L, p != NULL, ud, tname); + return p; +} + +/* }====================================================== */ + + +/* +** {====================================================== +** Argument check functions +** ======================================================= +*/ + +LUALIB_API int luaL_checkoption (lua_State *L, int arg, const char *def, + const char *const lst[]) { + const char *name = (def) ? luaL_optstring(L, arg, def) : + luaL_checkstring(L, arg); + int i; + for (i=0; lst[i]; i++) + if (strcmp(lst[i], name) == 0) + return i; + return luaL_argerror(L, arg, + lua_pushfstring(L, "invalid option '%s'", name)); +} + + +/* +** Ensures the stack has at least 'space' extra slots, raising an error +** if it cannot fulfill the request. (The error handling needs a few +** extra slots to format the error message. In case of an error without +** this extra space, Lua will generate the same 'stack overflow' error, +** but without 'msg'.) +*/ +LUALIB_API void luaL_checkstack (lua_State *L, int space, const char *msg) { + if (l_unlikely(!lua_checkstack(L, space))) { + if (msg) + luaL_error(L, "stack overflow (%s)", msg); + else + luaL_error(L, "stack overflow"); + } +} + + +LUALIB_API void luaL_checktype (lua_State *L, int arg, int t) { + if (l_unlikely(lua_type(L, arg) != t)) + tag_error(L, arg, t); +} + + +LUALIB_API void luaL_checkany (lua_State *L, int arg) { + if (l_unlikely(lua_type(L, arg) == LUA_TNONE)) + luaL_argerror(L, arg, "value expected"); +} + + +LUALIB_API const char *luaL_checklstring (lua_State *L, int arg, size_t *len) { + const char *s = lua_tolstring(L, arg, len); + if (l_unlikely(!s)) tag_error(L, arg, LUA_TSTRING); + return s; +} + + +LUALIB_API const char *luaL_optlstring (lua_State *L, int arg, + const char *def, size_t *len) { + if (lua_isnoneornil(L, arg)) { + if (len) + *len = (def ? strlen(def) : 0); + return def; + } + else return luaL_checklstring(L, arg, len); +} + + +LUALIB_API lua_Number luaL_checknumber (lua_State *L, int arg) { + int isnum; + lua_Number d = lua_tonumberx(L, arg, &isnum); + if (l_unlikely(!isnum)) + tag_error(L, arg, LUA_TNUMBER); + return d; +} + + +LUALIB_API lua_Number luaL_optnumber (lua_State *L, int arg, lua_Number def) { + return luaL_opt(L, luaL_checknumber, arg, def); +} + + +static void interror (lua_State *L, int arg) { + if (lua_isnumber(L, arg)) + luaL_argerror(L, arg, "number has no integer representation"); + else + tag_error(L, arg, LUA_TNUMBER); +} + + +LUALIB_API lua_Integer luaL_checkinteger (lua_State *L, int arg) { + int isnum; + lua_Integer d = lua_tointegerx(L, arg, &isnum); + if (l_unlikely(!isnum)) { + interror(L, arg); + } + return d; +} + + +LUALIB_API lua_Integer luaL_optinteger (lua_State *L, int arg, + lua_Integer def) { + return luaL_opt(L, luaL_checkinteger, arg, def); +} + +/* }====================================================== */ + + +/* +** {====================================================== +** Generic Buffer manipulation +** ======================================================= +*/ + +/* userdata to box arbitrary data */ +typedef struct UBox { + void *box; + size_t bsize; +} UBox; + + +static void *resizebox (lua_State *L, int idx, size_t newsize) { + void *ud; + lua_Alloc allocf = lua_getallocf(L, &ud); + UBox *box = (UBox *)lua_touserdata(L, idx); + void *temp = allocf(ud, box->box, box->bsize, newsize); + if (l_unlikely(temp == NULL && newsize > 0)) { /* allocation error? */ + lua_pushliteral(L, "not enough memory"); + lua_error(L); /* raise a memory error */ + } + box->box = temp; + box->bsize = newsize; + return temp; +} + + +static int boxgc (lua_State *L) { + resizebox(L, 1, 0); + return 0; +} + + +static const luaL_Reg boxmt[] = { /* box metamethods */ + {"__gc", boxgc}, + {"__close", boxgc}, + {NULL, NULL} +}; + + +static void newbox (lua_State *L) { + UBox *box = (UBox *)lua_newuserdatauv(L, sizeof(UBox), 0); + box->box = NULL; + box->bsize = 0; + if (luaL_newmetatable(L, "_UBOX*")) /* creating metatable? */ + luaL_setfuncs(L, boxmt, 0); /* set its metamethods */ + lua_setmetatable(L, -2); +} + + +/* +** check whether buffer is using a userdata on the stack as a temporary +** buffer +*/ +#define buffonstack(B) ((B)->b != (B)->init.b) + + +/* +** Whenever buffer is accessed, slot 'idx' must either be a box (which +** cannot be NULL) or it is a placeholder for the buffer. +*/ +#define checkbufferlevel(B,idx) \ + lua_assert(buffonstack(B) ? lua_touserdata(B->L, idx) != NULL \ + : lua_touserdata(B->L, idx) == (void*)B) + + +/* +** Compute new size for buffer 'B', enough to accommodate extra 'sz' +** bytes. (The test for "not big enough" also gets the case when the +** computation of 'newsize' overflows.) +*/ +static size_t newbuffsize (luaL_Buffer *B, size_t sz) { + size_t newsize = (B->size / 2) * 3; /* buffer size * 1.5 */ + if (l_unlikely(MAX_SIZET - sz < B->n)) /* overflow in (B->n + sz)? */ + return luaL_error(B->L, "buffer too large"); + if (newsize < B->n + sz) /* not big enough? */ + newsize = B->n + sz; + return newsize; +} + + +/* +** Returns a pointer to a free area with at least 'sz' bytes in buffer +** 'B'. 'boxidx' is the relative position in the stack where is the +** buffer's box or its placeholder. +*/ +static char *prepbuffsize (luaL_Buffer *B, size_t sz, int boxidx) { + checkbufferlevel(B, boxidx); + if (B->size - B->n >= sz) /* enough space? */ + return B->b + B->n; + else { + lua_State *L = B->L; + char *newbuff; + size_t newsize = newbuffsize(B, sz); + /* create larger buffer */ + if (buffonstack(B)) /* buffer already has a box? */ + newbuff = (char *)resizebox(L, boxidx, newsize); /* resize it */ + else { /* no box yet */ + lua_remove(L, boxidx); /* remove placeholder */ + newbox(L); /* create a new box */ + lua_insert(L, boxidx); /* move box to its intended position */ + lua_toclose(L, boxidx); + newbuff = (char *)resizebox(L, boxidx, newsize); + memcpy(newbuff, B->b, B->n * sizeof(char)); /* copy original content */ + } + B->b = newbuff; + B->size = newsize; + return newbuff + B->n; + } +} + +/* +** returns a pointer to a free area with at least 'sz' bytes +*/ +LUALIB_API char *luaL_prepbuffsize (luaL_Buffer *B, size_t sz) { + return prepbuffsize(B, sz, -1); +} + + +LUALIB_API void luaL_addlstring (luaL_Buffer *B, const char *s, size_t l) { + if (l > 0) { /* avoid 'memcpy' when 's' can be NULL */ + char *b = prepbuffsize(B, l, -1); + memcpy(b, s, l * sizeof(char)); + luaL_addsize(B, l); + } +} + + +LUALIB_API void luaL_addstring (luaL_Buffer *B, const char *s) { + luaL_addlstring(B, s, strlen(s)); +} + + +LUALIB_API void luaL_pushresult (luaL_Buffer *B) { + lua_State *L = B->L; + checkbufferlevel(B, -1); + lua_pushlstring(L, B->b, B->n); + if (buffonstack(B)) + lua_closeslot(L, -2); /* close the box */ + lua_remove(L, -2); /* remove box or placeholder from the stack */ +} + + +LUALIB_API void luaL_pushresultsize (luaL_Buffer *B, size_t sz) { + luaL_addsize(B, sz); + luaL_pushresult(B); +} + + +/* +** 'luaL_addvalue' is the only function in the Buffer system where the +** box (if existent) is not on the top of the stack. So, instead of +** calling 'luaL_addlstring', it replicates the code using -2 as the +** last argument to 'prepbuffsize', signaling that the box is (or will +** be) below the string being added to the buffer. (Box creation can +** trigger an emergency GC, so we should not remove the string from the +** stack before we have the space guaranteed.) +*/ +LUALIB_API void luaL_addvalue (luaL_Buffer *B) { + lua_State *L = B->L; + size_t len; + const char *s = lua_tolstring(L, -1, &len); + char *b = prepbuffsize(B, len, -2); + memcpy(b, s, len * sizeof(char)); + luaL_addsize(B, len); + lua_pop(L, 1); /* pop string */ +} + + +LUALIB_API void luaL_buffinit (lua_State *L, luaL_Buffer *B) { + B->L = L; + B->b = B->init.b; + B->n = 0; + B->size = LUAL_BUFFERSIZE; + lua_pushlightuserdata(L, (void*)B); /* push placeholder */ +} + + +LUALIB_API char *luaL_buffinitsize (lua_State *L, luaL_Buffer *B, size_t sz) { + luaL_buffinit(L, B); + return prepbuffsize(B, sz, -1); +} + +/* }====================================================== */ + + +/* +** {====================================================== +** Reference system +** ======================================================= +*/ + +/* index of free-list header (after the predefined values) */ +#define freelist (LUA_RIDX_LAST + 1) + +/* +** The previously freed references form a linked list: +** t[freelist] is the index of a first free index, or zero if list is +** empty; t[t[freelist]] is the index of the second element; etc. +*/ +LUALIB_API int luaL_ref (lua_State *L, int t) { + int ref; + if (lua_isnil(L, -1)) { + lua_pop(L, 1); /* remove from stack */ + return LUA_REFNIL; /* 'nil' has a unique fixed reference */ + } + t = lua_absindex(L, t); + if (lua_rawgeti(L, t, freelist) == LUA_TNIL) { /* first access? */ + ref = 0; /* list is empty */ + lua_pushinteger(L, 0); /* initialize as an empty list */ + lua_rawseti(L, t, freelist); /* ref = t[freelist] = 0 */ + } + else { /* already initialized */ + lua_assert(lua_isinteger(L, -1)); + ref = (int)lua_tointeger(L, -1); /* ref = t[freelist] */ + } + lua_pop(L, 1); /* remove element from stack */ + if (ref != 0) { /* any free element? */ + lua_rawgeti(L, t, ref); /* remove it from list */ + lua_rawseti(L, t, freelist); /* (t[freelist] = t[ref]) */ + } + else /* no free elements */ + ref = (int)lua_rawlen(L, t) + 1; /* get a new reference */ + lua_rawseti(L, t, ref); + return ref; +} + + +LUALIB_API void luaL_unref (lua_State *L, int t, int ref) { + if (ref >= 0) { + t = lua_absindex(L, t); + lua_rawgeti(L, t, freelist); + lua_assert(lua_isinteger(L, -1)); + lua_rawseti(L, t, ref); /* t[ref] = t[freelist] */ + lua_pushinteger(L, ref); + lua_rawseti(L, t, freelist); /* t[freelist] = ref */ + } +} + +/* }====================================================== */ + + +/* +** {====================================================== +** Load functions +** ======================================================= +*/ + +typedef struct LoadF { + int n; /* number of pre-read characters */ + FILE *f; /* file being read */ + char buff[BUFSIZ]; /* area for reading file */ +} LoadF; + + +static const char *getF (lua_State *L, void *ud, size_t *size) { + LoadF *lf = (LoadF *)ud; + (void)L; /* not used */ + if (lf->n > 0) { /* are there pre-read characters to be read? */ + *size = lf->n; /* return them (chars already in buffer) */ + lf->n = 0; /* no more pre-read characters */ + } + else { /* read a block from file */ + /* 'fread' can return > 0 *and* set the EOF flag. If next call to + 'getF' called 'fread', it might still wait for user input. + The next check avoids this problem. */ + if (feof(lf->f)) return NULL; + *size = fread(lf->buff, 1, sizeof(lf->buff), lf->f); /* read block */ + } + return lf->buff; +} + + +static int errfile (lua_State *L, const char *what, int fnameindex) { + int err = errno; + const char *filename = lua_tostring(L, fnameindex) + 1; + if (err != 0) + lua_pushfstring(L, "cannot %s %s: %s", what, filename, strerror(err)); + else + lua_pushfstring(L, "cannot %s %s", what, filename); + lua_remove(L, fnameindex); + return LUA_ERRFILE; +} + + +/* +** Skip an optional BOM at the start of a stream. If there is an +** incomplete BOM (the first character is correct but the rest is +** not), returns the first character anyway to force an error +** (as no chunk can start with 0xEF). +*/ +static int skipBOM (FILE *f) { + int c = getc(f); /* read first character */ + if (c == 0xEF && getc(f) == 0xBB && getc(f) == 0xBF) /* correct BOM? */ + return getc(f); /* ignore BOM and return next char */ + else /* no (valid) BOM */ + return c; /* return first character */ +} + + +/* +** reads the first character of file 'f' and skips an optional BOM mark +** in its beginning plus its first line if it starts with '#'. Returns +** true if it skipped the first line. In any case, '*cp' has the +** first "valid" character of the file (after the optional BOM and +** a first-line comment). +*/ +static int skipcomment (FILE *f, int *cp) { + int c = *cp = skipBOM(f); + if (c == '#') { /* first line is a comment (Unix exec. file)? */ + do { /* skip first line */ + c = getc(f); + } while (c != EOF && c != '\n'); + *cp = getc(f); /* next character after comment, if present */ + return 1; /* there was a comment */ + } + else return 0; /* no comment */ +} + + +LUALIB_API int luaL_loadfilex (lua_State *L, const char *filename, + const char *mode) { + LoadF lf; + int status, readstatus; + int c; + int fnameindex = lua_gettop(L) + 1; /* index of filename on the stack */ + if (filename == NULL) { + lua_pushliteral(L, "=stdin"); + lf.f = stdin; + } + else { + lua_pushfstring(L, "@%s", filename); + errno = 0; + lf.f = fopen(filename, "r"); + if (lf.f == NULL) return errfile(L, "open", fnameindex); + } + lf.n = 0; + if (skipcomment(lf.f, &c)) /* read initial portion */ + lf.buff[lf.n++] = '\n'; /* add newline to correct line numbers */ + if (c == LUA_SIGNATURE[0]) { /* binary file? */ + lf.n = 0; /* remove possible newline */ + if (filename) { /* "real" file? */ + errno = 0; + lf.f = freopen(filename, "rb", lf.f); /* reopen in binary mode */ + if (lf.f == NULL) return errfile(L, "reopen", fnameindex); + skipcomment(lf.f, &c); /* re-read initial portion */ + } + } + if (c != EOF) + lf.buff[lf.n++] = c; /* 'c' is the first character of the stream */ + errno = 0; + status = lua_load(L, getF, &lf, lua_tostring(L, -1), mode); + readstatus = ferror(lf.f); + if (filename) fclose(lf.f); /* close file (even in case of errors) */ + if (readstatus) { + lua_settop(L, fnameindex); /* ignore results from 'lua_load' */ + return errfile(L, "read", fnameindex); + } + lua_remove(L, fnameindex); + return status; +} + + +typedef struct LoadS { + const char *s; + size_t size; +} LoadS; + + +static const char *getS (lua_State *L, void *ud, size_t *size) { + LoadS *ls = (LoadS *)ud; + (void)L; /* not used */ + if (ls->size == 0) return NULL; + *size = ls->size; + ls->size = 0; + return ls->s; +} + + +LUALIB_API int luaL_loadbufferx (lua_State *L, const char *buff, size_t size, + const char *name, const char *mode) { + LoadS ls; + ls.s = buff; + ls.size = size; + return lua_load(L, getS, &ls, name, mode); +} + + +LUALIB_API int luaL_loadstring (lua_State *L, const char *s) { + return luaL_loadbuffer(L, s, strlen(s), s); +} + +/* }====================================================== */ + + + +LUALIB_API int luaL_getmetafield (lua_State *L, int obj, const char *event) { + if (!lua_getmetatable(L, obj)) /* no metatable? */ + return LUA_TNIL; + else { + int tt; + lua_pushstring(L, event); + tt = lua_rawget(L, -2); + if (tt == LUA_TNIL) /* is metafield nil? */ + lua_pop(L, 2); /* remove metatable and metafield */ + else + lua_remove(L, -2); /* remove only metatable */ + return tt; /* return metafield type */ + } +} + + +LUALIB_API int luaL_callmeta (lua_State *L, int obj, const char *event) { + obj = lua_absindex(L, obj); + if (luaL_getmetafield(L, obj, event) == LUA_TNIL) /* no metafield? */ + return 0; + lua_pushvalue(L, obj); + lua_call(L, 1, 1); + return 1; +} + + +LUALIB_API lua_Integer luaL_len (lua_State *L, int idx) { + lua_Integer l; + int isnum; + lua_len(L, idx); + l = lua_tointegerx(L, -1, &isnum); + if (l_unlikely(!isnum)) + luaL_error(L, "object length is not an integer"); + lua_pop(L, 1); /* remove object */ + return l; +} + + +LUALIB_API const char *luaL_tolstring (lua_State *L, int idx, size_t *len) { + idx = lua_absindex(L,idx); + if (luaL_callmeta(L, idx, "__tostring")) { /* metafield? */ + if (!lua_isstring(L, -1)) + luaL_error(L, "'__tostring' must return a string"); + } + else { + switch (lua_type(L, idx)) { + case LUA_TNUMBER: { + if (lua_isinteger(L, idx)) + lua_pushfstring(L, "%I", (LUAI_UACINT)lua_tointeger(L, idx)); + else + lua_pushfstring(L, "%f", (LUAI_UACNUMBER)lua_tonumber(L, idx)); + break; + } + case LUA_TSTRING: + lua_pushvalue(L, idx); + break; + case LUA_TBOOLEAN: + lua_pushstring(L, (lua_toboolean(L, idx) ? "true" : "false")); + break; + case LUA_TNIL: + lua_pushliteral(L, "nil"); + break; + default: { + int tt = luaL_getmetafield(L, idx, "__name"); /* try name */ + const char *kind = (tt == LUA_TSTRING) ? lua_tostring(L, -1) : + luaL_typename(L, idx); + lua_pushfstring(L, "%s: %p", kind, lua_topointer(L, idx)); + if (tt != LUA_TNIL) + lua_remove(L, -2); /* remove '__name' */ + break; + } + } + } + return lua_tolstring(L, -1, len); +} + + +/* +** set functions from list 'l' into table at top - 'nup'; each +** function gets the 'nup' elements at the top as upvalues. +** Returns with only the table at the stack. +*/ +LUALIB_API void luaL_setfuncs (lua_State *L, const luaL_Reg *l, int nup) { + luaL_checkstack(L, nup, "too many upvalues"); + for (; l->name != NULL; l++) { /* fill the table with given functions */ + if (l->func == NULL) /* placeholder? */ + lua_pushboolean(L, 0); + else { + int i; + for (i = 0; i < nup; i++) /* copy upvalues to the top */ + lua_pushvalue(L, -nup); + lua_pushcclosure(L, l->func, nup); /* closure with those upvalues */ + } + lua_setfield(L, -(nup + 2), l->name); + } + lua_pop(L, nup); /* remove upvalues */ +} + + +/* +** ensure that stack[idx][fname] has a table and push that table +** into the stack +*/ +LUALIB_API int luaL_getsubtable (lua_State *L, int idx, const char *fname) { + if (lua_getfield(L, idx, fname) == LUA_TTABLE) + return 1; /* table already there */ + else { + lua_pop(L, 1); /* remove previous result */ + idx = lua_absindex(L, idx); + lua_newtable(L); + lua_pushvalue(L, -1); /* copy to be left at top */ + lua_setfield(L, idx, fname); /* assign new table to field */ + return 0; /* false, because did not find table there */ + } +} + + +/* +** Stripped-down 'require': After checking "loaded" table, calls 'openf' +** to open a module, registers the result in 'package.loaded' table and, +** if 'glb' is true, also registers the result in the global table. +** Leaves resulting module on the top. +*/ +LUALIB_API void luaL_requiref (lua_State *L, const char *modname, + lua_CFunction openf, int glb) { + luaL_getsubtable(L, LUA_REGISTRYINDEX, LUA_LOADED_TABLE); + lua_getfield(L, -1, modname); /* LOADED[modname] */ + if (!lua_toboolean(L, -1)) { /* package not already loaded? */ + lua_pop(L, 1); /* remove field */ + lua_pushcfunction(L, openf); + lua_pushstring(L, modname); /* argument to open function */ + lua_call(L, 1, 1); /* call 'openf' to open module */ + lua_pushvalue(L, -1); /* make copy of module (call result) */ + lua_setfield(L, -3, modname); /* LOADED[modname] = module */ + } + lua_remove(L, -2); /* remove LOADED table */ + if (glb) { + lua_pushvalue(L, -1); /* copy of module */ + lua_setglobal(L, modname); /* _G[modname] = module */ + } +} + + +LUALIB_API void luaL_addgsub (luaL_Buffer *b, const char *s, + const char *p, const char *r) { + const char *wild; + size_t l = strlen(p); + while ((wild = strstr(s, p)) != NULL) { + luaL_addlstring(b, s, wild - s); /* push prefix */ + luaL_addstring(b, r); /* push replacement in place of pattern */ + s = wild + l; /* continue after 'p' */ + } + luaL_addstring(b, s); /* push last suffix */ +} + + +LUALIB_API const char *luaL_gsub (lua_State *L, const char *s, + const char *p, const char *r) { + luaL_Buffer b; + luaL_buffinit(L, &b); + luaL_addgsub(&b, s, p, r); + luaL_pushresult(&b); + return lua_tostring(L, -1); +} + + +static void *l_alloc (void *ud, void *ptr, size_t osize, size_t nsize) { + (void)ud; (void)osize; /* not used */ + if (nsize == 0) { + free(ptr); + return NULL; + } + else + return realloc(ptr, nsize); +} + + +/* +** Standard panic funcion just prints an error message. The test +** with 'lua_type' avoids possible memory errors in 'lua_tostring'. +*/ +static int panic (lua_State *L) { + const char *msg = (lua_type(L, -1) == LUA_TSTRING) + ? lua_tostring(L, -1) + : "error object is not a string"; + lua_writestringerror("PANIC: unprotected error in call to Lua API (%s)\n", + msg); + return 0; /* return to Lua to abort */ +} + + +/* +** Warning functions: +** warnfoff: warning system is off +** warnfon: ready to start a new message +** warnfcont: previous message is to be continued +*/ +static void warnfoff (void *ud, const char *message, int tocont); +static void warnfon (void *ud, const char *message, int tocont); +static void warnfcont (void *ud, const char *message, int tocont); + + +/* +** Check whether message is a control message. If so, execute the +** control or ignore it if unknown. +*/ +static int checkcontrol (lua_State *L, const char *message, int tocont) { + if (tocont || *(message++) != '@') /* not a control message? */ + return 0; + else { + if (strcmp(message, "off") == 0) + lua_setwarnf(L, warnfoff, L); /* turn warnings off */ + else if (strcmp(message, "on") == 0) + lua_setwarnf(L, warnfon, L); /* turn warnings on */ + return 1; /* it was a control message */ + } +} + + +static void warnfoff (void *ud, const char *message, int tocont) { + checkcontrol((lua_State *)ud, message, tocont); +} + + +/* +** Writes the message and handle 'tocont', finishing the message +** if needed and setting the next warn function. +*/ +static void warnfcont (void *ud, const char *message, int tocont) { + lua_State *L = (lua_State *)ud; + lua_writestringerror("%s", message); /* write message */ + if (tocont) /* not the last part? */ + lua_setwarnf(L, warnfcont, L); /* to be continued */ + else { /* last part */ + lua_writestringerror("%s", "\n"); /* finish message with end-of-line */ + lua_setwarnf(L, warnfon, L); /* next call is a new message */ + } +} + + +static void warnfon (void *ud, const char *message, int tocont) { + if (checkcontrol((lua_State *)ud, message, tocont)) /* control message? */ + return; /* nothing else to be done */ + lua_writestringerror("%s", "Lua warning: "); /* start a new warning */ + warnfcont(ud, message, tocont); /* finish processing */ +} + + +LUALIB_API lua_State *luaL_newstate (void) { + lua_State *L = lua_newstate(l_alloc, NULL); + if (l_likely(L)) { + lua_atpanic(L, &panic); + lua_setwarnf(L, warnfoff, L); /* default is warnings off */ + } + return L; +} + + +LUALIB_API void luaL_checkversion_ (lua_State *L, lua_Number ver, size_t sz) { + lua_Number v = lua_version(L); + if (sz != LUAL_NUMSIZES) /* check numeric types */ + luaL_error(L, "core and library have incompatible numeric types"); + else if (v != ver) + luaL_error(L, "version mismatch: app. needs %f, Lua core provides %f", + (LUAI_UACNUMBER)ver, (LUAI_UACNUMBER)v); +} + diff --git a/vendor/lua-5.4.8/src/lauxlib.h b/vendor/lua-5.4.8/src/lauxlib.h new file mode 100644 index 0000000..5b977e2 --- /dev/null +++ b/vendor/lua-5.4.8/src/lauxlib.h @@ -0,0 +1,301 @@ +/* +** $Id: lauxlib.h $ +** Auxiliary functions for building Lua libraries +** See Copyright Notice in lua.h +*/ + + +#ifndef lauxlib_h +#define lauxlib_h + + +#include <stddef.h> +#include <stdio.h> + +#include "luaconf.h" +#include "lua.h" + + +/* global table */ +#define LUA_GNAME "_G" + + +typedef struct luaL_Buffer luaL_Buffer; + + +/* extra error code for 'luaL_loadfilex' */ +#define LUA_ERRFILE (LUA_ERRERR+1) + + +/* key, in the registry, for table of loaded modules */ +#define LUA_LOADED_TABLE "_LOADED" + + +/* key, in the registry, for table of preloaded loaders */ +#define LUA_PRELOAD_TABLE "_PRELOAD" + + +typedef struct luaL_Reg { + const char *name; + lua_CFunction func; +} luaL_Reg; + + +#define LUAL_NUMSIZES (sizeof(lua_Integer)*16 + sizeof(lua_Number)) + +LUALIB_API void (luaL_checkversion_) (lua_State *L, lua_Number ver, size_t sz); +#define luaL_checkversion(L) \ + luaL_checkversion_(L, LUA_VERSION_NUM, LUAL_NUMSIZES) + +LUALIB_API int (luaL_getmetafield) (lua_State *L, int obj, const char *e); +LUALIB_API int (luaL_callmeta) (lua_State *L, int obj, const char *e); +LUALIB_API const char *(luaL_tolstring) (lua_State *L, int idx, size_t *len); +LUALIB_API int (luaL_argerror) (lua_State *L, int arg, const char *extramsg); +LUALIB_API int (luaL_typeerror) (lua_State *L, int arg, const char *tname); +LUALIB_API const char *(luaL_checklstring) (lua_State *L, int arg, + size_t *l); +LUALIB_API const char *(luaL_optlstring) (lua_State *L, int arg, + const char *def, size_t *l); +LUALIB_API lua_Number (luaL_checknumber) (lua_State *L, int arg); +LUALIB_API lua_Number (luaL_optnumber) (lua_State *L, int arg, lua_Number def); + +LUALIB_API lua_Integer (luaL_checkinteger) (lua_State *L, int arg); +LUALIB_API lua_Integer (luaL_optinteger) (lua_State *L, int arg, + lua_Integer def); + +LUALIB_API void (luaL_checkstack) (lua_State *L, int sz, const char *msg); +LUALIB_API void (luaL_checktype) (lua_State *L, int arg, int t); +LUALIB_API void (luaL_checkany) (lua_State *L, int arg); + +LUALIB_API int (luaL_newmetatable) (lua_State *L, const char *tname); +LUALIB_API void (luaL_setmetatable) (lua_State *L, const char *tname); +LUALIB_API void *(luaL_testudata) (lua_State *L, int ud, const char *tname); +LUALIB_API void *(luaL_checkudata) (lua_State *L, int ud, const char *tname); + +LUALIB_API void (luaL_where) (lua_State *L, int lvl); +LUALIB_API int (luaL_error) (lua_State *L, const char *fmt, ...); + +LUALIB_API int (luaL_checkoption) (lua_State *L, int arg, const char *def, + const char *const lst[]); + +LUALIB_API int (luaL_fileresult) (lua_State *L, int stat, const char *fname); +LUALIB_API int (luaL_execresult) (lua_State *L, int stat); + + +/* predefined references */ +#define LUA_NOREF (-2) +#define LUA_REFNIL (-1) + +LUALIB_API int (luaL_ref) (lua_State *L, int t); +LUALIB_API void (luaL_unref) (lua_State *L, int t, int ref); + +LUALIB_API int (luaL_loadfilex) (lua_State *L, const char *filename, + const char *mode); + +#define luaL_loadfile(L,f) luaL_loadfilex(L,f,NULL) + +LUALIB_API int (luaL_loadbufferx) (lua_State *L, const char *buff, size_t sz, + const char *name, const char *mode); +LUALIB_API int (luaL_loadstring) (lua_State *L, const char *s); + +LUALIB_API lua_State *(luaL_newstate) (void); + +LUALIB_API lua_Integer (luaL_len) (lua_State *L, int idx); + +LUALIB_API void (luaL_addgsub) (luaL_Buffer *b, const char *s, + const char *p, const char *r); +LUALIB_API const char *(luaL_gsub) (lua_State *L, const char *s, + const char *p, const char *r); + +LUALIB_API void (luaL_setfuncs) (lua_State *L, const luaL_Reg *l, int nup); + +LUALIB_API int (luaL_getsubtable) (lua_State *L, int idx, const char *fname); + +LUALIB_API void (luaL_traceback) (lua_State *L, lua_State *L1, + const char *msg, int level); + +LUALIB_API void (luaL_requiref) (lua_State *L, const char *modname, + lua_CFunction openf, int glb); + +/* +** =============================================================== +** some useful macros +** =============================================================== +*/ + + +#define luaL_newlibtable(L,l) \ + lua_createtable(L, 0, sizeof(l)/sizeof((l)[0]) - 1) + +#define luaL_newlib(L,l) \ + (luaL_checkversion(L), luaL_newlibtable(L,l), luaL_setfuncs(L,l,0)) + +#define luaL_argcheck(L, cond,arg,extramsg) \ + ((void)(luai_likely(cond) || luaL_argerror(L, (arg), (extramsg)))) + +#define luaL_argexpected(L,cond,arg,tname) \ + ((void)(luai_likely(cond) || luaL_typeerror(L, (arg), (tname)))) + +#define luaL_checkstring(L,n) (luaL_checklstring(L, (n), NULL)) +#define luaL_optstring(L,n,d) (luaL_optlstring(L, (n), (d), NULL)) + +#define luaL_typename(L,i) lua_typename(L, lua_type(L,(i))) + +#define luaL_dofile(L, fn) \ + (luaL_loadfile(L, fn) || lua_pcall(L, 0, LUA_MULTRET, 0)) + +#define luaL_dostring(L, s) \ + (luaL_loadstring(L, s) || lua_pcall(L, 0, LUA_MULTRET, 0)) + +#define luaL_getmetatable(L,n) (lua_getfield(L, LUA_REGISTRYINDEX, (n))) + +#define luaL_opt(L,f,n,d) (lua_isnoneornil(L,(n)) ? (d) : f(L,(n))) + +#define luaL_loadbuffer(L,s,sz,n) luaL_loadbufferx(L,s,sz,n,NULL) + + +/* +** Perform arithmetic operations on lua_Integer values with wrap-around +** semantics, as the Lua core does. +*/ +#define luaL_intop(op,v1,v2) \ + ((lua_Integer)((lua_Unsigned)(v1) op (lua_Unsigned)(v2))) + + +/* push the value used to represent failure/error */ +#define luaL_pushfail(L) lua_pushnil(L) + + +/* +** Internal assertions for in-house debugging +*/ +#if !defined(lua_assert) + +#if defined LUAI_ASSERT + #include <assert.h> + #define lua_assert(c) assert(c) +#else + #define lua_assert(c) ((void)0) +#endif + +#endif + + + +/* +** {====================================================== +** Generic Buffer manipulation +** ======================================================= +*/ + +struct luaL_Buffer { + char *b; /* buffer address */ + size_t size; /* buffer size */ + size_t n; /* number of characters in buffer */ + lua_State *L; + union { + LUAI_MAXALIGN; /* ensure maximum alignment for buffer */ + char b[LUAL_BUFFERSIZE]; /* initial buffer */ + } init; +}; + + +#define luaL_bufflen(bf) ((bf)->n) +#define luaL_buffaddr(bf) ((bf)->b) + + +#define luaL_addchar(B,c) \ + ((void)((B)->n < (B)->size || luaL_prepbuffsize((B), 1)), \ + ((B)->b[(B)->n++] = (c))) + +#define luaL_addsize(B,s) ((B)->n += (s)) + +#define luaL_buffsub(B,s) ((B)->n -= (s)) + +LUALIB_API void (luaL_buffinit) (lua_State *L, luaL_Buffer *B); +LUALIB_API char *(luaL_prepbuffsize) (luaL_Buffer *B, size_t sz); +LUALIB_API void (luaL_addlstring) (luaL_Buffer *B, const char *s, size_t l); +LUALIB_API void (luaL_addstring) (luaL_Buffer *B, const char *s); +LUALIB_API void (luaL_addvalue) (luaL_Buffer *B); +LUALIB_API void (luaL_pushresult) (luaL_Buffer *B); +LUALIB_API void (luaL_pushresultsize) (luaL_Buffer *B, size_t sz); +LUALIB_API char *(luaL_buffinitsize) (lua_State *L, luaL_Buffer *B, size_t sz); + +#define luaL_prepbuffer(B) luaL_prepbuffsize(B, LUAL_BUFFERSIZE) + +/* }====================================================== */ + + + +/* +** {====================================================== +** File handles for IO library +** ======================================================= +*/ + +/* +** A file handle is a userdata with metatable 'LUA_FILEHANDLE' and +** initial structure 'luaL_Stream' (it may contain other fields +** after that initial structure). +*/ + +#define LUA_FILEHANDLE "FILE*" + + +typedef struct luaL_Stream { + FILE *f; /* stream (NULL for incompletely created streams) */ + lua_CFunction closef; /* to close stream (NULL for closed streams) */ +} luaL_Stream; + +/* }====================================================== */ + +/* +** {================================================================== +** "Abstraction Layer" for basic report of messages and errors +** =================================================================== +*/ + +/* print a string */ +#if !defined(lua_writestring) +#define lua_writestring(s,l) fwrite((s), sizeof(char), (l), stdout) +#endif + +/* print a newline and flush the output */ +#if !defined(lua_writeline) +#define lua_writeline() (lua_writestring("\n", 1), fflush(stdout)) +#endif + +/* print an error message */ +#if !defined(lua_writestringerror) +#define lua_writestringerror(s,p) \ + (fprintf(stderr, (s), (p)), fflush(stderr)) +#endif + +/* }================================================================== */ + + +/* +** {============================================================ +** Compatibility with deprecated conversions +** ============================================================= +*/ +#if defined(LUA_COMPAT_APIINTCASTS) + +#define luaL_checkunsigned(L,a) ((lua_Unsigned)luaL_checkinteger(L,a)) +#define luaL_optunsigned(L,a,d) \ + ((lua_Unsigned)luaL_optinteger(L,a,(lua_Integer)(d))) + +#define luaL_checkint(L,n) ((int)luaL_checkinteger(L, (n))) +#define luaL_optint(L,n,d) ((int)luaL_optinteger(L, (n), (d))) + +#define luaL_checklong(L,n) ((long)luaL_checkinteger(L, (n))) +#define luaL_optlong(L,n,d) ((long)luaL_optinteger(L, (n), (d))) + +#endif +/* }============================================================ */ + + + +#endif + + diff --git a/vendor/lua-5.4.8/src/lbaselib.c b/vendor/lua-5.4.8/src/lbaselib.c new file mode 100644 index 0000000..1d60c9d --- /dev/null +++ b/vendor/lua-5.4.8/src/lbaselib.c @@ -0,0 +1,549 @@ +/* +** $Id: lbaselib.c $ +** Basic library +** See Copyright Notice in lua.h +*/ + +#define lbaselib_c +#define LUA_LIB + +#include "lprefix.h" + + +#include <ctype.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +#include "lua.h" + +#include "lauxlib.h" +#include "lualib.h" + + +static int luaB_print (lua_State *L) { + int n = lua_gettop(L); /* number of arguments */ + int i; + for (i = 1; i <= n; i++) { /* for each argument */ + size_t l; + const char *s = luaL_tolstring(L, i, &l); /* convert it to string */ + if (i > 1) /* not the first element? */ + lua_writestring("\t", 1); /* add a tab before it */ + lua_writestring(s, l); /* print it */ + lua_pop(L, 1); /* pop result */ + } + lua_writeline(); + return 0; +} + + +/* +** Creates a warning with all given arguments. +** Check first for errors; otherwise an error may interrupt +** the composition of a warning, leaving it unfinished. +*/ +static int luaB_warn (lua_State *L) { + int n = lua_gettop(L); /* number of arguments */ + int i; + luaL_checkstring(L, 1); /* at least one argument */ + for (i = 2; i <= n; i++) + luaL_checkstring(L, i); /* make sure all arguments are strings */ + for (i = 1; i < n; i++) /* compose warning */ + lua_warning(L, lua_tostring(L, i), 1); + lua_warning(L, lua_tostring(L, n), 0); /* close warning */ + return 0; +} + + +#define SPACECHARS " \f\n\r\t\v" + +static const char *b_str2int (const char *s, int base, lua_Integer *pn) { + lua_Unsigned n = 0; + int neg = 0; + s += strspn(s, SPACECHARS); /* skip initial spaces */ + if (*s == '-') { s++; neg = 1; } /* handle sign */ + else if (*s == '+') s++; + if (!isalnum((unsigned char)*s)) /* no digit? */ + return NULL; + do { + int digit = (isdigit((unsigned char)*s)) ? *s - '0' + : (toupper((unsigned char)*s) - 'A') + 10; + if (digit >= base) return NULL; /* invalid numeral */ + n = n * base + digit; + s++; + } while (isalnum((unsigned char)*s)); + s += strspn(s, SPACECHARS); /* skip trailing spaces */ + *pn = (lua_Integer)((neg) ? (0u - n) : n); + return s; +} + + +static int luaB_tonumber (lua_State *L) { + if (lua_isnoneornil(L, 2)) { /* standard conversion? */ + if (lua_type(L, 1) == LUA_TNUMBER) { /* already a number? */ + lua_settop(L, 1); /* yes; return it */ + return 1; + } + else { + size_t l; + const char *s = lua_tolstring(L, 1, &l); + if (s != NULL && lua_stringtonumber(L, s) == l + 1) + return 1; /* successful conversion to number */ + /* else not a number */ + luaL_checkany(L, 1); /* (but there must be some parameter) */ + } + } + else { + size_t l; + const char *s; + lua_Integer n = 0; /* to avoid warnings */ + lua_Integer base = luaL_checkinteger(L, 2); + luaL_checktype(L, 1, LUA_TSTRING); /* no numbers as strings */ + s = lua_tolstring(L, 1, &l); + luaL_argcheck(L, 2 <= base && base <= 36, 2, "base out of range"); + if (b_str2int(s, (int)base, &n) == s + l) { + lua_pushinteger(L, n); + return 1; + } /* else not a number */ + } /* else not a number */ + luaL_pushfail(L); /* not a number */ + return 1; +} + + +static int luaB_error (lua_State *L) { + int level = (int)luaL_optinteger(L, 2, 1); + lua_settop(L, 1); + if (lua_type(L, 1) == LUA_TSTRING && level > 0) { + luaL_where(L, level); /* add extra information */ + lua_pushvalue(L, 1); + lua_concat(L, 2); + } + return lua_error(L); +} + + +static int luaB_getmetatable (lua_State *L) { + luaL_checkany(L, 1); + if (!lua_getmetatable(L, 1)) { + lua_pushnil(L); + return 1; /* no metatable */ + } + luaL_getmetafield(L, 1, "__metatable"); + return 1; /* returns either __metatable field (if present) or metatable */ +} + + +static int luaB_setmetatable (lua_State *L) { + int t = lua_type(L, 2); + luaL_checktype(L, 1, LUA_TTABLE); + luaL_argexpected(L, t == LUA_TNIL || t == LUA_TTABLE, 2, "nil or table"); + if (l_unlikely(luaL_getmetafield(L, 1, "__metatable") != LUA_TNIL)) + return luaL_error(L, "cannot change a protected metatable"); + lua_settop(L, 2); + lua_setmetatable(L, 1); + return 1; +} + + +static int luaB_rawequal (lua_State *L) { + luaL_checkany(L, 1); + luaL_checkany(L, 2); + lua_pushboolean(L, lua_rawequal(L, 1, 2)); + return 1; +} + + +static int luaB_rawlen (lua_State *L) { + int t = lua_type(L, 1); + luaL_argexpected(L, t == LUA_TTABLE || t == LUA_TSTRING, 1, + "table or string"); + lua_pushinteger(L, lua_rawlen(L, 1)); + return 1; +} + + +static int luaB_rawget (lua_State *L) { + luaL_checktype(L, 1, LUA_TTABLE); + luaL_checkany(L, 2); + lua_settop(L, 2); + lua_rawget(L, 1); + return 1; +} + +static int luaB_rawset (lua_State *L) { + luaL_checktype(L, 1, LUA_TTABLE); + luaL_checkany(L, 2); + luaL_checkany(L, 3); + lua_settop(L, 3); + lua_rawset(L, 1); + return 1; +} + + +static int pushmode (lua_State *L, int oldmode) { + if (oldmode == -1) + luaL_pushfail(L); /* invalid call to 'lua_gc' */ + else + lua_pushstring(L, (oldmode == LUA_GCINC) ? "incremental" + : "generational"); + return 1; +} + + +/* +** check whether call to 'lua_gc' was valid (not inside a finalizer) +*/ +#define checkvalres(res) { if (res == -1) break; } + +static int luaB_collectgarbage (lua_State *L) { + static const char *const opts[] = {"stop", "restart", "collect", + "count", "step", "setpause", "setstepmul", + "isrunning", "generational", "incremental", NULL}; + static const int optsnum[] = {LUA_GCSTOP, LUA_GCRESTART, LUA_GCCOLLECT, + LUA_GCCOUNT, LUA_GCSTEP, LUA_GCSETPAUSE, LUA_GCSETSTEPMUL, + LUA_GCISRUNNING, LUA_GCGEN, LUA_GCINC}; + int o = optsnum[luaL_checkoption(L, 1, "collect", opts)]; + switch (o) { + case LUA_GCCOUNT: { + int k = lua_gc(L, o); + int b = lua_gc(L, LUA_GCCOUNTB); + checkvalres(k); + lua_pushnumber(L, (lua_Number)k + ((lua_Number)b/1024)); + return 1; + } + case LUA_GCSTEP: { + int step = (int)luaL_optinteger(L, 2, 0); + int res = lua_gc(L, o, step); + checkvalres(res); + lua_pushboolean(L, res); + return 1; + } + case LUA_GCSETPAUSE: + case LUA_GCSETSTEPMUL: { + int p = (int)luaL_optinteger(L, 2, 0); + int previous = lua_gc(L, o, p); + checkvalres(previous); + lua_pushinteger(L, previous); + return 1; + } + case LUA_GCISRUNNING: { + int res = lua_gc(L, o); + checkvalres(res); + lua_pushboolean(L, res); + return 1; + } + case LUA_GCGEN: { + int minormul = (int)luaL_optinteger(L, 2, 0); + int majormul = (int)luaL_optinteger(L, 3, 0); + return pushmode(L, lua_gc(L, o, minormul, majormul)); + } + case LUA_GCINC: { + int pause = (int)luaL_optinteger(L, 2, 0); + int stepmul = (int)luaL_optinteger(L, 3, 0); + int stepsize = (int)luaL_optinteger(L, 4, 0); + return pushmode(L, lua_gc(L, o, pause, stepmul, stepsize)); + } + default: { + int res = lua_gc(L, o); + checkvalres(res); + lua_pushinteger(L, res); + return 1; + } + } + luaL_pushfail(L); /* invalid call (inside a finalizer) */ + return 1; +} + + +static int luaB_type (lua_State *L) { + int t = lua_type(L, 1); + luaL_argcheck(L, t != LUA_TNONE, 1, "value expected"); + lua_pushstring(L, lua_typename(L, t)); + return 1; +} + + +static int luaB_next (lua_State *L) { + luaL_checktype(L, 1, LUA_TTABLE); + lua_settop(L, 2); /* create a 2nd argument if there isn't one */ + if (lua_next(L, 1)) + return 2; + else { + lua_pushnil(L); + return 1; + } +} + + +static int pairscont (lua_State *L, int status, lua_KContext k) { + (void)L; (void)status; (void)k; /* unused */ + return 3; +} + +static int luaB_pairs (lua_State *L) { + luaL_checkany(L, 1); + if (luaL_getmetafield(L, 1, "__pairs") == LUA_TNIL) { /* no metamethod? */ + lua_pushcfunction(L, luaB_next); /* will return generator, */ + lua_pushvalue(L, 1); /* state, */ + lua_pushnil(L); /* and initial value */ + } + else { + lua_pushvalue(L, 1); /* argument 'self' to metamethod */ + lua_callk(L, 1, 3, 0, pairscont); /* get 3 values from metamethod */ + } + return 3; +} + + +/* +** Traversal function for 'ipairs' +*/ +static int ipairsaux (lua_State *L) { + lua_Integer i = luaL_checkinteger(L, 2); + i = luaL_intop(+, i, 1); + lua_pushinteger(L, i); + return (lua_geti(L, 1, i) == LUA_TNIL) ? 1 : 2; +} + + +/* +** 'ipairs' function. Returns 'ipairsaux', given "table", 0. +** (The given "table" may not be a table.) +*/ +static int luaB_ipairs (lua_State *L) { + luaL_checkany(L, 1); + lua_pushcfunction(L, ipairsaux); /* iteration function */ + lua_pushvalue(L, 1); /* state */ + lua_pushinteger(L, 0); /* initial value */ + return 3; +} + + +static int load_aux (lua_State *L, int status, int envidx) { + if (l_likely(status == LUA_OK)) { + if (envidx != 0) { /* 'env' parameter? */ + lua_pushvalue(L, envidx); /* environment for loaded function */ + if (!lua_setupvalue(L, -2, 1)) /* set it as 1st upvalue */ + lua_pop(L, 1); /* remove 'env' if not used by previous call */ + } + return 1; + } + else { /* error (message is on top of the stack) */ + luaL_pushfail(L); + lua_insert(L, -2); /* put before error message */ + return 2; /* return fail plus error message */ + } +} + + +static int luaB_loadfile (lua_State *L) { + const char *fname = luaL_optstring(L, 1, NULL); + const char *mode = luaL_optstring(L, 2, NULL); + int env = (!lua_isnone(L, 3) ? 3 : 0); /* 'env' index or 0 if no 'env' */ + int status = luaL_loadfilex(L, fname, mode); + return load_aux(L, status, env); +} + + +/* +** {====================================================== +** Generic Read function +** ======================================================= +*/ + + +/* +** reserved slot, above all arguments, to hold a copy of the returned +** string to avoid it being collected while parsed. 'load' has four +** optional arguments (chunk, source name, mode, and environment). +*/ +#define RESERVEDSLOT 5 + + +/* +** Reader for generic 'load' function: 'lua_load' uses the +** stack for internal stuff, so the reader cannot change the +** stack top. Instead, it keeps its resulting string in a +** reserved slot inside the stack. +*/ +static const char *generic_reader (lua_State *L, void *ud, size_t *size) { + (void)(ud); /* not used */ + luaL_checkstack(L, 2, "too many nested functions"); + lua_pushvalue(L, 1); /* get function */ + lua_call(L, 0, 1); /* call it */ + if (lua_isnil(L, -1)) { + lua_pop(L, 1); /* pop result */ + *size = 0; + return NULL; + } + else if (l_unlikely(!lua_isstring(L, -1))) + luaL_error(L, "reader function must return a string"); + lua_replace(L, RESERVEDSLOT); /* save string in reserved slot */ + return lua_tolstring(L, RESERVEDSLOT, size); +} + + +static int luaB_load (lua_State *L) { + int status; + size_t l; + const char *s = lua_tolstring(L, 1, &l); + const char *mode = luaL_optstring(L, 3, "bt"); + int env = (!lua_isnone(L, 4) ? 4 : 0); /* 'env' index or 0 if no 'env' */ + if (s != NULL) { /* loading a string? */ + const char *chunkname = luaL_optstring(L, 2, s); + status = luaL_loadbufferx(L, s, l, chunkname, mode); + } + else { /* loading from a reader function */ + const char *chunkname = luaL_optstring(L, 2, "=(load)"); + luaL_checktype(L, 1, LUA_TFUNCTION); + lua_settop(L, RESERVEDSLOT); /* create reserved slot */ + status = lua_load(L, generic_reader, NULL, chunkname, mode); + } + return load_aux(L, status, env); +} + +/* }====================================================== */ + + +static int dofilecont (lua_State *L, int d1, lua_KContext d2) { + (void)d1; (void)d2; /* only to match 'lua_Kfunction' prototype */ + return lua_gettop(L) - 1; +} + + +static int luaB_dofile (lua_State *L) { + const char *fname = luaL_optstring(L, 1, NULL); + lua_settop(L, 1); + if (l_unlikely(luaL_loadfile(L, fname) != LUA_OK)) + return lua_error(L); + lua_callk(L, 0, LUA_MULTRET, 0, dofilecont); + return dofilecont(L, 0, 0); +} + + +static int luaB_assert (lua_State *L) { + if (l_likely(lua_toboolean(L, 1))) /* condition is true? */ + return lua_gettop(L); /* return all arguments */ + else { /* error */ + luaL_checkany(L, 1); /* there must be a condition */ + lua_remove(L, 1); /* remove it */ + lua_pushliteral(L, "assertion failed!"); /* default message */ + lua_settop(L, 1); /* leave only message (default if no other one) */ + return luaB_error(L); /* call 'error' */ + } +} + + +static int luaB_select (lua_State *L) { + int n = lua_gettop(L); + if (lua_type(L, 1) == LUA_TSTRING && *lua_tostring(L, 1) == '#') { + lua_pushinteger(L, n-1); + return 1; + } + else { + lua_Integer i = luaL_checkinteger(L, 1); + if (i < 0) i = n + i; + else if (i > n) i = n; + luaL_argcheck(L, 1 <= i, 1, "index out of range"); + return n - (int)i; + } +} + + +/* +** Continuation function for 'pcall' and 'xpcall'. Both functions +** already pushed a 'true' before doing the call, so in case of success +** 'finishpcall' only has to return everything in the stack minus +** 'extra' values (where 'extra' is exactly the number of items to be +** ignored). +*/ +static int finishpcall (lua_State *L, int status, lua_KContext extra) { + if (l_unlikely(status != LUA_OK && status != LUA_YIELD)) { /* error? */ + lua_pushboolean(L, 0); /* first result (false) */ + lua_pushvalue(L, -2); /* error message */ + return 2; /* return false, msg */ + } + else + return lua_gettop(L) - (int)extra; /* return all results */ +} + + +static int luaB_pcall (lua_State *L) { + int status; + luaL_checkany(L, 1); + lua_pushboolean(L, 1); /* first result if no errors */ + lua_insert(L, 1); /* put it in place */ + status = lua_pcallk(L, lua_gettop(L) - 2, LUA_MULTRET, 0, 0, finishpcall); + return finishpcall(L, status, 0); +} + + +/* +** Do a protected call with error handling. After 'lua_rotate', the +** stack will have <f, err, true, f, [args...]>; so, the function passes +** 2 to 'finishpcall' to skip the 2 first values when returning results. +*/ +static int luaB_xpcall (lua_State *L) { + int status; + int n = lua_gettop(L); + luaL_checktype(L, 2, LUA_TFUNCTION); /* check error function */ + lua_pushboolean(L, 1); /* first result */ + lua_pushvalue(L, 1); /* function */ + lua_rotate(L, 3, 2); /* move them below function's arguments */ + status = lua_pcallk(L, n - 2, LUA_MULTRET, 2, 2, finishpcall); + return finishpcall(L, status, 2); +} + + +static int luaB_tostring (lua_State *L) { + luaL_checkany(L, 1); + luaL_tolstring(L, 1, NULL); + return 1; +} + + +static const luaL_Reg base_funcs[] = { + {"assert", luaB_assert}, + {"collectgarbage", luaB_collectgarbage}, + {"dofile", luaB_dofile}, + {"error", luaB_error}, + {"getmetatable", luaB_getmetatable}, + {"ipairs", luaB_ipairs}, + {"loadfile", luaB_loadfile}, + {"load", luaB_load}, + {"next", luaB_next}, + {"pairs", luaB_pairs}, + {"pcall", luaB_pcall}, + {"print", luaB_print}, + {"warn", luaB_warn}, + {"rawequal", luaB_rawequal}, + {"rawlen", luaB_rawlen}, + {"rawget", luaB_rawget}, + {"rawset", luaB_rawset}, + {"select", luaB_select}, + {"setmetatable", luaB_setmetatable}, + {"tonumber", luaB_tonumber}, + {"tostring", luaB_tostring}, + {"type", luaB_type}, + {"xpcall", luaB_xpcall}, + /* placeholders */ + {LUA_GNAME, NULL}, + {"_VERSION", NULL}, + {NULL, NULL} +}; + + +LUAMOD_API int luaopen_base (lua_State *L) { + /* open lib into global table */ + lua_pushglobaltable(L); + luaL_setfuncs(L, base_funcs, 0); + /* set global _G */ + lua_pushvalue(L, -1); + lua_setfield(L, -2, LUA_GNAME); + /* set global _VERSION */ + lua_pushliteral(L, LUA_VERSION); + lua_setfield(L, -2, "_VERSION"); + return 1; +} + diff --git a/vendor/lua-5.4.8/src/lcode.c b/vendor/lua-5.4.8/src/lcode.c new file mode 100644 index 0000000..3f78370 --- /dev/null +++ b/vendor/lua-5.4.8/src/lcode.c @@ -0,0 +1,1875 @@ +/* +** $Id: lcode.c $ +** Code generator for Lua +** See Copyright Notice in lua.h +*/ + +#define lcode_c +#define LUA_CORE + +#include "lprefix.h" + + +#include <float.h> +#include <limits.h> +#include <math.h> +#include <stdlib.h> + +#include "lua.h" + +#include "lcode.h" +#include "ldebug.h" +#include "ldo.h" +#include "lgc.h" +#include "llex.h" +#include "lmem.h" +#include "lobject.h" +#include "lopcodes.h" +#include "lparser.h" +#include "lstring.h" +#include "ltable.h" +#include "lvm.h" + + +/* Maximum number of registers in a Lua function (must fit in 8 bits) */ +#define MAXREGS 255 + + +/* (note that expressions VJMP also have jumps.) */ +#define hasjumps(e) ((e)->t != (e)->f) + + +static int codesJ (FuncState *fs, OpCode o, int sj, int k); + + + +/* semantic error */ +l_noret luaK_semerror (LexState *ls, const char *msg) { + ls->t.token = 0; /* remove "near <token>" from final message */ + luaX_syntaxerror(ls, msg); +} + + +/* +** If expression is a numeric constant, fills 'v' with its value +** and returns 1. Otherwise, returns 0. +*/ +static int tonumeral (const expdesc *e, TValue *v) { + if (hasjumps(e)) + return 0; /* not a numeral */ + switch (e->k) { + case VKINT: + if (v) setivalue(v, e->u.ival); + return 1; + case VKFLT: + if (v) setfltvalue(v, e->u.nval); + return 1; + default: return 0; + } +} + + +/* +** Get the constant value from a constant expression +*/ +static TValue *const2val (FuncState *fs, const expdesc *e) { + lua_assert(e->k == VCONST); + return &fs->ls->dyd->actvar.arr[e->u.info].k; +} + + +/* +** If expression is a constant, fills 'v' with its value +** and returns 1. Otherwise, returns 0. +*/ +int luaK_exp2const (FuncState *fs, const expdesc *e, TValue *v) { + if (hasjumps(e)) + return 0; /* not a constant */ + switch (e->k) { + case VFALSE: + setbfvalue(v); + return 1; + case VTRUE: + setbtvalue(v); + return 1; + case VNIL: + setnilvalue(v); + return 1; + case VKSTR: { + setsvalue(fs->ls->L, v, e->u.strval); + return 1; + } + case VCONST: { + setobj(fs->ls->L, v, const2val(fs, e)); + return 1; + } + default: return tonumeral(e, v); + } +} + + +/* +** Return the previous instruction of the current code. If there +** may be a jump target between the current instruction and the +** previous one, return an invalid instruction (to avoid wrong +** optimizations). +*/ +static Instruction *previousinstruction (FuncState *fs) { + static const Instruction invalidinstruction = ~(Instruction)0; + if (fs->pc > fs->lasttarget) + return &fs->f->code[fs->pc - 1]; /* previous instruction */ + else + return cast(Instruction*, &invalidinstruction); +} + + +/* +** Create a OP_LOADNIL instruction, but try to optimize: if the previous +** instruction is also OP_LOADNIL and ranges are compatible, adjust +** range of previous instruction instead of emitting a new one. (For +** instance, 'local a; local b' will generate a single opcode.) +*/ +void luaK_nil (FuncState *fs, int from, int n) { + int l = from + n - 1; /* last register to set nil */ + Instruction *previous = previousinstruction(fs); + if (GET_OPCODE(*previous) == OP_LOADNIL) { /* previous is LOADNIL? */ + int pfrom = GETARG_A(*previous); /* get previous range */ + int pl = pfrom + GETARG_B(*previous); + if ((pfrom <= from && from <= pl + 1) || + (from <= pfrom && pfrom <= l + 1)) { /* can connect both? */ + if (pfrom < from) from = pfrom; /* from = min(from, pfrom) */ + if (pl > l) l = pl; /* l = max(l, pl) */ + SETARG_A(*previous, from); + SETARG_B(*previous, l - from); + return; + } /* else go through */ + } + luaK_codeABC(fs, OP_LOADNIL, from, n - 1, 0); /* else no optimization */ +} + + +/* +** Gets the destination address of a jump instruction. Used to traverse +** a list of jumps. +*/ +static int getjump (FuncState *fs, int pc) { + int offset = GETARG_sJ(fs->f->code[pc]); + if (offset == NO_JUMP) /* point to itself represents end of list */ + return NO_JUMP; /* end of list */ + else + return (pc+1)+offset; /* turn offset into absolute position */ +} + + +/* +** Fix jump instruction at position 'pc' to jump to 'dest'. +** (Jump addresses are relative in Lua) +*/ +static void fixjump (FuncState *fs, int pc, int dest) { + Instruction *jmp = &fs->f->code[pc]; + int offset = dest - (pc + 1); + lua_assert(dest != NO_JUMP); + if (!(-OFFSET_sJ <= offset && offset <= MAXARG_sJ - OFFSET_sJ)) + luaX_syntaxerror(fs->ls, "control structure too long"); + lua_assert(GET_OPCODE(*jmp) == OP_JMP); + SETARG_sJ(*jmp, offset); +} + + +/* +** Concatenate jump-list 'l2' into jump-list 'l1' +*/ +void luaK_concat (FuncState *fs, int *l1, int l2) { + if (l2 == NO_JUMP) return; /* nothing to concatenate? */ + else if (*l1 == NO_JUMP) /* no original list? */ + *l1 = l2; /* 'l1' points to 'l2' */ + else { + int list = *l1; + int next; + while ((next = getjump(fs, list)) != NO_JUMP) /* find last element */ + list = next; + fixjump(fs, list, l2); /* last element links to 'l2' */ + } +} + + +/* +** Create a jump instruction and return its position, so its destination +** can be fixed later (with 'fixjump'). +*/ +int luaK_jump (FuncState *fs) { + return codesJ(fs, OP_JMP, NO_JUMP, 0); +} + + +/* +** Code a 'return' instruction +*/ +void luaK_ret (FuncState *fs, int first, int nret) { + OpCode op; + switch (nret) { + case 0: op = OP_RETURN0; break; + case 1: op = OP_RETURN1; break; + default: op = OP_RETURN; break; + } + luaK_codeABC(fs, op, first, nret + 1, 0); +} + + +/* +** Code a "conditional jump", that is, a test or comparison opcode +** followed by a jump. Return jump position. +*/ +static int condjump (FuncState *fs, OpCode op, int A, int B, int C, int k) { + luaK_codeABCk(fs, op, A, B, C, k); + return luaK_jump(fs); +} + + +/* +** returns current 'pc' and marks it as a jump target (to avoid wrong +** optimizations with consecutive instructions not in the same basic block). +*/ +int luaK_getlabel (FuncState *fs) { + fs->lasttarget = fs->pc; + return fs->pc; +} + + +/* +** Returns the position of the instruction "controlling" a given +** jump (that is, its condition), or the jump itself if it is +** unconditional. +*/ +static Instruction *getjumpcontrol (FuncState *fs, int pc) { + Instruction *pi = &fs->f->code[pc]; + if (pc >= 1 && testTMode(GET_OPCODE(*(pi-1)))) + return pi-1; + else + return pi; +} + + +/* +** Patch destination register for a TESTSET instruction. +** If instruction in position 'node' is not a TESTSET, return 0 ("fails"). +** Otherwise, if 'reg' is not 'NO_REG', set it as the destination +** register. Otherwise, change instruction to a simple 'TEST' (produces +** no register value) +*/ +static int patchtestreg (FuncState *fs, int node, int reg) { + Instruction *i = getjumpcontrol(fs, node); + if (GET_OPCODE(*i) != OP_TESTSET) + return 0; /* cannot patch other instructions */ + if (reg != NO_REG && reg != GETARG_B(*i)) + SETARG_A(*i, reg); + else { + /* no register to put value or register already has the value; + change instruction to simple test */ + *i = CREATE_ABCk(OP_TEST, GETARG_B(*i), 0, 0, GETARG_k(*i)); + } + return 1; +} + + +/* +** Traverse a list of tests ensuring no one produces a value +*/ +static void removevalues (FuncState *fs, int list) { + for (; list != NO_JUMP; list = getjump(fs, list)) + patchtestreg(fs, list, NO_REG); +} + + +/* +** Traverse a list of tests, patching their destination address and +** registers: tests producing values jump to 'vtarget' (and put their +** values in 'reg'), other tests jump to 'dtarget'. +*/ +static void patchlistaux (FuncState *fs, int list, int vtarget, int reg, + int dtarget) { + while (list != NO_JUMP) { + int next = getjump(fs, list); + if (patchtestreg(fs, list, reg)) + fixjump(fs, list, vtarget); + else + fixjump(fs, list, dtarget); /* jump to default target */ + list = next; + } +} + + +/* +** Path all jumps in 'list' to jump to 'target'. +** (The assert means that we cannot fix a jump to a forward address +** because we only know addresses once code is generated.) +*/ +void luaK_patchlist (FuncState *fs, int list, int target) { + lua_assert(target <= fs->pc); + patchlistaux(fs, list, target, NO_REG, target); +} + + +void luaK_patchtohere (FuncState *fs, int list) { + int hr = luaK_getlabel(fs); /* mark "here" as a jump target */ + luaK_patchlist(fs, list, hr); +} + + +/* limit for difference between lines in relative line info. */ +#define LIMLINEDIFF 0x80 + + +/* +** Save line info for a new instruction. If difference from last line +** does not fit in a byte, of after that many instructions, save a new +** absolute line info; (in that case, the special value 'ABSLINEINFO' +** in 'lineinfo' signals the existence of this absolute information.) +** Otherwise, store the difference from last line in 'lineinfo'. +*/ +static void savelineinfo (FuncState *fs, Proto *f, int line) { + int linedif = line - fs->previousline; + int pc = fs->pc - 1; /* last instruction coded */ + if (abs(linedif) >= LIMLINEDIFF || fs->iwthabs++ >= MAXIWTHABS) { + luaM_growvector(fs->ls->L, f->abslineinfo, fs->nabslineinfo, + f->sizeabslineinfo, AbsLineInfo, MAX_INT, "lines"); + f->abslineinfo[fs->nabslineinfo].pc = pc; + f->abslineinfo[fs->nabslineinfo++].line = line; + linedif = ABSLINEINFO; /* signal that there is absolute information */ + fs->iwthabs = 1; /* restart counter */ + } + luaM_growvector(fs->ls->L, f->lineinfo, pc, f->sizelineinfo, ls_byte, + MAX_INT, "opcodes"); + f->lineinfo[pc] = linedif; + fs->previousline = line; /* last line saved */ +} + + +/* +** Remove line information from the last instruction. +** If line information for that instruction is absolute, set 'iwthabs' +** above its max to force the new (replacing) instruction to have +** absolute line info, too. +*/ +static void removelastlineinfo (FuncState *fs) { + Proto *f = fs->f; + int pc = fs->pc - 1; /* last instruction coded */ + if (f->lineinfo[pc] != ABSLINEINFO) { /* relative line info? */ + fs->previousline -= f->lineinfo[pc]; /* correct last line saved */ + fs->iwthabs--; /* undo previous increment */ + } + else { /* absolute line information */ + lua_assert(f->abslineinfo[fs->nabslineinfo - 1].pc == pc); + fs->nabslineinfo--; /* remove it */ + fs->iwthabs = MAXIWTHABS + 1; /* force next line info to be absolute */ + } +} + + +/* +** Remove the last instruction created, correcting line information +** accordingly. +*/ +static void removelastinstruction (FuncState *fs) { + removelastlineinfo(fs); + fs->pc--; +} + + +/* +** Emit instruction 'i', checking for array sizes and saving also its +** line information. Return 'i' position. +*/ +int luaK_code (FuncState *fs, Instruction i) { + Proto *f = fs->f; + /* put new instruction in code array */ + luaM_growvector(fs->ls->L, f->code, fs->pc, f->sizecode, Instruction, + MAX_INT, "opcodes"); + f->code[fs->pc++] = i; + savelineinfo(fs, f, fs->ls->lastline); + return fs->pc - 1; /* index of new instruction */ +} + + +/* +** Format and emit an 'iABC' instruction. (Assertions check consistency +** of parameters versus opcode.) +*/ +int luaK_codeABCk (FuncState *fs, OpCode o, int a, int b, int c, int k) { + lua_assert(getOpMode(o) == iABC); + lua_assert(a <= MAXARG_A && b <= MAXARG_B && + c <= MAXARG_C && (k & ~1) == 0); + return luaK_code(fs, CREATE_ABCk(o, a, b, c, k)); +} + + +/* +** Format and emit an 'iABx' instruction. +*/ +int luaK_codeABx (FuncState *fs, OpCode o, int a, unsigned int bc) { + lua_assert(getOpMode(o) == iABx); + lua_assert(a <= MAXARG_A && bc <= MAXARG_Bx); + return luaK_code(fs, CREATE_ABx(o, a, bc)); +} + + +/* +** Format and emit an 'iAsBx' instruction. +*/ +static int codeAsBx (FuncState *fs, OpCode o, int a, int bc) { + unsigned int b = bc + OFFSET_sBx; + lua_assert(getOpMode(o) == iAsBx); + lua_assert(a <= MAXARG_A && b <= MAXARG_Bx); + return luaK_code(fs, CREATE_ABx(o, a, b)); +} + + +/* +** Format and emit an 'isJ' instruction. +*/ +static int codesJ (FuncState *fs, OpCode o, int sj, int k) { + unsigned int j = sj + OFFSET_sJ; + lua_assert(getOpMode(o) == isJ); + lua_assert(j <= MAXARG_sJ && (k & ~1) == 0); + return luaK_code(fs, CREATE_sJ(o, j, k)); +} + + +/* +** Emit an "extra argument" instruction (format 'iAx') +*/ +static int codeextraarg (FuncState *fs, int a) { + lua_assert(a <= MAXARG_Ax); + return luaK_code(fs, CREATE_Ax(OP_EXTRAARG, a)); +} + + +/* +** Emit a "load constant" instruction, using either 'OP_LOADK' +** (if constant index 'k' fits in 18 bits) or an 'OP_LOADKX' +** instruction with "extra argument". +*/ +static int luaK_codek (FuncState *fs, int reg, int k) { + if (k <= MAXARG_Bx) + return luaK_codeABx(fs, OP_LOADK, reg, k); + else { + int p = luaK_codeABx(fs, OP_LOADKX, reg, 0); + codeextraarg(fs, k); + return p; + } +} + + +/* +** Check register-stack level, keeping track of its maximum size +** in field 'maxstacksize' +*/ +void luaK_checkstack (FuncState *fs, int n) { + int newstack = fs->freereg + n; + if (newstack > fs->f->maxstacksize) { + if (newstack >= MAXREGS) + luaX_syntaxerror(fs->ls, + "function or expression needs too many registers"); + fs->f->maxstacksize = cast_byte(newstack); + } +} + + +/* +** Reserve 'n' registers in register stack +*/ +void luaK_reserveregs (FuncState *fs, int n) { + luaK_checkstack(fs, n); + fs->freereg += n; +} + + +/* +** Free register 'reg', if it is neither a constant index nor +** a local variable. +) +*/ +static void freereg (FuncState *fs, int reg) { + if (reg >= luaY_nvarstack(fs)) { + fs->freereg--; + lua_assert(reg == fs->freereg); + } +} + + +/* +** Free two registers in proper order +*/ +static void freeregs (FuncState *fs, int r1, int r2) { + if (r1 > r2) { + freereg(fs, r1); + freereg(fs, r2); + } + else { + freereg(fs, r2); + freereg(fs, r1); + } +} + + +/* +** Free register used by expression 'e' (if any) +*/ +static void freeexp (FuncState *fs, expdesc *e) { + if (e->k == VNONRELOC) + freereg(fs, e->u.info); +} + + +/* +** Free registers used by expressions 'e1' and 'e2' (if any) in proper +** order. +*/ +static void freeexps (FuncState *fs, expdesc *e1, expdesc *e2) { + int r1 = (e1->k == VNONRELOC) ? e1->u.info : -1; + int r2 = (e2->k == VNONRELOC) ? e2->u.info : -1; + freeregs(fs, r1, r2); +} + + +/* +** Add constant 'v' to prototype's list of constants (field 'k'). +** Use scanner's table to cache position of constants in constant list +** and try to reuse constants. Because some values should not be used +** as keys (nil cannot be a key, integer keys can collapse with float +** keys), the caller must provide a useful 'key' for indexing the cache. +** Note that all functions share the same table, so entering or exiting +** a function can make some indices wrong. +*/ +static int addk (FuncState *fs, TValue *key, TValue *v) { + TValue val; + lua_State *L = fs->ls->L; + Proto *f = fs->f; + const TValue *idx = luaH_get(fs->ls->h, key); /* query scanner table */ + int k, oldsize; + if (ttisinteger(idx)) { /* is there an index there? */ + k = cast_int(ivalue(idx)); + /* correct value? (warning: must distinguish floats from integers!) */ + if (k < fs->nk && ttypetag(&f->k[k]) == ttypetag(v) && + luaV_rawequalobj(&f->k[k], v)) + return k; /* reuse index */ + } + /* constant not found; create a new entry */ + oldsize = f->sizek; + k = fs->nk; + /* numerical value does not need GC barrier; + table has no metatable, so it does not need to invalidate cache */ + setivalue(&val, k); + luaH_finishset(L, fs->ls->h, key, idx, &val); + luaM_growvector(L, f->k, k, f->sizek, TValue, MAXARG_Ax, "constants"); + while (oldsize < f->sizek) setnilvalue(&f->k[oldsize++]); + setobj(L, &f->k[k], v); + fs->nk++; + luaC_barrier(L, f, v); + return k; +} + + +/* +** Add a string to list of constants and return its index. +*/ +static int stringK (FuncState *fs, TString *s) { + TValue o; + setsvalue(fs->ls->L, &o, s); + return addk(fs, &o, &o); /* use string itself as key */ +} + + +/* +** Add an integer to list of constants and return its index. +*/ +static int luaK_intK (FuncState *fs, lua_Integer n) { + TValue o; + setivalue(&o, n); + return addk(fs, &o, &o); /* use integer itself as key */ +} + +/* +** Add a float to list of constants and return its index. Floats +** with integral values need a different key, to avoid collision +** with actual integers. To that, we add to the number its smaller +** power-of-two fraction that is still significant in its scale. +** For doubles, that would be 1/2^52. +** (This method is not bulletproof: there may be another float +** with that value, and for floats larger than 2^53 the result is +** still an integer. At worst, this only wastes an entry with +** a duplicate.) +*/ +static int luaK_numberK (FuncState *fs, lua_Number r) { + TValue o; + lua_Integer ik; + setfltvalue(&o, r); + if (!luaV_flttointeger(r, &ik, F2Ieq)) /* not an integral value? */ + return addk(fs, &o, &o); /* use number itself as key */ + else { /* must build an alternative key */ + const int nbm = l_floatatt(MANT_DIG); + const lua_Number q = l_mathop(ldexp)(l_mathop(1.0), -nbm + 1); + const lua_Number k = (ik == 0) ? q : r + r*q; /* new key */ + TValue kv; + setfltvalue(&kv, k); + /* result is not an integral value, unless value is too large */ + lua_assert(!luaV_flttointeger(k, &ik, F2Ieq) || + l_mathop(fabs)(r) >= l_mathop(1e6)); + return addk(fs, &kv, &o); + } +} + + +/* +** Add a false to list of constants and return its index. +*/ +static int boolF (FuncState *fs) { + TValue o; + setbfvalue(&o); + return addk(fs, &o, &o); /* use boolean itself as key */ +} + + +/* +** Add a true to list of constants and return its index. +*/ +static int boolT (FuncState *fs) { + TValue o; + setbtvalue(&o); + return addk(fs, &o, &o); /* use boolean itself as key */ +} + + +/* +** Add nil to list of constants and return its index. +*/ +static int nilK (FuncState *fs) { + TValue k, v; + setnilvalue(&v); + /* cannot use nil as key; instead use table itself to represent nil */ + sethvalue(fs->ls->L, &k, fs->ls->h); + return addk(fs, &k, &v); +} + + +/* +** Check whether 'i' can be stored in an 'sC' operand. Equivalent to +** (0 <= int2sC(i) && int2sC(i) <= MAXARG_C) but without risk of +** overflows in the hidden addition inside 'int2sC'. +*/ +static int fitsC (lua_Integer i) { + return (l_castS2U(i) + OFFSET_sC <= cast_uint(MAXARG_C)); +} + + +/* +** Check whether 'i' can be stored in an 'sBx' operand. +*/ +static int fitsBx (lua_Integer i) { + return (-OFFSET_sBx <= i && i <= MAXARG_Bx - OFFSET_sBx); +} + + +void luaK_int (FuncState *fs, int reg, lua_Integer i) { + if (fitsBx(i)) + codeAsBx(fs, OP_LOADI, reg, cast_int(i)); + else + luaK_codek(fs, reg, luaK_intK(fs, i)); +} + + +static void luaK_float (FuncState *fs, int reg, lua_Number f) { + lua_Integer fi; + if (luaV_flttointeger(f, &fi, F2Ieq) && fitsBx(fi)) + codeAsBx(fs, OP_LOADF, reg, cast_int(fi)); + else + luaK_codek(fs, reg, luaK_numberK(fs, f)); +} + + +/* +** Convert a constant in 'v' into an expression description 'e' +*/ +static void const2exp (TValue *v, expdesc *e) { + switch (ttypetag(v)) { + case LUA_VNUMINT: + e->k = VKINT; e->u.ival = ivalue(v); + break; + case LUA_VNUMFLT: + e->k = VKFLT; e->u.nval = fltvalue(v); + break; + case LUA_VFALSE: + e->k = VFALSE; + break; + case LUA_VTRUE: + e->k = VTRUE; + break; + case LUA_VNIL: + e->k = VNIL; + break; + case LUA_VSHRSTR: case LUA_VLNGSTR: + e->k = VKSTR; e->u.strval = tsvalue(v); + break; + default: lua_assert(0); + } +} + + +/* +** Fix an expression to return the number of results 'nresults'. +** 'e' must be a multi-ret expression (function call or vararg). +*/ +void luaK_setreturns (FuncState *fs, expdesc *e, int nresults) { + Instruction *pc = &getinstruction(fs, e); + if (e->k == VCALL) /* expression is an open function call? */ + SETARG_C(*pc, nresults + 1); + else { + lua_assert(e->k == VVARARG); + SETARG_C(*pc, nresults + 1); + SETARG_A(*pc, fs->freereg); + luaK_reserveregs(fs, 1); + } +} + + +/* +** Convert a VKSTR to a VK +*/ +static void str2K (FuncState *fs, expdesc *e) { + lua_assert(e->k == VKSTR); + e->u.info = stringK(fs, e->u.strval); + e->k = VK; +} + + +/* +** Fix an expression to return one result. +** If expression is not a multi-ret expression (function call or +** vararg), it already returns one result, so nothing needs to be done. +** Function calls become VNONRELOC expressions (as its result comes +** fixed in the base register of the call), while vararg expressions +** become VRELOC (as OP_VARARG puts its results where it wants). +** (Calls are created returning one result, so that does not need +** to be fixed.) +*/ +void luaK_setoneret (FuncState *fs, expdesc *e) { + if (e->k == VCALL) { /* expression is an open function call? */ + /* already returns 1 value */ + lua_assert(GETARG_C(getinstruction(fs, e)) == 2); + e->k = VNONRELOC; /* result has fixed position */ + e->u.info = GETARG_A(getinstruction(fs, e)); + } + else if (e->k == VVARARG) { + SETARG_C(getinstruction(fs, e), 2); + e->k = VRELOC; /* can relocate its simple result */ + } +} + + +/* +** Ensure that expression 'e' is not a variable (nor a <const>). +** (Expression still may have jump lists.) +*/ +void luaK_dischargevars (FuncState *fs, expdesc *e) { + switch (e->k) { + case VCONST: { + const2exp(const2val(fs, e), e); + break; + } + case VLOCAL: { /* already in a register */ + int temp = e->u.var.ridx; + e->u.info = temp; /* (can't do a direct assignment; values overlap) */ + e->k = VNONRELOC; /* becomes a non-relocatable value */ + break; + } + case VUPVAL: { /* move value to some (pending) register */ + e->u.info = luaK_codeABC(fs, OP_GETUPVAL, 0, e->u.info, 0); + e->k = VRELOC; + break; + } + case VINDEXUP: { + e->u.info = luaK_codeABC(fs, OP_GETTABUP, 0, e->u.ind.t, e->u.ind.idx); + e->k = VRELOC; + break; + } + case VINDEXI: { + freereg(fs, e->u.ind.t); + e->u.info = luaK_codeABC(fs, OP_GETI, 0, e->u.ind.t, e->u.ind.idx); + e->k = VRELOC; + break; + } + case VINDEXSTR: { + freereg(fs, e->u.ind.t); + e->u.info = luaK_codeABC(fs, OP_GETFIELD, 0, e->u.ind.t, e->u.ind.idx); + e->k = VRELOC; + break; + } + case VINDEXED: { + freeregs(fs, e->u.ind.t, e->u.ind.idx); + e->u.info = luaK_codeABC(fs, OP_GETTABLE, 0, e->u.ind.t, e->u.ind.idx); + e->k = VRELOC; + break; + } + case VVARARG: case VCALL: { + luaK_setoneret(fs, e); + break; + } + default: break; /* there is one value available (somewhere) */ + } +} + + +/* +** Ensure expression value is in register 'reg', making 'e' a +** non-relocatable expression. +** (Expression still may have jump lists.) +*/ +static void discharge2reg (FuncState *fs, expdesc *e, int reg) { + luaK_dischargevars(fs, e); + switch (e->k) { + case VNIL: { + luaK_nil(fs, reg, 1); + break; + } + case VFALSE: { + luaK_codeABC(fs, OP_LOADFALSE, reg, 0, 0); + break; + } + case VTRUE: { + luaK_codeABC(fs, OP_LOADTRUE, reg, 0, 0); + break; + } + case VKSTR: { + str2K(fs, e); + } /* FALLTHROUGH */ + case VK: { + luaK_codek(fs, reg, e->u.info); + break; + } + case VKFLT: { + luaK_float(fs, reg, e->u.nval); + break; + } + case VKINT: { + luaK_int(fs, reg, e->u.ival); + break; + } + case VRELOC: { + Instruction *pc = &getinstruction(fs, e); + SETARG_A(*pc, reg); /* instruction will put result in 'reg' */ + break; + } + case VNONRELOC: { + if (reg != e->u.info) + luaK_codeABC(fs, OP_MOVE, reg, e->u.info, 0); + break; + } + default: { + lua_assert(e->k == VJMP); + return; /* nothing to do... */ + } + } + e->u.info = reg; + e->k = VNONRELOC; +} + + +/* +** Ensure expression value is in a register, making 'e' a +** non-relocatable expression. +** (Expression still may have jump lists.) +*/ +static void discharge2anyreg (FuncState *fs, expdesc *e) { + if (e->k != VNONRELOC) { /* no fixed register yet? */ + luaK_reserveregs(fs, 1); /* get a register */ + discharge2reg(fs, e, fs->freereg-1); /* put value there */ + } +} + + +static int code_loadbool (FuncState *fs, int A, OpCode op) { + luaK_getlabel(fs); /* those instructions may be jump targets */ + return luaK_codeABC(fs, op, A, 0, 0); +} + + +/* +** check whether list has any jump that do not produce a value +** or produce an inverted value +*/ +static int need_value (FuncState *fs, int list) { + for (; list != NO_JUMP; list = getjump(fs, list)) { + Instruction i = *getjumpcontrol(fs, list); + if (GET_OPCODE(i) != OP_TESTSET) return 1; + } + return 0; /* not found */ +} + + +/* +** Ensures final expression result (which includes results from its +** jump lists) is in register 'reg'. +** If expression has jumps, need to patch these jumps either to +** its final position or to "load" instructions (for those tests +** that do not produce values). +*/ +static void exp2reg (FuncState *fs, expdesc *e, int reg) { + discharge2reg(fs, e, reg); + if (e->k == VJMP) /* expression itself is a test? */ + luaK_concat(fs, &e->t, e->u.info); /* put this jump in 't' list */ + if (hasjumps(e)) { + int final; /* position after whole expression */ + int p_f = NO_JUMP; /* position of an eventual LOAD false */ + int p_t = NO_JUMP; /* position of an eventual LOAD true */ + if (need_value(fs, e->t) || need_value(fs, e->f)) { + int fj = (e->k == VJMP) ? NO_JUMP : luaK_jump(fs); + p_f = code_loadbool(fs, reg, OP_LFALSESKIP); /* skip next inst. */ + p_t = code_loadbool(fs, reg, OP_LOADTRUE); + /* jump around these booleans if 'e' is not a test */ + luaK_patchtohere(fs, fj); + } + final = luaK_getlabel(fs); + patchlistaux(fs, e->f, final, reg, p_f); + patchlistaux(fs, e->t, final, reg, p_t); + } + e->f = e->t = NO_JUMP; + e->u.info = reg; + e->k = VNONRELOC; +} + + +/* +** Ensures final expression result is in next available register. +*/ +void luaK_exp2nextreg (FuncState *fs, expdesc *e) { + luaK_dischargevars(fs, e); + freeexp(fs, e); + luaK_reserveregs(fs, 1); + exp2reg(fs, e, fs->freereg - 1); +} + + +/* +** Ensures final expression result is in some (any) register +** and return that register. +*/ +int luaK_exp2anyreg (FuncState *fs, expdesc *e) { + luaK_dischargevars(fs, e); + if (e->k == VNONRELOC) { /* expression already has a register? */ + if (!hasjumps(e)) /* no jumps? */ + return e->u.info; /* result is already in a register */ + if (e->u.info >= luaY_nvarstack(fs)) { /* reg. is not a local? */ + exp2reg(fs, e, e->u.info); /* put final result in it */ + return e->u.info; + } + /* else expression has jumps and cannot change its register + to hold the jump values, because it is a local variable. + Go through to the default case. */ + } + luaK_exp2nextreg(fs, e); /* default: use next available register */ + return e->u.info; +} + + +/* +** Ensures final expression result is either in a register +** or in an upvalue. +*/ +void luaK_exp2anyregup (FuncState *fs, expdesc *e) { + if (e->k != VUPVAL || hasjumps(e)) + luaK_exp2anyreg(fs, e); +} + + +/* +** Ensures final expression result is either in a register +** or it is a constant. +*/ +void luaK_exp2val (FuncState *fs, expdesc *e) { + if (e->k == VJMP || hasjumps(e)) + luaK_exp2anyreg(fs, e); + else + luaK_dischargevars(fs, e); +} + + +/* +** Try to make 'e' a K expression with an index in the range of R/K +** indices. Return true iff succeeded. +*/ +static int luaK_exp2K (FuncState *fs, expdesc *e) { + if (!hasjumps(e)) { + int info; + switch (e->k) { /* move constants to 'k' */ + case VTRUE: info = boolT(fs); break; + case VFALSE: info = boolF(fs); break; + case VNIL: info = nilK(fs); break; + case VKINT: info = luaK_intK(fs, e->u.ival); break; + case VKFLT: info = luaK_numberK(fs, e->u.nval); break; + case VKSTR: info = stringK(fs, e->u.strval); break; + case VK: info = e->u.info; break; + default: return 0; /* not a constant */ + } + if (info <= MAXINDEXRK) { /* does constant fit in 'argC'? */ + e->k = VK; /* make expression a 'K' expression */ + e->u.info = info; + return 1; + } + } + /* else, expression doesn't fit; leave it unchanged */ + return 0; +} + + +/* +** Ensures final expression result is in a valid R/K index +** (that is, it is either in a register or in 'k' with an index +** in the range of R/K indices). +** Returns 1 iff expression is K. +*/ +static int exp2RK (FuncState *fs, expdesc *e) { + if (luaK_exp2K(fs, e)) + return 1; + else { /* not a constant in the right range: put it in a register */ + luaK_exp2anyreg(fs, e); + return 0; + } +} + + +static void codeABRK (FuncState *fs, OpCode o, int a, int b, + expdesc *ec) { + int k = exp2RK(fs, ec); + luaK_codeABCk(fs, o, a, b, ec->u.info, k); +} + + +/* +** Generate code to store result of expression 'ex' into variable 'var'. +*/ +void luaK_storevar (FuncState *fs, expdesc *var, expdesc *ex) { + switch (var->k) { + case VLOCAL: { + freeexp(fs, ex); + exp2reg(fs, ex, var->u.var.ridx); /* compute 'ex' into proper place */ + return; + } + case VUPVAL: { + int e = luaK_exp2anyreg(fs, ex); + luaK_codeABC(fs, OP_SETUPVAL, e, var->u.info, 0); + break; + } + case VINDEXUP: { + codeABRK(fs, OP_SETTABUP, var->u.ind.t, var->u.ind.idx, ex); + break; + } + case VINDEXI: { + codeABRK(fs, OP_SETI, var->u.ind.t, var->u.ind.idx, ex); + break; + } + case VINDEXSTR: { + codeABRK(fs, OP_SETFIELD, var->u.ind.t, var->u.ind.idx, ex); + break; + } + case VINDEXED: { + codeABRK(fs, OP_SETTABLE, var->u.ind.t, var->u.ind.idx, ex); + break; + } + default: lua_assert(0); /* invalid var kind to store */ + } + freeexp(fs, ex); +} + + +/* +** Emit SELF instruction (convert expression 'e' into 'e:key(e,'). +*/ +void luaK_self (FuncState *fs, expdesc *e, expdesc *key) { + int ereg; + luaK_exp2anyreg(fs, e); + ereg = e->u.info; /* register where 'e' was placed */ + freeexp(fs, e); + e->u.info = fs->freereg; /* base register for op_self */ + e->k = VNONRELOC; /* self expression has a fixed register */ + luaK_reserveregs(fs, 2); /* function and 'self' produced by op_self */ + codeABRK(fs, OP_SELF, e->u.info, ereg, key); + freeexp(fs, key); +} + + +/* +** Negate condition 'e' (where 'e' is a comparison). +*/ +static void negatecondition (FuncState *fs, expdesc *e) { + Instruction *pc = getjumpcontrol(fs, e->u.info); + lua_assert(testTMode(GET_OPCODE(*pc)) && GET_OPCODE(*pc) != OP_TESTSET && + GET_OPCODE(*pc) != OP_TEST); + SETARG_k(*pc, (GETARG_k(*pc) ^ 1)); +} + + +/* +** Emit instruction to jump if 'e' is 'cond' (that is, if 'cond' +** is true, code will jump if 'e' is true.) Return jump position. +** Optimize when 'e' is 'not' something, inverting the condition +** and removing the 'not'. +*/ +static int jumponcond (FuncState *fs, expdesc *e, int cond) { + if (e->k == VRELOC) { + Instruction ie = getinstruction(fs, e); + if (GET_OPCODE(ie) == OP_NOT) { + removelastinstruction(fs); /* remove previous OP_NOT */ + return condjump(fs, OP_TEST, GETARG_B(ie), 0, 0, !cond); + } + /* else go through */ + } + discharge2anyreg(fs, e); + freeexp(fs, e); + return condjump(fs, OP_TESTSET, NO_REG, e->u.info, 0, cond); +} + + +/* +** Emit code to go through if 'e' is true, jump otherwise. +*/ +void luaK_goiftrue (FuncState *fs, expdesc *e) { + int pc; /* pc of new jump */ + luaK_dischargevars(fs, e); + switch (e->k) { + case VJMP: { /* condition? */ + negatecondition(fs, e); /* jump when it is false */ + pc = e->u.info; /* save jump position */ + break; + } + case VK: case VKFLT: case VKINT: case VKSTR: case VTRUE: { + pc = NO_JUMP; /* always true; do nothing */ + break; + } + default: { + pc = jumponcond(fs, e, 0); /* jump when false */ + break; + } + } + luaK_concat(fs, &e->f, pc); /* insert new jump in false list */ + luaK_patchtohere(fs, e->t); /* true list jumps to here (to go through) */ + e->t = NO_JUMP; +} + + +/* +** Emit code to go through if 'e' is false, jump otherwise. +*/ +void luaK_goiffalse (FuncState *fs, expdesc *e) { + int pc; /* pc of new jump */ + luaK_dischargevars(fs, e); + switch (e->k) { + case VJMP: { + pc = e->u.info; /* already jump if true */ + break; + } + case VNIL: case VFALSE: { + pc = NO_JUMP; /* always false; do nothing */ + break; + } + default: { + pc = jumponcond(fs, e, 1); /* jump if true */ + break; + } + } + luaK_concat(fs, &e->t, pc); /* insert new jump in 't' list */ + luaK_patchtohere(fs, e->f); /* false list jumps to here (to go through) */ + e->f = NO_JUMP; +} + + +/* +** Code 'not e', doing constant folding. +*/ +static void codenot (FuncState *fs, expdesc *e) { + switch (e->k) { + case VNIL: case VFALSE: { + e->k = VTRUE; /* true == not nil == not false */ + break; + } + case VK: case VKFLT: case VKINT: case VKSTR: case VTRUE: { + e->k = VFALSE; /* false == not "x" == not 0.5 == not 1 == not true */ + break; + } + case VJMP: { + negatecondition(fs, e); + break; + } + case VRELOC: + case VNONRELOC: { + discharge2anyreg(fs, e); + freeexp(fs, e); + e->u.info = luaK_codeABC(fs, OP_NOT, 0, e->u.info, 0); + e->k = VRELOC; + break; + } + default: lua_assert(0); /* cannot happen */ + } + /* interchange true and false lists */ + { int temp = e->f; e->f = e->t; e->t = temp; } + removevalues(fs, e->f); /* values are useless when negated */ + removevalues(fs, e->t); +} + + +/* +** Check whether expression 'e' is a short literal string +*/ +static int isKstr (FuncState *fs, expdesc *e) { + return (e->k == VK && !hasjumps(e) && e->u.info <= MAXARG_B && + ttisshrstring(&fs->f->k[e->u.info])); +} + +/* +** Check whether expression 'e' is a literal integer. +*/ +static int isKint (expdesc *e) { + return (e->k == VKINT && !hasjumps(e)); +} + + +/* +** Check whether expression 'e' is a literal integer in +** proper range to fit in register C +*/ +static int isCint (expdesc *e) { + return isKint(e) && (l_castS2U(e->u.ival) <= l_castS2U(MAXARG_C)); +} + + +/* +** Check whether expression 'e' is a literal integer in +** proper range to fit in register sC +*/ +static int isSCint (expdesc *e) { + return isKint(e) && fitsC(e->u.ival); +} + + +/* +** Check whether expression 'e' is a literal integer or float in +** proper range to fit in a register (sB or sC). +*/ +static int isSCnumber (expdesc *e, int *pi, int *isfloat) { + lua_Integer i; + if (e->k == VKINT) + i = e->u.ival; + else if (e->k == VKFLT && luaV_flttointeger(e->u.nval, &i, F2Ieq)) + *isfloat = 1; + else + return 0; /* not a number */ + if (!hasjumps(e) && fitsC(i)) { + *pi = int2sC(cast_int(i)); + return 1; + } + else + return 0; +} + + +/* +** Create expression 't[k]'. 't' must have its final result already in a +** register or upvalue. Upvalues can only be indexed by literal strings. +** Keys can be literal strings in the constant table or arbitrary +** values in registers. +*/ +void luaK_indexed (FuncState *fs, expdesc *t, expdesc *k) { + if (k->k == VKSTR) + str2K(fs, k); + lua_assert(!hasjumps(t) && + (t->k == VLOCAL || t->k == VNONRELOC || t->k == VUPVAL)); + if (t->k == VUPVAL && !isKstr(fs, k)) /* upvalue indexed by non 'Kstr'? */ + luaK_exp2anyreg(fs, t); /* put it in a register */ + if (t->k == VUPVAL) { + int temp = t->u.info; /* upvalue index */ + lua_assert(isKstr(fs, k)); + t->u.ind.t = temp; /* (can't do a direct assignment; values overlap) */ + t->u.ind.idx = k->u.info; /* literal short string */ + t->k = VINDEXUP; + } + else { + /* register index of the table */ + t->u.ind.t = (t->k == VLOCAL) ? t->u.var.ridx: t->u.info; + if (isKstr(fs, k)) { + t->u.ind.idx = k->u.info; /* literal short string */ + t->k = VINDEXSTR; + } + else if (isCint(k)) { + t->u.ind.idx = cast_int(k->u.ival); /* int. constant in proper range */ + t->k = VINDEXI; + } + else { + t->u.ind.idx = luaK_exp2anyreg(fs, k); /* register */ + t->k = VINDEXED; + } + } +} + + +/* +** Return false if folding can raise an error. +** Bitwise operations need operands convertible to integers; division +** operations cannot have 0 as divisor. +*/ +static int validop (int op, TValue *v1, TValue *v2) { + switch (op) { + case LUA_OPBAND: case LUA_OPBOR: case LUA_OPBXOR: + case LUA_OPSHL: case LUA_OPSHR: case LUA_OPBNOT: { /* conversion errors */ + lua_Integer i; + return (luaV_tointegerns(v1, &i, LUA_FLOORN2I) && + luaV_tointegerns(v2, &i, LUA_FLOORN2I)); + } + case LUA_OPDIV: case LUA_OPIDIV: case LUA_OPMOD: /* division by 0 */ + return (nvalue(v2) != 0); + default: return 1; /* everything else is valid */ + } +} + + +/* +** Try to "constant-fold" an operation; return 1 iff successful. +** (In this case, 'e1' has the final result.) +*/ +static int constfolding (FuncState *fs, int op, expdesc *e1, + const expdesc *e2) { + TValue v1, v2, res; + if (!tonumeral(e1, &v1) || !tonumeral(e2, &v2) || !validop(op, &v1, &v2)) + return 0; /* non-numeric operands or not safe to fold */ + luaO_rawarith(fs->ls->L, op, &v1, &v2, &res); /* does operation */ + if (ttisinteger(&res)) { + e1->k = VKINT; + e1->u.ival = ivalue(&res); + } + else { /* folds neither NaN nor 0.0 (to avoid problems with -0.0) */ + lua_Number n = fltvalue(&res); + if (luai_numisnan(n) || n == 0) + return 0; + e1->k = VKFLT; + e1->u.nval = n; + } + return 1; +} + + +/* +** Convert a BinOpr to an OpCode (ORDER OPR - ORDER OP) +*/ +l_sinline OpCode binopr2op (BinOpr opr, BinOpr baser, OpCode base) { + lua_assert(baser <= opr && + ((baser == OPR_ADD && opr <= OPR_SHR) || + (baser == OPR_LT && opr <= OPR_LE))); + return cast(OpCode, (cast_int(opr) - cast_int(baser)) + cast_int(base)); +} + + +/* +** Convert a UnOpr to an OpCode (ORDER OPR - ORDER OP) +*/ +l_sinline OpCode unopr2op (UnOpr opr) { + return cast(OpCode, (cast_int(opr) - cast_int(OPR_MINUS)) + + cast_int(OP_UNM)); +} + + +/* +** Convert a BinOpr to a tag method (ORDER OPR - ORDER TM) +*/ +l_sinline TMS binopr2TM (BinOpr opr) { + lua_assert(OPR_ADD <= opr && opr <= OPR_SHR); + return cast(TMS, (cast_int(opr) - cast_int(OPR_ADD)) + cast_int(TM_ADD)); +} + + +/* +** Emit code for unary expressions that "produce values" +** (everything but 'not'). +** Expression to produce final result will be encoded in 'e'. +*/ +static void codeunexpval (FuncState *fs, OpCode op, expdesc *e, int line) { + int r = luaK_exp2anyreg(fs, e); /* opcodes operate only on registers */ + freeexp(fs, e); + e->u.info = luaK_codeABC(fs, op, 0, r, 0); /* generate opcode */ + e->k = VRELOC; /* all those operations are relocatable */ + luaK_fixline(fs, line); +} + + +/* +** Emit code for binary expressions that "produce values" +** (everything but logical operators 'and'/'or' and comparison +** operators). +** Expression to produce final result will be encoded in 'e1'. +*/ +static void finishbinexpval (FuncState *fs, expdesc *e1, expdesc *e2, + OpCode op, int v2, int flip, int line, + OpCode mmop, TMS event) { + int v1 = luaK_exp2anyreg(fs, e1); + int pc = luaK_codeABCk(fs, op, 0, v1, v2, 0); + freeexps(fs, e1, e2); + e1->u.info = pc; + e1->k = VRELOC; /* all those operations are relocatable */ + luaK_fixline(fs, line); + luaK_codeABCk(fs, mmop, v1, v2, event, flip); /* to call metamethod */ + luaK_fixline(fs, line); +} + + +/* +** Emit code for binary expressions that "produce values" over +** two registers. +*/ +static void codebinexpval (FuncState *fs, BinOpr opr, + expdesc *e1, expdesc *e2, int line) { + OpCode op = binopr2op(opr, OPR_ADD, OP_ADD); + int v2 = luaK_exp2anyreg(fs, e2); /* make sure 'e2' is in a register */ + /* 'e1' must be already in a register or it is a constant */ + lua_assert((VNIL <= e1->k && e1->k <= VKSTR) || + e1->k == VNONRELOC || e1->k == VRELOC); + lua_assert(OP_ADD <= op && op <= OP_SHR); + finishbinexpval(fs, e1, e2, op, v2, 0, line, OP_MMBIN, binopr2TM(opr)); +} + + +/* +** Code binary operators with immediate operands. +*/ +static void codebini (FuncState *fs, OpCode op, + expdesc *e1, expdesc *e2, int flip, int line, + TMS event) { + int v2 = int2sC(cast_int(e2->u.ival)); /* immediate operand */ + lua_assert(e2->k == VKINT); + finishbinexpval(fs, e1, e2, op, v2, flip, line, OP_MMBINI, event); +} + + +/* +** Code binary operators with K operand. +*/ +static void codebinK (FuncState *fs, BinOpr opr, + expdesc *e1, expdesc *e2, int flip, int line) { + TMS event = binopr2TM(opr); + int v2 = e2->u.info; /* K index */ + OpCode op = binopr2op(opr, OPR_ADD, OP_ADDK); + finishbinexpval(fs, e1, e2, op, v2, flip, line, OP_MMBINK, event); +} + + +/* Try to code a binary operator negating its second operand. +** For the metamethod, 2nd operand must keep its original value. +*/ +static int finishbinexpneg (FuncState *fs, expdesc *e1, expdesc *e2, + OpCode op, int line, TMS event) { + if (!isKint(e2)) + return 0; /* not an integer constant */ + else { + lua_Integer i2 = e2->u.ival; + if (!(fitsC(i2) && fitsC(-i2))) + return 0; /* not in the proper range */ + else { /* operating a small integer constant */ + int v2 = cast_int(i2); + finishbinexpval(fs, e1, e2, op, int2sC(-v2), 0, line, OP_MMBINI, event); + /* correct metamethod argument */ + SETARG_B(fs->f->code[fs->pc - 1], int2sC(v2)); + return 1; /* successfully coded */ + } + } +} + + +static void swapexps (expdesc *e1, expdesc *e2) { + expdesc temp = *e1; *e1 = *e2; *e2 = temp; /* swap 'e1' and 'e2' */ +} + + +/* +** Code binary operators with no constant operand. +*/ +static void codebinNoK (FuncState *fs, BinOpr opr, + expdesc *e1, expdesc *e2, int flip, int line) { + if (flip) + swapexps(e1, e2); /* back to original order */ + codebinexpval(fs, opr, e1, e2, line); /* use standard operators */ +} + + +/* +** Code arithmetic operators ('+', '-', ...). If second operand is a +** constant in the proper range, use variant opcodes with K operands. +*/ +static void codearith (FuncState *fs, BinOpr opr, + expdesc *e1, expdesc *e2, int flip, int line) { + if (tonumeral(e2, NULL) && luaK_exp2K(fs, e2)) /* K operand? */ + codebinK(fs, opr, e1, e2, flip, line); + else /* 'e2' is neither an immediate nor a K operand */ + codebinNoK(fs, opr, e1, e2, flip, line); +} + + +/* +** Code commutative operators ('+', '*'). If first operand is a +** numeric constant, change order of operands to try to use an +** immediate or K operator. +*/ +static void codecommutative (FuncState *fs, BinOpr op, + expdesc *e1, expdesc *e2, int line) { + int flip = 0; + if (tonumeral(e1, NULL)) { /* is first operand a numeric constant? */ + swapexps(e1, e2); /* change order */ + flip = 1; + } + if (op == OPR_ADD && isSCint(e2)) /* immediate operand? */ + codebini(fs, OP_ADDI, e1, e2, flip, line, TM_ADD); + else + codearith(fs, op, e1, e2, flip, line); +} + + +/* +** Code bitwise operations; they are all commutative, so the function +** tries to put an integer constant as the 2nd operand (a K operand). +*/ +static void codebitwise (FuncState *fs, BinOpr opr, + expdesc *e1, expdesc *e2, int line) { + int flip = 0; + if (e1->k == VKINT) { + swapexps(e1, e2); /* 'e2' will be the constant operand */ + flip = 1; + } + if (e2->k == VKINT && luaK_exp2K(fs, e2)) /* K operand? */ + codebinK(fs, opr, e1, e2, flip, line); + else /* no constants */ + codebinNoK(fs, opr, e1, e2, flip, line); +} + + +/* +** Emit code for order comparisons. When using an immediate operand, +** 'isfloat' tells whether the original value was a float. +*/ +static void codeorder (FuncState *fs, BinOpr opr, expdesc *e1, expdesc *e2) { + int r1, r2; + int im; + int isfloat = 0; + OpCode op; + if (isSCnumber(e2, &im, &isfloat)) { + /* use immediate operand */ + r1 = luaK_exp2anyreg(fs, e1); + r2 = im; + op = binopr2op(opr, OPR_LT, OP_LTI); + } + else if (isSCnumber(e1, &im, &isfloat)) { + /* transform (A < B) to (B > A) and (A <= B) to (B >= A) */ + r1 = luaK_exp2anyreg(fs, e2); + r2 = im; + op = binopr2op(opr, OPR_LT, OP_GTI); + } + else { /* regular case, compare two registers */ + r1 = luaK_exp2anyreg(fs, e1); + r2 = luaK_exp2anyreg(fs, e2); + op = binopr2op(opr, OPR_LT, OP_LT); + } + freeexps(fs, e1, e2); + e1->u.info = condjump(fs, op, r1, r2, isfloat, 1); + e1->k = VJMP; +} + + +/* +** Emit code for equality comparisons ('==', '~='). +** 'e1' was already put as RK by 'luaK_infix'. +*/ +static void codeeq (FuncState *fs, BinOpr opr, expdesc *e1, expdesc *e2) { + int r1, r2; + int im; + int isfloat = 0; /* not needed here, but kept for symmetry */ + OpCode op; + if (e1->k != VNONRELOC) { + lua_assert(e1->k == VK || e1->k == VKINT || e1->k == VKFLT); + swapexps(e1, e2); + } + r1 = luaK_exp2anyreg(fs, e1); /* 1st expression must be in register */ + if (isSCnumber(e2, &im, &isfloat)) { + op = OP_EQI; + r2 = im; /* immediate operand */ + } + else if (exp2RK(fs, e2)) { /* 2nd expression is constant? */ + op = OP_EQK; + r2 = e2->u.info; /* constant index */ + } + else { + op = OP_EQ; /* will compare two registers */ + r2 = luaK_exp2anyreg(fs, e2); + } + freeexps(fs, e1, e2); + e1->u.info = condjump(fs, op, r1, r2, isfloat, (opr == OPR_EQ)); + e1->k = VJMP; +} + + +/* +** Apply prefix operation 'op' to expression 'e'. +*/ +void luaK_prefix (FuncState *fs, UnOpr opr, expdesc *e, int line) { + static const expdesc ef = {VKINT, {0}, NO_JUMP, NO_JUMP}; + luaK_dischargevars(fs, e); + switch (opr) { + case OPR_MINUS: case OPR_BNOT: /* use 'ef' as fake 2nd operand */ + if (constfolding(fs, opr + LUA_OPUNM, e, &ef)) + break; + /* else */ /* FALLTHROUGH */ + case OPR_LEN: + codeunexpval(fs, unopr2op(opr), e, line); + break; + case OPR_NOT: codenot(fs, e); break; + default: lua_assert(0); + } +} + + +/* +** Process 1st operand 'v' of binary operation 'op' before reading +** 2nd operand. +*/ +void luaK_infix (FuncState *fs, BinOpr op, expdesc *v) { + luaK_dischargevars(fs, v); + switch (op) { + case OPR_AND: { + luaK_goiftrue(fs, v); /* go ahead only if 'v' is true */ + break; + } + case OPR_OR: { + luaK_goiffalse(fs, v); /* go ahead only if 'v' is false */ + break; + } + case OPR_CONCAT: { + luaK_exp2nextreg(fs, v); /* operand must be on the stack */ + break; + } + case OPR_ADD: case OPR_SUB: + case OPR_MUL: case OPR_DIV: case OPR_IDIV: + case OPR_MOD: case OPR_POW: + case OPR_BAND: case OPR_BOR: case OPR_BXOR: + case OPR_SHL: case OPR_SHR: { + if (!tonumeral(v, NULL)) + luaK_exp2anyreg(fs, v); + /* else keep numeral, which may be folded or used as an immediate + operand */ + break; + } + case OPR_EQ: case OPR_NE: { + if (!tonumeral(v, NULL)) + exp2RK(fs, v); + /* else keep numeral, which may be an immediate operand */ + break; + } + case OPR_LT: case OPR_LE: + case OPR_GT: case OPR_GE: { + int dummy, dummy2; + if (!isSCnumber(v, &dummy, &dummy2)) + luaK_exp2anyreg(fs, v); + /* else keep numeral, which may be an immediate operand */ + break; + } + default: lua_assert(0); + } +} + +/* +** Create code for '(e1 .. e2)'. +** For '(e1 .. e2.1 .. e2.2)' (which is '(e1 .. (e2.1 .. e2.2))', +** because concatenation is right associative), merge both CONCATs. +*/ +static void codeconcat (FuncState *fs, expdesc *e1, expdesc *e2, int line) { + Instruction *ie2 = previousinstruction(fs); + if (GET_OPCODE(*ie2) == OP_CONCAT) { /* is 'e2' a concatenation? */ + int n = GETARG_B(*ie2); /* # of elements concatenated in 'e2' */ + lua_assert(e1->u.info + 1 == GETARG_A(*ie2)); + freeexp(fs, e2); + SETARG_A(*ie2, e1->u.info); /* correct first element ('e1') */ + SETARG_B(*ie2, n + 1); /* will concatenate one more element */ + } + else { /* 'e2' is not a concatenation */ + luaK_codeABC(fs, OP_CONCAT, e1->u.info, 2, 0); /* new concat opcode */ + freeexp(fs, e2); + luaK_fixline(fs, line); + } +} + + +/* +** Finalize code for binary operation, after reading 2nd operand. +*/ +void luaK_posfix (FuncState *fs, BinOpr opr, + expdesc *e1, expdesc *e2, int line) { + luaK_dischargevars(fs, e2); + if (foldbinop(opr) && constfolding(fs, opr + LUA_OPADD, e1, e2)) + return; /* done by folding */ + switch (opr) { + case OPR_AND: { + lua_assert(e1->t == NO_JUMP); /* list closed by 'luaK_infix' */ + luaK_concat(fs, &e2->f, e1->f); + *e1 = *e2; + break; + } + case OPR_OR: { + lua_assert(e1->f == NO_JUMP); /* list closed by 'luaK_infix' */ + luaK_concat(fs, &e2->t, e1->t); + *e1 = *e2; + break; + } + case OPR_CONCAT: { /* e1 .. e2 */ + luaK_exp2nextreg(fs, e2); + codeconcat(fs, e1, e2, line); + break; + } + case OPR_ADD: case OPR_MUL: { + codecommutative(fs, opr, e1, e2, line); + break; + } + case OPR_SUB: { + if (finishbinexpneg(fs, e1, e2, OP_ADDI, line, TM_SUB)) + break; /* coded as (r1 + -I) */ + /* ELSE */ + } /* FALLTHROUGH */ + case OPR_DIV: case OPR_IDIV: case OPR_MOD: case OPR_POW: { + codearith(fs, opr, e1, e2, 0, line); + break; + } + case OPR_BAND: case OPR_BOR: case OPR_BXOR: { + codebitwise(fs, opr, e1, e2, line); + break; + } + case OPR_SHL: { + if (isSCint(e1)) { + swapexps(e1, e2); + codebini(fs, OP_SHLI, e1, e2, 1, line, TM_SHL); /* I << r2 */ + } + else if (finishbinexpneg(fs, e1, e2, OP_SHRI, line, TM_SHL)) { + /* coded as (r1 >> -I) */; + } + else /* regular case (two registers) */ + codebinexpval(fs, opr, e1, e2, line); + break; + } + case OPR_SHR: { + if (isSCint(e2)) + codebini(fs, OP_SHRI, e1, e2, 0, line, TM_SHR); /* r1 >> I */ + else /* regular case (two registers) */ + codebinexpval(fs, opr, e1, e2, line); + break; + } + case OPR_EQ: case OPR_NE: { + codeeq(fs, opr, e1, e2); + break; + } + case OPR_GT: case OPR_GE: { + /* '(a > b)' <=> '(b < a)'; '(a >= b)' <=> '(b <= a)' */ + swapexps(e1, e2); + opr = cast(BinOpr, (opr - OPR_GT) + OPR_LT); + } /* FALLTHROUGH */ + case OPR_LT: case OPR_LE: { + codeorder(fs, opr, e1, e2); + break; + } + default: lua_assert(0); + } +} + + +/* +** Change line information associated with current position, by removing +** previous info and adding it again with new line. +*/ +void luaK_fixline (FuncState *fs, int line) { + removelastlineinfo(fs); + savelineinfo(fs, fs->f, line); +} + + +void luaK_settablesize (FuncState *fs, int pc, int ra, int asize, int hsize) { + Instruction *inst = &fs->f->code[pc]; + int rb = (hsize != 0) ? luaO_ceillog2(hsize) + 1 : 0; /* hash size */ + int extra = asize / (MAXARG_C + 1); /* higher bits of array size */ + int rc = asize % (MAXARG_C + 1); /* lower bits of array size */ + int k = (extra > 0); /* true iff needs extra argument */ + *inst = CREATE_ABCk(OP_NEWTABLE, ra, rb, rc, k); + *(inst + 1) = CREATE_Ax(OP_EXTRAARG, extra); +} + + +/* +** Emit a SETLIST instruction. +** 'base' is register that keeps table; +** 'nelems' is #table plus those to be stored now; +** 'tostore' is number of values (in registers 'base + 1',...) to add to +** table (or LUA_MULTRET to add up to stack top). +*/ +void luaK_setlist (FuncState *fs, int base, int nelems, int tostore) { + lua_assert(tostore != 0 && tostore <= LFIELDS_PER_FLUSH); + if (tostore == LUA_MULTRET) + tostore = 0; + if (nelems <= MAXARG_C) + luaK_codeABC(fs, OP_SETLIST, base, tostore, nelems); + else { + int extra = nelems / (MAXARG_C + 1); + nelems %= (MAXARG_C + 1); + luaK_codeABCk(fs, OP_SETLIST, base, tostore, nelems, 1); + codeextraarg(fs, extra); + } + fs->freereg = base + 1; /* free registers with list values */ +} + + +/* +** return the final target of a jump (skipping jumps to jumps) +*/ +static int finaltarget (Instruction *code, int i) { + int count; + for (count = 0; count < 100; count++) { /* avoid infinite loops */ + Instruction pc = code[i]; + if (GET_OPCODE(pc) != OP_JMP) + break; + else + i += GETARG_sJ(pc) + 1; + } + return i; +} + + +/* +** Do a final pass over the code of a function, doing small peephole +** optimizations and adjustments. +*/ +void luaK_finish (FuncState *fs) { + int i; + Proto *p = fs->f; + for (i = 0; i < fs->pc; i++) { + Instruction *pc = &p->code[i]; + lua_assert(i == 0 || isOT(*(pc - 1)) == isIT(*pc)); + switch (GET_OPCODE(*pc)) { + case OP_RETURN0: case OP_RETURN1: { + if (!(fs->needclose || p->is_vararg)) + break; /* no extra work */ + /* else use OP_RETURN to do the extra work */ + SET_OPCODE(*pc, OP_RETURN); + } /* FALLTHROUGH */ + case OP_RETURN: case OP_TAILCALL: { + if (fs->needclose) + SETARG_k(*pc, 1); /* signal that it needs to close */ + if (p->is_vararg) + SETARG_C(*pc, p->numparams + 1); /* signal that it is vararg */ + break; + } + case OP_JMP: { + int target = finaltarget(p->code, i); + fixjump(fs, i, target); + break; + } + default: break; + } + } +} diff --git a/vendor/lua-5.4.8/src/lcode.h b/vendor/lua-5.4.8/src/lcode.h new file mode 100644 index 0000000..0b971fc --- /dev/null +++ b/vendor/lua-5.4.8/src/lcode.h @@ -0,0 +1,101 @@ +/* +** $Id: lcode.h $ +** Code generator for Lua +** See Copyright Notice in lua.h +*/ + +#ifndef lcode_h +#define lcode_h + +#include "llex.h" +#include "lobject.h" +#include "lopcodes.h" +#include "lparser.h" + + +/* +** Marks the end of a patch list. It is an invalid value both as an absolute +** address, and as a list link (would link an element to itself). +*/ +#define NO_JUMP (-1) + + +/* +** grep "ORDER OPR" if you change these enums (ORDER OP) +*/ +typedef enum BinOpr { + /* arithmetic operators */ + OPR_ADD, OPR_SUB, OPR_MUL, OPR_MOD, OPR_POW, + OPR_DIV, OPR_IDIV, + /* bitwise operators */ + OPR_BAND, OPR_BOR, OPR_BXOR, + OPR_SHL, OPR_SHR, + /* string operator */ + OPR_CONCAT, + /* comparison operators */ + OPR_EQ, OPR_LT, OPR_LE, + OPR_NE, OPR_GT, OPR_GE, + /* logical operators */ + OPR_AND, OPR_OR, + OPR_NOBINOPR +} BinOpr; + + +/* true if operation is foldable (that is, it is arithmetic or bitwise) */ +#define foldbinop(op) ((op) <= OPR_SHR) + + +#define luaK_codeABC(fs,o,a,b,c) luaK_codeABCk(fs,o,a,b,c,0) + + +typedef enum UnOpr { OPR_MINUS, OPR_BNOT, OPR_NOT, OPR_LEN, OPR_NOUNOPR } UnOpr; + + +/* get (pointer to) instruction of given 'expdesc' */ +#define getinstruction(fs,e) ((fs)->f->code[(e)->u.info]) + + +#define luaK_setmultret(fs,e) luaK_setreturns(fs, e, LUA_MULTRET) + +#define luaK_jumpto(fs,t) luaK_patchlist(fs, luaK_jump(fs), t) + +LUAI_FUNC int luaK_code (FuncState *fs, Instruction i); +LUAI_FUNC int luaK_codeABx (FuncState *fs, OpCode o, int A, unsigned int Bx); +LUAI_FUNC int luaK_codeABCk (FuncState *fs, OpCode o, int A, + int B, int C, int k); +LUAI_FUNC int luaK_exp2const (FuncState *fs, const expdesc *e, TValue *v); +LUAI_FUNC void luaK_fixline (FuncState *fs, int line); +LUAI_FUNC void luaK_nil (FuncState *fs, int from, int n); +LUAI_FUNC void luaK_reserveregs (FuncState *fs, int n); +LUAI_FUNC void luaK_checkstack (FuncState *fs, int n); +LUAI_FUNC void luaK_int (FuncState *fs, int reg, lua_Integer n); +LUAI_FUNC void luaK_dischargevars (FuncState *fs, expdesc *e); +LUAI_FUNC int luaK_exp2anyreg (FuncState *fs, expdesc *e); +LUAI_FUNC void luaK_exp2anyregup (FuncState *fs, expdesc *e); +LUAI_FUNC void luaK_exp2nextreg (FuncState *fs, expdesc *e); +LUAI_FUNC void luaK_exp2val (FuncState *fs, expdesc *e); +LUAI_FUNC void luaK_self (FuncState *fs, expdesc *e, expdesc *key); +LUAI_FUNC void luaK_indexed (FuncState *fs, expdesc *t, expdesc *k); +LUAI_FUNC void luaK_goiftrue (FuncState *fs, expdesc *e); +LUAI_FUNC void luaK_goiffalse (FuncState *fs, expdesc *e); +LUAI_FUNC void luaK_storevar (FuncState *fs, expdesc *var, expdesc *e); +LUAI_FUNC void luaK_setreturns (FuncState *fs, expdesc *e, int nresults); +LUAI_FUNC void luaK_setoneret (FuncState *fs, expdesc *e); +LUAI_FUNC int luaK_jump (FuncState *fs); +LUAI_FUNC void luaK_ret (FuncState *fs, int first, int nret); +LUAI_FUNC void luaK_patchlist (FuncState *fs, int list, int target); +LUAI_FUNC void luaK_patchtohere (FuncState *fs, int list); +LUAI_FUNC void luaK_concat (FuncState *fs, int *l1, int l2); +LUAI_FUNC int luaK_getlabel (FuncState *fs); +LUAI_FUNC void luaK_prefix (FuncState *fs, UnOpr op, expdesc *v, int line); +LUAI_FUNC void luaK_infix (FuncState *fs, BinOpr op, expdesc *v); +LUAI_FUNC void luaK_posfix (FuncState *fs, BinOpr op, expdesc *v1, + expdesc *v2, int line); +LUAI_FUNC void luaK_settablesize (FuncState *fs, int pc, + int ra, int asize, int hsize); +LUAI_FUNC void luaK_setlist (FuncState *fs, int base, int nelems, int tostore); +LUAI_FUNC void luaK_finish (FuncState *fs); +LUAI_FUNC l_noret luaK_semerror (LexState *ls, const char *msg); + + +#endif diff --git a/vendor/lua-5.4.8/src/lcorolib.c b/vendor/lua-5.4.8/src/lcorolib.c new file mode 100644 index 0000000..c64adf0 --- /dev/null +++ b/vendor/lua-5.4.8/src/lcorolib.c @@ -0,0 +1,210 @@ +/* +** $Id: lcorolib.c $ +** Coroutine Library +** See Copyright Notice in lua.h +*/ + +#define lcorolib_c +#define LUA_LIB + +#include "lprefix.h" + + +#include <stdlib.h> + +#include "lua.h" + +#include "lauxlib.h" +#include "lualib.h" + + +static lua_State *getco (lua_State *L) { + lua_State *co = lua_tothread(L, 1); + luaL_argexpected(L, co, 1, "thread"); + return co; +} + + +/* +** Resumes a coroutine. Returns the number of results for non-error +** cases or -1 for errors. +*/ +static int auxresume (lua_State *L, lua_State *co, int narg) { + int status, nres; + if (l_unlikely(!lua_checkstack(co, narg))) { + lua_pushliteral(L, "too many arguments to resume"); + return -1; /* error flag */ + } + lua_xmove(L, co, narg); + status = lua_resume(co, L, narg, &nres); + if (l_likely(status == LUA_OK || status == LUA_YIELD)) { + if (l_unlikely(!lua_checkstack(L, nres + 1))) { + lua_pop(co, nres); /* remove results anyway */ + lua_pushliteral(L, "too many results to resume"); + return -1; /* error flag */ + } + lua_xmove(co, L, nres); /* move yielded values */ + return nres; + } + else { + lua_xmove(co, L, 1); /* move error message */ + return -1; /* error flag */ + } +} + + +static int luaB_coresume (lua_State *L) { + lua_State *co = getco(L); + int r; + r = auxresume(L, co, lua_gettop(L) - 1); + if (l_unlikely(r < 0)) { + lua_pushboolean(L, 0); + lua_insert(L, -2); + return 2; /* return false + error message */ + } + else { + lua_pushboolean(L, 1); + lua_insert(L, -(r + 1)); + return r + 1; /* return true + 'resume' returns */ + } +} + + +static int luaB_auxwrap (lua_State *L) { + lua_State *co = lua_tothread(L, lua_upvalueindex(1)); + int r = auxresume(L, co, lua_gettop(L)); + if (l_unlikely(r < 0)) { /* error? */ + int stat = lua_status(co); + if (stat != LUA_OK && stat != LUA_YIELD) { /* error in the coroutine? */ + stat = lua_closethread(co, L); /* close its tbc variables */ + lua_assert(stat != LUA_OK); + lua_xmove(co, L, 1); /* move error message to the caller */ + } + if (stat != LUA_ERRMEM && /* not a memory error and ... */ + lua_type(L, -1) == LUA_TSTRING) { /* ... error object is a string? */ + luaL_where(L, 1); /* add extra info, if available */ + lua_insert(L, -2); + lua_concat(L, 2); + } + return lua_error(L); /* propagate error */ + } + return r; +} + + +static int luaB_cocreate (lua_State *L) { + lua_State *NL; + luaL_checktype(L, 1, LUA_TFUNCTION); + NL = lua_newthread(L); + lua_pushvalue(L, 1); /* move function to top */ + lua_xmove(L, NL, 1); /* move function from L to NL */ + return 1; +} + + +static int luaB_cowrap (lua_State *L) { + luaB_cocreate(L); + lua_pushcclosure(L, luaB_auxwrap, 1); + return 1; +} + + +static int luaB_yield (lua_State *L) { + return lua_yield(L, lua_gettop(L)); +} + + +#define COS_RUN 0 +#define COS_DEAD 1 +#define COS_YIELD 2 +#define COS_NORM 3 + + +static const char *const statname[] = + {"running", "dead", "suspended", "normal"}; + + +static int auxstatus (lua_State *L, lua_State *co) { + if (L == co) return COS_RUN; + else { + switch (lua_status(co)) { + case LUA_YIELD: + return COS_YIELD; + case LUA_OK: { + lua_Debug ar; + if (lua_getstack(co, 0, &ar)) /* does it have frames? */ + return COS_NORM; /* it is running */ + else if (lua_gettop(co) == 0) + return COS_DEAD; + else + return COS_YIELD; /* initial state */ + } + default: /* some error occurred */ + return COS_DEAD; + } + } +} + + +static int luaB_costatus (lua_State *L) { + lua_State *co = getco(L); + lua_pushstring(L, statname[auxstatus(L, co)]); + return 1; +} + + +static int luaB_yieldable (lua_State *L) { + lua_State *co = lua_isnone(L, 1) ? L : getco(L); + lua_pushboolean(L, lua_isyieldable(co)); + return 1; +} + + +static int luaB_corunning (lua_State *L) { + int ismain = lua_pushthread(L); + lua_pushboolean(L, ismain); + return 2; +} + + +static int luaB_close (lua_State *L) { + lua_State *co = getco(L); + int status = auxstatus(L, co); + switch (status) { + case COS_DEAD: case COS_YIELD: { + status = lua_closethread(co, L); + if (status == LUA_OK) { + lua_pushboolean(L, 1); + return 1; + } + else { + lua_pushboolean(L, 0); + lua_xmove(co, L, 1); /* move error message */ + return 2; + } + } + default: /* normal or running coroutine */ + return luaL_error(L, "cannot close a %s coroutine", statname[status]); + } +} + + +static const luaL_Reg co_funcs[] = { + {"create", luaB_cocreate}, + {"resume", luaB_coresume}, + {"running", luaB_corunning}, + {"status", luaB_costatus}, + {"wrap", luaB_cowrap}, + {"yield", luaB_yield}, + {"isyieldable", luaB_yieldable}, + {"close", luaB_close}, + {NULL, NULL} +}; + + + +LUAMOD_API int luaopen_coroutine (lua_State *L) { + luaL_newlib(L, co_funcs); + return 1; +} + diff --git a/vendor/lua-5.4.8/src/lctype.c b/vendor/lua-5.4.8/src/lctype.c new file mode 100644 index 0000000..9542280 --- /dev/null +++ b/vendor/lua-5.4.8/src/lctype.c @@ -0,0 +1,64 @@ +/* +** $Id: lctype.c $ +** 'ctype' functions for Lua +** See Copyright Notice in lua.h +*/ + +#define lctype_c +#define LUA_CORE + +#include "lprefix.h" + + +#include "lctype.h" + +#if !LUA_USE_CTYPE /* { */ + +#include <limits.h> + + +#if defined (LUA_UCID) /* accept UniCode IDentifiers? */ +/* consider all non-ascii codepoints to be alphabetic */ +#define NONA 0x01 +#else +#define NONA 0x00 /* default */ +#endif + + +LUAI_DDEF const lu_byte luai_ctype_[UCHAR_MAX + 2] = { + 0x00, /* EOZ */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0. */ + 0x00, 0x08, 0x08, 0x08, 0x08, 0x08, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 1. */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0c, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, /* 2. */ + 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, + 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, /* 3. */ + 0x16, 0x16, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, + 0x04, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x05, /* 4. */ + 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, + 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, /* 5. */ + 0x05, 0x05, 0x05, 0x04, 0x04, 0x04, 0x04, 0x05, + 0x04, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x05, /* 6. */ + 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, + 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, /* 7. */ + 0x05, 0x05, 0x05, 0x04, 0x04, 0x04, 0x04, 0x00, + NONA, NONA, NONA, NONA, NONA, NONA, NONA, NONA, /* 8. */ + NONA, NONA, NONA, NONA, NONA, NONA, NONA, NONA, + NONA, NONA, NONA, NONA, NONA, NONA, NONA, NONA, /* 9. */ + NONA, NONA, NONA, NONA, NONA, NONA, NONA, NONA, + NONA, NONA, NONA, NONA, NONA, NONA, NONA, NONA, /* a. */ + NONA, NONA, NONA, NONA, NONA, NONA, NONA, NONA, + NONA, NONA, NONA, NONA, NONA, NONA, NONA, NONA, /* b. */ + NONA, NONA, NONA, NONA, NONA, NONA, NONA, NONA, + 0x00, 0x00, NONA, NONA, NONA, NONA, NONA, NONA, /* c. */ + NONA, NONA, NONA, NONA, NONA, NONA, NONA, NONA, + NONA, NONA, NONA, NONA, NONA, NONA, NONA, NONA, /* d. */ + NONA, NONA, NONA, NONA, NONA, NONA, NONA, NONA, + NONA, NONA, NONA, NONA, NONA, NONA, NONA, NONA, /* e. */ + NONA, NONA, NONA, NONA, NONA, NONA, NONA, NONA, + NONA, NONA, NONA, NONA, NONA, 0x00, 0x00, 0x00, /* f. */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +}; + +#endif /* } */ diff --git a/vendor/lua-5.4.8/src/lctype.h b/vendor/lua-5.4.8/src/lctype.h new file mode 100644 index 0000000..864e190 --- /dev/null +++ b/vendor/lua-5.4.8/src/lctype.h @@ -0,0 +1,101 @@ +/* +** $Id: lctype.h $ +** 'ctype' functions for Lua +** See Copyright Notice in lua.h +*/ + +#ifndef lctype_h +#define lctype_h + +#include "lua.h" + + +/* +** WARNING: the functions defined here do not necessarily correspond +** to the similar functions in the standard C ctype.h. They are +** optimized for the specific needs of Lua. +*/ + +#if !defined(LUA_USE_CTYPE) + +#if 'A' == 65 && '0' == 48 +/* ASCII case: can use its own tables; faster and fixed */ +#define LUA_USE_CTYPE 0 +#else +/* must use standard C ctype */ +#define LUA_USE_CTYPE 1 +#endif + +#endif + + +#if !LUA_USE_CTYPE /* { */ + +#include <limits.h> + +#include "llimits.h" + + +#define ALPHABIT 0 +#define DIGITBIT 1 +#define PRINTBIT 2 +#define SPACEBIT 3 +#define XDIGITBIT 4 + + +#define MASK(B) (1 << (B)) + + +/* +** add 1 to char to allow index -1 (EOZ) +*/ +#define testprop(c,p) (luai_ctype_[(c)+1] & (p)) + +/* +** 'lalpha' (Lua alphabetic) and 'lalnum' (Lua alphanumeric) both include '_' +*/ +#define lislalpha(c) testprop(c, MASK(ALPHABIT)) +#define lislalnum(c) testprop(c, (MASK(ALPHABIT) | MASK(DIGITBIT))) +#define lisdigit(c) testprop(c, MASK(DIGITBIT)) +#define lisspace(c) testprop(c, MASK(SPACEBIT)) +#define lisprint(c) testprop(c, MASK(PRINTBIT)) +#define lisxdigit(c) testprop(c, MASK(XDIGITBIT)) + + +/* +** In ASCII, this 'ltolower' is correct for alphabetic characters and +** for '.'. That is enough for Lua needs. ('check_exp' ensures that +** the character either is an upper-case letter or is unchanged by +** the transformation, which holds for lower-case letters and '.'.) +*/ +#define ltolower(c) \ + check_exp(('A' <= (c) && (c) <= 'Z') || (c) == ((c) | ('A' ^ 'a')), \ + (c) | ('A' ^ 'a')) + + +/* one entry for each character and for -1 (EOZ) */ +LUAI_DDEC(const lu_byte luai_ctype_[UCHAR_MAX + 2];) + + +#else /* }{ */ + +/* +** use standard C ctypes +*/ + +#include <ctype.h> + + +#define lislalpha(c) (isalpha(c) || (c) == '_') +#define lislalnum(c) (isalnum(c) || (c) == '_') +#define lisdigit(c) (isdigit(c)) +#define lisspace(c) (isspace(c)) +#define lisprint(c) (isprint(c)) +#define lisxdigit(c) (isxdigit(c)) + +#define ltolower(c) (tolower(c)) + +#endif /* } */ + +#endif + diff --git a/vendor/lua-5.4.8/src/ldblib.c b/vendor/lua-5.4.8/src/ldblib.c new file mode 100644 index 0000000..6dcbaa9 --- /dev/null +++ b/vendor/lua-5.4.8/src/ldblib.c @@ -0,0 +1,483 @@ +/* +** $Id: ldblib.c $ +** Interface from Lua to its debug API +** See Copyright Notice in lua.h +*/ + +#define ldblib_c +#define LUA_LIB + +#include "lprefix.h" + + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +#include "lua.h" + +#include "lauxlib.h" +#include "lualib.h" + + +/* +** The hook table at registry[HOOKKEY] maps threads to their current +** hook function. +*/ +static const char *const HOOKKEY = "_HOOKKEY"; + + +/* +** If L1 != L, L1 can be in any state, and therefore there are no +** guarantees about its stack space; any push in L1 must be +** checked. +*/ +static void checkstack (lua_State *L, lua_State *L1, int n) { + if (l_unlikely(L != L1 && !lua_checkstack(L1, n))) + luaL_error(L, "stack overflow"); +} + + +static int db_getregistry (lua_State *L) { + lua_pushvalue(L, LUA_REGISTRYINDEX); + return 1; +} + + +static int db_getmetatable (lua_State *L) { + luaL_checkany(L, 1); + if (!lua_getmetatable(L, 1)) { + lua_pushnil(L); /* no metatable */ + } + return 1; +} + + +static int db_setmetatable (lua_State *L) { + int t = lua_type(L, 2); + luaL_argexpected(L, t == LUA_TNIL || t == LUA_TTABLE, 2, "nil or table"); + lua_settop(L, 2); + lua_setmetatable(L, 1); + return 1; /* return 1st argument */ +} + + +static int db_getuservalue (lua_State *L) { + int n = (int)luaL_optinteger(L, 2, 1); + if (lua_type(L, 1) != LUA_TUSERDATA) + luaL_pushfail(L); + else if (lua_getiuservalue(L, 1, n) != LUA_TNONE) { + lua_pushboolean(L, 1); + return 2; + } + return 1; +} + + +static int db_setuservalue (lua_State *L) { + int n = (int)luaL_optinteger(L, 3, 1); + luaL_checktype(L, 1, LUA_TUSERDATA); + luaL_checkany(L, 2); + lua_settop(L, 2); + if (!lua_setiuservalue(L, 1, n)) + luaL_pushfail(L); + return 1; +} + + +/* +** Auxiliary function used by several library functions: check for +** an optional thread as function's first argument and set 'arg' with +** 1 if this argument is present (so that functions can skip it to +** access their other arguments) +*/ +static lua_State *getthread (lua_State *L, int *arg) { + if (lua_isthread(L, 1)) { + *arg = 1; + return lua_tothread(L, 1); + } + else { + *arg = 0; + return L; /* function will operate over current thread */ + } +} + + +/* +** Variations of 'lua_settable', used by 'db_getinfo' to put results +** from 'lua_getinfo' into result table. Key is always a string; +** value can be a string, an int, or a boolean. +*/ +static void settabss (lua_State *L, const char *k, const char *v) { + lua_pushstring(L, v); + lua_setfield(L, -2, k); +} + +static void settabsi (lua_State *L, const char *k, int v) { + lua_pushinteger(L, v); + lua_setfield(L, -2, k); +} + +static void settabsb (lua_State *L, const char *k, int v) { + lua_pushboolean(L, v); + lua_setfield(L, -2, k); +} + + +/* +** In function 'db_getinfo', the call to 'lua_getinfo' may push +** results on the stack; later it creates the result table to put +** these objects. Function 'treatstackoption' puts the result from +** 'lua_getinfo' on top of the result table so that it can call +** 'lua_setfield'. +*/ +static void treatstackoption (lua_State *L, lua_State *L1, const char *fname) { + if (L == L1) + lua_rotate(L, -2, 1); /* exchange object and table */ + else + lua_xmove(L1, L, 1); /* move object to the "main" stack */ + lua_setfield(L, -2, fname); /* put object into table */ +} + + +/* +** Calls 'lua_getinfo' and collects all results in a new table. +** L1 needs stack space for an optional input (function) plus +** two optional outputs (function and line table) from function +** 'lua_getinfo'. +*/ +static int db_getinfo (lua_State *L) { + lua_Debug ar; + int arg; + lua_State *L1 = getthread(L, &arg); + const char *options = luaL_optstring(L, arg+2, "flnSrtu"); + checkstack(L, L1, 3); + luaL_argcheck(L, options[0] != '>', arg + 2, "invalid option '>'"); + if (lua_isfunction(L, arg + 1)) { /* info about a function? */ + options = lua_pushfstring(L, ">%s", options); /* add '>' to 'options' */ + lua_pushvalue(L, arg + 1); /* move function to 'L1' stack */ + lua_xmove(L, L1, 1); + } + else { /* stack level */ + if (!lua_getstack(L1, (int)luaL_checkinteger(L, arg + 1), &ar)) { + luaL_pushfail(L); /* level out of range */ + return 1; + } + } + if (!lua_getinfo(L1, options, &ar)) + return luaL_argerror(L, arg+2, "invalid option"); + lua_newtable(L); /* table to collect results */ + if (strchr(options, 'S')) { + lua_pushlstring(L, ar.source, ar.srclen); + lua_setfield(L, -2, "source"); + settabss(L, "short_src", ar.short_src); + settabsi(L, "linedefined", ar.linedefined); + settabsi(L, "lastlinedefined", ar.lastlinedefined); + settabss(L, "what", ar.what); + } + if (strchr(options, 'l')) + settabsi(L, "currentline", ar.currentline); + if (strchr(options, 'u')) { + settabsi(L, "nups", ar.nups); + settabsi(L, "nparams", ar.nparams); + settabsb(L, "isvararg", ar.isvararg); + } + if (strchr(options, 'n')) { + settabss(L, "name", ar.name); + settabss(L, "namewhat", ar.namewhat); + } + if (strchr(options, 'r')) { + settabsi(L, "ftransfer", ar.ftransfer); + settabsi(L, "ntransfer", ar.ntransfer); + } + if (strchr(options, 't')) + settabsb(L, "istailcall", ar.istailcall); + if (strchr(options, 'L')) + treatstackoption(L, L1, "activelines"); + if (strchr(options, 'f')) + treatstackoption(L, L1, "func"); + return 1; /* return table */ +} + + +static int db_getlocal (lua_State *L) { + int arg; + lua_State *L1 = getthread(L, &arg); + int nvar = (int)luaL_checkinteger(L, arg + 2); /* local-variable index */ + if (lua_isfunction(L, arg + 1)) { /* function argument? */ + lua_pushvalue(L, arg + 1); /* push function */ + lua_pushstring(L, lua_getlocal(L, NULL, nvar)); /* push local name */ + return 1; /* return only name (there is no value) */ + } + else { /* stack-level argument */ + lua_Debug ar; + const char *name; + int level = (int)luaL_checkinteger(L, arg + 1); + if (l_unlikely(!lua_getstack(L1, level, &ar))) /* out of range? */ + return luaL_argerror(L, arg+1, "level out of range"); + checkstack(L, L1, 1); + name = lua_getlocal(L1, &ar, nvar); + if (name) { + lua_xmove(L1, L, 1); /* move local value */ + lua_pushstring(L, name); /* push name */ + lua_rotate(L, -2, 1); /* re-order */ + return 2; + } + else { + luaL_pushfail(L); /* no name (nor value) */ + return 1; + } + } +} + + +static int db_setlocal (lua_State *L) { + int arg; + const char *name; + lua_State *L1 = getthread(L, &arg); + lua_Debug ar; + int level = (int)luaL_checkinteger(L, arg + 1); + int nvar = (int)luaL_checkinteger(L, arg + 2); + if (l_unlikely(!lua_getstack(L1, level, &ar))) /* out of range? */ + return luaL_argerror(L, arg+1, "level out of range"); + luaL_checkany(L, arg+3); + lua_settop(L, arg+3); + checkstack(L, L1, 1); + lua_xmove(L, L1, 1); + name = lua_setlocal(L1, &ar, nvar); + if (name == NULL) + lua_pop(L1, 1); /* pop value (if not popped by 'lua_setlocal') */ + lua_pushstring(L, name); + return 1; +} + + +/* +** get (if 'get' is true) or set an upvalue from a closure +*/ +static int auxupvalue (lua_State *L, int get) { + const char *name; + int n = (int)luaL_checkinteger(L, 2); /* upvalue index */ + luaL_checktype(L, 1, LUA_TFUNCTION); /* closure */ + name = get ? lua_getupvalue(L, 1, n) : lua_setupvalue(L, 1, n); + if (name == NULL) return 0; + lua_pushstring(L, name); + lua_insert(L, -(get+1)); /* no-op if get is false */ + return get + 1; +} + + +static int db_getupvalue (lua_State *L) { + return auxupvalue(L, 1); +} + + +static int db_setupvalue (lua_State *L) { + luaL_checkany(L, 3); + return auxupvalue(L, 0); +} + + +/* +** Check whether a given upvalue from a given closure exists and +** returns its index +*/ +static void *checkupval (lua_State *L, int argf, int argnup, int *pnup) { + void *id; + int nup = (int)luaL_checkinteger(L, argnup); /* upvalue index */ + luaL_checktype(L, argf, LUA_TFUNCTION); /* closure */ + id = lua_upvalueid(L, argf, nup); + if (pnup) { + luaL_argcheck(L, id != NULL, argnup, "invalid upvalue index"); + *pnup = nup; + } + return id; +} + + +static int db_upvalueid (lua_State *L) { + void *id = checkupval(L, 1, 2, NULL); + if (id != NULL) + lua_pushlightuserdata(L, id); + else + luaL_pushfail(L); + return 1; +} + + +static int db_upvaluejoin (lua_State *L) { + int n1, n2; + checkupval(L, 1, 2, &n1); + checkupval(L, 3, 4, &n2); + luaL_argcheck(L, !lua_iscfunction(L, 1), 1, "Lua function expected"); + luaL_argcheck(L, !lua_iscfunction(L, 3), 3, "Lua function expected"); + lua_upvaluejoin(L, 1, n1, 3, n2); + return 0; +} + + +/* +** Call hook function registered at hook table for the current +** thread (if there is one) +*/ +static void hookf (lua_State *L, lua_Debug *ar) { + static const char *const hooknames[] = + {"call", "return", "line", "count", "tail call"}; + lua_getfield(L, LUA_REGISTRYINDEX, HOOKKEY); + lua_pushthread(L); + if (lua_rawget(L, -2) == LUA_TFUNCTION) { /* is there a hook function? */ + lua_pushstring(L, hooknames[(int)ar->event]); /* push event name */ + if (ar->currentline >= 0) + lua_pushinteger(L, ar->currentline); /* push current line */ + else lua_pushnil(L); + lua_assert(lua_getinfo(L, "lS", ar)); + lua_call(L, 2, 0); /* call hook function */ + } +} + + +/* +** Convert a string mask (for 'sethook') into a bit mask +*/ +static int makemask (const char *smask, int count) { + int mask = 0; + if (strchr(smask, 'c')) mask |= LUA_MASKCALL; + if (strchr(smask, 'r')) mask |= LUA_MASKRET; + if (strchr(smask, 'l')) mask |= LUA_MASKLINE; + if (count > 0) mask |= LUA_MASKCOUNT; + return mask; +} + + +/* +** Convert a bit mask (for 'gethook') into a string mask +*/ +static char *unmakemask (int mask, char *smask) { + int i = 0; + if (mask & LUA_MASKCALL) smask[i++] = 'c'; + if (mask & LUA_MASKRET) smask[i++] = 'r'; + if (mask & LUA_MASKLINE) smask[i++] = 'l'; + smask[i] = '\0'; + return smask; +} + + +static int db_sethook (lua_State *L) { + int arg, mask, count; + lua_Hook func; + lua_State *L1 = getthread(L, &arg); + if (lua_isnoneornil(L, arg+1)) { /* no hook? */ + lua_settop(L, arg+1); + func = NULL; mask = 0; count = 0; /* turn off hooks */ + } + else { + const char *smask = luaL_checkstring(L, arg+2); + luaL_checktype(L, arg+1, LUA_TFUNCTION); + count = (int)luaL_optinteger(L, arg + 3, 0); + func = hookf; mask = makemask(smask, count); + } + if (!luaL_getsubtable(L, LUA_REGISTRYINDEX, HOOKKEY)) { + /* table just created; initialize it */ + lua_pushliteral(L, "k"); + lua_setfield(L, -2, "__mode"); /** hooktable.__mode = "k" */ + lua_pushvalue(L, -1); + lua_setmetatable(L, -2); /* metatable(hooktable) = hooktable */ + } + checkstack(L, L1, 1); + lua_pushthread(L1); lua_xmove(L1, L, 1); /* key (thread) */ + lua_pushvalue(L, arg + 1); /* value (hook function) */ + lua_rawset(L, -3); /* hooktable[L1] = new Lua hook */ + lua_sethook(L1, func, mask, count); + return 0; +} + + +static int db_gethook (lua_State *L) { + int arg; + lua_State *L1 = getthread(L, &arg); + char buff[5]; + int mask = lua_gethookmask(L1); + lua_Hook hook = lua_gethook(L1); + if (hook == NULL) { /* no hook? */ + luaL_pushfail(L); + return 1; + } + else if (hook != hookf) /* external hook? */ + lua_pushliteral(L, "external hook"); + else { /* hook table must exist */ + lua_getfield(L, LUA_REGISTRYINDEX, HOOKKEY); + checkstack(L, L1, 1); + lua_pushthread(L1); lua_xmove(L1, L, 1); + lua_rawget(L, -2); /* 1st result = hooktable[L1] */ + lua_remove(L, -2); /* remove hook table */ + } + lua_pushstring(L, unmakemask(mask, buff)); /* 2nd result = mask */ + lua_pushinteger(L, lua_gethookcount(L1)); /* 3rd result = count */ + return 3; +} + + +static int db_debug (lua_State *L) { + for (;;) { + char buffer[250]; + lua_writestringerror("%s", "lua_debug> "); + if (fgets(buffer, sizeof(buffer), stdin) == NULL || + strcmp(buffer, "cont\n") == 0) + return 0; + if (luaL_loadbuffer(L, buffer, strlen(buffer), "=(debug command)") || + lua_pcall(L, 0, 0, 0)) + lua_writestringerror("%s\n", luaL_tolstring(L, -1, NULL)); + lua_settop(L, 0); /* remove eventual returns */ + } +} + + +static int db_traceback (lua_State *L) { + int arg; + lua_State *L1 = getthread(L, &arg); + const char *msg = lua_tostring(L, arg + 1); + if (msg == NULL && !lua_isnoneornil(L, arg + 1)) /* non-string 'msg'? */ + lua_pushvalue(L, arg + 1); /* return it untouched */ + else { + int level = (int)luaL_optinteger(L, arg + 2, (L == L1) ? 1 : 0); + luaL_traceback(L, L1, msg, level); + } + return 1; +} + + +static int db_setcstacklimit (lua_State *L) { + int limit = (int)luaL_checkinteger(L, 1); + int res = lua_setcstacklimit(L, limit); + lua_pushinteger(L, res); + return 1; +} + + +static const luaL_Reg dblib[] = { + {"debug", db_debug}, + {"getuservalue", db_getuservalue}, + {"gethook", db_gethook}, + {"getinfo", db_getinfo}, + {"getlocal", db_getlocal}, + {"getregistry", db_getregistry}, + {"getmetatable", db_getmetatable}, + {"getupvalue", db_getupvalue}, + {"upvaluejoin", db_upvaluejoin}, + {"upvalueid", db_upvalueid}, + {"setuservalue", db_setuservalue}, + {"sethook", db_sethook}, + {"setlocal", db_setlocal}, + {"setmetatable", db_setmetatable}, + {"setupvalue", db_setupvalue}, + {"traceback", db_traceback}, + {"setcstacklimit", db_setcstacklimit}, + {NULL, NULL} +}; + + +LUAMOD_API int luaopen_debug (lua_State *L) { + luaL_newlib(L, dblib); + return 1; +} + diff --git a/vendor/lua-5.4.8/src/ldebug.c b/vendor/lua-5.4.8/src/ldebug.c new file mode 100644 index 0000000..7264fce --- /dev/null +++ b/vendor/lua-5.4.8/src/ldebug.c @@ -0,0 +1,971 @@ +/* +** $Id: ldebug.c $ +** Debug Interface +** See Copyright Notice in lua.h +*/ + +#define ldebug_c +#define LUA_CORE + +#include "lprefix.h" + + +#include <stdarg.h> +#include <stddef.h> +#include <string.h> + +#include "lua.h" + +#include "lapi.h" +#include "lcode.h" +#include "ldebug.h" +#include "ldo.h" +#include "lfunc.h" +#include "lobject.h" +#include "lopcodes.h" +#include "lstate.h" +#include "lstring.h" +#include "ltable.h" +#include "ltm.h" +#include "lvm.h" + + + +#define LuaClosure(f) ((f) != NULL && (f)->c.tt == LUA_VLCL) + + +static const char *funcnamefromcall (lua_State *L, CallInfo *ci, + const char **name); + +static const char strlocal[] = "local"; +static const char strupval[] = "upvalue"; + + +static int currentpc (CallInfo *ci) { + lua_assert(isLua(ci)); + return pcRel(ci->u.l.savedpc, ci_func(ci)->p); +} + + +/* +** Get a "base line" to find the line corresponding to an instruction. +** Base lines are regularly placed at MAXIWTHABS intervals, so usually +** an integer division gets the right place. When the source file has +** large sequences of empty/comment lines, it may need extra entries, +** so the original estimate needs a correction. +** If the original estimate is -1, the initial 'if' ensures that the +** 'while' will run at least once. +** The assertion that the estimate is a lower bound for the correct base +** is valid as long as the debug info has been generated with the same +** value for MAXIWTHABS or smaller. (Previous releases use a little +** smaller value.) +*/ +static int getbaseline (const Proto *f, int pc, int *basepc) { + if (f->sizeabslineinfo == 0 || pc < f->abslineinfo[0].pc) { + *basepc = -1; /* start from the beginning */ + return f->linedefined; + } + else { + int i = cast_uint(pc) / MAXIWTHABS - 1; /* get an estimate */ + /* estimate must be a lower bound of the correct base */ + lua_assert(i < 0 || + (i < f->sizeabslineinfo && f->abslineinfo[i].pc <= pc)); + while (i + 1 < f->sizeabslineinfo && pc >= f->abslineinfo[i + 1].pc) + i++; /* low estimate; adjust it */ + *basepc = f->abslineinfo[i].pc; + return f->abslineinfo[i].line; + } +} + + +/* +** Get the line corresponding to instruction 'pc' in function 'f'; +** first gets a base line and from there does the increments until +** the desired instruction. +*/ +int luaG_getfuncline (const Proto *f, int pc) { + if (f->lineinfo == NULL) /* no debug information? */ + return -1; + else { + int basepc; + int baseline = getbaseline(f, pc, &basepc); + while (basepc++ < pc) { /* walk until given instruction */ + lua_assert(f->lineinfo[basepc] != ABSLINEINFO); + baseline += f->lineinfo[basepc]; /* correct line */ + } + return baseline; + } +} + + +static int getcurrentline (CallInfo *ci) { + return luaG_getfuncline(ci_func(ci)->p, currentpc(ci)); +} + + +/* +** Set 'trap' for all active Lua frames. +** This function can be called during a signal, under "reasonable" +** assumptions. A new 'ci' is completely linked in the list before it +** becomes part of the "active" list, and we assume that pointers are +** atomic; see comment in next function. +** (A compiler doing interprocedural optimizations could, theoretically, +** reorder memory writes in such a way that the list could be +** temporarily broken while inserting a new element. We simply assume it +** has no good reasons to do that.) +*/ +static void settraps (CallInfo *ci) { + for (; ci != NULL; ci = ci->previous) + if (isLua(ci)) + ci->u.l.trap = 1; +} + + +/* +** This function can be called during a signal, under "reasonable" +** assumptions. +** Fields 'basehookcount' and 'hookcount' (set by 'resethookcount') +** are for debug only, and it is no problem if they get arbitrary +** values (causes at most one wrong hook call). 'hookmask' is an atomic +** value. We assume that pointers are atomic too (e.g., gcc ensures that +** for all platforms where it runs). Moreover, 'hook' is always checked +** before being called (see 'luaD_hook'). +*/ +LUA_API void lua_sethook (lua_State *L, lua_Hook func, int mask, int count) { + if (func == NULL || mask == 0) { /* turn off hooks? */ + mask = 0; + func = NULL; + } + L->hook = func; + L->basehookcount = count; + resethookcount(L); + L->hookmask = cast_byte(mask); + if (mask) + settraps(L->ci); /* to trace inside 'luaV_execute' */ +} + + +LUA_API lua_Hook lua_gethook (lua_State *L) { + return L->hook; +} + + +LUA_API int lua_gethookmask (lua_State *L) { + return L->hookmask; +} + + +LUA_API int lua_gethookcount (lua_State *L) { + return L->basehookcount; +} + + +LUA_API int lua_getstack (lua_State *L, int level, lua_Debug *ar) { + int status; + CallInfo *ci; + if (level < 0) return 0; /* invalid (negative) level */ + lua_lock(L); + for (ci = L->ci; level > 0 && ci != &L->base_ci; ci = ci->previous) + level--; + if (level == 0 && ci != &L->base_ci) { /* level found? */ + status = 1; + ar->i_ci = ci; + } + else status = 0; /* no such level */ + lua_unlock(L); + return status; +} + + +static const char *upvalname (const Proto *p, int uv) { + TString *s = check_exp(uv < p->sizeupvalues, p->upvalues[uv].name); + if (s == NULL) return "?"; + else return getstr(s); +} + + +static const char *findvararg (CallInfo *ci, int n, StkId *pos) { + if (clLvalue(s2v(ci->func.p))->p->is_vararg) { + int nextra = ci->u.l.nextraargs; + if (n >= -nextra) { /* 'n' is negative */ + *pos = ci->func.p - nextra - (n + 1); + return "(vararg)"; /* generic name for any vararg */ + } + } + return NULL; /* no such vararg */ +} + + +const char *luaG_findlocal (lua_State *L, CallInfo *ci, int n, StkId *pos) { + StkId base = ci->func.p + 1; + const char *name = NULL; + if (isLua(ci)) { + if (n < 0) /* access to vararg values? */ + return findvararg(ci, n, pos); + else + name = luaF_getlocalname(ci_func(ci)->p, n, currentpc(ci)); + } + if (name == NULL) { /* no 'standard' name? */ + StkId limit = (ci == L->ci) ? L->top.p : ci->next->func.p; + if (limit - base >= n && n > 0) { /* is 'n' inside 'ci' stack? */ + /* generic name for any valid slot */ + name = isLua(ci) ? "(temporary)" : "(C temporary)"; + } + else + return NULL; /* no name */ + } + if (pos) + *pos = base + (n - 1); + return name; +} + + +LUA_API const char *lua_getlocal (lua_State *L, const lua_Debug *ar, int n) { + const char *name; + lua_lock(L); + if (ar == NULL) { /* information about non-active function? */ + if (!isLfunction(s2v(L->top.p - 1))) /* not a Lua function? */ + name = NULL; + else /* consider live variables at function start (parameters) */ + name = luaF_getlocalname(clLvalue(s2v(L->top.p - 1))->p, n, 0); + } + else { /* active function; get information through 'ar' */ + StkId pos = NULL; /* to avoid warnings */ + name = luaG_findlocal(L, ar->i_ci, n, &pos); + if (name) { + setobjs2s(L, L->top.p, pos); + api_incr_top(L); + } + } + lua_unlock(L); + return name; +} + + +LUA_API const char *lua_setlocal (lua_State *L, const lua_Debug *ar, int n) { + StkId pos = NULL; /* to avoid warnings */ + const char *name; + lua_lock(L); + name = luaG_findlocal(L, ar->i_ci, n, &pos); + if (name) { + setobjs2s(L, pos, L->top.p - 1); + L->top.p--; /* pop value */ + } + lua_unlock(L); + return name; +} + + +static void funcinfo (lua_Debug *ar, Closure *cl) { + if (!LuaClosure(cl)) { + ar->source = "=[C]"; + ar->srclen = LL("=[C]"); + ar->linedefined = -1; + ar->lastlinedefined = -1; + ar->what = "C"; + } + else { + const Proto *p = cl->l.p; + if (p->source) { + ar->source = getstr(p->source); + ar->srclen = tsslen(p->source); + } + else { + ar->source = "=?"; + ar->srclen = LL("=?"); + } + ar->linedefined = p->linedefined; + ar->lastlinedefined = p->lastlinedefined; + ar->what = (ar->linedefined == 0) ? "main" : "Lua"; + } + luaO_chunkid(ar->short_src, ar->source, ar->srclen); +} + + +static int nextline (const Proto *p, int currentline, int pc) { + if (p->lineinfo[pc] != ABSLINEINFO) + return currentline + p->lineinfo[pc]; + else + return luaG_getfuncline(p, pc); +} + + +static void collectvalidlines (lua_State *L, Closure *f) { + if (!LuaClosure(f)) { + setnilvalue(s2v(L->top.p)); + api_incr_top(L); + } + else { + const Proto *p = f->l.p; + int currentline = p->linedefined; + Table *t = luaH_new(L); /* new table to store active lines */ + sethvalue2s(L, L->top.p, t); /* push it on stack */ + api_incr_top(L); + if (p->lineinfo != NULL) { /* proto with debug information? */ + int i; + TValue v; + setbtvalue(&v); /* boolean 'true' to be the value of all indices */ + if (!p->is_vararg) /* regular function? */ + i = 0; /* consider all instructions */ + else { /* vararg function */ + lua_assert(GET_OPCODE(p->code[0]) == OP_VARARGPREP); + currentline = nextline(p, currentline, 0); + i = 1; /* skip first instruction (OP_VARARGPREP) */ + } + for (; i < p->sizelineinfo; i++) { /* for each instruction */ + currentline = nextline(p, currentline, i); /* get its line */ + luaH_setint(L, t, currentline, &v); /* table[line] = true */ + } + } + } +} + + +static const char *getfuncname (lua_State *L, CallInfo *ci, const char **name) { + /* calling function is a known function? */ + if (ci != NULL && !(ci->callstatus & CIST_TAIL)) + return funcnamefromcall(L, ci->previous, name); + else return NULL; /* no way to find a name */ +} + + +static int auxgetinfo (lua_State *L, const char *what, lua_Debug *ar, + Closure *f, CallInfo *ci) { + int status = 1; + for (; *what; what++) { + switch (*what) { + case 'S': { + funcinfo(ar, f); + break; + } + case 'l': { + ar->currentline = (ci && isLua(ci)) ? getcurrentline(ci) : -1; + break; + } + case 'u': { + ar->nups = (f == NULL) ? 0 : f->c.nupvalues; + if (!LuaClosure(f)) { + ar->isvararg = 1; + ar->nparams = 0; + } + else { + ar->isvararg = f->l.p->is_vararg; + ar->nparams = f->l.p->numparams; + } + break; + } + case 't': { + ar->istailcall = (ci) ? ci->callstatus & CIST_TAIL : 0; + break; + } + case 'n': { + ar->namewhat = getfuncname(L, ci, &ar->name); + if (ar->namewhat == NULL) { + ar->namewhat = ""; /* not found */ + ar->name = NULL; + } + break; + } + case 'r': { + if (ci == NULL || !(ci->callstatus & CIST_TRAN)) + ar->ftransfer = ar->ntransfer = 0; + else { + ar->ftransfer = ci->u2.transferinfo.ftransfer; + ar->ntransfer = ci->u2.transferinfo.ntransfer; + } + break; + } + case 'L': + case 'f': /* handled by lua_getinfo */ + break; + default: status = 0; /* invalid option */ + } + } + return status; +} + + +LUA_API int lua_getinfo (lua_State *L, const char *what, lua_Debug *ar) { + int status; + Closure *cl; + CallInfo *ci; + TValue *func; + lua_lock(L); + if (*what == '>') { + ci = NULL; + func = s2v(L->top.p - 1); + api_check(L, ttisfunction(func), "function expected"); + what++; /* skip the '>' */ + L->top.p--; /* pop function */ + } + else { + ci = ar->i_ci; + func = s2v(ci->func.p); + lua_assert(ttisfunction(func)); + } + cl = ttisclosure(func) ? clvalue(func) : NULL; + status = auxgetinfo(L, what, ar, cl, ci); + if (strchr(what, 'f')) { + setobj2s(L, L->top.p, func); + api_incr_top(L); + } + if (strchr(what, 'L')) + collectvalidlines(L, cl); + lua_unlock(L); + return status; +} + + +/* +** {====================================================== +** Symbolic Execution +** ======================================================= +*/ + + +static int filterpc (int pc, int jmptarget) { + if (pc < jmptarget) /* is code conditional (inside a jump)? */ + return -1; /* cannot know who sets that register */ + else return pc; /* current position sets that register */ +} + + +/* +** Try to find last instruction before 'lastpc' that modified register 'reg'. +*/ +static int findsetreg (const Proto *p, int lastpc, int reg) { + int pc; + int setreg = -1; /* keep last instruction that changed 'reg' */ + int jmptarget = 0; /* any code before this address is conditional */ + if (testMMMode(GET_OPCODE(p->code[lastpc]))) + lastpc--; /* previous instruction was not actually executed */ + for (pc = 0; pc < lastpc; pc++) { + Instruction i = p->code[pc]; + OpCode op = GET_OPCODE(i); + int a = GETARG_A(i); + int change; /* true if current instruction changed 'reg' */ + switch (op) { + case OP_LOADNIL: { /* set registers from 'a' to 'a+b' */ + int b = GETARG_B(i); + change = (a <= reg && reg <= a + b); + break; + } + case OP_TFORCALL: { /* affect all regs above its base */ + change = (reg >= a + 2); + break; + } + case OP_CALL: + case OP_TAILCALL: { /* affect all registers above base */ + change = (reg >= a); + break; + } + case OP_JMP: { /* doesn't change registers, but changes 'jmptarget' */ + int b = GETARG_sJ(i); + int dest = pc + 1 + b; + /* jump does not skip 'lastpc' and is larger than current one? */ + if (dest <= lastpc && dest > jmptarget) + jmptarget = dest; /* update 'jmptarget' */ + change = 0; + break; + } + default: /* any instruction that sets A */ + change = (testAMode(op) && reg == a); + break; + } + if (change) + setreg = filterpc(pc, jmptarget); + } + return setreg; +} + + +/* +** Find a "name" for the constant 'c'. +*/ +static const char *kname (const Proto *p, int index, const char **name) { + TValue *kvalue = &p->k[index]; + if (ttisstring(kvalue)) { + *name = getstr(tsvalue(kvalue)); + return "constant"; + } + else { + *name = "?"; + return NULL; + } +} + + +static const char *basicgetobjname (const Proto *p, int *ppc, int reg, + const char **name) { + int pc = *ppc; + *name = luaF_getlocalname(p, reg + 1, pc); + if (*name) /* is a local? */ + return strlocal; + /* else try symbolic execution */ + *ppc = pc = findsetreg(p, pc, reg); + if (pc != -1) { /* could find instruction? */ + Instruction i = p->code[pc]; + OpCode op = GET_OPCODE(i); + switch (op) { + case OP_MOVE: { + int b = GETARG_B(i); /* move from 'b' to 'a' */ + if (b < GETARG_A(i)) + return basicgetobjname(p, ppc, b, name); /* get name for 'b' */ + break; + } + case OP_GETUPVAL: { + *name = upvalname(p, GETARG_B(i)); + return strupval; + } + case OP_LOADK: return kname(p, GETARG_Bx(i), name); + case OP_LOADKX: return kname(p, GETARG_Ax(p->code[pc + 1]), name); + default: break; + } + } + return NULL; /* could not find reasonable name */ +} + + +/* +** Find a "name" for the register 'c'. +*/ +static void rname (const Proto *p, int pc, int c, const char **name) { + const char *what = basicgetobjname(p, &pc, c, name); /* search for 'c' */ + if (!(what && *what == 'c')) /* did not find a constant name? */ + *name = "?"; +} + + +/* +** Find a "name" for a 'C' value in an RK instruction. +*/ +static void rkname (const Proto *p, int pc, Instruction i, const char **name) { + int c = GETARG_C(i); /* key index */ + if (GETARG_k(i)) /* is 'c' a constant? */ + kname(p, c, name); + else /* 'c' is a register */ + rname(p, pc, c, name); +} + + +/* +** Check whether table being indexed by instruction 'i' is the +** environment '_ENV'. If the table is an upvalue, get its name; +** otherwise, find some "name" for the table and check whether +** that name is the name of a local variable (and not, for instance, +** a string). Then check that, if there is a name, it is '_ENV'. +*/ +static const char *isEnv (const Proto *p, int pc, Instruction i, int isup) { + int t = GETARG_B(i); /* table index */ + const char *name; /* name of indexed variable */ + if (isup) /* is 't' an upvalue? */ + name = upvalname(p, t); + else { /* 't' is a register */ + const char *what = basicgetobjname(p, &pc, t, &name); + if (what != strlocal && what != strupval) + name = NULL; /* cannot be the variable _ENV */ + } + return (name && strcmp(name, LUA_ENV) == 0) ? "global" : "field"; +} + + +/* +** Extend 'basicgetobjname' to handle table accesses +*/ +static const char *getobjname (const Proto *p, int lastpc, int reg, + const char **name) { + const char *kind = basicgetobjname(p, &lastpc, reg, name); + if (kind != NULL) + return kind; + else if (lastpc != -1) { /* could find instruction? */ + Instruction i = p->code[lastpc]; + OpCode op = GET_OPCODE(i); + switch (op) { + case OP_GETTABUP: { + int k = GETARG_C(i); /* key index */ + kname(p, k, name); + return isEnv(p, lastpc, i, 1); + } + case OP_GETTABLE: { + int k = GETARG_C(i); /* key index */ + rname(p, lastpc, k, name); + return isEnv(p, lastpc, i, 0); + } + case OP_GETI: { + *name = "integer index"; + return "field"; + } + case OP_GETFIELD: { + int k = GETARG_C(i); /* key index */ + kname(p, k, name); + return isEnv(p, lastpc, i, 0); + } + case OP_SELF: { + rkname(p, lastpc, i, name); + return "method"; + } + default: break; /* go through to return NULL */ + } + } + return NULL; /* could not find reasonable name */ +} + + +/* +** Try to find a name for a function based on the code that called it. +** (Only works when function was called by a Lua function.) +** Returns what the name is (e.g., "for iterator", "method", +** "metamethod") and sets '*name' to point to the name. +*/ +static const char *funcnamefromcode (lua_State *L, const Proto *p, + int pc, const char **name) { + TMS tm = (TMS)0; /* (initial value avoids warnings) */ + Instruction i = p->code[pc]; /* calling instruction */ + switch (GET_OPCODE(i)) { + case OP_CALL: + case OP_TAILCALL: + return getobjname(p, pc, GETARG_A(i), name); /* get function name */ + case OP_TFORCALL: { /* for iterator */ + *name = "for iterator"; + return "for iterator"; + } + /* other instructions can do calls through metamethods */ + case OP_SELF: case OP_GETTABUP: case OP_GETTABLE: + case OP_GETI: case OP_GETFIELD: + tm = TM_INDEX; + break; + case OP_SETTABUP: case OP_SETTABLE: case OP_SETI: case OP_SETFIELD: + tm = TM_NEWINDEX; + break; + case OP_MMBIN: case OP_MMBINI: case OP_MMBINK: { + tm = cast(TMS, GETARG_C(i)); + break; + } + case OP_UNM: tm = TM_UNM; break; + case OP_BNOT: tm = TM_BNOT; break; + case OP_LEN: tm = TM_LEN; break; + case OP_CONCAT: tm = TM_CONCAT; break; + case OP_EQ: tm = TM_EQ; break; + /* no cases for OP_EQI and OP_EQK, as they don't call metamethods */ + case OP_LT: case OP_LTI: case OP_GTI: tm = TM_LT; break; + case OP_LE: case OP_LEI: case OP_GEI: tm = TM_LE; break; + case OP_CLOSE: case OP_RETURN: tm = TM_CLOSE; break; + default: + return NULL; /* cannot find a reasonable name */ + } + *name = getshrstr(G(L)->tmname[tm]) + 2; + return "metamethod"; +} + + +/* +** Try to find a name for a function based on how it was called. +*/ +static const char *funcnamefromcall (lua_State *L, CallInfo *ci, + const char **name) { + if (ci->callstatus & CIST_HOOKED) { /* was it called inside a hook? */ + *name = "?"; + return "hook"; + } + else if (ci->callstatus & CIST_FIN) { /* was it called as a finalizer? */ + *name = "__gc"; + return "metamethod"; /* report it as such */ + } + else if (isLua(ci)) + return funcnamefromcode(L, ci_func(ci)->p, currentpc(ci), name); + else + return NULL; +} + +/* }====================================================== */ + + + +/* +** Check whether pointer 'o' points to some value in the stack frame of +** the current function and, if so, returns its index. Because 'o' may +** not point to a value in this stack, we cannot compare it with the +** region boundaries (undefined behavior in ISO C). +*/ +static int instack (CallInfo *ci, const TValue *o) { + int pos; + StkId base = ci->func.p + 1; + for (pos = 0; base + pos < ci->top.p; pos++) { + if (o == s2v(base + pos)) + return pos; + } + return -1; /* not found */ +} + + +/* +** Checks whether value 'o' came from an upvalue. (That can only happen +** with instructions OP_GETTABUP/OP_SETTABUP, which operate directly on +** upvalues.) +*/ +static const char *getupvalname (CallInfo *ci, const TValue *o, + const char **name) { + LClosure *c = ci_func(ci); + int i; + for (i = 0; i < c->nupvalues; i++) { + if (c->upvals[i]->v.p == o) { + *name = upvalname(c->p, i); + return strupval; + } + } + return NULL; +} + + +static const char *formatvarinfo (lua_State *L, const char *kind, + const char *name) { + if (kind == NULL) + return ""; /* no information */ + else + return luaO_pushfstring(L, " (%s '%s')", kind, name); +} + +/* +** Build a string with a "description" for the value 'o', such as +** "variable 'x'" or "upvalue 'y'". +*/ +static const char *varinfo (lua_State *L, const TValue *o) { + CallInfo *ci = L->ci; + const char *name = NULL; /* to avoid warnings */ + const char *kind = NULL; + if (isLua(ci)) { + kind = getupvalname(ci, o, &name); /* check whether 'o' is an upvalue */ + if (!kind) { /* not an upvalue? */ + int reg = instack(ci, o); /* try a register */ + if (reg >= 0) /* is 'o' a register? */ + kind = getobjname(ci_func(ci)->p, currentpc(ci), reg, &name); + } + } + return formatvarinfo(L, kind, name); +} + + +/* +** Raise a type error +*/ +static l_noret typeerror (lua_State *L, const TValue *o, const char *op, + const char *extra) { + const char *t = luaT_objtypename(L, o); + luaG_runerror(L, "attempt to %s a %s value%s", op, t, extra); +} + + +/* +** Raise a type error with "standard" information about the faulty +** object 'o' (using 'varinfo'). +*/ +l_noret luaG_typeerror (lua_State *L, const TValue *o, const char *op) { + typeerror(L, o, op, varinfo(L, o)); +} + + +/* +** Raise an error for calling a non-callable object. Try to find a name +** for the object based on how it was called ('funcnamefromcall'); if it +** cannot get a name there, try 'varinfo'. +*/ +l_noret luaG_callerror (lua_State *L, const TValue *o) { + CallInfo *ci = L->ci; + const char *name = NULL; /* to avoid warnings */ + const char *kind = funcnamefromcall(L, ci, &name); + const char *extra = kind ? formatvarinfo(L, kind, name) : varinfo(L, o); + typeerror(L, o, "call", extra); +} + + +l_noret luaG_forerror (lua_State *L, const TValue *o, const char *what) { + luaG_runerror(L, "bad 'for' %s (number expected, got %s)", + what, luaT_objtypename(L, o)); +} + + +l_noret luaG_concaterror (lua_State *L, const TValue *p1, const TValue *p2) { + if (ttisstring(p1) || cvt2str(p1)) p1 = p2; + luaG_typeerror(L, p1, "concatenate"); +} + + +l_noret luaG_opinterror (lua_State *L, const TValue *p1, + const TValue *p2, const char *msg) { + if (!ttisnumber(p1)) /* first operand is wrong? */ + p2 = p1; /* now second is wrong */ + luaG_typeerror(L, p2, msg); +} + + +/* +** Error when both values are convertible to numbers, but not to integers +*/ +l_noret luaG_tointerror (lua_State *L, const TValue *p1, const TValue *p2) { + lua_Integer temp; + if (!luaV_tointegerns(p1, &temp, LUA_FLOORN2I)) + p2 = p1; + luaG_runerror(L, "number%s has no integer representation", varinfo(L, p2)); +} + + +l_noret luaG_ordererror (lua_State *L, const TValue *p1, const TValue *p2) { + const char *t1 = luaT_objtypename(L, p1); + const char *t2 = luaT_objtypename(L, p2); + if (strcmp(t1, t2) == 0) + luaG_runerror(L, "attempt to compare two %s values", t1); + else + luaG_runerror(L, "attempt to compare %s with %s", t1, t2); +} + + +/* add src:line information to 'msg' */ +const char *luaG_addinfo (lua_State *L, const char *msg, TString *src, + int line) { + char buff[LUA_IDSIZE]; + if (src) + luaO_chunkid(buff, getstr(src), tsslen(src)); + else { /* no source available; use "?" instead */ + buff[0] = '?'; buff[1] = '\0'; + } + return luaO_pushfstring(L, "%s:%d: %s", buff, line, msg); +} + + +l_noret luaG_errormsg (lua_State *L) { + if (L->errfunc != 0) { /* is there an error handling function? */ + StkId errfunc = restorestack(L, L->errfunc); + lua_assert(ttisfunction(s2v(errfunc))); + setobjs2s(L, L->top.p, L->top.p - 1); /* move argument */ + setobjs2s(L, L->top.p - 1, errfunc); /* push function */ + L->top.p++; /* assume EXTRA_STACK */ + luaD_callnoyield(L, L->top.p - 2, 1); /* call it */ + } + luaD_throw(L, LUA_ERRRUN); +} + + +l_noret luaG_runerror (lua_State *L, const char *fmt, ...) { + CallInfo *ci = L->ci; + const char *msg; + va_list argp; + luaC_checkGC(L); /* error message uses memory */ + va_start(argp, fmt); + msg = luaO_pushvfstring(L, fmt, argp); /* format message */ + va_end(argp); + if (isLua(ci)) { /* if Lua function, add source:line information */ + luaG_addinfo(L, msg, ci_func(ci)->p->source, getcurrentline(ci)); + setobjs2s(L, L->top.p - 2, L->top.p - 1); /* remove 'msg' */ + L->top.p--; + } + luaG_errormsg(L); +} + + +/* +** Check whether new instruction 'newpc' is in a different line from +** previous instruction 'oldpc'. More often than not, 'newpc' is only +** one or a few instructions after 'oldpc' (it must be after, see +** caller), so try to avoid calling 'luaG_getfuncline'. If they are +** too far apart, there is a good chance of a ABSLINEINFO in the way, +** so it goes directly to 'luaG_getfuncline'. +*/ +static int changedline (const Proto *p, int oldpc, int newpc) { + if (p->lineinfo == NULL) /* no debug information? */ + return 0; + if (newpc - oldpc < MAXIWTHABS / 2) { /* not too far apart? */ + int delta = 0; /* line difference */ + int pc = oldpc; + for (;;) { + int lineinfo = p->lineinfo[++pc]; + if (lineinfo == ABSLINEINFO) + break; /* cannot compute delta; fall through */ + delta += lineinfo; + if (pc == newpc) + return (delta != 0); /* delta computed successfully */ + } + } + /* either instructions are too far apart or there is an absolute line + info in the way; compute line difference explicitly */ + return (luaG_getfuncline(p, oldpc) != luaG_getfuncline(p, newpc)); +} + + +/* +** Traces Lua calls. If code is running the first instruction of a function, +** and function is not vararg, and it is not coming from an yield, +** calls 'luaD_hookcall'. (Vararg functions will call 'luaD_hookcall' +** after adjusting its variable arguments; otherwise, they could call +** a line/count hook before the call hook. Functions coming from +** an yield already called 'luaD_hookcall' before yielding.) +*/ +int luaG_tracecall (lua_State *L) { + CallInfo *ci = L->ci; + Proto *p = ci_func(ci)->p; + ci->u.l.trap = 1; /* ensure hooks will be checked */ + if (ci->u.l.savedpc == p->code) { /* first instruction (not resuming)? */ + if (p->is_vararg) + return 0; /* hooks will start at VARARGPREP instruction */ + else if (!(ci->callstatus & CIST_HOOKYIELD)) /* not yieded? */ + luaD_hookcall(L, ci); /* check 'call' hook */ + } + return 1; /* keep 'trap' on */ +} + + +/* +** Traces the execution of a Lua function. Called before the execution +** of each opcode, when debug is on. 'L->oldpc' stores the last +** instruction traced, to detect line changes. When entering a new +** function, 'npci' will be zero and will test as a new line whatever +** the value of 'oldpc'. Some exceptional conditions may return to +** a function without setting 'oldpc'. In that case, 'oldpc' may be +** invalid; if so, use zero as a valid value. (A wrong but valid 'oldpc' +** at most causes an extra call to a line hook.) +** This function is not "Protected" when called, so it should correct +** 'L->top.p' before calling anything that can run the GC. +*/ +int luaG_traceexec (lua_State *L, const Instruction *pc) { + CallInfo *ci = L->ci; + lu_byte mask = L->hookmask; + const Proto *p = ci_func(ci)->p; + int counthook; + if (!(mask & (LUA_MASKLINE | LUA_MASKCOUNT))) { /* no hooks? */ + ci->u.l.trap = 0; /* don't need to stop again */ + return 0; /* turn off 'trap' */ + } + pc++; /* reference is always next instruction */ + ci->u.l.savedpc = pc; /* save 'pc' */ + counthook = (mask & LUA_MASKCOUNT) && (--L->hookcount == 0); + if (counthook) + resethookcount(L); /* reset count */ + else if (!(mask & LUA_MASKLINE)) + return 1; /* no line hook and count != 0; nothing to be done now */ + if (ci->callstatus & CIST_HOOKYIELD) { /* hook yielded last time? */ + ci->callstatus &= ~CIST_HOOKYIELD; /* erase mark */ + return 1; /* do not call hook again (VM yielded, so it did not move) */ + } + if (!isIT(*(ci->u.l.savedpc - 1))) /* top not being used? */ + L->top.p = ci->top.p; /* correct top */ + if (counthook) + luaD_hook(L, LUA_HOOKCOUNT, -1, 0, 0); /* call count hook */ + if (mask & LUA_MASKLINE) { + /* 'L->oldpc' may be invalid; use zero in this case */ + int oldpc = (L->oldpc < p->sizecode) ? L->oldpc : 0; + int npci = pcRel(pc, p); + if (npci <= oldpc || /* call hook when jump back (loop), */ + changedline(p, oldpc, npci)) { /* or when enter new line */ + int newline = luaG_getfuncline(p, npci); + luaD_hook(L, LUA_HOOKLINE, newline, 0, 0); /* call line hook */ + } + L->oldpc = npci; /* 'pc' of last call to line hook */ + } + if (L->status == LUA_YIELD) { /* did hook yield? */ + if (counthook) + L->hookcount = 1; /* undo decrement to zero */ + ci->callstatus |= CIST_HOOKYIELD; /* mark that it yielded */ + luaD_throw(L, LUA_YIELD); + } + return 1; /* keep 'trap' on */ +} + diff --git a/vendor/lua-5.4.8/src/ldebug.h b/vendor/lua-5.4.8/src/ldebug.h new file mode 100644 index 0000000..2bfce3c --- /dev/null +++ b/vendor/lua-5.4.8/src/ldebug.h @@ -0,0 +1,64 @@ +/* +** $Id: ldebug.h $ +** Auxiliary functions from Debug Interface module +** See Copyright Notice in lua.h +*/ + +#ifndef ldebug_h +#define ldebug_h + + +#include "lstate.h" + + +#define pcRel(pc, p) (cast_int((pc) - (p)->code) - 1) + + +/* Active Lua function (given call info) */ +#define ci_func(ci) (clLvalue(s2v((ci)->func.p))) + + +#define resethookcount(L) (L->hookcount = L->basehookcount) + +/* +** mark for entries in 'lineinfo' array that has absolute information in +** 'abslineinfo' array +*/ +#define ABSLINEINFO (-0x80) + + +/* +** MAXimum number of successive Instructions WiTHout ABSolute line +** information. (A power of two allows fast divisions.) +*/ +#if !defined(MAXIWTHABS) +#define MAXIWTHABS 128 +#endif + + +LUAI_FUNC int luaG_getfuncline (const Proto *f, int pc); +LUAI_FUNC const char *luaG_findlocal (lua_State *L, CallInfo *ci, int n, + StkId *pos); +LUAI_FUNC l_noret luaG_typeerror (lua_State *L, const TValue *o, + const char *opname); +LUAI_FUNC l_noret luaG_callerror (lua_State *L, const TValue *o); +LUAI_FUNC l_noret luaG_forerror (lua_State *L, const TValue *o, + const char *what); +LUAI_FUNC l_noret luaG_concaterror (lua_State *L, const TValue *p1, + const TValue *p2); +LUAI_FUNC l_noret luaG_opinterror (lua_State *L, const TValue *p1, + const TValue *p2, + const char *msg); +LUAI_FUNC l_noret luaG_tointerror (lua_State *L, const TValue *p1, + const TValue *p2); +LUAI_FUNC l_noret luaG_ordererror (lua_State *L, const TValue *p1, + const TValue *p2); +LUAI_FUNC l_noret luaG_runerror (lua_State *L, const char *fmt, ...); +LUAI_FUNC const char *luaG_addinfo (lua_State *L, const char *msg, + TString *src, int line); +LUAI_FUNC l_noret luaG_errormsg (lua_State *L); +LUAI_FUNC int luaG_traceexec (lua_State *L, const Instruction *pc); +LUAI_FUNC int luaG_tracecall (lua_State *L); + + +#endif diff --git a/vendor/lua-5.4.8/src/ldo.c b/vendor/lua-5.4.8/src/ldo.c new file mode 100644 index 0000000..c92573d --- /dev/null +++ b/vendor/lua-5.4.8/src/ldo.c @@ -0,0 +1,1035 @@ +/* +** $Id: ldo.c $ +** Stack and Call structure of Lua +** See Copyright Notice in lua.h +*/ + +#define ldo_c +#define LUA_CORE + +#include "lprefix.h" + + +#include <setjmp.h> +#include <stdlib.h> +#include <string.h> + +#include "lua.h" + +#include "lapi.h" +#include "ldebug.h" +#include "ldo.h" +#include "lfunc.h" +#include "lgc.h" +#include "lmem.h" +#include "lobject.h" +#include "lopcodes.h" +#include "lparser.h" +#include "lstate.h" +#include "lstring.h" +#include "ltable.h" +#include "ltm.h" +#include "lundump.h" +#include "lvm.h" +#include "lzio.h" + + + +#define errorstatus(s) ((s) > LUA_YIELD) + + +/* +** {====================================================== +** Error-recovery functions +** ======================================================= +*/ + +/* +** LUAI_THROW/LUAI_TRY define how Lua does exception handling. By +** default, Lua handles errors with exceptions when compiling as +** C++ code, with _longjmp/_setjmp when asked to use them, and with +** longjmp/setjmp otherwise. +*/ +#if !defined(LUAI_THROW) /* { */ + +#if defined(__cplusplus) && !defined(LUA_USE_LONGJMP) /* { */ + +/* C++ exceptions */ +#define LUAI_THROW(L,c) throw(c) +#define LUAI_TRY(L,c,a) \ + try { a } catch(...) { if ((c)->status == 0) (c)->status = -1; } +#define luai_jmpbuf int /* dummy variable */ + +#elif defined(LUA_USE_POSIX) /* }{ */ + +/* in POSIX, try _longjmp/_setjmp (more efficient) */ +#define LUAI_THROW(L,c) _longjmp((c)->b, 1) +#define LUAI_TRY(L,c,a) if (_setjmp((c)->b) == 0) { a } +#define luai_jmpbuf jmp_buf + +#else /* }{ */ + +/* ISO C handling with long jumps */ +#define LUAI_THROW(L,c) longjmp((c)->b, 1) +#define LUAI_TRY(L,c,a) if (setjmp((c)->b) == 0) { a } +#define luai_jmpbuf jmp_buf + +#endif /* } */ + +#endif /* } */ + + + +/* chain list of long jump buffers */ +struct lua_longjmp { + struct lua_longjmp *previous; + luai_jmpbuf b; + volatile int status; /* error code */ +}; + + +void luaD_seterrorobj (lua_State *L, int errcode, StkId oldtop) { + switch (errcode) { + case LUA_ERRMEM: { /* memory error? */ + setsvalue2s(L, oldtop, G(L)->memerrmsg); /* reuse preregistered msg. */ + break; + } + case LUA_OK: { /* special case only for closing upvalues */ + setnilvalue(s2v(oldtop)); /* no error message */ + break; + } + default: { + lua_assert(errorstatus(errcode)); /* real error */ + setobjs2s(L, oldtop, L->top.p - 1); /* error message on current top */ + break; + } + } + L->top.p = oldtop + 1; +} + + +l_noret luaD_throw (lua_State *L, int errcode) { + if (L->errorJmp) { /* thread has an error handler? */ + L->errorJmp->status = errcode; /* set status */ + LUAI_THROW(L, L->errorJmp); /* jump to it */ + } + else { /* thread has no error handler */ + global_State *g = G(L); + errcode = luaE_resetthread(L, errcode); /* close all upvalues */ + L->status = errcode; + if (g->mainthread->errorJmp) { /* main thread has a handler? */ + setobjs2s(L, g->mainthread->top.p++, L->top.p - 1); /* copy error obj. */ + luaD_throw(g->mainthread, errcode); /* re-throw in main thread */ + } + else { /* no handler at all; abort */ + if (g->panic) { /* panic function? */ + lua_unlock(L); + g->panic(L); /* call panic function (last chance to jump out) */ + } + abort(); + } + } +} + + +int luaD_rawrunprotected (lua_State *L, Pfunc f, void *ud) { + l_uint32 oldnCcalls = L->nCcalls; + struct lua_longjmp lj; + lj.status = LUA_OK; + lj.previous = L->errorJmp; /* chain new error handler */ + L->errorJmp = &lj; + LUAI_TRY(L, &lj, + (*f)(L, ud); + ); + L->errorJmp = lj.previous; /* restore old error handler */ + L->nCcalls = oldnCcalls; + return lj.status; +} + +/* }====================================================== */ + + +/* +** {================================================================== +** Stack reallocation +** =================================================================== +*/ + + +/* +** Change all pointers to the stack into offsets. +*/ +static void relstack (lua_State *L) { + CallInfo *ci; + UpVal *up; + L->top.offset = savestack(L, L->top.p); + L->tbclist.offset = savestack(L, L->tbclist.p); + for (up = L->openupval; up != NULL; up = up->u.open.next) + up->v.offset = savestack(L, uplevel(up)); + for (ci = L->ci; ci != NULL; ci = ci->previous) { + ci->top.offset = savestack(L, ci->top.p); + ci->func.offset = savestack(L, ci->func.p); + } +} + + +/* +** Change back all offsets into pointers. +*/ +static void correctstack (lua_State *L) { + CallInfo *ci; + UpVal *up; + L->top.p = restorestack(L, L->top.offset); + L->tbclist.p = restorestack(L, L->tbclist.offset); + for (up = L->openupval; up != NULL; up = up->u.open.next) + up->v.p = s2v(restorestack(L, up->v.offset)); + for (ci = L->ci; ci != NULL; ci = ci->previous) { + ci->top.p = restorestack(L, ci->top.offset); + ci->func.p = restorestack(L, ci->func.offset); + if (isLua(ci)) + ci->u.l.trap = 1; /* signal to update 'trap' in 'luaV_execute' */ + } +} + + +/* some space for error handling */ +#define ERRORSTACKSIZE (LUAI_MAXSTACK + 200) + + +/* raise an error while running the message handler */ +l_noret luaD_errerr (lua_State *L) { + TString *msg = luaS_newliteral(L, "error in error handling"); + setsvalue2s(L, L->top.p, msg); + L->top.p++; /* assume EXTRA_STACK */ + luaD_throw(L, LUA_ERRERR); +} + + +/* +** Reallocate the stack to a new size, correcting all pointers into it. +** In ISO C, any pointer use after the pointer has been deallocated is +** undefined behavior. So, before the reallocation, all pointers are +** changed to offsets, and after the reallocation they are changed back +** to pointers. As during the reallocation the pointers are invalid, the +** reallocation cannot run emergency collections. +** +** In case of allocation error, raise an error or return false according +** to 'raiseerror'. +*/ +int luaD_reallocstack (lua_State *L, int newsize, int raiseerror) { + int oldsize = stacksize(L); + int i; + StkId newstack; + int oldgcstop = G(L)->gcstopem; + lua_assert(newsize <= LUAI_MAXSTACK || newsize == ERRORSTACKSIZE); + relstack(L); /* change pointers to offsets */ + G(L)->gcstopem = 1; /* stop emergency collection */ + newstack = luaM_reallocvector(L, L->stack.p, oldsize + EXTRA_STACK, + newsize + EXTRA_STACK, StackValue); + G(L)->gcstopem = oldgcstop; /* restore emergency collection */ + if (l_unlikely(newstack == NULL)) { /* reallocation failed? */ + correctstack(L); /* change offsets back to pointers */ + if (raiseerror) + luaM_error(L); + else return 0; /* do not raise an error */ + } + L->stack.p = newstack; + correctstack(L); /* change offsets back to pointers */ + L->stack_last.p = L->stack.p + newsize; + for (i = oldsize + EXTRA_STACK; i < newsize + EXTRA_STACK; i++) + setnilvalue(s2v(newstack + i)); /* erase new segment */ + return 1; +} + + +/* +** Try to grow the stack by at least 'n' elements. When 'raiseerror' +** is true, raises any error; otherwise, return 0 in case of errors. +*/ +int luaD_growstack (lua_State *L, int n, int raiseerror) { + int size = stacksize(L); + if (l_unlikely(size > LUAI_MAXSTACK)) { + /* if stack is larger than maximum, thread is already using the + extra space reserved for errors, that is, thread is handling + a stack error; cannot grow further than that. */ + lua_assert(stacksize(L) == ERRORSTACKSIZE); + if (raiseerror) + luaD_errerr(L); /* error inside message handler */ + return 0; /* if not 'raiseerror', just signal it */ + } + else if (n < LUAI_MAXSTACK) { /* avoids arithmetic overflows */ + int newsize = 2 * size; /* tentative new size */ + int needed = cast_int(L->top.p - L->stack.p) + n; + if (newsize > LUAI_MAXSTACK) /* cannot cross the limit */ + newsize = LUAI_MAXSTACK; + if (newsize < needed) /* but must respect what was asked for */ + newsize = needed; + if (l_likely(newsize <= LUAI_MAXSTACK)) + return luaD_reallocstack(L, newsize, raiseerror); + } + /* else stack overflow */ + /* add extra size to be able to handle the error message */ + luaD_reallocstack(L, ERRORSTACKSIZE, raiseerror); + if (raiseerror) + luaG_runerror(L, "stack overflow"); + return 0; +} + + +/* +** Compute how much of the stack is being used, by computing the +** maximum top of all call frames in the stack and the current top. +*/ +static int stackinuse (lua_State *L) { + CallInfo *ci; + int res; + StkId lim = L->top.p; + for (ci = L->ci; ci != NULL; ci = ci->previous) { + if (lim < ci->top.p) lim = ci->top.p; + } + lua_assert(lim <= L->stack_last.p + EXTRA_STACK); + res = cast_int(lim - L->stack.p) + 1; /* part of stack in use */ + if (res < LUA_MINSTACK) + res = LUA_MINSTACK; /* ensure a minimum size */ + return res; +} + + +/* +** If stack size is more than 3 times the current use, reduce that size +** to twice the current use. (So, the final stack size is at most 2/3 the +** previous size, and half of its entries are empty.) +** As a particular case, if stack was handling a stack overflow and now +** it is not, 'max' (limited by LUAI_MAXSTACK) will be smaller than +** stacksize (equal to ERRORSTACKSIZE in this case), and so the stack +** will be reduced to a "regular" size. +*/ +void luaD_shrinkstack (lua_State *L) { + int inuse = stackinuse(L); + int max = (inuse > LUAI_MAXSTACK / 3) ? LUAI_MAXSTACK : inuse * 3; + /* if thread is currently not handling a stack overflow and its + size is larger than maximum "reasonable" size, shrink it */ + if (inuse <= LUAI_MAXSTACK && stacksize(L) > max) { + int nsize = (inuse > LUAI_MAXSTACK / 2) ? LUAI_MAXSTACK : inuse * 2; + luaD_reallocstack(L, nsize, 0); /* ok if that fails */ + } + else /* don't change stack */ + condmovestack(L,{},{}); /* (change only for debugging) */ + luaE_shrinkCI(L); /* shrink CI list */ +} + + +void luaD_inctop (lua_State *L) { + luaD_checkstack(L, 1); + L->top.p++; +} + +/* }================================================================== */ + + +/* +** Call a hook for the given event. Make sure there is a hook to be +** called. (Both 'L->hook' and 'L->hookmask', which trigger this +** function, can be changed asynchronously by signals.) +*/ +void luaD_hook (lua_State *L, int event, int line, + int ftransfer, int ntransfer) { + lua_Hook hook = L->hook; + if (hook && L->allowhook) { /* make sure there is a hook */ + int mask = CIST_HOOKED; + CallInfo *ci = L->ci; + ptrdiff_t top = savestack(L, L->top.p); /* preserve original 'top' */ + ptrdiff_t ci_top = savestack(L, ci->top.p); /* idem for 'ci->top' */ + lua_Debug ar; + ar.event = event; + ar.currentline = line; + ar.i_ci = ci; + if (ntransfer != 0) { + mask |= CIST_TRAN; /* 'ci' has transfer information */ + ci->u2.transferinfo.ftransfer = ftransfer; + ci->u2.transferinfo.ntransfer = ntransfer; + } + if (isLua(ci) && L->top.p < ci->top.p) + L->top.p = ci->top.p; /* protect entire activation register */ + luaD_checkstack(L, LUA_MINSTACK); /* ensure minimum stack size */ + if (ci->top.p < L->top.p + LUA_MINSTACK) + ci->top.p = L->top.p + LUA_MINSTACK; + L->allowhook = 0; /* cannot call hooks inside a hook */ + ci->callstatus |= mask; + lua_unlock(L); + (*hook)(L, &ar); + lua_lock(L); + lua_assert(!L->allowhook); + L->allowhook = 1; + ci->top.p = restorestack(L, ci_top); + L->top.p = restorestack(L, top); + ci->callstatus &= ~mask; + } +} + + +/* +** Executes a call hook for Lua functions. This function is called +** whenever 'hookmask' is not zero, so it checks whether call hooks are +** active. +*/ +void luaD_hookcall (lua_State *L, CallInfo *ci) { + L->oldpc = 0; /* set 'oldpc' for new function */ + if (L->hookmask & LUA_MASKCALL) { /* is call hook on? */ + int event = (ci->callstatus & CIST_TAIL) ? LUA_HOOKTAILCALL + : LUA_HOOKCALL; + Proto *p = ci_func(ci)->p; + ci->u.l.savedpc++; /* hooks assume 'pc' is already incremented */ + luaD_hook(L, event, -1, 1, p->numparams); + ci->u.l.savedpc--; /* correct 'pc' */ + } +} + + +/* +** Executes a return hook for Lua and C functions and sets/corrects +** 'oldpc'. (Note that this correction is needed by the line hook, so it +** is done even when return hooks are off.) +*/ +static void rethook (lua_State *L, CallInfo *ci, int nres) { + if (L->hookmask & LUA_MASKRET) { /* is return hook on? */ + StkId firstres = L->top.p - nres; /* index of first result */ + int delta = 0; /* correction for vararg functions */ + int ftransfer; + if (isLua(ci)) { + Proto *p = ci_func(ci)->p; + if (p->is_vararg) + delta = ci->u.l.nextraargs + p->numparams + 1; + } + ci->func.p += delta; /* if vararg, back to virtual 'func' */ + ftransfer = cast(unsigned short, firstres - ci->func.p); + luaD_hook(L, LUA_HOOKRET, -1, ftransfer, nres); /* call it */ + ci->func.p -= delta; + } + if (isLua(ci = ci->previous)) + L->oldpc = pcRel(ci->u.l.savedpc, ci_func(ci)->p); /* set 'oldpc' */ +} + + +/* +** Check whether 'func' has a '__call' metafield. If so, put it in the +** stack, below original 'func', so that 'luaD_precall' can call it. Raise +** an error if there is no '__call' metafield. +*/ +static StkId tryfuncTM (lua_State *L, StkId func) { + const TValue *tm; + StkId p; + checkstackGCp(L, 1, func); /* space for metamethod */ + tm = luaT_gettmbyobj(L, s2v(func), TM_CALL); /* (after previous GC) */ + if (l_unlikely(ttisnil(tm))) + luaG_callerror(L, s2v(func)); /* nothing to call */ + for (p = L->top.p; p > func; p--) /* open space for metamethod */ + setobjs2s(L, p, p-1); + L->top.p++; /* stack space pre-allocated by the caller */ + setobj2s(L, func, tm); /* metamethod is the new function to be called */ + return func; +} + + +/* +** Given 'nres' results at 'firstResult', move 'wanted' of them to 'res'. +** Handle most typical cases (zero results for commands, one result for +** expressions, multiple results for tail calls/single parameters) +** separated. +*/ +l_sinline void moveresults (lua_State *L, StkId res, int nres, int wanted) { + StkId firstresult; + int i; + switch (wanted) { /* handle typical cases separately */ + case 0: /* no values needed */ + L->top.p = res; + return; + case 1: /* one value needed */ + if (nres == 0) /* no results? */ + setnilvalue(s2v(res)); /* adjust with nil */ + else /* at least one result */ + setobjs2s(L, res, L->top.p - nres); /* move it to proper place */ + L->top.p = res + 1; + return; + case LUA_MULTRET: + wanted = nres; /* we want all results */ + break; + default: /* two/more results and/or to-be-closed variables */ + if (hastocloseCfunc(wanted)) { /* to-be-closed variables? */ + L->ci->callstatus |= CIST_CLSRET; /* in case of yields */ + L->ci->u2.nres = nres; + res = luaF_close(L, res, CLOSEKTOP, 1); + L->ci->callstatus &= ~CIST_CLSRET; + if (L->hookmask) { /* if needed, call hook after '__close's */ + ptrdiff_t savedres = savestack(L, res); + rethook(L, L->ci, nres); + res = restorestack(L, savedres); /* hook can move stack */ + } + wanted = decodeNresults(wanted); + if (wanted == LUA_MULTRET) + wanted = nres; /* we want all results */ + } + break; + } + /* generic case */ + firstresult = L->top.p - nres; /* index of first result */ + if (nres > wanted) /* extra results? */ + nres = wanted; /* don't need them */ + for (i = 0; i < nres; i++) /* move all results to correct place */ + setobjs2s(L, res + i, firstresult + i); + for (; i < wanted; i++) /* complete wanted number of results */ + setnilvalue(s2v(res + i)); + L->top.p = res + wanted; /* top points after the last result */ +} + + +/* +** Finishes a function call: calls hook if necessary, moves current +** number of results to proper place, and returns to previous call +** info. If function has to close variables, hook must be called after +** that. +*/ +void luaD_poscall (lua_State *L, CallInfo *ci, int nres) { + int wanted = ci->nresults; + if (l_unlikely(L->hookmask && !hastocloseCfunc(wanted))) + rethook(L, ci, nres); + /* move results to proper place */ + moveresults(L, ci->func.p, nres, wanted); + /* function cannot be in any of these cases when returning */ + lua_assert(!(ci->callstatus & + (CIST_HOOKED | CIST_YPCALL | CIST_FIN | CIST_TRAN | CIST_CLSRET))); + L->ci = ci->previous; /* back to caller (after closing variables) */ +} + + + +#define next_ci(L) (L->ci->next ? L->ci->next : luaE_extendCI(L)) + + +l_sinline CallInfo *prepCallInfo (lua_State *L, StkId func, int nret, + int mask, StkId top) { + CallInfo *ci = L->ci = next_ci(L); /* new frame */ + ci->func.p = func; + ci->nresults = nret; + ci->callstatus = mask; + ci->top.p = top; + return ci; +} + + +/* +** precall for C functions +*/ +l_sinline int precallC (lua_State *L, StkId func, int nresults, + lua_CFunction f) { + int n; /* number of returns */ + CallInfo *ci; + checkstackGCp(L, LUA_MINSTACK, func); /* ensure minimum stack size */ + L->ci = ci = prepCallInfo(L, func, nresults, CIST_C, + L->top.p + LUA_MINSTACK); + lua_assert(ci->top.p <= L->stack_last.p); + if (l_unlikely(L->hookmask & LUA_MASKCALL)) { + int narg = cast_int(L->top.p - func) - 1; + luaD_hook(L, LUA_HOOKCALL, -1, 1, narg); + } + lua_unlock(L); + n = (*f)(L); /* do the actual call */ + lua_lock(L); + api_checknelems(L, n); + luaD_poscall(L, ci, n); + return n; +} + + +/* +** Prepare a function for a tail call, building its call info on top +** of the current call info. 'narg1' is the number of arguments plus 1 +** (so that it includes the function itself). Return the number of +** results, if it was a C function, or -1 for a Lua function. +*/ +int luaD_pretailcall (lua_State *L, CallInfo *ci, StkId func, + int narg1, int delta) { + retry: + switch (ttypetag(s2v(func))) { + case LUA_VCCL: /* C closure */ + return precallC(L, func, LUA_MULTRET, clCvalue(s2v(func))->f); + case LUA_VLCF: /* light C function */ + return precallC(L, func, LUA_MULTRET, fvalue(s2v(func))); + case LUA_VLCL: { /* Lua function */ + Proto *p = clLvalue(s2v(func))->p; + int fsize = p->maxstacksize; /* frame size */ + int nfixparams = p->numparams; + int i; + checkstackGCp(L, fsize - delta, func); + ci->func.p -= delta; /* restore 'func' (if vararg) */ + for (i = 0; i < narg1; i++) /* move down function and arguments */ + setobjs2s(L, ci->func.p + i, func + i); + func = ci->func.p; /* moved-down function */ + for (; narg1 <= nfixparams; narg1++) + setnilvalue(s2v(func + narg1)); /* complete missing arguments */ + ci->top.p = func + 1 + fsize; /* top for new function */ + lua_assert(ci->top.p <= L->stack_last.p); + ci->u.l.savedpc = p->code; /* starting point */ + ci->callstatus |= CIST_TAIL; + L->top.p = func + narg1; /* set top */ + return -1; + } + default: { /* not a function */ + func = tryfuncTM(L, func); /* try to get '__call' metamethod */ + /* return luaD_pretailcall(L, ci, func, narg1 + 1, delta); */ + narg1++; + goto retry; /* try again */ + } + } +} + + +/* +** Prepares the call to a function (C or Lua). For C functions, also do +** the call. The function to be called is at '*func'. The arguments +** are on the stack, right after the function. Returns the CallInfo +** to be executed, if it was a Lua function. Otherwise (a C function) +** returns NULL, with all the results on the stack, starting at the +** original function position. +*/ +CallInfo *luaD_precall (lua_State *L, StkId func, int nresults) { + retry: + switch (ttypetag(s2v(func))) { + case LUA_VCCL: /* C closure */ + precallC(L, func, nresults, clCvalue(s2v(func))->f); + return NULL; + case LUA_VLCF: /* light C function */ + precallC(L, func, nresults, fvalue(s2v(func))); + return NULL; + case LUA_VLCL: { /* Lua function */ + CallInfo *ci; + Proto *p = clLvalue(s2v(func))->p; + int narg = cast_int(L->top.p - func) - 1; /* number of real arguments */ + int nfixparams = p->numparams; + int fsize = p->maxstacksize; /* frame size */ + checkstackGCp(L, fsize, func); + L->ci = ci = prepCallInfo(L, func, nresults, 0, func + 1 + fsize); + ci->u.l.savedpc = p->code; /* starting point */ + for (; narg < nfixparams; narg++) + setnilvalue(s2v(L->top.p++)); /* complete missing arguments */ + lua_assert(ci->top.p <= L->stack_last.p); + return ci; + } + default: { /* not a function */ + func = tryfuncTM(L, func); /* try to get '__call' metamethod */ + /* return luaD_precall(L, func, nresults); */ + goto retry; /* try again with metamethod */ + } + } +} + + +/* +** Call a function (C or Lua) through C. 'inc' can be 1 (increment +** number of recursive invocations in the C stack) or nyci (the same +** plus increment number of non-yieldable calls). +** This function can be called with some use of EXTRA_STACK, so it should +** check the stack before doing anything else. 'luaD_precall' already +** does that. +*/ +l_sinline void ccall (lua_State *L, StkId func, int nResults, l_uint32 inc) { + CallInfo *ci; + L->nCcalls += inc; + if (l_unlikely(getCcalls(L) >= LUAI_MAXCCALLS)) { + checkstackp(L, 0, func); /* free any use of EXTRA_STACK */ + luaE_checkcstack(L); + } + if ((ci = luaD_precall(L, func, nResults)) != NULL) { /* Lua function? */ + ci->callstatus = CIST_FRESH; /* mark that it is a "fresh" execute */ + luaV_execute(L, ci); /* call it */ + } + L->nCcalls -= inc; +} + + +/* +** External interface for 'ccall' +*/ +void luaD_call (lua_State *L, StkId func, int nResults) { + ccall(L, func, nResults, 1); +} + + +/* +** Similar to 'luaD_call', but does not allow yields during the call. +*/ +void luaD_callnoyield (lua_State *L, StkId func, int nResults) { + ccall(L, func, nResults, nyci); +} + + +/* +** Finish the job of 'lua_pcallk' after it was interrupted by an yield. +** (The caller, 'finishCcall', does the final call to 'adjustresults'.) +** The main job is to complete the 'luaD_pcall' called by 'lua_pcallk'. +** If a '__close' method yields here, eventually control will be back +** to 'finishCcall' (when that '__close' method finally returns) and +** 'finishpcallk' will run again and close any still pending '__close' +** methods. Similarly, if a '__close' method errs, 'precover' calls +** 'unroll' which calls ''finishCcall' and we are back here again, to +** close any pending '__close' methods. +** Note that, up to the call to 'luaF_close', the corresponding +** 'CallInfo' is not modified, so that this repeated run works like the +** first one (except that it has at least one less '__close' to do). In +** particular, field CIST_RECST preserves the error status across these +** multiple runs, changing only if there is a new error. +*/ +static int finishpcallk (lua_State *L, CallInfo *ci) { + int status = getcistrecst(ci); /* get original status */ + if (l_likely(status == LUA_OK)) /* no error? */ + status = LUA_YIELD; /* was interrupted by an yield */ + else { /* error */ + StkId func = restorestack(L, ci->u2.funcidx); + L->allowhook = getoah(ci->callstatus); /* restore 'allowhook' */ + func = luaF_close(L, func, status, 1); /* can yield or raise an error */ + luaD_seterrorobj(L, status, func); + luaD_shrinkstack(L); /* restore stack size in case of overflow */ + setcistrecst(ci, LUA_OK); /* clear original status */ + } + ci->callstatus &= ~CIST_YPCALL; + L->errfunc = ci->u.c.old_errfunc; + /* if it is here, there were errors or yields; unlike 'lua_pcallk', + do not change status */ + return status; +} + + +/* +** Completes the execution of a C function interrupted by an yield. +** The interruption must have happened while the function was either +** closing its tbc variables in 'moveresults' or executing +** 'lua_callk'/'lua_pcallk'. In the first case, it just redoes +** 'luaD_poscall'. In the second case, the call to 'finishpcallk' +** finishes the interrupted execution of 'lua_pcallk'. After that, it +** calls the continuation of the interrupted function and finally it +** completes the job of the 'luaD_call' that called the function. In +** the call to 'adjustresults', we do not know the number of results +** of the function called by 'lua_callk'/'lua_pcallk', so we are +** conservative and use LUA_MULTRET (always adjust). +*/ +static void finishCcall (lua_State *L, CallInfo *ci) { + int n; /* actual number of results from C function */ + if (ci->callstatus & CIST_CLSRET) { /* was returning? */ + lua_assert(hastocloseCfunc(ci->nresults)); + n = ci->u2.nres; /* just redo 'luaD_poscall' */ + /* don't need to reset CIST_CLSRET, as it will be set again anyway */ + } + else { + int status = LUA_YIELD; /* default if there were no errors */ + /* must have a continuation and must be able to call it */ + lua_assert(ci->u.c.k != NULL && yieldable(L)); + if (ci->callstatus & CIST_YPCALL) /* was inside a 'lua_pcallk'? */ + status = finishpcallk(L, ci); /* finish it */ + adjustresults(L, LUA_MULTRET); /* finish 'lua_callk' */ + lua_unlock(L); + n = (*ci->u.c.k)(L, status, ci->u.c.ctx); /* call continuation */ + lua_lock(L); + api_checknelems(L, n); + } + luaD_poscall(L, ci, n); /* finish 'luaD_call' */ +} + + +/* +** Executes "full continuation" (everything in the stack) of a +** previously interrupted coroutine until the stack is empty (or another +** interruption long-jumps out of the loop). +*/ +static void unroll (lua_State *L, void *ud) { + CallInfo *ci; + UNUSED(ud); + while ((ci = L->ci) != &L->base_ci) { /* something in the stack */ + if (!isLua(ci)) /* C function? */ + finishCcall(L, ci); /* complete its execution */ + else { /* Lua function */ + luaV_finishOp(L); /* finish interrupted instruction */ + luaV_execute(L, ci); /* execute down to higher C 'boundary' */ + } + } +} + + +/* +** Try to find a suspended protected call (a "recover point") for the +** given thread. +*/ +static CallInfo *findpcall (lua_State *L) { + CallInfo *ci; + for (ci = L->ci; ci != NULL; ci = ci->previous) { /* search for a pcall */ + if (ci->callstatus & CIST_YPCALL) + return ci; + } + return NULL; /* no pending pcall */ +} + + +/* +** Signal an error in the call to 'lua_resume', not in the execution +** of the coroutine itself. (Such errors should not be handled by any +** coroutine error handler and should not kill the coroutine.) +*/ +static int resume_error (lua_State *L, const char *msg, int narg) { + L->top.p -= narg; /* remove args from the stack */ + setsvalue2s(L, L->top.p, luaS_new(L, msg)); /* push error message */ + api_incr_top(L); + lua_unlock(L); + return LUA_ERRRUN; +} + + +/* +** Do the work for 'lua_resume' in protected mode. Most of the work +** depends on the status of the coroutine: initial state, suspended +** inside a hook, or regularly suspended (optionally with a continuation +** function), plus erroneous cases: non-suspended coroutine or dead +** coroutine. +*/ +static void resume (lua_State *L, void *ud) { + int n = *(cast(int*, ud)); /* number of arguments */ + StkId firstArg = L->top.p - n; /* first argument */ + CallInfo *ci = L->ci; + if (L->status == LUA_OK) /* starting a coroutine? */ + ccall(L, firstArg - 1, LUA_MULTRET, 0); /* just call its body */ + else { /* resuming from previous yield */ + lua_assert(L->status == LUA_YIELD); + L->status = LUA_OK; /* mark that it is running (again) */ + if (isLua(ci)) { /* yielded inside a hook? */ + /* undo increment made by 'luaG_traceexec': instruction was not + executed yet */ + lua_assert(ci->callstatus & CIST_HOOKYIELD); + ci->u.l.savedpc--; + L->top.p = firstArg; /* discard arguments */ + luaV_execute(L, ci); /* just continue running Lua code */ + } + else { /* 'common' yield */ + if (ci->u.c.k != NULL) { /* does it have a continuation function? */ + lua_unlock(L); + n = (*ci->u.c.k)(L, LUA_YIELD, ci->u.c.ctx); /* call continuation */ + lua_lock(L); + api_checknelems(L, n); + } + luaD_poscall(L, ci, n); /* finish 'luaD_call' */ + } + unroll(L, NULL); /* run continuation */ + } +} + + +/* +** Unrolls a coroutine in protected mode while there are recoverable +** errors, that is, errors inside a protected call. (Any error +** interrupts 'unroll', and this loop protects it again so it can +** continue.) Stops with a normal end (status == LUA_OK), an yield +** (status == LUA_YIELD), or an unprotected error ('findpcall' doesn't +** find a recover point). +*/ +static int precover (lua_State *L, int status) { + CallInfo *ci; + while (errorstatus(status) && (ci = findpcall(L)) != NULL) { + L->ci = ci; /* go down to recovery functions */ + setcistrecst(ci, status); /* status to finish 'pcall' */ + status = luaD_rawrunprotected(L, unroll, NULL); + } + return status; +} + + +LUA_API int lua_resume (lua_State *L, lua_State *from, int nargs, + int *nresults) { + int status; + lua_lock(L); + if (L->status == LUA_OK) { /* may be starting a coroutine */ + if (L->ci != &L->base_ci) /* not in base level? */ + return resume_error(L, "cannot resume non-suspended coroutine", nargs); + else if (L->top.p - (L->ci->func.p + 1) == nargs) /* no function? */ + return resume_error(L, "cannot resume dead coroutine", nargs); + } + else if (L->status != LUA_YIELD) /* ended with errors? */ + return resume_error(L, "cannot resume dead coroutine", nargs); + L->nCcalls = (from) ? getCcalls(from) : 0; + if (getCcalls(L) >= LUAI_MAXCCALLS) + return resume_error(L, "C stack overflow", nargs); + L->nCcalls++; + luai_userstateresume(L, nargs); + api_checknelems(L, (L->status == LUA_OK) ? nargs + 1 : nargs); + status = luaD_rawrunprotected(L, resume, &nargs); + /* continue running after recoverable errors */ + status = precover(L, status); + if (l_likely(!errorstatus(status))) + lua_assert(status == L->status); /* normal end or yield */ + else { /* unrecoverable error */ + L->status = cast_byte(status); /* mark thread as 'dead' */ + luaD_seterrorobj(L, status, L->top.p); /* push error message */ + L->ci->top.p = L->top.p; + } + *nresults = (status == LUA_YIELD) ? L->ci->u2.nyield + : cast_int(L->top.p - (L->ci->func.p + 1)); + lua_unlock(L); + return status; +} + + +LUA_API int lua_isyieldable (lua_State *L) { + return yieldable(L); +} + + +LUA_API int lua_yieldk (lua_State *L, int nresults, lua_KContext ctx, + lua_KFunction k) { + CallInfo *ci; + luai_userstateyield(L, nresults); + lua_lock(L); + ci = L->ci; + api_checknelems(L, nresults); + if (l_unlikely(!yieldable(L))) { + if (L != G(L)->mainthread) + luaG_runerror(L, "attempt to yield across a C-call boundary"); + else + luaG_runerror(L, "attempt to yield from outside a coroutine"); + } + L->status = LUA_YIELD; + ci->u2.nyield = nresults; /* save number of results */ + if (isLua(ci)) { /* inside a hook? */ + lua_assert(!isLuacode(ci)); + api_check(L, nresults == 0, "hooks cannot yield values"); + api_check(L, k == NULL, "hooks cannot continue after yielding"); + } + else { + if ((ci->u.c.k = k) != NULL) /* is there a continuation? */ + ci->u.c.ctx = ctx; /* save context */ + luaD_throw(L, LUA_YIELD); + } + lua_assert(ci->callstatus & CIST_HOOKED); /* must be inside a hook */ + lua_unlock(L); + return 0; /* return to 'luaD_hook' */ +} + + +/* +** Auxiliary structure to call 'luaF_close' in protected mode. +*/ +struct CloseP { + StkId level; + int status; +}; + + +/* +** Auxiliary function to call 'luaF_close' in protected mode. +*/ +static void closepaux (lua_State *L, void *ud) { + struct CloseP *pcl = cast(struct CloseP *, ud); + luaF_close(L, pcl->level, pcl->status, 0); +} + + +/* +** Calls 'luaF_close' in protected mode. Return the original status +** or, in case of errors, the new status. +*/ +int luaD_closeprotected (lua_State *L, ptrdiff_t level, int status) { + CallInfo *old_ci = L->ci; + lu_byte old_allowhooks = L->allowhook; + for (;;) { /* keep closing upvalues until no more errors */ + struct CloseP pcl; + pcl.level = restorestack(L, level); pcl.status = status; + status = luaD_rawrunprotected(L, &closepaux, &pcl); + if (l_likely(status == LUA_OK)) /* no more errors? */ + return pcl.status; + else { /* an error occurred; restore saved state and repeat */ + L->ci = old_ci; + L->allowhook = old_allowhooks; + } + } +} + + +/* +** Call the C function 'func' in protected mode, restoring basic +** thread information ('allowhook', etc.) and in particular +** its stack level in case of errors. +*/ +int luaD_pcall (lua_State *L, Pfunc func, void *u, + ptrdiff_t old_top, ptrdiff_t ef) { + int status; + CallInfo *old_ci = L->ci; + lu_byte old_allowhooks = L->allowhook; + ptrdiff_t old_errfunc = L->errfunc; + L->errfunc = ef; + status = luaD_rawrunprotected(L, func, u); + if (l_unlikely(status != LUA_OK)) { /* an error occurred? */ + L->ci = old_ci; + L->allowhook = old_allowhooks; + status = luaD_closeprotected(L, old_top, status); + luaD_seterrorobj(L, status, restorestack(L, old_top)); + luaD_shrinkstack(L); /* restore stack size in case of overflow */ + } + L->errfunc = old_errfunc; + return status; +} + + + +/* +** Execute a protected parser. +*/ +struct SParser { /* data to 'f_parser' */ + ZIO *z; + Mbuffer buff; /* dynamic structure used by the scanner */ + Dyndata dyd; /* dynamic structures used by the parser */ + const char *mode; + const char *name; +}; + + +static void checkmode (lua_State *L, const char *mode, const char *x) { + if (mode && strchr(mode, x[0]) == NULL) { + luaO_pushfstring(L, + "attempt to load a %s chunk (mode is '%s')", x, mode); + luaD_throw(L, LUA_ERRSYNTAX); + } +} + + +static void f_parser (lua_State *L, void *ud) { + LClosure *cl; + struct SParser *p = cast(struct SParser *, ud); + int c = zgetc(p->z); /* read first character */ + if (c == LUA_SIGNATURE[0]) { + checkmode(L, p->mode, "binary"); + cl = luaU_undump(L, p->z, p->name); + } + else { + checkmode(L, p->mode, "text"); + cl = luaY_parser(L, p->z, &p->buff, &p->dyd, p->name, c); + } + lua_assert(cl->nupvalues == cl->p->sizeupvalues); + luaF_initupvals(L, cl); +} + + +int luaD_protectedparser (lua_State *L, ZIO *z, const char *name, + const char *mode) { + struct SParser p; + int status; + incnny(L); /* cannot yield during parsing */ + p.z = z; p.name = name; p.mode = mode; + p.dyd.actvar.arr = NULL; p.dyd.actvar.size = 0; + p.dyd.gt.arr = NULL; p.dyd.gt.size = 0; + p.dyd.label.arr = NULL; p.dyd.label.size = 0; + luaZ_initbuffer(L, &p.buff); + status = luaD_pcall(L, f_parser, &p, savestack(L, L->top.p), L->errfunc); + luaZ_freebuffer(L, &p.buff); + luaM_freearray(L, p.dyd.actvar.arr, p.dyd.actvar.size); + luaM_freearray(L, p.dyd.gt.arr, p.dyd.gt.size); + luaM_freearray(L, p.dyd.label.arr, p.dyd.label.size); + decnny(L); + return status; +} + + diff --git a/vendor/lua-5.4.8/src/ldo.h b/vendor/lua-5.4.8/src/ldo.h new file mode 100644 index 0000000..4de9540 --- /dev/null +++ b/vendor/lua-5.4.8/src/ldo.h @@ -0,0 +1,88 @@ +/* +** $Id: ldo.h $ +** Stack and Call structure of Lua +** See Copyright Notice in lua.h +*/ + +#ifndef ldo_h +#define ldo_h + + +#include "llimits.h" +#include "lobject.h" +#include "lstate.h" +#include "lzio.h" + + +/* +** Macro to check stack size and grow stack if needed. Parameters +** 'pre'/'pos' allow the macro to preserve a pointer into the +** stack across reallocations, doing the work only when needed. +** It also allows the running of one GC step when the stack is +** reallocated. +** 'condmovestack' is used in heavy tests to force a stack reallocation +** at every check. +*/ +#define luaD_checkstackaux(L,n,pre,pos) \ + if (l_unlikely(L->stack_last.p - L->top.p <= (n))) \ + { pre; luaD_growstack(L, n, 1); pos; } \ + else { condmovestack(L,pre,pos); } + +/* In general, 'pre'/'pos' are empty (nothing to save) */ +#define luaD_checkstack(L,n) luaD_checkstackaux(L,n,(void)0,(void)0) + + + +#define savestack(L,pt) (cast_charp(pt) - cast_charp(L->stack.p)) +#define restorestack(L,n) cast(StkId, cast_charp(L->stack.p) + (n)) + + +/* macro to check stack size, preserving 'p' */ +#define checkstackp(L,n,p) \ + luaD_checkstackaux(L, n, \ + ptrdiff_t t__ = savestack(L, p), /* save 'p' */ \ + p = restorestack(L, t__)) /* 'pos' part: restore 'p' */ + + +/* macro to check stack size and GC, preserving 'p' */ +#define checkstackGCp(L,n,p) \ + luaD_checkstackaux(L, n, \ + ptrdiff_t t__ = savestack(L, p); /* save 'p' */ \ + luaC_checkGC(L), /* stack grow uses memory */ \ + p = restorestack(L, t__)) /* 'pos' part: restore 'p' */ + + +/* macro to check stack size and GC */ +#define checkstackGC(L,fsize) \ + luaD_checkstackaux(L, (fsize), luaC_checkGC(L), (void)0) + + +/* type of protected functions, to be ran by 'runprotected' */ +typedef void (*Pfunc) (lua_State *L, void *ud); + +LUAI_FUNC l_noret luaD_errerr (lua_State *L); +LUAI_FUNC void luaD_seterrorobj (lua_State *L, int errcode, StkId oldtop); +LUAI_FUNC int luaD_protectedparser (lua_State *L, ZIO *z, const char *name, + const char *mode); +LUAI_FUNC void luaD_hook (lua_State *L, int event, int line, + int fTransfer, int nTransfer); +LUAI_FUNC void luaD_hookcall (lua_State *L, CallInfo *ci); +LUAI_FUNC int luaD_pretailcall (lua_State *L, CallInfo *ci, StkId func, + int narg1, int delta); +LUAI_FUNC CallInfo *luaD_precall (lua_State *L, StkId func, int nResults); +LUAI_FUNC void luaD_call (lua_State *L, StkId func, int nResults); +LUAI_FUNC void luaD_callnoyield (lua_State *L, StkId func, int nResults); +LUAI_FUNC int luaD_closeprotected (lua_State *L, ptrdiff_t level, int status); +LUAI_FUNC int luaD_pcall (lua_State *L, Pfunc func, void *u, + ptrdiff_t oldtop, ptrdiff_t ef); +LUAI_FUNC void luaD_poscall (lua_State *L, CallInfo *ci, int nres); +LUAI_FUNC int luaD_reallocstack (lua_State *L, int newsize, int raiseerror); +LUAI_FUNC int luaD_growstack (lua_State *L, int n, int raiseerror); +LUAI_FUNC void luaD_shrinkstack (lua_State *L); +LUAI_FUNC void luaD_inctop (lua_State *L); + +LUAI_FUNC l_noret luaD_throw (lua_State *L, int errcode); +LUAI_FUNC int luaD_rawrunprotected (lua_State *L, Pfunc f, void *ud); + +#endif + diff --git a/vendor/lua-5.4.8/src/ldump.c b/vendor/lua-5.4.8/src/ldump.c new file mode 100644 index 0000000..f231691 --- /dev/null +++ b/vendor/lua-5.4.8/src/ldump.c @@ -0,0 +1,230 @@ +/* +** $Id: ldump.c $ +** save precompiled Lua chunks +** See Copyright Notice in lua.h +*/ + +#define ldump_c +#define LUA_CORE + +#include "lprefix.h" + + +#include <limits.h> +#include <stddef.h> + +#include "lua.h" + +#include "lobject.h" +#include "lstate.h" +#include "lundump.h" + + +typedef struct { + lua_State *L; + lua_Writer writer; + void *data; + int strip; + int status; +} DumpState; + + +/* +** All high-level dumps go through dumpVector; you can change it to +** change the endianness of the result +*/ +#define dumpVector(D,v,n) dumpBlock(D,v,(n)*sizeof((v)[0])) + +#define dumpLiteral(D, s) dumpBlock(D,s,sizeof(s) - sizeof(char)) + + +static void dumpBlock (DumpState *D, const void *b, size_t size) { + if (D->status == 0 && size > 0) { + lua_unlock(D->L); + D->status = (*D->writer)(D->L, b, size, D->data); + lua_lock(D->L); + } +} + + +#define dumpVar(D,x) dumpVector(D,&x,1) + + +static void dumpByte (DumpState *D, int y) { + lu_byte x = (lu_byte)y; + dumpVar(D, x); +} + + +/* +** 'dumpSize' buffer size: each byte can store up to 7 bits. (The "+6" +** rounds up the division.) +*/ +#define DIBS ((sizeof(size_t) * CHAR_BIT + 6) / 7) + +static void dumpSize (DumpState *D, size_t x) { + lu_byte buff[DIBS]; + int n = 0; + do { + buff[DIBS - (++n)] = x & 0x7f; /* fill buffer in reverse order */ + x >>= 7; + } while (x != 0); + buff[DIBS - 1] |= 0x80; /* mark last byte */ + dumpVector(D, buff + DIBS - n, n); +} + + +static void dumpInt (DumpState *D, int x) { + dumpSize(D, x); +} + + +static void dumpNumber (DumpState *D, lua_Number x) { + dumpVar(D, x); +} + + +static void dumpInteger (DumpState *D, lua_Integer x) { + dumpVar(D, x); +} + + +static void dumpString (DumpState *D, const TString *s) { + if (s == NULL) + dumpSize(D, 0); + else { + size_t size = tsslen(s); + const char *str = getstr(s); + dumpSize(D, size + 1); + dumpVector(D, str, size); + } +} + + +static void dumpCode (DumpState *D, const Proto *f) { + dumpInt(D, f->sizecode); + dumpVector(D, f->code, f->sizecode); +} + + +static void dumpFunction(DumpState *D, const Proto *f, TString *psource); + +static void dumpConstants (DumpState *D, const Proto *f) { + int i; + int n = f->sizek; + dumpInt(D, n); + for (i = 0; i < n; i++) { + const TValue *o = &f->k[i]; + int tt = ttypetag(o); + dumpByte(D, tt); + switch (tt) { + case LUA_VNUMFLT: + dumpNumber(D, fltvalue(o)); + break; + case LUA_VNUMINT: + dumpInteger(D, ivalue(o)); + break; + case LUA_VSHRSTR: + case LUA_VLNGSTR: + dumpString(D, tsvalue(o)); + break; + default: + lua_assert(tt == LUA_VNIL || tt == LUA_VFALSE || tt == LUA_VTRUE); + } + } +} + + +static void dumpProtos (DumpState *D, const Proto *f) { + int i; + int n = f->sizep; + dumpInt(D, n); + for (i = 0; i < n; i++) + dumpFunction(D, f->p[i], f->source); +} + + +static void dumpUpvalues (DumpState *D, const Proto *f) { + int i, n = f->sizeupvalues; + dumpInt(D, n); + for (i = 0; i < n; i++) { + dumpByte(D, f->upvalues[i].instack); + dumpByte(D, f->upvalues[i].idx); + dumpByte(D, f->upvalues[i].kind); + } +} + + +static void dumpDebug (DumpState *D, const Proto *f) { + int i, n; + n = (D->strip) ? 0 : f->sizelineinfo; + dumpInt(D, n); + dumpVector(D, f->lineinfo, n); + n = (D->strip) ? 0 : f->sizeabslineinfo; + dumpInt(D, n); + for (i = 0; i < n; i++) { + dumpInt(D, f->abslineinfo[i].pc); + dumpInt(D, f->abslineinfo[i].line); + } + n = (D->strip) ? 0 : f->sizelocvars; + dumpInt(D, n); + for (i = 0; i < n; i++) { + dumpString(D, f->locvars[i].varname); + dumpInt(D, f->locvars[i].startpc); + dumpInt(D, f->locvars[i].endpc); + } + n = (D->strip) ? 0 : f->sizeupvalues; + dumpInt(D, n); + for (i = 0; i < n; i++) + dumpString(D, f->upvalues[i].name); +} + + +static void dumpFunction (DumpState *D, const Proto *f, TString *psource) { + if (D->strip || f->source == psource) + dumpString(D, NULL); /* no debug info or same source as its parent */ + else + dumpString(D, f->source); + dumpInt(D, f->linedefined); + dumpInt(D, f->lastlinedefined); + dumpByte(D, f->numparams); + dumpByte(D, f->is_vararg); + dumpByte(D, f->maxstacksize); + dumpCode(D, f); + dumpConstants(D, f); + dumpUpvalues(D, f); + dumpProtos(D, f); + dumpDebug(D, f); +} + + +static void dumpHeader (DumpState *D) { + dumpLiteral(D, LUA_SIGNATURE); + dumpByte(D, LUAC_VERSION); + dumpByte(D, LUAC_FORMAT); + dumpLiteral(D, LUAC_DATA); + dumpByte(D, sizeof(Instruction)); + dumpByte(D, sizeof(lua_Integer)); + dumpByte(D, sizeof(lua_Number)); + dumpInteger(D, LUAC_INT); + dumpNumber(D, LUAC_NUM); +} + + +/* +** dump Lua function as precompiled chunk +*/ +int luaU_dump(lua_State *L, const Proto *f, lua_Writer w, void *data, + int strip) { + DumpState D; + D.L = L; + D.writer = w; + D.data = data; + D.strip = strip; + D.status = 0; + dumpHeader(&D); + dumpByte(&D, f->sizeupvalues); + dumpFunction(&D, f, NULL); + return D.status; +} + diff --git a/vendor/lua-5.4.8/src/lfunc.c b/vendor/lua-5.4.8/src/lfunc.c new file mode 100644 index 0000000..0945f24 --- /dev/null +++ b/vendor/lua-5.4.8/src/lfunc.c @@ -0,0 +1,294 @@ +/* +** $Id: lfunc.c $ +** Auxiliary functions to manipulate prototypes and closures +** See Copyright Notice in lua.h +*/ + +#define lfunc_c +#define LUA_CORE + +#include "lprefix.h" + + +#include <stddef.h> + +#include "lua.h" + +#include "ldebug.h" +#include "ldo.h" +#include "lfunc.h" +#include "lgc.h" +#include "lmem.h" +#include "lobject.h" +#include "lstate.h" + + + +CClosure *luaF_newCclosure (lua_State *L, int nupvals) { + GCObject *o = luaC_newobj(L, LUA_VCCL, sizeCclosure(nupvals)); + CClosure *c = gco2ccl(o); + c->nupvalues = cast_byte(nupvals); + return c; +} + + +LClosure *luaF_newLclosure (lua_State *L, int nupvals) { + GCObject *o = luaC_newobj(L, LUA_VLCL, sizeLclosure(nupvals)); + LClosure *c = gco2lcl(o); + c->p = NULL; + c->nupvalues = cast_byte(nupvals); + while (nupvals--) c->upvals[nupvals] = NULL; + return c; +} + + +/* +** fill a closure with new closed upvalues +*/ +void luaF_initupvals (lua_State *L, LClosure *cl) { + int i; + for (i = 0; i < cl->nupvalues; i++) { + GCObject *o = luaC_newobj(L, LUA_VUPVAL, sizeof(UpVal)); + UpVal *uv = gco2upv(o); + uv->v.p = &uv->u.value; /* make it closed */ + setnilvalue(uv->v.p); + cl->upvals[i] = uv; + luaC_objbarrier(L, cl, uv); + } +} + + +/* +** Create a new upvalue at the given level, and link it to the list of +** open upvalues of 'L' after entry 'prev'. +**/ +static UpVal *newupval (lua_State *L, StkId level, UpVal **prev) { + GCObject *o = luaC_newobj(L, LUA_VUPVAL, sizeof(UpVal)); + UpVal *uv = gco2upv(o); + UpVal *next = *prev; + uv->v.p = s2v(level); /* current value lives in the stack */ + uv->u.open.next = next; /* link it to list of open upvalues */ + uv->u.open.previous = prev; + if (next) + next->u.open.previous = &uv->u.open.next; + *prev = uv; + if (!isintwups(L)) { /* thread not in list of threads with upvalues? */ + L->twups = G(L)->twups; /* link it to the list */ + G(L)->twups = L; + } + return uv; +} + + +/* +** Find and reuse, or create if it does not exist, an upvalue +** at the given level. +*/ +UpVal *luaF_findupval (lua_State *L, StkId level) { + UpVal **pp = &L->openupval; + UpVal *p; + lua_assert(isintwups(L) || L->openupval == NULL); + while ((p = *pp) != NULL && uplevel(p) >= level) { /* search for it */ + lua_assert(!isdead(G(L), p)); + if (uplevel(p) == level) /* corresponding upvalue? */ + return p; /* return it */ + pp = &p->u.open.next; + } + /* not found: create a new upvalue after 'pp' */ + return newupval(L, level, pp); +} + + +/* +** Call closing method for object 'obj' with error message 'err'. The +** boolean 'yy' controls whether the call is yieldable. +** (This function assumes EXTRA_STACK.) +*/ +static void callclosemethod (lua_State *L, TValue *obj, TValue *err, int yy) { + StkId top = L->top.p; + const TValue *tm = luaT_gettmbyobj(L, obj, TM_CLOSE); + setobj2s(L, top, tm); /* will call metamethod... */ + setobj2s(L, top + 1, obj); /* with 'self' as the 1st argument */ + setobj2s(L, top + 2, err); /* and error msg. as 2nd argument */ + L->top.p = top + 3; /* add function and arguments */ + if (yy) + luaD_call(L, top, 0); + else + luaD_callnoyield(L, top, 0); +} + + +/* +** Check whether object at given level has a close metamethod and raise +** an error if not. +*/ +static void checkclosemth (lua_State *L, StkId level) { + const TValue *tm = luaT_gettmbyobj(L, s2v(level), TM_CLOSE); + if (ttisnil(tm)) { /* no metamethod? */ + int idx = cast_int(level - L->ci->func.p); /* variable index */ + const char *vname = luaG_findlocal(L, L->ci, idx, NULL); + if (vname == NULL) vname = "?"; + luaG_runerror(L, "variable '%s' got a non-closable value", vname); + } +} + + +/* +** Prepare and call a closing method. +** If status is CLOSEKTOP, the call to the closing method will be pushed +** at the top of the stack. Otherwise, values can be pushed right after +** the 'level' of the upvalue being closed, as everything after that +** won't be used again. +*/ +static void prepcallclosemth (lua_State *L, StkId level, int status, int yy) { + TValue *uv = s2v(level); /* value being closed */ + TValue *errobj; + if (status == CLOSEKTOP) + errobj = &G(L)->nilvalue; /* error object is nil */ + else { /* 'luaD_seterrorobj' will set top to level + 2 */ + errobj = s2v(level + 1); /* error object goes after 'uv' */ + luaD_seterrorobj(L, status, level + 1); /* set error object */ + } + callclosemethod(L, uv, errobj, yy); +} + + +/* +** Maximum value for deltas in 'tbclist', dependent on the type +** of delta. (This macro assumes that an 'L' is in scope where it +** is used.) +*/ +#define MAXDELTA \ + ((256ul << ((sizeof(L->stack.p->tbclist.delta) - 1) * 8)) - 1) + + +/* +** Insert a variable in the list of to-be-closed variables. +*/ +void luaF_newtbcupval (lua_State *L, StkId level) { + lua_assert(level > L->tbclist.p); + if (l_isfalse(s2v(level))) + return; /* false doesn't need to be closed */ + checkclosemth(L, level); /* value must have a close method */ + while (cast_uint(level - L->tbclist.p) > MAXDELTA) { + L->tbclist.p += MAXDELTA; /* create a dummy node at maximum delta */ + L->tbclist.p->tbclist.delta = 0; + } + level->tbclist.delta = cast(unsigned short, level - L->tbclist.p); + L->tbclist.p = level; +} + + +void luaF_unlinkupval (UpVal *uv) { + lua_assert(upisopen(uv)); + *uv->u.open.previous = uv->u.open.next; + if (uv->u.open.next) + uv->u.open.next->u.open.previous = uv->u.open.previous; +} + + +/* +** Close all upvalues up to the given stack level. +*/ +void luaF_closeupval (lua_State *L, StkId level) { + UpVal *uv; + StkId upl; /* stack index pointed by 'uv' */ + while ((uv = L->openupval) != NULL && (upl = uplevel(uv)) >= level) { + TValue *slot = &uv->u.value; /* new position for value */ + lua_assert(uplevel(uv) < L->top.p); + luaF_unlinkupval(uv); /* remove upvalue from 'openupval' list */ + setobj(L, slot, uv->v.p); /* move value to upvalue slot */ + uv->v.p = slot; /* now current value lives here */ + if (!iswhite(uv)) { /* neither white nor dead? */ + nw2black(uv); /* closed upvalues cannot be gray */ + luaC_barrier(L, uv, slot); + } + } +} + + +/* +** Remove first element from the tbclist plus its dummy nodes. +*/ +static void poptbclist (lua_State *L) { + StkId tbc = L->tbclist.p; + lua_assert(tbc->tbclist.delta > 0); /* first element cannot be dummy */ + tbc -= tbc->tbclist.delta; + while (tbc > L->stack.p && tbc->tbclist.delta == 0) + tbc -= MAXDELTA; /* remove dummy nodes */ + L->tbclist.p = tbc; +} + + +/* +** Close all upvalues and to-be-closed variables up to the given stack +** level. Return restored 'level'. +*/ +StkId luaF_close (lua_State *L, StkId level, int status, int yy) { + ptrdiff_t levelrel = savestack(L, level); + luaF_closeupval(L, level); /* first, close the upvalues */ + while (L->tbclist.p >= level) { /* traverse tbc's down to that level */ + StkId tbc = L->tbclist.p; /* get variable index */ + poptbclist(L); /* remove it from list */ + prepcallclosemth(L, tbc, status, yy); /* close variable */ + level = restorestack(L, levelrel); + } + return level; +} + + +Proto *luaF_newproto (lua_State *L) { + GCObject *o = luaC_newobj(L, LUA_VPROTO, sizeof(Proto)); + Proto *f = gco2p(o); + f->k = NULL; + f->sizek = 0; + f->p = NULL; + f->sizep = 0; + f->code = NULL; + f->sizecode = 0; + f->lineinfo = NULL; + f->sizelineinfo = 0; + f->abslineinfo = NULL; + f->sizeabslineinfo = 0; + f->upvalues = NULL; + f->sizeupvalues = 0; + f->numparams = 0; + f->is_vararg = 0; + f->maxstacksize = 0; + f->locvars = NULL; + f->sizelocvars = 0; + f->linedefined = 0; + f->lastlinedefined = 0; + f->source = NULL; + return f; +} + + +void luaF_freeproto (lua_State *L, Proto *f) { + luaM_freearray(L, f->code, f->sizecode); + luaM_freearray(L, f->p, f->sizep); + luaM_freearray(L, f->k, f->sizek); + luaM_freearray(L, f->lineinfo, f->sizelineinfo); + luaM_freearray(L, f->abslineinfo, f->sizeabslineinfo); + luaM_freearray(L, f->locvars, f->sizelocvars); + luaM_freearray(L, f->upvalues, f->sizeupvalues); + luaM_free(L, f); +} + + +/* +** Look for n-th local variable at line 'line' in function 'func'. +** Returns NULL if not found. +*/ +const char *luaF_getlocalname (const Proto *f, int local_number, int pc) { + int i; + for (i = 0; i<f->sizelocvars && f->locvars[i].startpc <= pc; i++) { + if (pc < f->locvars[i].endpc) { /* is variable active? */ + local_number--; + if (local_number == 0) + return getstr(f->locvars[i].varname); + } + } + return NULL; /* not found */ +} + diff --git a/vendor/lua-5.4.8/src/lfunc.h b/vendor/lua-5.4.8/src/lfunc.h new file mode 100644 index 0000000..3be265e --- /dev/null +++ b/vendor/lua-5.4.8/src/lfunc.h @@ -0,0 +1,64 @@ +/* +** $Id: lfunc.h $ +** Auxiliary functions to manipulate prototypes and closures +** See Copyright Notice in lua.h +*/ + +#ifndef lfunc_h +#define lfunc_h + + +#include "lobject.h" + + +#define sizeCclosure(n) (cast_int(offsetof(CClosure, upvalue)) + \ + cast_int(sizeof(TValue)) * (n)) + +#define sizeLclosure(n) (cast_int(offsetof(LClosure, upvals)) + \ + cast_int(sizeof(TValue *)) * (n)) + + +/* test whether thread is in 'twups' list */ +#define isintwups(L) (L->twups != L) + + +/* +** maximum number of upvalues in a closure (both C and Lua). (Value +** must fit in a VM register.) +*/ +#define MAXUPVAL 255 + + +#define upisopen(up) ((up)->v.p != &(up)->u.value) + + +#define uplevel(up) check_exp(upisopen(up), cast(StkId, (up)->v.p)) + + +/* +** maximum number of misses before giving up the cache of closures +** in prototypes +*/ +#define MAXMISS 10 + + + +/* special status to close upvalues preserving the top of the stack */ +#define CLOSEKTOP (-1) + + +LUAI_FUNC Proto *luaF_newproto (lua_State *L); +LUAI_FUNC CClosure *luaF_newCclosure (lua_State *L, int nupvals); +LUAI_FUNC LClosure *luaF_newLclosure (lua_State *L, int nupvals); +LUAI_FUNC void luaF_initupvals (lua_State *L, LClosure *cl); +LUAI_FUNC UpVal *luaF_findupval (lua_State *L, StkId level); +LUAI_FUNC void luaF_newtbcupval (lua_State *L, StkId level); +LUAI_FUNC void luaF_closeupval (lua_State *L, StkId level); +LUAI_FUNC StkId luaF_close (lua_State *L, StkId level, int status, int yy); +LUAI_FUNC void luaF_unlinkupval (UpVal *uv); +LUAI_FUNC void luaF_freeproto (lua_State *L, Proto *f); +LUAI_FUNC const char *luaF_getlocalname (const Proto *func, int local_number, + int pc); + + +#endif diff --git a/vendor/lua-5.4.8/src/lgc.c b/vendor/lua-5.4.8/src/lgc.c new file mode 100644 index 0000000..5817f9e --- /dev/null +++ b/vendor/lua-5.4.8/src/lgc.c @@ -0,0 +1,1743 @@ +/* +** $Id: lgc.c $ +** Garbage Collector +** See Copyright Notice in lua.h +*/ + +#define lgc_c +#define LUA_CORE + +#include "lprefix.h" + +#include <stdio.h> +#include <string.h> + + +#include "lua.h" + +#include "ldebug.h" +#include "ldo.h" +#include "lfunc.h" +#include "lgc.h" +#include "lmem.h" +#include "lobject.h" +#include "lstate.h" +#include "lstring.h" +#include "ltable.h" +#include "ltm.h" + + +/* +** Maximum number of elements to sweep in each single step. +** (Large enough to dissipate fixed overheads but small enough +** to allow small steps for the collector.) +*/ +#define GCSWEEPMAX 100 + +/* +** Maximum number of finalizers to call in each single step. +*/ +#define GCFINMAX 10 + + +/* +** Cost of calling one finalizer. +*/ +#define GCFINALIZECOST 50 + + +/* +** The equivalent, in bytes, of one unit of "work" (visiting a slot, +** sweeping an object, etc.) +*/ +#define WORK2MEM sizeof(TValue) + + +/* +** macro to adjust 'pause': 'pause' is actually used like +** 'pause / PAUSEADJ' (value chosen by tests) +*/ +#define PAUSEADJ 100 + + +/* mask with all color bits */ +#define maskcolors (bitmask(BLACKBIT) | WHITEBITS) + +/* mask with all GC bits */ +#define maskgcbits (maskcolors | AGEBITS) + + +/* macro to erase all color bits then set only the current white bit */ +#define makewhite(g,x) \ + (x->marked = cast_byte((x->marked & ~maskcolors) | luaC_white(g))) + +/* make an object gray (neither white nor black) */ +#define set2gray(x) resetbits(x->marked, maskcolors) + + +/* make an object black (coming from any color) */ +#define set2black(x) \ + (x->marked = cast_byte((x->marked & ~WHITEBITS) | bitmask(BLACKBIT))) + + +#define valiswhite(x) (iscollectable(x) && iswhite(gcvalue(x))) + +#define keyiswhite(n) (keyiscollectable(n) && iswhite(gckey(n))) + + +/* +** Protected access to objects in values +*/ +#define gcvalueN(o) (iscollectable(o) ? gcvalue(o) : NULL) + + +#define markvalue(g,o) { checkliveness(g->mainthread,o); \ + if (valiswhite(o)) reallymarkobject(g,gcvalue(o)); } + +#define markkey(g, n) { if keyiswhite(n) reallymarkobject(g,gckey(n)); } + +#define markobject(g,t) { if (iswhite(t)) reallymarkobject(g, obj2gco(t)); } + +/* +** mark an object that can be NULL (either because it is really optional, +** or it was stripped as debug info, or inside an uncompleted structure) +*/ +#define markobjectN(g,t) { if (t) markobject(g,t); } + +static void reallymarkobject (global_State *g, GCObject *o); +static lu_mem atomic (lua_State *L); +static void entersweep (lua_State *L); + + +/* +** {====================================================== +** Generic functions +** ======================================================= +*/ + + +/* +** one after last element in a hash array +*/ +#define gnodelast(h) gnode(h, cast_sizet(sizenode(h))) + + +static GCObject **getgclist (GCObject *o) { + switch (o->tt) { + case LUA_VTABLE: return &gco2t(o)->gclist; + case LUA_VLCL: return &gco2lcl(o)->gclist; + case LUA_VCCL: return &gco2ccl(o)->gclist; + case LUA_VTHREAD: return &gco2th(o)->gclist; + case LUA_VPROTO: return &gco2p(o)->gclist; + case LUA_VUSERDATA: { + Udata *u = gco2u(o); + lua_assert(u->nuvalue > 0); + return &u->gclist; + } + default: lua_assert(0); return 0; + } +} + + +/* +** Link a collectable object 'o' with a known type into the list 'p'. +** (Must be a macro to access the 'gclist' field in different types.) +*/ +#define linkgclist(o,p) linkgclist_(obj2gco(o), &(o)->gclist, &(p)) + +static void linkgclist_ (GCObject *o, GCObject **pnext, GCObject **list) { + lua_assert(!isgray(o)); /* cannot be in a gray list */ + *pnext = *list; + *list = o; + set2gray(o); /* now it is */ +} + + +/* +** Link a generic collectable object 'o' into the list 'p'. +*/ +#define linkobjgclist(o,p) linkgclist_(obj2gco(o), getgclist(o), &(p)) + + + +/* +** Clear keys for empty entries in tables. If entry is empty, mark its +** entry as dead. This allows the collection of the key, but keeps its +** entry in the table: its removal could break a chain and could break +** a table traversal. Other places never manipulate dead keys, because +** its associated empty value is enough to signal that the entry is +** logically empty. +*/ +static void clearkey (Node *n) { + lua_assert(isempty(gval(n))); + if (keyiscollectable(n)) + setdeadkey(n); /* unused key; remove it */ +} + + +/* +** tells whether a key or value can be cleared from a weak +** table. Non-collectable objects are never removed from weak +** tables. Strings behave as 'values', so are never removed too. for +** other objects: if really collected, cannot keep them; for objects +** being finalized, keep them in keys, but not in values +*/ +static int iscleared (global_State *g, const GCObject *o) { + if (o == NULL) return 0; /* non-collectable value */ + else if (novariant(o->tt) == LUA_TSTRING) { + markobject(g, o); /* strings are 'values', so are never weak */ + return 0; + } + else return iswhite(o); +} + + +/* +** Barrier that moves collector forward, that is, marks the white object +** 'v' being pointed by the black object 'o'. In the generational +** mode, 'v' must also become old, if 'o' is old; however, it cannot +** be changed directly to OLD, because it may still point to non-old +** objects. So, it is marked as OLD0. In the next cycle it will become +** OLD1, and in the next it will finally become OLD (regular old). By +** then, any object it points to will also be old. If called in the +** incremental sweep phase, it clears the black object to white (sweep +** it) to avoid other barrier calls for this same object. (That cannot +** be done is generational mode, as its sweep does not distinguish +** whites from deads.) +*/ +void luaC_barrier_ (lua_State *L, GCObject *o, GCObject *v) { + global_State *g = G(L); + lua_assert(isblack(o) && iswhite(v) && !isdead(g, v) && !isdead(g, o)); + if (keepinvariant(g)) { /* must keep invariant? */ + reallymarkobject(g, v); /* restore invariant */ + if (isold(o)) { + lua_assert(!isold(v)); /* white object could not be old */ + setage(v, G_OLD0); /* restore generational invariant */ + } + } + else { /* sweep phase */ + lua_assert(issweepphase(g)); + if (g->gckind == KGC_INC) /* incremental mode? */ + makewhite(g, o); /* mark 'o' as white to avoid other barriers */ + } +} + + +/* +** barrier that moves collector backward, that is, mark the black object +** pointing to a white object as gray again. +*/ +void luaC_barrierback_ (lua_State *L, GCObject *o) { + global_State *g = G(L); + lua_assert(isblack(o) && !isdead(g, o)); + lua_assert((g->gckind == KGC_GEN) == (isold(o) && getage(o) != G_TOUCHED1)); + if (getage(o) == G_TOUCHED2) /* already in gray list? */ + set2gray(o); /* make it gray to become touched1 */ + else /* link it in 'grayagain' and paint it gray */ + linkobjgclist(o, g->grayagain); + if (isold(o)) /* generational mode? */ + setage(o, G_TOUCHED1); /* touched in current cycle */ +} + + +void luaC_fix (lua_State *L, GCObject *o) { + global_State *g = G(L); + lua_assert(g->allgc == o); /* object must be 1st in 'allgc' list! */ + set2gray(o); /* they will be gray forever */ + setage(o, G_OLD); /* and old forever */ + g->allgc = o->next; /* remove object from 'allgc' list */ + o->next = g->fixedgc; /* link it to 'fixedgc' list */ + g->fixedgc = o; +} + + +/* +** create a new collectable object (with given type, size, and offset) +** and link it to 'allgc' list. +*/ +GCObject *luaC_newobjdt (lua_State *L, int tt, size_t sz, size_t offset) { + global_State *g = G(L); + char *p = cast_charp(luaM_newobject(L, novariant(tt), sz)); + GCObject *o = cast(GCObject *, p + offset); + o->marked = luaC_white(g); + o->tt = tt; + o->next = g->allgc; + g->allgc = o; + return o; +} + + +GCObject *luaC_newobj (lua_State *L, int tt, size_t sz) { + return luaC_newobjdt(L, tt, sz, 0); +} + +/* }====================================================== */ + + + +/* +** {====================================================== +** Mark functions +** ======================================================= +*/ + + +/* +** Mark an object. Userdata with no user values, strings, and closed +** upvalues are visited and turned black here. Open upvalues are +** already indirectly linked through their respective threads in the +** 'twups' list, so they don't go to the gray list; nevertheless, they +** are kept gray to avoid barriers, as their values will be revisited +** by the thread or by 'remarkupvals'. Other objects are added to the +** gray list to be visited (and turned black) later. Both userdata and +** upvalues can call this function recursively, but this recursion goes +** for at most two levels: An upvalue cannot refer to another upvalue +** (only closures can), and a userdata's metatable must be a table. +*/ +static void reallymarkobject (global_State *g, GCObject *o) { + switch (o->tt) { + case LUA_VSHRSTR: + case LUA_VLNGSTR: { + set2black(o); /* nothing to visit */ + break; + } + case LUA_VUPVAL: { + UpVal *uv = gco2upv(o); + if (upisopen(uv)) + set2gray(uv); /* open upvalues are kept gray */ + else + set2black(uv); /* closed upvalues are visited here */ + markvalue(g, uv->v.p); /* mark its content */ + break; + } + case LUA_VUSERDATA: { + Udata *u = gco2u(o); + if (u->nuvalue == 0) { /* no user values? */ + markobjectN(g, u->metatable); /* mark its metatable */ + set2black(u); /* nothing else to mark */ + break; + } + /* else... */ + } /* FALLTHROUGH */ + case LUA_VLCL: case LUA_VCCL: case LUA_VTABLE: + case LUA_VTHREAD: case LUA_VPROTO: { + linkobjgclist(o, g->gray); /* to be visited later */ + break; + } + default: lua_assert(0); break; + } +} + + +/* +** mark metamethods for basic types +*/ +static void markmt (global_State *g) { + int i; + for (i=0; i < LUA_NUMTAGS; i++) + markobjectN(g, g->mt[i]); +} + + +/* +** mark all objects in list of being-finalized +*/ +static lu_mem markbeingfnz (global_State *g) { + GCObject *o; + lu_mem count = 0; + for (o = g->tobefnz; o != NULL; o = o->next) { + count++; + markobject(g, o); + } + return count; +} + + +/* +** For each non-marked thread, simulates a barrier between each open +** upvalue and its value. (If the thread is collected, the value will be +** assigned to the upvalue, but then it can be too late for the barrier +** to act. The "barrier" does not need to check colors: A non-marked +** thread must be young; upvalues cannot be older than their threads; so +** any visited upvalue must be young too.) Also removes the thread from +** the list, as it was already visited. Removes also threads with no +** upvalues, as they have nothing to be checked. (If the thread gets an +** upvalue later, it will be linked in the list again.) +*/ +static int remarkupvals (global_State *g) { + lua_State *thread; + lua_State **p = &g->twups; + int work = 0; /* estimate of how much work was done here */ + while ((thread = *p) != NULL) { + work++; + if (!iswhite(thread) && thread->openupval != NULL) + p = &thread->twups; /* keep marked thread with upvalues in the list */ + else { /* thread is not marked or without upvalues */ + UpVal *uv; + lua_assert(!isold(thread) || thread->openupval == NULL); + *p = thread->twups; /* remove thread from the list */ + thread->twups = thread; /* mark that it is out of list */ + for (uv = thread->openupval; uv != NULL; uv = uv->u.open.next) { + lua_assert(getage(uv) <= getage(thread)); + work++; + if (!iswhite(uv)) { /* upvalue already visited? */ + lua_assert(upisopen(uv) && isgray(uv)); + markvalue(g, uv->v.p); /* mark its value */ + } + } + } + } + return work; +} + + +static void cleargraylists (global_State *g) { + g->gray = g->grayagain = NULL; + g->weak = g->allweak = g->ephemeron = NULL; +} + + +/* +** mark root set and reset all gray lists, to start a new collection +*/ +static void restartcollection (global_State *g) { + cleargraylists(g); + markobject(g, g->mainthread); + markvalue(g, &g->l_registry); + markmt(g); + markbeingfnz(g); /* mark any finalizing object left from previous cycle */ +} + +/* }====================================================== */ + + +/* +** {====================================================== +** Traverse functions +** ======================================================= +*/ + + +/* +** Check whether object 'o' should be kept in the 'grayagain' list for +** post-processing by 'correctgraylist'. (It could put all old objects +** in the list and leave all the work to 'correctgraylist', but it is +** more efficient to avoid adding elements that will be removed.) Only +** TOUCHED1 objects need to be in the list. TOUCHED2 doesn't need to go +** back to a gray list, but then it must become OLD. (That is what +** 'correctgraylist' does when it finds a TOUCHED2 object.) +*/ +static void genlink (global_State *g, GCObject *o) { + lua_assert(isblack(o)); + if (getage(o) == G_TOUCHED1) { /* touched in this cycle? */ + linkobjgclist(o, g->grayagain); /* link it back in 'grayagain' */ + } /* everything else do not need to be linked back */ + else if (getage(o) == G_TOUCHED2) + changeage(o, G_TOUCHED2, G_OLD); /* advance age */ +} + + +/* +** Traverse a table with weak values and link it to proper list. During +** propagate phase, keep it in 'grayagain' list, to be revisited in the +** atomic phase. In the atomic phase, if table has any white value, +** put it in 'weak' list, to be cleared. +*/ +static void traverseweakvalue (global_State *g, Table *h) { + Node *n, *limit = gnodelast(h); + /* if there is array part, assume it may have white values (it is not + worth traversing it now just to check) */ + int hasclears = (h->alimit > 0); + for (n = gnode(h, 0); n < limit; n++) { /* traverse hash part */ + if (isempty(gval(n))) /* entry is empty? */ + clearkey(n); /* clear its key */ + else { + lua_assert(!keyisnil(n)); + markkey(g, n); + if (!hasclears && iscleared(g, gcvalueN(gval(n)))) /* a white value? */ + hasclears = 1; /* table will have to be cleared */ + } + } + if (g->gcstate == GCSatomic && hasclears) + linkgclist(h, g->weak); /* has to be cleared later */ + else + linkgclist(h, g->grayagain); /* must retraverse it in atomic phase */ +} + + +/* +** Traverse an ephemeron table and link it to proper list. Returns true +** iff any object was marked during this traversal (which implies that +** convergence has to continue). During propagation phase, keep table +** in 'grayagain' list, to be visited again in the atomic phase. In +** the atomic phase, if table has any white->white entry, it has to +** be revisited during ephemeron convergence (as that key may turn +** black). Otherwise, if it has any white key, table has to be cleared +** (in the atomic phase). In generational mode, some tables +** must be kept in some gray list for post-processing; this is done +** by 'genlink'. +*/ +static int traverseephemeron (global_State *g, Table *h, int inv) { + int marked = 0; /* true if an object is marked in this traversal */ + int hasclears = 0; /* true if table has white keys */ + int hasww = 0; /* true if table has entry "white-key -> white-value" */ + unsigned int i; + unsigned int asize = luaH_realasize(h); + unsigned int nsize = sizenode(h); + /* traverse array part */ + for (i = 0; i < asize; i++) { + if (valiswhite(&h->array[i])) { + marked = 1; + reallymarkobject(g, gcvalue(&h->array[i])); + } + } + /* traverse hash part; if 'inv', traverse descending + (see 'convergeephemerons') */ + for (i = 0; i < nsize; i++) { + Node *n = inv ? gnode(h, nsize - 1 - i) : gnode(h, i); + if (isempty(gval(n))) /* entry is empty? */ + clearkey(n); /* clear its key */ + else if (iscleared(g, gckeyN(n))) { /* key is not marked (yet)? */ + hasclears = 1; /* table must be cleared */ + if (valiswhite(gval(n))) /* value not marked yet? */ + hasww = 1; /* white-white entry */ + } + else if (valiswhite(gval(n))) { /* value not marked yet? */ + marked = 1; + reallymarkobject(g, gcvalue(gval(n))); /* mark it now */ + } + } + /* link table into proper list */ + if (g->gcstate == GCSpropagate) + linkgclist(h, g->grayagain); /* must retraverse it in atomic phase */ + else if (hasww) /* table has white->white entries? */ + linkgclist(h, g->ephemeron); /* have to propagate again */ + else if (hasclears) /* table has white keys? */ + linkgclist(h, g->allweak); /* may have to clean white keys */ + else + genlink(g, obj2gco(h)); /* check whether collector still needs to see it */ + return marked; +} + + +static void traversestrongtable (global_State *g, Table *h) { + Node *n, *limit = gnodelast(h); + unsigned int i; + unsigned int asize = luaH_realasize(h); + for (i = 0; i < asize; i++) /* traverse array part */ + markvalue(g, &h->array[i]); + for (n = gnode(h, 0); n < limit; n++) { /* traverse hash part */ + if (isempty(gval(n))) /* entry is empty? */ + clearkey(n); /* clear its key */ + else { + lua_assert(!keyisnil(n)); + markkey(g, n); + markvalue(g, gval(n)); + } + } + genlink(g, obj2gco(h)); +} + + +static lu_mem traversetable (global_State *g, Table *h) { + const char *weakkey, *weakvalue; + const TValue *mode = gfasttm(g, h->metatable, TM_MODE); + TString *smode; + markobjectN(g, h->metatable); + if (mode && ttisshrstring(mode) && /* is there a weak mode? */ + (cast_void(smode = tsvalue(mode)), + cast_void(weakkey = strchr(getshrstr(smode), 'k')), + cast_void(weakvalue = strchr(getshrstr(smode), 'v')), + (weakkey || weakvalue))) { /* is really weak? */ + if (!weakkey) /* strong keys? */ + traverseweakvalue(g, h); + else if (!weakvalue) /* strong values? */ + traverseephemeron(g, h, 0); + else /* all weak */ + linkgclist(h, g->allweak); /* nothing to traverse now */ + } + else /* not weak */ + traversestrongtable(g, h); + return 1 + h->alimit + 2 * allocsizenode(h); +} + + +static int traverseudata (global_State *g, Udata *u) { + int i; + markobjectN(g, u->metatable); /* mark its metatable */ + for (i = 0; i < u->nuvalue; i++) + markvalue(g, &u->uv[i].uv); + genlink(g, obj2gco(u)); + return 1 + u->nuvalue; +} + + +/* +** Traverse a prototype. (While a prototype is being build, its +** arrays can be larger than needed; the extra slots are filled with +** NULL, so the use of 'markobjectN') +*/ +static int traverseproto (global_State *g, Proto *f) { + int i; + markobjectN(g, f->source); + for (i = 0; i < f->sizek; i++) /* mark literals */ + markvalue(g, &f->k[i]); + for (i = 0; i < f->sizeupvalues; i++) /* mark upvalue names */ + markobjectN(g, f->upvalues[i].name); + for (i = 0; i < f->sizep; i++) /* mark nested protos */ + markobjectN(g, f->p[i]); + for (i = 0; i < f->sizelocvars; i++) /* mark local-variable names */ + markobjectN(g, f->locvars[i].varname); + return 1 + f->sizek + f->sizeupvalues + f->sizep + f->sizelocvars; +} + + +static int traverseCclosure (global_State *g, CClosure *cl) { + int i; + for (i = 0; i < cl->nupvalues; i++) /* mark its upvalues */ + markvalue(g, &cl->upvalue[i]); + return 1 + cl->nupvalues; +} + +/* +** Traverse a Lua closure, marking its prototype and its upvalues. +** (Both can be NULL while closure is being created.) +*/ +static int traverseLclosure (global_State *g, LClosure *cl) { + int i; + markobjectN(g, cl->p); /* mark its prototype */ + for (i = 0; i < cl->nupvalues; i++) { /* visit its upvalues */ + UpVal *uv = cl->upvals[i]; + markobjectN(g, uv); /* mark upvalue */ + } + return 1 + cl->nupvalues; +} + + +/* +** Traverse a thread, marking the elements in the stack up to its top +** and cleaning the rest of the stack in the final traversal. That +** ensures that the entire stack have valid (non-dead) objects. +** Threads have no barriers. In gen. mode, old threads must be visited +** at every cycle, because they might point to young objects. In inc. +** mode, the thread can still be modified before the end of the cycle, +** and therefore it must be visited again in the atomic phase. To ensure +** these visits, threads must return to a gray list if they are not new +** (which can only happen in generational mode) or if the traverse is in +** the propagate phase (which can only happen in incremental mode). +*/ +static int traversethread (global_State *g, lua_State *th) { + UpVal *uv; + StkId o = th->stack.p; + if (isold(th) || g->gcstate == GCSpropagate) + linkgclist(th, g->grayagain); /* insert into 'grayagain' list */ + if (o == NULL) + return 1; /* stack not completely built yet */ + lua_assert(g->gcstate == GCSatomic || + th->openupval == NULL || isintwups(th)); + for (; o < th->top.p; o++) /* mark live elements in the stack */ + markvalue(g, s2v(o)); + for (uv = th->openupval; uv != NULL; uv = uv->u.open.next) + markobject(g, uv); /* open upvalues cannot be collected */ + if (g->gcstate == GCSatomic) { /* final traversal? */ + if (!g->gcemergency) + luaD_shrinkstack(th); /* do not change stack in emergency cycle */ + for (o = th->top.p; o < th->stack_last.p + EXTRA_STACK; o++) + setnilvalue(s2v(o)); /* clear dead stack slice */ + /* 'remarkupvals' may have removed thread from 'twups' list */ + if (!isintwups(th) && th->openupval != NULL) { + th->twups = g->twups; /* link it back to the list */ + g->twups = th; + } + } + return 1 + stacksize(th); +} + + +/* +** traverse one gray object, turning it to black. +*/ +static lu_mem propagatemark (global_State *g) { + GCObject *o = g->gray; + nw2black(o); + g->gray = *getgclist(o); /* remove from 'gray' list */ + switch (o->tt) { + case LUA_VTABLE: return traversetable(g, gco2t(o)); + case LUA_VUSERDATA: return traverseudata(g, gco2u(o)); + case LUA_VLCL: return traverseLclosure(g, gco2lcl(o)); + case LUA_VCCL: return traverseCclosure(g, gco2ccl(o)); + case LUA_VPROTO: return traverseproto(g, gco2p(o)); + case LUA_VTHREAD: return traversethread(g, gco2th(o)); + default: lua_assert(0); return 0; + } +} + + +static lu_mem propagateall (global_State *g) { + lu_mem tot = 0; + while (g->gray) + tot += propagatemark(g); + return tot; +} + + +/* +** Traverse all ephemeron tables propagating marks from keys to values. +** Repeat until it converges, that is, nothing new is marked. 'dir' +** inverts the direction of the traversals, trying to speed up +** convergence on chains in the same table. +** +*/ +static void convergeephemerons (global_State *g) { + int changed; + int dir = 0; + do { + GCObject *w; + GCObject *next = g->ephemeron; /* get ephemeron list */ + g->ephemeron = NULL; /* tables may return to this list when traversed */ + changed = 0; + while ((w = next) != NULL) { /* for each ephemeron table */ + Table *h = gco2t(w); + next = h->gclist; /* list is rebuilt during loop */ + nw2black(h); /* out of the list (for now) */ + if (traverseephemeron(g, h, dir)) { /* marked some value? */ + propagateall(g); /* propagate changes */ + changed = 1; /* will have to revisit all ephemeron tables */ + } + } + dir = !dir; /* invert direction next time */ + } while (changed); /* repeat until no more changes */ +} + +/* }====================================================== */ + + +/* +** {====================================================== +** Sweep Functions +** ======================================================= +*/ + + +/* +** clear entries with unmarked keys from all weaktables in list 'l' +*/ +static void clearbykeys (global_State *g, GCObject *l) { + for (; l; l = gco2t(l)->gclist) { + Table *h = gco2t(l); + Node *limit = gnodelast(h); + Node *n; + for (n = gnode(h, 0); n < limit; n++) { + if (iscleared(g, gckeyN(n))) /* unmarked key? */ + setempty(gval(n)); /* remove entry */ + if (isempty(gval(n))) /* is entry empty? */ + clearkey(n); /* clear its key */ + } + } +} + + +/* +** clear entries with unmarked values from all weaktables in list 'l' up +** to element 'f' +*/ +static void clearbyvalues (global_State *g, GCObject *l, GCObject *f) { + for (; l != f; l = gco2t(l)->gclist) { + Table *h = gco2t(l); + Node *n, *limit = gnodelast(h); + unsigned int i; + unsigned int asize = luaH_realasize(h); + for (i = 0; i < asize; i++) { + TValue *o = &h->array[i]; + if (iscleared(g, gcvalueN(o))) /* value was collected? */ + setempty(o); /* remove entry */ + } + for (n = gnode(h, 0); n < limit; n++) { + if (iscleared(g, gcvalueN(gval(n)))) /* unmarked value? */ + setempty(gval(n)); /* remove entry */ + if (isempty(gval(n))) /* is entry empty? */ + clearkey(n); /* clear its key */ + } + } +} + + +static void freeupval (lua_State *L, UpVal *uv) { + if (upisopen(uv)) + luaF_unlinkupval(uv); + luaM_free(L, uv); +} + + +static void freeobj (lua_State *L, GCObject *o) { + switch (o->tt) { + case LUA_VPROTO: + luaF_freeproto(L, gco2p(o)); + break; + case LUA_VUPVAL: + freeupval(L, gco2upv(o)); + break; + case LUA_VLCL: { + LClosure *cl = gco2lcl(o); + luaM_freemem(L, cl, sizeLclosure(cl->nupvalues)); + break; + } + case LUA_VCCL: { + CClosure *cl = gco2ccl(o); + luaM_freemem(L, cl, sizeCclosure(cl->nupvalues)); + break; + } + case LUA_VTABLE: + luaH_free(L, gco2t(o)); + break; + case LUA_VTHREAD: + luaE_freethread(L, gco2th(o)); + break; + case LUA_VUSERDATA: { + Udata *u = gco2u(o); + luaM_freemem(L, o, sizeudata(u->nuvalue, u->len)); + break; + } + case LUA_VSHRSTR: { + TString *ts = gco2ts(o); + luaS_remove(L, ts); /* remove it from hash table */ + luaM_freemem(L, ts, sizelstring(ts->shrlen)); + break; + } + case LUA_VLNGSTR: { + TString *ts = gco2ts(o); + luaM_freemem(L, ts, sizelstring(ts->u.lnglen)); + break; + } + default: lua_assert(0); + } +} + + +/* +** sweep at most 'countin' elements from a list of GCObjects erasing dead +** objects, where a dead object is one marked with the old (non current) +** white; change all non-dead objects back to white, preparing for next +** collection cycle. Return where to continue the traversal or NULL if +** list is finished. ('*countout' gets the number of elements traversed.) +*/ +static GCObject **sweeplist (lua_State *L, GCObject **p, int countin, + int *countout) { + global_State *g = G(L); + int ow = otherwhite(g); + int i; + int white = luaC_white(g); /* current white */ + for (i = 0; *p != NULL && i < countin; i++) { + GCObject *curr = *p; + int marked = curr->marked; + if (isdeadm(ow, marked)) { /* is 'curr' dead? */ + *p = curr->next; /* remove 'curr' from list */ + freeobj(L, curr); /* erase 'curr' */ + } + else { /* change mark to 'white' */ + curr->marked = cast_byte((marked & ~maskgcbits) | white); + p = &curr->next; /* go to next element */ + } + } + if (countout) + *countout = i; /* number of elements traversed */ + return (*p == NULL) ? NULL : p; +} + + +/* +** sweep a list until a live object (or end of list) +*/ +static GCObject **sweeptolive (lua_State *L, GCObject **p) { + GCObject **old = p; + do { + p = sweeplist(L, p, 1, NULL); + } while (p == old); + return p; +} + +/* }====================================================== */ + + +/* +** {====================================================== +** Finalization +** ======================================================= +*/ + +/* +** If possible, shrink string table. +*/ +static void checkSizes (lua_State *L, global_State *g) { + if (!g->gcemergency) { + if (g->strt.nuse < g->strt.size / 4) { /* string table too big? */ + l_mem olddebt = g->GCdebt; + luaS_resize(L, g->strt.size / 2); + g->GCestimate += g->GCdebt - olddebt; /* correct estimate */ + } + } +} + + +/* +** Get the next udata to be finalized from the 'tobefnz' list, and +** link it back into the 'allgc' list. +*/ +static GCObject *udata2finalize (global_State *g) { + GCObject *o = g->tobefnz; /* get first element */ + lua_assert(tofinalize(o)); + g->tobefnz = o->next; /* remove it from 'tobefnz' list */ + o->next = g->allgc; /* return it to 'allgc' list */ + g->allgc = o; + resetbit(o->marked, FINALIZEDBIT); /* object is "normal" again */ + if (issweepphase(g)) + makewhite(g, o); /* "sweep" object */ + else if (getage(o) == G_OLD1) + g->firstold1 = o; /* it is the first OLD1 object in the list */ + return o; +} + + +static void dothecall (lua_State *L, void *ud) { + UNUSED(ud); + luaD_callnoyield(L, L->top.p - 2, 0); +} + + +static void GCTM (lua_State *L) { + global_State *g = G(L); + const TValue *tm; + TValue v; + lua_assert(!g->gcemergency); + setgcovalue(L, &v, udata2finalize(g)); + tm = luaT_gettmbyobj(L, &v, TM_GC); + if (!notm(tm)) { /* is there a finalizer? */ + int status; + lu_byte oldah = L->allowhook; + int oldgcstp = g->gcstp; + g->gcstp |= GCSTPGC; /* avoid GC steps */ + L->allowhook = 0; /* stop debug hooks during GC metamethod */ + setobj2s(L, L->top.p++, tm); /* push finalizer... */ + setobj2s(L, L->top.p++, &v); /* ... and its argument */ + L->ci->callstatus |= CIST_FIN; /* will run a finalizer */ + status = luaD_pcall(L, dothecall, NULL, savestack(L, L->top.p - 2), 0); + L->ci->callstatus &= ~CIST_FIN; /* not running a finalizer anymore */ + L->allowhook = oldah; /* restore hooks */ + g->gcstp = oldgcstp; /* restore state */ + if (l_unlikely(status != LUA_OK)) { /* error while running __gc? */ + luaE_warnerror(L, "__gc"); + L->top.p--; /* pops error object */ + } + } +} + + +/* +** Call a few finalizers +*/ +static int runafewfinalizers (lua_State *L, int n) { + global_State *g = G(L); + int i; + for (i = 0; i < n && g->tobefnz; i++) + GCTM(L); /* call one finalizer */ + return i; +} + + +/* +** call all pending finalizers +*/ +static void callallpendingfinalizers (lua_State *L) { + global_State *g = G(L); + while (g->tobefnz) + GCTM(L); +} + + +/* +** find last 'next' field in list 'p' list (to add elements in its end) +*/ +static GCObject **findlast (GCObject **p) { + while (*p != NULL) + p = &(*p)->next; + return p; +} + + +/* +** Move all unreachable objects (or 'all' objects) that need +** finalization from list 'finobj' to list 'tobefnz' (to be finalized). +** (Note that objects after 'finobjold1' cannot be white, so they +** don't need to be traversed. In incremental mode, 'finobjold1' is NULL, +** so the whole list is traversed.) +*/ +static void separatetobefnz (global_State *g, int all) { + GCObject *curr; + GCObject **p = &g->finobj; + GCObject **lastnext = findlast(&g->tobefnz); + while ((curr = *p) != g->finobjold1) { /* traverse all finalizable objects */ + lua_assert(tofinalize(curr)); + if (!(iswhite(curr) || all)) /* not being collected? */ + p = &curr->next; /* don't bother with it */ + else { + if (curr == g->finobjsur) /* removing 'finobjsur'? */ + g->finobjsur = curr->next; /* correct it */ + *p = curr->next; /* remove 'curr' from 'finobj' list */ + curr->next = *lastnext; /* link at the end of 'tobefnz' list */ + *lastnext = curr; + lastnext = &curr->next; + } + } +} + + +/* +** If pointer 'p' points to 'o', move it to the next element. +*/ +static void checkpointer (GCObject **p, GCObject *o) { + if (o == *p) + *p = o->next; +} + + +/* +** Correct pointers to objects inside 'allgc' list when +** object 'o' is being removed from the list. +*/ +static void correctpointers (global_State *g, GCObject *o) { + checkpointer(&g->survival, o); + checkpointer(&g->old1, o); + checkpointer(&g->reallyold, o); + checkpointer(&g->firstold1, o); +} + + +/* +** if object 'o' has a finalizer, remove it from 'allgc' list (must +** search the list to find it) and link it in 'finobj' list. +*/ +void luaC_checkfinalizer (lua_State *L, GCObject *o, Table *mt) { + global_State *g = G(L); + if (tofinalize(o) || /* obj. is already marked... */ + gfasttm(g, mt, TM_GC) == NULL || /* or has no finalizer... */ + (g->gcstp & GCSTPCLS)) /* or closing state? */ + return; /* nothing to be done */ + else { /* move 'o' to 'finobj' list */ + GCObject **p; + if (issweepphase(g)) { + makewhite(g, o); /* "sweep" object 'o' */ + if (g->sweepgc == &o->next) /* should not remove 'sweepgc' object */ + g->sweepgc = sweeptolive(L, g->sweepgc); /* change 'sweepgc' */ + } + else + correctpointers(g, o); + /* search for pointer pointing to 'o' */ + for (p = &g->allgc; *p != o; p = &(*p)->next) { /* empty */ } + *p = o->next; /* remove 'o' from 'allgc' list */ + o->next = g->finobj; /* link it in 'finobj' list */ + g->finobj = o; + l_setbit(o->marked, FINALIZEDBIT); /* mark it as such */ + } +} + +/* }====================================================== */ + + +/* +** {====================================================== +** Generational Collector +** ======================================================= +*/ + + +/* +** Set the "time" to wait before starting a new GC cycle; cycle will +** start when memory use hits the threshold of ('estimate' * pause / +** PAUSEADJ). (Division by 'estimate' should be OK: it cannot be zero, +** because Lua cannot even start with less than PAUSEADJ bytes). +*/ +static void setpause (global_State *g) { + l_mem threshold, debt; + int pause = getgcparam(g->gcpause); + l_mem estimate = g->GCestimate / PAUSEADJ; /* adjust 'estimate' */ + lua_assert(estimate > 0); + threshold = (pause < MAX_LMEM / estimate) /* overflow? */ + ? estimate * pause /* no overflow */ + : MAX_LMEM; /* overflow; truncate to maximum */ + debt = gettotalbytes(g) - threshold; + if (debt > 0) debt = 0; + luaE_setdebt(g, debt); +} + + +/* +** Sweep a list of objects to enter generational mode. Deletes dead +** objects and turns the non dead to old. All non-dead threads---which +** are now old---must be in a gray list. Everything else is not in a +** gray list. Open upvalues are also kept gray. +*/ +static void sweep2old (lua_State *L, GCObject **p) { + GCObject *curr; + global_State *g = G(L); + while ((curr = *p) != NULL) { + if (iswhite(curr)) { /* is 'curr' dead? */ + lua_assert(isdead(g, curr)); + *p = curr->next; /* remove 'curr' from list */ + freeobj(L, curr); /* erase 'curr' */ + } + else { /* all surviving objects become old */ + setage(curr, G_OLD); + if (curr->tt == LUA_VTHREAD) { /* threads must be watched */ + lua_State *th = gco2th(curr); + linkgclist(th, g->grayagain); /* insert into 'grayagain' list */ + } + else if (curr->tt == LUA_VUPVAL && upisopen(gco2upv(curr))) + set2gray(curr); /* open upvalues are always gray */ + else /* everything else is black */ + nw2black(curr); + p = &curr->next; /* go to next element */ + } + } +} + + +/* +** Sweep for generational mode. Delete dead objects. (Because the +** collection is not incremental, there are no "new white" objects +** during the sweep. So, any white object must be dead.) For +** non-dead objects, advance their ages and clear the color of +** new objects. (Old objects keep their colors.) +** The ages of G_TOUCHED1 and G_TOUCHED2 objects cannot be advanced +** here, because these old-generation objects are usually not swept +** here. They will all be advanced in 'correctgraylist'. That function +** will also remove objects turned white here from any gray list. +*/ +static GCObject **sweepgen (lua_State *L, global_State *g, GCObject **p, + GCObject *limit, GCObject **pfirstold1) { + static const lu_byte nextage[] = { + G_SURVIVAL, /* from G_NEW */ + G_OLD1, /* from G_SURVIVAL */ + G_OLD1, /* from G_OLD0 */ + G_OLD, /* from G_OLD1 */ + G_OLD, /* from G_OLD (do not change) */ + G_TOUCHED1, /* from G_TOUCHED1 (do not change) */ + G_TOUCHED2 /* from G_TOUCHED2 (do not change) */ + }; + int white = luaC_white(g); + GCObject *curr; + while ((curr = *p) != limit) { + if (iswhite(curr)) { /* is 'curr' dead? */ + lua_assert(!isold(curr) && isdead(g, curr)); + *p = curr->next; /* remove 'curr' from list */ + freeobj(L, curr); /* erase 'curr' */ + } + else { /* correct mark and age */ + if (getage(curr) == G_NEW) { /* new objects go back to white */ + int marked = curr->marked & ~maskgcbits; /* erase GC bits */ + curr->marked = cast_byte(marked | G_SURVIVAL | white); + } + else { /* all other objects will be old, and so keep their color */ + setage(curr, nextage[getage(curr)]); + if (getage(curr) == G_OLD1 && *pfirstold1 == NULL) + *pfirstold1 = curr; /* first OLD1 object in the list */ + } + p = &curr->next; /* go to next element */ + } + } + return p; +} + + +/* +** Traverse a list making all its elements white and clearing their +** age. In incremental mode, all objects are 'new' all the time, +** except for fixed strings (which are always old). +*/ +static void whitelist (global_State *g, GCObject *p) { + int white = luaC_white(g); + for (; p != NULL; p = p->next) + p->marked = cast_byte((p->marked & ~maskgcbits) | white); +} + + +/* +** Correct a list of gray objects. Return pointer to where rest of the +** list should be linked. +** Because this correction is done after sweeping, young objects might +** be turned white and still be in the list. They are only removed. +** 'TOUCHED1' objects are advanced to 'TOUCHED2' and remain on the list; +** Non-white threads also remain on the list; 'TOUCHED2' objects become +** regular old; they and anything else are removed from the list. +*/ +static GCObject **correctgraylist (GCObject **p) { + GCObject *curr; + while ((curr = *p) != NULL) { + GCObject **next = getgclist(curr); + if (iswhite(curr)) + goto remove; /* remove all white objects */ + else if (getage(curr) == G_TOUCHED1) { /* touched in this cycle? */ + lua_assert(isgray(curr)); + nw2black(curr); /* make it black, for next barrier */ + changeage(curr, G_TOUCHED1, G_TOUCHED2); + goto remain; /* keep it in the list and go to next element */ + } + else if (curr->tt == LUA_VTHREAD) { + lua_assert(isgray(curr)); + goto remain; /* keep non-white threads on the list */ + } + else { /* everything else is removed */ + lua_assert(isold(curr)); /* young objects should be white here */ + if (getage(curr) == G_TOUCHED2) /* advance from TOUCHED2... */ + changeage(curr, G_TOUCHED2, G_OLD); /* ... to OLD */ + nw2black(curr); /* make object black (to be removed) */ + goto remove; + } + remove: *p = *next; continue; + remain: p = next; continue; + } + return p; +} + + +/* +** Correct all gray lists, coalescing them into 'grayagain'. +*/ +static void correctgraylists (global_State *g) { + GCObject **list = correctgraylist(&g->grayagain); + *list = g->weak; g->weak = NULL; + list = correctgraylist(list); + *list = g->allweak; g->allweak = NULL; + list = correctgraylist(list); + *list = g->ephemeron; g->ephemeron = NULL; + correctgraylist(list); +} + + +/* +** Mark black 'OLD1' objects when starting a new young collection. +** Gray objects are already in some gray list, and so will be visited +** in the atomic step. +*/ +static void markold (global_State *g, GCObject *from, GCObject *to) { + GCObject *p; + for (p = from; p != to; p = p->next) { + if (getage(p) == G_OLD1) { + lua_assert(!iswhite(p)); + changeage(p, G_OLD1, G_OLD); /* now they are old */ + if (isblack(p)) + reallymarkobject(g, p); + } + } +} + + +/* +** Finish a young-generation collection. +*/ +static void finishgencycle (lua_State *L, global_State *g) { + correctgraylists(g); + checkSizes(L, g); + g->gcstate = GCSpropagate; /* skip restart */ + if (!g->gcemergency) + callallpendingfinalizers(L); +} + + +/* +** Does a young collection. First, mark 'OLD1' objects. Then does the +** atomic step. Then, sweep all lists and advance pointers. Finally, +** finish the collection. +*/ +static void youngcollection (lua_State *L, global_State *g) { + GCObject **psurvival; /* to point to first non-dead survival object */ + GCObject *dummy; /* dummy out parameter to 'sweepgen' */ + lua_assert(g->gcstate == GCSpropagate); + if (g->firstold1) { /* are there regular OLD1 objects? */ + markold(g, g->firstold1, g->reallyold); /* mark them */ + g->firstold1 = NULL; /* no more OLD1 objects (for now) */ + } + markold(g, g->finobj, g->finobjrold); + markold(g, g->tobefnz, NULL); + atomic(L); + + /* sweep nursery and get a pointer to its last live element */ + g->gcstate = GCSswpallgc; + psurvival = sweepgen(L, g, &g->allgc, g->survival, &g->firstold1); + /* sweep 'survival' */ + sweepgen(L, g, psurvival, g->old1, &g->firstold1); + g->reallyold = g->old1; + g->old1 = *psurvival; /* 'survival' survivals are old now */ + g->survival = g->allgc; /* all news are survivals */ + + /* repeat for 'finobj' lists */ + dummy = NULL; /* no 'firstold1' optimization for 'finobj' lists */ + psurvival = sweepgen(L, g, &g->finobj, g->finobjsur, &dummy); + /* sweep 'survival' */ + sweepgen(L, g, psurvival, g->finobjold1, &dummy); + g->finobjrold = g->finobjold1; + g->finobjold1 = *psurvival; /* 'survival' survivals are old now */ + g->finobjsur = g->finobj; /* all news are survivals */ + + sweepgen(L, g, &g->tobefnz, NULL, &dummy); + finishgencycle(L, g); +} + + +/* +** Clears all gray lists, sweeps objects, and prepare sublists to enter +** generational mode. The sweeps remove dead objects and turn all +** surviving objects to old. Threads go back to 'grayagain'; everything +** else is turned black (not in any gray list). +*/ +static void atomic2gen (lua_State *L, global_State *g) { + cleargraylists(g); + /* sweep all elements making them old */ + g->gcstate = GCSswpallgc; + sweep2old(L, &g->allgc); + /* everything alive now is old */ + g->reallyold = g->old1 = g->survival = g->allgc; + g->firstold1 = NULL; /* there are no OLD1 objects anywhere */ + + /* repeat for 'finobj' lists */ + sweep2old(L, &g->finobj); + g->finobjrold = g->finobjold1 = g->finobjsur = g->finobj; + + sweep2old(L, &g->tobefnz); + + g->gckind = KGC_GEN; + g->lastatomic = 0; + g->GCestimate = gettotalbytes(g); /* base for memory control */ + finishgencycle(L, g); +} + + +/* +** Set debt for the next minor collection, which will happen when +** memory grows 'genminormul'%. +*/ +static void setminordebt (global_State *g) { + luaE_setdebt(g, -(cast(l_mem, (gettotalbytes(g) / 100)) * g->genminormul)); +} + + +/* +** Enter generational mode. Must go until the end of an atomic cycle +** to ensure that all objects are correctly marked and weak tables +** are cleared. Then, turn all objects into old and finishes the +** collection. +*/ +static lu_mem entergen (lua_State *L, global_State *g) { + lu_mem numobjs; + luaC_runtilstate(L, bitmask(GCSpause)); /* prepare to start a new cycle */ + luaC_runtilstate(L, bitmask(GCSpropagate)); /* start new cycle */ + numobjs = atomic(L); /* propagates all and then do the atomic stuff */ + atomic2gen(L, g); + setminordebt(g); /* set debt assuming next cycle will be minor */ + return numobjs; +} + + +/* +** Enter incremental mode. Turn all objects white, make all +** intermediate lists point to NULL (to avoid invalid pointers), +** and go to the pause state. +*/ +static void enterinc (global_State *g) { + whitelist(g, g->allgc); + g->reallyold = g->old1 = g->survival = NULL; + whitelist(g, g->finobj); + whitelist(g, g->tobefnz); + g->finobjrold = g->finobjold1 = g->finobjsur = NULL; + g->gcstate = GCSpause; + g->gckind = KGC_INC; + g->lastatomic = 0; +} + + +/* +** Change collector mode to 'newmode'. +*/ +void luaC_changemode (lua_State *L, int newmode) { + global_State *g = G(L); + if (newmode != g->gckind) { + if (newmode == KGC_GEN) /* entering generational mode? */ + entergen(L, g); + else + enterinc(g); /* entering incremental mode */ + } + g->lastatomic = 0; +} + + +/* +** Does a full collection in generational mode. +*/ +static lu_mem fullgen (lua_State *L, global_State *g) { + enterinc(g); + return entergen(L, g); +} + + +/* +** Does a major collection after last collection was a "bad collection". +** +** When the program is building a big structure, it allocates lots of +** memory but generates very little garbage. In those scenarios, +** the generational mode just wastes time doing small collections, and +** major collections are frequently what we call a "bad collection", a +** collection that frees too few objects. To avoid the cost of switching +** between generational mode and the incremental mode needed for full +** (major) collections, the collector tries to stay in incremental mode +** after a bad collection, and to switch back to generational mode only +** after a "good" collection (one that traverses less than 9/8 objects +** of the previous one). +** The collector must choose whether to stay in incremental mode or to +** switch back to generational mode before sweeping. At this point, it +** does not know the real memory in use, so it cannot use memory to +** decide whether to return to generational mode. Instead, it uses the +** number of objects traversed (returned by 'atomic') as a proxy. The +** field 'g->lastatomic' keeps this count from the last collection. +** ('g->lastatomic != 0' also means that the last collection was bad.) +*/ +static void stepgenfull (lua_State *L, global_State *g) { + lu_mem newatomic; /* count of traversed objects */ + lu_mem lastatomic = g->lastatomic; /* count from last collection */ + if (g->gckind == KGC_GEN) /* still in generational mode? */ + enterinc(g); /* enter incremental mode */ + luaC_runtilstate(L, bitmask(GCSpropagate)); /* start new cycle */ + newatomic = atomic(L); /* mark everybody */ + if (newatomic < lastatomic + (lastatomic >> 3)) { /* good collection? */ + atomic2gen(L, g); /* return to generational mode */ + setminordebt(g); + } + else { /* another bad collection; stay in incremental mode */ + g->GCestimate = gettotalbytes(g); /* first estimate */ + entersweep(L); + luaC_runtilstate(L, bitmask(GCSpause)); /* finish collection */ + setpause(g); + g->lastatomic = newatomic; + } +} + + +/* +** Does a generational "step". +** Usually, this means doing a minor collection and setting the debt to +** make another collection when memory grows 'genminormul'% larger. +** +** However, there are exceptions. If memory grows 'genmajormul'% +** larger than it was at the end of the last major collection (kept +** in 'g->GCestimate'), the function does a major collection. At the +** end, it checks whether the major collection was able to free a +** decent amount of memory (at least half the growth in memory since +** previous major collection). If so, the collector keeps its state, +** and the next collection will probably be minor again. Otherwise, +** we have what we call a "bad collection". In that case, set the field +** 'g->lastatomic' to signal that fact, so that the next collection will +** go to 'stepgenfull'. +** +** 'GCdebt <= 0' means an explicit call to GC step with "size" zero; +** in that case, do a minor collection. +*/ +static void genstep (lua_State *L, global_State *g) { + if (g->lastatomic != 0) /* last collection was a bad one? */ + stepgenfull(L, g); /* do a full step */ + else { + lu_mem majorbase = g->GCestimate; /* memory after last major collection */ + lu_mem majorinc = (majorbase / 100) * getgcparam(g->genmajormul); + if (g->GCdebt > 0 && gettotalbytes(g) > majorbase + majorinc) { + lu_mem numobjs = fullgen(L, g); /* do a major collection */ + if (gettotalbytes(g) < majorbase + (majorinc / 2)) { + /* collected at least half of memory growth since last major + collection; keep doing minor collections. */ + lua_assert(g->lastatomic == 0); + } + else { /* bad collection */ + g->lastatomic = numobjs; /* signal that last collection was bad */ + setpause(g); /* do a long wait for next (major) collection */ + } + } + else { /* regular case; do a minor collection */ + youngcollection(L, g); + setminordebt(g); + g->GCestimate = majorbase; /* preserve base value */ + } + } + lua_assert(isdecGCmodegen(g)); +} + +/* }====================================================== */ + + +/* +** {====================================================== +** GC control +** ======================================================= +*/ + + +/* +** Enter first sweep phase. +** The call to 'sweeptolive' makes the pointer point to an object +** inside the list (instead of to the header), so that the real sweep do +** not need to skip objects created between "now" and the start of the +** real sweep. +*/ +static void entersweep (lua_State *L) { + global_State *g = G(L); + g->gcstate = GCSswpallgc; + lua_assert(g->sweepgc == NULL); + g->sweepgc = sweeptolive(L, &g->allgc); +} + + +/* +** Delete all objects in list 'p' until (but not including) object +** 'limit'. +*/ +static void deletelist (lua_State *L, GCObject *p, GCObject *limit) { + while (p != limit) { + GCObject *next = p->next; + freeobj(L, p); + p = next; + } +} + + +/* +** Call all finalizers of the objects in the given Lua state, and +** then free all objects, except for the main thread. +*/ +void luaC_freeallobjects (lua_State *L) { + global_State *g = G(L); + g->gcstp = GCSTPCLS; /* no extra finalizers after here */ + luaC_changemode(L, KGC_INC); + separatetobefnz(g, 1); /* separate all objects with finalizers */ + lua_assert(g->finobj == NULL); + callallpendingfinalizers(L); + deletelist(L, g->allgc, obj2gco(g->mainthread)); + lua_assert(g->finobj == NULL); /* no new finalizers */ + deletelist(L, g->fixedgc, NULL); /* collect fixed objects */ + lua_assert(g->strt.nuse == 0); +} + + +static lu_mem atomic (lua_State *L) { + global_State *g = G(L); + lu_mem work = 0; + GCObject *origweak, *origall; + GCObject *grayagain = g->grayagain; /* save original list */ + g->grayagain = NULL; + lua_assert(g->ephemeron == NULL && g->weak == NULL); + lua_assert(!iswhite(g->mainthread)); + g->gcstate = GCSatomic; + markobject(g, L); /* mark running thread */ + /* registry and global metatables may be changed by API */ + markvalue(g, &g->l_registry); + markmt(g); /* mark global metatables */ + work += propagateall(g); /* empties 'gray' list */ + /* remark occasional upvalues of (maybe) dead threads */ + work += remarkupvals(g); + work += propagateall(g); /* propagate changes */ + g->gray = grayagain; + work += propagateall(g); /* traverse 'grayagain' list */ + convergeephemerons(g); + /* at this point, all strongly accessible objects are marked. */ + /* Clear values from weak tables, before checking finalizers */ + clearbyvalues(g, g->weak, NULL); + clearbyvalues(g, g->allweak, NULL); + origweak = g->weak; origall = g->allweak; + separatetobefnz(g, 0); /* separate objects to be finalized */ + work += markbeingfnz(g); /* mark objects that will be finalized */ + work += propagateall(g); /* remark, to propagate 'resurrection' */ + convergeephemerons(g); + /* at this point, all resurrected objects are marked. */ + /* remove dead objects from weak tables */ + clearbykeys(g, g->ephemeron); /* clear keys from all ephemeron tables */ + clearbykeys(g, g->allweak); /* clear keys from all 'allweak' tables */ + /* clear values from resurrected weak tables */ + clearbyvalues(g, g->weak, origweak); + clearbyvalues(g, g->allweak, origall); + luaS_clearcache(g); + g->currentwhite = cast_byte(otherwhite(g)); /* flip current white */ + lua_assert(g->gray == NULL); + return work; /* estimate of slots marked by 'atomic' */ +} + + +static int sweepstep (lua_State *L, global_State *g, + int nextstate, GCObject **nextlist) { + if (g->sweepgc) { + l_mem olddebt = g->GCdebt; + int count; + g->sweepgc = sweeplist(L, g->sweepgc, GCSWEEPMAX, &count); + g->GCestimate += g->GCdebt - olddebt; /* update estimate */ + return count; + } + else { /* enter next state */ + g->gcstate = nextstate; + g->sweepgc = nextlist; + return 0; /* no work done */ + } +} + + +static lu_mem singlestep (lua_State *L) { + global_State *g = G(L); + lu_mem work; + lua_assert(!g->gcstopem); /* collector is not reentrant */ + g->gcstopem = 1; /* no emergency collections while collecting */ + switch (g->gcstate) { + case GCSpause: { + restartcollection(g); + g->gcstate = GCSpropagate; + work = 1; + break; + } + case GCSpropagate: { + if (g->gray == NULL) { /* no more gray objects? */ + g->gcstate = GCSenteratomic; /* finish propagate phase */ + work = 0; + } + else + work = propagatemark(g); /* traverse one gray object */ + break; + } + case GCSenteratomic: { + work = atomic(L); /* work is what was traversed by 'atomic' */ + entersweep(L); + g->GCestimate = gettotalbytes(g); /* first estimate */ + break; + } + case GCSswpallgc: { /* sweep "regular" objects */ + work = sweepstep(L, g, GCSswpfinobj, &g->finobj); + break; + } + case GCSswpfinobj: { /* sweep objects with finalizers */ + work = sweepstep(L, g, GCSswptobefnz, &g->tobefnz); + break; + } + case GCSswptobefnz: { /* sweep objects to be finalized */ + work = sweepstep(L, g, GCSswpend, NULL); + break; + } + case GCSswpend: { /* finish sweeps */ + checkSizes(L, g); + g->gcstate = GCScallfin; + work = 0; + break; + } + case GCScallfin: { /* call remaining finalizers */ + if (g->tobefnz && !g->gcemergency) { + g->gcstopem = 0; /* ok collections during finalizers */ + work = runafewfinalizers(L, GCFINMAX) * GCFINALIZECOST; + } + else { /* emergency mode or no more finalizers */ + g->gcstate = GCSpause; /* finish collection */ + work = 0; + } + break; + } + default: lua_assert(0); return 0; + } + g->gcstopem = 0; + return work; +} + + +/* +** advances the garbage collector until it reaches a state allowed +** by 'statemask' +*/ +void luaC_runtilstate (lua_State *L, int statesmask) { + global_State *g = G(L); + while (!testbit(statesmask, g->gcstate)) + singlestep(L); +} + + + +/* +** Performs a basic incremental step. The debt and step size are +** converted from bytes to "units of work"; then the function loops +** running single steps until adding that many units of work or +** finishing a cycle (pause state). Finally, it sets the debt that +** controls when next step will be performed. +*/ +static void incstep (lua_State *L, global_State *g) { + int stepmul = (getgcparam(g->gcstepmul) | 1); /* avoid division by 0 */ + l_mem debt = (g->GCdebt / WORK2MEM) * stepmul; + l_mem stepsize = (g->gcstepsize <= log2maxs(l_mem)) + ? ((cast(l_mem, 1) << g->gcstepsize) / WORK2MEM) * stepmul + : MAX_LMEM; /* overflow; keep maximum value */ + do { /* repeat until pause or enough "credit" (negative debt) */ + lu_mem work = singlestep(L); /* perform one single step */ + debt -= work; + } while (debt > -stepsize && g->gcstate != GCSpause); + if (g->gcstate == GCSpause) + setpause(g); /* pause until next cycle */ + else { + debt = (debt / stepmul) * WORK2MEM; /* convert 'work units' to bytes */ + luaE_setdebt(g, debt); + } +} + +/* +** Performs a basic GC step if collector is running. (If collector is +** not running, set a reasonable debt to avoid it being called at +** every single check.) +*/ +void luaC_step (lua_State *L) { + global_State *g = G(L); + if (!gcrunning(g)) /* not running? */ + luaE_setdebt(g, -2000); + else { + if(isdecGCmodegen(g)) + genstep(L, g); + else + incstep(L, g); + } +} + + +/* +** Perform a full collection in incremental mode. +** Before running the collection, check 'keepinvariant'; if it is true, +** there may be some objects marked as black, so the collector has +** to sweep all objects to turn them back to white (as white has not +** changed, nothing will be collected). +*/ +static void fullinc (lua_State *L, global_State *g) { + if (keepinvariant(g)) /* black objects? */ + entersweep(L); /* sweep everything to turn them back to white */ + /* finish any pending sweep phase to start a new cycle */ + luaC_runtilstate(L, bitmask(GCSpause)); + luaC_runtilstate(L, bitmask(GCSpropagate)); /* start new cycle */ + g->gcstate = GCSenteratomic; /* go straight to atomic phase */ + luaC_runtilstate(L, bitmask(GCScallfin)); /* run up to finalizers */ + /* estimate must be correct after a full GC cycle */ + lua_assert(g->GCestimate == gettotalbytes(g)); + luaC_runtilstate(L, bitmask(GCSpause)); /* finish collection */ + setpause(g); +} + + +/* +** Performs a full GC cycle; if 'isemergency', set a flag to avoid +** some operations which could change the interpreter state in some +** unexpected ways (running finalizers and shrinking some structures). +*/ +void luaC_fullgc (lua_State *L, int isemergency) { + global_State *g = G(L); + lua_assert(!g->gcemergency); + g->gcemergency = isemergency; /* set flag */ + if (g->gckind == KGC_INC) + fullinc(L, g); + else + fullgen(L, g); + g->gcemergency = 0; +} + +/* }====================================================== */ + + diff --git a/vendor/lua-5.4.8/src/lgc.h b/vendor/lua-5.4.8/src/lgc.h new file mode 100644 index 0000000..538f6ed --- /dev/null +++ b/vendor/lua-5.4.8/src/lgc.h @@ -0,0 +1,202 @@ +/* +** $Id: lgc.h $ +** Garbage Collector +** See Copyright Notice in lua.h +*/ + +#ifndef lgc_h +#define lgc_h + + +#include "lobject.h" +#include "lstate.h" + +/* +** Collectable objects may have one of three colors: white, which means +** the object is not marked; gray, which means the object is marked, but +** its references may be not marked; and black, which means that the +** object and all its references are marked. The main invariant of the +** garbage collector, while marking objects, is that a black object can +** never point to a white one. Moreover, any gray object must be in a +** "gray list" (gray, grayagain, weak, allweak, ephemeron) so that it +** can be visited again before finishing the collection cycle. (Open +** upvalues are an exception to this rule.) These lists have no meaning +** when the invariant is not being enforced (e.g., sweep phase). +*/ + + +/* +** Possible states of the Garbage Collector +*/ +#define GCSpropagate 0 +#define GCSenteratomic 1 +#define GCSatomic 2 +#define GCSswpallgc 3 +#define GCSswpfinobj 4 +#define GCSswptobefnz 5 +#define GCSswpend 6 +#define GCScallfin 7 +#define GCSpause 8 + + +#define issweepphase(g) \ + (GCSswpallgc <= (g)->gcstate && (g)->gcstate <= GCSswpend) + + +/* +** macro to tell when main invariant (white objects cannot point to black +** ones) must be kept. During a collection, the sweep +** phase may break the invariant, as objects turned white may point to +** still-black objects. The invariant is restored when sweep ends and +** all objects are white again. +*/ + +#define keepinvariant(g) ((g)->gcstate <= GCSatomic) + + +/* +** some useful bit tricks +*/ +#define resetbits(x,m) ((x) &= cast_byte(~(m))) +#define setbits(x,m) ((x) |= (m)) +#define testbits(x,m) ((x) & (m)) +#define bitmask(b) (1<<(b)) +#define bit2mask(b1,b2) (bitmask(b1) | bitmask(b2)) +#define l_setbit(x,b) setbits(x, bitmask(b)) +#define resetbit(x,b) resetbits(x, bitmask(b)) +#define testbit(x,b) testbits(x, bitmask(b)) + + +/* +** Layout for bit use in 'marked' field. First three bits are +** used for object "age" in generational mode. Last bit is used +** by tests. +*/ +#define WHITE0BIT 3 /* object is white (type 0) */ +#define WHITE1BIT 4 /* object is white (type 1) */ +#define BLACKBIT 5 /* object is black */ +#define FINALIZEDBIT 6 /* object has been marked for finalization */ + +#define TESTBIT 7 + + + +#define WHITEBITS bit2mask(WHITE0BIT, WHITE1BIT) + + +#define iswhite(x) testbits((x)->marked, WHITEBITS) +#define isblack(x) testbit((x)->marked, BLACKBIT) +#define isgray(x) /* neither white nor black */ \ + (!testbits((x)->marked, WHITEBITS | bitmask(BLACKBIT))) + +#define tofinalize(x) testbit((x)->marked, FINALIZEDBIT) + +#define otherwhite(g) ((g)->currentwhite ^ WHITEBITS) +#define isdeadm(ow,m) ((m) & (ow)) +#define isdead(g,v) isdeadm(otherwhite(g), (v)->marked) + +#define changewhite(x) ((x)->marked ^= WHITEBITS) +#define nw2black(x) \ + check_exp(!iswhite(x), l_setbit((x)->marked, BLACKBIT)) + +#define luaC_white(g) cast_byte((g)->currentwhite & WHITEBITS) + + +/* object age in generational mode */ +#define G_NEW 0 /* created in current cycle */ +#define G_SURVIVAL 1 /* created in previous cycle */ +#define G_OLD0 2 /* marked old by frw. barrier in this cycle */ +#define G_OLD1 3 /* first full cycle as old */ +#define G_OLD 4 /* really old object (not to be visited) */ +#define G_TOUCHED1 5 /* old object touched this cycle */ +#define G_TOUCHED2 6 /* old object touched in previous cycle */ + +#define AGEBITS 7 /* all age bits (111) */ + +#define getage(o) ((o)->marked & AGEBITS) +#define setage(o,a) ((o)->marked = cast_byte(((o)->marked & (~AGEBITS)) | a)) +#define isold(o) (getage(o) > G_SURVIVAL) + +#define changeage(o,f,t) \ + check_exp(getage(o) == (f), (o)->marked ^= ((f)^(t))) + + +/* Default Values for GC parameters */ +#define LUAI_GENMAJORMUL 100 +#define LUAI_GENMINORMUL 20 + +/* wait memory to double before starting new cycle */ +#define LUAI_GCPAUSE 200 + +/* +** some gc parameters are stored divided by 4 to allow a maximum value +** up to 1023 in a 'lu_byte'. +*/ +#define getgcparam(p) ((p) * 4) +#define setgcparam(p,v) ((p) = (v) / 4) + +#define LUAI_GCMUL 100 + +/* how much to allocate before next GC step (log2) */ +#define LUAI_GCSTEPSIZE 13 /* 8 KB */ + + +/* +** Check whether the declared GC mode is generational. While in +** generational mode, the collector can go temporarily to incremental +** mode to improve performance. This is signaled by 'g->lastatomic != 0'. +*/ +#define isdecGCmodegen(g) (g->gckind == KGC_GEN || g->lastatomic != 0) + + +/* +** Control when GC is running: +*/ +#define GCSTPUSR 1 /* bit true when GC stopped by user */ +#define GCSTPGC 2 /* bit true when GC stopped by itself */ +#define GCSTPCLS 4 /* bit true when closing Lua state */ +#define gcrunning(g) ((g)->gcstp == 0) + + +/* +** Does one step of collection when debt becomes positive. 'pre'/'pos' +** allows some adjustments to be done only when needed. macro +** 'condchangemem' is used only for heavy tests (forcing a full +** GC cycle on every opportunity) +*/ +#define luaC_condGC(L,pre,pos) \ + { if (G(L)->GCdebt > 0) { pre; luaC_step(L); pos;}; \ + condchangemem(L,pre,pos); } + +/* more often than not, 'pre'/'pos' are empty */ +#define luaC_checkGC(L) luaC_condGC(L,(void)0,(void)0) + + +#define luaC_objbarrier(L,p,o) ( \ + (isblack(p) && iswhite(o)) ? \ + luaC_barrier_(L,obj2gco(p),obj2gco(o)) : cast_void(0)) + +#define luaC_barrier(L,p,v) ( \ + iscollectable(v) ? luaC_objbarrier(L,p,gcvalue(v)) : cast_void(0)) + +#define luaC_objbarrierback(L,p,o) ( \ + (isblack(p) && iswhite(o)) ? luaC_barrierback_(L,p) : cast_void(0)) + +#define luaC_barrierback(L,p,v) ( \ + iscollectable(v) ? luaC_objbarrierback(L, p, gcvalue(v)) : cast_void(0)) + +LUAI_FUNC void luaC_fix (lua_State *L, GCObject *o); +LUAI_FUNC void luaC_freeallobjects (lua_State *L); +LUAI_FUNC void luaC_step (lua_State *L); +LUAI_FUNC void luaC_runtilstate (lua_State *L, int statesmask); +LUAI_FUNC void luaC_fullgc (lua_State *L, int isemergency); +LUAI_FUNC GCObject *luaC_newobj (lua_State *L, int tt, size_t sz); +LUAI_FUNC GCObject *luaC_newobjdt (lua_State *L, int tt, size_t sz, + size_t offset); +LUAI_FUNC void luaC_barrier_ (lua_State *L, GCObject *o, GCObject *v); +LUAI_FUNC void luaC_barrierback_ (lua_State *L, GCObject *o); +LUAI_FUNC void luaC_checkfinalizer (lua_State *L, GCObject *o, Table *mt); +LUAI_FUNC void luaC_changemode (lua_State *L, int newmode); + + +#endif diff --git a/vendor/lua-5.4.8/src/linit.c b/vendor/lua-5.4.8/src/linit.c new file mode 100644 index 0000000..69808f8 --- /dev/null +++ b/vendor/lua-5.4.8/src/linit.c @@ -0,0 +1,65 @@ +/* +** $Id: linit.c $ +** Initialization of libraries for lua.c and other clients +** See Copyright Notice in lua.h +*/ + + +#define linit_c +#define LUA_LIB + +/* +** If you embed Lua in your program and need to open the standard +** libraries, call luaL_openlibs in your program. If you need a +** different set of libraries, copy this file to your project and edit +** it to suit your needs. +** +** You can also *preload* libraries, so that a later 'require' can +** open the library, which is already linked to the application. +** For that, do the following code: +** +** luaL_getsubtable(L, LUA_REGISTRYINDEX, LUA_PRELOAD_TABLE); +** lua_pushcfunction(L, luaopen_modname); +** lua_setfield(L, -2, modname); +** lua_pop(L, 1); // remove PRELOAD table +*/ + +#include "lprefix.h" + + +#include <stddef.h> + +#include "lua.h" + +#include "lualib.h" +#include "lauxlib.h" + + +/* +** these libs are loaded by lua.c and are readily available to any Lua +** program +*/ +static const luaL_Reg loadedlibs[] = { + {LUA_GNAME, luaopen_base}, + {LUA_LOADLIBNAME, luaopen_package}, + {LUA_COLIBNAME, luaopen_coroutine}, + {LUA_TABLIBNAME, luaopen_table}, + {LUA_IOLIBNAME, luaopen_io}, + {LUA_OSLIBNAME, luaopen_os}, + {LUA_STRLIBNAME, luaopen_string}, + {LUA_MATHLIBNAME, luaopen_math}, + {LUA_UTF8LIBNAME, luaopen_utf8}, + {LUA_DBLIBNAME, luaopen_debug}, + {NULL, NULL} +}; + + +LUALIB_API void luaL_openlibs (lua_State *L) { + const luaL_Reg *lib; + /* "require" functions from 'loadedlibs' and set results to global table */ + for (lib = loadedlibs; lib->func; lib++) { + luaL_requiref(L, lib->name, lib->func, 1); + lua_pop(L, 1); /* remove lib */ + } +} + diff --git a/vendor/lua-5.4.8/src/liolib.c b/vendor/lua-5.4.8/src/liolib.c new file mode 100644 index 0000000..c5075f3 --- /dev/null +++ b/vendor/lua-5.4.8/src/liolib.c @@ -0,0 +1,841 @@ +/* +** $Id: liolib.c $ +** Standard I/O (and system) library +** See Copyright Notice in lua.h +*/ + +#define liolib_c +#define LUA_LIB + +#include "lprefix.h" + + +#include <ctype.h> +#include <errno.h> +#include <locale.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +#include "lua.h" + +#include "lauxlib.h" +#include "lualib.h" + + + + +/* +** Change this macro to accept other modes for 'fopen' besides +** the standard ones. +*/ +#if !defined(l_checkmode) + +/* accepted extensions to 'mode' in 'fopen' */ +#if !defined(L_MODEEXT) +#define L_MODEEXT "b" +#endif + +/* Check whether 'mode' matches '[rwa]%+?[L_MODEEXT]*' */ +static int l_checkmode (const char *mode) { + return (*mode != '\0' && strchr("rwa", *(mode++)) != NULL && + (*mode != '+' || ((void)(++mode), 1)) && /* skip if char is '+' */ + (strspn(mode, L_MODEEXT) == strlen(mode))); /* check extensions */ +} + +#endif + +/* +** {====================================================== +** l_popen spawns a new process connected to the current +** one through the file streams. +** ======================================================= +*/ + +#if !defined(l_popen) /* { */ + +#if defined(LUA_USE_POSIX) /* { */ + +#define l_popen(L,c,m) (fflush(NULL), popen(c,m)) +#define l_pclose(L,file) (pclose(file)) + +#elif defined(LUA_USE_WINDOWS) /* }{ */ + +#define l_popen(L,c,m) (_popen(c,m)) +#define l_pclose(L,file) (_pclose(file)) + +#if !defined(l_checkmodep) +/* Windows accepts "[rw][bt]?" as valid modes */ +#define l_checkmodep(m) ((m[0] == 'r' || m[0] == 'w') && \ + (m[1] == '\0' || ((m[1] == 'b' || m[1] == 't') && m[2] == '\0'))) +#endif + +#else /* }{ */ + +/* ISO C definitions */ +#define l_popen(L,c,m) \ + ((void)c, (void)m, \ + luaL_error(L, "'popen' not supported"), \ + (FILE*)0) +#define l_pclose(L,file) ((void)L, (void)file, -1) + +#endif /* } */ + +#endif /* } */ + + +#if !defined(l_checkmodep) +/* By default, Lua accepts only "r" or "w" as valid modes */ +#define l_checkmodep(m) ((m[0] == 'r' || m[0] == 'w') && m[1] == '\0') +#endif + +/* }====================================================== */ + + +#if !defined(l_getc) /* { */ + +#if defined(LUA_USE_POSIX) +#define l_getc(f) getc_unlocked(f) +#define l_lockfile(f) flockfile(f) +#define l_unlockfile(f) funlockfile(f) +#else +#define l_getc(f) getc(f) +#define l_lockfile(f) ((void)0) +#define l_unlockfile(f) ((void)0) +#endif + +#endif /* } */ + + +/* +** {====================================================== +** l_fseek: configuration for longer offsets +** ======================================================= +*/ + +#if !defined(l_fseek) /* { */ + +#if defined(LUA_USE_POSIX) /* { */ + +#include <sys/types.h> + +#define l_fseek(f,o,w) fseeko(f,o,w) +#define l_ftell(f) ftello(f) +#define l_seeknum off_t + +#elif defined(LUA_USE_WINDOWS) && !defined(_CRTIMP_TYPEINFO) \ + && defined(_MSC_VER) && (_MSC_VER >= 1400) /* }{ */ + +/* Windows (but not DDK) and Visual C++ 2005 or higher */ +#define l_fseek(f,o,w) _fseeki64(f,o,w) +#define l_ftell(f) _ftelli64(f) +#define l_seeknum __int64 + +#else /* }{ */ + +/* ISO C definitions */ +#define l_fseek(f,o,w) fseek(f,o,w) +#define l_ftell(f) ftell(f) +#define l_seeknum long + +#endif /* } */ + +#endif /* } */ + +/* }====================================================== */ + + + +#define IO_PREFIX "_IO_" +#define IOPREF_LEN (sizeof(IO_PREFIX)/sizeof(char) - 1) +#define IO_INPUT (IO_PREFIX "input") +#define IO_OUTPUT (IO_PREFIX "output") + + +typedef luaL_Stream LStream; + + +#define tolstream(L) ((LStream *)luaL_checkudata(L, 1, LUA_FILEHANDLE)) + +#define isclosed(p) ((p)->closef == NULL) + + +static int io_type (lua_State *L) { + LStream *p; + luaL_checkany(L, 1); + p = (LStream *)luaL_testudata(L, 1, LUA_FILEHANDLE); + if (p == NULL) + luaL_pushfail(L); /* not a file */ + else if (isclosed(p)) + lua_pushliteral(L, "closed file"); + else + lua_pushliteral(L, "file"); + return 1; +} + + +static int f_tostring (lua_State *L) { + LStream *p = tolstream(L); + if (isclosed(p)) + lua_pushliteral(L, "file (closed)"); + else + lua_pushfstring(L, "file (%p)", p->f); + return 1; +} + + +static FILE *tofile (lua_State *L) { + LStream *p = tolstream(L); + if (l_unlikely(isclosed(p))) + luaL_error(L, "attempt to use a closed file"); + lua_assert(p->f); + return p->f; +} + + +/* +** When creating file handles, always creates a 'closed' file handle +** before opening the actual file; so, if there is a memory error, the +** handle is in a consistent state. +*/ +static LStream *newprefile (lua_State *L) { + LStream *p = (LStream *)lua_newuserdatauv(L, sizeof(LStream), 0); + p->closef = NULL; /* mark file handle as 'closed' */ + luaL_setmetatable(L, LUA_FILEHANDLE); + return p; +} + + +/* +** Calls the 'close' function from a file handle. The 'volatile' avoids +** a bug in some versions of the Clang compiler (e.g., clang 3.0 for +** 32 bits). +*/ +static int aux_close (lua_State *L) { + LStream *p = tolstream(L); + volatile lua_CFunction cf = p->closef; + p->closef = NULL; /* mark stream as closed */ + return (*cf)(L); /* close it */ +} + + +static int f_close (lua_State *L) { + tofile(L); /* make sure argument is an open stream */ + return aux_close(L); +} + + +static int io_close (lua_State *L) { + if (lua_isnone(L, 1)) /* no argument? */ + lua_getfield(L, LUA_REGISTRYINDEX, IO_OUTPUT); /* use default output */ + return f_close(L); +} + + +static int f_gc (lua_State *L) { + LStream *p = tolstream(L); + if (!isclosed(p) && p->f != NULL) + aux_close(L); /* ignore closed and incompletely open files */ + return 0; +} + + +/* +** function to close regular files +*/ +static int io_fclose (lua_State *L) { + LStream *p = tolstream(L); + errno = 0; + return luaL_fileresult(L, (fclose(p->f) == 0), NULL); +} + + +static LStream *newfile (lua_State *L) { + LStream *p = newprefile(L); + p->f = NULL; + p->closef = &io_fclose; + return p; +} + + +static void opencheck (lua_State *L, const char *fname, const char *mode) { + LStream *p = newfile(L); + p->f = fopen(fname, mode); + if (l_unlikely(p->f == NULL)) + luaL_error(L, "cannot open file '%s' (%s)", fname, strerror(errno)); +} + + +static int io_open (lua_State *L) { + const char *filename = luaL_checkstring(L, 1); + const char *mode = luaL_optstring(L, 2, "r"); + LStream *p = newfile(L); + const char *md = mode; /* to traverse/check mode */ + luaL_argcheck(L, l_checkmode(md), 2, "invalid mode"); + errno = 0; + p->f = fopen(filename, mode); + return (p->f == NULL) ? luaL_fileresult(L, 0, filename) : 1; +} + + +/* +** function to close 'popen' files +*/ +static int io_pclose (lua_State *L) { + LStream *p = tolstream(L); + errno = 0; + return luaL_execresult(L, l_pclose(L, p->f)); +} + + +static int io_popen (lua_State *L) { + const char *filename = luaL_checkstring(L, 1); + const char *mode = luaL_optstring(L, 2, "r"); + LStream *p = newprefile(L); + luaL_argcheck(L, l_checkmodep(mode), 2, "invalid mode"); + errno = 0; + p->f = l_popen(L, filename, mode); + p->closef = &io_pclose; + return (p->f == NULL) ? luaL_fileresult(L, 0, filename) : 1; +} + + +static int io_tmpfile (lua_State *L) { + LStream *p = newfile(L); + errno = 0; + p->f = tmpfile(); + return (p->f == NULL) ? luaL_fileresult(L, 0, NULL) : 1; +} + + +static FILE *getiofile (lua_State *L, const char *findex) { + LStream *p; + lua_getfield(L, LUA_REGISTRYINDEX, findex); + p = (LStream *)lua_touserdata(L, -1); + if (l_unlikely(isclosed(p))) + luaL_error(L, "default %s file is closed", findex + IOPREF_LEN); + return p->f; +} + + +static int g_iofile (lua_State *L, const char *f, const char *mode) { + if (!lua_isnoneornil(L, 1)) { + const char *filename = lua_tostring(L, 1); + if (filename) + opencheck(L, filename, mode); + else { + tofile(L); /* check that it's a valid file handle */ + lua_pushvalue(L, 1); + } + lua_setfield(L, LUA_REGISTRYINDEX, f); + } + /* return current value */ + lua_getfield(L, LUA_REGISTRYINDEX, f); + return 1; +} + + +static int io_input (lua_State *L) { + return g_iofile(L, IO_INPUT, "r"); +} + + +static int io_output (lua_State *L) { + return g_iofile(L, IO_OUTPUT, "w"); +} + + +static int io_readline (lua_State *L); + + +/* +** maximum number of arguments to 'f:lines'/'io.lines' (it + 3 must fit +** in the limit for upvalues of a closure) +*/ +#define MAXARGLINE 250 + +/* +** Auxiliary function to create the iteration function for 'lines'. +** The iteration function is a closure over 'io_readline', with +** the following upvalues: +** 1) The file being read (first value in the stack) +** 2) the number of arguments to read +** 3) a boolean, true iff file has to be closed when finished ('toclose') +** *) a variable number of format arguments (rest of the stack) +*/ +static void aux_lines (lua_State *L, int toclose) { + int n = lua_gettop(L) - 1; /* number of arguments to read */ + luaL_argcheck(L, n <= MAXARGLINE, MAXARGLINE + 2, "too many arguments"); + lua_pushvalue(L, 1); /* file */ + lua_pushinteger(L, n); /* number of arguments to read */ + lua_pushboolean(L, toclose); /* close/not close file when finished */ + lua_rotate(L, 2, 3); /* move the three values to their positions */ + lua_pushcclosure(L, io_readline, 3 + n); +} + + +static int f_lines (lua_State *L) { + tofile(L); /* check that it's a valid file handle */ + aux_lines(L, 0); + return 1; +} + + +/* +** Return an iteration function for 'io.lines'. If file has to be +** closed, also returns the file itself as a second result (to be +** closed as the state at the exit of a generic for). +*/ +static int io_lines (lua_State *L) { + int toclose; + if (lua_isnone(L, 1)) lua_pushnil(L); /* at least one argument */ + if (lua_isnil(L, 1)) { /* no file name? */ + lua_getfield(L, LUA_REGISTRYINDEX, IO_INPUT); /* get default input */ + lua_replace(L, 1); /* put it at index 1 */ + tofile(L); /* check that it's a valid file handle */ + toclose = 0; /* do not close it after iteration */ + } + else { /* open a new file */ + const char *filename = luaL_checkstring(L, 1); + opencheck(L, filename, "r"); + lua_replace(L, 1); /* put file at index 1 */ + toclose = 1; /* close it after iteration */ + } + aux_lines(L, toclose); /* push iteration function */ + if (toclose) { + lua_pushnil(L); /* state */ + lua_pushnil(L); /* control */ + lua_pushvalue(L, 1); /* file is the to-be-closed variable (4th result) */ + return 4; + } + else + return 1; +} + + +/* +** {====================================================== +** READ +** ======================================================= +*/ + + +/* maximum length of a numeral */ +#if !defined (L_MAXLENNUM) +#define L_MAXLENNUM 200 +#endif + + +/* auxiliary structure used by 'read_number' */ +typedef struct { + FILE *f; /* file being read */ + int c; /* current character (look ahead) */ + int n; /* number of elements in buffer 'buff' */ + char buff[L_MAXLENNUM + 1]; /* +1 for ending '\0' */ +} RN; + + +/* +** Add current char to buffer (if not out of space) and read next one +*/ +static int nextc (RN *rn) { + if (l_unlikely(rn->n >= L_MAXLENNUM)) { /* buffer overflow? */ + rn->buff[0] = '\0'; /* invalidate result */ + return 0; /* fail */ + } + else { + rn->buff[rn->n++] = rn->c; /* save current char */ + rn->c = l_getc(rn->f); /* read next one */ + return 1; + } +} + + +/* +** Accept current char if it is in 'set' (of size 2) +*/ +static int test2 (RN *rn, const char *set) { + if (rn->c == set[0] || rn->c == set[1]) + return nextc(rn); + else return 0; +} + + +/* +** Read a sequence of (hex)digits +*/ +static int readdigits (RN *rn, int hex) { + int count = 0; + while ((hex ? isxdigit(rn->c) : isdigit(rn->c)) && nextc(rn)) + count++; + return count; +} + + +/* +** Read a number: first reads a valid prefix of a numeral into a buffer. +** Then it calls 'lua_stringtonumber' to check whether the format is +** correct and to convert it to a Lua number. +*/ +static int read_number (lua_State *L, FILE *f) { + RN rn; + int count = 0; + int hex = 0; + char decp[2]; + rn.f = f; rn.n = 0; + decp[0] = lua_getlocaledecpoint(); /* get decimal point from locale */ + decp[1] = '.'; /* always accept a dot */ + l_lockfile(rn.f); + do { rn.c = l_getc(rn.f); } while (isspace(rn.c)); /* skip spaces */ + test2(&rn, "-+"); /* optional sign */ + if (test2(&rn, "00")) { + if (test2(&rn, "xX")) hex = 1; /* numeral is hexadecimal */ + else count = 1; /* count initial '0' as a valid digit */ + } + count += readdigits(&rn, hex); /* integral part */ + if (test2(&rn, decp)) /* decimal point? */ + count += readdigits(&rn, hex); /* fractional part */ + if (count > 0 && test2(&rn, (hex ? "pP" : "eE"))) { /* exponent mark? */ + test2(&rn, "-+"); /* exponent sign */ + readdigits(&rn, 0); /* exponent digits */ + } + ungetc(rn.c, rn.f); /* unread look-ahead char */ + l_unlockfile(rn.f); + rn.buff[rn.n] = '\0'; /* finish string */ + if (l_likely(lua_stringtonumber(L, rn.buff))) + return 1; /* ok, it is a valid number */ + else { /* invalid format */ + lua_pushnil(L); /* "result" to be removed */ + return 0; /* read fails */ + } +} + + +static int test_eof (lua_State *L, FILE *f) { + int c = getc(f); + ungetc(c, f); /* no-op when c == EOF */ + lua_pushliteral(L, ""); + return (c != EOF); +} + + +static int read_line (lua_State *L, FILE *f, int chop) { + luaL_Buffer b; + int c; + luaL_buffinit(L, &b); + do { /* may need to read several chunks to get whole line */ + char *buff = luaL_prepbuffer(&b); /* preallocate buffer space */ + int i = 0; + l_lockfile(f); /* no memory errors can happen inside the lock */ + while (i < LUAL_BUFFERSIZE && (c = l_getc(f)) != EOF && c != '\n') + buff[i++] = c; /* read up to end of line or buffer limit */ + l_unlockfile(f); + luaL_addsize(&b, i); + } while (c != EOF && c != '\n'); /* repeat until end of line */ + if (!chop && c == '\n') /* want a newline and have one? */ + luaL_addchar(&b, c); /* add ending newline to result */ + luaL_pushresult(&b); /* close buffer */ + /* return ok if read something (either a newline or something else) */ + return (c == '\n' || lua_rawlen(L, -1) > 0); +} + + +static void read_all (lua_State *L, FILE *f) { + size_t nr; + luaL_Buffer b; + luaL_buffinit(L, &b); + do { /* read file in chunks of LUAL_BUFFERSIZE bytes */ + char *p = luaL_prepbuffer(&b); + nr = fread(p, sizeof(char), LUAL_BUFFERSIZE, f); + luaL_addsize(&b, nr); + } while (nr == LUAL_BUFFERSIZE); + luaL_pushresult(&b); /* close buffer */ +} + + +static int read_chars (lua_State *L, FILE *f, size_t n) { + size_t nr; /* number of chars actually read */ + char *p; + luaL_Buffer b; + luaL_buffinit(L, &b); + p = luaL_prepbuffsize(&b, n); /* prepare buffer to read whole block */ + nr = fread(p, sizeof(char), n, f); /* try to read 'n' chars */ + luaL_addsize(&b, nr); + luaL_pushresult(&b); /* close buffer */ + return (nr > 0); /* true iff read something */ +} + + +static int g_read (lua_State *L, FILE *f, int first) { + int nargs = lua_gettop(L) - 1; + int n, success; + clearerr(f); + errno = 0; + if (nargs == 0) { /* no arguments? */ + success = read_line(L, f, 1); + n = first + 1; /* to return 1 result */ + } + else { + /* ensure stack space for all results and for auxlib's buffer */ + luaL_checkstack(L, nargs+LUA_MINSTACK, "too many arguments"); + success = 1; + for (n = first; nargs-- && success; n++) { + if (lua_type(L, n) == LUA_TNUMBER) { + size_t l = (size_t)luaL_checkinteger(L, n); + success = (l == 0) ? test_eof(L, f) : read_chars(L, f, l); + } + else { + const char *p = luaL_checkstring(L, n); + if (*p == '*') p++; /* skip optional '*' (for compatibility) */ + switch (*p) { + case 'n': /* number */ + success = read_number(L, f); + break; + case 'l': /* line */ + success = read_line(L, f, 1); + break; + case 'L': /* line with end-of-line */ + success = read_line(L, f, 0); + break; + case 'a': /* file */ + read_all(L, f); /* read entire file */ + success = 1; /* always success */ + break; + default: + return luaL_argerror(L, n, "invalid format"); + } + } + } + } + if (ferror(f)) + return luaL_fileresult(L, 0, NULL); + if (!success) { + lua_pop(L, 1); /* remove last result */ + luaL_pushfail(L); /* push nil instead */ + } + return n - first; +} + + +static int io_read (lua_State *L) { + return g_read(L, getiofile(L, IO_INPUT), 1); +} + + +static int f_read (lua_State *L) { + return g_read(L, tofile(L), 2); +} + + +/* +** Iteration function for 'lines'. +*/ +static int io_readline (lua_State *L) { + LStream *p = (LStream *)lua_touserdata(L, lua_upvalueindex(1)); + int i; + int n = (int)lua_tointeger(L, lua_upvalueindex(2)); + if (isclosed(p)) /* file is already closed? */ + return luaL_error(L, "file is already closed"); + lua_settop(L , 1); + luaL_checkstack(L, n, "too many arguments"); + for (i = 1; i <= n; i++) /* push arguments to 'g_read' */ + lua_pushvalue(L, lua_upvalueindex(3 + i)); + n = g_read(L, p->f, 2); /* 'n' is number of results */ + lua_assert(n > 0); /* should return at least a nil */ + if (lua_toboolean(L, -n)) /* read at least one value? */ + return n; /* return them */ + else { /* first result is false: EOF or error */ + if (n > 1) { /* is there error information? */ + /* 2nd result is error message */ + return luaL_error(L, "%s", lua_tostring(L, -n + 1)); + } + if (lua_toboolean(L, lua_upvalueindex(3))) { /* generator created file? */ + lua_settop(L, 0); /* clear stack */ + lua_pushvalue(L, lua_upvalueindex(1)); /* push file at index 1 */ + aux_close(L); /* close it */ + } + return 0; + } +} + +/* }====================================================== */ + + +static int g_write (lua_State *L, FILE *f, int arg) { + int nargs = lua_gettop(L) - arg; + int status = 1; + errno = 0; + for (; nargs--; arg++) { + if (lua_type(L, arg) == LUA_TNUMBER) { + /* optimization: could be done exactly as for strings */ + int len = lua_isinteger(L, arg) + ? fprintf(f, LUA_INTEGER_FMT, + (LUAI_UACINT)lua_tointeger(L, arg)) + : fprintf(f, LUA_NUMBER_FMT, + (LUAI_UACNUMBER)lua_tonumber(L, arg)); + status = status && (len > 0); + } + else { + size_t l; + const char *s = luaL_checklstring(L, arg, &l); + status = status && (fwrite(s, sizeof(char), l, f) == l); + } + } + if (l_likely(status)) + return 1; /* file handle already on stack top */ + else + return luaL_fileresult(L, status, NULL); +} + + +static int io_write (lua_State *L) { + return g_write(L, getiofile(L, IO_OUTPUT), 1); +} + + +static int f_write (lua_State *L) { + FILE *f = tofile(L); + lua_pushvalue(L, 1); /* push file at the stack top (to be returned) */ + return g_write(L, f, 2); +} + + +static int f_seek (lua_State *L) { + static const int mode[] = {SEEK_SET, SEEK_CUR, SEEK_END}; + static const char *const modenames[] = {"set", "cur", "end", NULL}; + FILE *f = tofile(L); + int op = luaL_checkoption(L, 2, "cur", modenames); + lua_Integer p3 = luaL_optinteger(L, 3, 0); + l_seeknum offset = (l_seeknum)p3; + luaL_argcheck(L, (lua_Integer)offset == p3, 3, + "not an integer in proper range"); + errno = 0; + op = l_fseek(f, offset, mode[op]); + if (l_unlikely(op)) + return luaL_fileresult(L, 0, NULL); /* error */ + else { + lua_pushinteger(L, (lua_Integer)l_ftell(f)); + return 1; + } +} + + +static int f_setvbuf (lua_State *L) { + static const int mode[] = {_IONBF, _IOFBF, _IOLBF}; + static const char *const modenames[] = {"no", "full", "line", NULL}; + FILE *f = tofile(L); + int op = luaL_checkoption(L, 2, NULL, modenames); + lua_Integer sz = luaL_optinteger(L, 3, LUAL_BUFFERSIZE); + int res; + errno = 0; + res = setvbuf(f, NULL, mode[op], (size_t)sz); + return luaL_fileresult(L, res == 0, NULL); +} + + + +static int io_flush (lua_State *L) { + FILE *f = getiofile(L, IO_OUTPUT); + errno = 0; + return luaL_fileresult(L, fflush(f) == 0, NULL); +} + + +static int f_flush (lua_State *L) { + FILE *f = tofile(L); + errno = 0; + return luaL_fileresult(L, fflush(f) == 0, NULL); +} + + +/* +** functions for 'io' library +*/ +static const luaL_Reg iolib[] = { + {"close", io_close}, + {"flush", io_flush}, + {"input", io_input}, + {"lines", io_lines}, + {"open", io_open}, + {"output", io_output}, + {"popen", io_popen}, + {"read", io_read}, + {"tmpfile", io_tmpfile}, + {"type", io_type}, + {"write", io_write}, + {NULL, NULL} +}; + + +/* +** methods for file handles +*/ +static const luaL_Reg meth[] = { + {"read", f_read}, + {"write", f_write}, + {"lines", f_lines}, + {"flush", f_flush}, + {"seek", f_seek}, + {"close", f_close}, + {"setvbuf", f_setvbuf}, + {NULL, NULL} +}; + + +/* +** metamethods for file handles +*/ +static const luaL_Reg metameth[] = { + {"__index", NULL}, /* placeholder */ + {"__gc", f_gc}, + {"__close", f_gc}, + {"__tostring", f_tostring}, + {NULL, NULL} +}; + + +static void createmeta (lua_State *L) { + luaL_newmetatable(L, LUA_FILEHANDLE); /* metatable for file handles */ + luaL_setfuncs(L, metameth, 0); /* add metamethods to new metatable */ + luaL_newlibtable(L, meth); /* create method table */ + luaL_setfuncs(L, meth, 0); /* add file methods to method table */ + lua_setfield(L, -2, "__index"); /* metatable.__index = method table */ + lua_pop(L, 1); /* pop metatable */ +} + + +/* +** function to (not) close the standard files stdin, stdout, and stderr +*/ +static int io_noclose (lua_State *L) { + LStream *p = tolstream(L); + p->closef = &io_noclose; /* keep file opened */ + luaL_pushfail(L); + lua_pushliteral(L, "cannot close standard file"); + return 2; +} + + +static void createstdfile (lua_State *L, FILE *f, const char *k, + const char *fname) { + LStream *p = newprefile(L); + p->f = f; + p->closef = &io_noclose; + if (k != NULL) { + lua_pushvalue(L, -1); + lua_setfield(L, LUA_REGISTRYINDEX, k); /* add file to registry */ + } + lua_setfield(L, -2, fname); /* add file to module */ +} + + +LUAMOD_API int luaopen_io (lua_State *L) { + luaL_newlib(L, iolib); /* new module */ + createmeta(L); + /* create (and set) default files */ + createstdfile(L, stdin, IO_INPUT, "stdin"); + createstdfile(L, stdout, IO_OUTPUT, "stdout"); + createstdfile(L, stderr, NULL, "stderr"); + return 1; +} + diff --git a/vendor/lua-5.4.8/src/ljumptab.h b/vendor/lua-5.4.8/src/ljumptab.h new file mode 100644 index 0000000..8306f25 --- /dev/null +++ b/vendor/lua-5.4.8/src/ljumptab.h @@ -0,0 +1,112 @@ +/* +** $Id: ljumptab.h $ +** Jump Table for the Lua interpreter +** See Copyright Notice in lua.h +*/ + + +#undef vmdispatch +#undef vmcase +#undef vmbreak + +#define vmdispatch(x) goto *disptab[x]; + +#define vmcase(l) L_##l: + +#define vmbreak vmfetch(); vmdispatch(GET_OPCODE(i)); + + +static const void *const disptab[NUM_OPCODES] = { + +#if 0 +** you can update the following list with this command: +** +** sed -n '/^OP_/\!d; s/OP_/\&\&L_OP_/ ; s/,.*/,/ ; s/\/.*// ; p' lopcodes.h +** +#endif + +&&L_OP_MOVE, +&&L_OP_LOADI, +&&L_OP_LOADF, +&&L_OP_LOADK, +&&L_OP_LOADKX, +&&L_OP_LOADFALSE, +&&L_OP_LFALSESKIP, +&&L_OP_LOADTRUE, +&&L_OP_LOADNIL, +&&L_OP_GETUPVAL, +&&L_OP_SETUPVAL, +&&L_OP_GETTABUP, +&&L_OP_GETTABLE, +&&L_OP_GETI, +&&L_OP_GETFIELD, +&&L_OP_SETTABUP, +&&L_OP_SETTABLE, +&&L_OP_SETI, +&&L_OP_SETFIELD, +&&L_OP_NEWTABLE, +&&L_OP_SELF, +&&L_OP_ADDI, +&&L_OP_ADDK, +&&L_OP_SUBK, +&&L_OP_MULK, +&&L_OP_MODK, +&&L_OP_POWK, +&&L_OP_DIVK, +&&L_OP_IDIVK, +&&L_OP_BANDK, +&&L_OP_BORK, +&&L_OP_BXORK, +&&L_OP_SHRI, +&&L_OP_SHLI, +&&L_OP_ADD, +&&L_OP_SUB, +&&L_OP_MUL, +&&L_OP_MOD, +&&L_OP_POW, +&&L_OP_DIV, +&&L_OP_IDIV, +&&L_OP_BAND, +&&L_OP_BOR, +&&L_OP_BXOR, +&&L_OP_SHL, +&&L_OP_SHR, +&&L_OP_MMBIN, +&&L_OP_MMBINI, +&&L_OP_MMBINK, +&&L_OP_UNM, +&&L_OP_BNOT, +&&L_OP_NOT, +&&L_OP_LEN, +&&L_OP_CONCAT, +&&L_OP_CLOSE, +&&L_OP_TBC, +&&L_OP_JMP, +&&L_OP_EQ, +&&L_OP_LT, +&&L_OP_LE, +&&L_OP_EQK, +&&L_OP_EQI, +&&L_OP_LTI, +&&L_OP_LEI, +&&L_OP_GTI, +&&L_OP_GEI, +&&L_OP_TEST, +&&L_OP_TESTSET, +&&L_OP_CALL, +&&L_OP_TAILCALL, +&&L_OP_RETURN, +&&L_OP_RETURN0, +&&L_OP_RETURN1, +&&L_OP_FORLOOP, +&&L_OP_FORPREP, +&&L_OP_TFORPREP, +&&L_OP_TFORCALL, +&&L_OP_TFORLOOP, +&&L_OP_SETLIST, +&&L_OP_CLOSURE, +&&L_OP_VARARG, +&&L_OP_VARARGPREP, +&&L_OP_EXTRAARG + +}; diff --git a/vendor/lua-5.4.8/src/llex.c b/vendor/lua-5.4.8/src/llex.c new file mode 100644 index 0000000..5fc39a5 --- /dev/null +++ b/vendor/lua-5.4.8/src/llex.c @@ -0,0 +1,581 @@ +/* +** $Id: llex.c $ +** Lexical Analyzer +** See Copyright Notice in lua.h +*/ + +#define llex_c +#define LUA_CORE + +#include "lprefix.h" + + +#include <locale.h> +#include <string.h> + +#include "lua.h" + +#include "lctype.h" +#include "ldebug.h" +#include "ldo.h" +#include "lgc.h" +#include "llex.h" +#include "lobject.h" +#include "lparser.h" +#include "lstate.h" +#include "lstring.h" +#include "ltable.h" +#include "lzio.h" + + + +#define next(ls) (ls->current = zgetc(ls->z)) + + + +#define currIsNewline(ls) (ls->current == '\n' || ls->current == '\r') + + +/* ORDER RESERVED */ +static const char *const luaX_tokens [] = { + "and", "break", "do", "else", "elseif", + "end", "false", "for", "function", "goto", "if", + "in", "local", "nil", "not", "or", "repeat", + "return", "then", "true", "until", "while", + "//", "..", "...", "==", ">=", "<=", "~=", + "<<", ">>", "::", "<eof>", + "<number>", "<integer>", "<name>", "<string>" +}; + + +#define save_and_next(ls) (save(ls, ls->current), next(ls)) + + +static l_noret lexerror (LexState *ls, const char *msg, int token); + + +static void save (LexState *ls, int c) { + Mbuffer *b = ls->buff; + if (luaZ_bufflen(b) + 1 > luaZ_sizebuffer(b)) { + size_t newsize; + if (luaZ_sizebuffer(b) >= MAX_SIZE/2) + lexerror(ls, "lexical element too long", 0); + newsize = luaZ_sizebuffer(b) * 2; + luaZ_resizebuffer(ls->L, b, newsize); + } + b->buffer[luaZ_bufflen(b)++] = cast_char(c); +} + + +void luaX_init (lua_State *L) { + int i; + TString *e = luaS_newliteral(L, LUA_ENV); /* create env name */ + luaC_fix(L, obj2gco(e)); /* never collect this name */ + for (i=0; i<NUM_RESERVED; i++) { + TString *ts = luaS_new(L, luaX_tokens[i]); + luaC_fix(L, obj2gco(ts)); /* reserved words are never collected */ + ts->extra = cast_byte(i+1); /* reserved word */ + } +} + + +const char *luaX_token2str (LexState *ls, int token) { + if (token < FIRST_RESERVED) { /* single-byte symbols? */ + if (lisprint(token)) + return luaO_pushfstring(ls->L, "'%c'", token); + else /* control character */ + return luaO_pushfstring(ls->L, "'<\\%d>'", token); + } + else { + const char *s = luaX_tokens[token - FIRST_RESERVED]; + if (token < TK_EOS) /* fixed format (symbols and reserved words)? */ + return luaO_pushfstring(ls->L, "'%s'", s); + else /* names, strings, and numerals */ + return s; + } +} + + +static const char *txtToken (LexState *ls, int token) { + switch (token) { + case TK_NAME: case TK_STRING: + case TK_FLT: case TK_INT: + save(ls, '\0'); + return luaO_pushfstring(ls->L, "'%s'", luaZ_buffer(ls->buff)); + default: + return luaX_token2str(ls, token); + } +} + + +static l_noret lexerror (LexState *ls, const char *msg, int token) { + msg = luaG_addinfo(ls->L, msg, ls->source, ls->linenumber); + if (token) + luaO_pushfstring(ls->L, "%s near %s", msg, txtToken(ls, token)); + luaD_throw(ls->L, LUA_ERRSYNTAX); +} + + +l_noret luaX_syntaxerror (LexState *ls, const char *msg) { + lexerror(ls, msg, ls->t.token); +} + + +/* +** Creates a new string and anchors it in scanner's table so that it +** will not be collected until the end of the compilation; by that time +** it should be anchored somewhere. It also internalizes long strings, +** ensuring there is only one copy of each unique string. The table +** here is used as a set: the string enters as the key, while its value +** is irrelevant. We use the string itself as the value only because it +** is a TValue readily available. Later, the code generation can change +** this value. +*/ +TString *luaX_newstring (LexState *ls, const char *str, size_t l) { + lua_State *L = ls->L; + TString *ts = luaS_newlstr(L, str, l); /* create new string */ + const TValue *o = luaH_getstr(ls->h, ts); + if (!ttisnil(o)) /* string already present? */ + ts = keystrval(nodefromval(o)); /* get saved copy */ + else { /* not in use yet */ + TValue *stv = s2v(L->top.p++); /* reserve stack space for string */ + setsvalue(L, stv, ts); /* temporarily anchor the string */ + luaH_finishset(L, ls->h, stv, o, stv); /* t[string] = string */ + /* table is not a metatable, so it does not need to invalidate cache */ + luaC_checkGC(L); + L->top.p--; /* remove string from stack */ + } + return ts; +} + + +/* +** increment line number and skips newline sequence (any of +** \n, \r, \n\r, or \r\n) +*/ +static void inclinenumber (LexState *ls) { + int old = ls->current; + lua_assert(currIsNewline(ls)); + next(ls); /* skip '\n' or '\r' */ + if (currIsNewline(ls) && ls->current != old) + next(ls); /* skip '\n\r' or '\r\n' */ + if (++ls->linenumber >= MAX_INT) + lexerror(ls, "chunk has too many lines", 0); +} + + +void luaX_setinput (lua_State *L, LexState *ls, ZIO *z, TString *source, + int firstchar) { + ls->t.token = 0; + ls->L = L; + ls->current = firstchar; + ls->lookahead.token = TK_EOS; /* no look-ahead token */ + ls->z = z; + ls->fs = NULL; + ls->linenumber = 1; + ls->lastline = 1; + ls->source = source; + ls->envn = luaS_newliteral(L, LUA_ENV); /* get env name */ + luaZ_resizebuffer(ls->L, ls->buff, LUA_MINBUFFER); /* initialize buffer */ +} + + + +/* +** ======================================================= +** LEXICAL ANALYZER +** ======================================================= +*/ + + +static int check_next1 (LexState *ls, int c) { + if (ls->current == c) { + next(ls); + return 1; + } + else return 0; +} + + +/* +** Check whether current char is in set 'set' (with two chars) and +** saves it +*/ +static int check_next2 (LexState *ls, const char *set) { + lua_assert(set[2] == '\0'); + if (ls->current == set[0] || ls->current == set[1]) { + save_and_next(ls); + return 1; + } + else return 0; +} + + +/* LUA_NUMBER */ +/* +** This function is quite liberal in what it accepts, as 'luaO_str2num' +** will reject ill-formed numerals. Roughly, it accepts the following +** pattern: +** +** %d(%x|%.|([Ee][+-]?))* | 0[Xx](%x|%.|([Pp][+-]?))* +** +** The only tricky part is to accept [+-] only after a valid exponent +** mark, to avoid reading '3-4' or '0xe+1' as a single number. +** +** The caller might have already read an initial dot. +*/ +static int read_numeral (LexState *ls, SemInfo *seminfo) { + TValue obj; + const char *expo = "Ee"; + int first = ls->current; + lua_assert(lisdigit(ls->current)); + save_and_next(ls); + if (first == '0' && check_next2(ls, "xX")) /* hexadecimal? */ + expo = "Pp"; + for (;;) { + if (check_next2(ls, expo)) /* exponent mark? */ + check_next2(ls, "-+"); /* optional exponent sign */ + else if (lisxdigit(ls->current) || ls->current == '.') /* '%x|%.' */ + save_and_next(ls); + else break; + } + if (lislalpha(ls->current)) /* is numeral touching a letter? */ + save_and_next(ls); /* force an error */ + save(ls, '\0'); + if (luaO_str2num(luaZ_buffer(ls->buff), &obj) == 0) /* format error? */ + lexerror(ls, "malformed number", TK_FLT); + if (ttisinteger(&obj)) { + seminfo->i = ivalue(&obj); + return TK_INT; + } + else { + lua_assert(ttisfloat(&obj)); + seminfo->r = fltvalue(&obj); + return TK_FLT; + } +} + + +/* +** read a sequence '[=*[' or ']=*]', leaving the last bracket. If +** sequence is well formed, return its number of '='s + 2; otherwise, +** return 1 if it is a single bracket (no '='s and no 2nd bracket); +** otherwise (an unfinished '[==...') return 0. +*/ +static size_t skip_sep (LexState *ls) { + size_t count = 0; + int s = ls->current; + lua_assert(s == '[' || s == ']'); + save_and_next(ls); + while (ls->current == '=') { + save_and_next(ls); + count++; + } + return (ls->current == s) ? count + 2 + : (count == 0) ? 1 + : 0; +} + + +static void read_long_string (LexState *ls, SemInfo *seminfo, size_t sep) { + int line = ls->linenumber; /* initial line (for error message) */ + save_and_next(ls); /* skip 2nd '[' */ + if (currIsNewline(ls)) /* string starts with a newline? */ + inclinenumber(ls); /* skip it */ + for (;;) { + switch (ls->current) { + case EOZ: { /* error */ + const char *what = (seminfo ? "string" : "comment"); + const char *msg = luaO_pushfstring(ls->L, + "unfinished long %s (starting at line %d)", what, line); + lexerror(ls, msg, TK_EOS); + break; /* to avoid warnings */ + } + case ']': { + if (skip_sep(ls) == sep) { + save_and_next(ls); /* skip 2nd ']' */ + goto endloop; + } + break; + } + case '\n': case '\r': { + save(ls, '\n'); + inclinenumber(ls); + if (!seminfo) luaZ_resetbuffer(ls->buff); /* avoid wasting space */ + break; + } + default: { + if (seminfo) save_and_next(ls); + else next(ls); + } + } + } endloop: + if (seminfo) + seminfo->ts = luaX_newstring(ls, luaZ_buffer(ls->buff) + sep, + luaZ_bufflen(ls->buff) - 2 * sep); +} + + +static void esccheck (LexState *ls, int c, const char *msg) { + if (!c) { + if (ls->current != EOZ) + save_and_next(ls); /* add current to buffer for error message */ + lexerror(ls, msg, TK_STRING); + } +} + + +static int gethexa (LexState *ls) { + save_and_next(ls); + esccheck (ls, lisxdigit(ls->current), "hexadecimal digit expected"); + return luaO_hexavalue(ls->current); +} + + +static int readhexaesc (LexState *ls) { + int r = gethexa(ls); + r = (r << 4) + gethexa(ls); + luaZ_buffremove(ls->buff, 2); /* remove saved chars from buffer */ + return r; +} + + +static unsigned long readutf8esc (LexState *ls) { + unsigned long r; + int i = 4; /* chars to be removed: '\', 'u', '{', and first digit */ + save_and_next(ls); /* skip 'u' */ + esccheck(ls, ls->current == '{', "missing '{'"); + r = gethexa(ls); /* must have at least one digit */ + while (cast_void(save_and_next(ls)), lisxdigit(ls->current)) { + i++; + esccheck(ls, r <= (0x7FFFFFFFu >> 4), "UTF-8 value too large"); + r = (r << 4) + luaO_hexavalue(ls->current); + } + esccheck(ls, ls->current == '}', "missing '}'"); + next(ls); /* skip '}' */ + luaZ_buffremove(ls->buff, i); /* remove saved chars from buffer */ + return r; +} + + +static void utf8esc (LexState *ls) { + char buff[UTF8BUFFSZ]; + int n = luaO_utf8esc(buff, readutf8esc(ls)); + for (; n > 0; n--) /* add 'buff' to string */ + save(ls, buff[UTF8BUFFSZ - n]); +} + + +static int readdecesc (LexState *ls) { + int i; + int r = 0; /* result accumulator */ + for (i = 0; i < 3 && lisdigit(ls->current); i++) { /* read up to 3 digits */ + r = 10*r + ls->current - '0'; + save_and_next(ls); + } + esccheck(ls, r <= UCHAR_MAX, "decimal escape too large"); + luaZ_buffremove(ls->buff, i); /* remove read digits from buffer */ + return r; +} + + +static void read_string (LexState *ls, int del, SemInfo *seminfo) { + save_and_next(ls); /* keep delimiter (for error messages) */ + while (ls->current != del) { + switch (ls->current) { + case EOZ: + lexerror(ls, "unfinished string", TK_EOS); + break; /* to avoid warnings */ + case '\n': + case '\r': + lexerror(ls, "unfinished string", TK_STRING); + break; /* to avoid warnings */ + case '\\': { /* escape sequences */ + int c; /* final character to be saved */ + save_and_next(ls); /* keep '\\' for error messages */ + switch (ls->current) { + case 'a': c = '\a'; goto read_save; + case 'b': c = '\b'; goto read_save; + case 'f': c = '\f'; goto read_save; + case 'n': c = '\n'; goto read_save; + case 'r': c = '\r'; goto read_save; + case 't': c = '\t'; goto read_save; + case 'v': c = '\v'; goto read_save; + case 'x': c = readhexaesc(ls); goto read_save; + case 'u': utf8esc(ls); goto no_save; + case '\n': case '\r': + inclinenumber(ls); c = '\n'; goto only_save; + case '\\': case '\"': case '\'': + c = ls->current; goto read_save; + case EOZ: goto no_save; /* will raise an error next loop */ + case 'z': { /* zap following span of spaces */ + luaZ_buffremove(ls->buff, 1); /* remove '\\' */ + next(ls); /* skip the 'z' */ + while (lisspace(ls->current)) { + if (currIsNewline(ls)) inclinenumber(ls); + else next(ls); + } + goto no_save; + } + default: { + esccheck(ls, lisdigit(ls->current), "invalid escape sequence"); + c = readdecesc(ls); /* digital escape '\ddd' */ + goto only_save; + } + } + read_save: + next(ls); + /* go through */ + only_save: + luaZ_buffremove(ls->buff, 1); /* remove '\\' */ + save(ls, c); + /* go through */ + no_save: break; + } + default: + save_and_next(ls); + } + } + save_and_next(ls); /* skip delimiter */ + seminfo->ts = luaX_newstring(ls, luaZ_buffer(ls->buff) + 1, + luaZ_bufflen(ls->buff) - 2); +} + + +static int llex (LexState *ls, SemInfo *seminfo) { + luaZ_resetbuffer(ls->buff); + for (;;) { + switch (ls->current) { + case '\n': case '\r': { /* line breaks */ + inclinenumber(ls); + break; + } + case ' ': case '\f': case '\t': case '\v': { /* spaces */ + next(ls); + break; + } + case '-': { /* '-' or '--' (comment) */ + next(ls); + if (ls->current != '-') return '-'; + /* else is a comment */ + next(ls); + if (ls->current == '[') { /* long comment? */ + size_t sep = skip_sep(ls); + luaZ_resetbuffer(ls->buff); /* 'skip_sep' may dirty the buffer */ + if (sep >= 2) { + read_long_string(ls, NULL, sep); /* skip long comment */ + luaZ_resetbuffer(ls->buff); /* previous call may dirty the buff. */ + break; + } + } + /* else short comment */ + while (!currIsNewline(ls) && ls->current != EOZ) + next(ls); /* skip until end of line (or end of file) */ + break; + } + case '[': { /* long string or simply '[' */ + size_t sep = skip_sep(ls); + if (sep >= 2) { + read_long_string(ls, seminfo, sep); + return TK_STRING; + } + else if (sep == 0) /* '[=...' missing second bracket? */ + lexerror(ls, "invalid long string delimiter", TK_STRING); + return '['; + } + case '=': { + next(ls); + if (check_next1(ls, '=')) return TK_EQ; /* '==' */ + else return '='; + } + case '<': { + next(ls); + if (check_next1(ls, '=')) return TK_LE; /* '<=' */ + else if (check_next1(ls, '<')) return TK_SHL; /* '<<' */ + else return '<'; + } + case '>': { + next(ls); + if (check_next1(ls, '=')) return TK_GE; /* '>=' */ + else if (check_next1(ls, '>')) return TK_SHR; /* '>>' */ + else return '>'; + } + case '/': { + next(ls); + if (check_next1(ls, '/')) return TK_IDIV; /* '//' */ + else return '/'; + } + case '~': { + next(ls); + if (check_next1(ls, '=')) return TK_NE; /* '~=' */ + else return '~'; + } + case ':': { + next(ls); + if (check_next1(ls, ':')) return TK_DBCOLON; /* '::' */ + else return ':'; + } + case '"': case '\'': { /* short literal strings */ + read_string(ls, ls->current, seminfo); + return TK_STRING; + } + case '.': { /* '.', '..', '...', or number */ + save_and_next(ls); + if (check_next1(ls, '.')) { + if (check_next1(ls, '.')) + return TK_DOTS; /* '...' */ + else return TK_CONCAT; /* '..' */ + } + else if (!lisdigit(ls->current)) return '.'; + else return read_numeral(ls, seminfo); + } + case '0': case '1': case '2': case '3': case '4': + case '5': case '6': case '7': case '8': case '9': { + return read_numeral(ls, seminfo); + } + case EOZ: { + return TK_EOS; + } + default: { + if (lislalpha(ls->current)) { /* identifier or reserved word? */ + TString *ts; + do { + save_and_next(ls); + } while (lislalnum(ls->current)); + ts = luaX_newstring(ls, luaZ_buffer(ls->buff), + luaZ_bufflen(ls->buff)); + seminfo->ts = ts; + if (isreserved(ts)) /* reserved word? */ + return ts->extra - 1 + FIRST_RESERVED; + else { + return TK_NAME; + } + } + else { /* single-char tokens ('+', '*', '%', '{', '}', ...) */ + int c = ls->current; + next(ls); + return c; + } + } + } + } +} + + +void luaX_next (LexState *ls) { + ls->lastline = ls->linenumber; + if (ls->lookahead.token != TK_EOS) { /* is there a look-ahead token? */ + ls->t = ls->lookahead; /* use this one */ + ls->lookahead.token = TK_EOS; /* and discharge it */ + } + else + ls->t.token = llex(ls, &ls->t.seminfo); /* read next token */ +} + + +int luaX_lookahead (LexState *ls) { + lua_assert(ls->lookahead.token == TK_EOS); + ls->lookahead.token = llex(ls, &ls->lookahead.seminfo); + return ls->lookahead.token; +} + diff --git a/vendor/lua-5.4.8/src/llex.h b/vendor/lua-5.4.8/src/llex.h new file mode 100644 index 0000000..389d2f8 --- /dev/null +++ b/vendor/lua-5.4.8/src/llex.h @@ -0,0 +1,91 @@ +/* +** $Id: llex.h $ +** Lexical Analyzer +** See Copyright Notice in lua.h +*/ + +#ifndef llex_h +#define llex_h + +#include <limits.h> + +#include "lobject.h" +#include "lzio.h" + + +/* +** Single-char tokens (terminal symbols) are represented by their own +** numeric code. Other tokens start at the following value. +*/ +#define FIRST_RESERVED (UCHAR_MAX + 1) + + +#if !defined(LUA_ENV) +#define LUA_ENV "_ENV" +#endif + + +/* +* WARNING: if you change the order of this enumeration, +* grep "ORDER RESERVED" +*/ +enum RESERVED { + /* terminal symbols denoted by reserved words */ + TK_AND = FIRST_RESERVED, TK_BREAK, + TK_DO, TK_ELSE, TK_ELSEIF, TK_END, TK_FALSE, TK_FOR, TK_FUNCTION, + TK_GOTO, TK_IF, TK_IN, TK_LOCAL, TK_NIL, TK_NOT, TK_OR, TK_REPEAT, + TK_RETURN, TK_THEN, TK_TRUE, TK_UNTIL, TK_WHILE, + /* other terminal symbols */ + TK_IDIV, TK_CONCAT, TK_DOTS, TK_EQ, TK_GE, TK_LE, TK_NE, + TK_SHL, TK_SHR, + TK_DBCOLON, TK_EOS, + TK_FLT, TK_INT, TK_NAME, TK_STRING +}; + +/* number of reserved words */ +#define NUM_RESERVED (cast_int(TK_WHILE-FIRST_RESERVED + 1)) + + +typedef union { + lua_Number r; + lua_Integer i; + TString *ts; +} SemInfo; /* semantics information */ + + +typedef struct Token { + int token; + SemInfo seminfo; +} Token; + + +/* state of the lexer plus state of the parser when shared by all + functions */ +typedef struct LexState { + int current; /* current character (charint) */ + int linenumber; /* input line counter */ + int lastline; /* line of last token 'consumed' */ + Token t; /* current token */ + Token lookahead; /* look ahead token */ + struct FuncState *fs; /* current function (parser) */ + struct lua_State *L; + ZIO *z; /* input stream */ + Mbuffer *buff; /* buffer for tokens */ + Table *h; /* to avoid collection/reuse strings */ + struct Dyndata *dyd; /* dynamic structures used by the parser */ + TString *source; /* current source name */ + TString *envn; /* environment variable name */ +} LexState; + + +LUAI_FUNC void luaX_init (lua_State *L); +LUAI_FUNC void luaX_setinput (lua_State *L, LexState *ls, ZIO *z, + TString *source, int firstchar); +LUAI_FUNC TString *luaX_newstring (LexState *ls, const char *str, size_t l); +LUAI_FUNC void luaX_next (LexState *ls); +LUAI_FUNC int luaX_lookahead (LexState *ls); +LUAI_FUNC l_noret luaX_syntaxerror (LexState *ls, const char *s); +LUAI_FUNC const char *luaX_token2str (LexState *ls, int token); + + +#endif diff --git a/vendor/lua-5.4.8/src/llimits.h b/vendor/lua-5.4.8/src/llimits.h new file mode 100644 index 0000000..1c826f7 --- /dev/null +++ b/vendor/lua-5.4.8/src/llimits.h @@ -0,0 +1,380 @@ +/* +** $Id: llimits.h $ +** Limits, basic types, and some other 'installation-dependent' definitions +** See Copyright Notice in lua.h +*/ + +#ifndef llimits_h +#define llimits_h + + +#include <limits.h> +#include <stddef.h> + + +#include "lua.h" + + +/* +** 'lu_mem' and 'l_mem' are unsigned/signed integers big enough to count +** the total memory used by Lua (in bytes). Usually, 'size_t' and +** 'ptrdiff_t' should work, but we use 'long' for 16-bit machines. +*/ +#if defined(LUAI_MEM) /* { external definitions? */ +typedef LUAI_UMEM lu_mem; +typedef LUAI_MEM l_mem; +#elif LUAI_IS32INT /* }{ */ +typedef size_t lu_mem; +typedef ptrdiff_t l_mem; +#else /* 16-bit ints */ /* }{ */ +typedef unsigned long lu_mem; +typedef long l_mem; +#endif /* } */ + + +/* chars used as small naturals (so that 'char' is reserved for characters) */ +typedef unsigned char lu_byte; +typedef signed char ls_byte; + + +/* maximum value for size_t */ +#define MAX_SIZET ((size_t)(~(size_t)0)) + +/* maximum size visible for Lua (must be representable in a lua_Integer) */ +#define MAX_SIZE (sizeof(size_t) < sizeof(lua_Integer) ? MAX_SIZET \ + : (size_t)(LUA_MAXINTEGER)) + + +#define MAX_LUMEM ((lu_mem)(~(lu_mem)0)) + +#define MAX_LMEM ((l_mem)(MAX_LUMEM >> 1)) + + +#define MAX_INT INT_MAX /* maximum value of an int */ + + +/* +** floor of the log2 of the maximum signed value for integral type 't'. +** (That is, maximum 'n' such that '2^n' fits in the given signed type.) +*/ +#define log2maxs(t) (sizeof(t) * 8 - 2) + + +/* +** test whether an unsigned value is a power of 2 (or zero) +*/ +#define ispow2(x) (((x) & ((x) - 1)) == 0) + + +/* number of chars of a literal string without the ending \0 */ +#define LL(x) (sizeof(x)/sizeof(char) - 1) + + +/* +** conversion of pointer to unsigned integer: this is for hashing only; +** there is no problem if the integer cannot hold the whole pointer +** value. (In strict ISO C this may cause undefined behavior, but no +** actual machine seems to bother.) +*/ +#if !defined(LUA_USE_C89) && defined(__STDC_VERSION__) && \ + __STDC_VERSION__ >= 199901L +#include <stdint.h> +#if defined(UINTPTR_MAX) /* even in C99 this type is optional */ +#define L_P2I uintptr_t +#else /* no 'intptr'? */ +#define L_P2I uintmax_t /* use the largest available integer */ +#endif +#else /* C89 option */ +#define L_P2I size_t +#endif + +#define point2uint(p) ((unsigned int)((L_P2I)(p) & UINT_MAX)) + + + +/* types of 'usual argument conversions' for lua_Number and lua_Integer */ +typedef LUAI_UACNUMBER l_uacNumber; +typedef LUAI_UACINT l_uacInt; + + +/* +** Internal assertions for in-house debugging +*/ +#if defined LUAI_ASSERT +#undef NDEBUG +#include <assert.h> +#define lua_assert(c) assert(c) +#endif + +#if defined(lua_assert) +#define check_exp(c,e) (lua_assert(c), (e)) +/* to avoid problems with conditions too long */ +#define lua_longassert(c) ((c) ? (void)0 : lua_assert(0)) +#else +#define lua_assert(c) ((void)0) +#define check_exp(c,e) (e) +#define lua_longassert(c) ((void)0) +#endif + +/* +** assertion for checking API calls +*/ +#if !defined(luai_apicheck) +#define luai_apicheck(l,e) ((void)l, lua_assert(e)) +#endif + +#define api_check(l,e,msg) luai_apicheck(l,(e) && msg) + + +/* macro to avoid warnings about unused variables */ +#if !defined(UNUSED) +#define UNUSED(x) ((void)(x)) +#endif + + +/* type casts (a macro highlights casts in the code) */ +#define cast(t, exp) ((t)(exp)) + +#define cast_void(i) cast(void, (i)) +#define cast_voidp(i) cast(void *, (i)) +#define cast_num(i) cast(lua_Number, (i)) +#define cast_int(i) cast(int, (i)) +#define cast_uint(i) cast(unsigned int, (i)) +#define cast_byte(i) cast(lu_byte, (i)) +#define cast_uchar(i) cast(unsigned char, (i)) +#define cast_char(i) cast(char, (i)) +#define cast_charp(i) cast(char *, (i)) +#define cast_sizet(i) cast(size_t, (i)) + + +/* cast a signed lua_Integer to lua_Unsigned */ +#if !defined(l_castS2U) +#define l_castS2U(i) ((lua_Unsigned)(i)) +#endif + +/* +** cast a lua_Unsigned to a signed lua_Integer; this cast is +** not strict ISO C, but two-complement architectures should +** work fine. +*/ +#if !defined(l_castU2S) +#define l_castU2S(i) ((lua_Integer)(i)) +#endif + + +/* +** non-return type +*/ +#if !defined(l_noret) + +#if defined(__GNUC__) +#define l_noret void __attribute__((noreturn)) +#elif defined(_MSC_VER) && _MSC_VER >= 1200 +#define l_noret void __declspec(noreturn) +#else +#define l_noret void +#endif + +#endif + + +/* +** Inline functions +*/ +#if !defined(LUA_USE_C89) +#define l_inline inline +#elif defined(__GNUC__) +#define l_inline __inline__ +#else +#define l_inline /* empty */ +#endif + +#define l_sinline static l_inline + + +/* +** type for virtual-machine instructions; +** must be an unsigned with (at least) 4 bytes (see details in lopcodes.h) +*/ +#if LUAI_IS32INT +typedef unsigned int l_uint32; +#else +typedef unsigned long l_uint32; +#endif + +typedef l_uint32 Instruction; + + + +/* +** Maximum length for short strings, that is, strings that are +** internalized. (Cannot be smaller than reserved words or tags for +** metamethods, as these strings must be internalized; +** #("function") = 8, #("__newindex") = 10.) +*/ +#if !defined(LUAI_MAXSHORTLEN) +#define LUAI_MAXSHORTLEN 40 +#endif + + +/* +** Initial size for the string table (must be power of 2). +** The Lua core alone registers ~50 strings (reserved words + +** metaevent keys + a few others). Libraries would typically add +** a few dozens more. +*/ +#if !defined(MINSTRTABSIZE) +#define MINSTRTABSIZE 128 +#endif + + +/* +** Size of cache for strings in the API. 'N' is the number of +** sets (better be a prime) and "M" is the size of each set (M == 1 +** makes a direct cache.) +*/ +#if !defined(STRCACHE_N) +#define STRCACHE_N 53 +#define STRCACHE_M 2 +#endif + + +/* minimum size for string buffer */ +#if !defined(LUA_MINBUFFER) +#define LUA_MINBUFFER 32 +#endif + + +/* +** Maximum depth for nested C calls, syntactical nested non-terminals, +** and other features implemented through recursion in C. (Value must +** fit in a 16-bit unsigned integer. It must also be compatible with +** the size of the C stack.) +*/ +#if !defined(LUAI_MAXCCALLS) +#define LUAI_MAXCCALLS 200 +#endif + + +/* +** macros that are executed whenever program enters the Lua core +** ('lua_lock') and leaves the core ('lua_unlock') +*/ +#if !defined(lua_lock) +#define lua_lock(L) ((void) 0) +#define lua_unlock(L) ((void) 0) +#endif + +/* +** macro executed during Lua functions at points where the +** function can yield. +*/ +#if !defined(luai_threadyield) +#define luai_threadyield(L) {lua_unlock(L); lua_lock(L);} +#endif + + +/* +** these macros allow user-specific actions when a thread is +** created/deleted/resumed/yielded. +*/ +#if !defined(luai_userstateopen) +#define luai_userstateopen(L) ((void)L) +#endif + +#if !defined(luai_userstateclose) +#define luai_userstateclose(L) ((void)L) +#endif + +#if !defined(luai_userstatethread) +#define luai_userstatethread(L,L1) ((void)L) +#endif + +#if !defined(luai_userstatefree) +#define luai_userstatefree(L,L1) ((void)L) +#endif + +#if !defined(luai_userstateresume) +#define luai_userstateresume(L,n) ((void)L) +#endif + +#if !defined(luai_userstateyield) +#define luai_userstateyield(L,n) ((void)L) +#endif + + + +/* +** The luai_num* macros define the primitive operations over numbers. +*/ + +/* floor division (defined as 'floor(a/b)') */ +#if !defined(luai_numidiv) +#define luai_numidiv(L,a,b) ((void)L, l_floor(luai_numdiv(L,a,b))) +#endif + +/* float division */ +#if !defined(luai_numdiv) +#define luai_numdiv(L,a,b) ((a)/(b)) +#endif + +/* +** modulo: defined as 'a - floor(a/b)*b'; the direct computation +** using this definition has several problems with rounding errors, +** so it is better to use 'fmod'. 'fmod' gives the result of +** 'a - trunc(a/b)*b', and therefore must be corrected when +** 'trunc(a/b) ~= floor(a/b)'. That happens when the division has a +** non-integer negative result: non-integer result is equivalent to +** a non-zero remainder 'm'; negative result is equivalent to 'a' and +** 'b' with different signs, or 'm' and 'b' with different signs +** (as the result 'm' of 'fmod' has the same sign of 'a'). +*/ +#if !defined(luai_nummod) +#define luai_nummod(L,a,b,m) \ + { (void)L; (m) = l_mathop(fmod)(a,b); \ + if (((m) > 0) ? (b) < 0 : ((m) < 0 && (b) > 0)) (m) += (b); } +#endif + +/* exponentiation */ +#if !defined(luai_numpow) +#define luai_numpow(L,a,b) \ + ((void)L, (b == 2) ? (a)*(a) : l_mathop(pow)(a,b)) +#endif + +/* the others are quite standard operations */ +#if !defined(luai_numadd) +#define luai_numadd(L,a,b) ((a)+(b)) +#define luai_numsub(L,a,b) ((a)-(b)) +#define luai_nummul(L,a,b) ((a)*(b)) +#define luai_numunm(L,a) (-(a)) +#define luai_numeq(a,b) ((a)==(b)) +#define luai_numlt(a,b) ((a)<(b)) +#define luai_numle(a,b) ((a)<=(b)) +#define luai_numgt(a,b) ((a)>(b)) +#define luai_numge(a,b) ((a)>=(b)) +#define luai_numisnan(a) (!luai_numeq((a), (a))) +#endif + + + + + +/* +** macro to control inclusion of some hard tests on stack reallocation +*/ +#if !defined(HARDSTACKTESTS) +#define condmovestack(L,pre,pos) ((void)0) +#else +/* realloc stack keeping its size */ +#define condmovestack(L,pre,pos) \ + { int sz_ = stacksize(L); pre; luaD_reallocstack((L), sz_, 0); pos; } +#endif + +#if !defined(HARDMEMTESTS) +#define condchangemem(L,pre,pos) ((void)0) +#else +#define condchangemem(L,pre,pos) \ + { if (gcrunning(G(L))) { pre; luaC_fullgc(L, 0); pos; } } +#endif + +#endif diff --git a/vendor/lua-5.4.8/src/lmathlib.c b/vendor/lua-5.4.8/src/lmathlib.c new file mode 100644 index 0000000..4381063 --- /dev/null +++ b/vendor/lua-5.4.8/src/lmathlib.c @@ -0,0 +1,781 @@ +/* +** $Id: lmathlib.c $ +** Standard mathematical library +** See Copyright Notice in lua.h +*/ + +#define lmathlib_c +#define LUA_LIB + +#include "lprefix.h" + + +#include <float.h> +#include <limits.h> +#include <math.h> +#include <stdlib.h> +#include <time.h> + +#include "lua.h" + +#include "lauxlib.h" +#include "lualib.h" + + +#undef PI +#define PI (l_mathop(3.141592653589793238462643383279502884)) + + +static int math_abs (lua_State *L) { + if (lua_isinteger(L, 1)) { + lua_Integer n = lua_tointeger(L, 1); + if (n < 0) n = (lua_Integer)(0u - (lua_Unsigned)n); + lua_pushinteger(L, n); + } + else + lua_pushnumber(L, l_mathop(fabs)(luaL_checknumber(L, 1))); + return 1; +} + +static int math_sin (lua_State *L) { + lua_pushnumber(L, l_mathop(sin)(luaL_checknumber(L, 1))); + return 1; +} + +static int math_cos (lua_State *L) { + lua_pushnumber(L, l_mathop(cos)(luaL_checknumber(L, 1))); + return 1; +} + +static int math_tan (lua_State *L) { + lua_pushnumber(L, l_mathop(tan)(luaL_checknumber(L, 1))); + return 1; +} + +static int math_asin (lua_State *L) { + lua_pushnumber(L, l_mathop(asin)(luaL_checknumber(L, 1))); + return 1; +} + +static int math_acos (lua_State *L) { + lua_pushnumber(L, l_mathop(acos)(luaL_checknumber(L, 1))); + return 1; +} + +static int math_atan (lua_State *L) { + lua_Number y = luaL_checknumber(L, 1); + lua_Number x = luaL_optnumber(L, 2, 1); + lua_pushnumber(L, l_mathop(atan2)(y, x)); + return 1; +} + + +static int math_toint (lua_State *L) { + int valid; + lua_Integer n = lua_tointegerx(L, 1, &valid); + if (l_likely(valid)) + lua_pushinteger(L, n); + else { + luaL_checkany(L, 1); + luaL_pushfail(L); /* value is not convertible to integer */ + } + return 1; +} + + +static void pushnumint (lua_State *L, lua_Number d) { + lua_Integer n; + if (lua_numbertointeger(d, &n)) /* does 'd' fit in an integer? */ + lua_pushinteger(L, n); /* result is integer */ + else + lua_pushnumber(L, d); /* result is float */ +} + + +static int math_floor (lua_State *L) { + if (lua_isinteger(L, 1)) + lua_settop(L, 1); /* integer is its own floor */ + else { + lua_Number d = l_mathop(floor)(luaL_checknumber(L, 1)); + pushnumint(L, d); + } + return 1; +} + + +static int math_ceil (lua_State *L) { + if (lua_isinteger(L, 1)) + lua_settop(L, 1); /* integer is its own ceil */ + else { + lua_Number d = l_mathop(ceil)(luaL_checknumber(L, 1)); + pushnumint(L, d); + } + return 1; +} + + +static int math_fmod (lua_State *L) { + if (lua_isinteger(L, 1) && lua_isinteger(L, 2)) { + lua_Integer d = lua_tointeger(L, 2); + if ((lua_Unsigned)d + 1u <= 1u) { /* special cases: -1 or 0 */ + luaL_argcheck(L, d != 0, 2, "zero"); + lua_pushinteger(L, 0); /* avoid overflow with 0x80000... / -1 */ + } + else + lua_pushinteger(L, lua_tointeger(L, 1) % d); + } + else + lua_pushnumber(L, l_mathop(fmod)(luaL_checknumber(L, 1), + luaL_checknumber(L, 2))); + return 1; +} + + +/* +** next function does not use 'modf', avoiding problems with 'double*' +** (which is not compatible with 'float*') when lua_Number is not +** 'double'. +*/ +static int math_modf (lua_State *L) { + if (lua_isinteger(L ,1)) { + lua_settop(L, 1); /* number is its own integer part */ + lua_pushnumber(L, 0); /* no fractional part */ + } + else { + lua_Number n = luaL_checknumber(L, 1); + /* integer part (rounds toward zero) */ + lua_Number ip = (n < 0) ? l_mathop(ceil)(n) : l_mathop(floor)(n); + pushnumint(L, ip); + /* fractional part (test needed for inf/-inf) */ + lua_pushnumber(L, (n == ip) ? l_mathop(0.0) : (n - ip)); + } + return 2; +} + + +static int math_sqrt (lua_State *L) { + lua_pushnumber(L, l_mathop(sqrt)(luaL_checknumber(L, 1))); + return 1; +} + + +static int math_ult (lua_State *L) { + lua_Integer a = luaL_checkinteger(L, 1); + lua_Integer b = luaL_checkinteger(L, 2); + lua_pushboolean(L, (lua_Unsigned)a < (lua_Unsigned)b); + return 1; +} + +static int math_log (lua_State *L) { + lua_Number x = luaL_checknumber(L, 1); + lua_Number res; + if (lua_isnoneornil(L, 2)) + res = l_mathop(log)(x); + else { + lua_Number base = luaL_checknumber(L, 2); +#if !defined(LUA_USE_C89) + if (base == l_mathop(2.0)) + res = l_mathop(log2)(x); + else +#endif + if (base == l_mathop(10.0)) + res = l_mathop(log10)(x); + else + res = l_mathop(log)(x)/l_mathop(log)(base); + } + lua_pushnumber(L, res); + return 1; +} + +static int math_exp (lua_State *L) { + lua_pushnumber(L, l_mathop(exp)(luaL_checknumber(L, 1))); + return 1; +} + +static int math_deg (lua_State *L) { + lua_pushnumber(L, luaL_checknumber(L, 1) * (l_mathop(180.0) / PI)); + return 1; +} + +static int math_rad (lua_State *L) { + lua_pushnumber(L, luaL_checknumber(L, 1) * (PI / l_mathop(180.0))); + return 1; +} + + +static int math_min (lua_State *L) { + int n = lua_gettop(L); /* number of arguments */ + int imin = 1; /* index of current minimum value */ + int i; + luaL_argcheck(L, n >= 1, 1, "value expected"); + for (i = 2; i <= n; i++) { + if (lua_compare(L, i, imin, LUA_OPLT)) + imin = i; + } + lua_pushvalue(L, imin); + return 1; +} + + +static int math_max (lua_State *L) { + int n = lua_gettop(L); /* number of arguments */ + int imax = 1; /* index of current maximum value */ + int i; + luaL_argcheck(L, n >= 1, 1, "value expected"); + for (i = 2; i <= n; i++) { + if (lua_compare(L, imax, i, LUA_OPLT)) + imax = i; + } + lua_pushvalue(L, imax); + return 1; +} + + +static int math_type (lua_State *L) { + if (lua_type(L, 1) == LUA_TNUMBER) + lua_pushstring(L, (lua_isinteger(L, 1)) ? "integer" : "float"); + else { + luaL_checkany(L, 1); + luaL_pushfail(L); + } + return 1; +} + + + +/* +** {================================================================== +** Pseudo-Random Number Generator based on 'xoshiro256**'. +** =================================================================== +*/ + +/* +** This code uses lots of shifts. ANSI C does not allow shifts greater +** than or equal to the width of the type being shifted, so some shifts +** are written in convoluted ways to match that restriction. For +** preprocessor tests, it assumes a width of 32 bits, so the maximum +** shift there is 31 bits. +*/ + + +/* number of binary digits in the mantissa of a float */ +#define FIGS l_floatatt(MANT_DIG) + +#if FIGS > 64 +/* there are only 64 random bits; use them all */ +#undef FIGS +#define FIGS 64 +#endif + + +/* +** LUA_RAND32 forces the use of 32-bit integers in the implementation +** of the PRN generator (mainly for testing). +*/ +#if !defined(LUA_RAND32) && !defined(Rand64) + +/* try to find an integer type with at least 64 bits */ + +#if ((ULONG_MAX >> 31) >> 31) >= 3 + +/* 'long' has at least 64 bits */ +#define Rand64 unsigned long +#define SRand64 long + +#elif !defined(LUA_USE_C89) && defined(LLONG_MAX) + +/* there is a 'long long' type (which must have at least 64 bits) */ +#define Rand64 unsigned long long +#define SRand64 long long + +#elif ((LUA_MAXUNSIGNED >> 31) >> 31) >= 3 + +/* 'lua_Unsigned' has at least 64 bits */ +#define Rand64 lua_Unsigned +#define SRand64 lua_Integer + +#endif + +#endif + + +#if defined(Rand64) /* { */ + +/* +** Standard implementation, using 64-bit integers. +** If 'Rand64' has more than 64 bits, the extra bits do not interfere +** with the 64 initial bits, except in a right shift. Moreover, the +** final result has to discard the extra bits. +*/ + +/* avoid using extra bits when needed */ +#define trim64(x) ((x) & 0xffffffffffffffffu) + + +/* rotate left 'x' by 'n' bits */ +static Rand64 rotl (Rand64 x, int n) { + return (x << n) | (trim64(x) >> (64 - n)); +} + +static Rand64 nextrand (Rand64 *state) { + Rand64 state0 = state[0]; + Rand64 state1 = state[1]; + Rand64 state2 = state[2] ^ state0; + Rand64 state3 = state[3] ^ state1; + Rand64 res = rotl(state1 * 5, 7) * 9; + state[0] = state0 ^ state3; + state[1] = state1 ^ state2; + state[2] = state2 ^ (state1 << 17); + state[3] = rotl(state3, 45); + return res; +} + + +/* +** Convert bits from a random integer into a float in the +** interval [0,1), getting the higher FIG bits from the +** random unsigned integer and converting that to a float. +** Some old Microsoft compilers cannot cast an unsigned long +** to a floating-point number, so we use a signed long as an +** intermediary. When lua_Number is float or double, the shift ensures +** that 'sx' is non negative; in that case, a good compiler will remove +** the correction. +*/ + +/* must throw out the extra (64 - FIGS) bits */ +#define shift64_FIG (64 - FIGS) + +/* 2^(-FIGS) == 2^-1 / 2^(FIGS-1) */ +#define scaleFIG (l_mathop(0.5) / ((Rand64)1 << (FIGS - 1))) + +static lua_Number I2d (Rand64 x) { + SRand64 sx = (SRand64)(trim64(x) >> shift64_FIG); + lua_Number res = (lua_Number)(sx) * scaleFIG; + if (sx < 0) + res += l_mathop(1.0); /* correct the two's complement if negative */ + lua_assert(0 <= res && res < 1); + return res; +} + +/* convert a 'Rand64' to a 'lua_Unsigned' */ +#define I2UInt(x) ((lua_Unsigned)trim64(x)) + +/* convert a 'lua_Unsigned' to a 'Rand64' */ +#define Int2I(x) ((Rand64)(x)) + + +#else /* no 'Rand64' }{ */ + +/* get an integer with at least 32 bits */ +#if LUAI_IS32INT +typedef unsigned int lu_int32; +#else +typedef unsigned long lu_int32; +#endif + + +/* +** Use two 32-bit integers to represent a 64-bit quantity. +*/ +typedef struct Rand64 { + lu_int32 h; /* higher half */ + lu_int32 l; /* lower half */ +} Rand64; + + +/* +** If 'lu_int32' has more than 32 bits, the extra bits do not interfere +** with the 32 initial bits, except in a right shift and comparisons. +** Moreover, the final result has to discard the extra bits. +*/ + +/* avoid using extra bits when needed */ +#define trim32(x) ((x) & 0xffffffffu) + + +/* +** basic operations on 'Rand64' values +*/ + +/* build a new Rand64 value */ +static Rand64 packI (lu_int32 h, lu_int32 l) { + Rand64 result; + result.h = h; + result.l = l; + return result; +} + +/* return i << n */ +static Rand64 Ishl (Rand64 i, int n) { + lua_assert(n > 0 && n < 32); + return packI((i.h << n) | (trim32(i.l) >> (32 - n)), i.l << n); +} + +/* i1 ^= i2 */ +static void Ixor (Rand64 *i1, Rand64 i2) { + i1->h ^= i2.h; + i1->l ^= i2.l; +} + +/* return i1 + i2 */ +static Rand64 Iadd (Rand64 i1, Rand64 i2) { + Rand64 result = packI(i1.h + i2.h, i1.l + i2.l); + if (trim32(result.l) < trim32(i1.l)) /* carry? */ + result.h++; + return result; +} + +/* return i * 5 */ +static Rand64 times5 (Rand64 i) { + return Iadd(Ishl(i, 2), i); /* i * 5 == (i << 2) + i */ +} + +/* return i * 9 */ +static Rand64 times9 (Rand64 i) { + return Iadd(Ishl(i, 3), i); /* i * 9 == (i << 3) + i */ +} + +/* return 'i' rotated left 'n' bits */ +static Rand64 rotl (Rand64 i, int n) { + lua_assert(n > 0 && n < 32); + return packI((i.h << n) | (trim32(i.l) >> (32 - n)), + (trim32(i.h) >> (32 - n)) | (i.l << n)); +} + +/* for offsets larger than 32, rotate right by 64 - offset */ +static Rand64 rotl1 (Rand64 i, int n) { + lua_assert(n > 32 && n < 64); + n = 64 - n; + return packI((trim32(i.h) >> n) | (i.l << (32 - n)), + (i.h << (32 - n)) | (trim32(i.l) >> n)); +} + +/* +** implementation of 'xoshiro256**' algorithm on 'Rand64' values +*/ +static Rand64 nextrand (Rand64 *state) { + Rand64 res = times9(rotl(times5(state[1]), 7)); + Rand64 t = Ishl(state[1], 17); + Ixor(&state[2], state[0]); + Ixor(&state[3], state[1]); + Ixor(&state[1], state[2]); + Ixor(&state[0], state[3]); + Ixor(&state[2], t); + state[3] = rotl1(state[3], 45); + return res; +} + + +/* +** Converts a 'Rand64' into a float. +*/ + +/* an unsigned 1 with proper type */ +#define UONE ((lu_int32)1) + + +#if FIGS <= 32 + +/* 2^(-FIGS) */ +#define scaleFIG (l_mathop(0.5) / (UONE << (FIGS - 1))) + +/* +** get up to 32 bits from higher half, shifting right to +** throw out the extra bits. +*/ +static lua_Number I2d (Rand64 x) { + lua_Number h = (lua_Number)(trim32(x.h) >> (32 - FIGS)); + return h * scaleFIG; +} + +#else /* 32 < FIGS <= 64 */ + +/* 2^(-FIGS) = 1.0 / 2^30 / 2^3 / 2^(FIGS-33) */ +#define scaleFIG \ + (l_mathop(1.0) / (UONE << 30) / l_mathop(8.0) / (UONE << (FIGS - 33))) + +/* +** use FIGS - 32 bits from lower half, throwing out the other +** (32 - (FIGS - 32)) = (64 - FIGS) bits +*/ +#define shiftLOW (64 - FIGS) + +/* +** higher 32 bits go after those (FIGS - 32) bits: shiftHI = 2^(FIGS - 32) +*/ +#define shiftHI ((lua_Number)(UONE << (FIGS - 33)) * l_mathop(2.0)) + + +static lua_Number I2d (Rand64 x) { + lua_Number h = (lua_Number)trim32(x.h) * shiftHI; + lua_Number l = (lua_Number)(trim32(x.l) >> shiftLOW); + return (h + l) * scaleFIG; +} + +#endif + + +/* convert a 'Rand64' to a 'lua_Unsigned' */ +static lua_Unsigned I2UInt (Rand64 x) { + return (((lua_Unsigned)trim32(x.h) << 31) << 1) | (lua_Unsigned)trim32(x.l); +} + +/* convert a 'lua_Unsigned' to a 'Rand64' */ +static Rand64 Int2I (lua_Unsigned n) { + return packI((lu_int32)((n >> 31) >> 1), (lu_int32)n); +} + +#endif /* } */ + + +/* +** A state uses four 'Rand64' values. +*/ +typedef struct { + Rand64 s[4]; +} RanState; + + +/* +** Project the random integer 'ran' into the interval [0, n]. +** Because 'ran' has 2^B possible values, the projection can only be +** uniform when the size of the interval is a power of 2 (exact +** division). Otherwise, to get a uniform projection into [0, n], we +** first compute 'lim', the smallest Mersenne number not smaller than +** 'n'. We then project 'ran' into the interval [0, lim]. If the result +** is inside [0, n], we are done. Otherwise, we try with another 'ran', +** until we have a result inside the interval. +*/ +static lua_Unsigned project (lua_Unsigned ran, lua_Unsigned n, + RanState *state) { + if ((n & (n + 1)) == 0) /* is 'n + 1' a power of 2? */ + return ran & n; /* no bias */ + else { + lua_Unsigned lim = n; + /* compute the smallest (2^b - 1) not smaller than 'n' */ + lim |= (lim >> 1); + lim |= (lim >> 2); + lim |= (lim >> 4); + lim |= (lim >> 8); + lim |= (lim >> 16); +#if (LUA_MAXUNSIGNED >> 31) >= 3 + lim |= (lim >> 32); /* integer type has more than 32 bits */ +#endif + lua_assert((lim & (lim + 1)) == 0 /* 'lim + 1' is a power of 2, */ + && lim >= n /* not smaller than 'n', */ + && (lim >> 1) < n); /* and it is the smallest one */ + while ((ran &= lim) > n) /* project 'ran' into [0..lim] */ + ran = I2UInt(nextrand(state->s)); /* not inside [0..n]? try again */ + return ran; + } +} + + +static int math_random (lua_State *L) { + lua_Integer low, up; + lua_Unsigned p; + RanState *state = (RanState *)lua_touserdata(L, lua_upvalueindex(1)); + Rand64 rv = nextrand(state->s); /* next pseudo-random value */ + switch (lua_gettop(L)) { /* check number of arguments */ + case 0: { /* no arguments */ + lua_pushnumber(L, I2d(rv)); /* float between 0 and 1 */ + return 1; + } + case 1: { /* only upper limit */ + low = 1; + up = luaL_checkinteger(L, 1); + if (up == 0) { /* single 0 as argument? */ + lua_pushinteger(L, I2UInt(rv)); /* full random integer */ + return 1; + } + break; + } + case 2: { /* lower and upper limits */ + low = luaL_checkinteger(L, 1); + up = luaL_checkinteger(L, 2); + break; + } + default: return luaL_error(L, "wrong number of arguments"); + } + /* random integer in the interval [low, up] */ + luaL_argcheck(L, low <= up, 1, "interval is empty"); + /* project random integer into the interval [0, up - low] */ + p = project(I2UInt(rv), (lua_Unsigned)up - (lua_Unsigned)low, state); + lua_pushinteger(L, p + (lua_Unsigned)low); + return 1; +} + + +static void setseed (lua_State *L, Rand64 *state, + lua_Unsigned n1, lua_Unsigned n2) { + int i; + state[0] = Int2I(n1); + state[1] = Int2I(0xff); /* avoid a zero state */ + state[2] = Int2I(n2); + state[3] = Int2I(0); + for (i = 0; i < 16; i++) + nextrand(state); /* discard initial values to "spread" seed */ + lua_pushinteger(L, n1); + lua_pushinteger(L, n2); +} + + +/* +** Set a "random" seed. To get some randomness, use the current time +** and the address of 'L' (in case the machine does address space layout +** randomization). +*/ +static void randseed (lua_State *L, RanState *state) { + lua_Unsigned seed1 = (lua_Unsigned)time(NULL); + lua_Unsigned seed2 = (lua_Unsigned)(size_t)L; + setseed(L, state->s, seed1, seed2); +} + + +static int math_randomseed (lua_State *L) { + RanState *state = (RanState *)lua_touserdata(L, lua_upvalueindex(1)); + if (lua_isnone(L, 1)) { + randseed(L, state); + } + else { + lua_Integer n1 = luaL_checkinteger(L, 1); + lua_Integer n2 = luaL_optinteger(L, 2, 0); + setseed(L, state->s, n1, n2); + } + return 2; /* return seeds */ +} + + +static const luaL_Reg randfuncs[] = { + {"random", math_random}, + {"randomseed", math_randomseed}, + {NULL, NULL} +}; + + +/* +** Register the random functions and initialize their state. +*/ +static void setrandfunc (lua_State *L) { + RanState *state = (RanState *)lua_newuserdatauv(L, sizeof(RanState), 0); + randseed(L, state); /* initialize with a "random" seed */ + lua_pop(L, 2); /* remove pushed seeds */ + luaL_setfuncs(L, randfuncs, 1); +} + +/* }================================================================== */ + + +/* +** {================================================================== +** Deprecated functions (for compatibility only) +** =================================================================== +*/ +#if defined(LUA_COMPAT_MATHLIB) + +static int math_cosh (lua_State *L) { + lua_pushnumber(L, l_mathop(cosh)(luaL_checknumber(L, 1))); + return 1; +} + +static int math_sinh (lua_State *L) { + lua_pushnumber(L, l_mathop(sinh)(luaL_checknumber(L, 1))); + return 1; +} + +static int math_tanh (lua_State *L) { + lua_pushnumber(L, l_mathop(tanh)(luaL_checknumber(L, 1))); + return 1; +} + +static int math_pow (lua_State *L) { + lua_Number x = luaL_checknumber(L, 1); + lua_Number y = luaL_checknumber(L, 2); + lua_pushnumber(L, l_mathop(pow)(x, y)); + return 1; +} + +static int math_frexp (lua_State *L) { + int e; + lua_pushnumber(L, l_mathop(frexp)(luaL_checknumber(L, 1), &e)); + lua_pushinteger(L, e); + return 2; +} + +static int math_ldexp (lua_State *L) { + lua_Number x = luaL_checknumber(L, 1); + int ep = (int)luaL_checkinteger(L, 2); + lua_pushnumber(L, l_mathop(ldexp)(x, ep)); + return 1; +} + +static int math_log10 (lua_State *L) { + lua_pushnumber(L, l_mathop(log10)(luaL_checknumber(L, 1))); + return 1; +} + +#endif +/* }================================================================== */ + + + +static const luaL_Reg mathlib[] = { + {"abs", math_abs}, + {"acos", math_acos}, + {"asin", math_asin}, + {"atan", math_atan}, + {"ceil", math_ceil}, + {"cos", math_cos}, + {"deg", math_deg}, + {"exp", math_exp}, + {"tointeger", math_toint}, + {"floor", math_floor}, + {"fmod", math_fmod}, + {"ult", math_ult}, + {"log", math_log}, + {"max", math_max}, + {"min", math_min}, + {"modf", math_modf}, + {"rad", math_rad}, + {"sin", math_sin}, + {"sqrt", math_sqrt}, + {"tan", math_tan}, + {"type", math_type}, +#if defined(LUA_COMPAT_MATHLIB) + {"atan2", math_atan}, + {"cosh", math_cosh}, + {"sinh", math_sinh}, + {"tanh", math_tanh}, + {"pow", math_pow}, + {"frexp", math_frexp}, + {"ldexp", math_ldexp}, + {"log10", math_log10}, +#endif + /* placeholders */ + {"random", NULL}, + {"randomseed", NULL}, + {"pi", NULL}, + {"huge", NULL}, + {"maxinteger", NULL}, + {"mininteger", NULL}, + {NULL, NULL} +}; + + +/* +** Open math library +*/ +LUAMOD_API int luaopen_math (lua_State *L) { + luaL_newlib(L, mathlib); + lua_pushnumber(L, PI); + lua_setfield(L, -2, "pi"); + lua_pushnumber(L, (lua_Number)HUGE_VAL); + lua_setfield(L, -2, "huge"); + lua_pushinteger(L, LUA_MAXINTEGER); + lua_setfield(L, -2, "maxinteger"); + lua_pushinteger(L, LUA_MININTEGER); + lua_setfield(L, -2, "mininteger"); + setrandfunc(L); + return 1; +} + diff --git a/vendor/lua-5.4.8/src/lmem.c b/vendor/lua-5.4.8/src/lmem.c new file mode 100644 index 0000000..9800a86 --- /dev/null +++ b/vendor/lua-5.4.8/src/lmem.c @@ -0,0 +1,215 @@ +/* +** $Id: lmem.c $ +** Interface to Memory Manager +** See Copyright Notice in lua.h +*/ + +#define lmem_c +#define LUA_CORE + +#include "lprefix.h" + + +#include <stddef.h> + +#include "lua.h" + +#include "ldebug.h" +#include "ldo.h" +#include "lgc.h" +#include "lmem.h" +#include "lobject.h" +#include "lstate.h" + + + +/* +** About the realloc function: +** void *frealloc (void *ud, void *ptr, size_t osize, size_t nsize); +** ('osize' is the old size, 'nsize' is the new size) +** +** - frealloc(ud, p, x, 0) frees the block 'p' and returns NULL. +** Particularly, frealloc(ud, NULL, 0, 0) does nothing, +** which is equivalent to free(NULL) in ISO C. +** +** - frealloc(ud, NULL, x, s) creates a new block of size 's' +** (no matter 'x'). Returns NULL if it cannot create the new block. +** +** - otherwise, frealloc(ud, b, x, y) reallocates the block 'b' from +** size 'x' to size 'y'. Returns NULL if it cannot reallocate the +** block to the new size. +*/ + + +/* +** Macro to call the allocation function. +*/ +#define callfrealloc(g,block,os,ns) ((*g->frealloc)(g->ud, block, os, ns)) + + +/* +** When an allocation fails, it will try again after an emergency +** collection, except when it cannot run a collection. The GC should +** not be called while the state is not fully built, as the collector +** is not yet fully initialized. Also, it should not be called when +** 'gcstopem' is true, because then the interpreter is in the middle of +** a collection step. +*/ +#define cantryagain(g) (completestate(g) && !g->gcstopem) + + + + +#if defined(EMERGENCYGCTESTS) +/* +** First allocation will fail except when freeing a block (frees never +** fail) and when it cannot try again; this fail will trigger 'tryagain' +** and a full GC cycle at every allocation. +*/ +static void *firsttry (global_State *g, void *block, size_t os, size_t ns) { + if (ns > 0 && cantryagain(g)) + return NULL; /* fail */ + else /* normal allocation */ + return callfrealloc(g, block, os, ns); +} +#else +#define firsttry(g,block,os,ns) callfrealloc(g, block, os, ns) +#endif + + + + + +/* +** {================================================================== +** Functions to allocate/deallocate arrays for the Parser +** =================================================================== +*/ + +/* +** Minimum size for arrays during parsing, to avoid overhead of +** reallocating to size 1, then 2, and then 4. All these arrays +** will be reallocated to exact sizes or erased when parsing ends. +*/ +#define MINSIZEARRAY 4 + + +void *luaM_growaux_ (lua_State *L, void *block, int nelems, int *psize, + int size_elems, int limit, const char *what) { + void *newblock; + int size = *psize; + if (nelems + 1 <= size) /* does one extra element still fit? */ + return block; /* nothing to be done */ + if (size >= limit / 2) { /* cannot double it? */ + if (l_unlikely(size >= limit)) /* cannot grow even a little? */ + luaG_runerror(L, "too many %s (limit is %d)", what, limit); + size = limit; /* still have at least one free place */ + } + else { + size *= 2; + if (size < MINSIZEARRAY) + size = MINSIZEARRAY; /* minimum size */ + } + lua_assert(nelems + 1 <= size && size <= limit); + /* 'limit' ensures that multiplication will not overflow */ + newblock = luaM_saferealloc_(L, block, cast_sizet(*psize) * size_elems, + cast_sizet(size) * size_elems); + *psize = size; /* update only when everything else is OK */ + return newblock; +} + + +/* +** In prototypes, the size of the array is also its number of +** elements (to save memory). So, if it cannot shrink an array +** to its number of elements, the only option is to raise an +** error. +*/ +void *luaM_shrinkvector_ (lua_State *L, void *block, int *size, + int final_n, int size_elem) { + void *newblock; + size_t oldsize = cast_sizet((*size) * size_elem); + size_t newsize = cast_sizet(final_n * size_elem); + lua_assert(newsize <= oldsize); + newblock = luaM_saferealloc_(L, block, oldsize, newsize); + *size = final_n; + return newblock; +} + +/* }================================================================== */ + + +l_noret luaM_toobig (lua_State *L) { + luaG_runerror(L, "memory allocation error: block too big"); +} + + +/* +** Free memory +*/ +void luaM_free_ (lua_State *L, void *block, size_t osize) { + global_State *g = G(L); + lua_assert((osize == 0) == (block == NULL)); + callfrealloc(g, block, osize, 0); + g->GCdebt -= osize; +} + + +/* +** In case of allocation fail, this function will do an emergency +** collection to free some memory and then try the allocation again. +*/ +static void *tryagain (lua_State *L, void *block, + size_t osize, size_t nsize) { + global_State *g = G(L); + if (cantryagain(g)) { + luaC_fullgc(L, 1); /* try to free some memory... */ + return callfrealloc(g, block, osize, nsize); /* try again */ + } + else return NULL; /* cannot run an emergency collection */ +} + + +/* +** Generic allocation routine. +*/ +void *luaM_realloc_ (lua_State *L, void *block, size_t osize, size_t nsize) { + void *newblock; + global_State *g = G(L); + lua_assert((osize == 0) == (block == NULL)); + newblock = firsttry(g, block, osize, nsize); + if (l_unlikely(newblock == NULL && nsize > 0)) { + newblock = tryagain(L, block, osize, nsize); + if (newblock == NULL) /* still no memory? */ + return NULL; /* do not update 'GCdebt' */ + } + lua_assert((nsize == 0) == (newblock == NULL)); + g->GCdebt = (g->GCdebt + nsize) - osize; + return newblock; +} + + +void *luaM_saferealloc_ (lua_State *L, void *block, size_t osize, + size_t nsize) { + void *newblock = luaM_realloc_(L, block, osize, nsize); + if (l_unlikely(newblock == NULL && nsize > 0)) /* allocation failed? */ + luaM_error(L); + return newblock; +} + + +void *luaM_malloc_ (lua_State *L, size_t size, int tag) { + if (size == 0) + return NULL; /* that's all */ + else { + global_State *g = G(L); + void *newblock = firsttry(g, NULL, tag, size); + if (l_unlikely(newblock == NULL)) { + newblock = tryagain(L, NULL, tag, size); + if (newblock == NULL) + luaM_error(L); + } + g->GCdebt += size; + return newblock; + } +} diff --git a/vendor/lua-5.4.8/src/lmem.h b/vendor/lua-5.4.8/src/lmem.h new file mode 100644 index 0000000..8c75a44 --- /dev/null +++ b/vendor/lua-5.4.8/src/lmem.h @@ -0,0 +1,93 @@ +/* +** $Id: lmem.h $ +** Interface to Memory Manager +** See Copyright Notice in lua.h +*/ + +#ifndef lmem_h +#define lmem_h + + +#include <stddef.h> + +#include "llimits.h" +#include "lua.h" + + +#define luaM_error(L) luaD_throw(L, LUA_ERRMEM) + + +/* +** This macro tests whether it is safe to multiply 'n' by the size of +** type 't' without overflows. Because 'e' is always constant, it avoids +** the runtime division MAX_SIZET/(e). +** (The macro is somewhat complex to avoid warnings: The 'sizeof' +** comparison avoids a runtime comparison when overflow cannot occur. +** The compiler should be able to optimize the real test by itself, but +** when it does it, it may give a warning about "comparison is always +** false due to limited range of data type"; the +1 tricks the compiler, +** avoiding this warning but also this optimization.) +*/ +#define luaM_testsize(n,e) \ + (sizeof(n) >= sizeof(size_t) && cast_sizet((n)) + 1 > MAX_SIZET/(e)) + +#define luaM_checksize(L,n,e) \ + (luaM_testsize(n,e) ? luaM_toobig(L) : cast_void(0)) + + +/* +** Computes the minimum between 'n' and 'MAX_SIZET/sizeof(t)', so that +** the result is not larger than 'n' and cannot overflow a 'size_t' +** when multiplied by the size of type 't'. (Assumes that 'n' is an +** 'int' or 'unsigned int' and that 'int' is not larger than 'size_t'.) +*/ +#define luaM_limitN(n,t) \ + ((cast_sizet(n) <= MAX_SIZET/sizeof(t)) ? (n) : \ + cast_uint((MAX_SIZET/sizeof(t)))) + + +/* +** Arrays of chars do not need any test +*/ +#define luaM_reallocvchar(L,b,on,n) \ + cast_charp(luaM_saferealloc_(L, (b), (on)*sizeof(char), (n)*sizeof(char))) + +#define luaM_freemem(L, b, s) luaM_free_(L, (b), (s)) +#define luaM_free(L, b) luaM_free_(L, (b), sizeof(*(b))) +#define luaM_freearray(L, b, n) luaM_free_(L, (b), (n)*sizeof(*(b))) + +#define luaM_new(L,t) cast(t*, luaM_malloc_(L, sizeof(t), 0)) +#define luaM_newvector(L,n,t) cast(t*, luaM_malloc_(L, (n)*sizeof(t), 0)) +#define luaM_newvectorchecked(L,n,t) \ + (luaM_checksize(L,n,sizeof(t)), luaM_newvector(L,n,t)) + +#define luaM_newobject(L,tag,s) luaM_malloc_(L, (s), tag) + +#define luaM_growvector(L,v,nelems,size,t,limit,e) \ + ((v)=cast(t *, luaM_growaux_(L,v,nelems,&(size),sizeof(t), \ + luaM_limitN(limit,t),e))) + +#define luaM_reallocvector(L, v,oldn,n,t) \ + (cast(t *, luaM_realloc_(L, v, cast_sizet(oldn) * sizeof(t), \ + cast_sizet(n) * sizeof(t)))) + +#define luaM_shrinkvector(L,v,size,fs,t) \ + ((v)=cast(t *, luaM_shrinkvector_(L, v, &(size), fs, sizeof(t)))) + +LUAI_FUNC l_noret luaM_toobig (lua_State *L); + +/* not to be called directly */ +LUAI_FUNC void *luaM_realloc_ (lua_State *L, void *block, size_t oldsize, + size_t size); +LUAI_FUNC void *luaM_saferealloc_ (lua_State *L, void *block, size_t oldsize, + size_t size); +LUAI_FUNC void luaM_free_ (lua_State *L, void *block, size_t osize); +LUAI_FUNC void *luaM_growaux_ (lua_State *L, void *block, int nelems, + int *size, int size_elem, int limit, + const char *what); +LUAI_FUNC void *luaM_shrinkvector_ (lua_State *L, void *block, int *nelem, + int final_n, int size_elem); +LUAI_FUNC void *luaM_malloc_ (lua_State *L, size_t size, int tag); + +#endif + diff --git a/vendor/lua-5.4.8/src/loadlib.c b/vendor/lua-5.4.8/src/loadlib.c new file mode 100644 index 0000000..6d289fc --- /dev/null +++ b/vendor/lua-5.4.8/src/loadlib.c @@ -0,0 +1,758 @@ +/* +** $Id: loadlib.c $ +** Dynamic library loader for Lua +** See Copyright Notice in lua.h +** +** This module contains an implementation of loadlib for Unix systems +** that have dlfcn, an implementation for Windows, and a stub for other +** systems. +*/ + +#define loadlib_c +#define LUA_LIB + +#include "lprefix.h" + + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +#include "lua.h" + +#include "lauxlib.h" +#include "lualib.h" + + +/* +** LUA_CSUBSEP is the character that replaces dots in submodule names +** when searching for a C loader. +** LUA_LSUBSEP is the character that replaces dots in submodule names +** when searching for a Lua loader. +*/ +#if !defined(LUA_CSUBSEP) +#define LUA_CSUBSEP LUA_DIRSEP +#endif + +#if !defined(LUA_LSUBSEP) +#define LUA_LSUBSEP LUA_DIRSEP +#endif + + +/* prefix for open functions in C libraries */ +#define LUA_POF "luaopen_" + +/* separator for open functions in C libraries */ +#define LUA_OFSEP "_" + + +/* +** key for table in the registry that keeps handles +** for all loaded C libraries +*/ +static const char *const CLIBS = "_CLIBS"; + +#define LIB_FAIL "open" + + +#define setprogdir(L) ((void)0) + + +/* +** Special type equivalent to '(void*)' for functions in gcc +** (to suppress warnings when converting function pointers) +*/ +typedef void (*voidf)(void); + + +/* +** system-dependent functions +*/ + +/* +** unload library 'lib' +*/ +static void lsys_unloadlib (void *lib); + +/* +** load C library in file 'path'. If 'seeglb', load with all names in +** the library global. +** Returns the library; in case of error, returns NULL plus an +** error string in the stack. +*/ +static void *lsys_load (lua_State *L, const char *path, int seeglb); + +/* +** Try to find a function named 'sym' in library 'lib'. +** Returns the function; in case of error, returns NULL plus an +** error string in the stack. +*/ +static lua_CFunction lsys_sym (lua_State *L, void *lib, const char *sym); + + + + +#if defined(LUA_USE_DLOPEN) /* { */ +/* +** {======================================================================== +** This is an implementation of loadlib based on the dlfcn interface. +** The dlfcn interface is available in Linux, SunOS, Solaris, IRIX, FreeBSD, +** NetBSD, AIX 4.2, HPUX 11, and probably most other Unix flavors, at least +** as an emulation layer on top of native functions. +** ========================================================================= +*/ + +#include <dlfcn.h> + +/* +** Macro to convert pointer-to-void* to pointer-to-function. This cast +** is undefined according to ISO C, but POSIX assumes that it works. +** (The '__extension__' in gnu compilers is only to avoid warnings.) +*/ +#if defined(__GNUC__) +#define cast_func(p) (__extension__ (lua_CFunction)(p)) +#else +#define cast_func(p) ((lua_CFunction)(p)) +#endif + + +static void lsys_unloadlib (void *lib) { + dlclose(lib); +} + + +static void *lsys_load (lua_State *L, const char *path, int seeglb) { + void *lib = dlopen(path, RTLD_NOW | (seeglb ? RTLD_GLOBAL : RTLD_LOCAL)); + if (l_unlikely(lib == NULL)) + lua_pushstring(L, dlerror()); + return lib; +} + + +static lua_CFunction lsys_sym (lua_State *L, void *lib, const char *sym) { + lua_CFunction f = cast_func(dlsym(lib, sym)); + if (l_unlikely(f == NULL)) + lua_pushstring(L, dlerror()); + return f; +} + +/* }====================================================== */ + + + +#elif defined(LUA_DL_DLL) /* }{ */ +/* +** {====================================================================== +** This is an implementation of loadlib for Windows using native functions. +** ======================================================================= +*/ + +#include <windows.h> + + +/* +** optional flags for LoadLibraryEx +*/ +#if !defined(LUA_LLE_FLAGS) +#define LUA_LLE_FLAGS 0 +#endif + + +#undef setprogdir + + +/* +** Replace in the path (on the top of the stack) any occurrence +** of LUA_EXEC_DIR with the executable's path. +*/ +static void setprogdir (lua_State *L) { + char buff[MAX_PATH + 1]; + char *lb; + DWORD nsize = sizeof(buff)/sizeof(char); + DWORD n = GetModuleFileNameA(NULL, buff, nsize); /* get exec. name */ + if (n == 0 || n == nsize || (lb = strrchr(buff, '\\')) == NULL) + luaL_error(L, "unable to get ModuleFileName"); + else { + *lb = '\0'; /* cut name on the last '\\' to get the path */ + luaL_gsub(L, lua_tostring(L, -1), LUA_EXEC_DIR, buff); + lua_remove(L, -2); /* remove original string */ + } +} + + + + +static void pusherror (lua_State *L) { + int error = GetLastError(); + char buffer[128]; + if (FormatMessageA(FORMAT_MESSAGE_IGNORE_INSERTS | FORMAT_MESSAGE_FROM_SYSTEM, + NULL, error, 0, buffer, sizeof(buffer)/sizeof(char), NULL)) + lua_pushstring(L, buffer); + else + lua_pushfstring(L, "system error %d\n", error); +} + +static void lsys_unloadlib (void *lib) { + FreeLibrary((HMODULE)lib); +} + + +static void *lsys_load (lua_State *L, const char *path, int seeglb) { + HMODULE lib = LoadLibraryExA(path, NULL, LUA_LLE_FLAGS); + (void)(seeglb); /* not used: symbols are 'global' by default */ + if (lib == NULL) pusherror(L); + return lib; +} + + +static lua_CFunction lsys_sym (lua_State *L, void *lib, const char *sym) { + lua_CFunction f = (lua_CFunction)(voidf)GetProcAddress((HMODULE)lib, sym); + if (f == NULL) pusherror(L); + return f; +} + +/* }====================================================== */ + + +#else /* }{ */ +/* +** {====================================================== +** Fallback for other systems +** ======================================================= +*/ + +#undef LIB_FAIL +#define LIB_FAIL "absent" + + +#define DLMSG "dynamic libraries not enabled; check your Lua installation" + + +static void lsys_unloadlib (void *lib) { + (void)(lib); /* not used */ +} + + +static void *lsys_load (lua_State *L, const char *path, int seeglb) { + (void)(path); (void)(seeglb); /* not used */ + lua_pushliteral(L, DLMSG); + return NULL; +} + + +static lua_CFunction lsys_sym (lua_State *L, void *lib, const char *sym) { + (void)(lib); (void)(sym); /* not used */ + lua_pushliteral(L, DLMSG); + return NULL; +} + +/* }====================================================== */ +#endif /* } */ + + +/* +** {================================================================== +** Set Paths +** =================================================================== +*/ + +/* +** LUA_PATH_VAR and LUA_CPATH_VAR are the names of the environment +** variables that Lua check to set its paths. +*/ +#if !defined(LUA_PATH_VAR) +#define LUA_PATH_VAR "LUA_PATH" +#endif + +#if !defined(LUA_CPATH_VAR) +#define LUA_CPATH_VAR "LUA_CPATH" +#endif + + + +/* +** return registry.LUA_NOENV as a boolean +*/ +static int noenv (lua_State *L) { + int b; + lua_getfield(L, LUA_REGISTRYINDEX, "LUA_NOENV"); + b = lua_toboolean(L, -1); + lua_pop(L, 1); /* remove value */ + return b; +} + + +/* +** Set a path +*/ +static void setpath (lua_State *L, const char *fieldname, + const char *envname, + const char *dft) { + const char *dftmark; + const char *nver = lua_pushfstring(L, "%s%s", envname, LUA_VERSUFFIX); + const char *path = getenv(nver); /* try versioned name */ + if (path == NULL) /* no versioned environment variable? */ + path = getenv(envname); /* try unversioned name */ + if (path == NULL || noenv(L)) /* no environment variable? */ + lua_pushstring(L, dft); /* use default */ + else if ((dftmark = strstr(path, LUA_PATH_SEP LUA_PATH_SEP)) == NULL) + lua_pushstring(L, path); /* nothing to change */ + else { /* path contains a ";;": insert default path in its place */ + size_t len = strlen(path); + luaL_Buffer b; + luaL_buffinit(L, &b); + if (path < dftmark) { /* is there a prefix before ';;'? */ + luaL_addlstring(&b, path, dftmark - path); /* add it */ + luaL_addchar(&b, *LUA_PATH_SEP); + } + luaL_addstring(&b, dft); /* add default */ + if (dftmark < path + len - 2) { /* is there a suffix after ';;'? */ + luaL_addchar(&b, *LUA_PATH_SEP); + luaL_addlstring(&b, dftmark + 2, (path + len - 2) - dftmark); + } + luaL_pushresult(&b); + } + setprogdir(L); + lua_setfield(L, -3, fieldname); /* package[fieldname] = path value */ + lua_pop(L, 1); /* pop versioned variable name ('nver') */ +} + +/* }================================================================== */ + + +/* +** return registry.CLIBS[path] +*/ +static void *checkclib (lua_State *L, const char *path) { + void *plib; + lua_getfield(L, LUA_REGISTRYINDEX, CLIBS); + lua_getfield(L, -1, path); + plib = lua_touserdata(L, -1); /* plib = CLIBS[path] */ + lua_pop(L, 2); /* pop CLIBS table and 'plib' */ + return plib; +} + + +/* +** registry.CLIBS[path] = plib -- for queries +** registry.CLIBS[#CLIBS + 1] = plib -- also keep a list of all libraries +*/ +static void addtoclib (lua_State *L, const char *path, void *plib) { + lua_getfield(L, LUA_REGISTRYINDEX, CLIBS); + lua_pushlightuserdata(L, plib); + lua_pushvalue(L, -1); + lua_setfield(L, -3, path); /* CLIBS[path] = plib */ + lua_rawseti(L, -2, luaL_len(L, -2) + 1); /* CLIBS[#CLIBS + 1] = plib */ + lua_pop(L, 1); /* pop CLIBS table */ +} + + +/* +** __gc tag method for CLIBS table: calls 'lsys_unloadlib' for all lib +** handles in list CLIBS +*/ +static int gctm (lua_State *L) { + lua_Integer n = luaL_len(L, 1); + for (; n >= 1; n--) { /* for each handle, in reverse order */ + lua_rawgeti(L, 1, n); /* get handle CLIBS[n] */ + lsys_unloadlib(lua_touserdata(L, -1)); + lua_pop(L, 1); /* pop handle */ + } + return 0; +} + + + +/* error codes for 'lookforfunc' */ +#define ERRLIB 1 +#define ERRFUNC 2 + +/* +** 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, return an error code and an error message in the stack. +*/ +static int lookforfunc (lua_State *L, const char *path, const char *sym) { + void *reg = checkclib(L, path); /* check loaded C libraries */ + if (reg == NULL) { /* must load library? */ + reg = lsys_load(L, path, *sym == '*'); /* global symbols if 'sym'=='*' */ + if (reg == NULL) return ERRLIB; /* unable to load library */ + addtoclib(L, path, reg); + } + if (*sym == '*') { /* loading only library (no function)? */ + lua_pushboolean(L, 1); /* return 'true' */ + return 0; /* no errors */ + } + else { + lua_CFunction f = lsys_sym(L, reg, sym); + if (f == NULL) + return ERRFUNC; /* unable to find function */ + lua_pushcfunction(L, f); /* else create new function */ + return 0; /* no errors */ + } +} + + +static int ll_loadlib (lua_State *L) { + const char *path = luaL_checkstring(L, 1); + const char *init = luaL_checkstring(L, 2); + int stat = lookforfunc(L, path, init); + if (l_likely(stat == 0)) /* no errors? */ + return 1; /* return the loaded function */ + else { /* error; error message is on stack top */ + luaL_pushfail(L); + lua_insert(L, -2); + lua_pushstring(L, (stat == ERRLIB) ? LIB_FAIL : "init"); + return 3; /* return fail, error message, and where */ + } +} + + + +/* +** {====================================================== +** 'require' function +** ======================================================= +*/ + + +static int readable (const char *filename) { + FILE *f = fopen(filename, "r"); /* try to open file */ + if (f == NULL) return 0; /* open failed */ + fclose(f); + return 1; +} + + +/* +** Get the next name in '*path' = 'name1;name2;name3;...', changing +** the ending ';' to '\0' to create a zero-terminated string. Return +** NULL when list ends. +*/ +static const char *getnextfilename (char **path, char *end) { + char *sep; + char *name = *path; + if (name == end) + return NULL; /* no more names */ + else if (*name == '\0') { /* from previous iteration? */ + *name = *LUA_PATH_SEP; /* restore separator */ + name++; /* skip it */ + } + sep = strchr(name, *LUA_PATH_SEP); /* find next separator */ + if (sep == NULL) /* separator not found? */ + sep = end; /* name goes until the end */ + *sep = '\0'; /* finish file name */ + *path = sep; /* will start next search from here */ + return name; +} + + +/* +** Given a path such as ";blabla.so;blublu.so", pushes the string +** +** no file 'blabla.so' +** no file 'blublu.so' +*/ +static void pusherrornotfound (lua_State *L, const char *path) { + luaL_Buffer b; + luaL_buffinit(L, &b); + luaL_addstring(&b, "no file '"); + luaL_addgsub(&b, path, LUA_PATH_SEP, "'\n\tno file '"); + luaL_addstring(&b, "'"); + luaL_pushresult(&b); +} + + +static const char *searchpath (lua_State *L, const char *name, + const char *path, + const char *sep, + const char *dirsep) { + luaL_Buffer buff; + char *pathname; /* path with name inserted */ + char *endpathname; /* its end */ + const char *filename; + /* separator is non-empty and appears in 'name'? */ + if (*sep != '\0' && strchr(name, *sep) != NULL) + name = luaL_gsub(L, name, sep, dirsep); /* replace it by 'dirsep' */ + luaL_buffinit(L, &buff); + /* add path to the buffer, replacing marks ('?') with the file name */ + luaL_addgsub(&buff, path, LUA_PATH_MARK, name); + luaL_addchar(&buff, '\0'); + pathname = luaL_buffaddr(&buff); /* writable list of file names */ + endpathname = pathname + luaL_bufflen(&buff) - 1; + while ((filename = getnextfilename(&pathname, endpathname)) != NULL) { + if (readable(filename)) /* does file exist and is readable? */ + return lua_pushstring(L, filename); /* save and return name */ + } + luaL_pushresult(&buff); /* push path to create error message */ + pusherrornotfound(L, lua_tostring(L, -1)); /* create error message */ + return NULL; /* not found */ +} + + +static int ll_searchpath (lua_State *L) { + const char *f = searchpath(L, luaL_checkstring(L, 1), + luaL_checkstring(L, 2), + luaL_optstring(L, 3, "."), + luaL_optstring(L, 4, LUA_DIRSEP)); + if (f != NULL) return 1; + else { /* error message is on top of the stack */ + luaL_pushfail(L); + lua_insert(L, -2); + return 2; /* return fail + error message */ + } +} + + +static const char *findfile (lua_State *L, const char *name, + const char *pname, + const char *dirsep) { + const char *path; + lua_getfield(L, lua_upvalueindex(1), pname); + path = lua_tostring(L, -1); + if (l_unlikely(path == NULL)) + luaL_error(L, "'package.%s' must be a string", pname); + return searchpath(L, name, path, ".", dirsep); +} + + +static int checkload (lua_State *L, int stat, const char *filename) { + if (l_likely(stat)) { /* module loaded successfully? */ + lua_pushstring(L, filename); /* will be 2nd argument to module */ + return 2; /* return open function and file name */ + } + else + return luaL_error(L, "error loading module '%s' from file '%s':\n\t%s", + lua_tostring(L, 1), filename, lua_tostring(L, -1)); +} + + +static int searcher_Lua (lua_State *L) { + const char *filename; + const char *name = luaL_checkstring(L, 1); + filename = findfile(L, name, "path", LUA_LSUBSEP); + if (filename == NULL) return 1; /* module not found in this path */ + return checkload(L, (luaL_loadfile(L, filename) == LUA_OK), filename); +} + + +/* +** Try to find a load function for module 'modname' at file 'filename'. +** First, change '.' to '_' in 'modname'; then, if 'modname' has +** the form X-Y (that is, it has an "ignore mark"), build a function +** name "luaopen_X" and look for it. (For compatibility, if that +** fails, it also tries "luaopen_Y".) If there is no ignore mark, +** look for a function named "luaopen_modname". +*/ +static int loadfunc (lua_State *L, const char *filename, const char *modname) { + const char *openfunc; + const char *mark; + modname = luaL_gsub(L, modname, ".", LUA_OFSEP); + mark = strchr(modname, *LUA_IGMARK); + if (mark) { + int stat; + openfunc = lua_pushlstring(L, modname, mark - modname); + openfunc = lua_pushfstring(L, LUA_POF"%s", openfunc); + stat = lookforfunc(L, filename, openfunc); + if (stat != ERRFUNC) return stat; + modname = mark + 1; /* else go ahead and try old-style name */ + } + openfunc = lua_pushfstring(L, LUA_POF"%s", modname); + return lookforfunc(L, filename, openfunc); +} + + +static int searcher_C (lua_State *L) { + const char *name = luaL_checkstring(L, 1); + const char *filename = findfile(L, name, "cpath", LUA_CSUBSEP); + if (filename == NULL) return 1; /* module not found in this path */ + return checkload(L, (loadfunc(L, filename, name) == 0), filename); +} + + +static int searcher_Croot (lua_State *L) { + const char *filename; + const char *name = luaL_checkstring(L, 1); + const char *p = strchr(name, '.'); + int stat; + if (p == NULL) return 0; /* is root */ + lua_pushlstring(L, name, p - name); + filename = findfile(L, lua_tostring(L, -1), "cpath", LUA_CSUBSEP); + if (filename == NULL) return 1; /* root not found */ + if ((stat = loadfunc(L, filename, name)) != 0) { + if (stat != ERRFUNC) + return checkload(L, 0, filename); /* real error */ + else { /* open function not found */ + lua_pushfstring(L, "no module '%s' in file '%s'", name, filename); + return 1; + } + } + lua_pushstring(L, filename); /* will be 2nd argument to module */ + return 2; +} + + +static int searcher_preload (lua_State *L) { + const char *name = luaL_checkstring(L, 1); + lua_getfield(L, LUA_REGISTRYINDEX, LUA_PRELOAD_TABLE); + if (lua_getfield(L, -1, name) == LUA_TNIL) { /* not found? */ + lua_pushfstring(L, "no field package.preload['%s']", name); + return 1; + } + else { + lua_pushliteral(L, ":preload:"); + return 2; + } +} + + +static void findloader (lua_State *L, const char *name) { + int i; + luaL_Buffer msg; /* to build error message */ + /* push 'package.searchers' to index 3 in the stack */ + if (l_unlikely(lua_getfield(L, lua_upvalueindex(1), "searchers") + != LUA_TTABLE)) + luaL_error(L, "'package.searchers' must be a table"); + luaL_buffinit(L, &msg); + /* iterate over available searchers to find a loader */ + for (i = 1; ; i++) { + luaL_addstring(&msg, "\n\t"); /* error-message prefix */ + if (l_unlikely(lua_rawgeti(L, 3, i) == LUA_TNIL)) { /* no more searchers? */ + lua_pop(L, 1); /* remove nil */ + luaL_buffsub(&msg, 2); /* remove prefix */ + luaL_pushresult(&msg); /* create error message */ + luaL_error(L, "module '%s' not found:%s", name, lua_tostring(L, -1)); + } + lua_pushstring(L, name); + lua_call(L, 1, 2); /* call it */ + if (lua_isfunction(L, -2)) /* did it find a loader? */ + return; /* module loader found */ + else if (lua_isstring(L, -2)) { /* searcher returned error message? */ + lua_pop(L, 1); /* remove extra return */ + luaL_addvalue(&msg); /* concatenate error message */ + } + else { /* no error message */ + lua_pop(L, 2); /* remove both returns */ + luaL_buffsub(&msg, 2); /* remove prefix */ + } + } +} + + +static int ll_require (lua_State *L) { + const char *name = luaL_checkstring(L, 1); + lua_settop(L, 1); /* LOADED table will be at index 2 */ + lua_getfield(L, LUA_REGISTRYINDEX, LUA_LOADED_TABLE); + lua_getfield(L, 2, name); /* LOADED[name] */ + if (lua_toboolean(L, -1)) /* is it there? */ + return 1; /* package is already loaded */ + /* else must load package */ + lua_pop(L, 1); /* remove 'getfield' result */ + findloader(L, name); + lua_rotate(L, -2, 1); /* function <-> loader data */ + lua_pushvalue(L, 1); /* name is 1st argument to module loader */ + lua_pushvalue(L, -3); /* loader data is 2nd argument */ + /* stack: ...; loader data; loader function; mod. name; loader data */ + lua_call(L, 2, 1); /* run loader to load module */ + /* stack: ...; loader data; result from loader */ + if (!lua_isnil(L, -1)) /* non-nil return? */ + lua_setfield(L, 2, name); /* LOADED[name] = returned value */ + else + lua_pop(L, 1); /* pop nil */ + if (lua_getfield(L, 2, name) == LUA_TNIL) { /* module set no value? */ + lua_pushboolean(L, 1); /* use true as result */ + lua_copy(L, -1, -2); /* replace loader result */ + lua_setfield(L, 2, name); /* LOADED[name] = true */ + } + lua_rotate(L, -2, 1); /* loader data <-> module result */ + return 2; /* return module result and loader data */ +} + +/* }====================================================== */ + + + + +static const luaL_Reg pk_funcs[] = { + {"loadlib", ll_loadlib}, + {"searchpath", ll_searchpath}, + /* placeholders */ + {"preload", NULL}, + {"cpath", NULL}, + {"path", NULL}, + {"searchers", NULL}, + {"loaded", NULL}, + {NULL, NULL} +}; + + +static const luaL_Reg ll_funcs[] = { + {"require", ll_require}, + {NULL, NULL} +}; + + +static void createsearcherstable (lua_State *L) { + static const lua_CFunction searchers[] = { + searcher_preload, + searcher_Lua, + searcher_C, + searcher_Croot, + NULL + }; + int i; + /* create 'searchers' table */ + lua_createtable(L, sizeof(searchers)/sizeof(searchers[0]) - 1, 0); + /* fill it with predefined searchers */ + for (i=0; searchers[i] != NULL; i++) { + lua_pushvalue(L, -2); /* set 'package' as upvalue for all searchers */ + lua_pushcclosure(L, searchers[i], 1); + lua_rawseti(L, -2, i+1); + } + lua_setfield(L, -2, "searchers"); /* put it in field 'searchers' */ +} + + +/* +** create table CLIBS to keep track of loaded C libraries, +** setting a finalizer to close all libraries when closing state. +*/ +static void createclibstable (lua_State *L) { + luaL_getsubtable(L, LUA_REGISTRYINDEX, CLIBS); /* create CLIBS table */ + lua_createtable(L, 0, 1); /* create metatable for CLIBS */ + lua_pushcfunction(L, gctm); + lua_setfield(L, -2, "__gc"); /* set finalizer for CLIBS table */ + lua_setmetatable(L, -2); +} + + +LUAMOD_API int luaopen_package (lua_State *L) { + createclibstable(L); + luaL_newlib(L, pk_funcs); /* create 'package' table */ + createsearcherstable(L); + /* set paths */ + setpath(L, "path", LUA_PATH_VAR, LUA_PATH_DEFAULT); + setpath(L, "cpath", LUA_CPATH_VAR, LUA_CPATH_DEFAULT); + /* store config information */ + lua_pushliteral(L, LUA_DIRSEP "\n" LUA_PATH_SEP "\n" LUA_PATH_MARK "\n" + LUA_EXEC_DIR "\n" LUA_IGMARK "\n"); + lua_setfield(L, -2, "config"); + /* set field 'loaded' */ + luaL_getsubtable(L, LUA_REGISTRYINDEX, LUA_LOADED_TABLE); + lua_setfield(L, -2, "loaded"); + /* set field 'preload' */ + luaL_getsubtable(L, LUA_REGISTRYINDEX, LUA_PRELOAD_TABLE); + lua_setfield(L, -2, "preload"); + lua_pushglobaltable(L); + lua_pushvalue(L, -2); /* set 'package' as upvalue for next lib */ + luaL_setfuncs(L, ll_funcs, 1); /* open lib into global table */ + lua_pop(L, 1); /* pop global table */ + return 1; /* return 'package' table */ +} + diff --git a/vendor/lua-5.4.8/src/lobject.c b/vendor/lua-5.4.8/src/lobject.c new file mode 100644 index 0000000..9cfa522 --- /dev/null +++ b/vendor/lua-5.4.8/src/lobject.c @@ -0,0 +1,602 @@ +/* +** $Id: lobject.c $ +** Some generic functions over Lua objects +** See Copyright Notice in lua.h +*/ + +#define lobject_c +#define LUA_CORE + +#include "lprefix.h" + + +#include <locale.h> +#include <math.h> +#include <stdarg.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +#include "lua.h" + +#include "lctype.h" +#include "ldebug.h" +#include "ldo.h" +#include "lmem.h" +#include "lobject.h" +#include "lstate.h" +#include "lstring.h" +#include "lvm.h" + + +/* +** Computes ceil(log2(x)) +*/ +int luaO_ceillog2 (unsigned int x) { + static const lu_byte log_2[256] = { /* log_2[i] = ceil(log2(i - 1)) */ + 0,1,2,2,3,3,3,3,4,4,4,4,4,4,4,4,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, + 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, + 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, + 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, + 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, + 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, + 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, + 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8 + }; + int l = 0; + x--; + while (x >= 256) { l += 8; x >>= 8; } + return l + log_2[x]; +} + + +static lua_Integer intarith (lua_State *L, int op, lua_Integer v1, + lua_Integer v2) { + switch (op) { + case LUA_OPADD: return intop(+, v1, v2); + case LUA_OPSUB:return intop(-, v1, v2); + case LUA_OPMUL:return intop(*, v1, v2); + case LUA_OPMOD: return luaV_mod(L, v1, v2); + case LUA_OPIDIV: return luaV_idiv(L, v1, v2); + case LUA_OPBAND: return intop(&, v1, v2); + case LUA_OPBOR: return intop(|, v1, v2); + case LUA_OPBXOR: return intop(^, v1, v2); + case LUA_OPSHL: return luaV_shiftl(v1, v2); + case LUA_OPSHR: return luaV_shiftr(v1, v2); + case LUA_OPUNM: return intop(-, 0, v1); + case LUA_OPBNOT: return intop(^, ~l_castS2U(0), v1); + default: lua_assert(0); return 0; + } +} + + +static lua_Number numarith (lua_State *L, int op, lua_Number v1, + lua_Number v2) { + switch (op) { + case LUA_OPADD: return luai_numadd(L, v1, v2); + case LUA_OPSUB: return luai_numsub(L, v1, v2); + case LUA_OPMUL: return luai_nummul(L, v1, v2); + case LUA_OPDIV: return luai_numdiv(L, v1, v2); + case LUA_OPPOW: return luai_numpow(L, v1, v2); + case LUA_OPIDIV: return luai_numidiv(L, v1, v2); + case LUA_OPUNM: return luai_numunm(L, v1); + case LUA_OPMOD: return luaV_modf(L, v1, v2); + default: lua_assert(0); return 0; + } +} + + +int luaO_rawarith (lua_State *L, int op, const TValue *p1, const TValue *p2, + TValue *res) { + switch (op) { + case LUA_OPBAND: case LUA_OPBOR: case LUA_OPBXOR: + case LUA_OPSHL: case LUA_OPSHR: + case LUA_OPBNOT: { /* operate only on integers */ + lua_Integer i1; lua_Integer i2; + if (tointegerns(p1, &i1) && tointegerns(p2, &i2)) { + setivalue(res, intarith(L, op, i1, i2)); + return 1; + } + else return 0; /* fail */ + } + case LUA_OPDIV: case LUA_OPPOW: { /* operate only on floats */ + lua_Number n1; lua_Number n2; + if (tonumberns(p1, n1) && tonumberns(p2, n2)) { + setfltvalue(res, numarith(L, op, n1, n2)); + return 1; + } + else return 0; /* fail */ + } + default: { /* other operations */ + lua_Number n1; lua_Number n2; + if (ttisinteger(p1) && ttisinteger(p2)) { + setivalue(res, intarith(L, op, ivalue(p1), ivalue(p2))); + return 1; + } + else if (tonumberns(p1, n1) && tonumberns(p2, n2)) { + setfltvalue(res, numarith(L, op, n1, n2)); + return 1; + } + else return 0; /* fail */ + } + } +} + + +void luaO_arith (lua_State *L, int op, const TValue *p1, const TValue *p2, + StkId res) { + if (!luaO_rawarith(L, op, p1, p2, s2v(res))) { + /* could not perform raw operation; try metamethod */ + luaT_trybinTM(L, p1, p2, res, cast(TMS, (op - LUA_OPADD) + TM_ADD)); + } +} + + +int luaO_hexavalue (int c) { + if (lisdigit(c)) return c - '0'; + else return (ltolower(c) - 'a') + 10; +} + + +static int isneg (const char **s) { + if (**s == '-') { (*s)++; return 1; } + else if (**s == '+') (*s)++; + return 0; +} + + + +/* +** {================================================================== +** Lua's implementation for 'lua_strx2number' +** =================================================================== +*/ + +#if !defined(lua_strx2number) + +/* maximum number of significant digits to read (to avoid overflows + even with single floats) */ +#define MAXSIGDIG 30 + +/* +** convert a hexadecimal numeric string to a number, following +** C99 specification for 'strtod' +*/ +static lua_Number lua_strx2number (const char *s, char **endptr) { + int dot = lua_getlocaledecpoint(); + lua_Number r = l_mathop(0.0); /* result (accumulator) */ + int sigdig = 0; /* number of significant digits */ + int nosigdig = 0; /* number of non-significant digits */ + int e = 0; /* exponent correction */ + int neg; /* 1 if number is negative */ + int hasdot = 0; /* true after seen a dot */ + *endptr = cast_charp(s); /* nothing is valid yet */ + while (lisspace(cast_uchar(*s))) s++; /* skip initial spaces */ + neg = isneg(&s); /* check sign */ + if (!(*s == '0' && (*(s + 1) == 'x' || *(s + 1) == 'X'))) /* check '0x' */ + return l_mathop(0.0); /* invalid format (no '0x') */ + for (s += 2; ; s++) { /* skip '0x' and read numeral */ + if (*s == dot) { + if (hasdot) break; /* second dot? stop loop */ + else hasdot = 1; + } + else if (lisxdigit(cast_uchar(*s))) { + if (sigdig == 0 && *s == '0') /* non-significant digit (zero)? */ + nosigdig++; + else if (++sigdig <= MAXSIGDIG) /* can read it without overflow? */ + r = (r * l_mathop(16.0)) + luaO_hexavalue(*s); + else e++; /* too many digits; ignore, but still count for exponent */ + if (hasdot) e--; /* decimal digit? correct exponent */ + } + else break; /* neither a dot nor a digit */ + } + if (nosigdig + sigdig == 0) /* no digits? */ + return l_mathop(0.0); /* invalid format */ + *endptr = cast_charp(s); /* valid up to here */ + e *= 4; /* each digit multiplies/divides value by 2^4 */ + if (*s == 'p' || *s == 'P') { /* exponent part? */ + int exp1 = 0; /* exponent value */ + int neg1; /* exponent sign */ + s++; /* skip 'p' */ + neg1 = isneg(&s); /* sign */ + if (!lisdigit(cast_uchar(*s))) + return l_mathop(0.0); /* invalid; must have at least one digit */ + while (lisdigit(cast_uchar(*s))) /* read exponent */ + exp1 = exp1 * 10 + *(s++) - '0'; + if (neg1) exp1 = -exp1; + e += exp1; + *endptr = cast_charp(s); /* valid up to here */ + } + if (neg) r = -r; + return l_mathop(ldexp)(r, e); +} + +#endif +/* }====================================================== */ + + +/* maximum length of a numeral to be converted to a number */ +#if !defined (L_MAXLENNUM) +#define L_MAXLENNUM 200 +#endif + +/* +** Convert string 's' to a Lua number (put in 'result'). Return NULL on +** fail or the address of the ending '\0' on success. ('mode' == 'x') +** means a hexadecimal numeral. +*/ +static const char *l_str2dloc (const char *s, lua_Number *result, int mode) { + char *endptr; + *result = (mode == 'x') ? lua_strx2number(s, &endptr) /* try to convert */ + : lua_str2number(s, &endptr); + if (endptr == s) return NULL; /* nothing recognized? */ + while (lisspace(cast_uchar(*endptr))) endptr++; /* skip trailing spaces */ + return (*endptr == '\0') ? endptr : NULL; /* OK iff no trailing chars */ +} + + +/* +** Convert string 's' to a Lua number (put in 'result') handling the +** current locale. +** This function accepts both the current locale or a dot as the radix +** mark. If the conversion fails, it may mean number has a dot but +** locale accepts something else. In that case, the code copies 's' +** to a buffer (because 's' is read-only), changes the dot to the +** current locale radix mark, and tries to convert again. +** The variable 'mode' checks for special characters in the string: +** - 'n' means 'inf' or 'nan' (which should be rejected) +** - 'x' means a hexadecimal numeral +** - '.' just optimizes the search for the common case (no special chars) +*/ +static const char *l_str2d (const char *s, lua_Number *result) { + const char *endptr; + const char *pmode = strpbrk(s, ".xXnN"); /* look for special chars */ + int mode = pmode ? ltolower(cast_uchar(*pmode)) : 0; + if (mode == 'n') /* reject 'inf' and 'nan' */ + return NULL; + endptr = l_str2dloc(s, result, mode); /* try to convert */ + if (endptr == NULL) { /* failed? may be a different locale */ + char buff[L_MAXLENNUM + 1]; + const char *pdot = strchr(s, '.'); + if (pdot == NULL || strlen(s) > L_MAXLENNUM) + return NULL; /* string too long or no dot; fail */ + strcpy(buff, s); /* copy string to buffer */ + buff[pdot - s] = lua_getlocaledecpoint(); /* correct decimal point */ + endptr = l_str2dloc(buff, result, mode); /* try again */ + if (endptr != NULL) + endptr = s + (endptr - buff); /* make relative to 's' */ + } + return endptr; +} + + +#define MAXBY10 cast(lua_Unsigned, LUA_MAXINTEGER / 10) +#define MAXLASTD cast_int(LUA_MAXINTEGER % 10) + +static const char *l_str2int (const char *s, lua_Integer *result) { + lua_Unsigned a = 0; + int empty = 1; + int neg; + while (lisspace(cast_uchar(*s))) s++; /* skip initial spaces */ + neg = isneg(&s); + if (s[0] == '0' && + (s[1] == 'x' || s[1] == 'X')) { /* hex? */ + s += 2; /* skip '0x' */ + for (; lisxdigit(cast_uchar(*s)); s++) { + a = a * 16 + luaO_hexavalue(*s); + empty = 0; + } + } + else { /* decimal */ + for (; lisdigit(cast_uchar(*s)); s++) { + int d = *s - '0'; + if (a >= MAXBY10 && (a > MAXBY10 || d > MAXLASTD + neg)) /* overflow? */ + return NULL; /* do not accept it (as integer) */ + a = a * 10 + d; + empty = 0; + } + } + while (lisspace(cast_uchar(*s))) s++; /* skip trailing spaces */ + if (empty || *s != '\0') return NULL; /* something wrong in the numeral */ + else { + *result = l_castU2S((neg) ? 0u - a : a); + return s; + } +} + + +size_t luaO_str2num (const char *s, TValue *o) { + lua_Integer i; lua_Number n; + const char *e; + if ((e = l_str2int(s, &i)) != NULL) { /* try as an integer */ + setivalue(o, i); + } + else if ((e = l_str2d(s, &n)) != NULL) { /* else try as a float */ + setfltvalue(o, n); + } + else + return 0; /* conversion failed */ + return (e - s) + 1; /* success; return string size */ +} + + +int luaO_utf8esc (char *buff, unsigned long x) { + int n = 1; /* number of bytes put in buffer (backwards) */ + lua_assert(x <= 0x7FFFFFFFu); + if (x < 0x80) /* ascii? */ + buff[UTF8BUFFSZ - 1] = cast_char(x); + else { /* need continuation bytes */ + unsigned int mfb = 0x3f; /* maximum that fits in first byte */ + do { /* add continuation bytes */ + buff[UTF8BUFFSZ - (n++)] = cast_char(0x80 | (x & 0x3f)); + x >>= 6; /* remove added bits */ + mfb >>= 1; /* now there is one less bit available in first byte */ + } while (x > mfb); /* still needs continuation byte? */ + buff[UTF8BUFFSZ - n] = cast_char((~mfb << 1) | x); /* add first byte */ + } + return n; +} + + +/* +** Maximum length of the conversion of a number to a string. Must be +** enough to accommodate both LUA_INTEGER_FMT and LUA_NUMBER_FMT. +** (For a long long int, this is 19 digits plus a sign and a final '\0', +** adding to 21. For a long double, it can go to a sign, 33 digits, +** the dot, an exponent letter, an exponent sign, 5 exponent digits, +** and a final '\0', adding to 43.) +*/ +#define MAXNUMBER2STR 44 + + +/* +** Convert a number object to a string, adding it to a buffer +*/ +static int tostringbuff (TValue *obj, char *buff) { + int len; + lua_assert(ttisnumber(obj)); + if (ttisinteger(obj)) + len = lua_integer2str(buff, MAXNUMBER2STR, ivalue(obj)); + else { + len = lua_number2str(buff, MAXNUMBER2STR, fltvalue(obj)); + if (buff[strspn(buff, "-0123456789")] == '\0') { /* looks like an int? */ + buff[len++] = lua_getlocaledecpoint(); + buff[len++] = '0'; /* adds '.0' to result */ + } + } + return len; +} + + +/* +** Convert a number object to a Lua string, replacing the value at 'obj' +*/ +void luaO_tostring (lua_State *L, TValue *obj) { + char buff[MAXNUMBER2STR]; + int len = tostringbuff(obj, buff); + setsvalue(L, obj, luaS_newlstr(L, buff, len)); +} + + + + +/* +** {================================================================== +** 'luaO_pushvfstring' +** =================================================================== +*/ + +/* +** Size for buffer space used by 'luaO_pushvfstring'. It should be +** (LUA_IDSIZE + MAXNUMBER2STR) + a minimal space for basic messages, +** so that 'luaG_addinfo' can work directly on the buffer. +*/ +#define BUFVFS (LUA_IDSIZE + MAXNUMBER2STR + 95) + +/* buffer used by 'luaO_pushvfstring' */ +typedef struct BuffFS { + lua_State *L; + int pushed; /* true if there is a part of the result on the stack */ + int blen; /* length of partial string in 'space' */ + char space[BUFVFS]; /* holds last part of the result */ +} BuffFS; + + +/* +** Push given string to the stack, as part of the result, and +** join it to previous partial result if there is one. +** It may call 'luaV_concat' while using one slot from EXTRA_STACK. +** This call cannot invoke metamethods, as both operands must be +** strings. It can, however, raise an error if the result is too +** long. In that case, 'luaV_concat' frees the extra slot before +** raising the error. +*/ +static void pushstr (BuffFS *buff, const char *str, size_t lstr) { + lua_State *L = buff->L; + setsvalue2s(L, L->top.p, luaS_newlstr(L, str, lstr)); + L->top.p++; /* may use one slot from EXTRA_STACK */ + if (!buff->pushed) /* no previous string on the stack? */ + buff->pushed = 1; /* now there is one */ + else /* join previous string with new one */ + luaV_concat(L, 2); +} + + +/* +** empty the buffer space into the stack +*/ +static void clearbuff (BuffFS *buff) { + pushstr(buff, buff->space, buff->blen); /* push buffer contents */ + buff->blen = 0; /* space now is empty */ +} + + +/* +** Get a space of size 'sz' in the buffer. If buffer has not enough +** space, empty it. 'sz' must fit in an empty buffer. +*/ +static char *getbuff (BuffFS *buff, int sz) { + lua_assert(buff->blen <= BUFVFS); lua_assert(sz <= BUFVFS); + if (sz > BUFVFS - buff->blen) /* not enough space? */ + clearbuff(buff); + return buff->space + buff->blen; +} + + +#define addsize(b,sz) ((b)->blen += (sz)) + + +/* +** Add 'str' to the buffer. If string is larger than the buffer space, +** push the string directly to the stack. +*/ +static void addstr2buff (BuffFS *buff, const char *str, size_t slen) { + if (slen <= BUFVFS) { /* does string fit into buffer? */ + char *bf = getbuff(buff, cast_int(slen)); + memcpy(bf, str, slen); /* add string to buffer */ + addsize(buff, cast_int(slen)); + } + else { /* string larger than buffer */ + clearbuff(buff); /* string comes after buffer's content */ + pushstr(buff, str, slen); /* push string */ + } +} + + +/* +** Add a numeral to the buffer. +*/ +static void addnum2buff (BuffFS *buff, TValue *num) { + char *numbuff = getbuff(buff, MAXNUMBER2STR); + int len = tostringbuff(num, numbuff); /* format number into 'numbuff' */ + addsize(buff, len); +} + + +/* +** this function handles only '%d', '%c', '%f', '%p', '%s', and '%%' + conventional formats, plus Lua-specific '%I' and '%U' +*/ +const char *luaO_pushvfstring (lua_State *L, const char *fmt, va_list argp) { + BuffFS buff; /* holds last part of the result */ + const char *e; /* points to next '%' */ + buff.pushed = buff.blen = 0; + buff.L = L; + while ((e = strchr(fmt, '%')) != NULL) { + addstr2buff(&buff, fmt, e - fmt); /* add 'fmt' up to '%' */ + switch (*(e + 1)) { /* conversion specifier */ + case 's': { /* zero-terminated string */ + const char *s = va_arg(argp, char *); + if (s == NULL) s = "(null)"; + addstr2buff(&buff, s, strlen(s)); + break; + } + case 'c': { /* an 'int' as a character */ + char c = cast_uchar(va_arg(argp, int)); + addstr2buff(&buff, &c, sizeof(char)); + break; + } + case 'd': { /* an 'int' */ + TValue num; + setivalue(&num, va_arg(argp, int)); + addnum2buff(&buff, &num); + break; + } + case 'I': { /* a 'lua_Integer' */ + TValue num; + setivalue(&num, cast(lua_Integer, va_arg(argp, l_uacInt))); + addnum2buff(&buff, &num); + break; + } + case 'f': { /* a 'lua_Number' */ + TValue num; + setfltvalue(&num, cast_num(va_arg(argp, l_uacNumber))); + addnum2buff(&buff, &num); + break; + } + case 'p': { /* a pointer */ + const int sz = 3 * sizeof(void*) + 8; /* enough space for '%p' */ + char *bf = getbuff(&buff, sz); + void *p = va_arg(argp, void *); + int len = lua_pointer2str(bf, sz, p); + addsize(&buff, len); + break; + } + case 'U': { /* a 'long' as a UTF-8 sequence */ + char bf[UTF8BUFFSZ]; + int len = luaO_utf8esc(bf, va_arg(argp, long)); + addstr2buff(&buff, bf + UTF8BUFFSZ - len, len); + break; + } + case '%': { + addstr2buff(&buff, "%", 1); + break; + } + default: { + luaG_runerror(L, "invalid option '%%%c' to 'lua_pushfstring'", + *(e + 1)); + } + } + fmt = e + 2; /* skip '%' and the specifier */ + } + addstr2buff(&buff, fmt, strlen(fmt)); /* rest of 'fmt' */ + clearbuff(&buff); /* empty buffer into the stack */ + lua_assert(buff.pushed == 1); + return getstr(tsvalue(s2v(L->top.p - 1))); +} + + +const char *luaO_pushfstring (lua_State *L, const char *fmt, ...) { + const char *msg; + va_list argp; + va_start(argp, fmt); + msg = luaO_pushvfstring(L, fmt, argp); + va_end(argp); + return msg; +} + +/* }================================================================== */ + + +#define RETS "..." +#define PRE "[string \"" +#define POS "\"]" + +#define addstr(a,b,l) ( memcpy(a,b,(l) * sizeof(char)), a += (l) ) + +void luaO_chunkid (char *out, const char *source, size_t srclen) { + size_t bufflen = LUA_IDSIZE; /* free space in buffer */ + if (*source == '=') { /* 'literal' source */ + if (srclen <= bufflen) /* small enough? */ + memcpy(out, source + 1, srclen * sizeof(char)); + else { /* truncate it */ + addstr(out, source + 1, bufflen - 1); + *out = '\0'; + } + } + else if (*source == '@') { /* file name */ + if (srclen <= bufflen) /* small enough? */ + memcpy(out, source + 1, srclen * sizeof(char)); + else { /* add '...' before rest of name */ + addstr(out, RETS, LL(RETS)); + bufflen -= LL(RETS); + memcpy(out, source + 1 + srclen - bufflen, bufflen * sizeof(char)); + } + } + else { /* string; format as [string "source"] */ + const char *nl = strchr(source, '\n'); /* find first new line (if any) */ + addstr(out, PRE, LL(PRE)); /* add prefix */ + bufflen -= LL(PRE RETS POS) + 1; /* save space for prefix+suffix+'\0' */ + if (srclen < bufflen && nl == NULL) { /* small one-line source? */ + addstr(out, source, srclen); /* keep it */ + } + else { + if (nl != NULL) srclen = nl - source; /* stop at first newline */ + if (srclen > bufflen) srclen = bufflen; + addstr(out, source, srclen); + addstr(out, RETS, LL(RETS)); + } + memcpy(out, POS, (LL(POS) + 1) * sizeof(char)); + } +} + diff --git a/vendor/lua-5.4.8/src/lobject.h b/vendor/lua-5.4.8/src/lobject.h new file mode 100644 index 0000000..980e42f --- /dev/null +++ b/vendor/lua-5.4.8/src/lobject.h @@ -0,0 +1,813 @@ +/* +** $Id: lobject.h $ +** Type definitions for Lua objects +** See Copyright Notice in lua.h +*/ + + +#ifndef lobject_h +#define lobject_h + + +#include <stdarg.h> + + +#include "llimits.h" +#include "lua.h" + + +/* +** Extra types for collectable non-values +*/ +#define LUA_TUPVAL LUA_NUMTYPES /* upvalues */ +#define LUA_TPROTO (LUA_NUMTYPES+1) /* function prototypes */ +#define LUA_TDEADKEY (LUA_NUMTYPES+2) /* removed keys in tables */ + + + +/* +** number of all possible types (including LUA_TNONE but excluding DEADKEY) +*/ +#define LUA_TOTALTYPES (LUA_TPROTO + 2) + + +/* +** tags for Tagged Values have the following use of bits: +** bits 0-3: actual tag (a LUA_T* constant) +** bits 4-5: variant bits +** bit 6: whether value is collectable +*/ + +/* add variant bits to a type */ +#define makevariant(t,v) ((t) | ((v) << 4)) + + + +/* +** Union of all Lua values +*/ +typedef union Value { + struct GCObject *gc; /* collectable objects */ + void *p; /* light userdata */ + lua_CFunction f; /* light C functions */ + lua_Integer i; /* integer numbers */ + lua_Number n; /* float numbers */ + /* not used, but may avoid warnings for uninitialized value */ + lu_byte ub; +} Value; + + +/* +** Tagged Values. This is the basic representation of values in Lua: +** an actual value plus a tag with its type. +*/ + +#define TValuefields Value value_; lu_byte tt_ + +typedef struct TValue { + TValuefields; +} TValue; + + +#define val_(o) ((o)->value_) +#define valraw(o) (val_(o)) + + +/* raw type tag of a TValue */ +#define rawtt(o) ((o)->tt_) + +/* tag with no variants (bits 0-3) */ +#define novariant(t) ((t) & 0x0F) + +/* type tag of a TValue (bits 0-3 for tags + variant bits 4-5) */ +#define withvariant(t) ((t) & 0x3F) +#define ttypetag(o) withvariant(rawtt(o)) + +/* type of a TValue */ +#define ttype(o) (novariant(rawtt(o))) + + +/* Macros to test type */ +#define checktag(o,t) (rawtt(o) == (t)) +#define checktype(o,t) (ttype(o) == (t)) + + +/* Macros for internal tests */ + +/* collectable object has the same tag as the original value */ +#define righttt(obj) (ttypetag(obj) == gcvalue(obj)->tt) + +/* +** Any value being manipulated by the program either is non +** collectable, or the collectable object has the right tag +** and it is not dead. The option 'L == NULL' allows other +** macros using this one to be used where L is not available. +*/ +#define checkliveness(L,obj) \ + ((void)L, lua_longassert(!iscollectable(obj) || \ + (righttt(obj) && (L == NULL || !isdead(G(L),gcvalue(obj)))))) + + +/* Macros to set values */ + +/* set a value's tag */ +#define settt_(o,t) ((o)->tt_=(t)) + + +/* main macro to copy values (from 'obj2' to 'obj1') */ +#define setobj(L,obj1,obj2) \ + { TValue *io1=(obj1); const TValue *io2=(obj2); \ + io1->value_ = io2->value_; settt_(io1, io2->tt_); \ + checkliveness(L,io1); lua_assert(!isnonstrictnil(io1)); } + +/* +** Different types of assignments, according to source and destination. +** (They are mostly equal now, but may be different in the future.) +*/ + +/* from stack to stack */ +#define setobjs2s(L,o1,o2) setobj(L,s2v(o1),s2v(o2)) +/* to stack (not from same stack) */ +#define setobj2s(L,o1,o2) setobj(L,s2v(o1),o2) +/* from table to same table */ +#define setobjt2t setobj +/* to new object */ +#define setobj2n setobj +/* to table */ +#define setobj2t setobj + + +/* +** Entries in a Lua stack. Field 'tbclist' forms a list of all +** to-be-closed variables active in this stack. Dummy entries are +** used when the distance between two tbc variables does not fit +** in an unsigned short. They are represented by delta==0, and +** their real delta is always the maximum value that fits in +** that field. +*/ +typedef union StackValue { + TValue val; + struct { + TValuefields; + unsigned short delta; + } tbclist; +} StackValue; + + +/* index to stack elements */ +typedef StackValue *StkId; + + +/* +** When reallocating the stack, change all pointers to the stack into +** proper offsets. +*/ +typedef union { + StkId p; /* actual pointer */ + ptrdiff_t offset; /* used while the stack is being reallocated */ +} StkIdRel; + + +/* convert a 'StackValue' to a 'TValue' */ +#define s2v(o) (&(o)->val) + + + +/* +** {================================================================== +** Nil +** =================================================================== +*/ + +/* Standard nil */ +#define LUA_VNIL makevariant(LUA_TNIL, 0) + +/* Empty slot (which might be different from a slot containing nil) */ +#define LUA_VEMPTY makevariant(LUA_TNIL, 1) + +/* Value returned for a key not found in a table (absent key) */ +#define LUA_VABSTKEY makevariant(LUA_TNIL, 2) + + +/* macro to test for (any kind of) nil */ +#define ttisnil(v) checktype((v), LUA_TNIL) + + +/* macro to test for a standard nil */ +#define ttisstrictnil(o) checktag((o), LUA_VNIL) + + +#define setnilvalue(obj) settt_(obj, LUA_VNIL) + + +#define isabstkey(v) checktag((v), LUA_VABSTKEY) + + +/* +** macro to detect non-standard nils (used only in assertions) +*/ +#define isnonstrictnil(v) (ttisnil(v) && !ttisstrictnil(v)) + + +/* +** By default, entries with any kind of nil are considered empty. +** (In any definition, values associated with absent keys must also +** be accepted as empty.) +*/ +#define isempty(v) ttisnil(v) + + +/* macro defining a value corresponding to an absent key */ +#define ABSTKEYCONSTANT {NULL}, LUA_VABSTKEY + + +/* mark an entry as empty */ +#define setempty(v) settt_(v, LUA_VEMPTY) + + + +/* }================================================================== */ + + +/* +** {================================================================== +** Booleans +** =================================================================== +*/ + + +#define LUA_VFALSE makevariant(LUA_TBOOLEAN, 0) +#define LUA_VTRUE makevariant(LUA_TBOOLEAN, 1) + +#define ttisboolean(o) checktype((o), LUA_TBOOLEAN) +#define ttisfalse(o) checktag((o), LUA_VFALSE) +#define ttistrue(o) checktag((o), LUA_VTRUE) + + +#define l_isfalse(o) (ttisfalse(o) || ttisnil(o)) + + +#define setbfvalue(obj) settt_(obj, LUA_VFALSE) +#define setbtvalue(obj) settt_(obj, LUA_VTRUE) + +/* }================================================================== */ + + +/* +** {================================================================== +** Threads +** =================================================================== +*/ + +#define LUA_VTHREAD makevariant(LUA_TTHREAD, 0) + +#define ttisthread(o) checktag((o), ctb(LUA_VTHREAD)) + +#define thvalue(o) check_exp(ttisthread(o), gco2th(val_(o).gc)) + +#define setthvalue(L,obj,x) \ + { TValue *io = (obj); lua_State *x_ = (x); \ + val_(io).gc = obj2gco(x_); settt_(io, ctb(LUA_VTHREAD)); \ + checkliveness(L,io); } + +#define setthvalue2s(L,o,t) setthvalue(L,s2v(o),t) + +/* }================================================================== */ + + +/* +** {================================================================== +** Collectable Objects +** =================================================================== +*/ + +/* +** Common Header for all collectable objects (in macro form, to be +** included in other objects) +*/ +#define CommonHeader struct GCObject *next; lu_byte tt; lu_byte marked + + +/* Common type for all collectable objects */ +typedef struct GCObject { + CommonHeader; +} GCObject; + + +/* Bit mark for collectable types */ +#define BIT_ISCOLLECTABLE (1 << 6) + +#define iscollectable(o) (rawtt(o) & BIT_ISCOLLECTABLE) + +/* mark a tag as collectable */ +#define ctb(t) ((t) | BIT_ISCOLLECTABLE) + +#define gcvalue(o) check_exp(iscollectable(o), val_(o).gc) + +#define gcvalueraw(v) ((v).gc) + +#define setgcovalue(L,obj,x) \ + { TValue *io = (obj); GCObject *i_g=(x); \ + val_(io).gc = i_g; settt_(io, ctb(i_g->tt)); } + +/* }================================================================== */ + + +/* +** {================================================================== +** Numbers +** =================================================================== +*/ + +/* Variant tags for numbers */ +#define LUA_VNUMINT makevariant(LUA_TNUMBER, 0) /* integer numbers */ +#define LUA_VNUMFLT makevariant(LUA_TNUMBER, 1) /* float numbers */ + +#define ttisnumber(o) checktype((o), LUA_TNUMBER) +#define ttisfloat(o) checktag((o), LUA_VNUMFLT) +#define ttisinteger(o) checktag((o), LUA_VNUMINT) + +#define nvalue(o) check_exp(ttisnumber(o), \ + (ttisinteger(o) ? cast_num(ivalue(o)) : fltvalue(o))) +#define fltvalue(o) check_exp(ttisfloat(o), val_(o).n) +#define ivalue(o) check_exp(ttisinteger(o), val_(o).i) + +#define fltvalueraw(v) ((v).n) +#define ivalueraw(v) ((v).i) + +#define setfltvalue(obj,x) \ + { TValue *io=(obj); val_(io).n=(x); settt_(io, LUA_VNUMFLT); } + +#define chgfltvalue(obj,x) \ + { TValue *io=(obj); lua_assert(ttisfloat(io)); val_(io).n=(x); } + +#define setivalue(obj,x) \ + { TValue *io=(obj); val_(io).i=(x); settt_(io, LUA_VNUMINT); } + +#define chgivalue(obj,x) \ + { TValue *io=(obj); lua_assert(ttisinteger(io)); val_(io).i=(x); } + +/* }================================================================== */ + + +/* +** {================================================================== +** Strings +** =================================================================== +*/ + +/* Variant tags for strings */ +#define LUA_VSHRSTR makevariant(LUA_TSTRING, 0) /* short strings */ +#define LUA_VLNGSTR makevariant(LUA_TSTRING, 1) /* long strings */ + +#define ttisstring(o) checktype((o), LUA_TSTRING) +#define ttisshrstring(o) checktag((o), ctb(LUA_VSHRSTR)) +#define ttislngstring(o) checktag((o), ctb(LUA_VLNGSTR)) + +#define tsvalueraw(v) (gco2ts((v).gc)) + +#define tsvalue(o) check_exp(ttisstring(o), gco2ts(val_(o).gc)) + +#define setsvalue(L,obj,x) \ + { TValue *io = (obj); TString *x_ = (x); \ + val_(io).gc = obj2gco(x_); settt_(io, ctb(x_->tt)); \ + checkliveness(L,io); } + +/* set a string to the stack */ +#define setsvalue2s(L,o,s) setsvalue(L,s2v(o),s) + +/* set a string to a new object */ +#define setsvalue2n setsvalue + + +/* +** Header for a string value. +*/ +typedef struct TString { + CommonHeader; + lu_byte extra; /* reserved words for short strings; "has hash" for longs */ + lu_byte shrlen; /* length for short strings, 0xFF for long strings */ + unsigned int hash; + union { + size_t lnglen; /* length for long strings */ + struct TString *hnext; /* linked list for hash table */ + } u; + char contents[1]; +} TString; + + + +/* +** Get the actual string (array of bytes) from a 'TString'. (Generic +** version and specialized versions for long and short strings.) +*/ +#define getstr(ts) ((ts)->contents) +#define getlngstr(ts) check_exp((ts)->shrlen == 0xFF, (ts)->contents) +#define getshrstr(ts) check_exp((ts)->shrlen != 0xFF, (ts)->contents) + + +/* get string length from 'TString *s' */ +#define tsslen(s) \ + ((s)->shrlen != 0xFF ? (s)->shrlen : (s)->u.lnglen) + +/* }================================================================== */ + + +/* +** {================================================================== +** Userdata +** =================================================================== +*/ + + +/* +** Light userdata should be a variant of userdata, but for compatibility +** reasons they are also different types. +*/ +#define LUA_VLIGHTUSERDATA makevariant(LUA_TLIGHTUSERDATA, 0) + +#define LUA_VUSERDATA makevariant(LUA_TUSERDATA, 0) + +#define ttislightuserdata(o) checktag((o), LUA_VLIGHTUSERDATA) +#define ttisfulluserdata(o) checktag((o), ctb(LUA_VUSERDATA)) + +#define pvalue(o) check_exp(ttislightuserdata(o), val_(o).p) +#define uvalue(o) check_exp(ttisfulluserdata(o), gco2u(val_(o).gc)) + +#define pvalueraw(v) ((v).p) + +#define setpvalue(obj,x) \ + { TValue *io=(obj); val_(io).p=(x); settt_(io, LUA_VLIGHTUSERDATA); } + +#define setuvalue(L,obj,x) \ + { TValue *io = (obj); Udata *x_ = (x); \ + val_(io).gc = obj2gco(x_); settt_(io, ctb(LUA_VUSERDATA)); \ + checkliveness(L,io); } + + +/* Ensures that addresses after this type are always fully aligned. */ +typedef union UValue { + TValue uv; + LUAI_MAXALIGN; /* ensures maximum alignment for udata bytes */ +} UValue; + + +/* +** Header for userdata with user values; +** memory area follows the end of this structure. +*/ +typedef struct Udata { + CommonHeader; + unsigned short nuvalue; /* number of user values */ + size_t len; /* number of bytes */ + struct Table *metatable; + GCObject *gclist; + UValue uv[1]; /* user values */ +} Udata; + + +/* +** Header for userdata with no user values. These userdata do not need +** to be gray during GC, and therefore do not need a 'gclist' field. +** To simplify, the code always use 'Udata' for both kinds of userdata, +** making sure it never accesses 'gclist' on userdata with no user values. +** This structure here is used only to compute the correct size for +** this representation. (The 'bindata' field in its end ensures correct +** alignment for binary data following this header.) +*/ +typedef struct Udata0 { + CommonHeader; + unsigned short nuvalue; /* number of user values */ + size_t len; /* number of bytes */ + struct Table *metatable; + union {LUAI_MAXALIGN;} bindata; +} Udata0; + + +/* compute the offset of the memory area of a userdata */ +#define udatamemoffset(nuv) \ + ((nuv) == 0 ? offsetof(Udata0, bindata) \ + : offsetof(Udata, uv) + (sizeof(UValue) * (nuv))) + +/* get the address of the memory block inside 'Udata' */ +#define getudatamem(u) (cast_charp(u) + udatamemoffset((u)->nuvalue)) + +/* compute the size of a userdata */ +#define sizeudata(nuv,nb) (udatamemoffset(nuv) + (nb)) + +/* }================================================================== */ + + +/* +** {================================================================== +** Prototypes +** =================================================================== +*/ + +#define LUA_VPROTO makevariant(LUA_TPROTO, 0) + + +/* +** Description of an upvalue for function prototypes +*/ +typedef struct Upvaldesc { + TString *name; /* upvalue name (for debug information) */ + lu_byte instack; /* whether it is in stack (register) */ + lu_byte idx; /* index of upvalue (in stack or in outer function's list) */ + lu_byte kind; /* kind of corresponding variable */ +} Upvaldesc; + + +/* +** Description of a local variable for function prototypes +** (used for debug information) +*/ +typedef struct LocVar { + TString *varname; + int startpc; /* first point where variable is active */ + int endpc; /* first point where variable is dead */ +} LocVar; + + +/* +** Associates the absolute line source for a given instruction ('pc'). +** The array 'lineinfo' gives, for each instruction, the difference in +** lines from the previous instruction. When that difference does not +** fit into a byte, Lua saves the absolute line for that instruction. +** (Lua also saves the absolute line periodically, to speed up the +** computation of a line number: we can use binary search in the +** absolute-line array, but we must traverse the 'lineinfo' array +** linearly to compute a line.) +*/ +typedef struct AbsLineInfo { + int pc; + int line; +} AbsLineInfo; + +/* +** Function Prototypes +*/ +typedef struct Proto { + CommonHeader; + lu_byte numparams; /* number of fixed (named) parameters */ + lu_byte is_vararg; + lu_byte maxstacksize; /* number of registers needed by this function */ + int sizeupvalues; /* size of 'upvalues' */ + int sizek; /* size of 'k' */ + int sizecode; + int sizelineinfo; + int sizep; /* size of 'p' */ + int sizelocvars; + int sizeabslineinfo; /* size of 'abslineinfo' */ + int linedefined; /* debug information */ + int lastlinedefined; /* debug information */ + TValue *k; /* constants used by the function */ + Instruction *code; /* opcodes */ + struct Proto **p; /* functions defined inside the function */ + Upvaldesc *upvalues; /* upvalue information */ + ls_byte *lineinfo; /* information about source lines (debug information) */ + AbsLineInfo *abslineinfo; /* idem */ + LocVar *locvars; /* information about local variables (debug information) */ + TString *source; /* used for debug information */ + GCObject *gclist; +} Proto; + +/* }================================================================== */ + + +/* +** {================================================================== +** Functions +** =================================================================== +*/ + +#define LUA_VUPVAL makevariant(LUA_TUPVAL, 0) + + +/* Variant tags for functions */ +#define LUA_VLCL makevariant(LUA_TFUNCTION, 0) /* Lua closure */ +#define LUA_VLCF makevariant(LUA_TFUNCTION, 1) /* light C function */ +#define LUA_VCCL makevariant(LUA_TFUNCTION, 2) /* C closure */ + +#define ttisfunction(o) checktype(o, LUA_TFUNCTION) +#define ttisLclosure(o) checktag((o), ctb(LUA_VLCL)) +#define ttislcf(o) checktag((o), LUA_VLCF) +#define ttisCclosure(o) checktag((o), ctb(LUA_VCCL)) +#define ttisclosure(o) (ttisLclosure(o) || ttisCclosure(o)) + + +#define isLfunction(o) ttisLclosure(o) + +#define clvalue(o) check_exp(ttisclosure(o), gco2cl(val_(o).gc)) +#define clLvalue(o) check_exp(ttisLclosure(o), gco2lcl(val_(o).gc)) +#define fvalue(o) check_exp(ttislcf(o), val_(o).f) +#define clCvalue(o) check_exp(ttisCclosure(o), gco2ccl(val_(o).gc)) + +#define fvalueraw(v) ((v).f) + +#define setclLvalue(L,obj,x) \ + { TValue *io = (obj); LClosure *x_ = (x); \ + val_(io).gc = obj2gco(x_); settt_(io, ctb(LUA_VLCL)); \ + checkliveness(L,io); } + +#define setclLvalue2s(L,o,cl) setclLvalue(L,s2v(o),cl) + +#define setfvalue(obj,x) \ + { TValue *io=(obj); val_(io).f=(x); settt_(io, LUA_VLCF); } + +#define setclCvalue(L,obj,x) \ + { TValue *io = (obj); CClosure *x_ = (x); \ + val_(io).gc = obj2gco(x_); settt_(io, ctb(LUA_VCCL)); \ + checkliveness(L,io); } + + +/* +** Upvalues for Lua closures +*/ +typedef struct UpVal { + CommonHeader; + union { + TValue *p; /* points to stack or to its own value */ + ptrdiff_t offset; /* used while the stack is being reallocated */ + } v; + union { + struct { /* (when open) */ + struct UpVal *next; /* linked list */ + struct UpVal **previous; + } open; + TValue value; /* the value (when closed) */ + } u; +} UpVal; + + + +#define ClosureHeader \ + CommonHeader; lu_byte nupvalues; GCObject *gclist + +typedef struct CClosure { + ClosureHeader; + lua_CFunction f; + TValue upvalue[1]; /* list of upvalues */ +} CClosure; + + +typedef struct LClosure { + ClosureHeader; + struct Proto *p; + UpVal *upvals[1]; /* list of upvalues */ +} LClosure; + + +typedef union Closure { + CClosure c; + LClosure l; +} Closure; + + +#define getproto(o) (clLvalue(o)->p) + +/* }================================================================== */ + + +/* +** {================================================================== +** Tables +** =================================================================== +*/ + +#define LUA_VTABLE makevariant(LUA_TTABLE, 0) + +#define ttistable(o) checktag((o), ctb(LUA_VTABLE)) + +#define hvalue(o) check_exp(ttistable(o), gco2t(val_(o).gc)) + +#define sethvalue(L,obj,x) \ + { TValue *io = (obj); Table *x_ = (x); \ + val_(io).gc = obj2gco(x_); settt_(io, ctb(LUA_VTABLE)); \ + checkliveness(L,io); } + +#define sethvalue2s(L,o,h) sethvalue(L,s2v(o),h) + + +/* +** Nodes for Hash tables: A pack of two TValue's (key-value pairs) +** plus a 'next' field to link colliding entries. The distribution +** of the key's fields ('key_tt' and 'key_val') not forming a proper +** 'TValue' allows for a smaller size for 'Node' both in 4-byte +** and 8-byte alignments. +*/ +typedef union Node { + struct NodeKey { + TValuefields; /* fields for value */ + lu_byte key_tt; /* key type */ + int next; /* for chaining */ + Value key_val; /* key value */ + } u; + TValue i_val; /* direct access to node's value as a proper 'TValue' */ +} Node; + + +/* copy a value into a key */ +#define setnodekey(L,node,obj) \ + { Node *n_=(node); const TValue *io_=(obj); \ + n_->u.key_val = io_->value_; n_->u.key_tt = io_->tt_; \ + checkliveness(L,io_); } + + +/* copy a value from a key */ +#define getnodekey(L,obj,node) \ + { TValue *io_=(obj); const Node *n_=(node); \ + io_->value_ = n_->u.key_val; io_->tt_ = n_->u.key_tt; \ + checkliveness(L,io_); } + + +/* +** About 'alimit': if 'isrealasize(t)' is true, then 'alimit' is the +** real size of 'array'. Otherwise, the real size of 'array' is the +** smallest power of two not smaller than 'alimit' (or zero iff 'alimit' +** is zero); 'alimit' is then used as a hint for #t. +*/ + +#define BITRAS (1 << 7) +#define isrealasize(t) (!((t)->flags & BITRAS)) +#define setrealasize(t) ((t)->flags &= cast_byte(~BITRAS)) +#define setnorealasize(t) ((t)->flags |= BITRAS) + + +typedef struct Table { + CommonHeader; + lu_byte flags; /* 1<<p means tagmethod(p) is not present */ + lu_byte lsizenode; /* log2 of size of 'node' array */ + unsigned int alimit; /* "limit" of 'array' array */ + TValue *array; /* array part */ + Node *node; + Node *lastfree; /* any free position is before this position */ + struct Table *metatable; + GCObject *gclist; +} Table; + + +/* +** Macros to manipulate keys inserted in nodes +*/ +#define keytt(node) ((node)->u.key_tt) +#define keyval(node) ((node)->u.key_val) + +#define keyisnil(node) (keytt(node) == LUA_TNIL) +#define keyisinteger(node) (keytt(node) == LUA_VNUMINT) +#define keyival(node) (keyval(node).i) +#define keyisshrstr(node) (keytt(node) == ctb(LUA_VSHRSTR)) +#define keystrval(node) (gco2ts(keyval(node).gc)) + +#define setnilkey(node) (keytt(node) = LUA_TNIL) + +#define keyiscollectable(n) (keytt(n) & BIT_ISCOLLECTABLE) + +#define gckey(n) (keyval(n).gc) +#define gckeyN(n) (keyiscollectable(n) ? gckey(n) : NULL) + + +/* +** Dead keys in tables have the tag DEADKEY but keep their original +** gcvalue. This distinguishes them from regular keys but allows them to +** be found when searched in a special way. ('next' needs that to find +** keys removed from a table during a traversal.) +*/ +#define setdeadkey(node) (keytt(node) = LUA_TDEADKEY) +#define keyisdead(node) (keytt(node) == LUA_TDEADKEY) + +/* }================================================================== */ + + + +/* +** 'module' operation for hashing (size is always a power of 2) +*/ +#define lmod(s,size) \ + (check_exp((size&(size-1))==0, (cast_int((s) & ((size)-1))))) + + +#define twoto(x) (1<<(x)) +#define sizenode(t) (twoto((t)->lsizenode)) + + +/* size of buffer for 'luaO_utf8esc' function */ +#define UTF8BUFFSZ 8 + +LUAI_FUNC int luaO_utf8esc (char *buff, unsigned long x); +LUAI_FUNC int luaO_ceillog2 (unsigned int x); +LUAI_FUNC int luaO_rawarith (lua_State *L, int op, const TValue *p1, + const TValue *p2, TValue *res); +LUAI_FUNC void luaO_arith (lua_State *L, int op, const TValue *p1, + const TValue *p2, StkId res); +LUAI_FUNC size_t luaO_str2num (const char *s, TValue *o); +LUAI_FUNC int luaO_hexavalue (int c); +LUAI_FUNC void luaO_tostring (lua_State *L, TValue *obj); +LUAI_FUNC const char *luaO_pushvfstring (lua_State *L, const char *fmt, + va_list argp); +LUAI_FUNC const char *luaO_pushfstring (lua_State *L, const char *fmt, ...); +LUAI_FUNC void luaO_chunkid (char *out, const char *source, size_t srclen); + + +#endif + diff --git a/vendor/lua-5.4.8/src/lopcodes.c b/vendor/lua-5.4.8/src/lopcodes.c new file mode 100644 index 0000000..c67aa22 --- /dev/null +++ b/vendor/lua-5.4.8/src/lopcodes.c @@ -0,0 +1,104 @@ +/* +** $Id: lopcodes.c $ +** Opcodes for Lua virtual machine +** See Copyright Notice in lua.h +*/ + +#define lopcodes_c +#define LUA_CORE + +#include "lprefix.h" + + +#include "lopcodes.h" + + +/* ORDER OP */ + +LUAI_DDEF const lu_byte luaP_opmodes[NUM_OPCODES] = { +/* MM OT IT T A mode opcode */ + opmode(0, 0, 0, 0, 1, iABC) /* OP_MOVE */ + ,opmode(0, 0, 0, 0, 1, iAsBx) /* OP_LOADI */ + ,opmode(0, 0, 0, 0, 1, iAsBx) /* OP_LOADF */ + ,opmode(0, 0, 0, 0, 1, iABx) /* OP_LOADK */ + ,opmode(0, 0, 0, 0, 1, iABx) /* OP_LOADKX */ + ,opmode(0, 0, 0, 0, 1, iABC) /* OP_LOADFALSE */ + ,opmode(0, 0, 0, 0, 1, iABC) /* OP_LFALSESKIP */ + ,opmode(0, 0, 0, 0, 1, iABC) /* OP_LOADTRUE */ + ,opmode(0, 0, 0, 0, 1, iABC) /* OP_LOADNIL */ + ,opmode(0, 0, 0, 0, 1, iABC) /* OP_GETUPVAL */ + ,opmode(0, 0, 0, 0, 0, iABC) /* OP_SETUPVAL */ + ,opmode(0, 0, 0, 0, 1, iABC) /* OP_GETTABUP */ + ,opmode(0, 0, 0, 0, 1, iABC) /* OP_GETTABLE */ + ,opmode(0, 0, 0, 0, 1, iABC) /* OP_GETI */ + ,opmode(0, 0, 0, 0, 1, iABC) /* OP_GETFIELD */ + ,opmode(0, 0, 0, 0, 0, iABC) /* OP_SETTABUP */ + ,opmode(0, 0, 0, 0, 0, iABC) /* OP_SETTABLE */ + ,opmode(0, 0, 0, 0, 0, iABC) /* OP_SETI */ + ,opmode(0, 0, 0, 0, 0, iABC) /* OP_SETFIELD */ + ,opmode(0, 0, 0, 0, 1, iABC) /* OP_NEWTABLE */ + ,opmode(0, 0, 0, 0, 1, iABC) /* OP_SELF */ + ,opmode(0, 0, 0, 0, 1, iABC) /* OP_ADDI */ + ,opmode(0, 0, 0, 0, 1, iABC) /* OP_ADDK */ + ,opmode(0, 0, 0, 0, 1, iABC) /* OP_SUBK */ + ,opmode(0, 0, 0, 0, 1, iABC) /* OP_MULK */ + ,opmode(0, 0, 0, 0, 1, iABC) /* OP_MODK */ + ,opmode(0, 0, 0, 0, 1, iABC) /* OP_POWK */ + ,opmode(0, 0, 0, 0, 1, iABC) /* OP_DIVK */ + ,opmode(0, 0, 0, 0, 1, iABC) /* OP_IDIVK */ + ,opmode(0, 0, 0, 0, 1, iABC) /* OP_BANDK */ + ,opmode(0, 0, 0, 0, 1, iABC) /* OP_BORK */ + ,opmode(0, 0, 0, 0, 1, iABC) /* OP_BXORK */ + ,opmode(0, 0, 0, 0, 1, iABC) /* OP_SHRI */ + ,opmode(0, 0, 0, 0, 1, iABC) /* OP_SHLI */ + ,opmode(0, 0, 0, 0, 1, iABC) /* OP_ADD */ + ,opmode(0, 0, 0, 0, 1, iABC) /* OP_SUB */ + ,opmode(0, 0, 0, 0, 1, iABC) /* OP_MUL */ + ,opmode(0, 0, 0, 0, 1, iABC) /* OP_MOD */ + ,opmode(0, 0, 0, 0, 1, iABC) /* OP_POW */ + ,opmode(0, 0, 0, 0, 1, iABC) /* OP_DIV */ + ,opmode(0, 0, 0, 0, 1, iABC) /* OP_IDIV */ + ,opmode(0, 0, 0, 0, 1, iABC) /* OP_BAND */ + ,opmode(0, 0, 0, 0, 1, iABC) /* OP_BOR */ + ,opmode(0, 0, 0, 0, 1, iABC) /* OP_BXOR */ + ,opmode(0, 0, 0, 0, 1, iABC) /* OP_SHL */ + ,opmode(0, 0, 0, 0, 1, iABC) /* OP_SHR */ + ,opmode(1, 0, 0, 0, 0, iABC) /* OP_MMBIN */ + ,opmode(1, 0, 0, 0, 0, iABC) /* OP_MMBINI*/ + ,opmode(1, 0, 0, 0, 0, iABC) /* OP_MMBINK*/ + ,opmode(0, 0, 0, 0, 1, iABC) /* OP_UNM */ + ,opmode(0, 0, 0, 0, 1, iABC) /* OP_BNOT */ + ,opmode(0, 0, 0, 0, 1, iABC) /* OP_NOT */ + ,opmode(0, 0, 0, 0, 1, iABC) /* OP_LEN */ + ,opmode(0, 0, 0, 0, 1, iABC) /* OP_CONCAT */ + ,opmode(0, 0, 0, 0, 0, iABC) /* OP_CLOSE */ + ,opmode(0, 0, 0, 0, 0, iABC) /* OP_TBC */ + ,opmode(0, 0, 0, 0, 0, isJ) /* OP_JMP */ + ,opmode(0, 0, 0, 1, 0, iABC) /* OP_EQ */ + ,opmode(0, 0, 0, 1, 0, iABC) /* OP_LT */ + ,opmode(0, 0, 0, 1, 0, iABC) /* OP_LE */ + ,opmode(0, 0, 0, 1, 0, iABC) /* OP_EQK */ + ,opmode(0, 0, 0, 1, 0, iABC) /* OP_EQI */ + ,opmode(0, 0, 0, 1, 0, iABC) /* OP_LTI */ + ,opmode(0, 0, 0, 1, 0, iABC) /* OP_LEI */ + ,opmode(0, 0, 0, 1, 0, iABC) /* OP_GTI */ + ,opmode(0, 0, 0, 1, 0, iABC) /* OP_GEI */ + ,opmode(0, 0, 0, 1, 0, iABC) /* OP_TEST */ + ,opmode(0, 0, 0, 1, 1, iABC) /* OP_TESTSET */ + ,opmode(0, 1, 1, 0, 1, iABC) /* OP_CALL */ + ,opmode(0, 1, 1, 0, 1, iABC) /* OP_TAILCALL */ + ,opmode(0, 0, 1, 0, 0, iABC) /* OP_RETURN */ + ,opmode(0, 0, 0, 0, 0, iABC) /* OP_RETURN0 */ + ,opmode(0, 0, 0, 0, 0, iABC) /* OP_RETURN1 */ + ,opmode(0, 0, 0, 0, 1, iABx) /* OP_FORLOOP */ + ,opmode(0, 0, 0, 0, 1, iABx) /* OP_FORPREP */ + ,opmode(0, 0, 0, 0, 0, iABx) /* OP_TFORPREP */ + ,opmode(0, 0, 0, 0, 0, iABC) /* OP_TFORCALL */ + ,opmode(0, 0, 0, 0, 1, iABx) /* OP_TFORLOOP */ + ,opmode(0, 0, 1, 0, 0, iABC) /* OP_SETLIST */ + ,opmode(0, 0, 0, 0, 1, iABx) /* OP_CLOSURE */ + ,opmode(0, 1, 0, 0, 1, iABC) /* OP_VARARG */ + ,opmode(0, 0, 1, 0, 1, iABC) /* OP_VARARGPREP */ + ,opmode(0, 0, 0, 0, 0, iAx) /* OP_EXTRAARG */ +}; + diff --git a/vendor/lua-5.4.8/src/lopcodes.h b/vendor/lua-5.4.8/src/lopcodes.h new file mode 100644 index 0000000..46911ca --- /dev/null +++ b/vendor/lua-5.4.8/src/lopcodes.h @@ -0,0 +1,405 @@ +/* +** $Id: lopcodes.h $ +** Opcodes for Lua virtual machine +** See Copyright Notice in lua.h +*/ + +#ifndef lopcodes_h +#define lopcodes_h + +#include "llimits.h" + + +/*=========================================================================== + We assume that instructions are unsigned 32-bit integers. + All instructions have an opcode in the first 7 bits. + Instructions can have the following formats: + + 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 + 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 +iABC C(8) | B(8) |k| A(8) | Op(7) | +iABx Bx(17) | A(8) | Op(7) | +iAsBx sBx (signed)(17) | A(8) | Op(7) | +iAx Ax(25) | Op(7) | +isJ sJ (signed)(25) | Op(7) | + + A signed argument is represented in excess K: the represented value is + the written unsigned value minus K, where K is half the maximum for the + corresponding unsigned argument. +===========================================================================*/ + + +enum OpMode {iABC, iABx, iAsBx, iAx, isJ}; /* basic instruction formats */ + + +/* +** size and position of opcode arguments. +*/ +#define SIZE_C 8 +#define SIZE_B 8 +#define SIZE_Bx (SIZE_C + SIZE_B + 1) +#define SIZE_A 8 +#define SIZE_Ax (SIZE_Bx + SIZE_A) +#define SIZE_sJ (SIZE_Bx + SIZE_A) + +#define SIZE_OP 7 + +#define POS_OP 0 + +#define POS_A (POS_OP + SIZE_OP) +#define POS_k (POS_A + SIZE_A) +#define POS_B (POS_k + 1) +#define POS_C (POS_B + SIZE_B) + +#define POS_Bx POS_k + +#define POS_Ax POS_A + +#define POS_sJ POS_A + + +/* +** limits for opcode arguments. +** we use (signed) 'int' to manipulate most arguments, +** so they must fit in ints. +*/ + +/* Check whether type 'int' has at least 'b' bits ('b' < 32) */ +#define L_INTHASBITS(b) ((UINT_MAX >> ((b) - 1)) >= 1) + + +#if L_INTHASBITS(SIZE_Bx) +#define MAXARG_Bx ((1<<SIZE_Bx)-1) +#else +#define MAXARG_Bx MAX_INT +#endif + +#define OFFSET_sBx (MAXARG_Bx>>1) /* 'sBx' is signed */ + + +#if L_INTHASBITS(SIZE_Ax) +#define MAXARG_Ax ((1<<SIZE_Ax)-1) +#else +#define MAXARG_Ax MAX_INT +#endif + +#if L_INTHASBITS(SIZE_sJ) +#define MAXARG_sJ ((1 << SIZE_sJ) - 1) +#else +#define MAXARG_sJ MAX_INT +#endif + +#define OFFSET_sJ (MAXARG_sJ >> 1) + + +#define MAXARG_A ((1<<SIZE_A)-1) +#define MAXARG_B ((1<<SIZE_B)-1) +#define MAXARG_C ((1<<SIZE_C)-1) +#define OFFSET_sC (MAXARG_C >> 1) + +#define int2sC(i) ((i) + OFFSET_sC) +#define sC2int(i) ((i) - OFFSET_sC) + + +/* creates a mask with 'n' 1 bits at position 'p' */ +#define MASK1(n,p) ((~((~(Instruction)0)<<(n)))<<(p)) + +/* creates a mask with 'n' 0 bits at position 'p' */ +#define MASK0(n,p) (~MASK1(n,p)) + +/* +** the following macros help to manipulate instructions +*/ + +#define GET_OPCODE(i) (cast(OpCode, ((i)>>POS_OP) & MASK1(SIZE_OP,0))) +#define SET_OPCODE(i,o) ((i) = (((i)&MASK0(SIZE_OP,POS_OP)) | \ + ((cast(Instruction, o)<<POS_OP)&MASK1(SIZE_OP,POS_OP)))) + +#define checkopm(i,m) (getOpMode(GET_OPCODE(i)) == m) + + +#define getarg(i,pos,size) (cast_int(((i)>>(pos)) & MASK1(size,0))) +#define setarg(i,v,pos,size) ((i) = (((i)&MASK0(size,pos)) | \ + ((cast(Instruction, v)<<pos)&MASK1(size,pos)))) + +#define GETARG_A(i) getarg(i, POS_A, SIZE_A) +#define SETARG_A(i,v) setarg(i, v, POS_A, SIZE_A) + +#define GETARG_B(i) check_exp(checkopm(i, iABC), getarg(i, POS_B, SIZE_B)) +#define GETARG_sB(i) sC2int(GETARG_B(i)) +#define SETARG_B(i,v) setarg(i, v, POS_B, SIZE_B) + +#define GETARG_C(i) check_exp(checkopm(i, iABC), getarg(i, POS_C, SIZE_C)) +#define GETARG_sC(i) sC2int(GETARG_C(i)) +#define SETARG_C(i,v) setarg(i, v, POS_C, SIZE_C) + +#define TESTARG_k(i) check_exp(checkopm(i, iABC), (cast_int(((i) & (1u << POS_k))))) +#define GETARG_k(i) check_exp(checkopm(i, iABC), getarg(i, POS_k, 1)) +#define SETARG_k(i,v) setarg(i, v, POS_k, 1) + +#define GETARG_Bx(i) check_exp(checkopm(i, iABx), getarg(i, POS_Bx, SIZE_Bx)) +#define SETARG_Bx(i,v) setarg(i, v, POS_Bx, SIZE_Bx) + +#define GETARG_Ax(i) check_exp(checkopm(i, iAx), getarg(i, POS_Ax, SIZE_Ax)) +#define SETARG_Ax(i,v) setarg(i, v, POS_Ax, SIZE_Ax) + +#define GETARG_sBx(i) \ + check_exp(checkopm(i, iAsBx), getarg(i, POS_Bx, SIZE_Bx) - OFFSET_sBx) +#define SETARG_sBx(i,b) SETARG_Bx((i),cast_uint((b)+OFFSET_sBx)) + +#define GETARG_sJ(i) \ + check_exp(checkopm(i, isJ), getarg(i, POS_sJ, SIZE_sJ) - OFFSET_sJ) +#define SETARG_sJ(i,j) \ + setarg(i, cast_uint((j)+OFFSET_sJ), POS_sJ, SIZE_sJ) + + +#define CREATE_ABCk(o,a,b,c,k) ((cast(Instruction, o)<<POS_OP) \ + | (cast(Instruction, a)<<POS_A) \ + | (cast(Instruction, b)<<POS_B) \ + | (cast(Instruction, c)<<POS_C) \ + | (cast(Instruction, k)<<POS_k)) + +#define CREATE_ABx(o,a,bc) ((cast(Instruction, o)<<POS_OP) \ + | (cast(Instruction, a)<<POS_A) \ + | (cast(Instruction, bc)<<POS_Bx)) + +#define CREATE_Ax(o,a) ((cast(Instruction, o)<<POS_OP) \ + | (cast(Instruction, a)<<POS_Ax)) + +#define CREATE_sJ(o,j,k) ((cast(Instruction, o) << POS_OP) \ + | (cast(Instruction, j) << POS_sJ) \ + | (cast(Instruction, k) << POS_k)) + + +#if !defined(MAXINDEXRK) /* (for debugging only) */ +#define MAXINDEXRK MAXARG_B +#endif + + +/* +** invalid register that fits in 8 bits +*/ +#define NO_REG MAXARG_A + + +/* +** R[x] - register +** K[x] - constant (in constant table) +** RK(x) == if k(i) then K[x] else R[x] +*/ + + +/* +** Grep "ORDER OP" if you change these enums. Opcodes marked with a (*) +** has extra descriptions in the notes after the enumeration. +*/ + +typedef enum { +/*---------------------------------------------------------------------- + name args description +------------------------------------------------------------------------*/ +OP_MOVE,/* A B R[A] := R[B] */ +OP_LOADI,/* A sBx R[A] := sBx */ +OP_LOADF,/* A sBx R[A] := (lua_Number)sBx */ +OP_LOADK,/* A Bx R[A] := K[Bx] */ +OP_LOADKX,/* A R[A] := K[extra arg] */ +OP_LOADFALSE,/* A R[A] := false */ +OP_LFALSESKIP,/*A R[A] := false; pc++ (*) */ +OP_LOADTRUE,/* A R[A] := true */ +OP_LOADNIL,/* A B R[A], R[A+1], ..., R[A+B] := nil */ +OP_GETUPVAL,/* A B R[A] := UpValue[B] */ +OP_SETUPVAL,/* A B UpValue[B] := R[A] */ + +OP_GETTABUP,/* A B C R[A] := UpValue[B][K[C]:shortstring] */ +OP_GETTABLE,/* A B C R[A] := R[B][R[C]] */ +OP_GETI,/* A B C R[A] := R[B][C] */ +OP_GETFIELD,/* A B C R[A] := R[B][K[C]:shortstring] */ + +OP_SETTABUP,/* A B C UpValue[A][K[B]:shortstring] := RK(C) */ +OP_SETTABLE,/* A B C R[A][R[B]] := RK(C) */ +OP_SETI,/* A B C R[A][B] := RK(C) */ +OP_SETFIELD,/* A B C R[A][K[B]:shortstring] := RK(C) */ + +OP_NEWTABLE,/* A B C k R[A] := {} */ + +OP_SELF,/* A B C R[A+1] := R[B]; R[A] := R[B][RK(C):string] */ + +OP_ADDI,/* A B sC R[A] := R[B] + sC */ + +OP_ADDK,/* A B C R[A] := R[B] + K[C]:number */ +OP_SUBK,/* A B C R[A] := R[B] - K[C]:number */ +OP_MULK,/* A B C R[A] := R[B] * K[C]:number */ +OP_MODK,/* A B C R[A] := R[B] % K[C]:number */ +OP_POWK,/* A B C R[A] := R[B] ^ K[C]:number */ +OP_DIVK,/* A B C R[A] := R[B] / K[C]:number */ +OP_IDIVK,/* A B C R[A] := R[B] // K[C]:number */ + +OP_BANDK,/* A B C R[A] := R[B] & K[C]:integer */ +OP_BORK,/* A B C R[A] := R[B] | K[C]:integer */ +OP_BXORK,/* A B C R[A] := R[B] ~ K[C]:integer */ + +OP_SHRI,/* A B sC R[A] := R[B] >> sC */ +OP_SHLI,/* A B sC R[A] := sC << R[B] */ + +OP_ADD,/* A B C R[A] := R[B] + R[C] */ +OP_SUB,/* A B C R[A] := R[B] - R[C] */ +OP_MUL,/* A B C R[A] := R[B] * R[C] */ +OP_MOD,/* A B C R[A] := R[B] % R[C] */ +OP_POW,/* A B C R[A] := R[B] ^ R[C] */ +OP_DIV,/* A B C R[A] := R[B] / R[C] */ +OP_IDIV,/* A B C R[A] := R[B] // R[C] */ + +OP_BAND,/* A B C R[A] := R[B] & R[C] */ +OP_BOR,/* A B C R[A] := R[B] | R[C] */ +OP_BXOR,/* A B C R[A] := R[B] ~ R[C] */ +OP_SHL,/* A B C R[A] := R[B] << R[C] */ +OP_SHR,/* A B C R[A] := R[B] >> R[C] */ + +OP_MMBIN,/* A B C call C metamethod over R[A] and R[B] (*) */ +OP_MMBINI,/* A sB C k call C metamethod over R[A] and sB */ +OP_MMBINK,/* A B C k call C metamethod over R[A] and K[B] */ + +OP_UNM,/* A B R[A] := -R[B] */ +OP_BNOT,/* A B R[A] := ~R[B] */ +OP_NOT,/* A B R[A] := not R[B] */ +OP_LEN,/* A B R[A] := #R[B] (length operator) */ + +OP_CONCAT,/* A B R[A] := R[A].. ... ..R[A + B - 1] */ + +OP_CLOSE,/* A close all upvalues >= R[A] */ +OP_TBC,/* A mark variable A "to be closed" */ +OP_JMP,/* sJ pc += sJ */ +OP_EQ,/* A B k if ((R[A] == R[B]) ~= k) then pc++ */ +OP_LT,/* A B k if ((R[A] < R[B]) ~= k) then pc++ */ +OP_LE,/* A B k if ((R[A] <= R[B]) ~= k) then pc++ */ + +OP_EQK,/* A B k if ((R[A] == K[B]) ~= k) then pc++ */ +OP_EQI,/* A sB k if ((R[A] == sB) ~= k) then pc++ */ +OP_LTI,/* A sB k if ((R[A] < sB) ~= k) then pc++ */ +OP_LEI,/* A sB k if ((R[A] <= sB) ~= k) then pc++ */ +OP_GTI,/* A sB k if ((R[A] > sB) ~= k) then pc++ */ +OP_GEI,/* A sB k if ((R[A] >= sB) ~= k) then pc++ */ + +OP_TEST,/* A k if (not R[A] == k) then pc++ */ +OP_TESTSET,/* A B k if (not R[B] == k) then pc++ else R[A] := R[B] (*) */ + +OP_CALL,/* A B C R[A], ... ,R[A+C-2] := R[A](R[A+1], ... ,R[A+B-1]) */ +OP_TAILCALL,/* A B C k return R[A](R[A+1], ... ,R[A+B-1]) */ + +OP_RETURN,/* A B C k return R[A], ... ,R[A+B-2] (see note) */ +OP_RETURN0,/* return */ +OP_RETURN1,/* A return R[A] */ + +OP_FORLOOP,/* A Bx update counters; if loop continues then pc-=Bx; */ +OP_FORPREP,/* A Bx <check values and prepare counters>; + if not to run then pc+=Bx+1; */ + +OP_TFORPREP,/* A Bx create upvalue for R[A + 3]; pc+=Bx */ +OP_TFORCALL,/* A C R[A+4], ... ,R[A+3+C] := R[A](R[A+1], R[A+2]); */ +OP_TFORLOOP,/* A Bx if R[A+2] ~= nil then { R[A]=R[A+2]; pc -= Bx } */ + +OP_SETLIST,/* A B C k R[A][C+i] := R[A+i], 1 <= i <= B */ + +OP_CLOSURE,/* A Bx R[A] := closure(KPROTO[Bx]) */ + +OP_VARARG,/* A C R[A], R[A+1], ..., R[A+C-2] = vararg */ + +OP_VARARGPREP,/*A (adjust vararg parameters) */ + +OP_EXTRAARG/* Ax extra (larger) argument for previous opcode */ +} OpCode; + + +#define NUM_OPCODES ((int)(OP_EXTRAARG) + 1) + + + +/*=========================================================================== + Notes: + + (*) Opcode OP_LFALSESKIP is used to convert a condition to a boolean + value, in a code equivalent to (not cond ? false : true). (It + produces false and skips the next instruction producing true.) + + (*) Opcodes OP_MMBIN and variants follow each arithmetic and + bitwise opcode. If the operation succeeds, it skips this next + opcode. Otherwise, this opcode calls the corresponding metamethod. + + (*) Opcode OP_TESTSET is used in short-circuit expressions that need + both to jump and to produce a value, such as (a = b or c). + + (*) In OP_CALL, if (B == 0) then B = top - A. If (C == 0), then + 'top' is set to last_result+1, so next open instruction (OP_CALL, + OP_RETURN*, OP_SETLIST) may use 'top'. + + (*) In OP_VARARG, if (C == 0) then use actual number of varargs and + set top (like in OP_CALL with C == 0). + + (*) In OP_RETURN, if (B == 0) then return up to 'top'. + + (*) In OP_LOADKX and OP_NEWTABLE, the next instruction is always + OP_EXTRAARG. + + (*) In OP_SETLIST, if (B == 0) then real B = 'top'; if k, then + real C = EXTRAARG _ C (the bits of EXTRAARG concatenated with the + bits of C). + + (*) In OP_NEWTABLE, B is log2 of the hash size (which is always a + power of 2) plus 1, or zero for size zero. If not k, the array size + is C. Otherwise, the array size is EXTRAARG _ C. + + (*) For comparisons, k specifies what condition the test should accept + (true or false). + + (*) In OP_MMBINI/OP_MMBINK, k means the arguments were flipped + (the constant is the first operand). + + (*) All 'skips' (pc++) assume that next instruction is a jump. + + (*) In instructions OP_RETURN/OP_TAILCALL, 'k' specifies that the + function builds upvalues, which may need to be closed. C > 0 means + the function is vararg, so that its 'func' must be corrected before + returning; in this case, (C - 1) is its number of fixed parameters. + + (*) In comparisons with an immediate operand, C signals whether the + original operand was a float. (It must be corrected in case of + metamethods.) + +===========================================================================*/ + + +/* +** masks for instruction properties. The format is: +** bits 0-2: op mode +** bit 3: instruction set register A +** bit 4: operator is a test (next instruction must be a jump) +** bit 5: instruction uses 'L->top' set by previous instruction (when B == 0) +** bit 6: instruction sets 'L->top' for next instruction (when C == 0) +** bit 7: instruction is an MM instruction (call a metamethod) +*/ + +LUAI_DDEC(const lu_byte luaP_opmodes[NUM_OPCODES];) + +#define getOpMode(m) (cast(enum OpMode, luaP_opmodes[m] & 7)) +#define testAMode(m) (luaP_opmodes[m] & (1 << 3)) +#define testTMode(m) (luaP_opmodes[m] & (1 << 4)) +#define testITMode(m) (luaP_opmodes[m] & (1 << 5)) +#define testOTMode(m) (luaP_opmodes[m] & (1 << 6)) +#define testMMMode(m) (luaP_opmodes[m] & (1 << 7)) + +/* "out top" (set top for next instruction) */ +#define isOT(i) \ + ((testOTMode(GET_OPCODE(i)) && GETARG_C(i) == 0) || \ + GET_OPCODE(i) == OP_TAILCALL) + +/* "in top" (uses top from previous instruction) */ +#define isIT(i) (testITMode(GET_OPCODE(i)) && GETARG_B(i) == 0) + +#define opmode(mm,ot,it,t,a,m) \ + (((mm) << 7) | ((ot) << 6) | ((it) << 5) | ((t) << 4) | ((a) << 3) | (m)) + + +/* number of list items to accumulate before a SETLIST instruction */ +#define LFIELDS_PER_FLUSH 50 + +#endif diff --git a/vendor/lua-5.4.8/src/lopnames.h b/vendor/lua-5.4.8/src/lopnames.h new file mode 100644 index 0000000..965cec9 --- /dev/null +++ b/vendor/lua-5.4.8/src/lopnames.h @@ -0,0 +1,103 @@ +/* +** $Id: lopnames.h $ +** Opcode names +** See Copyright Notice in lua.h +*/ + +#if !defined(lopnames_h) +#define lopnames_h + +#include <stddef.h> + + +/* ORDER OP */ + +static const char *const opnames[] = { + "MOVE", + "LOADI", + "LOADF", + "LOADK", + "LOADKX", + "LOADFALSE", + "LFALSESKIP", + "LOADTRUE", + "LOADNIL", + "GETUPVAL", + "SETUPVAL", + "GETTABUP", + "GETTABLE", + "GETI", + "GETFIELD", + "SETTABUP", + "SETTABLE", + "SETI", + "SETFIELD", + "NEWTABLE", + "SELF", + "ADDI", + "ADDK", + "SUBK", + "MULK", + "MODK", + "POWK", + "DIVK", + "IDIVK", + "BANDK", + "BORK", + "BXORK", + "SHRI", + "SHLI", + "ADD", + "SUB", + "MUL", + "MOD", + "POW", + "DIV", + "IDIV", + "BAND", + "BOR", + "BXOR", + "SHL", + "SHR", + "MMBIN", + "MMBINI", + "MMBINK", + "UNM", + "BNOT", + "NOT", + "LEN", + "CONCAT", + "CLOSE", + "TBC", + "JMP", + "EQ", + "LT", + "LE", + "EQK", + "EQI", + "LTI", + "LEI", + "GTI", + "GEI", + "TEST", + "TESTSET", + "CALL", + "TAILCALL", + "RETURN", + "RETURN0", + "RETURN1", + "FORLOOP", + "FORPREP", + "TFORPREP", + "TFORCALL", + "TFORLOOP", + "SETLIST", + "CLOSURE", + "VARARG", + "VARARGPREP", + "EXTRAARG", + NULL +}; + +#endif + diff --git a/vendor/lua-5.4.8/src/loslib.c b/vendor/lua-5.4.8/src/loslib.c new file mode 100644 index 0000000..ba80d72 --- /dev/null +++ b/vendor/lua-5.4.8/src/loslib.c @@ -0,0 +1,430 @@ +/* +** $Id: loslib.c $ +** Standard Operating System library +** See Copyright Notice in lua.h +*/ + +#define loslib_c +#define LUA_LIB + +#include "lprefix.h" + + +#include <errno.h> +#include <locale.h> +#include <stdlib.h> +#include <string.h> +#include <time.h> + +#include "lua.h" + +#include "lauxlib.h" +#include "lualib.h" + + +/* +** {================================================================== +** List of valid conversion specifiers for the 'strftime' function; +** options are grouped by length; group of length 2 start with '||'. +** =================================================================== +*/ +#if !defined(LUA_STRFTIMEOPTIONS) /* { */ + +#if defined(LUA_USE_WINDOWS) +#define LUA_STRFTIMEOPTIONS "aAbBcdHIjmMpSUwWxXyYzZ%" \ + "||" "#c#x#d#H#I#j#m#M#S#U#w#W#y#Y" /* two-char options */ +#elif defined(LUA_USE_C89) /* ANSI C 89 (only 1-char options) */ +#define LUA_STRFTIMEOPTIONS "aAbBcdHIjmMpSUwWxXyYZ%" +#else /* C99 specification */ +#define LUA_STRFTIMEOPTIONS "aAbBcCdDeFgGhHIjmMnprRStTuUVwWxXyYzZ%" \ + "||" "EcECExEXEyEY" "OdOeOHOIOmOMOSOuOUOVOwOWOy" /* two-char options */ +#endif + +#endif /* } */ +/* }================================================================== */ + + +/* +** {================================================================== +** Configuration for time-related stuff +** =================================================================== +*/ + +/* +** type to represent time_t in Lua +*/ +#if !defined(LUA_NUMTIME) /* { */ + +#define l_timet lua_Integer +#define l_pushtime(L,t) lua_pushinteger(L,(lua_Integer)(t)) +#define l_gettime(L,arg) luaL_checkinteger(L, arg) + +#else /* }{ */ + +#define l_timet lua_Number +#define l_pushtime(L,t) lua_pushnumber(L,(lua_Number)(t)) +#define l_gettime(L,arg) luaL_checknumber(L, arg) + +#endif /* } */ + + +#if !defined(l_gmtime) /* { */ +/* +** By default, Lua uses gmtime/localtime, except when POSIX is available, +** where it uses gmtime_r/localtime_r +*/ + +#if defined(LUA_USE_POSIX) /* { */ + +#define l_gmtime(t,r) gmtime_r(t,r) +#define l_localtime(t,r) localtime_r(t,r) + +#else /* }{ */ + +/* ISO C definitions */ +#define l_gmtime(t,r) ((void)(r)->tm_sec, gmtime(t)) +#define l_localtime(t,r) ((void)(r)->tm_sec, localtime(t)) + +#endif /* } */ + +#endif /* } */ + +/* }================================================================== */ + + +/* +** {================================================================== +** Configuration for 'tmpnam': +** By default, Lua uses tmpnam except when POSIX is available, where +** it uses mkstemp. +** =================================================================== +*/ +#if !defined(lua_tmpnam) /* { */ + +#if defined(LUA_USE_POSIX) /* { */ + +#include <unistd.h> + +#define LUA_TMPNAMBUFSIZE 32 + +#if !defined(LUA_TMPNAMTEMPLATE) +#define LUA_TMPNAMTEMPLATE "/tmp/lua_XXXXXX" +#endif + +#define lua_tmpnam(b,e) { \ + strcpy(b, LUA_TMPNAMTEMPLATE); \ + e = mkstemp(b); \ + if (e != -1) close(e); \ + e = (e == -1); } + +#else /* }{ */ + +/* ISO C definitions */ +#define LUA_TMPNAMBUFSIZE L_tmpnam +#define lua_tmpnam(b,e) { e = (tmpnam(b) == NULL); } + +#endif /* } */ + +#endif /* } */ +/* }================================================================== */ + + +#if !defined(l_system) +#if defined(LUA_USE_IOS) +/* Despite claiming to be ISO C, iOS does not implement 'system'. */ +#define l_system(cmd) ((cmd) == NULL ? 0 : -1) +#else +#define l_system(cmd) system(cmd) /* default definition */ +#endif +#endif + + +static int os_execute (lua_State *L) { + const char *cmd = luaL_optstring(L, 1, NULL); + int stat; + errno = 0; + stat = l_system(cmd); + if (cmd != NULL) + return luaL_execresult(L, stat); + else { + lua_pushboolean(L, stat); /* true if there is a shell */ + return 1; + } +} + + +static int os_remove (lua_State *L) { + const char *filename = luaL_checkstring(L, 1); + errno = 0; + return luaL_fileresult(L, remove(filename) == 0, filename); +} + + +static int os_rename (lua_State *L) { + const char *fromname = luaL_checkstring(L, 1); + const char *toname = luaL_checkstring(L, 2); + errno = 0; + return luaL_fileresult(L, rename(fromname, toname) == 0, NULL); +} + + +static int os_tmpname (lua_State *L) { + char buff[LUA_TMPNAMBUFSIZE]; + int err; + lua_tmpnam(buff, err); + if (l_unlikely(err)) + return luaL_error(L, "unable to generate a unique filename"); + lua_pushstring(L, buff); + return 1; +} + + +static int os_getenv (lua_State *L) { + lua_pushstring(L, getenv(luaL_checkstring(L, 1))); /* if NULL push nil */ + return 1; +} + + +static int os_clock (lua_State *L) { + lua_pushnumber(L, ((lua_Number)clock())/(lua_Number)CLOCKS_PER_SEC); + return 1; +} + + +/* +** {====================================================== +** Time/Date operations +** { year=%Y, month=%m, day=%d, hour=%H, min=%M, sec=%S, +** wday=%w+1, yday=%j, isdst=? } +** ======================================================= +*/ + +/* +** About the overflow check: an overflow cannot occur when time +** is represented by a lua_Integer, because either lua_Integer is +** large enough to represent all int fields or it is not large enough +** to represent a time that cause a field to overflow. However, if +** times are represented as doubles and lua_Integer is int, then the +** time 0x1.e1853b0d184f6p+55 would cause an overflow when adding 1900 +** to compute the year. +*/ +static void setfield (lua_State *L, const char *key, int value, int delta) { + #if (defined(LUA_NUMTIME) && LUA_MAXINTEGER <= INT_MAX) + if (l_unlikely(value > LUA_MAXINTEGER - delta)) + luaL_error(L, "field '%s' is out-of-bound", key); + #endif + lua_pushinteger(L, (lua_Integer)value + delta); + lua_setfield(L, -2, key); +} + + +static void setboolfield (lua_State *L, const char *key, int value) { + if (value < 0) /* undefined? */ + return; /* does not set field */ + lua_pushboolean(L, value); + lua_setfield(L, -2, key); +} + + +/* +** Set all fields from structure 'tm' in the table on top of the stack +*/ +static void setallfields (lua_State *L, struct tm *stm) { + setfield(L, "year", stm->tm_year, 1900); + setfield(L, "month", stm->tm_mon, 1); + setfield(L, "day", stm->tm_mday, 0); + setfield(L, "hour", stm->tm_hour, 0); + setfield(L, "min", stm->tm_min, 0); + setfield(L, "sec", stm->tm_sec, 0); + setfield(L, "yday", stm->tm_yday, 1); + setfield(L, "wday", stm->tm_wday, 1); + setboolfield(L, "isdst", stm->tm_isdst); +} + + +static int getboolfield (lua_State *L, const char *key) { + int res; + res = (lua_getfield(L, -1, key) == LUA_TNIL) ? -1 : lua_toboolean(L, -1); + lua_pop(L, 1); + return res; +} + + +static int getfield (lua_State *L, const char *key, int d, int delta) { + int isnum; + int t = lua_getfield(L, -1, key); /* get field and its type */ + lua_Integer res = lua_tointegerx(L, -1, &isnum); + if (!isnum) { /* field is not an integer? */ + if (l_unlikely(t != LUA_TNIL)) /* some other value? */ + return luaL_error(L, "field '%s' is not an integer", key); + else if (l_unlikely(d < 0)) /* absent field; no default? */ + return luaL_error(L, "field '%s' missing in date table", key); + res = d; + } + else { + if (!(res >= 0 ? res - delta <= INT_MAX : INT_MIN + delta <= res)) + return luaL_error(L, "field '%s' is out-of-bound", key); + res -= delta; + } + lua_pop(L, 1); + return (int)res; +} + + +static const char *checkoption (lua_State *L, const char *conv, + ptrdiff_t convlen, char *buff) { + const char *option = LUA_STRFTIMEOPTIONS; + int oplen = 1; /* length of options being checked */ + for (; *option != '\0' && oplen <= convlen; option += oplen) { + if (*option == '|') /* next block? */ + oplen++; /* will check options with next length (+1) */ + else if (memcmp(conv, option, oplen) == 0) { /* match? */ + memcpy(buff, conv, oplen); /* copy valid option to buffer */ + buff[oplen] = '\0'; + return conv + oplen; /* return next item */ + } + } + luaL_argerror(L, 1, + lua_pushfstring(L, "invalid conversion specifier '%%%s'", conv)); + return conv; /* to avoid warnings */ +} + + +static time_t l_checktime (lua_State *L, int arg) { + l_timet t = l_gettime(L, arg); + luaL_argcheck(L, (time_t)t == t, arg, "time out-of-bounds"); + return (time_t)t; +} + + +/* maximum size for an individual 'strftime' item */ +#define SIZETIMEFMT 250 + + +static int os_date (lua_State *L) { + size_t slen; + const char *s = luaL_optlstring(L, 1, "%c", &slen); + time_t t = luaL_opt(L, l_checktime, 2, time(NULL)); + const char *se = s + slen; /* 's' end */ + struct tm tmr, *stm; + if (*s == '!') { /* UTC? */ + stm = l_gmtime(&t, &tmr); + s++; /* skip '!' */ + } + else + stm = l_localtime(&t, &tmr); + if (stm == NULL) /* invalid date? */ + return luaL_error(L, + "date result cannot be represented in this installation"); + if (strcmp(s, "*t") == 0) { + lua_createtable(L, 0, 9); /* 9 = number of fields */ + setallfields(L, stm); + } + else { + char cc[4]; /* buffer for individual conversion specifiers */ + luaL_Buffer b; + cc[0] = '%'; + luaL_buffinit(L, &b); + while (s < se) { + if (*s != '%') /* not a conversion specifier? */ + luaL_addchar(&b, *s++); + else { + size_t reslen; + char *buff = luaL_prepbuffsize(&b, SIZETIMEFMT); + s++; /* skip '%' */ + s = checkoption(L, s, se - s, cc + 1); /* copy specifier to 'cc' */ + reslen = strftime(buff, SIZETIMEFMT, cc, stm); + luaL_addsize(&b, reslen); + } + } + luaL_pushresult(&b); + } + return 1; +} + + +static int os_time (lua_State *L) { + time_t t; + if (lua_isnoneornil(L, 1)) /* called without args? */ + t = time(NULL); /* get current time */ + else { + struct tm ts; + luaL_checktype(L, 1, LUA_TTABLE); + lua_settop(L, 1); /* make sure table is at the top */ + ts.tm_year = getfield(L, "year", -1, 1900); + ts.tm_mon = getfield(L, "month", -1, 1); + ts.tm_mday = getfield(L, "day", -1, 0); + ts.tm_hour = getfield(L, "hour", 12, 0); + ts.tm_min = getfield(L, "min", 0, 0); + ts.tm_sec = getfield(L, "sec", 0, 0); + ts.tm_isdst = getboolfield(L, "isdst"); + t = mktime(&ts); + setallfields(L, &ts); /* update fields with normalized values */ + } + if (t != (time_t)(l_timet)t || t == (time_t)(-1)) + return luaL_error(L, + "time result cannot be represented in this installation"); + l_pushtime(L, t); + return 1; +} + + +static int os_difftime (lua_State *L) { + time_t t1 = l_checktime(L, 1); + time_t t2 = l_checktime(L, 2); + lua_pushnumber(L, (lua_Number)difftime(t1, t2)); + return 1; +} + +/* }====================================================== */ + + +static int os_setlocale (lua_State *L) { + static const int cat[] = {LC_ALL, LC_COLLATE, LC_CTYPE, LC_MONETARY, + LC_NUMERIC, LC_TIME}; + static const char *const catnames[] = {"all", "collate", "ctype", "monetary", + "numeric", "time", NULL}; + const char *l = luaL_optstring(L, 1, NULL); + int op = luaL_checkoption(L, 2, "all", catnames); + lua_pushstring(L, setlocale(cat[op], l)); + return 1; +} + + +static int os_exit (lua_State *L) { + int status; + if (lua_isboolean(L, 1)) + status = (lua_toboolean(L, 1) ? EXIT_SUCCESS : EXIT_FAILURE); + else + status = (int)luaL_optinteger(L, 1, EXIT_SUCCESS); + if (lua_toboolean(L, 2)) + lua_close(L); + if (L) exit(status); /* 'if' to avoid warnings for unreachable 'return' */ + return 0; +} + + +static const luaL_Reg syslib[] = { + {"clock", os_clock}, + {"date", os_date}, + {"difftime", os_difftime}, + {"execute", os_execute}, + {"exit", os_exit}, + {"getenv", os_getenv}, + {"remove", os_remove}, + {"rename", os_rename}, + {"setlocale", os_setlocale}, + {"time", os_time}, + {"tmpname", os_tmpname}, + {NULL, NULL} +}; + +/* }====================================================== */ + + + +LUAMOD_API int luaopen_os (lua_State *L) { + luaL_newlib(L, syslib); + return 1; +} + diff --git a/vendor/lua-5.4.8/src/lparser.c b/vendor/lua-5.4.8/src/lparser.c new file mode 100644 index 0000000..1ac8299 --- /dev/null +++ b/vendor/lua-5.4.8/src/lparser.c @@ -0,0 +1,1966 @@ +/* +** $Id: lparser.c $ +** Lua Parser +** See Copyright Notice in lua.h +*/ + +#define lparser_c +#define LUA_CORE + +#include "lprefix.h" + + +#include <limits.h> +#include <string.h> + +#include "lua.h" + +#include "lcode.h" +#include "ldebug.h" +#include "ldo.h" +#include "lfunc.h" +#include "llex.h" +#include "lmem.h" +#include "lobject.h" +#include "lopcodes.h" +#include "lparser.h" +#include "lstate.h" +#include "lstring.h" +#include "ltable.h" + + + +/* maximum number of local variables per function (must be smaller + than 250, due to the bytecode format) */ +#define MAXVARS 200 + + +#define hasmultret(k) ((k) == VCALL || (k) == VVARARG) + + +/* because all strings are unified by the scanner, the parser + can use pointer equality for string equality */ +#define eqstr(a,b) ((a) == (b)) + + +/* +** nodes for block list (list of active blocks) +*/ +typedef struct BlockCnt { + struct BlockCnt *previous; /* chain */ + int firstlabel; /* index of first label in this block */ + int firstgoto; /* index of first pending goto in this block */ + lu_byte nactvar; /* # active locals outside the block */ + lu_byte upval; /* true if some variable in the block is an upvalue */ + lu_byte isloop; /* true if 'block' is a loop */ + lu_byte insidetbc; /* true if inside the scope of a to-be-closed var. */ +} BlockCnt; + + + +/* +** prototypes for recursive non-terminal functions +*/ +static void statement (LexState *ls); +static void expr (LexState *ls, expdesc *v); + + +static l_noret error_expected (LexState *ls, int token) { + luaX_syntaxerror(ls, + luaO_pushfstring(ls->L, "%s expected", luaX_token2str(ls, token))); +} + + +static l_noret errorlimit (FuncState *fs, int limit, const char *what) { + lua_State *L = fs->ls->L; + const char *msg; + int line = fs->f->linedefined; + const char *where = (line == 0) + ? "main function" + : luaO_pushfstring(L, "function at line %d", line); + msg = luaO_pushfstring(L, "too many %s (limit is %d) in %s", + what, limit, where); + luaX_syntaxerror(fs->ls, msg); +} + + +static void checklimit (FuncState *fs, int v, int l, const char *what) { + if (v > l) errorlimit(fs, l, what); +} + + +/* +** Test whether next token is 'c'; if so, skip it. +*/ +static int testnext (LexState *ls, int c) { + if (ls->t.token == c) { + luaX_next(ls); + return 1; + } + else return 0; +} + + +/* +** Check that next token is 'c'. +*/ +static void check (LexState *ls, int c) { + if (ls->t.token != c) + error_expected(ls, c); +} + + +/* +** Check that next token is 'c' and skip it. +*/ +static void checknext (LexState *ls, int c) { + check(ls, c); + luaX_next(ls); +} + + +#define check_condition(ls,c,msg) { if (!(c)) luaX_syntaxerror(ls, msg); } + + +/* +** Check that next token is 'what' and skip it. In case of error, +** raise an error that the expected 'what' should match a 'who' +** in line 'where' (if that is not the current line). +*/ +static void check_match (LexState *ls, int what, int who, int where) { + if (l_unlikely(!testnext(ls, what))) { + if (where == ls->linenumber) /* all in the same line? */ + error_expected(ls, what); /* do not need a complex message */ + else { + luaX_syntaxerror(ls, luaO_pushfstring(ls->L, + "%s expected (to close %s at line %d)", + luaX_token2str(ls, what), luaX_token2str(ls, who), where)); + } + } +} + + +static TString *str_checkname (LexState *ls) { + TString *ts; + check(ls, TK_NAME); + ts = ls->t.seminfo.ts; + luaX_next(ls); + return ts; +} + + +static void init_exp (expdesc *e, expkind k, int i) { + e->f = e->t = NO_JUMP; + e->k = k; + e->u.info = i; +} + + +static void codestring (expdesc *e, TString *s) { + e->f = e->t = NO_JUMP; + e->k = VKSTR; + e->u.strval = s; +} + + +static void codename (LexState *ls, expdesc *e) { + codestring(e, str_checkname(ls)); +} + + +/* +** Register a new local variable in the active 'Proto' (for debug +** information). +*/ +static int registerlocalvar (LexState *ls, FuncState *fs, TString *varname) { + Proto *f = fs->f; + int oldsize = f->sizelocvars; + luaM_growvector(ls->L, f->locvars, fs->ndebugvars, f->sizelocvars, + LocVar, SHRT_MAX, "local variables"); + while (oldsize < f->sizelocvars) + f->locvars[oldsize++].varname = NULL; + f->locvars[fs->ndebugvars].varname = varname; + f->locvars[fs->ndebugvars].startpc = fs->pc; + luaC_objbarrier(ls->L, f, varname); + return fs->ndebugvars++; +} + + +/* +** Create a new local variable with the given 'name'. Return its index +** in the function. +*/ +static int new_localvar (LexState *ls, TString *name) { + lua_State *L = ls->L; + FuncState *fs = ls->fs; + Dyndata *dyd = ls->dyd; + Vardesc *var; + checklimit(fs, dyd->actvar.n + 1 - fs->firstlocal, + MAXVARS, "local variables"); + luaM_growvector(L, dyd->actvar.arr, dyd->actvar.n + 1, + dyd->actvar.size, Vardesc, SHRT_MAX, "local variables"); + var = &dyd->actvar.arr[dyd->actvar.n++]; + var->vd.kind = VDKREG; /* default */ + var->vd.name = name; + return dyd->actvar.n - 1 - fs->firstlocal; +} + +#define new_localvarliteral(ls,v) \ + new_localvar(ls, \ + luaX_newstring(ls, "" v, (sizeof(v)/sizeof(char)) - 1)); + + + +/* +** Return the "variable description" (Vardesc) of a given variable. +** (Unless noted otherwise, all variables are referred to by their +** compiler indices.) +*/ +static Vardesc *getlocalvardesc (FuncState *fs, int vidx) { + return &fs->ls->dyd->actvar.arr[fs->firstlocal + vidx]; +} + + +/* +** Convert 'nvar', a compiler index level, to its corresponding +** register. For that, search for the highest variable below that level +** that is in a register and uses its register index ('ridx') plus one. +*/ +static int reglevel (FuncState *fs, int nvar) { + while (nvar-- > 0) { + Vardesc *vd = getlocalvardesc(fs, nvar); /* get previous variable */ + if (vd->vd.kind != RDKCTC) /* is in a register? */ + return vd->vd.ridx + 1; + } + return 0; /* no variables in registers */ +} + + +/* +** Return the number of variables in the register stack for the given +** function. +*/ +int luaY_nvarstack (FuncState *fs) { + return reglevel(fs, fs->nactvar); +} + + +/* +** Get the debug-information entry for current variable 'vidx'. +*/ +static LocVar *localdebuginfo (FuncState *fs, int vidx) { + Vardesc *vd = getlocalvardesc(fs, vidx); + if (vd->vd.kind == RDKCTC) + return NULL; /* no debug info. for constants */ + else { + int idx = vd->vd.pidx; + lua_assert(idx < fs->ndebugvars); + return &fs->f->locvars[idx]; + } +} + + +/* +** Create an expression representing variable 'vidx' +*/ +static void init_var (FuncState *fs, expdesc *e, int vidx) { + e->f = e->t = NO_JUMP; + e->k = VLOCAL; + e->u.var.vidx = vidx; + e->u.var.ridx = getlocalvardesc(fs, vidx)->vd.ridx; +} + + +/* +** Raises an error if variable described by 'e' is read only +*/ +static void check_readonly (LexState *ls, expdesc *e) { + FuncState *fs = ls->fs; + TString *varname = NULL; /* to be set if variable is const */ + switch (e->k) { + case VCONST: { + varname = ls->dyd->actvar.arr[e->u.info].vd.name; + break; + } + case VLOCAL: { + Vardesc *vardesc = getlocalvardesc(fs, e->u.var.vidx); + if (vardesc->vd.kind != VDKREG) /* not a regular variable? */ + varname = vardesc->vd.name; + break; + } + case VUPVAL: { + Upvaldesc *up = &fs->f->upvalues[e->u.info]; + if (up->kind != VDKREG) + varname = up->name; + break; + } + default: + return; /* other cases cannot be read-only */ + } + if (varname) { + const char *msg = luaO_pushfstring(ls->L, + "attempt to assign to const variable '%s'", getstr(varname)); + luaK_semerror(ls, msg); /* error */ + } +} + + +/* +** Start the scope for the last 'nvars' created variables. +*/ +static void adjustlocalvars (LexState *ls, int nvars) { + FuncState *fs = ls->fs; + int reglevel = luaY_nvarstack(fs); + int i; + for (i = 0; i < nvars; i++) { + int vidx = fs->nactvar++; + Vardesc *var = getlocalvardesc(fs, vidx); + var->vd.ridx = reglevel++; + var->vd.pidx = registerlocalvar(ls, fs, var->vd.name); + } +} + + +/* +** Close the scope for all variables up to level 'tolevel'. +** (debug info.) +*/ +static void removevars (FuncState *fs, int tolevel) { + fs->ls->dyd->actvar.n -= (fs->nactvar - tolevel); + while (fs->nactvar > tolevel) { + LocVar *var = localdebuginfo(fs, --fs->nactvar); + if (var) /* does it have debug information? */ + var->endpc = fs->pc; + } +} + + +/* +** Search the upvalues of the function 'fs' for one +** with the given 'name'. +*/ +static int searchupvalue (FuncState *fs, TString *name) { + int i; + Upvaldesc *up = fs->f->upvalues; + for (i = 0; i < fs->nups; i++) { + if (eqstr(up[i].name, name)) return i; + } + return -1; /* not found */ +} + + +static Upvaldesc *allocupvalue (FuncState *fs) { + Proto *f = fs->f; + int oldsize = f->sizeupvalues; + checklimit(fs, fs->nups + 1, MAXUPVAL, "upvalues"); + luaM_growvector(fs->ls->L, f->upvalues, fs->nups, f->sizeupvalues, + Upvaldesc, MAXUPVAL, "upvalues"); + while (oldsize < f->sizeupvalues) + f->upvalues[oldsize++].name = NULL; + return &f->upvalues[fs->nups++]; +} + + +static int newupvalue (FuncState *fs, TString *name, expdesc *v) { + Upvaldesc *up = allocupvalue(fs); + FuncState *prev = fs->prev; + if (v->k == VLOCAL) { + up->instack = 1; + up->idx = v->u.var.ridx; + up->kind = getlocalvardesc(prev, v->u.var.vidx)->vd.kind; + lua_assert(eqstr(name, getlocalvardesc(prev, v->u.var.vidx)->vd.name)); + } + else { + up->instack = 0; + up->idx = cast_byte(v->u.info); + up->kind = prev->f->upvalues[v->u.info].kind; + lua_assert(eqstr(name, prev->f->upvalues[v->u.info].name)); + } + up->name = name; + luaC_objbarrier(fs->ls->L, fs->f, name); + return fs->nups - 1; +} + + +/* +** Look for an active local variable with the name 'n' in the +** function 'fs'. If found, initialize 'var' with it and return +** its expression kind; otherwise return -1. +*/ +static int searchvar (FuncState *fs, TString *n, expdesc *var) { + int i; + for (i = cast_int(fs->nactvar) - 1; i >= 0; i--) { + Vardesc *vd = getlocalvardesc(fs, i); + if (eqstr(n, vd->vd.name)) { /* found? */ + if (vd->vd.kind == RDKCTC) /* compile-time constant? */ + init_exp(var, VCONST, fs->firstlocal + i); + else /* real variable */ + init_var(fs, var, i); + return var->k; + } + } + return -1; /* not found */ +} + + +/* +** Mark block where variable at given level was defined +** (to emit close instructions later). +*/ +static void markupval (FuncState *fs, int level) { + BlockCnt *bl = fs->bl; + while (bl->nactvar > level) + bl = bl->previous; + bl->upval = 1; + fs->needclose = 1; +} + + +/* +** Mark that current block has a to-be-closed variable. +*/ +static void marktobeclosed (FuncState *fs) { + BlockCnt *bl = fs->bl; + bl->upval = 1; + bl->insidetbc = 1; + fs->needclose = 1; +} + + +/* +** Find a variable with the given name 'n'. If it is an upvalue, add +** this upvalue into all intermediate functions. If it is a global, set +** 'var' as 'void' as a flag. +*/ +static void singlevaraux (FuncState *fs, TString *n, expdesc *var, int base) { + if (fs == NULL) /* no more levels? */ + init_exp(var, VVOID, 0); /* default is global */ + else { + int v = searchvar(fs, n, var); /* look up locals at current level */ + if (v >= 0) { /* found? */ + if (v == VLOCAL && !base) + markupval(fs, var->u.var.vidx); /* local will be used as an upval */ + } + else { /* not found as local at current level; try upvalues */ + int idx = searchupvalue(fs, n); /* try existing upvalues */ + if (idx < 0) { /* not found? */ + singlevaraux(fs->prev, n, var, 0); /* try upper levels */ + if (var->k == VLOCAL || var->k == VUPVAL) /* local or upvalue? */ + idx = newupvalue(fs, n, var); /* will be a new upvalue */ + else /* it is a global or a constant */ + return; /* don't need to do anything at this level */ + } + init_exp(var, VUPVAL, idx); /* new or old upvalue */ + } + } +} + + +/* +** Find a variable with the given name 'n', handling global variables +** too. +*/ +static void singlevar (LexState *ls, expdesc *var) { + TString *varname = str_checkname(ls); + FuncState *fs = ls->fs; + singlevaraux(fs, varname, var, 1); + if (var->k == VVOID) { /* global name? */ + expdesc key; + singlevaraux(fs, ls->envn, var, 1); /* get environment variable */ + lua_assert(var->k != VVOID); /* this one must exist */ + luaK_exp2anyregup(fs, var); /* but could be a constant */ + codestring(&key, varname); /* key is variable name */ + luaK_indexed(fs, var, &key); /* env[varname] */ + } +} + + +/* +** Adjust the number of results from an expression list 'e' with 'nexps' +** expressions to 'nvars' values. +*/ +static void adjust_assign (LexState *ls, int nvars, int nexps, expdesc *e) { + FuncState *fs = ls->fs; + int needed = nvars - nexps; /* extra values needed */ + if (hasmultret(e->k)) { /* last expression has multiple returns? */ + int extra = needed + 1; /* discount last expression itself */ + if (extra < 0) + extra = 0; + luaK_setreturns(fs, e, extra); /* last exp. provides the difference */ + } + else { + if (e->k != VVOID) /* at least one expression? */ + luaK_exp2nextreg(fs, e); /* close last expression */ + if (needed > 0) /* missing values? */ + luaK_nil(fs, fs->freereg, needed); /* complete with nils */ + } + if (needed > 0) + luaK_reserveregs(fs, needed); /* registers for extra values */ + else /* adding 'needed' is actually a subtraction */ + fs->freereg += needed; /* remove extra values */ +} + + +#define enterlevel(ls) luaE_incCstack(ls->L) + + +#define leavelevel(ls) ((ls)->L->nCcalls--) + + +/* +** Generates an error that a goto jumps into the scope of some +** local variable. +*/ +static l_noret jumpscopeerror (LexState *ls, Labeldesc *gt) { + const char *varname = getstr(getlocalvardesc(ls->fs, gt->nactvar)->vd.name); + const char *msg = "<goto %s> at line %d jumps into the scope of local '%s'"; + msg = luaO_pushfstring(ls->L, msg, getstr(gt->name), gt->line, varname); + luaK_semerror(ls, msg); /* raise the error */ +} + + +/* +** Solves the goto at index 'g' to given 'label' and removes it +** from the list of pending gotos. +** If it jumps into the scope of some variable, raises an error. +*/ +static void solvegoto (LexState *ls, int g, Labeldesc *label) { + int i; + Labellist *gl = &ls->dyd->gt; /* list of gotos */ + Labeldesc *gt = &gl->arr[g]; /* goto to be resolved */ + lua_assert(eqstr(gt->name, label->name)); + if (l_unlikely(gt->nactvar < label->nactvar)) /* enter some scope? */ + jumpscopeerror(ls, gt); + luaK_patchlist(ls->fs, gt->pc, label->pc); + for (i = g; i < gl->n - 1; i++) /* remove goto from pending list */ + gl->arr[i] = gl->arr[i + 1]; + gl->n--; +} + + +/* +** Search for an active label with the given name. +*/ +static Labeldesc *findlabel (LexState *ls, TString *name) { + int i; + Dyndata *dyd = ls->dyd; + /* check labels in current function for a match */ + for (i = ls->fs->firstlabel; i < dyd->label.n; i++) { + Labeldesc *lb = &dyd->label.arr[i]; + if (eqstr(lb->name, name)) /* correct label? */ + return lb; + } + return NULL; /* label not found */ +} + + +/* +** Adds a new label/goto in the corresponding list. +*/ +static int newlabelentry (LexState *ls, Labellist *l, TString *name, + int line, int pc) { + int n = l->n; + luaM_growvector(ls->L, l->arr, n, l->size, + Labeldesc, SHRT_MAX, "labels/gotos"); + l->arr[n].name = name; + l->arr[n].line = line; + l->arr[n].nactvar = ls->fs->nactvar; + l->arr[n].close = 0; + l->arr[n].pc = pc; + l->n = n + 1; + return n; +} + + +static int newgotoentry (LexState *ls, TString *name, int line, int pc) { + return newlabelentry(ls, &ls->dyd->gt, name, line, pc); +} + + +/* +** Solves forward jumps. Check whether new label 'lb' matches any +** pending gotos in current block and solves them. Return true +** if any of the gotos need to close upvalues. +*/ +static int solvegotos (LexState *ls, Labeldesc *lb) { + Labellist *gl = &ls->dyd->gt; + int i = ls->fs->bl->firstgoto; + int needsclose = 0; + while (i < gl->n) { + if (eqstr(gl->arr[i].name, lb->name)) { + needsclose |= gl->arr[i].close; + solvegoto(ls, i, lb); /* will remove 'i' from the list */ + } + else + i++; + } + return needsclose; +} + + +/* +** Create a new label with the given 'name' at the given 'line'. +** 'last' tells whether label is the last non-op statement in its +** block. Solves all pending gotos to this new label and adds +** a close instruction if necessary. +** Returns true iff it added a close instruction. +*/ +static int createlabel (LexState *ls, TString *name, int line, + int last) { + FuncState *fs = ls->fs; + Labellist *ll = &ls->dyd->label; + int l = newlabelentry(ls, ll, name, line, luaK_getlabel(fs)); + if (last) { /* label is last no-op statement in the block? */ + /* assume that locals are already out of scope */ + ll->arr[l].nactvar = fs->bl->nactvar; + } + if (solvegotos(ls, &ll->arr[l])) { /* need close? */ + luaK_codeABC(fs, OP_CLOSE, luaY_nvarstack(fs), 0, 0); + return 1; + } + return 0; +} + + +/* +** Adjust pending gotos to outer level of a block. +*/ +static void movegotosout (FuncState *fs, BlockCnt *bl) { + int i; + Labellist *gl = &fs->ls->dyd->gt; + /* correct pending gotos to current block */ + for (i = bl->firstgoto; i < gl->n; i++) { /* for each pending goto */ + Labeldesc *gt = &gl->arr[i]; + /* leaving a variable scope? */ + if (reglevel(fs, gt->nactvar) > reglevel(fs, bl->nactvar)) + gt->close |= bl->upval; /* jump may need a close */ + gt->nactvar = bl->nactvar; /* update goto level */ + } +} + + +static void enterblock (FuncState *fs, BlockCnt *bl, lu_byte isloop) { + bl->isloop = isloop; + bl->nactvar = fs->nactvar; + bl->firstlabel = fs->ls->dyd->label.n; + bl->firstgoto = fs->ls->dyd->gt.n; + bl->upval = 0; + bl->insidetbc = (fs->bl != NULL && fs->bl->insidetbc); + bl->previous = fs->bl; + fs->bl = bl; + lua_assert(fs->freereg == luaY_nvarstack(fs)); +} + + +/* +** generates an error for an undefined 'goto'. +*/ +static l_noret undefgoto (LexState *ls, Labeldesc *gt) { + const char *msg; + if (eqstr(gt->name, luaS_newliteral(ls->L, "break"))) { + msg = "break outside loop at line %d"; + msg = luaO_pushfstring(ls->L, msg, gt->line); + } + else { + msg = "no visible label '%s' for <goto> at line %d"; + msg = luaO_pushfstring(ls->L, msg, getstr(gt->name), gt->line); + } + luaK_semerror(ls, msg); +} + + +static void leaveblock (FuncState *fs) { + BlockCnt *bl = fs->bl; + LexState *ls = fs->ls; + int hasclose = 0; + int stklevel = reglevel(fs, bl->nactvar); /* level outside the block */ + removevars(fs, bl->nactvar); /* remove block locals */ + lua_assert(bl->nactvar == fs->nactvar); /* back to level on entry */ + if (bl->isloop) /* has to fix pending breaks? */ + hasclose = createlabel(ls, luaS_newliteral(ls->L, "break"), 0, 0); + if (!hasclose && bl->previous && bl->upval) /* still need a 'close'? */ + luaK_codeABC(fs, OP_CLOSE, stklevel, 0, 0); + fs->freereg = stklevel; /* free registers */ + ls->dyd->label.n = bl->firstlabel; /* remove local labels */ + fs->bl = bl->previous; /* current block now is previous one */ + if (bl->previous) /* was it a nested block? */ + movegotosout(fs, bl); /* update pending gotos to enclosing block */ + else { + if (bl->firstgoto < ls->dyd->gt.n) /* still pending gotos? */ + undefgoto(ls, &ls->dyd->gt.arr[bl->firstgoto]); /* error */ + } +} + + +/* +** adds a new prototype into list of prototypes +*/ +static Proto *addprototype (LexState *ls) { + Proto *clp; + lua_State *L = ls->L; + FuncState *fs = ls->fs; + Proto *f = fs->f; /* prototype of current function */ + if (fs->np >= f->sizep) { + int oldsize = f->sizep; + luaM_growvector(L, f->p, fs->np, f->sizep, Proto *, MAXARG_Bx, "functions"); + while (oldsize < f->sizep) + f->p[oldsize++] = NULL; + } + f->p[fs->np++] = clp = luaF_newproto(L); + luaC_objbarrier(L, f, clp); + return clp; +} + + +/* +** codes instruction to create new closure in parent function. +** The OP_CLOSURE instruction uses the last available register, +** so that, if it invokes the GC, the GC knows which registers +** are in use at that time. + +*/ +static void codeclosure (LexState *ls, expdesc *v) { + FuncState *fs = ls->fs->prev; + init_exp(v, VRELOC, luaK_codeABx(fs, OP_CLOSURE, 0, fs->np - 1)); + luaK_exp2nextreg(fs, v); /* fix it at the last register */ +} + + +static void open_func (LexState *ls, FuncState *fs, BlockCnt *bl) { + Proto *f = fs->f; + fs->prev = ls->fs; /* linked list of funcstates */ + fs->ls = ls; + ls->fs = fs; + fs->pc = 0; + fs->previousline = f->linedefined; + fs->iwthabs = 0; + fs->lasttarget = 0; + fs->freereg = 0; + fs->nk = 0; + fs->nabslineinfo = 0; + fs->np = 0; + fs->nups = 0; + fs->ndebugvars = 0; + fs->nactvar = 0; + fs->needclose = 0; + fs->firstlocal = ls->dyd->actvar.n; + fs->firstlabel = ls->dyd->label.n; + fs->bl = NULL; + f->source = ls->source; + luaC_objbarrier(ls->L, f, f->source); + f->maxstacksize = 2; /* registers 0/1 are always valid */ + enterblock(fs, bl, 0); +} + + +static void close_func (LexState *ls) { + lua_State *L = ls->L; + FuncState *fs = ls->fs; + Proto *f = fs->f; + luaK_ret(fs, luaY_nvarstack(fs), 0); /* final return */ + leaveblock(fs); + lua_assert(fs->bl == NULL); + luaK_finish(fs); + luaM_shrinkvector(L, f->code, f->sizecode, fs->pc, Instruction); + luaM_shrinkvector(L, f->lineinfo, f->sizelineinfo, fs->pc, ls_byte); + luaM_shrinkvector(L, f->abslineinfo, f->sizeabslineinfo, + fs->nabslineinfo, AbsLineInfo); + luaM_shrinkvector(L, f->k, f->sizek, fs->nk, TValue); + luaM_shrinkvector(L, f->p, f->sizep, fs->np, Proto *); + luaM_shrinkvector(L, f->locvars, f->sizelocvars, fs->ndebugvars, LocVar); + luaM_shrinkvector(L, f->upvalues, f->sizeupvalues, fs->nups, Upvaldesc); + ls->fs = fs->prev; + luaC_checkGC(L); +} + + + +/*============================================================*/ +/* GRAMMAR RULES */ +/*============================================================*/ + + +/* +** check whether current token is in the follow set of a block. +** 'until' closes syntactical blocks, but do not close scope, +** so it is handled in separate. +*/ +static int block_follow (LexState *ls, int withuntil) { + switch (ls->t.token) { + case TK_ELSE: case TK_ELSEIF: + case TK_END: case TK_EOS: + return 1; + case TK_UNTIL: return withuntil; + default: return 0; + } +} + + +static void statlist (LexState *ls) { + /* statlist -> { stat [';'] } */ + while (!block_follow(ls, 1)) { + if (ls->t.token == TK_RETURN) { + statement(ls); + return; /* 'return' must be last statement */ + } + statement(ls); + } +} + + +static void fieldsel (LexState *ls, expdesc *v) { + /* fieldsel -> ['.' | ':'] NAME */ + FuncState *fs = ls->fs; + expdesc key; + luaK_exp2anyregup(fs, v); + luaX_next(ls); /* skip the dot or colon */ + codename(ls, &key); + luaK_indexed(fs, v, &key); +} + + +static void yindex (LexState *ls, expdesc *v) { + /* index -> '[' expr ']' */ + luaX_next(ls); /* skip the '[' */ + expr(ls, v); + luaK_exp2val(ls->fs, v); + checknext(ls, ']'); +} + + +/* +** {====================================================================== +** Rules for Constructors +** ======================================================================= +*/ + + +typedef struct ConsControl { + expdesc v; /* last list item read */ + expdesc *t; /* table descriptor */ + int nh; /* total number of 'record' elements */ + int na; /* number of array elements already stored */ + int tostore; /* number of array elements pending to be stored */ +} ConsControl; + + +static void recfield (LexState *ls, ConsControl *cc) { + /* recfield -> (NAME | '['exp']') = exp */ + FuncState *fs = ls->fs; + int reg = ls->fs->freereg; + expdesc tab, key, val; + if (ls->t.token == TK_NAME) + codename(ls, &key); + else /* ls->t.token == '[' */ + yindex(ls, &key); + checklimit(fs, cc->nh, MAX_INT, "items in a constructor"); + cc->nh++; + checknext(ls, '='); + tab = *cc->t; + luaK_indexed(fs, &tab, &key); + expr(ls, &val); + luaK_storevar(fs, &tab, &val); + fs->freereg = reg; /* free registers */ +} + + +static void closelistfield (FuncState *fs, ConsControl *cc) { + if (cc->v.k == VVOID) return; /* there is no list item */ + luaK_exp2nextreg(fs, &cc->v); + cc->v.k = VVOID; + if (cc->tostore == LFIELDS_PER_FLUSH) { + luaK_setlist(fs, cc->t->u.info, cc->na, cc->tostore); /* flush */ + cc->na += cc->tostore; + cc->tostore = 0; /* no more items pending */ + } +} + + +static void lastlistfield (FuncState *fs, ConsControl *cc) { + if (cc->tostore == 0) return; + if (hasmultret(cc->v.k)) { + luaK_setmultret(fs, &cc->v); + luaK_setlist(fs, cc->t->u.info, cc->na, LUA_MULTRET); + cc->na--; /* do not count last expression (unknown number of elements) */ + } + else { + if (cc->v.k != VVOID) + luaK_exp2nextreg(fs, &cc->v); + luaK_setlist(fs, cc->t->u.info, cc->na, cc->tostore); + } + cc->na += cc->tostore; +} + + +static void listfield (LexState *ls, ConsControl *cc) { + /* listfield -> exp */ + expr(ls, &cc->v); + cc->tostore++; +} + + +static void field (LexState *ls, ConsControl *cc) { + /* field -> listfield | recfield */ + switch(ls->t.token) { + case TK_NAME: { /* may be 'listfield' or 'recfield' */ + if (luaX_lookahead(ls) != '=') /* expression? */ + listfield(ls, cc); + else + recfield(ls, cc); + break; + } + case '[': { + recfield(ls, cc); + break; + } + default: { + listfield(ls, cc); + break; + } + } +} + + +static void constructor (LexState *ls, expdesc *t) { + /* constructor -> '{' [ field { sep field } [sep] ] '}' + sep -> ',' | ';' */ + FuncState *fs = ls->fs; + int line = ls->linenumber; + int pc = luaK_codeABC(fs, OP_NEWTABLE, 0, 0, 0); + ConsControl cc; + luaK_code(fs, 0); /* space for extra arg. */ + cc.na = cc.nh = cc.tostore = 0; + cc.t = t; + init_exp(t, VNONRELOC, fs->freereg); /* table will be at stack top */ + luaK_reserveregs(fs, 1); + init_exp(&cc.v, VVOID, 0); /* no value (yet) */ + checknext(ls, '{'); + do { + lua_assert(cc.v.k == VVOID || cc.tostore > 0); + if (ls->t.token == '}') break; + closelistfield(fs, &cc); + field(ls, &cc); + } while (testnext(ls, ',') || testnext(ls, ';')); + check_match(ls, '}', '{', line); + lastlistfield(fs, &cc); + luaK_settablesize(fs, pc, t->u.info, cc.na, cc.nh); +} + +/* }====================================================================== */ + + +static void setvararg (FuncState *fs, int nparams) { + fs->f->is_vararg = 1; + luaK_codeABC(fs, OP_VARARGPREP, nparams, 0, 0); +} + + +static void parlist (LexState *ls) { + /* parlist -> [ {NAME ','} (NAME | '...') ] */ + FuncState *fs = ls->fs; + Proto *f = fs->f; + int nparams = 0; + int isvararg = 0; + if (ls->t.token != ')') { /* is 'parlist' not empty? */ + do { + switch (ls->t.token) { + case TK_NAME: { + new_localvar(ls, str_checkname(ls)); + nparams++; + break; + } + case TK_DOTS: { + luaX_next(ls); + isvararg = 1; + break; + } + default: luaX_syntaxerror(ls, "<name> or '...' expected"); + } + } while (!isvararg && testnext(ls, ',')); + } + adjustlocalvars(ls, nparams); + f->numparams = cast_byte(fs->nactvar); + if (isvararg) + setvararg(fs, f->numparams); /* declared vararg */ + luaK_reserveregs(fs, fs->nactvar); /* reserve registers for parameters */ +} + + +static void body (LexState *ls, expdesc *e, int ismethod, int line) { + /* body -> '(' parlist ')' block END */ + FuncState new_fs; + BlockCnt bl; + new_fs.f = addprototype(ls); + new_fs.f->linedefined = line; + open_func(ls, &new_fs, &bl); + checknext(ls, '('); + if (ismethod) { + new_localvarliteral(ls, "self"); /* create 'self' parameter */ + adjustlocalvars(ls, 1); + } + parlist(ls); + checknext(ls, ')'); + statlist(ls); + new_fs.f->lastlinedefined = ls->linenumber; + check_match(ls, TK_END, TK_FUNCTION, line); + codeclosure(ls, e); + close_func(ls); +} + + +static int explist (LexState *ls, expdesc *v) { + /* explist -> expr { ',' expr } */ + int n = 1; /* at least one expression */ + expr(ls, v); + while (testnext(ls, ',')) { + luaK_exp2nextreg(ls->fs, v); + expr(ls, v); + n++; + } + return n; +} + + +static void funcargs (LexState *ls, expdesc *f) { + FuncState *fs = ls->fs; + expdesc args; + int base, nparams; + int line = ls->linenumber; + switch (ls->t.token) { + case '(': { /* funcargs -> '(' [ explist ] ')' */ + luaX_next(ls); + if (ls->t.token == ')') /* arg list is empty? */ + args.k = VVOID; + else { + explist(ls, &args); + if (hasmultret(args.k)) + luaK_setmultret(fs, &args); + } + check_match(ls, ')', '(', line); + break; + } + case '{': { /* funcargs -> constructor */ + constructor(ls, &args); + break; + } + case TK_STRING: { /* funcargs -> STRING */ + codestring(&args, ls->t.seminfo.ts); + luaX_next(ls); /* must use 'seminfo' before 'next' */ + break; + } + default: { + luaX_syntaxerror(ls, "function arguments expected"); + } + } + lua_assert(f->k == VNONRELOC); + base = f->u.info; /* base register for call */ + if (hasmultret(args.k)) + nparams = LUA_MULTRET; /* open call */ + else { + if (args.k != VVOID) + luaK_exp2nextreg(fs, &args); /* close last argument */ + nparams = fs->freereg - (base+1); + } + init_exp(f, VCALL, luaK_codeABC(fs, OP_CALL, base, nparams+1, 2)); + luaK_fixline(fs, line); + fs->freereg = base+1; /* call removes function and arguments and leaves + one result (unless changed later) */ +} + + + + +/* +** {====================================================================== +** Expression parsing +** ======================================================================= +*/ + + +static void primaryexp (LexState *ls, expdesc *v) { + /* primaryexp -> NAME | '(' expr ')' */ + switch (ls->t.token) { + case '(': { + int line = ls->linenumber; + luaX_next(ls); + expr(ls, v); + check_match(ls, ')', '(', line); + luaK_dischargevars(ls->fs, v); + return; + } + case TK_NAME: { + singlevar(ls, v); + return; + } + default: { + luaX_syntaxerror(ls, "unexpected symbol"); + } + } +} + + +static void suffixedexp (LexState *ls, expdesc *v) { + /* suffixedexp -> + primaryexp { '.' NAME | '[' exp ']' | ':' NAME funcargs | funcargs } */ + FuncState *fs = ls->fs; + primaryexp(ls, v); + for (;;) { + switch (ls->t.token) { + case '.': { /* fieldsel */ + fieldsel(ls, v); + break; + } + case '[': { /* '[' exp ']' */ + expdesc key; + luaK_exp2anyregup(fs, v); + yindex(ls, &key); + luaK_indexed(fs, v, &key); + break; + } + case ':': { /* ':' NAME funcargs */ + expdesc key; + luaX_next(ls); + codename(ls, &key); + luaK_self(fs, v, &key); + funcargs(ls, v); + break; + } + case '(': case TK_STRING: case '{': { /* funcargs */ + luaK_exp2nextreg(fs, v); + funcargs(ls, v); + break; + } + default: return; + } + } +} + + +static void simpleexp (LexState *ls, expdesc *v) { + /* simpleexp -> FLT | INT | STRING | NIL | TRUE | FALSE | ... | + constructor | FUNCTION body | suffixedexp */ + switch (ls->t.token) { + case TK_FLT: { + init_exp(v, VKFLT, 0); + v->u.nval = ls->t.seminfo.r; + break; + } + case TK_INT: { + init_exp(v, VKINT, 0); + v->u.ival = ls->t.seminfo.i; + break; + } + case TK_STRING: { + codestring(v, ls->t.seminfo.ts); + break; + } + case TK_NIL: { + init_exp(v, VNIL, 0); + break; + } + case TK_TRUE: { + init_exp(v, VTRUE, 0); + break; + } + case TK_FALSE: { + init_exp(v, VFALSE, 0); + break; + } + case TK_DOTS: { /* vararg */ + FuncState *fs = ls->fs; + check_condition(ls, fs->f->is_vararg, + "cannot use '...' outside a vararg function"); + init_exp(v, VVARARG, luaK_codeABC(fs, OP_VARARG, 0, 0, 1)); + break; + } + case '{': { /* constructor */ + constructor(ls, v); + return; + } + case TK_FUNCTION: { + luaX_next(ls); + body(ls, v, 0, ls->linenumber); + return; + } + default: { + suffixedexp(ls, v); + return; + } + } + luaX_next(ls); +} + + +static UnOpr getunopr (int op) { + switch (op) { + case TK_NOT: return OPR_NOT; + case '-': return OPR_MINUS; + case '~': return OPR_BNOT; + case '#': return OPR_LEN; + default: return OPR_NOUNOPR; + } +} + + +static BinOpr getbinopr (int op) { + switch (op) { + case '+': return OPR_ADD; + case '-': return OPR_SUB; + case '*': return OPR_MUL; + case '%': return OPR_MOD; + case '^': return OPR_POW; + case '/': return OPR_DIV; + case TK_IDIV: return OPR_IDIV; + case '&': return OPR_BAND; + case '|': return OPR_BOR; + case '~': return OPR_BXOR; + case TK_SHL: return OPR_SHL; + case TK_SHR: return OPR_SHR; + case TK_CONCAT: return OPR_CONCAT; + case TK_NE: return OPR_NE; + case TK_EQ: return OPR_EQ; + case '<': return OPR_LT; + case TK_LE: return OPR_LE; + case '>': return OPR_GT; + case TK_GE: return OPR_GE; + case TK_AND: return OPR_AND; + case TK_OR: return OPR_OR; + default: return OPR_NOBINOPR; + } +} + + +/* +** Priority table for binary operators. +*/ +static const struct { + lu_byte left; /* left priority for each binary operator */ + lu_byte right; /* right priority */ +} priority[] = { /* ORDER OPR */ + {10, 10}, {10, 10}, /* '+' '-' */ + {11, 11}, {11, 11}, /* '*' '%' */ + {14, 13}, /* '^' (right associative) */ + {11, 11}, {11, 11}, /* '/' '//' */ + {6, 6}, {4, 4}, {5, 5}, /* '&' '|' '~' */ + {7, 7}, {7, 7}, /* '<<' '>>' */ + {9, 8}, /* '..' (right associative) */ + {3, 3}, {3, 3}, {3, 3}, /* ==, <, <= */ + {3, 3}, {3, 3}, {3, 3}, /* ~=, >, >= */ + {2, 2}, {1, 1} /* and, or */ +}; + +#define UNARY_PRIORITY 12 /* priority for unary operators */ + + +/* +** subexpr -> (simpleexp | unop subexpr) { binop subexpr } +** where 'binop' is any binary operator with a priority higher than 'limit' +*/ +static BinOpr subexpr (LexState *ls, expdesc *v, int limit) { + BinOpr op; + UnOpr uop; + enterlevel(ls); + uop = getunopr(ls->t.token); + if (uop != OPR_NOUNOPR) { /* prefix (unary) operator? */ + int line = ls->linenumber; + luaX_next(ls); /* skip operator */ + subexpr(ls, v, UNARY_PRIORITY); + luaK_prefix(ls->fs, uop, v, line); + } + else simpleexp(ls, v); + /* expand while operators have priorities higher than 'limit' */ + op = getbinopr(ls->t.token); + while (op != OPR_NOBINOPR && priority[op].left > limit) { + expdesc v2; + BinOpr nextop; + int line = ls->linenumber; + luaX_next(ls); /* skip operator */ + luaK_infix(ls->fs, op, v); + /* read sub-expression with higher priority */ + nextop = subexpr(ls, &v2, priority[op].right); + luaK_posfix(ls->fs, op, v, &v2, line); + op = nextop; + } + leavelevel(ls); + return op; /* return first untreated operator */ +} + + +static void expr (LexState *ls, expdesc *v) { + subexpr(ls, v, 0); +} + +/* }==================================================================== */ + + + +/* +** {====================================================================== +** Rules for Statements +** ======================================================================= +*/ + + +static void block (LexState *ls) { + /* block -> statlist */ + FuncState *fs = ls->fs; + BlockCnt bl; + enterblock(fs, &bl, 0); + statlist(ls); + leaveblock(fs); +} + + +/* +** structure to chain all variables in the left-hand side of an +** assignment +*/ +struct LHS_assign { + struct LHS_assign *prev; + expdesc v; /* variable (global, local, upvalue, or indexed) */ +}; + + +/* +** check whether, in an assignment to an upvalue/local variable, the +** upvalue/local variable is begin used in a previous assignment to a +** table. If so, save original upvalue/local value in a safe place and +** use this safe copy in the previous assignment. +*/ +static void check_conflict (LexState *ls, struct LHS_assign *lh, expdesc *v) { + FuncState *fs = ls->fs; + int extra = fs->freereg; /* eventual position to save local variable */ + int conflict = 0; + for (; lh; lh = lh->prev) { /* check all previous assignments */ + if (vkisindexed(lh->v.k)) { /* assignment to table field? */ + if (lh->v.k == VINDEXUP) { /* is table an upvalue? */ + if (v->k == VUPVAL && lh->v.u.ind.t == v->u.info) { + conflict = 1; /* table is the upvalue being assigned now */ + lh->v.k = VINDEXSTR; + lh->v.u.ind.t = extra; /* assignment will use safe copy */ + } + } + else { /* table is a register */ + if (v->k == VLOCAL && lh->v.u.ind.t == v->u.var.ridx) { + conflict = 1; /* table is the local being assigned now */ + lh->v.u.ind.t = extra; /* assignment will use safe copy */ + } + /* is index the local being assigned? */ + if (lh->v.k == VINDEXED && v->k == VLOCAL && + lh->v.u.ind.idx == v->u.var.ridx) { + conflict = 1; + lh->v.u.ind.idx = extra; /* previous assignment will use safe copy */ + } + } + } + } + if (conflict) { + /* copy upvalue/local value to a temporary (in position 'extra') */ + if (v->k == VLOCAL) + luaK_codeABC(fs, OP_MOVE, extra, v->u.var.ridx, 0); + else + luaK_codeABC(fs, OP_GETUPVAL, extra, v->u.info, 0); + luaK_reserveregs(fs, 1); + } +} + +/* +** Parse and compile a multiple assignment. The first "variable" +** (a 'suffixedexp') was already read by the caller. +** +** assignment -> suffixedexp restassign +** restassign -> ',' suffixedexp restassign | '=' explist +*/ +static void restassign (LexState *ls, struct LHS_assign *lh, int nvars) { + expdesc e; + check_condition(ls, vkisvar(lh->v.k), "syntax error"); + check_readonly(ls, &lh->v); + if (testnext(ls, ',')) { /* restassign -> ',' suffixedexp restassign */ + struct LHS_assign nv; + nv.prev = lh; + suffixedexp(ls, &nv.v); + if (!vkisindexed(nv.v.k)) + check_conflict(ls, lh, &nv.v); + enterlevel(ls); /* control recursion depth */ + restassign(ls, &nv, nvars+1); + leavelevel(ls); + } + else { /* restassign -> '=' explist */ + int nexps; + checknext(ls, '='); + nexps = explist(ls, &e); + if (nexps != nvars) + adjust_assign(ls, nvars, nexps, &e); + else { + luaK_setoneret(ls->fs, &e); /* close last expression */ + luaK_storevar(ls->fs, &lh->v, &e); + return; /* avoid default */ + } + } + init_exp(&e, VNONRELOC, ls->fs->freereg-1); /* default assignment */ + luaK_storevar(ls->fs, &lh->v, &e); +} + + +static int cond (LexState *ls) { + /* cond -> exp */ + expdesc v; + expr(ls, &v); /* read condition */ + if (v.k == VNIL) v.k = VFALSE; /* 'falses' are all equal here */ + luaK_goiftrue(ls->fs, &v); + return v.f; +} + + +static void gotostat (LexState *ls) { + FuncState *fs = ls->fs; + int line = ls->linenumber; + TString *name = str_checkname(ls); /* label's name */ + Labeldesc *lb = findlabel(ls, name); + if (lb == NULL) /* no label? */ + /* forward jump; will be resolved when the label is declared */ + newgotoentry(ls, name, line, luaK_jump(fs)); + else { /* found a label */ + /* backward jump; will be resolved here */ + int lblevel = reglevel(fs, lb->nactvar); /* label level */ + if (luaY_nvarstack(fs) > lblevel) /* leaving the scope of a variable? */ + luaK_codeABC(fs, OP_CLOSE, lblevel, 0, 0); + /* create jump and link it to the label */ + luaK_patchlist(fs, luaK_jump(fs), lb->pc); + } +} + + +/* +** Break statement. Semantically equivalent to "goto break". +*/ +static void breakstat (LexState *ls) { + int line = ls->linenumber; + luaX_next(ls); /* skip break */ + newgotoentry(ls, luaS_newliteral(ls->L, "break"), line, luaK_jump(ls->fs)); +} + + +/* +** Check whether there is already a label with the given 'name'. +*/ +static void checkrepeated (LexState *ls, TString *name) { + Labeldesc *lb = findlabel(ls, name); + if (l_unlikely(lb != NULL)) { /* already defined? */ + const char *msg = "label '%s' already defined on line %d"; + msg = luaO_pushfstring(ls->L, msg, getstr(name), lb->line); + luaK_semerror(ls, msg); /* error */ + } +} + + +static void labelstat (LexState *ls, TString *name, int line) { + /* label -> '::' NAME '::' */ + checknext(ls, TK_DBCOLON); /* skip double colon */ + while (ls->t.token == ';' || ls->t.token == TK_DBCOLON) + statement(ls); /* skip other no-op statements */ + checkrepeated(ls, name); /* check for repeated labels */ + createlabel(ls, name, line, block_follow(ls, 0)); +} + + +static void whilestat (LexState *ls, int line) { + /* whilestat -> WHILE cond DO block END */ + FuncState *fs = ls->fs; + int whileinit; + int condexit; + BlockCnt bl; + luaX_next(ls); /* skip WHILE */ + whileinit = luaK_getlabel(fs); + condexit = cond(ls); + enterblock(fs, &bl, 1); + checknext(ls, TK_DO); + block(ls); + luaK_jumpto(fs, whileinit); + check_match(ls, TK_END, TK_WHILE, line); + leaveblock(fs); + luaK_patchtohere(fs, condexit); /* false conditions finish the loop */ +} + + +static void repeatstat (LexState *ls, int line) { + /* repeatstat -> REPEAT block UNTIL cond */ + int condexit; + FuncState *fs = ls->fs; + int repeat_init = luaK_getlabel(fs); + BlockCnt bl1, bl2; + enterblock(fs, &bl1, 1); /* loop block */ + enterblock(fs, &bl2, 0); /* scope block */ + luaX_next(ls); /* skip REPEAT */ + statlist(ls); + check_match(ls, TK_UNTIL, TK_REPEAT, line); + condexit = cond(ls); /* read condition (inside scope block) */ + leaveblock(fs); /* finish scope */ + if (bl2.upval) { /* upvalues? */ + int exit = luaK_jump(fs); /* normal exit must jump over fix */ + luaK_patchtohere(fs, condexit); /* repetition must close upvalues */ + luaK_codeABC(fs, OP_CLOSE, reglevel(fs, bl2.nactvar), 0, 0); + condexit = luaK_jump(fs); /* repeat after closing upvalues */ + luaK_patchtohere(fs, exit); /* normal exit comes to here */ + } + luaK_patchlist(fs, condexit, repeat_init); /* close the loop */ + leaveblock(fs); /* finish loop */ +} + + +/* +** Read an expression and generate code to put its results in next +** stack slot. +** +*/ +static void exp1 (LexState *ls) { + expdesc e; + expr(ls, &e); + luaK_exp2nextreg(ls->fs, &e); + lua_assert(e.k == VNONRELOC); +} + + +/* +** Fix for instruction at position 'pc' to jump to 'dest'. +** (Jump addresses are relative in Lua). 'back' true means +** a back jump. +*/ +static void fixforjump (FuncState *fs, int pc, int dest, int back) { + Instruction *jmp = &fs->f->code[pc]; + int offset = dest - (pc + 1); + if (back) + offset = -offset; + if (l_unlikely(offset > MAXARG_Bx)) + luaX_syntaxerror(fs->ls, "control structure too long"); + SETARG_Bx(*jmp, offset); +} + + +/* +** Generate code for a 'for' loop. +*/ +static void forbody (LexState *ls, int base, int line, int nvars, int isgen) { + /* forbody -> DO block */ + static const OpCode forprep[2] = {OP_FORPREP, OP_TFORPREP}; + static const OpCode forloop[2] = {OP_FORLOOP, OP_TFORLOOP}; + BlockCnt bl; + FuncState *fs = ls->fs; + int prep, endfor; + checknext(ls, TK_DO); + prep = luaK_codeABx(fs, forprep[isgen], base, 0); + enterblock(fs, &bl, 0); /* scope for declared variables */ + adjustlocalvars(ls, nvars); + luaK_reserveregs(fs, nvars); + block(ls); + leaveblock(fs); /* end of scope for declared variables */ + fixforjump(fs, prep, luaK_getlabel(fs), 0); + if (isgen) { /* generic for? */ + luaK_codeABC(fs, OP_TFORCALL, base, 0, nvars); + luaK_fixline(fs, line); + } + endfor = luaK_codeABx(fs, forloop[isgen], base, 0); + fixforjump(fs, endfor, prep + 1, 1); + luaK_fixline(fs, line); +} + + +static void fornum (LexState *ls, TString *varname, int line) { + /* fornum -> NAME = exp,exp[,exp] forbody */ + FuncState *fs = ls->fs; + int base = fs->freereg; + new_localvarliteral(ls, "(for state)"); + new_localvarliteral(ls, "(for state)"); + new_localvarliteral(ls, "(for state)"); + new_localvar(ls, varname); + checknext(ls, '='); + exp1(ls); /* initial value */ + checknext(ls, ','); + exp1(ls); /* limit */ + if (testnext(ls, ',')) + exp1(ls); /* optional step */ + else { /* default step = 1 */ + luaK_int(fs, fs->freereg, 1); + luaK_reserveregs(fs, 1); + } + adjustlocalvars(ls, 3); /* control variables */ + forbody(ls, base, line, 1, 0); +} + + +static void forlist (LexState *ls, TString *indexname) { + /* forlist -> NAME {,NAME} IN explist forbody */ + FuncState *fs = ls->fs; + expdesc e; + int nvars = 5; /* gen, state, control, toclose, 'indexname' */ + int line; + int base = fs->freereg; + /* create control variables */ + new_localvarliteral(ls, "(for state)"); + new_localvarliteral(ls, "(for state)"); + new_localvarliteral(ls, "(for state)"); + new_localvarliteral(ls, "(for state)"); + /* create declared variables */ + new_localvar(ls, indexname); + while (testnext(ls, ',')) { + new_localvar(ls, str_checkname(ls)); + nvars++; + } + checknext(ls, TK_IN); + line = ls->linenumber; + adjust_assign(ls, 4, explist(ls, &e), &e); + adjustlocalvars(ls, 4); /* control variables */ + marktobeclosed(fs); /* last control var. must be closed */ + luaK_checkstack(fs, 3); /* extra space to call generator */ + forbody(ls, base, line, nvars - 4, 1); +} + + +static void forstat (LexState *ls, int line) { + /* forstat -> FOR (fornum | forlist) END */ + FuncState *fs = ls->fs; + TString *varname; + BlockCnt bl; + enterblock(fs, &bl, 1); /* scope for loop and control variables */ + luaX_next(ls); /* skip 'for' */ + varname = str_checkname(ls); /* first variable name */ + switch (ls->t.token) { + case '=': fornum(ls, varname, line); break; + case ',': case TK_IN: forlist(ls, varname); break; + default: luaX_syntaxerror(ls, "'=' or 'in' expected"); + } + check_match(ls, TK_END, TK_FOR, line); + leaveblock(fs); /* loop scope ('break' jumps to this point) */ +} + + +static void test_then_block (LexState *ls, int *escapelist) { + /* test_then_block -> [IF | ELSEIF] cond THEN block */ + BlockCnt bl; + FuncState *fs = ls->fs; + expdesc v; + int jf; /* instruction to skip 'then' code (if condition is false) */ + luaX_next(ls); /* skip IF or ELSEIF */ + expr(ls, &v); /* read condition */ + checknext(ls, TK_THEN); + if (ls->t.token == TK_BREAK) { /* 'if x then break' ? */ + int line = ls->linenumber; + luaK_goiffalse(ls->fs, &v); /* will jump if condition is true */ + luaX_next(ls); /* skip 'break' */ + enterblock(fs, &bl, 0); /* must enter block before 'goto' */ + newgotoentry(ls, luaS_newliteral(ls->L, "break"), line, v.t); + while (testnext(ls, ';')) {} /* skip semicolons */ + if (block_follow(ls, 0)) { /* jump is the entire block? */ + leaveblock(fs); + return; /* and that is it */ + } + else /* must skip over 'then' part if condition is false */ + jf = luaK_jump(fs); + } + else { /* regular case (not a break) */ + luaK_goiftrue(ls->fs, &v); /* skip over block if condition is false */ + enterblock(fs, &bl, 0); + jf = v.f; + } + statlist(ls); /* 'then' part */ + leaveblock(fs); + if (ls->t.token == TK_ELSE || + ls->t.token == TK_ELSEIF) /* followed by 'else'/'elseif'? */ + luaK_concat(fs, escapelist, luaK_jump(fs)); /* must jump over it */ + luaK_patchtohere(fs, jf); +} + + +static void ifstat (LexState *ls, int line) { + /* ifstat -> IF cond THEN block {ELSEIF cond THEN block} [ELSE block] END */ + FuncState *fs = ls->fs; + int escapelist = NO_JUMP; /* exit list for finished parts */ + test_then_block(ls, &escapelist); /* IF cond THEN block */ + while (ls->t.token == TK_ELSEIF) + test_then_block(ls, &escapelist); /* ELSEIF cond THEN block */ + if (testnext(ls, TK_ELSE)) + block(ls); /* 'else' part */ + check_match(ls, TK_END, TK_IF, line); + luaK_patchtohere(fs, escapelist); /* patch escape list to 'if' end */ +} + + +static void localfunc (LexState *ls) { + expdesc b; + FuncState *fs = ls->fs; + int fvar = fs->nactvar; /* function's variable index */ + new_localvar(ls, str_checkname(ls)); /* new local variable */ + adjustlocalvars(ls, 1); /* enter its scope */ + body(ls, &b, 0, ls->linenumber); /* function created in next register */ + /* debug information will only see the variable after this point! */ + localdebuginfo(fs, fvar)->startpc = fs->pc; +} + + +static int getlocalattribute (LexState *ls) { + /* ATTRIB -> ['<' Name '>'] */ + if (testnext(ls, '<')) { + const char *attr = getstr(str_checkname(ls)); + checknext(ls, '>'); + if (strcmp(attr, "const") == 0) + return RDKCONST; /* read-only variable */ + else if (strcmp(attr, "close") == 0) + return RDKTOCLOSE; /* to-be-closed variable */ + else + luaK_semerror(ls, + luaO_pushfstring(ls->L, "unknown attribute '%s'", attr)); + } + return VDKREG; /* regular variable */ +} + + +static void checktoclose (FuncState *fs, int level) { + if (level != -1) { /* is there a to-be-closed variable? */ + marktobeclosed(fs); + luaK_codeABC(fs, OP_TBC, reglevel(fs, level), 0, 0); + } +} + + +static void localstat (LexState *ls) { + /* stat -> LOCAL NAME ATTRIB { ',' NAME ATTRIB } ['=' explist] */ + FuncState *fs = ls->fs; + int toclose = -1; /* index of to-be-closed variable (if any) */ + Vardesc *var; /* last variable */ + int vidx, kind; /* index and kind of last variable */ + int nvars = 0; + int nexps; + expdesc e; + do { + vidx = new_localvar(ls, str_checkname(ls)); + kind = getlocalattribute(ls); + getlocalvardesc(fs, vidx)->vd.kind = kind; + if (kind == RDKTOCLOSE) { /* to-be-closed? */ + if (toclose != -1) /* one already present? */ + luaK_semerror(ls, "multiple to-be-closed variables in local list"); + toclose = fs->nactvar + nvars; + } + nvars++; + } while (testnext(ls, ',')); + if (testnext(ls, '=')) + nexps = explist(ls, &e); + else { + e.k = VVOID; + nexps = 0; + } + var = getlocalvardesc(fs, vidx); /* get last variable */ + if (nvars == nexps && /* no adjustments? */ + var->vd.kind == RDKCONST && /* last variable is const? */ + luaK_exp2const(fs, &e, &var->k)) { /* compile-time constant? */ + var->vd.kind = RDKCTC; /* variable is a compile-time constant */ + adjustlocalvars(ls, nvars - 1); /* exclude last variable */ + fs->nactvar++; /* but count it */ + } + else { + adjust_assign(ls, nvars, nexps, &e); + adjustlocalvars(ls, nvars); + } + checktoclose(fs, toclose); +} + + +static int funcname (LexState *ls, expdesc *v) { + /* funcname -> NAME {fieldsel} [':' NAME] */ + int ismethod = 0; + singlevar(ls, v); + while (ls->t.token == '.') + fieldsel(ls, v); + if (ls->t.token == ':') { + ismethod = 1; + fieldsel(ls, v); + } + return ismethod; +} + + +static void funcstat (LexState *ls, int line) { + /* funcstat -> FUNCTION funcname body */ + int ismethod; + expdesc v, b; + luaX_next(ls); /* skip FUNCTION */ + ismethod = funcname(ls, &v); + body(ls, &b, ismethod, line); + check_readonly(ls, &v); + luaK_storevar(ls->fs, &v, &b); + luaK_fixline(ls->fs, line); /* definition "happens" in the first line */ +} + + +static void exprstat (LexState *ls) { + /* stat -> func | assignment */ + FuncState *fs = ls->fs; + struct LHS_assign v; + suffixedexp(ls, &v.v); + if (ls->t.token == '=' || ls->t.token == ',') { /* stat -> assignment ? */ + v.prev = NULL; + restassign(ls, &v, 1); + } + else { /* stat -> func */ + Instruction *inst; + check_condition(ls, v.v.k == VCALL, "syntax error"); + inst = &getinstruction(fs, &v.v); + SETARG_C(*inst, 1); /* call statement uses no results */ + } +} + + +static void retstat (LexState *ls) { + /* stat -> RETURN [explist] [';'] */ + FuncState *fs = ls->fs; + expdesc e; + int nret; /* number of values being returned */ + int first = luaY_nvarstack(fs); /* first slot to be returned */ + if (block_follow(ls, 1) || ls->t.token == ';') + nret = 0; /* return no values */ + else { + nret = explist(ls, &e); /* optional return values */ + if (hasmultret(e.k)) { + luaK_setmultret(fs, &e); + if (e.k == VCALL && nret == 1 && !fs->bl->insidetbc) { /* tail call? */ + SET_OPCODE(getinstruction(fs,&e), OP_TAILCALL); + lua_assert(GETARG_A(getinstruction(fs,&e)) == luaY_nvarstack(fs)); + } + nret = LUA_MULTRET; /* return all values */ + } + else { + if (nret == 1) /* only one single value? */ + first = luaK_exp2anyreg(fs, &e); /* can use original slot */ + else { /* values must go to the top of the stack */ + luaK_exp2nextreg(fs, &e); + lua_assert(nret == fs->freereg - first); + } + } + } + luaK_ret(fs, first, nret); + testnext(ls, ';'); /* skip optional semicolon */ +} + + +static void statement (LexState *ls) { + int line = ls->linenumber; /* may be needed for error messages */ + enterlevel(ls); + switch (ls->t.token) { + case ';': { /* stat -> ';' (empty statement) */ + luaX_next(ls); /* skip ';' */ + break; + } + case TK_IF: { /* stat -> ifstat */ + ifstat(ls, line); + break; + } + case TK_WHILE: { /* stat -> whilestat */ + whilestat(ls, line); + break; + } + case TK_DO: { /* stat -> DO block END */ + luaX_next(ls); /* skip DO */ + block(ls); + check_match(ls, TK_END, TK_DO, line); + break; + } + case TK_FOR: { /* stat -> forstat */ + forstat(ls, line); + break; + } + case TK_REPEAT: { /* stat -> repeatstat */ + repeatstat(ls, line); + break; + } + case TK_FUNCTION: { /* stat -> funcstat */ + funcstat(ls, line); + break; + } + case TK_LOCAL: { /* stat -> localstat */ + luaX_next(ls); /* skip LOCAL */ + if (testnext(ls, TK_FUNCTION)) /* local function? */ + localfunc(ls); + else + localstat(ls); + break; + } + case TK_DBCOLON: { /* stat -> label */ + luaX_next(ls); /* skip double colon */ + labelstat(ls, str_checkname(ls), line); + break; + } + case TK_RETURN: { /* stat -> retstat */ + luaX_next(ls); /* skip RETURN */ + retstat(ls); + break; + } + case TK_BREAK: { /* stat -> breakstat */ + breakstat(ls); + break; + } + case TK_GOTO: { /* stat -> 'goto' NAME */ + luaX_next(ls); /* skip 'goto' */ + gotostat(ls); + break; + } + default: { /* stat -> func | assignment */ + exprstat(ls); + break; + } + } + lua_assert(ls->fs->f->maxstacksize >= ls->fs->freereg && + ls->fs->freereg >= luaY_nvarstack(ls->fs)); + ls->fs->freereg = luaY_nvarstack(ls->fs); /* free registers */ + leavelevel(ls); +} + +/* }====================================================================== */ + + +/* +** compiles the main function, which is a regular vararg function with an +** upvalue named LUA_ENV +*/ +static void mainfunc (LexState *ls, FuncState *fs) { + BlockCnt bl; + Upvaldesc *env; + open_func(ls, fs, &bl); + setvararg(fs, 0); /* main function is always declared vararg */ + env = allocupvalue(fs); /* ...set environment upvalue */ + env->instack = 1; + env->idx = 0; + env->kind = VDKREG; + env->name = ls->envn; + luaC_objbarrier(ls->L, fs->f, env->name); + luaX_next(ls); /* read first token */ + statlist(ls); /* parse main body */ + check(ls, TK_EOS); + close_func(ls); +} + + +LClosure *luaY_parser (lua_State *L, ZIO *z, Mbuffer *buff, + Dyndata *dyd, const char *name, int firstchar) { + LexState lexstate; + FuncState funcstate; + LClosure *cl = luaF_newLclosure(L, 1); /* create main closure */ + setclLvalue2s(L, L->top.p, cl); /* anchor it (to avoid being collected) */ + luaD_inctop(L); + lexstate.h = luaH_new(L); /* create table for scanner */ + sethvalue2s(L, L->top.p, lexstate.h); /* anchor it */ + luaD_inctop(L); + funcstate.f = cl->p = luaF_newproto(L); + luaC_objbarrier(L, cl, cl->p); + funcstate.f->source = luaS_new(L, name); /* create and anchor TString */ + luaC_objbarrier(L, funcstate.f, funcstate.f->source); + lexstate.buff = buff; + lexstate.dyd = dyd; + dyd->actvar.n = dyd->gt.n = dyd->label.n = 0; + luaX_setinput(L, &lexstate, z, funcstate.f->source, firstchar); + mainfunc(&lexstate, &funcstate); + lua_assert(!funcstate.prev && funcstate.nups == 1 && !lexstate.fs); + /* all scopes should be correctly finished */ + lua_assert(dyd->actvar.n == 0 && dyd->gt.n == 0 && dyd->label.n == 0); + L->top.p--; /* remove scanner's table */ + return cl; /* closure is on the stack, too */ +} + diff --git a/vendor/lua-5.4.8/src/lparser.h b/vendor/lua-5.4.8/src/lparser.h new file mode 100644 index 0000000..5e4500f --- /dev/null +++ b/vendor/lua-5.4.8/src/lparser.h @@ -0,0 +1,171 @@ +/* +** $Id: lparser.h $ +** Lua Parser +** See Copyright Notice in lua.h +*/ + +#ifndef lparser_h +#define lparser_h + +#include "llimits.h" +#include "lobject.h" +#include "lzio.h" + + +/* +** Expression and variable descriptor. +** Code generation for variables and expressions can be delayed to allow +** optimizations; An 'expdesc' structure describes a potentially-delayed +** variable/expression. It has a description of its "main" value plus a +** list of conditional jumps that can also produce its value (generated +** by short-circuit operators 'and'/'or'). +*/ + +/* kinds of variables/expressions */ +typedef enum { + VVOID, /* when 'expdesc' describes the last expression of a list, + this kind means an empty list (so, no expression) */ + VNIL, /* constant nil */ + VTRUE, /* constant true */ + VFALSE, /* constant false */ + VK, /* constant in 'k'; info = index of constant in 'k' */ + VKFLT, /* floating constant; nval = numerical float value */ + VKINT, /* integer constant; ival = numerical integer value */ + VKSTR, /* string constant; strval = TString address; + (string is fixed by the lexer) */ + VNONRELOC, /* expression has its value in a fixed register; + info = result register */ + VLOCAL, /* local variable; var.ridx = register index; + var.vidx = relative index in 'actvar.arr' */ + VUPVAL, /* upvalue variable; info = index of upvalue in 'upvalues' */ + VCONST, /* compile-time <const> variable; + info = absolute index in 'actvar.arr' */ + VINDEXED, /* indexed variable; + ind.t = table register; + ind.idx = key's R index */ + VINDEXUP, /* indexed upvalue; + ind.t = table upvalue; + ind.idx = key's K index */ + VINDEXI, /* indexed variable with constant integer; + ind.t = table register; + ind.idx = key's value */ + VINDEXSTR, /* indexed variable with literal string; + ind.t = table register; + ind.idx = key's K index */ + VJMP, /* expression is a test/comparison; + info = pc of corresponding jump instruction */ + VRELOC, /* expression can put result in any register; + info = instruction pc */ + VCALL, /* expression is a function call; info = instruction pc */ + VVARARG /* vararg expression; info = instruction pc */ +} expkind; + + +#define vkisvar(k) (VLOCAL <= (k) && (k) <= VINDEXSTR) +#define vkisindexed(k) (VINDEXED <= (k) && (k) <= VINDEXSTR) + + +typedef struct expdesc { + expkind k; + union { + lua_Integer ival; /* for VKINT */ + lua_Number nval; /* for VKFLT */ + TString *strval; /* for VKSTR */ + int info; /* for generic use */ + struct { /* for indexed variables */ + short idx; /* index (R or "long" K) */ + lu_byte t; /* table (register or upvalue) */ + } ind; + struct { /* for local variables */ + lu_byte ridx; /* register holding the variable */ + unsigned short vidx; /* compiler index (in 'actvar.arr') */ + } var; + } u; + int t; /* patch list of 'exit when true' */ + int f; /* patch list of 'exit when false' */ +} expdesc; + + +/* kinds of variables */ +#define VDKREG 0 /* regular */ +#define RDKCONST 1 /* constant */ +#define RDKTOCLOSE 2 /* to-be-closed */ +#define RDKCTC 3 /* compile-time constant */ + +/* description of an active local variable */ +typedef union Vardesc { + struct { + TValuefields; /* constant value (if it is a compile-time constant) */ + lu_byte kind; + lu_byte ridx; /* register holding the variable */ + short pidx; /* index of the variable in the Proto's 'locvars' array */ + TString *name; /* variable name */ + } vd; + TValue k; /* constant value (if any) */ +} Vardesc; + + + +/* description of pending goto statements and label statements */ +typedef struct Labeldesc { + TString *name; /* label identifier */ + int pc; /* position in code */ + int line; /* line where it appeared */ + lu_byte nactvar; /* number of active variables in that position */ + lu_byte close; /* goto that escapes upvalues */ +} Labeldesc; + + +/* list of labels or gotos */ +typedef struct Labellist { + Labeldesc *arr; /* array */ + int n; /* number of entries in use */ + int size; /* array size */ +} Labellist; + + +/* dynamic structures used by the parser */ +typedef struct Dyndata { + struct { /* list of all active local variables */ + Vardesc *arr; + int n; + int size; + } actvar; + Labellist gt; /* list of pending gotos */ + Labellist label; /* list of active labels */ +} Dyndata; + + +/* control of blocks */ +struct BlockCnt; /* defined in lparser.c */ + + +/* state needed to generate code for a given function */ +typedef struct FuncState { + Proto *f; /* current function header */ + struct FuncState *prev; /* enclosing function */ + struct LexState *ls; /* lexical state */ + struct BlockCnt *bl; /* chain of current blocks */ + int pc; /* next position to code (equivalent to 'ncode') */ + int lasttarget; /* 'label' of last 'jump label' */ + int previousline; /* last line that was saved in 'lineinfo' */ + int nk; /* number of elements in 'k' */ + int np; /* number of elements in 'p' */ + int nabslineinfo; /* number of elements in 'abslineinfo' */ + int firstlocal; /* index of first local var (in Dyndata array) */ + int firstlabel; /* index of first label (in 'dyd->label->arr') */ + short ndebugvars; /* number of elements in 'f->locvars' */ + lu_byte nactvar; /* number of active local variables */ + lu_byte nups; /* number of upvalues */ + lu_byte freereg; /* first free register */ + lu_byte iwthabs; /* instructions issued since last absolute line info */ + lu_byte needclose; /* function needs to close upvalues when returning */ +} FuncState; + + +LUAI_FUNC int luaY_nvarstack (FuncState *fs); +LUAI_FUNC LClosure *luaY_parser (lua_State *L, ZIO *z, Mbuffer *buff, + Dyndata *dyd, const char *name, int firstchar); + + +#endif diff --git a/vendor/lua-5.4.8/src/lprefix.h b/vendor/lua-5.4.8/src/lprefix.h new file mode 100644 index 0000000..484f2ad --- /dev/null +++ b/vendor/lua-5.4.8/src/lprefix.h @@ -0,0 +1,45 @@ +/* +** $Id: lprefix.h $ +** Definitions for Lua code that must come before any other header file +** See Copyright Notice in lua.h +*/ + +#ifndef lprefix_h +#define lprefix_h + + +/* +** Allows POSIX/XSI stuff +*/ +#if !defined(LUA_USE_C89) /* { */ + +#if !defined(_XOPEN_SOURCE) +#define _XOPEN_SOURCE 600 +#elif _XOPEN_SOURCE == 0 +#undef _XOPEN_SOURCE /* use -D_XOPEN_SOURCE=0 to undefine it */ +#endif + +/* +** Allows manipulation of large files in gcc and some other compilers +*/ +#if !defined(LUA_32BITS) && !defined(_FILE_OFFSET_BITS) +#define _LARGEFILE_SOURCE 1 +#define _FILE_OFFSET_BITS 64 +#endif + +#endif /* } */ + + +/* +** Windows stuff +*/ +#if defined(_WIN32) /* { */ + +#if !defined(_CRT_SECURE_NO_WARNINGS) +#define _CRT_SECURE_NO_WARNINGS /* avoid warnings about ISO C functions */ +#endif + +#endif /* } */ + +#endif + diff --git a/vendor/lua-5.4.8/src/lstate.c b/vendor/lua-5.4.8/src/lstate.c new file mode 100644 index 0000000..f3f2ccf --- /dev/null +++ b/vendor/lua-5.4.8/src/lstate.c @@ -0,0 +1,448 @@ +/* +** $Id: lstate.c $ +** Global State +** See Copyright Notice in lua.h +*/ + +#define lstate_c +#define LUA_CORE + +#include "lprefix.h" + + +#include <stddef.h> +#include <string.h> + +#include "lua.h" + +#include "lapi.h" +#include "ldebug.h" +#include "ldo.h" +#include "lfunc.h" +#include "lgc.h" +#include "llex.h" +#include "lmem.h" +#include "lstate.h" +#include "lstring.h" +#include "ltable.h" +#include "ltm.h" + + + +/* +** thread state + extra space +*/ +typedef struct LX { + lu_byte extra_[LUA_EXTRASPACE]; + lua_State l; +} LX; + + +/* +** Main thread combines a thread state and the global state +*/ +typedef struct LG { + LX l; + global_State g; +} LG; + + + +#define fromstate(L) (cast(LX *, cast(lu_byte *, (L)) - offsetof(LX, l))) + + +/* +** A macro to create a "random" seed when a state is created; +** the seed is used to randomize string hashes. +*/ +#if !defined(luai_makeseed) + +#include <time.h> + +/* +** Compute an initial seed with some level of randomness. +** Rely on Address Space Layout Randomization (if present) and +** current time. +*/ +#define addbuff(b,p,e) \ + { size_t t = cast_sizet(e); \ + memcpy(b + p, &t, sizeof(t)); p += sizeof(t); } + +static unsigned int luai_makeseed (lua_State *L) { + char buff[3 * sizeof(size_t)]; + unsigned int h = cast_uint(time(NULL)); + int p = 0; + addbuff(buff, p, L); /* heap variable */ + addbuff(buff, p, &h); /* local variable */ + addbuff(buff, p, &lua_newstate); /* public function */ + lua_assert(p == sizeof(buff)); + return luaS_hash(buff, p, h); +} + +#endif + + +/* +** set GCdebt to a new value keeping the value (totalbytes + GCdebt) +** invariant (and avoiding underflows in 'totalbytes') +*/ +void luaE_setdebt (global_State *g, l_mem debt) { + l_mem tb = gettotalbytes(g); + lua_assert(tb > 0); + if (debt < tb - MAX_LMEM) + debt = tb - MAX_LMEM; /* will make 'totalbytes == MAX_LMEM' */ + g->totalbytes = tb - debt; + g->GCdebt = debt; +} + + +LUA_API int lua_setcstacklimit (lua_State *L, unsigned int limit) { + UNUSED(L); UNUSED(limit); + return LUAI_MAXCCALLS; /* warning?? */ +} + + +CallInfo *luaE_extendCI (lua_State *L) { + CallInfo *ci; + lua_assert(L->ci->next == NULL); + ci = luaM_new(L, CallInfo); + lua_assert(L->ci->next == NULL); + L->ci->next = ci; + ci->previous = L->ci; + ci->next = NULL; + ci->u.l.trap = 0; + L->nci++; + return ci; +} + + +/* +** free all CallInfo structures not in use by a thread +*/ +static void freeCI (lua_State *L) { + CallInfo *ci = L->ci; + CallInfo *next = ci->next; + ci->next = NULL; + while ((ci = next) != NULL) { + next = ci->next; + luaM_free(L, ci); + L->nci--; + } +} + + +/* +** free half of the CallInfo structures not in use by a thread, +** keeping the first one. +*/ +void luaE_shrinkCI (lua_State *L) { + CallInfo *ci = L->ci->next; /* first free CallInfo */ + CallInfo *next; + if (ci == NULL) + return; /* no extra elements */ + while ((next = ci->next) != NULL) { /* two extra elements? */ + CallInfo *next2 = next->next; /* next's next */ + ci->next = next2; /* remove next from the list */ + L->nci--; + luaM_free(L, next); /* free next */ + if (next2 == NULL) + break; /* no more elements */ + else { + next2->previous = ci; + ci = next2; /* continue */ + } + } +} + + +/* +** Called when 'getCcalls(L)' larger or equal to LUAI_MAXCCALLS. +** If equal, raises an overflow error. If value is larger than +** LUAI_MAXCCALLS (which means it is handling an overflow) but +** not much larger, does not report an error (to allow overflow +** handling to work). +*/ +void luaE_checkcstack (lua_State *L) { + if (getCcalls(L) == LUAI_MAXCCALLS) + luaG_runerror(L, "C stack overflow"); + else if (getCcalls(L) >= (LUAI_MAXCCALLS / 10 * 11)) + luaD_errerr(L); /* error while handling stack error */ +} + + +LUAI_FUNC void luaE_incCstack (lua_State *L) { + L->nCcalls++; + if (l_unlikely(getCcalls(L) >= LUAI_MAXCCALLS)) + luaE_checkcstack(L); +} + + +static void stack_init (lua_State *L1, lua_State *L) { + int i; CallInfo *ci; + /* initialize stack array */ + L1->stack.p = luaM_newvector(L, BASIC_STACK_SIZE + EXTRA_STACK, StackValue); + L1->tbclist.p = L1->stack.p; + for (i = 0; i < BASIC_STACK_SIZE + EXTRA_STACK; i++) + setnilvalue(s2v(L1->stack.p + i)); /* erase new stack */ + L1->top.p = L1->stack.p; + L1->stack_last.p = L1->stack.p + BASIC_STACK_SIZE; + /* initialize first ci */ + ci = &L1->base_ci; + ci->next = ci->previous = NULL; + ci->callstatus = CIST_C; + ci->func.p = L1->top.p; + ci->u.c.k = NULL; + ci->nresults = 0; + setnilvalue(s2v(L1->top.p)); /* 'function' entry for this 'ci' */ + L1->top.p++; + ci->top.p = L1->top.p + LUA_MINSTACK; + L1->ci = ci; +} + + +static void freestack (lua_State *L) { + if (L->stack.p == NULL) + return; /* stack not completely built yet */ + L->ci = &L->base_ci; /* free the entire 'ci' list */ + freeCI(L); + lua_assert(L->nci == 0); + luaM_freearray(L, L->stack.p, stacksize(L) + EXTRA_STACK); /* free stack */ +} + + +/* +** Create registry table and its predefined values +*/ +static void init_registry (lua_State *L, global_State *g) { + /* create registry */ + Table *registry = luaH_new(L); + sethvalue(L, &g->l_registry, registry); + luaH_resize(L, registry, LUA_RIDX_LAST, 0); + /* registry[LUA_RIDX_MAINTHREAD] = L */ + setthvalue(L, ®istry->array[LUA_RIDX_MAINTHREAD - 1], L); + /* registry[LUA_RIDX_GLOBALS] = new table (table of globals) */ + sethvalue(L, ®istry->array[LUA_RIDX_GLOBALS - 1], luaH_new(L)); +} + + +/* +** open parts of the state that may cause memory-allocation errors. +*/ +static void f_luaopen (lua_State *L, void *ud) { + global_State *g = G(L); + UNUSED(ud); + stack_init(L, L); /* init stack */ + init_registry(L, g); + luaS_init(L); + luaT_init(L); + luaX_init(L); + g->gcstp = 0; /* allow gc */ + setnilvalue(&g->nilvalue); /* now state is complete */ + luai_userstateopen(L); +} + + +/* +** preinitialize a thread with consistent values without allocating +** any memory (to avoid errors) +*/ +static void preinit_thread (lua_State *L, global_State *g) { + G(L) = g; + L->stack.p = NULL; + L->ci = NULL; + L->nci = 0; + L->twups = L; /* thread has no upvalues */ + L->nCcalls = 0; + L->errorJmp = NULL; + L->hook = NULL; + L->hookmask = 0; + L->basehookcount = 0; + L->allowhook = 1; + resethookcount(L); + L->openupval = NULL; + L->status = LUA_OK; + L->errfunc = 0; + L->oldpc = 0; +} + + +static void close_state (lua_State *L) { + global_State *g = G(L); + if (!completestate(g)) /* closing a partially built state? */ + luaC_freeallobjects(L); /* just collect its objects */ + else { /* closing a fully built state */ + L->ci = &L->base_ci; /* unwind CallInfo list */ + L->errfunc = 0; /* stack unwind can "throw away" the error function */ + luaD_closeprotected(L, 1, LUA_OK); /* close all upvalues */ + L->top.p = L->stack.p + 1; /* empty the stack to run finalizers */ + luaC_freeallobjects(L); /* collect all objects */ + luai_userstateclose(L); + } + luaM_freearray(L, G(L)->strt.hash, G(L)->strt.size); + freestack(L); + lua_assert(gettotalbytes(g) == sizeof(LG)); + (*g->frealloc)(g->ud, fromstate(L), sizeof(LG), 0); /* free main block */ +} + + +LUA_API lua_State *lua_newthread (lua_State *L) { + global_State *g = G(L); + GCObject *o; + lua_State *L1; + lua_lock(L); + luaC_checkGC(L); + /* create new thread */ + o = luaC_newobjdt(L, LUA_TTHREAD, sizeof(LX), offsetof(LX, l)); + L1 = gco2th(o); + /* anchor it on L stack */ + setthvalue2s(L, L->top.p, L1); + api_incr_top(L); + preinit_thread(L1, g); + L1->hookmask = L->hookmask; + L1->basehookcount = L->basehookcount; + L1->hook = L->hook; + resethookcount(L1); + /* initialize L1 extra space */ + memcpy(lua_getextraspace(L1), lua_getextraspace(g->mainthread), + LUA_EXTRASPACE); + luai_userstatethread(L, L1); + stack_init(L1, L); /* init stack */ + lua_unlock(L); + return L1; +} + + +void luaE_freethread (lua_State *L, lua_State *L1) { + LX *l = fromstate(L1); + luaF_closeupval(L1, L1->stack.p); /* close all upvalues */ + lua_assert(L1->openupval == NULL); + luai_userstatefree(L, L1); + freestack(L1); + luaM_free(L, l); +} + + +int luaE_resetthread (lua_State *L, int status) { + CallInfo *ci = L->ci = &L->base_ci; /* unwind CallInfo list */ + setnilvalue(s2v(L->stack.p)); /* 'function' entry for basic 'ci' */ + ci->func.p = L->stack.p; + ci->callstatus = CIST_C; + if (status == LUA_YIELD) + status = LUA_OK; + L->status = LUA_OK; /* so it can run __close metamethods */ + L->errfunc = 0; /* stack unwind can "throw away" the error function */ + status = luaD_closeprotected(L, 1, status); + if (status != LUA_OK) /* errors? */ + luaD_seterrorobj(L, status, L->stack.p + 1); + else + L->top.p = L->stack.p + 1; + ci->top.p = L->top.p + LUA_MINSTACK; + luaD_reallocstack(L, cast_int(ci->top.p - L->stack.p), 0); + return status; +} + + +LUA_API int lua_closethread (lua_State *L, lua_State *from) { + int status; + lua_lock(L); + L->nCcalls = (from) ? getCcalls(from) : 0; + status = luaE_resetthread(L, L->status); + lua_unlock(L); + return status; +} + + +/* +** Deprecated! Use 'lua_closethread' instead. +*/ +LUA_API int lua_resetthread (lua_State *L) { + return lua_closethread(L, NULL); +} + + +LUA_API lua_State *lua_newstate (lua_Alloc f, void *ud) { + int i; + lua_State *L; + global_State *g; + LG *l = cast(LG *, (*f)(ud, NULL, LUA_TTHREAD, sizeof(LG))); + if (l == NULL) return NULL; + L = &l->l.l; + g = &l->g; + L->tt = LUA_VTHREAD; + g->currentwhite = bitmask(WHITE0BIT); + L->marked = luaC_white(g); + preinit_thread(L, g); + g->allgc = obj2gco(L); /* by now, only object is the main thread */ + L->next = NULL; + incnny(L); /* main thread is always non yieldable */ + g->frealloc = f; + g->ud = ud; + g->warnf = NULL; + g->ud_warn = NULL; + g->mainthread = L; + g->seed = luai_makeseed(L); + g->gcstp = GCSTPGC; /* no GC while building state */ + g->strt.size = g->strt.nuse = 0; + g->strt.hash = NULL; + setnilvalue(&g->l_registry); + g->panic = NULL; + g->gcstate = GCSpause; + g->gckind = KGC_INC; + g->gcstopem = 0; + g->gcemergency = 0; + g->finobj = g->tobefnz = g->fixedgc = NULL; + g->firstold1 = g->survival = g->old1 = g->reallyold = NULL; + g->finobjsur = g->finobjold1 = g->finobjrold = NULL; + g->sweepgc = NULL; + g->gray = g->grayagain = NULL; + g->weak = g->ephemeron = g->allweak = NULL; + g->twups = NULL; + g->totalbytes = sizeof(LG); + g->GCdebt = 0; + g->lastatomic = 0; + setivalue(&g->nilvalue, 0); /* to signal that state is not yet built */ + setgcparam(g->gcpause, LUAI_GCPAUSE); + setgcparam(g->gcstepmul, LUAI_GCMUL); + g->gcstepsize = LUAI_GCSTEPSIZE; + setgcparam(g->genmajormul, LUAI_GENMAJORMUL); + g->genminormul = LUAI_GENMINORMUL; + for (i=0; i < LUA_NUMTAGS; i++) g->mt[i] = NULL; + if (luaD_rawrunprotected(L, f_luaopen, NULL) != LUA_OK) { + /* memory allocation error: free partial state */ + close_state(L); + L = NULL; + } + return L; +} + + +LUA_API void lua_close (lua_State *L) { + lua_lock(L); + L = G(L)->mainthread; /* only the main thread can be closed */ + close_state(L); +} + + +void luaE_warning (lua_State *L, const char *msg, int tocont) { + lua_WarnFunction wf = G(L)->warnf; + if (wf != NULL) + wf(G(L)->ud_warn, msg, tocont); +} + + +/* +** Generate a warning from an error message +*/ +void luaE_warnerror (lua_State *L, const char *where) { + TValue *errobj = s2v(L->top.p - 1); /* error object */ + const char *msg = (ttisstring(errobj)) + ? getstr(tsvalue(errobj)) + : "error object is not a string"; + /* produce warning "error in %s (%s)" (where, msg) */ + luaE_warning(L, "error in ", 1); + luaE_warning(L, where, 1); + luaE_warning(L, " (", 1); + luaE_warning(L, msg, 1); + luaE_warning(L, ")", 0); +} + diff --git a/vendor/lua-5.4.8/src/lstate.h b/vendor/lua-5.4.8/src/lstate.h new file mode 100644 index 0000000..007704c --- /dev/null +++ b/vendor/lua-5.4.8/src/lstate.h @@ -0,0 +1,408 @@ +/* +** $Id: lstate.h $ +** Global State +** See Copyright Notice in lua.h +*/ + +#ifndef lstate_h +#define lstate_h + +#include "lua.h" + + +/* Some header files included here need this definition */ +typedef struct CallInfo CallInfo; + + +#include "lobject.h" +#include "ltm.h" +#include "lzio.h" + + +/* +** Some notes about garbage-collected objects: All objects in Lua must +** be kept somehow accessible until being freed, so all objects always +** belong to one (and only one) of these lists, using field 'next' of +** the 'CommonHeader' for the link: +** +** 'allgc': all objects not marked for finalization; +** 'finobj': all objects marked for finalization; +** 'tobefnz': all objects ready to be finalized; +** 'fixedgc': all objects that are not to be collected (currently +** only small strings, such as reserved words). +** +** For the generational collector, some of these lists have marks for +** generations. Each mark points to the first element in the list for +** that particular generation; that generation goes until the next mark. +** +** 'allgc' -> 'survival': new objects; +** 'survival' -> 'old': objects that survived one collection; +** 'old1' -> 'reallyold': objects that became old in last collection; +** 'reallyold' -> NULL: objects old for more than one cycle. +** +** 'finobj' -> 'finobjsur': new objects marked for finalization; +** 'finobjsur' -> 'finobjold1': survived """"; +** 'finobjold1' -> 'finobjrold': just old """"; +** 'finobjrold' -> NULL: really old """". +** +** All lists can contain elements older than their main ages, due +** to 'luaC_checkfinalizer' and 'udata2finalize', which move +** objects between the normal lists and the "marked for finalization" +** lists. Moreover, barriers can age young objects in young lists as +** OLD0, which then become OLD1. However, a list never contains +** elements younger than their main ages. +** +** The generational collector also uses a pointer 'firstold1', which +** points to the first OLD1 object in the list. It is used to optimize +** 'markold'. (Potentially OLD1 objects can be anywhere between 'allgc' +** and 'reallyold', but often the list has no OLD1 objects or they are +** after 'old1'.) Note the difference between it and 'old1': +** 'firstold1': no OLD1 objects before this point; there can be all +** ages after it. +** 'old1': no objects younger than OLD1 after this point. +*/ + +/* +** Moreover, there is another set of lists that control gray objects. +** These lists are linked by fields 'gclist'. (All objects that +** can become gray have such a field. The field is not the same +** in all objects, but it always has this name.) Any gray object +** must belong to one of these lists, and all objects in these lists +** must be gray (with two exceptions explained below): +** +** 'gray': regular gray objects, still waiting to be visited. +** 'grayagain': objects that must be revisited at the atomic phase. +** That includes +** - black objects got in a write barrier; +** - all kinds of weak tables during propagation phase; +** - all threads. +** 'weak': tables with weak values to be cleared; +** 'ephemeron': ephemeron tables with white->white entries; +** 'allweak': tables with weak keys and/or weak values to be cleared. +** +** The exceptions to that "gray rule" are: +** - TOUCHED2 objects in generational mode stay in a gray list (because +** they must be visited again at the end of the cycle), but they are +** marked black because assignments to them must activate barriers (to +** move them back to TOUCHED1). +** - Open upvales are kept gray to avoid barriers, but they stay out +** of gray lists. (They don't even have a 'gclist' field.) +*/ + + + +/* +** About 'nCcalls': This count has two parts: the lower 16 bits counts +** the number of recursive invocations in the C stack; the higher +** 16 bits counts the number of non-yieldable calls in the stack. +** (They are together so that we can change and save both with one +** instruction.) +*/ + + +/* true if this thread does not have non-yieldable calls in the stack */ +#define yieldable(L) (((L)->nCcalls & 0xffff0000) == 0) + +/* real number of C calls */ +#define getCcalls(L) ((L)->nCcalls & 0xffff) + + +/* Increment the number of non-yieldable calls */ +#define incnny(L) ((L)->nCcalls += 0x10000) + +/* Decrement the number of non-yieldable calls */ +#define decnny(L) ((L)->nCcalls -= 0x10000) + +/* Non-yieldable call increment */ +#define nyci (0x10000 | 1) + + + + +struct lua_longjmp; /* defined in ldo.c */ + + +/* +** Atomic type (relative to signals) to better ensure that 'lua_sethook' +** is thread safe +*/ +#if !defined(l_signalT) +#include <signal.h> +#define l_signalT sig_atomic_t +#endif + + +/* +** Extra stack space to handle TM calls and some other extras. This +** space is not included in 'stack_last'. It is used only to avoid stack +** checks, either because the element will be promptly popped or because +** there will be a stack check soon after the push. Function frames +** never use this extra space, so it does not need to be kept clean. +*/ +#define EXTRA_STACK 5 + + +#define BASIC_STACK_SIZE (2*LUA_MINSTACK) + +#define stacksize(th) cast_int((th)->stack_last.p - (th)->stack.p) + + +/* kinds of Garbage Collection */ +#define KGC_INC 0 /* incremental gc */ +#define KGC_GEN 1 /* generational gc */ + + +typedef struct stringtable { + TString **hash; + int nuse; /* number of elements */ + int size; +} stringtable; + + +/* +** Information about a call. +** About union 'u': +** - field 'l' is used only for Lua functions; +** - field 'c' is used only for C functions. +** About union 'u2': +** - field 'funcidx' is used only by C functions while doing a +** protected call; +** - field 'nyield' is used only while a function is "doing" an +** yield (from the yield until the next resume); +** - field 'nres' is used only while closing tbc variables when +** returning from a function; +** - field 'transferinfo' is used only during call/returnhooks, +** before the function starts or after it ends. +*/ +struct CallInfo { + StkIdRel func; /* function index in the stack */ + StkIdRel top; /* top for this function */ + struct CallInfo *previous, *next; /* dynamic call link */ + union { + struct { /* only for Lua functions */ + const Instruction *savedpc; + volatile l_signalT trap; /* function is tracing lines/counts */ + int nextraargs; /* # of extra arguments in vararg functions */ + } l; + struct { /* only for C functions */ + lua_KFunction k; /* continuation in case of yields */ + ptrdiff_t old_errfunc; + lua_KContext ctx; /* context info. in case of yields */ + } c; + } u; + union { + int funcidx; /* called-function index */ + int nyield; /* number of values yielded */ + int nres; /* number of values returned */ + struct { /* info about transferred values (for call/return hooks) */ + unsigned short ftransfer; /* offset of first value transferred */ + unsigned short ntransfer; /* number of values transferred */ + } transferinfo; + } u2; + short nresults; /* expected number of results from this function */ + unsigned short callstatus; +}; + + +/* +** Bits in CallInfo status +*/ +#define CIST_OAH (1<<0) /* original value of 'allowhook' */ +#define CIST_C (1<<1) /* call is running a C function */ +#define CIST_FRESH (1<<2) /* call is on a fresh "luaV_execute" frame */ +#define CIST_HOOKED (1<<3) /* call is running a debug hook */ +#define CIST_YPCALL (1<<4) /* doing a yieldable protected call */ +#define CIST_TAIL (1<<5) /* call was tail called */ +#define CIST_HOOKYIELD (1<<6) /* last hook called yielded */ +#define CIST_FIN (1<<7) /* function "called" a finalizer */ +#define CIST_TRAN (1<<8) /* 'ci' has transfer information */ +#define CIST_CLSRET (1<<9) /* function is closing tbc variables */ +/* Bits 10-12 are used for CIST_RECST (see below) */ +#define CIST_RECST 10 +#if defined(LUA_COMPAT_LT_LE) +#define CIST_LEQ (1<<13) /* using __lt for __le */ +#endif + + +/* +** Field CIST_RECST stores the "recover status", used to keep the error +** status while closing to-be-closed variables in coroutines, so that +** Lua can correctly resume after an yield from a __close method called +** because of an error. (Three bits are enough for error status.) +*/ +#define getcistrecst(ci) (((ci)->callstatus >> CIST_RECST) & 7) +#define setcistrecst(ci,st) \ + check_exp(((st) & 7) == (st), /* status must fit in three bits */ \ + ((ci)->callstatus = ((ci)->callstatus & ~(7 << CIST_RECST)) \ + | ((st) << CIST_RECST))) + + +/* active function is a Lua function */ +#define isLua(ci) (!((ci)->callstatus & CIST_C)) + +/* call is running Lua code (not a hook) */ +#define isLuacode(ci) (!((ci)->callstatus & (CIST_C | CIST_HOOKED))) + +/* assume that CIST_OAH has offset 0 and that 'v' is strictly 0/1 */ +#define setoah(st,v) ((st) = ((st) & ~CIST_OAH) | (v)) +#define getoah(st) ((st) & CIST_OAH) + + +/* +** 'global state', shared by all threads of this state +*/ +typedef struct global_State { + lua_Alloc frealloc; /* function to reallocate memory */ + void *ud; /* auxiliary data to 'frealloc' */ + l_mem totalbytes; /* number of bytes currently allocated - GCdebt */ + l_mem GCdebt; /* bytes allocated not yet compensated by the collector */ + lu_mem GCestimate; /* an estimate of the non-garbage memory in use */ + lu_mem lastatomic; /* see function 'genstep' in file 'lgc.c' */ + stringtable strt; /* hash table for strings */ + TValue l_registry; + TValue nilvalue; /* a nil value */ + unsigned int seed; /* randomized seed for hashes */ + lu_byte currentwhite; + lu_byte gcstate; /* state of garbage collector */ + lu_byte gckind; /* kind of GC running */ + lu_byte gcstopem; /* stops emergency collections */ + lu_byte genminormul; /* control for minor generational collections */ + lu_byte genmajormul; /* control for major generational collections */ + lu_byte gcstp; /* control whether GC is running */ + lu_byte gcemergency; /* true if this is an emergency collection */ + lu_byte gcpause; /* size of pause between successive GCs */ + lu_byte gcstepmul; /* GC "speed" */ + lu_byte gcstepsize; /* (log2 of) GC granularity */ + GCObject *allgc; /* list of all collectable objects */ + GCObject **sweepgc; /* current position of sweep in list */ + GCObject *finobj; /* list of collectable objects with finalizers */ + GCObject *gray; /* list of gray objects */ + GCObject *grayagain; /* list of objects to be traversed atomically */ + GCObject *weak; /* list of tables with weak values */ + GCObject *ephemeron; /* list of ephemeron tables (weak keys) */ + GCObject *allweak; /* list of all-weak tables */ + GCObject *tobefnz; /* list of userdata to be GC */ + GCObject *fixedgc; /* list of objects not to be collected */ + /* fields for generational collector */ + GCObject *survival; /* start of objects that survived one GC cycle */ + GCObject *old1; /* start of old1 objects */ + GCObject *reallyold; /* objects more than one cycle old ("really old") */ + GCObject *firstold1; /* first OLD1 object in the list (if any) */ + GCObject *finobjsur; /* list of survival objects with finalizers */ + GCObject *finobjold1; /* list of old1 objects with finalizers */ + GCObject *finobjrold; /* list of really old objects with finalizers */ + struct lua_State *twups; /* list of threads with open upvalues */ + lua_CFunction panic; /* to be called in unprotected errors */ + struct lua_State *mainthread; + TString *memerrmsg; /* message for memory-allocation errors */ + TString *tmname[TM_N]; /* array with tag-method names */ + struct Table *mt[LUA_NUMTYPES]; /* metatables for basic types */ + TString *strcache[STRCACHE_N][STRCACHE_M]; /* cache for strings in API */ + lua_WarnFunction warnf; /* warning function */ + void *ud_warn; /* auxiliary data to 'warnf' */ +} global_State; + + +/* +** 'per thread' state +*/ +struct lua_State { + CommonHeader; + lu_byte status; + lu_byte allowhook; + unsigned short nci; /* number of items in 'ci' list */ + StkIdRel top; /* first free slot in the stack */ + global_State *l_G; + CallInfo *ci; /* call info for current function */ + StkIdRel stack_last; /* end of stack (last element + 1) */ + StkIdRel stack; /* stack base */ + UpVal *openupval; /* list of open upvalues in this stack */ + StkIdRel tbclist; /* list of to-be-closed variables */ + GCObject *gclist; + struct lua_State *twups; /* list of threads with open upvalues */ + struct lua_longjmp *errorJmp; /* current error recover point */ + CallInfo base_ci; /* CallInfo for first level (C calling Lua) */ + volatile lua_Hook hook; + ptrdiff_t errfunc; /* current error handling function (stack index) */ + l_uint32 nCcalls; /* number of nested (non-yieldable | C) calls */ + int oldpc; /* last pc traced */ + int basehookcount; + int hookcount; + volatile l_signalT hookmask; +}; + + +#define G(L) (L->l_G) + +/* +** 'g->nilvalue' being a nil value flags that the state was completely +** build. +*/ +#define completestate(g) ttisnil(&g->nilvalue) + + +/* +** Union of all collectable objects (only for conversions) +** ISO C99, 6.5.2.3 p.5: +** "if a union contains several structures that share a common initial +** sequence [...], and if the union object currently contains one +** of these structures, it is permitted to inspect the common initial +** part of any of them anywhere that a declaration of the complete type +** of the union is visible." +*/ +union GCUnion { + GCObject gc; /* common header */ + struct TString ts; + struct Udata u; + union Closure cl; + struct Table h; + struct Proto p; + struct lua_State th; /* thread */ + struct UpVal upv; +}; + + +/* +** ISO C99, 6.7.2.1 p.14: +** "A pointer to a union object, suitably converted, points to each of +** its members [...], and vice versa." +*/ +#define cast_u(o) cast(union GCUnion *, (o)) + +/* macros to convert a GCObject into a specific value */ +#define gco2ts(o) \ + check_exp(novariant((o)->tt) == LUA_TSTRING, &((cast_u(o))->ts)) +#define gco2u(o) check_exp((o)->tt == LUA_VUSERDATA, &((cast_u(o))->u)) +#define gco2lcl(o) check_exp((o)->tt == LUA_VLCL, &((cast_u(o))->cl.l)) +#define gco2ccl(o) check_exp((o)->tt == LUA_VCCL, &((cast_u(o))->cl.c)) +#define gco2cl(o) \ + check_exp(novariant((o)->tt) == LUA_TFUNCTION, &((cast_u(o))->cl)) +#define gco2t(o) check_exp((o)->tt == LUA_VTABLE, &((cast_u(o))->h)) +#define gco2p(o) check_exp((o)->tt == LUA_VPROTO, &((cast_u(o))->p)) +#define gco2th(o) check_exp((o)->tt == LUA_VTHREAD, &((cast_u(o))->th)) +#define gco2upv(o) check_exp((o)->tt == LUA_VUPVAL, &((cast_u(o))->upv)) + + +/* +** macro to convert a Lua object into a GCObject +** (The access to 'tt' tries to ensure that 'v' is actually a Lua object.) +*/ +#define obj2gco(v) check_exp((v)->tt >= LUA_TSTRING, &(cast_u(v)->gc)) + + +/* actual number of total bytes allocated */ +#define gettotalbytes(g) cast(lu_mem, (g)->totalbytes + (g)->GCdebt) + +LUAI_FUNC void luaE_setdebt (global_State *g, l_mem debt); +LUAI_FUNC void luaE_freethread (lua_State *L, lua_State *L1); +LUAI_FUNC CallInfo *luaE_extendCI (lua_State *L); +LUAI_FUNC void luaE_shrinkCI (lua_State *L); +LUAI_FUNC void luaE_checkcstack (lua_State *L); +LUAI_FUNC void luaE_incCstack (lua_State *L); +LUAI_FUNC void luaE_warning (lua_State *L, const char *msg, int tocont); +LUAI_FUNC void luaE_warnerror (lua_State *L, const char *where); +LUAI_FUNC int luaE_resetthread (lua_State *L, int status); + + +#endif + diff --git a/vendor/lua-5.4.8/src/lstring.c b/vendor/lua-5.4.8/src/lstring.c new file mode 100644 index 0000000..9775735 --- /dev/null +++ b/vendor/lua-5.4.8/src/lstring.c @@ -0,0 +1,274 @@ +/* +** $Id: lstring.c $ +** String table (keeps all strings handled by Lua) +** See Copyright Notice in lua.h +*/ + +#define lstring_c +#define LUA_CORE + +#include "lprefix.h" + + +#include <string.h> + +#include "lua.h" + +#include "ldebug.h" +#include "ldo.h" +#include "lmem.h" +#include "lobject.h" +#include "lstate.h" +#include "lstring.h" + + +/* +** Maximum size for string table. +*/ +#define MAXSTRTB cast_int(luaM_limitN(MAX_INT, TString*)) + + +/* +** equality for long strings +*/ +int luaS_eqlngstr (TString *a, TString *b) { + size_t len = a->u.lnglen; + lua_assert(a->tt == LUA_VLNGSTR && b->tt == LUA_VLNGSTR); + return (a == b) || /* same instance or... */ + ((len == b->u.lnglen) && /* equal length and ... */ + (memcmp(getlngstr(a), getlngstr(b), len) == 0)); /* equal contents */ +} + + +unsigned int luaS_hash (const char *str, size_t l, unsigned int seed) { + unsigned int h = seed ^ cast_uint(l); + for (; l > 0; l--) + h ^= ((h<<5) + (h>>2) + cast_byte(str[l - 1])); + return h; +} + + +unsigned int luaS_hashlongstr (TString *ts) { + lua_assert(ts->tt == LUA_VLNGSTR); + if (ts->extra == 0) { /* no hash? */ + size_t len = ts->u.lnglen; + ts->hash = luaS_hash(getlngstr(ts), len, ts->hash); + ts->extra = 1; /* now it has its hash */ + } + return ts->hash; +} + + +static void tablerehash (TString **vect, int osize, int nsize) { + int i; + for (i = osize; i < nsize; i++) /* clear new elements */ + vect[i] = NULL; + for (i = 0; i < osize; i++) { /* rehash old part of the array */ + TString *p = vect[i]; + vect[i] = NULL; + while (p) { /* for each string in the list */ + TString *hnext = p->u.hnext; /* save next */ + unsigned int h = lmod(p->hash, nsize); /* new position */ + p->u.hnext = vect[h]; /* chain it into array */ + vect[h] = p; + p = hnext; + } + } +} + + +/* +** Resize the string table. If allocation fails, keep the current size. +** (This can degrade performance, but any non-zero size should work +** correctly.) +*/ +void luaS_resize (lua_State *L, int nsize) { + stringtable *tb = &G(L)->strt; + int osize = tb->size; + TString **newvect; + if (nsize < osize) /* shrinking table? */ + tablerehash(tb->hash, osize, nsize); /* depopulate shrinking part */ + newvect = luaM_reallocvector(L, tb->hash, osize, nsize, TString*); + if (l_unlikely(newvect == NULL)) { /* reallocation failed? */ + if (nsize < osize) /* was it shrinking table? */ + tablerehash(tb->hash, nsize, osize); /* restore to original size */ + /* leave table as it was */ + } + else { /* allocation succeeded */ + tb->hash = newvect; + tb->size = nsize; + if (nsize > osize) + tablerehash(newvect, osize, nsize); /* rehash for new size */ + } +} + + +/* +** Clear API string cache. (Entries cannot be empty, so fill them with +** a non-collectable string.) +*/ +void luaS_clearcache (global_State *g) { + int i, j; + for (i = 0; i < STRCACHE_N; i++) + for (j = 0; j < STRCACHE_M; j++) { + if (iswhite(g->strcache[i][j])) /* will entry be collected? */ + g->strcache[i][j] = g->memerrmsg; /* replace it with something fixed */ + } +} + + +/* +** Initialize the string table and the string cache +*/ +void luaS_init (lua_State *L) { + global_State *g = G(L); + int i, j; + stringtable *tb = &G(L)->strt; + tb->hash = luaM_newvector(L, MINSTRTABSIZE, TString*); + tablerehash(tb->hash, 0, MINSTRTABSIZE); /* clear array */ + tb->size = MINSTRTABSIZE; + /* pre-create memory-error message */ + g->memerrmsg = luaS_newliteral(L, MEMERRMSG); + luaC_fix(L, obj2gco(g->memerrmsg)); /* it should never be collected */ + for (i = 0; i < STRCACHE_N; i++) /* fill cache with valid strings */ + for (j = 0; j < STRCACHE_M; j++) + g->strcache[i][j] = g->memerrmsg; +} + + + +/* +** creates a new string object +*/ +static TString *createstrobj (lua_State *L, size_t l, int tag, unsigned int h) { + TString *ts; + GCObject *o; + size_t totalsize; /* total size of TString object */ + totalsize = sizelstring(l); + o = luaC_newobj(L, tag, totalsize); + ts = gco2ts(o); + ts->hash = h; + ts->extra = 0; + getstr(ts)[l] = '\0'; /* ending 0 */ + return ts; +} + + +TString *luaS_createlngstrobj (lua_State *L, size_t l) { + TString *ts = createstrobj(L, l, LUA_VLNGSTR, G(L)->seed); + ts->u.lnglen = l; + ts->shrlen = 0xFF; /* signals that it is a long string */ + return ts; +} + + +void luaS_remove (lua_State *L, TString *ts) { + stringtable *tb = &G(L)->strt; + TString **p = &tb->hash[lmod(ts->hash, tb->size)]; + while (*p != ts) /* find previous element */ + p = &(*p)->u.hnext; + *p = (*p)->u.hnext; /* remove element from its list */ + tb->nuse--; +} + + +static void growstrtab (lua_State *L, stringtable *tb) { + if (l_unlikely(tb->nuse == MAX_INT)) { /* too many strings? */ + luaC_fullgc(L, 1); /* try to free some... */ + if (tb->nuse == MAX_INT) /* still too many? */ + luaM_error(L); /* cannot even create a message... */ + } + if (tb->size <= MAXSTRTB / 2) /* can grow string table? */ + luaS_resize(L, tb->size * 2); +} + + +/* +** Checks whether short string exists and reuses it or creates a new one. +*/ +static TString *internshrstr (lua_State *L, const char *str, size_t l) { + TString *ts; + global_State *g = G(L); + stringtable *tb = &g->strt; + unsigned int h = luaS_hash(str, l, g->seed); + TString **list = &tb->hash[lmod(h, tb->size)]; + lua_assert(str != NULL); /* otherwise 'memcmp'/'memcpy' are undefined */ + for (ts = *list; ts != NULL; ts = ts->u.hnext) { + if (l == ts->shrlen && (memcmp(str, getshrstr(ts), l * sizeof(char)) == 0)) { + /* found! */ + if (isdead(g, ts)) /* dead (but not collected yet)? */ + changewhite(ts); /* resurrect it */ + return ts; + } + } + /* else must create a new string */ + if (tb->nuse >= tb->size) { /* need to grow string table? */ + growstrtab(L, tb); + list = &tb->hash[lmod(h, tb->size)]; /* rehash with new size */ + } + ts = createstrobj(L, l, LUA_VSHRSTR, h); + ts->shrlen = cast_byte(l); + memcpy(getshrstr(ts), str, l * sizeof(char)); + ts->u.hnext = *list; + *list = ts; + tb->nuse++; + return ts; +} + + +/* +** new string (with explicit length) +*/ +TString *luaS_newlstr (lua_State *L, const char *str, size_t l) { + if (l <= LUAI_MAXSHORTLEN) /* short string? */ + return internshrstr(L, str, l); + else { + TString *ts; + if (l_unlikely(l * sizeof(char) >= (MAX_SIZE - sizeof(TString)))) + luaM_toobig(L); + ts = luaS_createlngstrobj(L, l); + memcpy(getlngstr(ts), str, l * sizeof(char)); + return ts; + } +} + + +/* +** Create or reuse a zero-terminated string, first checking in the +** cache (using the string address as a key). The cache can contain +** only zero-terminated strings, so it is safe to use 'strcmp' to +** check hits. +*/ +TString *luaS_new (lua_State *L, const char *str) { + unsigned int i = point2uint(str) % STRCACHE_N; /* hash */ + int j; + TString **p = G(L)->strcache[i]; + for (j = 0; j < STRCACHE_M; j++) { + if (strcmp(str, getstr(p[j])) == 0) /* hit? */ + return p[j]; /* that is it */ + } + /* normal route */ + for (j = STRCACHE_M - 1; j > 0; j--) + p[j] = p[j - 1]; /* move out last element */ + /* new element is first in the list */ + p[0] = luaS_newlstr(L, str, strlen(str)); + return p[0]; +} + + +Udata *luaS_newudata (lua_State *L, size_t s, int nuvalue) { + Udata *u; + int i; + GCObject *o; + if (l_unlikely(s > MAX_SIZE - udatamemoffset(nuvalue))) + luaM_toobig(L); + o = luaC_newobj(L, LUA_VUSERDATA, sizeudata(nuvalue, s)); + u = gco2u(o); + u->len = s; + u->nuvalue = nuvalue; + u->metatable = NULL; + for (i = 0; i < nuvalue; i++) + setnilvalue(&u->uv[i].uv); + return u; +} + diff --git a/vendor/lua-5.4.8/src/lstring.h b/vendor/lua-5.4.8/src/lstring.h new file mode 100644 index 0000000..450c239 --- /dev/null +++ b/vendor/lua-5.4.8/src/lstring.h @@ -0,0 +1,57 @@ +/* +** $Id: lstring.h $ +** String table (keep all strings handled by Lua) +** See Copyright Notice in lua.h +*/ + +#ifndef lstring_h +#define lstring_h + +#include "lgc.h" +#include "lobject.h" +#include "lstate.h" + + +/* +** Memory-allocation error message must be preallocated (it cannot +** be created after memory is exhausted) +*/ +#define MEMERRMSG "not enough memory" + + +/* +** Size of a TString: Size of the header plus space for the string +** itself (including final '\0'). +*/ +#define sizelstring(l) (offsetof(TString, contents) + ((l) + 1) * sizeof(char)) + +#define luaS_newliteral(L, s) (luaS_newlstr(L, "" s, \ + (sizeof(s)/sizeof(char))-1)) + + +/* +** test whether a string is a reserved word +*/ +#define isreserved(s) ((s)->tt == LUA_VSHRSTR && (s)->extra > 0) + + +/* +** equality for short strings, which are always internalized +*/ +#define eqshrstr(a,b) check_exp((a)->tt == LUA_VSHRSTR, (a) == (b)) + + +LUAI_FUNC unsigned int luaS_hash (const char *str, size_t l, unsigned int seed); +LUAI_FUNC unsigned int luaS_hashlongstr (TString *ts); +LUAI_FUNC int luaS_eqlngstr (TString *a, TString *b); +LUAI_FUNC void luaS_resize (lua_State *L, int newsize); +LUAI_FUNC void luaS_clearcache (global_State *g); +LUAI_FUNC void luaS_init (lua_State *L); +LUAI_FUNC void luaS_remove (lua_State *L, TString *ts); +LUAI_FUNC Udata *luaS_newudata (lua_State *L, size_t s, int nuvalue); +LUAI_FUNC TString *luaS_newlstr (lua_State *L, const char *str, size_t l); +LUAI_FUNC TString *luaS_new (lua_State *L, const char *str); +LUAI_FUNC TString *luaS_createlngstrobj (lua_State *L, size_t l); + + +#endif diff --git a/vendor/lua-5.4.8/src/lstrlib.c b/vendor/lua-5.4.8/src/lstrlib.c new file mode 100644 index 0000000..0316716 --- /dev/null +++ b/vendor/lua-5.4.8/src/lstrlib.c @@ -0,0 +1,1874 @@ +/* +** $Id: lstrlib.c $ +** Standard library for string operations and pattern-matching +** See Copyright Notice in lua.h +*/ + +#define lstrlib_c +#define LUA_LIB + +#include "lprefix.h" + + +#include <ctype.h> +#include <float.h> +#include <limits.h> +#include <locale.h> +#include <math.h> +#include <stddef.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +#include "lua.h" + +#include "lauxlib.h" +#include "lualib.h" + + +/* +** maximum number of captures that a pattern can do during +** pattern-matching. This limit is arbitrary, but must fit in +** an unsigned char. +*/ +#if !defined(LUA_MAXCAPTURES) +#define LUA_MAXCAPTURES 32 +#endif + + +/* macro to 'unsign' a character */ +#define uchar(c) ((unsigned char)(c)) + + +/* +** Some sizes are better limited to fit in 'int', but must also fit in +** 'size_t'. (We assume that 'lua_Integer' cannot be smaller than 'int'.) +*/ +#define MAX_SIZET ((size_t)(~(size_t)0)) + +#define MAXSIZE \ + (sizeof(size_t) < sizeof(int) ? MAX_SIZET : (size_t)(INT_MAX)) + + + + +static int str_len (lua_State *L) { + size_t l; + luaL_checklstring(L, 1, &l); + lua_pushinteger(L, (lua_Integer)l); + return 1; +} + + +/* +** translate a relative initial string position +** (negative means back from end): clip result to [1, inf). +** The length of any string in Lua must fit in a lua_Integer, +** so there are no overflows in the casts. +** The inverted comparison avoids a possible overflow +** computing '-pos'. +*/ +static size_t posrelatI (lua_Integer pos, size_t len) { + if (pos > 0) + return (size_t)pos; + else if (pos == 0) + return 1; + else if (pos < -(lua_Integer)len) /* inverted comparison */ + return 1; /* clip to 1 */ + else return len + (size_t)pos + 1; +} + + +/* +** Gets an optional ending string position from argument 'arg', +** with default value 'def'. +** Negative means back from end: clip result to [0, len] +*/ +static size_t getendpos (lua_State *L, int arg, lua_Integer def, + size_t len) { + lua_Integer pos = luaL_optinteger(L, arg, def); + if (pos > (lua_Integer)len) + return len; + else if (pos >= 0) + return (size_t)pos; + else if (pos < -(lua_Integer)len) + return 0; + else return len + (size_t)pos + 1; +} + + +static int str_sub (lua_State *L) { + size_t l; + const char *s = luaL_checklstring(L, 1, &l); + size_t start = posrelatI(luaL_checkinteger(L, 2), l); + size_t end = getendpos(L, 3, -1, l); + if (start <= end) + lua_pushlstring(L, s + start - 1, (end - start) + 1); + else lua_pushliteral(L, ""); + return 1; +} + + +static int str_reverse (lua_State *L) { + size_t l, i; + luaL_Buffer b; + const char *s = luaL_checklstring(L, 1, &l); + char *p = luaL_buffinitsize(L, &b, l); + for (i = 0; i < l; i++) + p[i] = s[l - i - 1]; + luaL_pushresultsize(&b, l); + return 1; +} + + +static int str_lower (lua_State *L) { + size_t l; + size_t i; + luaL_Buffer b; + const char *s = luaL_checklstring(L, 1, &l); + char *p = luaL_buffinitsize(L, &b, l); + for (i=0; i<l; i++) + p[i] = tolower(uchar(s[i])); + luaL_pushresultsize(&b, l); + return 1; +} + + +static int str_upper (lua_State *L) { + size_t l; + size_t i; + luaL_Buffer b; + const char *s = luaL_checklstring(L, 1, &l); + char *p = luaL_buffinitsize(L, &b, l); + for (i=0; i<l; i++) + p[i] = toupper(uchar(s[i])); + luaL_pushresultsize(&b, l); + return 1; +} + + +static int str_rep (lua_State *L) { + size_t l, lsep; + const char *s = luaL_checklstring(L, 1, &l); + lua_Integer n = luaL_checkinteger(L, 2); + const char *sep = luaL_optlstring(L, 3, "", &lsep); + if (n <= 0) + lua_pushliteral(L, ""); + else if (l_unlikely(l + lsep < l || l + lsep > MAXSIZE / n)) + return luaL_error(L, "resulting string too large"); + else { + size_t totallen = (size_t)n * l + (size_t)(n - 1) * lsep; + luaL_Buffer b; + char *p = luaL_buffinitsize(L, &b, totallen); + while (n-- > 1) { /* first n-1 copies (followed by separator) */ + memcpy(p, s, l * sizeof(char)); p += l; + if (lsep > 0) { /* empty 'memcpy' is not that cheap */ + memcpy(p, sep, lsep * sizeof(char)); + p += lsep; + } + } + memcpy(p, s, l * sizeof(char)); /* last copy (not followed by separator) */ + luaL_pushresultsize(&b, totallen); + } + return 1; +} + + +static int str_byte (lua_State *L) { + size_t l; + const char *s = luaL_checklstring(L, 1, &l); + lua_Integer pi = luaL_optinteger(L, 2, 1); + size_t posi = posrelatI(pi, l); + size_t pose = getendpos(L, 3, pi, l); + int n, i; + if (posi > pose) return 0; /* empty interval; return no values */ + if (l_unlikely(pose - posi >= (size_t)INT_MAX)) /* arithmetic overflow? */ + return luaL_error(L, "string slice too long"); + n = (int)(pose - posi) + 1; + luaL_checkstack(L, n, "string slice too long"); + for (i=0; i<n; i++) + lua_pushinteger(L, uchar(s[posi+i-1])); + return n; +} + + +static int str_char (lua_State *L) { + int n = lua_gettop(L); /* number of arguments */ + int i; + luaL_Buffer b; + char *p = luaL_buffinitsize(L, &b, n); + for (i=1; i<=n; i++) { + lua_Unsigned c = (lua_Unsigned)luaL_checkinteger(L, i); + luaL_argcheck(L, c <= (lua_Unsigned)UCHAR_MAX, i, "value out of range"); + p[i - 1] = uchar(c); + } + luaL_pushresultsize(&b, n); + return 1; +} + + +/* +** Buffer to store the result of 'string.dump'. It must be initialized +** after the call to 'lua_dump', to ensure that the function is on the +** top of the stack when 'lua_dump' is called. ('luaL_buffinit' might +** push stuff.) +*/ +struct str_Writer { + int init; /* true iff buffer has been initialized */ + luaL_Buffer B; +}; + + +static int writer (lua_State *L, const void *b, size_t size, void *ud) { + struct str_Writer *state = (struct str_Writer *)ud; + if (!state->init) { + state->init = 1; + luaL_buffinit(L, &state->B); + } + luaL_addlstring(&state->B, (const char *)b, size); + return 0; +} + + +static int str_dump (lua_State *L) { + struct str_Writer state; + int strip = lua_toboolean(L, 2); + luaL_checktype(L, 1, LUA_TFUNCTION); + lua_settop(L, 1); /* ensure function is on the top of the stack */ + state.init = 0; + if (l_unlikely(lua_dump(L, writer, &state, strip) != 0)) + return luaL_error(L, "unable to dump given function"); + luaL_pushresult(&state.B); + return 1; +} + + + +/* +** {====================================================== +** METAMETHODS +** ======================================================= +*/ + +#if defined(LUA_NOCVTS2N) /* { */ + +/* no coercion from strings to numbers */ + +static const luaL_Reg stringmetamethods[] = { + {"__index", NULL}, /* placeholder */ + {NULL, NULL} +}; + +#else /* }{ */ + +static int tonum (lua_State *L, int arg) { + if (lua_type(L, arg) == LUA_TNUMBER) { /* already a number? */ + lua_pushvalue(L, arg); + return 1; + } + else { /* check whether it is a numerical string */ + size_t len; + const char *s = lua_tolstring(L, arg, &len); + return (s != NULL && lua_stringtonumber(L, s) == len + 1); + } +} + + +static void trymt (lua_State *L, const char *mtname) { + lua_settop(L, 2); /* back to the original arguments */ + if (l_unlikely(lua_type(L, 2) == LUA_TSTRING || + !luaL_getmetafield(L, 2, mtname))) + luaL_error(L, "attempt to %s a '%s' with a '%s'", mtname + 2, + luaL_typename(L, -2), luaL_typename(L, -1)); + lua_insert(L, -3); /* put metamethod before arguments */ + lua_call(L, 2, 1); /* call metamethod */ +} + + +static int arith (lua_State *L, int op, const char *mtname) { + if (tonum(L, 1) && tonum(L, 2)) + lua_arith(L, op); /* result will be on the top */ + else + trymt(L, mtname); + return 1; +} + + +static int arith_add (lua_State *L) { + return arith(L, LUA_OPADD, "__add"); +} + +static int arith_sub (lua_State *L) { + return arith(L, LUA_OPSUB, "__sub"); +} + +static int arith_mul (lua_State *L) { + return arith(L, LUA_OPMUL, "__mul"); +} + +static int arith_mod (lua_State *L) { + return arith(L, LUA_OPMOD, "__mod"); +} + +static int arith_pow (lua_State *L) { + return arith(L, LUA_OPPOW, "__pow"); +} + +static int arith_div (lua_State *L) { + return arith(L, LUA_OPDIV, "__div"); +} + +static int arith_idiv (lua_State *L) { + return arith(L, LUA_OPIDIV, "__idiv"); +} + +static int arith_unm (lua_State *L) { + return arith(L, LUA_OPUNM, "__unm"); +} + + +static const luaL_Reg stringmetamethods[] = { + {"__add", arith_add}, + {"__sub", arith_sub}, + {"__mul", arith_mul}, + {"__mod", arith_mod}, + {"__pow", arith_pow}, + {"__div", arith_div}, + {"__idiv", arith_idiv}, + {"__unm", arith_unm}, + {"__index", NULL}, /* placeholder */ + {NULL, NULL} +}; + +#endif /* } */ + +/* }====================================================== */ + +/* +** {====================================================== +** PATTERN MATCHING +** ======================================================= +*/ + + +#define CAP_UNFINISHED (-1) +#define CAP_POSITION (-2) + + +typedef struct MatchState { + const char *src_init; /* init of source string */ + const char *src_end; /* end ('\0') of source string */ + const char *p_end; /* end ('\0') of pattern */ + lua_State *L; + int matchdepth; /* control for recursive depth (to avoid C stack overflow) */ + unsigned char level; /* total number of captures (finished or unfinished) */ + struct { + const char *init; + ptrdiff_t len; + } capture[LUA_MAXCAPTURES]; +} MatchState; + + +/* recursive function */ +static const char *match (MatchState *ms, const char *s, const char *p); + + +/* maximum recursion depth for 'match' */ +#if !defined(MAXCCALLS) +#define MAXCCALLS 200 +#endif + + +#define L_ESC '%' +#define SPECIALS "^$*+?.([%-" + + +static int check_capture (MatchState *ms, int l) { + l -= '1'; + if (l_unlikely(l < 0 || l >= ms->level || + ms->capture[l].len == CAP_UNFINISHED)) + return luaL_error(ms->L, "invalid capture index %%%d", l + 1); + return l; +} + + +static int capture_to_close (MatchState *ms) { + int level = ms->level; + for (level--; level>=0; level--) + if (ms->capture[level].len == CAP_UNFINISHED) return level; + return luaL_error(ms->L, "invalid pattern capture"); +} + + +static const char *classend (MatchState *ms, const char *p) { + switch (*p++) { + case L_ESC: { + if (l_unlikely(p == ms->p_end)) + luaL_error(ms->L, "malformed pattern (ends with '%%')"); + return p+1; + } + case '[': { + if (*p == '^') p++; + do { /* look for a ']' */ + if (l_unlikely(p == ms->p_end)) + luaL_error(ms->L, "malformed pattern (missing ']')"); + if (*(p++) == L_ESC && p < ms->p_end) + p++; /* skip escapes (e.g. '%]') */ + } while (*p != ']'); + return p+1; + } + default: { + return p; + } + } +} + + +static int match_class (int c, int cl) { + int res; + switch (tolower(cl)) { + case 'a' : res = isalpha(c); break; + case 'c' : res = iscntrl(c); break; + case 'd' : res = isdigit(c); break; + case 'g' : res = isgraph(c); break; + case 'l' : res = islower(c); break; + case 'p' : res = ispunct(c); break; + case 's' : res = isspace(c); break; + case 'u' : res = isupper(c); break; + case 'w' : res = isalnum(c); break; + case 'x' : res = isxdigit(c); break; + case 'z' : res = (c == 0); break; /* deprecated option */ + default: return (cl == c); + } + return (islower(cl) ? res : !res); +} + + +static int matchbracketclass (int c, const char *p, const char *ec) { + int sig = 1; + if (*(p+1) == '^') { + sig = 0; + p++; /* skip the '^' */ + } + while (++p < ec) { + if (*p == L_ESC) { + p++; + if (match_class(c, uchar(*p))) + return sig; + } + else if ((*(p+1) == '-') && (p+2 < ec)) { + p+=2; + if (uchar(*(p-2)) <= c && c <= uchar(*p)) + return sig; + } + else if (uchar(*p) == c) return sig; + } + return !sig; +} + + +static int singlematch (MatchState *ms, const char *s, const char *p, + const char *ep) { + if (s >= ms->src_end) + return 0; + else { + int c = uchar(*s); + switch (*p) { + case '.': return 1; /* matches any char */ + case L_ESC: return match_class(c, uchar(*(p+1))); + case '[': return matchbracketclass(c, p, ep-1); + default: return (uchar(*p) == c); + } + } +} + + +static const char *matchbalance (MatchState *ms, const char *s, + const char *p) { + if (l_unlikely(p >= ms->p_end - 1)) + luaL_error(ms->L, "malformed pattern (missing arguments to '%%b')"); + if (*s != *p) return NULL; + else { + int b = *p; + int e = *(p+1); + int cont = 1; + while (++s < ms->src_end) { + if (*s == e) { + if (--cont == 0) return s+1; + } + else if (*s == b) cont++; + } + } + return NULL; /* string ends out of balance */ +} + + +static const char *max_expand (MatchState *ms, const char *s, + const char *p, const char *ep) { + ptrdiff_t i = 0; /* counts maximum expand for item */ + while (singlematch(ms, s + i, p, ep)) + i++; + /* keeps trying to match with the maximum repetitions */ + while (i>=0) { + const char *res = match(ms, (s+i), ep+1); + if (res) return res; + i--; /* else didn't match; reduce 1 repetition to try again */ + } + return NULL; +} + + +static const char *min_expand (MatchState *ms, const char *s, + const char *p, const char *ep) { + for (;;) { + const char *res = match(ms, s, ep+1); + if (res != NULL) + return res; + else if (singlematch(ms, s, p, ep)) + s++; /* try with one more repetition */ + else return NULL; + } +} + + +static const char *start_capture (MatchState *ms, const char *s, + const char *p, int what) { + const char *res; + int level = ms->level; + if (level >= LUA_MAXCAPTURES) luaL_error(ms->L, "too many captures"); + ms->capture[level].init = s; + ms->capture[level].len = what; + ms->level = level+1; + if ((res=match(ms, s, p)) == NULL) /* match failed? */ + ms->level--; /* undo capture */ + return res; +} + + +static const char *end_capture (MatchState *ms, const char *s, + const char *p) { + int l = capture_to_close(ms); + const char *res; + ms->capture[l].len = s - ms->capture[l].init; /* close capture */ + if ((res = match(ms, s, p)) == NULL) /* match failed? */ + ms->capture[l].len = CAP_UNFINISHED; /* undo capture */ + return res; +} + + +static const char *match_capture (MatchState *ms, const char *s, int l) { + size_t len; + l = check_capture(ms, l); + len = ms->capture[l].len; + if ((size_t)(ms->src_end-s) >= len && + memcmp(ms->capture[l].init, s, len) == 0) + return s+len; + else return NULL; +} + + +static const char *match (MatchState *ms, const char *s, const char *p) { + if (l_unlikely(ms->matchdepth-- == 0)) + luaL_error(ms->L, "pattern too complex"); + init: /* using goto to optimize tail recursion */ + if (p != ms->p_end) { /* end of pattern? */ + switch (*p) { + case '(': { /* start capture */ + if (*(p + 1) == ')') /* position capture? */ + s = start_capture(ms, s, p + 2, CAP_POSITION); + else + s = start_capture(ms, s, p + 1, CAP_UNFINISHED); + break; + } + case ')': { /* end capture */ + s = end_capture(ms, s, p + 1); + break; + } + case '$': { + if ((p + 1) != ms->p_end) /* is the '$' the last char in pattern? */ + goto dflt; /* no; go to default */ + s = (s == ms->src_end) ? s : NULL; /* check end of string */ + break; + } + case L_ESC: { /* escaped sequences not in the format class[*+?-]? */ + switch (*(p + 1)) { + case 'b': { /* balanced string? */ + s = matchbalance(ms, s, p + 2); + if (s != NULL) { + p += 4; goto init; /* return match(ms, s, p + 4); */ + } /* else fail (s == NULL) */ + break; + } + case 'f': { /* frontier? */ + const char *ep; char previous; + p += 2; + if (l_unlikely(*p != '[')) + luaL_error(ms->L, "missing '[' after '%%f' in pattern"); + ep = classend(ms, p); /* points to what is next */ + previous = (s == ms->src_init) ? '\0' : *(s - 1); + if (!matchbracketclass(uchar(previous), p, ep - 1) && + matchbracketclass(uchar(*s), p, ep - 1)) { + p = ep; goto init; /* return match(ms, s, ep); */ + } + s = NULL; /* match failed */ + break; + } + case '0': case '1': case '2': case '3': + case '4': case '5': case '6': case '7': + case '8': case '9': { /* capture results (%0-%9)? */ + s = match_capture(ms, s, uchar(*(p + 1))); + if (s != NULL) { + p += 2; goto init; /* return match(ms, s, p + 2) */ + } + break; + } + default: goto dflt; + } + break; + } + default: dflt: { /* pattern class plus optional suffix */ + const char *ep = classend(ms, p); /* points to optional suffix */ + /* does not match at least once? */ + if (!singlematch(ms, s, p, ep)) { + if (*ep == '*' || *ep == '?' || *ep == '-') { /* accept empty? */ + p = ep + 1; goto init; /* return match(ms, s, ep + 1); */ + } + else /* '+' or no suffix */ + s = NULL; /* fail */ + } + else { /* matched once */ + switch (*ep) { /* handle optional suffix */ + case '?': { /* optional */ + const char *res; + if ((res = match(ms, s + 1, ep + 1)) != NULL) + s = res; + else { + p = ep + 1; goto init; /* else return match(ms, s, ep + 1); */ + } + break; + } + case '+': /* 1 or more repetitions */ + s++; /* 1 match already done */ + /* FALLTHROUGH */ + case '*': /* 0 or more repetitions */ + s = max_expand(ms, s, p, ep); + break; + case '-': /* 0 or more repetitions (minimum) */ + s = min_expand(ms, s, p, ep); + break; + default: /* no suffix */ + s++; p = ep; goto init; /* return match(ms, s + 1, ep); */ + } + } + break; + } + } + } + ms->matchdepth++; + return s; +} + + + +static const char *lmemfind (const char *s1, size_t l1, + const char *s2, size_t l2) { + if (l2 == 0) return s1; /* empty strings are everywhere */ + else if (l2 > l1) return NULL; /* avoids a negative 'l1' */ + else { + const char *init; /* to search for a '*s2' inside 's1' */ + l2--; /* 1st char will be checked by 'memchr' */ + l1 = l1-l2; /* 's2' cannot be found after that */ + while (l1 > 0 && (init = (const char *)memchr(s1, *s2, l1)) != NULL) { + init++; /* 1st char is already checked */ + if (memcmp(init, s2+1, l2) == 0) + return init-1; + else { /* correct 'l1' and 's1' to try again */ + l1 -= init-s1; + s1 = init; + } + } + return NULL; /* not found */ + } +} + + +/* +** get information about the i-th capture. If there are no captures +** and 'i==0', return information about the whole match, which +** is the range 's'..'e'. If the capture is a string, return +** its length and put its address in '*cap'. If it is an integer +** (a position), push it on the stack and return CAP_POSITION. +*/ +static size_t get_onecapture (MatchState *ms, int i, const char *s, + const char *e, const char **cap) { + if (i >= ms->level) { + if (l_unlikely(i != 0)) + luaL_error(ms->L, "invalid capture index %%%d", i + 1); + *cap = s; + return e - s; + } + else { + ptrdiff_t capl = ms->capture[i].len; + *cap = ms->capture[i].init; + if (l_unlikely(capl == CAP_UNFINISHED)) + luaL_error(ms->L, "unfinished capture"); + else if (capl == CAP_POSITION) + lua_pushinteger(ms->L, (ms->capture[i].init - ms->src_init) + 1); + return capl; + } +} + + +/* +** Push the i-th capture on the stack. +*/ +static void push_onecapture (MatchState *ms, int i, const char *s, + const char *e) { + const char *cap; + ptrdiff_t l = get_onecapture(ms, i, s, e, &cap); + if (l != CAP_POSITION) + lua_pushlstring(ms->L, cap, l); + /* else position was already pushed */ +} + + +static int push_captures (MatchState *ms, const char *s, const char *e) { + int i; + int nlevels = (ms->level == 0 && s) ? 1 : ms->level; + luaL_checkstack(ms->L, nlevels, "too many captures"); + for (i = 0; i < nlevels; i++) + push_onecapture(ms, i, s, e); + return nlevels; /* number of strings pushed */ +} + + +/* check whether pattern has no special characters */ +static int nospecials (const char *p, size_t l) { + size_t upto = 0; + do { + if (strpbrk(p + upto, SPECIALS)) + return 0; /* pattern has a special character */ + upto += strlen(p + upto) + 1; /* may have more after \0 */ + } while (upto <= l); + return 1; /* no special chars found */ +} + + +static void prepstate (MatchState *ms, lua_State *L, + const char *s, size_t ls, const char *p, size_t lp) { + ms->L = L; + ms->matchdepth = MAXCCALLS; + ms->src_init = s; + ms->src_end = s + ls; + ms->p_end = p + lp; +} + + +static void reprepstate (MatchState *ms) { + ms->level = 0; + lua_assert(ms->matchdepth == MAXCCALLS); +} + + +static int str_find_aux (lua_State *L, int find) { + size_t ls, lp; + const char *s = luaL_checklstring(L, 1, &ls); + const char *p = luaL_checklstring(L, 2, &lp); + size_t init = posrelatI(luaL_optinteger(L, 3, 1), ls) - 1; + if (init > ls) { /* start after string's end? */ + luaL_pushfail(L); /* cannot find anything */ + return 1; + } + /* explicit request or no special characters? */ + if (find && (lua_toboolean(L, 4) || nospecials(p, lp))) { + /* do a plain search */ + const char *s2 = lmemfind(s + init, ls - init, p, lp); + if (s2) { + lua_pushinteger(L, (s2 - s) + 1); + lua_pushinteger(L, (s2 - s) + lp); + return 2; + } + } + else { + MatchState ms; + const char *s1 = s + init; + int anchor = (*p == '^'); + if (anchor) { + p++; lp--; /* skip anchor character */ + } + prepstate(&ms, L, s, ls, p, lp); + do { + const char *res; + reprepstate(&ms); + if ((res=match(&ms, s1, p)) != NULL) { + if (find) { + lua_pushinteger(L, (s1 - s) + 1); /* start */ + lua_pushinteger(L, res - s); /* end */ + return push_captures(&ms, NULL, 0) + 2; + } + else + return push_captures(&ms, s1, res); + } + } while (s1++ < ms.src_end && !anchor); + } + luaL_pushfail(L); /* not found */ + return 1; +} + + +static int str_find (lua_State *L) { + return str_find_aux(L, 1); +} + + +static int str_match (lua_State *L) { + return str_find_aux(L, 0); +} + + +/* state for 'gmatch' */ +typedef struct GMatchState { + const char *src; /* current position */ + const char *p; /* pattern */ + const char *lastmatch; /* end of last match */ + MatchState ms; /* match state */ +} GMatchState; + + +static int gmatch_aux (lua_State *L) { + GMatchState *gm = (GMatchState *)lua_touserdata(L, lua_upvalueindex(3)); + const char *src; + gm->ms.L = L; + for (src = gm->src; src <= gm->ms.src_end; src++) { + const char *e; + reprepstate(&gm->ms); + if ((e = match(&gm->ms, src, gm->p)) != NULL && e != gm->lastmatch) { + gm->src = gm->lastmatch = e; + return push_captures(&gm->ms, src, e); + } + } + return 0; /* not found */ +} + + +static int gmatch (lua_State *L) { + size_t ls, lp; + const char *s = luaL_checklstring(L, 1, &ls); + const char *p = luaL_checklstring(L, 2, &lp); + size_t init = posrelatI(luaL_optinteger(L, 3, 1), ls) - 1; + GMatchState *gm; + lua_settop(L, 2); /* keep strings on closure to avoid being collected */ + gm = (GMatchState *)lua_newuserdatauv(L, sizeof(GMatchState), 0); + if (init > ls) /* start after string's end? */ + init = ls + 1; /* avoid overflows in 's + init' */ + prepstate(&gm->ms, L, s, ls, p, lp); + gm->src = s + init; gm->p = p; gm->lastmatch = NULL; + lua_pushcclosure(L, gmatch_aux, 3); + return 1; +} + + +static void add_s (MatchState *ms, luaL_Buffer *b, const char *s, + const char *e) { + size_t l; + lua_State *L = ms->L; + const char *news = lua_tolstring(L, 3, &l); + const char *p; + while ((p = (char *)memchr(news, L_ESC, l)) != NULL) { + luaL_addlstring(b, news, p - news); + p++; /* skip ESC */ + if (*p == L_ESC) /* '%%' */ + luaL_addchar(b, *p); + else if (*p == '0') /* '%0' */ + luaL_addlstring(b, s, e - s); + else if (isdigit(uchar(*p))) { /* '%n' */ + const char *cap; + ptrdiff_t resl = get_onecapture(ms, *p - '1', s, e, &cap); + if (resl == CAP_POSITION) + luaL_addvalue(b); /* add position to accumulated result */ + else + luaL_addlstring(b, cap, resl); + } + else + luaL_error(L, "invalid use of '%c' in replacement string", L_ESC); + l -= p + 1 - news; + news = p + 1; + } + luaL_addlstring(b, news, l); +} + + +/* +** Add the replacement value to the string buffer 'b'. +** Return true if the original string was changed. (Function calls and +** table indexing resulting in nil or false do not change the subject.) +*/ +static int add_value (MatchState *ms, luaL_Buffer *b, const char *s, + const char *e, int tr) { + lua_State *L = ms->L; + switch (tr) { + case LUA_TFUNCTION: { /* call the function */ + int n; + lua_pushvalue(L, 3); /* push the function */ + n = push_captures(ms, s, e); /* all captures as arguments */ + lua_call(L, n, 1); /* call it */ + break; + } + case LUA_TTABLE: { /* index the table */ + push_onecapture(ms, 0, s, e); /* first capture is the index */ + lua_gettable(L, 3); + break; + } + default: { /* LUA_TNUMBER or LUA_TSTRING */ + add_s(ms, b, s, e); /* add value to the buffer */ + return 1; /* something changed */ + } + } + if (!lua_toboolean(L, -1)) { /* nil or false? */ + lua_pop(L, 1); /* remove value */ + luaL_addlstring(b, s, e - s); /* keep original text */ + return 0; /* no changes */ + } + else if (l_unlikely(!lua_isstring(L, -1))) + return luaL_error(L, "invalid replacement value (a %s)", + luaL_typename(L, -1)); + else { + luaL_addvalue(b); /* add result to accumulator */ + return 1; /* something changed */ + } +} + + +static int str_gsub (lua_State *L) { + size_t srcl, lp; + const char *src = luaL_checklstring(L, 1, &srcl); /* subject */ + const char *p = luaL_checklstring(L, 2, &lp); /* pattern */ + const char *lastmatch = NULL; /* end of last match */ + int tr = lua_type(L, 3); /* replacement type */ + lua_Integer max_s = luaL_optinteger(L, 4, srcl + 1); /* max replacements */ + int anchor = (*p == '^'); + lua_Integer n = 0; /* replacement count */ + int changed = 0; /* change flag */ + MatchState ms; + luaL_Buffer b; + luaL_argexpected(L, tr == LUA_TNUMBER || tr == LUA_TSTRING || + tr == LUA_TFUNCTION || tr == LUA_TTABLE, 3, + "string/function/table"); + luaL_buffinit(L, &b); + if (anchor) { + p++; lp--; /* skip anchor character */ + } + prepstate(&ms, L, src, srcl, p, lp); + while (n < max_s) { + const char *e; + reprepstate(&ms); /* (re)prepare state for new match */ + if ((e = match(&ms, src, p)) != NULL && e != lastmatch) { /* match? */ + n++; + changed = add_value(&ms, &b, src, e, tr) | changed; + src = lastmatch = e; + } + else if (src < ms.src_end) /* otherwise, skip one character */ + luaL_addchar(&b, *src++); + else break; /* end of subject */ + if (anchor) break; + } + if (!changed) /* no changes? */ + lua_pushvalue(L, 1); /* return original string */ + else { /* something changed */ + luaL_addlstring(&b, src, ms.src_end-src); + luaL_pushresult(&b); /* create and return new string */ + } + lua_pushinteger(L, n); /* number of substitutions */ + return 2; +} + +/* }====================================================== */ + + + +/* +** {====================================================== +** STRING FORMAT +** ======================================================= +*/ + +#if !defined(lua_number2strx) /* { */ + +/* +** Hexadecimal floating-point formatter +*/ + +#define SIZELENMOD (sizeof(LUA_NUMBER_FRMLEN)/sizeof(char)) + + +/* +** Number of bits that goes into the first digit. It can be any value +** between 1 and 4; the following definition tries to align the number +** to nibble boundaries by making what is left after that first digit a +** multiple of 4. +*/ +#define L_NBFD ((l_floatatt(MANT_DIG) - 1)%4 + 1) + + +/* +** Add integer part of 'x' to buffer and return new 'x' +*/ +static lua_Number adddigit (char *buff, int n, lua_Number x) { + lua_Number dd = l_mathop(floor)(x); /* get integer part from 'x' */ + int d = (int)dd; + buff[n] = (d < 10 ? d + '0' : d - 10 + 'a'); /* add to buffer */ + return x - dd; /* return what is left */ +} + + +static int num2straux (char *buff, int sz, lua_Number x) { + /* if 'inf' or 'NaN', format it like '%g' */ + if (x != x || x == (lua_Number)HUGE_VAL || x == -(lua_Number)HUGE_VAL) + return l_sprintf(buff, sz, LUA_NUMBER_FMT, (LUAI_UACNUMBER)x); + else if (x == 0) { /* can be -0... */ + /* create "0" or "-0" followed by exponent */ + return l_sprintf(buff, sz, LUA_NUMBER_FMT "x0p+0", (LUAI_UACNUMBER)x); + } + else { + int e; + lua_Number m = l_mathop(frexp)(x, &e); /* 'x' fraction and exponent */ + int n = 0; /* character count */ + if (m < 0) { /* is number negative? */ + buff[n++] = '-'; /* add sign */ + m = -m; /* make it positive */ + } + buff[n++] = '0'; buff[n++] = 'x'; /* add "0x" */ + m = adddigit(buff, n++, m * (1 << L_NBFD)); /* add first digit */ + e -= L_NBFD; /* this digit goes before the radix point */ + if (m > 0) { /* more digits? */ + buff[n++] = lua_getlocaledecpoint(); /* add radix point */ + do { /* add as many digits as needed */ + m = adddigit(buff, n++, m * 16); + } while (m > 0); + } + n += l_sprintf(buff + n, sz - n, "p%+d", e); /* add exponent */ + lua_assert(n < sz); + return n; + } +} + + +static int lua_number2strx (lua_State *L, char *buff, int sz, + const char *fmt, lua_Number x) { + int n = num2straux(buff, sz, x); + if (fmt[SIZELENMOD] == 'A') { + int i; + for (i = 0; i < n; i++) + buff[i] = toupper(uchar(buff[i])); + } + else if (l_unlikely(fmt[SIZELENMOD] != 'a')) + return luaL_error(L, "modifiers for format '%%a'/'%%A' not implemented"); + return n; +} + +#endif /* } */ + + +/* +** Maximum size for items formatted with '%f'. This size is produced +** by format('%.99f', -maxfloat), and is equal to 99 + 3 ('-', '.', +** and '\0') + number of decimal digits to represent maxfloat (which +** is maximum exponent + 1). (99+3+1, adding some extra, 110) +*/ +#define MAX_ITEMF (110 + l_floatatt(MAX_10_EXP)) + + +/* +** All formats except '%f' do not need that large limit. The other +** float formats use exponents, so that they fit in the 99 limit for +** significant digits; 's' for large strings and 'q' add items directly +** to the buffer; all integer formats also fit in the 99 limit. The +** worst case are floats: they may need 99 significant digits, plus +** '0x', '-', '.', 'e+XXXX', and '\0'. Adding some extra, 120. +*/ +#define MAX_ITEM 120 + + +/* valid flags in a format specification */ +#if !defined(L_FMTFLAGSF) + +/* valid flags for a, A, e, E, f, F, g, and G conversions */ +#define L_FMTFLAGSF "-+#0 " + +/* valid flags for o, x, and X conversions */ +#define L_FMTFLAGSX "-#0" + +/* valid flags for d and i conversions */ +#define L_FMTFLAGSI "-+0 " + +/* valid flags for u conversions */ +#define L_FMTFLAGSU "-0" + +/* valid flags for c, p, and s conversions */ +#define L_FMTFLAGSC "-" + +#endif + + +/* +** Maximum size of each format specification (such as "%-099.99d"): +** Initial '%', flags (up to 5), width (2), period, precision (2), +** length modifier (8), conversion specifier, and final '\0', plus some +** extra. +*/ +#define MAX_FORMAT 32 + + +static void addquoted (luaL_Buffer *b, const char *s, size_t len) { + luaL_addchar(b, '"'); + while (len--) { + if (*s == '"' || *s == '\\' || *s == '\n') { + luaL_addchar(b, '\\'); + luaL_addchar(b, *s); + } + else if (iscntrl(uchar(*s))) { + char buff[10]; + if (!isdigit(uchar(*(s+1)))) + l_sprintf(buff, sizeof(buff), "\\%d", (int)uchar(*s)); + else + l_sprintf(buff, sizeof(buff), "\\%03d", (int)uchar(*s)); + luaL_addstring(b, buff); + } + else + luaL_addchar(b, *s); + s++; + } + luaL_addchar(b, '"'); +} + + +/* +** Serialize a floating-point number in such a way that it can be +** scanned back by Lua. Use hexadecimal format for "common" numbers +** (to preserve precision); inf, -inf, and NaN are handled separately. +** (NaN cannot be expressed as a numeral, so we write '(0/0)' for it.) +*/ +static int quotefloat (lua_State *L, char *buff, lua_Number n) { + const char *s; /* for the fixed representations */ + if (n == (lua_Number)HUGE_VAL) /* inf? */ + s = "1e9999"; + else if (n == -(lua_Number)HUGE_VAL) /* -inf? */ + s = "-1e9999"; + else if (n != n) /* NaN? */ + s = "(0/0)"; + else { /* format number as hexadecimal */ + int nb = lua_number2strx(L, buff, MAX_ITEM, + "%" LUA_NUMBER_FRMLEN "a", n); + /* ensures that 'buff' string uses a dot as the radix character */ + if (memchr(buff, '.', nb) == NULL) { /* no dot? */ + char point = lua_getlocaledecpoint(); /* try locale point */ + char *ppoint = (char *)memchr(buff, point, nb); + if (ppoint) *ppoint = '.'; /* change it to a dot */ + } + return nb; + } + /* for the fixed representations */ + return l_sprintf(buff, MAX_ITEM, "%s", s); +} + + +static void addliteral (lua_State *L, luaL_Buffer *b, int arg) { + switch (lua_type(L, arg)) { + case LUA_TSTRING: { + size_t len; + const char *s = lua_tolstring(L, arg, &len); + addquoted(b, s, len); + break; + } + case LUA_TNUMBER: { + char *buff = luaL_prepbuffsize(b, MAX_ITEM); + int nb; + if (!lua_isinteger(L, arg)) /* float? */ + nb = quotefloat(L, buff, lua_tonumber(L, arg)); + else { /* integers */ + lua_Integer n = lua_tointeger(L, arg); + const char *format = (n == LUA_MININTEGER) /* corner case? */ + ? "0x%" LUA_INTEGER_FRMLEN "x" /* use hex */ + : LUA_INTEGER_FMT; /* else use default format */ + nb = l_sprintf(buff, MAX_ITEM, format, (LUAI_UACINT)n); + } + luaL_addsize(b, nb); + break; + } + case LUA_TNIL: case LUA_TBOOLEAN: { + luaL_tolstring(L, arg, NULL); + luaL_addvalue(b); + break; + } + default: { + luaL_argerror(L, arg, "value has no literal form"); + } + } +} + + +static const char *get2digits (const char *s) { + if (isdigit(uchar(*s))) { + s++; + if (isdigit(uchar(*s))) s++; /* (2 digits at most) */ + } + return s; +} + + +/* +** Check whether a conversion specification is valid. When called, +** first character in 'form' must be '%' and last character must +** be a valid conversion specifier. 'flags' are the accepted flags; +** 'precision' signals whether to accept a precision. +*/ +static void checkformat (lua_State *L, const char *form, const char *flags, + int precision) { + const char *spec = form + 1; /* skip '%' */ + spec += strspn(spec, flags); /* skip flags */ + if (*spec != '0') { /* a width cannot start with '0' */ + spec = get2digits(spec); /* skip width */ + if (*spec == '.' && precision) { + spec++; + spec = get2digits(spec); /* skip precision */ + } + } + if (!isalpha(uchar(*spec))) /* did not go to the end? */ + luaL_error(L, "invalid conversion specification: '%s'", form); +} + + +/* +** Get a conversion specification and copy it to 'form'. +** Return the address of its last character. +*/ +static const char *getformat (lua_State *L, const char *strfrmt, + char *form) { + /* spans flags, width, and precision ('0' is included as a flag) */ + size_t len = strspn(strfrmt, L_FMTFLAGSF "123456789."); + len++; /* adds following character (should be the specifier) */ + /* still needs space for '%', '\0', plus a length modifier */ + if (len >= MAX_FORMAT - 10) + luaL_error(L, "invalid format (too long)"); + *(form++) = '%'; + memcpy(form, strfrmt, len * sizeof(char)); + *(form + len) = '\0'; + return strfrmt + len - 1; +} + + +/* +** add length modifier into formats +*/ +static void addlenmod (char *form, const char *lenmod) { + size_t l = strlen(form); + size_t lm = strlen(lenmod); + char spec = form[l - 1]; + strcpy(form + l - 1, lenmod); + form[l + lm - 1] = spec; + form[l + lm] = '\0'; +} + + +static int str_format (lua_State *L) { + int top = lua_gettop(L); + int arg = 1; + size_t sfl; + const char *strfrmt = luaL_checklstring(L, arg, &sfl); + const char *strfrmt_end = strfrmt+sfl; + const char *flags; + luaL_Buffer b; + luaL_buffinit(L, &b); + while (strfrmt < strfrmt_end) { + if (*strfrmt != L_ESC) + luaL_addchar(&b, *strfrmt++); + else if (*++strfrmt == L_ESC) + luaL_addchar(&b, *strfrmt++); /* %% */ + else { /* format item */ + char form[MAX_FORMAT]; /* to store the format ('%...') */ + int maxitem = MAX_ITEM; /* maximum length for the result */ + char *buff = luaL_prepbuffsize(&b, maxitem); /* to put result */ + int nb = 0; /* number of bytes in result */ + if (++arg > top) + return luaL_argerror(L, arg, "no value"); + strfrmt = getformat(L, strfrmt, form); + switch (*strfrmt++) { + case 'c': { + checkformat(L, form, L_FMTFLAGSC, 0); + nb = l_sprintf(buff, maxitem, form, (int)luaL_checkinteger(L, arg)); + break; + } + case 'd': case 'i': + flags = L_FMTFLAGSI; + goto intcase; + case 'u': + flags = L_FMTFLAGSU; + goto intcase; + case 'o': case 'x': case 'X': + flags = L_FMTFLAGSX; + intcase: { + lua_Integer n = luaL_checkinteger(L, arg); + checkformat(L, form, flags, 1); + addlenmod(form, LUA_INTEGER_FRMLEN); + nb = l_sprintf(buff, maxitem, form, (LUAI_UACINT)n); + break; + } + case 'a': case 'A': + checkformat(L, form, L_FMTFLAGSF, 1); + addlenmod(form, LUA_NUMBER_FRMLEN); + nb = lua_number2strx(L, buff, maxitem, form, + luaL_checknumber(L, arg)); + break; + case 'f': + maxitem = MAX_ITEMF; /* extra space for '%f' */ + buff = luaL_prepbuffsize(&b, maxitem); + /* FALLTHROUGH */ + case 'e': case 'E': case 'g': case 'G': { + lua_Number n = luaL_checknumber(L, arg); + checkformat(L, form, L_FMTFLAGSF, 1); + addlenmod(form, LUA_NUMBER_FRMLEN); + nb = l_sprintf(buff, maxitem, form, (LUAI_UACNUMBER)n); + break; + } + case 'p': { + const void *p = lua_topointer(L, arg); + checkformat(L, form, L_FMTFLAGSC, 0); + if (p == NULL) { /* avoid calling 'printf' with argument NULL */ + p = "(null)"; /* result */ + form[strlen(form) - 1] = 's'; /* format it as a string */ + } + nb = l_sprintf(buff, maxitem, form, p); + break; + } + case 'q': { + if (form[2] != '\0') /* modifiers? */ + return luaL_error(L, "specifier '%%q' cannot have modifiers"); + addliteral(L, &b, arg); + break; + } + case 's': { + size_t l; + const char *s = luaL_tolstring(L, arg, &l); + if (form[2] == '\0') /* no modifiers? */ + luaL_addvalue(&b); /* keep entire string */ + else { + luaL_argcheck(L, l == strlen(s), arg, "string contains zeros"); + checkformat(L, form, L_FMTFLAGSC, 1); + if (strchr(form, '.') == NULL && l >= 100) { + /* no precision and string is too long to be formatted */ + luaL_addvalue(&b); /* keep entire string */ + } + else { /* format the string into 'buff' */ + nb = l_sprintf(buff, maxitem, form, s); + lua_pop(L, 1); /* remove result from 'luaL_tolstring' */ + } + } + break; + } + default: { /* also treat cases 'pnLlh' */ + return luaL_error(L, "invalid conversion '%s' to 'format'", form); + } + } + lua_assert(nb < maxitem); + luaL_addsize(&b, nb); + } + } + luaL_pushresult(&b); + return 1; +} + +/* }====================================================== */ + + +/* +** {====================================================== +** PACK/UNPACK +** ======================================================= +*/ + + +/* value used for padding */ +#if !defined(LUAL_PACKPADBYTE) +#define LUAL_PACKPADBYTE 0x00 +#endif + +/* maximum size for the binary representation of an integer */ +#define MAXINTSIZE 16 + +/* number of bits in a character */ +#define NB CHAR_BIT + +/* mask for one character (NB 1's) */ +#define MC ((1 << NB) - 1) + +/* size of a lua_Integer */ +#define SZINT ((int)sizeof(lua_Integer)) + + +/* dummy union to get native endianness */ +static const union { + int dummy; + char little; /* true iff machine is little endian */ +} nativeendian = {1}; + + +/* +** information to pack/unpack stuff +*/ +typedef struct Header { + lua_State *L; + int islittle; + int maxalign; +} Header; + + +/* +** options for pack/unpack +*/ +typedef enum KOption { + Kint, /* signed integers */ + Kuint, /* unsigned integers */ + Kfloat, /* single-precision floating-point numbers */ + Knumber, /* Lua "native" floating-point numbers */ + Kdouble, /* double-precision floating-point numbers */ + Kchar, /* fixed-length strings */ + Kstring, /* strings with prefixed length */ + Kzstr, /* zero-terminated strings */ + Kpadding, /* padding */ + Kpaddalign, /* padding for alignment */ + Knop /* no-op (configuration or spaces) */ +} KOption; + + +/* +** Read an integer numeral from string 'fmt' or return 'df' if +** there is no numeral +*/ +static int digit (int c) { return '0' <= c && c <= '9'; } + +static int getnum (const char **fmt, int df) { + if (!digit(**fmt)) /* no number? */ + return df; /* return default value */ + else { + int a = 0; + do { + a = a*10 + (*((*fmt)++) - '0'); + } while (digit(**fmt) && a <= ((int)MAXSIZE - 9)/10); + return a; + } +} + + +/* +** Read an integer numeral and raises an error if it is larger +** than the maximum size for integers. +*/ +static int getnumlimit (Header *h, const char **fmt, int df) { + int sz = getnum(fmt, df); + if (l_unlikely(sz > MAXINTSIZE || sz <= 0)) + return luaL_error(h->L, "integral size (%d) out of limits [1,%d]", + sz, MAXINTSIZE); + return sz; +} + + +/* +** Initialize Header +*/ +static void initheader (lua_State *L, Header *h) { + h->L = L; + h->islittle = nativeendian.little; + h->maxalign = 1; +} + + +/* +** Read and classify next option. 'size' is filled with option's size. +*/ +static KOption getoption (Header *h, const char **fmt, int *size) { + /* dummy structure to get native alignment requirements */ + struct cD { char c; union { LUAI_MAXALIGN; } u; }; + int opt = *((*fmt)++); + *size = 0; /* default */ + switch (opt) { + case 'b': *size = sizeof(char); return Kint; + case 'B': *size = sizeof(char); return Kuint; + case 'h': *size = sizeof(short); return Kint; + case 'H': *size = sizeof(short); return Kuint; + case 'l': *size = sizeof(long); return Kint; + case 'L': *size = sizeof(long); return Kuint; + case 'j': *size = sizeof(lua_Integer); return Kint; + case 'J': *size = sizeof(lua_Integer); return Kuint; + case 'T': *size = sizeof(size_t); return Kuint; + case 'f': *size = sizeof(float); return Kfloat; + case 'n': *size = sizeof(lua_Number); return Knumber; + case 'd': *size = sizeof(double); return Kdouble; + case 'i': *size = getnumlimit(h, fmt, sizeof(int)); return Kint; + case 'I': *size = getnumlimit(h, fmt, sizeof(int)); return Kuint; + case 's': *size = getnumlimit(h, fmt, sizeof(size_t)); return Kstring; + case 'c': + *size = getnum(fmt, -1); + if (l_unlikely(*size == -1)) + luaL_error(h->L, "missing size for format option 'c'"); + return Kchar; + case 'z': return Kzstr; + case 'x': *size = 1; return Kpadding; + case 'X': return Kpaddalign; + case ' ': break; + case '<': h->islittle = 1; break; + case '>': h->islittle = 0; break; + case '=': h->islittle = nativeendian.little; break; + case '!': { + const int maxalign = offsetof(struct cD, u); + h->maxalign = getnumlimit(h, fmt, maxalign); + break; + } + default: luaL_error(h->L, "invalid format option '%c'", opt); + } + return Knop; +} + + +/* +** Read, classify, and fill other details about the next option. +** 'psize' is filled with option's size, 'notoalign' with its +** alignment requirements. +** Local variable 'size' gets the size to be aligned. (Kpadal option +** always gets its full alignment, other options are limited by +** the maximum alignment ('maxalign'). Kchar option needs no alignment +** despite its size. +*/ +static KOption getdetails (Header *h, size_t totalsize, + const char **fmt, int *psize, int *ntoalign) { + KOption opt = getoption(h, fmt, psize); + int align = *psize; /* usually, alignment follows size */ + if (opt == Kpaddalign) { /* 'X' gets alignment from following option */ + if (**fmt == '\0' || getoption(h, fmt, &align) == Kchar || align == 0) + luaL_argerror(h->L, 1, "invalid next option for option 'X'"); + } + if (align <= 1 || opt == Kchar) /* need no alignment? */ + *ntoalign = 0; + else { + if (align > h->maxalign) /* enforce maximum alignment */ + align = h->maxalign; + if (l_unlikely((align & (align - 1)) != 0)) /* not a power of 2? */ + luaL_argerror(h->L, 1, "format asks for alignment not power of 2"); + *ntoalign = (align - (int)(totalsize & (align - 1))) & (align - 1); + } + return opt; +} + + +/* +** Pack integer 'n' with 'size' bytes and 'islittle' endianness. +** The final 'if' handles the case when 'size' is larger than +** the size of a Lua integer, correcting the extra sign-extension +** bytes if necessary (by default they would be zeros). +*/ +static void packint (luaL_Buffer *b, lua_Unsigned n, + int islittle, int size, int neg) { + char *buff = luaL_prepbuffsize(b, size); + int i; + buff[islittle ? 0 : size - 1] = (char)(n & MC); /* first byte */ + for (i = 1; i < size; i++) { + n >>= NB; + buff[islittle ? i : size - 1 - i] = (char)(n & MC); + } + if (neg && size > SZINT) { /* negative number need sign extension? */ + for (i = SZINT; i < size; i++) /* correct extra bytes */ + buff[islittle ? i : size - 1 - i] = (char)MC; + } + luaL_addsize(b, size); /* add result to buffer */ +} + + +/* +** Copy 'size' bytes from 'src' to 'dest', correcting endianness if +** given 'islittle' is different from native endianness. +*/ +static void copywithendian (char *dest, const char *src, + int size, int islittle) { + if (islittle == nativeendian.little) + memcpy(dest, src, size); + else { + dest += size - 1; + while (size-- != 0) + *(dest--) = *(src++); + } +} + + +static int str_pack (lua_State *L) { + luaL_Buffer b; + Header h; + const char *fmt = luaL_checkstring(L, 1); /* format string */ + int arg = 1; /* current argument to pack */ + size_t totalsize = 0; /* accumulate total size of result */ + initheader(L, &h); + lua_pushnil(L); /* mark to separate arguments from string buffer */ + luaL_buffinit(L, &b); + while (*fmt != '\0') { + int size, ntoalign; + KOption opt = getdetails(&h, totalsize, &fmt, &size, &ntoalign); + totalsize += ntoalign + size; + while (ntoalign-- > 0) + luaL_addchar(&b, LUAL_PACKPADBYTE); /* fill alignment */ + arg++; + switch (opt) { + case Kint: { /* signed integers */ + lua_Integer n = luaL_checkinteger(L, arg); + if (size < SZINT) { /* need overflow check? */ + lua_Integer lim = (lua_Integer)1 << ((size * NB) - 1); + luaL_argcheck(L, -lim <= n && n < lim, arg, "integer overflow"); + } + packint(&b, (lua_Unsigned)n, h.islittle, size, (n < 0)); + break; + } + case Kuint: { /* unsigned integers */ + lua_Integer n = luaL_checkinteger(L, arg); + if (size < SZINT) /* need overflow check? */ + luaL_argcheck(L, (lua_Unsigned)n < ((lua_Unsigned)1 << (size * NB)), + arg, "unsigned overflow"); + packint(&b, (lua_Unsigned)n, h.islittle, size, 0); + break; + } + case Kfloat: { /* C float */ + float f = (float)luaL_checknumber(L, arg); /* get argument */ + char *buff = luaL_prepbuffsize(&b, sizeof(f)); + /* move 'f' to final result, correcting endianness if needed */ + copywithendian(buff, (char *)&f, sizeof(f), h.islittle); + luaL_addsize(&b, size); + break; + } + case Knumber: { /* Lua float */ + lua_Number f = luaL_checknumber(L, arg); /* get argument */ + char *buff = luaL_prepbuffsize(&b, sizeof(f)); + /* move 'f' to final result, correcting endianness if needed */ + copywithendian(buff, (char *)&f, sizeof(f), h.islittle); + luaL_addsize(&b, size); + break; + } + case Kdouble: { /* C double */ + double f = (double)luaL_checknumber(L, arg); /* get argument */ + char *buff = luaL_prepbuffsize(&b, sizeof(f)); + /* move 'f' to final result, correcting endianness if needed */ + copywithendian(buff, (char *)&f, sizeof(f), h.islittle); + luaL_addsize(&b, size); + break; + } + case Kchar: { /* fixed-size string */ + size_t len; + const char *s = luaL_checklstring(L, arg, &len); + luaL_argcheck(L, len <= (size_t)size, arg, + "string longer than given size"); + luaL_addlstring(&b, s, len); /* add string */ + while (len++ < (size_t)size) /* pad extra space */ + luaL_addchar(&b, LUAL_PACKPADBYTE); + break; + } + case Kstring: { /* strings with length count */ + size_t len; + const char *s = luaL_checklstring(L, arg, &len); + luaL_argcheck(L, size >= (int)sizeof(size_t) || + len < ((size_t)1 << (size * NB)), + arg, "string length does not fit in given size"); + packint(&b, (lua_Unsigned)len, h.islittle, size, 0); /* pack length */ + luaL_addlstring(&b, s, len); + totalsize += len; + break; + } + case Kzstr: { /* zero-terminated string */ + size_t len; + const char *s = luaL_checklstring(L, arg, &len); + luaL_argcheck(L, strlen(s) == len, arg, "string contains zeros"); + luaL_addlstring(&b, s, len); + luaL_addchar(&b, '\0'); /* add zero at the end */ + totalsize += len + 1; + break; + } + case Kpadding: luaL_addchar(&b, LUAL_PACKPADBYTE); /* FALLTHROUGH */ + case Kpaddalign: case Knop: + arg--; /* undo increment */ + break; + } + } + luaL_pushresult(&b); + return 1; +} + + +static int str_packsize (lua_State *L) { + Header h; + const char *fmt = luaL_checkstring(L, 1); /* format string */ + size_t totalsize = 0; /* accumulate total size of result */ + initheader(L, &h); + while (*fmt != '\0') { + int size, ntoalign; + KOption opt = getdetails(&h, totalsize, &fmt, &size, &ntoalign); + luaL_argcheck(L, opt != Kstring && opt != Kzstr, 1, + "variable-length format"); + size += ntoalign; /* total space used by option */ + luaL_argcheck(L, totalsize <= MAXSIZE - size, 1, + "format result too large"); + totalsize += size; + } + lua_pushinteger(L, (lua_Integer)totalsize); + return 1; +} + + +/* +** Unpack an integer with 'size' bytes and 'islittle' endianness. +** If size is smaller than the size of a Lua integer and integer +** is signed, must do sign extension (propagating the sign to the +** higher bits); if size is larger than the size of a Lua integer, +** it must check the unread bytes to see whether they do not cause an +** overflow. +*/ +static lua_Integer unpackint (lua_State *L, const char *str, + int islittle, int size, int issigned) { + lua_Unsigned res = 0; + int i; + int limit = (size <= SZINT) ? size : SZINT; + for (i = limit - 1; i >= 0; i--) { + res <<= NB; + res |= (lua_Unsigned)(unsigned char)str[islittle ? i : size - 1 - i]; + } + if (size < SZINT) { /* real size smaller than lua_Integer? */ + if (issigned) { /* needs sign extension? */ + lua_Unsigned mask = (lua_Unsigned)1 << (size*NB - 1); + res = ((res ^ mask) - mask); /* do sign extension */ + } + } + else if (size > SZINT) { /* must check unread bytes */ + int mask = (!issigned || (lua_Integer)res >= 0) ? 0 : MC; + for (i = limit; i < size; i++) { + if (l_unlikely((unsigned char)str[islittle ? i : size - 1 - i] != mask)) + luaL_error(L, "%d-byte integer does not fit into Lua Integer", size); + } + } + return (lua_Integer)res; +} + + +static int str_unpack (lua_State *L) { + Header h; + const char *fmt = luaL_checkstring(L, 1); + size_t ld; + const char *data = luaL_checklstring(L, 2, &ld); + size_t pos = posrelatI(luaL_optinteger(L, 3, 1), ld) - 1; + int n = 0; /* number of results */ + luaL_argcheck(L, pos <= ld, 3, "initial position out of string"); + initheader(L, &h); + while (*fmt != '\0') { + int size, ntoalign; + KOption opt = getdetails(&h, pos, &fmt, &size, &ntoalign); + luaL_argcheck(L, (size_t)ntoalign + size <= ld - pos, 2, + "data string too short"); + pos += ntoalign; /* skip alignment */ + /* stack space for item + next position */ + luaL_checkstack(L, 2, "too many results"); + n++; + switch (opt) { + case Kint: + case Kuint: { + lua_Integer res = unpackint(L, data + pos, h.islittle, size, + (opt == Kint)); + lua_pushinteger(L, res); + break; + } + case Kfloat: { + float f; + copywithendian((char *)&f, data + pos, sizeof(f), h.islittle); + lua_pushnumber(L, (lua_Number)f); + break; + } + case Knumber: { + lua_Number f; + copywithendian((char *)&f, data + pos, sizeof(f), h.islittle); + lua_pushnumber(L, f); + break; + } + case Kdouble: { + double f; + copywithendian((char *)&f, data + pos, sizeof(f), h.islittle); + lua_pushnumber(L, (lua_Number)f); + break; + } + case Kchar: { + lua_pushlstring(L, data + pos, size); + break; + } + case Kstring: { + size_t len = (size_t)unpackint(L, data + pos, h.islittle, size, 0); + luaL_argcheck(L, len <= ld - pos - size, 2, "data string too short"); + lua_pushlstring(L, data + pos + size, len); + pos += len; /* skip string */ + break; + } + case Kzstr: { + size_t len = strlen(data + pos); + luaL_argcheck(L, pos + len < ld, 2, + "unfinished string for format 'z'"); + lua_pushlstring(L, data + pos, len); + pos += len + 1; /* skip string plus final '\0' */ + break; + } + case Kpaddalign: case Kpadding: case Knop: + n--; /* undo increment */ + break; + } + pos += size; + } + lua_pushinteger(L, pos + 1); /* next position */ + return n + 1; +} + +/* }====================================================== */ + + +static const luaL_Reg strlib[] = { + {"byte", str_byte}, + {"char", str_char}, + {"dump", str_dump}, + {"find", str_find}, + {"format", str_format}, + {"gmatch", gmatch}, + {"gsub", str_gsub}, + {"len", str_len}, + {"lower", str_lower}, + {"match", str_match}, + {"rep", str_rep}, + {"reverse", str_reverse}, + {"sub", str_sub}, + {"upper", str_upper}, + {"pack", str_pack}, + {"packsize", str_packsize}, + {"unpack", str_unpack}, + {NULL, NULL} +}; + + +static void createmetatable (lua_State *L) { + /* table to be metatable for strings */ + luaL_newlibtable(L, stringmetamethods); + luaL_setfuncs(L, stringmetamethods, 0); + lua_pushliteral(L, ""); /* dummy string */ + lua_pushvalue(L, -2); /* copy table */ + lua_setmetatable(L, -2); /* set table as metatable for strings */ + lua_pop(L, 1); /* pop dummy string */ + lua_pushvalue(L, -2); /* get string library */ + lua_setfield(L, -2, "__index"); /* metatable.__index = string */ + lua_pop(L, 1); /* pop metatable */ +} + + +/* +** Open string library +*/ +LUAMOD_API int luaopen_string (lua_State *L) { + luaL_newlib(L, strlib); + createmetatable(L); + return 1; +} + diff --git a/vendor/lua-5.4.8/src/ltable.c b/vendor/lua-5.4.8/src/ltable.c new file mode 100644 index 0000000..3353c04 --- /dev/null +++ b/vendor/lua-5.4.8/src/ltable.c @@ -0,0 +1,995 @@ +/* +** $Id: ltable.c $ +** Lua tables (hash) +** See Copyright Notice in lua.h +*/ + +#define ltable_c +#define LUA_CORE + +#include "lprefix.h" + + +/* +** Implementation of tables (aka arrays, objects, or hash tables). +** Tables keep its elements in two parts: an array part and a hash part. +** Non-negative integer keys are all candidates to be kept in the array +** part. The actual size of the array is the largest 'n' such that +** more than half the slots between 1 and n are in use. +** Hash uses a mix of chained scatter table with Brent's variation. +** A main invariant of these tables is that, if an element is not +** in its main position (i.e. the 'original' position that its hash gives +** to it), then the colliding element is in its own main position. +** Hence even when the load factor reaches 100%, performance remains good. +*/ + +#include <math.h> +#include <limits.h> + +#include "lua.h" + +#include "ldebug.h" +#include "ldo.h" +#include "lgc.h" +#include "lmem.h" +#include "lobject.h" +#include "lstate.h" +#include "lstring.h" +#include "ltable.h" +#include "lvm.h" + + +/* +** MAXABITS is the largest integer such that MAXASIZE fits in an +** unsigned int. +*/ +#define MAXABITS cast_int(sizeof(int) * CHAR_BIT - 1) + + +/* +** MAXASIZE is the maximum size of the array part. It is the minimum +** between 2^MAXABITS and the maximum size that, measured in bytes, +** fits in a 'size_t'. +*/ +#define MAXASIZE luaM_limitN(1u << MAXABITS, TValue) + +/* +** MAXHBITS is the largest integer such that 2^MAXHBITS fits in a +** signed int. +*/ +#define MAXHBITS (MAXABITS - 1) + + +/* +** MAXHSIZE is the maximum size of the hash part. It is the minimum +** between 2^MAXHBITS and the maximum size such that, measured in bytes, +** it fits in a 'size_t'. +*/ +#define MAXHSIZE luaM_limitN(1u << MAXHBITS, Node) + + +/* +** When the original hash value is good, hashing by a power of 2 +** avoids the cost of '%'. +*/ +#define hashpow2(t,n) (gnode(t, lmod((n), sizenode(t)))) + +/* +** for other types, it is better to avoid modulo by power of 2, as +** they can have many 2 factors. +*/ +#define hashmod(t,n) (gnode(t, ((n) % ((sizenode(t)-1)|1)))) + + +#define hashstr(t,str) hashpow2(t, (str)->hash) +#define hashboolean(t,p) hashpow2(t, p) + + +#define hashpointer(t,p) hashmod(t, point2uint(p)) + + +#define dummynode (&dummynode_) + +static const Node dummynode_ = { + {{NULL}, LUA_VEMPTY, /* value's value and type */ + LUA_VNIL, 0, {NULL}} /* key type, next, and key value */ +}; + + +static const TValue absentkey = {ABSTKEYCONSTANT}; + + +/* +** Hash for integers. To allow a good hash, use the remainder operator +** ('%'). If integer fits as a non-negative int, compute an int +** remainder, which is faster. Otherwise, use an unsigned-integer +** remainder, which uses all bits and ensures a non-negative result. +*/ +static Node *hashint (const Table *t, lua_Integer i) { + lua_Unsigned ui = l_castS2U(i); + if (ui <= cast_uint(INT_MAX)) + return hashmod(t, cast_int(ui)); + else + return hashmod(t, ui); +} + + +/* +** Hash for floating-point numbers. +** The main computation should be just +** n = frexp(n, &i); return (n * INT_MAX) + i +** but there are some numerical subtleties. +** In a two-complement representation, INT_MAX does not has an exact +** representation as a float, but INT_MIN does; because the absolute +** value of 'frexp' is smaller than 1 (unless 'n' is inf/NaN), the +** absolute value of the product 'frexp * -INT_MIN' is smaller or equal +** to INT_MAX. Next, the use of 'unsigned int' avoids overflows when +** adding 'i'; the use of '~u' (instead of '-u') avoids problems with +** INT_MIN. +*/ +#if !defined(l_hashfloat) +static int l_hashfloat (lua_Number n) { + int i; + lua_Integer ni; + n = l_mathop(frexp)(n, &i) * -cast_num(INT_MIN); + if (!lua_numbertointeger(n, &ni)) { /* is 'n' inf/-inf/NaN? */ + lua_assert(luai_numisnan(n) || l_mathop(fabs)(n) == cast_num(HUGE_VAL)); + return 0; + } + else { /* normal case */ + unsigned int u = cast_uint(i) + cast_uint(ni); + return cast_int(u <= cast_uint(INT_MAX) ? u : ~u); + } +} +#endif + + +/* +** returns the 'main' position of an element in a table (that is, +** the index of its hash value). +*/ +static Node *mainpositionTV (const Table *t, const TValue *key) { + switch (ttypetag(key)) { + case LUA_VNUMINT: { + lua_Integer i = ivalue(key); + return hashint(t, i); + } + case LUA_VNUMFLT: { + lua_Number n = fltvalue(key); + return hashmod(t, l_hashfloat(n)); + } + case LUA_VSHRSTR: { + TString *ts = tsvalue(key); + return hashstr(t, ts); + } + case LUA_VLNGSTR: { + TString *ts = tsvalue(key); + return hashpow2(t, luaS_hashlongstr(ts)); + } + case LUA_VFALSE: + return hashboolean(t, 0); + case LUA_VTRUE: + return hashboolean(t, 1); + case LUA_VLIGHTUSERDATA: { + void *p = pvalue(key); + return hashpointer(t, p); + } + case LUA_VLCF: { + lua_CFunction f = fvalue(key); + return hashpointer(t, f); + } + default: { + GCObject *o = gcvalue(key); + return hashpointer(t, o); + } + } +} + + +l_sinline Node *mainpositionfromnode (const Table *t, Node *nd) { + TValue key; + getnodekey(cast(lua_State *, NULL), &key, nd); + return mainpositionTV(t, &key); +} + + +/* +** Check whether key 'k1' is equal to the key in node 'n2'. This +** equality is raw, so there are no metamethods. Floats with integer +** values have been normalized, so integers cannot be equal to +** floats. It is assumed that 'eqshrstr' is simply pointer equality, so +** that short strings are handled in the default case. +** A true 'deadok' means to accept dead keys as equal to their original +** values. All dead keys are compared in the default case, by pointer +** identity. (Only collectable objects can produce dead keys.) Note that +** dead long strings are also compared by identity. +** Once a key is dead, its corresponding value may be collected, and +** then another value can be created with the same address. If this +** other value is given to 'next', 'equalkey' will signal a false +** positive. In a regular traversal, this situation should never happen, +** as all keys given to 'next' came from the table itself, and therefore +** could not have been collected. Outside a regular traversal, we +** have garbage in, garbage out. What is relevant is that this false +** positive does not break anything. (In particular, 'next' will return +** some other valid item on the table or nil.) +*/ +static int equalkey (const TValue *k1, const Node *n2, int deadok) { + if ((rawtt(k1) != keytt(n2)) && /* not the same variants? */ + !(deadok && keyisdead(n2) && iscollectable(k1))) + return 0; /* cannot be same key */ + switch (keytt(n2)) { + case LUA_VNIL: case LUA_VFALSE: case LUA_VTRUE: + return 1; + case LUA_VNUMINT: + return (ivalue(k1) == keyival(n2)); + case LUA_VNUMFLT: + return luai_numeq(fltvalue(k1), fltvalueraw(keyval(n2))); + case LUA_VLIGHTUSERDATA: + return pvalue(k1) == pvalueraw(keyval(n2)); + case LUA_VLCF: + return fvalue(k1) == fvalueraw(keyval(n2)); + case ctb(LUA_VLNGSTR): + return luaS_eqlngstr(tsvalue(k1), keystrval(n2)); + default: + return gcvalue(k1) == gcvalueraw(keyval(n2)); + } +} + + +/* +** True if value of 'alimit' is equal to the real size of the array +** part of table 't'. (Otherwise, the array part must be larger than +** 'alimit'.) +*/ +#define limitequalsasize(t) (isrealasize(t) || ispow2((t)->alimit)) + + +/* +** Returns the real size of the 'array' array +*/ +LUAI_FUNC unsigned int luaH_realasize (const Table *t) { + if (limitequalsasize(t)) + return t->alimit; /* this is the size */ + else { + unsigned int size = t->alimit; + /* compute the smallest power of 2 not smaller than 'size' */ + size |= (size >> 1); + size |= (size >> 2); + size |= (size >> 4); + size |= (size >> 8); +#if (UINT_MAX >> 14) > 3 /* unsigned int has more than 16 bits */ + size |= (size >> 16); +#if (UINT_MAX >> 30) > 3 + size |= (size >> 32); /* unsigned int has more than 32 bits */ +#endif +#endif + size++; + lua_assert(ispow2(size) && size/2 < t->alimit && t->alimit < size); + return size; + } +} + + +/* +** Check whether real size of the array is a power of 2. +** (If it is not, 'alimit' cannot be changed to any other value +** without changing the real size.) +*/ +static int ispow2realasize (const Table *t) { + return (!isrealasize(t) || ispow2(t->alimit)); +} + + +static unsigned int setlimittosize (Table *t) { + t->alimit = luaH_realasize(t); + setrealasize(t); + return t->alimit; +} + + +#define limitasasize(t) check_exp(isrealasize(t), t->alimit) + + + +/* +** "Generic" get version. (Not that generic: not valid for integers, +** which may be in array part, nor for floats with integral values.) +** See explanation about 'deadok' in function 'equalkey'. +*/ +static const TValue *getgeneric (Table *t, const TValue *key, int deadok) { + Node *n = mainpositionTV(t, key); + for (;;) { /* check whether 'key' is somewhere in the chain */ + if (equalkey(key, n, deadok)) + return gval(n); /* that's it */ + else { + int nx = gnext(n); + if (nx == 0) + return &absentkey; /* not found */ + n += nx; + } + } +} + + +/* +** returns the index for 'k' if 'k' is an appropriate key to live in +** the array part of a table, 0 otherwise. +*/ +static unsigned int arrayindex (lua_Integer k) { + if (l_castS2U(k) - 1u < MAXASIZE) /* 'k' in [1, MAXASIZE]? */ + return cast_uint(k); /* 'key' is an appropriate array index */ + else + return 0; +} + + +/* +** returns the index of a 'key' for table traversals. First goes all +** elements in the array part, then elements in the hash part. The +** beginning of a traversal is signaled by 0. +*/ +static unsigned int findindex (lua_State *L, Table *t, TValue *key, + unsigned int asize) { + unsigned int i; + if (ttisnil(key)) return 0; /* first iteration */ + i = ttisinteger(key) ? arrayindex(ivalue(key)) : 0; + if (i - 1u < asize) /* is 'key' inside array part? */ + return i; /* yes; that's the index */ + else { + const TValue *n = getgeneric(t, key, 1); + if (l_unlikely(isabstkey(n))) + luaG_runerror(L, "invalid key to 'next'"); /* key not found */ + i = cast_int(nodefromval(n) - gnode(t, 0)); /* key index in hash table */ + /* hash elements are numbered after array ones */ + return (i + 1) + asize; + } +} + + +int luaH_next (lua_State *L, Table *t, StkId key) { + unsigned int asize = luaH_realasize(t); + unsigned int i = findindex(L, t, s2v(key), asize); /* find original key */ + for (; i < asize; i++) { /* try first array part */ + if (!isempty(&t->array[i])) { /* a non-empty entry? */ + setivalue(s2v(key), i + 1); + setobj2s(L, key + 1, &t->array[i]); + return 1; + } + } + for (i -= asize; cast_int(i) < sizenode(t); i++) { /* hash part */ + if (!isempty(gval(gnode(t, i)))) { /* a non-empty entry? */ + Node *n = gnode(t, i); + getnodekey(L, s2v(key), n); + setobj2s(L, key + 1, gval(n)); + return 1; + } + } + return 0; /* no more elements */ +} + + +static void freehash (lua_State *L, Table *t) { + if (!isdummy(t)) + luaM_freearray(L, t->node, cast_sizet(sizenode(t))); +} + + +/* +** {============================================================= +** Rehash +** ============================================================== +*/ + +/* +** Compute the optimal size for the array part of table 't'. 'nums' is a +** "count array" where 'nums[i]' is the number of integers in the table +** between 2^(i - 1) + 1 and 2^i. 'pna' enters with the total number of +** integer keys in the table and leaves with the number of keys that +** will go to the array part; return the optimal size. (The condition +** 'twotoi > 0' in the for loop stops the loop if 'twotoi' overflows.) +*/ +static unsigned int computesizes (unsigned int nums[], unsigned int *pna) { + int i; + unsigned int twotoi; /* 2^i (candidate for optimal size) */ + unsigned int a = 0; /* number of elements smaller than 2^i */ + unsigned int na = 0; /* number of elements to go to array part */ + unsigned int optimal = 0; /* optimal size for array part */ + /* loop while keys can fill more than half of total size */ + for (i = 0, twotoi = 1; + twotoi > 0 && *pna > twotoi / 2; + i++, twotoi *= 2) { + a += nums[i]; + if (a > twotoi/2) { /* more than half elements present? */ + optimal = twotoi; /* optimal size (till now) */ + na = a; /* all elements up to 'optimal' will go to array part */ + } + } + lua_assert((optimal == 0 || optimal / 2 < na) && na <= optimal); + *pna = na; + return optimal; +} + + +static int countint (lua_Integer key, unsigned int *nums) { + unsigned int k = arrayindex(key); + if (k != 0) { /* is 'key' an appropriate array index? */ + nums[luaO_ceillog2(k)]++; /* count as such */ + return 1; + } + else + return 0; +} + + +/* +** Count keys in array part of table 't': Fill 'nums[i]' with +** number of keys that will go into corresponding slice and return +** total number of non-nil keys. +*/ +static unsigned int numusearray (const Table *t, unsigned int *nums) { + int lg; + unsigned int ttlg; /* 2^lg */ + unsigned int ause = 0; /* summation of 'nums' */ + unsigned int i = 1; /* count to traverse all array keys */ + unsigned int asize = limitasasize(t); /* real array size */ + /* traverse each slice */ + for (lg = 0, ttlg = 1; lg <= MAXABITS; lg++, ttlg *= 2) { + unsigned int lc = 0; /* counter */ + unsigned int lim = ttlg; + if (lim > asize) { + lim = asize; /* adjust upper limit */ + if (i > lim) + break; /* no more elements to count */ + } + /* count elements in range (2^(lg - 1), 2^lg] */ + for (; i <= lim; i++) { + if (!isempty(&t->array[i-1])) + lc++; + } + nums[lg] += lc; + ause += lc; + } + return ause; +} + + +static int numusehash (const Table *t, unsigned int *nums, unsigned int *pna) { + int totaluse = 0; /* total number of elements */ + int ause = 0; /* elements added to 'nums' (can go to array part) */ + int i = sizenode(t); + while (i--) { + Node *n = &t->node[i]; + if (!isempty(gval(n))) { + if (keyisinteger(n)) + ause += countint(keyival(n), nums); + totaluse++; + } + } + *pna += ause; + return totaluse; +} + + +/* +** Creates an array for the hash part of a table with the given +** size, or reuses the dummy node if size is zero. +** The computation for size overflow is in two steps: the first +** comparison ensures that the shift in the second one does not +** overflow. +*/ +static void setnodevector (lua_State *L, Table *t, unsigned int size) { + if (size == 0) { /* no elements to hash part? */ + t->node = cast(Node *, dummynode); /* use common 'dummynode' */ + t->lsizenode = 0; + t->lastfree = NULL; /* signal that it is using dummy node */ + } + else { + int i; + int lsize = luaO_ceillog2(size); + if (lsize > MAXHBITS || (1u << lsize) > MAXHSIZE) + luaG_runerror(L, "table overflow"); + size = twoto(lsize); + t->node = luaM_newvector(L, size, Node); + for (i = 0; i < cast_int(size); i++) { + Node *n = gnode(t, i); + gnext(n) = 0; + setnilkey(n); + setempty(gval(n)); + } + t->lsizenode = cast_byte(lsize); + t->lastfree = gnode(t, size); /* all positions are free */ + } +} + + +/* +** (Re)insert all elements from the hash part of 'ot' into table 't'. +*/ +static void reinsert (lua_State *L, Table *ot, Table *t) { + int j; + int size = sizenode(ot); + for (j = 0; j < size; j++) { + Node *old = gnode(ot, j); + if (!isempty(gval(old))) { + /* doesn't need barrier/invalidate cache, as entry was + already present in the table */ + TValue k; + getnodekey(L, &k, old); + luaH_set(L, t, &k, gval(old)); + } + } +} + + +/* +** Exchange the hash part of 't1' and 't2'. +*/ +static void exchangehashpart (Table *t1, Table *t2) { + lu_byte lsizenode = t1->lsizenode; + Node *node = t1->node; + Node *lastfree = t1->lastfree; + t1->lsizenode = t2->lsizenode; + t1->node = t2->node; + t1->lastfree = t2->lastfree; + t2->lsizenode = lsizenode; + t2->node = node; + t2->lastfree = lastfree; +} + + +/* +** Resize table 't' for the new given sizes. Both allocations (for +** the hash part and for the array part) can fail, which creates some +** subtleties. If the first allocation, for the hash part, fails, an +** error is raised and that is it. Otherwise, it copies the elements from +** the shrinking part of the array (if it is shrinking) into the new +** hash. Then it reallocates the array part. If that fails, the table +** is in its original state; the function frees the new hash part and then +** raises the allocation error. Otherwise, it sets the new hash part +** into the table, initializes the new part of the array (if any) with +** nils and reinserts the elements of the old hash back into the new +** parts of the table. +*/ +void luaH_resize (lua_State *L, Table *t, unsigned int newasize, + unsigned int nhsize) { + unsigned int i; + Table newt; /* to keep the new hash part */ + unsigned int oldasize = setlimittosize(t); + TValue *newarray; + /* create new hash part with appropriate size into 'newt' */ + setnodevector(L, &newt, nhsize); + if (newasize < oldasize) { /* will array shrink? */ + t->alimit = newasize; /* pretend array has new size... */ + exchangehashpart(t, &newt); /* and new hash */ + /* re-insert into the new hash the elements from vanishing slice */ + for (i = newasize; i < oldasize; i++) { + if (!isempty(&t->array[i])) + luaH_setint(L, t, i + 1, &t->array[i]); + } + t->alimit = oldasize; /* restore current size... */ + exchangehashpart(t, &newt); /* and hash (in case of errors) */ + } + /* allocate new array */ + newarray = luaM_reallocvector(L, t->array, oldasize, newasize, TValue); + if (l_unlikely(newarray == NULL && newasize > 0)) { /* allocation failed? */ + freehash(L, &newt); /* release new hash part */ + luaM_error(L); /* raise error (with array unchanged) */ + } + /* allocation ok; initialize new part of the array */ + exchangehashpart(t, &newt); /* 't' has the new hash ('newt' has the old) */ + t->array = newarray; /* set new array part */ + t->alimit = newasize; + for (i = oldasize; i < newasize; i++) /* clear new slice of the array */ + setempty(&t->array[i]); + /* re-insert elements from old hash part into new parts */ + reinsert(L, &newt, t); /* 'newt' now has the old hash */ + freehash(L, &newt); /* free old hash part */ +} + + +void luaH_resizearray (lua_State *L, Table *t, unsigned int nasize) { + int nsize = allocsizenode(t); + luaH_resize(L, t, nasize, nsize); +} + +/* +** nums[i] = number of keys 'k' where 2^(i - 1) < k <= 2^i +*/ +static void rehash (lua_State *L, Table *t, const TValue *ek) { + unsigned int asize; /* optimal size for array part */ + unsigned int na; /* number of keys in the array part */ + unsigned int nums[MAXABITS + 1]; + int i; + int totaluse; + for (i = 0; i <= MAXABITS; i++) nums[i] = 0; /* reset counts */ + setlimittosize(t); + na = numusearray(t, nums); /* count keys in array part */ + totaluse = na; /* all those keys are integer keys */ + totaluse += numusehash(t, nums, &na); /* count keys in hash part */ + /* count extra key */ + if (ttisinteger(ek)) + na += countint(ivalue(ek), nums); + totaluse++; + /* compute new size for array part */ + asize = computesizes(nums, &na); + /* resize the table to new computed sizes */ + luaH_resize(L, t, asize, totaluse - na); +} + + + +/* +** }============================================================= +*/ + + +Table *luaH_new (lua_State *L) { + GCObject *o = luaC_newobj(L, LUA_VTABLE, sizeof(Table)); + Table *t = gco2t(o); + t->metatable = NULL; + t->flags = cast_byte(maskflags); /* table has no metamethod fields */ + t->array = NULL; + t->alimit = 0; + setnodevector(L, t, 0); + return t; +} + + +void luaH_free (lua_State *L, Table *t) { + freehash(L, t); + luaM_freearray(L, t->array, luaH_realasize(t)); + luaM_free(L, t); +} + + +static Node *getfreepos (Table *t) { + if (!isdummy(t)) { + while (t->lastfree > t->node) { + t->lastfree--; + if (keyisnil(t->lastfree)) + return t->lastfree; + } + } + return NULL; /* could not find a free place */ +} + + + +/* +** inserts a new key into a hash table; first, check whether key's main +** position is free. If not, check whether colliding node is in its main +** position or not: if it is not, move colliding node to an empty place and +** put new key in its main position; otherwise (colliding node is in its main +** position), new key goes to an empty position. +*/ +static void luaH_newkey (lua_State *L, Table *t, const TValue *key, + TValue *value) { + Node *mp; + TValue aux; + if (l_unlikely(ttisnil(key))) + luaG_runerror(L, "table index is nil"); + else if (ttisfloat(key)) { + lua_Number f = fltvalue(key); + lua_Integer k; + if (luaV_flttointeger(f, &k, F2Ieq)) { /* does key fit in an integer? */ + setivalue(&aux, k); + key = &aux; /* insert it as an integer */ + } + else if (l_unlikely(luai_numisnan(f))) + luaG_runerror(L, "table index is NaN"); + } + if (ttisnil(value)) + return; /* do not insert nil values */ + mp = mainpositionTV(t, key); + if (!isempty(gval(mp)) || isdummy(t)) { /* main position is taken? */ + Node *othern; + Node *f = getfreepos(t); /* get a free place */ + if (f == NULL) { /* cannot find a free place? */ + rehash(L, t, key); /* grow table */ + /* whatever called 'newkey' takes care of TM cache */ + luaH_set(L, t, key, value); /* insert key into grown table */ + return; + } + lua_assert(!isdummy(t)); + othern = mainpositionfromnode(t, mp); + if (othern != mp) { /* is colliding node out of its main position? */ + /* yes; move colliding node into free position */ + while (othern + gnext(othern) != mp) /* find previous */ + othern += gnext(othern); + gnext(othern) = cast_int(f - othern); /* rechain to point to 'f' */ + *f = *mp; /* copy colliding node into free pos. (mp->next also goes) */ + if (gnext(mp) != 0) { + gnext(f) += cast_int(mp - f); /* correct 'next' */ + gnext(mp) = 0; /* now 'mp' is free */ + } + setempty(gval(mp)); + } + else { /* colliding node is in its own main position */ + /* new node will go into free position */ + if (gnext(mp) != 0) + gnext(f) = cast_int((mp + gnext(mp)) - f); /* chain new position */ + else lua_assert(gnext(f) == 0); + gnext(mp) = cast_int(f - mp); + mp = f; + } + } + setnodekey(L, mp, key); + luaC_barrierback(L, obj2gco(t), key); + lua_assert(isempty(gval(mp))); + setobj2t(L, gval(mp), value); +} + + +/* +** Search function for integers. If integer is inside 'alimit', get it +** directly from the array part. Otherwise, if 'alimit' is not +** the real size of the array, the key still can be in the array part. +** In this case, do the "Xmilia trick" to check whether 'key-1' is +** smaller than the real size. +** The trick works as follow: let 'p' be an integer such that +** '2^(p+1) >= alimit > 2^p', or '2^(p+1) > alimit-1 >= 2^p'. +** That is, 2^(p+1) is the real size of the array, and 'p' is the highest +** bit on in 'alimit-1'. What we have to check becomes 'key-1 < 2^(p+1)'. +** We compute '(key-1) & ~(alimit-1)', which we call 'res'; it will +** have the 'p' bit cleared. If the key is outside the array, that is, +** 'key-1 >= 2^(p+1)', then 'res' will have some bit on higher than 'p', +** therefore it will be larger or equal to 'alimit', and the check +** will fail. If 'key-1 < 2^(p+1)', then 'res' has no bit on higher than +** 'p', and as the bit 'p' itself was cleared, 'res' will be smaller +** than 2^p, therefore smaller than 'alimit', and the check succeeds. +** As special cases, when 'alimit' is 0 the condition is trivially false, +** and when 'alimit' is 1 the condition simplifies to 'key-1 < alimit'. +** If key is 0 or negative, 'res' will have its higher bit on, so that +** if cannot be smaller than alimit. +*/ +const TValue *luaH_getint (Table *t, lua_Integer key) { + lua_Unsigned alimit = t->alimit; + if (l_castS2U(key) - 1u < alimit) /* 'key' in [1, t->alimit]? */ + return &t->array[key - 1]; + else if (!isrealasize(t) && /* key still may be in the array part? */ + (((l_castS2U(key) - 1u) & ~(alimit - 1u)) < alimit)) { + t->alimit = cast_uint(key); /* probably '#t' is here now */ + return &t->array[key - 1]; + } + else { /* key is not in the array part; check the hash */ + Node *n = hashint(t, key); + for (;;) { /* check whether 'key' is somewhere in the chain */ + if (keyisinteger(n) && keyival(n) == key) + return gval(n); /* that's it */ + else { + int nx = gnext(n); + if (nx == 0) break; + n += nx; + } + } + return &absentkey; + } +} + + +/* +** search function for short strings +*/ +const TValue *luaH_getshortstr (Table *t, TString *key) { + Node *n = hashstr(t, key); + lua_assert(key->tt == LUA_VSHRSTR); + for (;;) { /* check whether 'key' is somewhere in the chain */ + if (keyisshrstr(n) && eqshrstr(keystrval(n), key)) + return gval(n); /* that's it */ + else { + int nx = gnext(n); + if (nx == 0) + return &absentkey; /* not found */ + n += nx; + } + } +} + + +const TValue *luaH_getstr (Table *t, TString *key) { + if (key->tt == LUA_VSHRSTR) + return luaH_getshortstr(t, key); + else { /* for long strings, use generic case */ + TValue ko; + setsvalue(cast(lua_State *, NULL), &ko, key); + return getgeneric(t, &ko, 0); + } +} + + +/* +** main search function +*/ +const TValue *luaH_get (Table *t, const TValue *key) { + switch (ttypetag(key)) { + case LUA_VSHRSTR: return luaH_getshortstr(t, tsvalue(key)); + case LUA_VNUMINT: return luaH_getint(t, ivalue(key)); + case LUA_VNIL: return &absentkey; + case LUA_VNUMFLT: { + lua_Integer k; + if (luaV_flttointeger(fltvalue(key), &k, F2Ieq)) /* integral index? */ + return luaH_getint(t, k); /* use specialized version */ + /* else... */ + } /* FALLTHROUGH */ + default: + return getgeneric(t, key, 0); + } +} + + +/* +** Finish a raw "set table" operation, where 'slot' is where the value +** should have been (the result of a previous "get table"). +** Beware: when using this function you probably need to check a GC +** barrier and invalidate the TM cache. +*/ +void luaH_finishset (lua_State *L, Table *t, const TValue *key, + const TValue *slot, TValue *value) { + if (isabstkey(slot)) + luaH_newkey(L, t, key, value); + else + setobj2t(L, cast(TValue *, slot), value); +} + + +/* +** beware: when using this function you probably need to check a GC +** barrier and invalidate the TM cache. +*/ +void luaH_set (lua_State *L, Table *t, const TValue *key, TValue *value) { + const TValue *slot = luaH_get(t, key); + luaH_finishset(L, t, key, slot, value); +} + + +void luaH_setint (lua_State *L, Table *t, lua_Integer key, TValue *value) { + const TValue *p = luaH_getint(t, key); + if (isabstkey(p)) { + TValue k; + setivalue(&k, key); + luaH_newkey(L, t, &k, value); + } + else + setobj2t(L, cast(TValue *, p), value); +} + + +/* +** Try to find a boundary in the hash part of table 't'. From the +** caller, we know that 'j' is zero or present and that 'j + 1' is +** present. We want to find a larger key that is absent from the +** table, so that we can do a binary search between the two keys to +** find a boundary. We keep doubling 'j' until we get an absent index. +** If the doubling would overflow, we try LUA_MAXINTEGER. If it is +** absent, we are ready for the binary search. ('j', being max integer, +** is larger or equal to 'i', but it cannot be equal because it is +** absent while 'i' is present; so 'j > i'.) Otherwise, 'j' is a +** boundary. ('j + 1' cannot be a present integer key because it is +** not a valid integer in Lua.) +*/ +static lua_Unsigned hash_search (Table *t, lua_Unsigned j) { + lua_Unsigned i; + if (j == 0) j++; /* the caller ensures 'j + 1' is present */ + do { + i = j; /* 'i' is a present index */ + if (j <= l_castS2U(LUA_MAXINTEGER) / 2) + j *= 2; + else { + j = LUA_MAXINTEGER; + if (isempty(luaH_getint(t, j))) /* t[j] not present? */ + break; /* 'j' now is an absent index */ + else /* weird case */ + return j; /* well, max integer is a boundary... */ + } + } while (!isempty(luaH_getint(t, j))); /* repeat until an absent t[j] */ + /* i < j && t[i] present && t[j] absent */ + while (j - i > 1u) { /* do a binary search between them */ + lua_Unsigned m = (i + j) / 2; + if (isempty(luaH_getint(t, m))) j = m; + else i = m; + } + return i; +} + + +static unsigned int binsearch (const TValue *array, unsigned int i, + unsigned int j) { + while (j - i > 1u) { /* binary search */ + unsigned int m = (i + j) / 2; + if (isempty(&array[m - 1])) j = m; + else i = m; + } + return i; +} + + +/* +** Try to find a boundary in table 't'. (A 'boundary' is an integer index +** such that t[i] is present and t[i+1] is absent, or 0 if t[1] is absent +** and 'maxinteger' if t[maxinteger] is present.) +** (In the next explanation, we use Lua indices, that is, with base 1. +** The code itself uses base 0 when indexing the array part of the table.) +** The code starts with 'limit = t->alimit', a position in the array +** part that may be a boundary. +** +** (1) If 't[limit]' is empty, there must be a boundary before it. +** As a common case (e.g., after 't[#t]=nil'), check whether 'limit-1' +** is present. If so, it is a boundary. Otherwise, do a binary search +** between 0 and limit to find a boundary. In both cases, try to +** use this boundary as the new 'alimit', as a hint for the next call. +** +** (2) If 't[limit]' is not empty and the array has more elements +** after 'limit', try to find a boundary there. Again, try first +** the special case (which should be quite frequent) where 'limit+1' +** is empty, so that 'limit' is a boundary. Otherwise, check the +** last element of the array part. If it is empty, there must be a +** boundary between the old limit (present) and the last element +** (absent), which is found with a binary search. (This boundary always +** can be a new limit.) +** +** (3) The last case is when there are no elements in the array part +** (limit == 0) or its last element (the new limit) is present. +** In this case, must check the hash part. If there is no hash part +** or 'limit+1' is absent, 'limit' is a boundary. Otherwise, call +** 'hash_search' to find a boundary in the hash part of the table. +** (In those cases, the boundary is not inside the array part, and +** therefore cannot be used as a new limit.) +*/ +lua_Unsigned luaH_getn (Table *t) { + unsigned int limit = t->alimit; + if (limit > 0 && isempty(&t->array[limit - 1])) { /* (1)? */ + /* there must be a boundary before 'limit' */ + if (limit >= 2 && !isempty(&t->array[limit - 2])) { + /* 'limit - 1' is a boundary; can it be a new limit? */ + if (ispow2realasize(t) && !ispow2(limit - 1)) { + t->alimit = limit - 1; + setnorealasize(t); /* now 'alimit' is not the real size */ + } + return limit - 1; + } + else { /* must search for a boundary in [0, limit] */ + unsigned int boundary = binsearch(t->array, 0, limit); + /* can this boundary represent the real size of the array? */ + if (ispow2realasize(t) && boundary > luaH_realasize(t) / 2) { + t->alimit = boundary; /* use it as the new limit */ + setnorealasize(t); + } + return boundary; + } + } + /* 'limit' is zero or present in table */ + if (!limitequalsasize(t)) { /* (2)? */ + /* 'limit' > 0 and array has more elements after 'limit' */ + if (isempty(&t->array[limit])) /* 'limit + 1' is empty? */ + return limit; /* this is the boundary */ + /* else, try last element in the array */ + limit = luaH_realasize(t); + if (isempty(&t->array[limit - 1])) { /* empty? */ + /* there must be a boundary in the array after old limit, + and it must be a valid new limit */ + unsigned int boundary = binsearch(t->array, t->alimit, limit); + t->alimit = boundary; + return boundary; + } + /* else, new limit is present in the table; check the hash part */ + } + /* (3) 'limit' is the last element and either is zero or present in table */ + lua_assert(limit == luaH_realasize(t) && + (limit == 0 || !isempty(&t->array[limit - 1]))); + if (isdummy(t) || isempty(luaH_getint(t, cast(lua_Integer, limit + 1)))) + return limit; /* 'limit + 1' is absent */ + else /* 'limit + 1' is also present */ + return hash_search(t, limit); +} + + + +#if defined(LUA_DEBUG) + +/* export these functions for the test library */ + +Node *luaH_mainposition (const Table *t, const TValue *key) { + return mainpositionTV(t, key); +} + +#endif diff --git a/vendor/lua-5.4.8/src/ltable.h b/vendor/lua-5.4.8/src/ltable.h new file mode 100644 index 0000000..8e68903 --- /dev/null +++ b/vendor/lua-5.4.8/src/ltable.h @@ -0,0 +1,63 @@ +/* +** $Id: ltable.h $ +** Lua tables (hash) +** See Copyright Notice in lua.h +*/ + +#ifndef ltable_h +#define ltable_h + +#include "lobject.h" + + +#define gnode(t,i) (&(t)->node[i]) +#define gval(n) (&(n)->i_val) +#define gnext(n) ((n)->u.next) + + +/* +** Clear all bits of fast-access metamethods, which means that the table +** may have any of these metamethods. (First access that fails after the +** clearing will set the bit again.) +*/ +#define invalidateTMcache(t) ((t)->flags &= ~maskflags) + + +/* true when 't' is using 'dummynode' as its hash part */ +#define isdummy(t) ((t)->lastfree == NULL) + + +/* allocated size for hash nodes */ +#define allocsizenode(t) (isdummy(t) ? 0 : sizenode(t)) + + +/* returns the Node, given the value of a table entry */ +#define nodefromval(v) cast(Node *, (v)) + + +LUAI_FUNC const TValue *luaH_getint (Table *t, lua_Integer key); +LUAI_FUNC void luaH_setint (lua_State *L, Table *t, lua_Integer key, + TValue *value); +LUAI_FUNC const TValue *luaH_getshortstr (Table *t, TString *key); +LUAI_FUNC const TValue *luaH_getstr (Table *t, TString *key); +LUAI_FUNC const TValue *luaH_get (Table *t, const TValue *key); +LUAI_FUNC void luaH_set (lua_State *L, Table *t, const TValue *key, + TValue *value); +LUAI_FUNC void luaH_finishset (lua_State *L, Table *t, const TValue *key, + const TValue *slot, TValue *value); +LUAI_FUNC Table *luaH_new (lua_State *L); +LUAI_FUNC void luaH_resize (lua_State *L, Table *t, unsigned int nasize, + unsigned int nhsize); +LUAI_FUNC void luaH_resizearray (lua_State *L, Table *t, unsigned int nasize); +LUAI_FUNC void luaH_free (lua_State *L, Table *t); +LUAI_FUNC int luaH_next (lua_State *L, Table *t, StkId key); +LUAI_FUNC lua_Unsigned luaH_getn (Table *t); +LUAI_FUNC unsigned int luaH_realasize (const Table *t); + + +#if defined(LUA_DEBUG) +LUAI_FUNC Node *luaH_mainposition (const Table *t, const TValue *key); +#endif + + +#endif diff --git a/vendor/lua-5.4.8/src/ltablib.c b/vendor/lua-5.4.8/src/ltablib.c new file mode 100644 index 0000000..e6bc4d0 --- /dev/null +++ b/vendor/lua-5.4.8/src/ltablib.c @@ -0,0 +1,430 @@ +/* +** $Id: ltablib.c $ +** Library for Table Manipulation +** See Copyright Notice in lua.h +*/ + +#define ltablib_c +#define LUA_LIB + +#include "lprefix.h" + + +#include <limits.h> +#include <stddef.h> +#include <string.h> + +#include "lua.h" + +#include "lauxlib.h" +#include "lualib.h" + + +/* +** Operations that an object must define to mimic a table +** (some functions only need some of them) +*/ +#define TAB_R 1 /* read */ +#define TAB_W 2 /* write */ +#define TAB_L 4 /* length */ +#define TAB_RW (TAB_R | TAB_W) /* read/write */ + + +#define aux_getn(L,n,w) (checktab(L, n, (w) | TAB_L), luaL_len(L, n)) + + +static int checkfield (lua_State *L, const char *key, int n) { + lua_pushstring(L, key); + return (lua_rawget(L, -n) != LUA_TNIL); +} + + +/* +** Check that 'arg' either is a table or can behave like one (that is, +** has a metatable with the required metamethods) +*/ +static void checktab (lua_State *L, int arg, int what) { + if (lua_type(L, arg) != LUA_TTABLE) { /* is it not a table? */ + int n = 1; /* number of elements to pop */ + if (lua_getmetatable(L, arg) && /* must have metatable */ + (!(what & TAB_R) || checkfield(L, "__index", ++n)) && + (!(what & TAB_W) || checkfield(L, "__newindex", ++n)) && + (!(what & TAB_L) || checkfield(L, "__len", ++n))) { + lua_pop(L, n); /* pop metatable and tested metamethods */ + } + else + luaL_checktype(L, arg, LUA_TTABLE); /* force an error */ + } +} + + +static int tinsert (lua_State *L) { + lua_Integer pos; /* where to insert new element */ + lua_Integer e = aux_getn(L, 1, TAB_RW); + e = luaL_intop(+, e, 1); /* first empty element */ + switch (lua_gettop(L)) { + case 2: { /* called with only 2 arguments */ + pos = e; /* insert new element at the end */ + break; + } + case 3: { + lua_Integer i; + pos = luaL_checkinteger(L, 2); /* 2nd argument is the position */ + /* check whether 'pos' is in [1, e] */ + luaL_argcheck(L, (lua_Unsigned)pos - 1u < (lua_Unsigned)e, 2, + "position out of bounds"); + for (i = e; i > pos; i--) { /* move up elements */ + lua_geti(L, 1, i - 1); + lua_seti(L, 1, i); /* t[i] = t[i - 1] */ + } + break; + } + default: { + return luaL_error(L, "wrong number of arguments to 'insert'"); + } + } + lua_seti(L, 1, pos); /* t[pos] = v */ + return 0; +} + + +static int tremove (lua_State *L) { + lua_Integer size = aux_getn(L, 1, TAB_RW); + lua_Integer pos = luaL_optinteger(L, 2, size); + if (pos != size) /* validate 'pos' if given */ + /* check whether 'pos' is in [1, size + 1] */ + luaL_argcheck(L, (lua_Unsigned)pos - 1u <= (lua_Unsigned)size, 2, + "position out of bounds"); + lua_geti(L, 1, pos); /* result = t[pos] */ + for ( ; pos < size; pos++) { + lua_geti(L, 1, pos + 1); + lua_seti(L, 1, pos); /* t[pos] = t[pos + 1] */ + } + lua_pushnil(L); + lua_seti(L, 1, pos); /* remove entry t[pos] */ + return 1; +} + + +/* +** Copy elements (1[f], ..., 1[e]) into (tt[t], tt[t+1], ...). Whenever +** possible, copy in increasing order, which is better for rehashing. +** "possible" means destination after original range, or smaller +** than origin, or copying to another table. +*/ +static int tmove (lua_State *L) { + lua_Integer f = luaL_checkinteger(L, 2); + lua_Integer e = luaL_checkinteger(L, 3); + lua_Integer t = luaL_checkinteger(L, 4); + int tt = !lua_isnoneornil(L, 5) ? 5 : 1; /* destination table */ + checktab(L, 1, TAB_R); + checktab(L, tt, TAB_W); + if (e >= f) { /* otherwise, nothing to move */ + lua_Integer n, i; + luaL_argcheck(L, f > 0 || e < LUA_MAXINTEGER + f, 3, + "too many elements to move"); + n = e - f + 1; /* number of elements to move */ + luaL_argcheck(L, t <= LUA_MAXINTEGER - n + 1, 4, + "destination wrap around"); + if (t > e || t <= f || (tt != 1 && !lua_compare(L, 1, tt, LUA_OPEQ))) { + for (i = 0; i < n; i++) { + lua_geti(L, 1, f + i); + lua_seti(L, tt, t + i); + } + } + else { + for (i = n - 1; i >= 0; i--) { + lua_geti(L, 1, f + i); + lua_seti(L, tt, t + i); + } + } + } + lua_pushvalue(L, tt); /* return destination table */ + return 1; +} + + +static void addfield (lua_State *L, luaL_Buffer *b, lua_Integer i) { + lua_geti(L, 1, i); + if (l_unlikely(!lua_isstring(L, -1))) + luaL_error(L, "invalid value (%s) at index %I in table for 'concat'", + luaL_typename(L, -1), (LUAI_UACINT)i); + luaL_addvalue(b); +} + + +static int tconcat (lua_State *L) { + luaL_Buffer b; + lua_Integer last = aux_getn(L, 1, TAB_R); + size_t lsep; + const char *sep = luaL_optlstring(L, 2, "", &lsep); + lua_Integer i = luaL_optinteger(L, 3, 1); + last = luaL_optinteger(L, 4, last); + luaL_buffinit(L, &b); + for (; i < last; i++) { + addfield(L, &b, i); + luaL_addlstring(&b, sep, lsep); + } + if (i == last) /* add last value (if interval was not empty) */ + addfield(L, &b, i); + luaL_pushresult(&b); + return 1; +} + + +/* +** {====================================================== +** Pack/unpack +** ======================================================= +*/ + +static int tpack (lua_State *L) { + int i; + int n = lua_gettop(L); /* number of elements to pack */ + lua_createtable(L, n, 1); /* create result table */ + lua_insert(L, 1); /* put it at index 1 */ + for (i = n; i >= 1; i--) /* assign elements */ + lua_seti(L, 1, i); + lua_pushinteger(L, n); + lua_setfield(L, 1, "n"); /* t.n = number of elements */ + return 1; /* return table */ +} + + +static int tunpack (lua_State *L) { + lua_Unsigned n; + lua_Integer i = luaL_optinteger(L, 2, 1); + lua_Integer e = luaL_opt(L, luaL_checkinteger, 3, luaL_len(L, 1)); + if (i > e) return 0; /* empty range */ + n = (lua_Unsigned)e - i; /* number of elements minus 1 (avoid overflows) */ + if (l_unlikely(n >= (unsigned int)INT_MAX || + !lua_checkstack(L, (int)(++n)))) + return luaL_error(L, "too many results to unpack"); + for (; i < e; i++) { /* push arg[i..e - 1] (to avoid overflows) */ + lua_geti(L, 1, i); + } + lua_geti(L, 1, e); /* push last element */ + return (int)n; +} + +/* }====================================================== */ + + + +/* +** {====================================================== +** Quicksort +** (based on 'Algorithms in MODULA-3', Robert Sedgewick; +** Addison-Wesley, 1993.) +** ======================================================= +*/ + + +/* type for array indices */ +typedef unsigned int IdxT; + + +/* +** Produce a "random" 'unsigned int' to randomize pivot choice. This +** macro is used only when 'sort' detects a big imbalance in the result +** of a partition. (If you don't want/need this "randomness", ~0 is a +** good choice.) +*/ +#if !defined(l_randomizePivot) /* { */ + +#include <time.h> + +/* size of 'e' measured in number of 'unsigned int's */ +#define sof(e) (sizeof(e) / sizeof(unsigned int)) + +/* +** Use 'time' and 'clock' as sources of "randomness". Because we don't +** know the types 'clock_t' and 'time_t', we cannot cast them to +** anything without risking overflows. A safe way to use their values +** is to copy them to an array of a known type and use the array values. +*/ +static unsigned int l_randomizePivot (void) { + clock_t c = clock(); + time_t t = time(NULL); + unsigned int buff[sof(c) + sof(t)]; + unsigned int i, rnd = 0; + memcpy(buff, &c, sof(c) * sizeof(unsigned int)); + memcpy(buff + sof(c), &t, sof(t) * sizeof(unsigned int)); + for (i = 0; i < sof(buff); i++) + rnd += buff[i]; + return rnd; +} + +#endif /* } */ + + +/* arrays larger than 'RANLIMIT' may use randomized pivots */ +#define RANLIMIT 100u + + +static void set2 (lua_State *L, IdxT i, IdxT j) { + lua_seti(L, 1, i); + lua_seti(L, 1, j); +} + + +/* +** Return true iff value at stack index 'a' is less than the value at +** index 'b' (according to the order of the sort). +*/ +static int sort_comp (lua_State *L, int a, int b) { + if (lua_isnil(L, 2)) /* no function? */ + return lua_compare(L, a, b, LUA_OPLT); /* a < b */ + else { /* function */ + int res; + lua_pushvalue(L, 2); /* push function */ + lua_pushvalue(L, a-1); /* -1 to compensate function */ + lua_pushvalue(L, b-2); /* -2 to compensate function and 'a' */ + lua_call(L, 2, 1); /* call function */ + res = lua_toboolean(L, -1); /* get result */ + lua_pop(L, 1); /* pop result */ + return res; + } +} + + +/* +** Does the partition: Pivot P is at the top of the stack. +** precondition: a[lo] <= P == a[up-1] <= a[up], +** so it only needs to do the partition from lo + 1 to up - 2. +** Pos-condition: a[lo .. i - 1] <= a[i] == P <= a[i + 1 .. up] +** returns 'i'. +*/ +static IdxT partition (lua_State *L, IdxT lo, IdxT up) { + IdxT i = lo; /* will be incremented before first use */ + IdxT j = up - 1; /* will be decremented before first use */ + /* loop invariant: a[lo .. i] <= P <= a[j .. up] */ + for (;;) { + /* next loop: repeat ++i while a[i] < P */ + while ((void)lua_geti(L, 1, ++i), sort_comp(L, -1, -2)) { + if (l_unlikely(i == up - 1)) /* a[i] < P but a[up - 1] == P ?? */ + luaL_error(L, "invalid order function for sorting"); + lua_pop(L, 1); /* remove a[i] */ + } + /* after the loop, a[i] >= P and a[lo .. i - 1] < P */ + /* next loop: repeat --j while P < a[j] */ + while ((void)lua_geti(L, 1, --j), sort_comp(L, -3, -1)) { + if (l_unlikely(j < i)) /* j < i but a[j] > P ?? */ + luaL_error(L, "invalid order function for sorting"); + lua_pop(L, 1); /* remove a[j] */ + } + /* after the loop, a[j] <= P and a[j + 1 .. up] >= P */ + if (j < i) { /* no elements out of place? */ + /* a[lo .. i - 1] <= P <= a[j + 1 .. i .. up] */ + lua_pop(L, 1); /* pop a[j] */ + /* swap pivot (a[up - 1]) with a[i] to satisfy pos-condition */ + set2(L, up - 1, i); + return i; + } + /* otherwise, swap a[i] - a[j] to restore invariant and repeat */ + set2(L, i, j); + } +} + + +/* +** Choose an element in the middle (2nd-3th quarters) of [lo,up] +** "randomized" by 'rnd' +*/ +static IdxT choosePivot (IdxT lo, IdxT up, unsigned int rnd) { + IdxT r4 = (up - lo) / 4; /* range/4 */ + IdxT p = rnd % (r4 * 2) + (lo + r4); + lua_assert(lo + r4 <= p && p <= up - r4); + return p; +} + + +/* +** Quicksort algorithm (recursive function) +*/ +static void auxsort (lua_State *L, IdxT lo, IdxT up, + unsigned int rnd) { + while (lo < up) { /* loop for tail recursion */ + IdxT p; /* Pivot index */ + IdxT n; /* to be used later */ + /* sort elements 'lo', 'p', and 'up' */ + lua_geti(L, 1, lo); + lua_geti(L, 1, up); + if (sort_comp(L, -1, -2)) /* a[up] < a[lo]? */ + set2(L, lo, up); /* swap a[lo] - a[up] */ + else + lua_pop(L, 2); /* remove both values */ + if (up - lo == 1) /* only 2 elements? */ + return; /* already sorted */ + if (up - lo < RANLIMIT || rnd == 0) /* small interval or no randomize? */ + p = (lo + up)/2; /* middle element is a good pivot */ + else /* for larger intervals, it is worth a random pivot */ + p = choosePivot(lo, up, rnd); + lua_geti(L, 1, p); + lua_geti(L, 1, lo); + if (sort_comp(L, -2, -1)) /* a[p] < a[lo]? */ + set2(L, p, lo); /* swap a[p] - a[lo] */ + else { + lua_pop(L, 1); /* remove a[lo] */ + lua_geti(L, 1, up); + if (sort_comp(L, -1, -2)) /* a[up] < a[p]? */ + set2(L, p, up); /* swap a[up] - a[p] */ + else + lua_pop(L, 2); + } + if (up - lo == 2) /* only 3 elements? */ + return; /* already sorted */ + lua_geti(L, 1, p); /* get middle element (Pivot) */ + lua_pushvalue(L, -1); /* push Pivot */ + lua_geti(L, 1, up - 1); /* push a[up - 1] */ + set2(L, p, up - 1); /* swap Pivot (a[p]) with a[up - 1] */ + p = partition(L, lo, up); + /* a[lo .. p - 1] <= a[p] == P <= a[p + 1 .. up] */ + if (p - lo < up - p) { /* lower interval is smaller? */ + auxsort(L, lo, p - 1, rnd); /* call recursively for lower interval */ + n = p - lo; /* size of smaller interval */ + lo = p + 1; /* tail call for [p + 1 .. up] (upper interval) */ + } + else { + auxsort(L, p + 1, up, rnd); /* call recursively for upper interval */ + n = up - p; /* size of smaller interval */ + up = p - 1; /* tail call for [lo .. p - 1] (lower interval) */ + } + if ((up - lo) / 128 > n) /* partition too imbalanced? */ + rnd = l_randomizePivot(); /* try a new randomization */ + } /* tail call auxsort(L, lo, up, rnd) */ +} + + +static int sort (lua_State *L) { + lua_Integer n = aux_getn(L, 1, TAB_RW); + if (n > 1) { /* non-trivial interval? */ + luaL_argcheck(L, n < INT_MAX, 1, "array too big"); + if (!lua_isnoneornil(L, 2)) /* is there a 2nd argument? */ + luaL_checktype(L, 2, LUA_TFUNCTION); /* must be a function */ + lua_settop(L, 2); /* make sure there are two arguments */ + auxsort(L, 1, (IdxT)n, 0); + } + return 0; +} + +/* }====================================================== */ + + +static const luaL_Reg tab_funcs[] = { + {"concat", tconcat}, + {"insert", tinsert}, + {"pack", tpack}, + {"unpack", tunpack}, + {"remove", tremove}, + {"move", tmove}, + {"sort", sort}, + {NULL, NULL} +}; + + +LUAMOD_API int luaopen_table (lua_State *L) { + luaL_newlib(L, tab_funcs); + return 1; +} + diff --git a/vendor/lua-5.4.8/src/ltm.c b/vendor/lua-5.4.8/src/ltm.c new file mode 100644 index 0000000..07a0608 --- /dev/null +++ b/vendor/lua-5.4.8/src/ltm.c @@ -0,0 +1,271 @@ +/* +** $Id: ltm.c $ +** Tag methods +** See Copyright Notice in lua.h +*/ + +#define ltm_c +#define LUA_CORE + +#include "lprefix.h" + + +#include <string.h> + +#include "lua.h" + +#include "ldebug.h" +#include "ldo.h" +#include "lgc.h" +#include "lobject.h" +#include "lstate.h" +#include "lstring.h" +#include "ltable.h" +#include "ltm.h" +#include "lvm.h" + + +static const char udatatypename[] = "userdata"; + +LUAI_DDEF const char *const luaT_typenames_[LUA_TOTALTYPES] = { + "no value", + "nil", "boolean", udatatypename, "number", + "string", "table", "function", udatatypename, "thread", + "upvalue", "proto" /* these last cases are used for tests only */ +}; + + +void luaT_init (lua_State *L) { + static const char *const luaT_eventname[] = { /* ORDER TM */ + "__index", "__newindex", + "__gc", "__mode", "__len", "__eq", + "__add", "__sub", "__mul", "__mod", "__pow", + "__div", "__idiv", + "__band", "__bor", "__bxor", "__shl", "__shr", + "__unm", "__bnot", "__lt", "__le", + "__concat", "__call", "__close" + }; + int i; + for (i=0; i<TM_N; i++) { + G(L)->tmname[i] = luaS_new(L, luaT_eventname[i]); + luaC_fix(L, obj2gco(G(L)->tmname[i])); /* never collect these names */ + } +} + + +/* +** function to be used with macro "fasttm": optimized for absence of +** tag methods +*/ +const TValue *luaT_gettm (Table *events, TMS event, TString *ename) { + const TValue *tm = luaH_getshortstr(events, ename); + lua_assert(event <= TM_EQ); + if (notm(tm)) { /* no tag method? */ + events->flags |= cast_byte(1u<<event); /* cache this fact */ + return NULL; + } + else return tm; +} + + +const TValue *luaT_gettmbyobj (lua_State *L, const TValue *o, TMS event) { + Table *mt; + switch (ttype(o)) { + case LUA_TTABLE: + mt = hvalue(o)->metatable; + break; + case LUA_TUSERDATA: + mt = uvalue(o)->metatable; + break; + default: + mt = G(L)->mt[ttype(o)]; + } + return (mt ? luaH_getshortstr(mt, G(L)->tmname[event]) : &G(L)->nilvalue); +} + + +/* +** Return the name of the type of an object. For tables and userdata +** with metatable, use their '__name' metafield, if present. +*/ +const char *luaT_objtypename (lua_State *L, const TValue *o) { + Table *mt; + if ((ttistable(o) && (mt = hvalue(o)->metatable) != NULL) || + (ttisfulluserdata(o) && (mt = uvalue(o)->metatable) != NULL)) { + const TValue *name = luaH_getshortstr(mt, luaS_new(L, "__name")); + if (ttisstring(name)) /* is '__name' a string? */ + return getstr(tsvalue(name)); /* use it as type name */ + } + return ttypename(ttype(o)); /* else use standard type name */ +} + + +void luaT_callTM (lua_State *L, const TValue *f, const TValue *p1, + const TValue *p2, const TValue *p3) { + StkId func = L->top.p; + setobj2s(L, func, f); /* push function (assume EXTRA_STACK) */ + setobj2s(L, func + 1, p1); /* 1st argument */ + setobj2s(L, func + 2, p2); /* 2nd argument */ + setobj2s(L, func + 3, p3); /* 3rd argument */ + L->top.p = func + 4; + /* metamethod may yield only when called from Lua code */ + if (isLuacode(L->ci)) + luaD_call(L, func, 0); + else + luaD_callnoyield(L, func, 0); +} + + +void luaT_callTMres (lua_State *L, const TValue *f, const TValue *p1, + const TValue *p2, StkId res) { + ptrdiff_t result = savestack(L, res); + StkId func = L->top.p; + setobj2s(L, func, f); /* push function (assume EXTRA_STACK) */ + setobj2s(L, func + 1, p1); /* 1st argument */ + setobj2s(L, func + 2, p2); /* 2nd argument */ + L->top.p += 3; + /* metamethod may yield only when called from Lua code */ + if (isLuacode(L->ci)) + luaD_call(L, func, 1); + else + luaD_callnoyield(L, func, 1); + res = restorestack(L, result); + setobjs2s(L, res, --L->top.p); /* move result to its place */ +} + + +static int callbinTM (lua_State *L, const TValue *p1, const TValue *p2, + StkId res, TMS event) { + const TValue *tm = luaT_gettmbyobj(L, p1, event); /* try first operand */ + if (notm(tm)) + tm = luaT_gettmbyobj(L, p2, event); /* try second operand */ + if (notm(tm)) return 0; + luaT_callTMres(L, tm, p1, p2, res); + return 1; +} + + +void luaT_trybinTM (lua_State *L, const TValue *p1, const TValue *p2, + StkId res, TMS event) { + if (l_unlikely(!callbinTM(L, p1, p2, res, event))) { + switch (event) { + case TM_BAND: case TM_BOR: case TM_BXOR: + case TM_SHL: case TM_SHR: case TM_BNOT: { + if (ttisnumber(p1) && ttisnumber(p2)) + luaG_tointerror(L, p1, p2); + else + luaG_opinterror(L, p1, p2, "perform bitwise operation on"); + } + /* calls never return, but to avoid warnings: *//* FALLTHROUGH */ + default: + luaG_opinterror(L, p1, p2, "perform arithmetic on"); + } + } +} + + +void luaT_tryconcatTM (lua_State *L) { + StkId top = L->top.p; + if (l_unlikely(!callbinTM(L, s2v(top - 2), s2v(top - 1), top - 2, + TM_CONCAT))) + luaG_concaterror(L, s2v(top - 2), s2v(top - 1)); +} + + +void luaT_trybinassocTM (lua_State *L, const TValue *p1, const TValue *p2, + int flip, StkId res, TMS event) { + if (flip) + luaT_trybinTM(L, p2, p1, res, event); + else + luaT_trybinTM(L, p1, p2, res, event); +} + + +void luaT_trybiniTM (lua_State *L, const TValue *p1, lua_Integer i2, + int flip, StkId res, TMS event) { + TValue aux; + setivalue(&aux, i2); + luaT_trybinassocTM(L, p1, &aux, flip, res, event); +} + + +/* +** Calls an order tag method. +** For lessequal, LUA_COMPAT_LT_LE keeps compatibility with old +** behavior: if there is no '__le', try '__lt', based on l <= r iff +** !(r < l) (assuming a total order). If the metamethod yields during +** this substitution, the continuation has to know about it (to negate +** the result of r<l); bit CIST_LEQ in the call status keeps that +** information. +*/ +int luaT_callorderTM (lua_State *L, const TValue *p1, const TValue *p2, + TMS event) { + if (callbinTM(L, p1, p2, L->top.p, event)) /* try original event */ + return !l_isfalse(s2v(L->top.p)); +#if defined(LUA_COMPAT_LT_LE) + else if (event == TM_LE) { + /* try '!(p2 < p1)' for '(p1 <= p2)' */ + L->ci->callstatus |= CIST_LEQ; /* mark it is doing 'lt' for 'le' */ + if (callbinTM(L, p2, p1, L->top.p, TM_LT)) { + L->ci->callstatus ^= CIST_LEQ; /* clear mark */ + return l_isfalse(s2v(L->top.p)); + } + /* else error will remove this 'ci'; no need to clear mark */ + } +#endif + luaG_ordererror(L, p1, p2); /* no metamethod found */ + return 0; /* to avoid warnings */ +} + + +int luaT_callorderiTM (lua_State *L, const TValue *p1, int v2, + int flip, int isfloat, TMS event) { + TValue aux; const TValue *p2; + if (isfloat) { + setfltvalue(&aux, cast_num(v2)); + } + else + setivalue(&aux, v2); + if (flip) { /* arguments were exchanged? */ + p2 = p1; p1 = &aux; /* correct them */ + } + else + p2 = &aux; + return luaT_callorderTM(L, p1, p2, event); +} + + +void luaT_adjustvarargs (lua_State *L, int nfixparams, CallInfo *ci, + const Proto *p) { + int i; + int actual = cast_int(L->top.p - ci->func.p) - 1; /* number of arguments */ + int nextra = actual - nfixparams; /* number of extra arguments */ + ci->u.l.nextraargs = nextra; + luaD_checkstack(L, p->maxstacksize + 1); + /* copy function to the top of the stack */ + setobjs2s(L, L->top.p++, ci->func.p); + /* move fixed parameters to the top of the stack */ + for (i = 1; i <= nfixparams; i++) { + setobjs2s(L, L->top.p++, ci->func.p + i); + setnilvalue(s2v(ci->func.p + i)); /* erase original parameter (for GC) */ + } + ci->func.p += actual + 1; + ci->top.p += actual + 1; + lua_assert(L->top.p <= ci->top.p && ci->top.p <= L->stack_last.p); +} + + +void luaT_getvarargs (lua_State *L, CallInfo *ci, StkId where, int wanted) { + int i; + int nextra = ci->u.l.nextraargs; + if (wanted < 0) { + wanted = nextra; /* get all extra arguments available */ + checkstackGCp(L, nextra, where); /* ensure stack space */ + L->top.p = where + nextra; /* next instruction will need top */ + } + for (i = 0; i < wanted && i < nextra; i++) + setobjs2s(L, where + i, ci->func.p - nextra + i); + for (; i < wanted; i++) /* complete required results with nil */ + setnilvalue(s2v(where + i)); +} + diff --git a/vendor/lua-5.4.8/src/ltm.h b/vendor/lua-5.4.8/src/ltm.h new file mode 100644 index 0000000..73b833c --- /dev/null +++ b/vendor/lua-5.4.8/src/ltm.h @@ -0,0 +1,103 @@ +/* +** $Id: ltm.h $ +** Tag methods +** See Copyright Notice in lua.h +*/ + +#ifndef ltm_h +#define ltm_h + + +#include "lobject.h" + + +/* +* WARNING: if you change the order of this enumeration, +* grep "ORDER TM" and "ORDER OP" +*/ +typedef enum { + TM_INDEX, + TM_NEWINDEX, + TM_GC, + TM_MODE, + TM_LEN, + TM_EQ, /* last tag method with fast access */ + TM_ADD, + TM_SUB, + TM_MUL, + TM_MOD, + TM_POW, + TM_DIV, + TM_IDIV, + TM_BAND, + TM_BOR, + TM_BXOR, + TM_SHL, + TM_SHR, + TM_UNM, + TM_BNOT, + TM_LT, + TM_LE, + TM_CONCAT, + TM_CALL, + TM_CLOSE, + TM_N /* number of elements in the enum */ +} TMS; + + +/* +** Mask with 1 in all fast-access methods. A 1 in any of these bits +** in the flag of a (meta)table means the metatable does not have the +** corresponding metamethod field. (Bit 7 of the flag is used for +** 'isrealasize'.) +*/ +#define maskflags (~(~0u << (TM_EQ + 1))) + + +/* +** Test whether there is no tagmethod. +** (Because tagmethods use raw accesses, the result may be an "empty" nil.) +*/ +#define notm(tm) ttisnil(tm) + + +#define gfasttm(g,et,e) ((et) == NULL ? NULL : \ + ((et)->flags & (1u<<(e))) ? NULL : luaT_gettm(et, e, (g)->tmname[e])) + +#define fasttm(l,et,e) gfasttm(G(l), et, e) + +#define ttypename(x) luaT_typenames_[(x) + 1] + +LUAI_DDEC(const char *const luaT_typenames_[LUA_TOTALTYPES];) + + +LUAI_FUNC const char *luaT_objtypename (lua_State *L, const TValue *o); + +LUAI_FUNC const TValue *luaT_gettm (Table *events, TMS event, TString *ename); +LUAI_FUNC const TValue *luaT_gettmbyobj (lua_State *L, const TValue *o, + TMS event); +LUAI_FUNC void luaT_init (lua_State *L); + +LUAI_FUNC void luaT_callTM (lua_State *L, const TValue *f, const TValue *p1, + const TValue *p2, const TValue *p3); +LUAI_FUNC void luaT_callTMres (lua_State *L, const TValue *f, + const TValue *p1, const TValue *p2, StkId p3); +LUAI_FUNC void luaT_trybinTM (lua_State *L, const TValue *p1, const TValue *p2, + StkId res, TMS event); +LUAI_FUNC void luaT_tryconcatTM (lua_State *L); +LUAI_FUNC void luaT_trybinassocTM (lua_State *L, const TValue *p1, + const TValue *p2, int inv, StkId res, TMS event); +LUAI_FUNC void luaT_trybiniTM (lua_State *L, const TValue *p1, lua_Integer i2, + int inv, StkId res, TMS event); +LUAI_FUNC int luaT_callorderTM (lua_State *L, const TValue *p1, + const TValue *p2, TMS event); +LUAI_FUNC int luaT_callorderiTM (lua_State *L, const TValue *p1, int v2, + int inv, int isfloat, TMS event); + +LUAI_FUNC void luaT_adjustvarargs (lua_State *L, int nfixparams, + struct CallInfo *ci, const Proto *p); +LUAI_FUNC void luaT_getvarargs (lua_State *L, struct CallInfo *ci, + StkId where, int wanted); + + +#endif diff --git a/vendor/lua-5.4.8/src/lua b/vendor/lua-5.4.8/src/lua Binary files differnew file mode 100755 index 0000000..b948446 --- /dev/null +++ b/vendor/lua-5.4.8/src/lua diff --git a/vendor/lua-5.4.8/src/lua.c b/vendor/lua-5.4.8/src/lua.c new file mode 100644 index 0000000..4a90e55 --- /dev/null +++ b/vendor/lua-5.4.8/src/lua.c @@ -0,0 +1,687 @@ +/* +** $Id: lua.c $ +** Lua stand-alone interpreter +** See Copyright Notice in lua.h +*/ + +#define lua_c + +#include "lprefix.h" + + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +#include <signal.h> + +#include "lua.h" + +#include "lauxlib.h" +#include "lualib.h" + + +#if !defined(LUA_PROGNAME) +#define LUA_PROGNAME "lua" +#endif + +#if !defined(LUA_INIT_VAR) +#define LUA_INIT_VAR "LUA_INIT" +#endif + +#define LUA_INITVARVERSION LUA_INIT_VAR LUA_VERSUFFIX + + +static lua_State *globalL = NULL; + +static const char *progname = LUA_PROGNAME; + + +#if defined(LUA_USE_POSIX) /* { */ + +/* +** Use 'sigaction' when available. +*/ +static void setsignal (int sig, void (*handler)(int)) { + struct sigaction sa; + sa.sa_handler = handler; + sa.sa_flags = 0; + sigemptyset(&sa.sa_mask); /* do not mask any signal */ + sigaction(sig, &sa, NULL); +} + +#else /* }{ */ + +#define setsignal signal + +#endif /* } */ + + +/* +** Hook set by signal function to stop the interpreter. +*/ +static void lstop (lua_State *L, lua_Debug *ar) { + (void)ar; /* unused arg. */ + lua_sethook(L, NULL, 0, 0); /* reset hook */ + luaL_error(L, "interrupted!"); +} + + +/* +** Function to be called at a C signal. Because a C signal cannot +** just change a Lua state (as there is no proper synchronization), +** this function only sets a hook that, when called, will stop the +** interpreter. +*/ +static void laction (int i) { + int flag = LUA_MASKCALL | LUA_MASKRET | LUA_MASKLINE | LUA_MASKCOUNT; + setsignal(i, SIG_DFL); /* if another SIGINT happens, terminate process */ + lua_sethook(globalL, lstop, flag, 1); +} + + +static void print_usage (const char *badoption) { + lua_writestringerror("%s: ", progname); + if (badoption[1] == 'e' || badoption[1] == 'l') + lua_writestringerror("'%s' needs argument\n", badoption); + else + lua_writestringerror("unrecognized option '%s'\n", badoption); + lua_writestringerror( + "usage: %s [options] [script [args]]\n" + "Available options are:\n" + " -e stat execute string 'stat'\n" + " -i enter interactive mode after executing 'script'\n" + " -l mod require library 'mod' into global 'mod'\n" + " -l g=mod require library 'mod' into global 'g'\n" + " -v show version information\n" + " -E ignore environment variables\n" + " -W turn warnings on\n" + " -- stop handling options\n" + " - stop handling options and execute stdin\n" + , + progname); +} + + +/* +** Prints an error message, adding the program name in front of it +** (if present) +*/ +static void l_message (const char *pname, const char *msg) { + if (pname) lua_writestringerror("%s: ", pname); + lua_writestringerror("%s\n", msg); +} + + +/* +** Check whether 'status' is not OK and, if so, prints the error +** message on the top of the stack. +*/ +static int report (lua_State *L, int status) { + if (status != LUA_OK) { + const char *msg = lua_tostring(L, -1); + if (msg == NULL) + msg = "(error message not a string)"; + l_message(progname, msg); + lua_pop(L, 1); /* remove message */ + } + return status; +} + + +/* +** Message handler used to run all chunks +*/ +static int msghandler (lua_State *L) { + const char *msg = lua_tostring(L, 1); + if (msg == NULL) { /* is error object not a string? */ + if (luaL_callmeta(L, 1, "__tostring") && /* does it have a metamethod */ + lua_type(L, -1) == LUA_TSTRING) /* that produces a string? */ + return 1; /* that is the message */ + else + msg = lua_pushfstring(L, "(error object is a %s value)", + luaL_typename(L, 1)); + } + luaL_traceback(L, L, msg, 1); /* append a standard traceback */ + return 1; /* return the traceback */ +} + + +/* +** Interface to 'lua_pcall', which sets appropriate message function +** and C-signal handler. Used to run all chunks. +*/ +static int docall (lua_State *L, int narg, int nres) { + int status; + int base = lua_gettop(L) - narg; /* function index */ + lua_pushcfunction(L, msghandler); /* push message handler */ + lua_insert(L, base); /* put it under function and args */ + globalL = L; /* to be available to 'laction' */ + setsignal(SIGINT, laction); /* set C-signal handler */ + status = lua_pcall(L, narg, nres, base); + setsignal(SIGINT, SIG_DFL); /* reset C-signal handler */ + lua_remove(L, base); /* remove message handler from the stack */ + return status; +} + + +static void print_version (void) { + lua_writestring(LUA_COPYRIGHT, strlen(LUA_COPYRIGHT)); + lua_writeline(); +} + + +/* +** Create the 'arg' table, which stores all arguments from the +** command line ('argv'). It should be aligned so that, at index 0, +** it has 'argv[script]', which is the script name. The arguments +** to the script (everything after 'script') go to positive indices; +** other arguments (before the script name) go to negative indices. +** If there is no script name, assume interpreter's name as base. +** (If there is no interpreter's name either, 'script' is -1, so +** table sizes are zero.) +*/ +static void createargtable (lua_State *L, char **argv, int argc, int script) { + int i, narg; + narg = argc - (script + 1); /* number of positive indices */ + lua_createtable(L, narg, script + 1); + for (i = 0; i < argc; i++) { + lua_pushstring(L, argv[i]); + lua_rawseti(L, -2, i - script); + } + lua_setglobal(L, "arg"); +} + + +static int dochunk (lua_State *L, int status) { + if (status == LUA_OK) status = docall(L, 0, 0); + return report(L, status); +} + + +static int dofile (lua_State *L, const char *name) { + return dochunk(L, luaL_loadfile(L, name)); +} + + +static int dostring (lua_State *L, const char *s, const char *name) { + return dochunk(L, luaL_loadbuffer(L, s, strlen(s), name)); +} + + +/* +** Receives 'globname[=modname]' and runs 'globname = require(modname)'. +** If there is no explicit modname and globname contains a '-', cut +** the suffix after '-' (the "version") to make the global name. +*/ +static int dolibrary (lua_State *L, char *globname) { + int status; + char *suffix = NULL; + char *modname = strchr(globname, '='); + if (modname == NULL) { /* no explicit name? */ + modname = globname; /* module name is equal to global name */ + suffix = strchr(modname, *LUA_IGMARK); /* look for a suffix mark */ + } + else { + *modname = '\0'; /* global name ends here */ + modname++; /* module name starts after the '=' */ + } + lua_getglobal(L, "require"); + lua_pushstring(L, modname); + status = docall(L, 1, 1); /* call 'require(modname)' */ + if (status == LUA_OK) { + if (suffix != NULL) /* is there a suffix mark? */ + *suffix = '\0'; /* remove suffix from global name */ + lua_setglobal(L, globname); /* globname = require(modname) */ + } + return report(L, status); +} + + +/* +** Push on the stack the contents of table 'arg' from 1 to #arg +*/ +static int pushargs (lua_State *L) { + int i, n; + if (lua_getglobal(L, "arg") != LUA_TTABLE) + luaL_error(L, "'arg' is not a table"); + n = (int)luaL_len(L, -1); + luaL_checkstack(L, n + 3, "too many arguments to script"); + for (i = 1; i <= n; i++) + lua_rawgeti(L, -i, i); + lua_remove(L, -i); /* remove table from the stack */ + return n; +} + + +static int handle_script (lua_State *L, char **argv) { + int status; + const char *fname = argv[0]; + if (strcmp(fname, "-") == 0 && strcmp(argv[-1], "--") != 0) + fname = NULL; /* stdin */ + status = luaL_loadfile(L, fname); + if (status == LUA_OK) { + int n = pushargs(L); /* push arguments to script */ + status = docall(L, n, LUA_MULTRET); + } + return report(L, status); +} + + +/* bits of various argument indicators in 'args' */ +#define has_error 1 /* bad option */ +#define has_i 2 /* -i */ +#define has_v 4 /* -v */ +#define has_e 8 /* -e */ +#define has_E 16 /* -E */ + + +/* +** Traverses all arguments from 'argv', returning a mask with those +** needed before running any Lua code or an error code if it finds any +** invalid argument. In case of error, 'first' is the index of the bad +** argument. Otherwise, 'first' is -1 if there is no program name, +** 0 if there is no script name, or the index of the script name. +*/ +static int collectargs (char **argv, int *first) { + int args = 0; + int i; + if (argv[0] != NULL) { /* is there a program name? */ + if (argv[0][0]) /* not empty? */ + progname = argv[0]; /* save it */ + } + else { /* no program name */ + *first = -1; + return 0; + } + for (i = 1; argv[i] != NULL; i++) { /* handle arguments */ + *first = i; + if (argv[i][0] != '-') /* not an option? */ + return args; /* stop handling options */ + switch (argv[i][1]) { /* else check option */ + case '-': /* '--' */ + if (argv[i][2] != '\0') /* extra characters after '--'? */ + return has_error; /* invalid option */ + *first = i + 1; + return args; + case '\0': /* '-' */ + return args; /* script "name" is '-' */ + case 'E': + if (argv[i][2] != '\0') /* extra characters? */ + return has_error; /* invalid option */ + args |= has_E; + break; + case 'W': + if (argv[i][2] != '\0') /* extra characters? */ + return has_error; /* invalid option */ + break; + case 'i': + args |= has_i; /* (-i implies -v) *//* FALLTHROUGH */ + case 'v': + if (argv[i][2] != '\0') /* extra characters? */ + return has_error; /* invalid option */ + args |= has_v; + break; + case 'e': + args |= has_e; /* FALLTHROUGH */ + case 'l': /* both options need an argument */ + if (argv[i][2] == '\0') { /* no concatenated argument? */ + i++; /* try next 'argv' */ + if (argv[i] == NULL || argv[i][0] == '-') + return has_error; /* no next argument or it is another option */ + } + break; + default: /* invalid option */ + return has_error; + } + } + *first = 0; /* no script name */ + return args; +} + + +/* +** Processes options 'e' and 'l', which involve running Lua code, and +** 'W', which also affects the state. +** Returns 0 if some code raises an error. +*/ +static int runargs (lua_State *L, char **argv, int n) { + int i; + for (i = 1; i < n; i++) { + int option = argv[i][1]; + lua_assert(argv[i][0] == '-'); /* already checked */ + switch (option) { + case 'e': case 'l': { + int status; + char *extra = argv[i] + 2; /* both options need an argument */ + if (*extra == '\0') extra = argv[++i]; + lua_assert(extra != NULL); + status = (option == 'e') + ? dostring(L, extra, "=(command line)") + : dolibrary(L, extra); + if (status != LUA_OK) return 0; + break; + } + case 'W': + lua_warning(L, "@on", 0); /* warnings on */ + break; + } + } + return 1; +} + + +static int handle_luainit (lua_State *L) { + const char *name = "=" LUA_INITVARVERSION; + const char *init = getenv(name + 1); + if (init == NULL) { + name = "=" LUA_INIT_VAR; + init = getenv(name + 1); /* try alternative name */ + } + if (init == NULL) return LUA_OK; + else if (init[0] == '@') + return dofile(L, init+1); + else + return dostring(L, init, name); +} + + +/* +** {================================================================== +** Read-Eval-Print Loop (REPL) +** =================================================================== +*/ + +#if !defined(LUA_PROMPT) +#define LUA_PROMPT "> " +#define LUA_PROMPT2 ">> " +#endif + +#if !defined(LUA_MAXINPUT) +#define LUA_MAXINPUT 512 +#endif + + +/* +** lua_stdin_is_tty detects whether the standard input is a 'tty' (that +** is, whether we're running lua interactively). +*/ +#if !defined(lua_stdin_is_tty) /* { */ + +#if defined(LUA_USE_POSIX) /* { */ + +#include <unistd.h> +#define lua_stdin_is_tty() isatty(0) + +#elif defined(LUA_USE_WINDOWS) /* }{ */ + +#include <io.h> +#include <windows.h> + +#define lua_stdin_is_tty() _isatty(_fileno(stdin)) + +#else /* }{ */ + +/* ISO C definition */ +#define lua_stdin_is_tty() 1 /* assume stdin is a tty */ + +#endif /* } */ + +#endif /* } */ + + +/* +** lua_readline defines how to show a prompt and then read a line from +** the standard input. +** lua_saveline defines how to "save" a read line in a "history". +** lua_freeline defines how to free a line read by lua_readline. +*/ +#if !defined(lua_readline) /* { */ + +#if defined(LUA_USE_READLINE) /* { */ + +#include <readline/readline.h> +#include <readline/history.h> +#define lua_initreadline(L) ((void)L, rl_readline_name="lua") +#define lua_readline(L,b,p) ((void)L, ((b)=readline(p)) != NULL) +#define lua_saveline(L,line) ((void)L, add_history(line)) +#define lua_freeline(L,b) ((void)L, free(b)) + +#else /* }{ */ + +#define lua_initreadline(L) ((void)L) +#define lua_readline(L,b,p) \ + ((void)L, fputs(p, stdout), fflush(stdout), /* show prompt */ \ + fgets(b, LUA_MAXINPUT, stdin) != NULL) /* get line */ +#define lua_saveline(L,line) { (void)L; (void)line; } +#define lua_freeline(L,b) { (void)L; (void)b; } + +#endif /* } */ + +#endif /* } */ + + +/* +** Return the string to be used as a prompt by the interpreter. Leave +** the string (or nil, if using the default value) on the stack, to keep +** it anchored. +*/ +static const char *get_prompt (lua_State *L, int firstline) { + if (lua_getglobal(L, firstline ? "_PROMPT" : "_PROMPT2") == LUA_TNIL) + return (firstline ? LUA_PROMPT : LUA_PROMPT2); /* use the default */ + else { /* apply 'tostring' over the value */ + const char *p = luaL_tolstring(L, -1, NULL); + lua_remove(L, -2); /* remove original value */ + return p; + } +} + +/* mark in error messages for incomplete statements */ +#define EOFMARK "<eof>" +#define marklen (sizeof(EOFMARK)/sizeof(char) - 1) + + +/* +** Check whether 'status' signals a syntax error and the error +** message at the top of the stack ends with the above mark for +** incomplete statements. +*/ +static int incomplete (lua_State *L, int status) { + if (status == LUA_ERRSYNTAX) { + size_t lmsg; + const char *msg = lua_tolstring(L, -1, &lmsg); + if (lmsg >= marklen && strcmp(msg + lmsg - marklen, EOFMARK) == 0) + return 1; + } + return 0; /* else... */ +} + + +/* +** Prompt the user, read a line, and push it into the Lua stack. +*/ +static int pushline (lua_State *L, int firstline) { + char buffer[LUA_MAXINPUT]; + char *b = buffer; + size_t l; + const char *prmt = get_prompt(L, firstline); + int readstatus = lua_readline(L, b, prmt); + lua_pop(L, 1); /* remove prompt */ + if (readstatus == 0) + return 0; /* no input */ + l = strlen(b); + if (l > 0 && b[l-1] == '\n') /* line ends with newline? */ + b[--l] = '\0'; /* remove it */ + if (firstline && b[0] == '=') /* for compatibility with 5.2, ... */ + lua_pushfstring(L, "return %s", b + 1); /* change '=' to 'return' */ + else + lua_pushlstring(L, b, l); + lua_freeline(L, b); + return 1; +} + + +/* +** Try to compile line on the stack as 'return <line>;'; on return, stack +** has either compiled chunk or original line (if compilation failed). +*/ +static int addreturn (lua_State *L) { + const char *line = lua_tostring(L, -1); /* original line */ + const char *retline = lua_pushfstring(L, "return %s;", line); + int status = luaL_loadbuffer(L, retline, strlen(retline), "=stdin"); + if (status == LUA_OK) { + lua_remove(L, -2); /* remove modified line */ + if (line[0] != '\0') /* non empty? */ + lua_saveline(L, line); /* keep history */ + } + else + lua_pop(L, 2); /* pop result from 'luaL_loadbuffer' and modified line */ + return status; +} + + +/* +** Read multiple lines until a complete Lua statement +*/ +static int multiline (lua_State *L) { + for (;;) { /* repeat until gets a complete statement */ + size_t len; + const char *line = lua_tolstring(L, 1, &len); /* get what it has */ + int status = luaL_loadbuffer(L, line, len, "=stdin"); /* try it */ + if (!incomplete(L, status) || !pushline(L, 0)) { + lua_saveline(L, line); /* keep history */ + return status; /* should not or cannot try to add continuation line */ + } + lua_remove(L, -2); /* remove error message (from incomplete line) */ + lua_pushliteral(L, "\n"); /* add newline... */ + lua_insert(L, -2); /* ...between the two lines */ + lua_concat(L, 3); /* join them */ + } +} + + +/* +** Read a line and try to load (compile) it first as an expression (by +** adding "return " in front of it) and second as a statement. Return +** the final status of load/call with the resulting function (if any) +** in the top of the stack. +*/ +static int loadline (lua_State *L) { + int status; + lua_settop(L, 0); + if (!pushline(L, 1)) + return -1; /* no input */ + if ((status = addreturn(L)) != LUA_OK) /* 'return ...' did not work? */ + status = multiline(L); /* try as command, maybe with continuation lines */ + lua_remove(L, 1); /* remove line from the stack */ + lua_assert(lua_gettop(L) == 1); + return status; +} + + +/* +** Prints (calling the Lua 'print' function) any values on the stack +*/ +static void l_print (lua_State *L) { + int n = lua_gettop(L); + if (n > 0) { /* any result to be printed? */ + luaL_checkstack(L, LUA_MINSTACK, "too many results to print"); + lua_getglobal(L, "print"); + lua_insert(L, 1); + if (lua_pcall(L, n, 0, 0) != LUA_OK) + l_message(progname, lua_pushfstring(L, "error calling 'print' (%s)", + lua_tostring(L, -1))); + } +} + + +/* +** Do the REPL: repeatedly read (load) a line, evaluate (call) it, and +** print any results. +*/ +static void doREPL (lua_State *L) { + int status; + const char *oldprogname = progname; + progname = NULL; /* no 'progname' on errors in interactive mode */ + lua_initreadline(L); + while ((status = loadline(L)) != -1) { + if (status == LUA_OK) + status = docall(L, 0, LUA_MULTRET); + if (status == LUA_OK) l_print(L); + else report(L, status); + } + lua_settop(L, 0); /* clear stack */ + lua_writeline(); + progname = oldprogname; +} + +/* }================================================================== */ + + +/* +** Main body of stand-alone interpreter (to be called in protected mode). +** Reads the options and handles them all. +*/ +static int pmain (lua_State *L) { + int argc = (int)lua_tointeger(L, 1); + char **argv = (char **)lua_touserdata(L, 2); + int script; + int args = collectargs(argv, &script); + int optlim = (script > 0) ? script : argc; /* first argv not an option */ + luaL_checkversion(L); /* check that interpreter has correct version */ + if (args == has_error) { /* bad arg? */ + print_usage(argv[script]); /* 'script' has index of bad arg. */ + return 0; + } + if (args & has_v) /* option '-v'? */ + print_version(); + if (args & has_E) { /* option '-E'? */ + lua_pushboolean(L, 1); /* signal for libraries to ignore env. vars. */ + lua_setfield(L, LUA_REGISTRYINDEX, "LUA_NOENV"); + } + luaL_openlibs(L); /* open standard libraries */ + createargtable(L, argv, argc, script); /* create table 'arg' */ + lua_gc(L, LUA_GCRESTART); /* start GC... */ + lua_gc(L, LUA_GCGEN, 0, 0); /* ...in generational mode */ + if (!(args & has_E)) { /* no option '-E'? */ + if (handle_luainit(L) != LUA_OK) /* run LUA_INIT */ + return 0; /* error running LUA_INIT */ + } + if (!runargs(L, argv, optlim)) /* execute arguments -e and -l */ + return 0; /* something failed */ + if (script > 0) { /* execute main script (if there is one) */ + if (handle_script(L, argv + script) != LUA_OK) + return 0; /* interrupt in case of error */ + } + if (args & has_i) /* -i option? */ + doREPL(L); /* do read-eval-print loop */ + else if (script < 1 && !(args & (has_e | has_v))) { /* no active option? */ + if (lua_stdin_is_tty()) { /* running in interactive mode? */ + print_version(); + doREPL(L); /* do read-eval-print loop */ + } + else dofile(L, NULL); /* executes stdin as a file */ + } + lua_pushboolean(L, 1); /* signal no errors */ + return 1; +} + + +int main (int argc, char **argv) { + int status, result; + lua_State *L = luaL_newstate(); /* create state */ + if (L == NULL) { + l_message(argv[0], "cannot create state: not enough memory"); + return EXIT_FAILURE; + } + lua_gc(L, LUA_GCSTOP); /* stop GC while building state */ + lua_pushcfunction(L, &pmain); /* to call 'pmain' in protected mode */ + lua_pushinteger(L, argc); /* 1st argument */ + lua_pushlightuserdata(L, argv); /* 2nd argument */ + status = lua_pcall(L, 2, 1, 0); /* do the call */ + result = lua_toboolean(L, -1); /* get result */ + report(L, status); + lua_close(L); + return (result && status == LUA_OK) ? EXIT_SUCCESS : EXIT_FAILURE; +} + diff --git a/vendor/lua-5.4.8/src/lua.h b/vendor/lua-5.4.8/src/lua.h new file mode 100644 index 0000000..f3ea590 --- /dev/null +++ b/vendor/lua-5.4.8/src/lua.h @@ -0,0 +1,523 @@ +/* +** $Id: lua.h $ +** Lua - A Scripting Language +** Lua.org, PUC-Rio, Brazil (http://www.lua.org) +** See Copyright Notice at the end of this file +*/ + + +#ifndef lua_h +#define lua_h + +#include <stdarg.h> +#include <stddef.h> + + +#include "luaconf.h" + + +#define LUA_VERSION_MAJOR "5" +#define LUA_VERSION_MINOR "4" +#define LUA_VERSION_RELEASE "8" + +#define LUA_VERSION_NUM 504 +#define LUA_VERSION_RELEASE_NUM (LUA_VERSION_NUM * 100 + 8) + +#define LUA_VERSION "Lua " LUA_VERSION_MAJOR "." LUA_VERSION_MINOR +#define LUA_RELEASE LUA_VERSION "." LUA_VERSION_RELEASE +#define LUA_COPYRIGHT LUA_RELEASE " Copyright (C) 1994-2025 Lua.org, PUC-Rio" +#define LUA_AUTHORS "R. Ierusalimschy, L. H. de Figueiredo, W. Celes" + + +/* mark for precompiled code ('<esc>Lua') */ +#define LUA_SIGNATURE "\x1bLua" + +/* option for multiple returns in 'lua_pcall' and 'lua_call' */ +#define LUA_MULTRET (-1) + + +/* +** Pseudo-indices +** (-LUAI_MAXSTACK is the minimum valid index; we keep some free empty +** space after that to help overflow detection) +*/ +#define LUA_REGISTRYINDEX (-LUAI_MAXSTACK - 1000) +#define lua_upvalueindex(i) (LUA_REGISTRYINDEX - (i)) + + +/* thread status */ +#define LUA_OK 0 +#define LUA_YIELD 1 +#define LUA_ERRRUN 2 +#define LUA_ERRSYNTAX 3 +#define LUA_ERRMEM 4 +#define LUA_ERRERR 5 + + +typedef struct lua_State lua_State; + + +/* +** basic types +*/ +#define LUA_TNONE (-1) + +#define LUA_TNIL 0 +#define LUA_TBOOLEAN 1 +#define LUA_TLIGHTUSERDATA 2 +#define LUA_TNUMBER 3 +#define LUA_TSTRING 4 +#define LUA_TTABLE 5 +#define LUA_TFUNCTION 6 +#define LUA_TUSERDATA 7 +#define LUA_TTHREAD 8 + +#define LUA_NUMTYPES 9 + + + +/* minimum Lua stack available to a C function */ +#define LUA_MINSTACK 20 + + +/* predefined values in the registry */ +#define LUA_RIDX_MAINTHREAD 1 +#define LUA_RIDX_GLOBALS 2 +#define LUA_RIDX_LAST LUA_RIDX_GLOBALS + + +/* type of numbers in Lua */ +typedef LUA_NUMBER lua_Number; + + +/* type for integer functions */ +typedef LUA_INTEGER lua_Integer; + +/* unsigned integer type */ +typedef LUA_UNSIGNED lua_Unsigned; + +/* type for continuation-function contexts */ +typedef LUA_KCONTEXT lua_KContext; + + +/* +** Type for C functions registered with Lua +*/ +typedef int (*lua_CFunction) (lua_State *L); + +/* +** Type for continuation functions +*/ +typedef int (*lua_KFunction) (lua_State *L, int status, lua_KContext ctx); + + +/* +** Type for functions that read/write blocks when loading/dumping Lua chunks +*/ +typedef const char * (*lua_Reader) (lua_State *L, void *ud, size_t *sz); + +typedef int (*lua_Writer) (lua_State *L, const void *p, size_t sz, void *ud); + + +/* +** Type for memory-allocation functions +*/ +typedef void * (*lua_Alloc) (void *ud, void *ptr, size_t osize, size_t nsize); + + +/* +** Type for warning functions +*/ +typedef void (*lua_WarnFunction) (void *ud, const char *msg, int tocont); + + +/* +** Type used by the debug API to collect debug information +*/ +typedef struct lua_Debug lua_Debug; + + +/* +** Functions to be called by the debugger in specific events +*/ +typedef void (*lua_Hook) (lua_State *L, lua_Debug *ar); + + +/* +** generic extra include file +*/ +#if defined(LUA_USER_H) +#include LUA_USER_H +#endif + + +/* +** RCS ident string +*/ +extern const char lua_ident[]; + + +/* +** state manipulation +*/ +LUA_API lua_State *(lua_newstate) (lua_Alloc f, void *ud); +LUA_API void (lua_close) (lua_State *L); +LUA_API lua_State *(lua_newthread) (lua_State *L); +LUA_API int (lua_closethread) (lua_State *L, lua_State *from); +LUA_API int (lua_resetthread) (lua_State *L); /* Deprecated! */ + +LUA_API lua_CFunction (lua_atpanic) (lua_State *L, lua_CFunction panicf); + + +LUA_API lua_Number (lua_version) (lua_State *L); + + +/* +** basic stack manipulation +*/ +LUA_API int (lua_absindex) (lua_State *L, int idx); +LUA_API int (lua_gettop) (lua_State *L); +LUA_API void (lua_settop) (lua_State *L, int idx); +LUA_API void (lua_pushvalue) (lua_State *L, int idx); +LUA_API void (lua_rotate) (lua_State *L, int idx, int n); +LUA_API void (lua_copy) (lua_State *L, int fromidx, int toidx); +LUA_API int (lua_checkstack) (lua_State *L, int n); + +LUA_API void (lua_xmove) (lua_State *from, lua_State *to, int n); + + +/* +** access functions (stack -> C) +*/ + +LUA_API int (lua_isnumber) (lua_State *L, int idx); +LUA_API int (lua_isstring) (lua_State *L, int idx); +LUA_API int (lua_iscfunction) (lua_State *L, int idx); +LUA_API int (lua_isinteger) (lua_State *L, int idx); +LUA_API int (lua_isuserdata) (lua_State *L, int idx); +LUA_API int (lua_type) (lua_State *L, int idx); +LUA_API const char *(lua_typename) (lua_State *L, int tp); + +LUA_API lua_Number (lua_tonumberx) (lua_State *L, int idx, int *isnum); +LUA_API lua_Integer (lua_tointegerx) (lua_State *L, int idx, int *isnum); +LUA_API int (lua_toboolean) (lua_State *L, int idx); +LUA_API const char *(lua_tolstring) (lua_State *L, int idx, size_t *len); +LUA_API lua_Unsigned (lua_rawlen) (lua_State *L, int idx); +LUA_API lua_CFunction (lua_tocfunction) (lua_State *L, int idx); +LUA_API void *(lua_touserdata) (lua_State *L, int idx); +LUA_API lua_State *(lua_tothread) (lua_State *L, int idx); +LUA_API const void *(lua_topointer) (lua_State *L, int idx); + + +/* +** Comparison and arithmetic functions +*/ + +#define LUA_OPADD 0 /* ORDER TM, ORDER OP */ +#define LUA_OPSUB 1 +#define LUA_OPMUL 2 +#define LUA_OPMOD 3 +#define LUA_OPPOW 4 +#define LUA_OPDIV 5 +#define LUA_OPIDIV 6 +#define LUA_OPBAND 7 +#define LUA_OPBOR 8 +#define LUA_OPBXOR 9 +#define LUA_OPSHL 10 +#define LUA_OPSHR 11 +#define LUA_OPUNM 12 +#define LUA_OPBNOT 13 + +LUA_API void (lua_arith) (lua_State *L, int op); + +#define LUA_OPEQ 0 +#define LUA_OPLT 1 +#define LUA_OPLE 2 + +LUA_API int (lua_rawequal) (lua_State *L, int idx1, int idx2); +LUA_API int (lua_compare) (lua_State *L, int idx1, int idx2, int op); + + +/* +** push functions (C -> stack) +*/ +LUA_API void (lua_pushnil) (lua_State *L); +LUA_API void (lua_pushnumber) (lua_State *L, lua_Number n); +LUA_API void (lua_pushinteger) (lua_State *L, lua_Integer n); +LUA_API const char *(lua_pushlstring) (lua_State *L, const char *s, size_t len); +LUA_API const char *(lua_pushstring) (lua_State *L, const char *s); +LUA_API const char *(lua_pushvfstring) (lua_State *L, const char *fmt, + va_list argp); +LUA_API const char *(lua_pushfstring) (lua_State *L, const char *fmt, ...); +LUA_API void (lua_pushcclosure) (lua_State *L, lua_CFunction fn, int n); +LUA_API void (lua_pushboolean) (lua_State *L, int b); +LUA_API void (lua_pushlightuserdata) (lua_State *L, void *p); +LUA_API int (lua_pushthread) (lua_State *L); + + +/* +** get functions (Lua -> stack) +*/ +LUA_API int (lua_getglobal) (lua_State *L, const char *name); +LUA_API int (lua_gettable) (lua_State *L, int idx); +LUA_API int (lua_getfield) (lua_State *L, int idx, const char *k); +LUA_API int (lua_geti) (lua_State *L, int idx, lua_Integer n); +LUA_API int (lua_rawget) (lua_State *L, int idx); +LUA_API int (lua_rawgeti) (lua_State *L, int idx, lua_Integer n); +LUA_API int (lua_rawgetp) (lua_State *L, int idx, const void *p); + +LUA_API void (lua_createtable) (lua_State *L, int narr, int nrec); +LUA_API void *(lua_newuserdatauv) (lua_State *L, size_t sz, int nuvalue); +LUA_API int (lua_getmetatable) (lua_State *L, int objindex); +LUA_API int (lua_getiuservalue) (lua_State *L, int idx, int n); + + +/* +** set functions (stack -> Lua) +*/ +LUA_API void (lua_setglobal) (lua_State *L, const char *name); +LUA_API void (lua_settable) (lua_State *L, int idx); +LUA_API void (lua_setfield) (lua_State *L, int idx, const char *k); +LUA_API void (lua_seti) (lua_State *L, int idx, lua_Integer n); +LUA_API void (lua_rawset) (lua_State *L, int idx); +LUA_API void (lua_rawseti) (lua_State *L, int idx, lua_Integer n); +LUA_API void (lua_rawsetp) (lua_State *L, int idx, const void *p); +LUA_API int (lua_setmetatable) (lua_State *L, int objindex); +LUA_API int (lua_setiuservalue) (lua_State *L, int idx, int n); + + +/* +** 'load' and 'call' functions (load and run Lua code) +*/ +LUA_API void (lua_callk) (lua_State *L, int nargs, int nresults, + lua_KContext ctx, lua_KFunction k); +#define lua_call(L,n,r) lua_callk(L, (n), (r), 0, NULL) + +LUA_API int (lua_pcallk) (lua_State *L, int nargs, int nresults, int errfunc, + lua_KContext ctx, lua_KFunction k); +#define lua_pcall(L,n,r,f) lua_pcallk(L, (n), (r), (f), 0, NULL) + +LUA_API int (lua_load) (lua_State *L, lua_Reader reader, void *dt, + const char *chunkname, const char *mode); + +LUA_API int (lua_dump) (lua_State *L, lua_Writer writer, void *data, int strip); + + +/* +** coroutine functions +*/ +LUA_API int (lua_yieldk) (lua_State *L, int nresults, lua_KContext ctx, + lua_KFunction k); +LUA_API int (lua_resume) (lua_State *L, lua_State *from, int narg, + int *nres); +LUA_API int (lua_status) (lua_State *L); +LUA_API int (lua_isyieldable) (lua_State *L); + +#define lua_yield(L,n) lua_yieldk(L, (n), 0, NULL) + + +/* +** Warning-related functions +*/ +LUA_API void (lua_setwarnf) (lua_State *L, lua_WarnFunction f, void *ud); +LUA_API void (lua_warning) (lua_State *L, const char *msg, int tocont); + + +/* +** garbage-collection function and options +*/ + +#define LUA_GCSTOP 0 +#define LUA_GCRESTART 1 +#define LUA_GCCOLLECT 2 +#define LUA_GCCOUNT 3 +#define LUA_GCCOUNTB 4 +#define LUA_GCSTEP 5 +#define LUA_GCSETPAUSE 6 +#define LUA_GCSETSTEPMUL 7 +#define LUA_GCISRUNNING 9 +#define LUA_GCGEN 10 +#define LUA_GCINC 11 + +LUA_API int (lua_gc) (lua_State *L, int what, ...); + + +/* +** miscellaneous functions +*/ + +LUA_API int (lua_error) (lua_State *L); + +LUA_API int (lua_next) (lua_State *L, int idx); + +LUA_API void (lua_concat) (lua_State *L, int n); +LUA_API void (lua_len) (lua_State *L, int idx); + +LUA_API size_t (lua_stringtonumber) (lua_State *L, const char *s); + +LUA_API lua_Alloc (lua_getallocf) (lua_State *L, void **ud); +LUA_API void (lua_setallocf) (lua_State *L, lua_Alloc f, void *ud); + +LUA_API void (lua_toclose) (lua_State *L, int idx); +LUA_API void (lua_closeslot) (lua_State *L, int idx); + + +/* +** {============================================================== +** some useful macros +** =============================================================== +*/ + +#define lua_getextraspace(L) ((void *)((char *)(L) - LUA_EXTRASPACE)) + +#define lua_tonumber(L,i) lua_tonumberx(L,(i),NULL) +#define lua_tointeger(L,i) lua_tointegerx(L,(i),NULL) + +#define lua_pop(L,n) lua_settop(L, -(n)-1) + +#define lua_newtable(L) lua_createtable(L, 0, 0) + +#define lua_register(L,n,f) (lua_pushcfunction(L, (f)), lua_setglobal(L, (n))) + +#define lua_pushcfunction(L,f) lua_pushcclosure(L, (f), 0) + +#define lua_isfunction(L,n) (lua_type(L, (n)) == LUA_TFUNCTION) +#define lua_istable(L,n) (lua_type(L, (n)) == LUA_TTABLE) +#define lua_islightuserdata(L,n) (lua_type(L, (n)) == LUA_TLIGHTUSERDATA) +#define lua_isnil(L,n) (lua_type(L, (n)) == LUA_TNIL) +#define lua_isboolean(L,n) (lua_type(L, (n)) == LUA_TBOOLEAN) +#define lua_isthread(L,n) (lua_type(L, (n)) == LUA_TTHREAD) +#define lua_isnone(L,n) (lua_type(L, (n)) == LUA_TNONE) +#define lua_isnoneornil(L, n) (lua_type(L, (n)) <= 0) + +#define lua_pushliteral(L, s) lua_pushstring(L, "" s) + +#define lua_pushglobaltable(L) \ + ((void)lua_rawgeti(L, LUA_REGISTRYINDEX, LUA_RIDX_GLOBALS)) + +#define lua_tostring(L,i) lua_tolstring(L, (i), NULL) + + +#define lua_insert(L,idx) lua_rotate(L, (idx), 1) + +#define lua_remove(L,idx) (lua_rotate(L, (idx), -1), lua_pop(L, 1)) + +#define lua_replace(L,idx) (lua_copy(L, -1, (idx)), lua_pop(L, 1)) + +/* }============================================================== */ + + +/* +** {============================================================== +** compatibility macros +** =============================================================== +*/ +#if defined(LUA_COMPAT_APIINTCASTS) + +#define lua_pushunsigned(L,n) lua_pushinteger(L, (lua_Integer)(n)) +#define lua_tounsignedx(L,i,is) ((lua_Unsigned)lua_tointegerx(L,i,is)) +#define lua_tounsigned(L,i) lua_tounsignedx(L,(i),NULL) + +#endif + +#define lua_newuserdata(L,s) lua_newuserdatauv(L,s,1) +#define lua_getuservalue(L,idx) lua_getiuservalue(L,idx,1) +#define lua_setuservalue(L,idx) lua_setiuservalue(L,idx,1) + +#define LUA_NUMTAGS LUA_NUMTYPES + +/* }============================================================== */ + +/* +** {====================================================================== +** Debug API +** ======================================================================= +*/ + + +/* +** Event codes +*/ +#define LUA_HOOKCALL 0 +#define LUA_HOOKRET 1 +#define LUA_HOOKLINE 2 +#define LUA_HOOKCOUNT 3 +#define LUA_HOOKTAILCALL 4 + + +/* +** Event masks +*/ +#define LUA_MASKCALL (1 << LUA_HOOKCALL) +#define LUA_MASKRET (1 << LUA_HOOKRET) +#define LUA_MASKLINE (1 << LUA_HOOKLINE) +#define LUA_MASKCOUNT (1 << LUA_HOOKCOUNT) + + +LUA_API int (lua_getstack) (lua_State *L, int level, lua_Debug *ar); +LUA_API int (lua_getinfo) (lua_State *L, const char *what, lua_Debug *ar); +LUA_API const char *(lua_getlocal) (lua_State *L, const lua_Debug *ar, int n); +LUA_API const char *(lua_setlocal) (lua_State *L, const lua_Debug *ar, int n); +LUA_API const char *(lua_getupvalue) (lua_State *L, int funcindex, int n); +LUA_API const char *(lua_setupvalue) (lua_State *L, int funcindex, int n); + +LUA_API void *(lua_upvalueid) (lua_State *L, int fidx, int n); +LUA_API void (lua_upvaluejoin) (lua_State *L, int fidx1, int n1, + int fidx2, int n2); + +LUA_API void (lua_sethook) (lua_State *L, lua_Hook func, int mask, int count); +LUA_API lua_Hook (lua_gethook) (lua_State *L); +LUA_API int (lua_gethookmask) (lua_State *L); +LUA_API int (lua_gethookcount) (lua_State *L); + +LUA_API int (lua_setcstacklimit) (lua_State *L, unsigned int limit); + +struct lua_Debug { + int event; + const char *name; /* (n) */ + const char *namewhat; /* (n) 'global', 'local', 'field', 'method' */ + const char *what; /* (S) 'Lua', 'C', 'main', 'tail' */ + const char *source; /* (S) */ + size_t srclen; /* (S) */ + int currentline; /* (l) */ + int linedefined; /* (S) */ + int lastlinedefined; /* (S) */ + unsigned char nups; /* (u) number of upvalues */ + unsigned char nparams;/* (u) number of parameters */ + char isvararg; /* (u) */ + char istailcall; /* (t) */ + unsigned short ftransfer; /* (r) index of first value transferred */ + unsigned short ntransfer; /* (r) number of transferred values */ + char short_src[LUA_IDSIZE]; /* (S) */ + /* private part */ + struct CallInfo *i_ci; /* active function */ +}; + +/* }====================================================================== */ + + +/****************************************************************************** +* Copyright (C) 1994-2025 Lua.org, PUC-Rio. +* +* Permission is hereby granted, free of charge, to any person obtaining +* a copy of this software and associated documentation files (the +* "Software"), to deal in the Software without restriction, including +* without limitation the rights to use, copy, modify, merge, publish, +* distribute, sublicense, and/or sell copies of the Software, and to +* permit persons to whom the Software is furnished to do so, subject to +* the following conditions: +* +* The above copyright notice and this permission notice shall be +* included in all copies or substantial portions of the Software. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +******************************************************************************/ + + +#endif diff --git a/vendor/lua-5.4.8/src/lua.hpp b/vendor/lua-5.4.8/src/lua.hpp new file mode 100644 index 0000000..ec417f5 --- /dev/null +++ b/vendor/lua-5.4.8/src/lua.hpp @@ -0,0 +1,9 @@ +// lua.hpp +// Lua header files for C++ +// <<extern "C">> not supplied automatically because Lua also compiles as C++ + +extern "C" { +#include "lua.h" +#include "lualib.h" +#include "lauxlib.h" +} diff --git a/vendor/lua-5.4.8/src/luac b/vendor/lua-5.4.8/src/luac Binary files differnew file mode 100755 index 0000000..bed1c2f --- /dev/null +++ b/vendor/lua-5.4.8/src/luac diff --git a/vendor/lua-5.4.8/src/luac.c b/vendor/lua-5.4.8/src/luac.c new file mode 100644 index 0000000..5f4a141 --- /dev/null +++ b/vendor/lua-5.4.8/src/luac.c @@ -0,0 +1,723 @@ +/* +** $Id: luac.c $ +** Lua compiler (saves bytecodes to files; also lists bytecodes) +** See Copyright Notice in lua.h +*/ + +#define luac_c +#define LUA_CORE + +#include "lprefix.h" + +#include <ctype.h> +#include <errno.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +#include "lua.h" +#include "lauxlib.h" + +#include "ldebug.h" +#include "lobject.h" +#include "lopcodes.h" +#include "lopnames.h" +#include "lstate.h" +#include "lundump.h" + +static void PrintFunction(const Proto* f, int full); +#define luaU_print PrintFunction + +#define PROGNAME "luac" /* default program name */ +#define OUTPUT PROGNAME ".out" /* default output file */ + +static int listing=0; /* list bytecodes? */ +static int dumping=1; /* dump bytecodes? */ +static int stripping=0; /* strip debug information? */ +static char Output[]={ OUTPUT }; /* default output file name */ +static const char* output=Output; /* actual output file name */ +static const char* progname=PROGNAME; /* actual program name */ +static TString **tmname; + +static void fatal(const char* message) +{ + fprintf(stderr,"%s: %s\n",progname,message); + exit(EXIT_FAILURE); +} + +static void cannot(const char* what) +{ + fprintf(stderr,"%s: cannot %s %s: %s\n",progname,what,output,strerror(errno)); + exit(EXIT_FAILURE); +} + +static void usage(const char* message) +{ + if (*message=='-') + fprintf(stderr,"%s: unrecognized option '%s'\n",progname,message); + else + fprintf(stderr,"%s: %s\n",progname,message); + fprintf(stderr, + "usage: %s [options] [filenames]\n" + "Available options are:\n" + " -l list (use -l -l for full listing)\n" + " -o name output to file 'name' (default is \"%s\")\n" + " -p parse only\n" + " -s strip debug information\n" + " -v show version information\n" + " -- stop handling options\n" + " - stop handling options and process stdin\n" + ,progname,Output); + exit(EXIT_FAILURE); +} + +#define IS(s) (strcmp(argv[i],s)==0) + +static int doargs(int argc, char* argv[]) +{ + int i; + int version=0; + if (argv[0]!=NULL && *argv[0]!=0) progname=argv[0]; + for (i=1; i<argc; i++) + { + if (*argv[i]!='-') /* end of options; keep it */ + break; + else if (IS("--")) /* end of options; skip it */ + { + ++i; + if (version) ++version; + break; + } + else if (IS("-")) /* end of options; use stdin */ + break; + else if (IS("-l")) /* list */ + ++listing; + else if (IS("-o")) /* output file */ + { + output=argv[++i]; + if (output==NULL || *output==0 || (*output=='-' && output[1]!=0)) + usage("'-o' needs argument"); + if (IS("-")) output=NULL; + } + else if (IS("-p")) /* parse only */ + dumping=0; + else if (IS("-s")) /* strip debug information */ + stripping=1; + else if (IS("-v")) /* show version */ + ++version; + else /* unknown option */ + usage(argv[i]); + } + if (i==argc && (listing || !dumping)) + { + dumping=0; + argv[--i]=Output; + } + if (version) + { + printf("%s\n",LUA_COPYRIGHT); + if (version==argc-1) exit(EXIT_SUCCESS); + } + return i; +} + +#define FUNCTION "(function()end)();\n" + +static const char* reader(lua_State* L, void* ud, size_t* size) +{ + UNUSED(L); + if ((*(int*)ud)--) + { + *size=sizeof(FUNCTION)-1; + return FUNCTION; + } + else + { + *size=0; + return NULL; + } +} + +#define toproto(L,i) getproto(s2v(L->top.p+(i))) + +static const Proto* combine(lua_State* L, int n) +{ + if (n==1) + return toproto(L,-1); + else + { + Proto* f; + int i=n; + if (lua_load(L,reader,&i,"=(" PROGNAME ")",NULL)!=LUA_OK) fatal(lua_tostring(L,-1)); + f=toproto(L,-1); + for (i=0; i<n; i++) + { + f->p[i]=toproto(L,i-n-1); + if (f->p[i]->sizeupvalues>0) f->p[i]->upvalues[0].instack=0; + } + return f; + } +} + +static int writer(lua_State* L, const void* p, size_t size, void* u) +{ + UNUSED(L); + return (fwrite(p,size,1,(FILE*)u)!=1) && (size!=0); +} + +static int pmain(lua_State* L) +{ + int argc=(int)lua_tointeger(L,1); + char** argv=(char**)lua_touserdata(L,2); + const Proto* f; + int i; + tmname=G(L)->tmname; + if (!lua_checkstack(L,argc)) fatal("too many input files"); + for (i=0; i<argc; i++) + { + const char* filename=IS("-") ? NULL : argv[i]; + if (luaL_loadfile(L,filename)!=LUA_OK) fatal(lua_tostring(L,-1)); + } + f=combine(L,argc); + if (listing) luaU_print(f,listing>1); + if (dumping) + { + FILE* D= (output==NULL) ? stdout : fopen(output,"wb"); + if (D==NULL) cannot("open"); + lua_lock(L); + luaU_dump(L,f,writer,D,stripping); + lua_unlock(L); + if (ferror(D)) cannot("write"); + if (fclose(D)) cannot("close"); + } + return 0; +} + +int main(int argc, char* argv[]) +{ + lua_State* L; + int i=doargs(argc,argv); + argc-=i; argv+=i; + if (argc<=0) usage("no input files given"); + L=luaL_newstate(); + if (L==NULL) fatal("cannot create state: not enough memory"); + lua_pushcfunction(L,&pmain); + lua_pushinteger(L,argc); + lua_pushlightuserdata(L,argv); + if (lua_pcall(L,2,0,0)!=LUA_OK) fatal(lua_tostring(L,-1)); + lua_close(L); + return EXIT_SUCCESS; +} + +/* +** print bytecodes +*/ + +#define UPVALNAME(x) ((f->upvalues[x].name) ? getstr(f->upvalues[x].name) : "-") +#define VOID(p) ((const void*)(p)) +#define eventname(i) (getstr(tmname[i])) + +static void PrintString(const TString* ts) +{ + const char* s=getstr(ts); + size_t i,n=tsslen(ts); + printf("\""); + for (i=0; i<n; i++) + { + int c=(int)(unsigned char)s[i]; + switch (c) + { + case '"': + printf("\\\""); + break; + case '\\': + printf("\\\\"); + break; + case '\a': + printf("\\a"); + break; + case '\b': + printf("\\b"); + break; + case '\f': + printf("\\f"); + break; + case '\n': + printf("\\n"); + break; + case '\r': + printf("\\r"); + break; + case '\t': + printf("\\t"); + break; + case '\v': + printf("\\v"); + break; + default: + if (isprint(c)) printf("%c",c); else printf("\\%03d",c); + break; + } + } + printf("\""); +} + +static void PrintType(const Proto* f, int i) +{ + const TValue* o=&f->k[i]; + switch (ttypetag(o)) + { + case LUA_VNIL: + printf("N"); + break; + case LUA_VFALSE: + case LUA_VTRUE: + printf("B"); + break; + case LUA_VNUMFLT: + printf("F"); + break; + case LUA_VNUMINT: + printf("I"); + break; + case LUA_VSHRSTR: + case LUA_VLNGSTR: + printf("S"); + break; + default: /* cannot happen */ + printf("?%d",ttypetag(o)); + break; + } + printf("\t"); +} + +static void PrintConstant(const Proto* f, int i) +{ + const TValue* o=&f->k[i]; + switch (ttypetag(o)) + { + case LUA_VNIL: + printf("nil"); + break; + case LUA_VFALSE: + printf("false"); + break; + case LUA_VTRUE: + printf("true"); + break; + case LUA_VNUMFLT: + { + char buff[100]; + sprintf(buff,LUA_NUMBER_FMT,fltvalue(o)); + printf("%s",buff); + if (buff[strspn(buff,"-0123456789")]=='\0') printf(".0"); + break; + } + case LUA_VNUMINT: + printf(LUA_INTEGER_FMT,ivalue(o)); + break; + case LUA_VSHRSTR: + case LUA_VLNGSTR: + PrintString(tsvalue(o)); + break; + default: /* cannot happen */ + printf("?%d",ttypetag(o)); + break; + } +} + +#define COMMENT "\t; " +#define EXTRAARG GETARG_Ax(code[pc+1]) +#define EXTRAARGC (EXTRAARG*(MAXARG_C+1)) +#define ISK (isk ? "k" : "") + +static void PrintCode(const Proto* f) +{ + const Instruction* code=f->code; + int pc,n=f->sizecode; + for (pc=0; pc<n; pc++) + { + Instruction i=code[pc]; + OpCode o=GET_OPCODE(i); + int a=GETARG_A(i); + int b=GETARG_B(i); + int c=GETARG_C(i); + int ax=GETARG_Ax(i); + int bx=GETARG_Bx(i); + int sb=GETARG_sB(i); + int sc=GETARG_sC(i); + int sbx=GETARG_sBx(i); + int isk=GETARG_k(i); + int line=luaG_getfuncline(f,pc); + printf("\t%d\t",pc+1); + if (line>0) printf("[%d]\t",line); else printf("[-]\t"); + printf("%-9s\t",opnames[o]); + switch (o) + { + case OP_MOVE: + printf("%d %d",a,b); + break; + case OP_LOADI: + printf("%d %d",a,sbx); + break; + case OP_LOADF: + printf("%d %d",a,sbx); + break; + case OP_LOADK: + printf("%d %d",a,bx); + printf(COMMENT); PrintConstant(f,bx); + break; + case OP_LOADKX: + printf("%d",a); + printf(COMMENT); PrintConstant(f,EXTRAARG); + break; + case OP_LOADFALSE: + printf("%d",a); + break; + case OP_LFALSESKIP: + printf("%d",a); + break; + case OP_LOADTRUE: + printf("%d",a); + break; + case OP_LOADNIL: + printf("%d %d",a,b); + printf(COMMENT "%d out",b+1); + break; + case OP_GETUPVAL: + printf("%d %d",a,b); + printf(COMMENT "%s",UPVALNAME(b)); + break; + case OP_SETUPVAL: + printf("%d %d",a,b); + printf(COMMENT "%s",UPVALNAME(b)); + break; + case OP_GETTABUP: + printf("%d %d %d",a,b,c); + printf(COMMENT "%s",UPVALNAME(b)); + printf(" "); PrintConstant(f,c); + break; + case OP_GETTABLE: + printf("%d %d %d",a,b,c); + break; + case OP_GETI: + printf("%d %d %d",a,b,c); + break; + case OP_GETFIELD: + printf("%d %d %d",a,b,c); + printf(COMMENT); PrintConstant(f,c); + break; + case OP_SETTABUP: + printf("%d %d %d%s",a,b,c,ISK); + printf(COMMENT "%s",UPVALNAME(a)); + printf(" "); PrintConstant(f,b); + if (isk) { printf(" "); PrintConstant(f,c); } + break; + case OP_SETTABLE: + printf("%d %d %d%s",a,b,c,ISK); + if (isk) { printf(COMMENT); PrintConstant(f,c); } + break; + case OP_SETI: + printf("%d %d %d%s",a,b,c,ISK); + if (isk) { printf(COMMENT); PrintConstant(f,c); } + break; + case OP_SETFIELD: + printf("%d %d %d%s",a,b,c,ISK); + printf(COMMENT); PrintConstant(f,b); + if (isk) { printf(" "); PrintConstant(f,c); } + break; + case OP_NEWTABLE: + printf("%d %d %d",a,b,c); + printf(COMMENT "%d",c+EXTRAARGC); + break; + case OP_SELF: + printf("%d %d %d%s",a,b,c,ISK); + if (isk) { printf(COMMENT); PrintConstant(f,c); } + break; + case OP_ADDI: + printf("%d %d %d",a,b,sc); + break; + case OP_ADDK: + printf("%d %d %d",a,b,c); + printf(COMMENT); PrintConstant(f,c); + break; + case OP_SUBK: + printf("%d %d %d",a,b,c); + printf(COMMENT); PrintConstant(f,c); + break; + case OP_MULK: + printf("%d %d %d",a,b,c); + printf(COMMENT); PrintConstant(f,c); + break; + case OP_MODK: + printf("%d %d %d",a,b,c); + printf(COMMENT); PrintConstant(f,c); + break; + case OP_POWK: + printf("%d %d %d",a,b,c); + printf(COMMENT); PrintConstant(f,c); + break; + case OP_DIVK: + printf("%d %d %d",a,b,c); + printf(COMMENT); PrintConstant(f,c); + break; + case OP_IDIVK: + printf("%d %d %d",a,b,c); + printf(COMMENT); PrintConstant(f,c); + break; + case OP_BANDK: + printf("%d %d %d",a,b,c); + printf(COMMENT); PrintConstant(f,c); + break; + case OP_BORK: + printf("%d %d %d",a,b,c); + printf(COMMENT); PrintConstant(f,c); + break; + case OP_BXORK: + printf("%d %d %d",a,b,c); + printf(COMMENT); PrintConstant(f,c); + break; + case OP_SHRI: + printf("%d %d %d",a,b,sc); + break; + case OP_SHLI: + printf("%d %d %d",a,b,sc); + break; + case OP_ADD: + printf("%d %d %d",a,b,c); + break; + case OP_SUB: + printf("%d %d %d",a,b,c); + break; + case OP_MUL: + printf("%d %d %d",a,b,c); + break; + case OP_MOD: + printf("%d %d %d",a,b,c); + break; + case OP_POW: + printf("%d %d %d",a,b,c); + break; + case OP_DIV: + printf("%d %d %d",a,b,c); + break; + case OP_IDIV: + printf("%d %d %d",a,b,c); + break; + case OP_BAND: + printf("%d %d %d",a,b,c); + break; + case OP_BOR: + printf("%d %d %d",a,b,c); + break; + case OP_BXOR: + printf("%d %d %d",a,b,c); + break; + case OP_SHL: + printf("%d %d %d",a,b,c); + break; + case OP_SHR: + printf("%d %d %d",a,b,c); + break; + case OP_MMBIN: + printf("%d %d %d",a,b,c); + printf(COMMENT "%s",eventname(c)); + break; + case OP_MMBINI: + printf("%d %d %d %d",a,sb,c,isk); + printf(COMMENT "%s",eventname(c)); + if (isk) printf(" flip"); + break; + case OP_MMBINK: + printf("%d %d %d %d",a,b,c,isk); + printf(COMMENT "%s ",eventname(c)); PrintConstant(f,b); + if (isk) printf(" flip"); + break; + case OP_UNM: + printf("%d %d",a,b); + break; + case OP_BNOT: + printf("%d %d",a,b); + break; + case OP_NOT: + printf("%d %d",a,b); + break; + case OP_LEN: + printf("%d %d",a,b); + break; + case OP_CONCAT: + printf("%d %d",a,b); + break; + case OP_CLOSE: + printf("%d",a); + break; + case OP_TBC: + printf("%d",a); + break; + case OP_JMP: + printf("%d",GETARG_sJ(i)); + printf(COMMENT "to %d",GETARG_sJ(i)+pc+2); + break; + case OP_EQ: + printf("%d %d %d",a,b,isk); + break; + case OP_LT: + printf("%d %d %d",a,b,isk); + break; + case OP_LE: + printf("%d %d %d",a,b,isk); + break; + case OP_EQK: + printf("%d %d %d",a,b,isk); + printf(COMMENT); PrintConstant(f,b); + break; + case OP_EQI: + printf("%d %d %d",a,sb,isk); + break; + case OP_LTI: + printf("%d %d %d",a,sb,isk); + break; + case OP_LEI: + printf("%d %d %d",a,sb,isk); + break; + case OP_GTI: + printf("%d %d %d",a,sb,isk); + break; + case OP_GEI: + printf("%d %d %d",a,sb,isk); + break; + case OP_TEST: + printf("%d %d",a,isk); + break; + case OP_TESTSET: + printf("%d %d %d",a,b,isk); + break; + case OP_CALL: + printf("%d %d %d",a,b,c); + printf(COMMENT); + if (b==0) printf("all in "); else printf("%d in ",b-1); + if (c==0) printf("all out"); else printf("%d out",c-1); + break; + case OP_TAILCALL: + printf("%d %d %d%s",a,b,c,ISK); + printf(COMMENT "%d in",b-1); + break; + case OP_RETURN: + printf("%d %d %d%s",a,b,c,ISK); + printf(COMMENT); + if (b==0) printf("all out"); else printf("%d out",b-1); + break; + case OP_RETURN0: + break; + case OP_RETURN1: + printf("%d",a); + break; + case OP_FORLOOP: + printf("%d %d",a,bx); + printf(COMMENT "to %d",pc-bx+2); + break; + case OP_FORPREP: + printf("%d %d",a,bx); + printf(COMMENT "exit to %d",pc+bx+3); + break; + case OP_TFORPREP: + printf("%d %d",a,bx); + printf(COMMENT "to %d",pc+bx+2); + break; + case OP_TFORCALL: + printf("%d %d",a,c); + break; + case OP_TFORLOOP: + printf("%d %d",a,bx); + printf(COMMENT "to %d",pc-bx+2); + break; + case OP_SETLIST: + printf("%d %d %d",a,b,c); + if (isk) printf(COMMENT "%d",c+EXTRAARGC); + break; + case OP_CLOSURE: + printf("%d %d",a,bx); + printf(COMMENT "%p",VOID(f->p[bx])); + break; + case OP_VARARG: + printf("%d %d",a,c); + printf(COMMENT); + if (c==0) printf("all out"); else printf("%d out",c-1); + break; + case OP_VARARGPREP: + printf("%d",a); + break; + case OP_EXTRAARG: + printf("%d",ax); + break; +#if 0 + default: + printf("%d %d %d",a,b,c); + printf(COMMENT "not handled"); + break; +#endif + } + printf("\n"); + } +} + + +#define SS(x) ((x==1)?"":"s") +#define S(x) (int)(x),SS(x) + +static void PrintHeader(const Proto* f) +{ + const char* s=f->source ? getstr(f->source) : "=?"; + if (*s=='@' || *s=='=') + s++; + else if (*s==LUA_SIGNATURE[0]) + s="(bstring)"; + else + s="(string)"; + printf("\n%s <%s:%d,%d> (%d instruction%s at %p)\n", + (f->linedefined==0)?"main":"function",s, + f->linedefined,f->lastlinedefined, + S(f->sizecode),VOID(f)); + printf("%d%s param%s, %d slot%s, %d upvalue%s, ", + (int)(f->numparams),f->is_vararg?"+":"",SS(f->numparams), + S(f->maxstacksize),S(f->sizeupvalues)); + printf("%d local%s, %d constant%s, %d function%s\n", + S(f->sizelocvars),S(f->sizek),S(f->sizep)); +} + +static void PrintDebug(const Proto* f) +{ + int i,n; + n=f->sizek; + printf("constants (%d) for %p:\n",n,VOID(f)); + for (i=0; i<n; i++) + { + printf("\t%d\t",i); + PrintType(f,i); + PrintConstant(f,i); + printf("\n"); + } + n=f->sizelocvars; + printf("locals (%d) for %p:\n",n,VOID(f)); + for (i=0; i<n; i++) + { + printf("\t%d\t%s\t%d\t%d\n", + i,getstr(f->locvars[i].varname),f->locvars[i].startpc+1,f->locvars[i].endpc+1); + } + n=f->sizeupvalues; + printf("upvalues (%d) for %p:\n",n,VOID(f)); + for (i=0; i<n; i++) + { + printf("\t%d\t%s\t%d\t%d\n", + i,UPVALNAME(i),f->upvalues[i].instack,f->upvalues[i].idx); + } +} + +static void PrintFunction(const Proto* f, int full) +{ + int i,n=f->sizep; + PrintHeader(f); + PrintCode(f); + if (full) PrintDebug(f); + for (i=0; i<n; i++) PrintFunction(f->p[i],full); +} diff --git a/vendor/lua-5.4.8/src/luaconf.h b/vendor/lua-5.4.8/src/luaconf.h new file mode 100644 index 0000000..33bb580 --- /dev/null +++ b/vendor/lua-5.4.8/src/luaconf.h @@ -0,0 +1,802 @@ +/* +** $Id: luaconf.h $ +** Configuration file for Lua +** See Copyright Notice in lua.h +*/ + + +#ifndef luaconf_h +#define luaconf_h + +#include <limits.h> +#include <stddef.h> + + +/* +** =================================================================== +** General Configuration File for Lua +** +** Some definitions here can be changed externally, through the compiler +** (e.g., with '-D' options): They are commented out or protected +** by '#if !defined' guards. However, several other definitions +** should be changed directly here, either because they affect the +** Lua ABI (by making the changes here, you ensure that all software +** connected to Lua, such as C libraries, will be compiled with the same +** configuration); or because they are seldom changed. +** +** Search for "@@" to find all configurable definitions. +** =================================================================== +*/ + + +/* +** {==================================================================== +** System Configuration: macros to adapt (if needed) Lua to some +** particular platform, for instance restricting it to C89. +** ===================================================================== +*/ + +/* +@@ LUA_USE_C89 controls the use of non-ISO-C89 features. +** Define it if you want Lua to avoid the use of a few C99 features +** or Windows-specific features on Windows. +*/ +/* #define LUA_USE_C89 */ + + +/* +** By default, Lua on Windows use (some) specific Windows features +*/ +#if !defined(LUA_USE_C89) && defined(_WIN32) && !defined(_WIN32_WCE) +#define LUA_USE_WINDOWS /* enable goodies for regular Windows */ +#endif + + +#if defined(LUA_USE_WINDOWS) +#define LUA_DL_DLL /* enable support for DLL */ +#define LUA_USE_C89 /* broadly, Windows is C89 */ +#endif + + +#if defined(LUA_USE_LINUX) +#define LUA_USE_POSIX +#define LUA_USE_DLOPEN /* needs an extra library: -ldl */ +#endif + + +#if defined(LUA_USE_MACOSX) +#define LUA_USE_POSIX +#define LUA_USE_DLOPEN /* MacOS does not need -ldl */ +#endif + + +#if defined(LUA_USE_IOS) +#define LUA_USE_POSIX +#define LUA_USE_DLOPEN +#endif + + +/* +@@ LUAI_IS32INT is true iff 'int' has (at least) 32 bits. +*/ +#define LUAI_IS32INT ((UINT_MAX >> 30) >= 3) + +/* }================================================================== */ + + + +/* +** {================================================================== +** Configuration for Number types. These options should not be +** set externally, because any other code connected to Lua must +** use the same configuration. +** =================================================================== +*/ + +/* +@@ LUA_INT_TYPE defines the type for Lua integers. +@@ LUA_FLOAT_TYPE defines the type for Lua floats. +** Lua should work fine with any mix of these options supported +** by your C compiler. The usual configurations are 64-bit integers +** and 'double' (the default), 32-bit integers and 'float' (for +** restricted platforms), and 'long'/'double' (for C compilers not +** compliant with C99, which may not have support for 'long long'). +*/ + +/* predefined options for LUA_INT_TYPE */ +#define LUA_INT_INT 1 +#define LUA_INT_LONG 2 +#define LUA_INT_LONGLONG 3 + +/* predefined options for LUA_FLOAT_TYPE */ +#define LUA_FLOAT_FLOAT 1 +#define LUA_FLOAT_DOUBLE 2 +#define LUA_FLOAT_LONGDOUBLE 3 + + +/* Default configuration ('long long' and 'double', for 64-bit Lua) */ +#define LUA_INT_DEFAULT LUA_INT_LONGLONG +#define LUA_FLOAT_DEFAULT LUA_FLOAT_DOUBLE + + +/* +@@ LUA_32BITS enables Lua with 32-bit integers and 32-bit floats. +*/ +#define LUA_32BITS 0 + + +/* +@@ LUA_C89_NUMBERS ensures that Lua uses the largest types available for +** C89 ('long' and 'double'); Windows always has '__int64', so it does +** not need to use this case. +*/ +#if defined(LUA_USE_C89) && !defined(LUA_USE_WINDOWS) +#define LUA_C89_NUMBERS 1 +#else +#define LUA_C89_NUMBERS 0 +#endif + + +#if LUA_32BITS /* { */ +/* +** 32-bit integers and 'float' +*/ +#if LUAI_IS32INT /* use 'int' if big enough */ +#define LUA_INT_TYPE LUA_INT_INT +#else /* otherwise use 'long' */ +#define LUA_INT_TYPE LUA_INT_LONG +#endif +#define LUA_FLOAT_TYPE LUA_FLOAT_FLOAT + +#elif LUA_C89_NUMBERS /* }{ */ +/* +** largest types available for C89 ('long' and 'double') +*/ +#define LUA_INT_TYPE LUA_INT_LONG +#define LUA_FLOAT_TYPE LUA_FLOAT_DOUBLE + +#else /* }{ */ +/* use defaults */ + +#define LUA_INT_TYPE LUA_INT_DEFAULT +#define LUA_FLOAT_TYPE LUA_FLOAT_DEFAULT + +#endif /* } */ + + +/* }================================================================== */ + + + +/* +** {================================================================== +** Configuration for Paths. +** =================================================================== +*/ + +/* +** LUA_PATH_SEP is the character that separates templates in a path. +** LUA_PATH_MARK is the string that marks the substitution points in a +** template. +** LUA_EXEC_DIR in a Windows path is replaced by the executable's +** directory. +*/ +#define LUA_PATH_SEP ";" +#define LUA_PATH_MARK "?" +#define LUA_EXEC_DIR "!" + + +/* +@@ LUA_PATH_DEFAULT is the default path that Lua uses to look for +** Lua libraries. +@@ LUA_CPATH_DEFAULT is the default path that Lua uses to look for +** C libraries. +** CHANGE them if your machine has a non-conventional directory +** hierarchy or if you want to install your libraries in +** non-conventional directories. +*/ + +#define LUA_VDIR LUA_VERSION_MAJOR "." LUA_VERSION_MINOR +#if defined(_WIN32) /* { */ +/* +** In Windows, any exclamation mark ('!') in the path is replaced by the +** path of the directory of the executable file of the current process. +*/ +#define LUA_LDIR "!\\lua\\" +#define LUA_CDIR "!\\" +#define LUA_SHRDIR "!\\..\\share\\lua\\" LUA_VDIR "\\" + +#if !defined(LUA_PATH_DEFAULT) +#define LUA_PATH_DEFAULT \ + LUA_LDIR"?.lua;" LUA_LDIR"?\\init.lua;" \ + LUA_CDIR"?.lua;" LUA_CDIR"?\\init.lua;" \ + LUA_SHRDIR"?.lua;" LUA_SHRDIR"?\\init.lua;" \ + ".\\?.lua;" ".\\?\\init.lua" +#endif + +#if !defined(LUA_CPATH_DEFAULT) +#define LUA_CPATH_DEFAULT \ + LUA_CDIR"?.dll;" \ + LUA_CDIR"..\\lib\\lua\\" LUA_VDIR "\\?.dll;" \ + LUA_CDIR"loadall.dll;" ".\\?.dll" +#endif + +#else /* }{ */ + +#define LUA_ROOT "/usr/local/" +#define LUA_LDIR LUA_ROOT "share/lua/" LUA_VDIR "/" +#define LUA_CDIR LUA_ROOT "lib/lua/" LUA_VDIR "/" + +#if !defined(LUA_PATH_DEFAULT) +#define LUA_PATH_DEFAULT \ + LUA_LDIR"?.lua;" LUA_LDIR"?/init.lua;" \ + LUA_CDIR"?.lua;" LUA_CDIR"?/init.lua;" \ + "./?.lua;" "./?/init.lua" +#endif + +#if !defined(LUA_CPATH_DEFAULT) +#define LUA_CPATH_DEFAULT \ + LUA_CDIR"?.so;" LUA_CDIR"loadall.so;" "./?.so" +#endif + +#endif /* } */ + + +/* +@@ LUA_DIRSEP is the directory separator (for submodules). +** CHANGE it if your machine does not use "/" as the directory separator +** and is not Windows. (On Windows Lua automatically uses "\".) +*/ +#if !defined(LUA_DIRSEP) + +#if defined(_WIN32) +#define LUA_DIRSEP "\\" +#else +#define LUA_DIRSEP "/" +#endif + +#endif + + +/* +** LUA_IGMARK is a mark to ignore all after it when building the +** module name (e.g., used to build the luaopen_ function name). +** Typically, the suffix after the mark is the module version, +** as in "mod-v1.2.so". +*/ +#define LUA_IGMARK "-" + +/* }================================================================== */ + + +/* +** {================================================================== +** Marks for exported symbols in the C code +** =================================================================== +*/ + +/* +@@ LUA_API is a mark for all core API functions. +@@ LUALIB_API is a mark for all auxiliary library functions. +@@ LUAMOD_API is a mark for all standard library opening functions. +** CHANGE them if you need to define those functions in some special way. +** For instance, if you want to create one Windows DLL with the core and +** the libraries, you may want to use the following definition (define +** LUA_BUILD_AS_DLL to get it). +*/ +#if defined(LUA_BUILD_AS_DLL) /* { */ + +#if defined(LUA_CORE) || defined(LUA_LIB) /* { */ +#define LUA_API __declspec(dllexport) +#else /* }{ */ +#define LUA_API __declspec(dllimport) +#endif /* } */ + +#else /* }{ */ + +#define LUA_API extern + +#endif /* } */ + + +/* +** More often than not the libs go together with the core. +*/ +#define LUALIB_API LUA_API +#define LUAMOD_API LUA_API + + +/* +@@ LUAI_FUNC is a mark for all extern functions that are not to be +** exported to outside modules. +@@ LUAI_DDEF and LUAI_DDEC are marks for all extern (const) variables, +** none of which to be exported to outside modules (LUAI_DDEF for +** definitions and LUAI_DDEC for declarations). +** CHANGE them if you need to mark them in some special way. Elf/gcc +** (versions 3.2 and later) mark them as "hidden" to optimize access +** when Lua is compiled as a shared library. Not all elf targets support +** this attribute. Unfortunately, gcc does not offer a way to check +** whether the target offers that support, and those without support +** give a warning about it. To avoid these warnings, change to the +** default definition. +*/ +#if defined(__GNUC__) && ((__GNUC__*100 + __GNUC_MINOR__) >= 302) && \ + defined(__ELF__) /* { */ +#define LUAI_FUNC __attribute__((visibility("internal"))) extern +#else /* }{ */ +#define LUAI_FUNC extern +#endif /* } */ + +#define LUAI_DDEC(dec) LUAI_FUNC dec +#define LUAI_DDEF /* empty */ + +/* }================================================================== */ + + +/* +** {================================================================== +** Compatibility with previous versions +** =================================================================== +*/ + +/* +@@ LUA_COMPAT_5_3 controls other macros for compatibility with Lua 5.3. +** You can define it to get all options, or change specific options +** to fit your specific needs. +*/ +#if defined(LUA_COMPAT_5_3) /* { */ + +/* +@@ LUA_COMPAT_MATHLIB controls the presence of several deprecated +** functions in the mathematical library. +** (These functions were already officially removed in 5.3; +** nevertheless they are still available here.) +*/ +#define LUA_COMPAT_MATHLIB + +/* +@@ LUA_COMPAT_APIINTCASTS controls the presence of macros for +** manipulating other integer types (lua_pushunsigned, lua_tounsigned, +** luaL_checkint, luaL_checklong, etc.) +** (These macros were also officially removed in 5.3, but they are still +** available here.) +*/ +#define LUA_COMPAT_APIINTCASTS + + +/* +@@ LUA_COMPAT_LT_LE controls the emulation of the '__le' metamethod +** using '__lt'. +*/ +#define LUA_COMPAT_LT_LE + + +/* +@@ The following macros supply trivial compatibility for some +** changes in the API. The macros themselves document how to +** change your code to avoid using them. +** (Once more, these macros were officially removed in 5.3, but they are +** still available here.) +*/ +#define lua_strlen(L,i) lua_rawlen(L, (i)) + +#define lua_objlen(L,i) lua_rawlen(L, (i)) + +#define lua_equal(L,idx1,idx2) lua_compare(L,(idx1),(idx2),LUA_OPEQ) +#define lua_lessthan(L,idx1,idx2) lua_compare(L,(idx1),(idx2),LUA_OPLT) + +#endif /* } */ + +/* }================================================================== */ + + + +/* +** {================================================================== +** Configuration for Numbers (low-level part). +** Change these definitions if no predefined LUA_FLOAT_* / LUA_INT_* +** satisfy your needs. +** =================================================================== +*/ + +/* +@@ LUAI_UACNUMBER is the result of a 'default argument promotion' +@@ over a floating number. +@@ l_floatatt(x) corrects float attribute 'x' to the proper float type +** by prefixing it with one of FLT/DBL/LDBL. +@@ LUA_NUMBER_FRMLEN is the length modifier for writing floats. +@@ LUA_NUMBER_FMT is the format for writing floats. +@@ lua_number2str converts a float to a string. +@@ l_mathop allows the addition of an 'l' or 'f' to all math operations. +@@ l_floor takes the floor of a float. +@@ lua_str2number converts a decimal numeral to a number. +*/ + + +/* The following definitions are good for most cases here */ + +#define l_floor(x) (l_mathop(floor)(x)) + +#define lua_number2str(s,sz,n) \ + l_sprintf((s), sz, LUA_NUMBER_FMT, (LUAI_UACNUMBER)(n)) + +/* +@@ lua_numbertointeger converts a float number with an integral value +** to an integer, or returns 0 if float is not within the range of +** a lua_Integer. (The range comparisons are tricky because of +** rounding. The tests here assume a two-complement representation, +** where MININTEGER always has an exact representation as a float; +** MAXINTEGER may not have one, and therefore its conversion to float +** may have an ill-defined value.) +*/ +#define lua_numbertointeger(n,p) \ + ((n) >= (LUA_NUMBER)(LUA_MININTEGER) && \ + (n) < -(LUA_NUMBER)(LUA_MININTEGER) && \ + (*(p) = (LUA_INTEGER)(n), 1)) + + +/* now the variable definitions */ + +#if LUA_FLOAT_TYPE == LUA_FLOAT_FLOAT /* { single float */ + +#define LUA_NUMBER float + +#define l_floatatt(n) (FLT_##n) + +#define LUAI_UACNUMBER double + +#define LUA_NUMBER_FRMLEN "" +#define LUA_NUMBER_FMT "%.7g" + +#define l_mathop(op) op##f + +#define lua_str2number(s,p) strtof((s), (p)) + + +#elif LUA_FLOAT_TYPE == LUA_FLOAT_LONGDOUBLE /* }{ long double */ + +#define LUA_NUMBER long double + +#define l_floatatt(n) (LDBL_##n) + +#define LUAI_UACNUMBER long double + +#define LUA_NUMBER_FRMLEN "L" +#define LUA_NUMBER_FMT "%.19Lg" + +#define l_mathop(op) op##l + +#define lua_str2number(s,p) strtold((s), (p)) + +#elif LUA_FLOAT_TYPE == LUA_FLOAT_DOUBLE /* }{ double */ + +#define LUA_NUMBER double + +#define l_floatatt(n) (DBL_##n) + +#define LUAI_UACNUMBER double + +#define LUA_NUMBER_FRMLEN "" +#define LUA_NUMBER_FMT "%.14g" + +#define l_mathop(op) op + +#define lua_str2number(s,p) strtod((s), (p)) + +#else /* }{ */ + +#error "numeric float type not defined" + +#endif /* } */ + + + +/* +@@ LUA_UNSIGNED is the unsigned version of LUA_INTEGER. +@@ LUAI_UACINT is the result of a 'default argument promotion' +@@ over a LUA_INTEGER. +@@ LUA_INTEGER_FRMLEN is the length modifier for reading/writing integers. +@@ LUA_INTEGER_FMT is the format for writing integers. +@@ LUA_MAXINTEGER is the maximum value for a LUA_INTEGER. +@@ LUA_MININTEGER is the minimum value for a LUA_INTEGER. +@@ LUA_MAXUNSIGNED is the maximum value for a LUA_UNSIGNED. +@@ lua_integer2str converts an integer to a string. +*/ + + +/* The following definitions are good for most cases here */ + +#define LUA_INTEGER_FMT "%" LUA_INTEGER_FRMLEN "d" + +#define LUAI_UACINT LUA_INTEGER + +#define lua_integer2str(s,sz,n) \ + l_sprintf((s), sz, LUA_INTEGER_FMT, (LUAI_UACINT)(n)) + +/* +** use LUAI_UACINT here to avoid problems with promotions (which +** can turn a comparison between unsigneds into a signed comparison) +*/ +#define LUA_UNSIGNED unsigned LUAI_UACINT + + +/* now the variable definitions */ + +#if LUA_INT_TYPE == LUA_INT_INT /* { int */ + +#define LUA_INTEGER int +#define LUA_INTEGER_FRMLEN "" + +#define LUA_MAXINTEGER INT_MAX +#define LUA_MININTEGER INT_MIN + +#define LUA_MAXUNSIGNED UINT_MAX + +#elif LUA_INT_TYPE == LUA_INT_LONG /* }{ long */ + +#define LUA_INTEGER long +#define LUA_INTEGER_FRMLEN "l" + +#define LUA_MAXINTEGER LONG_MAX +#define LUA_MININTEGER LONG_MIN + +#define LUA_MAXUNSIGNED ULONG_MAX + +#elif LUA_INT_TYPE == LUA_INT_LONGLONG /* }{ long long */ + +/* use presence of macro LLONG_MAX as proxy for C99 compliance */ +#if defined(LLONG_MAX) /* { */ +/* use ISO C99 stuff */ + +#define LUA_INTEGER long long +#define LUA_INTEGER_FRMLEN "ll" + +#define LUA_MAXINTEGER LLONG_MAX +#define LUA_MININTEGER LLONG_MIN + +#define LUA_MAXUNSIGNED ULLONG_MAX + +#elif defined(LUA_USE_WINDOWS) /* }{ */ +/* in Windows, can use specific Windows types */ + +#define LUA_INTEGER __int64 +#define LUA_INTEGER_FRMLEN "I64" + +#define LUA_MAXINTEGER _I64_MAX +#define LUA_MININTEGER _I64_MIN + +#define LUA_MAXUNSIGNED _UI64_MAX + +#else /* }{ */ + +#error "Compiler does not support 'long long'. Use option '-DLUA_32BITS' \ + or '-DLUA_C89_NUMBERS' (see file 'luaconf.h' for details)" + +#endif /* } */ + +#else /* }{ */ + +#error "numeric integer type not defined" + +#endif /* } */ + +/* }================================================================== */ + + +/* +** {================================================================== +** Dependencies with C99 and other C details +** =================================================================== +*/ + +/* +@@ l_sprintf is equivalent to 'snprintf' or 'sprintf' in C89. +** (All uses in Lua have only one format item.) +*/ +#if !defined(LUA_USE_C89) +#define l_sprintf(s,sz,f,i) snprintf(s,sz,f,i) +#else +#define l_sprintf(s,sz,f,i) ((void)(sz), sprintf(s,f,i)) +#endif + + +/* +@@ lua_strx2number converts a hexadecimal numeral to a number. +** In C99, 'strtod' does that conversion. Otherwise, you can +** leave 'lua_strx2number' undefined and Lua will provide its own +** implementation. +*/ +#if !defined(LUA_USE_C89) +#define lua_strx2number(s,p) lua_str2number(s,p) +#endif + + +/* +@@ lua_pointer2str converts a pointer to a readable string in a +** non-specified way. +*/ +#define lua_pointer2str(buff,sz,p) l_sprintf(buff,sz,"%p",p) + + +/* +@@ lua_number2strx converts a float to a hexadecimal numeral. +** In C99, 'sprintf' (with format specifiers '%a'/'%A') does that. +** Otherwise, you can leave 'lua_number2strx' undefined and Lua will +** provide its own implementation. +*/ +#if !defined(LUA_USE_C89) +#define lua_number2strx(L,b,sz,f,n) \ + ((void)L, l_sprintf(b,sz,f,(LUAI_UACNUMBER)(n))) +#endif + + +/* +** 'strtof' and 'opf' variants for math functions are not valid in +** C89. Otherwise, the macro 'HUGE_VALF' is a good proxy for testing the +** availability of these variants. ('math.h' is already included in +** all files that use these macros.) +*/ +#if defined(LUA_USE_C89) || (defined(HUGE_VAL) && !defined(HUGE_VALF)) +#undef l_mathop /* variants not available */ +#undef lua_str2number +#define l_mathop(op) (lua_Number)op /* no variant */ +#define lua_str2number(s,p) ((lua_Number)strtod((s), (p))) +#endif + + +/* +@@ LUA_KCONTEXT is the type of the context ('ctx') for continuation +** functions. It must be a numerical type; Lua will use 'intptr_t' if +** available, otherwise it will use 'ptrdiff_t' (the nearest thing to +** 'intptr_t' in C89) +*/ +#define LUA_KCONTEXT ptrdiff_t + +#if !defined(LUA_USE_C89) && defined(__STDC_VERSION__) && \ + __STDC_VERSION__ >= 199901L +#include <stdint.h> +#if defined(INTPTR_MAX) /* even in C99 this type is optional */ +#undef LUA_KCONTEXT +#define LUA_KCONTEXT intptr_t +#endif +#endif + + +/* +@@ lua_getlocaledecpoint gets the locale "radix character" (decimal point). +** Change that if you do not want to use C locales. (Code using this +** macro must include the header 'locale.h'.) +*/ +#if !defined(lua_getlocaledecpoint) +#define lua_getlocaledecpoint() (localeconv()->decimal_point[0]) +#endif + + +/* +** macros to improve jump prediction, used mostly for error handling +** and debug facilities. (Some macros in the Lua API use these macros. +** Define LUA_NOBUILTIN if you do not want '__builtin_expect' in your +** code.) +*/ +#if !defined(luai_likely) + +#if defined(__GNUC__) && !defined(LUA_NOBUILTIN) +#define luai_likely(x) (__builtin_expect(((x) != 0), 1)) +#define luai_unlikely(x) (__builtin_expect(((x) != 0), 0)) +#else +#define luai_likely(x) (x) +#define luai_unlikely(x) (x) +#endif + +#endif + + +#if defined(LUA_CORE) || defined(LUA_LIB) +/* shorter names for Lua's own use */ +#define l_likely(x) luai_likely(x) +#define l_unlikely(x) luai_unlikely(x) +#endif + + + +/* }================================================================== */ + + +/* +** {================================================================== +** Language Variations +** ===================================================================== +*/ + +/* +@@ LUA_NOCVTN2S/LUA_NOCVTS2N control how Lua performs some +** coercions. Define LUA_NOCVTN2S to turn off automatic coercion from +** numbers to strings. Define LUA_NOCVTS2N to turn off automatic +** coercion from strings to numbers. +*/ +/* #define LUA_NOCVTN2S */ +/* #define LUA_NOCVTS2N */ + + +/* +@@ LUA_USE_APICHECK turns on several consistency checks on the C API. +** Define it as a help when debugging C code. +*/ +#if defined(LUA_USE_APICHECK) +#include <assert.h> +#define luai_apicheck(l,e) assert(e) +#endif + +/* }================================================================== */ + + +/* +** {================================================================== +** Macros that affect the API and must be stable (that is, must be the +** same when you compile Lua and when you compile code that links to +** Lua). +** ===================================================================== +*/ + +/* +@@ LUAI_MAXSTACK limits the size of the Lua stack. +** CHANGE it if you need a different limit. This limit is arbitrary; +** its only purpose is to stop Lua from consuming unlimited stack +** space (and to reserve some numbers for pseudo-indices). +** (It must fit into max(size_t)/32 and max(int)/2.) +*/ +#if LUAI_IS32INT +#define LUAI_MAXSTACK 1000000 +#else +#define LUAI_MAXSTACK 15000 +#endif + + +/* +@@ LUA_EXTRASPACE defines the size of a raw memory area associated with +** a Lua state with very fast access. +** CHANGE it if you need a different size. +*/ +#define LUA_EXTRASPACE (sizeof(void *)) + + +/* +@@ LUA_IDSIZE gives the maximum size for the description of the source +** of a function in debug information. +** CHANGE it if you want a different size. +*/ +#define LUA_IDSIZE 60 + + +/* +@@ LUAL_BUFFERSIZE is the initial buffer size used by the lauxlib +** buffer system. +*/ +#define LUAL_BUFFERSIZE ((int)(16 * sizeof(void*) * sizeof(lua_Number))) + + +/* +@@ LUAI_MAXALIGN defines fields that, when used in a union, ensure +** maximum alignment for the other items in that union. +*/ +#define LUAI_MAXALIGN lua_Number n; double u; void *s; lua_Integer i; long l + +/* }================================================================== */ + + + + + +/* =================================================================== */ + +/* +** Local configuration. You can use this space to add your redefinitions +** without modifying the main part of the file. +*/ + + + + + +#endif + diff --git a/vendor/lua-5.4.8/src/lualib.h b/vendor/lua-5.4.8/src/lualib.h new file mode 100644 index 0000000..2625529 --- /dev/null +++ b/vendor/lua-5.4.8/src/lualib.h @@ -0,0 +1,52 @@ +/* +** $Id: lualib.h $ +** Lua standard libraries +** See Copyright Notice in lua.h +*/ + + +#ifndef lualib_h +#define lualib_h + +#include "lua.h" + + +/* version suffix for environment variable names */ +#define LUA_VERSUFFIX "_" LUA_VERSION_MAJOR "_" LUA_VERSION_MINOR + + +LUAMOD_API int (luaopen_base) (lua_State *L); + +#define LUA_COLIBNAME "coroutine" +LUAMOD_API int (luaopen_coroutine) (lua_State *L); + +#define LUA_TABLIBNAME "table" +LUAMOD_API int (luaopen_table) (lua_State *L); + +#define LUA_IOLIBNAME "io" +LUAMOD_API int (luaopen_io) (lua_State *L); + +#define LUA_OSLIBNAME "os" +LUAMOD_API int (luaopen_os) (lua_State *L); + +#define LUA_STRLIBNAME "string" +LUAMOD_API int (luaopen_string) (lua_State *L); + +#define LUA_UTF8LIBNAME "utf8" +LUAMOD_API int (luaopen_utf8) (lua_State *L); + +#define LUA_MATHLIBNAME "math" +LUAMOD_API int (luaopen_math) (lua_State *L); + +#define LUA_DBLIBNAME "debug" +LUAMOD_API int (luaopen_debug) (lua_State *L); + +#define LUA_LOADLIBNAME "package" +LUAMOD_API int (luaopen_package) (lua_State *L); + + +/* open all previous libraries */ +LUALIB_API void (luaL_openlibs) (lua_State *L); + + +#endif diff --git a/vendor/lua-5.4.8/src/lundump.c b/vendor/lua-5.4.8/src/lundump.c new file mode 100644 index 0000000..e8d92a8 --- /dev/null +++ b/vendor/lua-5.4.8/src/lundump.c @@ -0,0 +1,335 @@ +/* +** $Id: lundump.c $ +** load precompiled Lua chunks +** See Copyright Notice in lua.h +*/ + +#define lundump_c +#define LUA_CORE + +#include "lprefix.h" + + +#include <limits.h> +#include <string.h> + +#include "lua.h" + +#include "ldebug.h" +#include "ldo.h" +#include "lfunc.h" +#include "lmem.h" +#include "lobject.h" +#include "lstring.h" +#include "lundump.h" +#include "lzio.h" + + +#if !defined(luai_verifycode) +#define luai_verifycode(L,f) /* empty */ +#endif + + +typedef struct { + lua_State *L; + ZIO *Z; + const char *name; +} LoadState; + + +static l_noret error (LoadState *S, const char *why) { + luaO_pushfstring(S->L, "%s: bad binary format (%s)", S->name, why); + luaD_throw(S->L, LUA_ERRSYNTAX); +} + + +/* +** All high-level loads go through loadVector; you can change it to +** adapt to the endianness of the input +*/ +#define loadVector(S,b,n) loadBlock(S,b,(n)*sizeof((b)[0])) + +static void loadBlock (LoadState *S, void *b, size_t size) { + if (luaZ_read(S->Z, b, size) != 0) + error(S, "truncated chunk"); +} + + +#define loadVar(S,x) loadVector(S,&x,1) + + +static lu_byte loadByte (LoadState *S) { + int b = zgetc(S->Z); + if (b == EOZ) + error(S, "truncated chunk"); + return cast_byte(b); +} + + +static size_t loadUnsigned (LoadState *S, size_t limit) { + size_t x = 0; + int b; + limit >>= 7; + do { + b = loadByte(S); + if (x >= limit) + error(S, "integer overflow"); + x = (x << 7) | (b & 0x7f); + } while ((b & 0x80) == 0); + return x; +} + + +static size_t loadSize (LoadState *S) { + return loadUnsigned(S, MAX_SIZET); +} + + +static int loadInt (LoadState *S) { + return cast_int(loadUnsigned(S, INT_MAX)); +} + + +static lua_Number loadNumber (LoadState *S) { + lua_Number x; + loadVar(S, x); + return x; +} + + +static lua_Integer loadInteger (LoadState *S) { + lua_Integer x; + loadVar(S, x); + return x; +} + + +/* +** Load a nullable string into prototype 'p'. +*/ +static TString *loadStringN (LoadState *S, Proto *p) { + lua_State *L = S->L; + TString *ts; + size_t size = loadSize(S); + if (size == 0) /* no string? */ + return NULL; + else if (--size <= LUAI_MAXSHORTLEN) { /* short string? */ + char buff[LUAI_MAXSHORTLEN]; + loadVector(S, buff, size); /* load string into buffer */ + ts = luaS_newlstr(L, buff, size); /* create string */ + } + else { /* long string */ + ts = luaS_createlngstrobj(L, size); /* create string */ + setsvalue2s(L, L->top.p, ts); /* anchor it ('loadVector' can GC) */ + luaD_inctop(L); + loadVector(S, getlngstr(ts), size); /* load directly in final place */ + L->top.p--; /* pop string */ + } + luaC_objbarrier(L, p, ts); + return ts; +} + + +/* +** Load a non-nullable string into prototype 'p'. +*/ +static TString *loadString (LoadState *S, Proto *p) { + TString *st = loadStringN(S, p); + if (st == NULL) + error(S, "bad format for constant string"); + return st; +} + + +static void loadCode (LoadState *S, Proto *f) { + int n = loadInt(S); + f->code = luaM_newvectorchecked(S->L, n, Instruction); + f->sizecode = n; + loadVector(S, f->code, n); +} + + +static void loadFunction(LoadState *S, Proto *f, TString *psource); + + +static void loadConstants (LoadState *S, Proto *f) { + int i; + int n = loadInt(S); + f->k = luaM_newvectorchecked(S->L, n, TValue); + f->sizek = n; + for (i = 0; i < n; i++) + setnilvalue(&f->k[i]); + for (i = 0; i < n; i++) { + TValue *o = &f->k[i]; + int t = loadByte(S); + switch (t) { + case LUA_VNIL: + setnilvalue(o); + break; + case LUA_VFALSE: + setbfvalue(o); + break; + case LUA_VTRUE: + setbtvalue(o); + break; + case LUA_VNUMFLT: + setfltvalue(o, loadNumber(S)); + break; + case LUA_VNUMINT: + setivalue(o, loadInteger(S)); + break; + case LUA_VSHRSTR: + case LUA_VLNGSTR: + setsvalue2n(S->L, o, loadString(S, f)); + break; + default: lua_assert(0); + } + } +} + + +static void loadProtos (LoadState *S, Proto *f) { + int i; + int n = loadInt(S); + f->p = luaM_newvectorchecked(S->L, n, Proto *); + f->sizep = n; + for (i = 0; i < n; i++) + f->p[i] = NULL; + for (i = 0; i < n; i++) { + f->p[i] = luaF_newproto(S->L); + luaC_objbarrier(S->L, f, f->p[i]); + loadFunction(S, f->p[i], f->source); + } +} + + +/* +** Load the upvalues for a function. The names must be filled first, +** because the filling of the other fields can raise read errors and +** the creation of the error message can call an emergency collection; +** in that case all prototypes must be consistent for the GC. +*/ +static void loadUpvalues (LoadState *S, Proto *f) { + int i, n; + n = loadInt(S); + f->upvalues = luaM_newvectorchecked(S->L, n, Upvaldesc); + f->sizeupvalues = n; + for (i = 0; i < n; i++) /* make array valid for GC */ + f->upvalues[i].name = NULL; + for (i = 0; i < n; i++) { /* following calls can raise errors */ + f->upvalues[i].instack = loadByte(S); + f->upvalues[i].idx = loadByte(S); + f->upvalues[i].kind = loadByte(S); + } +} + + +static void loadDebug (LoadState *S, Proto *f) { + int i, n; + n = loadInt(S); + f->lineinfo = luaM_newvectorchecked(S->L, n, ls_byte); + f->sizelineinfo = n; + loadVector(S, f->lineinfo, n); + n = loadInt(S); + f->abslineinfo = luaM_newvectorchecked(S->L, n, AbsLineInfo); + f->sizeabslineinfo = n; + for (i = 0; i < n; i++) { + f->abslineinfo[i].pc = loadInt(S); + f->abslineinfo[i].line = loadInt(S); + } + n = loadInt(S); + f->locvars = luaM_newvectorchecked(S->L, n, LocVar); + f->sizelocvars = n; + for (i = 0; i < n; i++) + f->locvars[i].varname = NULL; + for (i = 0; i < n; i++) { + f->locvars[i].varname = loadStringN(S, f); + f->locvars[i].startpc = loadInt(S); + f->locvars[i].endpc = loadInt(S); + } + n = loadInt(S); + if (n != 0) /* does it have debug information? */ + n = f->sizeupvalues; /* must be this many */ + for (i = 0; i < n; i++) + f->upvalues[i].name = loadStringN(S, f); +} + + +static void loadFunction (LoadState *S, Proto *f, TString *psource) { + f->source = loadStringN(S, f); + if (f->source == NULL) /* no source in dump? */ + f->source = psource; /* reuse parent's source */ + f->linedefined = loadInt(S); + f->lastlinedefined = loadInt(S); + f->numparams = loadByte(S); + f->is_vararg = loadByte(S); + f->maxstacksize = loadByte(S); + loadCode(S, f); + loadConstants(S, f); + loadUpvalues(S, f); + loadProtos(S, f); + loadDebug(S, f); +} + + +static void checkliteral (LoadState *S, const char *s, const char *msg) { + char buff[sizeof(LUA_SIGNATURE) + sizeof(LUAC_DATA)]; /* larger than both */ + size_t len = strlen(s); + loadVector(S, buff, len); + if (memcmp(s, buff, len) != 0) + error(S, msg); +} + + +static void fchecksize (LoadState *S, size_t size, const char *tname) { + if (loadByte(S) != size) + error(S, luaO_pushfstring(S->L, "%s size mismatch", tname)); +} + + +#define checksize(S,t) fchecksize(S,sizeof(t),#t) + +static void checkHeader (LoadState *S) { + /* skip 1st char (already read and checked) */ + checkliteral(S, &LUA_SIGNATURE[1], "not a binary chunk"); + if (loadByte(S) != LUAC_VERSION) + error(S, "version mismatch"); + if (loadByte(S) != LUAC_FORMAT) + error(S, "format mismatch"); + checkliteral(S, LUAC_DATA, "corrupted chunk"); + checksize(S, Instruction); + checksize(S, lua_Integer); + checksize(S, lua_Number); + if (loadInteger(S) != LUAC_INT) + error(S, "integer format mismatch"); + if (loadNumber(S) != LUAC_NUM) + error(S, "float format mismatch"); +} + + +/* +** Load precompiled chunk. +*/ +LClosure *luaU_undump(lua_State *L, ZIO *Z, const char *name) { + LoadState S; + LClosure *cl; + if (*name == '@' || *name == '=') + S.name = name + 1; + else if (*name == LUA_SIGNATURE[0]) + S.name = "binary string"; + else + S.name = name; + S.L = L; + S.Z = Z; + checkHeader(&S); + cl = luaF_newLclosure(L, loadByte(&S)); + setclLvalue2s(L, L->top.p, cl); + luaD_inctop(L); + cl->p = luaF_newproto(L); + luaC_objbarrier(L, cl, cl->p); + loadFunction(&S, cl->p, NULL); + lua_assert(cl->nupvalues == cl->p->sizeupvalues); + luai_verifycode(L, cl->p); + return cl; +} + diff --git a/vendor/lua-5.4.8/src/lundump.h b/vendor/lua-5.4.8/src/lundump.h new file mode 100644 index 0000000..a97676c --- /dev/null +++ b/vendor/lua-5.4.8/src/lundump.h @@ -0,0 +1,35 @@ +/* +** $Id: lundump.h $ +** load precompiled Lua chunks +** See Copyright Notice in lua.h +*/ + +#ifndef lundump_h +#define lundump_h + +#include "llimits.h" +#include "lobject.h" +#include "lzio.h" + + +/* data to catch conversion errors */ +#define LUAC_DATA "\x19\x93\r\n\x1a\n" + +#define LUAC_INT 0x5678 +#define LUAC_NUM cast_num(370.5) + +/* +** Encode major-minor version in one byte, one nibble for each +*/ +#define LUAC_VERSION (((LUA_VERSION_NUM / 100) * 16) + LUA_VERSION_NUM % 100) + +#define LUAC_FORMAT 0 /* this is the official format */ + +/* load one chunk; from lundump.c */ +LUAI_FUNC LClosure* luaU_undump (lua_State* L, ZIO* Z, const char* name); + +/* dump one chunk; from ldump.c */ +LUAI_FUNC int luaU_dump (lua_State* L, const Proto* f, lua_Writer w, + void* data, int strip); + +#endif diff --git a/vendor/lua-5.4.8/src/lutf8lib.c b/vendor/lua-5.4.8/src/lutf8lib.c new file mode 100644 index 0000000..3a5b9bc --- /dev/null +++ b/vendor/lua-5.4.8/src/lutf8lib.c @@ -0,0 +1,291 @@ +/* +** $Id: lutf8lib.c $ +** Standard library for UTF-8 manipulation +** See Copyright Notice in lua.h +*/ + +#define lutf8lib_c +#define LUA_LIB + +#include "lprefix.h" + + +#include <assert.h> +#include <limits.h> +#include <stdlib.h> +#include <string.h> + +#include "lua.h" + +#include "lauxlib.h" +#include "lualib.h" + + +#define MAXUNICODE 0x10FFFFu + +#define MAXUTF 0x7FFFFFFFu + + +#define MSGInvalid "invalid UTF-8 code" + +/* +** Integer type for decoded UTF-8 values; MAXUTF needs 31 bits. +*/ +#if (UINT_MAX >> 30) >= 1 +typedef unsigned int utfint; +#else +typedef unsigned long utfint; +#endif + + +#define iscont(c) (((c) & 0xC0) == 0x80) +#define iscontp(p) iscont(*(p)) + + +/* from strlib */ +/* translate a relative string position: negative means back from end */ +static lua_Integer u_posrelat (lua_Integer pos, size_t len) { + if (pos >= 0) return pos; + else if (0u - (size_t)pos > len) return 0; + else return (lua_Integer)len + pos + 1; +} + + +/* +** Decode one UTF-8 sequence, returning NULL if byte sequence is +** invalid. The array 'limits' stores the minimum value for each +** sequence length, to check for overlong representations. Its first +** entry forces an error for non-ascii bytes with no continuation +** bytes (count == 0). +*/ +static const char *utf8_decode (const char *s, utfint *val, int strict) { + static const utfint limits[] = + {~(utfint)0, 0x80, 0x800, 0x10000u, 0x200000u, 0x4000000u}; + unsigned int c = (unsigned char)s[0]; + utfint res = 0; /* final result */ + if (c < 0x80) /* ascii? */ + res = c; + else { + int count = 0; /* to count number of continuation bytes */ + for (; c & 0x40; c <<= 1) { /* while it needs continuation bytes... */ + unsigned int cc = (unsigned char)s[++count]; /* read next byte */ + if (!iscont(cc)) /* not a continuation byte? */ + return NULL; /* invalid byte sequence */ + res = (res << 6) | (cc & 0x3F); /* add lower 6 bits from cont. byte */ + } + res |= ((utfint)(c & 0x7F) << (count * 5)); /* add first byte */ + if (count > 5 || res > MAXUTF || res < limits[count]) + return NULL; /* invalid byte sequence */ + s += count; /* skip continuation bytes read */ + } + if (strict) { + /* check for invalid code points; too large or surrogates */ + if (res > MAXUNICODE || (0xD800u <= res && res <= 0xDFFFu)) + return NULL; + } + if (val) *val = res; + return s + 1; /* +1 to include first byte */ +} + + +/* +** utf8len(s [, i [, j [, lax]]]) --> number of characters that +** start in the range [i,j], or nil + current position if 's' is not +** well formed in that interval +*/ +static int utflen (lua_State *L) { + lua_Integer n = 0; /* counter for the number of characters */ + size_t len; /* string length in bytes */ + const char *s = luaL_checklstring(L, 1, &len); + lua_Integer posi = u_posrelat(luaL_optinteger(L, 2, 1), len); + lua_Integer posj = u_posrelat(luaL_optinteger(L, 3, -1), len); + int lax = lua_toboolean(L, 4); + luaL_argcheck(L, 1 <= posi && --posi <= (lua_Integer)len, 2, + "initial position out of bounds"); + luaL_argcheck(L, --posj < (lua_Integer)len, 3, + "final position out of bounds"); + while (posi <= posj) { + const char *s1 = utf8_decode(s + posi, NULL, !lax); + if (s1 == NULL) { /* conversion error? */ + luaL_pushfail(L); /* return fail ... */ + lua_pushinteger(L, posi + 1); /* ... and current position */ + return 2; + } + posi = s1 - s; + n++; + } + lua_pushinteger(L, n); + return 1; +} + + +/* +** codepoint(s, [i, [j [, lax]]]) -> returns codepoints for all +** characters that start in the range [i,j] +*/ +static int codepoint (lua_State *L) { + size_t len; + const char *s = luaL_checklstring(L, 1, &len); + lua_Integer posi = u_posrelat(luaL_optinteger(L, 2, 1), len); + lua_Integer pose = u_posrelat(luaL_optinteger(L, 3, posi), len); + int lax = lua_toboolean(L, 4); + int n; + const char *se; + luaL_argcheck(L, posi >= 1, 2, "out of bounds"); + luaL_argcheck(L, pose <= (lua_Integer)len, 3, "out of bounds"); + if (posi > pose) return 0; /* empty interval; return no values */ + if (pose - posi >= INT_MAX) /* (lua_Integer -> int) overflow? */ + return luaL_error(L, "string slice too long"); + n = (int)(pose - posi) + 1; /* upper bound for number of returns */ + luaL_checkstack(L, n, "string slice too long"); + n = 0; /* count the number of returns */ + se = s + pose; /* string end */ + for (s += posi - 1; s < se;) { + utfint code; + s = utf8_decode(s, &code, !lax); + if (s == NULL) + return luaL_error(L, MSGInvalid); + lua_pushinteger(L, code); + n++; + } + return n; +} + + +static void pushutfchar (lua_State *L, int arg) { + lua_Unsigned code = (lua_Unsigned)luaL_checkinteger(L, arg); + luaL_argcheck(L, code <= MAXUTF, arg, "value out of range"); + lua_pushfstring(L, "%U", (long)code); +} + + +/* +** utfchar(n1, n2, ...) -> char(n1)..char(n2)... +*/ +static int utfchar (lua_State *L) { + int n = lua_gettop(L); /* number of arguments */ + if (n == 1) /* optimize common case of single char */ + pushutfchar(L, 1); + else { + int i; + luaL_Buffer b; + luaL_buffinit(L, &b); + for (i = 1; i <= n; i++) { + pushutfchar(L, i); + luaL_addvalue(&b); + } + luaL_pushresult(&b); + } + return 1; +} + + +/* +** offset(s, n, [i]) -> index where n-th character counting from +** position 'i' starts; 0 means character at 'i'. +*/ +static int byteoffset (lua_State *L) { + size_t len; + const char *s = luaL_checklstring(L, 1, &len); + lua_Integer n = luaL_checkinteger(L, 2); + lua_Integer posi = (n >= 0) ? 1 : len + 1; + posi = u_posrelat(luaL_optinteger(L, 3, posi), len); + luaL_argcheck(L, 1 <= posi && --posi <= (lua_Integer)len, 3, + "position out of bounds"); + if (n == 0) { + /* find beginning of current byte sequence */ + while (posi > 0 && iscontp(s + posi)) posi--; + } + else { + if (iscontp(s + posi)) + return luaL_error(L, "initial position is a continuation byte"); + if (n < 0) { + while (n < 0 && posi > 0) { /* move back */ + do { /* find beginning of previous character */ + posi--; + } while (posi > 0 && iscontp(s + posi)); + n++; + } + } + else { + n--; /* do not move for 1st character */ + while (n > 0 && posi < (lua_Integer)len) { + do { /* find beginning of next character */ + posi++; + } while (iscontp(s + posi)); /* (cannot pass final '\0') */ + n--; + } + } + } + if (n == 0) /* did it find given character? */ + lua_pushinteger(L, posi + 1); + else /* no such character */ + luaL_pushfail(L); + return 1; +} + + +static int iter_aux (lua_State *L, int strict) { + size_t len; + const char *s = luaL_checklstring(L, 1, &len); + lua_Unsigned n = (lua_Unsigned)lua_tointeger(L, 2); + if (n < len) { + while (iscontp(s + n)) n++; /* go to next character */ + } + if (n >= len) /* (also handles original 'n' being negative) */ + return 0; /* no more codepoints */ + else { + utfint code; + const char *next = utf8_decode(s + n, &code, strict); + if (next == NULL || iscontp(next)) + return luaL_error(L, MSGInvalid); + lua_pushinteger(L, n + 1); + lua_pushinteger(L, code); + return 2; + } +} + + +static int iter_auxstrict (lua_State *L) { + return iter_aux(L, 1); +} + +static int iter_auxlax (lua_State *L) { + return iter_aux(L, 0); +} + + +static int iter_codes (lua_State *L) { + int lax = lua_toboolean(L, 2); + const char *s = luaL_checkstring(L, 1); + luaL_argcheck(L, !iscontp(s), 1, MSGInvalid); + lua_pushcfunction(L, lax ? iter_auxlax : iter_auxstrict); + lua_pushvalue(L, 1); + lua_pushinteger(L, 0); + return 3; +} + + +/* pattern to match a single UTF-8 character */ +#define UTF8PATT "[\0-\x7F\xC2-\xFD][\x80-\xBF]*" + + +static const luaL_Reg funcs[] = { + {"offset", byteoffset}, + {"codepoint", codepoint}, + {"char", utfchar}, + {"len", utflen}, + {"codes", iter_codes}, + /* placeholders */ + {"charpattern", NULL}, + {NULL, NULL} +}; + + +LUAMOD_API int luaopen_utf8 (lua_State *L) { + luaL_newlib(L, funcs); + lua_pushlstring(L, UTF8PATT, sizeof(UTF8PATT)/sizeof(char) - 1); + lua_setfield(L, -2, "charpattern"); + return 1; +} + diff --git a/vendor/lua-5.4.8/src/lvm.c b/vendor/lua-5.4.8/src/lvm.c new file mode 100644 index 0000000..7023a04 --- /dev/null +++ b/vendor/lua-5.4.8/src/lvm.c @@ -0,0 +1,1902 @@ +/* +** $Id: lvm.c $ +** Lua virtual machine +** See Copyright Notice in lua.h +*/ + +#define lvm_c +#define LUA_CORE + +#include "lprefix.h" + +#include <float.h> +#include <limits.h> +#include <math.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +#include "lua.h" + +#include "ldebug.h" +#include "ldo.h" +#include "lfunc.h" +#include "lgc.h" +#include "lobject.h" +#include "lopcodes.h" +#include "lstate.h" +#include "lstring.h" +#include "ltable.h" +#include "ltm.h" +#include "lvm.h" + + +/* +** By default, use jump tables in the main interpreter loop on gcc +** and compatible compilers. +*/ +#if !defined(LUA_USE_JUMPTABLE) +#if defined(__GNUC__) +#define LUA_USE_JUMPTABLE 1 +#else +#define LUA_USE_JUMPTABLE 0 +#endif +#endif + + + +/* limit for table tag-method chains (to avoid infinite loops) */ +#define MAXTAGLOOP 2000 + + +/* +** 'l_intfitsf' checks whether a given integer is in the range that +** can be converted to a float without rounding. Used in comparisons. +*/ + +/* number of bits in the mantissa of a float */ +#define NBM (l_floatatt(MANT_DIG)) + +/* +** Check whether some integers may not fit in a float, testing whether +** (maxinteger >> NBM) > 0. (That implies (1 << NBM) <= maxinteger.) +** (The shifts are done in parts, to avoid shifting by more than the size +** of an integer. In a worst case, NBM == 113 for long double and +** sizeof(long) == 32.) +*/ +#if ((((LUA_MAXINTEGER >> (NBM / 4)) >> (NBM / 4)) >> (NBM / 4)) \ + >> (NBM - (3 * (NBM / 4)))) > 0 + +/* limit for integers that fit in a float */ +#define MAXINTFITSF ((lua_Unsigned)1 << NBM) + +/* check whether 'i' is in the interval [-MAXINTFITSF, MAXINTFITSF] */ +#define l_intfitsf(i) ((MAXINTFITSF + l_castS2U(i)) <= (2 * MAXINTFITSF)) + +#else /* all integers fit in a float precisely */ + +#define l_intfitsf(i) 1 + +#endif + + +/* +** Try to convert a value from string to a number value. +** If the value is not a string or is a string not representing +** a valid numeral (or if coercions from strings to numbers +** are disabled via macro 'cvt2num'), do not modify 'result' +** and return 0. +*/ +static int l_strton (const TValue *obj, TValue *result) { + lua_assert(obj != result); + if (!cvt2num(obj)) /* is object not a string? */ + return 0; + else { + TString *st = tsvalue(obj); + return (luaO_str2num(getstr(st), result) == tsslen(st) + 1); + } +} + + +/* +** Try to convert a value to a float. The float case is already handled +** by the macro 'tonumber'. +*/ +int luaV_tonumber_ (const TValue *obj, lua_Number *n) { + TValue v; + if (ttisinteger(obj)) { + *n = cast_num(ivalue(obj)); + return 1; + } + else if (l_strton(obj, &v)) { /* string coercible to number? */ + *n = nvalue(&v); /* convert result of 'luaO_str2num' to a float */ + return 1; + } + else + return 0; /* conversion failed */ +} + + +/* +** try to convert a float to an integer, rounding according to 'mode'. +*/ +int luaV_flttointeger (lua_Number n, lua_Integer *p, F2Imod mode) { + lua_Number f = l_floor(n); + if (n != f) { /* not an integral value? */ + if (mode == F2Ieq) return 0; /* fails if mode demands integral value */ + else if (mode == F2Iceil) /* needs ceil? */ + f += 1; /* convert floor to ceil (remember: n != f) */ + } + return lua_numbertointeger(f, p); +} + + +/* +** try to convert a value to an integer, rounding according to 'mode', +** without string coercion. +** ("Fast track" handled by macro 'tointegerns'.) +*/ +int luaV_tointegerns (const TValue *obj, lua_Integer *p, F2Imod mode) { + if (ttisfloat(obj)) + return luaV_flttointeger(fltvalue(obj), p, mode); + else if (ttisinteger(obj)) { + *p = ivalue(obj); + return 1; + } + else + return 0; +} + + +/* +** try to convert a value to an integer. +*/ +int luaV_tointeger (const TValue *obj, lua_Integer *p, F2Imod mode) { + TValue v; + if (l_strton(obj, &v)) /* does 'obj' point to a numerical string? */ + obj = &v; /* change it to point to its corresponding number */ + return luaV_tointegerns(obj, p, mode); +} + + +/* +** Try to convert a 'for' limit to an integer, preserving the semantics +** of the loop. Return true if the loop must not run; otherwise, '*p' +** gets the integer limit. +** (The following explanation assumes a positive step; it is valid for +** negative steps mutatis mutandis.) +** If the limit is an integer or can be converted to an integer, +** rounding down, that is the limit. +** Otherwise, check whether the limit can be converted to a float. If +** the float is too large, clip it to LUA_MAXINTEGER. If the float +** is too negative, the loop should not run, because any initial +** integer value is greater than such limit; so, the function returns +** true to signal that. (For this latter case, no integer limit would be +** correct; even a limit of LUA_MININTEGER would run the loop once for +** an initial value equal to LUA_MININTEGER.) +*/ +static int forlimit (lua_State *L, lua_Integer init, const TValue *lim, + lua_Integer *p, lua_Integer step) { + if (!luaV_tointeger(lim, p, (step < 0 ? F2Iceil : F2Ifloor))) { + /* not coercible to in integer */ + lua_Number flim; /* try to convert to float */ + if (!tonumber(lim, &flim)) /* cannot convert to float? */ + luaG_forerror(L, lim, "limit"); + /* else 'flim' is a float out of integer bounds */ + if (luai_numlt(0, flim)) { /* if it is positive, it is too large */ + if (step < 0) return 1; /* initial value must be less than it */ + *p = LUA_MAXINTEGER; /* truncate */ + } + else { /* it is less than min integer */ + if (step > 0) return 1; /* initial value must be greater than it */ + *p = LUA_MININTEGER; /* truncate */ + } + } + return (step > 0 ? init > *p : init < *p); /* not to run? */ +} + + +/* +** Prepare a numerical for loop (opcode OP_FORPREP). +** Return true to skip the loop. Otherwise, +** after preparation, stack will be as follows: +** ra : internal index (safe copy of the control variable) +** ra + 1 : loop counter (integer loops) or limit (float loops) +** ra + 2 : step +** ra + 3 : control variable +*/ +static int forprep (lua_State *L, StkId ra) { + TValue *pinit = s2v(ra); + TValue *plimit = s2v(ra + 1); + TValue *pstep = s2v(ra + 2); + if (ttisinteger(pinit) && ttisinteger(pstep)) { /* integer loop? */ + lua_Integer init = ivalue(pinit); + lua_Integer step = ivalue(pstep); + lua_Integer limit; + if (step == 0) + luaG_runerror(L, "'for' step is zero"); + setivalue(s2v(ra + 3), init); /* control variable */ + if (forlimit(L, init, plimit, &limit, step)) + return 1; /* skip the loop */ + else { /* prepare loop counter */ + lua_Unsigned count; + if (step > 0) { /* ascending loop? */ + count = l_castS2U(limit) - l_castS2U(init); + if (step != 1) /* avoid division in the too common case */ + count /= l_castS2U(step); + } + else { /* step < 0; descending loop */ + count = l_castS2U(init) - l_castS2U(limit); + /* 'step+1' avoids negating 'mininteger' */ + count /= l_castS2U(-(step + 1)) + 1u; + } + /* store the counter in place of the limit (which won't be + needed anymore) */ + setivalue(plimit, l_castU2S(count)); + } + } + else { /* try making all values floats */ + lua_Number init; lua_Number limit; lua_Number step; + if (l_unlikely(!tonumber(plimit, &limit))) + luaG_forerror(L, plimit, "limit"); + if (l_unlikely(!tonumber(pstep, &step))) + luaG_forerror(L, pstep, "step"); + if (l_unlikely(!tonumber(pinit, &init))) + luaG_forerror(L, pinit, "initial value"); + if (step == 0) + luaG_runerror(L, "'for' step is zero"); + if (luai_numlt(0, step) ? luai_numlt(limit, init) + : luai_numlt(init, limit)) + return 1; /* skip the loop */ + else { + /* make sure internal values are all floats */ + setfltvalue(plimit, limit); + setfltvalue(pstep, step); + setfltvalue(s2v(ra), init); /* internal index */ + setfltvalue(s2v(ra + 3), init); /* control variable */ + } + } + return 0; +} + + +/* +** Execute a step of a float numerical for loop, returning +** true iff the loop must continue. (The integer case is +** written online with opcode OP_FORLOOP, for performance.) +*/ +static int floatforloop (StkId ra) { + lua_Number step = fltvalue(s2v(ra + 2)); + lua_Number limit = fltvalue(s2v(ra + 1)); + lua_Number idx = fltvalue(s2v(ra)); /* internal index */ + idx = luai_numadd(L, idx, step); /* increment index */ + if (luai_numlt(0, step) ? luai_numle(idx, limit) + : luai_numle(limit, idx)) { + chgfltvalue(s2v(ra), idx); /* update internal index */ + setfltvalue(s2v(ra + 3), idx); /* and control variable */ + return 1; /* jump back */ + } + else + return 0; /* finish the loop */ +} + + +/* +** Finish the table access 'val = t[key]'. +** if 'slot' is NULL, 't' is not a table; otherwise, 'slot' points to +** t[k] entry (which must be empty). +*/ +void luaV_finishget (lua_State *L, const TValue *t, TValue *key, StkId val, + const TValue *slot) { + int loop; /* counter to avoid infinite loops */ + const TValue *tm; /* metamethod */ + for (loop = 0; loop < MAXTAGLOOP; loop++) { + if (slot == NULL) { /* 't' is not a table? */ + lua_assert(!ttistable(t)); + tm = luaT_gettmbyobj(L, t, TM_INDEX); + if (l_unlikely(notm(tm))) + luaG_typeerror(L, t, "index"); /* no metamethod */ + /* else will try the metamethod */ + } + else { /* 't' is a table */ + lua_assert(isempty(slot)); + tm = fasttm(L, hvalue(t)->metatable, TM_INDEX); /* table's metamethod */ + if (tm == NULL) { /* no metamethod? */ + setnilvalue(s2v(val)); /* result is nil */ + return; + } + /* else will try the metamethod */ + } + if (ttisfunction(tm)) { /* is metamethod a function? */ + luaT_callTMres(L, tm, t, key, val); /* call it */ + return; + } + t = tm; /* else try to access 'tm[key]' */ + if (luaV_fastget(L, t, key, slot, luaH_get)) { /* fast track? */ + setobj2s(L, val, slot); /* done */ + return; + } + /* else repeat (tail call 'luaV_finishget') */ + } + luaG_runerror(L, "'__index' chain too long; possible loop"); +} + + +/* +** Finish a table assignment 't[key] = val'. +** If 'slot' is NULL, 't' is not a table. Otherwise, 'slot' points +** to the entry 't[key]', or to a value with an absent key if there +** is no such entry. (The value at 'slot' must be empty, otherwise +** 'luaV_fastget' would have done the job.) +*/ +void luaV_finishset (lua_State *L, const TValue *t, TValue *key, + TValue *val, const TValue *slot) { + int loop; /* counter to avoid infinite loops */ + for (loop = 0; loop < MAXTAGLOOP; loop++) { + const TValue *tm; /* '__newindex' metamethod */ + if (slot != NULL) { /* is 't' a table? */ + Table *h = hvalue(t); /* save 't' table */ + lua_assert(isempty(slot)); /* slot must be empty */ + tm = fasttm(L, h->metatable, TM_NEWINDEX); /* get metamethod */ + if (tm == NULL) { /* no metamethod? */ + sethvalue2s(L, L->top.p, h); /* anchor 't' */ + L->top.p++; /* assume EXTRA_STACK */ + luaH_finishset(L, h, key, slot, val); /* set new value */ + L->top.p--; + invalidateTMcache(h); + luaC_barrierback(L, obj2gco(h), val); + return; + } + /* else will try the metamethod */ + } + else { /* not a table; check metamethod */ + tm = luaT_gettmbyobj(L, t, TM_NEWINDEX); + if (l_unlikely(notm(tm))) + luaG_typeerror(L, t, "index"); + } + /* try the metamethod */ + if (ttisfunction(tm)) { + luaT_callTM(L, tm, t, key, val); + return; + } + t = tm; /* else repeat assignment over 'tm' */ + if (luaV_fastget(L, t, key, slot, luaH_get)) { + luaV_finishfastset(L, t, slot, val); + return; /* done */ + } + /* else 'return luaV_finishset(L, t, key, val, slot)' (loop) */ + } + luaG_runerror(L, "'__newindex' chain too long; possible loop"); +} + + +/* +** Compare two strings 'ts1' x 'ts2', returning an integer less-equal- +** -greater than zero if 'ts1' is less-equal-greater than 'ts2'. +** The code is a little tricky because it allows '\0' in the strings +** and it uses 'strcoll' (to respect locales) for each segment +** of the strings. Note that segments can compare equal but still +** have different lengths. +*/ +static int l_strcmp (const TString *ts1, const TString *ts2) { + const char *s1 = getstr(ts1); + size_t rl1 = tsslen(ts1); /* real length */ + const char *s2 = getstr(ts2); + size_t rl2 = tsslen(ts2); + for (;;) { /* for each segment */ + int temp = strcoll(s1, s2); + if (temp != 0) /* not equal? */ + return temp; /* done */ + else { /* strings are equal up to a '\0' */ + size_t zl1 = strlen(s1); /* index of first '\0' in 's1' */ + size_t zl2 = strlen(s2); /* index of first '\0' in 's2' */ + if (zl2 == rl2) /* 's2' is finished? */ + return (zl1 == rl1) ? 0 : 1; /* check 's1' */ + else if (zl1 == rl1) /* 's1' is finished? */ + return -1; /* 's1' is less than 's2' ('s2' is not finished) */ + /* both strings longer than 'zl'; go on comparing after the '\0' */ + zl1++; zl2++; + s1 += zl1; rl1 -= zl1; s2 += zl2; rl2 -= zl2; + } + } +} + + +/* +** Check whether integer 'i' is less than float 'f'. If 'i' has an +** exact representation as a float ('l_intfitsf'), compare numbers as +** floats. Otherwise, use the equivalence 'i < f <=> i < ceil(f)'. +** If 'ceil(f)' is out of integer range, either 'f' is greater than +** all integers or less than all integers. +** (The test with 'l_intfitsf' is only for performance; the else +** case is correct for all values, but it is slow due to the conversion +** from float to int.) +** When 'f' is NaN, comparisons must result in false. +*/ +l_sinline int LTintfloat (lua_Integer i, lua_Number f) { + if (l_intfitsf(i)) + return luai_numlt(cast_num(i), f); /* compare them as floats */ + else { /* i < f <=> i < ceil(f) */ + lua_Integer fi; + if (luaV_flttointeger(f, &fi, F2Iceil)) /* fi = ceil(f) */ + return i < fi; /* compare them as integers */ + else /* 'f' is either greater or less than all integers */ + return f > 0; /* greater? */ + } +} + + +/* +** Check whether integer 'i' is less than or equal to float 'f'. +** See comments on previous function. +*/ +l_sinline int LEintfloat (lua_Integer i, lua_Number f) { + if (l_intfitsf(i)) + return luai_numle(cast_num(i), f); /* compare them as floats */ + else { /* i <= f <=> i <= floor(f) */ + lua_Integer fi; + if (luaV_flttointeger(f, &fi, F2Ifloor)) /* fi = floor(f) */ + return i <= fi; /* compare them as integers */ + else /* 'f' is either greater or less than all integers */ + return f > 0; /* greater? */ + } +} + + +/* +** Check whether float 'f' is less than integer 'i'. +** See comments on previous function. +*/ +l_sinline int LTfloatint (lua_Number f, lua_Integer i) { + if (l_intfitsf(i)) + return luai_numlt(f, cast_num(i)); /* compare them as floats */ + else { /* f < i <=> floor(f) < i */ + lua_Integer fi; + if (luaV_flttointeger(f, &fi, F2Ifloor)) /* fi = floor(f) */ + return fi < i; /* compare them as integers */ + else /* 'f' is either greater or less than all integers */ + return f < 0; /* less? */ + } +} + + +/* +** Check whether float 'f' is less than or equal to integer 'i'. +** See comments on previous function. +*/ +l_sinline int LEfloatint (lua_Number f, lua_Integer i) { + if (l_intfitsf(i)) + return luai_numle(f, cast_num(i)); /* compare them as floats */ + else { /* f <= i <=> ceil(f) <= i */ + lua_Integer fi; + if (luaV_flttointeger(f, &fi, F2Iceil)) /* fi = ceil(f) */ + return fi <= i; /* compare them as integers */ + else /* 'f' is either greater or less than all integers */ + return f < 0; /* less? */ + } +} + + +/* +** Return 'l < r', for numbers. +*/ +l_sinline int LTnum (const TValue *l, const TValue *r) { + lua_assert(ttisnumber(l) && ttisnumber(r)); + if (ttisinteger(l)) { + lua_Integer li = ivalue(l); + if (ttisinteger(r)) + return li < ivalue(r); /* both are integers */ + else /* 'l' is int and 'r' is float */ + return LTintfloat(li, fltvalue(r)); /* l < r ? */ + } + else { + lua_Number lf = fltvalue(l); /* 'l' must be float */ + if (ttisfloat(r)) + return luai_numlt(lf, fltvalue(r)); /* both are float */ + else /* 'l' is float and 'r' is int */ + return LTfloatint(lf, ivalue(r)); + } +} + + +/* +** Return 'l <= r', for numbers. +*/ +l_sinline int LEnum (const TValue *l, const TValue *r) { + lua_assert(ttisnumber(l) && ttisnumber(r)); + if (ttisinteger(l)) { + lua_Integer li = ivalue(l); + if (ttisinteger(r)) + return li <= ivalue(r); /* both are integers */ + else /* 'l' is int and 'r' is float */ + return LEintfloat(li, fltvalue(r)); /* l <= r ? */ + } + else { + lua_Number lf = fltvalue(l); /* 'l' must be float */ + if (ttisfloat(r)) + return luai_numle(lf, fltvalue(r)); /* both are float */ + else /* 'l' is float and 'r' is int */ + return LEfloatint(lf, ivalue(r)); + } +} + + +/* +** return 'l < r' for non-numbers. +*/ +static int lessthanothers (lua_State *L, const TValue *l, const TValue *r) { + lua_assert(!ttisnumber(l) || !ttisnumber(r)); + if (ttisstring(l) && ttisstring(r)) /* both are strings? */ + return l_strcmp(tsvalue(l), tsvalue(r)) < 0; + else + return luaT_callorderTM(L, l, r, TM_LT); +} + + +/* +** Main operation less than; return 'l < r'. +*/ +int luaV_lessthan (lua_State *L, const TValue *l, const TValue *r) { + if (ttisnumber(l) && ttisnumber(r)) /* both operands are numbers? */ + return LTnum(l, r); + else return lessthanothers(L, l, r); +} + + +/* +** return 'l <= r' for non-numbers. +*/ +static int lessequalothers (lua_State *L, const TValue *l, const TValue *r) { + lua_assert(!ttisnumber(l) || !ttisnumber(r)); + if (ttisstring(l) && ttisstring(r)) /* both are strings? */ + return l_strcmp(tsvalue(l), tsvalue(r)) <= 0; + else + return luaT_callorderTM(L, l, r, TM_LE); +} + + +/* +** Main operation less than or equal to; return 'l <= r'. +*/ +int luaV_lessequal (lua_State *L, const TValue *l, const TValue *r) { + if (ttisnumber(l) && ttisnumber(r)) /* both operands are numbers? */ + return LEnum(l, r); + else return lessequalothers(L, l, r); +} + + +/* +** Main operation for equality of Lua values; return 't1 == t2'. +** L == NULL means raw equality (no metamethods) +*/ +int luaV_equalobj (lua_State *L, const TValue *t1, const TValue *t2) { + const TValue *tm; + if (ttypetag(t1) != ttypetag(t2)) { /* not the same variant? */ + if (ttype(t1) != ttype(t2) || ttype(t1) != LUA_TNUMBER) + return 0; /* only numbers can be equal with different variants */ + else { /* two numbers with different variants */ + /* One of them is an integer. If the other does not have an + integer value, they cannot be equal; otherwise, compare their + integer values. */ + lua_Integer i1, i2; + return (luaV_tointegerns(t1, &i1, F2Ieq) && + luaV_tointegerns(t2, &i2, F2Ieq) && + i1 == i2); + } + } + /* values have same type and same variant */ + switch (ttypetag(t1)) { + case LUA_VNIL: case LUA_VFALSE: case LUA_VTRUE: return 1; + case LUA_VNUMINT: return (ivalue(t1) == ivalue(t2)); + case LUA_VNUMFLT: return luai_numeq(fltvalue(t1), fltvalue(t2)); + case LUA_VLIGHTUSERDATA: return pvalue(t1) == pvalue(t2); + case LUA_VLCF: return fvalue(t1) == fvalue(t2); + case LUA_VSHRSTR: return eqshrstr(tsvalue(t1), tsvalue(t2)); + case LUA_VLNGSTR: return luaS_eqlngstr(tsvalue(t1), tsvalue(t2)); + case LUA_VUSERDATA: { + if (uvalue(t1) == uvalue(t2)) return 1; + else if (L == NULL) return 0; + tm = fasttm(L, uvalue(t1)->metatable, TM_EQ); + if (tm == NULL) + tm = fasttm(L, uvalue(t2)->metatable, TM_EQ); + break; /* will try TM */ + } + case LUA_VTABLE: { + if (hvalue(t1) == hvalue(t2)) return 1; + else if (L == NULL) return 0; + tm = fasttm(L, hvalue(t1)->metatable, TM_EQ); + if (tm == NULL) + tm = fasttm(L, hvalue(t2)->metatable, TM_EQ); + break; /* will try TM */ + } + default: + return gcvalue(t1) == gcvalue(t2); + } + if (tm == NULL) /* no TM? */ + return 0; /* objects are different */ + else { + luaT_callTMres(L, tm, t1, t2, L->top.p); /* call TM */ + return !l_isfalse(s2v(L->top.p)); + } +} + + +/* macro used by 'luaV_concat' to ensure that element at 'o' is a string */ +#define tostring(L,o) \ + (ttisstring(o) || (cvt2str(o) && (luaO_tostring(L, o), 1))) + +#define isemptystr(o) (ttisshrstring(o) && tsvalue(o)->shrlen == 0) + +/* copy strings in stack from top - n up to top - 1 to buffer */ +static void copy2buff (StkId top, int n, char *buff) { + size_t tl = 0; /* size already copied */ + do { + TString *st = tsvalue(s2v(top - n)); + size_t l = tsslen(st); /* length of string being copied */ + memcpy(buff + tl, getstr(st), l * sizeof(char)); + tl += l; + } while (--n > 0); +} + + +/* +** Main operation for concatenation: concat 'total' values in the stack, +** from 'L->top.p - total' up to 'L->top.p - 1'. +*/ +void luaV_concat (lua_State *L, int total) { + if (total == 1) + return; /* "all" values already concatenated */ + do { + StkId top = L->top.p; + int n = 2; /* number of elements handled in this pass (at least 2) */ + if (!(ttisstring(s2v(top - 2)) || cvt2str(s2v(top - 2))) || + !tostring(L, s2v(top - 1))) + luaT_tryconcatTM(L); /* may invalidate 'top' */ + else if (isemptystr(s2v(top - 1))) /* second operand is empty? */ + cast_void(tostring(L, s2v(top - 2))); /* result is first operand */ + else if (isemptystr(s2v(top - 2))) { /* first operand is empty string? */ + setobjs2s(L, top - 2, top - 1); /* result is second op. */ + } + else { + /* at least two non-empty string values; get as many as possible */ + size_t tl = tsslen(tsvalue(s2v(top - 1))); + TString *ts; + /* collect total length and number of strings */ + for (n = 1; n < total && tostring(L, s2v(top - n - 1)); n++) { + size_t l = tsslen(tsvalue(s2v(top - n - 1))); + if (l_unlikely(l >= MAX_SIZE - sizeof(TString) - tl)) { + L->top.p = top - total; /* pop strings to avoid wasting stack */ + luaG_runerror(L, "string length overflow"); + } + tl += l; + } + if (tl <= LUAI_MAXSHORTLEN) { /* is result a short string? */ + char buff[LUAI_MAXSHORTLEN]; + copy2buff(top, n, buff); /* copy strings to buffer */ + ts = luaS_newlstr(L, buff, tl); + } + else { /* long string; copy strings directly to final result */ + ts = luaS_createlngstrobj(L, tl); + copy2buff(top, n, getlngstr(ts)); + } + setsvalue2s(L, top - n, ts); /* create result */ + } + total -= n - 1; /* got 'n' strings to create one new */ + L->top.p -= n - 1; /* popped 'n' strings and pushed one */ + } while (total > 1); /* repeat until only 1 result left */ +} + + +/* +** Main operation 'ra = #rb'. +*/ +void luaV_objlen (lua_State *L, StkId ra, const TValue *rb) { + const TValue *tm; + switch (ttypetag(rb)) { + case LUA_VTABLE: { + Table *h = hvalue(rb); + tm = fasttm(L, h->metatable, TM_LEN); + if (tm) break; /* metamethod? break switch to call it */ + setivalue(s2v(ra), luaH_getn(h)); /* else primitive len */ + return; + } + case LUA_VSHRSTR: { + setivalue(s2v(ra), tsvalue(rb)->shrlen); + return; + } + case LUA_VLNGSTR: { + setivalue(s2v(ra), tsvalue(rb)->u.lnglen); + return; + } + default: { /* try metamethod */ + tm = luaT_gettmbyobj(L, rb, TM_LEN); + if (l_unlikely(notm(tm))) /* no metamethod? */ + luaG_typeerror(L, rb, "get length of"); + break; + } + } + luaT_callTMres(L, tm, rb, rb, ra); +} + + +/* +** Integer division; return 'm // n', that is, floor(m/n). +** C division truncates its result (rounds towards zero). +** 'floor(q) == trunc(q)' when 'q >= 0' or when 'q' is integer, +** otherwise 'floor(q) == trunc(q) - 1'. +*/ +lua_Integer luaV_idiv (lua_State *L, lua_Integer m, lua_Integer n) { + if (l_unlikely(l_castS2U(n) + 1u <= 1u)) { /* special cases: -1 or 0 */ + if (n == 0) + luaG_runerror(L, "attempt to divide by zero"); + return intop(-, 0, m); /* n==-1; avoid overflow with 0x80000...//-1 */ + } + else { + lua_Integer q = m / n; /* perform C division */ + if ((m ^ n) < 0 && m % n != 0) /* 'm/n' would be negative non-integer? */ + q -= 1; /* correct result for different rounding */ + return q; + } +} + + +/* +** Integer modulus; return 'm % n'. (Assume that C '%' with +** negative operands follows C99 behavior. See previous comment +** about luaV_idiv.) +*/ +lua_Integer luaV_mod (lua_State *L, lua_Integer m, lua_Integer n) { + if (l_unlikely(l_castS2U(n) + 1u <= 1u)) { /* special cases: -1 or 0 */ + if (n == 0) + luaG_runerror(L, "attempt to perform 'n%%0'"); + return 0; /* m % -1 == 0; avoid overflow with 0x80000...%-1 */ + } + else { + lua_Integer r = m % n; + if (r != 0 && (r ^ n) < 0) /* 'm/n' would be non-integer negative? */ + r += n; /* correct result for different rounding */ + return r; + } +} + + +/* +** Float modulus +*/ +lua_Number luaV_modf (lua_State *L, lua_Number m, lua_Number n) { + lua_Number r; + luai_nummod(L, m, n, r); + return r; +} + + +/* number of bits in an integer */ +#define NBITS cast_int(sizeof(lua_Integer) * CHAR_BIT) + + +/* +** Shift left operation. (Shift right just negates 'y'.) +*/ +lua_Integer luaV_shiftl (lua_Integer x, lua_Integer y) { + if (y < 0) { /* shift right? */ + if (y <= -NBITS) return 0; + else return intop(>>, x, -y); + } + else { /* shift left */ + if (y >= NBITS) return 0; + else return intop(<<, x, y); + } +} + + +/* +** create a new Lua closure, push it in the stack, and initialize +** its upvalues. +*/ +static void pushclosure (lua_State *L, Proto *p, UpVal **encup, StkId base, + StkId ra) { + int nup = p->sizeupvalues; + Upvaldesc *uv = p->upvalues; + int i; + LClosure *ncl = luaF_newLclosure(L, nup); + ncl->p = p; + setclLvalue2s(L, ra, ncl); /* anchor new closure in stack */ + for (i = 0; i < nup; i++) { /* fill in its upvalues */ + if (uv[i].instack) /* upvalue refers to local variable? */ + ncl->upvals[i] = luaF_findupval(L, base + uv[i].idx); + else /* get upvalue from enclosing function */ + ncl->upvals[i] = encup[uv[i].idx]; + luaC_objbarrier(L, ncl, ncl->upvals[i]); + } +} + + +/* +** finish execution of an opcode interrupted by a yield +*/ +void luaV_finishOp (lua_State *L) { + CallInfo *ci = L->ci; + StkId base = ci->func.p + 1; + Instruction inst = *(ci->u.l.savedpc - 1); /* interrupted instruction */ + OpCode op = GET_OPCODE(inst); + switch (op) { /* finish its execution */ + case OP_MMBIN: case OP_MMBINI: case OP_MMBINK: { + setobjs2s(L, base + GETARG_A(*(ci->u.l.savedpc - 2)), --L->top.p); + break; + } + case OP_UNM: case OP_BNOT: case OP_LEN: + case OP_GETTABUP: case OP_GETTABLE: case OP_GETI: + case OP_GETFIELD: case OP_SELF: { + setobjs2s(L, base + GETARG_A(inst), --L->top.p); + break; + } + case OP_LT: case OP_LE: + case OP_LTI: case OP_LEI: + case OP_GTI: case OP_GEI: + case OP_EQ: { /* note that 'OP_EQI'/'OP_EQK' cannot yield */ + int res = !l_isfalse(s2v(L->top.p - 1)); + L->top.p--; +#if defined(LUA_COMPAT_LT_LE) + if (ci->callstatus & CIST_LEQ) { /* "<=" using "<" instead? */ + ci->callstatus ^= CIST_LEQ; /* clear mark */ + res = !res; /* negate result */ + } +#endif + lua_assert(GET_OPCODE(*ci->u.l.savedpc) == OP_JMP); + if (res != GETARG_k(inst)) /* condition failed? */ + ci->u.l.savedpc++; /* skip jump instruction */ + break; + } + case OP_CONCAT: { + StkId top = L->top.p - 1; /* top when 'luaT_tryconcatTM' was called */ + int a = GETARG_A(inst); /* first element to concatenate */ + int total = cast_int(top - 1 - (base + a)); /* yet to concatenate */ + setobjs2s(L, top - 2, top); /* put TM result in proper position */ + L->top.p = top - 1; /* top is one after last element (at top-2) */ + luaV_concat(L, total); /* concat them (may yield again) */ + break; + } + case OP_CLOSE: { /* yielded closing variables */ + ci->u.l.savedpc--; /* repeat instruction to close other vars. */ + break; + } + case OP_RETURN: { /* yielded closing variables */ + StkId ra = base + GETARG_A(inst); + /* adjust top to signal correct number of returns, in case the + return is "up to top" ('isIT') */ + L->top.p = ra + ci->u2.nres; + /* repeat instruction to close other vars. and complete the return */ + ci->u.l.savedpc--; + break; + } + default: { + /* only these other opcodes can yield */ + lua_assert(op == OP_TFORCALL || op == OP_CALL || + op == OP_TAILCALL || op == OP_SETTABUP || op == OP_SETTABLE || + op == OP_SETI || op == OP_SETFIELD); + break; + } + } +} + + + + +/* +** {================================================================== +** Macros for arithmetic/bitwise/comparison opcodes in 'luaV_execute' +** =================================================================== +*/ + +#define l_addi(L,a,b) intop(+, a, b) +#define l_subi(L,a,b) intop(-, a, b) +#define l_muli(L,a,b) intop(*, a, b) +#define l_band(a,b) intop(&, a, b) +#define l_bor(a,b) intop(|, a, b) +#define l_bxor(a,b) intop(^, a, b) + +#define l_lti(a,b) (a < b) +#define l_lei(a,b) (a <= b) +#define l_gti(a,b) (a > b) +#define l_gei(a,b) (a >= b) + + +/* +** Arithmetic operations with immediate operands. 'iop' is the integer +** operation, 'fop' is the float operation. +*/ +#define op_arithI(L,iop,fop) { \ + StkId ra = RA(i); \ + TValue *v1 = vRB(i); \ + int imm = GETARG_sC(i); \ + if (ttisinteger(v1)) { \ + lua_Integer iv1 = ivalue(v1); \ + pc++; setivalue(s2v(ra), iop(L, iv1, imm)); \ + } \ + else if (ttisfloat(v1)) { \ + lua_Number nb = fltvalue(v1); \ + lua_Number fimm = cast_num(imm); \ + pc++; setfltvalue(s2v(ra), fop(L, nb, fimm)); \ + }} + + +/* +** Auxiliary function for arithmetic operations over floats and others +** with two register operands. +*/ +#define op_arithf_aux(L,v1,v2,fop) { \ + lua_Number n1; lua_Number n2; \ + if (tonumberns(v1, n1) && tonumberns(v2, n2)) { \ + pc++; setfltvalue(s2v(ra), fop(L, n1, n2)); \ + }} + + +/* +** Arithmetic operations over floats and others with register operands. +*/ +#define op_arithf(L,fop) { \ + StkId ra = RA(i); \ + TValue *v1 = vRB(i); \ + TValue *v2 = vRC(i); \ + op_arithf_aux(L, v1, v2, fop); } + + +/* +** Arithmetic operations with K operands for floats. +*/ +#define op_arithfK(L,fop) { \ + StkId ra = RA(i); \ + TValue *v1 = vRB(i); \ + TValue *v2 = KC(i); lua_assert(ttisnumber(v2)); \ + op_arithf_aux(L, v1, v2, fop); } + + +/* +** Arithmetic operations over integers and floats. +*/ +#define op_arith_aux(L,v1,v2,iop,fop) { \ + StkId ra = RA(i); \ + if (ttisinteger(v1) && ttisinteger(v2)) { \ + lua_Integer i1 = ivalue(v1); lua_Integer i2 = ivalue(v2); \ + pc++; setivalue(s2v(ra), iop(L, i1, i2)); \ + } \ + else op_arithf_aux(L, v1, v2, fop); } + + +/* +** Arithmetic operations with register operands. +*/ +#define op_arith(L,iop,fop) { \ + TValue *v1 = vRB(i); \ + TValue *v2 = vRC(i); \ + op_arith_aux(L, v1, v2, iop, fop); } + + +/* +** Arithmetic operations with K operands. +*/ +#define op_arithK(L,iop,fop) { \ + TValue *v1 = vRB(i); \ + TValue *v2 = KC(i); lua_assert(ttisnumber(v2)); \ + op_arith_aux(L, v1, v2, iop, fop); } + + +/* +** Bitwise operations with constant operand. +*/ +#define op_bitwiseK(L,op) { \ + StkId ra = RA(i); \ + TValue *v1 = vRB(i); \ + TValue *v2 = KC(i); \ + lua_Integer i1; \ + lua_Integer i2 = ivalue(v2); \ + if (tointegerns(v1, &i1)) { \ + pc++; setivalue(s2v(ra), op(i1, i2)); \ + }} + + +/* +** Bitwise operations with register operands. +*/ +#define op_bitwise(L,op) { \ + StkId ra = RA(i); \ + TValue *v1 = vRB(i); \ + TValue *v2 = vRC(i); \ + lua_Integer i1; lua_Integer i2; \ + if (tointegerns(v1, &i1) && tointegerns(v2, &i2)) { \ + pc++; setivalue(s2v(ra), op(i1, i2)); \ + }} + + +/* +** Order operations with register operands. 'opn' actually works +** for all numbers, but the fast track improves performance for +** integers. +*/ +#define op_order(L,opi,opn,other) { \ + StkId ra = RA(i); \ + int cond; \ + TValue *rb = vRB(i); \ + if (ttisinteger(s2v(ra)) && ttisinteger(rb)) { \ + lua_Integer ia = ivalue(s2v(ra)); \ + lua_Integer ib = ivalue(rb); \ + cond = opi(ia, ib); \ + } \ + else if (ttisnumber(s2v(ra)) && ttisnumber(rb)) \ + cond = opn(s2v(ra), rb); \ + else \ + Protect(cond = other(L, s2v(ra), rb)); \ + docondjump(); } + + +/* +** Order operations with immediate operand. (Immediate operand is +** always small enough to have an exact representation as a float.) +*/ +#define op_orderI(L,opi,opf,inv,tm) { \ + StkId ra = RA(i); \ + int cond; \ + int im = GETARG_sB(i); \ + if (ttisinteger(s2v(ra))) \ + cond = opi(ivalue(s2v(ra)), im); \ + else if (ttisfloat(s2v(ra))) { \ + lua_Number fa = fltvalue(s2v(ra)); \ + lua_Number fim = cast_num(im); \ + cond = opf(fa, fim); \ + } \ + else { \ + int isf = GETARG_C(i); \ + Protect(cond = luaT_callorderiTM(L, s2v(ra), im, inv, isf, tm)); \ + } \ + docondjump(); } + +/* }================================================================== */ + + +/* +** {================================================================== +** Function 'luaV_execute': main interpreter loop +** =================================================================== +*/ + +/* +** some macros for common tasks in 'luaV_execute' +*/ + + +#define RA(i) (base+GETARG_A(i)) +#define RB(i) (base+GETARG_B(i)) +#define vRB(i) s2v(RB(i)) +#define KB(i) (k+GETARG_B(i)) +#define RC(i) (base+GETARG_C(i)) +#define vRC(i) s2v(RC(i)) +#define KC(i) (k+GETARG_C(i)) +#define RKC(i) ((TESTARG_k(i)) ? k + GETARG_C(i) : s2v(base + GETARG_C(i))) + + + +#define updatetrap(ci) (trap = ci->u.l.trap) + +#define updatebase(ci) (base = ci->func.p + 1) + + +#define updatestack(ci) \ + { if (l_unlikely(trap)) { updatebase(ci); ra = RA(i); } } + + +/* +** Execute a jump instruction. The 'updatetrap' allows signals to stop +** tight loops. (Without it, the local copy of 'trap' could never change.) +*/ +#define dojump(ci,i,e) { pc += GETARG_sJ(i) + e; updatetrap(ci); } + + +/* for test instructions, execute the jump instruction that follows it */ +#define donextjump(ci) { Instruction ni = *pc; dojump(ci, ni, 1); } + +/* +** do a conditional jump: skip next instruction if 'cond' is not what +** was expected (parameter 'k'), else do next instruction, which must +** be a jump. +*/ +#define docondjump() if (cond != GETARG_k(i)) pc++; else donextjump(ci); + + +/* +** Correct global 'pc'. +*/ +#define savepc(L) (ci->u.l.savedpc = pc) + + +/* +** Whenever code can raise errors, the global 'pc' and the global +** 'top' must be correct to report occasional errors. +*/ +#define savestate(L,ci) (savepc(L), L->top.p = ci->top.p) + + +/* +** Protect code that, in general, can raise errors, reallocate the +** stack, and change the hooks. +*/ +#define Protect(exp) (savestate(L,ci), (exp), updatetrap(ci)) + +/* special version that does not change the top */ +#define ProtectNT(exp) (savepc(L), (exp), updatetrap(ci)) + +/* +** Protect code that can only raise errors. (That is, it cannot change +** the stack or hooks.) +*/ +#define halfProtect(exp) (savestate(L,ci), (exp)) + +/* 'c' is the limit of live values in the stack */ +#define checkGC(L,c) \ + { luaC_condGC(L, (savepc(L), L->top.p = (c)), \ + updatetrap(ci)); \ + luai_threadyield(L); } + + +/* fetch an instruction and prepare its execution */ +#define vmfetch() { \ + if (l_unlikely(trap)) { /* stack reallocation or hooks? */ \ + trap = luaG_traceexec(L, pc); /* handle hooks */ \ + updatebase(ci); /* correct stack */ \ + } \ + i = *(pc++); \ +} + +#define vmdispatch(o) switch(o) +#define vmcase(l) case l: +#define vmbreak break + + +void luaV_execute (lua_State *L, CallInfo *ci) { + LClosure *cl; + TValue *k; + StkId base; + const Instruction *pc; + int trap; +#if LUA_USE_JUMPTABLE +#include "ljumptab.h" +#endif + startfunc: + trap = L->hookmask; + returning: /* trap already set */ + cl = ci_func(ci); + k = cl->p->k; + pc = ci->u.l.savedpc; + if (l_unlikely(trap)) + trap = luaG_tracecall(L); + base = ci->func.p + 1; + /* main loop of interpreter */ + for (;;) { + Instruction i; /* instruction being executed */ + vmfetch(); + #if 0 + /* low-level line tracing for debugging Lua */ + printf("line: %d\n", luaG_getfuncline(cl->p, pcRel(pc, cl->p))); + #endif + lua_assert(base == ci->func.p + 1); + lua_assert(base <= L->top.p && L->top.p <= L->stack_last.p); + /* invalidate top for instructions not expecting it */ + lua_assert(isIT(i) || (cast_void(L->top.p = base), 1)); + vmdispatch (GET_OPCODE(i)) { + vmcase(OP_MOVE) { + StkId ra = RA(i); + setobjs2s(L, ra, RB(i)); + vmbreak; + } + vmcase(OP_LOADI) { + StkId ra = RA(i); + lua_Integer b = GETARG_sBx(i); + setivalue(s2v(ra), b); + vmbreak; + } + vmcase(OP_LOADF) { + StkId ra = RA(i); + int b = GETARG_sBx(i); + setfltvalue(s2v(ra), cast_num(b)); + vmbreak; + } + vmcase(OP_LOADK) { + StkId ra = RA(i); + TValue *rb = k + GETARG_Bx(i); + setobj2s(L, ra, rb); + vmbreak; + } + vmcase(OP_LOADKX) { + StkId ra = RA(i); + TValue *rb; + rb = k + GETARG_Ax(*pc); pc++; + setobj2s(L, ra, rb); + vmbreak; + } + vmcase(OP_LOADFALSE) { + StkId ra = RA(i); + setbfvalue(s2v(ra)); + vmbreak; + } + vmcase(OP_LFALSESKIP) { + StkId ra = RA(i); + setbfvalue(s2v(ra)); + pc++; /* skip next instruction */ + vmbreak; + } + vmcase(OP_LOADTRUE) { + StkId ra = RA(i); + setbtvalue(s2v(ra)); + vmbreak; + } + vmcase(OP_LOADNIL) { + StkId ra = RA(i); + int b = GETARG_B(i); + do { + setnilvalue(s2v(ra++)); + } while (b--); + vmbreak; + } + vmcase(OP_GETUPVAL) { + StkId ra = RA(i); + int b = GETARG_B(i); + setobj2s(L, ra, cl->upvals[b]->v.p); + vmbreak; + } + vmcase(OP_SETUPVAL) { + StkId ra = RA(i); + UpVal *uv = cl->upvals[GETARG_B(i)]; + setobj(L, uv->v.p, s2v(ra)); + luaC_barrier(L, uv, s2v(ra)); + vmbreak; + } + vmcase(OP_GETTABUP) { + StkId ra = RA(i); + const TValue *slot; + TValue *upval = cl->upvals[GETARG_B(i)]->v.p; + TValue *rc = KC(i); + TString *key = tsvalue(rc); /* key must be a short string */ + if (luaV_fastget(L, upval, key, slot, luaH_getshortstr)) { + setobj2s(L, ra, slot); + } + else + Protect(luaV_finishget(L, upval, rc, ra, slot)); + vmbreak; + } + vmcase(OP_GETTABLE) { + StkId ra = RA(i); + const TValue *slot; + TValue *rb = vRB(i); + TValue *rc = vRC(i); + lua_Unsigned n; + if (ttisinteger(rc) /* fast track for integers? */ + ? (cast_void(n = ivalue(rc)), luaV_fastgeti(L, rb, n, slot)) + : luaV_fastget(L, rb, rc, slot, luaH_get)) { + setobj2s(L, ra, slot); + } + else + Protect(luaV_finishget(L, rb, rc, ra, slot)); + vmbreak; + } + vmcase(OP_GETI) { + StkId ra = RA(i); + const TValue *slot; + TValue *rb = vRB(i); + int c = GETARG_C(i); + if (luaV_fastgeti(L, rb, c, slot)) { + setobj2s(L, ra, slot); + } + else { + TValue key; + setivalue(&key, c); + Protect(luaV_finishget(L, rb, &key, ra, slot)); + } + vmbreak; + } + vmcase(OP_GETFIELD) { + StkId ra = RA(i); + const TValue *slot; + TValue *rb = vRB(i); + TValue *rc = KC(i); + TString *key = tsvalue(rc); /* key must be a short string */ + if (luaV_fastget(L, rb, key, slot, luaH_getshortstr)) { + setobj2s(L, ra, slot); + } + else + Protect(luaV_finishget(L, rb, rc, ra, slot)); + vmbreak; + } + vmcase(OP_SETTABUP) { + const TValue *slot; + TValue *upval = cl->upvals[GETARG_A(i)]->v.p; + TValue *rb = KB(i); + TValue *rc = RKC(i); + TString *key = tsvalue(rb); /* key must be a short string */ + if (luaV_fastget(L, upval, key, slot, luaH_getshortstr)) { + luaV_finishfastset(L, upval, slot, rc); + } + else + Protect(luaV_finishset(L, upval, rb, rc, slot)); + vmbreak; + } + vmcase(OP_SETTABLE) { + StkId ra = RA(i); + const TValue *slot; + TValue *rb = vRB(i); /* key (table is in 'ra') */ + TValue *rc = RKC(i); /* value */ + lua_Unsigned n; + if (ttisinteger(rb) /* fast track for integers? */ + ? (cast_void(n = ivalue(rb)), luaV_fastgeti(L, s2v(ra), n, slot)) + : luaV_fastget(L, s2v(ra), rb, slot, luaH_get)) { + luaV_finishfastset(L, s2v(ra), slot, rc); + } + else + Protect(luaV_finishset(L, s2v(ra), rb, rc, slot)); + vmbreak; + } + vmcase(OP_SETI) { + StkId ra = RA(i); + const TValue *slot; + int c = GETARG_B(i); + TValue *rc = RKC(i); + if (luaV_fastgeti(L, s2v(ra), c, slot)) { + luaV_finishfastset(L, s2v(ra), slot, rc); + } + else { + TValue key; + setivalue(&key, c); + Protect(luaV_finishset(L, s2v(ra), &key, rc, slot)); + } + vmbreak; + } + vmcase(OP_SETFIELD) { + StkId ra = RA(i); + const TValue *slot; + TValue *rb = KB(i); + TValue *rc = RKC(i); + TString *key = tsvalue(rb); /* key must be a short string */ + if (luaV_fastget(L, s2v(ra), key, slot, luaH_getshortstr)) { + luaV_finishfastset(L, s2v(ra), slot, rc); + } + else + Protect(luaV_finishset(L, s2v(ra), rb, rc, slot)); + vmbreak; + } + vmcase(OP_NEWTABLE) { + StkId ra = RA(i); + int b = GETARG_B(i); /* log2(hash size) + 1 */ + int c = GETARG_C(i); /* array size */ + Table *t; + if (b > 0) + b = 1 << (b - 1); /* size is 2^(b - 1) */ + lua_assert((!TESTARG_k(i)) == (GETARG_Ax(*pc) == 0)); + if (TESTARG_k(i)) /* non-zero extra argument? */ + c += GETARG_Ax(*pc) * (MAXARG_C + 1); /* add it to size */ + pc++; /* skip extra argument */ + L->top.p = ra + 1; /* correct top in case of emergency GC */ + t = luaH_new(L); /* memory allocation */ + sethvalue2s(L, ra, t); + if (b != 0 || c != 0) + luaH_resize(L, t, c, b); /* idem */ + checkGC(L, ra + 1); + vmbreak; + } + vmcase(OP_SELF) { + StkId ra = RA(i); + const TValue *slot; + TValue *rb = vRB(i); + TValue *rc = RKC(i); + TString *key = tsvalue(rc); /* key must be a string */ + setobj2s(L, ra + 1, rb); + if (luaV_fastget(L, rb, key, slot, luaH_getstr)) { + setobj2s(L, ra, slot); + } + else + Protect(luaV_finishget(L, rb, rc, ra, slot)); + vmbreak; + } + vmcase(OP_ADDI) { + op_arithI(L, l_addi, luai_numadd); + vmbreak; + } + vmcase(OP_ADDK) { + op_arithK(L, l_addi, luai_numadd); + vmbreak; + } + vmcase(OP_SUBK) { + op_arithK(L, l_subi, luai_numsub); + vmbreak; + } + vmcase(OP_MULK) { + op_arithK(L, l_muli, luai_nummul); + vmbreak; + } + vmcase(OP_MODK) { + savestate(L, ci); /* in case of division by 0 */ + op_arithK(L, luaV_mod, luaV_modf); + vmbreak; + } + vmcase(OP_POWK) { + op_arithfK(L, luai_numpow); + vmbreak; + } + vmcase(OP_DIVK) { + op_arithfK(L, luai_numdiv); + vmbreak; + } + vmcase(OP_IDIVK) { + savestate(L, ci); /* in case of division by 0 */ + op_arithK(L, luaV_idiv, luai_numidiv); + vmbreak; + } + vmcase(OP_BANDK) { + op_bitwiseK(L, l_band); + vmbreak; + } + vmcase(OP_BORK) { + op_bitwiseK(L, l_bor); + vmbreak; + } + vmcase(OP_BXORK) { + op_bitwiseK(L, l_bxor); + vmbreak; + } + vmcase(OP_SHRI) { + StkId ra = RA(i); + TValue *rb = vRB(i); + int ic = GETARG_sC(i); + lua_Integer ib; + if (tointegerns(rb, &ib)) { + pc++; setivalue(s2v(ra), luaV_shiftl(ib, -ic)); + } + vmbreak; + } + vmcase(OP_SHLI) { + StkId ra = RA(i); + TValue *rb = vRB(i); + int ic = GETARG_sC(i); + lua_Integer ib; + if (tointegerns(rb, &ib)) { + pc++; setivalue(s2v(ra), luaV_shiftl(ic, ib)); + } + vmbreak; + } + vmcase(OP_ADD) { + op_arith(L, l_addi, luai_numadd); + vmbreak; + } + vmcase(OP_SUB) { + op_arith(L, l_subi, luai_numsub); + vmbreak; + } + vmcase(OP_MUL) { + op_arith(L, l_muli, luai_nummul); + vmbreak; + } + vmcase(OP_MOD) { + savestate(L, ci); /* in case of division by 0 */ + op_arith(L, luaV_mod, luaV_modf); + vmbreak; + } + vmcase(OP_POW) { + op_arithf(L, luai_numpow); + vmbreak; + } + vmcase(OP_DIV) { /* float division (always with floats) */ + op_arithf(L, luai_numdiv); + vmbreak; + } + vmcase(OP_IDIV) { /* floor division */ + savestate(L, ci); /* in case of division by 0 */ + op_arith(L, luaV_idiv, luai_numidiv); + vmbreak; + } + vmcase(OP_BAND) { + op_bitwise(L, l_band); + vmbreak; + } + vmcase(OP_BOR) { + op_bitwise(L, l_bor); + vmbreak; + } + vmcase(OP_BXOR) { + op_bitwise(L, l_bxor); + vmbreak; + } + vmcase(OP_SHR) { + op_bitwise(L, luaV_shiftr); + vmbreak; + } + vmcase(OP_SHL) { + op_bitwise(L, luaV_shiftl); + vmbreak; + } + vmcase(OP_MMBIN) { + StkId ra = RA(i); + Instruction pi = *(pc - 2); /* original arith. expression */ + TValue *rb = vRB(i); + TMS tm = (TMS)GETARG_C(i); + StkId result = RA(pi); + lua_assert(OP_ADD <= GET_OPCODE(pi) && GET_OPCODE(pi) <= OP_SHR); + Protect(luaT_trybinTM(L, s2v(ra), rb, result, tm)); + vmbreak; + } + vmcase(OP_MMBINI) { + StkId ra = RA(i); + Instruction pi = *(pc - 2); /* original arith. expression */ + int imm = GETARG_sB(i); + TMS tm = (TMS)GETARG_C(i); + int flip = GETARG_k(i); + StkId result = RA(pi); + Protect(luaT_trybiniTM(L, s2v(ra), imm, flip, result, tm)); + vmbreak; + } + vmcase(OP_MMBINK) { + StkId ra = RA(i); + Instruction pi = *(pc - 2); /* original arith. expression */ + TValue *imm = KB(i); + TMS tm = (TMS)GETARG_C(i); + int flip = GETARG_k(i); + StkId result = RA(pi); + Protect(luaT_trybinassocTM(L, s2v(ra), imm, flip, result, tm)); + vmbreak; + } + vmcase(OP_UNM) { + StkId ra = RA(i); + TValue *rb = vRB(i); + lua_Number nb; + if (ttisinteger(rb)) { + lua_Integer ib = ivalue(rb); + setivalue(s2v(ra), intop(-, 0, ib)); + } + else if (tonumberns(rb, nb)) { + setfltvalue(s2v(ra), luai_numunm(L, nb)); + } + else + Protect(luaT_trybinTM(L, rb, rb, ra, TM_UNM)); + vmbreak; + } + vmcase(OP_BNOT) { + StkId ra = RA(i); + TValue *rb = vRB(i); + lua_Integer ib; + if (tointegerns(rb, &ib)) { + setivalue(s2v(ra), intop(^, ~l_castS2U(0), ib)); + } + else + Protect(luaT_trybinTM(L, rb, rb, ra, TM_BNOT)); + vmbreak; + } + vmcase(OP_NOT) { + StkId ra = RA(i); + TValue *rb = vRB(i); + if (l_isfalse(rb)) + setbtvalue(s2v(ra)); + else + setbfvalue(s2v(ra)); + vmbreak; + } + vmcase(OP_LEN) { + StkId ra = RA(i); + Protect(luaV_objlen(L, ra, vRB(i))); + vmbreak; + } + vmcase(OP_CONCAT) { + StkId ra = RA(i); + int n = GETARG_B(i); /* number of elements to concatenate */ + L->top.p = ra + n; /* mark the end of concat operands */ + ProtectNT(luaV_concat(L, n)); + checkGC(L, L->top.p); /* 'luaV_concat' ensures correct top */ + vmbreak; + } + vmcase(OP_CLOSE) { + StkId ra = RA(i); + Protect(luaF_close(L, ra, LUA_OK, 1)); + vmbreak; + } + vmcase(OP_TBC) { + StkId ra = RA(i); + /* create new to-be-closed upvalue */ + halfProtect(luaF_newtbcupval(L, ra)); + vmbreak; + } + vmcase(OP_JMP) { + dojump(ci, i, 0); + vmbreak; + } + vmcase(OP_EQ) { + StkId ra = RA(i); + int cond; + TValue *rb = vRB(i); + Protect(cond = luaV_equalobj(L, s2v(ra), rb)); + docondjump(); + vmbreak; + } + vmcase(OP_LT) { + op_order(L, l_lti, LTnum, lessthanothers); + vmbreak; + } + vmcase(OP_LE) { + op_order(L, l_lei, LEnum, lessequalothers); + vmbreak; + } + vmcase(OP_EQK) { + StkId ra = RA(i); + TValue *rb = KB(i); + /* basic types do not use '__eq'; we can use raw equality */ + int cond = luaV_rawequalobj(s2v(ra), rb); + docondjump(); + vmbreak; + } + vmcase(OP_EQI) { + StkId ra = RA(i); + int cond; + int im = GETARG_sB(i); + if (ttisinteger(s2v(ra))) + cond = (ivalue(s2v(ra)) == im); + else if (ttisfloat(s2v(ra))) + cond = luai_numeq(fltvalue(s2v(ra)), cast_num(im)); + else + cond = 0; /* other types cannot be equal to a number */ + docondjump(); + vmbreak; + } + vmcase(OP_LTI) { + op_orderI(L, l_lti, luai_numlt, 0, TM_LT); + vmbreak; + } + vmcase(OP_LEI) { + op_orderI(L, l_lei, luai_numle, 0, TM_LE); + vmbreak; + } + vmcase(OP_GTI) { + op_orderI(L, l_gti, luai_numgt, 1, TM_LT); + vmbreak; + } + vmcase(OP_GEI) { + op_orderI(L, l_gei, luai_numge, 1, TM_LE); + vmbreak; + } + vmcase(OP_TEST) { + StkId ra = RA(i); + int cond = !l_isfalse(s2v(ra)); + docondjump(); + vmbreak; + } + vmcase(OP_TESTSET) { + StkId ra = RA(i); + TValue *rb = vRB(i); + if (l_isfalse(rb) == GETARG_k(i)) + pc++; + else { + setobj2s(L, ra, rb); + donextjump(ci); + } + vmbreak; + } + vmcase(OP_CALL) { + StkId ra = RA(i); + CallInfo *newci; + int b = GETARG_B(i); + int nresults = GETARG_C(i) - 1; + if (b != 0) /* fixed number of arguments? */ + L->top.p = ra + b; /* top signals number of arguments */ + /* else previous instruction set top */ + savepc(L); /* in case of errors */ + if ((newci = luaD_precall(L, ra, nresults)) == NULL) + updatetrap(ci); /* C call; nothing else to be done */ + else { /* Lua call: run function in this same C frame */ + ci = newci; + goto startfunc; + } + vmbreak; + } + vmcase(OP_TAILCALL) { + StkId ra = RA(i); + int b = GETARG_B(i); /* number of arguments + 1 (function) */ + int n; /* number of results when calling a C function */ + int nparams1 = GETARG_C(i); + /* delta is virtual 'func' - real 'func' (vararg functions) */ + int delta = (nparams1) ? ci->u.l.nextraargs + nparams1 : 0; + if (b != 0) + L->top.p = ra + b; + else /* previous instruction set top */ + b = cast_int(L->top.p - ra); + savepc(ci); /* several calls here can raise errors */ + if (TESTARG_k(i)) { + luaF_closeupval(L, base); /* close upvalues from current call */ + lua_assert(L->tbclist.p < base); /* no pending tbc variables */ + lua_assert(base == ci->func.p + 1); + } + if ((n = luaD_pretailcall(L, ci, ra, b, delta)) < 0) /* Lua function? */ + goto startfunc; /* execute the callee */ + else { /* C function? */ + ci->func.p -= delta; /* restore 'func' (if vararg) */ + luaD_poscall(L, ci, n); /* finish caller */ + updatetrap(ci); /* 'luaD_poscall' can change hooks */ + goto ret; /* caller returns after the tail call */ + } + } + vmcase(OP_RETURN) { + StkId ra = RA(i); + int n = GETARG_B(i) - 1; /* number of results */ + int nparams1 = GETARG_C(i); + if (n < 0) /* not fixed? */ + n = cast_int(L->top.p - ra); /* get what is available */ + savepc(ci); + if (TESTARG_k(i)) { /* may there be open upvalues? */ + ci->u2.nres = n; /* save number of returns */ + if (L->top.p < ci->top.p) + L->top.p = ci->top.p; + luaF_close(L, base, CLOSEKTOP, 1); + updatetrap(ci); + updatestack(ci); + } + if (nparams1) /* vararg function? */ + ci->func.p -= ci->u.l.nextraargs + nparams1; + L->top.p = ra + n; /* set call for 'luaD_poscall' */ + luaD_poscall(L, ci, n); + updatetrap(ci); /* 'luaD_poscall' can change hooks */ + goto ret; + } + vmcase(OP_RETURN0) { + if (l_unlikely(L->hookmask)) { + StkId ra = RA(i); + L->top.p = ra; + savepc(ci); + luaD_poscall(L, ci, 0); /* no hurry... */ + trap = 1; + } + else { /* do the 'poscall' here */ + int nres; + L->ci = ci->previous; /* back to caller */ + L->top.p = base - 1; + for (nres = ci->nresults; l_unlikely(nres > 0); nres--) + setnilvalue(s2v(L->top.p++)); /* all results are nil */ + } + goto ret; + } + vmcase(OP_RETURN1) { + if (l_unlikely(L->hookmask)) { + StkId ra = RA(i); + L->top.p = ra + 1; + savepc(ci); + luaD_poscall(L, ci, 1); /* no hurry... */ + trap = 1; + } + else { /* do the 'poscall' here */ + int nres = ci->nresults; + L->ci = ci->previous; /* back to caller */ + if (nres == 0) + L->top.p = base - 1; /* asked for no results */ + else { + StkId ra = RA(i); + setobjs2s(L, base - 1, ra); /* at least this result */ + L->top.p = base; + for (; l_unlikely(nres > 1); nres--) + setnilvalue(s2v(L->top.p++)); /* complete missing results */ + } + } + ret: /* return from a Lua function */ + if (ci->callstatus & CIST_FRESH) + return; /* end this frame */ + else { + ci = ci->previous; + goto returning; /* continue running caller in this frame */ + } + } + vmcase(OP_FORLOOP) { + StkId ra = RA(i); + if (ttisinteger(s2v(ra + 2))) { /* integer loop? */ + lua_Unsigned count = l_castS2U(ivalue(s2v(ra + 1))); + if (count > 0) { /* still more iterations? */ + lua_Integer step = ivalue(s2v(ra + 2)); + lua_Integer idx = ivalue(s2v(ra)); /* internal index */ + chgivalue(s2v(ra + 1), count - 1); /* update counter */ + idx = intop(+, idx, step); /* add step to index */ + chgivalue(s2v(ra), idx); /* update internal index */ + setivalue(s2v(ra + 3), idx); /* and control variable */ + pc -= GETARG_Bx(i); /* jump back */ + } + } + else if (floatforloop(ra)) /* float loop */ + pc -= GETARG_Bx(i); /* jump back */ + updatetrap(ci); /* allows a signal to break the loop */ + vmbreak; + } + vmcase(OP_FORPREP) { + StkId ra = RA(i); + savestate(L, ci); /* in case of errors */ + if (forprep(L, ra)) + pc += GETARG_Bx(i) + 1; /* skip the loop */ + vmbreak; + } + vmcase(OP_TFORPREP) { + StkId ra = RA(i); + /* create to-be-closed upvalue (if needed) */ + halfProtect(luaF_newtbcupval(L, ra + 3)); + pc += GETARG_Bx(i); + i = *(pc++); /* go to next instruction */ + lua_assert(GET_OPCODE(i) == OP_TFORCALL && ra == RA(i)); + goto l_tforcall; + } + vmcase(OP_TFORCALL) { + l_tforcall: { + StkId ra = RA(i); + /* 'ra' has the iterator function, 'ra + 1' has the state, + 'ra + 2' has the control variable, and 'ra + 3' has the + to-be-closed variable. The call will use the stack after + these values (starting at 'ra + 4') + */ + /* push function, state, and control variable */ + memcpy(ra + 4, ra, 3 * sizeof(*ra)); + L->top.p = ra + 4 + 3; + ProtectNT(luaD_call(L, ra + 4, GETARG_C(i))); /* do the call */ + updatestack(ci); /* stack may have changed */ + i = *(pc++); /* go to next instruction */ + lua_assert(GET_OPCODE(i) == OP_TFORLOOP && ra == RA(i)); + goto l_tforloop; + }} + vmcase(OP_TFORLOOP) { + l_tforloop: { + StkId ra = RA(i); + if (!ttisnil(s2v(ra + 4))) { /* continue loop? */ + setobjs2s(L, ra + 2, ra + 4); /* save control variable */ + pc -= GETARG_Bx(i); /* jump back */ + } + vmbreak; + }} + vmcase(OP_SETLIST) { + StkId ra = RA(i); + int n = GETARG_B(i); + unsigned int last = GETARG_C(i); + Table *h = hvalue(s2v(ra)); + if (n == 0) + n = cast_int(L->top.p - ra) - 1; /* get up to the top */ + else + L->top.p = ci->top.p; /* correct top in case of emergency GC */ + last += n; + if (TESTARG_k(i)) { + last += GETARG_Ax(*pc) * (MAXARG_C + 1); + pc++; + } + if (last > luaH_realasize(h)) /* needs more space? */ + luaH_resizearray(L, h, last); /* preallocate it at once */ + for (; n > 0; n--) { + TValue *val = s2v(ra + n); + setobj2t(L, &h->array[last - 1], val); + last--; + luaC_barrierback(L, obj2gco(h), val); + } + vmbreak; + } + vmcase(OP_CLOSURE) { + StkId ra = RA(i); + Proto *p = cl->p->p[GETARG_Bx(i)]; + halfProtect(pushclosure(L, p, cl->upvals, base, ra)); + checkGC(L, ra + 1); + vmbreak; + } + vmcase(OP_VARARG) { + StkId ra = RA(i); + int n = GETARG_C(i) - 1; /* required results */ + Protect(luaT_getvarargs(L, ci, ra, n)); + vmbreak; + } + vmcase(OP_VARARGPREP) { + ProtectNT(luaT_adjustvarargs(L, GETARG_A(i), ci, cl->p)); + if (l_unlikely(trap)) { /* previous "Protect" updated trap */ + luaD_hookcall(L, ci); + L->oldpc = 1; /* next opcode will be seen as a "new" line */ + } + updatebase(ci); /* function has new base after adjustment */ + vmbreak; + } + vmcase(OP_EXTRAARG) { + lua_assert(0); + vmbreak; + } + } + } +} + +/* }================================================================== */ diff --git a/vendor/lua-5.4.8/src/lvm.h b/vendor/lua-5.4.8/src/lvm.h new file mode 100644 index 0000000..dba1ad2 --- /dev/null +++ b/vendor/lua-5.4.8/src/lvm.h @@ -0,0 +1,141 @@ +/* +** $Id: lvm.h $ +** Lua virtual machine +** See Copyright Notice in lua.h +*/ + +#ifndef lvm_h +#define lvm_h + + +#include "ldo.h" +#include "lobject.h" +#include "ltm.h" + + +#if !defined(LUA_NOCVTN2S) +#define cvt2str(o) ttisnumber(o) +#else +#define cvt2str(o) 0 /* no conversion from numbers to strings */ +#endif + + +#if !defined(LUA_NOCVTS2N) +#define cvt2num(o) ttisstring(o) +#else +#define cvt2num(o) 0 /* no conversion from strings to numbers */ +#endif + + +/* +** You can define LUA_FLOORN2I if you want to convert floats to integers +** by flooring them (instead of raising an error if they are not +** integral values) +*/ +#if !defined(LUA_FLOORN2I) +#define LUA_FLOORN2I F2Ieq +#endif + + +/* +** Rounding modes for float->integer coercion + */ +typedef enum { + F2Ieq, /* no rounding; accepts only integral values */ + F2Ifloor, /* takes the floor of the number */ + F2Iceil /* takes the ceil of the number */ +} F2Imod; + + +/* convert an object to a float (including string coercion) */ +#define tonumber(o,n) \ + (ttisfloat(o) ? (*(n) = fltvalue(o), 1) : luaV_tonumber_(o,n)) + + +/* convert an object to a float (without string coercion) */ +#define tonumberns(o,n) \ + (ttisfloat(o) ? ((n) = fltvalue(o), 1) : \ + (ttisinteger(o) ? ((n) = cast_num(ivalue(o)), 1) : 0)) + + +/* convert an object to an integer (including string coercion) */ +#define tointeger(o,i) \ + (l_likely(ttisinteger(o)) ? (*(i) = ivalue(o), 1) \ + : luaV_tointeger(o,i,LUA_FLOORN2I)) + + +/* convert an object to an integer (without string coercion) */ +#define tointegerns(o,i) \ + (l_likely(ttisinteger(o)) ? (*(i) = ivalue(o), 1) \ + : luaV_tointegerns(o,i,LUA_FLOORN2I)) + + +#define intop(op,v1,v2) l_castU2S(l_castS2U(v1) op l_castS2U(v2)) + +#define luaV_rawequalobj(t1,t2) luaV_equalobj(NULL,t1,t2) + + +/* +** fast track for 'gettable': if 't' is a table and 't[k]' is present, +** return 1 with 'slot' pointing to 't[k]' (position of final result). +** Otherwise, return 0 (meaning it will have to check metamethod) +** with 'slot' pointing to an empty 't[k]' (if 't' is a table) or NULL +** (otherwise). 'f' is the raw get function to use. +*/ +#define luaV_fastget(L,t,k,slot,f) \ + (!ttistable(t) \ + ? (slot = NULL, 0) /* not a table; 'slot' is NULL and result is 0 */ \ + : (slot = f(hvalue(t), k), /* else, do raw access */ \ + !isempty(slot))) /* result not empty? */ + + +/* +** Special case of 'luaV_fastget' for integers, inlining the fast case +** of 'luaH_getint'. +*/ +#define luaV_fastgeti(L,t,k,slot) \ + (!ttistable(t) \ + ? (slot = NULL, 0) /* not a table; 'slot' is NULL and result is 0 */ \ + : (slot = (l_castS2U(k) - 1u < hvalue(t)->alimit) \ + ? &hvalue(t)->array[k - 1] : luaH_getint(hvalue(t), k), \ + !isempty(slot))) /* result not empty? */ + + +/* +** Finish a fast set operation (when fast get succeeds). In that case, +** 'slot' points to the place to put the value. +*/ +#define luaV_finishfastset(L,t,slot,v) \ + { setobj2t(L, cast(TValue *,slot), v); \ + luaC_barrierback(L, gcvalue(t), v); } + + +/* +** Shift right is the same as shift left with a negative 'y' +*/ +#define luaV_shiftr(x,y) luaV_shiftl(x,intop(-, 0, y)) + + + +LUAI_FUNC int luaV_equalobj (lua_State *L, const TValue *t1, const TValue *t2); +LUAI_FUNC int luaV_lessthan (lua_State *L, const TValue *l, const TValue *r); +LUAI_FUNC int luaV_lessequal (lua_State *L, const TValue *l, const TValue *r); +LUAI_FUNC int luaV_tonumber_ (const TValue *obj, lua_Number *n); +LUAI_FUNC int luaV_tointeger (const TValue *obj, lua_Integer *p, F2Imod mode); +LUAI_FUNC int luaV_tointegerns (const TValue *obj, lua_Integer *p, + F2Imod mode); +LUAI_FUNC int luaV_flttointeger (lua_Number n, lua_Integer *p, F2Imod mode); +LUAI_FUNC void luaV_finishget (lua_State *L, const TValue *t, TValue *key, + StkId val, const TValue *slot); +LUAI_FUNC void luaV_finishset (lua_State *L, const TValue *t, TValue *key, + TValue *val, const TValue *slot); +LUAI_FUNC void luaV_finishOp (lua_State *L); +LUAI_FUNC void luaV_execute (lua_State *L, CallInfo *ci); +LUAI_FUNC void luaV_concat (lua_State *L, int total); +LUAI_FUNC lua_Integer luaV_idiv (lua_State *L, lua_Integer x, lua_Integer y); +LUAI_FUNC lua_Integer luaV_mod (lua_State *L, lua_Integer x, lua_Integer y); +LUAI_FUNC lua_Number luaV_modf (lua_State *L, lua_Number x, lua_Number y); +LUAI_FUNC lua_Integer luaV_shiftl (lua_Integer x, lua_Integer y); +LUAI_FUNC void luaV_objlen (lua_State *L, StkId ra, const TValue *rb); + +#endif diff --git a/vendor/lua-5.4.8/src/lzio.c b/vendor/lua-5.4.8/src/lzio.c new file mode 100644 index 0000000..cd0a02d --- /dev/null +++ b/vendor/lua-5.4.8/src/lzio.c @@ -0,0 +1,68 @@ +/* +** $Id: lzio.c $ +** Buffered streams +** See Copyright Notice in lua.h +*/ + +#define lzio_c +#define LUA_CORE + +#include "lprefix.h" + + +#include <string.h> + +#include "lua.h" + +#include "llimits.h" +#include "lmem.h" +#include "lstate.h" +#include "lzio.h" + + +int luaZ_fill (ZIO *z) { + size_t size; + lua_State *L = z->L; + const char *buff; + lua_unlock(L); + buff = z->reader(L, z->data, &size); + lua_lock(L); + if (buff == NULL || size == 0) + return EOZ; + z->n = size - 1; /* discount char being returned */ + z->p = buff; + return cast_uchar(*(z->p++)); +} + + +void luaZ_init (lua_State *L, ZIO *z, lua_Reader reader, void *data) { + z->L = L; + z->reader = reader; + z->data = data; + z->n = 0; + z->p = NULL; +} + + +/* --------------------------------------------------------------- read --- */ +size_t luaZ_read (ZIO *z, void *b, size_t n) { + while (n) { + size_t m; + if (z->n == 0) { /* no bytes in buffer? */ + if (luaZ_fill(z) == EOZ) /* try to read more */ + return n; /* no more input; return number of missing bytes */ + else { + z->n++; /* luaZ_fill consumed first byte; put it back */ + z->p--; + } + } + m = (n <= z->n) ? n : z->n; /* min. between n and z->n */ + memcpy(b, z->p, m); + z->n -= m; + z->p += m; + b = (char *)b + m; + n -= m; + } + return 0; +} + diff --git a/vendor/lua-5.4.8/src/lzio.h b/vendor/lua-5.4.8/src/lzio.h new file mode 100644 index 0000000..38f397f --- /dev/null +++ b/vendor/lua-5.4.8/src/lzio.h @@ -0,0 +1,66 @@ +/* +** $Id: lzio.h $ +** Buffered streams +** See Copyright Notice in lua.h +*/ + + +#ifndef lzio_h +#define lzio_h + +#include "lua.h" + +#include "lmem.h" + + +#define EOZ (-1) /* end of stream */ + +typedef struct Zio ZIO; + +#define zgetc(z) (((z)->n--)>0 ? cast_uchar(*(z)->p++) : luaZ_fill(z)) + + +typedef struct Mbuffer { + char *buffer; + size_t n; + size_t buffsize; +} Mbuffer; + +#define luaZ_initbuffer(L, buff) ((buff)->buffer = NULL, (buff)->buffsize = 0) + +#define luaZ_buffer(buff) ((buff)->buffer) +#define luaZ_sizebuffer(buff) ((buff)->buffsize) +#define luaZ_bufflen(buff) ((buff)->n) + +#define luaZ_buffremove(buff,i) ((buff)->n -= (i)) +#define luaZ_resetbuffer(buff) ((buff)->n = 0) + + +#define luaZ_resizebuffer(L, buff, size) \ + ((buff)->buffer = luaM_reallocvchar(L, (buff)->buffer, \ + (buff)->buffsize, size), \ + (buff)->buffsize = size) + +#define luaZ_freebuffer(L, buff) luaZ_resizebuffer(L, buff, 0) + + +LUAI_FUNC void luaZ_init (lua_State *L, ZIO *z, lua_Reader reader, + void *data); +LUAI_FUNC size_t luaZ_read (ZIO* z, void *b, size_t n); /* read next n bytes */ + + + +/* --------- Private Part ------------------ */ + +struct Zio { + size_t n; /* bytes still unread */ + const char *p; /* current position in buffer */ + lua_Reader reader; /* reader function */ + void *data; /* additional data */ + lua_State *L; /* Lua state (for reader) */ +}; + + +LUAI_FUNC int luaZ_fill (ZIO *z); + +#endif diff --git a/vendor/raylib-5.5_linux_amd64/CHANGELOG b/vendor/raylib-5.5_linux_amd64/CHANGELOG new file mode 100644 index 0000000..61e12a3 --- /dev/null +++ b/vendor/raylib-5.5_linux_amd64/CHANGELOG @@ -0,0 +1,2599 @@ +changelog +--------- + +Current Release: raylib 5.5 (18 November 2024) + +------------------------------------------------------------------------- +Release: raylib 5.5 (18 November 2024) +------------------------------------------------------------------------- +KEY CHANGES: + - New tool: raylib project creator + - New rcore backends: RGFW and SDL3 + - New platforms supported: Dreamcast, N64, PSP, PSVita, PS4 + - Added GPU Skinning support (all platforms and GL versions) + - Added raymath C++ operators + +Detailed changes: + +WIP: Last update with commit from 02-Nov-2024 + +[rcore] ADDED: Working directory info at initialization by @Ray +[rcore] ADDED: `GetClipboardImage()`, supported by multiple backends (#4459) by @evertonse +[rcore] ADDED: `MakeDirectory()`, supporting recursive directory creation by @Ray +[rcore] ADDED: `ComputeSHA1()` (#4390) by @Anthony Carbajal +[rcore] ADDED: `ComputeCRC32()` and `ComputeMD5()` by @Ray +[rcore] ADDED: `GetKeyName()` (#4161) by @MrScautHD +[rcore] ADDED: `IsFileNameValid()` by @Ray +[rcore] ADDED: `GetViewRay()`, viewport independent raycast (#3709) by @Luís Almeida +[rcore] RENAMED: `GetMouseRay()` to `GetScreenToWorldRay()` (#3830) by @Ray +[rcore] RENAMED: `GetViewRay()` to `GetScreenToWorldRayEx()` (#3830) by @Ray +[rcore] REVIEWED: `GetApplicationDirectory()` for FreeBSD (#4318) by @base +[rcore] REVIEWED: `LoadDirectoryFilesEx()`/`ScanDirectoryFiles()`, support directory on filter (#4302) by @foxblock +[rcore] REVIEWED: Update comments on fullscreen and boderless window to describe what they do (#4280) by @Jeffery Myers +[rcore] REVIEWED: Correct processing of mouse wheel on Automation events #4263 by @Ray +[rcore] REVIEWED: Fix gamepad axis movement and its automation event recording (#4184) by @maxmutant +[rcore] REVIEWED: Do not set RL_TEXTURE_FILTER_LINEAR when high dpi flag is enabled (#4189) by @Dave Green +[rcore] REVIEWED: `GetScreenWidth()`/`GetScreenHeight()` (#4074) by @Anthony Carbajal +[rcore] REVIEWED: Initial window dimensions checks (#3950) by @Christian Haas +[rcore] REVIEWED: Set default init values for random #3954 by @Ray +[rcore] REVIEWED: Window positioning, avoid out-of-screen window-bar by @Ray +[rcore] REVIEWED: Fix framerate recording for .gif (#3894) by @Rob Loach +[rcore] REVIEWED: Screen space related functions consistency (#3830) by @aiafrasinei +[rcore] REVIEWED: `GetFileNameWithoutExt()` (#3771) by @oblerion +[rcore] REVIEWED: `GetWindowScaleDPI()`, simplified (#3701) by @Karl Zylinski +[rcore] REVIEWED: `UnloadAutomationEventList()` (#3658) by @Antonis Geralis +[rcore] REVIEWED: Flip VR screens (#3633) by @Matthew Oros +[rcore] REVIEWED: Remove unused vScreenCenter (#3632) by @Matthew Oros +[rcore] REVIEWED: `LoadRandomSequence()`, issue in sequence generation #3612 by @Ray +[rcore] REVIEWED: `IsMouseButtonUp()` (#3609) by @Kenneth M +[rcore] REVIEWED: Fix typos in src/platforms/rcore_*.c (#3581) by @RadsammyT +[rcore] REVIEWED: `ExportDataAsCode()`, change sanitization check (#3837) by @Laurentino Luna +[rcore] REVIEWED: `ExportDataAsCode()`, add little sanitization to indentifier names (#3832) by @4rk +[rcore] REVIEWED: `GetScreenWidth()`/`GetScreenHeight()` align with all platforms (#4451) by @Arche Washi +[rcore] REVIEWED: `SetGamepadVibration()`, added duration parameter (#4410) by @Asdqwe -WARNING- +[rcore] REVIEWED: `GetGamepadAxisMovement()`, fix #4405 (#4420) by @Asdqwe +[rcore] REVIEWED: `GetGestureHoldDuration()` comments by @Ray +[rcore][rlgl] REVIEWED: Fix scale issues when ending a view mode (#3746) by @Jeffery Myers +[rcore][GLFW] REVIEWED: Keep CORE.Window.position properly in sync with glfw window position (#4190) by @Dave Green +[rcore][GLFW] REVIEWED: Set AUTO_ICONIFY flag to false per default (#4188) by @Dave Green +[rcore][GLFW] REVIEWED: `InitPlatform()`, add workaround for NetBSD (#4139) by @NishiOwO +[rcore][GLFW] REVIEWED: Fix window not initializing on primary monitor (#3923) by @Rafael Bordoni +[rcore][GLFW] REVIEWED: Set relative mouse mode when the cursor is disabled (#3874) by @Jeffery Myers +[rcore][GLFW] REVIEWED: Remove GLFW mouse passthrough hack and increase GLFW version in CMake (#3852) by @Alexandre Almeida +[rcore][GLFW] REVIEWED: Updated GLFW to 3.4 (#3827) by @Alexandre Almeida +[rcore][GLFW] REVIEWED: Feature test macros before include (#3737) by @John +[rcore][GLFW] REVIEWED: Fix inconsistent dll linkage warning on windows (#4447) by @Jeffery Myers +[rcore][Web] ADDED: `SetWindowOpacity()` implementation (#4403) by @Asdqwe +[rcore][Web] ADDED: `MaximizeWindow()` and `RestoreWindow()` implementations (#4397) by @Asdqwe +[rcore][Web] ADDED: `ToggleFullscreen()` implementation (#3634) by @ubkp +[rcore][Web] ADDED: `GetWindowPosition()` implementation (#3637) by @ubkp +[rcore][Web] ADDED: `ToggleBorderlessWindowed()` implementation (#3622) by @ubkp +[rcore][Web] ADDED: `GetMonitorWidth()` and `GetMonitorHeight()` implementations (#3636) by @ubkp +[rcore][Web] REVIEWED: Update `SetWindowState()` and `ClearWindowState()` to handle `FLAG_WINDOW_MAXIMIZED` (#4402) by @Asdqwe +[rcore][Web] REVIEWED: `WindowSizeCallback()`, do not try to handle DPI, already managed by GLFW (#4143) by @SuperUserNameMan +[rcore][Web] REVIEWED: Relative mouse mode issues (#3940) by @Cemal Gönültaş +[rcore][Web] REVIEWED: `ShowCursor()`, `HideCursor()` and `SetMouseCursor()` (#3647) by @ubkp +[rcore][Web] REVIEWED: Fix CORE.Input.Mouse.cursorHidden with callbacks (#3644) by @ubkp +[rcore][Web] REVIEWED: Fix `IsMouseButtonUp()` (#3611) by @ubkp +[rcore][Web] REVIEWED: HighDPI support #3372 by @Ray +[rcore][Web] REVIEWED: `SetWindowSize()` (#4452) by @Asdqwe +[rcore][Web] REVIEWED: `EmscriptenResizeCallback()`, simplified (#4415) by @Asdqwe +[rcore][SDL] ADDED: `IsCursorOnScreen()` (#3862) by @Peter0x44 +[rcore][SDL] ADDED: Gamepad rumble/vibration support (#3819) by @GideonSerf +[rcore][SDL] REVIEWED: Gamepad support (#3776) by @A +[rcore][SDL] REVIEWED: `GetWorkingDirectory()`, return correct path (#4392) by @Asdqwe +[rcore][SDL] REVIEWED: `GetClipboardText()`, fix memory leak (#4354) by @Asdqwe +[rcore][SDL] REVIEWED: Change SDL_Joystick to SDL_GameController (#4129) by @Frank Kartheuser +[rcore][SDL] REVIEWED: Update storage base path, use provided SDL base path by @Ray +[rcore][SDL] REVIEWED: Call SDL_GL_SetSwapInterval() after GL context creation (#3997) by @JupiterRider +[rcore][SDL] REVIEWED: `GetKeyPressed()` (#3869) by @Arthur +[rcore][SDL] REVIEWED: Fix SDL multitouch tracking (#3810) by @mooff +[rcore][SDL] REVIEWED: Fix `SUPPORT_WINMM_HIGHRES_TIMER` (#3679) by @ubkp +[rcore][SDL] REVIEWED: SDL text input to Unicode codepoints #3650 by @Ray +[rcore][SDL] REVIEWED: `IsMouseButtonUp()` and add touch events (#3610) by @ubkp +[rcore][SDL] REVIEWED: Fix real touch gestures (#3614) by @ubkp +[rcore][SDL] REVIEWED: `IsKeyPressedRepeat()` (#3605) by @ubkp +[rcore][SDL] REVIEWED: `GetKeyPressed()` and `GetCharPressed()` for SDL (#3604) by @ubkp +[rcore][SDL] REVIEWED: `SetMousePosition()` for SDL (#3580) by @ubkp +[rcore][SDL] REVIEWED: `SetWindowIcon()` for SDL (#3578) by @ubkp +[rcore][SDL][rlgl] REVIEWED: Fix for running gles2 with SDL on desktop (#3542) by @_Tradam +[rcore][Android] REVIEWED: Issue with isGpuReady flag (#4340) by @Menno van der Graaf +[rcore][Android] REVIEWED: Allow main() to return it its caller on configuration changes (#4288) by @Hesham Abourgheba +[rcore][Android] REVIEWED: Replace deprecated Android function ALooper_pollAll with ALooper_pollOnce (#4275) by @Menno van der Graaf +[rcore][Android] REVIEWED: `PollInputEvents()`, register previous gamepad events (#3910) by @Aria +[rcore][Android] REVIEWED: Fix Android keycode translation and duplicate key constants (#3733) by @Alexandre Almeida +[rcore][DRM] ADDED: uConsole keys mapping (#4297) by @carverdamien +[rcore][DRM] ADDED: `GetMonitorWidth/Height()` (#3956) by @gabriel-marques +[rcore][DRM] REVIEWED: `IsMouseButtonUp()` (#3611) by @ubkp +[rcore][DRM] REVIEWED: Optimize gesture handling (#3616) by @ubkp +[rcore][DRM] REVIEWED: `IsKeyPressedRepeat()` for PLATFORM_DRM direct input (#3583) by @ubkp +[rcore][DRM] REVIEWED: Fix gamepad buttons not working in drm backend (#3888) by @MrMugame +[rcore][DRM] REVIEWED: DRM backend to only use one api to allow for more devices (#3879) by @MrMugame +[rcore][DRM] REVIEWED: Avoid separate thread when polling for gamepad events (#3641) by @Cinghy Creations +[rcore][DRM] REVIEWED: Connector status reported as UNKNOWN but should be considered as CONNECTED (#4305) by @Michał Jaskólski +[rcore][RGFW] ADDED: RGFW, new rcore backend platform (#3941) by @Colleague Riley +[rcore][RGFW] REVIEWED: RGFW 1.0 (#4144) by @Colleague Riley +[rcore][RGFW] REVIEWED: Fix errors when compiling with mingw (#4282) by @Colleague Riley +[rcore][RGFW] REVIEWED: Replace long switch with a lookup table (#4108) by @Colleague Riley +[rcore][RGFW] REVIEWED: Fix MSVC build errors (#4441) by @Colleague Riley +[rlgl] ADDED: More uniform data type options #4137 by @Ray +[rlgl] ADDED: Vertex normals for RLGL immediate drawing mode (#3866) by @bohonghuang -WARNING- +[rlgl] ADDED: `rlCullDistance*()` variables and getters (#3912) by @KotzaBoss +[rlgl] ADDED: `rlSetClipPlanes()` function (#3912) by @KotzaBoss +[rlgl] ADDED: `isGpuReady` flag, allow font loading with no GPU acceleration by @Ray -WARNING- +[rlgl] REVIEWED: Changed RLGL_VERSION from 4.5 to 5.0 (#3914) by @Mute +[rlgl] REVIEWED: Shader load failing returns 0, instead of fallback by @Ray -WARNING- +[rlgl] REVIEWED: Standalone mode default flags (#4334) by @Asdqwe +[rlgl] REVIEWED: Fix hardcoded index values in vboID array (#4312) by @Jett +[rlgl] REVIEWED: GLint64 did not exist before OpenGL 3.2 (#4284) by @Tchan0 +[rlgl] REVIEWED: Extra warnings in case OpenGL 4.3 is not enabled (#4202) by @Maxim Knyazkin +[rlgl] REVIEWED: Using GLint64 for glGetBufferParameteri64v() (#4197) by @Randy Palamar +[rlgl] REVIEWED: Replace `glGetInteger64v()` with `glGetBufferParameteri64v()` (#4154) by @Kai Kitagawa-Jones +[rlgl] REVIEWED: `rlMultMatrixf()`, fix matrix multiplication order (#3935) by @bohonghuang +[rlgl] REVIEWED: `rlSetVertexAttribute()`, define last parameter as offset #3800 by @Ray +[rlgl] REVIEWED: `rlDisableVertexAttribute()`, remove redundat calls for SHADER_LOC_VERTEX_COLOR (#3871) by @Kacper Zybała +[rlgl] REVIEWED: `rlLoadTextureCubemap()`, load mipmaps for cubemaps (#4429) by @Nikolas +[rlgl] REVIEWED: `rlLoadFramebuffer()`, parameters not required by @Ray +[rlgl] REVIEWED: `rlSetUniformSampler()` (#3759) by @veins1 +[rlgl] REVIEWED: Renamed near/far variables (#4039) by @jgabaut +[rlgl] REVIEWED: Expose OpenGL symbols (#3588) by @Peter0x44 +[rlgl] REVIEWED: Fix OpenGL 1.1 build issues (#3876) by @Ray +[rlgl] REVIEWED: Fixed compilation for OpenGL ES (#4243) by @Maxim Knyazkin +[rlgl] REVIEWED: rlgl function description and comments by @Ray +[rlgl] REVIEWED: Expose glad functions when building raylib as a shared lib (#3572) by @Peter0x44 +[rlgl] REVIEWED: Fix version info in rlgl.h (#3558) by @Steven Schveighoffer +[rlgl] REVIEWED: Use the vertex color to the base shader in GLSL330 (#4431) by @Jeffery Myers +[rcamera] REVIEWED: Make camera movement independant of framerate (#4247) by @hanaxars -WARNING- +[rcamera] REVIEWED: Updated camera speeds with GetFrameTime() (#4362) by @Anthony Carbajal +[rcamera] REVIEWED: `UpdateCamera()`, added CAMERA_CUSTOM check (#3938) by @Tomas Fabrizio Orsi +[rcamera] REVIEWED: Support mouse/keyboard and gamepad coexistence for input (#3579) by @ubkp +[rcamera] REVIEWED: Cleaned away unused macros(#3762) by @Brian E +[rcamera] REVIEWED: Fix for free camera mode (#3603) by @lesleyrs +[rcamera] REVIEWED: `GetCameraRight()` (#3784) by @Danil +[raymath] ADDED: C++ operator overloads for common math function (#4385) by @Jeffery Myers -WARNING- +[raymath] ADDED: Vector4 math functions and Vector2 variants of some Vector3 functions (#3828) by @Bowserinator +[raymath] REVIEWED: Fix MSVC warnings/errors in C++ (#4125) by @Jeffery Myers +[raymath] REVIEWED: Add extern "C" to raymath header for C++ (#3978) by @Jeffery Myers +[raymath] REVIEWED: `QuaternionFromAxisAngle()`, remove redundant axis length calculation (#3900) by @jtainer +[raymath] REVIEWED: `Vector3Perpendicular()`, avoid implicit conversion from float to double (#3799) by @João Foscarini +[raymath] REVIEWED: `MatrixDecompose()`, incorrect output for certain scale and rotations (#4461) by @waveydave +[raymath] REVIEWED: Small code refactor (#3753) by @Idir Carlos Aliane +[rshapes] ADDED: `CheckCollisionCircleLine()` (#4018) by @kai-z99 +[rshapes] REVIEWED: Multisegment Bezier splines (#3744) by @Santiago Pelufo +[rshapes] REVIEWED: Expose shapes drawing texture and rectangle (#3677) by @Jeffery Myers +[rshapes] REVIEWED: `DrawLine()` #4075 by @Ray +[rshapes] REVIEWED: `DrawPixel()` drawing by @Ray +[rshapes] REVIEWED: `DrawLine()` to avoid pixel rounding issues #3931 by @Ray +[rshapes] REVIEWED: `DrawRectangleLines()`, considering view matrix for lines "alignment" by @Ray +[rshapes] REVIEWED: `DrawRectangleLines()`, pixel offset (#4261) by @RadsammyT +[rshapes] REVIEWED: `DrawRectangleLines()`, pixel offset when scaling (#3884) by @Ray +[rshapes] REVIEWED: `DrawRectangleLinesEx()`, make sure accounts for square tiles (#4382) by @Jojaby +[rshapes] REVIEWED: `Draw*Gradient()` color parameter names (#4270) by @Paperdomo101 +[rshapes] REVIEWED: `DrawGrid()`, remove duplicate color calls (#4148) by @Jeffery Myers +[rshapes] REVIEWED: `DrawSplineLinear()` to `SUPPORT_SPLINE_MITERS` by @Ray +[rshapes] REVIEWED: `DrawSplineLinear()`, implement miters (#3585) by @Toctave +[rshapes] REVIEWED: `CheckCollisionPointRec()` by @Ray +[rshapes] REVIEWED: `CheckCollisionPointCircle()`, new implementation (#4135) by @kai-z99 +[rshapes] REVIEWED: `CheckCollisionCircles()`, optimized (#4065) by @kai-z99 +[rshapes] REVIEWED: `CheckCollisionPointPoly()` (#3750) by @Antonio Raúl +[rshapes] REVIEWED: `CheckCollisionCircleRec()` (#3584) by @ubkp +[rshapes] REVIEWED: Add more detail to function comment (#4344) by @Jeffery Myers +[rshapes] REVIEWED: Functions that draw point arrays take them as const (#4051) by @Jeffery Myers +[rtextures] ADDED: `ColorIsEqual()` by @Ray +[rtextures] ADDED: `ColorLerp()`, to mix 2 colors together (#4310) by @SusgUY446 +[rtextures] ADDED: `LoadImageAnimFromMemory()` (#3681) by @IoIxD +[rtextures] ADDED: `ImageKernelConvolution()` (#3528) by @Karim +[rtextures] ADDED: `ImageFromChannel()` (#4105) by @Bruno Cabral +[rtextures] ADDED: `ImageDrawLineEx()` (#4097) by @Le Juez Victor +[rtextures] ADDED: `ImageDrawTriangle()` (#4094) by @Le Juez Victor +[rtextures] REMOVED: SVG files loading and drawing, moving it to raylib-extras by @Ray -WARNING- +[rtextures] REVIEWED: `LoadImage()`, added support for 3-channel QOI images (#4384) by @R-YaTian +[rtextures] REVIEWED: `LoadImageRaw()` #3926 by @Ray +[rtextures] REVIEWED: `LoadImageColors()`, advance k in loop (#4120) by @Bruno Cabral +[rtextures] REVIEWED: `LoadTextureCubemap()`, added `mipmaps` #3665 by @Ray +[rtextures] REVIEWED: `LoadTextureCubemap()`, assign format to cubemap (#3823) by @Gary M +[rtextures] REVIEWED: `LoadTextureCubemap()`, load mipmaps for cubemaps (#4429) by @Nikolas +[rtextures] REVIEWED: `LoadTextureCubemap()`, avoid dangling re-allocated pointers (#4439) by @Nikolas +[rtextures] REVIEWED: `LoadImageFromScreen()`, fix scaling (#3881) by @proberge-dev +[rtextures] REVIEWED: `LoadImageFromMemory()`, warnings on invalid image data (#4179) by @Jutastre +[rtextures] REVIEWED: `LoadImageAnimFromMemory()`, added security checks (#3924) by @Ray +[rtextures] REVIEWED: `ImageColorTint()` and `ColorTint()`, optimized (#4015) by @Le Juez Victor +[rtextures] REVIEWED: `ImageKernelConvolution()`, formating and warnings by @Ray +[rtextures] REVIEWED: `ImageDrawRectangleRec`, fix bounds check (#3732) by @Blockguy24 +[rtextures] REVIEWED: `ImageResizeCanvas()`, implemented fill color (#3720) by @Lieven Petersen +[rtextures] REVIEWED: `ImageDrawRectangleRec()` (#3721) by @Le Juez Victor +[rtextures] REVIEWED: `ImageDraw()`, don't try to blend images without alpha (#4395) by @Nikolas +[rtextures] REVIEWED: `GenImagePerlinNoise()` being stretched (#4276) by @Bugsia +[rtextures] REVIEWED: `GenImageGradientLinear()`, fix some angles (#4462) by @decromo +[rtextures] REVIEWED: `DrawTexturePro()` to avoid negative dest rec #4316 by @Ray +[rtextures] REVIEWED: `ColorToInt()`, fix undefined behaviour (#3996) by @OetkenPurveyorOfCode +[rtextures] REVIEWED: Remove panorama cubemap layout option (#4425) by @Jeffery Myers +[rtextures] REVIEWED: Removed unneeded module check, `rtextures` should not depend on `rtext` by @Ray +[rtextures] REVIEWED: Simplified for loop for some image manipulation functions (#3712) by @Alice Nyaa +[rtext] ADDED: BDF fonts support (#3735) by @Stanley Fuller -WARNING- +[rtext] ADDED: `TextToCamel()` (#4033) by @IoIxD +[rtext] ADDED: `TextToSnake()` (#4033) by @IoIxD +[rtext] ADDED: `TextToFloat()` (#3627) by @Benjamin Schmid Ties +[rtext] REDESIGNED: `SetTextLineSpacing()` by @Ray -WARNING- +[rtext] REVIEWED: `LoadFontDataBDF()` name and formating by @Ray +[rtext] REVIEWED: `LoadFontDefault()`, initialize glyphs and recs to zero #4319 by @Ray +[rtext] REVIEWED: `LoadFontEx()`, avoid default font fallback (#4077) by @Peter0x44 -WARNING- +[rtext] REVIEWED: `LoadBMFont()`, extended functionality (#3536) by @Dongkun Lee +[rtext] REVIEWED: `LoadBMFont()`, issue on not glyph data initialized by @Ray +[rtext] REVIEWED: `LoadFontFromMemory()`, use strncpy() to fix buffer overflow (#3795) by @Mingjie Shen +[rtext] REVIEWED: `LoadCodepoints()` returning a freed ptr when count is 0 (#4089) by @Alice Nyaa +[rtext] REVIEWED: `LoadFontData()` avoid fallback glyphs by @Ray -WARNING- +[rtext] REVIEWED: `LoadFontData()`, load image only if glyph has been found in font by @Ray +[rtext] REVIEWED: `ExportFontAsCode()`, fix C++ compiler errors (#4013) by @DarkAssassin23 +[rtext] REVIEWED: `MeasureTextEx()` height calculation (#3770) by @Marrony Neris +[rtext] REVIEWED: `MeasureTextEx()`, additional check for empty input string (#4448) by @mpv-enjoyer +[rtext] REVIEWED: `CodepointToUTF8()`, clean static buffer #4379 by @Ray +[rtext] REVIEWED: `TextToFloat()`, always multiply by sign (#4273) by @listeria +[rtext] REVIEWED: `TextReplace()` const correctness (#3678) by @maverikou +[rtext] REVIEWED: `TextToFloat()`, coding style (#3627) by @Benjamin Schmid Ties +[rtext] REVIEWED: Some comments to align to style (#3756) by @Idir Carlos Aliane +[rtext] REVIEWED: Adjust font atlas area calculation so padding area is not underestimated at small font sizes (#3719) by @Tim Romero +[rmodels] ADDED: GPU skinning support for models animations (#4321) by @Daniel Holden -WARNING- +[rmodels] ADDED: Support 16-bit unsigned short vec4 format for gltf joint loading (#3821) by @Gary M +[rmodels] ADDED: Support animation names for the m3d model format (#3714) by @kolunmi +[rmodels] ADDED: `DrawModelPoints()`, more performant point cloud rendering (#4203) by @Reese Gallagher +[rmodels] ADDED: `ExportMeshAsCode()` by @Ray +[rmodels] REVIEWED: Multiple updates to gltf loading, improved macro (#4373) by @Harald Scheirich +[rmodels] REVIEWED: `LoadOBJ()`, correctly split obj meshes by material (#4285) by @Jeffery Myers +[rmodels] REVIEWED: `LoadOBJ()`, add warning when loading an OBJ with multiple materials (#4271) by @Jeffery Myers +[rmodels] REVIEWED: `LoadOBJ()`, fix bug that fragmented the loaded meshes (#4494) by @Eike Decker +[rmodels] REVIEWED: `LoadIQM()`, set model.meshMaterial[] (#4092) by @SuperUserNameMan +[rmodels] REVIEWED: `LoadIQM()`, attempt to load texture from IQM at loadtime (#4029) by @Jett +[rmodels] REVIEWED: `LoadM3D(), fix vertex colors for m3d files (#3859) by @Jeffery Myers +[rmodels] REVIEWED: `LoadGLTF()`, supporting additional vertex data formats (#3546) by @MrScautHD +[rmodels] REVIEWED: `LoadGLTF()`, correctly handle the node hierarchy in a glTF file (#4037) by @Paul Melis +[rmodels] REVIEWED: `LoadGLTF()`, replaced SQUAD quat interpolation with cubic hermite (gltf 2.0 specs) (#3920) by @Benji +[rmodels] REVIEWED: `LoadGLTF()`, support 2nd texture coordinates loading by @Ray +[rmodels] REVIEWED: `LoadGLTF()`, support additional vertex attributes data formats #3890 by @Ray +[rmodels] REVIEWED: `LoadGLTF()`, set cgltf callbacks to use `LoadFileData()` and `UnloadFileData()` (#3652) by @kolunmi +[rmodels] REVIEWED: `LoadGLTF()`, JOINTS loading #3836 by @Ray +[rmodels] REVIEWED: `LoadImageFromCgltfImage()`, fix base64 padding support (#4112) by @SuperUserNameMan +[rmodels] REVIEWED: `LoadModelAnimationsIQM()`, fix corrupted animation names (#4026) by @Jett +[rmodels] REVIEWED: `LoadModelAnimationsGLTF()`, load animations with 1 frame (#3804) by @Nikita Blizniuk +[rmodels] REVIEWED: `LoadModelAnimationsGLTF()`, added missing interpolation types (#3919) by @Benji +[rmodels] REVIEWED: `LoadModelAnimationsGLTF()` (#4107) by @VitoTringolo +[rmodels] REVIEWED: `LoadBoneInfoGLTF()`, add check for animation name being NULL (#4053) by @VitoTringolo +[rmodels] REVIEWED: `GenMeshSphere()`, fix artifacts (#4460) by @MikiZX1 +[rmodels] REVIEWED: `GenMeshTangents()`, read uninitialized values, fix bounding case (#4066) by @kai-z99 +[rmodels] REVIEWED: `GenMeshTangents()`, fixed out of bounds error (#3990) by @Salvador Galindo +[rmodels] REVIEWED: `UpdateModelAnimation()`, performance speedup (#4470) by @JettMonstersGoBoom +[rmodels] REVIEWED: `DrawCylinder()`, fix drawing due to imprecise angle (#4034) by @Paul Melis +[rmodels] REVIEWED: `DrawCylinder()`, fix drawing of cap (#4478) by @JeffM2501 +[rmodels] REVIEWED: `DrawMesh()`, send full matModel to shader in DrawMesh (#4005) (#4022) by @David Holland +[rmodels] REVIEWED: `DrawMesh()`, fix material specular map retrieval (#3758) by @Victor Gallet +[rmodels] REVIEWED: `DrawModelEx()`, simplified multiplication of colors (#4002) by @Le Juez Victor +[rmodels] REVIEWED: `DrawBillboardPro()`, to be consistend with `DrawTexturePro()` (#4132) by @bohonghuang +[rmodels] REVIEWED: `DrawSphereEx()` optimization (#4106) by @smalltimewizard +[raudio] REVIEWED: `LoadMusicStreamFromMemory()`, support 24-bit FLACs (#4279) by @konstruktor227 +[raudio] REVIEWED: `LoadWaveSamples()`, fix mapping of wave data (#4062) by @listeria +[raudio] REVIEWED: `LoadMusicStream()`, remove drwav_uninit() (#3986) by @FishingHacks +[raudio] REVIEWED: `LoadMusicStream()` qoa and wav loading (#3966) by @veins1 +[raudio] REVIEWED: `ExportWaveAsCode()`, segfault (#3769) by @IoIxD +[raudio] REVIEWED: `WaveCrop()`, fix issues and use frames instead of samples (#3994) by @listeria +[raudio] REVIEWED: Crash from multithreading issues (#3907) by @Christian Haas +[raudio] REVIEWED: Reset music.ctxType if loading wasn't succesful (#3917) by @veins1 +[raudio] REVIEWED: Added missing functions in "standalone" mode (#3760) by @Alessandro Nikolaev +[raudio] REVIEWED: Disable unused miniaudio features (#3544) by @Alexandre Almeida +[raudio] REVIEWED: Fix crash when switching playback device at runtime (#4102) by @jkaup +[raudio] REVIEWED: Support 24 bits samples for FLAC format (#4058) by @Alexey Kutepov +[examples] ADDED: `core_random_sequence` (#3846) by @Dalton Overmyer +[examples] ADDED: `core_input_virtual_controls` (#4342) by @oblerion +[examples] ADDED: `shapes_rectangle_advanced `, implementing `DrawRectangleRoundedGradientH()` (#4435) by @Everton Jr. +[examples] ADDED: `models_bone_socket` (#3833) by @iP +[examples] ADDED: `shaders_vertex_displacement` (#4186) by @Alex ZH +[examples] ADDED: `shaders_shadowmap` (#3653) by @TheManTheMythTheGameDev +[examples] REVIEWED: `core_2d_camera_platformer` by @Ray +[examples] REVIEWED: `core_2d_camera_mouse_zoom`, use logarithmic scaling for a 2d zoom functionality (#3977) by @Mike Will +[examples] REVIEWED: `core_input_gamepad_info`, all buttons displayed within the window (#4241) by @Asdqwe +[examples] REVIEWED: `core_input_gamepad_info`, show ps3 controller (#4040) by @Konrad Gutvik Grande +[examples] REVIEWED: `core_input_gamepad`, add drawing for generic gamepad (#4424) by @Asdqwe +[examples] REVIEWED: `core_input_gamepad`, add deadzone handling (#4422) by @Asdqwe +[examples] REVIEWED: `shapes_bouncing_ball` (#4226) by @Anthony Carbajal +[examples] REVIEWED: `shapes_following_eyes` (#3710) by @Hongyu Ouyang +[examples] REVIEWED: `shapes_draw_rectangle_rounded` by @Ray +[examples] REVIEWED: `shapes_draw_ring`, fix other examples (#4211) by @kai-z99 +[examples] REVIEWED: `shapes_lines_bezier` by @Ray +[examples] REVIEWED: `textures_image_kernel` #3556 by @Ray +[examples] REVIEWED: `text_input_box` (#4229) by @Anthony Carbajal +[examples] REVIEWED: `text_writing_anim` (#4230) by @Anthony Carbajal +[examples] REVIEWED: `models_billboard` by @Ray +[examples] REVIEWED: `models_cubicmap` by @Ray +[examples] REVIEWED: `models_point_rendering` by @Ray +[examples] REVIEWED: `models_box_collisions` (#4224) by @Anthony Carbajal +[examples] REVIEWED: `models_skybox`, do not use HDR by default (#4115) by @Jeffery Myers +[examples] REVIEWED: `shaders_basic_pbr` (#4225) by @Anthony Carbajal +[examples] REVIEWED: `shaders_palette_switch` by @Ray +[examples] REVIEWED: `shaders_hybrid_render` (#3908) by @Yousif +[examples] REVIEWED: `shaders_lighting_instancing`, fix vertex shader (#4056) by @Karl Zylinski +[examples] REVIEWED: `shaders_raymarching`, add `raymarching.fs` for GLSL120 (#4183) by @CDM15y +[examples] REVIEWED: `shaders_shadowmap`, fix shaders for GLSL 1.20 (#4167) by @CDM15y +[examples] REVIEWED: `shaders_deferred_render` (#3655) by @Jett +[examples] REVIEWED: `shaders_basic_pbr` (#3621) by @devdad +[examples] REVIEWED: `shaders_basic_pbr`, remove dependencies (#3649) by @TheManTheMythTheGameDev +[examples] REVIEWED: `shaders_basic_pbr`, added more comments by @Ray +[examples] REVIEWED: `shaders_gpu_skinning`, to work with OpenGL ES 2.0 #4412 by @Ray +[examples] REVIEWED: `shaders_model_shader`, use free camera (#4428) by @IcyLeave6109 +[examples] REVIEWED: `audio_stream_effects` (#3618) by @lipx +[examples] REVIEWED: `audio_raw_stream` (#3624) by @riadbettole +[examples] REVIEWED: `audio_mixed_processor` (#4214) by @Anthony Carbajal +[examples] REVIEWED: `raylib_opengl_interop`, fix building on PLATFORM_DESKTOP_SDL (#3826) by @Peter0x44 +[examples] REVIEWED: Update examples missing UnloadTexture() calls (#4234) by @Anthony Carbajal +[examples] REVIEWED: Added GLSL 100 and 120 shaders to lightmap example (#3543) by @Jussi Viitala +[examples] REVIEWED: Set FPS to always 60 in all exampels (#4235) by @Anthony Carbajal +[build] REVIEWED: Makefile by @Ray +[build] REVIEWED: Makefile, fix wrong flag #3593 by @Ray +[build] REVIEWED: Makefile, disable wayland by default (#4369) by @Anthony Carbajal +[build] REVIEWED: Makefile, VSCode, fix to support multiple .c files (#4391) by @Alan Arrecis +[build] REVIEWED: Makefile, fix -Wstringop-truncation warning (#4096) by @Peter0x44 +[build] REVIEWED: Makefile, fix issues for RGFW on Linux/macOS (#3969) by @Colleague Riley +[build] REVIEWED: Makefile, update RAYLIB_VERSION (#3901) by @Belllg +[build] REVIEWED: Makefile, use mingw32-make for Windows (#4436) by @Asdqwe +[build] REVIEWED: Makefile, move CUSTOM_CFLAGS for better visibility (#4054) by @Lázaro Albuquerque +[build] REVIEWED: Makefile, update emsdk paths to latest versions by @Ray +[build] REVIEWED: Makefile examples, align /usr/local with /src Makefile (#4286) by @Tchan0 +[build] REVIEWED: Makefile examples, added `textures_image_kernel` (#3555) by @Sergey Zapunidi +[build] REVIEWED: Makefile examples (#4209) by @Anthony Carbajal +[build] REVIEWED: Makefile examples, to work on NetBSD (#4438) by @NishiOwO +[build] REVIEWED: Makefile examples, WebGL2 (OpenGL ES 3.0) backend flags #4330 by @Ray +[build] REVIEWED: Makefile examples, web building (#4434) by @Asdqwe +[build] REVIEWED: build.zig, fix various issues around `-Dconfig` (#4398) by @Sage Hane +[build] REVIEWED: build.zig, fix type mismatch (#4383) by @yuval_dev +[build] REVIEWED: build.zig, minor fixes (#4381) by @Sage Hane +[build] REVIEWED: build.zig, fix @src logic and a few things (#4380) by @Sage Hane +[build] REVIEWED: build.zig, improve logic (#4375) by @Sage Hane +[build] REVIEWED: build.zig, issues (#4374) by @William Culver +[build] REVIEWED: build.zig, issues (#4366) by @Visen +[build] REVIEWED: build.zig, support desktop backend change (#4358) by @Nikolas +[build] REVIEWED: build.zig, use zig fmt (#4242) by @freakmangd +[build] REVIEWED: build.zig, check if wayland-scanner is installed (#4217) by @lnc3l0t +[build] REVIEWED: build.zig, override config.h definitions (#4193) by @lnc3l0t +[build] REVIEWED: build.zig, support GLFW platform detection (#4150) by @InventorXtreme +[build] REVIEWED: build.zig, make emscripten build compatible with Zig 0.13.0 (#4121) by @Mike Will +[build] REVIEWED: build.zig, pass the real build.zig file (#4113) by @InKryption +[build] REVIEWED: build.zig, leverage `dependencyFromBuildZig` (#4109) by @InKryption +[build] REVIEWED: build.zig, run examples from their directories (#4063) by @Mike Will +[build] REVIEWED: build.zig, fix raygui build when using addRaygui externally (#4027) by @Viktor Pocedulić +[build] REVIEWED: build.zig, fix emscripten build (#4012) by @Dylan +[build] REVIEWED: build.zig, update to zig 0.12.0dev while keeping 0.11.0 compatibility (#3715) by @freakmangd +[build] REVIEWED: build.zig, drop support for 0.11.0 and use more idiomatic build script code (#3927) by @freakmangd +[build] REVIEWED: build.zig, sdd shared library build option and update to zig 0.12.0-dev.2139 (#3727) by @Andrew Lee +[build] REVIEWED: build.zig, add `opengl_version` option (#3979) by @Alexei Mozaidze +[build] REVIEWED: build.zig, fix local dependency break (#3913) by @freakmangd +[build] REVIEWED: build.zig, fix breaking builds for Zig v0.11.0 (#3896) by @iarkn +[build] REVIEWED: build.zig, update to latest version and simplify (#3905) by @freakmangd +[build] REVIEWED: build.zig, remove all uses of deps/mingw (#3805) by @Peter0x44 +[build] REVIEWED: build.zig, fixed illegal instruction crash (#3682) by @WisonYe +[build] REVIEWED: build.zig, fix broken build on #3863 (#3891) by @Nikolas Mauropoulos +[build] REVIEWED: build.zig, improve cross-compilation (#4468) by @deathbeam +[build] REVIEWED: CMake, update to raylib 5.0 (#3623) by @Peter0x44 +[build] REVIEWED: CMake, added PLATFORM option for Desktop SDL (#3809) by @mooff +[build] REVIEWED: CMake, fix GRAPHICS_* check (#4359) by @Kacper Zybała +[build] REVIEWED: CMake, examples projects (#4332) by @Ridge3Dproductions +[build] REVIEWED: CMake, fix warnings in projects/CMake/CMakeLists.txt (#4278) by @Peter0x44 +[build] REVIEWED: CMake, delete BuildOptions.cmake (#4277) by @Peter0x44 +[build] REVIEWED: CMake, update version to 5.0 so libraries are correctly versioned (#3615) by @David Williams +[build] REVIEWED: CMake, improved linkage flags to save 28KB on the final bundle (#4177) by @Lázaro Albuquerque +[build] REVIEWED: CMake, support OpenGL ES3 in `LibraryConfigurations.cmake` (#4079) by @manuel5975p +[build] REVIEWED: CMake, `config.h` fully available to users (#4044) by @Lázaro Albuquerque +[build] REVIEWED: CMake, pass -sFULL_ES3 instead of -sFULL_ES3=1 (#4090) by @manuel5975p +[build] REVIEWED: CMake, SDL build link the glfw dependency (#3860) by @Rob Loach +[build] REVIEWED: CMake, infer CMAKE_MODULE_PATH in super-build (#4042) by @fruzitent +[build] REVIEWED: CMake, remove USE_WAYLAND option (#3851) by @Alexandre Almeida +[build] REVIEWED: CMake, disable SDL rlgl_standalone example (#3861) by @Rob Loach +[build] REVIEWED: CMake, bump version required to avoid deprecated #3639 by @Ray +[build] REVIEWED: CMake, fix examples linking -DPLATFORM=SDL (#3825) by @Peter0x44 +[build] REVIEWED: CMake, don't build for wayland by default (#4432) by @Peter0x44 +[build] REVIEWED: VS2022, misc improvements by @Ray +[build] REVIEWED: VS2022, fix build warnings (#4095) by @Jeffery Myers +[build] REVIEWED: VS2022, added new examples (#4492) by @Jeffery Myers +[build] REVIEWED: Fix fix-build-paths (#3849) by @Caleb Barger +[build] REVIEWED: Fix build paths (#3835) by @Steve Biedermann +[build] REVIEWED: Fix VSCode sample project for macOS (#3666) by @Tim Romero +[build] REVIEWED: Fix some warnings on web builds and remove some redundant flags (#4069) by @Lázaro Albuquerque +[build] REVIEWED: Fix examples not building with gestures system disabled (#4020) by @Sprix +[build] REVIEWED: Fix GLFW runtime platform detection (#3863) by @Alexandre Almeida +[build] REVIEWED: Fix DRM cross-compile without sysroot (#3839) by @Christian W. Zuckschwerdt +[build] REVIEWED: Fix cmake-built libraylib.a to properly include GLFW's object files (#3598) by @Peter0x44 +[build] REVIEWED: Hide unneeded internal symbols when building raylib as an so or dylib (#3573) by @Peter0x44 +[build] REVIEWED: Corrected the path of android ndk toolchains for OSX platforms (#3574) by @Emmanuel Méra +[build][CI] ADDED: Automatic update for raylib_api.* (#3692) by @seiren +[build][CI] REVIEWED: Update workflows to use latest actions/upload-artifact by @Ray +[build][CI] REVIEWED: CodeQL minor tweaks to avoid some warnings by @Ray +[build][CI] REVIEWED: Update linux_examples.yml by @Ray +[build][CI] REVIEWED: Update linux.yml by @Ray +[build][CI] REVIEWED: Update webassembly.yml by @Ray +[build][CI] REVIEWED: Update cmake.yml by @Ray +[build][CI] REVIEWED: Update codeql.yml, exclude src/external files by @Ray +[bindings] ADDED: raylib-APL (#4253) by @Brian E +[bindings] ADDED: raylib-bqn, moved rayed-bqn (#4331) by @Brian E +[bindings] ADDED: brainfuck binding (#4169) by @_Tradam +[bindings] ADDED: raylib-zig-bindings (#4004) by @Lionel Briand +[bindings] ADDED: Raylib-CSharp wrapper (#3963) by @MrScautHD +[bindings] ADDED: COBOL binding (#3661) by @glowiak +[bindings] ADDED: raylib-beef binding (#3640) by @Braedon Lewis +[bindings] ADDED: Raylib-CSharp-Vinculum (#3571) by @Danil +[bindings] REVIEWED: Remove broken-link bindings #3899 by @Ray +[bindings] REVIEWED: Updated some versions on BINDINGS.md by @Ray +[bindings] REVIEWED: Removed umaintained repos (#3999) by @Antonis Geralis +[bindings] REDESIGNED: Add binding link to name, instead of separate column (#3995) by @Carmine Pietroluongo +[bindings] UPDATED: h-raylib (#4378) by @Anand Swaroop +[bindings] UPDATED: Raylib.lean, to master version (#4337) by @Daniil Kisel +[bindings] UPDATED: raybit, to latest master (#4311) by @Alex +[bindings] UPDATED: dray binding (#4163) by @red thing +[bindings] UPDATED: Julia (#4068) by @ShalokShalom +[bindings] UPDATED: nim to latest master (#3999) by @Antonis Geralis +[bindings] UPDATED: raylib-rs (#3991) by @IoIxD +[bindings] UPDATED: raylib-zig version (#3902) by @Nikolas +[bindings] UPDATED: raylib-odin (#3868) by @joyousblunder +[bindings] UPDATED: Raylib VAPI (#3829) by @Alex Macafee +[bindings] UPDATED: Raylib-cs (#3774) by @Brandon Baker +[bindings] UPDATED: h-raylib (#3739) by @Anand Swaroop +[bindings] UPDATED: OCaml bindings version (#3730) by @Tobias Mock +[bindings] UPDATED: Raylib.c3 (#3689) by @Kenta +[bindings] UPDATED: ray-cyber to 5.0 (#3654) by @fubark +[bindings] UPDATED: raylib-freebasic binding (#3591) by @WIITD +[bindings] UPDATED: SmallBASIC (#3562) by @Chris Warren-Smith +[bindings] UPDATED: Python raylib-py v5.0.0beta1 (#3557) by @Jorge A. Gomes +[bindings] UPDATED: raylib-d binding (#3561) by @Steven Schveighoffer +[bindings] UPDATED: Janet (#3553) by @Dmitry Matveyev +[bindings] UPDATED: Raylib.nelua (#3552) by @Auz +[bindings] UPDATED: raylib-cpp to 5.0 (#3551) by @Rob Loach +[bindings] UPDATED: Pascal binding (#3548) by @Gunko Vadim +[external] UPDATED: stb_truetype.h to latest version by @Ray +[external] UPDATED: stb_image_resize2.h to latest version by @Ray +[external] UPDATED: stb_image.h to latest version by @Ray +[external] UPDATED: qoa.h to latest version by @Ray +[external] UPDATED: dr_wav.h to latest version by @Ray +[external] UPDATED: dr_mp3.h to latest version by @Ray +[external] UPDATED: cgltf.h to latest version by @Ray +[external] REVIEWED: rl_gputex, correctly load mipmaps from DDS files (#4399) by @Nikolas +[external] REVIEWED: stb_image_resize2, dix vld1q_f16 undeclared in arm (#4309) by @masnm +[external] REVIEWED: miniaudio, fix library and Makefile for NetBSD (#4212) by @NishiOwO +[external] REVIEWED: raygui, update to latest version 4.5-dev (#4238) by @Anthony Carbajal +[external] REVIEWED: jar_xml, replace unicode characters by ascii characters to avoid warning in MSVC (#4196) by @Rico P +[external] REVIEWED: vox_loader, normals and new voxels shader (#3843) by @johann nadalutti +[parser] REVIEWED: README.md, to mirror fixed help text (#4336) by @Daniil Kisel +[parser] REVIEWED: Fix seg fault with long comment lines (#4306) by @Chris Warren-Smith +[parser] REVIEWED: Don't crash for files that don't end in newlines (#3981) by @Peter0x44 +[parser] REVIEWED: Issues in usage example help text (#4084) by @Peter0x44 +[parser] REVIEWED: Fix parsing of empty parentheses (#3974) by @Filyus +[parser] REVIEWED: Address parsing issue when generating XML #3893 by @Ray +[parser] REVIEWED: `MemoryCopy()`, prevent buffer overflow by replacing hard-coded arguments (#4011) by @avx0 +[misc] ADDED: Create logo/raylib.icns by @Ray +[misc] ADDED: Create logo/raylib_1024x1024.png by @Ray +[misc] ADDED: Default vertex/fragment shader for OpenGL ES 3.0 (#4178) by @Lázaro Albuquerque +[misc] REVIEWED: README.md, fix Reddit badge (#4136) by @Ninad Sachania +[misc] REVIEWED: .gitignore, ignore compiled dll binaries (#3628) by @2Bear +[misc] REVIEWED: Fix undesired scrollbars on web shell files (#4104) by @jspast +[misc] REVIEWED: Made comments on raylib.h match comments in rcamera.h (#3942) by @Tomas Fabrizio Orsi +[misc] REVIEWED: Make raylib/raygui work better on touchscreen (#3728) by @Hongyu Ouyang +[misc] REVIEWED: Update config.h by @Ray + +------------------------------------------------------------------------- +Release: raylib 5.0 - 10th Anniversary Edition (18 November 2023) +------------------------------------------------------------------------- +KEY CHANGES: + - REDESIGNED: rcore module platform-split, by @ubkp, @michaelfiber, @Bigfoot71, @raysan5 + - ADDED: New platform backend supported: SDL + - ADDED: New platform backend supported: Nintendo Switch (closed source) + - ADDED: New Splines drawing and evaluation API + - ADDED: New pseudo-random numbers generator: rprand + - ADDED: Automation Events System API + - UPDATED: raygui 4.0: New version of this immediate-mode gui system for tools development with raylib + +Detailed changes: +[rcore] ADDED: RAYLIB_VERSION_* values to raylib.h (#2856) by @RobLoach +[rcore] ADDED: IsKeyPressedRepeat() on PLATFORM_DESKTOP (#3245) by @actondev +[rcore] ADDED: SetWindowTitle() for PLATFORM_WEB (#3222) by @VitusVeit +[rcore] ADDED: FLAG_WINDOW_RESIZABLE for web (#3305) by @Peter0x44 +[rcore] ADDED: SetWindowMaxSize() for desktop and web (#3309) by @ubkp +[rcore] ADDED: SetMouseCursor() for PLATFORM_WEB (#3414) by @BeardedBread +[rcore] ADDED: LoadRandomSequence()/UnloadRandomSequence() by @raysan5 +[rcore] REMOVED: PLATFORM_RPI (#3232) by @michaelfiber +[rcore] REVIEWED: GetFileLength(), added comment (#3262) by @raysan5 +[rcore] REVIEWED: Default shaders precission issue on PLATFORM_WEB (#3261) by @branc116 +[rcore] REVIEWED: IsKey*() key validation checks (#3256) by @n77y +[rcore] REVIEWED: SetClipboardText() for PLATFORM_WEB (#3257) by @ubkp +[rcore] REVIEWED: Check if Ctrl modifier is among the currently set modifiers (#3230) by @mohad12211 +[rcore] REVIEWED: Android app black screen when reopening by @Bigfoot71 +[rcore] REVIEWED: Warnings when casting int to floats (#3218) by @JeffM2501 +[rcore] REVIEWED: GetCurrentMonitor() detection inconsistency issue (#3215) by @ubkp +[rcore] REVIEWED: SetWindowMonitor() to no longer force fullscreen (#3209) by @ubkp +[rcore] REVIEWED: Fix mouse wheel not working in PLATFORM_RPI or PLATFORM_DRM (#3193) by @ubkp +[rcore] REVIEWED: GetMonitorName() description (#3184) (#3189) by @danilwhale +[rcore] REVIEWED: BeginScissorMode(), identify rendering to texture (#3510) by @gulrak +[rcore] REVIEWED: Window flags order (#3114) by @lesleyrs +[rcore] REVIEWED: Full movement for right analog stick (#3095) by @PixelPhobicGames +[rcore] REVIEWED: Fix Android app freeze after calling CloseWindow() (#3067) by @Bigfoot71 +[rcore] REVIEWED: Lazy loading of default font used on image drawing (no InitWindow) by @raysan5 +[rcore] REVIEWED: Minor tweaks to raylib events automation system @raysan5 +[rcore] REVIEWED: GetCurrentMonitor() bugfix (#3058) by @hamyyy +[rcore] REVIEWED: Update CORE.Input.Touch.pointCount (#3024) by @raysan5 +[rcore] REVIEWED: Mouse offset and scaling must be considered also on web! +[rcore] REVIEWED: CompressData(), possible stack overflow +[rcore] REVIEWED: GetWorldToScreenEx() (#3351) by @Brian-ED +[rcore] REVIEWED: Fix GetMouseDelta() issue for Android (#3404) by @Bigfoot71 +[rcore] REVIEWED: GetFPS(), reset FPS averages when window is inited (#3445) by @JeffM2501 +[rcore] REVIEWED: GetCurrentMonitor(), check window center position by @M374LX +[rcore] REVIEWED: GetRender*() issue on macOS highDPI (#3367) by @raysan5 +[rcore] REVIEWED: ScanDirectoryFiles*(), paths building slashes sides (#3507) +[rlgl] ADDED: Experimental support for OpenGL ES 3.0 by @raysan5 +[rlgl] ADDED: Support 16-Bit HDR textures (#3220) by @Not-Nik +[rlgl] ADDED: rlEnablePointMode() (#3490) by @JettMonstersGoBoom +[rlgl] ADDED: rlBlitFramebuffer(), required for deferred render +[rlgl] REVIEWED: LoadModel(), removed cube fallback mechanism (#3459) +[rlgl] REVIEWED: Improved support for ES3/WebGL2 (#3107) by @chemaguerra +[rlgl] REVIEWED: OpenGL 2.1 half floats support as part of an extension by @Not-Nik +[rlgl] REVIEWED: Avoid shader attribute not found log by @raysan5 +[rlgl] REVIEWED: Avoid tracelog about not found uniforms (#3003) by @raysan5 +[rlgl] REVIEWED: rLoadTexture() UBSAN complaints #1891 (#3321) by @Codom +[rlgl] REVIEWED: glInternalFormat as unsigned int +[rlgl] REVIEWED: OpenGL ES 3.0 support +[rshapes] ADDED: Spline drawing functions by @raysan5 +[rshapes] ADDED: GetSplinePoint*() functions for spline evaluation by @raysan5 +[rshapes] ADDED: DrawCircleLinesV() for consistency (#3452) by @Peter0x44 +[rshapes] REVIEWED: DrawSplineCatmullRom() by @raysan5 +[rshapes] REVIEWED: Minor fix in DrawLineBezier* (#3006) by @eternalStudent +[rshapes] REVIEWED: GetCollisionRec(), more performant (#3052) by @manuel5975p +[rshapes] REVIEWED: Fix off-by-one error in CheckCollisionPointRec() (#3022) by @dbechrd +[rtextures] ADDED: Basic SVG loading support (#2738) by @bXi +[rtextures] ADDED: Support 16-Bit HDR textures (#3220) by @Not-Nik +[rtextures] ADDED: ExportImageToMemory() by @raysan5 +[rtextures] ADDED: ImageRotate() (#3078) by @danemadsen +[rtextures] ADDED: GenImageGradientSquare() (#3077) by @danemadsen +[rtextures] ADDED: GenImageLinearGradient() by @danemadsen +[rtextures] REMOVED: GenImageGradientH() and GenImageGradientV() by @danemadsen +[rtextures] REVIEWED: LoadImageSvg() by @raysan5 +[rtextures] REVIEWED: Uninitialized thread-locals in stbi (#3282) (#3283) by @jbarthelmes +[rtextures] REVIEWED: ImageDrawRectangleRec(), validate drawing inside bounds by @JeffM2501 +[rtextures] REVIEWED: LoadTextureCubemap() for manual layouts (#3204) by @Not-Nik +[rtextures] REVIEWED: Optimization of ImageDrawRectangleRec() (#3185) by @smalltimewizard +[rtextures] REVIEWED: ImageRotate() formatting by @raysan5 +[rtextures] REVIEWED: GenImagePerlinNoise(), clamp values (#3071) by @raysan5 +[rtextures] REVIEWED: Packing logic error in GenImageFontAtlas() (#2979) by @hanaxar +[rtextures] REVIEWED: Calculate exact image size in GenImageFontAtlas() (#2963) by @hanaxar +[rtextures] REVIEWED: ImageDrawRectangleRec() (#3027) by @raysan5 +[rtextures] REVIEWED: ImageDraw() source clipping when drawing beyond top left (#3306) by @RobLoach +[rtextures] REVIEWED: UnloadRenderTexture(), additional checks +[rtextures] REVIEWED: Fixed compressed DDS texture loading issues (#3483) by @JaanDev +[rtext] ADDED: Font altas white rectangle and flag SUPPORT_FONT_ATLAS_WHITE_REC by @raysan5 +[rtext] ADDED: SetTextLineSpacing() to define line breaks text drawing spacing by @raysan5 +[rtext] RENAMED: LoadFont*() parameter names for consistency and coherence by @raysan5 +[rtext] REVIEWED: GetCodepointCount(), ignore unused return value of GetCodepointNext by @ashn-dot-dev +[rtext] REVIEWED: TextFormat() warn user if buffer overflow occured (#3399) by @Murlocohol +[rtext] REVIEWED: TextFormat(), added "..." for truncation (#3366) by @raysan5 +[rtext] REVIEWED: GetGlyphIndex() (#3000) by @raysan5 +[rtext] REVIEWED: GetCodepointNext() to return default value by @chocolate42 +[rtext] REVIEWED: TextToPascal() issue when first char is uppercase +[rmodels] ADDED: ModelAnimation.name field, initially with GLTF animation names by @alfredbaudisch +[rmodels] REDESIGNED: LoadOBJ(), avoid mesh splitting by materials, fix (#3398) by @raysan5 +[rmodels] REVIEWED: Support .vox model files version 200 (#3097) by @Bigfoot71 +[rmodels] REVIEWED: Materials loading (#3126) @raysan5 +[rmodels] REVIEWED: DrawBillboardPro() to allow source of negative size (#3197) by @bohonghuang +[rmodels] REVIEWED: glTF loading segfault in animNormals memcpy by @charles-l +[rmodels] REVIEWED: LoadModelAnimationsGLTF(), free fileData after use (#3065) by @crynux +[rmodels] REVIEWED: GenMeshCubicmap(), correction of values (#3032) by @Bigfoot71 +[rmodels] REVIEWED: DrawMesh() to avoid UBSAN complaining (#1891) +[rmodels] REVIEWED: GenMeshPlane() when resX != resZ (#3425) by @neyrox, @s-yablonskiy +[rmodels] REVIEWED: GetModelBoundingBox() (#3485) +[raudio] ADDED: LoadSoundAlias() by @JeffM2501 +[raudio] ADDED: Missing structure on standalone mode (#3160) by @raysan5 +[raudio] ADDED: GetMasterVolume() (#3434) by @rexim +[raudio] REVIEWED: Comments about sample format to AttachAudioStreamProcessor() (#3188) by @AlbertoGP +[raudio] REVIEWED: Documented buffer format for audio processors (#3186) by @AlbertoGP +[raudio] REVIEWED: ExportWaveAsCode() file saving by @RadsammyT +[raudio] REVIEWED: Fix warning on discarded const qualifier (#2967) by @RobLoach +[raudio] REVIEWED: Move mutex initialization before ma_device_start() (#3325) by @Bigfoot71 +[raudio] REVIEWED: Fix UpdateSound() parameter name (#3405) by @KislyjKisel +[raudio] REVIEWED: Fix QOA seeking (#3494) by @veins1 +[rcamera] REVIEWED: File-macros for consistency (#3161) by @raysan5 +[rcamera] REVIEWED: Support analog stick camera controls (#3066) by @PixelPhobicGames +[rcamera] REVIEWED: CameraMoveToTarget(), ensure distance is greater than 0 (#3031) by @kolunmi +[rcamera] REVIEWED: Exposing rcamera functions to the dll (#3355) by @JeffM2501 +[raymath] ADDED: Vector3Projection() and Vector3Rejection() (#3263) by @Dial0 +[raymath] ADDED: EPSILON macro to each function requiring it (#3330) by @Brian-ED +[raymath] REVIEWED: Usage of 'sinf()' and 'cosf()' to be correct (#3181) by @RokasPuzonas +[raymath] REVIEWED: Slightly optimized Vector3Normalize() (#2982) by @RicoP +[raymath] REVIEWED: Comment to clarify raymath semantics by @raysan5 +[raymath] REVIEWED: Comment about Matrix conventions by @raysan5 +[raymath] REVIEWED: Vector2Angle() and Vector2LineAngle() (#3396) by @Murlocohol +[rgestures] REVIEWED: Optimize and simplify the gesture system (#3190) by @ubkp +[rgestures] REVIEWED: GESTURE_DRAG and GESTURE_SWIPE_* issues (mostly) for web (#3183) by @ubkp +[rgestures] REVIEWED: Touch pointCount for web (#3163) by @ubkp +[rgestures] REVIEWED: IsGestureDetected() parameter type +[utils] ADDED: Security checks to file reading (memory allocations) by @raysan5 +[utils] REVIEWED: LoadFileData() potential issues with dataSize +[examples] ADDED: shaders_lightmap (#3043) by @nullstare +[examples] ADDED: core_2d_camera_split_screen (#3298) by @gabrielssanches +[examples] ADDED: LoadSoundAlias() usage example (#3223) by @JeffM2501 +[examples] ADDED: textures_tiling (#3353) by @luis605 +[examples] ADDED: shader_deferred_render (#3496) by @27justin +[examples] RENAMED: 2d_camera examples for consistency +[examples] REVIEWED: Text examples SetTextLineSpacing() to multiline examples by @raysan5 +[examples] REVIEWED: examples/shapes/shapes_collision_area.c help instructions (#3279) by @asdqwe +[examples] REVIEWED: examples/shaders/shaders_texture_outline.c help instructions (#3278) by @asdqwe +[examples] REVIEWED: examples/others/easings_testbed.c help instructions and small twe… by @asdqwe +[examples] REVIEWED: example/audio/audio_module_player.c help instructions and small b… by @asdqwe +[examples] REVIEWED: example/models/models_loading_m3d.c controls (#3269) by @asdqwe +[examples] REVIEWED: example/models/models_loading_gltf.c controls (#3268) by @asdqwe +[examples] REVIEWED: text_unicode.c example crashing (#3250) by @ubkp +[examples] REVIEWED: rlgl_standalone.c compilation issue (#3242) by @ubkp +[examples] REVIEWED: core_input_gestures for Web (#3172) by @ubkp +[examples] REVIEWED: core_input_gamepad (#3110) by @iacore +[examples] REVIEWED: examples using raygui to raygui 4.0 by @raysan5 +[examples] REVIEWED: Julia set shader example (#3467) by @joshcol9232 +[build] ADDED: CMake option for SUPPORT_CUSTOM_FRAME_CONTROL (#3221) by @ubkp +[build] ADDED: New BORDERLESS_WINDOWED_MODE for PLATFORM_DESKTOP (#3216) by @ubkp +[build] ADDED: New examples to VS2022 solution by @raysan5 +[build] REVIEWED: Updated Makefile and Makefile.Web, include new examples +[build] REVIEWED: Fix CMake extraneous -lglfw (#3266) by @iacore +[build] REVIEWED: Add missing cmake options (#3267) by @asdqwe +[build] REVIEWED: Match CMakeOptions.txt options default values (#3258) by @asdqwe +[build] REVIEWED: Add build.zig options for individual modules (#3254) by @actondev +[build] REVIEWED: build.zig to work with cross-compiling (#3225) by @yujiri8 +[build] REVIEWED: Makefile build on PLATFORM_ANDROID, soname (#3211) by @ndytts +[build] REVIEWED: src/Makefile, fix misleading indentation (#3202) by @ashn-dot-dev +[build] REVIEWED: build.zig: Support for building with PLAFORM_DRM (#3191) by @jakubvf +[build] REVIEWED: Update CMakeOptions.txt by @raysan5 +[build] REVIEWED: fix: cmake option "OPENGL_VERSION" doesn't work (#3170) by @royqh1979 +[build] REVIEWED: Add error if raylib.h is included in a C++98 program (#3093) by @Peter0x44 +[build] REVIEWED: Cross compilation for PLATFORM_DRM (#3091) by @TheLastBilly +[build] REVIEWED: build.zigm fixed cross-compiling from Linux (#3090)by @yujiri8 +[build] REVIEWED: Enhanced cmake part for OpenBSD (#3086) by @rayit +[build] REVIEWED: Fixed compile on OpenBSD (#3085)by @rayit +[build] REVIEWED: CMake project example: fix a couple of typos (#3014) by @benjamin-thomas +[build] REVIEWED: Fix warnings in raylib for MSVC (#3004) by @JeffM2501 +[build] REVIEWED: Update cmake example project (#3062) by @lesleyrs +[build] REVIEWED: Update build.zig be be able to build with current zig master (#3064) by @ryupold +[build] REVIEWED: VSCode project template (#3048) by @Shoozza +[build] REVIEWED: Fixed broken build.zig files. Now works with latest stable compiler (… by @Gamer-Kold +[build] REVIEWED: Fix missing symbol when rglfw.c on BSD platforms (#2968) by @Koromix +[build] REVIEWED: Update Makefile comment to indicate arm64 as a supported Linux deskto… @ashn-dot-dev +[build] REVIEWED: Update Makefile : clean raygui.c & physac.c (#3296) by @SuperUserNameMan +[build] REVIEWED: Update webassembly.yml and linux.yml +[build] REVIEWED: Update zig build system to zig version 0.11.0 (#3393) by @purple4pur +[build] REVIEWED: Fix for latest zig master (#3037) by @star-tek-mb +[build] REVIEWED: Examples Makefile to use Makefile.Web when building for web (#3449) by @keithstellyes +[build] REVIEWED: build.zig updates for 0.11.0 release. (#3501) by @cabarger +[build] REVIEWED: Support OpenGL ES 3.0 building on Web platform +[build] REVIEWED: Fix warnings in Visual Studio (#3512) by @JeffM2501 +[build] REVIEWED: OpenGL ES 3.0 flags on CMakeOptions (#3514) by @awfulcooking +[bindings] ADDED: fortran-raylib +[bindings] ADDED: raylib-raku to bindings (#3299) by @vushu +[bindings] ADDED: claw-raylib to BINDINGS.md (#3310) by @bohonghuang +[bindings] ADDED: vaiorabbit/raylib-bindings (#3318) by @wilsonsilva +[bindings] ADDED: TurboRaylib (#3317) by @turborium +[bindings] ADDED: raylib-ffi to bindings list (#3164) by @ewpratten +[bindings] ADDED: raylib-pkpy-bindings (#3361) by @blueloveTH +[bindings] ADDED: Raylib.lean to BINDINGS.md (#3409) by @KislyjKisel +[bindings] UPDATED: BINDINGS.md (#3217) by @joseph-montanez +[bindings] UPDATED: BINDINGS.md to include rayjs (#3212) by @mode777 +[bindings] UPDATED: latest h-raylib version (#3166) by @Anut-py +[bindings] UPDATED: bindbd-raylib3 to raylib 4.5 (#3157) by @o3o +[bindings] UPDATED: Janet bindings supported version update (#3083)by @archydragon +[bindings] UPDATED: BINDINGS.md (raylib-py -> 4.5) (#2992) by @overdev +[bindings] UPDATED: BINDINGS.md (raylib-lua -> 4.5) (#2989) by @TSnake41 +[bindings] UPDATED: raylib-d binding version to 4.5 (#2988) by @schveiguy +[bindings] UPDATED: raylib-freebasic to 4.5 (#2986) by @WIITD +[bindings] UPDATED: BINDINGS.md (#2983) by @jarroddavis68 +[bindings] UPDATED: BINDINGS.md for raylib Odin 4.5 (#2981) by @gingerBill +[bindings] UPDATED: BINDINGS.md (#2980) by @GuvaCode +[bindings] UPDATED: BINDINGS.md (#3002) by @fubark +[bindings] UPDATED: BINDINGS.md (#3053) by @JupiterRider +[bindings] UPDATED: BINDINGS.md (#3050) by @Its-Kenta +[bindings] UPDATED: CL bindings version (#3049) by @shelvick +[bindings] UPDATED: BINDINGS.md (#3026) by @ChrisDill +[bindings] UPDATED: BINDINGS.md (#3023) by @sDos280 +[bindings] UPDATED: BINDINGS.md (#3017) by @Soutaisei +[bindings] UPDATED: Various versions to 4.5 (#2974) by @RobLoach +[bindings] UPDATED: raylib.zig version to 4.5 (#2971) by @ryupold +[bindings] UPDATED: h-raylib version (#2970) by @Anut-py +[bindings] UPDATED: Factor's raylib binding to v4.5 (#3350) by @WraithGlade +[bindings] UPDATED: raylib-ocaml bindings to 4.5 version (#3322) by @tjammer +[bindings] UPDATED: Jaylib binding (#3508) by @glowiak +[external] UPDATED: sdefl and sinfl DEFLATE compression libraries by @raysan5 +[external] UPDATED: miniaudio v0.11.12 --> v0.11.19 by @raysan5 +[external] UPDATED: rl_gputex.h compressed images loading library by @raysan5 +[external] UPDATED: Replaced stb_image_resize.c by stb_image_resize2.h (#3403) by @BabakSamimi +[external] UPDATED: qoi and qoa libraries +[external] UPDATED: stb libraries (required ones) +[external] UPDATED: cgltf and m3d libraries +[external] REVIEWED: msf_gif.h, some warnings +[external] REVIEWED: sinfl external library to avoid ASAN complaints (#3349) by @raysan5 +[misc] ADDED: New task point to issue template about checking the wiki (#3169) by @ubkp +[misc] ADDED: CodeQL for static code analysis (#3476) by @b4yuan +[misc] REVIEWED: Update FAQ.md by @raysan5 +[misc] REVIEWED: Potential code issues reported by CodeQL (#3476) +[misc] REVIEWED: Fix a link in the FAQ (#3082)by @jasonliang-dev +[misc] REVIEWED: New file formats to FAQ (#3079) by @Luramoth +[misc] REVIEWED: Make assets loading extension case insensitive #3008 by @raysan5 +[misc] REVIEWED: Updated web shells open-graph info by @raysan5 + +------------------------------------------------------------------------- +Release: raylib 4.5 (18 March 2023) +------------------------------------------------------------------------- +KEY CHANGES: + - ADDED: Improved ANGLE support on Desktop platforms + - ADDED: rcamera module, simpler and more extendable + - ADDED: Support for M3D models and M3D/GLTF animations + - ADDED: Support QOA audio format (import/export) + - ADDED: rl_gputex module for compressed textures loading + - REDESIGNED: rlgl module for automatic render-batch limits checking + - REDESIGNED: rshapes module to minimize the rlgl dependency + +Detailed changes: +[core] ADDED: RAYLIB_VERSION_* values to raylib.h (#2856) by @RobLoach +[core] ADDED: Basic gamepad support for Android (#2709) by @deniska +[core] ADDED: Support CAPS/NUM lock keys registering if locked +[core] ADDED: _GNU_SOURCE define on Linux (#2729) +[core] ADDED: SetWindowIcons() to set multiple icon image sizes +[core] `WARNING`: RENAMED: Exported raylib version symbol to raylib_version #2671 +[core] REMOVED: Touch points on touch up events on Android (#2711) by @deniska +[core] REVIEWED: Window position setup on InitWindow() (#2732) by @RandomErrorMessage +[core] REVIEWED: Touchscreen input related functions on Android (#2702) by @deniska +[core] REVIEWED: Viewport scaling on Android after context rebind (#2703) by @deniska +[core] REVIEWED: ScanDirectoryFilesRecursively() (#2704) +[core] REVIEWED: Gamepad mappings with latest gamecontrollerdb (#2725) +[core] REVIEWED: Monitor order check on app initialization +[core] REVIEWED: Application monitor when opening (#2728, #2731) by @RandomErrorMessage +[core] REVIEWED: Gestures module to use GetTime() if available (#2733) by @RobLoach +[core] REVIEWED: Resolve GLFW3 some symbols re-definition of windows.h in glfw3native (#2643) by @daipom +[core] REVIEWED: OpenURL(), string buffer too short sometimes +[core] REVIEWED: GetRandomValue() range limit warning (#2800) by @Pere001 +[core] REVIEWED: UnloadDirectoryFiles() +[core] REVIEWED: GetKeyPressed(), out of range issue (#2814) by @daipom +[core] REVIEWED: GetTime(), renamed variable 'time' to 'nanoSeconds' (#2816) by @jtainer +[core] REVIEWED: LoadShaderFromMemory(), issue with shader linkage +[core] REVIEWED: Avoid possible gamepad index as -1 (#2839) +[core] REVIEWED: SetShaderValue*(), avoid setup uniforms for invalid locations +[core] REVIEWED: GetClipboardText() on PLATFORM_WEB, permissions issues +[core] REVIEWED: Initial window position for display-sized fullscreen (#2742) by @daipom +[core] REVIEWED: Sticky touches input (#2857) by @ImazighenGhost +[core] REVIEWED: Enable GetWindowHandle() on macOS (#2915) by @Not-Nik +[core] REVIEWED: Window position always inits centered in current monitor +[core] REVIEWED: IsWindowFocused() to consider Android App state (#2935) +[core] REVIEWED: GetMonitorWidth() and GetMonitorHeight() (#2934) +[core] REVIEWED: GetWindowHandle() to return Linux window (#2938) +[core] REVIEWED: WindowDropCallback(), additional security check (#2943) +[core] REVIEWED: Security checks for emscripten_run_script() (#2954) +[utils] REVIEWED: TraceLog() message size limit overflow +[rcamera] REDESIGNED: New implementation from scratch (#2563) by @Crydsch +[rcamera] REVIEWED: Make orbital camera work as expected (#2926) by @JeffM2501 +[rcamera] REVIEWED: Multiple reviews on the new implementation +[rcamera] ADDED: UpdateCameraPro(), supporting custom user inputs +[rlgl] ADDED: OpenGL ES 2.0 support on PLATFORM_DESKTOP (#2840) by @wtnbgo +[rlgl] ADDED: Separate blending modes for color and alpha, BLEND_CUSTOM_SEPARATE (#2741) +[rlgl] ADDED: rlSetBlendFactorsSeparate and custom blend mode modification checks (#2741) by @pure01fx +[rlgl] ADDED: RL_TEXTURE_MIPMAP_BIAS_RATIO support to `rlTextureParameters()` for OpenGL 3.3 #2674 +[rlgl] ADDED: rlCubemapParameters() (#2862) by @GithubPrankster +[rlgl] ADDED: rlSetCullFace() (#2797) by @jtainer +[rlgl] REMOVED: Mipmaps software generation for OpenGL 1.1 +[rlgl] REVIEWED: Check for extensions before enabling them (#2706) by @Not-Nik +[rlgl] REVIEWED: SSBO usage to avoid long long data types +[rlgl] REVIEWED: Enable DXT compression on __APPLE__ targets (#2694) by @Not-Nik +[rlgl] REVIEWED: enums exposed and description comments +[rlgl] REVIEWED: rlBindImageTexture(), correct data types (#2808) by @planetis-m +[rlgl] REVIEWED: rlMultMatrixf(), use const pointer (#2807) by @planetis-m +[rlgl] REVIEWED: Expose OpenGL blending mode factors and functions/equations +[rlgl] REVIEWED: rLoadTextureDepth(), issue with depth textures on WebGL (#2824) +[rlgl] REVIEWED: rlUnloadFramebuffer() (#2937) +[raymath] ADDED: Vector2LineAngle() (#2887) +[raymath] REVIEWED: Vector2Angle() (#2829, #2832) by @AlxHnr, @planetis-m +[shapes] ADDED: CheckCollisionPointPoly() (#2685) by @acejacek +[shapes] REVIEWED: DrawPixel*(), use RL_QUADS/RL_TRIANGLES (#2750) by @hatkidchan +[shapes] REVIEWED: DrawLineBezier*(), fix bezier line breaking (#2735, #2767) by @nobytesgiven +[textures] ADDED: ColorBrightness() +[textures] ADDED: ColorTint() +[textures] ADDED: ColorContrast() +[textures] ADDED: Support for PNM images (.ppm, .pgm) +[textures] ADDED: GenImagePerlinNoise() +[textures] ADDED: GenImageText(), generate grayscale image from text byte data +[textures] ADDED: ImageDrawCircleLines(), ImageDrawCircleLinesV() (#2713) by @RobLoach +[textures] ADDED: ImageBlurGaussian() (#2770) by @nobytesgiven +[textures] REVIEWED: Image fileformat support: PIC, PNM +[textures] REVIEWED: ImageTextEx() and ImageDrawTextEx() scaling (#2756) by @hatkidchan +[textures] `WARNING`: REMOVED: DrawTextureQuad() +[textures] `WARNING`: REMOVED: DrawTexturePoly(), function moved to example: `textures_polygon` +[textures] `WARNING`: REMOVED: DrawTextureTiled(),function implementation moved to the textures_tiled.c +[text] ADDED: GetCodepointPrevious() +[text] ADDED: UnloadUTF8(), aligned with LoadUTF8() +[text] `WARNING`: RENAMED: TextCodepointsToUTF8() to LoadUTF8() +[text] `WARNING`: RENAMED: GetCodepoint() -> GetCodepointNext() +[text] REDESIGNED: GetCodepointNext() +[text] REVIEWED: MeasureTextEx(), avoid crash on bad data +[text] REVIEWED: UnloadFontData(), avoid crash on invalid font data +[models] ADDED: Support M3D model file format (meshes and materials) (#2648) by @bztsrc +[models] ADDED: Support for M3D animations (#2648) by @bztsrc +[models] ADDED: GLTF animation support (#2844) by @charles-l +[models] ADDED: DrawCapsule() and DrawCapsuleWires() (#2761) by @IanBand +[models] ADDED: LoadMaterials(), MTL files loading, same code as OBJ loader (#2872) by @JeffM2501 +[models] `WARNING`: REMOVED: UnloadModelKeepMeshes() +[models] `WARNING`: REMOVED: DrawCubeTexture(), DrawCubeTextureRec(), functions moved to new example: `models_draw_cube_texture` +[models] REVIEWED: DrawMesh(), using SHADER_LOC_COLOR_SPECULAR as a material map (#2908) by @haved +[models] REVIEWED: LoadM3D() vertex color support (#2878) by @GithubPrankster, @bztsrc +[models] REVIEWED: GenMeshHeightmap() (#2716) +[models] REVIEWED: LoadIQM() (#2676) +[models] REVIEWED: Simplify .vox signature check (#2752) by @CrezyDud +[models] REVIEWED: LoadIQM(), support bone names loading if available (#2882) by @PencilAmazing +[models] REVIEWED: GenMeshTangents(), avoid crash on missing texcoords data (#2927) +[audio] ADDED: Full support for QOA audio file format +[audio] ADDED: Mixed audio processor (#2929) by @hatkidchan +[audio] ADDED: IsWaveReady()`, IsSoundReady(), IsMusicReady() (#2892) by @RobLoach +[audio] `WARNING`: REMOVED: Multichannel audio API: PlaySoundMulti(), StopSoundMulti() +[audio] REVIEWED: Clear PCM buffer state when closing audio device (#2736) by @veins1 +[audio] REVIEWED: Android backend selected (#2118, #2875) by @planetis-m +[audio] REVIEWED: Change default threading model for COM objects in miniaudio +[multi] ADDED: IsShaderReady(), IsImageReady(), IsFontReady() (#2892) by @RobLoach +[multi] ADDED: IsModelReady(), IsMaterialReady(), IsTextureReady(), IsRenderTextureReady() (#2895) by @RobLoach +[multi] REVIEWED: Multiple code/comment typos by @sDos280 +[multi] REVIEWED: Grammar mistakes and typos (#2914) by @stickM4N +[multi] REVIEWED: Use TRACELOG() macro instead of TraceLog() in internal modules (#2881) by @RobLoach +[examples] ADDED: textures_textured_curve (#2821) by @JeffM2501 +[examples] ADDED: models_draw_cube_texture +[examples] ADDED: models_loading_m3d (#2648) by @bztsrc +[examples] ADDED: shaders_write_depth (#2836) by @BugraAlptekinSari +[examples] ADDED: shaders_hybrid_render (#2919) by @BugraAlptekinSari +[examples] REMOVED: audio_multichannel_sound +[examples] RENAMED: Several shaders for naming consistency (#2707) +[examples] RENAMED: lighting_instanced.fs to lighting_instancing.fs (glsl100) (#2805) by @gtrxAC +[examples] REVIEWED: core_custom_logging.c (#2692) by @hartmannathan +[examples] REVIEWED: core_camera_2d_platformer (#2687) by @skylar779 +[examples] REVIEWED: core_input_gamepad.c (#2903) by @planetis-m +[examples] REVIEWED: core_custom_frame_control +[examples] REVIEWED: core_drop_files (#2943) +[examples] REVIEWED: text_rectangle_bounds (#2746) by @SzieberthAdam +[examples] REVIEWED: textures_image_processing, added gaussian blurring (#2775) by @nobytesgiven +[examples] REVIEWED: models_billboard, highlighting rotation and draw order (#2779) by @nobytesgiven +[examples] REVIEWED: core_loading_thread, join thread on completion (#2845) by @planetis-m +[examples] REVIEWED: models_loading_gltf +[examples] REVIEWED: Shader lighting.fs for GLSL120 (#2651) +[examples] REVIEWED: text_codepoints_loading.c +[parser] REVIEWED: raylib-parser Makefile (#2765) by @Peter0x44 +[build] ADDED: Packaging for distros with deb-based and rpm-based packages (#2877) by @KOLANICH +[build] ADDED: Linkage library -latomic on Linux (only required for ARM32) +[build] ADDED: Required frameworks on macOS (#2793) by @SpexGuy +[build] ADDED: WASM support for Zig build (#2901) by @Not-Nik +[build] ADDED: New raylib examples as VS2022 project (to raylib solution) +[build] REVIEWED: config.h format and inconsistencies +[build] REVIEWED: Zig build to latest master, avoid deprecated functions (#2910) by @star-tek-mb +[build] REVIEWED: CMake project template to easily target raylib version (#2700) by @RobLoach +[build] REVIEWED: PATH for PLATFORM_WEB target (#2647) by @futureapricot +[build] REVIEWED: build.zig to let user decide how to set build mode and linker fixes by @InKryption +[build] REVIEWED: Deprecation error on Android API higher than 23 (#2778) by @anggape +[build] REVIEWED: Android x86 Architecture name (#2783) by @IsaacTCB +[build] REVIEWED: examples/build.zig for the latest Zig version (#2786) by @RomanAkberov +[utils] REVIEWED: ExportDataAsCode() data types (#2787) by @RGDTAB +[build] REVIEWED: Makefile emscripten path (#2785) by @Julianiolo +[build] REVIEWED: Several compilation warnings (for strict rules) +[build] REVIEWED: All github workflows using deprecated actions +[build] REVIEWED: CMake when compiling for web (#2820) by @object71 +[build] REVIEWED: DLL build on Windows (#2951) by @Skaytacium +[build] REVIEWED: Avoid MSVC warnings in raylib project (#2871) by @JeffM2501 +[build] REVIEWED: Paths in .bat files to build examples (#2870) by @masoudd +[build] REVIEWED: CMake, use GLVND for old cmake versions (#2826) by @simendsjo +[build] REVIEWED: Makefile, multiple tweaks +[build] REVIEWED: CI action: linux_examples.yml +[build] REVIEWED: CI action: cmake.yml +[bindings] ADDED: h-raylib (Haskell) by @Anut-py +[bindings] ADDED: raylib-c3 (C3) by @Its-Kenta +[bindings] ADDED: raylib-umka (Umka) by @RobLoach +[bindings] ADDED: chez-raylib (Chez Scheme) by @Yunoinsky +[bindings] ADDED: raylib-python-ctypes (Python) by @sDos280 +[bindings] ADDED: claylib (Common Lisp) by @shelvick +[bindings] ADDED: raylib-vapi (Vala) by @lxmcf +[bindings] ADDED: TurboRaylib (Object Pascal) by @turborium +[bindings] ADDED: Kaylib (Kotlin/Native) by @Its-Kenta +[bindings] ADDED: Raylib-Nelua (Nelua) by @Its-Kenta +[bindings] ADDED: Cyber (Cyber) by @fubark +[bindings] ADDED: raylib-sunder (Sunder) by @ashn-dot-dev +[bindings] ADDED: raylib BQN (#2962) by @Brian-ED +[misc] REVIEWED: Update external libraries to latest versions + +------------------------------------------------------------------------- +Release: raylib 4.2 (11 August 2022) +------------------------------------------------------------------------- +KEY CHANGES: + - REMOVED: extras libraries (raygui, physac, rrem, reasings, raudio.h) moved to independent separate repos + - UPDATED: examples: Added creation and update raylib versions and assigned **DIFFICULTY LEVELS**! + - rres 1.0: A custom resource-processing and packaging file format, including tooling and raylib integration examples + - raygui 3.2: New version of the immediate-mode gui system for tools development with raylib + - raylib_parser: Multiple improvements of the raylib parser to automatize bindings generation + - ADDED: New file system API: Reviewed to be more aligned with raylib conventions and one advance function added + - ADDED: New audio stream processors API (_experimental_): Allowing to add custom audio stream data processors using callbacks + +Detailed changes: +[multi] ADDED: Frequently Asked Questions (FAQ.md) +[multi] REVIEWED: Multiple trace log messages +[multi] REVIEWED: Avoid some float to double promotions +[multi] REVIEWED: Some functions input parametes that should be const +[multi] REVIEWED: Variables initialization, all variables are initialized on declaration +[multi] REVIEWED: Static array buffers are always re-initialized with memset() +[multi] `WARNING`: RENAMED: Some function input parameters from "length" to "size" +[core] ADDED: GetApplicatonDirectory() (#2256, #2285, #2290) by @JeffM2501 +[core] ADDED: raylibVersion symbol, it could be required by some bindings (#2190) +[core] ADDED: SetWindowOpacity() (#2254) by @tusharsingh09 +[core] ADDED: GetRenderWidth() and GetRenderHeight() by @ArnaudValensi +[core] ADDED: EnableEventWaiting() and DisableEventWaiting() +[core] ADDED: GetFileLength() +[core] ADDED: Modules info at initialization +[core] ADDED: Support clipboard copy/paste on web +[core] ADDED: Support OpenURL() on Android platform (#2396) by @futureapricot +[core] ADDED: Support MOUSE_PASSTHROUGH (#2516) +[core] ADDED: GetMouseWheelMoveV() (#2517) by @schveiguy +[core] `WARNING`: REMOVED: LoadStorageValue() / SaveStorageValue(), moved to example +[core] `WARNING`: RENAMED: GetDirectoryFiles() to LoadDirectoryFiles() +[core] `WARNING`: RENAMED: `ClearDroppedFiles()` to `UnloadDroppedFiles()` +[core] `WARNING`: RENAMED: GetDroppedFiles() to LoadDroppedFiles() +[core] `WARNING`: RENAMED: `ClearDirectoryFiles()` to `UnloadDirectoryFiles()` +[core] `WARNING`: REDESIGNED: WaitTime() argument from milliseconds to seconds (#2506) by @flashback-fx +[core] REVIEWED: GetMonitorWidth()/GetMonitorHeight() by @gulrak +[core] REVIEWED: GetDirectoryFiles(), maximum files allocation (#2126) by @ampers0x26 +[core] REVIEWED: Expose MAX_KEYBOARD_KEYS and MAX_MOUSE_BUTTONS (#2127) +[core] REVIEWED: ExportMesh() (#2138) +[core] REVIEWED: Fullscreen switch on PLATFORM_WEB +[core] REVIEWED: GetMouseWheelMove(), fixed bug +[core] REVIEWED: GetApplicationDirectory() on macOS (#2304) +[core] REVIEWED: ToggleFullscreen() +[core] REVIEWED: Initialize/reset CORE.inputs global state (#2360) +[core] REVIEWED: MouseScrollCallback() (#2371) +[core] REVIEWED: SwapScreenBuffers() for PLATFORM_DRM +[core] REVIEWED: WaitTime(), fix regression causing video stuttering (#2503) by @flashback-fx +[core] REVIEWED: Mouse device support on PLATFORM_DRM (#2381) +[core] REVIEWED: Support OpenBSD timming functions +[core] REVIEWED: Improved boolean definitions (#2485) by @noodlecollie +[core] REVIEWED: TakeScreenshot(), use GetWindowScaleDPI() to calculate size in screenshot/recording (#2446) by @gulrak +[core] REVIEWED: Remove fps requirement for drm connector selection (#2468) by @Crydsch +[core] REVIEWED: IsFileExtension() (#2530) +[camera] REVIEWED: Some camera improvements (#2563) +[rlgl] ADDED: Premultiplied alpha blend mode (#2342) by @megagrump +[rlgl] REVIEWED: VR rendering not taking render target size into account (#2424) by @FireFlyForLife +[rlgl] REVIEWED: Set rlgl internal framebuffer (#2420) +[rlgl] REVIEWED: rlGetCompressedFormatName() +[rlgl] REVIEWED: Display OpenGL 4.3 capabilities with a compile flag (#2124) by @GithubPrankster +[rlgl] REVIEWED: rlUpdateTexture() +[rlgl] REVIEWED: Minimize buffer overflow probability +[rlgl] REVIEWED: Fix scissor mode on macOS (#2170) by @ArnaudValensi +[rlgl] REVIEWED: Clear SSBO buffers on loading (#2185) +[rlgl] REVIEWED: rlLoadShaderCode(), improved shader loading code +[rlgl] REVIEWED: Comment notes about custom blend modes (#2260) by @glorantq +[rlgl] REVIEWED: rlGenTextureMipmaps() +[rlgl] REVIEWED: rlTextureParameters() +[raymath] ADDED: Wrap() (#2522) by @Tekkitslime +[raymath] ADDED: Vector2Transform() +[raymath] ADDED: Vector2DistanceSqr() (#2376) by @AnilBK +[raymath] ADDED: Vector3DistanceSqr() (#2376) by @AnilBK +[raymath] ADDED: Vector2ClampValue(), Vector3ClampValue() (#2428) by @saccharineboi +[raymath] ADDED: Vector3RotateByAxisAngle() (#2590) by @Crydsch +[raymath] `WARNING`: REDESIGNED: Vector2Angle() returns radians instead of degrees (#2193) by @schveiguy +[raymath] `WARNING`: REMOVED: MatrixNormalize() (#2412) +[raymath] REVIEWED: Fix inverse length in Vector2Normalize() (#2189) by @HarriP +[raymath] REVIEWED: Vector2Angle() not working as expected (#2196) by @jdeokkim +[raymath] REVIEWED: Vector2Angle() and Vector3Angle() (#2203) by @trikko +[raymath] REVIEWED: QuaternionInvert(), code simplified (#2324) by @megagrump +[raymath] REVIEWED: QuaternionScale() (#2419) by @tana +[raymath] REVIEWED: Vector2Rotate(), optimized (#2340) by @jdeokkim +[raymath] REVIEWED: QuaternionFromMatrix(), QuaternionEquals() (#2591) by @kirigirihitomi +[raymath] REVIEWED: MatrixRotate*() (#2595, #2599) by @GoodNike +[shapes] REVIEWED: CheckCollision*() consistency +[shapes] REVIEWED: DrawRectanglePro(), support TRIANGLES drawing +[textures] ADDED: Support for QOI image format +[textures] REVIEWED: ImageColorTint(), GetImageColor(), ImageDrawRectangleRec(), optimized functions (#2429) by @AnilBK +[textures] REVIEWED: LoadTextureFromImage(), allow texture loading with no data transfer +[textures] REVIEWED: ImageDraw(), comment to note that f32bit is not supported (#2222) +[textures] REVIEWED: DrawTextureNPatch(), avoid batch overflow (#2401) by @JeffM2501 +[textures] REVIEWED: DrawTextureTiled() (#2173) +[textures] REVIEWED: GenImageCellular() (#2178) +[textures] REVIEWED: LoadTextureCubemap() (#2223, #2224) +[textures] REVIEWED: Export format for float 32bit +[textures] REVIEWED: ExportImage(), support export ".jpeg" files +[textures] REVIEWED: ColorAlphaBlend() (#2524) by @royqh1979 +[textures] REVIEWED: ImageResize() (#2572) +[textures] REVIEWED: ImageFromImage() (#2594) by @wiertek +[text] ADDED: ExportFontAsCode() +[text] ADDED: DrawTextCodepoints() (#2308) by @siddharthroy12 +[text] REVIEWED: TextIsEqual(), protect from NULLs (#2121) by @lukekras +[text] REVIEWED: LoadFontEx(), comment to specify how to get the default character set (#2221) by @JeffM2501 +[text] REVIEWED: GenImageFontAtlas(), increase atlas size guesstimate by @megagrump +[text] REVIEWED: GetCodepoint() (#2201) +[text] REVIEWED: GenImageFontAtlas() (#2556) +[text] REVIEWED: ExportFontAsCode() to use given font padding (#2525) by @TheTophatDemon +[models] ADDED: Reference code to load bones id and weight data for animations +[models] `WARNING`: REMOVED: GetRayCollisionModel() (#2405) +[models] REMOVED: GenMeshBinormals() +[models] REVIEWED: External library: vox_loader.h, 64bit issue (#2186) +[models] REVIEWED: Material color loading when no texture material is available (#2298) by @royqh1979 +[models] REVIEWED: Fix Undefined Symbol _ftelli64 in cgltf (#2319) by @audinue +[models] REVIEWED: LoadGLTF(), fix memory leak (#2441, #2442) by @leomonta +[models] REVIEWED: DrawTriangle3D() batch limits check (#2489) +[models] REVIEWED: DrawBillboardPro() (#2494) +[models] REVIEWED: DrawMesh*() issue (#2211) +[models] REVIEWED: ExportMesh() (#2220) +[models] REVIEWED: GenMeshCylinder() (#2225) +[audio] `WARNING`: ADDED: rAudioProcessor pointer to AudioStream struct (used by Sound and Music structs) +[audio] ADDED: SetSoundPan(), SetMusicPan(), SetAudioStreamPan(), panning support (#2205) by ptarabbia +[audio] ADDED: Audio stream input callback (#2212) by ptarabbia +[audio] ADDED: Audio stream processors support (#2212) by ptarabbia +[audio] REVIEWED: GetMusicTimePlayed(), incorrect value after the stream restarted for XM audio (#2092 #2215) by @ptarabbia +[audio] REVIEWED: Turn on interpolation for XM playback (#2216) by @ptarabbia +[audio] REVIEWED: Fix crash with delay example (#2472) by @ptarabbia +[audio] REVIEWED: PlaySoundMulti() (#2231) +[audio] REVIEWED: ExportWaveAsCode() +[audio] REVIEWED: UpdateMusicStream(), reduce dynamic allocations (#2532) by @dbechrd +[audio] REVIEWED: UpdateMusicStream() to support proper stream looping (#2579) by @veins1 +[utils] ADDED: ExportDataAsCode() +[utils] REVIEWED: Force flush stdout after trace messages (#2465) by @nagy +[easings] ADDED: Function descriptions (#2471) by @RobLoach +[camera] REVIEWED: Fix free camera panning in the wrong direction (#2347) by @DavidLyhedDanielsson +[examples] ADDED: core_window_should_close +[examples] ADDED: core_2d_camera_mouse_zoom (#2583) by @JeffM2501 +[examples] ADDED: shapes_top_down_lights (#2199) by @JeffM2501 +[examples] ADDED: textures_fog_of_war +[examples] ADDED: textures_gif_player +[examples] ADDED: text_codepoints_loading +[examples] ADDED: audio_stream_effects +[examples] REMOVED: core_quat_conversion, not working properly +[examples] REMOVED: raudio_standalone, moved to raudio repo +[examples] RENAMED: textures_rectangle -> textures_sprite_anim +[examples] REVIEWED: core_input_gamepad, improve joystick visualisation (#2390) by @kristianlm +[examples] REVIEWED: textures_draw_tiled +[examples] REVIEWED: shaders_mesh_instancing, free allocated matrices (#2425) by @AnilBK +[examples] REVIEWED: shaders_raymarching +[examples] REVIEWED: audio_raw_stream (#2205) by ptarabbia +[examples] REVIEWED: audio_music_stream +[examples] REVIEWED: shaders_mesh_instancing, simplified +[examples] REVIEWED: shaders_basic_lighting, rlights.h simplified +[examples] REVIEWED: All examples descriptions, included creation/update raylib versions +[parser] ADDED: Defines to parser (#2269) by @iskolbin +[parser] ADDED: Aliases to parser (#2444) by @lazaray +[parser] ADDED: Parse struct descriptions (#2214) by @eutro +[parser] ADDED: Parse enum descriptions and value descriptions (#2208) by @eutro +[parser] ADDED: Lua output format for parser by @iskolbin +[parser] ADDED: Makefile for raylib_parser by @iskolbin +[parser] ADDED: Support for truncating parser input (#2464) by @lazaray +[parser] ADDED: Support for calculated defines to parser (#2463) by @lazaray +[parser] REVIEWED: Update parser files (#2125) by @catmanl +[parser] REVIEWED: Fix memory leak in parser (#2136) by @ronnieholm +[parser] REVIEWED: EscapeBackslashes() +[parser] REVIEWED: Parser improvements (#2461 #2462) by @lazaray +[bindings] ADDED: License details for BINDINGS +[bindings] ADDED: dart-raylib (#2149) by @wolfenrain +[bindings] ADDED: raylib-cslo (#2169) by @jasonswearingen +[bindings] ADDED: raylib-d (#2194) by @schveiguy +[bindings] ADDED: raylib-guile (#2202) by @petelliott +[bindings] ADDED: raylib-scopes (#2238) by @salotz +[bindings] ADDED: naylib (Nim) (#2386) by @planetis-m +[bindings] ADDED: raylib.jl (Julia) (#2403) by @irishgreencitrus +[bindings] ADDED: raylib.zig (#2449) by @ryupold +[bindings] ADDED: racket-raylib (#2454) by @eutro +[bindings] ADDED: raylibr (#2611) by @ramiromagno +[bindings] ADDED: Raylib.4.0.Pascal (#2617) by @sysrpl +[bindings] REVIEWED: Multiple bindings updated to raylib 4.0 +[build] ADDED: VS2022 project +[build] ADDED: Support macOS by zig build system (#2175) +[build] ADDED: Support custom modules selection on compilation +[build] ADDED: Minimal web shell for WebAssembly compilation +[build] ADDED: BSD support for zig builds (#2332) by @zigster64 +[build] ADDED: Repology badge (#2367) by @jubalh +[build] ADDED: Support DLL compilation with TCC compiler (#2569) by @audinue +[build] ADDED: Missing examples to VS2022 examples solution +[build] REMOVED: VS2019 project (unmaintained) +[build] REMOVED: SUPPORT_MOUSE_CURSOR_POINT config option +[build] REVIEWED: Fixed RPi make install (#2217) by @wereii +[build] REVIEWED: Fix build results path on Linux and RPi (#2218) by @wereii +[build] REVIEWED: Makefiles debug flag +[build] REVIEWED: Fixed cross-compilation from x86-64 to RPi (#2233) by @pitpit +[build] REVIEWED: All Makefiles, simplified +[build] REVIEWED: All Makefiles, improve organization +[build] REVIEWED: All Makefiles, support CUSTOM_CFLAGS +[build] REVIEWED: Fixed compiling for Android using CMake (#2270) by @hero2002 +[build] REVIEWED: Make zig build functionality available to zig programs (#2271) by @Not-Nik +[build] REVIEWED: Update CMake project template with docs and web (#2274) by @RobLoach +[build] REVIEWED: Update VSCode project to work with latest makefile and web (#2296) by @phil-shenk +[build] REVIEWED: Support audio examples compilation with external glfw (#2329) by @locriacyber +[build] REVIEWED: Fix "make clean" target failing when shell is not cmd (#2338) by @Peter0x44 +[build] REVIEWED: Makefile linkage -latomic, required by miniaudio on ARM 32bit #2452 +[build] REVIEWED: Update raylib-config.cmake (#2374) by @marcogmaia +[build] REVIEWED: Simplify build.zig to not require user to specify raylib path (#2383) by @Hejsil +[build] REVIEWED: Fix OpenGL 4.3 graphics option in CMake (#2427) by @GoldenThumbs +[extras] `WARNING`: REMOVED: physac from raylib sources/examples, use github.com/raysan5/physac +[extras] `WARNING`: REMOVED: raygui from raylib/src/extras, use github.com/raysan5/raygui +[extras] `WARNING`: REMOVED: rmem from raylib/src/extras, moved to github.com/raylib-extras/rmem +[extras] `WARNING`: REMOVED: easings from raylib/src/extras, moved to github.com/raylib-extras/reasings +[extras] `WARNING`: REMOVED: raudio.h from raylib/src, moved to github.com/raysan5/raudio +[misc] REVIEWED: Update some external libraries to latest versions + +------------------------------------------------------------------------- +Release: raylib 4.0 - 8th Anniversary Edition (05 November 2021) +------------------------------------------------------------------------- +KEY CHANGES: + - Naming consistency and coherency: Complete review of the library: syntax, naming, comments, decriptions, logs... + - Event Automation System: Support for input events recording and automatic re-playing, useful for automated testing and more! + - Custom game-loop control: Intended for advanced users that want to control the events polling and the timming mechanisms + - rlgl 4.0: Completely decoupling from platform layer and raylib, intended for standalone usage as single-file header-only + - raymath 1.5: Complete review following new conventions, to make it more portable and self-contained + - raygui 3.0: Complete review and official new release, more portable and self-contained, intended for tools development + - raylib_parser: New tool to parse raylib.h and extract all required info into custom output formats (TXT, XML, JSON...) + - Zig and Odin official support + +Detailed changes: +[core] ADDED: Support canvas resizing on web (#1840) by @skylersaleh +[core] ADDED: GetMouseDelta() (#1832) by @adricoin2010 +[core] ADDED: Support additional mouse buttons (#1753) by @lambertwang +[core] ADDED: SetRandomSeed() (#1994) by @TommiSinivuo +[core] ADDED: GetTouchPointId() #1972 +[core] ADDED: EncodeDataBase64() and DecodeDataBase64() +[core] REMOVED: PLATFORM_UWP, difficult to maintain +[core] REMOVED: IsGamepadName() +[core] RENAMED: SwapBuffers() to SwapScreenBuffer() +[core] RENAMED: Wait() to WaitTime() +[core] RENAMED: RayHitInfo to RayCollision (#1781) +[core] RENAMED: GetRayCollisionGround() to GetRayCollisionQuad() (#1781) +[core] REVIEWED: Support mouse wheel on x-axis (#1948) +[core] REVIEWED: DisableCursor() on web by registering an empty mouse click event function in emscripten (#1900) by @grenappels +[core] REVIEWED: LoadShader() and default locations and descriptions +[core] REVIEWED: LoadShaderFromMemory() (#1851) by @Ruminant +[core] REVIEWED: WaitTime(), avoid global variables dependency to make the function is self-contained (#1841) +[core] REVIEWED: SetWindowSize() to work on web (#1847) by @nikki93 +[core] REVIEWED: Raspberry RPI/DRM keyboard blocking render loop (#1879) @luizpestana +[core] REVIEWED: Android multi-touch (#1869) by @humbe +[core] REVIEWED: Implemented GetGamepadName() for emscripten by @nbarkhina +[core] REVIEWED: HighDPI support (#1987) by @ArnaudValensi +[core] REVIEWED: KeyCallback(), register keys independently of the actions +[rlgl] ADDED: GRAPHIC_API_OPENGL_43 +[rlgl] ADDED: rlUpdateVertexBufferElements() (#1915) +[rlgl] ADDED: rlActiveDrawBuffers() (#1911) +[rlgl] ADDED: rlEnableColorBlend()/rlDisableColorBlend() +[rlgl] ADDED: rlGetPixelFormatName() +[rlgl] REVIEWED: rlUpdateVertexBuffer (#1914) by @630Studios +[rlgl] REVIEWED: rlDrawVertexArrayElements() (#1891) +[rlgl] REVIEWED: Wrong normal matrix calculation (#1870) +[raymath] ADDED: Vector3Angle() +[raymath] REVIEWED: QuaternionFromAxisAngle() (#1892) +[raymath] REVIEWED: QuaternionToMatrix() returning transposed result. (#1793) by @object71 +[shapes] ADDED: RenderPolyLinesEx() (#1758) by @lambertwang +[shapes] ADDED: DrawSplineBezierCubic() (#2021) by @SAOMDVN +[textures] ADDED: GetImageColor() #2024 +[textures] REMOVED: GenImagePerlinNoise() +[textures] RENAMED: GetTextureData() to LoadImageFromTexture() +[textures] RENAMED: GetScreenData() to LoadImageFromScreen() +[textures] REVIEWED: ExportImage() to use SaveFileData() (#1779) +[textures] REVIEWED: LoadImageAnim() #2005 +[text] ADDED: Security check in case of not valid font +[text] ADDED: `GetGlyphInfo()` to get glyph info for a specific codepoint +[text] ADDED: `GetGlyphAtlasRec()` to get glyph rectangle within the generated font atlas +[text] ADDED: DrawTextPro() with text rotation support, WARNING: DrawTextPro() requires including `rlgl.h`, before it was only dependant on `textures` module. +[text] ADDED: UnloadCodepoints() to safely free loaded codepoints +[text] REMOVED: DrawTextRec() and DrawTextRecEx(), moved to example, those functions could be very specific depending on user needs so it's better to give the user the full source in case of special requirements instead of allowing a function with +10 input parameters. +[text] RENAMED: struct `CharInfo` to `GlyphInfo`, actually that's the correct naming for the data contained. It contains the character glyph metrics and the glyph image; in the past it also contained rectangle within the font atlas but that data has been moved to `Font` struct directly, so, `GlyphInfo` is a more correct name. +[text] RENAMED: `CodepointToUtf8()` to `CodepointToUTF8()`, capitalization of UTF-8 is the correct form, it would also require de hyphen but it can be omitted in this case. +[text] RENAMED: `TextToUtf8()` to `TextCodepointsToUTF8` for consistency and more detail on the functionality. +[text] RENAMED: GetCodepoints() to LoadCodepoints(), now codepoint array data is loaded dynamically instead of reusing a limited static buffer. +[text] RENAMED: GetNextCodepoint() to GetCodepoint() +[models] ADDED: MagikaVoxel VOX models loading +[models] ADDED: GenMeshCone() (#1903) +[models] ADDED: GetModelBoundingBox() +[models] ADDED: DrawBillboardPro() (#1759) by @nobytesgiven +[models] ADDED: DrawCubeTextureRec() (#2001) by @tdgroot +[models] ADDED: DrawCylinderEx() and DrawCylinderWiresEx() (#2049) by @Horrowind +[models] REMOVED: DrawBillboardEx() +[models] RENAMED: MeshBoundingBox() to GetMeshBoundingBox() +[models] RENAMED: MeshTangents() to GenMeshTangents() +[models] RENAMED: MeshBinormals() to GenMeshBinormals() +[models] REVIEWED: GenMeshTangents() (#1877) by @630Studios +[models] REVIEWED: CheckCollisionBoxSphere() by @Crydsch +[models] REVIEWED: GetRayCollisionQuad() by @Crydsch +[models] REVIEWED: LoadGLTF(), fixed missing transformations and nonroot skinning by @MrDiver +[models] REVIEWED: LoadGLTF(), rewriten from scratch, removed animations support (broken) +[models] REVIEWED: Decouple DrawMesh() and DrawMeshInstanced() (#1958) +[models] REVIEWED: Support vertex color attribute for GLTF and IQM (#1790) by @object71 +[models] REVIEWED: DrawBillboardPro() (#1941) by @GithubPrankster +[models] REDESIGNED: Major review of glTF loading functionality (#1849) by @object71 +[audio] ADDED: SeekMusicStream() (#2006) by @GithubPrankster +[audio] REMOVED: GetAudioStreamBufferSizeDefault() +[audio] RENAMED: InitAudioStream() to LoadAudioStream() +[audio] RENAMED: CloseAudioStream() to UnloadAudioStream() +[audio] RENAMED: IsMusicPlaying() to IsMusicStreamPlaying() +[audio] REVIEWED: ExportWaveAsCode() +[audio] REDESIGNED: Use frameCount on audio instead of sampleCount +[utils] REVIEWED: exit() on LOG_FATAL instead of LOG_ERROR (#1796) +[examples] ADDED: core_custom_frame_control +[examples] ADDED: core_basic_screen_manager +[examples] ADDED: core_split_screen (#1806) by @JeffM2501 +[examples] ADDED: core_smooth_pixelperfect (#1771) by @NotManyIdeasDev +[examples] ADDED: shaders_texture_outline (#1883) by @GoldenThumbs +[examples] ADDED: models_loading_vox (#1940) by @procfxgen +[examples] ADDED: rlgl_compute_shader by @TSnake41 (#2088) +[examples] REMOVED: models_material_pbr +[examples] REMOVED: models_gltf_animation +[examples] REVIEWED: core_3d_picking +[examples] REVIEWED: core_input_mouse +[examples] REVIEWED: core_vr_simulator, RenderTexture usage +[examples] REVIEWED: core_window_letterbox, RenderTexture usage +[examples] REVIEWED: shapes_basic_shapes +[examples] REVIEWED: shapes_logo_raylib_anim +[examples] REVIEWED: textures_to_image +[examples] REVIEWED: text_rectangle_bounds +[examples] REVIEWED: text_unicode +[examples] REVIEWED: text_draw_3d +[examples] REVIEWED: models_loading +[examples] REVIEWED: models_skybox (#1792) (#1778) +[examples] REVIEWED: models_mesh_picking +[examples] REVIEWED: models_yaw_pitch_roll +[examples] REVIEWED: models_rlgl_solar_system +[examples] REVIEWED: shaders_custom_uniform, RenderTexture usage +[examples] REVIEWED: shaders_eratosthenes, RenderTexture usage +[examples] REVIEWED: shaders_julia_set, RenderTexture usage +[examples] REVIEWED: shaders_postprocessing, RenderTexture usage +[examples] REVIEWED: shaders_basic_lighting, simplified (#1865) +[examples] REVIEWED: audio_raw_stream.c +[examples] REVIEWED: raudio_standalone +[examples] REVIEWED: raylib_opengl_interop +[examples] REVIEWED: rlgl_standalone.c +[examples] REVIEWED: Resources licenses +[examples] REVIEWED: models resources reorganization +[templates] REMOVED: Moved to a separate repo: https://github.com/raysan5/raylib-game-template +[build] ADDED: Zig build file (#2014) by @TommiSinivuo +[build] ADDED: Android VS2019 solution (#2013) by @Kronka +[build] REMOVED: VS2017 project, outdated +[build] RENAMED: All raylib modules prefixed with 'r' (core -> rcore) +[build] RENAMED: SUPPORT_MOUSE_CURSOR_NATIVE to SUPPORT_MOUSE_CURSOR_POINT +[build] REVIEWED: examples/examples_template.c +[build] REVIEWED: Makefile to latest Emscripten SDK r23 +[build] REVIEWED: Makefile for latest Android NDK r32 LTS +[build] REVIEWED: raylib resource files +[build] Moved some extra raylib libraries to /extras/ directory +[*] UPDATED: Multiple bindings to latest version +[*] UPDATED: Most external libraries to latest versions (except GLFW) +[*] Multiple code improvements and fixes by multiple contributors! + +------------------------------------------------------------------------- +Release: raylib 3.7 (26 April 2021) +------------------------------------------------------------------------- +KEY CHANGES: + - [rlgl] REDESIGNED: Greater abstraction level, some functionality moved to core module + - [rlgl] REVIEWED: Instancing and stereo rendering + - [core] REDESIGNED: VR simulator, fbo/shader exposed to user + - [utils] ADDED: File access callbacks system + - [models] ADDED: glTF animations support (#1551) by @object71 + - [audio] ADDED: Music streaming support from memory (#1606) by @nezvers + - [*] RENAMED: enum types and enum values for consistency + +Detailed changes: +[core] ADDED: LoadVrStereoConfig() +[core] ADDED: UnloadVrStereoConfig() +[core] ADDED: BeginVrStereoMode() +[core] ADDED: EndVrStereoMode() +[core] ADDED: GetCurrentMonitor() (#1485) by @object71 +[core] ADDED: SetGamepadMappings() (#1506) +[core] RENAMED: struct Camera: camera.type to camera.projection +[core] RENAMED: LoadShaderCode() to LoadShaderFromMemory() (#1690) +[core] RENAMED: SetMatrixProjection() to rlSetMatrixProjection() +[core] RENAMED: SetMatrixModelview() to rlSetMatrixModelview() +[core] RENAMED: GetMatrixModelview() to rlGetMatrixModelview() +[core] RENAMED: GetMatrixProjection() to rlGetMatrixProjection() +[core] RENAMED: GetShaderDefault() to rlGetShaderDefault() +[core] RENAMED: GetTextureDefault() to rlGetTextureDefault() +[core] REMOVED: GetShapesTexture() +[core] REMOVED: GetShapesTextureRec() +[core] REMOVED: GetMouseCursor() +[core] REMOVED: SetTraceLogExit() +[core] REVIEWED: GetFileName() and GetDirectoryPath() (#1534) by @gilzoide +[core] REVIEWED: Wait() to support FreeBSD (#1618) +[core] REVIEWED: HighDPI support on macOS retina (#1510) +[core] REDESIGNED: GetFileExtension(), includes the .dot +[core] REDESIGNED: IsFileExtension(), includes the .dot +[core] REDESIGNED: Compresion API to use sdefl/sinfl libs +[rlgl] ADDED: SUPPORT_GL_DETAILS_INFO config flag +[rlgl] REMOVED: GenTexture*() functions (#721) +[rlgl] REVIEWED: rlLoadShaderDefault() +[rlgl] REDESIGNED: rlLoadExtensions(), more details exposed +[raymath] REVIEWED: QuaternionFromEuler() (#1651) +[raymath] REVIEWED: MatrixRotateZYX() (#1642) +[shapes] ADDED: DrawSplineBezierQuad() (#1468) by @epsilon-phase +[shapes] ADDED: CheckCollisionLines() +[shapes] ADDED: CheckCollisionPointLine() by @mkupiec1 +[shapes] REVIEWED: CheckCollisionPointTriangle() by @mkupiec1 +[shapes] REDESIGNED: SetShapesTexture() +[shapes] REDESIGNED: DrawCircleSector(), to use float params +[shapes] REDESIGNED: DrawCircleSectorLines(), to use float params +[shapes] REDESIGNED: DrawRing(), to use float params +[shapes] REDESIGNED: DrawRingLines(), to use float params +[textures] ADDED: DrawTexturePoly() and example (#1677) by @chriscamacho +[textures] ADDED: UnloadImageColors() for allocs consistency +[textures] RENAMED: GetImageData() to LoadImageColors() +[textures] REVIEWED: ImageClearBackground() and ImageDrawRectangleRec() (#1487) by @JeffM2501 +[textures] REVIEWED: DrawTexturePro() and DrawRectanglePro() transformations (#1632) by @ChrisDill +[text] REDESIGNED: DrawFPS() +[models] ADDED: UploadMesh() (#1529) +[models] ADDED: UpdateMeshBuffer() +[models] ADDED: DrawMesh() +[models] ADDED: DrawMeshInstanced() +[models] ADDED: UnloadModelAnimations() (#1648) by @object71 +[models] REMOVED: DrawGizmo() +[models] REMOVED: LoadMeshes() +[models] REMOVED: MeshNormalsSmooth() +[models] REVIEWED: DrawLine3D() (#1643) +[audio] REVIEWED: Multichannel sound system (#1548) +[audio] REVIEWED: jar_xm library (#1701) by @jmorel33 +[utils] ADDED: SetLoadFileDataCallback() +[utils] ADDED: SetSaveFileDataCallback() +[utils] ADDED: SetLoadFileTextCallback() +[utils] ADDED: SetSaveFileTextCallback() +[examples] ADDED: text_draw_3d (#1689) by @Demizdor +[examples] ADDED: textures_poly (#1677) by @chriscamacho +[examples] ADDED: models_gltf_model (#1551) by @object71 +[examples] RENAMED: shaders_rlgl_mesh_instanced to shaders_mesh_intancing +[examples] REDESIGNED: shaders_rlgl_mesh_instanced by @moliad +[examples] REDESIGNED: core_vr_simulator +[examples] REDESIGNED: models_yaw_pitch_roll +[build] ADDED: Config flag: SUPPORT_STANDARD_FILEIO +[build] ADDED: Config flag: SUPPORT_WINMM_HIGHRES_TIMER (#1641) +[build] ADDED: Config flag: SUPPORT_GL_DETAILS_INFO +[build] ADDED: Examples projects to VS2019 solution +[build] REVIEWED: Makefile to support PLATFORM_RPI (#1580) +[build] REVIEWED: Multiple typecast warnings by @JeffM2501 +[build] REDESIGNED: VS2019 project build paths +[build] REDESIGNED: CMake build system by @object71 +[*] RENAMED: Several functions parameters for consistency +[*] UPDATED: Multiple bindings to latest version +[*] UPDATED: All external libraries to latest versions +[*] Multiple code improvements and fixes by multiple contributors! + +------------------------------------------------------------------------- +Release: raylib 3.5 - 7th Anniversary Edition (25 December 2020) +------------------------------------------------------------------------- +KEY CHANGES: + - [core] ADDED: PLATFORM_DRM to support RPI4 and other devices (#1388) by @kernelkinetic + - [core] REDESIGNED: Window states management system through FLAGS + - [rlgl] ADDED: RenderBatch type and related functions to allow custom batching (internal only) + - [rlgl] REDESIGNED: Framebuffers API to support multiple attachment types (#721) + - [textures] REDESIGNED: Image*() functions, big performance improvements (software rendering) + - [*] REVIEWED: Multiple functions to replace file accesses by memory accesses + - [*] ADDED: GitHub Actions CI to support multiple raylib build configurations + +Detailed changes: +[core] ADDED: SetWindowState() / ClearWindowState() -> New flags added! +[core] ADDED: IsWindowFocused() +[core] ADDED: GetWindowScaleDPI() +[core] ADDED: GetMonitorRefreshRate() (#1289) by @Shylie +[core] ADDED: IsCursorOnScreen() (#1262) by @ChrisDill +[core] ADDED: SetMouseCursor() and GetMouseCursor() for standard Desktop cursors (#1407) by @chances +[core] REMOVED: struct RenderTexture2D: depthTexture variable +[core] REMOVED: HideWindow() / UnhideWindow() -> Use SetWindowState() +[core] REMOVED: DecorateWindow() / UndecorateWindow() -> Use SetWindowState() +[core] RENAMED: GetExtension() to GetFileExtension() +[core] REVIEWED: Several structs to reduce size and padding +[core] REVIEWED: struct Texture maps to Texture2D and TextureCubemap +[core] REVIEWED: ToggleFullscreen() (#1287) +[core] REVIEWED: InitWindow(), support empty title for window (#1323) +[core] REVIEWED: RPI: Mouse movements are bound to the screen resolution (#1392) (#1410) by @kernelkinetic +[core] REVIEWED: GetPrevDirectoryPath() fixes on Unix-like systems (#1246) by @ivan-cx +[core] REPLACED: rgif.h by msf_gif.h for automatic gif recording +[core] REDESIGNED: GetMouseWheelMove() to return float movement for precise scrolling (#1397) by @Doy-lee +[core] REDESIGNED: GetKeyPressed(), and added GetCharPressed() (#1336) +[core] UWP rework with improvements (#1231) by @Rover656 +[core] Gamepad axis bug fixes and improvement (#1228) by @mmalecot +[core] Updated joystick mappings with latest version of gamecontrollerdb (#1381) by @coderoth +[rlgl] Corrected issue with OpenGL 1.1 support +[rlgl] ADDED: rlDrawMeshInstanced() (#1318) by @seanpringle +[rlgl] ADDED: rlCheckErrors (#1321) by @seanpringle +[rlgl] ADDED: BLEND_SET blending mode (#1251) by @RandomErrorMessage +[rlgl] ADDED: rlSetLineWidth(), rlGetLineWidth(), rlEnableSmoothLines(), rlDisableSmoothLines() (#1457) by @JeffM2501 +[rlgl] RENAMED: rlUnproject() to Vector3Unproject() [raymath] +[rlgl] REVIEWED: Replace rlglDraw() calls by DrawRenderBatch() internal calls +[rlgl] REVIEWED: GenTextureCubemap(), use rlgl functionality only +[rlgl] REVIEWED: rlFramebufferAttach() to support texture layers +[rlgl] REVIEWED: GenDrawCube() and GenDrawQuad() +[rlgl] REVIEWED: Issues with vertex batch overflow (#1223) +[rlgl] REVIEWED: rlUpdateTexture(), issue with offsets +[rlgl] REDESIGNED: GenTexture*() to use the new fbo API (#721) +[raymath] ADDED: Normalize() and Remap() functions (#1247) by @NoorWachid +[raymath] ADDED: Vector2Reflect() (#1400) by @daniel-junior-dube +[raymath] ADDED: Vector2LengthSqr() and Vector3LengthSqr() (#1248) by @ThePituLegend +[raymath] ADDED: Vector2MoveTowards() function (#1233) by @anatagawa +[raymath] REVIEWED: Some functions consistency (#1197) by @Not-Nik +[raymath] REVIEWED: QuaternionFromVector3ToVector3() (#1263) by @jvocaturo +[raymath] REVIEWED: MatrixLookAt(), optimized (#1442) by @RandomErrorMessage +[shapes] ADDED: CheckCollisionLines(), by @Elkantor +[text] Avoid [textures] functions dependencies +[text] ADDED: Config flag: SUPPORT_TEXT_MANIPULATION +[text] ADDED: LoadFontFromMemory() (TTF only) (#1327) +[text] ADDED: UnloadFontData() +[text] RENAMED: FormatText() -> TextFormat() +[text] REVIEWED: Font struct, added charsPadding (#1432) +[text] REVIEWED: TextJoin() +[text] REVIEWED: TextReplace() (#1172) +[text] REVIEWED: LoadBMFont() to load data from memory (#1232) +[text] REVIEWED: GenImageFontAtlas(), fixed offset (#1171) +[text] REDESIGNED: LoadFontData(), reviewed input parameters +[text] REDESIGNED: LoadFontDefault(), some code simplifications +[text] REDESIGNED: LoadFontFromImage(), avoid LoadImageEx() +[text] REDESIGNED: LoadFontData(), avoid GenImageColor(), ImageFormat() +[text] REDESIGNED: LoadBMFont(), avoid ImageCopy(), ImageFormat(), ImageAlphaMask() +[textures] Move Color functions from [core] to [textures] module +[textures] ADDED: ColorAlphaBlend() +[textures] ADDED: GetPixelColor() +[textures] ADDED: SetPixelColor() +[textures] ADDED: LoadImageFromMemory() (#1327) +[textures] ADDED: LoadImageAnim() to load animated sequence of images +[textures] ADDED: DrawTextureTiled() (#1291) - @Demizdor +[textures] ADDED: UpdateTextureRec() +[textures] ADDED: UnloadImageColors(), UnloadImagePalette(), UnloadWaveSamples() +[textures] REMOVED: Config flag: SUPPORT_IMAGE_DRAWING +[textures] REMOVED: LoadImageEx() +[textures] REMOVED: LoadImagePro() +[textures] REMOVED: GetImageDataNormalized(), not exposed in the API +[textures] RENAMED: ImageExtractPalette() to GetImagePalette() +[textures] RENAMED: Fade() to ColorAlpha(), added #define for compatibility +[textures] RENAMED: GetImageData() -> LoadImageColors() +[textures] RENAMED: GetImagePalette() -> LoadImagePalette() +[textures] RENAMED: GetWaveData() -> LoadWaveSamples() +[textures] REVIEWED: GetPixelDataSize() to consider compressed data properly +[textures] REVIEWED: GetTextureData(), allow retrieving 32bit float data +[textures] REVIEWED: ImageDrawText*() params order +[textures] REVIEWED: ColorAlphaBlend(), support tint color +[textures] REVIEWED: ColorAlphaBlend(), integers-version, optimized (#1218) +[textures] REVIEWED: ImageDraw(), consider negative source offset properly (#1283) +[textures] REVIEWED: ImageDraw(), optimizations test (#1218) +[textures] REVIEWED: ImageResizeCanvas(), optimization (#1218) +[textures] REVIEWED: ExportImage(), optimized +[textures] REVIEWED: ImageAlphaPremultiply(), optimization +[textures] REVIEWED: ImageAlphaClear(), minor optimization +[textures] REVIEWED: ImageToPOT(), renamed parameter +[textures] REVIEWED: ImageCrop() (#1218) +[textures] REVIEWED: ImageToPOT() (#1218) +[textures] REVIEWED: ImageAlphaCrop() (#1218) +[textures] REVIEWED: ExportImage(), optimized (#1218) +[textures] REDESIGNED: ImageCrop(), optimized (#1218) +[textures] REDESIGNED: ImageRotateCCW(), optimized (#1218) +[textures] REDESIGNED: ImageRotateCW(), optimized (#1218) +[textures] REDESIGNED: ImageFlipHorizontal(), optimized (#1218) +[textures] REDESIGNED: ImageFlipVertical(), optimized (#1218) +[textures] REDESIGNED: ImageResizeCanvas(), optimized (#1218) +[textures] REDESIGNED: ImageDrawPixel(), optimized +[textures] REDESIGNED: ImageDrawLine(), optimized +[textures] REDESIGNED: ImageDraw(), optimized (#1218) +[textures] REDESIGNED: ImageResize(), optimized (#1218) +[textures] REDESIGNED: ImageFromImage(), optimized (#1218) +[textures] REDESIGNED: ImageDraw(), optimization (#1218) +[textures] REDESIGNED: ImageAlphaClear(), optimized (#1218) +[textures] REDESIGNED: ExportImageAsCode() to use memory buffer (#1232) +[textures] REDESIGNED: ColorFromHSV() +[models] ADDED: DrawTriangle3D() and DrawTriangleStrip3D() +[models] ADDED: UnloadModelKeepMeshes() +[models] REVIEWED: LoadModel(), avoid loading texcoords and normals from model if not existent +[models] REVIEWED: GenMeshCubicmap(), added comments and simplification +[models] REVIEWED: GenMeshCubicmap(), fixed generated normals (#1244) by @GoldenThumbs +[models] REVIEWED: GenMeshPoly(), fixed buffer overflow (#1269) by @frithrah +[models] REVIEWED: LoadOBJ(): Allow for multiple materials in obj files (#1408) by @chriscamacho and @codifies +[models] REVIEWED: LoadIQM() materials loading (#1227) by @sikor666 +[models] REVIEWED: LoadGLTF() to read from memory buffer +[models] REVIEWED: UpdateMesh(), fix extra memory allocated when updating color buffer (#1271) by @4yn +[models] REVIEWED: MeshNormalsSmooth() (#1317) by @seanpringle +[models] REVIEWED: DrawGrid() (#1417) +[models] REDESIGNED: ExportMesh() to use memory buffer (#1232) +[models] REDESIGNED: LoadIQM() and LoadModelAnimations() to use memory buffers +[audio] ADDED: LoadWaveFromMemory() (#1327) +[audio] REMOVED: SetMusicLoopCount() +[audio] REVIEWED: Several functions, sampleCount vs frameCount (#1423) +[audio] REVIEWED: SaveWAV() to use memory write insted of file +[audio] REVIEWED: LoadMusicStream(), support WAV music streaming (#1198) +[audio] REVIEWED: Support multiple WAV sampleSize for MusicStream (#1340) +[audio] REVIEWED: SetAudioBufferPitch() +[audio] REDESIGNED: Audio looping system +[audio] REDESIGNED: LoadSound(): Use memory loading (WAV, OGG, MP3, FLAC) (#1312) +[audio] REDESIGNED: ExportWaveAsCode() to use memory buffers +[utils] ADDED: MemAlloc() / MemFree() (#1440) +[utils] ADDED: UnloadFileData() / UnloadFileText() +[utils] REVIEWED: android_fopen() to support SDCard access +[utils] REDESIGNED: SaveFile*() functions to expose file access results (#1420) +[rmem] REVIEWED: MemPool and other allocators optimization (#1211) by @assyrianic +[examples] ADDED: core/core_window_flags +[examples] ADDED: core/core_quat_conversion by @chriscamacho and @codifies +[examples] ADDED: textures/textures_blend_modes (#1261) by @accidentalrebel +[examples] ADDED: textures/textures_draw_tiled (#1291) by @Demizdor +[examples] ADDED: shaders/shaders_hot_reloading (#1198) +[examples] ADDED: shaders/shaders_rlgl_mesh_instanced (#1318) by @seanpringle +[examples] ADDED: shaders/shaders_multi_sampler2d +[examples] ADDED: others/embedded_files_loading +[examples] REVIEWED: textures/textures_raw_data (#1286) +[examples] REVIEWED: textures/textures_sprite_explosion, replace resources +[examples] REVIEWED: textures/textures_particles_blending, replace resources +[examples] REVIEWED: textures/textures_image_processing, support mouse +[examples] REVIEWED: models/models_skybox to work on OpenGL ES 2.0 +[examples] REVIEWED: audio/resources, use open license resources +[examples] REVIEWED: others/raudio_standalone.c +[build] ADDED: New config.h configuration options exposing multiple #define values +[build] REMOVED: ANGLE VS2017 template project +[build] REVIEWED: All MSVC compile warnings +[build] Updated Makefile for web (#1332) by @rfaile313 +[build] Updated build pipelines to use latest emscripten and Android NDK +[build] Updated emscriptem build script to generate .a on WebAssembly +[build] Updated Android build for Linux, supporting ANDROID_NDK at compile time by @branlix3000 +[build] Updated VSCode project template tasks +[build] Updated VS2017.UWP project template by @Rover656 +[build] Updated Android build pipeline +[build] REMOVED: AppVeyor and Travis CI build systems +[*] Moved raysan5/raylib/games to independent repo: raysan5/raylib-games +[*] Replaced several examples resources with more open licensed alternatives +[*] Updated BINDINGS.md with NEW bindings and added raylib version binding! +[*] Updated all external libraries to latest versions +[*] Multiple code improvements and small fixes + +----------------------------------------------- +Release: raylib 3.0 (01 April 2020) +----------------------------------------------- +KEY CHANGES: + - Global context states used on all modules. + - Custom memory allocators for all modules and dependencies. + - Centralized file access system and memory data loading. + - Structures reviewed to reduce size and always be used as pass-by-value. + - Tracelog messages completely reviewed and categorized. + - raudio module reviewed to accomodate new Music struct and new miniaudio. + - text module reviewed to improve fonts generation and text management functions. + - Multiple new examples added and categorized examples table. + - GitHub Actions CI implemented for Windows, Linux and macOS. + +Detailed changes: +[build] ADDED: VS2017.ANGLE project, by @msmshazan +[build] ADDED: VS2017 project support for x64 platform configuration +[build] ADDED: Makefile for Android building on macOS, by @Yunoinsky +[build] ADDED: Makefile for Android building on Linux, by @pamarcos +[build] REMOVED: VS2015 project +[build] REVIEWED: VSCode project +[build] REVIEWED: Makefile build system +[build] REVIEWED: Android building, by @NimbusFox +[build] REVIEWED: Compilation with CLion IDE, by @Rover656 +[build] REVIEWED: Generation of web examples, by @pamarcos +[build] REVIEWED: Makefiles path to 'shell.html', by @niorad +[build] REVIEWED: VS2017 64bit compilation issues, by @spec-chum +[build] REVIEWED: Multiple fixes on projects building, by @ChrisDill, @JuDelCo, @electronstudio +[core] ADDED: Support touch/mouse indistinctly +[core] ADDED: FLAG_WINDOW_ALWAYS_RUN to avoid pause on minimize +[core] ADDED: Config flag SUPPORT_HALFBUSY_WAIT_LOOP +[core] ADDED: RPI mouse cursor point support on native mode +[core] ADDED: GetWorldToScreen2D()- Get screen space position for a 2d camera world space position, by @arvyy +[core] ADDED: GetScreenToWorld2D() - Get world space position for a 2d camera screen space position, by @arvyy +[core] ADDED: GetWorldToScreenEx() - Get size position for a 3d world space position +[core] ADDED: DirectoryExists() - Check if a directory path exists +[core] ADDED: GetPrevDirectoryPath() - Get previous directory path for a given path +[core] ADDED: CompressData() - Compress data (DEFLATE algorythm) +[core] ADDED: DecompressData() - Decompress data (DEFLATE algorythm) +[core] ADDED: GetWindowPosition() - Get window position XY on monitor +[core] ADDED: LoadFileData() - Load file data as byte array (read) +[core] ADDED: SaveFileData() - Save data to file from byte array (write) +[core] ADDED: LoadFileText() - Load text data from file (read), returns a '\0' terminated string +[core] ADDED: SaveFileText() - Save text data to file (write), string must be '\0' terminated +[core] REMOVED: Show raylib logo at initialization +[core] REVIEWED: GetFileName(), security checks +[core] REVIEWED: LoadStorageValue(), by @danimartin82 +[core] REVIEWED: SaveStorageValue(), by @danimartin82 +[core] REVIEWED: IsMouseButtonReleased(), when press/release events come too fast, by @oswjk +[core] REVIEWED: SetWindowMonitor(), by @DropsOfSerenity +[core] REVIEWED: IsFileExtension() to be case-insensitive +[core] REVIEWED: IsFileExtension() when checking no-extension files +[core] REVIEWED: Default font scale filter for HighDPI mode +[core] REVIEWED: Touch input scaling for PLATFORM_WEB +[core] REVIEWED: RPI input system, by @DarkElvenAngel +[core] REVIEWED: RPI input threads issues +[core] REVIEWED: OpenGL extensions loading and freeing +[core] REVIEWED: GetDirectoryPath() +[core] REVIEWED: Camera2D behavior, by @arvyy +[core] REVIEWED: OpenGL ES 2.0 extensions check +[rlgl] ADDED: Flags to allow frustrum culling near/far distance configuration at compile time +[rlgl] ADDED: Flags to sllow MAX_BATCH_BUFFERING config at compile time +[rlgl] ADDED: GetMatrixProjection(), by @chriscamacho +[rlgl] ADDED: rlUpdateMeshAt() - Update vertex or index data on GPU, at index, by @brankoku +[rlgl] REVIEWED: Vertex padding not zeroed for quads, by @kawa-yoiko +[rlgl] REVIEWED: Read texture data as RGBA from FBO on GLES 2.0 +[rlgl] REVIEWED: LoadShaderCode() for const correctness, by @heretique +[rlgl] REVIEWED: rlLoadTexture() +[rlgl] REVIEWED: rlReadTexturePixels() +[rlgl] REVIEWED: rlUpdateMesh() to supports updating indices, by @brankoku +[rlgl] REVIEWED: GenTextureCubemap(), renamed parameters for consistency +[rlgl] REVIEWED: HDR pixels loading +[raymath] ADDED: MatrixRotateXYZ(), by @chriscamacho +[raymath] RENAMED: Vector3Multiply() to Vector3Scale() +[camera] REVIEWED: Free camera pitch, by @chriscamacho +[camera] REVIEWED: Camera not working properly at z-align, by @Ushio +[shapes] ADDED: DrawTriangleStrip() - Draw a triangle strip defined by points +[shapes] ADDED: DrawEllipse() - Draw ellipse +[shapes] ADDED: DrawEllipseLines() - Draw ellipse outline +[shapes] ADDED: DrawPolyLines() - Draw a polygon outline of n sides +[shapes] REVIEWED: DrawPoly() shape rendering, by @AlexHCC +[textures] ADDED: LoadAnimatedGIF() - Load animated GIF file +[textures] ADDED: GetImageAlphaBorder() - Get image alpha border rectangle +[textures] ADDED: ImageFromImage() - Create an image from another image piece +[textures] ADDED: ImageClearBackground(), by @iamsouravgupta +[textures] ADDED: ImageDrawPixel(), by @iamsouravgupta +[textures] ADDED: ImageDrawCircle(), by @iamsouravgupta +[textures] ADDED: ImageDrawLineEx(), by @iamsouravgupta +[textures] ADDED: ImageDrawPixelV(), by @RobLoach +[textures] ADDED: ImageDrawCircleV(), by @RobLoach +[textures] ADDED: ImageDrawLineV(), by @RobLoach +[textures] ADDED: ImageDrawRectangleV(), by @RobLoach +[textures] ADDED: ImageDrawRectangleRec(), by @RobLoach +[textures] REVIEWED: ImageDrawPixel(), by @RobLoach +[textures] REVIEWED: ImageDrawLine(), by @RobLoach +[textures] REVIEWED: ImageDrawCircle(), by @RobLoach +[textures] REVIEWED: ImageDrawRectangle(), by @RobLoach +[textures] REVIEWED: ImageDraw(), now it supports color tint parameter +[textures] REVIEWED: ImageResizeCanvas() +[textures] REVIEWED: ImageCrop() with security checks +[textures] REVIEWED: ImageAlphaMask() +[textures] REVIEWED: ImageDrawRectangleLines() +[textures] REVIEWED: GetImageData() +[text] ADDED: TextCopy() - Copy one string to another, returns bytes copied +[text] ADDED: GetCodepoints() - Get all codepoints in a string +[text] ADDED: CodepointToUtf8() - Encode codepoint into utf8 text +[text] ADDED: DrawTextCodepoint() - Draw one character (codepoint) +[text] RENAMED: LoadDefaultFont() -> LoadFontDefault() +[text] RENAMED: TextCountCodepoints() -> GetCodepointsCount() +[text] REVIEWED: TextFormat(), to support caching, by @brankoku +[text] REVIEWED: LoadFontData(), generate empty image for space character +[text] REVIEWED: TextSplit() +[text] REVIEWED: TextToInteger() +[text] REVIEWED: GetNextCodepoint(), renamed parameters for clarity +[text] REVIEWED: GenImageFontAtlas(), improved atlas size computing +[text] REDESIGNED: struct Font, character rectangles have been moved out from CharInfo to Font +[text] REDESIGNED: struct CharInfo, now includes directly an Image of the glyph +[text] REDESIGNED: GenImageFontAtlas(), additional recs parameter added +[text] REDESIGNED: ImageTextEx(), to avoid font retrieval from GPU +[models] ADDED: Support rlPushMatrix() and rlPopMatrix() on mesh drawing +[models] ADDED: DrawPoint3D() - Draw a point in 3D space, actually a small line, by @ProfJski +[models] ADDED: Multi texture support for materials in GLTF format, by @Gamerfiend, @chriscamacho +[models] REVIEWED: LoadGLTF(), fixed memory leak, by @jubalh +[models] REVIEWED: LoadIQM(), support multiple animations loading, by @culacant +[models] REVIEWED: GetCollisionRayModel(), to avoid pointers +[models] REVIEWED: CheckCollisionRay*(), parameters renamed +[models] REVIEWED: UnloadMesh(), to avoid pointers +[models] REVIEWED: LoadModel(), memory initialization +[models] REVIEWED: UpdateModelAnimation(), added security checks +[models] REVIEWED: Multiple fixes on models loading, by @jubalh +[models] REVIEWED: Normals updated when using animated meshes, by @@las3rlars +[models] REVIEWED: Compilation when the SUPPORT_MESH_GENERATION not set, by @@Elkantor +[raudio] ADDED: Multi-channel audio playing, by @chriscamacho +[raudio] REMOVED: LoadWaveEx() +[raudio] RENAMED: IsAudioBufferProcessed() to IsAudioStreamProcessed() +[raudio] REVIEWED: Ensure .xm playback starts in the right place, by @illegalinstruction +[raudio] REVIEWED: Fix short non-looping sounds, by @jbosh +[raudio] REVIEWED: Modules playing time to full length +[raudio] REDESIGNED: Replaced Music pointer by struct +[raudio] REDESIGNED: Removed sampleLeft from Music struct +[examples] ADDED: core_scissor_test, by @ChrisDill +[examples] ADDED: core_2d_camera_platformer, by @arvyy +[examples] ADDED: textures_mouse_painting, by @ChrisDill +[examples] ADDED: models_waving_cubes, by @codecat +[examples] ADDED: models_solar_system, by @aldrinmartoq +[examples] ADDED: shaders_fog, by @chriscamacho +[examples] ADDED: shaders_texture_waves, by @Anata +[examples] ADDED: shaders_basic_lighting, by @chriscamacho +[examples] ADDED: shaders_simple_mask, by @chriscamacho +[examples] ADDED: audio_multichannel_sound, by @chriscamacho +[examples] ADDED: shaders_spotlight, by @chriscamacho +[examples] RENAMED: text_sprite_font > text_font_spritefont +[examples] RENAMED: text_ttf_loading > text_font_filters +[examples] RENAMED: text_bmfont_ttf > text_font_loading +[examples] REMOVED: models_obj_viewer +[examples] REMOVED: models_solar_system +[examples] REVIEWED: models_obj_loading > models_loading +[examples] REVIEWED: models_materials_pbr, shader issues +[examples] REVIEWED: core_window_letterbox, detailed explanation, by @jotac0 +[examples] REVIEWED: core_window_letterbox, virtual mouse, by @anatagawa +[games] ADDED: GGJ2020 game - RE-PAIR +[*] Misc fixes and tweaks, by @yaram, @oraoto, @zatherz, @piecedigital, @Shylie +[*] Update ALL supported projects (Notepad++, VS2017) +[*] Update ALL external libraries to latest versions (29.Jan.2020) +[*] Update ALL examples and games +[*] Update BINDINGS list + +----------------------------------------------- +Release: raylib 2.5 (May 2019) +----------------------------------------------- +KEY CHANGES: + - [core] Redesigned Gamepad mechanism, now common to all platforms and gamepads + - [core] HighDPI monitors support with automatic content scaling + - [rlgl] Complete module redesign to use one single internal buffer + - [rlgl] VR system redesign to allow custom device parameters and distortion shader + - [shapes] New drawing shapes available: CircleSector, Ring and RectangleRounded + - [text] New text management API (multiple functions) + - [text] Full Unicode support (utf8 text) + - [textures] Cubemap textures support + - [textures] Quad and N-Patch drawing + - [models] Skeletal model animation support + - [models] Support multiple meshes per model + - [models] Support glTF model loading + +Detailed changes: +[build] REVIEWED: Default raylib and examples Makefile +[build] REVIEWED: Notepad++ NppExec scripts +[build] REVIEWED: VS2015 and VS2017 projects +[build] REVIEWED: Android APK build pipeline +[core] Converted most #defined values as enum values +[core] Complete redesign of RPI input system to use evdev events +[core] ADDED: IsWindowResized() - Check if window has been resized +[core] ADDED: IsWindowHidden() - Check if window is currently hidden +[core] ADDED: UnhideWindow() - Show the window +[core] ADDED: HideWindow() - Hide the window +[core] ADDED: GetWindowHandle() - Get native window handle +[core] ADDED: GetMonitorCount() - Get number of connected monitors +[core] ADDED: GetMonitorWidth() - Get primary monitor width +[core] ADDED: GetMonitorHeight() - Get primary monitor height +[core] ADDED: GetMonitorPhysicalWidth() - Get primary monitor physical width in millimetres +[core] ADDED: GetMonitorPhysicalHeight() - Get primary monitor physical height in millimetres +[core] ADDED: GetMonitorName() - Get the human-readable, UTF-8 encoded name of the primary monitor +[core] ADDED: GetClipboardText() - Get clipboard text content +[core] ADDED: SetClipboardText() - Set clipboard text content +[core] ADDED: ColorFromHSV() - Returns a Color from HSV values +[core] ADDED: FileExists() - Check if file exists +[core] ADDED: GetFileNameWithoutExt() - Get filename string without extension (memory should be freed) +[core] ADDED: GetDirectoryFiles() - Get filenames in a directory path (memory should be freed) +[core] ADDED: ClearDirectoryFiles() - Clear directory files paths buffers (free memory) +[core] ADDED: OpenURL() - Open URL with default system browser (if available) +[core] ADDED: SetMouseOffset() - Set mouse offset +[core] ADDED: SetMouseScale() - Set mouse scaling +[core] REMOVED: ShowLogo() - Activate raylib logo at startup (can be done with flags) +[shapes] ADDED: DrawCircleSector() - Draw a piece of a circle +[shapes] ADDED: DrawCircleSectorLines() - Draw circle sector outline +[shapes] ADDED: DrawRing() - Draw ring +[shapes] ADDED: DrawRingLines() - Draw ring outline +[shapes] ADDED: DrawRectangleRounded() - Draw rectangle with rounded edges +[shapes] ADDED: DrawRectangleRoundedLines() - Draw rectangle with rounded edges outline +[shapes] ADDED: SetShapesTexture() - Define default texture used to draw shapes +[textures] REVIEWED: ExportImage() - Reorder function parameters +[textures] REVIEWED: ImageDrawRectangle() - Remove unneeded parameter +[textures] ADDED: ExportImageAsCode() - Export image as code file defining an array of bytes +[textures] ADDED: LoadTextureCubemap() - Load cubemap from image, multiple image cubemap layouts supported +[textures] ADDED: ImageExtractPalette() - Extract color palette from image to maximum size (memory should be freed) +[textures] ADDED: ImageDrawRectangleLines() - Draw rectangle lines within an image +[textures] ADDED: DrawTextureQuad() - Draw texture quad with tiling and offset parameters +[textures] ADDED: DrawTextureNPatch() - Draws a texture (or part of it) that stretches or shrinks nicely +[models] REVIEWED: LoadMesh() -> LoadMeshes() - Support multiple meshes loading +[models] REVIEWED: LoadMaterial() -> LoadMaterials() - Support multiple materials loading +[models] REVIEWED: ExportMesh() - Reorder parameters +[models] ADDED: DrawCubeWiresV() - Draw cube wires (Vector version) +[models] ADDED: GenMeshPoly() - Generate polygonal mesh +[models] ADDED: SetMaterialTexture() - Set texture for a material map type (MAP_DIFFUSE, MAP_SPECULAR...) +[models] ADDED: SetModelMeshMaterial() - Set material for a mesh +[models] ADDED: LoadModelAnimations() - Load model animations from file +[models] ADDED: UpdateModelAnimation() - Update model animation pose +[models] ADDED: UnloadModelAnimation() - Unload animation data +[models] ADDED: IsModelAnimationValid() - Check model animation skeleton match +[rlgl] Improved internal batching mechanism (multibuffering support, triangle texcoords...) +[rlgl] REVIEWED: rlPushMatrix()/rlPopMatrix() - Now works like OpenGL 1.1 +[rlgl] REVIEWED: SetShaderValue() - More generic, now requires uniform type +[rlgl] REMOVED: SetShaderValuei() - Can be acoomplished with new SetShaderValue() +[rlgl] ADDED: SetShaderValueV() - Set shader uniform value vector +[rlgl] ADDED: SetShaderValueTexture() - Set shader uniform value for texture +[rlgl] ADDED: BeginScissorMode() - Begin scissor mode (define screen area for following drawing) +[rlgl] ADDED: EndScissorMode() - End scissor mode +[rlgl] ADDED: SetVrConfiguration() - Set stereo rendering configuration parameters +[rlgl] REVIEWED: InitVrSimulator() - No input parameter required, use SetVrConfiguration() +[text] REVIEWED: LoadFontEx() - Reorder function parameters +[text] REVIEWED: LoadFontData() - Reorder function parameters +[text] REVIEWED: GenImageFontAtlas() - Reorder function parameters +[text] RENAMED: FormatText() -> TextFormat() +[text] RENAMED: SubText() -> TextSubtext() +[text] ADDED: LoadFontFromImage() - Load font from Image (XNA style) +[text] ADDED: DrawTextRec() - Draw text using font inside rectangle limits +[text] ADDED: DrawTextRecEx() - Draw text using font inside rectangle limits with support for text selection +[text] ADDED: TextIsEqual() - Check if two text string are equal +[text] ADDED: TextLength() - Get text length, checks for '\0' ending +[text] ADDED: TextReplace() - Replace text string (memory should be freed!) +[text] ADDED: TextInsert() - Insert text in a position (memory should be freed!) +[text] ADDED: TextJoin() - Join text strings with delimiter +[text] ADDED: TextSplit() - Split text into multiple strings +[text] ADDED: TextAppend() - Append text at specific position and move cursor! +[text] ADDED: TextFindIndex() - Find first text occurrence within a string +[text] ADDED: TextToUpper() - Get upper case version of provided string +[text] ADDED: TextToLower() - Get lower case version of provided string +[text] ADDED: TextToPascal() - Get Pascal case notation version of provided string +[text] ADDED: TextToInteger() - Get integer value from text (negative values not supported) +[raudio] ADDED: ExportWave() - Export wave data to file +[raudio] ADDED: ExportWaveAsCode() - Export wave sample data to code (.h) +[raudio] ADDED: IsAudioStreamPlaying() - Check if audio stream is playing +[raudio] ADDED: SetAudioStreamVolume() - Set volume for audio stream (1.0 is max level) +[raudio] ADDED: SetAudioStreamPitch() - Set pitch for audio stream (1.0 is base level) +[examples] Complete review of full examples collection, many additions +[examples] ADDED: core_custom_logging - Custom trace log system +[examples] ADDED: core_input_multitouch - Multitouch input example +[examples] ADDED: core_window_letterbox - Window adapted to screen +[examples] ADDED: core_loading_thread - Data loading in second thread +[examples] REVIEWED: core_input_gamepad - Adapted to new gamepad system +[examples] REVIEWED: core_vr_simulator - HMD device parameters and distortion shader should be provided +[examples] ADDED: core_window_scale_letterbox - Windows resizing and letterbox content +[examples] ADDED: shapes_rectangle_scaling_mouse - Scale a rectangle with mouse +[examples] ADDED: shapes_draw_circle_sector - Circle sector drawing +[examples] ADDED: shapes_draw_ring - Ring drawing +[examples] ADDED: shapes_draw_rectangle_rounded - Rounded rectangle drawing +[examples] ADDED: shapes_bouncing_ball - Ball bouncing in the screen +[examples] ADDED: shapes_collision_area - Collision detection and drawing +[examples] ADDED: shapes_following_eyes - Some maths on eyes and mouse +[examples] ADDED: shapes_easings_ball_anim - Ball animation +[examples] ADDED: shapes_easings_box_anim - Box animation +[examples] ADDED: shapes_easings_rectangle_array - Rectangles animation +[examples] REVIEWED: shapes_colors_palette - Reviewed color selection and text displaying +[examples] ADDED: textures_background_scrolling - Scrolling and parallaz background effect +[examples] ADDED: textures_image_npatch - Drawing N-Patch based boxes +[examples] ADDED: textures_sprite_button - Sprite button with sound +[examples] ADDED: textures_sprite_explosion - Sprite explosion with sound +[examples] ADDED: textures_bunnymark - Benchmarking test +[examples] ADDED: text_draw_inside_rectangle - Drawing text inside a delimited rectangle box +[examples] ADDED: text_unicode - Multiple languages text drawing +[examples] ADDED: text_rectangle_bound - Fit text inside a rectangle +[examples] REVIEWED: text_bmfont_ttf - Simplified example +[examples] ADDED: models_animation - Animated models loading and animation playing +[examples] ADDED: models_obj_viewer - Draw and drop models viewer +[examples] ADDED: models_rlgl_solar_system - Solar system simulation using rlgl functionality +[examples] ADDED: models_first_person_maze - 3D maze fps +[examples] ADDED: shaders_palette_switch - Switching color palette on shader +[examples] ADDED: shaders_raymarching - Raymarching shader +[examples] ADDED: shaders_texture_drawing - Texture drawing on GPU +[examples] ADDED: shaders_texture_waves - Texture waves on shader +[examples] ADDED: shaders_julia_set - Julia set fractals +[examples] ADDED: shaders_eratosthenes - Prime number visualization shader +[examples] REVIEWED: audio_raw_stream - Mostly rewritten +[games] ADDED: GGJ19 game - Cat vs Roomba +[*] Updated external libraries to latest version +[*] Multiple bugs corrected (check github issues) + +----------------------------------------------- +Release: raylib 2.0 (July 2018) +----------------------------------------------- +KEY CHANGES: + - Removed external dependencies (GLFW3 and OpenAL) + - Complete redesign of audio module to use miniaudio library + - Support AppVeyor and Travis CI (continuous integration) building + - Reviewed raymath.h for better consistency and performance (inlining) + - Refactor all #define SUPPORT_* into a single config.h + - Support TCC compiler (32bit and 64bit) + +Detailed changes: +[build] REMOVED: GitHub develop branch +[build] REMOVED: External dependencies GLFW and OpenAL +[build] ADDED: Android 64bit ARM support +[build] ADDED: FreeBSD, OpenBSD, NetBSD, Dragon Fly OS support +[build] ADDED: Universal Windows Platform (UWP) support +[build] ADDED: Wayland Linux desktop support +[build] ADDED: AppVeyor CI for automatic Windows builds +[build] ADDED: Travis CI for automatic Linux/macOS builds +[build] ADDED: rglfw (GLFW3 module) to avoid external dependency +[build] ADDED: VS2017 UWP project +[build] ADDED: Builder project template +[build] ADDED: Compiler memory sanitizer for better debug +[build] ADDED: CMake package target and CI auto-deploy tags +[build] ADDED: DEBUG library building support +[build] ADDED: Notepad++ NppExec scripts +[build] REVIEWED: VS2015 and VS2017 projects +[build] REVIEWED: Android APK build pipeline +[core] REVIEWED: Window creation hints to support transparent windows +[core] Unified InitWindow() between platforms +[core] Export Android main entry point +[core] RENAMED: Begin3dMode() to BeginMode3D() +[core] RENAMED: End3dMode() to EndMode3D() +[core] RENAMED: Begin2dMode() to BeginMode2D() +[core] RENAMED: End2dMode() to EndMode2D() +[core] RENAMED: struct Camera to Camera3D +[core] RENAMED: struct SpriteFont to Font -> plus all required functions! +[core] RENAMED: enum TextureFormat to PixelFormat +[core] REVIEWED: Rectangle params int to float +[core] REVIEWED: timing system for macOS +[core] REMOVED: ColorToFloat() +[core] ADDED: GetCurrentTime() on macOS +[core] ADDED: GetTime() +[core] ADDED: struct Vector4 +[core] ADDED: SetTraceLog() to define trace log messages type +[core] ADDED: GetFileName() to get filename from path string +[core] ADDED: ColorToHSV() +[core] ADDED: ColorNormalize() +[core] ADDED: SetWindowSize() to scale Windows in runtime +[core] ADDED: SetMouseScale() to scale mouse input +[core] ADDED: key definitions - KEY_GRAVE, KEY_SLASH, KEY_BACKSLASH +[core] RENAMED: GetHexValue() to ColorToInt() +[core] REVIEWED: Fade() +[core] REVIEWED: InitWindow() to avoid void pointer (safety) +[core] Support camera 3d orthographic projection mode +[shapes] ADDED: DrawRectangleLinesEx() +[textures] Improved pixel formats support (32bit channels) +[textures] Improved textures support for OpenGL 2.1 +[textures] REMOVED: DrawRectangleT() --> Added support to DrawRectangle() +[textures] ADDED: GetPixelDataSize(); pixel data size in bytes (image or texture) +[textures] ADDED: ImageAlphaClear() --> Clear alpha channel to desired color +[textures] ADDED: ImageAlphaCrop() --> Crop image depending on alpha value +[textures] ADDED: ImageAlphaPremultiply() --> Premultiply alpha channel +[textures] ADDED: ImageDrawRectangle() +[textures] ADDED: ImageMipmaps() +[textures] ADDED: GenImageColor() +[textures] ADDED: GetPixelDataSize() +[textures] ADDED: ImageRotateCW() +[textures] ADDED: ImageRotateCCW() +[textures] ADDED: ImageResizeCanvas() +[textures] ADDED: GetImageDataNormalized() +[textures] REVIEWED: ImageFormat() to use normalized data +[textures] REVIEWED: Manual mipmap generation +[textures] REVIEWED: LoadASTC() +[textures] REVIEWED: GenImagePerlinNoise() +[textures] REVIEWED: ImageTextEx() to support UTF8 basic characters +[textures] REVIEWED: GetTextureData() for RPI - requires some work +[textures] Added new example: text drawing on image +[text] Corrected issue with ttf font y-offset +[text] Support SDF font data generation +[text] ADDED: GenImageFontAtlas() +[text] ADDED: LoadFontData() to load data from TTF file +[text] REMOVED: LoadTTF() internal function +[text] REVIEWED: DrawTextEx() - avoid rendering SPACE character! +[text] RENAMED: GetDefaultFont() to GetFontDefault() +[rlgl] ADDED: rlCheckBufferLimit() +[rlgl] ADDED: LoadShaderCode() +[rlgl] ADDED: GetMatrixModelview() +[rlgl] ADDED: SetVrDistortionShader(Shader shader) +[rlgl] REVIEWED: rlLoadTexture() - added mipmaps support, improved compressed textures loading +[rlgl] REVIEWED: rlReadTexturePixels() +[models] Support 4 components mesh.tangent data +[models] Removed tangents generation from LoadOBJ() +[models] ADDED: MeshTangents() +[models] ADDED: MeshBinormals() +[models] ADDED: ExportMesh() +[models] ADDED: GetCollisionRayModel() +[models] RENAMED: CalculateBoundingBox() to MeshBoundingBox() +[models] REMOVED: GetCollisionRayMesh() - does not consider model transform +[models] REVIEWED: LoadMesh() - fallback to default cube mesh if loading fails +[audio] ADDED: Support for MP3 fileformat +[audio] ADDED: IsAudioStreamPlaying() +[audio] ADDED: SetAudioStreamVolume() +[audio] ADDED: SetAudioStreamPitch() +[utils] Corrected issue with SaveImageAs() +[utils] RENAMED: SaveImageAs() to ExportImage() +[utils] REMOVED: rres support - moved to external library (rres.h) +[shaders] REVIEWED: GLSL 120 shaders +[raymath] ADDED: Vector3RotateByQuaternion() +[raymath] REVIEWED: math usage to reduce temp variables +[raymath] REVIEWED: Avoid pointer-based parameters for API consistency +[physac] REVIEWED: physac.h timing system +[examples] Replaced dwarf model by brand new 3d assets: 3d medieval buildings +[examples] Assets cleaning and some replacements +[games] ADDED: GGJ18 game - transmission mission +[games] REVIEWED: Light my Ritual game - improved gameplay drawing +[*] Updated external libraries to latest version +[*] Multiple bugs corrected (check github issues) + +----------------------------------------------- +Release: raylib 1.8.0 (Oct 2017) +----------------------------------------------- +NOTE: + In this release, multiple parts of the library have been reviewed (again) for consistency and simplification. + It exposes more than 30 new functions in comparison with previous version and it improves overall programming experience. + +BIG CHANGES: + - New Image generation functions: Gradient, Checked, Noise, Cellular... + - New Mesh generation functions: Cube, Sphere, Cylinder, Torus, Knot... + - New Shaders and Materials systems to support PBR materials + - Custom Android APK build pipeline with simple Makefile + - Complete review of rlgl layer functionality + - Complete review of raymath functionality + +detailed changes: +[rlgl] RENAMED: rlglLoadTexture() to rlLoadTexture() +[rlgl] RENAMED: rlglLoadRenderTexture() to rlLoadRenderTexture() +[rlgl] RENAMED: rlglUpdateTexture() to rlUpdateTexture() +[rlgl] RENAMED: rlglGenerateMipmaps() to rlGenerateMipmaps() +[rlgl] RENAMED: rlglReadScreenPixels() to rlReadScreenPixels() +[rlgl] RENAMED: rlglReadTexturePixels() to rlReadTexturePixels() +[rlgl] RENAMED: rlglLoadMesh() to rlLoadMesh() +[rlgl] RENAMED: rlglUpdateMesh() to rlUpdateMesh() +[rlgl] RENAMED: rlglDrawMesh() to rlDrawMesh() +[rlgl] RENAMED: rlglUnloadMesh() to rlUnloadMesh() +[rlgl] RENAMED: rlglUnproject() to rlUnproject() +[rlgl] RENAMED: LoadCompressedTexture() to LoadTextureCompressed() +[rlgl] RENAMED: GetDefaultTexture() to GetTextureDefault() +[rlgl] RENAMED: LoadDefaultShader() to LoadShaderDefault() +[rlgl] RENAMED: LoadDefaultShaderLocations() to SetShaderDefaultLocations() +[rlgl] RENAMED: UnloadDefaultShader() to UnLoadShaderDefault() +[rlgl] ADDED: rlGenMapCubemap(), Generate cubemap texture map from HDR texture +[rlgl] ADDED: rlGenMapIrradiance(), Generate irradiance texture map +[rlgl] ADDED: rlGenMapPrefilter(), Generate prefilter texture map +[rlgl] ADDED: rlGenMapBRDF(), Generate BRDF texture map +[rlgl] ADDED: GetVrDeviceInfo(), Get VR device information for some standard devices +[rlgl] REVIEWED: InitVrSimulator(), to accept device parameters as input +[core] ADDED: SetWindowTitle(), Set title for window (only PLATFORM_DESKTOP) +[core] ADDED: GetExtension(), Get file extension +[shapes] REMOVED: DrawRectangleGradient(), replaced by DrawRectangleGradientV() and DrawRectangleGradientH() +[shapes] ADDED: DrawRectangleGradientV(), Draw a vertical-gradient-filled rectangle +[shapes] ADDED: DrawRectangleGradientH(), Draw a horizontal-gradient-filled rectangle +[shapes] ADDED: DrawRectangleGradientEx(), Draw a gradient-filled rectangle with custom vertex colors +[shapes] ADDED: DrawRectangleT(), Draw rectangle using text character +[textures] ADDED: SaveImageAs(), Save image as PNG file +[textures] ADDED: GenImageGradientV(), Generate image: vertical gradient +[textures] ADDED: GenImageGradientH(), Generate image: horizontal gradient +[textures] ADDED: GenImageGradientRadial(), Generate image: radial gradient +[textures] ADDED: GenImageChecked(), Generate image: checked +[textures] ADDED: GenImageWhiteNoise(), Generate image: white noise +[textures] ADDED: GenImagePerlinNoise(), Generate image: perlin noise +[textures] ADDED: GenImageCellular(), Generate image: cellular algorithm. Bigger tileSize means bigger cells +[textures] ADDED: GenTextureCubemap(), Generate cubemap texture from HDR texture +[textures] ADDED: GenTextureIrradiance(), Generate irradiance texture using cubemap data +[textures] ADDED: GenTexturePrefilter(), Generate prefilter texture using cubemap data +[textures] ADDED: GenTextureBRDF(), Generate BRDF texture using cubemap data +[models] REMOVED: LoadMeshEx(), Mesh struct variables can be directly accessed +[models] REMOVED: UpdateMesh(), very ineficient +[models] REMOVED: LoadHeightmap(), use GenMeshHeightmap() and LoadModelFromMesh() +[models] REMOVED: LoadCubicmap(), use GenMeshCubicmap() and LoadModelFromMesh() +[models] RENAMED: LoadDefaultMaterial() to LoadMaterialDefault() +[models] ADDED: GenMeshPlane(), Generate plane mesh (with subdivisions) +[models] ADDED: GenMeshCube(), Generate cuboid mesh +[models] ADDED: GenMeshSphere(), Generate sphere mesh (standard sphere) +[models] ADDED: GenMeshHemiSphere(), Generate half-sphere mesh (no bottom cap) +[models] ADDED: GenMeshCylinder(), Generate cylinder mesh +[models] ADDED: GenMeshTorus(), Generate torus mesh +[models] ADDED: GenMeshKnot(), Generate trefoil knot mesh +[models] ADDED: GenMeshHeightmap(), Generate heightmap mesh from image data +[models] ADDED: GenMeshCubicmap(), Generate cubes-based map mesh from image data +[raymath] REVIEWED: full Matrix functionality to align with GLM in usage +[raymath] RENAMED: Vector3 functions for consistency: Vector*() renamed to Vector3*() +[build] Integrate Android APK building into examples Makefile +[build] Integrate Android APK building into templates Makefiles +[build] Improved Visual Studio 2015 project, folders, references... +[templates] Reviewed the full pack to support Android building +[examples] Reviewed full collection to adapt to raylib changes +[examples] [textures] ADDED: textures_image_generation +[examples] [models] ADDED: models_mesh_generation +[examples] [models] ADDED: models_material_pbr +[examples] [models] ADDED: models_skybox +[examples] [models] ADDED: models_yaw_pitch_roll +[examples] [others] REVIEWED: rlgl_standalone +[examples] [others] REVIEWED: audio_standalone +[github] Moved raylib webpage to own repo: github.com/raysan5/raylib.com +[games] Reviewed game: Koala Seasons +[*] Updated STB libraries to latest version +[*] Multiple bugs corrected (check github issues) + +----------------------------------------------- +Release: raylib 1.7.0 (20 May 2017) +----------------------------------------------- +NOTE: + In this new raylib release, multiple parts of the library have been reviewed for consistency and simplification. + It exposes almost 300 functions, around 30 new functions in comparison with previous version and, again, + it sets a stepping stone towards raylib future. + +BIG changes: + - More than 30 new functions added to the library, check list below. + - Support of configuration flags on every raylib module, to customize library build. + - Improved build system for all supported platforms with a unique Makefile to compile sources. + - Complete review of examples and sample games, added new sample material. + - Support automatic GIF recording of current window, just pressing Ctrl+F12 + - Improved library consistency and organization in general. + +other changes: +[core] Added function: SetWindowIcon(), to setup icon by code +[core] Added function: SetWindowMonitor(), to set current display monitor +[core] Added function: SetWindowMinSize(), to set minimum resize size +[core] Added function: TakeScreenshot(), made public to API (also launched internally with F12) +[core] Added function: GetDirectoryPath(), get directory for a given fileName (with path) +[core] Added function: GetWorkingDirectory(), get current working directory +[core] Added function: ChangeDirectory(), change working directory +[core] Added function: TraceLog(), made public to API +[core] Improved timing system to avoid busy wait loop on frame sync: Wait() +[core] Added support for gamepad on HTML5 platform +[core] Support mouse lock, useful for camera system +[core] Review functions description comments +[rlgl] Removed function: GetStandardShader(), removed internal standard shader +[rlgl] Removed function: CreateLight(), removed internal lighting system +[rlgl] Removed function: DestroyLight(), removed internal lighting system +[rlgl] Removed function: InitVrDevice(), removed VR device render, using simulator +[rlgl] Removed function: CloseVrDevice(), removed VR device render, using simulator +[rlgl] Removed function: IsVrDeviceReady(), removed VR device render, using simulator +[rlgl] Removed function: IsVrSimulator(), removed VR device render, using simulator +[rlgl] Added function: InitVrSimulator(), init VR simulator for selected device +[rlgl] Added function: CloseVrSimulator(), close VR simulator for current device +[rlgl] Added function: IsVrSimulatorReady(), detect if VR device is ready +[rlgl] Added function: BeginVrDrawing(), begin VR simulator stereo rendering +[rlgl] Added function: EndVrDrawing(), end VR simulator stereo rendering +[rlgl] Renamed function: ReadTextFile() to LoadText() and exposed to API +[rlgl] Removed internal lighting system and standard shader, moved to example +[rlgl] Removed Oculus Rift support, moved to oculus_rift example +[rlgl] Removed VR device support and replaced by VR simulator +[shapes] Added function: DrawLineEx(), draw line with QUADS, supports custom line thick +[shapes] Added function: DrawLineBezier(), draw a line using cubic-bezier curves in-out +[shapes] Added function: DrawRectanglePro(), draw a color-filled rectangle with pro parameters +[textures] Removed function: LoadImageFromRES(), redesigning custom RRES fileformat +[textures] Removed function: LoadTextureFromRES(), redesigning custom RRES fileformat +[textures] Removed function: LoadTextureEx(), use instead Image -> LoadImagePro(), LoadImageEx() +[textures] Added function: LoadImagePro()), load image from raw data with parameters +[textures] Review TraceLog() message when image file not found +[text] Renamed function: LoadSpriteFontTTF() to LoadSpriteFontEx(), for consistency +[text] Removed rBMF fileformat support, replaced by .png +[text] Refactor SpriteFont struct (better for rres custom fileformat) +[text] Renamed some variables for consistency +[models] Added function: LoadMesh(), load mesh from file +[models] Added function: LoadMeshEx(), load mesh from vertex data +[models] Added function: UnloadMesh(), unload mesh from memory (RAM and/or VRAM) +[models] Added function: GetCollisionRayMesh(), get collision info between ray and mesh +[models] Added function: GetCollisionRayTriangle(), get collision info between ray and triangle +[models] Added function: GetCollisionRayGround(), get collision info between ray and ground plane +[models] Renamed function: LoadModelEx() to LoadModelFromMesh() +[models] Removed function: DrawLight(), removed internal lighting system +[models] Renamed function: LoadModelEx() to LoadModelFromMesh() for consistency +[models] Removed function: LoadStandardMaterial(), removed internal standard shader +[models] Removed function: LoadModelFromRES(), redesigning custom RRES fileformat +[models] Renamed multiple variables for consistency +[audio] Added function: SetMasterVolume(), define listener volume +[audio] Added function: ResumeSound(), resume a paused sound +[audio] Added function: SetMusicLoopCount(), set number of repeats for a music +[audio] Added function: LoadWaveEx(), load wave from raw audio data +[audio] Added function: WaveCrop(), crop wave audio data +[audio] Added function: WaveFormat(), format audio data +[audio] Removed function: LoadSoundFromRES(), redesigning custom RRES fileformat +[audio] Added support for 32bit audio samples +[audio] Preliminary support for multichannel, limited to mono and stereo +[audio] Make sure buffers are ready for update: UpdateMusicStream() +[utils] Replaced function: GetExtension() by IsFileExtension() and made public to API +[utils] Unified function: TraceLog() between Android and other platforms +[utils] Removed internal function: GetNextPOT(), simplified implementation +[raymath] Added function: QuaternionToEuler(), to work with Euler angles +[raymath] Added function: QuaternionFromEuler(), to work with Euler angles +[raymath] Added multiple Vector2 math functions +[build] Integrate Android source building into Makefile +[example] Added example: shapes_lines_bezier +[example] Added example: text_input_box +[github] Moved gh-pages branch to master/docs +[github] Moved rlua.h and Lua examples to own repo: raylib-lua +[games] Reviewed full games collection +[games] New game added to collection: Koala Seasons +[*] Reviewed and improved examples collection (new assets) +[*] Reorganized library functions, structs, enums +[*] Updated STB libraries to latest version + +----------------------------------------------- +Release: raylib 1.6.0 (20 November 2016) +----------------------------------------------- +NOTE: + This new raylib version commemorates raylib 3rd anniversary and represents another complete review of the library. + It includes some interesting new features and is a stepping stone towards raylib future. + +HUGE changes: +[rlua] Lua BINDING: Complete raylib Lua binding, ALL raylib functions ported to Lua plus the +60 code examples. +[audio] COMPLETE REDESIGN: Improved music support and also raw audio data processing and playing, +20 new functions added. +[physac] COMPLETE REWRITE: Improved performance, functionality and simplified usage, moved to own repository and added multiple examples! + +other changes: + +[core] Corrected issue on OSX with HighDPI display +[core] Added flag to allow resizable window +[core] Allow no default font loading +[core] Corrected old issue with mouse buttons on web +[core] Improved gamepad support, unified across platforms +[core] Gamepad id functionality: GetGamepadName(), IsGamepadName() +[core] Gamepad buttons/axis checking functionality: +[core] Reviewed Android key inputs system, unified with desktop +[rlgl] Redesigned lighting shader system +[rlgl] Updated standard shader for better performance +[rlgl] Support alpha on framebuffer: rlglLoadRenderTexture() +[rlgl] Reviewed UpdateVrTracking() to update camera +[rlgl] Added IsVrSimulator() to check for VR simulator +[shapes] Corrected issue on DrawPolyEx() +[textures] Simplified supported image formats support +[textures] Improved text drawing within an image: ImageDrawText() +[textures] Support image alpha mixing: ImageAlphaMask() +[textures] Support textures filtering: SetTextureFilter() +[textures] Support textures wrap modes: SetTextureWrap() +[text] Improved TTF spritefont generation: LoadSpriteFontTTF() +[text] Improved AngelCode fonts support (unordered chars) +[text] Added TraceLog info on image spritefont loading +[text] Improved text measurement: MeasureTextEx() +[models] Improved OBJ loading flexibility +[models] Reviewed functions: DrawLine3D(), DrawCircle3D() +[models] Removed function: ResolveCollisionCubicmap() +[camera] Redesigned camera system and ported to header-only +[camera] Removed function: UpdateCameraPlayer() +[gestures] Redesigned gestures module to header-only +[audio] Simplified Music loading and playing system +[audio] Added trace on audio device closing +[audio] Reviewed Wave struct, improved flexibility +[audio] Support sound data update: UpdateSound() +[audio] Added support for FLAC audio loading/streaming +[raygui] Removed raygui from raylib repo (moved to own repo) +[build] Added OpenAL static library +[build] Added Visual Studio 2015 projects +[build] Support shared/dynamic raylib compilation +[*] Updated LibOVR to SDK version 1.8 +[*] Updated games to latest raylib version +[*] Improved examples and added new ones +[*] Improved Android support + +----------------------------------------------- +Release: raylib 1.5.0 (18 July 2016) +----------------------------------------------- +NOTE: + Probably this new version is the biggest boost of the library ever, lots of parts of the library have been redesigned, + lots of bugs have been solved and some **AMAZING** new features have been added. + +HUGE changes: +[rlgl] OCULUS RIFT CV1: Added support for VR, not oly Oculus Rift CV1 but also stereo rendering simulator (multiplatform). +[rlgl] MATERIALS SYSTEM: Added support for Materials (.mtl) and multiple material properties: diffuse, specular, normal. +[rlgl] LIGHTING SYSTEM: Added support for up to 8 lights of 3 different types: Omni, Directional and Spot. +[physac] REDESIGNED: Improved performance and simplified usage, physic objects now are managed internally in a second thread! +[audio] CHIPTUNES: Added support for module audio music (.xm, .mod) loading and playing. Multiple mixing channels supported. + +other changes: + +[core] Review Android button inputs +[core] Support Android internal data storage +[core] Renamed WorldToScreen() to GetWorldToScreen() +[core] Removed function SetCustomCursor() +[core] Removed functions BeginDrawingEx(), BeginDrawingPro() +[core] Replaced functions InitDisplay() + InitGraphics() with: InitGraphicsDevice() +[core] Added support for field-of-view Y (fovy) on 3d Camera +[core] Added 2D camera mode functions: Begin2dMode() - End2dMode() +[core] Translate mouse inputs to Android touch/gestures internally +[core] Translate mouse inputs as touch inputs in HTML5 +[core] Improved function GetKeyPressed() to support multiple keys (including function keys) +[core] Improved gamepad support, specially for RaspberryPi (including multiple gamepads support) +[rlgl] Support stereo rendering simulation (duplicate draw calls by viewport, optimized) +[rlgl] Added distortion shader (embeded) to support custom VR simulator: shader_distortion.h +[rlgl] Added support for OpenGL 2.1 on desktop +[rlgl] Improved 2D vs 3D drawing system (lines, triangles, quads) +[rlgl] Improved DXT-ETC1 support on HTML5 +[rlgl] Review function: rlglUnproject() +[rlgl] Removed function: rlglInitGraphics(), integrated into rlglInit() +[rlgl] Updated Mesh and Shader structs +[rlgl] Simplified internal (default) dynamic buffers +[rlgl] Added support for indexed and dynamic mesh data +[rlgl] Set fixed vertex attribs location points +[rlgl] Improved mesh data loading support +[rlgl] Added standard shader (embeded) to support materials and lighting: shader_standard.h +[rlgl] Added light functions: CreateLight(), DestroyLight() +[rlgl] Added wire mode functions: rlDisableWireMode(), rlEnableWireMode() +[rlgl] Review function consistency, added: rlglLoadMesh(), rlglUpdateMesh(), rlglDrawMesh(), rlglUnloadMesh() +[rlgl] Replaced SetCustomShader() by: BeginShaderMode() - EndShaderMode() +[rlgl] Replaced SetBlendMode() by: BeginBlendMode() - EndBlendMode() +[rlgl] Added functions to customize internal matrices: SetMatrixProjection(), SetMatrixModelview() +[rlgl] Unified internal shaders to only one default shader +[rlgl] Added support for render to texture (RenderTexture2D): + LoadRenderTexture() - UnloadRenderTexture() + BeginTextureMode() - EndTextureMode() +[rlgl] Removed SetShaderMap*() functions +[rlgl] Redesigned default buffers usage functions: + LoadDefaultBuffers() - UnloadDefaultBuffers() + UpdateDefaultBuffers() - DrawDefaultBuffers() +[shapes] Corrected bug on GetCollisionRec() +[textures] Added support for Nearest-Neighbor image scaling +[textures] Added functions to draw text on image: ImageDrawText(), ImageDrawTextEx() +[text] Reorganized internal functions: Added LoadImageFont() +[text] Security check for unsupported BMFonts +[models] Split mesh creation from model loading on heightmap and cubicmap +[models] Updated BoundingBox collision detections +[models] Added color parameter to DrawBoundigBox() +[models] Removed function: DrawQuad() +[models] Removed function: SetModelTexture() +[models] Redesigned DrawPlane() to use RL_TRIANGLES +[models] Redesigned DrawRectangleV() to use RL_TRIANGLES +[models] Redesign to accomodate new materials system: LoadMaterial() +[models] Added material functions: LoadDefaultMaterial(), LoadStandardMaterial() +[models] Added MTL material loading support: LoadMTL() +[models] Added function: DrawLight() +[audio] Renamed SoundIsPlaying() to IsSoundPlaying() +[audio] Renamed MusicIsPlaying() to IsMusicPlaying() +[audio] Support multiple Music streams (indexed) +[audio] Support multiple mixing channels +[gestures] Improved and reviewed gestures system +[raymath] Added QuaternionInvert() +[raymath] Removed function: PrintMatrix() +[raygui] Ported to header-only library (https://github.com/raysan5/raygui) +[shaders] Added depth drawing shader (requires a depth texture) +[shaders] Reviewed included shaders and added comments +[OpenAL Soft] Updated to latest version (1.17.2) +[GLFW3] Updated to latest version (3.2) +[stb] Updated to latest headers versions +[GLAD] Converted to header only library and simplified to only used extensions +[*] Reorganize library folders: external libs moved to src/external folder +[*] Reorganize src folder for Android library +[*] Review external dependencies usage +[*] Improved Linux and OSX build systems +[*] Lots of tweaks and bugs corrected all around + +----------------------------------------------- +Release: raylib 1.4.0 (22 February 2016) +----------------------------------------------- +NOTE: + This version supposed another big improvement for raylib, including new modules and new features. + More than 30 new functions have been added to previous raylib version. + Around 8 new examples and +10 new game samples have been added. + +BIG changes: +[textures] IMAGE MANIPULATION: Functions to crop, resize, colorize, flip, dither and even draw image-to-image or text-to-image. +[text] SPRITEFONT SUPPORT: Added support for AngelCode fonts (.fnt) and TrueType fonts (.ttf). +[gestures] REDESIGN: Gestures system simplified and prepared to process generic touch events, including mouse events (multiplatform). +[physac] NEW MODULE: Basic 2D physics support, use colliders and rigidbodies; apply forces to physic objects. + +other changes: + +[rlgl] Removed GLEW library dependency, now using GLAD +[rlgl] Implemented alternative to glGetTexImage() on OpenGL ES +[rlgl] Using depth data on batch drawing +[rlgl] Reviewed glReadPixels() function +[core][rlgl] Reviewed raycast system, now 3D picking works +[core] Android: Reviewed Android App cycle, paused if inactive +[shaders] Implemented Blinn-Phong lighting shading model +[textures] Implemented Floyd-Steinberg dithering - ImageDither() +[text] Added line-break support to DrawText() +[text] Added TrueType Fonts support (using stb_truetype) +[models] Implement function: CalculateBoundingBox(Mesh mesh) +[models] Added functions to check Ray collisions +[models] Improve map resolution control on LoadHeightmap() +[camera] Corrected small-glitch on zoom-in with mouse-wheel +[gestures] Implemented SetGesturesEnabled() to enable only some gestures +[gestures] Implemented GetElapsedTime() on Windows system +[gestures] Support mouse gestures for desktop platforms +[raymath] Complete review of the module and converted to header-only +[easings] Added new module for easing animations +[stb] Updated to latest headers versions +[*] Lots of tweaks around + +----------------------------------------------- +Release: raylib 1.3.0 (01 September 2015) +----------------------------------------------- +NOTE: + This version supposed a big boost for raylib, new modules have been added with lots of features. + Most of the modules have been completely reviewed to accomodate to the new features. + Over 50 new functions have been added to previous raylib version. + Most of the examples have been redone and +10 new advanced examples have been added. + +BIG changes: +[rlgl] SHADERS: Support for model shaders and postprocessing shaders (multiple functions) +[textures] FORMATS: Support for multiple internal formats, including compressed formats +[camera] NEW MODULE: Set of cameras for 3d view: Free, Orbital, 1st person, 3rd person +[gestures] NEW MODULE: Gestures system for Android and HTML5 platforms +[raygui] NEW MODULE: Set of IMGUI elements for tools development (experimental) + +other changes: + +[rlgl] Added check for OpenGL supported extensions +[rlgl] Added function SetBlenMode() to select some predefined blending modes +[core] Added support for drop&drag of external files into running program +[core] Added functions ShowCursor(), HideCursor(), IsCursorHidden() +[core] Renamed function SetFlags() to SetConfigFlags() +[shapes] Simplified some functions to improve performance +[textures] Review of Image struct to support multiple data formats +[textures] Added function LoadImageEx() +[textures] Added function LoadImageRaw() +[textures] Added function LoadTextureEx() +[textures] Simplified function parameters LoadTextureFromImage() +[textures] Added function GetImageData() +[textures] Added function GetTextureData() +[textures] Renamed function ConvertToPOT() to ImageConvertToPOT() +[textures] Added function ImageConvertFormat() +[textures] Added function GenTextureMipmaps() +[text] Added support for Latin-1 Extended characters for default font +[text] Redesigned SpriteFont struct, replaced Character struct by Rectangle +[text] Removed function GetFontBaseSize(), use directly spriteFont.size +[models] Review of struct: Model (added shaders support) +[models] Added 3d collision functions (sphere vs sphere vs box vs box) +[models] Added function DrawCubeTexture() +[models] Added function DrawQuad() +[models] Added function DrawRay() +[models] Simplified function DrawPlane() +[models] Removed function DrawPlaneEx() +[models] Simplified function DrawGizmo() +[models] Removed function DrawGizmoEx() +[models] Added function LoadModelEx() +[models] Review of function LoadCubicMap() +[models] Added function ResolveCollisionCubicmap() +[audio] Decopupled from raylib, now this module can be used as standalone +[audio] Added function UpdateMusicStream() +[raymath] Complete review of the module +[stb] Updated to latest headers versions +[*] Lots of tweaks around + +----------------------------------------------- +Release: raylib 1.2.2 (31 December 2014) +----------------------------------------------- +[*] Added support for HTML5 compiling (emscripten, asm.js) +[core] Corrected bug on input handling (keyboard and mouse) +[textures] Renamed function CreateTexture() to LoadTextureFromImage() +[textures] Added function ConvertToPOT() +[rlgl] Added support for color tint on models on GL 3.3+ and ES2 +[rlgl] Added support for normals on models +[models] Corrected bug on DrawBillboard() +[models] Corrected bug on DrawHeightmap() +[models] Renamed LoadCubesmap() to LoadCubicmap() +[audio] Added function LoadSoundFromWave() +[makefile] Added support for Linux and OSX compiling +[stb] Updated to latest headers versions +[*] Lots of tweaks around + +--------------------------------------------------------------- +Update: raylib 1.2.1 (17 October 2014) (Small Fixes Update) +--------------------------------------------------------------- +[core] Added function SetupFlags() to preconfigure raylib Window +[core] Corrected bug on fullscreen mode +[rlgl] rlglDrawmodel() - Added rotation on Y axis +[text] MeasureTextEx() - Corrected bug on measures for default font + +----------------------------------------------- +Release: raylib 1.2 (16 September 2014) +----------------------------------------------- +NOTE: + This version supposed a complete redesign of the [core] module to support Android and Raspberry Pi. + Multiples modules have also been tweaked to accomodate to the new platforms, specially [rlgl] + +[core] Added multiple platforms support: Android and Raspberry Pi +[core] InitWindow() - Complete rewrite and split for Android +[core] InitDisplay() - Internal function added to calculate proper display size +[core] InitGraphics() - Internal function where OpenGL graphics are initialized +[core] Complete refactoring of input functions to accomodate to new platforms +[core] Mouse and Keyboard raw data reading functions added for Raspberry Pi +[core] GetTouchX(), GetTouchY() - Added for Android +[core] Added Android callbacks to process inputs and Android activity commands +[rlgl] Adjusted buffers depending on platform +[rlgl] Added security check in case deployed vertex excess buffer size +[rlgl] Adjusted indices type depending on GL version (int or short) +[rlgl] Fallback to VBOs only usage if VAOs not supported on ES2 +[rlgl] rlglLoadModel() stores vbo ids on new Model struct +[textures] Added support for PKM files (ETC1, ETC2 compression support) +[shapes] DrawRectangleV() - Modified, depending on OGL version uses TRIANGLES or QUADS +[text] LoadSpriteFont() - Modified to use LoadImage() +[models] Minor changes on models loading to accomodate to new Model struct +[audio] PauseMusicStream(), ResumeMusicStream() - Added +[audio] Reduced music buffer size to avoid stalls on Raspberry Pi +[src] Added makefile for Windows and RPI +[src] Added resources file (raylib icon and executable info) +[examples] Added makefile for Windows and RPI +[examples] Renamed and merged with test examples for coherence with module names +[templates] Added multiple templates to be use as a base-code for games + +----------------------------------------------- +Release: raylib 1.1.1 (22 July 2014) +----------------------------------------------- +[core] ShowLogo() - To enable raylib logo animation at startup +[core] Corrected bug with window resizing +[rlgl] Redefined colors arrays to use byte instead of float +[rlgl] Removed double buffer system (no performance improvement) +[rlgl] rlglDraw() - Reorganized buffers drawing order +[rlgl] Corrected bug on screen resizing +[shapes] DrawRectangle() - Use QUADS instead of TRIANGLES +[models] DrawSphereWires() - Corrected some issues +[models] LoadOBJ() - Redesigned to support multiple meshes +[models] LoadCubesMap() - Loading a map as cubes (by pixel color) +[textures] Added security check if file doesn't exist +[text] Corrected bug on SpriteFont loading +[examples] Corrected some 3d examples +[test] Added cubesmap loading test + +----------------------------------------------- +Release: raylib 1.1.0 (19 April 2014) +----------------------------------------------- +NOTE: + This version supposed a complete internal redesign of the library to support OpenGL 3.3+ and OpenGL ES 2.0. + New module [rlgl] has been added to 'translate' immediate mode style functions (i.e. rlVertex3f()) to GL 1.1, 3.3+ or ES2. + Another new module [raymath] has also been added with lot of useful 3D math vector-matrix-quaternion functions. + +[rlgl] New module, abstracts OpenGL rendering (multiple versions support) +[raymath] New module, useful 3D math vector-matrix-quaternion functions +[core] Adapt all OpenGL code (initialization, drawing) to use [rlgl] +[shapes] Rewrite all shapes drawing functions to use [rlgl] +[textures] Adapt texture GPU loading to use [rlgl] +[textures] Added support for DDS images (compressed and uncompressed) +[textures] CreateTexture() - Redesigned to add mipmap automatic generation +[textures] DrawTexturePro() - Redesigned and corrected bugs +[models] Rewrite all 3d-shapes drawing functions to use [rlgl] +[models] Adapt model loading and drawing to use [rlgl] +[models] Model struct updated to include texture id +[models] SetModelTexture() - Added, link a texture to a model +[models] DrawModelEx() - Redesigned with extended parameters +[audio] Added music streaming support (OGG files) +[audio] Added support for OGG files as Sound +[audio] PlayMusicStream() - Added, open a new music stream and play it +[audio] StopMusicStream() - Added, stop music stream playing and close stream +[audio] PauseMusicStream() - Added, pause music stream playing +[audio] MusicIsPlaying() - Added, to check if music is playing +[audio] SetMusicVolume() - Added, set volume for music +[audio] GetMusicTimeLength() - Added, get current music time length (in seconds) +[audio] GetMusicTimePlayed() - Added, get current music time played (in seconds) +[utils] Added log tracing functionality - TraceLog(), TraceLogOpen(), TraceLogClose() +[*] Log tracing messages all around the code + +----------------------------------------------- +Release: raylib 1.0.6 (16 March 2014) +----------------------------------------------- +[core] Removed unused lighting-system code +[core] Removed SetPerspective() function, calculated directly +[core] Unload and reload default font on fullscreen toggle +[core] Corrected bug gamepad buttons checking if no gamepad available +[texture] DrawTextureV() - Added, to draw using Vector2 for position +[texture] LoadTexture() - Redesigned, now uses LoadImage() + CreateTexture() +[text] FormatText() - Corrected memory leak bug +[models] Added Matrix struct and related functions +[models] DrawBillboard() - Reviewed, now it works! +[models] DrawBillboardRec() - Reviewed, now it works! +[tests] Added folder with multiple tests for new functions + +----------------------------------------------- +Update: raylib 1.0.5 (28 January 2014) +----------------------------------------------- +[audio] LoadSound() - Corrected a bug, WAV file was not closed! +[core] GetMouseWheelMove() - Added, check mouse wheel Y movement +[texture] CreateTexture2D() renamed to CreateTexture() +[models] LoadHeightmap() - Added, Heightmap can be loaded as a Model +[tool] rREM updated, now supports (partially) drag and drop of files + +----------------------------------------------- +Release: raylib 1.0.4 (23 January 2014) +----------------------------------------------- +[tool] Published a first alpha version of rREM tool (raylib Resource Embedder) +[core] GetRandomValue() - Bug corrected, now works right +[core] Fade() - Added, fades a color to an alpha percentadge +[core] WriteBitmap() - Moved to new module: utils.c, not used anymore +[core] TakeScreenshot() - Now uses WritePNG() (utils.c) +[utils] New module created with utility functions +[utils] WritePNG() - Write a PNG file (used by TakeScreenshot() on core) +[utils] DecompressData() - Added, used for rRES resource data decompresion +[textures] LoadImageFromRES() - Added, load an image from a rRES resource file +[textures] LoadTextureFromRES() - Added, load a texture from a rRES resource file +[audio] LoadSoundFromRES() - Added, load a sound from a rRES resource file +[audio] IsPlaying() - Added, check if a sound is currently playing +[audio] SetVolume() - Added, set the volume for a sound +[audio] SetPitch() - Added, set the pitch for a sound +[examples] ex06a_color_select completed +[examples] ex06b_logo_anim completed +[examples] ex06c_font select completed + +----------------------------------------------- +Release: raylib 1.0.3 (19 December 2013) +----------------------------------------------- +[fonts] Added 8 rBMF free fonts to be used on projects! +[text] LoadSpriteFont() - Now supports rBMF file loading (raylib Bitmap Font) +[examples] ex05a_sprite_fonts completed +[examples] ex05b_rbmf_fonts completed +[core] InitWindowEx() - InitWindow with extended parameters, resizing option and custom cursor! +[core] GetRandomValue() - Added, returns a random value within a range (int) +[core] SetExitKey() - Added, sets a key to exit program (default is ESC) +[core] Custom cursor not drawn when mouse out of screen +[shapes] CheckCollisionPointRec() - Added, check collision between point and rectangle +[shapes] CheckCollisionPointCircle() - Added, check collision between point and circle +[shapes] CheckCollisionPointTriangle() - Added, check collision between point and triangle +[shapes] DrawPoly() - Added, draw regular polygons of n sides, rotation can be defined! + +----------------------------------------------- +Release: raylib 1.0.2 (1 December 2013) +----------------------------------------------- +[text] GetDefaultFont() - Added, get default SpriteFont to be used on DrawTextEx() +[shapes] CheckCollisionRecs() - Added, check collision between rectangles +[shapes] CheckCollisionCircles() - Added, check collision between circles +[shapes] CheckCollisionCircleRec() - Added, check collision circle-rectangle +[shapes] GetCollisionRec() - Added, get collision rectangle +[textures] CreateTexture2D() - Added, create Texture2D from Image data +[audio] Fixed WAV loading function, now audio works! + +----------------------------------------------- +Update: raylib 1.0.1 (28 November 2013) +----------------------------------------------- +[text] DrawText() - Removed spacing parameter +[text] MeasureText() - Removed spacing parameter +[text] DrawFps() - Renamed to DrawFPS() for coherence with similar function +[core] IsKeyPressed() - Change functionality, check if key pressed once +[core] IsKeyDown() - Added, check if key is being pressed +[core] IsKeyReleased() - Change functionality, check if key released once +[core] IsKeyUp() - Added, check if key is being NOT pressed +[core] IsMouseButtonDown() - Added, check if mouse button is being pressed +[core] IsMouseButtonPressed() - Change functionality, check if mouse button pressed once +[core] IsMouseButtonUp() - Added, check if mouse button is NOT being pressed +[core] IsMouseButtonReleased() - Change functionality, check if mouse button released once +[textures] DrawTexturePro() - Added, texture drawing with 'pro' parameters +[examples] Function changes applied to ALL examples + +----------------------------------------------- +Release: raylib 1.0.0 (18 November 2013) +----------------------------------------------- +* Initial version +* 6 Modules provided: + - core: basic window/context creation functions, input management, timing functions + - shapes: basic shapes drawing functions + - textures: image data loading and conversion to OpenGL textures + - text: text drawing, sprite fonts loading, default font loading + - models: basic 3d shapes drawing, OBJ models loading and drawing + - audio: audio device initialization, WAV files loading and playing diff --git a/vendor/raylib-5.5_linux_amd64/LICENSE b/vendor/raylib-5.5_linux_amd64/LICENSE new file mode 100644 index 0000000..d1bfe3b --- /dev/null +++ b/vendor/raylib-5.5_linux_amd64/LICENSE @@ -0,0 +1,16 @@ +Copyright (c) 2013-2024 Ramon Santamaria (@raysan5) + +This software is provided "as-is", without any express or implied warranty. In no event +will the authors be held liable for any damages arising from the use of this software. + +Permission is granted to anyone to use this software for any purpose, including commercial +applications, and to alter it and redistribute it freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not claim that you + wrote the original software. If you use this software in a product, an acknowledgment + in the product documentation would be appreciated but is not required. + + 2. Altered source versions must be plainly marked as such, and must not be misrepresented + as being the original software. + + 3. This notice may not be removed or altered from any source distribution. diff --git a/vendor/raylib-5.5_linux_amd64/README.md b/vendor/raylib-5.5_linux_amd64/README.md new file mode 100644 index 0000000..29173d6 --- /dev/null +++ b/vendor/raylib-5.5_linux_amd64/README.md @@ -0,0 +1,150 @@ +<img align="left" style="width:260px" src="https://github.com/raysan5/raylib/blob/master/logo/raylib_logo_animation.gif" width="288px"> + +**raylib is a simple and easy-to-use library to enjoy videogames programming.** + +raylib is highly inspired by Borland BGI graphics lib and by XNA framework and it's especially well suited for prototyping, tooling, graphical applications, embedded systems and education. + +*NOTE for ADVENTURERS: raylib is a programming library to enjoy videogames programming; no fancy interface, no visual helpers, no debug button... just coding in the most pure spartan-programmers way.* + +Ready to learn? Jump to [code examples!](https://www.raylib.com/examples.html) + +--- + +<br> + +[](https://github.com/raysan5/raylib/releases) +[](https://github.com/raysan5/raylib/stargazers) +[](https://github.com/raysan5/raylib/commits/master) +[](https://github.com/sponsors/raysan5) +[](https://repology.org/project/raylib/versions) +[](LICENSE) + +[](https://discord.gg/raylib) +[](https://www.reddit.com/r/raylib/) +[](https://www.youtube.com/c/raylib) +[](https://www.twitch.tv/raysan5) + +[](https://github.com/raysan5/raylib/actions?query=workflow%3AWindows) +[](https://github.com/raysan5/raylib/actions?query=workflow%3ALinux) +[](https://github.com/raysan5/raylib/actions?query=workflow%3AmacOS) +[](https://github.com/raysan5/raylib/actions?query=workflow%3AWebAssembly) + +[](https://github.com/raysan5/raylib/actions?query=workflow%3ACMakeBuilds) +[](https://github.com/raysan5/raylib/actions/workflows/windows_examples.yml) +[](https://github.com/raysan5/raylib/actions/workflows/linux_examples.yml) + +features +-------- + - **NO external dependencies**, all required libraries are [bundled into raylib](https://github.com/raysan5/raylib/tree/master/src/external) + - Multiple platforms supported: **Windows, Linux, MacOS, RPI, Android, HTML5... and more!** + - Written in plain C code (C99) using PascalCase/camelCase notation + - Hardware accelerated with OpenGL (**1.1, 2.1, 3.3, 4.3, ES 2.0, ES 3.0**) + - **Unique OpenGL abstraction layer** (usable as standalone module): [rlgl](https://github.com/raysan5/raylib/blob/master/src/rlgl.h) + - Multiple **Fonts** formats supported (TTF, OTF, FNT, BDF, sprite fonts) + - Multiple texture formats supported, including **compressed formats** (DXT, ETC, ASTC) + - **Full 3D support**, including 3D Shapes, Models, Billboards, Heightmaps and more! + - Flexible Materials system, supporting classic maps and **PBR maps** + - **Animated 3D models** supported (skeletal bones animation) (IQM, M3D, glTF) + - Shaders support, including model shaders and **postprocessing** shaders + - **Powerful math module** for Vector, Matrix and Quaternion operations: [raymath](https://github.com/raysan5/raylib/blob/master/src/raymath.h) + - Audio loading and playing with streaming support (WAV, QOA, OGG, MP3, FLAC, XM, MOD) + - **VR stereo rendering** support with configurable HMD device parameters + - Huge examples collection with [+140 code examples](https://github.com/raysan5/raylib/tree/master/examples)! + - Bindings to [+70 programming languages](https://github.com/raysan5/raylib/blob/master/BINDINGS.md)! + - **Free and open source** + +basic example +-------------- +This is a basic raylib example, it creates a window and draws the text `"Congrats! You created your first window!"` in the middle of the screen. Check this example [running live on web here](https://www.raylib.com/examples/core/loader.html?name=core_basic_window). +```c +#include "raylib.h" + +int main(void) +{ + InitWindow(800, 450, "raylib [core] example - basic window"); + + while (!WindowShouldClose()) + { + BeginDrawing(); + ClearBackground(RAYWHITE); + DrawText("Congrats! You created your first window!", 190, 200, 20, LIGHTGRAY); + EndDrawing(); + } + + CloseWindow(); + + return 0; +} +``` + +build and installation +---------------------- + +raylib binary releases for Windows, Linux, macOS, Android and HTML5 are available at the [Github Releases page](https://github.com/raysan5/raylib/releases). + +raylib is also available via multiple package managers on multiple OS distributions. + +#### Installing and building raylib on multiple platforms + +[raylib Wiki](https://github.com/raysan5/raylib/wiki#development-platforms) contains detailed instructions on building and usage on multiple platforms. + + - [Working on Windows](https://github.com/raysan5/raylib/wiki/Working-on-Windows) + - [Working on macOS](https://github.com/raysan5/raylib/wiki/Working-on-macOS) + - [Working on GNU Linux](https://github.com/raysan5/raylib/wiki/Working-on-GNU-Linux) + - [Working on Chrome OS](https://github.com/raysan5/raylib/wiki/Working-on-Chrome-OS) + - [Working on FreeBSD](https://github.com/raysan5/raylib/wiki/Working-on-FreeBSD) + - [Working on Raspberry Pi](https://github.com/raysan5/raylib/wiki/Working-on-Raspberry-Pi) + - [Working for Android](https://github.com/raysan5/raylib/wiki/Working-for-Android) + - [Working for Web (HTML5)](https://github.com/raysan5/raylib/wiki/Working-for-Web-(HTML5)) + - [Working anywhere with CMake](https://github.com/raysan5/raylib/wiki/Working-with-CMake) + +*Note that the Wiki is open for edit, if you find some issues while building raylib for your target platform, feel free to edit the Wiki or open an issue related to it.* + +#### Setup raylib with multiple IDEs + +raylib has been developed on Windows platform using [Notepad++](https://notepad-plus-plus.org/) and [MinGW GCC](https://www.mingw-w64.org/) compiler but it can be used with other IDEs on multiple platforms. + +[Projects directory](https://github.com/raysan5/raylib/tree/master/projects) contains several ready-to-use **project templates** to build raylib and code examples with multiple IDEs. + +*Note that there are lots of IDEs supported, some of the provided templates could require some review, so please, if you find some issue with a template or you think they could be improved, feel free to send a PR or open a related issue.* + +learning and docs +------------------ + +raylib is designed to be learned using [the examples](https://github.com/raysan5/raylib/tree/master/examples) as the main reference. There is no standard API documentation but there is a [**cheatsheet**](https://www.raylib.com/cheatsheet/cheatsheet.html) containing all the functions available on the library a short description of each one of them, input parameters and result value names should be intuitive enough to understand how each function works. + +Some additional documentation about raylib design can be found in [raylib GitHub Wiki](https://github.com/raysan5/raylib/wiki). Here are the relevant links: + + - [raylib cheatsheet](https://www.raylib.com/cheatsheet/cheatsheet.html) + - [raylib architecture](https://github.com/raysan5/raylib/wiki/raylib-architecture) + - [raylib library design](https://github.com/raysan5/raylib/wiki) + - [raylib examples collection](https://github.com/raysan5/raylib/tree/master/examples) + - [raylib games collection](https://github.com/raysan5/raylib-games) + + +contact and networks +--------------------- + +raylib is present in several networks and raylib community is growing everyday. If you are using raylib and enjoying it, feel free to join us in any of these networks. The most active network is our [Discord server](https://discord.gg/raylib)! :) + + - Webpage: [https://www.raylib.com](https://www.raylib.com) + - Discord: [https://discord.gg/raylib](https://discord.gg/raylib) + - Twitter: [https://www.twitter.com/raysan5](https://www.twitter.com/raysan5) + - Twitch: [https://www.twitch.tv/raysan5](https://www.twitch.tv/raysan5) + - Reddit: [https://www.reddit.com/r/raylib](https://www.reddit.com/r/raylib) + - Patreon: [https://www.patreon.com/raylib](https://www.patreon.com/raylib) + - YouTube: [https://www.youtube.com/channel/raylib](https://www.youtube.com/c/raylib) + +contributors +------------ + +<a href="https://github.com/raysan5/raylib/graphs/contributors"> + <img src="https://contrib.rocks/image?repo=raysan5/raylib&max=500&columns=20&anon=1" /> +</a> + +license +------- + +raylib is licensed under an unmodified zlib/libpng license, which is an OSI-certified, BSD-like license that allows static linking with closed source software. Check [LICENSE](LICENSE) for further details. + +raylib uses internally some libraries for window/graphics/inputs management and also to support different file formats loading, all those libraries are embedded with and are available in [src/external](https://github.com/raysan5/raylib/tree/master/src/external) directory. Check [raylib dependencies LICENSES](https://github.com/raysan5/raylib/wiki/raylib-dependencies) on [raylib Wiki](https://github.com/raysan5/raylib/wiki) for details. diff --git a/vendor/raylib-5.5_linux_amd64/include/raylib.h b/vendor/raylib-5.5_linux_amd64/include/raylib.h new file mode 100644 index 0000000..a26b8ce --- /dev/null +++ b/vendor/raylib-5.5_linux_amd64/include/raylib.h @@ -0,0 +1,1708 @@ +/********************************************************************************************** +* +* raylib v5.5 - A simple and easy-to-use library to enjoy videogames programming (www.raylib.com) +* +* FEATURES: +* - NO external dependencies, all required libraries included with raylib +* - Multiplatform: Windows, Linux, FreeBSD, OpenBSD, NetBSD, DragonFly, +* MacOS, Haiku, Android, Raspberry Pi, DRM native, HTML5. +* - Written in plain C code (C99) in PascalCase/camelCase notation +* - Hardware accelerated with OpenGL (1.1, 2.1, 3.3, 4.3, ES2, ES3 - choose at compile) +* - Unique OpenGL abstraction layer (usable as standalone module): [rlgl] +* - Multiple Fonts formats supported (TTF, OTF, FNT, BDF, Sprite fonts) +* - Outstanding texture formats support, including compressed formats (DXT, ETC, ASTC) +* - Full 3d support for 3d Shapes, Models, Billboards, Heightmaps and more! +* - Flexible Materials system, supporting classic maps and PBR maps +* - Animated 3D models supported (skeletal bones animation) (IQM, M3D, GLTF) +* - Shaders support, including Model shaders and Postprocessing shaders +* - Powerful math module for Vector, Matrix and Quaternion operations: [raymath] +* - Audio loading and playing with streaming support (WAV, OGG, MP3, FLAC, QOA, XM, MOD) +* - VR stereo rendering with configurable HMD device parameters +* - Bindings to multiple programming languages available! +* +* NOTES: +* - One default Font is loaded on InitWindow()->LoadFontDefault() [core, text] +* - One default Texture2D is loaded on rlglInit(), 1x1 white pixel R8G8B8A8 [rlgl] (OpenGL 3.3 or ES2) +* - One default Shader is loaded on rlglInit()->rlLoadShaderDefault() [rlgl] (OpenGL 3.3 or ES2) +* - One default RenderBatch is loaded on rlglInit()->rlLoadRenderBatch() [rlgl] (OpenGL 3.3 or ES2) +* +* DEPENDENCIES (included): +* [rcore][GLFW] rglfw (Camilla Löwy - github.com/glfw/glfw) for window/context management and input +* [rcore][RGFW] rgfw (ColleagueRiley - github.com/ColleagueRiley/RGFW) for window/context management and input +* [rlgl] glad/glad_gles2 (David Herberth - github.com/Dav1dde/glad) for OpenGL 3.3 extensions loading +* [raudio] miniaudio (David Reid - github.com/mackron/miniaudio) for audio device/context management +* +* OPTIONAL DEPENDENCIES (included): +* [rcore] msf_gif (Miles Fogle) for GIF recording +* [rcore] sinfl (Micha Mettke) for DEFLATE decompression algorithm +* [rcore] sdefl (Micha Mettke) for DEFLATE compression algorithm +* [rcore] rprand (Ramon Snatamaria) for pseudo-random numbers generation +* [rtextures] qoi (Dominic Szablewski - https://phoboslab.org) for QOI image manage +* [rtextures] stb_image (Sean Barret) for images loading (BMP, TGA, PNG, JPEG, HDR...) +* [rtextures] stb_image_write (Sean Barret) for image writing (BMP, TGA, PNG, JPG) +* [rtextures] stb_image_resize2 (Sean Barret) for image resizing algorithms +* [rtextures] stb_perlin (Sean Barret) for Perlin Noise image generation +* [rtext] stb_truetype (Sean Barret) for ttf fonts loading +* [rtext] stb_rect_pack (Sean Barret) for rectangles packing +* [rmodels] par_shapes (Philip Rideout) for parametric 3d shapes generation +* [rmodels] tinyobj_loader_c (Syoyo Fujita) for models loading (OBJ, MTL) +* [rmodels] cgltf (Johannes Kuhlmann) for models loading (glTF) +* [rmodels] m3d (bzt) for models loading (M3D, https://bztsrc.gitlab.io/model3d) +* [rmodels] vox_loader (Johann Nadalutti) for models loading (VOX) +* [raudio] dr_wav (David Reid) for WAV audio file loading +* [raudio] dr_flac (David Reid) for FLAC audio file loading +* [raudio] dr_mp3 (David Reid) for MP3 audio file loading +* [raudio] stb_vorbis (Sean Barret) for OGG audio loading +* [raudio] jar_xm (Joshua Reisenauer) for XM audio module loading +* [raudio] jar_mod (Joshua Reisenauer) for MOD audio module loading +* [raudio] qoa (Dominic Szablewski - https://phoboslab.org) for QOA audio manage +* +* +* LICENSE: zlib/libpng +* +* raylib is licensed under an unmodified zlib/libpng license, which is an OSI-certified, +* BSD-like license that allows static linking with closed source software: +* +* Copyright (c) 2013-2024 Ramon Santamaria (@raysan5) +* +* This software is provided "as-is", without any express or implied warranty. In no event +* will the authors be held liable for any damages arising from the use of this software. +* +* Permission is granted to anyone to use this software for any purpose, including commercial +* applications, and to alter it and redistribute it freely, subject to the following restrictions: +* +* 1. The origin of this software must not be misrepresented; you must not claim that you +* wrote the original software. If you use this software in a product, an acknowledgment +* in the product documentation would be appreciated but is not required. +* +* 2. Altered source versions must be plainly marked as such, and must not be misrepresented +* as being the original software. +* +* 3. This notice may not be removed or altered from any source distribution. +* +**********************************************************************************************/ + +#ifndef RAYLIB_H +#define RAYLIB_H + +#include <stdarg.h> // Required for: va_list - Only used by TraceLogCallback + +#define RAYLIB_VERSION_MAJOR 5 +#define RAYLIB_VERSION_MINOR 5 +#define RAYLIB_VERSION_PATCH 0 +#define RAYLIB_VERSION "5.5" + +// Function specifiers in case library is build/used as a shared library +// NOTE: Microsoft specifiers to tell compiler that symbols are imported/exported from a .dll +// NOTE: visibility("default") attribute makes symbols "visible" when compiled with -fvisibility=hidden +#if defined(_WIN32) + #if defined(__TINYC__) + #define __declspec(x) __attribute__((x)) + #endif + #if defined(BUILD_LIBTYPE_SHARED) + #define RLAPI __declspec(dllexport) // We are building the library as a Win32 shared library (.dll) + #elif defined(USE_LIBTYPE_SHARED) + #define RLAPI __declspec(dllimport) // We are using the library as a Win32 shared library (.dll) + #endif +#else + #if defined(BUILD_LIBTYPE_SHARED) + #define RLAPI __attribute__((visibility("default"))) // We are building as a Unix shared library (.so/.dylib) + #endif +#endif + +#ifndef RLAPI + #define RLAPI // Functions defined as 'extern' by default (implicit specifiers) +#endif + +//---------------------------------------------------------------------------------- +// Some basic Defines +//---------------------------------------------------------------------------------- +#ifndef PI + #define PI 3.14159265358979323846f +#endif +#ifndef DEG2RAD + #define DEG2RAD (PI/180.0f) +#endif +#ifndef RAD2DEG + #define RAD2DEG (180.0f/PI) +#endif + +// Allow custom memory allocators +// NOTE: Require recompiling raylib sources +#ifndef RL_MALLOC + #define RL_MALLOC(sz) malloc(sz) +#endif +#ifndef RL_CALLOC + #define RL_CALLOC(n,sz) calloc(n,sz) +#endif +#ifndef RL_REALLOC + #define RL_REALLOC(ptr,sz) realloc(ptr,sz) +#endif +#ifndef RL_FREE + #define RL_FREE(ptr) free(ptr) +#endif + +// NOTE: MSVC C++ compiler does not support compound literals (C99 feature) +// Plain structures in C++ (without constructors) can be initialized with { } +// This is called aggregate initialization (C++11 feature) +#if defined(__cplusplus) + #define CLITERAL(type) type +#else + #define CLITERAL(type) (type) +#endif + +// Some compilers (mostly macos clang) default to C++98, +// where aggregate initialization can't be used +// So, give a more clear error stating how to fix this +#if !defined(_MSC_VER) && (defined(__cplusplus) && __cplusplus < 201103L) + #error "C++11 or later is required. Add -std=c++11" +#endif + +// NOTE: We set some defines with some data types declared by raylib +// Other modules (raymath, rlgl) also require some of those types, so, +// to be able to use those other modules as standalone (not depending on raylib) +// this defines are very useful for internal check and avoid type (re)definitions +#define RL_COLOR_TYPE +#define RL_RECTANGLE_TYPE +#define RL_VECTOR2_TYPE +#define RL_VECTOR3_TYPE +#define RL_VECTOR4_TYPE +#define RL_QUATERNION_TYPE +#define RL_MATRIX_TYPE + +// Some Basic Colors +// NOTE: Custom raylib color palette for amazing visuals on WHITE background +#define LIGHTGRAY CLITERAL(Color){ 200, 200, 200, 255 } // Light Gray +#define GRAY CLITERAL(Color){ 130, 130, 130, 255 } // Gray +#define DARKGRAY CLITERAL(Color){ 80, 80, 80, 255 } // Dark Gray +#define YELLOW CLITERAL(Color){ 253, 249, 0, 255 } // Yellow +#define GOLD CLITERAL(Color){ 255, 203, 0, 255 } // Gold +#define ORANGE CLITERAL(Color){ 255, 161, 0, 255 } // Orange +#define PINK CLITERAL(Color){ 255, 109, 194, 255 } // Pink +#define RED CLITERAL(Color){ 230, 41, 55, 255 } // Red +#define MAROON CLITERAL(Color){ 190, 33, 55, 255 } // Maroon +#define GREEN CLITERAL(Color){ 0, 228, 48, 255 } // Green +#define LIME CLITERAL(Color){ 0, 158, 47, 255 } // Lime +#define DARKGREEN CLITERAL(Color){ 0, 117, 44, 255 } // Dark Green +#define SKYBLUE CLITERAL(Color){ 102, 191, 255, 255 } // Sky Blue +#define BLUE CLITERAL(Color){ 0, 121, 241, 255 } // Blue +#define DARKBLUE CLITERAL(Color){ 0, 82, 172, 255 } // Dark Blue +#define PURPLE CLITERAL(Color){ 200, 122, 255, 255 } // Purple +#define VIOLET CLITERAL(Color){ 135, 60, 190, 255 } // Violet +#define DARKPURPLE CLITERAL(Color){ 112, 31, 126, 255 } // Dark Purple +#define BEIGE CLITERAL(Color){ 211, 176, 131, 255 } // Beige +#define BROWN CLITERAL(Color){ 127, 106, 79, 255 } // Brown +#define DARKBROWN CLITERAL(Color){ 76, 63, 47, 255 } // Dark Brown + +#define WHITE CLITERAL(Color){ 255, 255, 255, 255 } // White +#define BLACK CLITERAL(Color){ 0, 0, 0, 255 } // Black +#define BLANK CLITERAL(Color){ 0, 0, 0, 0 } // Blank (Transparent) +#define MAGENTA CLITERAL(Color){ 255, 0, 255, 255 } // Magenta +#define RAYWHITE CLITERAL(Color){ 245, 245, 245, 255 } // My own White (raylib logo) + +//---------------------------------------------------------------------------------- +// Structures Definition +//---------------------------------------------------------------------------------- +// Boolean type +#if (defined(__STDC__) && __STDC_VERSION__ >= 199901L) || (defined(_MSC_VER) && _MSC_VER >= 1800) + #include <stdbool.h> +#elif !defined(__cplusplus) && !defined(bool) + typedef enum bool { false = 0, true = !false } bool; + #define RL_BOOL_TYPE +#endif + +// Vector2, 2 components +typedef struct Vector2 { + float x; // Vector x component + float y; // Vector y component +} Vector2; + +// Vector3, 3 components +typedef struct Vector3 { + float x; // Vector x component + float y; // Vector y component + float z; // Vector z component +} Vector3; + +// Vector4, 4 components +typedef struct Vector4 { + float x; // Vector x component + float y; // Vector y component + float z; // Vector z component + float w; // Vector w component +} Vector4; + +// Quaternion, 4 components (Vector4 alias) +typedef Vector4 Quaternion; + +// Matrix, 4x4 components, column major, OpenGL style, right-handed +typedef struct Matrix { + float m0, m4, m8, m12; // Matrix first row (4 components) + float m1, m5, m9, m13; // Matrix second row (4 components) + float m2, m6, m10, m14; // Matrix third row (4 components) + float m3, m7, m11, m15; // Matrix fourth row (4 components) +} Matrix; + +// Color, 4 components, R8G8B8A8 (32bit) +typedef struct Color { + unsigned char r; // Color red value + unsigned char g; // Color green value + unsigned char b; // Color blue value + unsigned char a; // Color alpha value +} Color; + +// Rectangle, 4 components +typedef struct Rectangle { + float x; // Rectangle top-left corner position x + float y; // Rectangle top-left corner position y + float width; // Rectangle width + float height; // Rectangle height +} Rectangle; + +// Image, pixel data stored in CPU memory (RAM) +typedef struct Image { + void *data; // Image raw data + int width; // Image base width + int height; // Image base height + int mipmaps; // Mipmap levels, 1 by default + int format; // Data format (PixelFormat type) +} Image; + +// Texture, tex data stored in GPU memory (VRAM) +typedef struct Texture { + unsigned int id; // OpenGL texture id + int width; // Texture base width + int height; // Texture base height + int mipmaps; // Mipmap levels, 1 by default + int format; // Data format (PixelFormat type) +} Texture; + +// Texture2D, same as Texture +typedef Texture Texture2D; + +// TextureCubemap, same as Texture +typedef Texture TextureCubemap; + +// RenderTexture, fbo for texture rendering +typedef struct RenderTexture { + unsigned int id; // OpenGL framebuffer object id + Texture texture; // Color buffer attachment texture + Texture depth; // Depth buffer attachment texture +} RenderTexture; + +// RenderTexture2D, same as RenderTexture +typedef RenderTexture RenderTexture2D; + +// NPatchInfo, n-patch layout info +typedef struct NPatchInfo { + Rectangle source; // Texture source rectangle + int left; // Left border offset + int top; // Top border offset + int right; // Right border offset + int bottom; // Bottom border offset + int layout; // Layout of the n-patch: 3x3, 1x3 or 3x1 +} NPatchInfo; + +// GlyphInfo, font characters glyphs info +typedef struct GlyphInfo { + int value; // Character value (Unicode) + int offsetX; // Character offset X when drawing + int offsetY; // Character offset Y when drawing + int advanceX; // Character advance position X + Image image; // Character image data +} GlyphInfo; + +// Font, font texture and GlyphInfo array data +typedef struct Font { + int baseSize; // Base size (default chars height) + int glyphCount; // Number of glyph characters + int glyphPadding; // Padding around the glyph characters + Texture2D texture; // Texture atlas containing the glyphs + Rectangle *recs; // Rectangles in texture for the glyphs + GlyphInfo *glyphs; // Glyphs info data +} Font; + +// Camera, defines position/orientation in 3d space +typedef struct Camera3D { + Vector3 position; // Camera position + Vector3 target; // Camera target it looks-at + Vector3 up; // Camera up vector (rotation over its axis) + float fovy; // Camera field-of-view aperture in Y (degrees) in perspective, used as near plane width in orthographic + int projection; // Camera projection: CAMERA_PERSPECTIVE or CAMERA_ORTHOGRAPHIC +} Camera3D; + +typedef Camera3D Camera; // Camera type fallback, defaults to Camera3D + +// Camera2D, defines position/orientation in 2d space +typedef struct Camera2D { + Vector2 offset; // Camera offset (displacement from target) + Vector2 target; // Camera target (rotation and zoom origin) + float rotation; // Camera rotation in degrees + float zoom; // Camera zoom (scaling), should be 1.0f by default +} Camera2D; + +// Mesh, vertex data and vao/vbo +typedef struct Mesh { + int vertexCount; // Number of vertices stored in arrays + int triangleCount; // Number of triangles stored (indexed or not) + + // Vertex attributes data + float *vertices; // Vertex position (XYZ - 3 components per vertex) (shader-location = 0) + float *texcoords; // Vertex texture coordinates (UV - 2 components per vertex) (shader-location = 1) + float *texcoords2; // Vertex texture second coordinates (UV - 2 components per vertex) (shader-location = 5) + float *normals; // Vertex normals (XYZ - 3 components per vertex) (shader-location = 2) + float *tangents; // Vertex tangents (XYZW - 4 components per vertex) (shader-location = 4) + unsigned char *colors; // Vertex colors (RGBA - 4 components per vertex) (shader-location = 3) + unsigned short *indices; // Vertex indices (in case vertex data comes indexed) + + // Animation vertex data + float *animVertices; // Animated vertex positions (after bones transformations) + float *animNormals; // Animated normals (after bones transformations) + unsigned char *boneIds; // Vertex bone ids, max 255 bone ids, up to 4 bones influence by vertex (skinning) (shader-location = 6) + float *boneWeights; // Vertex bone weight, up to 4 bones influence by vertex (skinning) (shader-location = 7) + Matrix *boneMatrices; // Bones animated transformation matrices + int boneCount; // Number of bones + + // OpenGL identifiers + unsigned int vaoId; // OpenGL Vertex Array Object id + unsigned int *vboId; // OpenGL Vertex Buffer Objects id (default vertex data) +} Mesh; + +// Shader +typedef struct Shader { + unsigned int id; // Shader program id + int *locs; // Shader locations array (RL_MAX_SHADER_LOCATIONS) +} Shader; + +// MaterialMap +typedef struct MaterialMap { + Texture2D texture; // Material map texture + Color color; // Material map color + float value; // Material map value +} MaterialMap; + +// Material, includes shader and maps +typedef struct Material { + Shader shader; // Material shader + MaterialMap *maps; // Material maps array (MAX_MATERIAL_MAPS) + float params[4]; // Material generic parameters (if required) +} Material; + +// Transform, vertex transformation data +typedef struct Transform { + Vector3 translation; // Translation + Quaternion rotation; // Rotation + Vector3 scale; // Scale +} Transform; + +// Bone, skeletal animation bone +typedef struct BoneInfo { + char name[32]; // Bone name + int parent; // Bone parent +} BoneInfo; + +// Model, meshes, materials and animation data +typedef struct Model { + Matrix transform; // Local transform matrix + + int meshCount; // Number of meshes + int materialCount; // Number of materials + Mesh *meshes; // Meshes array + Material *materials; // Materials array + int *meshMaterial; // Mesh material number + + // Animation data + int boneCount; // Number of bones + BoneInfo *bones; // Bones information (skeleton) + Transform *bindPose; // Bones base transformation (pose) +} Model; + +// ModelAnimation +typedef struct ModelAnimation { + int boneCount; // Number of bones + int frameCount; // Number of animation frames + BoneInfo *bones; // Bones information (skeleton) + Transform **framePoses; // Poses array by frame + char name[32]; // Animation name +} ModelAnimation; + +// Ray, ray for raycasting +typedef struct Ray { + Vector3 position; // Ray position (origin) + Vector3 direction; // Ray direction (normalized) +} Ray; + +// RayCollision, ray hit information +typedef struct RayCollision { + bool hit; // Did the ray hit something? + float distance; // Distance to the nearest hit + Vector3 point; // Point of the nearest hit + Vector3 normal; // Surface normal of hit +} RayCollision; + +// BoundingBox +typedef struct BoundingBox { + Vector3 min; // Minimum vertex box-corner + Vector3 max; // Maximum vertex box-corner +} BoundingBox; + +// Wave, audio wave data +typedef struct Wave { + unsigned int frameCount; // Total number of frames (considering channels) + unsigned int sampleRate; // Frequency (samples per second) + unsigned int sampleSize; // Bit depth (bits per sample): 8, 16, 32 (24 not supported) + unsigned int channels; // Number of channels (1-mono, 2-stereo, ...) + void *data; // Buffer data pointer +} Wave; + +// Opaque structs declaration +// NOTE: Actual structs are defined internally in raudio module +typedef struct rAudioBuffer rAudioBuffer; +typedef struct rAudioProcessor rAudioProcessor; + +// AudioStream, custom audio stream +typedef struct AudioStream { + rAudioBuffer *buffer; // Pointer to internal data used by the audio system + rAudioProcessor *processor; // Pointer to internal data processor, useful for audio effects + + unsigned int sampleRate; // Frequency (samples per second) + unsigned int sampleSize; // Bit depth (bits per sample): 8, 16, 32 (24 not supported) + unsigned int channels; // Number of channels (1-mono, 2-stereo, ...) +} AudioStream; + +// Sound +typedef struct Sound { + AudioStream stream; // Audio stream + unsigned int frameCount; // Total number of frames (considering channels) +} Sound; + +// Music, audio stream, anything longer than ~10 seconds should be streamed +typedef struct Music { + AudioStream stream; // Audio stream + unsigned int frameCount; // Total number of frames (considering channels) + bool looping; // Music looping enable + + int ctxType; // Type of music context (audio filetype) + void *ctxData; // Audio context data, depends on type +} Music; + +// VrDeviceInfo, Head-Mounted-Display device parameters +typedef struct VrDeviceInfo { + int hResolution; // Horizontal resolution in pixels + int vResolution; // Vertical resolution in pixels + float hScreenSize; // Horizontal size in meters + float vScreenSize; // Vertical size in meters + float eyeToScreenDistance; // Distance between eye and display in meters + float lensSeparationDistance; // Lens separation distance in meters + float interpupillaryDistance; // IPD (distance between pupils) in meters + float lensDistortionValues[4]; // Lens distortion constant parameters + float chromaAbCorrection[4]; // Chromatic aberration correction parameters +} VrDeviceInfo; + +// VrStereoConfig, VR stereo rendering configuration for simulator +typedef struct VrStereoConfig { + Matrix projection[2]; // VR projection matrices (per eye) + Matrix viewOffset[2]; // VR view offset matrices (per eye) + float leftLensCenter[2]; // VR left lens center + float rightLensCenter[2]; // VR right lens center + float leftScreenCenter[2]; // VR left screen center + float rightScreenCenter[2]; // VR right screen center + float scale[2]; // VR distortion scale + float scaleIn[2]; // VR distortion scale in +} VrStereoConfig; + +// File path list +typedef struct FilePathList { + unsigned int capacity; // Filepaths max entries + unsigned int count; // Filepaths entries count + char **paths; // Filepaths entries +} FilePathList; + +// Automation event +typedef struct AutomationEvent { + unsigned int frame; // Event frame + unsigned int type; // Event type (AutomationEventType) + int params[4]; // Event parameters (if required) +} AutomationEvent; + +// Automation event list +typedef struct AutomationEventList { + unsigned int capacity; // Events max entries (MAX_AUTOMATION_EVENTS) + unsigned int count; // Events entries count + AutomationEvent *events; // Events entries +} AutomationEventList; + +//---------------------------------------------------------------------------------- +// Enumerators Definition +//---------------------------------------------------------------------------------- +// System/Window config flags +// NOTE: Every bit registers one state (use it with bit masks) +// By default all flags are set to 0 +typedef enum { + FLAG_VSYNC_HINT = 0x00000040, // Set to try enabling V-Sync on GPU + FLAG_FULLSCREEN_MODE = 0x00000002, // Set to run program in fullscreen + FLAG_WINDOW_RESIZABLE = 0x00000004, // Set to allow resizable window + FLAG_WINDOW_UNDECORATED = 0x00000008, // Set to disable window decoration (frame and buttons) + FLAG_WINDOW_HIDDEN = 0x00000080, // Set to hide window + FLAG_WINDOW_MINIMIZED = 0x00000200, // Set to minimize window (iconify) + FLAG_WINDOW_MAXIMIZED = 0x00000400, // Set to maximize window (expanded to monitor) + FLAG_WINDOW_UNFOCUSED = 0x00000800, // Set to window non focused + FLAG_WINDOW_TOPMOST = 0x00001000, // Set to window always on top + FLAG_WINDOW_ALWAYS_RUN = 0x00000100, // Set to allow windows running while minimized + FLAG_WINDOW_TRANSPARENT = 0x00000010, // Set to allow transparent framebuffer + FLAG_WINDOW_HIGHDPI = 0x00002000, // Set to support HighDPI + FLAG_WINDOW_MOUSE_PASSTHROUGH = 0x00004000, // Set to support mouse passthrough, only supported when FLAG_WINDOW_UNDECORATED + FLAG_BORDERLESS_WINDOWED_MODE = 0x00008000, // Set to run program in borderless windowed mode + FLAG_MSAA_4X_HINT = 0x00000020, // Set to try enabling MSAA 4X + FLAG_INTERLACED_HINT = 0x00010000 // Set to try enabling interlaced video format (for V3D) +} ConfigFlags; + +// Trace log level +// NOTE: Organized by priority level +typedef enum { + LOG_ALL = 0, // Display all logs + LOG_TRACE, // Trace logging, intended for internal use only + LOG_DEBUG, // Debug logging, used for internal debugging, it should be disabled on release builds + LOG_INFO, // Info logging, used for program execution info + LOG_WARNING, // Warning logging, used on recoverable failures + LOG_ERROR, // Error logging, used on unrecoverable failures + LOG_FATAL, // Fatal logging, used to abort program: exit(EXIT_FAILURE) + LOG_NONE // Disable logging +} TraceLogLevel; + +// Keyboard keys (US keyboard layout) +// NOTE: Use GetKeyPressed() to allow redefining +// required keys for alternative layouts +typedef enum { + KEY_NULL = 0, // Key: NULL, used for no key pressed + // Alphanumeric keys + KEY_APOSTROPHE = 39, // Key: ' + KEY_COMMA = 44, // Key: , + KEY_MINUS = 45, // Key: - + KEY_PERIOD = 46, // Key: . + KEY_SLASH = 47, // Key: / + KEY_ZERO = 48, // Key: 0 + KEY_ONE = 49, // Key: 1 + KEY_TWO = 50, // Key: 2 + KEY_THREE = 51, // Key: 3 + KEY_FOUR = 52, // Key: 4 + KEY_FIVE = 53, // Key: 5 + KEY_SIX = 54, // Key: 6 + KEY_SEVEN = 55, // Key: 7 + KEY_EIGHT = 56, // Key: 8 + KEY_NINE = 57, // Key: 9 + KEY_SEMICOLON = 59, // Key: ; + KEY_EQUAL = 61, // Key: = + KEY_A = 65, // Key: A | a + KEY_B = 66, // Key: B | b + KEY_C = 67, // Key: C | c + KEY_D = 68, // Key: D | d + KEY_E = 69, // Key: E | e + KEY_F = 70, // Key: F | f + KEY_G = 71, // Key: G | g + KEY_H = 72, // Key: H | h + KEY_I = 73, // Key: I | i + KEY_J = 74, // Key: J | j + KEY_K = 75, // Key: K | k + KEY_L = 76, // Key: L | l + KEY_M = 77, // Key: M | m + KEY_N = 78, // Key: N | n + KEY_O = 79, // Key: O | o + KEY_P = 80, // Key: P | p + KEY_Q = 81, // Key: Q | q + KEY_R = 82, // Key: R | r + KEY_S = 83, // Key: S | s + KEY_T = 84, // Key: T | t + KEY_U = 85, // Key: U | u + KEY_V = 86, // Key: V | v + KEY_W = 87, // Key: W | w + KEY_X = 88, // Key: X | x + KEY_Y = 89, // Key: Y | y + KEY_Z = 90, // Key: Z | z + KEY_LEFT_BRACKET = 91, // Key: [ + KEY_BACKSLASH = 92, // Key: '\' + KEY_RIGHT_BRACKET = 93, // Key: ] + KEY_GRAVE = 96, // Key: ` + // Function keys + KEY_SPACE = 32, // Key: Space + KEY_ESCAPE = 256, // Key: Esc + KEY_ENTER = 257, // Key: Enter + KEY_TAB = 258, // Key: Tab + KEY_BACKSPACE = 259, // Key: Backspace + KEY_INSERT = 260, // Key: Ins + KEY_DELETE = 261, // Key: Del + KEY_RIGHT = 262, // Key: Cursor right + KEY_LEFT = 263, // Key: Cursor left + KEY_DOWN = 264, // Key: Cursor down + KEY_UP = 265, // Key: Cursor up + KEY_PAGE_UP = 266, // Key: Page up + KEY_PAGE_DOWN = 267, // Key: Page down + KEY_HOME = 268, // Key: Home + KEY_END = 269, // Key: End + KEY_CAPS_LOCK = 280, // Key: Caps lock + KEY_SCROLL_LOCK = 281, // Key: Scroll down + KEY_NUM_LOCK = 282, // Key: Num lock + KEY_PRINT_SCREEN = 283, // Key: Print screen + KEY_PAUSE = 284, // Key: Pause + KEY_F1 = 290, // Key: F1 + KEY_F2 = 291, // Key: F2 + KEY_F3 = 292, // Key: F3 + KEY_F4 = 293, // Key: F4 + KEY_F5 = 294, // Key: F5 + KEY_F6 = 295, // Key: F6 + KEY_F7 = 296, // Key: F7 + KEY_F8 = 297, // Key: F8 + KEY_F9 = 298, // Key: F9 + KEY_F10 = 299, // Key: F10 + KEY_F11 = 300, // Key: F11 + KEY_F12 = 301, // Key: F12 + KEY_LEFT_SHIFT = 340, // Key: Shift left + KEY_LEFT_CONTROL = 341, // Key: Control left + KEY_LEFT_ALT = 342, // Key: Alt left + KEY_LEFT_SUPER = 343, // Key: Super left + KEY_RIGHT_SHIFT = 344, // Key: Shift right + KEY_RIGHT_CONTROL = 345, // Key: Control right + KEY_RIGHT_ALT = 346, // Key: Alt right + KEY_RIGHT_SUPER = 347, // Key: Super right + KEY_KB_MENU = 348, // Key: KB menu + // Keypad keys + KEY_KP_0 = 320, // Key: Keypad 0 + KEY_KP_1 = 321, // Key: Keypad 1 + KEY_KP_2 = 322, // Key: Keypad 2 + KEY_KP_3 = 323, // Key: Keypad 3 + KEY_KP_4 = 324, // Key: Keypad 4 + KEY_KP_5 = 325, // Key: Keypad 5 + KEY_KP_6 = 326, // Key: Keypad 6 + KEY_KP_7 = 327, // Key: Keypad 7 + KEY_KP_8 = 328, // Key: Keypad 8 + KEY_KP_9 = 329, // Key: Keypad 9 + KEY_KP_DECIMAL = 330, // Key: Keypad . + KEY_KP_DIVIDE = 331, // Key: Keypad / + KEY_KP_MULTIPLY = 332, // Key: Keypad * + KEY_KP_SUBTRACT = 333, // Key: Keypad - + KEY_KP_ADD = 334, // Key: Keypad + + KEY_KP_ENTER = 335, // Key: Keypad Enter + KEY_KP_EQUAL = 336, // Key: Keypad = + // Android key buttons + KEY_BACK = 4, // Key: Android back button + KEY_MENU = 5, // Key: Android menu button + KEY_VOLUME_UP = 24, // Key: Android volume up button + KEY_VOLUME_DOWN = 25 // Key: Android volume down button +} KeyboardKey; + +// Add backwards compatibility support for deprecated names +#define MOUSE_LEFT_BUTTON MOUSE_BUTTON_LEFT +#define MOUSE_RIGHT_BUTTON MOUSE_BUTTON_RIGHT +#define MOUSE_MIDDLE_BUTTON MOUSE_BUTTON_MIDDLE + +// Mouse buttons +typedef enum { + MOUSE_BUTTON_LEFT = 0, // Mouse button left + MOUSE_BUTTON_RIGHT = 1, // Mouse button right + MOUSE_BUTTON_MIDDLE = 2, // Mouse button middle (pressed wheel) + MOUSE_BUTTON_SIDE = 3, // Mouse button side (advanced mouse device) + MOUSE_BUTTON_EXTRA = 4, // Mouse button extra (advanced mouse device) + MOUSE_BUTTON_FORWARD = 5, // Mouse button forward (advanced mouse device) + MOUSE_BUTTON_BACK = 6, // Mouse button back (advanced mouse device) +} MouseButton; + +// Mouse cursor +typedef enum { + MOUSE_CURSOR_DEFAULT = 0, // Default pointer shape + MOUSE_CURSOR_ARROW = 1, // Arrow shape + MOUSE_CURSOR_IBEAM = 2, // Text writing cursor shape + MOUSE_CURSOR_CROSSHAIR = 3, // Cross shape + MOUSE_CURSOR_POINTING_HAND = 4, // Pointing hand cursor + MOUSE_CURSOR_RESIZE_EW = 5, // Horizontal resize/move arrow shape + MOUSE_CURSOR_RESIZE_NS = 6, // Vertical resize/move arrow shape + MOUSE_CURSOR_RESIZE_NWSE = 7, // Top-left to bottom-right diagonal resize/move arrow shape + MOUSE_CURSOR_RESIZE_NESW = 8, // The top-right to bottom-left diagonal resize/move arrow shape + MOUSE_CURSOR_RESIZE_ALL = 9, // The omnidirectional resize/move cursor shape + MOUSE_CURSOR_NOT_ALLOWED = 10 // The operation-not-allowed shape +} MouseCursor; + +// Gamepad buttons +typedef enum { + GAMEPAD_BUTTON_UNKNOWN = 0, // Unknown button, just for error checking + GAMEPAD_BUTTON_LEFT_FACE_UP, // Gamepad left DPAD up button + GAMEPAD_BUTTON_LEFT_FACE_RIGHT, // Gamepad left DPAD right button + GAMEPAD_BUTTON_LEFT_FACE_DOWN, // Gamepad left DPAD down button + GAMEPAD_BUTTON_LEFT_FACE_LEFT, // Gamepad left DPAD left button + GAMEPAD_BUTTON_RIGHT_FACE_UP, // Gamepad right button up (i.e. PS3: Triangle, Xbox: Y) + GAMEPAD_BUTTON_RIGHT_FACE_RIGHT, // Gamepad right button right (i.e. PS3: Circle, Xbox: B) + GAMEPAD_BUTTON_RIGHT_FACE_DOWN, // Gamepad right button down (i.e. PS3: Cross, Xbox: A) + GAMEPAD_BUTTON_RIGHT_FACE_LEFT, // Gamepad right button left (i.e. PS3: Square, Xbox: X) + GAMEPAD_BUTTON_LEFT_TRIGGER_1, // Gamepad top/back trigger left (first), it could be a trailing button + GAMEPAD_BUTTON_LEFT_TRIGGER_2, // Gamepad top/back trigger left (second), it could be a trailing button + GAMEPAD_BUTTON_RIGHT_TRIGGER_1, // Gamepad top/back trigger right (first), it could be a trailing button + GAMEPAD_BUTTON_RIGHT_TRIGGER_2, // Gamepad top/back trigger right (second), it could be a trailing button + GAMEPAD_BUTTON_MIDDLE_LEFT, // Gamepad center buttons, left one (i.e. PS3: Select) + GAMEPAD_BUTTON_MIDDLE, // Gamepad center buttons, middle one (i.e. PS3: PS, Xbox: XBOX) + GAMEPAD_BUTTON_MIDDLE_RIGHT, // Gamepad center buttons, right one (i.e. PS3: Start) + GAMEPAD_BUTTON_LEFT_THUMB, // Gamepad joystick pressed button left + GAMEPAD_BUTTON_RIGHT_THUMB // Gamepad joystick pressed button right +} GamepadButton; + +// Gamepad axis +typedef enum { + GAMEPAD_AXIS_LEFT_X = 0, // Gamepad left stick X axis + GAMEPAD_AXIS_LEFT_Y = 1, // Gamepad left stick Y axis + GAMEPAD_AXIS_RIGHT_X = 2, // Gamepad right stick X axis + GAMEPAD_AXIS_RIGHT_Y = 3, // Gamepad right stick Y axis + GAMEPAD_AXIS_LEFT_TRIGGER = 4, // Gamepad back trigger left, pressure level: [1..-1] + GAMEPAD_AXIS_RIGHT_TRIGGER = 5 // Gamepad back trigger right, pressure level: [1..-1] +} GamepadAxis; + +// Material map index +typedef enum { + MATERIAL_MAP_ALBEDO = 0, // Albedo material (same as: MATERIAL_MAP_DIFFUSE) + MATERIAL_MAP_METALNESS, // Metalness material (same as: MATERIAL_MAP_SPECULAR) + MATERIAL_MAP_NORMAL, // Normal material + MATERIAL_MAP_ROUGHNESS, // Roughness material + MATERIAL_MAP_OCCLUSION, // Ambient occlusion material + MATERIAL_MAP_EMISSION, // Emission material + MATERIAL_MAP_HEIGHT, // Heightmap material + MATERIAL_MAP_CUBEMAP, // Cubemap material (NOTE: Uses GL_TEXTURE_CUBE_MAP) + MATERIAL_MAP_IRRADIANCE, // Irradiance material (NOTE: Uses GL_TEXTURE_CUBE_MAP) + MATERIAL_MAP_PREFILTER, // Prefilter material (NOTE: Uses GL_TEXTURE_CUBE_MAP) + MATERIAL_MAP_BRDF // Brdf material +} MaterialMapIndex; + +#define MATERIAL_MAP_DIFFUSE MATERIAL_MAP_ALBEDO +#define MATERIAL_MAP_SPECULAR MATERIAL_MAP_METALNESS + +// Shader location index +typedef enum { + SHADER_LOC_VERTEX_POSITION = 0, // Shader location: vertex attribute: position + SHADER_LOC_VERTEX_TEXCOORD01, // Shader location: vertex attribute: texcoord01 + SHADER_LOC_VERTEX_TEXCOORD02, // Shader location: vertex attribute: texcoord02 + SHADER_LOC_VERTEX_NORMAL, // Shader location: vertex attribute: normal + SHADER_LOC_VERTEX_TANGENT, // Shader location: vertex attribute: tangent + SHADER_LOC_VERTEX_COLOR, // Shader location: vertex attribute: color + SHADER_LOC_MATRIX_MVP, // Shader location: matrix uniform: model-view-projection + SHADER_LOC_MATRIX_VIEW, // Shader location: matrix uniform: view (camera transform) + SHADER_LOC_MATRIX_PROJECTION, // Shader location: matrix uniform: projection + SHADER_LOC_MATRIX_MODEL, // Shader location: matrix uniform: model (transform) + SHADER_LOC_MATRIX_NORMAL, // Shader location: matrix uniform: normal + SHADER_LOC_VECTOR_VIEW, // Shader location: vector uniform: view + SHADER_LOC_COLOR_DIFFUSE, // Shader location: vector uniform: diffuse color + SHADER_LOC_COLOR_SPECULAR, // Shader location: vector uniform: specular color + SHADER_LOC_COLOR_AMBIENT, // Shader location: vector uniform: ambient color + SHADER_LOC_MAP_ALBEDO, // Shader location: sampler2d texture: albedo (same as: SHADER_LOC_MAP_DIFFUSE) + SHADER_LOC_MAP_METALNESS, // Shader location: sampler2d texture: metalness (same as: SHADER_LOC_MAP_SPECULAR) + SHADER_LOC_MAP_NORMAL, // Shader location: sampler2d texture: normal + SHADER_LOC_MAP_ROUGHNESS, // Shader location: sampler2d texture: roughness + SHADER_LOC_MAP_OCCLUSION, // Shader location: sampler2d texture: occlusion + SHADER_LOC_MAP_EMISSION, // Shader location: sampler2d texture: emission + SHADER_LOC_MAP_HEIGHT, // Shader location: sampler2d texture: height + SHADER_LOC_MAP_CUBEMAP, // Shader location: samplerCube texture: cubemap + SHADER_LOC_MAP_IRRADIANCE, // Shader location: samplerCube texture: irradiance + SHADER_LOC_MAP_PREFILTER, // Shader location: samplerCube texture: prefilter + SHADER_LOC_MAP_BRDF, // Shader location: sampler2d texture: brdf + SHADER_LOC_VERTEX_BONEIDS, // Shader location: vertex attribute: boneIds + SHADER_LOC_VERTEX_BONEWEIGHTS, // Shader location: vertex attribute: boneWeights + SHADER_LOC_BONE_MATRICES // Shader location: array of matrices uniform: boneMatrices +} ShaderLocationIndex; + +#define SHADER_LOC_MAP_DIFFUSE SHADER_LOC_MAP_ALBEDO +#define SHADER_LOC_MAP_SPECULAR SHADER_LOC_MAP_METALNESS + +// Shader uniform data type +typedef enum { + SHADER_UNIFORM_FLOAT = 0, // Shader uniform type: float + SHADER_UNIFORM_VEC2, // Shader uniform type: vec2 (2 float) + SHADER_UNIFORM_VEC3, // Shader uniform type: vec3 (3 float) + SHADER_UNIFORM_VEC4, // Shader uniform type: vec4 (4 float) + SHADER_UNIFORM_INT, // Shader uniform type: int + SHADER_UNIFORM_IVEC2, // Shader uniform type: ivec2 (2 int) + SHADER_UNIFORM_IVEC3, // Shader uniform type: ivec3 (3 int) + SHADER_UNIFORM_IVEC4, // Shader uniform type: ivec4 (4 int) + SHADER_UNIFORM_SAMPLER2D // Shader uniform type: sampler2d +} ShaderUniformDataType; + +// Shader attribute data types +typedef enum { + SHADER_ATTRIB_FLOAT = 0, // Shader attribute type: float + SHADER_ATTRIB_VEC2, // Shader attribute type: vec2 (2 float) + SHADER_ATTRIB_VEC3, // Shader attribute type: vec3 (3 float) + SHADER_ATTRIB_VEC4 // Shader attribute type: vec4 (4 float) +} ShaderAttributeDataType; + +// Pixel formats +// NOTE: Support depends on OpenGL version and platform +typedef enum { + PIXELFORMAT_UNCOMPRESSED_GRAYSCALE = 1, // 8 bit per pixel (no alpha) + PIXELFORMAT_UNCOMPRESSED_GRAY_ALPHA, // 8*2 bpp (2 channels) + PIXELFORMAT_UNCOMPRESSED_R5G6B5, // 16 bpp + PIXELFORMAT_UNCOMPRESSED_R8G8B8, // 24 bpp + PIXELFORMAT_UNCOMPRESSED_R5G5B5A1, // 16 bpp (1 bit alpha) + PIXELFORMAT_UNCOMPRESSED_R4G4B4A4, // 16 bpp (4 bit alpha) + PIXELFORMAT_UNCOMPRESSED_R8G8B8A8, // 32 bpp + PIXELFORMAT_UNCOMPRESSED_R32, // 32 bpp (1 channel - float) + PIXELFORMAT_UNCOMPRESSED_R32G32B32, // 32*3 bpp (3 channels - float) + PIXELFORMAT_UNCOMPRESSED_R32G32B32A32, // 32*4 bpp (4 channels - float) + PIXELFORMAT_UNCOMPRESSED_R16, // 16 bpp (1 channel - half float) + PIXELFORMAT_UNCOMPRESSED_R16G16B16, // 16*3 bpp (3 channels - half float) + PIXELFORMAT_UNCOMPRESSED_R16G16B16A16, // 16*4 bpp (4 channels - half float) + PIXELFORMAT_COMPRESSED_DXT1_RGB, // 4 bpp (no alpha) + PIXELFORMAT_COMPRESSED_DXT1_RGBA, // 4 bpp (1 bit alpha) + PIXELFORMAT_COMPRESSED_DXT3_RGBA, // 8 bpp + PIXELFORMAT_COMPRESSED_DXT5_RGBA, // 8 bpp + PIXELFORMAT_COMPRESSED_ETC1_RGB, // 4 bpp + PIXELFORMAT_COMPRESSED_ETC2_RGB, // 4 bpp + PIXELFORMAT_COMPRESSED_ETC2_EAC_RGBA, // 8 bpp + PIXELFORMAT_COMPRESSED_PVRT_RGB, // 4 bpp + PIXELFORMAT_COMPRESSED_PVRT_RGBA, // 4 bpp + PIXELFORMAT_COMPRESSED_ASTC_4x4_RGBA, // 8 bpp + PIXELFORMAT_COMPRESSED_ASTC_8x8_RGBA // 2 bpp +} PixelFormat; + +// Texture parameters: filter mode +// NOTE 1: Filtering considers mipmaps if available in the texture +// NOTE 2: Filter is accordingly set for minification and magnification +typedef enum { + TEXTURE_FILTER_POINT = 0, // No filter, just pixel approximation + TEXTURE_FILTER_BILINEAR, // Linear filtering + TEXTURE_FILTER_TRILINEAR, // Trilinear filtering (linear with mipmaps) + TEXTURE_FILTER_ANISOTROPIC_4X, // Anisotropic filtering 4x + TEXTURE_FILTER_ANISOTROPIC_8X, // Anisotropic filtering 8x + TEXTURE_FILTER_ANISOTROPIC_16X, // Anisotropic filtering 16x +} TextureFilter; + +// Texture parameters: wrap mode +typedef enum { + TEXTURE_WRAP_REPEAT = 0, // Repeats texture in tiled mode + TEXTURE_WRAP_CLAMP, // Clamps texture to edge pixel in tiled mode + TEXTURE_WRAP_MIRROR_REPEAT, // Mirrors and repeats the texture in tiled mode + TEXTURE_WRAP_MIRROR_CLAMP // Mirrors and clamps to border the texture in tiled mode +} TextureWrap; + +// Cubemap layouts +typedef enum { + CUBEMAP_LAYOUT_AUTO_DETECT = 0, // Automatically detect layout type + CUBEMAP_LAYOUT_LINE_VERTICAL, // Layout is defined by a vertical line with faces + CUBEMAP_LAYOUT_LINE_HORIZONTAL, // Layout is defined by a horizontal line with faces + CUBEMAP_LAYOUT_CROSS_THREE_BY_FOUR, // Layout is defined by a 3x4 cross with cubemap faces + CUBEMAP_LAYOUT_CROSS_FOUR_BY_THREE // Layout is defined by a 4x3 cross with cubemap faces +} CubemapLayout; + +// Font type, defines generation method +typedef enum { + FONT_DEFAULT = 0, // Default font generation, anti-aliased + FONT_BITMAP, // Bitmap font generation, no anti-aliasing + FONT_SDF // SDF font generation, requires external shader +} FontType; + +// Color blending modes (pre-defined) +typedef enum { + BLEND_ALPHA = 0, // Blend textures considering alpha (default) + BLEND_ADDITIVE, // Blend textures adding colors + BLEND_MULTIPLIED, // Blend textures multiplying colors + BLEND_ADD_COLORS, // Blend textures adding colors (alternative) + BLEND_SUBTRACT_COLORS, // Blend textures subtracting colors (alternative) + BLEND_ALPHA_PREMULTIPLY, // Blend premultiplied textures considering alpha + BLEND_CUSTOM, // Blend textures using custom src/dst factors (use rlSetBlendFactors()) + BLEND_CUSTOM_SEPARATE // Blend textures using custom rgb/alpha separate src/dst factors (use rlSetBlendFactorsSeparate()) +} BlendMode; + +// Gesture +// NOTE: Provided as bit-wise flags to enable only desired gestures +typedef enum { + GESTURE_NONE = 0, // No gesture + GESTURE_TAP = 1, // Tap gesture + GESTURE_DOUBLETAP = 2, // Double tap gesture + GESTURE_HOLD = 4, // Hold gesture + GESTURE_DRAG = 8, // Drag gesture + GESTURE_SWIPE_RIGHT = 16, // Swipe right gesture + GESTURE_SWIPE_LEFT = 32, // Swipe left gesture + GESTURE_SWIPE_UP = 64, // Swipe up gesture + GESTURE_SWIPE_DOWN = 128, // Swipe down gesture + GESTURE_PINCH_IN = 256, // Pinch in gesture + GESTURE_PINCH_OUT = 512 // Pinch out gesture +} Gesture; + +// Camera system modes +typedef enum { + CAMERA_CUSTOM = 0, // Camera custom, controlled by user (UpdateCamera() does nothing) + CAMERA_FREE, // Camera free mode + CAMERA_ORBITAL, // Camera orbital, around target, zoom supported + CAMERA_FIRST_PERSON, // Camera first person + CAMERA_THIRD_PERSON // Camera third person +} CameraMode; + +// Camera projection +typedef enum { + CAMERA_PERSPECTIVE = 0, // Perspective projection + CAMERA_ORTHOGRAPHIC // Orthographic projection +} CameraProjection; + +// N-patch layout +typedef enum { + NPATCH_NINE_PATCH = 0, // Npatch layout: 3x3 tiles + NPATCH_THREE_PATCH_VERTICAL, // Npatch layout: 1x3 tiles + NPATCH_THREE_PATCH_HORIZONTAL // Npatch layout: 3x1 tiles +} NPatchLayout; + +// Callbacks to hook some internal functions +// WARNING: These callbacks are intended for advanced users +typedef void (*TraceLogCallback)(int logLevel, const char *text, va_list args); // Logging: Redirect trace log messages +typedef unsigned char *(*LoadFileDataCallback)(const char *fileName, int *dataSize); // FileIO: Load binary data +typedef bool (*SaveFileDataCallback)(const char *fileName, void *data, int dataSize); // FileIO: Save binary data +typedef char *(*LoadFileTextCallback)(const char *fileName); // FileIO: Load text data +typedef bool (*SaveFileTextCallback)(const char *fileName, char *text); // FileIO: Save text data + +//------------------------------------------------------------------------------------ +// Global Variables Definition +//------------------------------------------------------------------------------------ +// It's lonely here... + +//------------------------------------------------------------------------------------ +// Window and Graphics Device Functions (Module: core) +//------------------------------------------------------------------------------------ + +#if defined(__cplusplus) +extern "C" { // Prevents name mangling of functions +#endif + +// Window-related functions +RLAPI void InitWindow(int width, int height, const char *title); // Initialize window and OpenGL context +RLAPI void CloseWindow(void); // Close window and unload OpenGL context +RLAPI bool WindowShouldClose(void); // Check if application should close (KEY_ESCAPE pressed or windows close icon clicked) +RLAPI bool IsWindowReady(void); // Check if window has been initialized successfully +RLAPI bool IsWindowFullscreen(void); // Check if window is currently fullscreen +RLAPI bool IsWindowHidden(void); // Check if window is currently hidden +RLAPI bool IsWindowMinimized(void); // Check if window is currently minimized +RLAPI bool IsWindowMaximized(void); // Check if window is currently maximized +RLAPI bool IsWindowFocused(void); // Check if window is currently focused +RLAPI bool IsWindowResized(void); // Check if window has been resized last frame +RLAPI bool IsWindowState(unsigned int flag); // Check if one specific window flag is enabled +RLAPI void SetWindowState(unsigned int flags); // Set window configuration state using flags +RLAPI void ClearWindowState(unsigned int flags); // Clear window configuration state flags +RLAPI void ToggleFullscreen(void); // Toggle window state: fullscreen/windowed, resizes monitor to match window resolution +RLAPI void ToggleBorderlessWindowed(void); // Toggle window state: borderless windowed, resizes window to match monitor resolution +RLAPI void MaximizeWindow(void); // Set window state: maximized, if resizable +RLAPI void MinimizeWindow(void); // Set window state: minimized, if resizable +RLAPI void RestoreWindow(void); // Set window state: not minimized/maximized +RLAPI void SetWindowIcon(Image image); // Set icon for window (single image, RGBA 32bit) +RLAPI void SetWindowIcons(Image *images, int count); // Set icon for window (multiple images, RGBA 32bit) +RLAPI void SetWindowTitle(const char *title); // Set title for window +RLAPI void SetWindowPosition(int x, int y); // Set window position on screen +RLAPI void SetWindowMonitor(int monitor); // Set monitor for the current window +RLAPI void SetWindowMinSize(int width, int height); // Set window minimum dimensions (for FLAG_WINDOW_RESIZABLE) +RLAPI void SetWindowMaxSize(int width, int height); // Set window maximum dimensions (for FLAG_WINDOW_RESIZABLE) +RLAPI void SetWindowSize(int width, int height); // Set window dimensions +RLAPI void SetWindowOpacity(float opacity); // Set window opacity [0.0f..1.0f] +RLAPI void SetWindowFocused(void); // Set window focused +RLAPI void *GetWindowHandle(void); // Get native window handle +RLAPI int GetScreenWidth(void); // Get current screen width +RLAPI int GetScreenHeight(void); // Get current screen height +RLAPI int GetRenderWidth(void); // Get current render width (it considers HiDPI) +RLAPI int GetRenderHeight(void); // Get current render height (it considers HiDPI) +RLAPI int GetMonitorCount(void); // Get number of connected monitors +RLAPI int GetCurrentMonitor(void); // Get current monitor where window is placed +RLAPI Vector2 GetMonitorPosition(int monitor); // Get specified monitor position +RLAPI int GetMonitorWidth(int monitor); // Get specified monitor width (current video mode used by monitor) +RLAPI int GetMonitorHeight(int monitor); // Get specified monitor height (current video mode used by monitor) +RLAPI int GetMonitorPhysicalWidth(int monitor); // Get specified monitor physical width in millimetres +RLAPI int GetMonitorPhysicalHeight(int monitor); // Get specified monitor physical height in millimetres +RLAPI int GetMonitorRefreshRate(int monitor); // Get specified monitor refresh rate +RLAPI Vector2 GetWindowPosition(void); // Get window position XY on monitor +RLAPI Vector2 GetWindowScaleDPI(void); // Get window scale DPI factor +RLAPI const char *GetMonitorName(int monitor); // Get the human-readable, UTF-8 encoded name of the specified monitor +RLAPI void SetClipboardText(const char *text); // Set clipboard text content +RLAPI const char *GetClipboardText(void); // Get clipboard text content +RLAPI Image GetClipboardImage(void); // Get clipboard image content +RLAPI void EnableEventWaiting(void); // Enable waiting for events on EndDrawing(), no automatic event polling +RLAPI void DisableEventWaiting(void); // Disable waiting for events on EndDrawing(), automatic events polling + +// Cursor-related functions +RLAPI void ShowCursor(void); // Shows cursor +RLAPI void HideCursor(void); // Hides cursor +RLAPI bool IsCursorHidden(void); // Check if cursor is not visible +RLAPI void EnableCursor(void); // Enables cursor (unlock cursor) +RLAPI void DisableCursor(void); // Disables cursor (lock cursor) +RLAPI bool IsCursorOnScreen(void); // Check if cursor is on the screen + +// Drawing-related functions +RLAPI void ClearBackground(Color color); // Set background color (framebuffer clear color) +RLAPI void BeginDrawing(void); // Setup canvas (framebuffer) to start drawing +RLAPI void EndDrawing(void); // End canvas drawing and swap buffers (double buffering) +RLAPI void BeginMode2D(Camera2D camera); // Begin 2D mode with custom camera (2D) +RLAPI void EndMode2D(void); // Ends 2D mode with custom camera +RLAPI void BeginMode3D(Camera3D camera); // Begin 3D mode with custom camera (3D) +RLAPI void EndMode3D(void); // Ends 3D mode and returns to default 2D orthographic mode +RLAPI void BeginTextureMode(RenderTexture2D target); // Begin drawing to render texture +RLAPI void EndTextureMode(void); // Ends drawing to render texture +RLAPI void BeginShaderMode(Shader shader); // Begin custom shader drawing +RLAPI void EndShaderMode(void); // End custom shader drawing (use default shader) +RLAPI void BeginBlendMode(int mode); // Begin blending mode (alpha, additive, multiplied, subtract, custom) +RLAPI void EndBlendMode(void); // End blending mode (reset to default: alpha blending) +RLAPI void BeginScissorMode(int x, int y, int width, int height); // Begin scissor mode (define screen area for following drawing) +RLAPI void EndScissorMode(void); // End scissor mode +RLAPI void BeginVrStereoMode(VrStereoConfig config); // Begin stereo rendering (requires VR simulator) +RLAPI void EndVrStereoMode(void); // End stereo rendering (requires VR simulator) + +// VR stereo config functions for VR simulator +RLAPI VrStereoConfig LoadVrStereoConfig(VrDeviceInfo device); // Load VR stereo config for VR simulator device parameters +RLAPI void UnloadVrStereoConfig(VrStereoConfig config); // Unload VR stereo config + +// Shader management functions +// NOTE: Shader functionality is not available on OpenGL 1.1 +RLAPI Shader LoadShader(const char *vsFileName, const char *fsFileName); // Load shader from files and bind default locations +RLAPI Shader LoadShaderFromMemory(const char *vsCode, const char *fsCode); // Load shader from code strings and bind default locations +RLAPI bool IsShaderValid(Shader shader); // Check if a shader is valid (loaded on GPU) +RLAPI int GetShaderLocation(Shader shader, const char *uniformName); // Get shader uniform location +RLAPI int GetShaderLocationAttrib(Shader shader, const char *attribName); // Get shader attribute location +RLAPI void SetShaderValue(Shader shader, int locIndex, const void *value, int uniformType); // Set shader uniform value +RLAPI void SetShaderValueV(Shader shader, int locIndex, const void *value, int uniformType, int count); // Set shader uniform value vector +RLAPI void SetShaderValueMatrix(Shader shader, int locIndex, Matrix mat); // Set shader uniform value (matrix 4x4) +RLAPI void SetShaderValueTexture(Shader shader, int locIndex, Texture2D texture); // Set shader uniform value for texture (sampler2d) +RLAPI void UnloadShader(Shader shader); // Unload shader from GPU memory (VRAM) + +// Screen-space-related functions +#define GetMouseRay GetScreenToWorldRay // Compatibility hack for previous raylib versions +RLAPI Ray GetScreenToWorldRay(Vector2 position, Camera camera); // Get a ray trace from screen position (i.e mouse) +RLAPI Ray GetScreenToWorldRayEx(Vector2 position, Camera camera, int width, int height); // Get a ray trace from screen position (i.e mouse) in a viewport +RLAPI Vector2 GetWorldToScreen(Vector3 position, Camera camera); // Get the screen space position for a 3d world space position +RLAPI Vector2 GetWorldToScreenEx(Vector3 position, Camera camera, int width, int height); // Get size position for a 3d world space position +RLAPI Vector2 GetWorldToScreen2D(Vector2 position, Camera2D camera); // Get the screen space position for a 2d camera world space position +RLAPI Vector2 GetScreenToWorld2D(Vector2 position, Camera2D camera); // Get the world space position for a 2d camera screen space position +RLAPI Matrix GetCameraMatrix(Camera camera); // Get camera transform matrix (view matrix) +RLAPI Matrix GetCameraMatrix2D(Camera2D camera); // Get camera 2d transform matrix + +// Timing-related functions +RLAPI void SetTargetFPS(int fps); // Set target FPS (maximum) +RLAPI float GetFrameTime(void); // Get time in seconds for last frame drawn (delta time) +RLAPI double GetTime(void); // Get elapsed time in seconds since InitWindow() +RLAPI int GetFPS(void); // Get current FPS + +// Custom frame control functions +// NOTE: Those functions are intended for advanced users that want full control over the frame processing +// By default EndDrawing() does this job: draws everything + SwapScreenBuffer() + manage frame timing + PollInputEvents() +// To avoid that behaviour and control frame processes manually, enable in config.h: SUPPORT_CUSTOM_FRAME_CONTROL +RLAPI void SwapScreenBuffer(void); // Swap back buffer with front buffer (screen drawing) +RLAPI void PollInputEvents(void); // Register all input events +RLAPI void WaitTime(double seconds); // Wait for some time (halt program execution) + +// Random values generation functions +RLAPI void SetRandomSeed(unsigned int seed); // Set the seed for the random number generator +RLAPI int GetRandomValue(int min, int max); // Get a random value between min and max (both included) +RLAPI int *LoadRandomSequence(unsigned int count, int min, int max); // Load random values sequence, no values repeated +RLAPI void UnloadRandomSequence(int *sequence); // Unload random values sequence + +// Misc. functions +RLAPI void TakeScreenshot(const char *fileName); // Takes a screenshot of current screen (filename extension defines format) +RLAPI void SetConfigFlags(unsigned int flags); // Setup init configuration flags (view FLAGS) +RLAPI void OpenURL(const char *url); // Open URL with default system browser (if available) + +// NOTE: Following functions implemented in module [utils] +//------------------------------------------------------------------ +RLAPI void TraceLog(int logLevel, const char *text, ...); // Show trace log messages (LOG_DEBUG, LOG_INFO, LOG_WARNING, LOG_ERROR...) +RLAPI void SetTraceLogLevel(int logLevel); // Set the current threshold (minimum) log level +RLAPI void *MemAlloc(unsigned int size); // Internal memory allocator +RLAPI void *MemRealloc(void *ptr, unsigned int size); // Internal memory reallocator +RLAPI void MemFree(void *ptr); // Internal memory free + +// Set custom callbacks +// WARNING: Callbacks setup is intended for advanced users +RLAPI void SetTraceLogCallback(TraceLogCallback callback); // Set custom trace log +RLAPI void SetLoadFileDataCallback(LoadFileDataCallback callback); // Set custom file binary data loader +RLAPI void SetSaveFileDataCallback(SaveFileDataCallback callback); // Set custom file binary data saver +RLAPI void SetLoadFileTextCallback(LoadFileTextCallback callback); // Set custom file text data loader +RLAPI void SetSaveFileTextCallback(SaveFileTextCallback callback); // Set custom file text data saver + +// Files management functions +RLAPI unsigned char *LoadFileData(const char *fileName, int *dataSize); // Load file data as byte array (read) +RLAPI void UnloadFileData(unsigned char *data); // Unload file data allocated by LoadFileData() +RLAPI bool SaveFileData(const char *fileName, void *data, int dataSize); // Save data to file from byte array (write), returns true on success +RLAPI bool ExportDataAsCode(const unsigned char *data, int dataSize, const char *fileName); // Export data to code (.h), returns true on success +RLAPI char *LoadFileText(const char *fileName); // Load text data from file (read), returns a '\0' terminated string +RLAPI void UnloadFileText(char *text); // Unload file text data allocated by LoadFileText() +RLAPI bool SaveFileText(const char *fileName, char *text); // Save text data to file (write), string must be '\0' terminated, returns true on success +//------------------------------------------------------------------ + +// File system functions +RLAPI bool FileExists(const char *fileName); // Check if file exists +RLAPI bool DirectoryExists(const char *dirPath); // Check if a directory path exists +RLAPI bool IsFileExtension(const char *fileName, const char *ext); // Check file extension (including point: .png, .wav) +RLAPI int GetFileLength(const char *fileName); // Get file length in bytes (NOTE: GetFileSize() conflicts with windows.h) +RLAPI const char *GetFileExtension(const char *fileName); // Get pointer to extension for a filename string (includes dot: '.png') +RLAPI const char *GetFileName(const char *filePath); // Get pointer to filename for a path string +RLAPI const char *GetFileNameWithoutExt(const char *filePath); // Get filename string without extension (uses static string) +RLAPI const char *GetDirectoryPath(const char *filePath); // Get full path for a given fileName with path (uses static string) +RLAPI const char *GetPrevDirectoryPath(const char *dirPath); // Get previous directory path for a given path (uses static string) +RLAPI const char *GetWorkingDirectory(void); // Get current working directory (uses static string) +RLAPI const char *GetApplicationDirectory(void); // Get the directory of the running application (uses static string) +RLAPI int MakeDirectory(const char *dirPath); // Create directories (including full path requested), returns 0 on success +RLAPI bool ChangeDirectory(const char *dir); // Change working directory, return true on success +RLAPI bool IsPathFile(const char *path); // Check if a given path is a file or a directory +RLAPI bool IsFileNameValid(const char *fileName); // Check if fileName is valid for the platform/OS +RLAPI FilePathList LoadDirectoryFiles(const char *dirPath); // Load directory filepaths +RLAPI FilePathList LoadDirectoryFilesEx(const char *basePath, const char *filter, bool scanSubdirs); // Load directory filepaths with extension filtering and recursive directory scan. Use 'DIR' in the filter string to include directories in the result +RLAPI void UnloadDirectoryFiles(FilePathList files); // Unload filepaths +RLAPI bool IsFileDropped(void); // Check if a file has been dropped into window +RLAPI FilePathList LoadDroppedFiles(void); // Load dropped filepaths +RLAPI void UnloadDroppedFiles(FilePathList files); // Unload dropped filepaths +RLAPI long GetFileModTime(const char *fileName); // Get file modification time (last write time) + +// Compression/Encoding functionality +RLAPI unsigned char *CompressData(const unsigned char *data, int dataSize, int *compDataSize); // Compress data (DEFLATE algorithm), memory must be MemFree() +RLAPI unsigned char *DecompressData(const unsigned char *compData, int compDataSize, int *dataSize); // Decompress data (DEFLATE algorithm), memory must be MemFree() +RLAPI char *EncodeDataBase64(const unsigned char *data, int dataSize, int *outputSize); // Encode data to Base64 string, memory must be MemFree() +RLAPI unsigned char *DecodeDataBase64(const unsigned char *data, int *outputSize); // Decode Base64 string data, memory must be MemFree() +RLAPI unsigned int ComputeCRC32(unsigned char *data, int dataSize); // Compute CRC32 hash code +RLAPI unsigned int *ComputeMD5(unsigned char *data, int dataSize); // Compute MD5 hash code, returns static int[4] (16 bytes) +RLAPI unsigned int *ComputeSHA1(unsigned char *data, int dataSize); // Compute SHA1 hash code, returns static int[5] (20 bytes) + + +// Automation events functionality +RLAPI AutomationEventList LoadAutomationEventList(const char *fileName); // Load automation events list from file, NULL for empty list, capacity = MAX_AUTOMATION_EVENTS +RLAPI void UnloadAutomationEventList(AutomationEventList list); // Unload automation events list from file +RLAPI bool ExportAutomationEventList(AutomationEventList list, const char *fileName); // Export automation events list as text file +RLAPI void SetAutomationEventList(AutomationEventList *list); // Set automation event list to record to +RLAPI void SetAutomationEventBaseFrame(int frame); // Set automation event internal base frame to start recording +RLAPI void StartAutomationEventRecording(void); // Start recording automation events (AutomationEventList must be set) +RLAPI void StopAutomationEventRecording(void); // Stop recording automation events +RLAPI void PlayAutomationEvent(AutomationEvent event); // Play a recorded automation event + +//------------------------------------------------------------------------------------ +// Input Handling Functions (Module: core) +//------------------------------------------------------------------------------------ + +// Input-related functions: keyboard +RLAPI bool IsKeyPressed(int key); // Check if a key has been pressed once +RLAPI bool IsKeyPressedRepeat(int key); // Check if a key has been pressed again +RLAPI bool IsKeyDown(int key); // Check if a key is being pressed +RLAPI bool IsKeyReleased(int key); // Check if a key has been released once +RLAPI bool IsKeyUp(int key); // Check if a key is NOT being pressed +RLAPI int GetKeyPressed(void); // Get key pressed (keycode), call it multiple times for keys queued, returns 0 when the queue is empty +RLAPI int GetCharPressed(void); // Get char pressed (unicode), call it multiple times for chars queued, returns 0 when the queue is empty +RLAPI void SetExitKey(int key); // Set a custom key to exit program (default is ESC) + +// Input-related functions: gamepads +RLAPI bool IsGamepadAvailable(int gamepad); // Check if a gamepad is available +RLAPI const char *GetGamepadName(int gamepad); // Get gamepad internal name id +RLAPI bool IsGamepadButtonPressed(int gamepad, int button); // Check if a gamepad button has been pressed once +RLAPI bool IsGamepadButtonDown(int gamepad, int button); // Check if a gamepad button is being pressed +RLAPI bool IsGamepadButtonReleased(int gamepad, int button); // Check if a gamepad button has been released once +RLAPI bool IsGamepadButtonUp(int gamepad, int button); // Check if a gamepad button is NOT being pressed +RLAPI int GetGamepadButtonPressed(void); // Get the last gamepad button pressed +RLAPI int GetGamepadAxisCount(int gamepad); // Get gamepad axis count for a gamepad +RLAPI float GetGamepadAxisMovement(int gamepad, int axis); // Get axis movement value for a gamepad axis +RLAPI int SetGamepadMappings(const char *mappings); // Set internal gamepad mappings (SDL_GameControllerDB) +RLAPI void SetGamepadVibration(int gamepad, float leftMotor, float rightMotor, float duration); // Set gamepad vibration for both motors (duration in seconds) + +// Input-related functions: mouse +RLAPI bool IsMouseButtonPressed(int button); // Check if a mouse button has been pressed once +RLAPI bool IsMouseButtonDown(int button); // Check if a mouse button is being pressed +RLAPI bool IsMouseButtonReleased(int button); // Check if a mouse button has been released once +RLAPI bool IsMouseButtonUp(int button); // Check if a mouse button is NOT being pressed +RLAPI int GetMouseX(void); // Get mouse position X +RLAPI int GetMouseY(void); // Get mouse position Y +RLAPI Vector2 GetMousePosition(void); // Get mouse position XY +RLAPI Vector2 GetMouseDelta(void); // Get mouse delta between frames +RLAPI void SetMousePosition(int x, int y); // Set mouse position XY +RLAPI void SetMouseOffset(int offsetX, int offsetY); // Set mouse offset +RLAPI void SetMouseScale(float scaleX, float scaleY); // Set mouse scaling +RLAPI float GetMouseWheelMove(void); // Get mouse wheel movement for X or Y, whichever is larger +RLAPI Vector2 GetMouseWheelMoveV(void); // Get mouse wheel movement for both X and Y +RLAPI void SetMouseCursor(int cursor); // Set mouse cursor + +// Input-related functions: touch +RLAPI int GetTouchX(void); // Get touch position X for touch point 0 (relative to screen size) +RLAPI int GetTouchY(void); // Get touch position Y for touch point 0 (relative to screen size) +RLAPI Vector2 GetTouchPosition(int index); // Get touch position XY for a touch point index (relative to screen size) +RLAPI int GetTouchPointId(int index); // Get touch point identifier for given index +RLAPI int GetTouchPointCount(void); // Get number of touch points + +//------------------------------------------------------------------------------------ +// Gestures and Touch Handling Functions (Module: rgestures) +//------------------------------------------------------------------------------------ +RLAPI void SetGesturesEnabled(unsigned int flags); // Enable a set of gestures using flags +RLAPI bool IsGestureDetected(unsigned int gesture); // Check if a gesture have been detected +RLAPI int GetGestureDetected(void); // Get latest detected gesture +RLAPI float GetGestureHoldDuration(void); // Get gesture hold time in seconds +RLAPI Vector2 GetGestureDragVector(void); // Get gesture drag vector +RLAPI float GetGestureDragAngle(void); // Get gesture drag angle +RLAPI Vector2 GetGesturePinchVector(void); // Get gesture pinch delta +RLAPI float GetGesturePinchAngle(void); // Get gesture pinch angle + +//------------------------------------------------------------------------------------ +// Camera System Functions (Module: rcamera) +//------------------------------------------------------------------------------------ +RLAPI void UpdateCamera(Camera *camera, int mode); // Update camera position for selected mode +RLAPI void UpdateCameraPro(Camera *camera, Vector3 movement, Vector3 rotation, float zoom); // Update camera movement/rotation + +//------------------------------------------------------------------------------------ +// Basic Shapes Drawing Functions (Module: shapes) +//------------------------------------------------------------------------------------ +// Set texture and rectangle to be used on shapes drawing +// NOTE: It can be useful when using basic shapes and one single font, +// defining a font char white rectangle would allow drawing everything in a single draw call +RLAPI void SetShapesTexture(Texture2D texture, Rectangle source); // Set texture and rectangle to be used on shapes drawing +RLAPI Texture2D GetShapesTexture(void); // Get texture that is used for shapes drawing +RLAPI Rectangle GetShapesTextureRectangle(void); // Get texture source rectangle that is used for shapes drawing + +// Basic shapes drawing functions +RLAPI void DrawPixel(int posX, int posY, Color color); // Draw a pixel using geometry [Can be slow, use with care] +RLAPI void DrawPixelV(Vector2 position, Color color); // Draw a pixel using geometry (Vector version) [Can be slow, use with care] +RLAPI void DrawLine(int startPosX, int startPosY, int endPosX, int endPosY, Color color); // Draw a line +RLAPI void DrawLineV(Vector2 startPos, Vector2 endPos, Color color); // Draw a line (using gl lines) +RLAPI void DrawLineEx(Vector2 startPos, Vector2 endPos, float thick, Color color); // Draw a line (using triangles/quads) +RLAPI void DrawLineStrip(const Vector2 *points, int pointCount, Color color); // Draw lines sequence (using gl lines) +RLAPI void DrawLineBezier(Vector2 startPos, Vector2 endPos, float thick, Color color); // Draw line segment cubic-bezier in-out interpolation +RLAPI void DrawCircle(int centerX, int centerY, float radius, Color color); // Draw a color-filled circle +RLAPI void DrawCircleSector(Vector2 center, float radius, float startAngle, float endAngle, int segments, Color color); // Draw a piece of a circle +RLAPI void DrawCircleSectorLines(Vector2 center, float radius, float startAngle, float endAngle, int segments, Color color); // Draw circle sector outline +RLAPI void DrawCircleGradient(int centerX, int centerY, float radius, Color inner, Color outer); // Draw a gradient-filled circle +RLAPI void DrawCircleV(Vector2 center, float radius, Color color); // Draw a color-filled circle (Vector version) +RLAPI void DrawCircleLines(int centerX, int centerY, float radius, Color color); // Draw circle outline +RLAPI void DrawCircleLinesV(Vector2 center, float radius, Color color); // Draw circle outline (Vector version) +RLAPI void DrawEllipse(int centerX, int centerY, float radiusH, float radiusV, Color color); // Draw ellipse +RLAPI void DrawEllipseLines(int centerX, int centerY, float radiusH, float radiusV, Color color); // Draw ellipse outline +RLAPI void DrawRing(Vector2 center, float innerRadius, float outerRadius, float startAngle, float endAngle, int segments, Color color); // Draw ring +RLAPI void DrawRingLines(Vector2 center, float innerRadius, float outerRadius, float startAngle, float endAngle, int segments, Color color); // Draw ring outline +RLAPI void DrawRectangle(int posX, int posY, int width, int height, Color color); // Draw a color-filled rectangle +RLAPI void DrawRectangleV(Vector2 position, Vector2 size, Color color); // Draw a color-filled rectangle (Vector version) +RLAPI void DrawRectangleRec(Rectangle rec, Color color); // Draw a color-filled rectangle +RLAPI void DrawRectanglePro(Rectangle rec, Vector2 origin, float rotation, Color color); // Draw a color-filled rectangle with pro parameters +RLAPI void DrawRectangleGradientV(int posX, int posY, int width, int height, Color top, Color bottom); // Draw a vertical-gradient-filled rectangle +RLAPI void DrawRectangleGradientH(int posX, int posY, int width, int height, Color left, Color right); // Draw a horizontal-gradient-filled rectangle +RLAPI void DrawRectangleGradientEx(Rectangle rec, Color topLeft, Color bottomLeft, Color topRight, Color bottomRight); // Draw a gradient-filled rectangle with custom vertex colors +RLAPI void DrawRectangleLines(int posX, int posY, int width, int height, Color color); // Draw rectangle outline +RLAPI void DrawRectangleLinesEx(Rectangle rec, float lineThick, Color color); // Draw rectangle outline with extended parameters +RLAPI void DrawRectangleRounded(Rectangle rec, float roundness, int segments, Color color); // Draw rectangle with rounded edges +RLAPI void DrawRectangleRoundedLines(Rectangle rec, float roundness, int segments, Color color); // Draw rectangle lines with rounded edges +RLAPI void DrawRectangleRoundedLinesEx(Rectangle rec, float roundness, int segments, float lineThick, Color color); // Draw rectangle with rounded edges outline +RLAPI void DrawTriangle(Vector2 v1, Vector2 v2, Vector2 v3, Color color); // Draw a color-filled triangle (vertex in counter-clockwise order!) +RLAPI void DrawTriangleLines(Vector2 v1, Vector2 v2, Vector2 v3, Color color); // Draw triangle outline (vertex in counter-clockwise order!) +RLAPI void DrawTriangleFan(const Vector2 *points, int pointCount, Color color); // Draw a triangle fan defined by points (first vertex is the center) +RLAPI void DrawTriangleStrip(const Vector2 *points, int pointCount, Color color); // Draw a triangle strip defined by points +RLAPI void DrawPoly(Vector2 center, int sides, float radius, float rotation, Color color); // Draw a regular polygon (Vector version) +RLAPI void DrawPolyLines(Vector2 center, int sides, float radius, float rotation, Color color); // Draw a polygon outline of n sides +RLAPI void DrawPolyLinesEx(Vector2 center, int sides, float radius, float rotation, float lineThick, Color color); // Draw a polygon outline of n sides with extended parameters + +// Splines drawing functions +RLAPI void DrawSplineLinear(const Vector2 *points, int pointCount, float thick, Color color); // Draw spline: Linear, minimum 2 points +RLAPI void DrawSplineBasis(const Vector2 *points, int pointCount, float thick, Color color); // Draw spline: B-Spline, minimum 4 points +RLAPI void DrawSplineCatmullRom(const Vector2 *points, int pointCount, float thick, Color color); // Draw spline: Catmull-Rom, minimum 4 points +RLAPI void DrawSplineBezierQuadratic(const Vector2 *points, int pointCount, float thick, Color color); // Draw spline: Quadratic Bezier, minimum 3 points (1 control point): [p1, c2, p3, c4...] +RLAPI void DrawSplineBezierCubic(const Vector2 *points, int pointCount, float thick, Color color); // Draw spline: Cubic Bezier, minimum 4 points (2 control points): [p1, c2, c3, p4, c5, c6...] +RLAPI void DrawSplineSegmentLinear(Vector2 p1, Vector2 p2, float thick, Color color); // Draw spline segment: Linear, 2 points +RLAPI void DrawSplineSegmentBasis(Vector2 p1, Vector2 p2, Vector2 p3, Vector2 p4, float thick, Color color); // Draw spline segment: B-Spline, 4 points +RLAPI void DrawSplineSegmentCatmullRom(Vector2 p1, Vector2 p2, Vector2 p3, Vector2 p4, float thick, Color color); // Draw spline segment: Catmull-Rom, 4 points +RLAPI void DrawSplineSegmentBezierQuadratic(Vector2 p1, Vector2 c2, Vector2 p3, float thick, Color color); // Draw spline segment: Quadratic Bezier, 2 points, 1 control point +RLAPI void DrawSplineSegmentBezierCubic(Vector2 p1, Vector2 c2, Vector2 c3, Vector2 p4, float thick, Color color); // Draw spline segment: Cubic Bezier, 2 points, 2 control points + +// Spline segment point evaluation functions, for a given t [0.0f .. 1.0f] +RLAPI Vector2 GetSplinePointLinear(Vector2 startPos, Vector2 endPos, float t); // Get (evaluate) spline point: Linear +RLAPI Vector2 GetSplinePointBasis(Vector2 p1, Vector2 p2, Vector2 p3, Vector2 p4, float t); // Get (evaluate) spline point: B-Spline +RLAPI Vector2 GetSplinePointCatmullRom(Vector2 p1, Vector2 p2, Vector2 p3, Vector2 p4, float t); // Get (evaluate) spline point: Catmull-Rom +RLAPI Vector2 GetSplinePointBezierQuad(Vector2 p1, Vector2 c2, Vector2 p3, float t); // Get (evaluate) spline point: Quadratic Bezier +RLAPI Vector2 GetSplinePointBezierCubic(Vector2 p1, Vector2 c2, Vector2 c3, Vector2 p4, float t); // Get (evaluate) spline point: Cubic Bezier + +// Basic shapes collision detection functions +RLAPI bool CheckCollisionRecs(Rectangle rec1, Rectangle rec2); // Check collision between two rectangles +RLAPI bool CheckCollisionCircles(Vector2 center1, float radius1, Vector2 center2, float radius2); // Check collision between two circles +RLAPI bool CheckCollisionCircleRec(Vector2 center, float radius, Rectangle rec); // Check collision between circle and rectangle +RLAPI bool CheckCollisionCircleLine(Vector2 center, float radius, Vector2 p1, Vector2 p2); // Check if circle collides with a line created betweeen two points [p1] and [p2] +RLAPI bool CheckCollisionPointRec(Vector2 point, Rectangle rec); // Check if point is inside rectangle +RLAPI bool CheckCollisionPointCircle(Vector2 point, Vector2 center, float radius); // Check if point is inside circle +RLAPI bool CheckCollisionPointTriangle(Vector2 point, Vector2 p1, Vector2 p2, Vector2 p3); // Check if point is inside a triangle +RLAPI bool CheckCollisionPointLine(Vector2 point, Vector2 p1, Vector2 p2, int threshold); // Check if point belongs to line created between two points [p1] and [p2] with defined margin in pixels [threshold] +RLAPI bool CheckCollisionPointPoly(Vector2 point, const Vector2 *points, int pointCount); // Check if point is within a polygon described by array of vertices +RLAPI bool CheckCollisionLines(Vector2 startPos1, Vector2 endPos1, Vector2 startPos2, Vector2 endPos2, Vector2 *collisionPoint); // Check the collision between two lines defined by two points each, returns collision point by reference +RLAPI Rectangle GetCollisionRec(Rectangle rec1, Rectangle rec2); // Get collision rectangle for two rectangles collision + +//------------------------------------------------------------------------------------ +// Texture Loading and Drawing Functions (Module: textures) +//------------------------------------------------------------------------------------ + +// Image loading functions +// NOTE: These functions do not require GPU access +RLAPI Image LoadImage(const char *fileName); // Load image from file into CPU memory (RAM) +RLAPI Image LoadImageRaw(const char *fileName, int width, int height, int format, int headerSize); // Load image from RAW file data +RLAPI Image LoadImageAnim(const char *fileName, int *frames); // Load image sequence from file (frames appended to image.data) +RLAPI Image LoadImageAnimFromMemory(const char *fileType, const unsigned char *fileData, int dataSize, int *frames); // Load image sequence from memory buffer +RLAPI Image LoadImageFromMemory(const char *fileType, const unsigned char *fileData, int dataSize); // Load image from memory buffer, fileType refers to extension: i.e. '.png' +RLAPI Image LoadImageFromTexture(Texture2D texture); // Load image from GPU texture data +RLAPI Image LoadImageFromScreen(void); // Load image from screen buffer and (screenshot) +RLAPI bool IsImageValid(Image image); // Check if an image is valid (data and parameters) +RLAPI void UnloadImage(Image image); // Unload image from CPU memory (RAM) +RLAPI bool ExportImage(Image image, const char *fileName); // Export image data to file, returns true on success +RLAPI unsigned char *ExportImageToMemory(Image image, const char *fileType, int *fileSize); // Export image to memory buffer +RLAPI bool ExportImageAsCode(Image image, const char *fileName); // Export image as code file defining an array of bytes, returns true on success + +// Image generation functions +RLAPI Image GenImageColor(int width, int height, Color color); // Generate image: plain color +RLAPI Image GenImageGradientLinear(int width, int height, int direction, Color start, Color end); // Generate image: linear gradient, direction in degrees [0..360], 0=Vertical gradient +RLAPI Image GenImageGradientRadial(int width, int height, float density, Color inner, Color outer); // Generate image: radial gradient +RLAPI Image GenImageGradientSquare(int width, int height, float density, Color inner, Color outer); // Generate image: square gradient +RLAPI Image GenImageChecked(int width, int height, int checksX, int checksY, Color col1, Color col2); // Generate image: checked +RLAPI Image GenImageWhiteNoise(int width, int height, float factor); // Generate image: white noise +RLAPI Image GenImagePerlinNoise(int width, int height, int offsetX, int offsetY, float scale); // Generate image: perlin noise +RLAPI Image GenImageCellular(int width, int height, int tileSize); // Generate image: cellular algorithm, bigger tileSize means bigger cells +RLAPI Image GenImageText(int width, int height, const char *text); // Generate image: grayscale image from text data + +// Image manipulation functions +RLAPI Image ImageCopy(Image image); // Create an image duplicate (useful for transformations) +RLAPI Image ImageFromImage(Image image, Rectangle rec); // Create an image from another image piece +RLAPI Image ImageFromChannel(Image image, int selectedChannel); // Create an image from a selected channel of another image (GRAYSCALE) +RLAPI Image ImageText(const char *text, int fontSize, Color color); // Create an image from text (default font) +RLAPI Image ImageTextEx(Font font, const char *text, float fontSize, float spacing, Color tint); // Create an image from text (custom sprite font) +RLAPI void ImageFormat(Image *image, int newFormat); // Convert image data to desired format +RLAPI void ImageToPOT(Image *image, Color fill); // Convert image to POT (power-of-two) +RLAPI void ImageCrop(Image *image, Rectangle crop); // Crop an image to a defined rectangle +RLAPI void ImageAlphaCrop(Image *image, float threshold); // Crop image depending on alpha value +RLAPI void ImageAlphaClear(Image *image, Color color, float threshold); // Clear alpha channel to desired color +RLAPI void ImageAlphaMask(Image *image, Image alphaMask); // Apply alpha mask to image +RLAPI void ImageAlphaPremultiply(Image *image); // Premultiply alpha channel +RLAPI void ImageBlurGaussian(Image *image, int blurSize); // Apply Gaussian blur using a box blur approximation +RLAPI void ImageKernelConvolution(Image *image, const float *kernel, int kernelSize); // Apply custom square convolution kernel to image +RLAPI void ImageResize(Image *image, int newWidth, int newHeight); // Resize image (Bicubic scaling algorithm) +RLAPI void ImageResizeNN(Image *image, int newWidth,int newHeight); // Resize image (Nearest-Neighbor scaling algorithm) +RLAPI void ImageResizeCanvas(Image *image, int newWidth, int newHeight, int offsetX, int offsetY, Color fill); // Resize canvas and fill with color +RLAPI void ImageMipmaps(Image *image); // Compute all mipmap levels for a provided image +RLAPI void ImageDither(Image *image, int rBpp, int gBpp, int bBpp, int aBpp); // Dither image data to 16bpp or lower (Floyd-Steinberg dithering) +RLAPI void ImageFlipVertical(Image *image); // Flip image vertically +RLAPI void ImageFlipHorizontal(Image *image); // Flip image horizontally +RLAPI void ImageRotate(Image *image, int degrees); // Rotate image by input angle in degrees (-359 to 359) +RLAPI void ImageRotateCW(Image *image); // Rotate image clockwise 90deg +RLAPI void ImageRotateCCW(Image *image); // Rotate image counter-clockwise 90deg +RLAPI void ImageColorTint(Image *image, Color color); // Modify image color: tint +RLAPI void ImageColorInvert(Image *image); // Modify image color: invert +RLAPI void ImageColorGrayscale(Image *image); // Modify image color: grayscale +RLAPI void ImageColorContrast(Image *image, float contrast); // Modify image color: contrast (-100 to 100) +RLAPI void ImageColorBrightness(Image *image, int brightness); // Modify image color: brightness (-255 to 255) +RLAPI void ImageColorReplace(Image *image, Color color, Color replace); // Modify image color: replace color +RLAPI Color *LoadImageColors(Image image); // Load color data from image as a Color array (RGBA - 32bit) +RLAPI Color *LoadImagePalette(Image image, int maxPaletteSize, int *colorCount); // Load colors palette from image as a Color array (RGBA - 32bit) +RLAPI void UnloadImageColors(Color *colors); // Unload color data loaded with LoadImageColors() +RLAPI void UnloadImagePalette(Color *colors); // Unload colors palette loaded with LoadImagePalette() +RLAPI Rectangle GetImageAlphaBorder(Image image, float threshold); // Get image alpha border rectangle +RLAPI Color GetImageColor(Image image, int x, int y); // Get image pixel color at (x, y) position + +// Image drawing functions +// NOTE: Image software-rendering functions (CPU) +RLAPI void ImageClearBackground(Image *dst, Color color); // Clear image background with given color +RLAPI void ImageDrawPixel(Image *dst, int posX, int posY, Color color); // Draw pixel within an image +RLAPI void ImageDrawPixelV(Image *dst, Vector2 position, Color color); // Draw pixel within an image (Vector version) +RLAPI void ImageDrawLine(Image *dst, int startPosX, int startPosY, int endPosX, int endPosY, Color color); // Draw line within an image +RLAPI void ImageDrawLineV(Image *dst, Vector2 start, Vector2 end, Color color); // Draw line within an image (Vector version) +RLAPI void ImageDrawLineEx(Image *dst, Vector2 start, Vector2 end, int thick, Color color); // Draw a line defining thickness within an image +RLAPI void ImageDrawCircle(Image *dst, int centerX, int centerY, int radius, Color color); // Draw a filled circle within an image +RLAPI void ImageDrawCircleV(Image *dst, Vector2 center, int radius, Color color); // Draw a filled circle within an image (Vector version) +RLAPI void ImageDrawCircleLines(Image *dst, int centerX, int centerY, int radius, Color color); // Draw circle outline within an image +RLAPI void ImageDrawCircleLinesV(Image *dst, Vector2 center, int radius, Color color); // Draw circle outline within an image (Vector version) +RLAPI void ImageDrawRectangle(Image *dst, int posX, int posY, int width, int height, Color color); // Draw rectangle within an image +RLAPI void ImageDrawRectangleV(Image *dst, Vector2 position, Vector2 size, Color color); // Draw rectangle within an image (Vector version) +RLAPI void ImageDrawRectangleRec(Image *dst, Rectangle rec, Color color); // Draw rectangle within an image +RLAPI void ImageDrawRectangleLines(Image *dst, Rectangle rec, int thick, Color color); // Draw rectangle lines within an image +RLAPI void ImageDrawTriangle(Image *dst, Vector2 v1, Vector2 v2, Vector2 v3, Color color); // Draw triangle within an image +RLAPI void ImageDrawTriangleEx(Image *dst, Vector2 v1, Vector2 v2, Vector2 v3, Color c1, Color c2, Color c3); // Draw triangle with interpolated colors within an image +RLAPI void ImageDrawTriangleLines(Image *dst, Vector2 v1, Vector2 v2, Vector2 v3, Color color); // Draw triangle outline within an image +RLAPI void ImageDrawTriangleFan(Image *dst, Vector2 *points, int pointCount, Color color); // Draw a triangle fan defined by points within an image (first vertex is the center) +RLAPI void ImageDrawTriangleStrip(Image *dst, Vector2 *points, int pointCount, Color color); // Draw a triangle strip defined by points within an image +RLAPI void ImageDraw(Image *dst, Image src, Rectangle srcRec, Rectangle dstRec, Color tint); // Draw a source image within a destination image (tint applied to source) +RLAPI void ImageDrawText(Image *dst, const char *text, int posX, int posY, int fontSize, Color color); // Draw text (using default font) within an image (destination) +RLAPI void ImageDrawTextEx(Image *dst, Font font, const char *text, Vector2 position, float fontSize, float spacing, Color tint); // Draw text (custom sprite font) within an image (destination) + +// Texture loading functions +// NOTE: These functions require GPU access +RLAPI Texture2D LoadTexture(const char *fileName); // Load texture from file into GPU memory (VRAM) +RLAPI Texture2D LoadTextureFromImage(Image image); // Load texture from image data +RLAPI TextureCubemap LoadTextureCubemap(Image image, int layout); // Load cubemap from image, multiple image cubemap layouts supported +RLAPI RenderTexture2D LoadRenderTexture(int width, int height); // Load texture for rendering (framebuffer) +RLAPI bool IsTextureValid(Texture2D texture); // Check if a texture is valid (loaded in GPU) +RLAPI void UnloadTexture(Texture2D texture); // Unload texture from GPU memory (VRAM) +RLAPI bool IsRenderTextureValid(RenderTexture2D target); // Check if a render texture is valid (loaded in GPU) +RLAPI void UnloadRenderTexture(RenderTexture2D target); // Unload render texture from GPU memory (VRAM) +RLAPI void UpdateTexture(Texture2D texture, const void *pixels); // Update GPU texture with new data +RLAPI void UpdateTextureRec(Texture2D texture, Rectangle rec, const void *pixels); // Update GPU texture rectangle with new data + +// Texture configuration functions +RLAPI void GenTextureMipmaps(Texture2D *texture); // Generate GPU mipmaps for a texture +RLAPI void SetTextureFilter(Texture2D texture, int filter); // Set texture scaling filter mode +RLAPI void SetTextureWrap(Texture2D texture, int wrap); // Set texture wrapping mode + +// Texture drawing functions +RLAPI void DrawTexture(Texture2D texture, int posX, int posY, Color tint); // Draw a Texture2D +RLAPI void DrawTextureV(Texture2D texture, Vector2 position, Color tint); // Draw a Texture2D with position defined as Vector2 +RLAPI void DrawTextureEx(Texture2D texture, Vector2 position, float rotation, float scale, Color tint); // Draw a Texture2D with extended parameters +RLAPI void DrawTextureRec(Texture2D texture, Rectangle source, Vector2 position, Color tint); // Draw a part of a texture defined by a rectangle +RLAPI void DrawTexturePro(Texture2D texture, Rectangle source, Rectangle dest, Vector2 origin, float rotation, Color tint); // Draw a part of a texture defined by a rectangle with 'pro' parameters +RLAPI void DrawTextureNPatch(Texture2D texture, NPatchInfo nPatchInfo, Rectangle dest, Vector2 origin, float rotation, Color tint); // Draws a texture (or part of it) that stretches or shrinks nicely + +// Color/pixel related functions +RLAPI bool ColorIsEqual(Color col1, Color col2); // Check if two colors are equal +RLAPI Color Fade(Color color, float alpha); // Get color with alpha applied, alpha goes from 0.0f to 1.0f +RLAPI int ColorToInt(Color color); // Get hexadecimal value for a Color (0xRRGGBBAA) +RLAPI Vector4 ColorNormalize(Color color); // Get Color normalized as float [0..1] +RLAPI Color ColorFromNormalized(Vector4 normalized); // Get Color from normalized values [0..1] +RLAPI Vector3 ColorToHSV(Color color); // Get HSV values for a Color, hue [0..360], saturation/value [0..1] +RLAPI Color ColorFromHSV(float hue, float saturation, float value); // Get a Color from HSV values, hue [0..360], saturation/value [0..1] +RLAPI Color ColorTint(Color color, Color tint); // Get color multiplied with another color +RLAPI Color ColorBrightness(Color color, float factor); // Get color with brightness correction, brightness factor goes from -1.0f to 1.0f +RLAPI Color ColorContrast(Color color, float contrast); // Get color with contrast correction, contrast values between -1.0f and 1.0f +RLAPI Color ColorAlpha(Color color, float alpha); // Get color with alpha applied, alpha goes from 0.0f to 1.0f +RLAPI Color ColorAlphaBlend(Color dst, Color src, Color tint); // Get src alpha-blended into dst color with tint +RLAPI Color ColorLerp(Color color1, Color color2, float factor); // Get color lerp interpolation between two colors, factor [0.0f..1.0f] +RLAPI Color GetColor(unsigned int hexValue); // Get Color structure from hexadecimal value +RLAPI Color GetPixelColor(void *srcPtr, int format); // Get Color from a source pixel pointer of certain format +RLAPI void SetPixelColor(void *dstPtr, Color color, int format); // Set color formatted into destination pixel pointer +RLAPI int GetPixelDataSize(int width, int height, int format); // Get pixel data size in bytes for certain format + +//------------------------------------------------------------------------------------ +// Font Loading and Text Drawing Functions (Module: text) +//------------------------------------------------------------------------------------ + +// Font loading/unloading functions +RLAPI Font GetFontDefault(void); // Get the default Font +RLAPI Font LoadFont(const char *fileName); // Load font from file into GPU memory (VRAM) +RLAPI Font LoadFontEx(const char *fileName, int fontSize, int *codepoints, int codepointCount); // Load font from file with extended parameters, use NULL for codepoints and 0 for codepointCount to load the default character set, font size is provided in pixels height +RLAPI Font LoadFontFromImage(Image image, Color key, int firstChar); // Load font from Image (XNA style) +RLAPI Font LoadFontFromMemory(const char *fileType, const unsigned char *fileData, int dataSize, int fontSize, int *codepoints, int codepointCount); // Load font from memory buffer, fileType refers to extension: i.e. '.ttf' +RLAPI bool IsFontValid(Font font); // Check if a font is valid (font data loaded, WARNING: GPU texture not checked) +RLAPI GlyphInfo *LoadFontData(const unsigned char *fileData, int dataSize, int fontSize, int *codepoints, int codepointCount, int type); // Load font data for further use +RLAPI Image GenImageFontAtlas(const GlyphInfo *glyphs, Rectangle **glyphRecs, int glyphCount, int fontSize, int padding, int packMethod); // Generate image font atlas using chars info +RLAPI void UnloadFontData(GlyphInfo *glyphs, int glyphCount); // Unload font chars info data (RAM) +RLAPI void UnloadFont(Font font); // Unload font from GPU memory (VRAM) +RLAPI bool ExportFontAsCode(Font font, const char *fileName); // Export font as code file, returns true on success + +// Text drawing functions +RLAPI void DrawFPS(int posX, int posY); // Draw current FPS +RLAPI void DrawText(const char *text, int posX, int posY, int fontSize, Color color); // Draw text (using default font) +RLAPI void DrawTextEx(Font font, const char *text, Vector2 position, float fontSize, float spacing, Color tint); // Draw text using font and additional parameters +RLAPI void DrawTextPro(Font font, const char *text, Vector2 position, Vector2 origin, float rotation, float fontSize, float spacing, Color tint); // Draw text using Font and pro parameters (rotation) +RLAPI void DrawTextCodepoint(Font font, int codepoint, Vector2 position, float fontSize, Color tint); // Draw one character (codepoint) +RLAPI void DrawTextCodepoints(Font font, const int *codepoints, int codepointCount, Vector2 position, float fontSize, float spacing, Color tint); // Draw multiple character (codepoint) + +// Text font info functions +RLAPI void SetTextLineSpacing(int spacing); // Set vertical line spacing when drawing with line-breaks +RLAPI int MeasureText(const char *text, int fontSize); // Measure string width for default font +RLAPI Vector2 MeasureTextEx(Font font, const char *text, float fontSize, float spacing); // Measure string size for Font +RLAPI int GetGlyphIndex(Font font, int codepoint); // Get glyph index position in font for a codepoint (unicode character), fallback to '?' if not found +RLAPI GlyphInfo GetGlyphInfo(Font font, int codepoint); // Get glyph font info data for a codepoint (unicode character), fallback to '?' if not found +RLAPI Rectangle GetGlyphAtlasRec(Font font, int codepoint); // Get glyph rectangle in font atlas for a codepoint (unicode character), fallback to '?' if not found + +// Text codepoints management functions (unicode characters) +RLAPI char *LoadUTF8(const int *codepoints, int length); // Load UTF-8 text encoded from codepoints array +RLAPI void UnloadUTF8(char *text); // Unload UTF-8 text encoded from codepoints array +RLAPI int *LoadCodepoints(const char *text, int *count); // Load all codepoints from a UTF-8 text string, codepoints count returned by parameter +RLAPI void UnloadCodepoints(int *codepoints); // Unload codepoints data from memory +RLAPI int GetCodepointCount(const char *text); // Get total number of codepoints in a UTF-8 encoded string +RLAPI int GetCodepoint(const char *text, int *codepointSize); // Get next codepoint in a UTF-8 encoded string, 0x3f('?') is returned on failure +RLAPI int GetCodepointNext(const char *text, int *codepointSize); // Get next codepoint in a UTF-8 encoded string, 0x3f('?') is returned on failure +RLAPI int GetCodepointPrevious(const char *text, int *codepointSize); // Get previous codepoint in a UTF-8 encoded string, 0x3f('?') is returned on failure +RLAPI const char *CodepointToUTF8(int codepoint, int *utf8Size); // Encode one codepoint into UTF-8 byte array (array length returned as parameter) + +// Text strings management functions (no UTF-8 strings, only byte chars) +// NOTE: Some strings allocate memory internally for returned strings, just be careful! +RLAPI int TextCopy(char *dst, const char *src); // Copy one string to another, returns bytes copied +RLAPI bool TextIsEqual(const char *text1, const char *text2); // Check if two text string are equal +RLAPI unsigned int TextLength(const char *text); // Get text length, checks for '\0' ending +RLAPI const char *TextFormat(const char *text, ...); // Text formatting with variables (sprintf() style) +RLAPI const char *TextSubtext(const char *text, int position, int length); // Get a piece of a text string +RLAPI char *TextReplace(const char *text, const char *replace, const char *by); // Replace text string (WARNING: memory must be freed!) +RLAPI char *TextInsert(const char *text, const char *insert, int position); // Insert text in a position (WARNING: memory must be freed!) +RLAPI const char *TextJoin(const char **textList, int count, const char *delimiter); // Join text strings with delimiter +RLAPI const char **TextSplit(const char *text, char delimiter, int *count); // Split text into multiple strings +RLAPI void TextAppend(char *text, const char *append, int *position); // Append text at specific position and move cursor! +RLAPI int TextFindIndex(const char *text, const char *find); // Find first text occurrence within a string +RLAPI const char *TextToUpper(const char *text); // Get upper case version of provided string +RLAPI const char *TextToLower(const char *text); // Get lower case version of provided string +RLAPI const char *TextToPascal(const char *text); // Get Pascal case notation version of provided string +RLAPI const char *TextToSnake(const char *text); // Get Snake case notation version of provided string +RLAPI const char *TextToCamel(const char *text); // Get Camel case notation version of provided string + +RLAPI int TextToInteger(const char *text); // Get integer value from text (negative values not supported) +RLAPI float TextToFloat(const char *text); // Get float value from text (negative values not supported) + +//------------------------------------------------------------------------------------ +// Basic 3d Shapes Drawing Functions (Module: models) +//------------------------------------------------------------------------------------ + +// Basic geometric 3D shapes drawing functions +RLAPI void DrawLine3D(Vector3 startPos, Vector3 endPos, Color color); // Draw a line in 3D world space +RLAPI void DrawPoint3D(Vector3 position, Color color); // Draw a point in 3D space, actually a small line +RLAPI void DrawCircle3D(Vector3 center, float radius, Vector3 rotationAxis, float rotationAngle, Color color); // Draw a circle in 3D world space +RLAPI void DrawTriangle3D(Vector3 v1, Vector3 v2, Vector3 v3, Color color); // Draw a color-filled triangle (vertex in counter-clockwise order!) +RLAPI void DrawTriangleStrip3D(const Vector3 *points, int pointCount, Color color); // Draw a triangle strip defined by points +RLAPI void DrawCube(Vector3 position, float width, float height, float length, Color color); // Draw cube +RLAPI void DrawCubeV(Vector3 position, Vector3 size, Color color); // Draw cube (Vector version) +RLAPI void DrawCubeWires(Vector3 position, float width, float height, float length, Color color); // Draw cube wires +RLAPI void DrawCubeWiresV(Vector3 position, Vector3 size, Color color); // Draw cube wires (Vector version) +RLAPI void DrawSphere(Vector3 centerPos, float radius, Color color); // Draw sphere +RLAPI void DrawSphereEx(Vector3 centerPos, float radius, int rings, int slices, Color color); // Draw sphere with extended parameters +RLAPI void DrawSphereWires(Vector3 centerPos, float radius, int rings, int slices, Color color); // Draw sphere wires +RLAPI void DrawCylinder(Vector3 position, float radiusTop, float radiusBottom, float height, int slices, Color color); // Draw a cylinder/cone +RLAPI void DrawCylinderEx(Vector3 startPos, Vector3 endPos, float startRadius, float endRadius, int sides, Color color); // Draw a cylinder with base at startPos and top at endPos +RLAPI void DrawCylinderWires(Vector3 position, float radiusTop, float radiusBottom, float height, int slices, Color color); // Draw a cylinder/cone wires +RLAPI void DrawCylinderWiresEx(Vector3 startPos, Vector3 endPos, float startRadius, float endRadius, int sides, Color color); // Draw a cylinder wires with base at startPos and top at endPos +RLAPI void DrawCapsule(Vector3 startPos, Vector3 endPos, float radius, int slices, int rings, Color color); // Draw a capsule with the center of its sphere caps at startPos and endPos +RLAPI void DrawCapsuleWires(Vector3 startPos, Vector3 endPos, float radius, int slices, int rings, Color color); // Draw capsule wireframe with the center of its sphere caps at startPos and endPos +RLAPI void DrawPlane(Vector3 centerPos, Vector2 size, Color color); // Draw a plane XZ +RLAPI void DrawRay(Ray ray, Color color); // Draw a ray line +RLAPI void DrawGrid(int slices, float spacing); // Draw a grid (centered at (0, 0, 0)) + +//------------------------------------------------------------------------------------ +// Model 3d Loading and Drawing Functions (Module: models) +//------------------------------------------------------------------------------------ + +// Model management functions +RLAPI Model LoadModel(const char *fileName); // Load model from files (meshes and materials) +RLAPI Model LoadModelFromMesh(Mesh mesh); // Load model from generated mesh (default material) +RLAPI bool IsModelValid(Model model); // Check if a model is valid (loaded in GPU, VAO/VBOs) +RLAPI void UnloadModel(Model model); // Unload model (including meshes) from memory (RAM and/or VRAM) +RLAPI BoundingBox GetModelBoundingBox(Model model); // Compute model bounding box limits (considers all meshes) + +// Model drawing functions +RLAPI void DrawModel(Model model, Vector3 position, float scale, Color tint); // Draw a model (with texture if set) +RLAPI void DrawModelEx(Model model, Vector3 position, Vector3 rotationAxis, float rotationAngle, Vector3 scale, Color tint); // Draw a model with extended parameters +RLAPI void DrawModelWires(Model model, Vector3 position, float scale, Color tint); // Draw a model wires (with texture if set) +RLAPI void DrawModelWiresEx(Model model, Vector3 position, Vector3 rotationAxis, float rotationAngle, Vector3 scale, Color tint); // Draw a model wires (with texture if set) with extended parameters +RLAPI void DrawModelPoints(Model model, Vector3 position, float scale, Color tint); // Draw a model as points +RLAPI void DrawModelPointsEx(Model model, Vector3 position, Vector3 rotationAxis, float rotationAngle, Vector3 scale, Color tint); // Draw a model as points with extended parameters +RLAPI void DrawBoundingBox(BoundingBox box, Color color); // Draw bounding box (wires) +RLAPI void DrawBillboard(Camera camera, Texture2D texture, Vector3 position, float scale, Color tint); // Draw a billboard texture +RLAPI void DrawBillboardRec(Camera camera, Texture2D texture, Rectangle source, Vector3 position, Vector2 size, Color tint); // Draw a billboard texture defined by source +RLAPI void DrawBillboardPro(Camera camera, Texture2D texture, Rectangle source, Vector3 position, Vector3 up, Vector2 size, Vector2 origin, float rotation, Color tint); // Draw a billboard texture defined by source and rotation + +// Mesh management functions +RLAPI void UploadMesh(Mesh *mesh, bool dynamic); // Upload mesh vertex data in GPU and provide VAO/VBO ids +RLAPI void UpdateMeshBuffer(Mesh mesh, int index, const void *data, int dataSize, int offset); // Update mesh vertex data in GPU for a specific buffer index +RLAPI void UnloadMesh(Mesh mesh); // Unload mesh data from CPU and GPU +RLAPI void DrawMesh(Mesh mesh, Material material, Matrix transform); // Draw a 3d mesh with material and transform +RLAPI void DrawMeshInstanced(Mesh mesh, Material material, const Matrix *transforms, int instances); // Draw multiple mesh instances with material and different transforms +RLAPI BoundingBox GetMeshBoundingBox(Mesh mesh); // Compute mesh bounding box limits +RLAPI void GenMeshTangents(Mesh *mesh); // Compute mesh tangents +RLAPI bool ExportMesh(Mesh mesh, const char *fileName); // Export mesh data to file, returns true on success +RLAPI bool ExportMeshAsCode(Mesh mesh, const char *fileName); // Export mesh as code file (.h) defining multiple arrays of vertex attributes + +// Mesh generation functions +RLAPI Mesh GenMeshPoly(int sides, float radius); // Generate polygonal mesh +RLAPI Mesh GenMeshPlane(float width, float length, int resX, int resZ); // Generate plane mesh (with subdivisions) +RLAPI Mesh GenMeshCube(float width, float height, float length); // Generate cuboid mesh +RLAPI Mesh GenMeshSphere(float radius, int rings, int slices); // Generate sphere mesh (standard sphere) +RLAPI Mesh GenMeshHemiSphere(float radius, int rings, int slices); // Generate half-sphere mesh (no bottom cap) +RLAPI Mesh GenMeshCylinder(float radius, float height, int slices); // Generate cylinder mesh +RLAPI Mesh GenMeshCone(float radius, float height, int slices); // Generate cone/pyramid mesh +RLAPI Mesh GenMeshTorus(float radius, float size, int radSeg, int sides); // Generate torus mesh +RLAPI Mesh GenMeshKnot(float radius, float size, int radSeg, int sides); // Generate trefoil knot mesh +RLAPI Mesh GenMeshHeightmap(Image heightmap, Vector3 size); // Generate heightmap mesh from image data +RLAPI Mesh GenMeshCubicmap(Image cubicmap, Vector3 cubeSize); // Generate cubes-based map mesh from image data + +// Material loading/unloading functions +RLAPI Material *LoadMaterials(const char *fileName, int *materialCount); // Load materials from model file +RLAPI Material LoadMaterialDefault(void); // Load default material (Supports: DIFFUSE, SPECULAR, NORMAL maps) +RLAPI bool IsMaterialValid(Material material); // Check if a material is valid (shader assigned, map textures loaded in GPU) +RLAPI void UnloadMaterial(Material material); // Unload material from GPU memory (VRAM) +RLAPI void SetMaterialTexture(Material *material, int mapType, Texture2D texture); // Set texture for a material map type (MATERIAL_MAP_DIFFUSE, MATERIAL_MAP_SPECULAR...) +RLAPI void SetModelMeshMaterial(Model *model, int meshId, int materialId); // Set material for a mesh + +// Model animations loading/unloading functions +RLAPI ModelAnimation *LoadModelAnimations(const char *fileName, int *animCount); // Load model animations from file +RLAPI void UpdateModelAnimation(Model model, ModelAnimation anim, int frame); // Update model animation pose (CPU) +RLAPI void UpdateModelAnimationBones(Model model, ModelAnimation anim, int frame); // Update model animation mesh bone matrices (GPU skinning) +RLAPI void UnloadModelAnimation(ModelAnimation anim); // Unload animation data +RLAPI void UnloadModelAnimations(ModelAnimation *animations, int animCount); // Unload animation array data +RLAPI bool IsModelAnimationValid(Model model, ModelAnimation anim); // Check model animation skeleton match + +// Collision detection functions +RLAPI bool CheckCollisionSpheres(Vector3 center1, float radius1, Vector3 center2, float radius2); // Check collision between two spheres +RLAPI bool CheckCollisionBoxes(BoundingBox box1, BoundingBox box2); // Check collision between two bounding boxes +RLAPI bool CheckCollisionBoxSphere(BoundingBox box, Vector3 center, float radius); // Check collision between box and sphere +RLAPI RayCollision GetRayCollisionSphere(Ray ray, Vector3 center, float radius); // Get collision info between ray and sphere +RLAPI RayCollision GetRayCollisionBox(Ray ray, BoundingBox box); // Get collision info between ray and box +RLAPI RayCollision GetRayCollisionMesh(Ray ray, Mesh mesh, Matrix transform); // Get collision info between ray and mesh +RLAPI RayCollision GetRayCollisionTriangle(Ray ray, Vector3 p1, Vector3 p2, Vector3 p3); // Get collision info between ray and triangle +RLAPI RayCollision GetRayCollisionQuad(Ray ray, Vector3 p1, Vector3 p2, Vector3 p3, Vector3 p4); // Get collision info between ray and quad + +//------------------------------------------------------------------------------------ +// Audio Loading and Playing Functions (Module: audio) +//------------------------------------------------------------------------------------ +typedef void (*AudioCallback)(void *bufferData, unsigned int frames); + +// Audio device management functions +RLAPI void InitAudioDevice(void); // Initialize audio device and context +RLAPI void CloseAudioDevice(void); // Close the audio device and context +RLAPI bool IsAudioDeviceReady(void); // Check if audio device has been initialized successfully +RLAPI void SetMasterVolume(float volume); // Set master volume (listener) +RLAPI float GetMasterVolume(void); // Get master volume (listener) + +// Wave/Sound loading/unloading functions +RLAPI Wave LoadWave(const char *fileName); // Load wave data from file +RLAPI Wave LoadWaveFromMemory(const char *fileType, const unsigned char *fileData, int dataSize); // Load wave from memory buffer, fileType refers to extension: i.e. '.wav' +RLAPI bool IsWaveValid(Wave wave); // Checks if wave data is valid (data loaded and parameters) +RLAPI Sound LoadSound(const char *fileName); // Load sound from file +RLAPI Sound LoadSoundFromWave(Wave wave); // Load sound from wave data +RLAPI Sound LoadSoundAlias(Sound source); // Create a new sound that shares the same sample data as the source sound, does not own the sound data +RLAPI bool IsSoundValid(Sound sound); // Checks if a sound is valid (data loaded and buffers initialized) +RLAPI void UpdateSound(Sound sound, const void *data, int sampleCount); // Update sound buffer with new data +RLAPI void UnloadWave(Wave wave); // Unload wave data +RLAPI void UnloadSound(Sound sound); // Unload sound +RLAPI void UnloadSoundAlias(Sound alias); // Unload a sound alias (does not deallocate sample data) +RLAPI bool ExportWave(Wave wave, const char *fileName); // Export wave data to file, returns true on success +RLAPI bool ExportWaveAsCode(Wave wave, const char *fileName); // Export wave sample data to code (.h), returns true on success + +// Wave/Sound management functions +RLAPI void PlaySound(Sound sound); // Play a sound +RLAPI void StopSound(Sound sound); // Stop playing a sound +RLAPI void PauseSound(Sound sound); // Pause a sound +RLAPI void ResumeSound(Sound sound); // Resume a paused sound +RLAPI bool IsSoundPlaying(Sound sound); // Check if a sound is currently playing +RLAPI void SetSoundVolume(Sound sound, float volume); // Set volume for a sound (1.0 is max level) +RLAPI void SetSoundPitch(Sound sound, float pitch); // Set pitch for a sound (1.0 is base level) +RLAPI void SetSoundPan(Sound sound, float pan); // Set pan for a sound (0.5 is center) +RLAPI Wave WaveCopy(Wave wave); // Copy a wave to a new wave +RLAPI void WaveCrop(Wave *wave, int initFrame, int finalFrame); // Crop a wave to defined frames range +RLAPI void WaveFormat(Wave *wave, int sampleRate, int sampleSize, int channels); // Convert wave data to desired format +RLAPI float *LoadWaveSamples(Wave wave); // Load samples data from wave as a 32bit float data array +RLAPI void UnloadWaveSamples(float *samples); // Unload samples data loaded with LoadWaveSamples() + +// Music management functions +RLAPI Music LoadMusicStream(const char *fileName); // Load music stream from file +RLAPI Music LoadMusicStreamFromMemory(const char *fileType, const unsigned char *data, int dataSize); // Load music stream from data +RLAPI bool IsMusicValid(Music music); // Checks if a music stream is valid (context and buffers initialized) +RLAPI void UnloadMusicStream(Music music); // Unload music stream +RLAPI void PlayMusicStream(Music music); // Start music playing +RLAPI bool IsMusicStreamPlaying(Music music); // Check if music is playing +RLAPI void UpdateMusicStream(Music music); // Updates buffers for music streaming +RLAPI void StopMusicStream(Music music); // Stop music playing +RLAPI void PauseMusicStream(Music music); // Pause music playing +RLAPI void ResumeMusicStream(Music music); // Resume playing paused music +RLAPI void SeekMusicStream(Music music, float position); // Seek music to a position (in seconds) +RLAPI void SetMusicVolume(Music music, float volume); // Set volume for music (1.0 is max level) +RLAPI void SetMusicPitch(Music music, float pitch); // Set pitch for a music (1.0 is base level) +RLAPI void SetMusicPan(Music music, float pan); // Set pan for a music (0.5 is center) +RLAPI float GetMusicTimeLength(Music music); // Get music time length (in seconds) +RLAPI float GetMusicTimePlayed(Music music); // Get current music time played (in seconds) + +// AudioStream management functions +RLAPI AudioStream LoadAudioStream(unsigned int sampleRate, unsigned int sampleSize, unsigned int channels); // Load audio stream (to stream raw audio pcm data) +RLAPI bool IsAudioStreamValid(AudioStream stream); // Checks if an audio stream is valid (buffers initialized) +RLAPI void UnloadAudioStream(AudioStream stream); // Unload audio stream and free memory +RLAPI void UpdateAudioStream(AudioStream stream, const void *data, int frameCount); // Update audio stream buffers with data +RLAPI bool IsAudioStreamProcessed(AudioStream stream); // Check if any audio stream buffers requires refill +RLAPI void PlayAudioStream(AudioStream stream); // Play audio stream +RLAPI void PauseAudioStream(AudioStream stream); // Pause audio stream +RLAPI void ResumeAudioStream(AudioStream stream); // Resume audio stream +RLAPI bool IsAudioStreamPlaying(AudioStream stream); // Check if audio stream is playing +RLAPI void StopAudioStream(AudioStream stream); // Stop audio stream +RLAPI void SetAudioStreamVolume(AudioStream stream, float volume); // Set volume for audio stream (1.0 is max level) +RLAPI void SetAudioStreamPitch(AudioStream stream, float pitch); // Set pitch for audio stream (1.0 is base level) +RLAPI void SetAudioStreamPan(AudioStream stream, float pan); // Set pan for audio stream (0.5 is centered) +RLAPI void SetAudioStreamBufferSizeDefault(int size); // Default size for new audio streams +RLAPI void SetAudioStreamCallback(AudioStream stream, AudioCallback callback); // Audio thread callback to request new data + +RLAPI void AttachAudioStreamProcessor(AudioStream stream, AudioCallback processor); // Attach audio stream processor to stream, receives the samples as 'float' +RLAPI void DetachAudioStreamProcessor(AudioStream stream, AudioCallback processor); // Detach audio stream processor from stream + +RLAPI void AttachAudioMixedProcessor(AudioCallback processor); // Attach audio stream processor to the entire audio pipeline, receives the samples as 'float' +RLAPI void DetachAudioMixedProcessor(AudioCallback processor); // Detach audio stream processor from the entire audio pipeline + +#if defined(__cplusplus) +} +#endif + +#endif // RAYLIB_H diff --git a/vendor/raylib-5.5_linux_amd64/include/raymath.h b/vendor/raylib-5.5_linux_amd64/include/raymath.h new file mode 100644 index 0000000..e522113 --- /dev/null +++ b/vendor/raylib-5.5_linux_amd64/include/raymath.h @@ -0,0 +1,2941 @@ +/********************************************************************************************** +* +* raymath v2.0 - Math functions to work with Vector2, Vector3, Matrix and Quaternions +* +* CONVENTIONS: +* - Matrix structure is defined as row-major (memory layout) but parameters naming AND all +* math operations performed by the library consider the structure as it was column-major +* It is like transposed versions of the matrices are used for all the maths +* It benefits some functions making them cache-friendly and also avoids matrix +* transpositions sometimes required by OpenGL +* Example: In memory order, row0 is [m0 m4 m8 m12] but in semantic math row0 is [m0 m1 m2 m3] +* - Functions are always self-contained, no function use another raymath function inside, +* required code is directly re-implemented inside +* - Functions input parameters are always received by value (2 unavoidable exceptions) +* - Functions use always a "result" variable for return (except C++ operators) +* - Functions are always defined inline +* - Angles are always in radians (DEG2RAD/RAD2DEG macros provided for convenience) +* - No compound literals used to make sure libray is compatible with C++ +* +* CONFIGURATION: +* #define RAYMATH_IMPLEMENTATION +* Generates the implementation of the library into the included file. +* If not defined, the library is in header only mode and can be included in other headers +* or source files without problems. But only ONE file should hold the implementation. +* +* #define RAYMATH_STATIC_INLINE +* Define static inline functions code, so #include header suffices for use. +* This may use up lots of memory. +* +* #define RAYMATH_DISABLE_CPP_OPERATORS +* Disables C++ operator overloads for raymath types. +* +* LICENSE: zlib/libpng +* +* Copyright (c) 2015-2024 Ramon Santamaria (@raysan5) +* +* This software is provided "as-is", without any express or implied warranty. In no event +* will the authors be held liable for any damages arising from the use of this software. +* +* Permission is granted to anyone to use this software for any purpose, including commercial +* applications, and to alter it and redistribute it freely, subject to the following restrictions: +* +* 1. The origin of this software must not be misrepresented; you must not claim that you +* wrote the original software. If you use this software in a product, an acknowledgment +* in the product documentation would be appreciated but is not required. +* +* 2. Altered source versions must be plainly marked as such, and must not be misrepresented +* as being the original software. +* +* 3. This notice may not be removed or altered from any source distribution. +* +**********************************************************************************************/ + +#ifndef RAYMATH_H +#define RAYMATH_H + +#if defined(RAYMATH_IMPLEMENTATION) && defined(RAYMATH_STATIC_INLINE) + #error "Specifying both RAYMATH_IMPLEMENTATION and RAYMATH_STATIC_INLINE is contradictory" +#endif + +// Function specifiers definition +#if defined(RAYMATH_IMPLEMENTATION) + #if defined(_WIN32) && defined(BUILD_LIBTYPE_SHARED) + #define RMAPI __declspec(dllexport) extern inline // We are building raylib as a Win32 shared library (.dll) + #elif defined(BUILD_LIBTYPE_SHARED) + #define RMAPI __attribute__((visibility("default"))) // We are building raylib as a Unix shared library (.so/.dylib) + #elif defined(_WIN32) && defined(USE_LIBTYPE_SHARED) + #define RMAPI __declspec(dllimport) // We are using raylib as a Win32 shared library (.dll) + #else + #define RMAPI extern inline // Provide external definition + #endif +#elif defined(RAYMATH_STATIC_INLINE) + #define RMAPI static inline // Functions may be inlined, no external out-of-line definition +#else + #if defined(__TINYC__) + #define RMAPI static inline // plain inline not supported by tinycc (See issue #435) + #else + #define RMAPI inline // Functions may be inlined or external definition used + #endif +#endif + + +//---------------------------------------------------------------------------------- +// Defines and Macros +//---------------------------------------------------------------------------------- +#ifndef PI + #define PI 3.14159265358979323846f +#endif + +#ifndef EPSILON + #define EPSILON 0.000001f +#endif + +#ifndef DEG2RAD + #define DEG2RAD (PI/180.0f) +#endif + +#ifndef RAD2DEG + #define RAD2DEG (180.0f/PI) +#endif + +// Get float vector for Matrix +#ifndef MatrixToFloat + #define MatrixToFloat(mat) (MatrixToFloatV(mat).v) +#endif + +// Get float vector for Vector3 +#ifndef Vector3ToFloat + #define Vector3ToFloat(vec) (Vector3ToFloatV(vec).v) +#endif + +//---------------------------------------------------------------------------------- +// Types and Structures Definition +//---------------------------------------------------------------------------------- +#if !defined(RL_VECTOR2_TYPE) +// Vector2 type +typedef struct Vector2 { + float x; + float y; +} Vector2; +#define RL_VECTOR2_TYPE +#endif + +#if !defined(RL_VECTOR3_TYPE) +// Vector3 type +typedef struct Vector3 { + float x; + float y; + float z; +} Vector3; +#define RL_VECTOR3_TYPE +#endif + +#if !defined(RL_VECTOR4_TYPE) +// Vector4 type +typedef struct Vector4 { + float x; + float y; + float z; + float w; +} Vector4; +#define RL_VECTOR4_TYPE +#endif + +#if !defined(RL_QUATERNION_TYPE) +// Quaternion type +typedef Vector4 Quaternion; +#define RL_QUATERNION_TYPE +#endif + +#if !defined(RL_MATRIX_TYPE) +// Matrix type (OpenGL style 4x4 - right handed, column major) +typedef struct Matrix { + float m0, m4, m8, m12; // Matrix first row (4 components) + float m1, m5, m9, m13; // Matrix second row (4 components) + float m2, m6, m10, m14; // Matrix third row (4 components) + float m3, m7, m11, m15; // Matrix fourth row (4 components) +} Matrix; +#define RL_MATRIX_TYPE +#endif + +// NOTE: Helper types to be used instead of array return types for *ToFloat functions +typedef struct float3 { + float v[3]; +} float3; + +typedef struct float16 { + float v[16]; +} float16; + +#include <math.h> // Required for: sinf(), cosf(), tan(), atan2f(), sqrtf(), floor(), fminf(), fmaxf(), fabsf() + +//---------------------------------------------------------------------------------- +// Module Functions Definition - Utils math +//---------------------------------------------------------------------------------- + +// Clamp float value +RMAPI float Clamp(float value, float min, float max) +{ + float result = (value < min)? min : value; + + if (result > max) result = max; + + return result; +} + +// Calculate linear interpolation between two floats +RMAPI float Lerp(float start, float end, float amount) +{ + float result = start + amount*(end - start); + + return result; +} + +// Normalize input value within input range +RMAPI float Normalize(float value, float start, float end) +{ + float result = (value - start)/(end - start); + + return result; +} + +// Remap input value within input range to output range +RMAPI float Remap(float value, float inputStart, float inputEnd, float outputStart, float outputEnd) +{ + float result = (value - inputStart)/(inputEnd - inputStart)*(outputEnd - outputStart) + outputStart; + + return result; +} + +// Wrap input value from min to max +RMAPI float Wrap(float value, float min, float max) +{ + float result = value - (max - min)*floorf((value - min)/(max - min)); + + return result; +} + +// Check whether two given floats are almost equal +RMAPI int FloatEquals(float x, float y) +{ +#if !defined(EPSILON) + #define EPSILON 0.000001f +#endif + + int result = (fabsf(x - y)) <= (EPSILON*fmaxf(1.0f, fmaxf(fabsf(x), fabsf(y)))); + + return result; +} + +//---------------------------------------------------------------------------------- +// Module Functions Definition - Vector2 math +//---------------------------------------------------------------------------------- + +// Vector with components value 0.0f +RMAPI Vector2 Vector2Zero(void) +{ + Vector2 result = { 0.0f, 0.0f }; + + return result; +} + +// Vector with components value 1.0f +RMAPI Vector2 Vector2One(void) +{ + Vector2 result = { 1.0f, 1.0f }; + + return result; +} + +// Add two vectors (v1 + v2) +RMAPI Vector2 Vector2Add(Vector2 v1, Vector2 v2) +{ + Vector2 result = { v1.x + v2.x, v1.y + v2.y }; + + return result; +} + +// Add vector and float value +RMAPI Vector2 Vector2AddValue(Vector2 v, float add) +{ + Vector2 result = { v.x + add, v.y + add }; + + return result; +} + +// Subtract two vectors (v1 - v2) +RMAPI Vector2 Vector2Subtract(Vector2 v1, Vector2 v2) +{ + Vector2 result = { v1.x - v2.x, v1.y - v2.y }; + + return result; +} + +// Subtract vector by float value +RMAPI Vector2 Vector2SubtractValue(Vector2 v, float sub) +{ + Vector2 result = { v.x - sub, v.y - sub }; + + return result; +} + +// Calculate vector length +RMAPI float Vector2Length(Vector2 v) +{ + float result = sqrtf((v.x*v.x) + (v.y*v.y)); + + return result; +} + +// Calculate vector square length +RMAPI float Vector2LengthSqr(Vector2 v) +{ + float result = (v.x*v.x) + (v.y*v.y); + + return result; +} + +// Calculate two vectors dot product +RMAPI float Vector2DotProduct(Vector2 v1, Vector2 v2) +{ + float result = (v1.x*v2.x + v1.y*v2.y); + + return result; +} + +// Calculate distance between two vectors +RMAPI float Vector2Distance(Vector2 v1, Vector2 v2) +{ + float result = sqrtf((v1.x - v2.x)*(v1.x - v2.x) + (v1.y - v2.y)*(v1.y - v2.y)); + + return result; +} + +// Calculate square distance between two vectors +RMAPI float Vector2DistanceSqr(Vector2 v1, Vector2 v2) +{ + float result = ((v1.x - v2.x)*(v1.x - v2.x) + (v1.y - v2.y)*(v1.y - v2.y)); + + return result; +} + +// Calculate angle between two vectors +// NOTE: Angle is calculated from origin point (0, 0) +RMAPI float Vector2Angle(Vector2 v1, Vector2 v2) +{ + float result = 0.0f; + + float dot = v1.x*v2.x + v1.y*v2.y; + float det = v1.x*v2.y - v1.y*v2.x; + + result = atan2f(det, dot); + + return result; +} + +// Calculate angle defined by a two vectors line +// NOTE: Parameters need to be normalized +// Current implementation should be aligned with glm::angle +RMAPI float Vector2LineAngle(Vector2 start, Vector2 end) +{ + float result = 0.0f; + + // TODO(10/9/2023): Currently angles move clockwise, determine if this is wanted behavior + result = -atan2f(end.y - start.y, end.x - start.x); + + return result; +} + +// Scale vector (multiply by value) +RMAPI Vector2 Vector2Scale(Vector2 v, float scale) +{ + Vector2 result = { v.x*scale, v.y*scale }; + + return result; +} + +// Multiply vector by vector +RMAPI Vector2 Vector2Multiply(Vector2 v1, Vector2 v2) +{ + Vector2 result = { v1.x*v2.x, v1.y*v2.y }; + + return result; +} + +// Negate vector +RMAPI Vector2 Vector2Negate(Vector2 v) +{ + Vector2 result = { -v.x, -v.y }; + + return result; +} + +// Divide vector by vector +RMAPI Vector2 Vector2Divide(Vector2 v1, Vector2 v2) +{ + Vector2 result = { v1.x/v2.x, v1.y/v2.y }; + + return result; +} + +// Normalize provided vector +RMAPI Vector2 Vector2Normalize(Vector2 v) +{ + Vector2 result = { 0 }; + float length = sqrtf((v.x*v.x) + (v.y*v.y)); + + if (length > 0) + { + float ilength = 1.0f/length; + result.x = v.x*ilength; + result.y = v.y*ilength; + } + + return result; +} + +// Transforms a Vector2 by a given Matrix +RMAPI Vector2 Vector2Transform(Vector2 v, Matrix mat) +{ + Vector2 result = { 0 }; + + float x = v.x; + float y = v.y; + float z = 0; + + result.x = mat.m0*x + mat.m4*y + mat.m8*z + mat.m12; + result.y = mat.m1*x + mat.m5*y + mat.m9*z + mat.m13; + + return result; +} + +// Calculate linear interpolation between two vectors +RMAPI Vector2 Vector2Lerp(Vector2 v1, Vector2 v2, float amount) +{ + Vector2 result = { 0 }; + + result.x = v1.x + amount*(v2.x - v1.x); + result.y = v1.y + amount*(v2.y - v1.y); + + return result; +} + +// Calculate reflected vector to normal +RMAPI Vector2 Vector2Reflect(Vector2 v, Vector2 normal) +{ + Vector2 result = { 0 }; + + float dotProduct = (v.x*normal.x + v.y*normal.y); // Dot product + + result.x = v.x - (2.0f*normal.x)*dotProduct; + result.y = v.y - (2.0f*normal.y)*dotProduct; + + return result; +} + +// Get min value for each pair of components +RMAPI Vector2 Vector2Min(Vector2 v1, Vector2 v2) +{ + Vector2 result = { 0 }; + + result.x = fminf(v1.x, v2.x); + result.y = fminf(v1.y, v2.y); + + return result; +} + +// Get max value for each pair of components +RMAPI Vector2 Vector2Max(Vector2 v1, Vector2 v2) +{ + Vector2 result = { 0 }; + + result.x = fmaxf(v1.x, v2.x); + result.y = fmaxf(v1.y, v2.y); + + return result; +} + +// Rotate vector by angle +RMAPI Vector2 Vector2Rotate(Vector2 v, float angle) +{ + Vector2 result = { 0 }; + + float cosres = cosf(angle); + float sinres = sinf(angle); + + result.x = v.x*cosres - v.y*sinres; + result.y = v.x*sinres + v.y*cosres; + + return result; +} + +// Move Vector towards target +RMAPI Vector2 Vector2MoveTowards(Vector2 v, Vector2 target, float maxDistance) +{ + Vector2 result = { 0 }; + + float dx = target.x - v.x; + float dy = target.y - v.y; + float value = (dx*dx) + (dy*dy); + + if ((value == 0) || ((maxDistance >= 0) && (value <= maxDistance*maxDistance))) return target; + + float dist = sqrtf(value); + + result.x = v.x + dx/dist*maxDistance; + result.y = v.y + dy/dist*maxDistance; + + return result; +} + +// Invert the given vector +RMAPI Vector2 Vector2Invert(Vector2 v) +{ + Vector2 result = { 1.0f/v.x, 1.0f/v.y }; + + return result; +} + +// Clamp the components of the vector between +// min and max values specified by the given vectors +RMAPI Vector2 Vector2Clamp(Vector2 v, Vector2 min, Vector2 max) +{ + Vector2 result = { 0 }; + + result.x = fminf(max.x, fmaxf(min.x, v.x)); + result.y = fminf(max.y, fmaxf(min.y, v.y)); + + return result; +} + +// Clamp the magnitude of the vector between two min and max values +RMAPI Vector2 Vector2ClampValue(Vector2 v, float min, float max) +{ + Vector2 result = v; + + float length = (v.x*v.x) + (v.y*v.y); + if (length > 0.0f) + { + length = sqrtf(length); + + float scale = 1; // By default, 1 as the neutral element. + if (length < min) + { + scale = min/length; + } + else if (length > max) + { + scale = max/length; + } + + result.x = v.x*scale; + result.y = v.y*scale; + } + + return result; +} + +// Check whether two given vectors are almost equal +RMAPI int Vector2Equals(Vector2 p, Vector2 q) +{ +#if !defined(EPSILON) + #define EPSILON 0.000001f +#endif + + int result = ((fabsf(p.x - q.x)) <= (EPSILON*fmaxf(1.0f, fmaxf(fabsf(p.x), fabsf(q.x))))) && + ((fabsf(p.y - q.y)) <= (EPSILON*fmaxf(1.0f, fmaxf(fabsf(p.y), fabsf(q.y))))); + + return result; +} + +// Compute the direction of a refracted ray +// v: normalized direction of the incoming ray +// n: normalized normal vector of the interface of two optical media +// r: ratio of the refractive index of the medium from where the ray comes +// to the refractive index of the medium on the other side of the surface +RMAPI Vector2 Vector2Refract(Vector2 v, Vector2 n, float r) +{ + Vector2 result = { 0 }; + + float dot = v.x*n.x + v.y*n.y; + float d = 1.0f - r*r*(1.0f - dot*dot); + + if (d >= 0.0f) + { + d = sqrtf(d); + v.x = r*v.x - (r*dot + d)*n.x; + v.y = r*v.y - (r*dot + d)*n.y; + + result = v; + } + + return result; +} + + +//---------------------------------------------------------------------------------- +// Module Functions Definition - Vector3 math +//---------------------------------------------------------------------------------- + +// Vector with components value 0.0f +RMAPI Vector3 Vector3Zero(void) +{ + Vector3 result = { 0.0f, 0.0f, 0.0f }; + + return result; +} + +// Vector with components value 1.0f +RMAPI Vector3 Vector3One(void) +{ + Vector3 result = { 1.0f, 1.0f, 1.0f }; + + return result; +} + +// Add two vectors +RMAPI Vector3 Vector3Add(Vector3 v1, Vector3 v2) +{ + Vector3 result = { v1.x + v2.x, v1.y + v2.y, v1.z + v2.z }; + + return result; +} + +// Add vector and float value +RMAPI Vector3 Vector3AddValue(Vector3 v, float add) +{ + Vector3 result = { v.x + add, v.y + add, v.z + add }; + + return result; +} + +// Subtract two vectors +RMAPI Vector3 Vector3Subtract(Vector3 v1, Vector3 v2) +{ + Vector3 result = { v1.x - v2.x, v1.y - v2.y, v1.z - v2.z }; + + return result; +} + +// Subtract vector by float value +RMAPI Vector3 Vector3SubtractValue(Vector3 v, float sub) +{ + Vector3 result = { v.x - sub, v.y - sub, v.z - sub }; + + return result; +} + +// Multiply vector by scalar +RMAPI Vector3 Vector3Scale(Vector3 v, float scalar) +{ + Vector3 result = { v.x*scalar, v.y*scalar, v.z*scalar }; + + return result; +} + +// Multiply vector by vector +RMAPI Vector3 Vector3Multiply(Vector3 v1, Vector3 v2) +{ + Vector3 result = { v1.x*v2.x, v1.y*v2.y, v1.z*v2.z }; + + return result; +} + +// Calculate two vectors cross product +RMAPI Vector3 Vector3CrossProduct(Vector3 v1, Vector3 v2) +{ + Vector3 result = { v1.y*v2.z - v1.z*v2.y, v1.z*v2.x - v1.x*v2.z, v1.x*v2.y - v1.y*v2.x }; + + return result; +} + +// Calculate one vector perpendicular vector +RMAPI Vector3 Vector3Perpendicular(Vector3 v) +{ + Vector3 result = { 0 }; + + float min = fabsf(v.x); + Vector3 cardinalAxis = {1.0f, 0.0f, 0.0f}; + + if (fabsf(v.y) < min) + { + min = fabsf(v.y); + Vector3 tmp = {0.0f, 1.0f, 0.0f}; + cardinalAxis = tmp; + } + + if (fabsf(v.z) < min) + { + Vector3 tmp = {0.0f, 0.0f, 1.0f}; + cardinalAxis = tmp; + } + + // Cross product between vectors + result.x = v.y*cardinalAxis.z - v.z*cardinalAxis.y; + result.y = v.z*cardinalAxis.x - v.x*cardinalAxis.z; + result.z = v.x*cardinalAxis.y - v.y*cardinalAxis.x; + + return result; +} + +// Calculate vector length +RMAPI float Vector3Length(const Vector3 v) +{ + float result = sqrtf(v.x*v.x + v.y*v.y + v.z*v.z); + + return result; +} + +// Calculate vector square length +RMAPI float Vector3LengthSqr(const Vector3 v) +{ + float result = v.x*v.x + v.y*v.y + v.z*v.z; + + return result; +} + +// Calculate two vectors dot product +RMAPI float Vector3DotProduct(Vector3 v1, Vector3 v2) +{ + float result = (v1.x*v2.x + v1.y*v2.y + v1.z*v2.z); + + return result; +} + +// Calculate distance between two vectors +RMAPI float Vector3Distance(Vector3 v1, Vector3 v2) +{ + float result = 0.0f; + + float dx = v2.x - v1.x; + float dy = v2.y - v1.y; + float dz = v2.z - v1.z; + result = sqrtf(dx*dx + dy*dy + dz*dz); + + return result; +} + +// Calculate square distance between two vectors +RMAPI float Vector3DistanceSqr(Vector3 v1, Vector3 v2) +{ + float result = 0.0f; + + float dx = v2.x - v1.x; + float dy = v2.y - v1.y; + float dz = v2.z - v1.z; + result = dx*dx + dy*dy + dz*dz; + + return result; +} + +// Calculate angle between two vectors +RMAPI float Vector3Angle(Vector3 v1, Vector3 v2) +{ + float result = 0.0f; + + Vector3 cross = { v1.y*v2.z - v1.z*v2.y, v1.z*v2.x - v1.x*v2.z, v1.x*v2.y - v1.y*v2.x }; + float len = sqrtf(cross.x*cross.x + cross.y*cross.y + cross.z*cross.z); + float dot = (v1.x*v2.x + v1.y*v2.y + v1.z*v2.z); + result = atan2f(len, dot); + + return result; +} + +// Negate provided vector (invert direction) +RMAPI Vector3 Vector3Negate(Vector3 v) +{ + Vector3 result = { -v.x, -v.y, -v.z }; + + return result; +} + +// Divide vector by vector +RMAPI Vector3 Vector3Divide(Vector3 v1, Vector3 v2) +{ + Vector3 result = { v1.x/v2.x, v1.y/v2.y, v1.z/v2.z }; + + return result; +} + +// Normalize provided vector +RMAPI Vector3 Vector3Normalize(Vector3 v) +{ + Vector3 result = v; + + float length = sqrtf(v.x*v.x + v.y*v.y + v.z*v.z); + if (length != 0.0f) + { + float ilength = 1.0f/length; + + result.x *= ilength; + result.y *= ilength; + result.z *= ilength; + } + + return result; +} + +//Calculate the projection of the vector v1 on to v2 +RMAPI Vector3 Vector3Project(Vector3 v1, Vector3 v2) +{ + Vector3 result = { 0 }; + + float v1dv2 = (v1.x*v2.x + v1.y*v2.y + v1.z*v2.z); + float v2dv2 = (v2.x*v2.x + v2.y*v2.y + v2.z*v2.z); + + float mag = v1dv2/v2dv2; + + result.x = v2.x*mag; + result.y = v2.y*mag; + result.z = v2.z*mag; + + return result; +} + +//Calculate the rejection of the vector v1 on to v2 +RMAPI Vector3 Vector3Reject(Vector3 v1, Vector3 v2) +{ + Vector3 result = { 0 }; + + float v1dv2 = (v1.x*v2.x + v1.y*v2.y + v1.z*v2.z); + float v2dv2 = (v2.x*v2.x + v2.y*v2.y + v2.z*v2.z); + + float mag = v1dv2/v2dv2; + + result.x = v1.x - (v2.x*mag); + result.y = v1.y - (v2.y*mag); + result.z = v1.z - (v2.z*mag); + + return result; +} + +// Orthonormalize provided vectors +// Makes vectors normalized and orthogonal to each other +// Gram-Schmidt function implementation +RMAPI void Vector3OrthoNormalize(Vector3 *v1, Vector3 *v2) +{ + float length = 0.0f; + float ilength = 0.0f; + + // Vector3Normalize(*v1); + Vector3 v = *v1; + length = sqrtf(v.x*v.x + v.y*v.y + v.z*v.z); + if (length == 0.0f) length = 1.0f; + ilength = 1.0f/length; + v1->x *= ilength; + v1->y *= ilength; + v1->z *= ilength; + + // Vector3CrossProduct(*v1, *v2) + Vector3 vn1 = { v1->y*v2->z - v1->z*v2->y, v1->z*v2->x - v1->x*v2->z, v1->x*v2->y - v1->y*v2->x }; + + // Vector3Normalize(vn1); + v = vn1; + length = sqrtf(v.x*v.x + v.y*v.y + v.z*v.z); + if (length == 0.0f) length = 1.0f; + ilength = 1.0f/length; + vn1.x *= ilength; + vn1.y *= ilength; + vn1.z *= ilength; + + // Vector3CrossProduct(vn1, *v1) + Vector3 vn2 = { vn1.y*v1->z - vn1.z*v1->y, vn1.z*v1->x - vn1.x*v1->z, vn1.x*v1->y - vn1.y*v1->x }; + + *v2 = vn2; +} + +// Transforms a Vector3 by a given Matrix +RMAPI Vector3 Vector3Transform(Vector3 v, Matrix mat) +{ + Vector3 result = { 0 }; + + float x = v.x; + float y = v.y; + float z = v.z; + + result.x = mat.m0*x + mat.m4*y + mat.m8*z + mat.m12; + result.y = mat.m1*x + mat.m5*y + mat.m9*z + mat.m13; + result.z = mat.m2*x + mat.m6*y + mat.m10*z + mat.m14; + + return result; +} + +// Transform a vector by quaternion rotation +RMAPI Vector3 Vector3RotateByQuaternion(Vector3 v, Quaternion q) +{ + Vector3 result = { 0 }; + + result.x = v.x*(q.x*q.x + q.w*q.w - q.y*q.y - q.z*q.z) + v.y*(2*q.x*q.y - 2*q.w*q.z) + v.z*(2*q.x*q.z + 2*q.w*q.y); + result.y = v.x*(2*q.w*q.z + 2*q.x*q.y) + v.y*(q.w*q.w - q.x*q.x + q.y*q.y - q.z*q.z) + v.z*(-2*q.w*q.x + 2*q.y*q.z); + result.z = v.x*(-2*q.w*q.y + 2*q.x*q.z) + v.y*(2*q.w*q.x + 2*q.y*q.z)+ v.z*(q.w*q.w - q.x*q.x - q.y*q.y + q.z*q.z); + + return result; +} + +// Rotates a vector around an axis +RMAPI Vector3 Vector3RotateByAxisAngle(Vector3 v, Vector3 axis, float angle) +{ + // Using Euler-Rodrigues Formula + // Ref.: https://en.wikipedia.org/w/index.php?title=Euler%E2%80%93Rodrigues_formula + + Vector3 result = v; + + // Vector3Normalize(axis); + float length = sqrtf(axis.x*axis.x + axis.y*axis.y + axis.z*axis.z); + if (length == 0.0f) length = 1.0f; + float ilength = 1.0f/length; + axis.x *= ilength; + axis.y *= ilength; + axis.z *= ilength; + + angle /= 2.0f; + float a = sinf(angle); + float b = axis.x*a; + float c = axis.y*a; + float d = axis.z*a; + a = cosf(angle); + Vector3 w = { b, c, d }; + + // Vector3CrossProduct(w, v) + Vector3 wv = { w.y*v.z - w.z*v.y, w.z*v.x - w.x*v.z, w.x*v.y - w.y*v.x }; + + // Vector3CrossProduct(w, wv) + Vector3 wwv = { w.y*wv.z - w.z*wv.y, w.z*wv.x - w.x*wv.z, w.x*wv.y - w.y*wv.x }; + + // Vector3Scale(wv, 2*a) + a *= 2; + wv.x *= a; + wv.y *= a; + wv.z *= a; + + // Vector3Scale(wwv, 2) + wwv.x *= 2; + wwv.y *= 2; + wwv.z *= 2; + + result.x += wv.x; + result.y += wv.y; + result.z += wv.z; + + result.x += wwv.x; + result.y += wwv.y; + result.z += wwv.z; + + return result; +} + +// Move Vector towards target +RMAPI Vector3 Vector3MoveTowards(Vector3 v, Vector3 target, float maxDistance) +{ + Vector3 result = { 0 }; + + float dx = target.x - v.x; + float dy = target.y - v.y; + float dz = target.z - v.z; + float value = (dx*dx) + (dy*dy) + (dz*dz); + + if ((value == 0) || ((maxDistance >= 0) && (value <= maxDistance*maxDistance))) return target; + + float dist = sqrtf(value); + + result.x = v.x + dx/dist*maxDistance; + result.y = v.y + dy/dist*maxDistance; + result.z = v.z + dz/dist*maxDistance; + + return result; +} + +// Calculate linear interpolation between two vectors +RMAPI Vector3 Vector3Lerp(Vector3 v1, Vector3 v2, float amount) +{ + Vector3 result = { 0 }; + + result.x = v1.x + amount*(v2.x - v1.x); + result.y = v1.y + amount*(v2.y - v1.y); + result.z = v1.z + amount*(v2.z - v1.z); + + return result; +} + +// Calculate cubic hermite interpolation between two vectors and their tangents +// as described in the GLTF 2.0 specification: https://registry.khronos.org/glTF/specs/2.0/glTF-2.0.html#interpolation-cubic +RMAPI Vector3 Vector3CubicHermite(Vector3 v1, Vector3 tangent1, Vector3 v2, Vector3 tangent2, float amount) +{ + Vector3 result = { 0 }; + + float amountPow2 = amount*amount; + float amountPow3 = amount*amount*amount; + + result.x = (2*amountPow3 - 3*amountPow2 + 1)*v1.x + (amountPow3 - 2*amountPow2 + amount)*tangent1.x + (-2*amountPow3 + 3*amountPow2)*v2.x + (amountPow3 - amountPow2)*tangent2.x; + result.y = (2*amountPow3 - 3*amountPow2 + 1)*v1.y + (amountPow3 - 2*amountPow2 + amount)*tangent1.y + (-2*amountPow3 + 3*amountPow2)*v2.y + (amountPow3 - amountPow2)*tangent2.y; + result.z = (2*amountPow3 - 3*amountPow2 + 1)*v1.z + (amountPow3 - 2*amountPow2 + amount)*tangent1.z + (-2*amountPow3 + 3*amountPow2)*v2.z + (amountPow3 - amountPow2)*tangent2.z; + + return result; +} + +// Calculate reflected vector to normal +RMAPI Vector3 Vector3Reflect(Vector3 v, Vector3 normal) +{ + Vector3 result = { 0 }; + + // I is the original vector + // N is the normal of the incident plane + // R = I - (2*N*(DotProduct[I, N])) + + float dotProduct = (v.x*normal.x + v.y*normal.y + v.z*normal.z); + + result.x = v.x - (2.0f*normal.x)*dotProduct; + result.y = v.y - (2.0f*normal.y)*dotProduct; + result.z = v.z - (2.0f*normal.z)*dotProduct; + + return result; +} + +// Get min value for each pair of components +RMAPI Vector3 Vector3Min(Vector3 v1, Vector3 v2) +{ + Vector3 result = { 0 }; + + result.x = fminf(v1.x, v2.x); + result.y = fminf(v1.y, v2.y); + result.z = fminf(v1.z, v2.z); + + return result; +} + +// Get max value for each pair of components +RMAPI Vector3 Vector3Max(Vector3 v1, Vector3 v2) +{ + Vector3 result = { 0 }; + + result.x = fmaxf(v1.x, v2.x); + result.y = fmaxf(v1.y, v2.y); + result.z = fmaxf(v1.z, v2.z); + + return result; +} + +// Compute barycenter coordinates (u, v, w) for point p with respect to triangle (a, b, c) +// NOTE: Assumes P is on the plane of the triangle +RMAPI Vector3 Vector3Barycenter(Vector3 p, Vector3 a, Vector3 b, Vector3 c) +{ + Vector3 result = { 0 }; + + Vector3 v0 = { b.x - a.x, b.y - a.y, b.z - a.z }; // Vector3Subtract(b, a) + Vector3 v1 = { c.x - a.x, c.y - a.y, c.z - a.z }; // Vector3Subtract(c, a) + Vector3 v2 = { p.x - a.x, p.y - a.y, p.z - a.z }; // Vector3Subtract(p, a) + float d00 = (v0.x*v0.x + v0.y*v0.y + v0.z*v0.z); // Vector3DotProduct(v0, v0) + float d01 = (v0.x*v1.x + v0.y*v1.y + v0.z*v1.z); // Vector3DotProduct(v0, v1) + float d11 = (v1.x*v1.x + v1.y*v1.y + v1.z*v1.z); // Vector3DotProduct(v1, v1) + float d20 = (v2.x*v0.x + v2.y*v0.y + v2.z*v0.z); // Vector3DotProduct(v2, v0) + float d21 = (v2.x*v1.x + v2.y*v1.y + v2.z*v1.z); // Vector3DotProduct(v2, v1) + + float denom = d00*d11 - d01*d01; + + result.y = (d11*d20 - d01*d21)/denom; + result.z = (d00*d21 - d01*d20)/denom; + result.x = 1.0f - (result.z + result.y); + + return result; +} + +// Projects a Vector3 from screen space into object space +// NOTE: We are avoiding calling other raymath functions despite available +RMAPI Vector3 Vector3Unproject(Vector3 source, Matrix projection, Matrix view) +{ + Vector3 result = { 0 }; + + // Calculate unprojected matrix (multiply view matrix by projection matrix) and invert it + Matrix matViewProj = { // MatrixMultiply(view, projection); + view.m0*projection.m0 + view.m1*projection.m4 + view.m2*projection.m8 + view.m3*projection.m12, + view.m0*projection.m1 + view.m1*projection.m5 + view.m2*projection.m9 + view.m3*projection.m13, + view.m0*projection.m2 + view.m1*projection.m6 + view.m2*projection.m10 + view.m3*projection.m14, + view.m0*projection.m3 + view.m1*projection.m7 + view.m2*projection.m11 + view.m3*projection.m15, + view.m4*projection.m0 + view.m5*projection.m4 + view.m6*projection.m8 + view.m7*projection.m12, + view.m4*projection.m1 + view.m5*projection.m5 + view.m6*projection.m9 + view.m7*projection.m13, + view.m4*projection.m2 + view.m5*projection.m6 + view.m6*projection.m10 + view.m7*projection.m14, + view.m4*projection.m3 + view.m5*projection.m7 + view.m6*projection.m11 + view.m7*projection.m15, + view.m8*projection.m0 + view.m9*projection.m4 + view.m10*projection.m8 + view.m11*projection.m12, + view.m8*projection.m1 + view.m9*projection.m5 + view.m10*projection.m9 + view.m11*projection.m13, + view.m8*projection.m2 + view.m9*projection.m6 + view.m10*projection.m10 + view.m11*projection.m14, + view.m8*projection.m3 + view.m9*projection.m7 + view.m10*projection.m11 + view.m11*projection.m15, + view.m12*projection.m0 + view.m13*projection.m4 + view.m14*projection.m8 + view.m15*projection.m12, + view.m12*projection.m1 + view.m13*projection.m5 + view.m14*projection.m9 + view.m15*projection.m13, + view.m12*projection.m2 + view.m13*projection.m6 + view.m14*projection.m10 + view.m15*projection.m14, + view.m12*projection.m3 + view.m13*projection.m7 + view.m14*projection.m11 + view.m15*projection.m15 }; + + // Calculate inverted matrix -> MatrixInvert(matViewProj); + // Cache the matrix values (speed optimization) + float a00 = matViewProj.m0, a01 = matViewProj.m1, a02 = matViewProj.m2, a03 = matViewProj.m3; + float a10 = matViewProj.m4, a11 = matViewProj.m5, a12 = matViewProj.m6, a13 = matViewProj.m7; + float a20 = matViewProj.m8, a21 = matViewProj.m9, a22 = matViewProj.m10, a23 = matViewProj.m11; + float a30 = matViewProj.m12, a31 = matViewProj.m13, a32 = matViewProj.m14, a33 = matViewProj.m15; + + float b00 = a00*a11 - a01*a10; + float b01 = a00*a12 - a02*a10; + float b02 = a00*a13 - a03*a10; + float b03 = a01*a12 - a02*a11; + float b04 = a01*a13 - a03*a11; + float b05 = a02*a13 - a03*a12; + float b06 = a20*a31 - a21*a30; + float b07 = a20*a32 - a22*a30; + float b08 = a20*a33 - a23*a30; + float b09 = a21*a32 - a22*a31; + float b10 = a21*a33 - a23*a31; + float b11 = a22*a33 - a23*a32; + + // Calculate the invert determinant (inlined to avoid double-caching) + float invDet = 1.0f/(b00*b11 - b01*b10 + b02*b09 + b03*b08 - b04*b07 + b05*b06); + + Matrix matViewProjInv = { + (a11*b11 - a12*b10 + a13*b09)*invDet, + (-a01*b11 + a02*b10 - a03*b09)*invDet, + (a31*b05 - a32*b04 + a33*b03)*invDet, + (-a21*b05 + a22*b04 - a23*b03)*invDet, + (-a10*b11 + a12*b08 - a13*b07)*invDet, + (a00*b11 - a02*b08 + a03*b07)*invDet, + (-a30*b05 + a32*b02 - a33*b01)*invDet, + (a20*b05 - a22*b02 + a23*b01)*invDet, + (a10*b10 - a11*b08 + a13*b06)*invDet, + (-a00*b10 + a01*b08 - a03*b06)*invDet, + (a30*b04 - a31*b02 + a33*b00)*invDet, + (-a20*b04 + a21*b02 - a23*b00)*invDet, + (-a10*b09 + a11*b07 - a12*b06)*invDet, + (a00*b09 - a01*b07 + a02*b06)*invDet, + (-a30*b03 + a31*b01 - a32*b00)*invDet, + (a20*b03 - a21*b01 + a22*b00)*invDet }; + + // Create quaternion from source point + Quaternion quat = { source.x, source.y, source.z, 1.0f }; + + // Multiply quat point by unprojecte matrix + Quaternion qtransformed = { // QuaternionTransform(quat, matViewProjInv) + matViewProjInv.m0*quat.x + matViewProjInv.m4*quat.y + matViewProjInv.m8*quat.z + matViewProjInv.m12*quat.w, + matViewProjInv.m1*quat.x + matViewProjInv.m5*quat.y + matViewProjInv.m9*quat.z + matViewProjInv.m13*quat.w, + matViewProjInv.m2*quat.x + matViewProjInv.m6*quat.y + matViewProjInv.m10*quat.z + matViewProjInv.m14*quat.w, + matViewProjInv.m3*quat.x + matViewProjInv.m7*quat.y + matViewProjInv.m11*quat.z + matViewProjInv.m15*quat.w }; + + // Normalized world points in vectors + result.x = qtransformed.x/qtransformed.w; + result.y = qtransformed.y/qtransformed.w; + result.z = qtransformed.z/qtransformed.w; + + return result; +} + +// Get Vector3 as float array +RMAPI float3 Vector3ToFloatV(Vector3 v) +{ + float3 buffer = { 0 }; + + buffer.v[0] = v.x; + buffer.v[1] = v.y; + buffer.v[2] = v.z; + + return buffer; +} + +// Invert the given vector +RMAPI Vector3 Vector3Invert(Vector3 v) +{ + Vector3 result = { 1.0f/v.x, 1.0f/v.y, 1.0f/v.z }; + + return result; +} + +// Clamp the components of the vector between +// min and max values specified by the given vectors +RMAPI Vector3 Vector3Clamp(Vector3 v, Vector3 min, Vector3 max) +{ + Vector3 result = { 0 }; + + result.x = fminf(max.x, fmaxf(min.x, v.x)); + result.y = fminf(max.y, fmaxf(min.y, v.y)); + result.z = fminf(max.z, fmaxf(min.z, v.z)); + + return result; +} + +// Clamp the magnitude of the vector between two values +RMAPI Vector3 Vector3ClampValue(Vector3 v, float min, float max) +{ + Vector3 result = v; + + float length = (v.x*v.x) + (v.y*v.y) + (v.z*v.z); + if (length > 0.0f) + { + length = sqrtf(length); + + float scale = 1; // By default, 1 as the neutral element. + if (length < min) + { + scale = min/length; + } + else if (length > max) + { + scale = max/length; + } + + result.x = v.x*scale; + result.y = v.y*scale; + result.z = v.z*scale; + } + + return result; +} + +// Check whether two given vectors are almost equal +RMAPI int Vector3Equals(Vector3 p, Vector3 q) +{ +#if !defined(EPSILON) + #define EPSILON 0.000001f +#endif + + int result = ((fabsf(p.x - q.x)) <= (EPSILON*fmaxf(1.0f, fmaxf(fabsf(p.x), fabsf(q.x))))) && + ((fabsf(p.y - q.y)) <= (EPSILON*fmaxf(1.0f, fmaxf(fabsf(p.y), fabsf(q.y))))) && + ((fabsf(p.z - q.z)) <= (EPSILON*fmaxf(1.0f, fmaxf(fabsf(p.z), fabsf(q.z))))); + + return result; +} + +// Compute the direction of a refracted ray +// v: normalized direction of the incoming ray +// n: normalized normal vector of the interface of two optical media +// r: ratio of the refractive index of the medium from where the ray comes +// to the refractive index of the medium on the other side of the surface +RMAPI Vector3 Vector3Refract(Vector3 v, Vector3 n, float r) +{ + Vector3 result = { 0 }; + + float dot = v.x*n.x + v.y*n.y + v.z*n.z; + float d = 1.0f - r*r*(1.0f - dot*dot); + + if (d >= 0.0f) + { + d = sqrtf(d); + v.x = r*v.x - (r*dot + d)*n.x; + v.y = r*v.y - (r*dot + d)*n.y; + v.z = r*v.z - (r*dot + d)*n.z; + + result = v; + } + + return result; +} + + +//---------------------------------------------------------------------------------- +// Module Functions Definition - Vector4 math +//---------------------------------------------------------------------------------- + +RMAPI Vector4 Vector4Zero(void) +{ + Vector4 result = { 0.0f, 0.0f, 0.0f, 0.0f }; + return result; +} + +RMAPI Vector4 Vector4One(void) +{ + Vector4 result = { 1.0f, 1.0f, 1.0f, 1.0f }; + return result; +} + +RMAPI Vector4 Vector4Add(Vector4 v1, Vector4 v2) +{ + Vector4 result = { + v1.x + v2.x, + v1.y + v2.y, + v1.z + v2.z, + v1.w + v2.w + }; + return result; +} + +RMAPI Vector4 Vector4AddValue(Vector4 v, float add) +{ + Vector4 result = { + v.x + add, + v.y + add, + v.z + add, + v.w + add + }; + return result; +} + +RMAPI Vector4 Vector4Subtract(Vector4 v1, Vector4 v2) +{ + Vector4 result = { + v1.x - v2.x, + v1.y - v2.y, + v1.z - v2.z, + v1.w - v2.w + }; + return result; +} + +RMAPI Vector4 Vector4SubtractValue(Vector4 v, float add) +{ + Vector4 result = { + v.x - add, + v.y - add, + v.z - add, + v.w - add + }; + return result; +} + +RMAPI float Vector4Length(Vector4 v) +{ + float result = sqrtf((v.x*v.x) + (v.y*v.y) + (v.z*v.z) + (v.w*v.w)); + return result; +} + +RMAPI float Vector4LengthSqr(Vector4 v) +{ + float result = (v.x*v.x) + (v.y*v.y) + (v.z*v.z) + (v.w*v.w); + return result; +} + +RMAPI float Vector4DotProduct(Vector4 v1, Vector4 v2) +{ + float result = (v1.x*v2.x + v1.y*v2.y + v1.z*v2.z + v1.w*v2.w); + return result; +} + +// Calculate distance between two vectors +RMAPI float Vector4Distance(Vector4 v1, Vector4 v2) +{ + float result = sqrtf( + (v1.x - v2.x)*(v1.x - v2.x) + (v1.y - v2.y)*(v1.y - v2.y) + + (v1.z - v2.z)*(v1.z - v2.z) + (v1.w - v2.w)*(v1.w - v2.w)); + return result; +} + +// Calculate square distance between two vectors +RMAPI float Vector4DistanceSqr(Vector4 v1, Vector4 v2) +{ + float result = + (v1.x - v2.x)*(v1.x - v2.x) + (v1.y - v2.y)*(v1.y - v2.y) + + (v1.z - v2.z)*(v1.z - v2.z) + (v1.w - v2.w)*(v1.w - v2.w); + + return result; +} + +RMAPI Vector4 Vector4Scale(Vector4 v, float scale) +{ + Vector4 result = { v.x*scale, v.y*scale, v.z*scale, v.w*scale }; + return result; +} + +// Multiply vector by vector +RMAPI Vector4 Vector4Multiply(Vector4 v1, Vector4 v2) +{ + Vector4 result = { v1.x*v2.x, v1.y*v2.y, v1.z*v2.z, v1.w*v2.w }; + return result; +} + +// Negate vector +RMAPI Vector4 Vector4Negate(Vector4 v) +{ + Vector4 result = { -v.x, -v.y, -v.z, -v.w }; + return result; +} + +// Divide vector by vector +RMAPI Vector4 Vector4Divide(Vector4 v1, Vector4 v2) +{ + Vector4 result = { v1.x/v2.x, v1.y/v2.y, v1.z/v2.z, v1.w/v2.w }; + return result; +} + +// Normalize provided vector +RMAPI Vector4 Vector4Normalize(Vector4 v) +{ + Vector4 result = { 0 }; + float length = sqrtf((v.x*v.x) + (v.y*v.y) + (v.z*v.z) + (v.w*v.w)); + + if (length > 0) + { + float ilength = 1.0f/length; + result.x = v.x*ilength; + result.y = v.y*ilength; + result.z = v.z*ilength; + result.w = v.w*ilength; + } + + return result; +} + +// Get min value for each pair of components +RMAPI Vector4 Vector4Min(Vector4 v1, Vector4 v2) +{ + Vector4 result = { 0 }; + + result.x = fminf(v1.x, v2.x); + result.y = fminf(v1.y, v2.y); + result.z = fminf(v1.z, v2.z); + result.w = fminf(v1.w, v2.w); + + return result; +} + +// Get max value for each pair of components +RMAPI Vector4 Vector4Max(Vector4 v1, Vector4 v2) +{ + Vector4 result = { 0 }; + + result.x = fmaxf(v1.x, v2.x); + result.y = fmaxf(v1.y, v2.y); + result.z = fmaxf(v1.z, v2.z); + result.w = fmaxf(v1.w, v2.w); + + return result; +} + +// Calculate linear interpolation between two vectors +RMAPI Vector4 Vector4Lerp(Vector4 v1, Vector4 v2, float amount) +{ + Vector4 result = { 0 }; + + result.x = v1.x + amount*(v2.x - v1.x); + result.y = v1.y + amount*(v2.y - v1.y); + result.z = v1.z + amount*(v2.z - v1.z); + result.w = v1.w + amount*(v2.w - v1.w); + + return result; +} + +// Move Vector towards target +RMAPI Vector4 Vector4MoveTowards(Vector4 v, Vector4 target, float maxDistance) +{ + Vector4 result = { 0 }; + + float dx = target.x - v.x; + float dy = target.y - v.y; + float dz = target.z - v.z; + float dw = target.w - v.w; + float value = (dx*dx) + (dy*dy) + (dz*dz) + (dw*dw); + + if ((value == 0) || ((maxDistance >= 0) && (value <= maxDistance*maxDistance))) return target; + + float dist = sqrtf(value); + + result.x = v.x + dx/dist*maxDistance; + result.y = v.y + dy/dist*maxDistance; + result.z = v.z + dz/dist*maxDistance; + result.w = v.w + dw/dist*maxDistance; + + return result; +} + +// Invert the given vector +RMAPI Vector4 Vector4Invert(Vector4 v) +{ + Vector4 result = { 1.0f/v.x, 1.0f/v.y, 1.0f/v.z, 1.0f/v.w }; + return result; +} + +// Check whether two given vectors are almost equal +RMAPI int Vector4Equals(Vector4 p, Vector4 q) +{ +#if !defined(EPSILON) + #define EPSILON 0.000001f +#endif + + int result = ((fabsf(p.x - q.x)) <= (EPSILON*fmaxf(1.0f, fmaxf(fabsf(p.x), fabsf(q.x))))) && + ((fabsf(p.y - q.y)) <= (EPSILON*fmaxf(1.0f, fmaxf(fabsf(p.y), fabsf(q.y))))) && + ((fabsf(p.z - q.z)) <= (EPSILON*fmaxf(1.0f, fmaxf(fabsf(p.z), fabsf(q.z))))) && + ((fabsf(p.w - q.w)) <= (EPSILON*fmaxf(1.0f, fmaxf(fabsf(p.w), fabsf(q.w))))); + return result; +} + + +//---------------------------------------------------------------------------------- +// Module Functions Definition - Matrix math +//---------------------------------------------------------------------------------- + +// Compute matrix determinant +RMAPI float MatrixDeterminant(Matrix mat) +{ + float result = 0.0f; + + // Cache the matrix values (speed optimization) + float a00 = mat.m0, a01 = mat.m1, a02 = mat.m2, a03 = mat.m3; + float a10 = mat.m4, a11 = mat.m5, a12 = mat.m6, a13 = mat.m7; + float a20 = mat.m8, a21 = mat.m9, a22 = mat.m10, a23 = mat.m11; + float a30 = mat.m12, a31 = mat.m13, a32 = mat.m14, a33 = mat.m15; + + result = a30*a21*a12*a03 - a20*a31*a12*a03 - a30*a11*a22*a03 + a10*a31*a22*a03 + + a20*a11*a32*a03 - a10*a21*a32*a03 - a30*a21*a02*a13 + a20*a31*a02*a13 + + a30*a01*a22*a13 - a00*a31*a22*a13 - a20*a01*a32*a13 + a00*a21*a32*a13 + + a30*a11*a02*a23 - a10*a31*a02*a23 - a30*a01*a12*a23 + a00*a31*a12*a23 + + a10*a01*a32*a23 - a00*a11*a32*a23 - a20*a11*a02*a33 + a10*a21*a02*a33 + + a20*a01*a12*a33 - a00*a21*a12*a33 - a10*a01*a22*a33 + a00*a11*a22*a33; + + return result; +} + +// Get the trace of the matrix (sum of the values along the diagonal) +RMAPI float MatrixTrace(Matrix mat) +{ + float result = (mat.m0 + mat.m5 + mat.m10 + mat.m15); + + return result; +} + +// Transposes provided matrix +RMAPI Matrix MatrixTranspose(Matrix mat) +{ + Matrix result = { 0 }; + + result.m0 = mat.m0; + result.m1 = mat.m4; + result.m2 = mat.m8; + result.m3 = mat.m12; + result.m4 = mat.m1; + result.m5 = mat.m5; + result.m6 = mat.m9; + result.m7 = mat.m13; + result.m8 = mat.m2; + result.m9 = mat.m6; + result.m10 = mat.m10; + result.m11 = mat.m14; + result.m12 = mat.m3; + result.m13 = mat.m7; + result.m14 = mat.m11; + result.m15 = mat.m15; + + return result; +} + +// Invert provided matrix +RMAPI Matrix MatrixInvert(Matrix mat) +{ + Matrix result = { 0 }; + + // Cache the matrix values (speed optimization) + float a00 = mat.m0, a01 = mat.m1, a02 = mat.m2, a03 = mat.m3; + float a10 = mat.m4, a11 = mat.m5, a12 = mat.m6, a13 = mat.m7; + float a20 = mat.m8, a21 = mat.m9, a22 = mat.m10, a23 = mat.m11; + float a30 = mat.m12, a31 = mat.m13, a32 = mat.m14, a33 = mat.m15; + + float b00 = a00*a11 - a01*a10; + float b01 = a00*a12 - a02*a10; + float b02 = a00*a13 - a03*a10; + float b03 = a01*a12 - a02*a11; + float b04 = a01*a13 - a03*a11; + float b05 = a02*a13 - a03*a12; + float b06 = a20*a31 - a21*a30; + float b07 = a20*a32 - a22*a30; + float b08 = a20*a33 - a23*a30; + float b09 = a21*a32 - a22*a31; + float b10 = a21*a33 - a23*a31; + float b11 = a22*a33 - a23*a32; + + // Calculate the invert determinant (inlined to avoid double-caching) + float invDet = 1.0f/(b00*b11 - b01*b10 + b02*b09 + b03*b08 - b04*b07 + b05*b06); + + result.m0 = (a11*b11 - a12*b10 + a13*b09)*invDet; + result.m1 = (-a01*b11 + a02*b10 - a03*b09)*invDet; + result.m2 = (a31*b05 - a32*b04 + a33*b03)*invDet; + result.m3 = (-a21*b05 + a22*b04 - a23*b03)*invDet; + result.m4 = (-a10*b11 + a12*b08 - a13*b07)*invDet; + result.m5 = (a00*b11 - a02*b08 + a03*b07)*invDet; + result.m6 = (-a30*b05 + a32*b02 - a33*b01)*invDet; + result.m7 = (a20*b05 - a22*b02 + a23*b01)*invDet; + result.m8 = (a10*b10 - a11*b08 + a13*b06)*invDet; + result.m9 = (-a00*b10 + a01*b08 - a03*b06)*invDet; + result.m10 = (a30*b04 - a31*b02 + a33*b00)*invDet; + result.m11 = (-a20*b04 + a21*b02 - a23*b00)*invDet; + result.m12 = (-a10*b09 + a11*b07 - a12*b06)*invDet; + result.m13 = (a00*b09 - a01*b07 + a02*b06)*invDet; + result.m14 = (-a30*b03 + a31*b01 - a32*b00)*invDet; + result.m15 = (a20*b03 - a21*b01 + a22*b00)*invDet; + + return result; +} + +// Get identity matrix +RMAPI Matrix MatrixIdentity(void) +{ + Matrix result = { 1.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 1.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 1.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 1.0f }; + + return result; +} + +// Add two matrices +RMAPI Matrix MatrixAdd(Matrix left, Matrix right) +{ + Matrix result = { 0 }; + + result.m0 = left.m0 + right.m0; + result.m1 = left.m1 + right.m1; + result.m2 = left.m2 + right.m2; + result.m3 = left.m3 + right.m3; + result.m4 = left.m4 + right.m4; + result.m5 = left.m5 + right.m5; + result.m6 = left.m6 + right.m6; + result.m7 = left.m7 + right.m7; + result.m8 = left.m8 + right.m8; + result.m9 = left.m9 + right.m9; + result.m10 = left.m10 + right.m10; + result.m11 = left.m11 + right.m11; + result.m12 = left.m12 + right.m12; + result.m13 = left.m13 + right.m13; + result.m14 = left.m14 + right.m14; + result.m15 = left.m15 + right.m15; + + return result; +} + +// Subtract two matrices (left - right) +RMAPI Matrix MatrixSubtract(Matrix left, Matrix right) +{ + Matrix result = { 0 }; + + result.m0 = left.m0 - right.m0; + result.m1 = left.m1 - right.m1; + result.m2 = left.m2 - right.m2; + result.m3 = left.m3 - right.m3; + result.m4 = left.m4 - right.m4; + result.m5 = left.m5 - right.m5; + result.m6 = left.m6 - right.m6; + result.m7 = left.m7 - right.m7; + result.m8 = left.m8 - right.m8; + result.m9 = left.m9 - right.m9; + result.m10 = left.m10 - right.m10; + result.m11 = left.m11 - right.m11; + result.m12 = left.m12 - right.m12; + result.m13 = left.m13 - right.m13; + result.m14 = left.m14 - right.m14; + result.m15 = left.m15 - right.m15; + + return result; +} + +// Get two matrix multiplication +// NOTE: When multiplying matrices... the order matters! +RMAPI Matrix MatrixMultiply(Matrix left, Matrix right) +{ + Matrix result = { 0 }; + + result.m0 = left.m0*right.m0 + left.m1*right.m4 + left.m2*right.m8 + left.m3*right.m12; + result.m1 = left.m0*right.m1 + left.m1*right.m5 + left.m2*right.m9 + left.m3*right.m13; + result.m2 = left.m0*right.m2 + left.m1*right.m6 + left.m2*right.m10 + left.m3*right.m14; + result.m3 = left.m0*right.m3 + left.m1*right.m7 + left.m2*right.m11 + left.m3*right.m15; + result.m4 = left.m4*right.m0 + left.m5*right.m4 + left.m6*right.m8 + left.m7*right.m12; + result.m5 = left.m4*right.m1 + left.m5*right.m5 + left.m6*right.m9 + left.m7*right.m13; + result.m6 = left.m4*right.m2 + left.m5*right.m6 + left.m6*right.m10 + left.m7*right.m14; + result.m7 = left.m4*right.m3 + left.m5*right.m7 + left.m6*right.m11 + left.m7*right.m15; + result.m8 = left.m8*right.m0 + left.m9*right.m4 + left.m10*right.m8 + left.m11*right.m12; + result.m9 = left.m8*right.m1 + left.m9*right.m5 + left.m10*right.m9 + left.m11*right.m13; + result.m10 = left.m8*right.m2 + left.m9*right.m6 + left.m10*right.m10 + left.m11*right.m14; + result.m11 = left.m8*right.m3 + left.m9*right.m7 + left.m10*right.m11 + left.m11*right.m15; + result.m12 = left.m12*right.m0 + left.m13*right.m4 + left.m14*right.m8 + left.m15*right.m12; + result.m13 = left.m12*right.m1 + left.m13*right.m5 + left.m14*right.m9 + left.m15*right.m13; + result.m14 = left.m12*right.m2 + left.m13*right.m6 + left.m14*right.m10 + left.m15*right.m14; + result.m15 = left.m12*right.m3 + left.m13*right.m7 + left.m14*right.m11 + left.m15*right.m15; + + return result; +} + +// Get translation matrix +RMAPI Matrix MatrixTranslate(float x, float y, float z) +{ + Matrix result = { 1.0f, 0.0f, 0.0f, x, + 0.0f, 1.0f, 0.0f, y, + 0.0f, 0.0f, 1.0f, z, + 0.0f, 0.0f, 0.0f, 1.0f }; + + return result; +} + +// Create rotation matrix from axis and angle +// NOTE: Angle should be provided in radians +RMAPI Matrix MatrixRotate(Vector3 axis, float angle) +{ + Matrix result = { 0 }; + + float x = axis.x, y = axis.y, z = axis.z; + + float lengthSquared = x*x + y*y + z*z; + + if ((lengthSquared != 1.0f) && (lengthSquared != 0.0f)) + { + float ilength = 1.0f/sqrtf(lengthSquared); + x *= ilength; + y *= ilength; + z *= ilength; + } + + float sinres = sinf(angle); + float cosres = cosf(angle); + float t = 1.0f - cosres; + + result.m0 = x*x*t + cosres; + result.m1 = y*x*t + z*sinres; + result.m2 = z*x*t - y*sinres; + result.m3 = 0.0f; + + result.m4 = x*y*t - z*sinres; + result.m5 = y*y*t + cosres; + result.m6 = z*y*t + x*sinres; + result.m7 = 0.0f; + + result.m8 = x*z*t + y*sinres; + result.m9 = y*z*t - x*sinres; + result.m10 = z*z*t + cosres; + result.m11 = 0.0f; + + result.m12 = 0.0f; + result.m13 = 0.0f; + result.m14 = 0.0f; + result.m15 = 1.0f; + + return result; +} + +// Get x-rotation matrix +// NOTE: Angle must be provided in radians +RMAPI Matrix MatrixRotateX(float angle) +{ + Matrix result = { 1.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 1.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 1.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 1.0f }; // MatrixIdentity() + + float cosres = cosf(angle); + float sinres = sinf(angle); + + result.m5 = cosres; + result.m6 = sinres; + result.m9 = -sinres; + result.m10 = cosres; + + return result; +} + +// Get y-rotation matrix +// NOTE: Angle must be provided in radians +RMAPI Matrix MatrixRotateY(float angle) +{ + Matrix result = { 1.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 1.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 1.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 1.0f }; // MatrixIdentity() + + float cosres = cosf(angle); + float sinres = sinf(angle); + + result.m0 = cosres; + result.m2 = -sinres; + result.m8 = sinres; + result.m10 = cosres; + + return result; +} + +// Get z-rotation matrix +// NOTE: Angle must be provided in radians +RMAPI Matrix MatrixRotateZ(float angle) +{ + Matrix result = { 1.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 1.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 1.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 1.0f }; // MatrixIdentity() + + float cosres = cosf(angle); + float sinres = sinf(angle); + + result.m0 = cosres; + result.m1 = sinres; + result.m4 = -sinres; + result.m5 = cosres; + + return result; +} + + +// Get xyz-rotation matrix +// NOTE: Angle must be provided in radians +RMAPI Matrix MatrixRotateXYZ(Vector3 angle) +{ + Matrix result = { 1.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 1.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 1.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 1.0f }; // MatrixIdentity() + + float cosz = cosf(-angle.z); + float sinz = sinf(-angle.z); + float cosy = cosf(-angle.y); + float siny = sinf(-angle.y); + float cosx = cosf(-angle.x); + float sinx = sinf(-angle.x); + + result.m0 = cosz*cosy; + result.m1 = (cosz*siny*sinx) - (sinz*cosx); + result.m2 = (cosz*siny*cosx) + (sinz*sinx); + + result.m4 = sinz*cosy; + result.m5 = (sinz*siny*sinx) + (cosz*cosx); + result.m6 = (sinz*siny*cosx) - (cosz*sinx); + + result.m8 = -siny; + result.m9 = cosy*sinx; + result.m10= cosy*cosx; + + return result; +} + +// Get zyx-rotation matrix +// NOTE: Angle must be provided in radians +RMAPI Matrix MatrixRotateZYX(Vector3 angle) +{ + Matrix result = { 0 }; + + float cz = cosf(angle.z); + float sz = sinf(angle.z); + float cy = cosf(angle.y); + float sy = sinf(angle.y); + float cx = cosf(angle.x); + float sx = sinf(angle.x); + + result.m0 = cz*cy; + result.m4 = cz*sy*sx - cx*sz; + result.m8 = sz*sx + cz*cx*sy; + result.m12 = 0; + + result.m1 = cy*sz; + result.m5 = cz*cx + sz*sy*sx; + result.m9 = cx*sz*sy - cz*sx; + result.m13 = 0; + + result.m2 = -sy; + result.m6 = cy*sx; + result.m10 = cy*cx; + result.m14 = 0; + + result.m3 = 0; + result.m7 = 0; + result.m11 = 0; + result.m15 = 1; + + return result; +} + +// Get scaling matrix +RMAPI Matrix MatrixScale(float x, float y, float z) +{ + Matrix result = { x, 0.0f, 0.0f, 0.0f, + 0.0f, y, 0.0f, 0.0f, + 0.0f, 0.0f, z, 0.0f, + 0.0f, 0.0f, 0.0f, 1.0f }; + + return result; +} + +// Get perspective projection matrix +RMAPI Matrix MatrixFrustum(double left, double right, double bottom, double top, double nearPlane, double farPlane) +{ + Matrix result = { 0 }; + + float rl = (float)(right - left); + float tb = (float)(top - bottom); + float fn = (float)(farPlane - nearPlane); + + result.m0 = ((float)nearPlane*2.0f)/rl; + result.m1 = 0.0f; + result.m2 = 0.0f; + result.m3 = 0.0f; + + result.m4 = 0.0f; + result.m5 = ((float)nearPlane*2.0f)/tb; + result.m6 = 0.0f; + result.m7 = 0.0f; + + result.m8 = ((float)right + (float)left)/rl; + result.m9 = ((float)top + (float)bottom)/tb; + result.m10 = -((float)farPlane + (float)nearPlane)/fn; + result.m11 = -1.0f; + + result.m12 = 0.0f; + result.m13 = 0.0f; + result.m14 = -((float)farPlane*(float)nearPlane*2.0f)/fn; + result.m15 = 0.0f; + + return result; +} + +// Get perspective projection matrix +// NOTE: Fovy angle must be provided in radians +RMAPI Matrix MatrixPerspective(double fovY, double aspect, double nearPlane, double farPlane) +{ + Matrix result = { 0 }; + + double top = nearPlane*tan(fovY*0.5); + double bottom = -top; + double right = top*aspect; + double left = -right; + + // MatrixFrustum(-right, right, -top, top, near, far); + float rl = (float)(right - left); + float tb = (float)(top - bottom); + float fn = (float)(farPlane - nearPlane); + + result.m0 = ((float)nearPlane*2.0f)/rl; + result.m5 = ((float)nearPlane*2.0f)/tb; + result.m8 = ((float)right + (float)left)/rl; + result.m9 = ((float)top + (float)bottom)/tb; + result.m10 = -((float)farPlane + (float)nearPlane)/fn; + result.m11 = -1.0f; + result.m14 = -((float)farPlane*(float)nearPlane*2.0f)/fn; + + return result; +} + +// Get orthographic projection matrix +RMAPI Matrix MatrixOrtho(double left, double right, double bottom, double top, double nearPlane, double farPlane) +{ + Matrix result = { 0 }; + + float rl = (float)(right - left); + float tb = (float)(top - bottom); + float fn = (float)(farPlane - nearPlane); + + result.m0 = 2.0f/rl; + result.m1 = 0.0f; + result.m2 = 0.0f; + result.m3 = 0.0f; + result.m4 = 0.0f; + result.m5 = 2.0f/tb; + result.m6 = 0.0f; + result.m7 = 0.0f; + result.m8 = 0.0f; + result.m9 = 0.0f; + result.m10 = -2.0f/fn; + result.m11 = 0.0f; + result.m12 = -((float)left + (float)right)/rl; + result.m13 = -((float)top + (float)bottom)/tb; + result.m14 = -((float)farPlane + (float)nearPlane)/fn; + result.m15 = 1.0f; + + return result; +} + +// Get camera look-at matrix (view matrix) +RMAPI Matrix MatrixLookAt(Vector3 eye, Vector3 target, Vector3 up) +{ + Matrix result = { 0 }; + + float length = 0.0f; + float ilength = 0.0f; + + // Vector3Subtract(eye, target) + Vector3 vz = { eye.x - target.x, eye.y - target.y, eye.z - target.z }; + + // Vector3Normalize(vz) + Vector3 v = vz; + length = sqrtf(v.x*v.x + v.y*v.y + v.z*v.z); + if (length == 0.0f) length = 1.0f; + ilength = 1.0f/length; + vz.x *= ilength; + vz.y *= ilength; + vz.z *= ilength; + + // Vector3CrossProduct(up, vz) + Vector3 vx = { up.y*vz.z - up.z*vz.y, up.z*vz.x - up.x*vz.z, up.x*vz.y - up.y*vz.x }; + + // Vector3Normalize(x) + v = vx; + length = sqrtf(v.x*v.x + v.y*v.y + v.z*v.z); + if (length == 0.0f) length = 1.0f; + ilength = 1.0f/length; + vx.x *= ilength; + vx.y *= ilength; + vx.z *= ilength; + + // Vector3CrossProduct(vz, vx) + Vector3 vy = { vz.y*vx.z - vz.z*vx.y, vz.z*vx.x - vz.x*vx.z, vz.x*vx.y - vz.y*vx.x }; + + result.m0 = vx.x; + result.m1 = vy.x; + result.m2 = vz.x; + result.m3 = 0.0f; + result.m4 = vx.y; + result.m5 = vy.y; + result.m6 = vz.y; + result.m7 = 0.0f; + result.m8 = vx.z; + result.m9 = vy.z; + result.m10 = vz.z; + result.m11 = 0.0f; + result.m12 = -(vx.x*eye.x + vx.y*eye.y + vx.z*eye.z); // Vector3DotProduct(vx, eye) + result.m13 = -(vy.x*eye.x + vy.y*eye.y + vy.z*eye.z); // Vector3DotProduct(vy, eye) + result.m14 = -(vz.x*eye.x + vz.y*eye.y + vz.z*eye.z); // Vector3DotProduct(vz, eye) + result.m15 = 1.0f; + + return result; +} + +// Get float array of matrix data +RMAPI float16 MatrixToFloatV(Matrix mat) +{ + float16 result = { 0 }; + + result.v[0] = mat.m0; + result.v[1] = mat.m1; + result.v[2] = mat.m2; + result.v[3] = mat.m3; + result.v[4] = mat.m4; + result.v[5] = mat.m5; + result.v[6] = mat.m6; + result.v[7] = mat.m7; + result.v[8] = mat.m8; + result.v[9] = mat.m9; + result.v[10] = mat.m10; + result.v[11] = mat.m11; + result.v[12] = mat.m12; + result.v[13] = mat.m13; + result.v[14] = mat.m14; + result.v[15] = mat.m15; + + return result; +} + +//---------------------------------------------------------------------------------- +// Module Functions Definition - Quaternion math +//---------------------------------------------------------------------------------- + +// Add two quaternions +RMAPI Quaternion QuaternionAdd(Quaternion q1, Quaternion q2) +{ + Quaternion result = {q1.x + q2.x, q1.y + q2.y, q1.z + q2.z, q1.w + q2.w}; + + return result; +} + +// Add quaternion and float value +RMAPI Quaternion QuaternionAddValue(Quaternion q, float add) +{ + Quaternion result = {q.x + add, q.y + add, q.z + add, q.w + add}; + + return result; +} + +// Subtract two quaternions +RMAPI Quaternion QuaternionSubtract(Quaternion q1, Quaternion q2) +{ + Quaternion result = {q1.x - q2.x, q1.y - q2.y, q1.z - q2.z, q1.w - q2.w}; + + return result; +} + +// Subtract quaternion and float value +RMAPI Quaternion QuaternionSubtractValue(Quaternion q, float sub) +{ + Quaternion result = {q.x - sub, q.y - sub, q.z - sub, q.w - sub}; + + return result; +} + +// Get identity quaternion +RMAPI Quaternion QuaternionIdentity(void) +{ + Quaternion result = { 0.0f, 0.0f, 0.0f, 1.0f }; + + return result; +} + +// Computes the length of a quaternion +RMAPI float QuaternionLength(Quaternion q) +{ + float result = sqrtf(q.x*q.x + q.y*q.y + q.z*q.z + q.w*q.w); + + return result; +} + +// Normalize provided quaternion +RMAPI Quaternion QuaternionNormalize(Quaternion q) +{ + Quaternion result = { 0 }; + + float length = sqrtf(q.x*q.x + q.y*q.y + q.z*q.z + q.w*q.w); + if (length == 0.0f) length = 1.0f; + float ilength = 1.0f/length; + + result.x = q.x*ilength; + result.y = q.y*ilength; + result.z = q.z*ilength; + result.w = q.w*ilength; + + return result; +} + +// Invert provided quaternion +RMAPI Quaternion QuaternionInvert(Quaternion q) +{ + Quaternion result = q; + + float lengthSq = q.x*q.x + q.y*q.y + q.z*q.z + q.w*q.w; + + if (lengthSq != 0.0f) + { + float invLength = 1.0f/lengthSq; + + result.x *= -invLength; + result.y *= -invLength; + result.z *= -invLength; + result.w *= invLength; + } + + return result; +} + +// Calculate two quaternion multiplication +RMAPI Quaternion QuaternionMultiply(Quaternion q1, Quaternion q2) +{ + Quaternion result = { 0 }; + + float qax = q1.x, qay = q1.y, qaz = q1.z, qaw = q1.w; + float qbx = q2.x, qby = q2.y, qbz = q2.z, qbw = q2.w; + + result.x = qax*qbw + qaw*qbx + qay*qbz - qaz*qby; + result.y = qay*qbw + qaw*qby + qaz*qbx - qax*qbz; + result.z = qaz*qbw + qaw*qbz + qax*qby - qay*qbx; + result.w = qaw*qbw - qax*qbx - qay*qby - qaz*qbz; + + return result; +} + +// Scale quaternion by float value +RMAPI Quaternion QuaternionScale(Quaternion q, float mul) +{ + Quaternion result = { 0 }; + + result.x = q.x*mul; + result.y = q.y*mul; + result.z = q.z*mul; + result.w = q.w*mul; + + return result; +} + +// Divide two quaternions +RMAPI Quaternion QuaternionDivide(Quaternion q1, Quaternion q2) +{ + Quaternion result = { q1.x/q2.x, q1.y/q2.y, q1.z/q2.z, q1.w/q2.w }; + + return result; +} + +// Calculate linear interpolation between two quaternions +RMAPI Quaternion QuaternionLerp(Quaternion q1, Quaternion q2, float amount) +{ + Quaternion result = { 0 }; + + result.x = q1.x + amount*(q2.x - q1.x); + result.y = q1.y + amount*(q2.y - q1.y); + result.z = q1.z + amount*(q2.z - q1.z); + result.w = q1.w + amount*(q2.w - q1.w); + + return result; +} + +// Calculate slerp-optimized interpolation between two quaternions +RMAPI Quaternion QuaternionNlerp(Quaternion q1, Quaternion q2, float amount) +{ + Quaternion result = { 0 }; + + // QuaternionLerp(q1, q2, amount) + result.x = q1.x + amount*(q2.x - q1.x); + result.y = q1.y + amount*(q2.y - q1.y); + result.z = q1.z + amount*(q2.z - q1.z); + result.w = q1.w + amount*(q2.w - q1.w); + + // QuaternionNormalize(q); + Quaternion q = result; + float length = sqrtf(q.x*q.x + q.y*q.y + q.z*q.z + q.w*q.w); + if (length == 0.0f) length = 1.0f; + float ilength = 1.0f/length; + + result.x = q.x*ilength; + result.y = q.y*ilength; + result.z = q.z*ilength; + result.w = q.w*ilength; + + return result; +} + +// Calculates spherical linear interpolation between two quaternions +RMAPI Quaternion QuaternionSlerp(Quaternion q1, Quaternion q2, float amount) +{ + Quaternion result = { 0 }; + +#if !defined(EPSILON) + #define EPSILON 0.000001f +#endif + + float cosHalfTheta = q1.x*q2.x + q1.y*q2.y + q1.z*q2.z + q1.w*q2.w; + + if (cosHalfTheta < 0) + { + q2.x = -q2.x; q2.y = -q2.y; q2.z = -q2.z; q2.w = -q2.w; + cosHalfTheta = -cosHalfTheta; + } + + if (fabsf(cosHalfTheta) >= 1.0f) result = q1; + else if (cosHalfTheta > 0.95f) result = QuaternionNlerp(q1, q2, amount); + else + { + float halfTheta = acosf(cosHalfTheta); + float sinHalfTheta = sqrtf(1.0f - cosHalfTheta*cosHalfTheta); + + if (fabsf(sinHalfTheta) < EPSILON) + { + result.x = (q1.x*0.5f + q2.x*0.5f); + result.y = (q1.y*0.5f + q2.y*0.5f); + result.z = (q1.z*0.5f + q2.z*0.5f); + result.w = (q1.w*0.5f + q2.w*0.5f); + } + else + { + float ratioA = sinf((1 - amount)*halfTheta)/sinHalfTheta; + float ratioB = sinf(amount*halfTheta)/sinHalfTheta; + + result.x = (q1.x*ratioA + q2.x*ratioB); + result.y = (q1.y*ratioA + q2.y*ratioB); + result.z = (q1.z*ratioA + q2.z*ratioB); + result.w = (q1.w*ratioA + q2.w*ratioB); + } + } + + return result; +} + +// Calculate quaternion cubic spline interpolation using Cubic Hermite Spline algorithm +// as described in the GLTF 2.0 specification: https://registry.khronos.org/glTF/specs/2.0/glTF-2.0.html#interpolation-cubic +RMAPI Quaternion QuaternionCubicHermiteSpline(Quaternion q1, Quaternion outTangent1, Quaternion q2, Quaternion inTangent2, float t) +{ + float t2 = t*t; + float t3 = t2*t; + float h00 = 2*t3 - 3*t2 + 1; + float h10 = t3 - 2*t2 + t; + float h01 = -2*t3 + 3*t2; + float h11 = t3 - t2; + + Quaternion p0 = QuaternionScale(q1, h00); + Quaternion m0 = QuaternionScale(outTangent1, h10); + Quaternion p1 = QuaternionScale(q2, h01); + Quaternion m1 = QuaternionScale(inTangent2, h11); + + Quaternion result = { 0 }; + + result = QuaternionAdd(p0, m0); + result = QuaternionAdd(result, p1); + result = QuaternionAdd(result, m1); + result = QuaternionNormalize(result); + + return result; +} + +// Calculate quaternion based on the rotation from one vector to another +RMAPI Quaternion QuaternionFromVector3ToVector3(Vector3 from, Vector3 to) +{ + Quaternion result = { 0 }; + + float cos2Theta = (from.x*to.x + from.y*to.y + from.z*to.z); // Vector3DotProduct(from, to) + Vector3 cross = { from.y*to.z - from.z*to.y, from.z*to.x - from.x*to.z, from.x*to.y - from.y*to.x }; // Vector3CrossProduct(from, to) + + result.x = cross.x; + result.y = cross.y; + result.z = cross.z; + result.w = 1.0f + cos2Theta; + + // QuaternionNormalize(q); + // NOTE: Normalize to essentially nlerp the original and identity to 0.5 + Quaternion q = result; + float length = sqrtf(q.x*q.x + q.y*q.y + q.z*q.z + q.w*q.w); + if (length == 0.0f) length = 1.0f; + float ilength = 1.0f/length; + + result.x = q.x*ilength; + result.y = q.y*ilength; + result.z = q.z*ilength; + result.w = q.w*ilength; + + return result; +} + +// Get a quaternion for a given rotation matrix +RMAPI Quaternion QuaternionFromMatrix(Matrix mat) +{ + Quaternion result = { 0 }; + + float fourWSquaredMinus1 = mat.m0 + mat.m5 + mat.m10; + float fourXSquaredMinus1 = mat.m0 - mat.m5 - mat.m10; + float fourYSquaredMinus1 = mat.m5 - mat.m0 - mat.m10; + float fourZSquaredMinus1 = mat.m10 - mat.m0 - mat.m5; + + int biggestIndex = 0; + float fourBiggestSquaredMinus1 = fourWSquaredMinus1; + if (fourXSquaredMinus1 > fourBiggestSquaredMinus1) + { + fourBiggestSquaredMinus1 = fourXSquaredMinus1; + biggestIndex = 1; + } + + if (fourYSquaredMinus1 > fourBiggestSquaredMinus1) + { + fourBiggestSquaredMinus1 = fourYSquaredMinus1; + biggestIndex = 2; + } + + if (fourZSquaredMinus1 > fourBiggestSquaredMinus1) + { + fourBiggestSquaredMinus1 = fourZSquaredMinus1; + biggestIndex = 3; + } + + float biggestVal = sqrtf(fourBiggestSquaredMinus1 + 1.0f)*0.5f; + float mult = 0.25f/biggestVal; + + switch (biggestIndex) + { + case 0: + result.w = biggestVal; + result.x = (mat.m6 - mat.m9)*mult; + result.y = (mat.m8 - mat.m2)*mult; + result.z = (mat.m1 - mat.m4)*mult; + break; + case 1: + result.x = biggestVal; + result.w = (mat.m6 - mat.m9)*mult; + result.y = (mat.m1 + mat.m4)*mult; + result.z = (mat.m8 + mat.m2)*mult; + break; + case 2: + result.y = biggestVal; + result.w = (mat.m8 - mat.m2)*mult; + result.x = (mat.m1 + mat.m4)*mult; + result.z = (mat.m6 + mat.m9)*mult; + break; + case 3: + result.z = biggestVal; + result.w = (mat.m1 - mat.m4)*mult; + result.x = (mat.m8 + mat.m2)*mult; + result.y = (mat.m6 + mat.m9)*mult; + break; + } + + return result; +} + +// Get a matrix for a given quaternion +RMAPI Matrix QuaternionToMatrix(Quaternion q) +{ + Matrix result = { 1.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 1.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 1.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 1.0f }; // MatrixIdentity() + + float a2 = q.x*q.x; + float b2 = q.y*q.y; + float c2 = q.z*q.z; + float ac = q.x*q.z; + float ab = q.x*q.y; + float bc = q.y*q.z; + float ad = q.w*q.x; + float bd = q.w*q.y; + float cd = q.w*q.z; + + result.m0 = 1 - 2*(b2 + c2); + result.m1 = 2*(ab + cd); + result.m2 = 2*(ac - bd); + + result.m4 = 2*(ab - cd); + result.m5 = 1 - 2*(a2 + c2); + result.m6 = 2*(bc + ad); + + result.m8 = 2*(ac + bd); + result.m9 = 2*(bc - ad); + result.m10 = 1 - 2*(a2 + b2); + + return result; +} + +// Get rotation quaternion for an angle and axis +// NOTE: Angle must be provided in radians +RMAPI Quaternion QuaternionFromAxisAngle(Vector3 axis, float angle) +{ + Quaternion result = { 0.0f, 0.0f, 0.0f, 1.0f }; + + float axisLength = sqrtf(axis.x*axis.x + axis.y*axis.y + axis.z*axis.z); + + if (axisLength != 0.0f) + { + angle *= 0.5f; + + float length = 0.0f; + float ilength = 0.0f; + + // Vector3Normalize(axis) + length = axisLength; + if (length == 0.0f) length = 1.0f; + ilength = 1.0f/length; + axis.x *= ilength; + axis.y *= ilength; + axis.z *= ilength; + + float sinres = sinf(angle); + float cosres = cosf(angle); + + result.x = axis.x*sinres; + result.y = axis.y*sinres; + result.z = axis.z*sinres; + result.w = cosres; + + // QuaternionNormalize(q); + Quaternion q = result; + length = sqrtf(q.x*q.x + q.y*q.y + q.z*q.z + q.w*q.w); + if (length == 0.0f) length = 1.0f; + ilength = 1.0f/length; + result.x = q.x*ilength; + result.y = q.y*ilength; + result.z = q.z*ilength; + result.w = q.w*ilength; + } + + return result; +} + +// Get the rotation angle and axis for a given quaternion +RMAPI void QuaternionToAxisAngle(Quaternion q, Vector3 *outAxis, float *outAngle) +{ + if (fabsf(q.w) > 1.0f) + { + // QuaternionNormalize(q); + float length = sqrtf(q.x*q.x + q.y*q.y + q.z*q.z + q.w*q.w); + if (length == 0.0f) length = 1.0f; + float ilength = 1.0f/length; + + q.x = q.x*ilength; + q.y = q.y*ilength; + q.z = q.z*ilength; + q.w = q.w*ilength; + } + + Vector3 resAxis = { 0.0f, 0.0f, 0.0f }; + float resAngle = 2.0f*acosf(q.w); + float den = sqrtf(1.0f - q.w*q.w); + + if (den > EPSILON) + { + resAxis.x = q.x/den; + resAxis.y = q.y/den; + resAxis.z = q.z/den; + } + else + { + // This occurs when the angle is zero. + // Not a problem: just set an arbitrary normalized axis. + resAxis.x = 1.0f; + } + + *outAxis = resAxis; + *outAngle = resAngle; +} + +// Get the quaternion equivalent to Euler angles +// NOTE: Rotation order is ZYX +RMAPI Quaternion QuaternionFromEuler(float pitch, float yaw, float roll) +{ + Quaternion result = { 0 }; + + float x0 = cosf(pitch*0.5f); + float x1 = sinf(pitch*0.5f); + float y0 = cosf(yaw*0.5f); + float y1 = sinf(yaw*0.5f); + float z0 = cosf(roll*0.5f); + float z1 = sinf(roll*0.5f); + + result.x = x1*y0*z0 - x0*y1*z1; + result.y = x0*y1*z0 + x1*y0*z1; + result.z = x0*y0*z1 - x1*y1*z0; + result.w = x0*y0*z0 + x1*y1*z1; + + return result; +} + +// Get the Euler angles equivalent to quaternion (roll, pitch, yaw) +// NOTE: Angles are returned in a Vector3 struct in radians +RMAPI Vector3 QuaternionToEuler(Quaternion q) +{ + Vector3 result = { 0 }; + + // Roll (x-axis rotation) + float x0 = 2.0f*(q.w*q.x + q.y*q.z); + float x1 = 1.0f - 2.0f*(q.x*q.x + q.y*q.y); + result.x = atan2f(x0, x1); + + // Pitch (y-axis rotation) + float y0 = 2.0f*(q.w*q.y - q.z*q.x); + y0 = y0 > 1.0f ? 1.0f : y0; + y0 = y0 < -1.0f ? -1.0f : y0; + result.y = asinf(y0); + + // Yaw (z-axis rotation) + float z0 = 2.0f*(q.w*q.z + q.x*q.y); + float z1 = 1.0f - 2.0f*(q.y*q.y + q.z*q.z); + result.z = atan2f(z0, z1); + + return result; +} + +// Transform a quaternion given a transformation matrix +RMAPI Quaternion QuaternionTransform(Quaternion q, Matrix mat) +{ + Quaternion result = { 0 }; + + result.x = mat.m0*q.x + mat.m4*q.y + mat.m8*q.z + mat.m12*q.w; + result.y = mat.m1*q.x + mat.m5*q.y + mat.m9*q.z + mat.m13*q.w; + result.z = mat.m2*q.x + mat.m6*q.y + mat.m10*q.z + mat.m14*q.w; + result.w = mat.m3*q.x + mat.m7*q.y + mat.m11*q.z + mat.m15*q.w; + + return result; +} + +// Check whether two given quaternions are almost equal +RMAPI int QuaternionEquals(Quaternion p, Quaternion q) +{ +#if !defined(EPSILON) + #define EPSILON 0.000001f +#endif + + int result = (((fabsf(p.x - q.x)) <= (EPSILON*fmaxf(1.0f, fmaxf(fabsf(p.x), fabsf(q.x))))) && + ((fabsf(p.y - q.y)) <= (EPSILON*fmaxf(1.0f, fmaxf(fabsf(p.y), fabsf(q.y))))) && + ((fabsf(p.z - q.z)) <= (EPSILON*fmaxf(1.0f, fmaxf(fabsf(p.z), fabsf(q.z))))) && + ((fabsf(p.w - q.w)) <= (EPSILON*fmaxf(1.0f, fmaxf(fabsf(p.w), fabsf(q.w)))))) || + (((fabsf(p.x + q.x)) <= (EPSILON*fmaxf(1.0f, fmaxf(fabsf(p.x), fabsf(q.x))))) && + ((fabsf(p.y + q.y)) <= (EPSILON*fmaxf(1.0f, fmaxf(fabsf(p.y), fabsf(q.y))))) && + ((fabsf(p.z + q.z)) <= (EPSILON*fmaxf(1.0f, fmaxf(fabsf(p.z), fabsf(q.z))))) && + ((fabsf(p.w + q.w)) <= (EPSILON*fmaxf(1.0f, fmaxf(fabsf(p.w), fabsf(q.w)))))); + + return result; +} + +// Decompose a transformation matrix into its rotational, translational and scaling components +RMAPI void MatrixDecompose(Matrix mat, Vector3 *translation, Quaternion *rotation, Vector3 *scale) +{ + // Extract translation. + translation->x = mat.m12; + translation->y = mat.m13; + translation->z = mat.m14; + + // Extract upper-left for determinant computation + const float a = mat.m0; + const float b = mat.m4; + const float c = mat.m8; + const float d = mat.m1; + const float e = mat.m5; + const float f = mat.m9; + const float g = mat.m2; + const float h = mat.m6; + const float i = mat.m10; + const float A = e*i - f*h; + const float B = f*g - d*i; + const float C = d*h - e*g; + + // Extract scale + const float det = a*A + b*B + c*C; + Vector3 abc = { a, b, c }; + Vector3 def = { d, e, f }; + Vector3 ghi = { g, h, i }; + + float scalex = Vector3Length(abc); + float scaley = Vector3Length(def); + float scalez = Vector3Length(ghi); + Vector3 s = { scalex, scaley, scalez }; + + if (det < 0) s = Vector3Negate(s); + + *scale = s; + + // Remove scale from the matrix if it is not close to zero + Matrix clone = mat; + if (!FloatEquals(det, 0)) + { + clone.m0 /= s.x; + clone.m4 /= s.x; + clone.m8 /= s.x; + clone.m1 /= s.y; + clone.m5 /= s.y; + clone.m9 /= s.y; + clone.m2 /= s.z; + clone.m6 /= s.z; + clone.m10 /= s.z; + + // Extract rotation + *rotation = QuaternionFromMatrix(clone); + } + else + { + // Set to identity if close to zero + *rotation = QuaternionIdentity(); + } +} + +#if defined(__cplusplus) && !defined(RAYMATH_DISABLE_CPP_OPERATORS) + +// Optional C++ math operators +//------------------------------------------------------------------------------- + +// Vector2 operators +static constexpr Vector2 Vector2Zeros = { 0, 0 }; +static constexpr Vector2 Vector2Ones = { 1, 1 }; +static constexpr Vector2 Vector2UnitX = { 1, 0 }; +static constexpr Vector2 Vector2UnitY = { 0, 1 }; + +inline Vector2 operator + (const Vector2& lhs, const Vector2& rhs) +{ + return Vector2Add(lhs, rhs); +} + +inline const Vector2& operator += (Vector2& lhs, const Vector2& rhs) +{ + lhs = Vector2Add(lhs, rhs); + return lhs; +} + +inline Vector2 operator - (const Vector2& lhs, const Vector2& rhs) +{ + return Vector2Subtract(lhs, rhs); +} + +inline const Vector2& operator -= (Vector2& lhs, const Vector2& rhs) +{ + lhs = Vector2Subtract(lhs, rhs); + return lhs; +} + +inline Vector2 operator * (const Vector2& lhs, const float& rhs) +{ + return Vector2Scale(lhs, rhs); +} + +inline const Vector2& operator *= (Vector2& lhs, const float& rhs) +{ + lhs = Vector2Scale(lhs, rhs); + return lhs; +} + +inline Vector2 operator * (const Vector2& lhs, const Vector2& rhs) +{ + return Vector2Multiply(lhs, rhs); +} + +inline const Vector2& operator *= (Vector2& lhs, const Vector2& rhs) +{ + lhs = Vector2Multiply(lhs, rhs); + return lhs; +} + +inline Vector2 operator * (const Vector2& lhs, const Matrix& rhs) +{ + return Vector2Transform(lhs, rhs); +} + +inline const Vector2& operator -= (Vector2& lhs, const Matrix& rhs) +{ + lhs = Vector2Transform(lhs, rhs); + return lhs; +} + +inline Vector2 operator / (const Vector2& lhs, const float& rhs) +{ + return Vector2Scale(lhs, 1.0f / rhs); +} + +inline const Vector2& operator /= (Vector2& lhs, const float& rhs) +{ + lhs = Vector2Scale(lhs, rhs); + return lhs; +} + +inline Vector2 operator / (const Vector2& lhs, const Vector2& rhs) +{ + return Vector2Divide(lhs, rhs); +} + +inline const Vector2& operator /= (Vector2& lhs, const Vector2& rhs) +{ + lhs = Vector2Divide(lhs, rhs); + return lhs; +} + +inline bool operator == (const Vector2& lhs, const Vector2& rhs) +{ + return FloatEquals(lhs.x, rhs.x) && FloatEquals(lhs.y, rhs.y); +} + +inline bool operator != (const Vector2& lhs, const Vector2& rhs) +{ + return !FloatEquals(lhs.x, rhs.x) || !FloatEquals(lhs.y, rhs.y); +} + +// Vector3 operators +static constexpr Vector3 Vector3Zeros = { 0, 0, 0 }; +static constexpr Vector3 Vector3Ones = { 1, 1, 1 }; +static constexpr Vector3 Vector3UnitX = { 1, 0, 0 }; +static constexpr Vector3 Vector3UnitY = { 0, 1, 0 }; +static constexpr Vector3 Vector3UnitZ = { 0, 0, 1 }; + +inline Vector3 operator + (const Vector3& lhs, const Vector3& rhs) +{ + return Vector3Add(lhs, rhs); +} + +inline const Vector3& operator += (Vector3& lhs, const Vector3& rhs) +{ + lhs = Vector3Add(lhs, rhs); + return lhs; +} + +inline Vector3 operator - (const Vector3& lhs, const Vector3& rhs) +{ + return Vector3Subtract(lhs, rhs); +} + +inline const Vector3& operator -= (Vector3& lhs, const Vector3& rhs) +{ + lhs = Vector3Subtract(lhs, rhs); + return lhs; +} + +inline Vector3 operator * (const Vector3& lhs, const float& rhs) +{ + return Vector3Scale(lhs, rhs); +} + +inline const Vector3& operator *= (Vector3& lhs, const float& rhs) +{ + lhs = Vector3Scale(lhs, rhs); + return lhs; +} + +inline Vector3 operator * (const Vector3& lhs, const Vector3& rhs) +{ + return Vector3Multiply(lhs, rhs); +} + +inline const Vector3& operator *= (Vector3& lhs, const Vector3& rhs) +{ + lhs = Vector3Multiply(lhs, rhs); + return lhs; +} + +inline Vector3 operator * (const Vector3& lhs, const Matrix& rhs) +{ + return Vector3Transform(lhs, rhs); +} + +inline const Vector3& operator -= (Vector3& lhs, const Matrix& rhs) +{ + lhs = Vector3Transform(lhs, rhs); + return lhs; +} + +inline Vector3 operator / (const Vector3& lhs, const float& rhs) +{ + return Vector3Scale(lhs, 1.0f / rhs); +} + +inline const Vector3& operator /= (Vector3& lhs, const float& rhs) +{ + lhs = Vector3Scale(lhs, rhs); + return lhs; +} + +inline Vector3 operator / (const Vector3& lhs, const Vector3& rhs) +{ + return Vector3Divide(lhs, rhs); +} + +inline const Vector3& operator /= (Vector3& lhs, const Vector3& rhs) +{ + lhs = Vector3Divide(lhs, rhs); + return lhs; +} + +inline bool operator == (const Vector3& lhs, const Vector3& rhs) +{ + return FloatEquals(lhs.x, rhs.x) && FloatEquals(lhs.y, rhs.y) && FloatEquals(lhs.z, rhs.z); +} + +inline bool operator != (const Vector3& lhs, const Vector3& rhs) +{ + return !FloatEquals(lhs.x, rhs.x) || !FloatEquals(lhs.y, rhs.y) || !FloatEquals(lhs.z, rhs.z); +} + +// Vector4 operators +static constexpr Vector4 Vector4Zeros = { 0, 0, 0, 0 }; +static constexpr Vector4 Vector4Ones = { 1, 1, 1, 1 }; +static constexpr Vector4 Vector4UnitX = { 1, 0, 0, 0 }; +static constexpr Vector4 Vector4UnitY = { 0, 1, 0, 0 }; +static constexpr Vector4 Vector4UnitZ = { 0, 0, 1, 0 }; +static constexpr Vector4 Vector4UnitW = { 0, 0, 0, 1 }; + +inline Vector4 operator + (const Vector4& lhs, const Vector4& rhs) +{ + return Vector4Add(lhs, rhs); +} + +inline const Vector4& operator += (Vector4& lhs, const Vector4& rhs) +{ + lhs = Vector4Add(lhs, rhs); + return lhs; +} + +inline Vector4 operator - (const Vector4& lhs, const Vector4& rhs) +{ + return Vector4Subtract(lhs, rhs); +} + +inline const Vector4& operator -= (Vector4& lhs, const Vector4& rhs) +{ + lhs = Vector4Subtract(lhs, rhs); + return lhs; +} + +inline Vector4 operator * (const Vector4& lhs, const float& rhs) +{ + return Vector4Scale(lhs, rhs); +} + +inline const Vector4& operator *= (Vector4& lhs, const float& rhs) +{ + lhs = Vector4Scale(lhs, rhs); + return lhs; +} + +inline Vector4 operator * (const Vector4& lhs, const Vector4& rhs) +{ + return Vector4Multiply(lhs, rhs); +} + +inline const Vector4& operator *= (Vector4& lhs, const Vector4& rhs) +{ + lhs = Vector4Multiply(lhs, rhs); + return lhs; +} + +inline Vector4 operator / (const Vector4& lhs, const float& rhs) +{ + return Vector4Scale(lhs, 1.0f / rhs); +} + +inline const Vector4& operator /= (Vector4& lhs, const float& rhs) +{ + lhs = Vector4Scale(lhs, rhs); + return lhs; +} + +inline Vector4 operator / (const Vector4& lhs, const Vector4& rhs) +{ + return Vector4Divide(lhs, rhs); +} + +inline const Vector4& operator /= (Vector4& lhs, const Vector4& rhs) +{ + lhs = Vector4Divide(lhs, rhs); + return lhs; +} + +inline bool operator == (const Vector4& lhs, const Vector4& rhs) +{ + return FloatEquals(lhs.x, rhs.x) && FloatEquals(lhs.y, rhs.y) && FloatEquals(lhs.z, rhs.z) && FloatEquals(lhs.w, rhs.w); +} + +inline bool operator != (const Vector4& lhs, const Vector4& rhs) +{ + return !FloatEquals(lhs.x, rhs.x) || !FloatEquals(lhs.y, rhs.y) || !FloatEquals(lhs.z, rhs.z) || !FloatEquals(lhs.w, rhs.w); +} + +// Quaternion operators +static constexpr Quaternion QuaternionZeros = { 0, 0, 0, 0 }; +static constexpr Quaternion QuaternionOnes = { 1, 1, 1, 1 }; +static constexpr Quaternion QuaternionUnitX = { 0, 0, 0, 1 }; + +inline Quaternion operator + (const Quaternion& lhs, const float& rhs) +{ + return QuaternionAddValue(lhs, rhs); +} + +inline const Quaternion& operator += (Quaternion& lhs, const float& rhs) +{ + lhs = QuaternionAddValue(lhs, rhs); + return lhs; +} + +inline Quaternion operator - (const Quaternion& lhs, const float& rhs) +{ + return QuaternionSubtractValue(lhs, rhs); +} + +inline const Quaternion& operator -= (Quaternion& lhs, const float& rhs) +{ + lhs = QuaternionSubtractValue(lhs, rhs); + return lhs; +} + +inline Quaternion operator * (const Quaternion& lhs, const Matrix& rhs) +{ + return QuaternionTransform(lhs, rhs); +} + +inline const Quaternion& operator *= (Quaternion& lhs, const Matrix& rhs) +{ + lhs = QuaternionTransform(lhs, rhs); + return lhs; +} + +// Matrix operators +inline Matrix operator + (const Matrix& lhs, const Matrix& rhs) +{ + return MatrixAdd(lhs, rhs); +} + +inline const Matrix& operator += (Matrix& lhs, const Matrix& rhs) +{ + lhs = MatrixAdd(lhs, rhs); + return lhs; +} + +inline Matrix operator - (const Matrix& lhs, const Matrix& rhs) +{ + return MatrixSubtract(lhs, rhs); +} + +inline const Matrix& operator -= (Matrix& lhs, const Matrix& rhs) +{ + lhs = MatrixSubtract(lhs, rhs); + return lhs; +} + +inline Matrix operator * (const Matrix& lhs, const Matrix& rhs) +{ + return MatrixMultiply(lhs, rhs); +} + +inline const Matrix& operator *= (Matrix& lhs, const Matrix& rhs) +{ + lhs = MatrixMultiply(lhs, rhs); + return lhs; +} +//------------------------------------------------------------------------------- +#endif // C++ operators + +#endif // RAYMATH_H diff --git a/vendor/raylib-5.5_linux_amd64/include/rlgl.h b/vendor/raylib-5.5_linux_amd64/include/rlgl.h new file mode 100644 index 0000000..756656e --- /dev/null +++ b/vendor/raylib-5.5_linux_amd64/include/rlgl.h @@ -0,0 +1,5262 @@ +/********************************************************************************************** +* +* rlgl v5.0 - A multi-OpenGL abstraction layer with an immediate-mode style API +* +* DESCRIPTION: +* An abstraction layer for multiple OpenGL versions (1.1, 2.1, 3.3 Core, 4.3 Core, ES 2.0) +* that provides a pseudo-OpenGL 1.1 immediate-mode style API (rlVertex, rlTranslate, rlRotate...) +* +* ADDITIONAL NOTES: +* When choosing an OpenGL backend different than OpenGL 1.1, some internal buffer are +* initialized on rlglInit() to accumulate vertex data +* +* When an internal state change is required all the stored vertex data is renderer in batch, +* additionally, rlDrawRenderBatchActive() could be called to force flushing of the batch +* +* Some resources are also loaded for convenience, here the complete list: +* - Default batch (RLGL.defaultBatch): RenderBatch system to accumulate vertex data +* - Default texture (RLGL.defaultTextureId): 1x1 white pixel R8G8B8A8 +* - Default shader (RLGL.State.defaultShaderId, RLGL.State.defaultShaderLocs) +* +* Internal buffer (and resources) must be manually unloaded calling rlglClose() +* +* CONFIGURATION: +* #define GRAPHICS_API_OPENGL_11 +* #define GRAPHICS_API_OPENGL_21 +* #define GRAPHICS_API_OPENGL_33 +* #define GRAPHICS_API_OPENGL_43 +* #define GRAPHICS_API_OPENGL_ES2 +* #define GRAPHICS_API_OPENGL_ES3 +* Use selected OpenGL graphics backend, should be supported by platform +* Those preprocessor defines are only used on rlgl module, if OpenGL version is +* required by any other module, use rlGetVersion() to check it +* +* #define RLGL_IMPLEMENTATION +* Generates the implementation of the library into the included file +* If not defined, the library is in header only mode and can be included in other headers +* or source files without problems. But only ONE file should hold the implementation +* +* #define RLGL_RENDER_TEXTURES_HINT +* Enable framebuffer objects (fbo) support (enabled by default) +* Some GPUs could not support them despite the OpenGL version +* +* #define RLGL_SHOW_GL_DETAILS_INFO +* Show OpenGL extensions and capabilities detailed logs on init +* +* #define RLGL_ENABLE_OPENGL_DEBUG_CONTEXT +* Enable debug context (only available on OpenGL 4.3) +* +* rlgl capabilities could be customized just defining some internal +* values before library inclusion (default values listed): +* +* #define RL_DEFAULT_BATCH_BUFFER_ELEMENTS 8192 // Default internal render batch elements limits +* #define RL_DEFAULT_BATCH_BUFFERS 1 // Default number of batch buffers (multi-buffering) +* #define RL_DEFAULT_BATCH_DRAWCALLS 256 // Default number of batch draw calls (by state changes: mode, texture) +* #define RL_DEFAULT_BATCH_MAX_TEXTURE_UNITS 4 // Maximum number of textures units that can be activated on batch drawing (SetShaderValueTexture()) +* +* #define RL_MAX_MATRIX_STACK_SIZE 32 // Maximum size of internal Matrix stack +* #define RL_MAX_SHADER_LOCATIONS 32 // Maximum number of shader locations supported +* #define RL_CULL_DISTANCE_NEAR 0.01 // Default projection matrix near cull distance +* #define RL_CULL_DISTANCE_FAR 1000.0 // Default projection matrix far cull distance +* +* When loading a shader, the following vertex attributes and uniform +* location names are tried to be set automatically: +* +* #define RL_DEFAULT_SHADER_ATTRIB_NAME_POSITION "vertexPosition" // Bound by default to shader location: RL_DEFAULT_SHADER_ATTRIB_LOCATION_POSITION +* #define RL_DEFAULT_SHADER_ATTRIB_NAME_TEXCOORD "vertexTexCoord" // Bound by default to shader location: RL_DEFAULT_SHADER_ATTRIB_LOCATION_TEXCOORD +* #define RL_DEFAULT_SHADER_ATTRIB_NAME_NORMAL "vertexNormal" // Bound by default to shader location: RL_DEFAULT_SHADER_ATTRIB_LOCATION_NORMAL +* #define RL_DEFAULT_SHADER_ATTRIB_NAME_COLOR "vertexColor" // Bound by default to shader location: RL_DEFAULT_SHADER_ATTRIB_LOCATION_COLOR +* #define RL_DEFAULT_SHADER_ATTRIB_NAME_TANGENT "vertexTangent" // Bound by default to shader location: RL_DEFAULT_SHADER_ATTRIB_LOCATION_TANGENT +* #define RL_DEFAULT_SHADER_ATTRIB_NAME_TEXCOORD2 "vertexTexCoord2" // Bound by default to shader location: RL_DEFAULT_SHADER_ATTRIB_LOCATION_TEXCOORD2 +* #define RL_DEFAULT_SHADER_ATTRIB_NAME_BONEIDS "vertexBoneIds" // Bound by default to shader location: RL_DEFAULT_SHADER_ATTRIB_LOCATION_BONEIDS +* #define RL_DEFAULT_SHADER_ATTRIB_NAME_BONEWEIGHTS "vertexBoneWeights" // Bound by default to shader location: RL_DEFAULT_SHADER_ATTRIB_LOCATION_BONEWEIGHTS +* #define RL_DEFAULT_SHADER_UNIFORM_NAME_MVP "mvp" // model-view-projection matrix +* #define RL_DEFAULT_SHADER_UNIFORM_NAME_VIEW "matView" // view matrix +* #define RL_DEFAULT_SHADER_UNIFORM_NAME_PROJECTION "matProjection" // projection matrix +* #define RL_DEFAULT_SHADER_UNIFORM_NAME_MODEL "matModel" // model matrix +* #define RL_DEFAULT_SHADER_UNIFORM_NAME_NORMAL "matNormal" // normal matrix (transpose(inverse(matModelView))) +* #define RL_DEFAULT_SHADER_UNIFORM_NAME_COLOR "colDiffuse" // color diffuse (base tint color, multiplied by texture color) +* #define RL_DEFAULT_SHADER_UNIFORM_NAME_BONE_MATRICES "boneMatrices" // bone matrices +* #define RL_DEFAULT_SHADER_SAMPLER2D_NAME_TEXTURE0 "texture0" // texture0 (texture slot active 0) +* #define RL_DEFAULT_SHADER_SAMPLER2D_NAME_TEXTURE1 "texture1" // texture1 (texture slot active 1) +* #define RL_DEFAULT_SHADER_SAMPLER2D_NAME_TEXTURE2 "texture2" // texture2 (texture slot active 2) +* +* DEPENDENCIES: +* - OpenGL libraries (depending on platform and OpenGL version selected) +* - GLAD OpenGL extensions loading library (only for OpenGL 3.3 Core, 4.3 Core) +* +* +* LICENSE: zlib/libpng +* +* Copyright (c) 2014-2024 Ramon Santamaria (@raysan5) +* +* This software is provided "as-is", without any express or implied warranty. In no event +* will the authors be held liable for any damages arising from the use of this software. +* +* Permission is granted to anyone to use this software for any purpose, including commercial +* applications, and to alter it and redistribute it freely, subject to the following restrictions: +* +* 1. The origin of this software must not be misrepresented; you must not claim that you +* wrote the original software. If you use this software in a product, an acknowledgment +* in the product documentation would be appreciated but is not required. +* +* 2. Altered source versions must be plainly marked as such, and must not be misrepresented +* as being the original software. +* +* 3. This notice may not be removed or altered from any source distribution. +* +**********************************************************************************************/ + +#ifndef RLGL_H +#define RLGL_H + +#define RLGL_VERSION "5.0" + +// Function specifiers in case library is build/used as a shared library +// NOTE: Microsoft specifiers to tell compiler that symbols are imported/exported from a .dll +// NOTE: visibility(default) attribute makes symbols "visible" when compiled with -fvisibility=hidden +#if defined(_WIN32) && defined(BUILD_LIBTYPE_SHARED) + #define RLAPI __declspec(dllexport) // We are building the library as a Win32 shared library (.dll) +#elif defined(BUILD_LIBTYPE_SHARED) + #define RLAPI __attribute__((visibility("default"))) // We are building the library as a Unix shared library (.so/.dylib) +#elif defined(_WIN32) && defined(USE_LIBTYPE_SHARED) + #define RLAPI __declspec(dllimport) // We are using the library as a Win32 shared library (.dll) +#endif + +// Function specifiers definition +#ifndef RLAPI + #define RLAPI // Functions defined as 'extern' by default (implicit specifiers) +#endif + +// Support TRACELOG macros +#ifndef TRACELOG + #define TRACELOG(level, ...) (void)0 + #define TRACELOGD(...) (void)0 +#endif + +// Allow custom memory allocators +#ifndef RL_MALLOC + #define RL_MALLOC(sz) malloc(sz) +#endif +#ifndef RL_CALLOC + #define RL_CALLOC(n,sz) calloc(n,sz) +#endif +#ifndef RL_REALLOC + #define RL_REALLOC(n,sz) realloc(n,sz) +#endif +#ifndef RL_FREE + #define RL_FREE(p) free(p) +#endif + +// Security check in case no GRAPHICS_API_OPENGL_* defined +#if !defined(GRAPHICS_API_OPENGL_11) && \ + !defined(GRAPHICS_API_OPENGL_21) && \ + !defined(GRAPHICS_API_OPENGL_33) && \ + !defined(GRAPHICS_API_OPENGL_43) && \ + !defined(GRAPHICS_API_OPENGL_ES2) && \ + !defined(GRAPHICS_API_OPENGL_ES3) + #define GRAPHICS_API_OPENGL_33 +#endif + +// Security check in case multiple GRAPHICS_API_OPENGL_* defined +#if defined(GRAPHICS_API_OPENGL_11) + #if defined(GRAPHICS_API_OPENGL_21) + #undef GRAPHICS_API_OPENGL_21 + #endif + #if defined(GRAPHICS_API_OPENGL_33) + #undef GRAPHICS_API_OPENGL_33 + #endif + #if defined(GRAPHICS_API_OPENGL_43) + #undef GRAPHICS_API_OPENGL_43 + #endif + #if defined(GRAPHICS_API_OPENGL_ES2) + #undef GRAPHICS_API_OPENGL_ES2 + #endif +#endif + +// OpenGL 2.1 uses most of OpenGL 3.3 Core functionality +// WARNING: Specific parts are checked with #if defines +#if defined(GRAPHICS_API_OPENGL_21) + #define GRAPHICS_API_OPENGL_33 +#endif + +// OpenGL 4.3 uses OpenGL 3.3 Core functionality +#if defined(GRAPHICS_API_OPENGL_43) + #define GRAPHICS_API_OPENGL_33 +#endif + +// OpenGL ES 3.0 uses OpenGL ES 2.0 functionality (and more) +#if defined(GRAPHICS_API_OPENGL_ES3) + #define GRAPHICS_API_OPENGL_ES2 +#endif + +// Support framebuffer objects by default +// NOTE: Some driver implementation do not support it, despite they should +#define RLGL_RENDER_TEXTURES_HINT + +//---------------------------------------------------------------------------------- +// Defines and Macros +//---------------------------------------------------------------------------------- + +// Default internal render batch elements limits +#ifndef RL_DEFAULT_BATCH_BUFFER_ELEMENTS + #if defined(GRAPHICS_API_OPENGL_11) || defined(GRAPHICS_API_OPENGL_33) + // This is the maximum amount of elements (quads) per batch + // NOTE: Be careful with text, every letter maps to a quad + #define RL_DEFAULT_BATCH_BUFFER_ELEMENTS 8192 + #endif + #if defined(GRAPHICS_API_OPENGL_ES2) + // We reduce memory sizes for embedded systems (RPI and HTML5) + // NOTE: On HTML5 (emscripten) this is allocated on heap, + // by default it's only 16MB!...just take care... + #define RL_DEFAULT_BATCH_BUFFER_ELEMENTS 2048 + #endif +#endif +#ifndef RL_DEFAULT_BATCH_BUFFERS + #define RL_DEFAULT_BATCH_BUFFERS 1 // Default number of batch buffers (multi-buffering) +#endif +#ifndef RL_DEFAULT_BATCH_DRAWCALLS + #define RL_DEFAULT_BATCH_DRAWCALLS 256 // Default number of batch draw calls (by state changes: mode, texture) +#endif +#ifndef RL_DEFAULT_BATCH_MAX_TEXTURE_UNITS + #define RL_DEFAULT_BATCH_MAX_TEXTURE_UNITS 4 // Maximum number of textures units that can be activated on batch drawing (SetShaderValueTexture()) +#endif + +// Internal Matrix stack +#ifndef RL_MAX_MATRIX_STACK_SIZE + #define RL_MAX_MATRIX_STACK_SIZE 32 // Maximum size of Matrix stack +#endif + +// Shader limits +#ifndef RL_MAX_SHADER_LOCATIONS + #define RL_MAX_SHADER_LOCATIONS 32 // Maximum number of shader locations supported +#endif + +// Projection matrix culling +#ifndef RL_CULL_DISTANCE_NEAR + #define RL_CULL_DISTANCE_NEAR 0.01 // Default near cull distance +#endif +#ifndef RL_CULL_DISTANCE_FAR + #define RL_CULL_DISTANCE_FAR 1000.0 // Default far cull distance +#endif + +// Texture parameters (equivalent to OpenGL defines) +#define RL_TEXTURE_WRAP_S 0x2802 // GL_TEXTURE_WRAP_S +#define RL_TEXTURE_WRAP_T 0x2803 // GL_TEXTURE_WRAP_T +#define RL_TEXTURE_MAG_FILTER 0x2800 // GL_TEXTURE_MAG_FILTER +#define RL_TEXTURE_MIN_FILTER 0x2801 // GL_TEXTURE_MIN_FILTER + +#define RL_TEXTURE_FILTER_NEAREST 0x2600 // GL_NEAREST +#define RL_TEXTURE_FILTER_LINEAR 0x2601 // GL_LINEAR +#define RL_TEXTURE_FILTER_MIP_NEAREST 0x2700 // GL_NEAREST_MIPMAP_NEAREST +#define RL_TEXTURE_FILTER_NEAREST_MIP_LINEAR 0x2702 // GL_NEAREST_MIPMAP_LINEAR +#define RL_TEXTURE_FILTER_LINEAR_MIP_NEAREST 0x2701 // GL_LINEAR_MIPMAP_NEAREST +#define RL_TEXTURE_FILTER_MIP_LINEAR 0x2703 // GL_LINEAR_MIPMAP_LINEAR +#define RL_TEXTURE_FILTER_ANISOTROPIC 0x3000 // Anisotropic filter (custom identifier) +#define RL_TEXTURE_MIPMAP_BIAS_RATIO 0x4000 // Texture mipmap bias, percentage ratio (custom identifier) + +#define RL_TEXTURE_WRAP_REPEAT 0x2901 // GL_REPEAT +#define RL_TEXTURE_WRAP_CLAMP 0x812F // GL_CLAMP_TO_EDGE +#define RL_TEXTURE_WRAP_MIRROR_REPEAT 0x8370 // GL_MIRRORED_REPEAT +#define RL_TEXTURE_WRAP_MIRROR_CLAMP 0x8742 // GL_MIRROR_CLAMP_EXT + +// Matrix modes (equivalent to OpenGL) +#define RL_MODELVIEW 0x1700 // GL_MODELVIEW +#define RL_PROJECTION 0x1701 // GL_PROJECTION +#define RL_TEXTURE 0x1702 // GL_TEXTURE + +// Primitive assembly draw modes +#define RL_LINES 0x0001 // GL_LINES +#define RL_TRIANGLES 0x0004 // GL_TRIANGLES +#define RL_QUADS 0x0007 // GL_QUADS + +// GL equivalent data types +#define RL_UNSIGNED_BYTE 0x1401 // GL_UNSIGNED_BYTE +#define RL_FLOAT 0x1406 // GL_FLOAT + +// GL buffer usage hint +#define RL_STREAM_DRAW 0x88E0 // GL_STREAM_DRAW +#define RL_STREAM_READ 0x88E1 // GL_STREAM_READ +#define RL_STREAM_COPY 0x88E2 // GL_STREAM_COPY +#define RL_STATIC_DRAW 0x88E4 // GL_STATIC_DRAW +#define RL_STATIC_READ 0x88E5 // GL_STATIC_READ +#define RL_STATIC_COPY 0x88E6 // GL_STATIC_COPY +#define RL_DYNAMIC_DRAW 0x88E8 // GL_DYNAMIC_DRAW +#define RL_DYNAMIC_READ 0x88E9 // GL_DYNAMIC_READ +#define RL_DYNAMIC_COPY 0x88EA // GL_DYNAMIC_COPY + +// GL Shader type +#define RL_FRAGMENT_SHADER 0x8B30 // GL_FRAGMENT_SHADER +#define RL_VERTEX_SHADER 0x8B31 // GL_VERTEX_SHADER +#define RL_COMPUTE_SHADER 0x91B9 // GL_COMPUTE_SHADER + +// GL blending factors +#define RL_ZERO 0 // GL_ZERO +#define RL_ONE 1 // GL_ONE +#define RL_SRC_COLOR 0x0300 // GL_SRC_COLOR +#define RL_ONE_MINUS_SRC_COLOR 0x0301 // GL_ONE_MINUS_SRC_COLOR +#define RL_SRC_ALPHA 0x0302 // GL_SRC_ALPHA +#define RL_ONE_MINUS_SRC_ALPHA 0x0303 // GL_ONE_MINUS_SRC_ALPHA +#define RL_DST_ALPHA 0x0304 // GL_DST_ALPHA +#define RL_ONE_MINUS_DST_ALPHA 0x0305 // GL_ONE_MINUS_DST_ALPHA +#define RL_DST_COLOR 0x0306 // GL_DST_COLOR +#define RL_ONE_MINUS_DST_COLOR 0x0307 // GL_ONE_MINUS_DST_COLOR +#define RL_SRC_ALPHA_SATURATE 0x0308 // GL_SRC_ALPHA_SATURATE +#define RL_CONSTANT_COLOR 0x8001 // GL_CONSTANT_COLOR +#define RL_ONE_MINUS_CONSTANT_COLOR 0x8002 // GL_ONE_MINUS_CONSTANT_COLOR +#define RL_CONSTANT_ALPHA 0x8003 // GL_CONSTANT_ALPHA +#define RL_ONE_MINUS_CONSTANT_ALPHA 0x8004 // GL_ONE_MINUS_CONSTANT_ALPHA + +// GL blending functions/equations +#define RL_FUNC_ADD 0x8006 // GL_FUNC_ADD +#define RL_MIN 0x8007 // GL_MIN +#define RL_MAX 0x8008 // GL_MAX +#define RL_FUNC_SUBTRACT 0x800A // GL_FUNC_SUBTRACT +#define RL_FUNC_REVERSE_SUBTRACT 0x800B // GL_FUNC_REVERSE_SUBTRACT +#define RL_BLEND_EQUATION 0x8009 // GL_BLEND_EQUATION +#define RL_BLEND_EQUATION_RGB 0x8009 // GL_BLEND_EQUATION_RGB // (Same as BLEND_EQUATION) +#define RL_BLEND_EQUATION_ALPHA 0x883D // GL_BLEND_EQUATION_ALPHA +#define RL_BLEND_DST_RGB 0x80C8 // GL_BLEND_DST_RGB +#define RL_BLEND_SRC_RGB 0x80C9 // GL_BLEND_SRC_RGB +#define RL_BLEND_DST_ALPHA 0x80CA // GL_BLEND_DST_ALPHA +#define RL_BLEND_SRC_ALPHA 0x80CB // GL_BLEND_SRC_ALPHA +#define RL_BLEND_COLOR 0x8005 // GL_BLEND_COLOR + +#define RL_READ_FRAMEBUFFER 0x8CA8 // GL_READ_FRAMEBUFFER +#define RL_DRAW_FRAMEBUFFER 0x8CA9 // GL_DRAW_FRAMEBUFFER + +// Default shader vertex attribute locations +#ifndef RL_DEFAULT_SHADER_ATTRIB_LOCATION_POSITION + #define RL_DEFAULT_SHADER_ATTRIB_LOCATION_POSITION 0 +#endif +#ifndef RL_DEFAULT_SHADER_ATTRIB_LOCATION_TEXCOORD + #define RL_DEFAULT_SHADER_ATTRIB_LOCATION_TEXCOORD 1 +#endif +#ifndef RL_DEFAULT_SHADER_ATTRIB_LOCATION_NORMAL + #define RL_DEFAULT_SHADER_ATTRIB_LOCATION_NORMAL 2 +#endif +#ifndef RL_DEFAULT_SHADER_ATTRIB_LOCATION_COLOR + #define RL_DEFAULT_SHADER_ATTRIB_LOCATION_COLOR 3 +#endif + #ifndef RL_DEFAULT_SHADER_ATTRIB_LOCATION_TANGENT +#define RL_DEFAULT_SHADER_ATTRIB_LOCATION_TANGENT 4 +#endif +#ifndef RL_DEFAULT_SHADER_ATTRIB_LOCATION_TEXCOORD2 + #define RL_DEFAULT_SHADER_ATTRIB_LOCATION_TEXCOORD2 5 +#endif +#ifndef RL_DEFAULT_SHADER_ATTRIB_LOCATION_INDICES + #define RL_DEFAULT_SHADER_ATTRIB_LOCATION_INDICES 6 +#endif +#ifdef RL_SUPPORT_MESH_GPU_SKINNING +#ifndef RL_DEFAULT_SHADER_ATTRIB_LOCATION_BONEIDS + #define RL_DEFAULT_SHADER_ATTRIB_LOCATION_BONEIDS 7 +#endif +#ifndef RL_DEFAULT_SHADER_ATTRIB_LOCATION_BONEWEIGHTS + #define RL_DEFAULT_SHADER_ATTRIB_LOCATION_BONEWEIGHTS 8 +#endif +#endif + +//---------------------------------------------------------------------------------- +// Types and Structures Definition +//---------------------------------------------------------------------------------- +#if (defined(__STDC__) && __STDC_VERSION__ >= 199901L) || (defined(_MSC_VER) && _MSC_VER >= 1800) + #include <stdbool.h> +#elif !defined(__cplusplus) && !defined(bool) && !defined(RL_BOOL_TYPE) + // Boolean type +typedef enum bool { false = 0, true = !false } bool; +#endif + +#if !defined(RL_MATRIX_TYPE) +// Matrix, 4x4 components, column major, OpenGL style, right handed +typedef struct Matrix { + float m0, m4, m8, m12; // Matrix first row (4 components) + float m1, m5, m9, m13; // Matrix second row (4 components) + float m2, m6, m10, m14; // Matrix third row (4 components) + float m3, m7, m11, m15; // Matrix fourth row (4 components) +} Matrix; +#define RL_MATRIX_TYPE +#endif + +// Dynamic vertex buffers (position + texcoords + colors + indices arrays) +typedef struct rlVertexBuffer { + int elementCount; // Number of elements in the buffer (QUADS) + + float *vertices; // Vertex position (XYZ - 3 components per vertex) (shader-location = 0) + float *texcoords; // Vertex texture coordinates (UV - 2 components per vertex) (shader-location = 1) + float *normals; // Vertex normal (XYZ - 3 components per vertex) (shader-location = 2) + unsigned char *colors; // Vertex colors (RGBA - 4 components per vertex) (shader-location = 3) +#if defined(GRAPHICS_API_OPENGL_11) || defined(GRAPHICS_API_OPENGL_33) + unsigned int *indices; // Vertex indices (in case vertex data comes indexed) (6 indices per quad) +#endif +#if defined(GRAPHICS_API_OPENGL_ES2) + unsigned short *indices; // Vertex indices (in case vertex data comes indexed) (6 indices per quad) +#endif + unsigned int vaoId; // OpenGL Vertex Array Object id + unsigned int vboId[5]; // OpenGL Vertex Buffer Objects id (5 types of vertex data) +} rlVertexBuffer; + +// Draw call type +// NOTE: Only texture changes register a new draw, other state-change-related elements are not +// used at this moment (vaoId, shaderId, matrices), raylib just forces a batch draw call if any +// of those state-change happens (this is done in core module) +typedef struct rlDrawCall { + int mode; // Drawing mode: LINES, TRIANGLES, QUADS + int vertexCount; // Number of vertex of the draw + int vertexAlignment; // Number of vertex required for index alignment (LINES, TRIANGLES) + //unsigned int vaoId; // Vertex array id to be used on the draw -> Using RLGL.currentBatch->vertexBuffer.vaoId + //unsigned int shaderId; // Shader id to be used on the draw -> Using RLGL.currentShaderId + unsigned int textureId; // Texture id to be used on the draw -> Use to create new draw call if changes + + //Matrix projection; // Projection matrix for this draw -> Using RLGL.projection by default + //Matrix modelview; // Modelview matrix for this draw -> Using RLGL.modelview by default +} rlDrawCall; + +// rlRenderBatch type +typedef struct rlRenderBatch { + int bufferCount; // Number of vertex buffers (multi-buffering support) + int currentBuffer; // Current buffer tracking in case of multi-buffering + rlVertexBuffer *vertexBuffer; // Dynamic buffer(s) for vertex data + + rlDrawCall *draws; // Draw calls array, depends on textureId + int drawCounter; // Draw calls counter + float currentDepth; // Current depth value for next draw +} rlRenderBatch; + +// OpenGL version +typedef enum { + RL_OPENGL_11 = 1, // OpenGL 1.1 + RL_OPENGL_21, // OpenGL 2.1 (GLSL 120) + RL_OPENGL_33, // OpenGL 3.3 (GLSL 330) + RL_OPENGL_43, // OpenGL 4.3 (using GLSL 330) + RL_OPENGL_ES_20, // OpenGL ES 2.0 (GLSL 100) + RL_OPENGL_ES_30 // OpenGL ES 3.0 (GLSL 300 es) +} rlGlVersion; + +// Trace log level +// NOTE: Organized by priority level +typedef enum { + RL_LOG_ALL = 0, // Display all logs + RL_LOG_TRACE, // Trace logging, intended for internal use only + RL_LOG_DEBUG, // Debug logging, used for internal debugging, it should be disabled on release builds + RL_LOG_INFO, // Info logging, used for program execution info + RL_LOG_WARNING, // Warning logging, used on recoverable failures + RL_LOG_ERROR, // Error logging, used on unrecoverable failures + RL_LOG_FATAL, // Fatal logging, used to abort program: exit(EXIT_FAILURE) + RL_LOG_NONE // Disable logging +} rlTraceLogLevel; + +// Texture pixel formats +// NOTE: Support depends on OpenGL version +typedef enum { + RL_PIXELFORMAT_UNCOMPRESSED_GRAYSCALE = 1, // 8 bit per pixel (no alpha) + RL_PIXELFORMAT_UNCOMPRESSED_GRAY_ALPHA, // 8*2 bpp (2 channels) + RL_PIXELFORMAT_UNCOMPRESSED_R5G6B5, // 16 bpp + RL_PIXELFORMAT_UNCOMPRESSED_R8G8B8, // 24 bpp + RL_PIXELFORMAT_UNCOMPRESSED_R5G5B5A1, // 16 bpp (1 bit alpha) + RL_PIXELFORMAT_UNCOMPRESSED_R4G4B4A4, // 16 bpp (4 bit alpha) + RL_PIXELFORMAT_UNCOMPRESSED_R8G8B8A8, // 32 bpp + RL_PIXELFORMAT_UNCOMPRESSED_R32, // 32 bpp (1 channel - float) + RL_PIXELFORMAT_UNCOMPRESSED_R32G32B32, // 32*3 bpp (3 channels - float) + RL_PIXELFORMAT_UNCOMPRESSED_R32G32B32A32, // 32*4 bpp (4 channels - float) + RL_PIXELFORMAT_UNCOMPRESSED_R16, // 16 bpp (1 channel - half float) + RL_PIXELFORMAT_UNCOMPRESSED_R16G16B16, // 16*3 bpp (3 channels - half float) + RL_PIXELFORMAT_UNCOMPRESSED_R16G16B16A16, // 16*4 bpp (4 channels - half float) + RL_PIXELFORMAT_COMPRESSED_DXT1_RGB, // 4 bpp (no alpha) + RL_PIXELFORMAT_COMPRESSED_DXT1_RGBA, // 4 bpp (1 bit alpha) + RL_PIXELFORMAT_COMPRESSED_DXT3_RGBA, // 8 bpp + RL_PIXELFORMAT_COMPRESSED_DXT5_RGBA, // 8 bpp + RL_PIXELFORMAT_COMPRESSED_ETC1_RGB, // 4 bpp + RL_PIXELFORMAT_COMPRESSED_ETC2_RGB, // 4 bpp + RL_PIXELFORMAT_COMPRESSED_ETC2_EAC_RGBA, // 8 bpp + RL_PIXELFORMAT_COMPRESSED_PVRT_RGB, // 4 bpp + RL_PIXELFORMAT_COMPRESSED_PVRT_RGBA, // 4 bpp + RL_PIXELFORMAT_COMPRESSED_ASTC_4x4_RGBA, // 8 bpp + RL_PIXELFORMAT_COMPRESSED_ASTC_8x8_RGBA // 2 bpp +} rlPixelFormat; + +// Texture parameters: filter mode +// NOTE 1: Filtering considers mipmaps if available in the texture +// NOTE 2: Filter is accordingly set for minification and magnification +typedef enum { + RL_TEXTURE_FILTER_POINT = 0, // No filter, just pixel approximation + RL_TEXTURE_FILTER_BILINEAR, // Linear filtering + RL_TEXTURE_FILTER_TRILINEAR, // Trilinear filtering (linear with mipmaps) + RL_TEXTURE_FILTER_ANISOTROPIC_4X, // Anisotropic filtering 4x + RL_TEXTURE_FILTER_ANISOTROPIC_8X, // Anisotropic filtering 8x + RL_TEXTURE_FILTER_ANISOTROPIC_16X, // Anisotropic filtering 16x +} rlTextureFilter; + +// Color blending modes (pre-defined) +typedef enum { + RL_BLEND_ALPHA = 0, // Blend textures considering alpha (default) + RL_BLEND_ADDITIVE, // Blend textures adding colors + RL_BLEND_MULTIPLIED, // Blend textures multiplying colors + RL_BLEND_ADD_COLORS, // Blend textures adding colors (alternative) + RL_BLEND_SUBTRACT_COLORS, // Blend textures subtracting colors (alternative) + RL_BLEND_ALPHA_PREMULTIPLY, // Blend premultiplied textures considering alpha + RL_BLEND_CUSTOM, // Blend textures using custom src/dst factors (use rlSetBlendFactors()) + RL_BLEND_CUSTOM_SEPARATE // Blend textures using custom src/dst factors (use rlSetBlendFactorsSeparate()) +} rlBlendMode; + +// Shader location point type +typedef enum { + RL_SHADER_LOC_VERTEX_POSITION = 0, // Shader location: vertex attribute: position + RL_SHADER_LOC_VERTEX_TEXCOORD01, // Shader location: vertex attribute: texcoord01 + RL_SHADER_LOC_VERTEX_TEXCOORD02, // Shader location: vertex attribute: texcoord02 + RL_SHADER_LOC_VERTEX_NORMAL, // Shader location: vertex attribute: normal + RL_SHADER_LOC_VERTEX_TANGENT, // Shader location: vertex attribute: tangent + RL_SHADER_LOC_VERTEX_COLOR, // Shader location: vertex attribute: color + RL_SHADER_LOC_MATRIX_MVP, // Shader location: matrix uniform: model-view-projection + RL_SHADER_LOC_MATRIX_VIEW, // Shader location: matrix uniform: view (camera transform) + RL_SHADER_LOC_MATRIX_PROJECTION, // Shader location: matrix uniform: projection + RL_SHADER_LOC_MATRIX_MODEL, // Shader location: matrix uniform: model (transform) + RL_SHADER_LOC_MATRIX_NORMAL, // Shader location: matrix uniform: normal + RL_SHADER_LOC_VECTOR_VIEW, // Shader location: vector uniform: view + RL_SHADER_LOC_COLOR_DIFFUSE, // Shader location: vector uniform: diffuse color + RL_SHADER_LOC_COLOR_SPECULAR, // Shader location: vector uniform: specular color + RL_SHADER_LOC_COLOR_AMBIENT, // Shader location: vector uniform: ambient color + RL_SHADER_LOC_MAP_ALBEDO, // Shader location: sampler2d texture: albedo (same as: RL_SHADER_LOC_MAP_DIFFUSE) + RL_SHADER_LOC_MAP_METALNESS, // Shader location: sampler2d texture: metalness (same as: RL_SHADER_LOC_MAP_SPECULAR) + RL_SHADER_LOC_MAP_NORMAL, // Shader location: sampler2d texture: normal + RL_SHADER_LOC_MAP_ROUGHNESS, // Shader location: sampler2d texture: roughness + RL_SHADER_LOC_MAP_OCCLUSION, // Shader location: sampler2d texture: occlusion + RL_SHADER_LOC_MAP_EMISSION, // Shader location: sampler2d texture: emission + RL_SHADER_LOC_MAP_HEIGHT, // Shader location: sampler2d texture: height + RL_SHADER_LOC_MAP_CUBEMAP, // Shader location: samplerCube texture: cubemap + RL_SHADER_LOC_MAP_IRRADIANCE, // Shader location: samplerCube texture: irradiance + RL_SHADER_LOC_MAP_PREFILTER, // Shader location: samplerCube texture: prefilter + RL_SHADER_LOC_MAP_BRDF // Shader location: sampler2d texture: brdf +} rlShaderLocationIndex; + +#define RL_SHADER_LOC_MAP_DIFFUSE RL_SHADER_LOC_MAP_ALBEDO +#define RL_SHADER_LOC_MAP_SPECULAR RL_SHADER_LOC_MAP_METALNESS + +// Shader uniform data type +typedef enum { + RL_SHADER_UNIFORM_FLOAT = 0, // Shader uniform type: float + RL_SHADER_UNIFORM_VEC2, // Shader uniform type: vec2 (2 float) + RL_SHADER_UNIFORM_VEC3, // Shader uniform type: vec3 (3 float) + RL_SHADER_UNIFORM_VEC4, // Shader uniform type: vec4 (4 float) + RL_SHADER_UNIFORM_INT, // Shader uniform type: int + RL_SHADER_UNIFORM_IVEC2, // Shader uniform type: ivec2 (2 int) + RL_SHADER_UNIFORM_IVEC3, // Shader uniform type: ivec3 (3 int) + RL_SHADER_UNIFORM_IVEC4, // Shader uniform type: ivec4 (4 int) + RL_SHADER_UNIFORM_UINT, // Shader uniform type: unsigned int + RL_SHADER_UNIFORM_UIVEC2, // Shader uniform type: uivec2 (2 unsigned int) + RL_SHADER_UNIFORM_UIVEC3, // Shader uniform type: uivec3 (3 unsigned int) + RL_SHADER_UNIFORM_UIVEC4, // Shader uniform type: uivec4 (4 unsigned int) + RL_SHADER_UNIFORM_SAMPLER2D // Shader uniform type: sampler2d +} rlShaderUniformDataType; + +// Shader attribute data types +typedef enum { + RL_SHADER_ATTRIB_FLOAT = 0, // Shader attribute type: float + RL_SHADER_ATTRIB_VEC2, // Shader attribute type: vec2 (2 float) + RL_SHADER_ATTRIB_VEC3, // Shader attribute type: vec3 (3 float) + RL_SHADER_ATTRIB_VEC4 // Shader attribute type: vec4 (4 float) +} rlShaderAttributeDataType; + +// Framebuffer attachment type +// NOTE: By default up to 8 color channels defined, but it can be more +typedef enum { + RL_ATTACHMENT_COLOR_CHANNEL0 = 0, // Framebuffer attachment type: color 0 + RL_ATTACHMENT_COLOR_CHANNEL1 = 1, // Framebuffer attachment type: color 1 + RL_ATTACHMENT_COLOR_CHANNEL2 = 2, // Framebuffer attachment type: color 2 + RL_ATTACHMENT_COLOR_CHANNEL3 = 3, // Framebuffer attachment type: color 3 + RL_ATTACHMENT_COLOR_CHANNEL4 = 4, // Framebuffer attachment type: color 4 + RL_ATTACHMENT_COLOR_CHANNEL5 = 5, // Framebuffer attachment type: color 5 + RL_ATTACHMENT_COLOR_CHANNEL6 = 6, // Framebuffer attachment type: color 6 + RL_ATTACHMENT_COLOR_CHANNEL7 = 7, // Framebuffer attachment type: color 7 + RL_ATTACHMENT_DEPTH = 100, // Framebuffer attachment type: depth + RL_ATTACHMENT_STENCIL = 200, // Framebuffer attachment type: stencil +} rlFramebufferAttachType; + +// Framebuffer texture attachment type +typedef enum { + RL_ATTACHMENT_CUBEMAP_POSITIVE_X = 0, // Framebuffer texture attachment type: cubemap, +X side + RL_ATTACHMENT_CUBEMAP_NEGATIVE_X = 1, // Framebuffer texture attachment type: cubemap, -X side + RL_ATTACHMENT_CUBEMAP_POSITIVE_Y = 2, // Framebuffer texture attachment type: cubemap, +Y side + RL_ATTACHMENT_CUBEMAP_NEGATIVE_Y = 3, // Framebuffer texture attachment type: cubemap, -Y side + RL_ATTACHMENT_CUBEMAP_POSITIVE_Z = 4, // Framebuffer texture attachment type: cubemap, +Z side + RL_ATTACHMENT_CUBEMAP_NEGATIVE_Z = 5, // Framebuffer texture attachment type: cubemap, -Z side + RL_ATTACHMENT_TEXTURE2D = 100, // Framebuffer texture attachment type: texture2d + RL_ATTACHMENT_RENDERBUFFER = 200, // Framebuffer texture attachment type: renderbuffer +} rlFramebufferAttachTextureType; + +// Face culling mode +typedef enum { + RL_CULL_FACE_FRONT = 0, + RL_CULL_FACE_BACK +} rlCullMode; + +//------------------------------------------------------------------------------------ +// Functions Declaration - Matrix operations +//------------------------------------------------------------------------------------ + +#if defined(__cplusplus) +extern "C" { // Prevents name mangling of functions +#endif + +RLAPI void rlMatrixMode(int mode); // Choose the current matrix to be transformed +RLAPI void rlPushMatrix(void); // Push the current matrix to stack +RLAPI void rlPopMatrix(void); // Pop latest inserted matrix from stack +RLAPI void rlLoadIdentity(void); // Reset current matrix to identity matrix +RLAPI void rlTranslatef(float x, float y, float z); // Multiply the current matrix by a translation matrix +RLAPI void rlRotatef(float angle, float x, float y, float z); // Multiply the current matrix by a rotation matrix +RLAPI void rlScalef(float x, float y, float z); // Multiply the current matrix by a scaling matrix +RLAPI void rlMultMatrixf(const float *matf); // Multiply the current matrix by another matrix +RLAPI void rlFrustum(double left, double right, double bottom, double top, double znear, double zfar); +RLAPI void rlOrtho(double left, double right, double bottom, double top, double znear, double zfar); +RLAPI void rlViewport(int x, int y, int width, int height); // Set the viewport area +RLAPI void rlSetClipPlanes(double nearPlane, double farPlane); // Set clip planes distances +RLAPI double rlGetCullDistanceNear(void); // Get cull plane distance near +RLAPI double rlGetCullDistanceFar(void); // Get cull plane distance far + +//------------------------------------------------------------------------------------ +// Functions Declaration - Vertex level operations +//------------------------------------------------------------------------------------ +RLAPI void rlBegin(int mode); // Initialize drawing mode (how to organize vertex) +RLAPI void rlEnd(void); // Finish vertex providing +RLAPI void rlVertex2i(int x, int y); // Define one vertex (position) - 2 int +RLAPI void rlVertex2f(float x, float y); // Define one vertex (position) - 2 float +RLAPI void rlVertex3f(float x, float y, float z); // Define one vertex (position) - 3 float +RLAPI void rlTexCoord2f(float x, float y); // Define one vertex (texture coordinate) - 2 float +RLAPI void rlNormal3f(float x, float y, float z); // Define one vertex (normal) - 3 float +RLAPI void rlColor4ub(unsigned char r, unsigned char g, unsigned char b, unsigned char a); // Define one vertex (color) - 4 byte +RLAPI void rlColor3f(float x, float y, float z); // Define one vertex (color) - 3 float +RLAPI void rlColor4f(float x, float y, float z, float w); // Define one vertex (color) - 4 float + +//------------------------------------------------------------------------------------ +// Functions Declaration - OpenGL style functions (common to 1.1, 3.3+, ES2) +// NOTE: This functions are used to completely abstract raylib code from OpenGL layer, +// some of them are direct wrappers over OpenGL calls, some others are custom +//------------------------------------------------------------------------------------ + +// Vertex buffers state +RLAPI bool rlEnableVertexArray(unsigned int vaoId); // Enable vertex array (VAO, if supported) +RLAPI void rlDisableVertexArray(void); // Disable vertex array (VAO, if supported) +RLAPI void rlEnableVertexBuffer(unsigned int id); // Enable vertex buffer (VBO) +RLAPI void rlDisableVertexBuffer(void); // Disable vertex buffer (VBO) +RLAPI void rlEnableVertexBufferElement(unsigned int id); // Enable vertex buffer element (VBO element) +RLAPI void rlDisableVertexBufferElement(void); // Disable vertex buffer element (VBO element) +RLAPI void rlEnableVertexAttribute(unsigned int index); // Enable vertex attribute index +RLAPI void rlDisableVertexAttribute(unsigned int index); // Disable vertex attribute index +#if defined(GRAPHICS_API_OPENGL_11) +RLAPI void rlEnableStatePointer(int vertexAttribType, void *buffer); // Enable attribute state pointer +RLAPI void rlDisableStatePointer(int vertexAttribType); // Disable attribute state pointer +#endif + +// Textures state +RLAPI void rlActiveTextureSlot(int slot); // Select and active a texture slot +RLAPI void rlEnableTexture(unsigned int id); // Enable texture +RLAPI void rlDisableTexture(void); // Disable texture +RLAPI void rlEnableTextureCubemap(unsigned int id); // Enable texture cubemap +RLAPI void rlDisableTextureCubemap(void); // Disable texture cubemap +RLAPI void rlTextureParameters(unsigned int id, int param, int value); // Set texture parameters (filter, wrap) +RLAPI void rlCubemapParameters(unsigned int id, int param, int value); // Set cubemap parameters (filter, wrap) + +// Shader state +RLAPI void rlEnableShader(unsigned int id); // Enable shader program +RLAPI void rlDisableShader(void); // Disable shader program + +// Framebuffer state +RLAPI void rlEnableFramebuffer(unsigned int id); // Enable render texture (fbo) +RLAPI void rlDisableFramebuffer(void); // Disable render texture (fbo), return to default framebuffer +RLAPI unsigned int rlGetActiveFramebuffer(void); // Get the currently active render texture (fbo), 0 for default framebuffer +RLAPI void rlActiveDrawBuffers(int count); // Activate multiple draw color buffers +RLAPI void rlBlitFramebuffer(int srcX, int srcY, int srcWidth, int srcHeight, int dstX, int dstY, int dstWidth, int dstHeight, int bufferMask); // Blit active framebuffer to main framebuffer +RLAPI void rlBindFramebuffer(unsigned int target, unsigned int framebuffer); // Bind framebuffer (FBO) + +// General render state +RLAPI void rlEnableColorBlend(void); // Enable color blending +RLAPI void rlDisableColorBlend(void); // Disable color blending +RLAPI void rlEnableDepthTest(void); // Enable depth test +RLAPI void rlDisableDepthTest(void); // Disable depth test +RLAPI void rlEnableDepthMask(void); // Enable depth write +RLAPI void rlDisableDepthMask(void); // Disable depth write +RLAPI void rlEnableBackfaceCulling(void); // Enable backface culling +RLAPI void rlDisableBackfaceCulling(void); // Disable backface culling +RLAPI void rlColorMask(bool r, bool g, bool b, bool a); // Color mask control +RLAPI void rlSetCullFace(int mode); // Set face culling mode +RLAPI void rlEnableScissorTest(void); // Enable scissor test +RLAPI void rlDisableScissorTest(void); // Disable scissor test +RLAPI void rlScissor(int x, int y, int width, int height); // Scissor test +RLAPI void rlEnableWireMode(void); // Enable wire mode +RLAPI void rlEnablePointMode(void); // Enable point mode +RLAPI void rlDisableWireMode(void); // Disable wire (and point) mode +RLAPI void rlSetLineWidth(float width); // Set the line drawing width +RLAPI float rlGetLineWidth(void); // Get the line drawing width +RLAPI void rlEnableSmoothLines(void); // Enable line aliasing +RLAPI void rlDisableSmoothLines(void); // Disable line aliasing +RLAPI void rlEnableStereoRender(void); // Enable stereo rendering +RLAPI void rlDisableStereoRender(void); // Disable stereo rendering +RLAPI bool rlIsStereoRenderEnabled(void); // Check if stereo render is enabled + +RLAPI void rlClearColor(unsigned char r, unsigned char g, unsigned char b, unsigned char a); // Clear color buffer with color +RLAPI void rlClearScreenBuffers(void); // Clear used screen buffers (color and depth) +RLAPI void rlCheckErrors(void); // Check and log OpenGL error codes +RLAPI void rlSetBlendMode(int mode); // Set blending mode +RLAPI void rlSetBlendFactors(int glSrcFactor, int glDstFactor, int glEquation); // Set blending mode factor and equation (using OpenGL factors) +RLAPI void rlSetBlendFactorsSeparate(int glSrcRGB, int glDstRGB, int glSrcAlpha, int glDstAlpha, int glEqRGB, int glEqAlpha); // Set blending mode factors and equations separately (using OpenGL factors) + +//------------------------------------------------------------------------------------ +// Functions Declaration - rlgl functionality +//------------------------------------------------------------------------------------ +// rlgl initialization functions +RLAPI void rlglInit(int width, int height); // Initialize rlgl (buffers, shaders, textures, states) +RLAPI void rlglClose(void); // De-initialize rlgl (buffers, shaders, textures) +RLAPI void rlLoadExtensions(void *loader); // Load OpenGL extensions (loader function required) +RLAPI int rlGetVersion(void); // Get current OpenGL version +RLAPI void rlSetFramebufferWidth(int width); // Set current framebuffer width +RLAPI int rlGetFramebufferWidth(void); // Get default framebuffer width +RLAPI void rlSetFramebufferHeight(int height); // Set current framebuffer height +RLAPI int rlGetFramebufferHeight(void); // Get default framebuffer height + +RLAPI unsigned int rlGetTextureIdDefault(void); // Get default texture id +RLAPI unsigned int rlGetShaderIdDefault(void); // Get default shader id +RLAPI int *rlGetShaderLocsDefault(void); // Get default shader locations + +// Render batch management +// NOTE: rlgl provides a default render batch to behave like OpenGL 1.1 immediate mode +// but this render batch API is exposed in case of custom batches are required +RLAPI rlRenderBatch rlLoadRenderBatch(int numBuffers, int bufferElements); // Load a render batch system +RLAPI void rlUnloadRenderBatch(rlRenderBatch batch); // Unload render batch system +RLAPI void rlDrawRenderBatch(rlRenderBatch *batch); // Draw render batch data (Update->Draw->Reset) +RLAPI void rlSetRenderBatchActive(rlRenderBatch *batch); // Set the active render batch for rlgl (NULL for default internal) +RLAPI void rlDrawRenderBatchActive(void); // Update and draw internal render batch +RLAPI bool rlCheckRenderBatchLimit(int vCount); // Check internal buffer overflow for a given number of vertex + +RLAPI void rlSetTexture(unsigned int id); // Set current texture for render batch and check buffers limits + +//------------------------------------------------------------------------------------------------------------------------ + +// Vertex buffers management +RLAPI unsigned int rlLoadVertexArray(void); // Load vertex array (vao) if supported +RLAPI unsigned int rlLoadVertexBuffer(const void *buffer, int size, bool dynamic); // Load a vertex buffer object +RLAPI unsigned int rlLoadVertexBufferElement(const void *buffer, int size, bool dynamic); // Load vertex buffer elements object +RLAPI void rlUpdateVertexBuffer(unsigned int bufferId, const void *data, int dataSize, int offset); // Update vertex buffer object data on GPU buffer +RLAPI void rlUpdateVertexBufferElements(unsigned int id, const void *data, int dataSize, int offset); // Update vertex buffer elements data on GPU buffer +RLAPI void rlUnloadVertexArray(unsigned int vaoId); // Unload vertex array (vao) +RLAPI void rlUnloadVertexBuffer(unsigned int vboId); // Unload vertex buffer object +RLAPI void rlSetVertexAttribute(unsigned int index, int compSize, int type, bool normalized, int stride, int offset); // Set vertex attribute data configuration +RLAPI void rlSetVertexAttributeDivisor(unsigned int index, int divisor); // Set vertex attribute data divisor +RLAPI void rlSetVertexAttributeDefault(int locIndex, const void *value, int attribType, int count); // Set vertex attribute default value, when attribute to provided +RLAPI void rlDrawVertexArray(int offset, int count); // Draw vertex array (currently active vao) +RLAPI void rlDrawVertexArrayElements(int offset, int count, const void *buffer); // Draw vertex array elements +RLAPI void rlDrawVertexArrayInstanced(int offset, int count, int instances); // Draw vertex array (currently active vao) with instancing +RLAPI void rlDrawVertexArrayElementsInstanced(int offset, int count, const void *buffer, int instances); // Draw vertex array elements with instancing + +// Textures management +RLAPI unsigned int rlLoadTexture(const void *data, int width, int height, int format, int mipmapCount); // Load texture data +RLAPI unsigned int rlLoadTextureDepth(int width, int height, bool useRenderBuffer); // Load depth texture/renderbuffer (to be attached to fbo) +RLAPI unsigned int rlLoadTextureCubemap(const void *data, int size, int format, int mipmapCount); // Load texture cubemap data +RLAPI void rlUpdateTexture(unsigned int id, int offsetX, int offsetY, int width, int height, int format, const void *data); // Update texture with new data on GPU +RLAPI void rlGetGlTextureFormats(int format, unsigned int *glInternalFormat, unsigned int *glFormat, unsigned int *glType); // Get OpenGL internal formats +RLAPI const char *rlGetPixelFormatName(unsigned int format); // Get name string for pixel format +RLAPI void rlUnloadTexture(unsigned int id); // Unload texture from GPU memory +RLAPI void rlGenTextureMipmaps(unsigned int id, int width, int height, int format, int *mipmaps); // Generate mipmap data for selected texture +RLAPI void *rlReadTexturePixels(unsigned int id, int width, int height, int format); // Read texture pixel data +RLAPI unsigned char *rlReadScreenPixels(int width, int height); // Read screen pixel data (color buffer) + +// Framebuffer management (fbo) +RLAPI unsigned int rlLoadFramebuffer(void); // Load an empty framebuffer +RLAPI void rlFramebufferAttach(unsigned int fboId, unsigned int texId, int attachType, int texType, int mipLevel); // Attach texture/renderbuffer to a framebuffer +RLAPI bool rlFramebufferComplete(unsigned int id); // Verify framebuffer is complete +RLAPI void rlUnloadFramebuffer(unsigned int id); // Delete framebuffer from GPU + +// Shaders management +RLAPI unsigned int rlLoadShaderCode(const char *vsCode, const char *fsCode); // Load shader from code strings +RLAPI unsigned int rlCompileShader(const char *shaderCode, int type); // Compile custom shader and return shader id (type: RL_VERTEX_SHADER, RL_FRAGMENT_SHADER, RL_COMPUTE_SHADER) +RLAPI unsigned int rlLoadShaderProgram(unsigned int vShaderId, unsigned int fShaderId); // Load custom shader program +RLAPI void rlUnloadShaderProgram(unsigned int id); // Unload shader program +RLAPI int rlGetLocationUniform(unsigned int shaderId, const char *uniformName); // Get shader location uniform +RLAPI int rlGetLocationAttrib(unsigned int shaderId, const char *attribName); // Get shader location attribute +RLAPI void rlSetUniform(int locIndex, const void *value, int uniformType, int count); // Set shader value uniform +RLAPI void rlSetUniformMatrix(int locIndex, Matrix mat); // Set shader value matrix +RLAPI void rlSetUniformMatrices(int locIndex, const Matrix *mat, int count); // Set shader value matrices +RLAPI void rlSetUniformSampler(int locIndex, unsigned int textureId); // Set shader value sampler +RLAPI void rlSetShader(unsigned int id, int *locs); // Set shader currently active (id and locations) + +// Compute shader management +RLAPI unsigned int rlLoadComputeShaderProgram(unsigned int shaderId); // Load compute shader program +RLAPI void rlComputeShaderDispatch(unsigned int groupX, unsigned int groupY, unsigned int groupZ); // Dispatch compute shader (equivalent to *draw* for graphics pipeline) + +// Shader buffer storage object management (ssbo) +RLAPI unsigned int rlLoadShaderBuffer(unsigned int size, const void *data, int usageHint); // Load shader storage buffer object (SSBO) +RLAPI void rlUnloadShaderBuffer(unsigned int ssboId); // Unload shader storage buffer object (SSBO) +RLAPI void rlUpdateShaderBuffer(unsigned int id, const void *data, unsigned int dataSize, unsigned int offset); // Update SSBO buffer data +RLAPI void rlBindShaderBuffer(unsigned int id, unsigned int index); // Bind SSBO buffer +RLAPI void rlReadShaderBuffer(unsigned int id, void *dest, unsigned int count, unsigned int offset); // Read SSBO buffer data (GPU->CPU) +RLAPI void rlCopyShaderBuffer(unsigned int destId, unsigned int srcId, unsigned int destOffset, unsigned int srcOffset, unsigned int count); // Copy SSBO data between buffers +RLAPI unsigned int rlGetShaderBufferSize(unsigned int id); // Get SSBO buffer size + +// Buffer management +RLAPI void rlBindImageTexture(unsigned int id, unsigned int index, int format, bool readonly); // Bind image texture + +// Matrix state management +RLAPI Matrix rlGetMatrixModelview(void); // Get internal modelview matrix +RLAPI Matrix rlGetMatrixProjection(void); // Get internal projection matrix +RLAPI Matrix rlGetMatrixTransform(void); // Get internal accumulated transform matrix +RLAPI Matrix rlGetMatrixProjectionStereo(int eye); // Get internal projection matrix for stereo render (selected eye) +RLAPI Matrix rlGetMatrixViewOffsetStereo(int eye); // Get internal view offset matrix for stereo render (selected eye) +RLAPI void rlSetMatrixProjection(Matrix proj); // Set a custom projection matrix (replaces internal projection matrix) +RLAPI void rlSetMatrixModelview(Matrix view); // Set a custom modelview matrix (replaces internal modelview matrix) +RLAPI void rlSetMatrixProjectionStereo(Matrix right, Matrix left); // Set eyes projection matrices for stereo rendering +RLAPI void rlSetMatrixViewOffsetStereo(Matrix right, Matrix left); // Set eyes view offsets matrices for stereo rendering + +// Quick and dirty cube/quad buffers load->draw->unload +RLAPI void rlLoadDrawCube(void); // Load and draw a cube +RLAPI void rlLoadDrawQuad(void); // Load and draw a quad + +#if defined(__cplusplus) +} +#endif + +#endif // RLGL_H + +/*********************************************************************************** +* +* RLGL IMPLEMENTATION +* +************************************************************************************/ + +#if defined(RLGL_IMPLEMENTATION) + +// Expose OpenGL functions from glad in raylib +#if defined(BUILD_LIBTYPE_SHARED) + #define GLAD_API_CALL_EXPORT + #define GLAD_API_CALL_EXPORT_BUILD +#endif + +#if defined(GRAPHICS_API_OPENGL_11) + #if defined(__APPLE__) + #include <OpenGL/gl.h> // OpenGL 1.1 library for OSX + #include <OpenGL/glext.h> // OpenGL extensions library + #else + // APIENTRY for OpenGL function pointer declarations is required + #if !defined(APIENTRY) + #if defined(_WIN32) + #define APIENTRY __stdcall + #else + #define APIENTRY + #endif + #endif + // WINGDIAPI definition. Some Windows OpenGL headers need it + #if !defined(WINGDIAPI) && defined(_WIN32) + #define WINGDIAPI __declspec(dllimport) + #endif + + #include <GL/gl.h> // OpenGL 1.1 library + #endif +#endif + +#if defined(GRAPHICS_API_OPENGL_33) + #define GLAD_MALLOC RL_MALLOC + #define GLAD_FREE RL_FREE + + #define GLAD_GL_IMPLEMENTATION + #include "external/glad.h" // GLAD extensions loading library, includes OpenGL headers +#endif + +#if defined(GRAPHICS_API_OPENGL_ES3) + #include <GLES3/gl3.h> // OpenGL ES 3.0 library + #define GL_GLEXT_PROTOTYPES + #include <GLES2/gl2ext.h> // OpenGL ES 2.0 extensions library +#elif defined(GRAPHICS_API_OPENGL_ES2) + // NOTE: OpenGL ES 2.0 can be enabled on Desktop platforms, + // in that case, functions are loaded from a custom glad for OpenGL ES 2.0 + #if defined(PLATFORM_DESKTOP_GLFW) || defined(PLATFORM_DESKTOP_SDL) + #define GLAD_GLES2_IMPLEMENTATION + #include "external/glad_gles2.h" + #else + #define GL_GLEXT_PROTOTYPES + //#include <EGL/egl.h> // EGL library -> not required, platform layer + #include <GLES2/gl2.h> // OpenGL ES 2.0 library + #include <GLES2/gl2ext.h> // OpenGL ES 2.0 extensions library + #endif + + // It seems OpenGL ES 2.0 instancing entry points are not defined on Raspberry Pi + // provided headers (despite being defined in official Khronos GLES2 headers) + #if defined(PLATFORM_DRM) + typedef void (GL_APIENTRYP PFNGLDRAWARRAYSINSTANCEDEXTPROC) (GLenum mode, GLint start, GLsizei count, GLsizei primcount); + typedef void (GL_APIENTRYP PFNGLDRAWELEMENTSINSTANCEDEXTPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei primcount); + typedef void (GL_APIENTRYP PFNGLVERTEXATTRIBDIVISOREXTPROC) (GLuint index, GLuint divisor); + #endif +#endif + +#include <stdlib.h> // Required for: malloc(), free() +#include <string.h> // Required for: strcmp(), strlen() [Used in rlglInit(), on extensions loading] +#include <math.h> // Required for: sqrtf(), sinf(), cosf(), floor(), log() + +//---------------------------------------------------------------------------------- +// Defines and Macros +//---------------------------------------------------------------------------------- +#ifndef PI + #define PI 3.14159265358979323846f +#endif +#ifndef DEG2RAD + #define DEG2RAD (PI/180.0f) +#endif +#ifndef RAD2DEG + #define RAD2DEG (180.0f/PI) +#endif + +#ifndef GL_SHADING_LANGUAGE_VERSION + #define GL_SHADING_LANGUAGE_VERSION 0x8B8C +#endif + +#ifndef GL_COMPRESSED_RGB_S3TC_DXT1_EXT + #define GL_COMPRESSED_RGB_S3TC_DXT1_EXT 0x83F0 +#endif +#ifndef GL_COMPRESSED_RGBA_S3TC_DXT1_EXT + #define GL_COMPRESSED_RGBA_S3TC_DXT1_EXT 0x83F1 +#endif +#ifndef GL_COMPRESSED_RGBA_S3TC_DXT3_EXT + #define GL_COMPRESSED_RGBA_S3TC_DXT3_EXT 0x83F2 +#endif +#ifndef GL_COMPRESSED_RGBA_S3TC_DXT5_EXT + #define GL_COMPRESSED_RGBA_S3TC_DXT5_EXT 0x83F3 +#endif +#ifndef GL_ETC1_RGB8_OES + #define GL_ETC1_RGB8_OES 0x8D64 +#endif +#ifndef GL_COMPRESSED_RGB8_ETC2 + #define GL_COMPRESSED_RGB8_ETC2 0x9274 +#endif +#ifndef GL_COMPRESSED_RGBA8_ETC2_EAC + #define GL_COMPRESSED_RGBA8_ETC2_EAC 0x9278 +#endif +#ifndef GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG + #define GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG 0x8C00 +#endif +#ifndef GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG + #define GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG 0x8C02 +#endif +#ifndef GL_COMPRESSED_RGBA_ASTC_4x4_KHR + #define GL_COMPRESSED_RGBA_ASTC_4x4_KHR 0x93b0 +#endif +#ifndef GL_COMPRESSED_RGBA_ASTC_8x8_KHR + #define GL_COMPRESSED_RGBA_ASTC_8x8_KHR 0x93b7 +#endif + +#ifndef GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT + #define GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT 0x84FF +#endif +#ifndef GL_TEXTURE_MAX_ANISOTROPY_EXT + #define GL_TEXTURE_MAX_ANISOTROPY_EXT 0x84FE +#endif + +#ifndef GL_PROGRAM_POINT_SIZE + #define GL_PROGRAM_POINT_SIZE 0x8642 +#endif + +#ifndef GL_LINE_WIDTH + #define GL_LINE_WIDTH 0x0B21 +#endif + +#if defined(GRAPHICS_API_OPENGL_11) + #define GL_UNSIGNED_SHORT_5_6_5 0x8363 + #define GL_UNSIGNED_SHORT_5_5_5_1 0x8034 + #define GL_UNSIGNED_SHORT_4_4_4_4 0x8033 +#endif + +#if defined(GRAPHICS_API_OPENGL_21) + #define GL_LUMINANCE 0x1909 + #define GL_LUMINANCE_ALPHA 0x190A +#endif + +#if defined(GRAPHICS_API_OPENGL_ES2) + #define glClearDepth glClearDepthf + #if !defined(GRAPHICS_API_OPENGL_ES3) + #define GL_READ_FRAMEBUFFER GL_FRAMEBUFFER + #define GL_DRAW_FRAMEBUFFER GL_FRAMEBUFFER + #endif +#endif + +// Default shader vertex attribute names to set location points +#ifndef RL_DEFAULT_SHADER_ATTRIB_NAME_POSITION + #define RL_DEFAULT_SHADER_ATTRIB_NAME_POSITION "vertexPosition" // Bound by default to shader location: RL_DEFAULT_SHADER_ATTRIB_NAME_POSITION +#endif +#ifndef RL_DEFAULT_SHADER_ATTRIB_NAME_TEXCOORD + #define RL_DEFAULT_SHADER_ATTRIB_NAME_TEXCOORD "vertexTexCoord" // Bound by default to shader location: RL_DEFAULT_SHADER_ATTRIB_NAME_TEXCOORD +#endif +#ifndef RL_DEFAULT_SHADER_ATTRIB_NAME_NORMAL + #define RL_DEFAULT_SHADER_ATTRIB_NAME_NORMAL "vertexNormal" // Bound by default to shader location: RL_DEFAULT_SHADER_ATTRIB_NAME_NORMAL +#endif +#ifndef RL_DEFAULT_SHADER_ATTRIB_NAME_COLOR + #define RL_DEFAULT_SHADER_ATTRIB_NAME_COLOR "vertexColor" // Bound by default to shader location: RL_DEFAULT_SHADER_ATTRIB_NAME_COLOR +#endif +#ifndef RL_DEFAULT_SHADER_ATTRIB_NAME_TANGENT + #define RL_DEFAULT_SHADER_ATTRIB_NAME_TANGENT "vertexTangent" // Bound by default to shader location: RL_DEFAULT_SHADER_ATTRIB_NAME_TANGENT +#endif +#ifndef RL_DEFAULT_SHADER_ATTRIB_NAME_TEXCOORD2 + #define RL_DEFAULT_SHADER_ATTRIB_NAME_TEXCOORD2 "vertexTexCoord2" // Bound by default to shader location: RL_DEFAULT_SHADER_ATTRIB_NAME_TEXCOORD2 +#endif +#ifndef RL_DEFAULT_SHADER_ATTRIB_NAME_BONEIDS + #define RL_DEFAULT_SHADER_ATTRIB_NAME_BONEIDS "vertexBoneIds" // Bound by default to shader location: RL_DEFAULT_SHADER_ATTRIB_NAME_BONEIDS +#endif +#ifndef RL_DEFAULT_SHADER_ATTRIB_NAME_BONEWEIGHTS + #define RL_DEFAULT_SHADER_ATTRIB_NAME_BONEWEIGHTS "vertexBoneWeights" // Bound by default to shader location: RL_DEFAULT_SHADER_ATTRIB_NAME_BONEWEIGHTS +#endif + +#ifndef RL_DEFAULT_SHADER_UNIFORM_NAME_MVP + #define RL_DEFAULT_SHADER_UNIFORM_NAME_MVP "mvp" // model-view-projection matrix +#endif +#ifndef RL_DEFAULT_SHADER_UNIFORM_NAME_VIEW + #define RL_DEFAULT_SHADER_UNIFORM_NAME_VIEW "matView" // view matrix +#endif +#ifndef RL_DEFAULT_SHADER_UNIFORM_NAME_PROJECTION + #define RL_DEFAULT_SHADER_UNIFORM_NAME_PROJECTION "matProjection" // projection matrix +#endif +#ifndef RL_DEFAULT_SHADER_UNIFORM_NAME_MODEL + #define RL_DEFAULT_SHADER_UNIFORM_NAME_MODEL "matModel" // model matrix +#endif +#ifndef RL_DEFAULT_SHADER_UNIFORM_NAME_NORMAL + #define RL_DEFAULT_SHADER_UNIFORM_NAME_NORMAL "matNormal" // normal matrix (transpose(inverse(matModelView)) +#endif +#ifndef RL_DEFAULT_SHADER_UNIFORM_NAME_COLOR + #define RL_DEFAULT_SHADER_UNIFORM_NAME_COLOR "colDiffuse" // color diffuse (base tint color, multiplied by texture color) +#endif +#ifndef RL_DEFAULT_SHADER_UNIFORM_NAME_BONE_MATRICES + #define RL_DEFAULT_SHADER_UNIFORM_NAME_BONE_MATRICES "boneMatrices" // bone matrices +#endif +#ifndef RL_DEFAULT_SHADER_SAMPLER2D_NAME_TEXTURE0 + #define RL_DEFAULT_SHADER_SAMPLER2D_NAME_TEXTURE0 "texture0" // texture0 (texture slot active 0) +#endif +#ifndef RL_DEFAULT_SHADER_SAMPLER2D_NAME_TEXTURE1 + #define RL_DEFAULT_SHADER_SAMPLER2D_NAME_TEXTURE1 "texture1" // texture1 (texture slot active 1) +#endif +#ifndef RL_DEFAULT_SHADER_SAMPLER2D_NAME_TEXTURE2 + #define RL_DEFAULT_SHADER_SAMPLER2D_NAME_TEXTURE2 "texture2" // texture2 (texture slot active 2) +#endif + +//---------------------------------------------------------------------------------- +// Types and Structures Definition +//---------------------------------------------------------------------------------- +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) +typedef struct rlglData { + rlRenderBatch *currentBatch; // Current render batch + rlRenderBatch defaultBatch; // Default internal render batch + + struct { + int vertexCounter; // Current active render batch vertex counter (generic, used for all batches) + float texcoordx, texcoordy; // Current active texture coordinate (added on glVertex*()) + float normalx, normaly, normalz; // Current active normal (added on glVertex*()) + unsigned char colorr, colorg, colorb, colora; // Current active color (added on glVertex*()) + + int currentMatrixMode; // Current matrix mode + Matrix *currentMatrix; // Current matrix pointer + Matrix modelview; // Default modelview matrix + Matrix projection; // Default projection matrix + Matrix transform; // Transform matrix to be used with rlTranslate, rlRotate, rlScale + bool transformRequired; // Require transform matrix application to current draw-call vertex (if required) + Matrix stack[RL_MAX_MATRIX_STACK_SIZE];// Matrix stack for push/pop + int stackCounter; // Matrix stack counter + + unsigned int defaultTextureId; // Default texture used on shapes/poly drawing (required by shader) + unsigned int activeTextureId[RL_DEFAULT_BATCH_MAX_TEXTURE_UNITS]; // Active texture ids to be enabled on batch drawing (0 active by default) + unsigned int defaultVShaderId; // Default vertex shader id (used by default shader program) + unsigned int defaultFShaderId; // Default fragment shader id (used by default shader program) + unsigned int defaultShaderId; // Default shader program id, supports vertex color and diffuse texture + int *defaultShaderLocs; // Default shader locations pointer to be used on rendering + unsigned int currentShaderId; // Current shader id to be used on rendering (by default, defaultShaderId) + int *currentShaderLocs; // Current shader locations pointer to be used on rendering (by default, defaultShaderLocs) + + bool stereoRender; // Stereo rendering flag + Matrix projectionStereo[2]; // VR stereo rendering eyes projection matrices + Matrix viewOffsetStereo[2]; // VR stereo rendering eyes view offset matrices + + // Blending variables + int currentBlendMode; // Blending mode active + int glBlendSrcFactor; // Blending source factor + int glBlendDstFactor; // Blending destination factor + int glBlendEquation; // Blending equation + int glBlendSrcFactorRGB; // Blending source RGB factor + int glBlendDestFactorRGB; // Blending destination RGB factor + int glBlendSrcFactorAlpha; // Blending source alpha factor + int glBlendDestFactorAlpha; // Blending destination alpha factor + int glBlendEquationRGB; // Blending equation for RGB + int glBlendEquationAlpha; // Blending equation for alpha + bool glCustomBlendModeModified; // Custom blending factor and equation modification status + + int framebufferWidth; // Current framebuffer width + int framebufferHeight; // Current framebuffer height + + } State; // Renderer state + struct { + bool vao; // VAO support (OpenGL ES2 could not support VAO extension) (GL_ARB_vertex_array_object) + bool instancing; // Instancing supported (GL_ANGLE_instanced_arrays, GL_EXT_draw_instanced + GL_EXT_instanced_arrays) + bool texNPOT; // NPOT textures full support (GL_ARB_texture_non_power_of_two, GL_OES_texture_npot) + bool texDepth; // Depth textures supported (GL_ARB_depth_texture, GL_OES_depth_texture) + bool texDepthWebGL; // Depth textures supported WebGL specific (GL_WEBGL_depth_texture) + bool texFloat32; // float textures support (32 bit per channel) (GL_OES_texture_float) + bool texFloat16; // half float textures support (16 bit per channel) (GL_OES_texture_half_float) + bool texCompDXT; // DDS texture compression support (GL_EXT_texture_compression_s3tc, GL_WEBGL_compressed_texture_s3tc, GL_WEBKIT_WEBGL_compressed_texture_s3tc) + bool texCompETC1; // ETC1 texture compression support (GL_OES_compressed_ETC1_RGB8_texture, GL_WEBGL_compressed_texture_etc1) + bool texCompETC2; // ETC2/EAC texture compression support (GL_ARB_ES3_compatibility) + bool texCompPVRT; // PVR texture compression support (GL_IMG_texture_compression_pvrtc) + bool texCompASTC; // ASTC texture compression support (GL_KHR_texture_compression_astc_hdr, GL_KHR_texture_compression_astc_ldr) + bool texMirrorClamp; // Clamp mirror wrap mode supported (GL_EXT_texture_mirror_clamp) + bool texAnisoFilter; // Anisotropic texture filtering support (GL_EXT_texture_filter_anisotropic) + bool computeShader; // Compute shaders support (GL_ARB_compute_shader) + bool ssbo; // Shader storage buffer object support (GL_ARB_shader_storage_buffer_object) + + float maxAnisotropyLevel; // Maximum anisotropy level supported (minimum is 2.0f) + int maxDepthBits; // Maximum bits for depth component + + } ExtSupported; // Extensions supported flags +} rlglData; + +typedef void *(*rlglLoadProc)(const char *name); // OpenGL extension functions loader signature (same as GLADloadproc) + +#endif // GRAPHICS_API_OPENGL_33 || GRAPHICS_API_OPENGL_ES2 + +//---------------------------------------------------------------------------------- +// Global Variables Definition +//---------------------------------------------------------------------------------- +static double rlCullDistanceNear = RL_CULL_DISTANCE_NEAR; +static double rlCullDistanceFar = RL_CULL_DISTANCE_FAR; + +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) +static rlglData RLGL = { 0 }; +#endif // GRAPHICS_API_OPENGL_33 || GRAPHICS_API_OPENGL_ES2 + +#if defined(GRAPHICS_API_OPENGL_ES2) && !defined(GRAPHICS_API_OPENGL_ES3) +// NOTE: VAO functionality is exposed through extensions (OES) +static PFNGLGENVERTEXARRAYSOESPROC glGenVertexArrays = NULL; +static PFNGLBINDVERTEXARRAYOESPROC glBindVertexArray = NULL; +static PFNGLDELETEVERTEXARRAYSOESPROC glDeleteVertexArrays = NULL; + +// NOTE: Instancing functionality could also be available through extension +static PFNGLDRAWARRAYSINSTANCEDEXTPROC glDrawArraysInstanced = NULL; +static PFNGLDRAWELEMENTSINSTANCEDEXTPROC glDrawElementsInstanced = NULL; +static PFNGLVERTEXATTRIBDIVISOREXTPROC glVertexAttribDivisor = NULL; +#endif + +//---------------------------------------------------------------------------------- +// Module specific Functions Declaration +//---------------------------------------------------------------------------------- +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) +static void rlLoadShaderDefault(void); // Load default shader +static void rlUnloadShaderDefault(void); // Unload default shader +#if defined(RLGL_SHOW_GL_DETAILS_INFO) +static const char *rlGetCompressedFormatName(int format); // Get compressed format official GL identifier name +#endif // RLGL_SHOW_GL_DETAILS_INFO +#endif // GRAPHICS_API_OPENGL_33 || GRAPHICS_API_OPENGL_ES2 + +static int rlGetPixelDataSize(int width, int height, int format); // Get pixel data size in bytes (image or texture) + +// Auxiliar matrix math functions +typedef struct rl_float16 { + float v[16]; +} rl_float16; +static rl_float16 rlMatrixToFloatV(Matrix mat); // Get float array of matrix data +#define rlMatrixToFloat(mat) (rlMatrixToFloatV(mat).v) // Get float vector for Matrix +static Matrix rlMatrixIdentity(void); // Get identity matrix +static Matrix rlMatrixMultiply(Matrix left, Matrix right); // Multiply two matrices +static Matrix rlMatrixTranspose(Matrix mat); // Transposes provided matrix +static Matrix rlMatrixInvert(Matrix mat); // Invert provided matrix + +//---------------------------------------------------------------------------------- +// Module Functions Definition - Matrix operations +//---------------------------------------------------------------------------------- + +#if defined(GRAPHICS_API_OPENGL_11) +// Fallback to OpenGL 1.1 function calls +//--------------------------------------- +void rlMatrixMode(int mode) +{ + switch (mode) + { + case RL_PROJECTION: glMatrixMode(GL_PROJECTION); break; + case RL_MODELVIEW: glMatrixMode(GL_MODELVIEW); break; + case RL_TEXTURE: glMatrixMode(GL_TEXTURE); break; + default: break; + } +} + +void rlFrustum(double left, double right, double bottom, double top, double znear, double zfar) +{ + glFrustum(left, right, bottom, top, znear, zfar); +} + +void rlOrtho(double left, double right, double bottom, double top, double znear, double zfar) +{ + glOrtho(left, right, bottom, top, znear, zfar); +} + +void rlPushMatrix(void) { glPushMatrix(); } +void rlPopMatrix(void) { glPopMatrix(); } +void rlLoadIdentity(void) { glLoadIdentity(); } +void rlTranslatef(float x, float y, float z) { glTranslatef(x, y, z); } +void rlRotatef(float angle, float x, float y, float z) { glRotatef(angle, x, y, z); } +void rlScalef(float x, float y, float z) { glScalef(x, y, z); } +void rlMultMatrixf(const float *matf) { glMultMatrixf(matf); } +#endif +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) +// Choose the current matrix to be transformed +void rlMatrixMode(int mode) +{ + if (mode == RL_PROJECTION) RLGL.State.currentMatrix = &RLGL.State.projection; + else if (mode == RL_MODELVIEW) RLGL.State.currentMatrix = &RLGL.State.modelview; + //else if (mode == RL_TEXTURE) // Not supported + + RLGL.State.currentMatrixMode = mode; +} + +// Push the current matrix into RLGL.State.stack +void rlPushMatrix(void) +{ + if (RLGL.State.stackCounter >= RL_MAX_MATRIX_STACK_SIZE) TRACELOG(RL_LOG_ERROR, "RLGL: Matrix stack overflow (RL_MAX_MATRIX_STACK_SIZE)"); + + if (RLGL.State.currentMatrixMode == RL_MODELVIEW) + { + RLGL.State.transformRequired = true; + RLGL.State.currentMatrix = &RLGL.State.transform; + } + + RLGL.State.stack[RLGL.State.stackCounter] = *RLGL.State.currentMatrix; + RLGL.State.stackCounter++; +} + +// Pop lattest inserted matrix from RLGL.State.stack +void rlPopMatrix(void) +{ + if (RLGL.State.stackCounter > 0) + { + Matrix mat = RLGL.State.stack[RLGL.State.stackCounter - 1]; + *RLGL.State.currentMatrix = mat; + RLGL.State.stackCounter--; + } + + if ((RLGL.State.stackCounter == 0) && (RLGL.State.currentMatrixMode == RL_MODELVIEW)) + { + RLGL.State.currentMatrix = &RLGL.State.modelview; + RLGL.State.transformRequired = false; + } +} + +// Reset current matrix to identity matrix +void rlLoadIdentity(void) +{ + *RLGL.State.currentMatrix = rlMatrixIdentity(); +} + +// Multiply the current matrix by a translation matrix +void rlTranslatef(float x, float y, float z) +{ + Matrix matTranslation = { + 1.0f, 0.0f, 0.0f, x, + 0.0f, 1.0f, 0.0f, y, + 0.0f, 0.0f, 1.0f, z, + 0.0f, 0.0f, 0.0f, 1.0f + }; + + // NOTE: We transpose matrix with multiplication order + *RLGL.State.currentMatrix = rlMatrixMultiply(matTranslation, *RLGL.State.currentMatrix); +} + +// Multiply the current matrix by a rotation matrix +// NOTE: The provided angle must be in degrees +void rlRotatef(float angle, float x, float y, float z) +{ + Matrix matRotation = rlMatrixIdentity(); + + // Axis vector (x, y, z) normalization + float lengthSquared = x*x + y*y + z*z; + if ((lengthSquared != 1.0f) && (lengthSquared != 0.0f)) + { + float inverseLength = 1.0f/sqrtf(lengthSquared); + x *= inverseLength; + y *= inverseLength; + z *= inverseLength; + } + + // Rotation matrix generation + float sinres = sinf(DEG2RAD*angle); + float cosres = cosf(DEG2RAD*angle); + float t = 1.0f - cosres; + + matRotation.m0 = x*x*t + cosres; + matRotation.m1 = y*x*t + z*sinres; + matRotation.m2 = z*x*t - y*sinres; + matRotation.m3 = 0.0f; + + matRotation.m4 = x*y*t - z*sinres; + matRotation.m5 = y*y*t + cosres; + matRotation.m6 = z*y*t + x*sinres; + matRotation.m7 = 0.0f; + + matRotation.m8 = x*z*t + y*sinres; + matRotation.m9 = y*z*t - x*sinres; + matRotation.m10 = z*z*t + cosres; + matRotation.m11 = 0.0f; + + matRotation.m12 = 0.0f; + matRotation.m13 = 0.0f; + matRotation.m14 = 0.0f; + matRotation.m15 = 1.0f; + + // NOTE: We transpose matrix with multiplication order + *RLGL.State.currentMatrix = rlMatrixMultiply(matRotation, *RLGL.State.currentMatrix); +} + +// Multiply the current matrix by a scaling matrix +void rlScalef(float x, float y, float z) +{ + Matrix matScale = { + x, 0.0f, 0.0f, 0.0f, + 0.0f, y, 0.0f, 0.0f, + 0.0f, 0.0f, z, 0.0f, + 0.0f, 0.0f, 0.0f, 1.0f + }; + + // NOTE: We transpose matrix with multiplication order + *RLGL.State.currentMatrix = rlMatrixMultiply(matScale, *RLGL.State.currentMatrix); +} + +// Multiply the current matrix by another matrix +void rlMultMatrixf(const float *matf) +{ + // Matrix creation from array + Matrix mat = { matf[0], matf[4], matf[8], matf[12], + matf[1], matf[5], matf[9], matf[13], + matf[2], matf[6], matf[10], matf[14], + matf[3], matf[7], matf[11], matf[15] }; + + *RLGL.State.currentMatrix = rlMatrixMultiply(mat, *RLGL.State.currentMatrix); +} + +// Multiply the current matrix by a perspective matrix generated by parameters +void rlFrustum(double left, double right, double bottom, double top, double znear, double zfar) +{ + Matrix matFrustum = { 0 }; + + float rl = (float)(right - left); + float tb = (float)(top - bottom); + float fn = (float)(zfar - znear); + + matFrustum.m0 = ((float) znear*2.0f)/rl; + matFrustum.m1 = 0.0f; + matFrustum.m2 = 0.0f; + matFrustum.m3 = 0.0f; + + matFrustum.m4 = 0.0f; + matFrustum.m5 = ((float) znear*2.0f)/tb; + matFrustum.m6 = 0.0f; + matFrustum.m7 = 0.0f; + + matFrustum.m8 = ((float)right + (float)left)/rl; + matFrustum.m9 = ((float)top + (float)bottom)/tb; + matFrustum.m10 = -((float)zfar + (float)znear)/fn; + matFrustum.m11 = -1.0f; + + matFrustum.m12 = 0.0f; + matFrustum.m13 = 0.0f; + matFrustum.m14 = -((float)zfar*(float)znear*2.0f)/fn; + matFrustum.m15 = 0.0f; + + *RLGL.State.currentMatrix = rlMatrixMultiply(*RLGL.State.currentMatrix, matFrustum); +} + +// Multiply the current matrix by an orthographic matrix generated by parameters +void rlOrtho(double left, double right, double bottom, double top, double znear, double zfar) +{ + // NOTE: If left-right and top-botton values are equal it could create a division by zero, + // response to it is platform/compiler dependant + Matrix matOrtho = { 0 }; + + float rl = (float)(right - left); + float tb = (float)(top - bottom); + float fn = (float)(zfar - znear); + + matOrtho.m0 = 2.0f/rl; + matOrtho.m1 = 0.0f; + matOrtho.m2 = 0.0f; + matOrtho.m3 = 0.0f; + matOrtho.m4 = 0.0f; + matOrtho.m5 = 2.0f/tb; + matOrtho.m6 = 0.0f; + matOrtho.m7 = 0.0f; + matOrtho.m8 = 0.0f; + matOrtho.m9 = 0.0f; + matOrtho.m10 = -2.0f/fn; + matOrtho.m11 = 0.0f; + matOrtho.m12 = -((float)left + (float)right)/rl; + matOrtho.m13 = -((float)top + (float)bottom)/tb; + matOrtho.m14 = -((float)zfar + (float)znear)/fn; + matOrtho.m15 = 1.0f; + + *RLGL.State.currentMatrix = rlMatrixMultiply(*RLGL.State.currentMatrix, matOrtho); +} +#endif + +// Set the viewport area (transformation from normalized device coordinates to window coordinates) +// NOTE: We store current viewport dimensions +void rlViewport(int x, int y, int width, int height) +{ + glViewport(x, y, width, height); +} + +// Set clip planes distances +void rlSetClipPlanes(double nearPlane, double farPlane) +{ + rlCullDistanceNear = nearPlane; + rlCullDistanceFar = farPlane; +} + +// Get cull plane distance near +double rlGetCullDistanceNear(void) +{ + return rlCullDistanceNear; +} + +// Get cull plane distance far +double rlGetCullDistanceFar(void) +{ + return rlCullDistanceFar; +} + +//---------------------------------------------------------------------------------- +// Module Functions Definition - Vertex level operations +//---------------------------------------------------------------------------------- +#if defined(GRAPHICS_API_OPENGL_11) +// Fallback to OpenGL 1.1 function calls +//--------------------------------------- +void rlBegin(int mode) +{ + switch (mode) + { + case RL_LINES: glBegin(GL_LINES); break; + case RL_TRIANGLES: glBegin(GL_TRIANGLES); break; + case RL_QUADS: glBegin(GL_QUADS); break; + default: break; + } +} + +void rlEnd(void) { glEnd(); } +void rlVertex2i(int x, int y) { glVertex2i(x, y); } +void rlVertex2f(float x, float y) { glVertex2f(x, y); } +void rlVertex3f(float x, float y, float z) { glVertex3f(x, y, z); } +void rlTexCoord2f(float x, float y) { glTexCoord2f(x, y); } +void rlNormal3f(float x, float y, float z) { glNormal3f(x, y, z); } +void rlColor4ub(unsigned char r, unsigned char g, unsigned char b, unsigned char a) { glColor4ub(r, g, b, a); } +void rlColor3f(float x, float y, float z) { glColor3f(x, y, z); } +void rlColor4f(float x, float y, float z, float w) { glColor4f(x, y, z, w); } +#endif +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) +// Initialize drawing mode (how to organize vertex) +void rlBegin(int mode) +{ + // Draw mode can be RL_LINES, RL_TRIANGLES and RL_QUADS + // NOTE: In all three cases, vertex are accumulated over default internal vertex buffer + if (RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].mode != mode) + { + if (RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].vertexCount > 0) + { + // Make sure current RLGL.currentBatch->draws[i].vertexCount is aligned a multiple of 4, + // that way, following QUADS drawing will keep aligned with index processing + // It implies adding some extra alignment vertex at the end of the draw, + // those vertex are not processed but they are considered as an additional offset + // for the next set of vertex to be drawn + if (RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].mode == RL_LINES) RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].vertexAlignment = ((RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].vertexCount < 4)? RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].vertexCount : RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].vertexCount%4); + else if (RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].mode == RL_TRIANGLES) RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].vertexAlignment = ((RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].vertexCount < 4)? 1 : (4 - (RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].vertexCount%4))); + else RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].vertexAlignment = 0; + + if (!rlCheckRenderBatchLimit(RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].vertexAlignment)) + { + RLGL.State.vertexCounter += RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].vertexAlignment; + RLGL.currentBatch->drawCounter++; + } + } + + if (RLGL.currentBatch->drawCounter >= RL_DEFAULT_BATCH_DRAWCALLS) rlDrawRenderBatch(RLGL.currentBatch); + + RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].mode = mode; + RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].vertexCount = 0; + RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].textureId = RLGL.State.defaultTextureId; + } +} + +// Finish vertex providing +void rlEnd(void) +{ + // NOTE: Depth increment is dependant on rlOrtho(): z-near and z-far values, + // as well as depth buffer bit-depth (16bit or 24bit or 32bit) + // Correct increment formula would be: depthInc = (zfar - znear)/pow(2, bits) + RLGL.currentBatch->currentDepth += (1.0f/20000.0f); +} + +// Define one vertex (position) +// NOTE: Vertex position data is the basic information required for drawing +void rlVertex3f(float x, float y, float z) +{ + float tx = x; + float ty = y; + float tz = z; + + // Transform provided vector if required + if (RLGL.State.transformRequired) + { + tx = RLGL.State.transform.m0*x + RLGL.State.transform.m4*y + RLGL.State.transform.m8*z + RLGL.State.transform.m12; + ty = RLGL.State.transform.m1*x + RLGL.State.transform.m5*y + RLGL.State.transform.m9*z + RLGL.State.transform.m13; + tz = RLGL.State.transform.m2*x + RLGL.State.transform.m6*y + RLGL.State.transform.m10*z + RLGL.State.transform.m14; + } + + // WARNING: We can't break primitives when launching a new batch + // RL_LINES comes in pairs, RL_TRIANGLES come in groups of 3 vertices and RL_QUADS come in groups of 4 vertices + // We must check current draw.mode when a new vertex is required and finish the batch only if the draw.mode draw.vertexCount is %2, %3 or %4 + if (RLGL.State.vertexCounter > (RLGL.currentBatch->vertexBuffer[RLGL.currentBatch->currentBuffer].elementCount*4 - 4)) + { + if ((RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].mode == RL_LINES) && + (RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].vertexCount%2 == 0)) + { + // Reached the maximum number of vertices for RL_LINES drawing + // Launch a draw call but keep current state for next vertices comming + // NOTE: We add +1 vertex to the check for security + rlCheckRenderBatchLimit(2 + 1); + } + else if ((RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].mode == RL_TRIANGLES) && + (RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].vertexCount%3 == 0)) + { + rlCheckRenderBatchLimit(3 + 1); + } + else if ((RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].mode == RL_QUADS) && + (RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].vertexCount%4 == 0)) + { + rlCheckRenderBatchLimit(4 + 1); + } + } + + // Add vertices + RLGL.currentBatch->vertexBuffer[RLGL.currentBatch->currentBuffer].vertices[3*RLGL.State.vertexCounter] = tx; + RLGL.currentBatch->vertexBuffer[RLGL.currentBatch->currentBuffer].vertices[3*RLGL.State.vertexCounter + 1] = ty; + RLGL.currentBatch->vertexBuffer[RLGL.currentBatch->currentBuffer].vertices[3*RLGL.State.vertexCounter + 2] = tz; + + // Add current texcoord + RLGL.currentBatch->vertexBuffer[RLGL.currentBatch->currentBuffer].texcoords[2*RLGL.State.vertexCounter] = RLGL.State.texcoordx; + RLGL.currentBatch->vertexBuffer[RLGL.currentBatch->currentBuffer].texcoords[2*RLGL.State.vertexCounter + 1] = RLGL.State.texcoordy; + + // Add current normal + RLGL.currentBatch->vertexBuffer[RLGL.currentBatch->currentBuffer].normals[3*RLGL.State.vertexCounter] = RLGL.State.normalx; + RLGL.currentBatch->vertexBuffer[RLGL.currentBatch->currentBuffer].normals[3*RLGL.State.vertexCounter + 1] = RLGL.State.normaly; + RLGL.currentBatch->vertexBuffer[RLGL.currentBatch->currentBuffer].normals[3*RLGL.State.vertexCounter + 2] = RLGL.State.normalz; + + // Add current color + RLGL.currentBatch->vertexBuffer[RLGL.currentBatch->currentBuffer].colors[4*RLGL.State.vertexCounter] = RLGL.State.colorr; + RLGL.currentBatch->vertexBuffer[RLGL.currentBatch->currentBuffer].colors[4*RLGL.State.vertexCounter + 1] = RLGL.State.colorg; + RLGL.currentBatch->vertexBuffer[RLGL.currentBatch->currentBuffer].colors[4*RLGL.State.vertexCounter + 2] = RLGL.State.colorb; + RLGL.currentBatch->vertexBuffer[RLGL.currentBatch->currentBuffer].colors[4*RLGL.State.vertexCounter + 3] = RLGL.State.colora; + + RLGL.State.vertexCounter++; + RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].vertexCount++; +} + +// Define one vertex (position) +void rlVertex2f(float x, float y) +{ + rlVertex3f(x, y, RLGL.currentBatch->currentDepth); +} + +// Define one vertex (position) +void rlVertex2i(int x, int y) +{ + rlVertex3f((float)x, (float)y, RLGL.currentBatch->currentDepth); +} + +// Define one vertex (texture coordinate) +// NOTE: Texture coordinates are limited to QUADS only +void rlTexCoord2f(float x, float y) +{ + RLGL.State.texcoordx = x; + RLGL.State.texcoordy = y; +} + +// Define one vertex (normal) +// NOTE: Normals limited to TRIANGLES only? +void rlNormal3f(float x, float y, float z) +{ + float normalx = x; + float normaly = y; + float normalz = z; + if (RLGL.State.transformRequired) + { + normalx = RLGL.State.transform.m0*x + RLGL.State.transform.m4*y + RLGL.State.transform.m8*z; + normaly = RLGL.State.transform.m1*x + RLGL.State.transform.m5*y + RLGL.State.transform.m9*z; + normalz = RLGL.State.transform.m2*x + RLGL.State.transform.m6*y + RLGL.State.transform.m10*z; + } + float length = sqrtf(normalx*normalx + normaly*normaly + normalz*normalz); + if (length != 0.0f) + { + float ilength = 1.0f/length; + normalx *= ilength; + normaly *= ilength; + normalz *= ilength; + } + RLGL.State.normalx = normalx; + RLGL.State.normaly = normaly; + RLGL.State.normalz = normalz; +} + +// Define one vertex (color) +void rlColor4ub(unsigned char x, unsigned char y, unsigned char z, unsigned char w) +{ + RLGL.State.colorr = x; + RLGL.State.colorg = y; + RLGL.State.colorb = z; + RLGL.State.colora = w; +} + +// Define one vertex (color) +void rlColor4f(float r, float g, float b, float a) +{ + rlColor4ub((unsigned char)(r*255), (unsigned char)(g*255), (unsigned char)(b*255), (unsigned char)(a*255)); +} + +// Define one vertex (color) +void rlColor3f(float x, float y, float z) +{ + rlColor4ub((unsigned char)(x*255), (unsigned char)(y*255), (unsigned char)(z*255), 255); +} + +#endif + +//-------------------------------------------------------------------------------------- +// Module Functions Definition - OpenGL style functions (common to 1.1, 3.3+, ES2) +//-------------------------------------------------------------------------------------- + +// Set current texture to use +void rlSetTexture(unsigned int id) +{ + if (id == 0) + { +#if defined(GRAPHICS_API_OPENGL_11) + rlDisableTexture(); +#else + // NOTE: If quads batch limit is reached, we force a draw call and next batch starts + if (RLGL.State.vertexCounter >= + RLGL.currentBatch->vertexBuffer[RLGL.currentBatch->currentBuffer].elementCount*4) + { + rlDrawRenderBatch(RLGL.currentBatch); + } +#endif + } + else + { +#if defined(GRAPHICS_API_OPENGL_11) + rlEnableTexture(id); +#else + if (RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].textureId != id) + { + if (RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].vertexCount > 0) + { + // Make sure current RLGL.currentBatch->draws[i].vertexCount is aligned a multiple of 4, + // that way, following QUADS drawing will keep aligned with index processing + // It implies adding some extra alignment vertex at the end of the draw, + // those vertex are not processed but they are considered as an additional offset + // for the next set of vertex to be drawn + if (RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].mode == RL_LINES) RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].vertexAlignment = ((RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].vertexCount < 4)? RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].vertexCount : RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].vertexCount%4); + else if (RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].mode == RL_TRIANGLES) RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].vertexAlignment = ((RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].vertexCount < 4)? 1 : (4 - (RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].vertexCount%4))); + else RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].vertexAlignment = 0; + + if (!rlCheckRenderBatchLimit(RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].vertexAlignment)) + { + RLGL.State.vertexCounter += RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].vertexAlignment; + + RLGL.currentBatch->drawCounter++; + } + } + + if (RLGL.currentBatch->drawCounter >= RL_DEFAULT_BATCH_DRAWCALLS) rlDrawRenderBatch(RLGL.currentBatch); + + RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].textureId = id; + RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].vertexCount = 0; + } +#endif + } +} + +// Select and active a texture slot +void rlActiveTextureSlot(int slot) +{ +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + glActiveTexture(GL_TEXTURE0 + slot); +#endif +} + +// Enable texture +void rlEnableTexture(unsigned int id) +{ +#if defined(GRAPHICS_API_OPENGL_11) + glEnable(GL_TEXTURE_2D); +#endif + glBindTexture(GL_TEXTURE_2D, id); +} + +// Disable texture +void rlDisableTexture(void) +{ +#if defined(GRAPHICS_API_OPENGL_11) + glDisable(GL_TEXTURE_2D); +#endif + glBindTexture(GL_TEXTURE_2D, 0); +} + +// Enable texture cubemap +void rlEnableTextureCubemap(unsigned int id) +{ +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + glBindTexture(GL_TEXTURE_CUBE_MAP, id); +#endif +} + +// Disable texture cubemap +void rlDisableTextureCubemap(void) +{ +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + glBindTexture(GL_TEXTURE_CUBE_MAP, 0); +#endif +} + +// Set texture parameters (wrap mode/filter mode) +void rlTextureParameters(unsigned int id, int param, int value) +{ + glBindTexture(GL_TEXTURE_2D, id); + +#if !defined(GRAPHICS_API_OPENGL_11) + // Reset anisotropy filter, in case it was set + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, 1.0f); +#endif + + switch (param) + { + case RL_TEXTURE_WRAP_S: + case RL_TEXTURE_WRAP_T: + { + if (value == RL_TEXTURE_WRAP_MIRROR_CLAMP) + { +#if !defined(GRAPHICS_API_OPENGL_11) + if (RLGL.ExtSupported.texMirrorClamp) glTexParameteri(GL_TEXTURE_2D, param, value); + else TRACELOG(RL_LOG_WARNING, "GL: Clamp mirror wrap mode not supported (GL_MIRROR_CLAMP_EXT)"); +#endif + } + else glTexParameteri(GL_TEXTURE_2D, param, value); + + } break; + case RL_TEXTURE_MAG_FILTER: + case RL_TEXTURE_MIN_FILTER: glTexParameteri(GL_TEXTURE_2D, param, value); break; + case RL_TEXTURE_FILTER_ANISOTROPIC: + { +#if !defined(GRAPHICS_API_OPENGL_11) + if (value <= RLGL.ExtSupported.maxAnisotropyLevel) glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, (float)value); + else if (RLGL.ExtSupported.maxAnisotropyLevel > 0.0f) + { + TRACELOG(RL_LOG_WARNING, "GL: Maximum anisotropic filter level supported is %iX", id, (int)RLGL.ExtSupported.maxAnisotropyLevel); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, (float)value); + } + else TRACELOG(RL_LOG_WARNING, "GL: Anisotropic filtering not supported"); +#endif + } break; +#if defined(GRAPHICS_API_OPENGL_33) + case RL_TEXTURE_MIPMAP_BIAS_RATIO: glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_LOD_BIAS, value/100.0f); +#endif + default: break; + } + + glBindTexture(GL_TEXTURE_2D, 0); +} + +// Set cubemap parameters (wrap mode/filter mode) +void rlCubemapParameters(unsigned int id, int param, int value) +{ +#if !defined(GRAPHICS_API_OPENGL_11) + glBindTexture(GL_TEXTURE_CUBE_MAP, id); + + // Reset anisotropy filter, in case it was set + glTexParameterf(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAX_ANISOTROPY_EXT, 1.0f); + + switch (param) + { + case RL_TEXTURE_WRAP_S: + case RL_TEXTURE_WRAP_T: + { + if (value == RL_TEXTURE_WRAP_MIRROR_CLAMP) + { + if (RLGL.ExtSupported.texMirrorClamp) glTexParameteri(GL_TEXTURE_CUBE_MAP, param, value); + else TRACELOG(RL_LOG_WARNING, "GL: Clamp mirror wrap mode not supported (GL_MIRROR_CLAMP_EXT)"); + } + else glTexParameteri(GL_TEXTURE_CUBE_MAP, param, value); + + } break; + case RL_TEXTURE_MAG_FILTER: + case RL_TEXTURE_MIN_FILTER: glTexParameteri(GL_TEXTURE_CUBE_MAP, param, value); break; + case RL_TEXTURE_FILTER_ANISOTROPIC: + { + if (value <= RLGL.ExtSupported.maxAnisotropyLevel) glTexParameterf(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAX_ANISOTROPY_EXT, (float)value); + else if (RLGL.ExtSupported.maxAnisotropyLevel > 0.0f) + { + TRACELOG(RL_LOG_WARNING, "GL: Maximum anisotropic filter level supported is %iX", id, (int)RLGL.ExtSupported.maxAnisotropyLevel); + glTexParameterf(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAX_ANISOTROPY_EXT, (float)value); + } + else TRACELOG(RL_LOG_WARNING, "GL: Anisotropic filtering not supported"); + } break; +#if defined(GRAPHICS_API_OPENGL_33) + case RL_TEXTURE_MIPMAP_BIAS_RATIO: glTexParameterf(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_LOD_BIAS, value/100.0f); +#endif + default: break; + } + + glBindTexture(GL_TEXTURE_CUBE_MAP, 0); +#endif +} + +// Enable shader program +void rlEnableShader(unsigned int id) +{ +#if (defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)) + glUseProgram(id); +#endif +} + +// Disable shader program +void rlDisableShader(void) +{ +#if (defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)) + glUseProgram(0); +#endif +} + +// Enable rendering to texture (fbo) +void rlEnableFramebuffer(unsigned int id) +{ +#if (defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)) && defined(RLGL_RENDER_TEXTURES_HINT) + glBindFramebuffer(GL_FRAMEBUFFER, id); +#endif +} + +// return the active render texture (fbo) +unsigned int rlGetActiveFramebuffer(void) +{ + GLint fboId = 0; +#if (defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES3)) && defined(RLGL_RENDER_TEXTURES_HINT) + glGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &fboId); +#endif + return fboId; +} + +// Disable rendering to texture +void rlDisableFramebuffer(void) +{ +#if (defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)) && defined(RLGL_RENDER_TEXTURES_HINT) + glBindFramebuffer(GL_FRAMEBUFFER, 0); +#endif +} + +// Blit active framebuffer to main framebuffer +void rlBlitFramebuffer(int srcX, int srcY, int srcWidth, int srcHeight, int dstX, int dstY, int dstWidth, int dstHeight, int bufferMask) +{ +#if (defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES3)) && defined(RLGL_RENDER_TEXTURES_HINT) + glBlitFramebuffer(srcX, srcY, srcWidth, srcHeight, dstX, dstY, dstWidth, dstHeight, bufferMask, GL_NEAREST); +#endif +} + +// Bind framebuffer object (fbo) +void rlBindFramebuffer(unsigned int target, unsigned int framebuffer) +{ +#if (defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)) && defined(RLGL_RENDER_TEXTURES_HINT) + glBindFramebuffer(target, framebuffer); +#endif +} + +// Activate multiple draw color buffers +// NOTE: One color buffer is always active by default +void rlActiveDrawBuffers(int count) +{ +#if ((defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES3)) && defined(RLGL_RENDER_TEXTURES_HINT)) + // NOTE: Maximum number of draw buffers supported is implementation dependant, + // it can be queried with glGet*() but it must be at least 8 + //GLint maxDrawBuffers = 0; + //glGetIntegerv(GL_MAX_DRAW_BUFFERS, &maxDrawBuffers); + + if (count > 0) + { + if (count > 8) TRACELOG(LOG_WARNING, "GL: Max color buffers limited to 8"); + else + { + unsigned int buffers[8] = { +#if defined(GRAPHICS_API_OPENGL_ES3) + GL_COLOR_ATTACHMENT0_EXT, + GL_COLOR_ATTACHMENT1_EXT, + GL_COLOR_ATTACHMENT2_EXT, + GL_COLOR_ATTACHMENT3_EXT, + GL_COLOR_ATTACHMENT4_EXT, + GL_COLOR_ATTACHMENT5_EXT, + GL_COLOR_ATTACHMENT6_EXT, + GL_COLOR_ATTACHMENT7_EXT, +#else + GL_COLOR_ATTACHMENT0, + GL_COLOR_ATTACHMENT1, + GL_COLOR_ATTACHMENT2, + GL_COLOR_ATTACHMENT3, + GL_COLOR_ATTACHMENT4, + GL_COLOR_ATTACHMENT5, + GL_COLOR_ATTACHMENT6, + GL_COLOR_ATTACHMENT7, +#endif + }; + +#if defined(GRAPHICS_API_OPENGL_ES3) + glDrawBuffersEXT(count, buffers); +#else + glDrawBuffers(count, buffers); +#endif + } + } + else TRACELOG(LOG_WARNING, "GL: One color buffer active by default"); +#endif +} + +//---------------------------------------------------------------------------------- +// General render state configuration +//---------------------------------------------------------------------------------- + +// Enable color blending +void rlEnableColorBlend(void) { glEnable(GL_BLEND); } + +// Disable color blending +void rlDisableColorBlend(void) { glDisable(GL_BLEND); } + +// Enable depth test +void rlEnableDepthTest(void) { glEnable(GL_DEPTH_TEST); } + +// Disable depth test +void rlDisableDepthTest(void) { glDisable(GL_DEPTH_TEST); } + +// Enable depth write +void rlEnableDepthMask(void) { glDepthMask(GL_TRUE); } + +// Disable depth write +void rlDisableDepthMask(void) { glDepthMask(GL_FALSE); } + +// Enable backface culling +void rlEnableBackfaceCulling(void) { glEnable(GL_CULL_FACE); } + +// Disable backface culling +void rlDisableBackfaceCulling(void) { glDisable(GL_CULL_FACE); } + +// Set color mask active for screen read/draw +void rlColorMask(bool r, bool g, bool b, bool a) { glColorMask(r, g, b, a); } + +// Set face culling mode +void rlSetCullFace(int mode) +{ + switch (mode) + { + case RL_CULL_FACE_BACK: glCullFace(GL_BACK); break; + case RL_CULL_FACE_FRONT: glCullFace(GL_FRONT); break; + default: break; + } +} + +// Enable scissor test +void rlEnableScissorTest(void) { glEnable(GL_SCISSOR_TEST); } + +// Disable scissor test +void rlDisableScissorTest(void) { glDisable(GL_SCISSOR_TEST); } + +// Scissor test +void rlScissor(int x, int y, int width, int height) { glScissor(x, y, width, height); } + +// Enable wire mode +void rlEnableWireMode(void) +{ +#if defined(GRAPHICS_API_OPENGL_11) || defined(GRAPHICS_API_OPENGL_33) + // NOTE: glPolygonMode() not available on OpenGL ES + glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); +#endif +} + +// Enable point mode +void rlEnablePointMode(void) +{ +#if defined(GRAPHICS_API_OPENGL_11) || defined(GRAPHICS_API_OPENGL_33) + // NOTE: glPolygonMode() not available on OpenGL ES + glPolygonMode(GL_FRONT_AND_BACK, GL_POINT); + glEnable(GL_PROGRAM_POINT_SIZE); +#endif +} + +// Disable wire mode +void rlDisableWireMode(void) +{ +#if defined(GRAPHICS_API_OPENGL_11) || defined(GRAPHICS_API_OPENGL_33) + // NOTE: glPolygonMode() not available on OpenGL ES + glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); +#endif +} + +// Set the line drawing width +void rlSetLineWidth(float width) { glLineWidth(width); } + +// Get the line drawing width +float rlGetLineWidth(void) +{ + float width = 0; + glGetFloatv(GL_LINE_WIDTH, &width); + return width; +} + +// Enable line aliasing +void rlEnableSmoothLines(void) +{ +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_11) + glEnable(GL_LINE_SMOOTH); +#endif +} + +// Disable line aliasing +void rlDisableSmoothLines(void) +{ +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_11) + glDisable(GL_LINE_SMOOTH); +#endif +} + +// Enable stereo rendering +void rlEnableStereoRender(void) +{ +#if (defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)) + RLGL.State.stereoRender = true; +#endif +} + +// Disable stereo rendering +void rlDisableStereoRender(void) +{ +#if (defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)) + RLGL.State.stereoRender = false; +#endif +} + +// Check if stereo render is enabled +bool rlIsStereoRenderEnabled(void) +{ +#if (defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)) + return RLGL.State.stereoRender; +#else + return false; +#endif +} + +// Clear color buffer with color +void rlClearColor(unsigned char r, unsigned char g, unsigned char b, unsigned char a) +{ + // Color values clamp to 0.0f(0) and 1.0f(255) + float cr = (float)r/255; + float cg = (float)g/255; + float cb = (float)b/255; + float ca = (float)a/255; + + glClearColor(cr, cg, cb, ca); +} + +// Clear used screen buffers (color and depth) +void rlClearScreenBuffers(void) +{ + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Clear used buffers: Color and Depth (Depth is used for 3D) + //glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); // Stencil buffer not used... +} + +// Check and log OpenGL error codes +void rlCheckErrors(void) +{ +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + int check = 1; + while (check) + { + const GLenum err = glGetError(); + switch (err) + { + case GL_NO_ERROR: check = 0; break; + case 0x0500: TRACELOG(RL_LOG_WARNING, "GL: Error detected: GL_INVALID_ENUM"); break; + case 0x0501: TRACELOG(RL_LOG_WARNING, "GL: Error detected: GL_INVALID_VALUE"); break; + case 0x0502: TRACELOG(RL_LOG_WARNING, "GL: Error detected: GL_INVALID_OPERATION"); break; + case 0x0503: TRACELOG(RL_LOG_WARNING, "GL: Error detected: GL_STACK_OVERFLOW"); break; + case 0x0504: TRACELOG(RL_LOG_WARNING, "GL: Error detected: GL_STACK_UNDERFLOW"); break; + case 0x0505: TRACELOG(RL_LOG_WARNING, "GL: Error detected: GL_OUT_OF_MEMORY"); break; + case 0x0506: TRACELOG(RL_LOG_WARNING, "GL: Error detected: GL_INVALID_FRAMEBUFFER_OPERATION"); break; + default: TRACELOG(RL_LOG_WARNING, "GL: Error detected: Unknown error code: %x", err); break; + } + } +#endif +} + +// Set blend mode +void rlSetBlendMode(int mode) +{ +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + if ((RLGL.State.currentBlendMode != mode) || ((mode == RL_BLEND_CUSTOM || mode == RL_BLEND_CUSTOM_SEPARATE) && RLGL.State.glCustomBlendModeModified)) + { + rlDrawRenderBatch(RLGL.currentBatch); + + switch (mode) + { + case RL_BLEND_ALPHA: glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glBlendEquation(GL_FUNC_ADD); break; + case RL_BLEND_ADDITIVE: glBlendFunc(GL_SRC_ALPHA, GL_ONE); glBlendEquation(GL_FUNC_ADD); break; + case RL_BLEND_MULTIPLIED: glBlendFunc(GL_DST_COLOR, GL_ONE_MINUS_SRC_ALPHA); glBlendEquation(GL_FUNC_ADD); break; + case RL_BLEND_ADD_COLORS: glBlendFunc(GL_ONE, GL_ONE); glBlendEquation(GL_FUNC_ADD); break; + case RL_BLEND_SUBTRACT_COLORS: glBlendFunc(GL_ONE, GL_ONE); glBlendEquation(GL_FUNC_SUBTRACT); break; + case RL_BLEND_ALPHA_PREMULTIPLY: glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA); glBlendEquation(GL_FUNC_ADD); break; + case RL_BLEND_CUSTOM: + { + // NOTE: Using GL blend src/dst factors and GL equation configured with rlSetBlendFactors() + glBlendFunc(RLGL.State.glBlendSrcFactor, RLGL.State.glBlendDstFactor); glBlendEquation(RLGL.State.glBlendEquation); + + } break; + case RL_BLEND_CUSTOM_SEPARATE: + { + // NOTE: Using GL blend src/dst factors and GL equation configured with rlSetBlendFactorsSeparate() + glBlendFuncSeparate(RLGL.State.glBlendSrcFactorRGB, RLGL.State.glBlendDestFactorRGB, RLGL.State.glBlendSrcFactorAlpha, RLGL.State.glBlendDestFactorAlpha); + glBlendEquationSeparate(RLGL.State.glBlendEquationRGB, RLGL.State.glBlendEquationAlpha); + + } break; + default: break; + } + + RLGL.State.currentBlendMode = mode; + RLGL.State.glCustomBlendModeModified = false; + } +#endif +} + +// Set blending mode factor and equation +void rlSetBlendFactors(int glSrcFactor, int glDstFactor, int glEquation) +{ +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + if ((RLGL.State.glBlendSrcFactor != glSrcFactor) || + (RLGL.State.glBlendDstFactor != glDstFactor) || + (RLGL.State.glBlendEquation != glEquation)) + { + RLGL.State.glBlendSrcFactor = glSrcFactor; + RLGL.State.glBlendDstFactor = glDstFactor; + RLGL.State.glBlendEquation = glEquation; + + RLGL.State.glCustomBlendModeModified = true; + } +#endif +} + +// Set blending mode factor and equation separately for RGB and alpha +void rlSetBlendFactorsSeparate(int glSrcRGB, int glDstRGB, int glSrcAlpha, int glDstAlpha, int glEqRGB, int glEqAlpha) +{ +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + if ((RLGL.State.glBlendSrcFactorRGB != glSrcRGB) || + (RLGL.State.glBlendDestFactorRGB != glDstRGB) || + (RLGL.State.glBlendSrcFactorAlpha != glSrcAlpha) || + (RLGL.State.glBlendDestFactorAlpha != glDstAlpha) || + (RLGL.State.glBlendEquationRGB != glEqRGB) || + (RLGL.State.glBlendEquationAlpha != glEqAlpha)) + { + RLGL.State.glBlendSrcFactorRGB = glSrcRGB; + RLGL.State.glBlendDestFactorRGB = glDstRGB; + RLGL.State.glBlendSrcFactorAlpha = glSrcAlpha; + RLGL.State.glBlendDestFactorAlpha = glDstAlpha; + RLGL.State.glBlendEquationRGB = glEqRGB; + RLGL.State.glBlendEquationAlpha = glEqAlpha; + + RLGL.State.glCustomBlendModeModified = true; + } +#endif +} + +//---------------------------------------------------------------------------------- +// Module Functions Definition - OpenGL Debug +//---------------------------------------------------------------------------------- +#if defined(RLGL_ENABLE_OPENGL_DEBUG_CONTEXT) && defined(GRAPHICS_API_OPENGL_43) +static void GLAPIENTRY rlDebugMessageCallback(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *message, const void *userParam) +{ + // Ignore non-significant error/warning codes (NVidia drivers) + // NOTE: Here there are the details with a sample output: + // - #131169 - Framebuffer detailed info: The driver allocated storage for renderbuffer 2. (severity: low) + // - #131185 - Buffer detailed info: Buffer object 1 (bound to GL_ELEMENT_ARRAY_BUFFER_ARB, usage hint is GL_ENUM_88e4) + // will use VIDEO memory as the source for buffer object operations. (severity: low) + // - #131218 - Program/shader state performance warning: Vertex shader in program 7 is being recompiled based on GL state. (severity: medium) + // - #131204 - Texture state usage warning: The texture object (0) bound to texture image unit 0 does not have + // a defined base level and cannot be used for texture mapping. (severity: low) + if ((id == 131169) || (id == 131185) || (id == 131218) || (id == 131204)) return; + + const char *msgSource = NULL; + switch (source) + { + case GL_DEBUG_SOURCE_API: msgSource = "API"; break; + case GL_DEBUG_SOURCE_WINDOW_SYSTEM: msgSource = "WINDOW_SYSTEM"; break; + case GL_DEBUG_SOURCE_SHADER_COMPILER: msgSource = "SHADER_COMPILER"; break; + case GL_DEBUG_SOURCE_THIRD_PARTY: msgSource = "THIRD_PARTY"; break; + case GL_DEBUG_SOURCE_APPLICATION: msgSource = "APPLICATION"; break; + case GL_DEBUG_SOURCE_OTHER: msgSource = "OTHER"; break; + default: break; + } + + const char *msgType = NULL; + switch (type) + { + case GL_DEBUG_TYPE_ERROR: msgType = "ERROR"; break; + case GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR: msgType = "DEPRECATED_BEHAVIOR"; break; + case GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR: msgType = "UNDEFINED_BEHAVIOR"; break; + case GL_DEBUG_TYPE_PORTABILITY: msgType = "PORTABILITY"; break; + case GL_DEBUG_TYPE_PERFORMANCE: msgType = "PERFORMANCE"; break; + case GL_DEBUG_TYPE_MARKER: msgType = "MARKER"; break; + case GL_DEBUG_TYPE_PUSH_GROUP: msgType = "PUSH_GROUP"; break; + case GL_DEBUG_TYPE_POP_GROUP: msgType = "POP_GROUP"; break; + case GL_DEBUG_TYPE_OTHER: msgType = "OTHER"; break; + default: break; + } + + const char *msgSeverity = "DEFAULT"; + switch (severity) + { + case GL_DEBUG_SEVERITY_LOW: msgSeverity = "LOW"; break; + case GL_DEBUG_SEVERITY_MEDIUM: msgSeverity = "MEDIUM"; break; + case GL_DEBUG_SEVERITY_HIGH: msgSeverity = "HIGH"; break; + case GL_DEBUG_SEVERITY_NOTIFICATION: msgSeverity = "NOTIFICATION"; break; + default: break; + } + + TRACELOG(LOG_WARNING, "GL: OpenGL debug message: %s", message); + TRACELOG(LOG_WARNING, " > Type: %s", msgType); + TRACELOG(LOG_WARNING, " > Source = %s", msgSource); + TRACELOG(LOG_WARNING, " > Severity = %s", msgSeverity); +} +#endif + +//---------------------------------------------------------------------------------- +// Module Functions Definition - rlgl functionality +//---------------------------------------------------------------------------------- + +// Initialize rlgl: OpenGL extensions, default buffers/shaders/textures, OpenGL states +void rlglInit(int width, int height) +{ + // Enable OpenGL debug context if required +#if defined(RLGL_ENABLE_OPENGL_DEBUG_CONTEXT) && defined(GRAPHICS_API_OPENGL_43) + if ((glDebugMessageCallback != NULL) && (glDebugMessageControl != NULL)) + { + glDebugMessageCallback(rlDebugMessageCallback, 0); + // glDebugMessageControl(GL_DEBUG_SOURCE_API, GL_DEBUG_TYPE_ERROR, GL_DEBUG_SEVERITY_HIGH, 0, 0, GL_TRUE); + + // Debug context options: + // - GL_DEBUG_OUTPUT - Faster version but not useful for breakpoints + // - GL_DEBUG_OUTPUT_SYNCHRONUS - Callback is in sync with errors, so a breakpoint can be placed on the callback in order to get a stacktrace for the GL error + glEnable(GL_DEBUG_OUTPUT); + glEnable(GL_DEBUG_OUTPUT_SYNCHRONOUS); + } +#endif + +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + // Init default white texture + unsigned char pixels[4] = { 255, 255, 255, 255 }; // 1 pixel RGBA (4 bytes) + RLGL.State.defaultTextureId = rlLoadTexture(pixels, 1, 1, RL_PIXELFORMAT_UNCOMPRESSED_R8G8B8A8, 1); + + if (RLGL.State.defaultTextureId != 0) TRACELOG(RL_LOG_INFO, "TEXTURE: [ID %i] Default texture loaded successfully", RLGL.State.defaultTextureId); + else TRACELOG(RL_LOG_WARNING, "TEXTURE: Failed to load default texture"); + + // Init default Shader (customized for GL 3.3 and ES2) + // Loaded: RLGL.State.defaultShaderId + RLGL.State.defaultShaderLocs + rlLoadShaderDefault(); + RLGL.State.currentShaderId = RLGL.State.defaultShaderId; + RLGL.State.currentShaderLocs = RLGL.State.defaultShaderLocs; + + // Init default vertex arrays buffers + // Simulate that the default shader has the location RL_SHADER_LOC_VERTEX_NORMAL to bind the normal buffer for the default render batch + RLGL.State.currentShaderLocs[RL_SHADER_LOC_VERTEX_NORMAL] = RL_DEFAULT_SHADER_ATTRIB_LOCATION_NORMAL; + RLGL.defaultBatch = rlLoadRenderBatch(RL_DEFAULT_BATCH_BUFFERS, RL_DEFAULT_BATCH_BUFFER_ELEMENTS); + RLGL.State.currentShaderLocs[RL_SHADER_LOC_VERTEX_NORMAL] = -1; + RLGL.currentBatch = &RLGL.defaultBatch; + + // Init stack matrices (emulating OpenGL 1.1) + for (int i = 0; i < RL_MAX_MATRIX_STACK_SIZE; i++) RLGL.State.stack[i] = rlMatrixIdentity(); + + // Init internal matrices + RLGL.State.transform = rlMatrixIdentity(); + RLGL.State.projection = rlMatrixIdentity(); + RLGL.State.modelview = rlMatrixIdentity(); + RLGL.State.currentMatrix = &RLGL.State.modelview; +#endif // GRAPHICS_API_OPENGL_33 || GRAPHICS_API_OPENGL_ES2 + + // Initialize OpenGL default states + //---------------------------------------------------------- + // Init state: Depth test + glDepthFunc(GL_LEQUAL); // Type of depth testing to apply + glDisable(GL_DEPTH_TEST); // Disable depth testing for 2D (only used for 3D) + + // Init state: Blending mode + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); // Color blending function (how colors are mixed) + glEnable(GL_BLEND); // Enable color blending (required to work with transparencies) + + // Init state: Culling + // NOTE: All shapes/models triangles are drawn CCW + glCullFace(GL_BACK); // Cull the back face (default) + glFrontFace(GL_CCW); // Front face are defined counter clockwise (default) + glEnable(GL_CULL_FACE); // Enable backface culling + + // Init state: Cubemap seamless +#if defined(GRAPHICS_API_OPENGL_33) + glEnable(GL_TEXTURE_CUBE_MAP_SEAMLESS); // Seamless cubemaps (not supported on OpenGL ES 2.0) +#endif + +#if defined(GRAPHICS_API_OPENGL_11) + // Init state: Color hints (deprecated in OpenGL 3.0+) + glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); // Improve quality of color and texture coordinate interpolation + glShadeModel(GL_SMOOTH); // Smooth shading between vertex (vertex colors interpolation) +#endif + +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + // Store screen size into global variables + RLGL.State.framebufferWidth = width; + RLGL.State.framebufferHeight = height; + + TRACELOG(RL_LOG_INFO, "RLGL: Default OpenGL state initialized successfully"); + //---------------------------------------------------------- +#endif + + // Init state: Color/Depth buffers clear + glClearColor(0.0f, 0.0f, 0.0f, 1.0f); // Set clear color (black) + glClearDepth(1.0f); // Set clear depth value (default) + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Clear color and depth buffers (depth buffer required for 3D) +} + +// Vertex Buffer Object deinitialization (memory free) +void rlglClose(void) +{ +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + rlUnloadRenderBatch(RLGL.defaultBatch); + + rlUnloadShaderDefault(); // Unload default shader + + glDeleteTextures(1, &RLGL.State.defaultTextureId); // Unload default texture + TRACELOG(RL_LOG_INFO, "TEXTURE: [ID %i] Default texture unloaded successfully", RLGL.State.defaultTextureId); +#endif +} + +// Load OpenGL extensions +// NOTE: External loader function must be provided +void rlLoadExtensions(void *loader) +{ +#if defined(GRAPHICS_API_OPENGL_33) // Also defined for GRAPHICS_API_OPENGL_21 + // NOTE: glad is generated and contains only required OpenGL 3.3 Core extensions (and lower versions) + if (gladLoadGL((GLADloadfunc)loader) == 0) TRACELOG(RL_LOG_WARNING, "GLAD: Cannot load OpenGL extensions"); + else TRACELOG(RL_LOG_INFO, "GLAD: OpenGL extensions loaded successfully"); + + // Get number of supported extensions + GLint numExt = 0; + glGetIntegerv(GL_NUM_EXTENSIONS, &numExt); + TRACELOG(RL_LOG_INFO, "GL: Supported extensions count: %i", numExt); + +#if defined(RLGL_SHOW_GL_DETAILS_INFO) + // Get supported extensions list + // WARNING: glGetStringi() not available on OpenGL 2.1 + TRACELOG(RL_LOG_INFO, "GL: OpenGL extensions:"); + for (int i = 0; i < numExt; i++) TRACELOG(RL_LOG_INFO, " %s", glGetStringi(GL_EXTENSIONS, i)); +#endif + +#if defined(GRAPHICS_API_OPENGL_21) + // Register supported extensions flags + // Optional OpenGL 2.1 extensions + RLGL.ExtSupported.vao = GLAD_GL_ARB_vertex_array_object; + RLGL.ExtSupported.instancing = (GLAD_GL_EXT_draw_instanced && GLAD_GL_ARB_instanced_arrays); + RLGL.ExtSupported.texNPOT = GLAD_GL_ARB_texture_non_power_of_two; + RLGL.ExtSupported.texFloat32 = GLAD_GL_ARB_texture_float; + RLGL.ExtSupported.texFloat16 = GLAD_GL_ARB_texture_float; + RLGL.ExtSupported.texDepth = GLAD_GL_ARB_depth_texture; + RLGL.ExtSupported.maxDepthBits = 32; + RLGL.ExtSupported.texAnisoFilter = GLAD_GL_EXT_texture_filter_anisotropic; + RLGL.ExtSupported.texMirrorClamp = GLAD_GL_EXT_texture_mirror_clamp; +#else + // Register supported extensions flags + // OpenGL 3.3 extensions supported by default (core) + RLGL.ExtSupported.vao = true; + RLGL.ExtSupported.instancing = true; + RLGL.ExtSupported.texNPOT = true; + RLGL.ExtSupported.texFloat32 = true; + RLGL.ExtSupported.texFloat16 = true; + RLGL.ExtSupported.texDepth = true; + RLGL.ExtSupported.maxDepthBits = 32; + RLGL.ExtSupported.texAnisoFilter = true; + RLGL.ExtSupported.texMirrorClamp = true; +#endif + + // Optional OpenGL 3.3 extensions + RLGL.ExtSupported.texCompASTC = GLAD_GL_KHR_texture_compression_astc_hdr && GLAD_GL_KHR_texture_compression_astc_ldr; + RLGL.ExtSupported.texCompDXT = GLAD_GL_EXT_texture_compression_s3tc; // Texture compression: DXT + RLGL.ExtSupported.texCompETC2 = GLAD_GL_ARB_ES3_compatibility; // Texture compression: ETC2/EAC + #if defined(GRAPHICS_API_OPENGL_43) + RLGL.ExtSupported.computeShader = GLAD_GL_ARB_compute_shader; + RLGL.ExtSupported.ssbo = GLAD_GL_ARB_shader_storage_buffer_object; + #endif + +#endif // GRAPHICS_API_OPENGL_33 + +#if defined(GRAPHICS_API_OPENGL_ES3) + // Register supported extensions flags + // OpenGL ES 3.0 extensions supported by default (or it should be) + RLGL.ExtSupported.vao = true; + RLGL.ExtSupported.instancing = true; + RLGL.ExtSupported.texNPOT = true; + RLGL.ExtSupported.texFloat32 = true; + RLGL.ExtSupported.texFloat16 = true; + RLGL.ExtSupported.texDepth = true; + RLGL.ExtSupported.texDepthWebGL = true; + RLGL.ExtSupported.maxDepthBits = 24; + RLGL.ExtSupported.texAnisoFilter = true; + RLGL.ExtSupported.texMirrorClamp = true; + // TODO: Check for additional OpenGL ES 3.0 supported extensions: + //RLGL.ExtSupported.texCompDXT = true; + //RLGL.ExtSupported.texCompETC1 = true; + //RLGL.ExtSupported.texCompETC2 = true; + //RLGL.ExtSupported.texCompPVRT = true; + //RLGL.ExtSupported.texCompASTC = true; + //RLGL.ExtSupported.maxAnisotropyLevel = true; + //RLGL.ExtSupported.computeShader = true; + //RLGL.ExtSupported.ssbo = true; + +#elif defined(GRAPHICS_API_OPENGL_ES2) + + #if defined(PLATFORM_DESKTOP_GLFW) || defined(PLATFORM_DESKTOP_SDL) + // TODO: Support GLAD loader for OpenGL ES 3.0 + if (gladLoadGLES2((GLADloadfunc)loader) == 0) TRACELOG(RL_LOG_WARNING, "GLAD: Cannot load OpenGL ES2.0 functions"); + else TRACELOG(RL_LOG_INFO, "GLAD: OpenGL ES 2.0 loaded successfully"); + #endif + + // Get supported extensions list + GLint numExt = 0; + const char **extList = RL_MALLOC(512*sizeof(const char *)); // Allocate 512 strings pointers (2 KB) + const char *extensions = (const char *)glGetString(GL_EXTENSIONS); // One big const string + + // NOTE: We have to duplicate string because glGetString() returns a const string + int size = strlen(extensions) + 1; // Get extensions string size in bytes + char *extensionsDup = (char *)RL_CALLOC(size, sizeof(char)); + strcpy(extensionsDup, extensions); + extList[numExt] = extensionsDup; + + for (int i = 0; i < size; i++) + { + if (extensionsDup[i] == ' ') + { + extensionsDup[i] = '\0'; + numExt++; + extList[numExt] = &extensionsDup[i + 1]; + } + } + + TRACELOG(RL_LOG_INFO, "GL: Supported extensions count: %i", numExt); + +#if defined(RLGL_SHOW_GL_DETAILS_INFO) + TRACELOG(RL_LOG_INFO, "GL: OpenGL extensions:"); + for (int i = 0; i < numExt; i++) TRACELOG(RL_LOG_INFO, " %s", extList[i]); +#endif + + // Check required extensions + for (int i = 0; i < numExt; i++) + { + // Check VAO support + // NOTE: Only check on OpenGL ES, OpenGL 3.3 has VAO support as core feature + if (strcmp(extList[i], (const char *)"GL_OES_vertex_array_object") == 0) + { + // The extension is supported by our hardware and driver, try to get related functions pointers + // NOTE: emscripten does not support VAOs natively, it uses emulation and it reduces overall performance... + glGenVertexArrays = (PFNGLGENVERTEXARRAYSOESPROC)((rlglLoadProc)loader)("glGenVertexArraysOES"); + glBindVertexArray = (PFNGLBINDVERTEXARRAYOESPROC)((rlglLoadProc)loader)("glBindVertexArrayOES"); + glDeleteVertexArrays = (PFNGLDELETEVERTEXARRAYSOESPROC)((rlglLoadProc)loader)("glDeleteVertexArraysOES"); + //glIsVertexArray = (PFNGLISVERTEXARRAYOESPROC)loader("glIsVertexArrayOES"); // NOTE: Fails in WebGL, omitted + + if ((glGenVertexArrays != NULL) && (glBindVertexArray != NULL) && (glDeleteVertexArrays != NULL)) RLGL.ExtSupported.vao = true; + } + + // Check instanced rendering support + if (strstr(extList[i], (const char*)"instanced_arrays") != NULL) // Broad check for instanced_arrays + { + // Specific check + if (strcmp(extList[i], (const char *)"GL_ANGLE_instanced_arrays") == 0) // ANGLE + { + glDrawArraysInstanced = (PFNGLDRAWARRAYSINSTANCEDEXTPROC)((rlglLoadProc)loader)("glDrawArraysInstancedANGLE"); + glDrawElementsInstanced = (PFNGLDRAWELEMENTSINSTANCEDEXTPROC)((rlglLoadProc)loader)("glDrawElementsInstancedANGLE"); + glVertexAttribDivisor = (PFNGLVERTEXATTRIBDIVISOREXTPROC)((rlglLoadProc)loader)("glVertexAttribDivisorANGLE"); + } + else if (strcmp(extList[i], (const char *)"GL_EXT_instanced_arrays") == 0) // EXT + { + glDrawArraysInstanced = (PFNGLDRAWARRAYSINSTANCEDEXTPROC)((rlglLoadProc)loader)("glDrawArraysInstancedEXT"); + glDrawElementsInstanced = (PFNGLDRAWELEMENTSINSTANCEDEXTPROC)((rlglLoadProc)loader)("glDrawElementsInstancedEXT"); + glVertexAttribDivisor = (PFNGLVERTEXATTRIBDIVISOREXTPROC)((rlglLoadProc)loader)("glVertexAttribDivisorEXT"); + } + else if (strcmp(extList[i], (const char *)"GL_NV_instanced_arrays") == 0) // NVIDIA GLES + { + glDrawArraysInstanced = (PFNGLDRAWARRAYSINSTANCEDEXTPROC)((rlglLoadProc)loader)("glDrawArraysInstancedNV"); + glDrawElementsInstanced = (PFNGLDRAWELEMENTSINSTANCEDEXTPROC)((rlglLoadProc)loader)("glDrawElementsInstancedNV"); + glVertexAttribDivisor = (PFNGLVERTEXATTRIBDIVISOREXTPROC)((rlglLoadProc)loader)("glVertexAttribDivisorNV"); + } + + // The feature will only be marked as supported if the elements from GL_XXX_instanced_arrays are present + if ((glDrawArraysInstanced != NULL) && (glDrawElementsInstanced != NULL) && (glVertexAttribDivisor != NULL)) RLGL.ExtSupported.instancing = true; + } + else if (strstr(extList[i], (const char *)"draw_instanced") != NULL) + { + // GL_ANGLE_draw_instanced doesn't exist + if (strcmp(extList[i], (const char *)"GL_EXT_draw_instanced") == 0) + { + glDrawArraysInstanced = (PFNGLDRAWARRAYSINSTANCEDEXTPROC)((rlglLoadProc)loader)("glDrawArraysInstancedEXT"); + glDrawElementsInstanced = (PFNGLDRAWELEMENTSINSTANCEDEXTPROC)((rlglLoadProc)loader)("glDrawElementsInstancedEXT"); + } + else if (strcmp(extList[i], (const char*)"GL_NV_draw_instanced") == 0) + { + glDrawArraysInstanced = (PFNGLDRAWARRAYSINSTANCEDEXTPROC)((rlglLoadProc)loader)("glDrawArraysInstancedNV"); + glDrawElementsInstanced = (PFNGLDRAWELEMENTSINSTANCEDEXTPROC)((rlglLoadProc)loader)("glDrawElementsInstancedNV"); + } + + // But the functions will at least be loaded if only GL_XX_EXT_draw_instanced exist + if ((glDrawArraysInstanced != NULL) && (glDrawElementsInstanced != NULL) && (glVertexAttribDivisor != NULL)) RLGL.ExtSupported.instancing = true; + } + + // Check NPOT textures support + // NOTE: Only check on OpenGL ES, OpenGL 3.3 has NPOT textures full support as core feature + if (strcmp(extList[i], (const char *)"GL_OES_texture_npot") == 0) RLGL.ExtSupported.texNPOT = true; + + // Check texture float support + if (strcmp(extList[i], (const char *)"GL_OES_texture_float") == 0) RLGL.ExtSupported.texFloat32 = true; + if (strcmp(extList[i], (const char *)"GL_OES_texture_half_float") == 0) RLGL.ExtSupported.texFloat16 = true; + + // Check depth texture support + if (strcmp(extList[i], (const char *)"GL_OES_depth_texture") == 0) RLGL.ExtSupported.texDepth = true; + if (strcmp(extList[i], (const char *)"GL_WEBGL_depth_texture") == 0) RLGL.ExtSupported.texDepthWebGL = true; // WebGL requires unsized internal format + if (RLGL.ExtSupported.texDepthWebGL) RLGL.ExtSupported.texDepth = true; + + if (strcmp(extList[i], (const char *)"GL_OES_depth24") == 0) RLGL.ExtSupported.maxDepthBits = 24; // Not available on WebGL + if (strcmp(extList[i], (const char *)"GL_OES_depth32") == 0) RLGL.ExtSupported.maxDepthBits = 32; // Not available on WebGL + + // Check texture compression support: DXT + if ((strcmp(extList[i], (const char *)"GL_EXT_texture_compression_s3tc") == 0) || + (strcmp(extList[i], (const char *)"GL_WEBGL_compressed_texture_s3tc") == 0) || + (strcmp(extList[i], (const char *)"GL_WEBKIT_WEBGL_compressed_texture_s3tc") == 0)) RLGL.ExtSupported.texCompDXT = true; + + // Check texture compression support: ETC1 + if ((strcmp(extList[i], (const char *)"GL_OES_compressed_ETC1_RGB8_texture") == 0) || + (strcmp(extList[i], (const char *)"GL_WEBGL_compressed_texture_etc1") == 0)) RLGL.ExtSupported.texCompETC1 = true; + + // Check texture compression support: ETC2/EAC + if (strcmp(extList[i], (const char *)"GL_ARB_ES3_compatibility") == 0) RLGL.ExtSupported.texCompETC2 = true; + + // Check texture compression support: PVR + if (strcmp(extList[i], (const char *)"GL_IMG_texture_compression_pvrtc") == 0) RLGL.ExtSupported.texCompPVRT = true; + + // Check texture compression support: ASTC + if (strcmp(extList[i], (const char *)"GL_KHR_texture_compression_astc_hdr") == 0) RLGL.ExtSupported.texCompASTC = true; + + // Check anisotropic texture filter support + if (strcmp(extList[i], (const char *)"GL_EXT_texture_filter_anisotropic") == 0) RLGL.ExtSupported.texAnisoFilter = true; + + // Check clamp mirror wrap mode support + if (strcmp(extList[i], (const char *)"GL_EXT_texture_mirror_clamp") == 0) RLGL.ExtSupported.texMirrorClamp = true; + } + + // Free extensions pointers + RL_FREE(extList); + RL_FREE(extensionsDup); // Duplicated string must be deallocated +#endif // GRAPHICS_API_OPENGL_ES2 + + // Check OpenGL information and capabilities + //------------------------------------------------------------------------------ + // Show current OpenGL and GLSL version + TRACELOG(RL_LOG_INFO, "GL: OpenGL device information:"); + TRACELOG(RL_LOG_INFO, " > Vendor: %s", glGetString(GL_VENDOR)); + TRACELOG(RL_LOG_INFO, " > Renderer: %s", glGetString(GL_RENDERER)); + TRACELOG(RL_LOG_INFO, " > Version: %s", glGetString(GL_VERSION)); + TRACELOG(RL_LOG_INFO, " > GLSL: %s", glGetString(GL_SHADING_LANGUAGE_VERSION)); + +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + // NOTE: Anisotropy levels capability is an extension + #ifndef GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT + #define GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT 0x84FF + #endif + glGetFloatv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &RLGL.ExtSupported.maxAnisotropyLevel); + +#if defined(RLGL_SHOW_GL_DETAILS_INFO) + // Show some OpenGL GPU capabilities + TRACELOG(RL_LOG_INFO, "GL: OpenGL capabilities:"); + GLint capability = 0; + glGetIntegerv(GL_MAX_TEXTURE_SIZE, &capability); + TRACELOG(RL_LOG_INFO, " GL_MAX_TEXTURE_SIZE: %i", capability); + glGetIntegerv(GL_MAX_CUBE_MAP_TEXTURE_SIZE, &capability); + TRACELOG(RL_LOG_INFO, " GL_MAX_CUBE_MAP_TEXTURE_SIZE: %i", capability); + glGetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS, &capability); + TRACELOG(RL_LOG_INFO, " GL_MAX_TEXTURE_IMAGE_UNITS: %i", capability); + glGetIntegerv(GL_MAX_VERTEX_ATTRIBS, &capability); + TRACELOG(RL_LOG_INFO, " GL_MAX_VERTEX_ATTRIBS: %i", capability); + #if !defined(GRAPHICS_API_OPENGL_ES2) + glGetIntegerv(GL_MAX_UNIFORM_BLOCK_SIZE, &capability); + TRACELOG(RL_LOG_INFO, " GL_MAX_UNIFORM_BLOCK_SIZE: %i", capability); + glGetIntegerv(GL_MAX_DRAW_BUFFERS, &capability); + TRACELOG(RL_LOG_INFO, " GL_MAX_DRAW_BUFFERS: %i", capability); + if (RLGL.ExtSupported.texAnisoFilter) TRACELOG(RL_LOG_INFO, " GL_MAX_TEXTURE_MAX_ANISOTROPY: %.0f", RLGL.ExtSupported.maxAnisotropyLevel); + #endif + glGetIntegerv(GL_NUM_COMPRESSED_TEXTURE_FORMATS, &capability); + TRACELOG(RL_LOG_INFO, " GL_NUM_COMPRESSED_TEXTURE_FORMATS: %i", capability); + GLint *compFormats = (GLint *)RL_CALLOC(capability, sizeof(GLint)); + glGetIntegerv(GL_COMPRESSED_TEXTURE_FORMATS, compFormats); + for (int i = 0; i < capability; i++) TRACELOG(RL_LOG_INFO, " %s", rlGetCompressedFormatName(compFormats[i])); + RL_FREE(compFormats); + +#if defined(GRAPHICS_API_OPENGL_43) + glGetIntegerv(GL_MAX_VERTEX_ATTRIB_BINDINGS, &capability); + TRACELOG(RL_LOG_INFO, " GL_MAX_VERTEX_ATTRIB_BINDINGS: %i", capability); + glGetIntegerv(GL_MAX_UNIFORM_LOCATIONS, &capability); + TRACELOG(RL_LOG_INFO, " GL_MAX_UNIFORM_LOCATIONS: %i", capability); +#endif // GRAPHICS_API_OPENGL_43 +#else // RLGL_SHOW_GL_DETAILS_INFO + + // Show some basic info about GL supported features + if (RLGL.ExtSupported.vao) TRACELOG(RL_LOG_INFO, "GL: VAO extension detected, VAO functions loaded successfully"); + else TRACELOG(RL_LOG_WARNING, "GL: VAO extension not found, VAO not supported"); + if (RLGL.ExtSupported.texNPOT) TRACELOG(RL_LOG_INFO, "GL: NPOT textures extension detected, full NPOT textures supported"); + else TRACELOG(RL_LOG_WARNING, "GL: NPOT textures extension not found, limited NPOT support (no-mipmaps, no-repeat)"); + if (RLGL.ExtSupported.texCompDXT) TRACELOG(RL_LOG_INFO, "GL: DXT compressed textures supported"); + if (RLGL.ExtSupported.texCompETC1) TRACELOG(RL_LOG_INFO, "GL: ETC1 compressed textures supported"); + if (RLGL.ExtSupported.texCompETC2) TRACELOG(RL_LOG_INFO, "GL: ETC2/EAC compressed textures supported"); + if (RLGL.ExtSupported.texCompPVRT) TRACELOG(RL_LOG_INFO, "GL: PVRT compressed textures supported"); + if (RLGL.ExtSupported.texCompASTC) TRACELOG(RL_LOG_INFO, "GL: ASTC compressed textures supported"); + if (RLGL.ExtSupported.computeShader) TRACELOG(RL_LOG_INFO, "GL: Compute shaders supported"); + if (RLGL.ExtSupported.ssbo) TRACELOG(RL_LOG_INFO, "GL: Shader storage buffer objects supported"); +#endif // RLGL_SHOW_GL_DETAILS_INFO + +#endif // GRAPHICS_API_OPENGL_33 || GRAPHICS_API_OPENGL_ES2 +} + +// Get current OpenGL version +int rlGetVersion(void) +{ + int glVersion = 0; +#if defined(GRAPHICS_API_OPENGL_11) + glVersion = RL_OPENGL_11; +#endif +#if defined(GRAPHICS_API_OPENGL_21) + glVersion = RL_OPENGL_21; +#elif defined(GRAPHICS_API_OPENGL_43) + glVersion = RL_OPENGL_43; +#elif defined(GRAPHICS_API_OPENGL_33) + glVersion = RL_OPENGL_33; +#endif +#if defined(GRAPHICS_API_OPENGL_ES3) + glVersion = RL_OPENGL_ES_30; +#elif defined(GRAPHICS_API_OPENGL_ES2) + glVersion = RL_OPENGL_ES_20; +#endif + + return glVersion; +} + +// Set current framebuffer width +void rlSetFramebufferWidth(int width) +{ +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + RLGL.State.framebufferWidth = width; +#endif +} + +// Set current framebuffer height +void rlSetFramebufferHeight(int height) +{ +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + RLGL.State.framebufferHeight = height; +#endif +} + +// Get default framebuffer width +int rlGetFramebufferWidth(void) +{ + int width = 0; +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + width = RLGL.State.framebufferWidth; +#endif + return width; +} + +// Get default framebuffer height +int rlGetFramebufferHeight(void) +{ + int height = 0; +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + height = RLGL.State.framebufferHeight; +#endif + return height; +} + +// Get default internal texture (white texture) +// NOTE: Default texture is a 1x1 pixel UNCOMPRESSED_R8G8B8A8 +unsigned int rlGetTextureIdDefault(void) +{ + unsigned int id = 0; +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + id = RLGL.State.defaultTextureId; +#endif + return id; +} + +// Get default shader id +unsigned int rlGetShaderIdDefault(void) +{ + unsigned int id = 0; +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + id = RLGL.State.defaultShaderId; +#endif + return id; +} + +// Get default shader locs +int *rlGetShaderLocsDefault(void) +{ + int *locs = NULL; +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + locs = RLGL.State.defaultShaderLocs; +#endif + return locs; +} + +// Render batch management +//------------------------------------------------------------------------------------------------ +// Load render batch +rlRenderBatch rlLoadRenderBatch(int numBuffers, int bufferElements) +{ + rlRenderBatch batch = { 0 }; + +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + // Initialize CPU (RAM) vertex buffers (position, texcoord, color data and indexes) + //-------------------------------------------------------------------------------------------- + batch.vertexBuffer = (rlVertexBuffer *)RL_MALLOC(numBuffers*sizeof(rlVertexBuffer)); + + for (int i = 0; i < numBuffers; i++) + { + batch.vertexBuffer[i].elementCount = bufferElements; + + batch.vertexBuffer[i].vertices = (float *)RL_MALLOC(bufferElements*3*4*sizeof(float)); // 3 float by vertex, 4 vertex by quad + batch.vertexBuffer[i].texcoords = (float *)RL_MALLOC(bufferElements*2*4*sizeof(float)); // 2 float by texcoord, 4 texcoord by quad + batch.vertexBuffer[i].normals = (float *)RL_MALLOC(bufferElements*3*4*sizeof(float)); // 3 float by vertex, 4 vertex by quad + batch.vertexBuffer[i].colors = (unsigned char *)RL_MALLOC(bufferElements*4*4*sizeof(unsigned char)); // 4 float by color, 4 colors by quad +#if defined(GRAPHICS_API_OPENGL_33) + batch.vertexBuffer[i].indices = (unsigned int *)RL_MALLOC(bufferElements*6*sizeof(unsigned int)); // 6 int by quad (indices) +#endif +#if defined(GRAPHICS_API_OPENGL_ES2) + batch.vertexBuffer[i].indices = (unsigned short *)RL_MALLOC(bufferElements*6*sizeof(unsigned short)); // 6 int by quad (indices) +#endif + + for (int j = 0; j < (3*4*bufferElements); j++) batch.vertexBuffer[i].vertices[j] = 0.0f; + for (int j = 0; j < (2*4*bufferElements); j++) batch.vertexBuffer[i].texcoords[j] = 0.0f; + for (int j = 0; j < (3*4*bufferElements); j++) batch.vertexBuffer[i].normals[j] = 0.0f; + for (int j = 0; j < (4*4*bufferElements); j++) batch.vertexBuffer[i].colors[j] = 0; + + int k = 0; + + // Indices can be initialized right now + for (int j = 0; j < (6*bufferElements); j += 6) + { + batch.vertexBuffer[i].indices[j] = 4*k; + batch.vertexBuffer[i].indices[j + 1] = 4*k + 1; + batch.vertexBuffer[i].indices[j + 2] = 4*k + 2; + batch.vertexBuffer[i].indices[j + 3] = 4*k; + batch.vertexBuffer[i].indices[j + 4] = 4*k + 2; + batch.vertexBuffer[i].indices[j + 5] = 4*k + 3; + + k++; + } + + RLGL.State.vertexCounter = 0; + } + + TRACELOG(RL_LOG_INFO, "RLGL: Render batch vertex buffers loaded successfully in RAM (CPU)"); + //-------------------------------------------------------------------------------------------- + + // Upload to GPU (VRAM) vertex data and initialize VAOs/VBOs + //-------------------------------------------------------------------------------------------- + for (int i = 0; i < numBuffers; i++) + { + if (RLGL.ExtSupported.vao) + { + // Initialize Quads VAO + glGenVertexArrays(1, &batch.vertexBuffer[i].vaoId); + glBindVertexArray(batch.vertexBuffer[i].vaoId); + } + + // Quads - Vertex buffers binding and attributes enable + // Vertex position buffer (shader-location = 0) + glGenBuffers(1, &batch.vertexBuffer[i].vboId[0]); + glBindBuffer(GL_ARRAY_BUFFER, batch.vertexBuffer[i].vboId[0]); + glBufferData(GL_ARRAY_BUFFER, bufferElements*3*4*sizeof(float), batch.vertexBuffer[i].vertices, GL_DYNAMIC_DRAW); + glEnableVertexAttribArray(RLGL.State.currentShaderLocs[RL_SHADER_LOC_VERTEX_POSITION]); + glVertexAttribPointer(RLGL.State.currentShaderLocs[RL_SHADER_LOC_VERTEX_POSITION], 3, GL_FLOAT, 0, 0, 0); + + // Vertex texcoord buffer (shader-location = 1) + glGenBuffers(1, &batch.vertexBuffer[i].vboId[1]); + glBindBuffer(GL_ARRAY_BUFFER, batch.vertexBuffer[i].vboId[1]); + glBufferData(GL_ARRAY_BUFFER, bufferElements*2*4*sizeof(float), batch.vertexBuffer[i].texcoords, GL_DYNAMIC_DRAW); + glEnableVertexAttribArray(RLGL.State.currentShaderLocs[RL_SHADER_LOC_VERTEX_TEXCOORD01]); + glVertexAttribPointer(RLGL.State.currentShaderLocs[RL_SHADER_LOC_VERTEX_TEXCOORD01], 2, GL_FLOAT, 0, 0, 0); + + // Vertex normal buffer (shader-location = 2) + glGenBuffers(1, &batch.vertexBuffer[i].vboId[2]); + glBindBuffer(GL_ARRAY_BUFFER, batch.vertexBuffer[i].vboId[2]); + glBufferData(GL_ARRAY_BUFFER, bufferElements*3*4*sizeof(float), batch.vertexBuffer[i].normals, GL_DYNAMIC_DRAW); + glEnableVertexAttribArray(RLGL.State.currentShaderLocs[RL_SHADER_LOC_VERTEX_NORMAL]); + glVertexAttribPointer(RLGL.State.currentShaderLocs[RL_SHADER_LOC_VERTEX_NORMAL], 3, GL_FLOAT, 0, 0, 0); + + // Vertex color buffer (shader-location = 3) + glGenBuffers(1, &batch.vertexBuffer[i].vboId[3]); + glBindBuffer(GL_ARRAY_BUFFER, batch.vertexBuffer[i].vboId[3]); + glBufferData(GL_ARRAY_BUFFER, bufferElements*4*4*sizeof(unsigned char), batch.vertexBuffer[i].colors, GL_DYNAMIC_DRAW); + glEnableVertexAttribArray(RLGL.State.currentShaderLocs[RL_SHADER_LOC_VERTEX_COLOR]); + glVertexAttribPointer(RLGL.State.currentShaderLocs[RL_SHADER_LOC_VERTEX_COLOR], 4, GL_UNSIGNED_BYTE, GL_TRUE, 0, 0); + + // Fill index buffer + glGenBuffers(1, &batch.vertexBuffer[i].vboId[4]); + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, batch.vertexBuffer[i].vboId[4]); +#if defined(GRAPHICS_API_OPENGL_33) + glBufferData(GL_ELEMENT_ARRAY_BUFFER, bufferElements*6*sizeof(int), batch.vertexBuffer[i].indices, GL_STATIC_DRAW); +#endif +#if defined(GRAPHICS_API_OPENGL_ES2) + glBufferData(GL_ELEMENT_ARRAY_BUFFER, bufferElements*6*sizeof(short), batch.vertexBuffer[i].indices, GL_STATIC_DRAW); +#endif + } + + TRACELOG(RL_LOG_INFO, "RLGL: Render batch vertex buffers loaded successfully in VRAM (GPU)"); + + // Unbind the current VAO + if (RLGL.ExtSupported.vao) glBindVertexArray(0); + //-------------------------------------------------------------------------------------------- + + // Init draw calls tracking system + //-------------------------------------------------------------------------------------------- + batch.draws = (rlDrawCall *)RL_MALLOC(RL_DEFAULT_BATCH_DRAWCALLS*sizeof(rlDrawCall)); + + for (int i = 0; i < RL_DEFAULT_BATCH_DRAWCALLS; i++) + { + batch.draws[i].mode = RL_QUADS; + batch.draws[i].vertexCount = 0; + batch.draws[i].vertexAlignment = 0; + //batch.draws[i].vaoId = 0; + //batch.draws[i].shaderId = 0; + batch.draws[i].textureId = RLGL.State.defaultTextureId; + //batch.draws[i].RLGL.State.projection = rlMatrixIdentity(); + //batch.draws[i].RLGL.State.modelview = rlMatrixIdentity(); + } + + batch.bufferCount = numBuffers; // Record buffer count + batch.drawCounter = 1; // Reset draws counter + batch.currentDepth = -1.0f; // Reset depth value + //-------------------------------------------------------------------------------------------- +#endif + + return batch; +} + +// Unload default internal buffers vertex data from CPU and GPU +void rlUnloadRenderBatch(rlRenderBatch batch) +{ +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + // Unbind everything + glBindBuffer(GL_ARRAY_BUFFER, 0); + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); + + // Unload all vertex buffers data + for (int i = 0; i < batch.bufferCount; i++) + { + // Unbind VAO attribs data + if (RLGL.ExtSupported.vao) + { + glBindVertexArray(batch.vertexBuffer[i].vaoId); + glDisableVertexAttribArray(RL_DEFAULT_SHADER_ATTRIB_LOCATION_POSITION); + glDisableVertexAttribArray(RL_DEFAULT_SHADER_ATTRIB_LOCATION_TEXCOORD); + glDisableVertexAttribArray(RL_DEFAULT_SHADER_ATTRIB_LOCATION_NORMAL); + glDisableVertexAttribArray(RL_DEFAULT_SHADER_ATTRIB_LOCATION_COLOR); + glBindVertexArray(0); + } + + // Delete VBOs from GPU (VRAM) + glDeleteBuffers(1, &batch.vertexBuffer[i].vboId[0]); + glDeleteBuffers(1, &batch.vertexBuffer[i].vboId[1]); + glDeleteBuffers(1, &batch.vertexBuffer[i].vboId[2]); + glDeleteBuffers(1, &batch.vertexBuffer[i].vboId[3]); + glDeleteBuffers(1, &batch.vertexBuffer[i].vboId[4]); + + // Delete VAOs from GPU (VRAM) + if (RLGL.ExtSupported.vao) glDeleteVertexArrays(1, &batch.vertexBuffer[i].vaoId); + + // Free vertex arrays memory from CPU (RAM) + RL_FREE(batch.vertexBuffer[i].vertices); + RL_FREE(batch.vertexBuffer[i].texcoords); + RL_FREE(batch.vertexBuffer[i].normals); + RL_FREE(batch.vertexBuffer[i].colors); + RL_FREE(batch.vertexBuffer[i].indices); + } + + // Unload arrays + RL_FREE(batch.vertexBuffer); + RL_FREE(batch.draws); +#endif +} + +// Draw render batch +// NOTE: We require a pointer to reset batch and increase current buffer (multi-buffer) +void rlDrawRenderBatch(rlRenderBatch *batch) +{ +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + // Update batch vertex buffers + //------------------------------------------------------------------------------------------------------------ + // NOTE: If there is not vertex data, buffers doesn't need to be updated (vertexCount > 0) + // TODO: If no data changed on the CPU arrays --> No need to re-update GPU arrays (use a change detector flag?) + if (RLGL.State.vertexCounter > 0) + { + // Activate elements VAO + if (RLGL.ExtSupported.vao) glBindVertexArray(batch->vertexBuffer[batch->currentBuffer].vaoId); + + // Vertex positions buffer + glBindBuffer(GL_ARRAY_BUFFER, batch->vertexBuffer[batch->currentBuffer].vboId[0]); + glBufferSubData(GL_ARRAY_BUFFER, 0, RLGL.State.vertexCounter*3*sizeof(float), batch->vertexBuffer[batch->currentBuffer].vertices); + //glBufferData(GL_ARRAY_BUFFER, sizeof(float)*3*4*batch->vertexBuffer[batch->currentBuffer].elementCount, batch->vertexBuffer[batch->currentBuffer].vertices, GL_DYNAMIC_DRAW); // Update all buffer + + // Texture coordinates buffer + glBindBuffer(GL_ARRAY_BUFFER, batch->vertexBuffer[batch->currentBuffer].vboId[1]); + glBufferSubData(GL_ARRAY_BUFFER, 0, RLGL.State.vertexCounter*2*sizeof(float), batch->vertexBuffer[batch->currentBuffer].texcoords); + //glBufferData(GL_ARRAY_BUFFER, sizeof(float)*2*4*batch->vertexBuffer[batch->currentBuffer].elementCount, batch->vertexBuffer[batch->currentBuffer].texcoords, GL_DYNAMIC_DRAW); // Update all buffer + + // Normals buffer + glBindBuffer(GL_ARRAY_BUFFER, batch->vertexBuffer[batch->currentBuffer].vboId[2]); + glBufferSubData(GL_ARRAY_BUFFER, 0, RLGL.State.vertexCounter*3*sizeof(float), batch->vertexBuffer[batch->currentBuffer].normals); + //glBufferData(GL_ARRAY_BUFFER, sizeof(float)*3*4*batch->vertexBuffer[batch->currentBuffer].elementCount, batch->vertexBuffer[batch->currentBuffer].normals, GL_DYNAMIC_DRAW); // Update all buffer + + // Colors buffer + glBindBuffer(GL_ARRAY_BUFFER, batch->vertexBuffer[batch->currentBuffer].vboId[3]); + glBufferSubData(GL_ARRAY_BUFFER, 0, RLGL.State.vertexCounter*4*sizeof(unsigned char), batch->vertexBuffer[batch->currentBuffer].colors); + //glBufferData(GL_ARRAY_BUFFER, sizeof(float)*4*4*batch->vertexBuffer[batch->currentBuffer].elementCount, batch->vertexBuffer[batch->currentBuffer].colors, GL_DYNAMIC_DRAW); // Update all buffer + + // NOTE: glMapBuffer() causes sync issue + // If GPU is working with this buffer, glMapBuffer() will wait(stall) until GPU to finish its job + // To avoid waiting (idle), you can call first glBufferData() with NULL pointer before glMapBuffer() + // If you do that, the previous data in PBO will be discarded and glMapBuffer() returns a new + // allocated pointer immediately even if GPU is still working with the previous data + + // Another option: map the buffer object into client's memory + // Probably this code could be moved somewhere else... + // batch->vertexBuffer[batch->currentBuffer].vertices = (float *)glMapBuffer(GL_ARRAY_BUFFER, GL_READ_WRITE); + // if (batch->vertexBuffer[batch->currentBuffer].vertices) + // { + // Update vertex data + // } + // glUnmapBuffer(GL_ARRAY_BUFFER); + + // Unbind the current VAO + if (RLGL.ExtSupported.vao) glBindVertexArray(0); + } + //------------------------------------------------------------------------------------------------------------ + + // Draw batch vertex buffers (considering VR stereo if required) + //------------------------------------------------------------------------------------------------------------ + Matrix matProjection = RLGL.State.projection; + Matrix matModelView = RLGL.State.modelview; + + int eyeCount = 1; + if (RLGL.State.stereoRender) eyeCount = 2; + + for (int eye = 0; eye < eyeCount; eye++) + { + if (eyeCount == 2) + { + // Setup current eye viewport (half screen width) + rlViewport(eye*RLGL.State.framebufferWidth/2, 0, RLGL.State.framebufferWidth/2, RLGL.State.framebufferHeight); + + // Set current eye view offset to modelview matrix + rlSetMatrixModelview(rlMatrixMultiply(matModelView, RLGL.State.viewOffsetStereo[eye])); + // Set current eye projection matrix + rlSetMatrixProjection(RLGL.State.projectionStereo[eye]); + } + + // Draw buffers + if (RLGL.State.vertexCounter > 0) + { + // Set current shader and upload current MVP matrix + glUseProgram(RLGL.State.currentShaderId); + + // Create modelview-projection matrix and upload to shader + Matrix matMVP = rlMatrixMultiply(RLGL.State.modelview, RLGL.State.projection); + glUniformMatrix4fv(RLGL.State.currentShaderLocs[RL_SHADER_LOC_MATRIX_MVP], 1, false, rlMatrixToFloat(matMVP)); + + if (RLGL.State.currentShaderLocs[RL_SHADER_LOC_MATRIX_PROJECTION] != -1) + { + glUniformMatrix4fv(RLGL.State.currentShaderLocs[RL_SHADER_LOC_MATRIX_PROJECTION], 1, false, rlMatrixToFloat(RLGL.State.projection)); + } + + // WARNING: For the following setup of the view, model, and normal matrices, it is expected that + // transformations and rendering occur between rlPushMatrix() and rlPopMatrix() + + if (RLGL.State.currentShaderLocs[RL_SHADER_LOC_MATRIX_VIEW] != -1) + { + glUniformMatrix4fv(RLGL.State.currentShaderLocs[RL_SHADER_LOC_MATRIX_VIEW], 1, false, rlMatrixToFloat(RLGL.State.modelview)); + } + + if (RLGL.State.currentShaderLocs[RL_SHADER_LOC_MATRIX_MODEL] != -1) + { + glUniformMatrix4fv(RLGL.State.currentShaderLocs[RL_SHADER_LOC_MATRIX_MODEL], 1, false, rlMatrixToFloat(RLGL.State.transform)); + } + + if (RLGL.State.currentShaderLocs[RL_SHADER_LOC_MATRIX_NORMAL] != -1) + { + glUniformMatrix4fv(RLGL.State.currentShaderLocs[RL_SHADER_LOC_MATRIX_NORMAL], 1, false, rlMatrixToFloat(rlMatrixTranspose(rlMatrixInvert(RLGL.State.transform)))); + } + + if (RLGL.ExtSupported.vao) glBindVertexArray(batch->vertexBuffer[batch->currentBuffer].vaoId); + else + { + // Bind vertex attrib: position (shader-location = 0) + glBindBuffer(GL_ARRAY_BUFFER, batch->vertexBuffer[batch->currentBuffer].vboId[0]); + glVertexAttribPointer(RLGL.State.currentShaderLocs[RL_SHADER_LOC_VERTEX_POSITION], 3, GL_FLOAT, 0, 0, 0); + glEnableVertexAttribArray(RLGL.State.currentShaderLocs[RL_SHADER_LOC_VERTEX_POSITION]); + + // Bind vertex attrib: texcoord (shader-location = 1) + glBindBuffer(GL_ARRAY_BUFFER, batch->vertexBuffer[batch->currentBuffer].vboId[1]); + glVertexAttribPointer(RLGL.State.currentShaderLocs[RL_SHADER_LOC_VERTEX_TEXCOORD01], 2, GL_FLOAT, 0, 0, 0); + glEnableVertexAttribArray(RLGL.State.currentShaderLocs[RL_SHADER_LOC_VERTEX_TEXCOORD01]); + + // Bind vertex attrib: normal (shader-location = 2) + glBindBuffer(GL_ARRAY_BUFFER, batch->vertexBuffer[batch->currentBuffer].vboId[2]); + glVertexAttribPointer(RLGL.State.currentShaderLocs[RL_SHADER_LOC_VERTEX_NORMAL], 3, GL_FLOAT, 0, 0, 0); + glEnableVertexAttribArray(RLGL.State.currentShaderLocs[RL_SHADER_LOC_VERTEX_NORMAL]); + + // Bind vertex attrib: color (shader-location = 3) + glBindBuffer(GL_ARRAY_BUFFER, batch->vertexBuffer[batch->currentBuffer].vboId[3]); + glVertexAttribPointer(RLGL.State.currentShaderLocs[RL_SHADER_LOC_VERTEX_COLOR], 4, GL_UNSIGNED_BYTE, GL_TRUE, 0, 0); + glEnableVertexAttribArray(RLGL.State.currentShaderLocs[RL_SHADER_LOC_VERTEX_COLOR]); + + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, batch->vertexBuffer[batch->currentBuffer].vboId[4]); + } + + // Setup some default shader values + glUniform4f(RLGL.State.currentShaderLocs[RL_SHADER_LOC_COLOR_DIFFUSE], 1.0f, 1.0f, 1.0f, 1.0f); + glUniform1i(RLGL.State.currentShaderLocs[RL_SHADER_LOC_MAP_DIFFUSE], 0); // Active default sampler2D: texture0 + + // Activate additional sampler textures + // Those additional textures will be common for all draw calls of the batch + for (int i = 0; i < RL_DEFAULT_BATCH_MAX_TEXTURE_UNITS; i++) + { + if (RLGL.State.activeTextureId[i] > 0) + { + glActiveTexture(GL_TEXTURE0 + 1 + i); + glBindTexture(GL_TEXTURE_2D, RLGL.State.activeTextureId[i]); + } + } + + // Activate default sampler2D texture0 (one texture is always active for default batch shader) + // NOTE: Batch system accumulates calls by texture0 changes, additional textures are enabled for all the draw calls + glActiveTexture(GL_TEXTURE0); + + for (int i = 0, vertexOffset = 0; i < batch->drawCounter; i++) + { + // Bind current draw call texture, activated as GL_TEXTURE0 and Bound to sampler2D texture0 by default + glBindTexture(GL_TEXTURE_2D, batch->draws[i].textureId); + + if ((batch->draws[i].mode == RL_LINES) || (batch->draws[i].mode == RL_TRIANGLES)) glDrawArrays(batch->draws[i].mode, vertexOffset, batch->draws[i].vertexCount); + else + { + #if defined(GRAPHICS_API_OPENGL_33) + // We need to define the number of indices to be processed: elementCount*6 + // NOTE: The final parameter tells the GPU the offset in bytes from the + // start of the index buffer to the location of the first index to process + glDrawElements(GL_TRIANGLES, batch->draws[i].vertexCount/4*6, GL_UNSIGNED_INT, (GLvoid *)(vertexOffset/4*6*sizeof(GLuint))); + #endif + #if defined(GRAPHICS_API_OPENGL_ES2) + glDrawElements(GL_TRIANGLES, batch->draws[i].vertexCount/4*6, GL_UNSIGNED_SHORT, (GLvoid *)(vertexOffset/4*6*sizeof(GLushort))); + #endif + } + + vertexOffset += (batch->draws[i].vertexCount + batch->draws[i].vertexAlignment); + } + + if (!RLGL.ExtSupported.vao) + { + glBindBuffer(GL_ARRAY_BUFFER, 0); + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); + } + + glBindTexture(GL_TEXTURE_2D, 0); // Unbind textures + } + + if (RLGL.ExtSupported.vao) glBindVertexArray(0); // Unbind VAO + + glUseProgram(0); // Unbind shader program + } + + // Restore viewport to default measures + if (eyeCount == 2) rlViewport(0, 0, RLGL.State.framebufferWidth, RLGL.State.framebufferHeight); + //------------------------------------------------------------------------------------------------------------ + + // Reset batch buffers + //------------------------------------------------------------------------------------------------------------ + // Reset vertex counter for next frame + RLGL.State.vertexCounter = 0; + + // Reset depth for next draw + batch->currentDepth = -1.0f; + + // Restore projection/modelview matrices + RLGL.State.projection = matProjection; + RLGL.State.modelview = matModelView; + + // Reset RLGL.currentBatch->draws array + for (int i = 0; i < RL_DEFAULT_BATCH_DRAWCALLS; i++) + { + batch->draws[i].mode = RL_QUADS; + batch->draws[i].vertexCount = 0; + batch->draws[i].textureId = RLGL.State.defaultTextureId; + } + + // Reset active texture units for next batch + for (int i = 0; i < RL_DEFAULT_BATCH_MAX_TEXTURE_UNITS; i++) RLGL.State.activeTextureId[i] = 0; + + // Reset draws counter to one draw for the batch + batch->drawCounter = 1; + //------------------------------------------------------------------------------------------------------------ + + // Change to next buffer in the list (in case of multi-buffering) + batch->currentBuffer++; + if (batch->currentBuffer >= batch->bufferCount) batch->currentBuffer = 0; +#endif +} + +// Set the active render batch for rlgl +void rlSetRenderBatchActive(rlRenderBatch *batch) +{ +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + rlDrawRenderBatch(RLGL.currentBatch); + + if (batch != NULL) RLGL.currentBatch = batch; + else RLGL.currentBatch = &RLGL.defaultBatch; +#endif +} + +// Update and draw internal render batch +void rlDrawRenderBatchActive(void) +{ +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + rlDrawRenderBatch(RLGL.currentBatch); // NOTE: Stereo rendering is checked inside +#endif +} + +// Check internal buffer overflow for a given number of vertex +// and force a rlRenderBatch draw call if required +bool rlCheckRenderBatchLimit(int vCount) +{ + bool overflow = false; + +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + if ((RLGL.State.vertexCounter + vCount) >= + (RLGL.currentBatch->vertexBuffer[RLGL.currentBatch->currentBuffer].elementCount*4)) + { + overflow = true; + + // Store current primitive drawing mode and texture id + int currentMode = RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].mode; + int currentTexture = RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].textureId; + + rlDrawRenderBatch(RLGL.currentBatch); // NOTE: Stereo rendering is checked inside + + // Restore state of last batch so we can continue adding vertices + RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].mode = currentMode; + RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].textureId = currentTexture; + } +#endif + + return overflow; +} + +// Textures data management +//----------------------------------------------------------------------------------------- +// Convert image data to OpenGL texture (returns OpenGL valid Id) +unsigned int rlLoadTexture(const void *data, int width, int height, int format, int mipmapCount) +{ + unsigned int id = 0; + + glBindTexture(GL_TEXTURE_2D, 0); // Free any old binding + + // Check texture format support by OpenGL 1.1 (compressed textures not supported) +#if defined(GRAPHICS_API_OPENGL_11) + if (format >= RL_PIXELFORMAT_COMPRESSED_DXT1_RGB) + { + TRACELOG(RL_LOG_WARNING, "GL: OpenGL 1.1 does not support GPU compressed texture formats"); + return id; + } +#else + if ((!RLGL.ExtSupported.texCompDXT) && ((format == RL_PIXELFORMAT_COMPRESSED_DXT1_RGB) || (format == RL_PIXELFORMAT_COMPRESSED_DXT1_RGBA) || + (format == RL_PIXELFORMAT_COMPRESSED_DXT3_RGBA) || (format == RL_PIXELFORMAT_COMPRESSED_DXT5_RGBA))) + { + TRACELOG(RL_LOG_WARNING, "GL: DXT compressed texture format not supported"); + return id; + } +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + if ((!RLGL.ExtSupported.texCompETC1) && (format == RL_PIXELFORMAT_COMPRESSED_ETC1_RGB)) + { + TRACELOG(RL_LOG_WARNING, "GL: ETC1 compressed texture format not supported"); + return id; + } + + if ((!RLGL.ExtSupported.texCompETC2) && ((format == RL_PIXELFORMAT_COMPRESSED_ETC2_RGB) || (format == RL_PIXELFORMAT_COMPRESSED_ETC2_EAC_RGBA))) + { + TRACELOG(RL_LOG_WARNING, "GL: ETC2 compressed texture format not supported"); + return id; + } + + if ((!RLGL.ExtSupported.texCompPVRT) && ((format == RL_PIXELFORMAT_COMPRESSED_PVRT_RGB) || (format == RL_PIXELFORMAT_COMPRESSED_PVRT_RGBA))) + { + TRACELOG(RL_LOG_WARNING, "GL: PVRT compressed texture format not supported"); + return id; + } + + if ((!RLGL.ExtSupported.texCompASTC) && ((format == RL_PIXELFORMAT_COMPRESSED_ASTC_4x4_RGBA) || (format == RL_PIXELFORMAT_COMPRESSED_ASTC_8x8_RGBA))) + { + TRACELOG(RL_LOG_WARNING, "GL: ASTC compressed texture format not supported"); + return id; + } +#endif +#endif // GRAPHICS_API_OPENGL_11 + + glPixelStorei(GL_UNPACK_ALIGNMENT, 1); + + glGenTextures(1, &id); // Generate texture id + + glBindTexture(GL_TEXTURE_2D, id); + + int mipWidth = width; + int mipHeight = height; + int mipOffset = 0; // Mipmap data offset, only used for tracelog + + // NOTE: Added pointer math separately from function to avoid UBSAN complaining + unsigned char *dataPtr = NULL; + if (data != NULL) dataPtr = (unsigned char *)data; + + // Load the different mipmap levels + for (int i = 0; i < mipmapCount; i++) + { + unsigned int mipSize = rlGetPixelDataSize(mipWidth, mipHeight, format); + + unsigned int glInternalFormat, glFormat, glType; + rlGetGlTextureFormats(format, &glInternalFormat, &glFormat, &glType); + + TRACELOGD("TEXTURE: Load mipmap level %i (%i x %i), size: %i, offset: %i", i, mipWidth, mipHeight, mipSize, mipOffset); + + if (glInternalFormat != 0) + { + if (format < RL_PIXELFORMAT_COMPRESSED_DXT1_RGB) glTexImage2D(GL_TEXTURE_2D, i, glInternalFormat, mipWidth, mipHeight, 0, glFormat, glType, dataPtr); +#if !defined(GRAPHICS_API_OPENGL_11) + else glCompressedTexImage2D(GL_TEXTURE_2D, i, glInternalFormat, mipWidth, mipHeight, 0, mipSize, dataPtr); +#endif + +#if defined(GRAPHICS_API_OPENGL_33) + if (format == RL_PIXELFORMAT_UNCOMPRESSED_GRAYSCALE) + { + GLint swizzleMask[] = { GL_RED, GL_RED, GL_RED, GL_ONE }; + glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_RGBA, swizzleMask); + } + else if (format == RL_PIXELFORMAT_UNCOMPRESSED_GRAY_ALPHA) + { +#if defined(GRAPHICS_API_OPENGL_21) + GLint swizzleMask[] = { GL_RED, GL_RED, GL_RED, GL_ALPHA }; +#elif defined(GRAPHICS_API_OPENGL_33) + GLint swizzleMask[] = { GL_RED, GL_RED, GL_RED, GL_GREEN }; +#endif + glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_RGBA, swizzleMask); + } +#endif + } + + mipWidth /= 2; + mipHeight /= 2; + mipOffset += mipSize; // Increment offset position to next mipmap + if (data != NULL) dataPtr += mipSize; // Increment data pointer to next mipmap + + // Security check for NPOT textures + if (mipWidth < 1) mipWidth = 1; + if (mipHeight < 1) mipHeight = 1; + } + + // Texture parameters configuration + // NOTE: glTexParameteri does NOT affect texture uploading, just the way it's used +#if defined(GRAPHICS_API_OPENGL_ES2) + // NOTE: OpenGL ES 2.0 with no GL_OES_texture_npot support (i.e. WebGL) has limited NPOT support, so CLAMP_TO_EDGE must be used + if (RLGL.ExtSupported.texNPOT) + { + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); // Set texture to repeat on x-axis + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); // Set texture to repeat on y-axis + } + else + { + // NOTE: If using negative texture coordinates (LoadOBJ()), it does not work! + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); // Set texture to clamp on x-axis + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); // Set texture to clamp on y-axis + } +#else + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); // Set texture to repeat on x-axis + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); // Set texture to repeat on y-axis +#endif + + // Magnification and minification filters + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); // Alternative: GL_LINEAR + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); // Alternative: GL_LINEAR + +#if defined(GRAPHICS_API_OPENGL_33) + if (mipmapCount > 1) + { + // Activate Trilinear filtering if mipmaps are available + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); + } +#endif + + // At this point we have the texture loaded in GPU and texture parameters configured + + // NOTE: If mipmaps were not in data, they are not generated automatically + + // Unbind current texture + glBindTexture(GL_TEXTURE_2D, 0); + + if (id > 0) TRACELOG(RL_LOG_INFO, "TEXTURE: [ID %i] Texture loaded successfully (%ix%i | %s | %i mipmaps)", id, width, height, rlGetPixelFormatName(format), mipmapCount); + else TRACELOG(RL_LOG_WARNING, "TEXTURE: Failed to load texture"); + + return id; +} + +// Load depth texture/renderbuffer (to be attached to fbo) +// WARNING: OpenGL ES 2.0 requires GL_OES_depth_texture and WebGL requires WEBGL_depth_texture extensions +unsigned int rlLoadTextureDepth(int width, int height, bool useRenderBuffer) +{ + unsigned int id = 0; + +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + // In case depth textures not supported, we force renderbuffer usage + if (!RLGL.ExtSupported.texDepth) useRenderBuffer = true; + + // NOTE: We let the implementation to choose the best bit-depth + // Possible formats: GL_DEPTH_COMPONENT16, GL_DEPTH_COMPONENT24, GL_DEPTH_COMPONENT32 and GL_DEPTH_COMPONENT32F + unsigned int glInternalFormat = GL_DEPTH_COMPONENT; + +#if (defined(GRAPHICS_API_OPENGL_ES2) || defined(GRAPHICS_API_OPENGL_ES3)) + // WARNING: WebGL platform requires unsized internal format definition (GL_DEPTH_COMPONENT) + // while other platforms using OpenGL ES 2.0 require/support sized internal formats depending on the GPU capabilities + if (!RLGL.ExtSupported.texDepthWebGL || useRenderBuffer) + { + if (RLGL.ExtSupported.maxDepthBits == 32) glInternalFormat = GL_DEPTH_COMPONENT32_OES; + else if (RLGL.ExtSupported.maxDepthBits == 24) glInternalFormat = GL_DEPTH_COMPONENT24_OES; + else glInternalFormat = GL_DEPTH_COMPONENT16; + } +#endif + + if (!useRenderBuffer && RLGL.ExtSupported.texDepth) + { + glGenTextures(1, &id); + glBindTexture(GL_TEXTURE_2D, id); + glTexImage2D(GL_TEXTURE_2D, 0, glInternalFormat, width, height, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, NULL); + + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + + glBindTexture(GL_TEXTURE_2D, 0); + + TRACELOG(RL_LOG_INFO, "TEXTURE: Depth texture loaded successfully"); + } + else + { + // Create the renderbuffer that will serve as the depth attachment for the framebuffer + // NOTE: A renderbuffer is simpler than a texture and could offer better performance on embedded devices + glGenRenderbuffers(1, &id); + glBindRenderbuffer(GL_RENDERBUFFER, id); + glRenderbufferStorage(GL_RENDERBUFFER, glInternalFormat, width, height); + + glBindRenderbuffer(GL_RENDERBUFFER, 0); + + TRACELOG(RL_LOG_INFO, "TEXTURE: [ID %i] Depth renderbuffer loaded successfully (%i bits)", id, (RLGL.ExtSupported.maxDepthBits >= 24)? RLGL.ExtSupported.maxDepthBits : 16); + } +#endif + + return id; +} + +// Load texture cubemap +// NOTE: Cubemap data is expected to be 6 images in a single data array (one after the other), +// expected the following convention: +X, -X, +Y, -Y, +Z, -Z +unsigned int rlLoadTextureCubemap(const void *data, int size, int format, int mipmapCount) +{ + unsigned int id = 0; + +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + int mipSize = size; + + // NOTE: Added pointer math separately from function to avoid UBSAN complaining + unsigned char *dataPtr = NULL; + if (data != NULL) dataPtr = (unsigned char *)data; + + unsigned int dataSize = rlGetPixelDataSize(size, size, format); + + glGenTextures(1, &id); + glBindTexture(GL_TEXTURE_CUBE_MAP, id); + + unsigned int glInternalFormat, glFormat, glType; + rlGetGlTextureFormats(format, &glInternalFormat, &glFormat, &glType); + + if (glInternalFormat != 0) + { + // Load cubemap faces/mipmaps + for (int i = 0; i < 6*mipmapCount; i++) + { + int mipmapLevel = i/6; + int face = i%6; + + if (data == NULL) + { + if (format < RL_PIXELFORMAT_COMPRESSED_DXT1_RGB) + { + if ((format == RL_PIXELFORMAT_UNCOMPRESSED_R32) || + (format == RL_PIXELFORMAT_UNCOMPRESSED_R32G32B32A32) || + (format == RL_PIXELFORMAT_UNCOMPRESSED_R16) || + (format == RL_PIXELFORMAT_UNCOMPRESSED_R16G16B16A16)) TRACELOG(RL_LOG_WARNING, "TEXTURES: Cubemap requested format not supported"); + else glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + face, mipmapLevel, glInternalFormat, mipSize, mipSize, 0, glFormat, glType, NULL); + } + else TRACELOG(RL_LOG_WARNING, "TEXTURES: Empty cubemap creation does not support compressed format"); + } + else + { + if (format < RL_PIXELFORMAT_COMPRESSED_DXT1_RGB) glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + face, mipmapLevel, glInternalFormat, mipSize, mipSize, 0, glFormat, glType, (unsigned char *)dataPtr + face*dataSize); + else glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + face, mipmapLevel, glInternalFormat, mipSize, mipSize, 0, dataSize, (unsigned char *)dataPtr + face*dataSize); + } + +#if defined(GRAPHICS_API_OPENGL_33) + if (format == RL_PIXELFORMAT_UNCOMPRESSED_GRAYSCALE) + { + GLint swizzleMask[] = { GL_RED, GL_RED, GL_RED, GL_ONE }; + glTexParameteriv(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_SWIZZLE_RGBA, swizzleMask); + } + else if (format == RL_PIXELFORMAT_UNCOMPRESSED_GRAY_ALPHA) + { +#if defined(GRAPHICS_API_OPENGL_21) + GLint swizzleMask[] = { GL_RED, GL_RED, GL_RED, GL_ALPHA }; +#elif defined(GRAPHICS_API_OPENGL_33) + GLint swizzleMask[] = { GL_RED, GL_RED, GL_RED, GL_GREEN }; +#endif + glTexParameteriv(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_SWIZZLE_RGBA, swizzleMask); + } +#endif + if (face == 5) + { + mipSize /= 2; + if (data != NULL) dataPtr += dataSize*6; // Increment data pointer to next mipmap + + // Security check for NPOT textures + if (mipSize < 1) mipSize = 1; + + dataSize = rlGetPixelDataSize(mipSize, mipSize, format); + } + } + } + + // Set cubemap texture sampling parameters + if (mipmapCount > 1) glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); + else glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + + glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); +#if defined(GRAPHICS_API_OPENGL_33) + glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE); // Flag not supported on OpenGL ES 2.0 +#endif + + glBindTexture(GL_TEXTURE_CUBE_MAP, 0); +#endif + + if (id > 0) TRACELOG(RL_LOG_INFO, "TEXTURE: [ID %i] Cubemap texture loaded successfully (%ix%i)", id, size, size); + else TRACELOG(RL_LOG_WARNING, "TEXTURE: Failed to load cubemap texture"); + + return id; +} + +// Update already loaded texture in GPU with new data +// NOTE: We don't know safely if internal texture format is the expected one... +void rlUpdateTexture(unsigned int id, int offsetX, int offsetY, int width, int height, int format, const void *data) +{ + glBindTexture(GL_TEXTURE_2D, id); + + unsigned int glInternalFormat, glFormat, glType; + rlGetGlTextureFormats(format, &glInternalFormat, &glFormat, &glType); + + if ((glInternalFormat != 0) && (format < RL_PIXELFORMAT_COMPRESSED_DXT1_RGB)) + { + glTexSubImage2D(GL_TEXTURE_2D, 0, offsetX, offsetY, width, height, glFormat, glType, data); + } + else TRACELOG(RL_LOG_WARNING, "TEXTURE: [ID %i] Failed to update for current texture format (%i)", id, format); +} + +// Get OpenGL internal formats and data type from raylib PixelFormat +void rlGetGlTextureFormats(int format, unsigned int *glInternalFormat, unsigned int *glFormat, unsigned int *glType) +{ + *glInternalFormat = 0; + *glFormat = 0; + *glType = 0; + + switch (format) + { + #if defined(GRAPHICS_API_OPENGL_11) || defined(GRAPHICS_API_OPENGL_21) || defined(GRAPHICS_API_OPENGL_ES2) + // NOTE: on OpenGL ES 2.0 (WebGL), internalFormat must match format and options allowed are: GL_LUMINANCE, GL_RGB, GL_RGBA + case RL_PIXELFORMAT_UNCOMPRESSED_GRAYSCALE: *glInternalFormat = GL_LUMINANCE; *glFormat = GL_LUMINANCE; *glType = GL_UNSIGNED_BYTE; break; + case RL_PIXELFORMAT_UNCOMPRESSED_GRAY_ALPHA: *glInternalFormat = GL_LUMINANCE_ALPHA; *glFormat = GL_LUMINANCE_ALPHA; *glType = GL_UNSIGNED_BYTE; break; + case RL_PIXELFORMAT_UNCOMPRESSED_R5G6B5: *glInternalFormat = GL_RGB; *glFormat = GL_RGB; *glType = GL_UNSIGNED_SHORT_5_6_5; break; + case RL_PIXELFORMAT_UNCOMPRESSED_R8G8B8: *glInternalFormat = GL_RGB; *glFormat = GL_RGB; *glType = GL_UNSIGNED_BYTE; break; + case RL_PIXELFORMAT_UNCOMPRESSED_R5G5B5A1: *glInternalFormat = GL_RGBA; *glFormat = GL_RGBA; *glType = GL_UNSIGNED_SHORT_5_5_5_1; break; + case RL_PIXELFORMAT_UNCOMPRESSED_R4G4B4A4: *glInternalFormat = GL_RGBA; *glFormat = GL_RGBA; *glType = GL_UNSIGNED_SHORT_4_4_4_4; break; + case RL_PIXELFORMAT_UNCOMPRESSED_R8G8B8A8: *glInternalFormat = GL_RGBA; *glFormat = GL_RGBA; *glType = GL_UNSIGNED_BYTE; break; + #if !defined(GRAPHICS_API_OPENGL_11) + #if defined(GRAPHICS_API_OPENGL_ES3) + case RL_PIXELFORMAT_UNCOMPRESSED_R32: if (RLGL.ExtSupported.texFloat32) *glInternalFormat = GL_R32F_EXT; *glFormat = GL_RED_EXT; *glType = GL_FLOAT; break; + case RL_PIXELFORMAT_UNCOMPRESSED_R32G32B32: if (RLGL.ExtSupported.texFloat32) *glInternalFormat = GL_RGB32F_EXT; *glFormat = GL_RGB; *glType = GL_FLOAT; break; + case RL_PIXELFORMAT_UNCOMPRESSED_R32G32B32A32: if (RLGL.ExtSupported.texFloat32) *glInternalFormat = GL_RGBA32F_EXT; *glFormat = GL_RGBA; *glType = GL_FLOAT; break; + case RL_PIXELFORMAT_UNCOMPRESSED_R16: if (RLGL.ExtSupported.texFloat16) *glInternalFormat = GL_R16F_EXT; *glFormat = GL_RED_EXT; *glType = GL_HALF_FLOAT; break; + case RL_PIXELFORMAT_UNCOMPRESSED_R16G16B16: if (RLGL.ExtSupported.texFloat16) *glInternalFormat = GL_RGB16F_EXT; *glFormat = GL_RGB; *glType = GL_HALF_FLOAT; break; + case RL_PIXELFORMAT_UNCOMPRESSED_R16G16B16A16: if (RLGL.ExtSupported.texFloat16) *glInternalFormat = GL_RGBA16F_EXT; *glFormat = GL_RGBA; *glType = GL_HALF_FLOAT; break; + #else + case RL_PIXELFORMAT_UNCOMPRESSED_R32: if (RLGL.ExtSupported.texFloat32) *glInternalFormat = GL_LUMINANCE; *glFormat = GL_LUMINANCE; *glType = GL_FLOAT; break; // NOTE: Requires extension OES_texture_float + case RL_PIXELFORMAT_UNCOMPRESSED_R32G32B32: if (RLGL.ExtSupported.texFloat32) *glInternalFormat = GL_RGB; *glFormat = GL_RGB; *glType = GL_FLOAT; break; // NOTE: Requires extension OES_texture_float + case RL_PIXELFORMAT_UNCOMPRESSED_R32G32B32A32: if (RLGL.ExtSupported.texFloat32) *glInternalFormat = GL_RGBA; *glFormat = GL_RGBA; *glType = GL_FLOAT; break; // NOTE: Requires extension OES_texture_float + #if defined(GRAPHICS_API_OPENGL_21) + case RL_PIXELFORMAT_UNCOMPRESSED_R16: if (RLGL.ExtSupported.texFloat16) *glInternalFormat = GL_LUMINANCE; *glFormat = GL_LUMINANCE; *glType = GL_HALF_FLOAT_ARB; break; + case RL_PIXELFORMAT_UNCOMPRESSED_R16G16B16: if (RLGL.ExtSupported.texFloat16) *glInternalFormat = GL_RGB; *glFormat = GL_RGB; *glType = GL_HALF_FLOAT_ARB; break; + case RL_PIXELFORMAT_UNCOMPRESSED_R16G16B16A16: if (RLGL.ExtSupported.texFloat16) *glInternalFormat = GL_RGBA; *glFormat = GL_RGBA; *glType = GL_HALF_FLOAT_ARB; break; + #else // defined(GRAPHICS_API_OPENGL_ES2) + case RL_PIXELFORMAT_UNCOMPRESSED_R16: if (RLGL.ExtSupported.texFloat16) *glInternalFormat = GL_LUMINANCE; *glFormat = GL_LUMINANCE; *glType = GL_HALF_FLOAT_OES; break; // NOTE: Requires extension OES_texture_half_float + case RL_PIXELFORMAT_UNCOMPRESSED_R16G16B16: if (RLGL.ExtSupported.texFloat16) *glInternalFormat = GL_RGB; *glFormat = GL_RGB; *glType = GL_HALF_FLOAT_OES; break; // NOTE: Requires extension OES_texture_half_float + case RL_PIXELFORMAT_UNCOMPRESSED_R16G16B16A16: if (RLGL.ExtSupported.texFloat16) *glInternalFormat = GL_RGBA; *glFormat = GL_RGBA; *glType = GL_HALF_FLOAT_OES; break; // NOTE: Requires extension OES_texture_half_float + #endif + #endif + #endif + #elif defined(GRAPHICS_API_OPENGL_33) + case RL_PIXELFORMAT_UNCOMPRESSED_GRAYSCALE: *glInternalFormat = GL_R8; *glFormat = GL_RED; *glType = GL_UNSIGNED_BYTE; break; + case RL_PIXELFORMAT_UNCOMPRESSED_GRAY_ALPHA: *glInternalFormat = GL_RG8; *glFormat = GL_RG; *glType = GL_UNSIGNED_BYTE; break; + case RL_PIXELFORMAT_UNCOMPRESSED_R5G6B5: *glInternalFormat = GL_RGB565; *glFormat = GL_RGB; *glType = GL_UNSIGNED_SHORT_5_6_5; break; + case RL_PIXELFORMAT_UNCOMPRESSED_R8G8B8: *glInternalFormat = GL_RGB8; *glFormat = GL_RGB; *glType = GL_UNSIGNED_BYTE; break; + case RL_PIXELFORMAT_UNCOMPRESSED_R5G5B5A1: *glInternalFormat = GL_RGB5_A1; *glFormat = GL_RGBA; *glType = GL_UNSIGNED_SHORT_5_5_5_1; break; + case RL_PIXELFORMAT_UNCOMPRESSED_R4G4B4A4: *glInternalFormat = GL_RGBA4; *glFormat = GL_RGBA; *glType = GL_UNSIGNED_SHORT_4_4_4_4; break; + case RL_PIXELFORMAT_UNCOMPRESSED_R8G8B8A8: *glInternalFormat = GL_RGBA8; *glFormat = GL_RGBA; *glType = GL_UNSIGNED_BYTE; break; + case RL_PIXELFORMAT_UNCOMPRESSED_R32: if (RLGL.ExtSupported.texFloat32) *glInternalFormat = GL_R32F; *glFormat = GL_RED; *glType = GL_FLOAT; break; + case RL_PIXELFORMAT_UNCOMPRESSED_R32G32B32: if (RLGL.ExtSupported.texFloat32) *glInternalFormat = GL_RGB32F; *glFormat = GL_RGB; *glType = GL_FLOAT; break; + case RL_PIXELFORMAT_UNCOMPRESSED_R32G32B32A32: if (RLGL.ExtSupported.texFloat32) *glInternalFormat = GL_RGBA32F; *glFormat = GL_RGBA; *glType = GL_FLOAT; break; + case RL_PIXELFORMAT_UNCOMPRESSED_R16: if (RLGL.ExtSupported.texFloat16) *glInternalFormat = GL_R16F; *glFormat = GL_RED; *glType = GL_HALF_FLOAT; break; + case RL_PIXELFORMAT_UNCOMPRESSED_R16G16B16: if (RLGL.ExtSupported.texFloat16) *glInternalFormat = GL_RGB16F; *glFormat = GL_RGB; *glType = GL_HALF_FLOAT; break; + case RL_PIXELFORMAT_UNCOMPRESSED_R16G16B16A16: if (RLGL.ExtSupported.texFloat16) *glInternalFormat = GL_RGBA16F; *glFormat = GL_RGBA; *glType = GL_HALF_FLOAT; break; + #endif + #if !defined(GRAPHICS_API_OPENGL_11) + case RL_PIXELFORMAT_COMPRESSED_DXT1_RGB: if (RLGL.ExtSupported.texCompDXT) *glInternalFormat = GL_COMPRESSED_RGB_S3TC_DXT1_EXT; break; + case RL_PIXELFORMAT_COMPRESSED_DXT1_RGBA: if (RLGL.ExtSupported.texCompDXT) *glInternalFormat = GL_COMPRESSED_RGBA_S3TC_DXT1_EXT; break; + case RL_PIXELFORMAT_COMPRESSED_DXT3_RGBA: if (RLGL.ExtSupported.texCompDXT) *glInternalFormat = GL_COMPRESSED_RGBA_S3TC_DXT3_EXT; break; + case RL_PIXELFORMAT_COMPRESSED_DXT5_RGBA: if (RLGL.ExtSupported.texCompDXT) *glInternalFormat = GL_COMPRESSED_RGBA_S3TC_DXT5_EXT; break; + case RL_PIXELFORMAT_COMPRESSED_ETC1_RGB: if (RLGL.ExtSupported.texCompETC1) *glInternalFormat = GL_ETC1_RGB8_OES; break; // NOTE: Requires OpenGL ES 2.0 or OpenGL 4.3 + case RL_PIXELFORMAT_COMPRESSED_ETC2_RGB: if (RLGL.ExtSupported.texCompETC2) *glInternalFormat = GL_COMPRESSED_RGB8_ETC2; break; // NOTE: Requires OpenGL ES 3.0 or OpenGL 4.3 + case RL_PIXELFORMAT_COMPRESSED_ETC2_EAC_RGBA: if (RLGL.ExtSupported.texCompETC2) *glInternalFormat = GL_COMPRESSED_RGBA8_ETC2_EAC; break; // NOTE: Requires OpenGL ES 3.0 or OpenGL 4.3 + case RL_PIXELFORMAT_COMPRESSED_PVRT_RGB: if (RLGL.ExtSupported.texCompPVRT) *glInternalFormat = GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG; break; // NOTE: Requires PowerVR GPU + case RL_PIXELFORMAT_COMPRESSED_PVRT_RGBA: if (RLGL.ExtSupported.texCompPVRT) *glInternalFormat = GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG; break; // NOTE: Requires PowerVR GPU + case RL_PIXELFORMAT_COMPRESSED_ASTC_4x4_RGBA: if (RLGL.ExtSupported.texCompASTC) *glInternalFormat = GL_COMPRESSED_RGBA_ASTC_4x4_KHR; break; // NOTE: Requires OpenGL ES 3.1 or OpenGL 4.3 + case RL_PIXELFORMAT_COMPRESSED_ASTC_8x8_RGBA: if (RLGL.ExtSupported.texCompASTC) *glInternalFormat = GL_COMPRESSED_RGBA_ASTC_8x8_KHR; break; // NOTE: Requires OpenGL ES 3.1 or OpenGL 4.3 + #endif + default: TRACELOG(RL_LOG_WARNING, "TEXTURE: Current format not supported (%i)", format); break; + } +} + +// Unload texture from GPU memory +void rlUnloadTexture(unsigned int id) +{ + glDeleteTextures(1, &id); +} + +// Generate mipmap data for selected texture +// NOTE: Only supports GPU mipmap generation +void rlGenTextureMipmaps(unsigned int id, int width, int height, int format, int *mipmaps) +{ +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + glBindTexture(GL_TEXTURE_2D, id); + + // Check if texture is power-of-two (POT) + bool texIsPOT = false; + + if (((width > 0) && ((width & (width - 1)) == 0)) && + ((height > 0) && ((height & (height - 1)) == 0))) texIsPOT = true; + + if ((texIsPOT) || (RLGL.ExtSupported.texNPOT)) + { + //glHint(GL_GENERATE_MIPMAP_HINT, GL_DONT_CARE); // Hint for mipmaps generation algorithm: GL_FASTEST, GL_NICEST, GL_DONT_CARE + glGenerateMipmap(GL_TEXTURE_2D); // Generate mipmaps automatically + + #define MIN(a,b) (((a)<(b))? (a):(b)) + #define MAX(a,b) (((a)>(b))? (a):(b)) + + *mipmaps = 1 + (int)floor(log(MAX(width, height))/log(2)); + TRACELOG(RL_LOG_INFO, "TEXTURE: [ID %i] Mipmaps generated automatically, total: %i", id, *mipmaps); + } + else TRACELOG(RL_LOG_WARNING, "TEXTURE: [ID %i] Failed to generate mipmaps", id); + + glBindTexture(GL_TEXTURE_2D, 0); +#else + TRACELOG(RL_LOG_WARNING, "TEXTURE: [ID %i] GPU mipmap generation not supported", id); +#endif +} + +// Read texture pixel data +void *rlReadTexturePixels(unsigned int id, int width, int height, int format) +{ + void *pixels = NULL; + +#if defined(GRAPHICS_API_OPENGL_11) || defined(GRAPHICS_API_OPENGL_33) + glBindTexture(GL_TEXTURE_2D, id); + + // NOTE: Using texture id, we can retrieve some texture info (but not on OpenGL ES 2.0) + // Possible texture info: GL_TEXTURE_RED_SIZE, GL_TEXTURE_GREEN_SIZE, GL_TEXTURE_BLUE_SIZE, GL_TEXTURE_ALPHA_SIZE + //int width, height, format; + //glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_WIDTH, &width); + //glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_HEIGHT, &height); + //glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_INTERNAL_FORMAT, &format); + + // NOTE: Each row written to or read from by OpenGL pixel operations like glGetTexImage are aligned to a 4 byte boundary by default, which may add some padding + // Use glPixelStorei to modify padding with the GL_[UN]PACK_ALIGNMENT setting + // GL_PACK_ALIGNMENT affects operations that read from OpenGL memory (glReadPixels, glGetTexImage, etc.) + // GL_UNPACK_ALIGNMENT affects operations that write to OpenGL memory (glTexImage, etc.) + glPixelStorei(GL_PACK_ALIGNMENT, 1); + + unsigned int glInternalFormat, glFormat, glType; + rlGetGlTextureFormats(format, &glInternalFormat, &glFormat, &glType); + unsigned int size = rlGetPixelDataSize(width, height, format); + + if ((glInternalFormat != 0) && (format < RL_PIXELFORMAT_COMPRESSED_DXT1_RGB)) + { + pixels = RL_MALLOC(size); + glGetTexImage(GL_TEXTURE_2D, 0, glFormat, glType, pixels); + } + else TRACELOG(RL_LOG_WARNING, "TEXTURE: [ID %i] Data retrieval not suported for pixel format (%i)", id, format); + + glBindTexture(GL_TEXTURE_2D, 0); +#endif + +#if defined(GRAPHICS_API_OPENGL_ES2) + // glGetTexImage() is not available on OpenGL ES 2.0 + // Texture width and height are required on OpenGL ES 2.0, there is no way to get it from texture id + // Two possible Options: + // 1 - Bind texture to color fbo attachment and glReadPixels() + // 2 - Create an fbo, activate it, render quad with texture, glReadPixels() + // We are using Option 1, just need to care for texture format on retrieval + // NOTE: This behaviour could be conditioned by graphic driver... + unsigned int fboId = rlLoadFramebuffer(); + + glBindFramebuffer(GL_FRAMEBUFFER, fboId); + glBindTexture(GL_TEXTURE_2D, 0); + + // Attach our texture to FBO + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, id, 0); + + // We read data as RGBA because FBO texture is configured as RGBA, despite binding another texture format + pixels = (unsigned char *)RL_MALLOC(rlGetPixelDataSize(width, height, RL_PIXELFORMAT_UNCOMPRESSED_R8G8B8A8)); + glReadPixels(0, 0, width, height, GL_RGBA, GL_UNSIGNED_BYTE, pixels); + + glBindFramebuffer(GL_FRAMEBUFFER, 0); + + // Clean up temporal fbo + rlUnloadFramebuffer(fboId); +#endif + + return pixels; +} + +// Read screen pixel data (color buffer) +unsigned char *rlReadScreenPixels(int width, int height) +{ + unsigned char *screenData = (unsigned char *)RL_CALLOC(width*height*4, sizeof(unsigned char)); + + // NOTE 1: glReadPixels returns image flipped vertically -> (0,0) is the bottom left corner of the framebuffer + // NOTE 2: We are getting alpha channel! Be careful, it can be transparent if not cleared properly! + glReadPixels(0, 0, width, height, GL_RGBA, GL_UNSIGNED_BYTE, screenData); + + // Flip image vertically! + unsigned char *imgData = (unsigned char *)RL_MALLOC(width*height*4*sizeof(unsigned char)); + + for (int y = height - 1; y >= 0; y--) + { + for (int x = 0; x < (width*4); x++) + { + imgData[((height - 1) - y)*width*4 + x] = screenData[(y*width*4) + x]; // Flip line + + // Set alpha component value to 255 (no trasparent image retrieval) + // NOTE: Alpha value has already been applied to RGB in framebuffer, we don't need it! + if (((x + 1)%4) == 0) imgData[((height - 1) - y)*width*4 + x] = 255; + } + } + + RL_FREE(screenData); + + return imgData; // NOTE: image data should be freed +} + +// Framebuffer management (fbo) +//----------------------------------------------------------------------------------------- +// Load a framebuffer to be used for rendering +// NOTE: No textures attached +unsigned int rlLoadFramebuffer(void) +{ + unsigned int fboId = 0; + +#if (defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)) && defined(RLGL_RENDER_TEXTURES_HINT) + glGenFramebuffers(1, &fboId); // Create the framebuffer object + glBindFramebuffer(GL_FRAMEBUFFER, 0); // Unbind any framebuffer +#endif + + return fboId; +} + +// Attach color buffer texture to an fbo (unloads previous attachment) +// NOTE: Attach type: 0-Color, 1-Depth renderbuffer, 2-Depth texture +void rlFramebufferAttach(unsigned int fboId, unsigned int texId, int attachType, int texType, int mipLevel) +{ +#if (defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)) && defined(RLGL_RENDER_TEXTURES_HINT) + glBindFramebuffer(GL_FRAMEBUFFER, fboId); + + switch (attachType) + { + case RL_ATTACHMENT_COLOR_CHANNEL0: + case RL_ATTACHMENT_COLOR_CHANNEL1: + case RL_ATTACHMENT_COLOR_CHANNEL2: + case RL_ATTACHMENT_COLOR_CHANNEL3: + case RL_ATTACHMENT_COLOR_CHANNEL4: + case RL_ATTACHMENT_COLOR_CHANNEL5: + case RL_ATTACHMENT_COLOR_CHANNEL6: + case RL_ATTACHMENT_COLOR_CHANNEL7: + { + if (texType == RL_ATTACHMENT_TEXTURE2D) glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + attachType, GL_TEXTURE_2D, texId, mipLevel); + else if (texType == RL_ATTACHMENT_RENDERBUFFER) glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + attachType, GL_RENDERBUFFER, texId); + else if (texType >= RL_ATTACHMENT_CUBEMAP_POSITIVE_X) glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + attachType, GL_TEXTURE_CUBE_MAP_POSITIVE_X + texType, texId, mipLevel); + + } break; + case RL_ATTACHMENT_DEPTH: + { + if (texType == RL_ATTACHMENT_TEXTURE2D) glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, texId, mipLevel); + else if (texType == RL_ATTACHMENT_RENDERBUFFER) glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, texId); + + } break; + case RL_ATTACHMENT_STENCIL: + { + if (texType == RL_ATTACHMENT_TEXTURE2D) glFramebufferTexture2D(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_TEXTURE_2D, texId, mipLevel); + else if (texType == RL_ATTACHMENT_RENDERBUFFER) glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, texId); + + } break; + default: break; + } + + glBindFramebuffer(GL_FRAMEBUFFER, 0); +#endif +} + +// Verify render texture is complete +bool rlFramebufferComplete(unsigned int id) +{ + bool result = false; + +#if (defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)) && defined(RLGL_RENDER_TEXTURES_HINT) + glBindFramebuffer(GL_FRAMEBUFFER, id); + + GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER); + + if (status != GL_FRAMEBUFFER_COMPLETE) + { + switch (status) + { + case GL_FRAMEBUFFER_UNSUPPORTED: TRACELOG(RL_LOG_WARNING, "FBO: [ID %i] Framebuffer is unsupported", id); break; + case GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT: TRACELOG(RL_LOG_WARNING, "FBO: [ID %i] Framebuffer has incomplete attachment", id); break; +#if defined(GRAPHICS_API_OPENGL_ES2) + case GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS: TRACELOG(RL_LOG_WARNING, "FBO: [ID %i] Framebuffer has incomplete dimensions", id); break; +#endif + case GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT: TRACELOG(RL_LOG_WARNING, "FBO: [ID %i] Framebuffer has a missing attachment", id); break; + default: break; + } + } + + glBindFramebuffer(GL_FRAMEBUFFER, 0); + + result = (status == GL_FRAMEBUFFER_COMPLETE); +#endif + + return result; +} + +// Unload framebuffer from GPU memory +// NOTE: All attached textures/cubemaps/renderbuffers are also deleted +void rlUnloadFramebuffer(unsigned int id) +{ +#if (defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)) && defined(RLGL_RENDER_TEXTURES_HINT) + // Query depth attachment to automatically delete texture/renderbuffer + int depthType = 0, depthId = 0; + glBindFramebuffer(GL_FRAMEBUFFER, id); // Bind framebuffer to query depth texture type + glGetFramebufferAttachmentParameteriv(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE, &depthType); + + // TODO: Review warning retrieving object name in WebGL + // WARNING: WebGL: INVALID_ENUM: getFramebufferAttachmentParameter: invalid parameter name + // https://registry.khronos.org/webgl/specs/latest/1.0/ + glGetFramebufferAttachmentParameteriv(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME, &depthId); + + unsigned int depthIdU = (unsigned int)depthId; + if (depthType == GL_RENDERBUFFER) glDeleteRenderbuffers(1, &depthIdU); + else if (depthType == GL_TEXTURE) glDeleteTextures(1, &depthIdU); + + // NOTE: If a texture object is deleted while its image is attached to the *currently bound* framebuffer, + // the texture image is automatically detached from the currently bound framebuffer + + glBindFramebuffer(GL_FRAMEBUFFER, 0); + glDeleteFramebuffers(1, &id); + + TRACELOG(RL_LOG_INFO, "FBO: [ID %i] Unloaded framebuffer from VRAM (GPU)", id); +#endif +} + +// Vertex data management +//----------------------------------------------------------------------------------------- +// Load a new attributes buffer +unsigned int rlLoadVertexBuffer(const void *buffer, int size, bool dynamic) +{ + unsigned int id = 0; + +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + glGenBuffers(1, &id); + glBindBuffer(GL_ARRAY_BUFFER, id); + glBufferData(GL_ARRAY_BUFFER, size, buffer, dynamic? GL_DYNAMIC_DRAW : GL_STATIC_DRAW); +#endif + + return id; +} + +// Load a new attributes element buffer +unsigned int rlLoadVertexBufferElement(const void *buffer, int size, bool dynamic) +{ + unsigned int id = 0; + +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + glGenBuffers(1, &id); + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, id); + glBufferData(GL_ELEMENT_ARRAY_BUFFER, size, buffer, dynamic? GL_DYNAMIC_DRAW : GL_STATIC_DRAW); +#endif + + return id; +} + +// Enable vertex buffer (VBO) +void rlEnableVertexBuffer(unsigned int id) +{ +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + glBindBuffer(GL_ARRAY_BUFFER, id); +#endif +} + +// Disable vertex buffer (VBO) +void rlDisableVertexBuffer(void) +{ +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + glBindBuffer(GL_ARRAY_BUFFER, 0); +#endif +} + +// Enable vertex buffer element (VBO element) +void rlEnableVertexBufferElement(unsigned int id) +{ +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, id); +#endif +} + +// Disable vertex buffer element (VBO element) +void rlDisableVertexBufferElement(void) +{ +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); +#endif +} + +// Update vertex buffer with new data +// NOTE: dataSize and offset must be provided in bytes +void rlUpdateVertexBuffer(unsigned int id, const void *data, int dataSize, int offset) +{ +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + glBindBuffer(GL_ARRAY_BUFFER, id); + glBufferSubData(GL_ARRAY_BUFFER, offset, dataSize, data); +#endif +} + +// Update vertex buffer elements with new data +// NOTE: dataSize and offset must be provided in bytes +void rlUpdateVertexBufferElements(unsigned int id, const void *data, int dataSize, int offset) +{ +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, id); + glBufferSubData(GL_ELEMENT_ARRAY_BUFFER, offset, dataSize, data); +#endif +} + +// Enable vertex array object (VAO) +bool rlEnableVertexArray(unsigned int vaoId) +{ + bool result = false; +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + if (RLGL.ExtSupported.vao) + { + glBindVertexArray(vaoId); + result = true; + } +#endif + return result; +} + +// Disable vertex array object (VAO) +void rlDisableVertexArray(void) +{ +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + if (RLGL.ExtSupported.vao) glBindVertexArray(0); +#endif +} + +// Enable vertex attribute index +void rlEnableVertexAttribute(unsigned int index) +{ +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + glEnableVertexAttribArray(index); +#endif +} + +// Disable vertex attribute index +void rlDisableVertexAttribute(unsigned int index) +{ +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + glDisableVertexAttribArray(index); +#endif +} + +// Draw vertex array +void rlDrawVertexArray(int offset, int count) +{ + glDrawArrays(GL_TRIANGLES, offset, count); +} + +// Draw vertex array elements +void rlDrawVertexArrayElements(int offset, int count, const void *buffer) +{ + // NOTE: Added pointer math separately from function to avoid UBSAN complaining + unsigned short *bufferPtr = (unsigned short *)buffer; + if (offset > 0) bufferPtr += offset; + + glDrawElements(GL_TRIANGLES, count, GL_UNSIGNED_SHORT, (const unsigned short *)bufferPtr); +} + +// Draw vertex array instanced +void rlDrawVertexArrayInstanced(int offset, int count, int instances) +{ +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + glDrawArraysInstanced(GL_TRIANGLES, 0, count, instances); +#endif +} + +// Draw vertex array elements instanced +void rlDrawVertexArrayElementsInstanced(int offset, int count, const void *buffer, int instances) +{ +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + // NOTE: Added pointer math separately from function to avoid UBSAN complaining + unsigned short *bufferPtr = (unsigned short *)buffer; + if (offset > 0) bufferPtr += offset; + + glDrawElementsInstanced(GL_TRIANGLES, count, GL_UNSIGNED_SHORT, (const unsigned short *)bufferPtr, instances); +#endif +} + +#if defined(GRAPHICS_API_OPENGL_11) +// Enable vertex state pointer +void rlEnableStatePointer(int vertexAttribType, void *buffer) +{ + if (buffer != NULL) glEnableClientState(vertexAttribType); + switch (vertexAttribType) + { + case GL_VERTEX_ARRAY: glVertexPointer(3, GL_FLOAT, 0, buffer); break; + case GL_TEXTURE_COORD_ARRAY: glTexCoordPointer(2, GL_FLOAT, 0, buffer); break; + case GL_NORMAL_ARRAY: if (buffer != NULL) glNormalPointer(GL_FLOAT, 0, buffer); break; + case GL_COLOR_ARRAY: if (buffer != NULL) glColorPointer(4, GL_UNSIGNED_BYTE, 0, buffer); break; + //case GL_INDEX_ARRAY: if (buffer != NULL) glIndexPointer(GL_SHORT, 0, buffer); break; // Indexed colors + default: break; + } +} + +// Disable vertex state pointer +void rlDisableStatePointer(int vertexAttribType) +{ + glDisableClientState(vertexAttribType); +} +#endif + +// Load vertex array object (VAO) +unsigned int rlLoadVertexArray(void) +{ + unsigned int vaoId = 0; +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + if (RLGL.ExtSupported.vao) + { + glGenVertexArrays(1, &vaoId); + } +#endif + return vaoId; +} + +// Set vertex attribute +void rlSetVertexAttribute(unsigned int index, int compSize, int type, bool normalized, int stride, int offset) +{ +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + // NOTE: Data type could be: GL_BYTE, GL_UNSIGNED_BYTE, GL_SHORT, GL_UNSIGNED_SHORT, GL_INT, GL_UNSIGNED_INT + // Additional types (depends on OpenGL version or extensions): + // - GL_HALF_FLOAT, GL_FLOAT, GL_DOUBLE, GL_FIXED, + // - GL_INT_2_10_10_10_REV, GL_UNSIGNED_INT_2_10_10_10_REV, GL_UNSIGNED_INT_10F_11F_11F_REV + + size_t offsetNative = offset; + glVertexAttribPointer(index, compSize, type, normalized, stride, (void *)offsetNative); +#endif +} + +// Set vertex attribute divisor +void rlSetVertexAttributeDivisor(unsigned int index, int divisor) +{ +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + glVertexAttribDivisor(index, divisor); +#endif +} + +// Unload vertex array object (VAO) +void rlUnloadVertexArray(unsigned int vaoId) +{ +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + if (RLGL.ExtSupported.vao) + { + glBindVertexArray(0); + glDeleteVertexArrays(1, &vaoId); + TRACELOG(RL_LOG_INFO, "VAO: [ID %i] Unloaded vertex array data from VRAM (GPU)", vaoId); + } +#endif +} + +// Unload vertex buffer (VBO) +void rlUnloadVertexBuffer(unsigned int vboId) +{ +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + glDeleteBuffers(1, &vboId); + //TRACELOG(RL_LOG_INFO, "VBO: Unloaded vertex data from VRAM (GPU)"); +#endif +} + +// Shaders management +//----------------------------------------------------------------------------------------------- +// Load shader from code strings +// NOTE: If shader string is NULL, using default vertex/fragment shaders +unsigned int rlLoadShaderCode(const char *vsCode, const char *fsCode) +{ + unsigned int id = 0; + +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + unsigned int vertexShaderId = 0; + unsigned int fragmentShaderId = 0; + + // Compile vertex shader (if provided) + // NOTE: If not vertex shader is provided, use default one + if (vsCode != NULL) vertexShaderId = rlCompileShader(vsCode, GL_VERTEX_SHADER); + else vertexShaderId = RLGL.State.defaultVShaderId; + + // Compile fragment shader (if provided) + // NOTE: If not vertex shader is provided, use default one + if (fsCode != NULL) fragmentShaderId = rlCompileShader(fsCode, GL_FRAGMENT_SHADER); + else fragmentShaderId = RLGL.State.defaultFShaderId; + + // In case vertex and fragment shader are the default ones, no need to recompile, we can just assign the default shader program id + if ((vertexShaderId == RLGL.State.defaultVShaderId) && (fragmentShaderId == RLGL.State.defaultFShaderId)) id = RLGL.State.defaultShaderId; + else if ((vertexShaderId > 0) && (fragmentShaderId > 0)) + { + // One of or both shader are new, we need to compile a new shader program + id = rlLoadShaderProgram(vertexShaderId, fragmentShaderId); + + // We can detach and delete vertex/fragment shaders (if not default ones) + // NOTE: We detach shader before deletion to make sure memory is freed + if (vertexShaderId != RLGL.State.defaultVShaderId) + { + // WARNING: Shader program linkage could fail and returned id is 0 + if (id > 0) glDetachShader(id, vertexShaderId); + glDeleteShader(vertexShaderId); + } + if (fragmentShaderId != RLGL.State.defaultFShaderId) + { + // WARNING: Shader program linkage could fail and returned id is 0 + if (id > 0) glDetachShader(id, fragmentShaderId); + glDeleteShader(fragmentShaderId); + } + + // In case shader program loading failed, we assign default shader + if (id == 0) + { + // In case shader loading fails, we return the default shader + TRACELOG(RL_LOG_WARNING, "SHADER: Failed to load custom shader code, using default shader"); + id = RLGL.State.defaultShaderId; + } + /* + else + { + // Get available shader uniforms + // NOTE: This information is useful for debug... + int uniformCount = -1; + glGetProgramiv(id, GL_ACTIVE_UNIFORMS, &uniformCount); + + for (int i = 0; i < uniformCount; i++) + { + int namelen = -1; + int num = -1; + char name[256] = { 0 }; // Assume no variable names longer than 256 + GLenum type = GL_ZERO; + + // Get the name of the uniforms + glGetActiveUniform(id, i, sizeof(name) - 1, &namelen, &num, &type, name); + + name[namelen] = 0; + TRACELOGD("SHADER: [ID %i] Active uniform (%s) set at location: %i", id, name, glGetUniformLocation(id, name)); + } + } + */ + } +#endif + + return id; +} + +// Compile custom shader and return shader id +unsigned int rlCompileShader(const char *shaderCode, int type) +{ + unsigned int shader = 0; + +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + shader = glCreateShader(type); + glShaderSource(shader, 1, &shaderCode, NULL); + + GLint success = 0; + glCompileShader(shader); + glGetShaderiv(shader, GL_COMPILE_STATUS, &success); + + if (success == GL_FALSE) + { + switch (type) + { + case GL_VERTEX_SHADER: TRACELOG(RL_LOG_WARNING, "SHADER: [ID %i] Failed to compile vertex shader code", shader); break; + case GL_FRAGMENT_SHADER: TRACELOG(RL_LOG_WARNING, "SHADER: [ID %i] Failed to compile fragment shader code", shader); break; + //case GL_GEOMETRY_SHADER: + #if defined(GRAPHICS_API_OPENGL_43) + case GL_COMPUTE_SHADER: TRACELOG(RL_LOG_WARNING, "SHADER: [ID %i] Failed to compile compute shader code", shader); break; + #elif defined(GRAPHICS_API_OPENGL_33) + case GL_COMPUTE_SHADER: TRACELOG(RL_LOG_WARNING, "SHADER: Compute shaders not enabled. Define GRAPHICS_API_OPENGL_43", shader); break; + #endif + default: break; + } + + int maxLength = 0; + glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &maxLength); + + if (maxLength > 0) + { + int length = 0; + char *log = (char *)RL_CALLOC(maxLength, sizeof(char)); + glGetShaderInfoLog(shader, maxLength, &length, log); + TRACELOG(RL_LOG_WARNING, "SHADER: [ID %i] Compile error: %s", shader, log); + RL_FREE(log); + } + + shader = 0; + } + else + { + switch (type) + { + case GL_VERTEX_SHADER: TRACELOG(RL_LOG_INFO, "SHADER: [ID %i] Vertex shader compiled successfully", shader); break; + case GL_FRAGMENT_SHADER: TRACELOG(RL_LOG_INFO, "SHADER: [ID %i] Fragment shader compiled successfully", shader); break; + //case GL_GEOMETRY_SHADER: + #if defined(GRAPHICS_API_OPENGL_43) + case GL_COMPUTE_SHADER: TRACELOG(RL_LOG_INFO, "SHADER: [ID %i] Compute shader compiled successfully", shader); break; + #elif defined(GRAPHICS_API_OPENGL_33) + case GL_COMPUTE_SHADER: TRACELOG(RL_LOG_WARNING, "SHADER: Compute shaders not enabled. Define GRAPHICS_API_OPENGL_43", shader); break; + #endif + default: break; + } + } +#endif + + return shader; +} + +// Load custom shader strings and return program id +unsigned int rlLoadShaderProgram(unsigned int vShaderId, unsigned int fShaderId) +{ + unsigned int program = 0; + +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + GLint success = 0; + program = glCreateProgram(); + + glAttachShader(program, vShaderId); + glAttachShader(program, fShaderId); + + // NOTE: Default attribute shader locations must be Bound before linking + glBindAttribLocation(program, RL_DEFAULT_SHADER_ATTRIB_LOCATION_POSITION, RL_DEFAULT_SHADER_ATTRIB_NAME_POSITION); + glBindAttribLocation(program, RL_DEFAULT_SHADER_ATTRIB_LOCATION_TEXCOORD, RL_DEFAULT_SHADER_ATTRIB_NAME_TEXCOORD); + glBindAttribLocation(program, RL_DEFAULT_SHADER_ATTRIB_LOCATION_NORMAL, RL_DEFAULT_SHADER_ATTRIB_NAME_NORMAL); + glBindAttribLocation(program, RL_DEFAULT_SHADER_ATTRIB_LOCATION_COLOR, RL_DEFAULT_SHADER_ATTRIB_NAME_COLOR); + glBindAttribLocation(program, RL_DEFAULT_SHADER_ATTRIB_LOCATION_TANGENT, RL_DEFAULT_SHADER_ATTRIB_NAME_TANGENT); + glBindAttribLocation(program, RL_DEFAULT_SHADER_ATTRIB_LOCATION_TEXCOORD2, RL_DEFAULT_SHADER_ATTRIB_NAME_TEXCOORD2); + +#ifdef RL_SUPPORT_MESH_GPU_SKINNING + glBindAttribLocation(program, RL_DEFAULT_SHADER_ATTRIB_LOCATION_BONEIDS, RL_DEFAULT_SHADER_ATTRIB_NAME_BONEIDS); + glBindAttribLocation(program, RL_DEFAULT_SHADER_ATTRIB_LOCATION_BONEWEIGHTS, RL_DEFAULT_SHADER_ATTRIB_NAME_BONEWEIGHTS); +#endif + + // NOTE: If some attrib name is no found on the shader, it locations becomes -1 + + glLinkProgram(program); + + // NOTE: All uniform variables are intitialised to 0 when a program links + + glGetProgramiv(program, GL_LINK_STATUS, &success); + + if (success == GL_FALSE) + { + TRACELOG(RL_LOG_WARNING, "SHADER: [ID %i] Failed to link shader program", program); + + int maxLength = 0; + glGetProgramiv(program, GL_INFO_LOG_LENGTH, &maxLength); + + if (maxLength > 0) + { + int length = 0; + char *log = (char *)RL_CALLOC(maxLength, sizeof(char)); + glGetProgramInfoLog(program, maxLength, &length, log); + TRACELOG(RL_LOG_WARNING, "SHADER: [ID %i] Link error: %s", program, log); + RL_FREE(log); + } + + glDeleteProgram(program); + + program = 0; + } + else + { + // Get the size of compiled shader program (not available on OpenGL ES 2.0) + // NOTE: If GL_LINK_STATUS is GL_FALSE, program binary length is zero + //GLint binarySize = 0; + //glGetProgramiv(id, GL_PROGRAM_BINARY_LENGTH, &binarySize); + + TRACELOG(RL_LOG_INFO, "SHADER: [ID %i] Program shader loaded successfully", program); + } +#endif + return program; +} + +// Unload shader program +void rlUnloadShaderProgram(unsigned int id) +{ +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + glDeleteProgram(id); + + TRACELOG(RL_LOG_INFO, "SHADER: [ID %i] Unloaded shader program data from VRAM (GPU)", id); +#endif +} + +// Get shader location uniform +int rlGetLocationUniform(unsigned int shaderId, const char *uniformName) +{ + int location = -1; +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + location = glGetUniformLocation(shaderId, uniformName); + + //if (location == -1) TRACELOG(RL_LOG_WARNING, "SHADER: [ID %i] Failed to find shader uniform: %s", shaderId, uniformName); + //else TRACELOG(RL_LOG_INFO, "SHADER: [ID %i] Shader uniform (%s) set at location: %i", shaderId, uniformName, location); +#endif + return location; +} + +// Get shader location attribute +int rlGetLocationAttrib(unsigned int shaderId, const char *attribName) +{ + int location = -1; +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + location = glGetAttribLocation(shaderId, attribName); + + //if (location == -1) TRACELOG(RL_LOG_WARNING, "SHADER: [ID %i] Failed to find shader attribute: %s", shaderId, attribName); + //else TRACELOG(RL_LOG_INFO, "SHADER: [ID %i] Shader attribute (%s) set at location: %i", shaderId, attribName, location); +#endif + return location; +} + +// Set shader value uniform +void rlSetUniform(int locIndex, const void *value, int uniformType, int count) +{ +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + switch (uniformType) + { + case RL_SHADER_UNIFORM_FLOAT: glUniform1fv(locIndex, count, (float *)value); break; + case RL_SHADER_UNIFORM_VEC2: glUniform2fv(locIndex, count, (float *)value); break; + case RL_SHADER_UNIFORM_VEC3: glUniform3fv(locIndex, count, (float *)value); break; + case RL_SHADER_UNIFORM_VEC4: glUniform4fv(locIndex, count, (float *)value); break; + case RL_SHADER_UNIFORM_INT: glUniform1iv(locIndex, count, (int *)value); break; + case RL_SHADER_UNIFORM_IVEC2: glUniform2iv(locIndex, count, (int *)value); break; + case RL_SHADER_UNIFORM_IVEC3: glUniform3iv(locIndex, count, (int *)value); break; + case RL_SHADER_UNIFORM_IVEC4: glUniform4iv(locIndex, count, (int *)value); break; + #if !defined(GRAPHICS_API_OPENGL_ES2) + case RL_SHADER_UNIFORM_UINT: glUniform1uiv(locIndex, count, (unsigned int *)value); break; + case RL_SHADER_UNIFORM_UIVEC2: glUniform2uiv(locIndex, count, (unsigned int *)value); break; + case RL_SHADER_UNIFORM_UIVEC3: glUniform3uiv(locIndex, count, (unsigned int *)value); break; + case RL_SHADER_UNIFORM_UIVEC4: glUniform4uiv(locIndex, count, (unsigned int *)value); break; + #endif + case RL_SHADER_UNIFORM_SAMPLER2D: glUniform1iv(locIndex, count, (int *)value); break; + default: TRACELOG(RL_LOG_WARNING, "SHADER: Failed to set uniform value, data type not recognized"); + + // TODO: Support glUniform1uiv(), glUniform2uiv(), glUniform3uiv(), glUniform4uiv() + } +#endif +} + +// Set shader value attribute +void rlSetVertexAttributeDefault(int locIndex, const void *value, int attribType, int count) +{ +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + switch (attribType) + { + case RL_SHADER_ATTRIB_FLOAT: if (count == 1) glVertexAttrib1fv(locIndex, (float *)value); break; + case RL_SHADER_ATTRIB_VEC2: if (count == 2) glVertexAttrib2fv(locIndex, (float *)value); break; + case RL_SHADER_ATTRIB_VEC3: if (count == 3) glVertexAttrib3fv(locIndex, (float *)value); break; + case RL_SHADER_ATTRIB_VEC4: if (count == 4) glVertexAttrib4fv(locIndex, (float *)value); break; + default: TRACELOG(RL_LOG_WARNING, "SHADER: Failed to set attrib default value, data type not recognized"); + } +#endif +} + +// Set shader value uniform matrix +void rlSetUniformMatrix(int locIndex, Matrix mat) +{ +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + float matfloat[16] = { + mat.m0, mat.m1, mat.m2, mat.m3, + mat.m4, mat.m5, mat.m6, mat.m7, + mat.m8, mat.m9, mat.m10, mat.m11, + mat.m12, mat.m13, mat.m14, mat.m15 + }; + glUniformMatrix4fv(locIndex, 1, false, matfloat); +#endif +} + +// Set shader value uniform matrix +void rlSetUniformMatrices(int locIndex, const Matrix *matrices, int count) +{ +#if defined(GRAPHICS_API_OPENGL_33) + glUniformMatrix4fv(locIndex, count, true, (const float *)matrices); +#elif defined(GRAPHICS_API_OPENGL_ES2) + // WARNING: WebGL does not support Matrix transpose ("true" parameter) + // REF: https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/uniformMatrix + glUniformMatrix4fv(locIndex, count, false, (const float *)matrices); +#endif +} + +// Set shader value uniform sampler +void rlSetUniformSampler(int locIndex, unsigned int textureId) +{ +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + // Check if texture is already active + for (int i = 0; i < RL_DEFAULT_BATCH_MAX_TEXTURE_UNITS; i++) + { + if (RLGL.State.activeTextureId[i] == textureId) + { + glUniform1i(locIndex, 1 + i); + return; + } + } + + // Register a new active texture for the internal batch system + // NOTE: Default texture is always activated as GL_TEXTURE0 + for (int i = 0; i < RL_DEFAULT_BATCH_MAX_TEXTURE_UNITS; i++) + { + if (RLGL.State.activeTextureId[i] == 0) + { + glUniform1i(locIndex, 1 + i); // Activate new texture unit + RLGL.State.activeTextureId[i] = textureId; // Save texture id for binding on drawing + break; + } + } +#endif +} + +// Set shader currently active (id and locations) +void rlSetShader(unsigned int id, int *locs) +{ +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + if (RLGL.State.currentShaderId != id) + { + rlDrawRenderBatch(RLGL.currentBatch); + RLGL.State.currentShaderId = id; + RLGL.State.currentShaderLocs = locs; + } +#endif +} + +// Load compute shader program +unsigned int rlLoadComputeShaderProgram(unsigned int shaderId) +{ + unsigned int program = 0; + +#if defined(GRAPHICS_API_OPENGL_43) + GLint success = 0; + program = glCreateProgram(); + glAttachShader(program, shaderId); + glLinkProgram(program); + + // NOTE: All uniform variables are intitialised to 0 when a program links + + glGetProgramiv(program, GL_LINK_STATUS, &success); + + if (success == GL_FALSE) + { + TRACELOG(RL_LOG_WARNING, "SHADER: [ID %i] Failed to link compute shader program", program); + + int maxLength = 0; + glGetProgramiv(program, GL_INFO_LOG_LENGTH, &maxLength); + + if (maxLength > 0) + { + int length = 0; + char *log = (char *)RL_CALLOC(maxLength, sizeof(char)); + glGetProgramInfoLog(program, maxLength, &length, log); + TRACELOG(RL_LOG_WARNING, "SHADER: [ID %i] Link error: %s", program, log); + RL_FREE(log); + } + + glDeleteProgram(program); + + program = 0; + } + else + { + // Get the size of compiled shader program (not available on OpenGL ES 2.0) + // NOTE: If GL_LINK_STATUS is GL_FALSE, program binary length is zero + //GLint binarySize = 0; + //glGetProgramiv(id, GL_PROGRAM_BINARY_LENGTH, &binarySize); + + TRACELOG(RL_LOG_INFO, "SHADER: [ID %i] Compute shader program loaded successfully", program); + } +#else + TRACELOG(RL_LOG_WARNING, "SHADER: Compute shaders not enabled. Define GRAPHICS_API_OPENGL_43"); +#endif + + return program; +} + +// Dispatch compute shader (equivalent to *draw* for graphics pilepine) +void rlComputeShaderDispatch(unsigned int groupX, unsigned int groupY, unsigned int groupZ) +{ +#if defined(GRAPHICS_API_OPENGL_43) + glDispatchCompute(groupX, groupY, groupZ); +#endif +} + +// Load shader storage buffer object (SSBO) +unsigned int rlLoadShaderBuffer(unsigned int size, const void *data, int usageHint) +{ + unsigned int ssbo = 0; + +#if defined(GRAPHICS_API_OPENGL_43) + glGenBuffers(1, &ssbo); + glBindBuffer(GL_SHADER_STORAGE_BUFFER, ssbo); + glBufferData(GL_SHADER_STORAGE_BUFFER, size, data, usageHint? usageHint : RL_STREAM_COPY); + if (data == NULL) glClearBufferData(GL_SHADER_STORAGE_BUFFER, GL_R8UI, GL_RED_INTEGER, GL_UNSIGNED_BYTE, NULL); // Clear buffer data to 0 + glBindBuffer(GL_SHADER_STORAGE_BUFFER, 0); +#else + TRACELOG(RL_LOG_WARNING, "SSBO: SSBO not enabled. Define GRAPHICS_API_OPENGL_43"); +#endif + + return ssbo; +} + +// Unload shader storage buffer object (SSBO) +void rlUnloadShaderBuffer(unsigned int ssboId) +{ +#if defined(GRAPHICS_API_OPENGL_43) + glDeleteBuffers(1, &ssboId); +#else + TRACELOG(RL_LOG_WARNING, "SSBO: SSBO not enabled. Define GRAPHICS_API_OPENGL_43"); +#endif + +} + +// Update SSBO buffer data +void rlUpdateShaderBuffer(unsigned int id, const void *data, unsigned int dataSize, unsigned int offset) +{ +#if defined(GRAPHICS_API_OPENGL_43) + glBindBuffer(GL_SHADER_STORAGE_BUFFER, id); + glBufferSubData(GL_SHADER_STORAGE_BUFFER, offset, dataSize, data); +#endif +} + +// Get SSBO buffer size +unsigned int rlGetShaderBufferSize(unsigned int id) +{ +#if defined(GRAPHICS_API_OPENGL_43) + GLint64 size = 0; + glBindBuffer(GL_SHADER_STORAGE_BUFFER, id); + glGetBufferParameteri64v(GL_SHADER_STORAGE_BUFFER, GL_BUFFER_SIZE, &size); + return (size > 0)? (unsigned int)size : 0; +#else + return 0; +#endif +} + +// Read SSBO buffer data (GPU->CPU) +void rlReadShaderBuffer(unsigned int id, void *dest, unsigned int count, unsigned int offset) +{ +#if defined(GRAPHICS_API_OPENGL_43) + glBindBuffer(GL_SHADER_STORAGE_BUFFER, id); + glGetBufferSubData(GL_SHADER_STORAGE_BUFFER, offset, count, dest); +#endif +} + +// Bind SSBO buffer +void rlBindShaderBuffer(unsigned int id, unsigned int index) +{ +#if defined(GRAPHICS_API_OPENGL_43) + glBindBufferBase(GL_SHADER_STORAGE_BUFFER, index, id); +#endif +} + +// Copy SSBO buffer data +void rlCopyShaderBuffer(unsigned int destId, unsigned int srcId, unsigned int destOffset, unsigned int srcOffset, unsigned int count) +{ +#if defined(GRAPHICS_API_OPENGL_43) + glBindBuffer(GL_COPY_READ_BUFFER, srcId); + glBindBuffer(GL_COPY_WRITE_BUFFER, destId); + glCopyBufferSubData(GL_COPY_READ_BUFFER, GL_COPY_WRITE_BUFFER, srcOffset, destOffset, count); +#endif +} + +// Bind image texture +void rlBindImageTexture(unsigned int id, unsigned int index, int format, bool readonly) +{ +#if defined(GRAPHICS_API_OPENGL_43) + unsigned int glInternalFormat = 0, glFormat = 0, glType = 0; + + rlGetGlTextureFormats(format, &glInternalFormat, &glFormat, &glType); + glBindImageTexture(index, id, 0, 0, 0, readonly? GL_READ_ONLY : GL_READ_WRITE, glInternalFormat); +#else + TRACELOG(RL_LOG_WARNING, "TEXTURE: Image texture binding not enabled. Define GRAPHICS_API_OPENGL_43"); +#endif +} + +// Matrix state management +//----------------------------------------------------------------------------------------- +// Get internal modelview matrix +Matrix rlGetMatrixModelview(void) +{ + Matrix matrix = rlMatrixIdentity(); +#if defined(GRAPHICS_API_OPENGL_11) + float mat[16]; + glGetFloatv(GL_MODELVIEW_MATRIX, mat); + matrix.m0 = mat[0]; + matrix.m1 = mat[1]; + matrix.m2 = mat[2]; + matrix.m3 = mat[3]; + matrix.m4 = mat[4]; + matrix.m5 = mat[5]; + matrix.m6 = mat[6]; + matrix.m7 = mat[7]; + matrix.m8 = mat[8]; + matrix.m9 = mat[9]; + matrix.m10 = mat[10]; + matrix.m11 = mat[11]; + matrix.m12 = mat[12]; + matrix.m13 = mat[13]; + matrix.m14 = mat[14]; + matrix.m15 = mat[15]; +#else + matrix = RLGL.State.modelview; +#endif + return matrix; +} + +// Get internal projection matrix +Matrix rlGetMatrixProjection(void) +{ +#if defined(GRAPHICS_API_OPENGL_11) + float mat[16]; + glGetFloatv(GL_PROJECTION_MATRIX,mat); + Matrix m; + m.m0 = mat[0]; + m.m1 = mat[1]; + m.m2 = mat[2]; + m.m3 = mat[3]; + m.m4 = mat[4]; + m.m5 = mat[5]; + m.m6 = mat[6]; + m.m7 = mat[7]; + m.m8 = mat[8]; + m.m9 = mat[9]; + m.m10 = mat[10]; + m.m11 = mat[11]; + m.m12 = mat[12]; + m.m13 = mat[13]; + m.m14 = mat[14]; + m.m15 = mat[15]; + return m; +#else + return RLGL.State.projection; +#endif +} + +// Get internal accumulated transform matrix +Matrix rlGetMatrixTransform(void) +{ + Matrix mat = rlMatrixIdentity(); +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + // TODO: Consider possible transform matrices in the RLGL.State.stack + // Is this the right order? or should we start with the first stored matrix instead of the last one? + //Matrix matStackTransform = rlMatrixIdentity(); + //for (int i = RLGL.State.stackCounter; i > 0; i--) matStackTransform = rlMatrixMultiply(RLGL.State.stack[i], matStackTransform); + mat = RLGL.State.transform; +#endif + return mat; +} + +// Get internal projection matrix for stereo render (selected eye) +Matrix rlGetMatrixProjectionStereo(int eye) +{ + Matrix mat = rlMatrixIdentity(); +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + mat = RLGL.State.projectionStereo[eye]; +#endif + return mat; +} + +// Get internal view offset matrix for stereo render (selected eye) +Matrix rlGetMatrixViewOffsetStereo(int eye) +{ + Matrix mat = rlMatrixIdentity(); +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + mat = RLGL.State.viewOffsetStereo[eye]; +#endif + return mat; +} + +// Set a custom modelview matrix (replaces internal modelview matrix) +void rlSetMatrixModelview(Matrix view) +{ +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + RLGL.State.modelview = view; +#endif +} + +// Set a custom projection matrix (replaces internal projection matrix) +void rlSetMatrixProjection(Matrix projection) +{ +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + RLGL.State.projection = projection; +#endif +} + +// Set eyes projection matrices for stereo rendering +void rlSetMatrixProjectionStereo(Matrix right, Matrix left) +{ +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + RLGL.State.projectionStereo[0] = right; + RLGL.State.projectionStereo[1] = left; +#endif +} + +// Set eyes view offsets matrices for stereo rendering +void rlSetMatrixViewOffsetStereo(Matrix right, Matrix left) +{ +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + RLGL.State.viewOffsetStereo[0] = right; + RLGL.State.viewOffsetStereo[1] = left; +#endif +} + +// Load and draw a quad in NDC +void rlLoadDrawQuad(void) +{ +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + unsigned int quadVAO = 0; + unsigned int quadVBO = 0; + + float vertices[] = { + // Positions Texcoords + -1.0f, 1.0f, 0.0f, 0.0f, 1.0f, + -1.0f, -1.0f, 0.0f, 0.0f, 0.0f, + 1.0f, 1.0f, 0.0f, 1.0f, 1.0f, + 1.0f, -1.0f, 0.0f, 1.0f, 0.0f, + }; + + // Gen VAO to contain VBO + glGenVertexArrays(1, &quadVAO); + glBindVertexArray(quadVAO); + + // Gen and fill vertex buffer (VBO) + glGenBuffers(1, &quadVBO); + glBindBuffer(GL_ARRAY_BUFFER, quadVBO); + glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), &vertices, GL_STATIC_DRAW); + + // Bind vertex attributes (position, texcoords) + glEnableVertexAttribArray(RL_DEFAULT_SHADER_ATTRIB_LOCATION_POSITION); + glVertexAttribPointer(RL_DEFAULT_SHADER_ATTRIB_LOCATION_POSITION, 3, GL_FLOAT, GL_FALSE, 5*sizeof(float), (void *)0); // Positions + glEnableVertexAttribArray(RL_DEFAULT_SHADER_ATTRIB_LOCATION_TEXCOORD); + glVertexAttribPointer(RL_DEFAULT_SHADER_ATTRIB_LOCATION_TEXCOORD, 2, GL_FLOAT, GL_FALSE, 5*sizeof(float), (void *)(3*sizeof(float))); // Texcoords + + // Draw quad + glBindVertexArray(quadVAO); + glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); + glBindVertexArray(0); + + // Delete buffers (VBO and VAO) + glDeleteBuffers(1, &quadVBO); + glDeleteVertexArrays(1, &quadVAO); +#endif +} + +// Load and draw a cube in NDC +void rlLoadDrawCube(void) +{ +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + unsigned int cubeVAO = 0; + unsigned int cubeVBO = 0; + + float vertices[] = { + // Positions Normals Texcoords + -1.0f, -1.0f, -1.0f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f, + 1.0f, 1.0f, -1.0f, 0.0f, 0.0f, -1.0f, 1.0f, 1.0f, + 1.0f, -1.0f, -1.0f, 0.0f, 0.0f, -1.0f, 1.0f, 0.0f, + 1.0f, 1.0f, -1.0f, 0.0f, 0.0f, -1.0f, 1.0f, 1.0f, + -1.0f, -1.0f, -1.0f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f, + -1.0f, 1.0f, -1.0f, 0.0f, 0.0f, -1.0f, 0.0f, 1.0f, + -1.0f, -1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, + 1.0f, -1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, + 1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, + 1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, + -1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, + -1.0f, -1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, + -1.0f, 1.0f, 1.0f, -1.0f, 0.0f, 0.0f, 1.0f, 0.0f, + -1.0f, 1.0f, -1.0f, -1.0f, 0.0f, 0.0f, 1.0f, 1.0f, + -1.0f, -1.0f, -1.0f, -1.0f, 0.0f, 0.0f, 0.0f, 1.0f, + -1.0f, -1.0f, -1.0f, -1.0f, 0.0f, 0.0f, 0.0f, 1.0f, + -1.0f, -1.0f, 1.0f, -1.0f, 0.0f, 0.0f, 0.0f, 0.0f, + -1.0f, 1.0f, 1.0f, -1.0f, 0.0f, 0.0f, 1.0f, 0.0f, + 1.0f, 1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, + 1.0f, -1.0f, -1.0f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f, + 1.0f, 1.0f, -1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, + 1.0f, -1.0f, -1.0f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f, + 1.0f, 1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, + 1.0f, -1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, + -1.0f, -1.0f, -1.0f, 0.0f, -1.0f, 0.0f, 0.0f, 1.0f, + 1.0f, -1.0f, -1.0f, 0.0f, -1.0f, 0.0f, 1.0f, 1.0f, + 1.0f, -1.0f, 1.0f, 0.0f, -1.0f, 0.0f, 1.0f, 0.0f, + 1.0f, -1.0f, 1.0f, 0.0f, -1.0f, 0.0f, 1.0f, 0.0f, + -1.0f, -1.0f, 1.0f, 0.0f, -1.0f, 0.0f, 0.0f, 0.0f, + -1.0f, -1.0f, -1.0f, 0.0f, -1.0f, 0.0f, 0.0f, 1.0f, + -1.0f, 1.0f, -1.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, + 1.0f, 1.0f, 1.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, + 1.0f, 1.0f, -1.0f, 0.0f, 1.0f, 0.0f, 1.0f, 1.0f, + 1.0f, 1.0f, 1.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, + -1.0f, 1.0f, -1.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, + -1.0f, 1.0f, 1.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f + }; + + // Gen VAO to contain VBO + glGenVertexArrays(1, &cubeVAO); + glBindVertexArray(cubeVAO); + + // Gen and fill vertex buffer (VBO) + glGenBuffers(1, &cubeVBO); + glBindBuffer(GL_ARRAY_BUFFER, cubeVBO); + glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); + + // Bind vertex attributes (position, normals, texcoords) + glBindVertexArray(cubeVAO); + glEnableVertexAttribArray(RL_DEFAULT_SHADER_ATTRIB_LOCATION_POSITION); + glVertexAttribPointer(RL_DEFAULT_SHADER_ATTRIB_LOCATION_POSITION, 3, GL_FLOAT, GL_FALSE, 8*sizeof(float), (void *)0); // Positions + glEnableVertexAttribArray(RL_DEFAULT_SHADER_ATTRIB_LOCATION_NORMAL); + glVertexAttribPointer(RL_DEFAULT_SHADER_ATTRIB_LOCATION_NORMAL, 3, GL_FLOAT, GL_FALSE, 8*sizeof(float), (void *)(3*sizeof(float))); // Normals + glEnableVertexAttribArray(RL_DEFAULT_SHADER_ATTRIB_LOCATION_TEXCOORD); + glVertexAttribPointer(RL_DEFAULT_SHADER_ATTRIB_LOCATION_TEXCOORD, 2, GL_FLOAT, GL_FALSE, 8*sizeof(float), (void *)(6*sizeof(float))); // Texcoords + glBindBuffer(GL_ARRAY_BUFFER, 0); + glBindVertexArray(0); + + // Draw cube + glBindVertexArray(cubeVAO); + glDrawArrays(GL_TRIANGLES, 0, 36); + glBindVertexArray(0); + + // Delete VBO and VAO + glDeleteBuffers(1, &cubeVBO); + glDeleteVertexArrays(1, &cubeVAO); +#endif +} + +// Get name string for pixel format +const char *rlGetPixelFormatName(unsigned int format) +{ + switch (format) + { + case RL_PIXELFORMAT_UNCOMPRESSED_GRAYSCALE: return "GRAYSCALE"; break; // 8 bit per pixel (no alpha) + case RL_PIXELFORMAT_UNCOMPRESSED_GRAY_ALPHA: return "GRAY_ALPHA"; break; // 8*2 bpp (2 channels) + case RL_PIXELFORMAT_UNCOMPRESSED_R5G6B5: return "R5G6B5"; break; // 16 bpp + case RL_PIXELFORMAT_UNCOMPRESSED_R8G8B8: return "R8G8B8"; break; // 24 bpp + case RL_PIXELFORMAT_UNCOMPRESSED_R5G5B5A1: return "R5G5B5A1"; break; // 16 bpp (1 bit alpha) + case RL_PIXELFORMAT_UNCOMPRESSED_R4G4B4A4: return "R4G4B4A4"; break; // 16 bpp (4 bit alpha) + case RL_PIXELFORMAT_UNCOMPRESSED_R8G8B8A8: return "R8G8B8A8"; break; // 32 bpp + case RL_PIXELFORMAT_UNCOMPRESSED_R32: return "R32"; break; // 32 bpp (1 channel - float) + case RL_PIXELFORMAT_UNCOMPRESSED_R32G32B32: return "R32G32B32"; break; // 32*3 bpp (3 channels - float) + case RL_PIXELFORMAT_UNCOMPRESSED_R32G32B32A32: return "R32G32B32A32"; break; // 32*4 bpp (4 channels - float) + case RL_PIXELFORMAT_UNCOMPRESSED_R16: return "R16"; break; // 16 bpp (1 channel - half float) + case RL_PIXELFORMAT_UNCOMPRESSED_R16G16B16: return "R16G16B16"; break; // 16*3 bpp (3 channels - half float) + case RL_PIXELFORMAT_UNCOMPRESSED_R16G16B16A16: return "R16G16B16A16"; break; // 16*4 bpp (4 channels - half float) + case RL_PIXELFORMAT_COMPRESSED_DXT1_RGB: return "DXT1_RGB"; break; // 4 bpp (no alpha) + case RL_PIXELFORMAT_COMPRESSED_DXT1_RGBA: return "DXT1_RGBA"; break; // 4 bpp (1 bit alpha) + case RL_PIXELFORMAT_COMPRESSED_DXT3_RGBA: return "DXT3_RGBA"; break; // 8 bpp + case RL_PIXELFORMAT_COMPRESSED_DXT5_RGBA: return "DXT5_RGBA"; break; // 8 bpp + case RL_PIXELFORMAT_COMPRESSED_ETC1_RGB: return "ETC1_RGB"; break; // 4 bpp + case RL_PIXELFORMAT_COMPRESSED_ETC2_RGB: return "ETC2_RGB"; break; // 4 bpp + case RL_PIXELFORMAT_COMPRESSED_ETC2_EAC_RGBA: return "ETC2_RGBA"; break; // 8 bpp + case RL_PIXELFORMAT_COMPRESSED_PVRT_RGB: return "PVRT_RGB"; break; // 4 bpp + case RL_PIXELFORMAT_COMPRESSED_PVRT_RGBA: return "PVRT_RGBA"; break; // 4 bpp + case RL_PIXELFORMAT_COMPRESSED_ASTC_4x4_RGBA: return "ASTC_4x4_RGBA"; break; // 8 bpp + case RL_PIXELFORMAT_COMPRESSED_ASTC_8x8_RGBA: return "ASTC_8x8_RGBA"; break; // 2 bpp + default: return "UNKNOWN"; break; + } +} + +//---------------------------------------------------------------------------------- +// Module specific Functions Definition +//---------------------------------------------------------------------------------- +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) +// Load default shader (just vertex positioning and texture coloring) +// NOTE: This shader program is used for internal buffers +// NOTE: Loaded: RLGL.State.defaultShaderId, RLGL.State.defaultShaderLocs +static void rlLoadShaderDefault(void) +{ + RLGL.State.defaultShaderLocs = (int *)RL_CALLOC(RL_MAX_SHADER_LOCATIONS, sizeof(int)); + + // NOTE: All locations must be reseted to -1 (no location) + for (int i = 0; i < RL_MAX_SHADER_LOCATIONS; i++) RLGL.State.defaultShaderLocs[i] = -1; + + // Vertex shader directly defined, no external file required + const char *defaultVShaderCode = +#if defined(GRAPHICS_API_OPENGL_21) + "#version 120 \n" + "attribute vec3 vertexPosition; \n" + "attribute vec2 vertexTexCoord; \n" + "attribute vec4 vertexColor; \n" + "varying vec2 fragTexCoord; \n" + "varying vec4 fragColor; \n" +#elif defined(GRAPHICS_API_OPENGL_33) + "#version 330 \n" + "in vec3 vertexPosition; \n" + "in vec2 vertexTexCoord; \n" + "in vec4 vertexColor; \n" + "out vec2 fragTexCoord; \n" + "out vec4 fragColor; \n" +#endif + +#if defined(GRAPHICS_API_OPENGL_ES3) + "#version 300 es \n" + "precision mediump float; \n" // Precision required for OpenGL ES3 (WebGL 2) (on some browsers) + "in vec3 vertexPosition; \n" + "in vec2 vertexTexCoord; \n" + "in vec4 vertexColor; \n" + "out vec2 fragTexCoord; \n" + "out vec4 fragColor; \n" +#elif defined(GRAPHICS_API_OPENGL_ES2) + "#version 100 \n" + "precision mediump float; \n" // Precision required for OpenGL ES2 (WebGL) (on some browsers) + "attribute vec3 vertexPosition; \n" + "attribute vec2 vertexTexCoord; \n" + "attribute vec4 vertexColor; \n" + "varying vec2 fragTexCoord; \n" + "varying vec4 fragColor; \n" +#endif + + "uniform mat4 mvp; \n" + "void main() \n" + "{ \n" + " fragTexCoord = vertexTexCoord; \n" + " fragColor = vertexColor; \n" + " gl_Position = mvp*vec4(vertexPosition, 1.0); \n" + "} \n"; + + // Fragment shader directly defined, no external file required + const char *defaultFShaderCode = +#if defined(GRAPHICS_API_OPENGL_21) + "#version 120 \n" + "varying vec2 fragTexCoord; \n" + "varying vec4 fragColor; \n" + "uniform sampler2D texture0; \n" + "uniform vec4 colDiffuse; \n" + "void main() \n" + "{ \n" + " vec4 texelColor = texture2D(texture0, fragTexCoord); \n" + " gl_FragColor = texelColor*colDiffuse*fragColor; \n" + "} \n"; +#elif defined(GRAPHICS_API_OPENGL_33) + "#version 330 \n" + "in vec2 fragTexCoord; \n" + "in vec4 fragColor; \n" + "out vec4 finalColor; \n" + "uniform sampler2D texture0; \n" + "uniform vec4 colDiffuse; \n" + "void main() \n" + "{ \n" + " vec4 texelColor = texture(texture0, fragTexCoord); \n" + " finalColor = texelColor*colDiffuse*fragColor; \n" + "} \n"; +#endif + +#if defined(GRAPHICS_API_OPENGL_ES3) + "#version 300 es \n" + "precision mediump float; \n" // Precision required for OpenGL ES3 (WebGL 2) + "in vec2 fragTexCoord; \n" + "in vec4 fragColor; \n" + "out vec4 finalColor; \n" + "uniform sampler2D texture0; \n" + "uniform vec4 colDiffuse; \n" + "void main() \n" + "{ \n" + " vec4 texelColor = texture(texture0, fragTexCoord); \n" + " finalColor = texelColor*colDiffuse*fragColor; \n" + "} \n"; +#elif defined(GRAPHICS_API_OPENGL_ES2) + "#version 100 \n" + "precision mediump float; \n" // Precision required for OpenGL ES2 (WebGL) + "varying vec2 fragTexCoord; \n" + "varying vec4 fragColor; \n" + "uniform sampler2D texture0; \n" + "uniform vec4 colDiffuse; \n" + "void main() \n" + "{ \n" + " vec4 texelColor = texture2D(texture0, fragTexCoord); \n" + " gl_FragColor = texelColor*colDiffuse*fragColor; \n" + "} \n"; +#endif + + // NOTE: Compiled vertex/fragment shaders are not deleted, + // they are kept for re-use as default shaders in case some shader loading fails + RLGL.State.defaultVShaderId = rlCompileShader(defaultVShaderCode, GL_VERTEX_SHADER); // Compile default vertex shader + RLGL.State.defaultFShaderId = rlCompileShader(defaultFShaderCode, GL_FRAGMENT_SHADER); // Compile default fragment shader + + RLGL.State.defaultShaderId = rlLoadShaderProgram(RLGL.State.defaultVShaderId, RLGL.State.defaultFShaderId); + + if (RLGL.State.defaultShaderId > 0) + { + TRACELOG(RL_LOG_INFO, "SHADER: [ID %i] Default shader loaded successfully", RLGL.State.defaultShaderId); + + // Set default shader locations: attributes locations + RLGL.State.defaultShaderLocs[RL_SHADER_LOC_VERTEX_POSITION] = glGetAttribLocation(RLGL.State.defaultShaderId, RL_DEFAULT_SHADER_ATTRIB_NAME_POSITION); + RLGL.State.defaultShaderLocs[RL_SHADER_LOC_VERTEX_TEXCOORD01] = glGetAttribLocation(RLGL.State.defaultShaderId, RL_DEFAULT_SHADER_ATTRIB_NAME_TEXCOORD); + RLGL.State.defaultShaderLocs[RL_SHADER_LOC_VERTEX_COLOR] = glGetAttribLocation(RLGL.State.defaultShaderId, RL_DEFAULT_SHADER_ATTRIB_NAME_COLOR); + + // Set default shader locations: uniform locations + RLGL.State.defaultShaderLocs[RL_SHADER_LOC_MATRIX_MVP] = glGetUniformLocation(RLGL.State.defaultShaderId, RL_DEFAULT_SHADER_UNIFORM_NAME_MVP); + RLGL.State.defaultShaderLocs[RL_SHADER_LOC_COLOR_DIFFUSE] = glGetUniformLocation(RLGL.State.defaultShaderId, RL_DEFAULT_SHADER_UNIFORM_NAME_COLOR); + RLGL.State.defaultShaderLocs[RL_SHADER_LOC_MAP_DIFFUSE] = glGetUniformLocation(RLGL.State.defaultShaderId, RL_DEFAULT_SHADER_SAMPLER2D_NAME_TEXTURE0); + } + else TRACELOG(RL_LOG_WARNING, "SHADER: [ID %i] Failed to load default shader", RLGL.State.defaultShaderId); +} + +// Unload default shader +// NOTE: Unloads: RLGL.State.defaultShaderId, RLGL.State.defaultShaderLocs +static void rlUnloadShaderDefault(void) +{ + glUseProgram(0); + + glDetachShader(RLGL.State.defaultShaderId, RLGL.State.defaultVShaderId); + glDetachShader(RLGL.State.defaultShaderId, RLGL.State.defaultFShaderId); + glDeleteShader(RLGL.State.defaultVShaderId); + glDeleteShader(RLGL.State.defaultFShaderId); + + glDeleteProgram(RLGL.State.defaultShaderId); + + RL_FREE(RLGL.State.defaultShaderLocs); + + TRACELOG(RL_LOG_INFO, "SHADER: [ID %i] Default shader unloaded successfully", RLGL.State.defaultShaderId); +} + +#if defined(RLGL_SHOW_GL_DETAILS_INFO) +// Get compressed format official GL identifier name +static const char *rlGetCompressedFormatName(int format) +{ + switch (format) + { + // GL_EXT_texture_compression_s3tc + case 0x83F0: return "GL_COMPRESSED_RGB_S3TC_DXT1_EXT"; break; + case 0x83F1: return "GL_COMPRESSED_RGBA_S3TC_DXT1_EXT"; break; + case 0x83F2: return "GL_COMPRESSED_RGBA_S3TC_DXT3_EXT"; break; + case 0x83F3: return "GL_COMPRESSED_RGBA_S3TC_DXT5_EXT"; break; + // GL_3DFX_texture_compression_FXT1 + case 0x86B0: return "GL_COMPRESSED_RGB_FXT1_3DFX"; break; + case 0x86B1: return "GL_COMPRESSED_RGBA_FXT1_3DFX"; break; + // GL_IMG_texture_compression_pvrtc + case 0x8C00: return "GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG"; break; + case 0x8C01: return "GL_COMPRESSED_RGB_PVRTC_2BPPV1_IMG"; break; + case 0x8C02: return "GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG"; break; + case 0x8C03: return "GL_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG"; break; + // GL_OES_compressed_ETC1_RGB8_texture + case 0x8D64: return "GL_ETC1_RGB8_OES"; break; + // GL_ARB_texture_compression_rgtc + case 0x8DBB: return "GL_COMPRESSED_RED_RGTC1"; break; + case 0x8DBC: return "GL_COMPRESSED_SIGNED_RED_RGTC1"; break; + case 0x8DBD: return "GL_COMPRESSED_RG_RGTC2"; break; + case 0x8DBE: return "GL_COMPRESSED_SIGNED_RG_RGTC2"; break; + // GL_ARB_texture_compression_bptc + case 0x8E8C: return "GL_COMPRESSED_RGBA_BPTC_UNORM_ARB"; break; + case 0x8E8D: return "GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM_ARB"; break; + case 0x8E8E: return "GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT_ARB"; break; + case 0x8E8F: return "GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_ARB"; break; + // GL_ARB_ES3_compatibility + case 0x9274: return "GL_COMPRESSED_RGB8_ETC2"; break; + case 0x9275: return "GL_COMPRESSED_SRGB8_ETC2"; break; + case 0x9276: return "GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2"; break; + case 0x9277: return "GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2"; break; + case 0x9278: return "GL_COMPRESSED_RGBA8_ETC2_EAC"; break; + case 0x9279: return "GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC"; break; + case 0x9270: return "GL_COMPRESSED_R11_EAC"; break; + case 0x9271: return "GL_COMPRESSED_SIGNED_R11_EAC"; break; + case 0x9272: return "GL_COMPRESSED_RG11_EAC"; break; + case 0x9273: return "GL_COMPRESSED_SIGNED_RG11_EAC"; break; + // GL_KHR_texture_compression_astc_hdr + case 0x93B0: return "GL_COMPRESSED_RGBA_ASTC_4x4_KHR"; break; + case 0x93B1: return "GL_COMPRESSED_RGBA_ASTC_5x4_KHR"; break; + case 0x93B2: return "GL_COMPRESSED_RGBA_ASTC_5x5_KHR"; break; + case 0x93B3: return "GL_COMPRESSED_RGBA_ASTC_6x5_KHR"; break; + case 0x93B4: return "GL_COMPRESSED_RGBA_ASTC_6x6_KHR"; break; + case 0x93B5: return "GL_COMPRESSED_RGBA_ASTC_8x5_KHR"; break; + case 0x93B6: return "GL_COMPRESSED_RGBA_ASTC_8x6_KHR"; break; + case 0x93B7: return "GL_COMPRESSED_RGBA_ASTC_8x8_KHR"; break; + case 0x93B8: return "GL_COMPRESSED_RGBA_ASTC_10x5_KHR"; break; + case 0x93B9: return "GL_COMPRESSED_RGBA_ASTC_10x6_KHR"; break; + case 0x93BA: return "GL_COMPRESSED_RGBA_ASTC_10x8_KHR"; break; + case 0x93BB: return "GL_COMPRESSED_RGBA_ASTC_10x10_KHR"; break; + case 0x93BC: return "GL_COMPRESSED_RGBA_ASTC_12x10_KHR"; break; + case 0x93BD: return "GL_COMPRESSED_RGBA_ASTC_12x12_KHR"; break; + case 0x93D0: return "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR"; break; + case 0x93D1: return "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR"; break; + case 0x93D2: return "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR"; break; + case 0x93D3: return "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR"; break; + case 0x93D4: return "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR"; break; + case 0x93D5: return "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR"; break; + case 0x93D6: return "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR"; break; + case 0x93D7: return "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR"; break; + case 0x93D8: return "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR"; break; + case 0x93D9: return "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR"; break; + case 0x93DA: return "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR"; break; + case 0x93DB: return "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR"; break; + case 0x93DC: return "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR"; break; + case 0x93DD: return "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR"; break; + default: return "GL_COMPRESSED_UNKNOWN"; break; + } +} +#endif // RLGL_SHOW_GL_DETAILS_INFO + +#endif // GRAPHICS_API_OPENGL_33 || GRAPHICS_API_OPENGL_ES2 + +// Get pixel data size in bytes (image or texture) +// NOTE: Size depends on pixel format +static int rlGetPixelDataSize(int width, int height, int format) +{ + int dataSize = 0; // Size in bytes + int bpp = 0; // Bits per pixel + + switch (format) + { + case RL_PIXELFORMAT_UNCOMPRESSED_GRAYSCALE: bpp = 8; break; + case RL_PIXELFORMAT_UNCOMPRESSED_GRAY_ALPHA: + case RL_PIXELFORMAT_UNCOMPRESSED_R5G6B5: + case RL_PIXELFORMAT_UNCOMPRESSED_R5G5B5A1: + case RL_PIXELFORMAT_UNCOMPRESSED_R4G4B4A4: bpp = 16; break; + case RL_PIXELFORMAT_UNCOMPRESSED_R8G8B8A8: bpp = 32; break; + case RL_PIXELFORMAT_UNCOMPRESSED_R8G8B8: bpp = 24; break; + case RL_PIXELFORMAT_UNCOMPRESSED_R32: bpp = 32; break; + case RL_PIXELFORMAT_UNCOMPRESSED_R32G32B32: bpp = 32*3; break; + case RL_PIXELFORMAT_UNCOMPRESSED_R32G32B32A32: bpp = 32*4; break; + case RL_PIXELFORMAT_UNCOMPRESSED_R16: bpp = 16; break; + case RL_PIXELFORMAT_UNCOMPRESSED_R16G16B16: bpp = 16*3; break; + case RL_PIXELFORMAT_UNCOMPRESSED_R16G16B16A16: bpp = 16*4; break; + case RL_PIXELFORMAT_COMPRESSED_DXT1_RGB: + case RL_PIXELFORMAT_COMPRESSED_DXT1_RGBA: + case RL_PIXELFORMAT_COMPRESSED_ETC1_RGB: + case RL_PIXELFORMAT_COMPRESSED_ETC2_RGB: + case RL_PIXELFORMAT_COMPRESSED_PVRT_RGB: + case RL_PIXELFORMAT_COMPRESSED_PVRT_RGBA: bpp = 4; break; + case RL_PIXELFORMAT_COMPRESSED_DXT3_RGBA: + case RL_PIXELFORMAT_COMPRESSED_DXT5_RGBA: + case RL_PIXELFORMAT_COMPRESSED_ETC2_EAC_RGBA: + case RL_PIXELFORMAT_COMPRESSED_ASTC_4x4_RGBA: bpp = 8; break; + case RL_PIXELFORMAT_COMPRESSED_ASTC_8x8_RGBA: bpp = 2; break; + default: break; + } + + double bytesPerPixel = (double)bpp/8.0; + dataSize = (int)(bytesPerPixel*width*height); // Total data size in bytes + + // Most compressed formats works on 4x4 blocks, + // if texture is smaller, minimum dataSize is 8 or 16 + if ((width < 4) && (height < 4)) + { + if ((format >= RL_PIXELFORMAT_COMPRESSED_DXT1_RGB) && (format < RL_PIXELFORMAT_COMPRESSED_DXT3_RGBA)) dataSize = 8; + else if ((format >= RL_PIXELFORMAT_COMPRESSED_DXT3_RGBA) && (format < RL_PIXELFORMAT_COMPRESSED_ASTC_8x8_RGBA)) dataSize = 16; + } + + return dataSize; +} + +// Auxiliar math functions + +// Get float array of matrix data +static rl_float16 rlMatrixToFloatV(Matrix mat) +{ + rl_float16 result = { 0 }; + + result.v[0] = mat.m0; + result.v[1] = mat.m1; + result.v[2] = mat.m2; + result.v[3] = mat.m3; + result.v[4] = mat.m4; + result.v[5] = mat.m5; + result.v[6] = mat.m6; + result.v[7] = mat.m7; + result.v[8] = mat.m8; + result.v[9] = mat.m9; + result.v[10] = mat.m10; + result.v[11] = mat.m11; + result.v[12] = mat.m12; + result.v[13] = mat.m13; + result.v[14] = mat.m14; + result.v[15] = mat.m15; + + return result; +} + +// Get identity matrix +static Matrix rlMatrixIdentity(void) +{ + Matrix result = { + 1.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 1.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 1.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 1.0f + }; + + return result; +} + +// Get two matrix multiplication +// NOTE: When multiplying matrices... the order matters! +static Matrix rlMatrixMultiply(Matrix left, Matrix right) +{ + Matrix result = { 0 }; + + result.m0 = left.m0*right.m0 + left.m1*right.m4 + left.m2*right.m8 + left.m3*right.m12; + result.m1 = left.m0*right.m1 + left.m1*right.m5 + left.m2*right.m9 + left.m3*right.m13; + result.m2 = left.m0*right.m2 + left.m1*right.m6 + left.m2*right.m10 + left.m3*right.m14; + result.m3 = left.m0*right.m3 + left.m1*right.m7 + left.m2*right.m11 + left.m3*right.m15; + result.m4 = left.m4*right.m0 + left.m5*right.m4 + left.m6*right.m8 + left.m7*right.m12; + result.m5 = left.m4*right.m1 + left.m5*right.m5 + left.m6*right.m9 + left.m7*right.m13; + result.m6 = left.m4*right.m2 + left.m5*right.m6 + left.m6*right.m10 + left.m7*right.m14; + result.m7 = left.m4*right.m3 + left.m5*right.m7 + left.m6*right.m11 + left.m7*right.m15; + result.m8 = left.m8*right.m0 + left.m9*right.m4 + left.m10*right.m8 + left.m11*right.m12; + result.m9 = left.m8*right.m1 + left.m9*right.m5 + left.m10*right.m9 + left.m11*right.m13; + result.m10 = left.m8*right.m2 + left.m9*right.m6 + left.m10*right.m10 + left.m11*right.m14; + result.m11 = left.m8*right.m3 + left.m9*right.m7 + left.m10*right.m11 + left.m11*right.m15; + result.m12 = left.m12*right.m0 + left.m13*right.m4 + left.m14*right.m8 + left.m15*right.m12; + result.m13 = left.m12*right.m1 + left.m13*right.m5 + left.m14*right.m9 + left.m15*right.m13; + result.m14 = left.m12*right.m2 + left.m13*right.m6 + left.m14*right.m10 + left.m15*right.m14; + result.m15 = left.m12*right.m3 + left.m13*right.m7 + left.m14*right.m11 + left.m15*right.m15; + + return result; +} + +// Transposes provided matrix +static Matrix rlMatrixTranspose(Matrix mat) +{ + Matrix result = { 0 }; + + result.m0 = mat.m0; + result.m1 = mat.m4; + result.m2 = mat.m8; + result.m3 = mat.m12; + result.m4 = mat.m1; + result.m5 = mat.m5; + result.m6 = mat.m9; + result.m7 = mat.m13; + result.m8 = mat.m2; + result.m9 = mat.m6; + result.m10 = mat.m10; + result.m11 = mat.m14; + result.m12 = mat.m3; + result.m13 = mat.m7; + result.m14 = mat.m11; + result.m15 = mat.m15; + + return result; +} + +// Invert provided matrix +static Matrix rlMatrixInvert(Matrix mat) +{ + Matrix result = { 0 }; + + // Cache the matrix values (speed optimization) + float a00 = mat.m0, a01 = mat.m1, a02 = mat.m2, a03 = mat.m3; + float a10 = mat.m4, a11 = mat.m5, a12 = mat.m6, a13 = mat.m7; + float a20 = mat.m8, a21 = mat.m9, a22 = mat.m10, a23 = mat.m11; + float a30 = mat.m12, a31 = mat.m13, a32 = mat.m14, a33 = mat.m15; + + float b00 = a00*a11 - a01*a10; + float b01 = a00*a12 - a02*a10; + float b02 = a00*a13 - a03*a10; + float b03 = a01*a12 - a02*a11; + float b04 = a01*a13 - a03*a11; + float b05 = a02*a13 - a03*a12; + float b06 = a20*a31 - a21*a30; + float b07 = a20*a32 - a22*a30; + float b08 = a20*a33 - a23*a30; + float b09 = a21*a32 - a22*a31; + float b10 = a21*a33 - a23*a31; + float b11 = a22*a33 - a23*a32; + + // Calculate the invert determinant (inlined to avoid double-caching) + float invDet = 1.0f/(b00*b11 - b01*b10 + b02*b09 + b03*b08 - b04*b07 + b05*b06); + + result.m0 = (a11*b11 - a12*b10 + a13*b09)*invDet; + result.m1 = (-a01*b11 + a02*b10 - a03*b09)*invDet; + result.m2 = (a31*b05 - a32*b04 + a33*b03)*invDet; + result.m3 = (-a21*b05 + a22*b04 - a23*b03)*invDet; + result.m4 = (-a10*b11 + a12*b08 - a13*b07)*invDet; + result.m5 = (a00*b11 - a02*b08 + a03*b07)*invDet; + result.m6 = (-a30*b05 + a32*b02 - a33*b01)*invDet; + result.m7 = (a20*b05 - a22*b02 + a23*b01)*invDet; + result.m8 = (a10*b10 - a11*b08 + a13*b06)*invDet; + result.m9 = (-a00*b10 + a01*b08 - a03*b06)*invDet; + result.m10 = (a30*b04 - a31*b02 + a33*b00)*invDet; + result.m11 = (-a20*b04 + a21*b02 - a23*b00)*invDet; + result.m12 = (-a10*b09 + a11*b07 - a12*b06)*invDet; + result.m13 = (a00*b09 - a01*b07 + a02*b06)*invDet; + result.m14 = (-a30*b03 + a31*b01 - a32*b00)*invDet; + result.m15 = (a20*b03 - a21*b01 + a22*b00)*invDet; + + return result; +} + +#endif // RLGL_IMPLEMENTATION diff --git a/vendor/raylib-5.5_linux_amd64/lib/libraylib.a b/vendor/raylib-5.5_linux_amd64/lib/libraylib.a Binary files differnew file mode 100644 index 0000000..6e2d85c --- /dev/null +++ b/vendor/raylib-5.5_linux_amd64/lib/libraylib.a |
