From b11a19a95615ea5f64222e37c184c81d5397fc98 Mon Sep 17 00:00:00 2001 From: AnonymusRaccoon Date: Tue, 18 Feb 2020 14:11:52 +0100 Subject: [PATCH] Initial --- .github/workflows/main.yml | 43 +++++ .gitmodules | 9 + lib/gamacon/.gitignore | 4 + lib/gamacon/Makefile | 105 +++++++++++ lib/gamacon/include/component.h | 36 ++++ .../components/camerafollow_component.h | 12 ++ .../include/components/collision_component.h | 30 +++ .../components/controllable_component.h | 21 +++ .../controllers/keyboard_controller.h | 21 +++ .../components/fixed_to_cam_component.h | 19 ++ .../include/components/friction_component.h | 19 ++ .../include/components/friction_giver.h | 18 ++ .../include/components/movable_component.h | 20 ++ .../include/components/parallax_component.h | 19 ++ lib/gamacon/include/components/renderer.h | 37 ++++ .../include/components/transform_component.h | 20 ++ lib/gamacon/include/data.h | 27 +++ lib/gamacon/include/engine.h | 71 +++++++ lib/gamacon/include/entity.h | 37 ++++ lib/gamacon/include/entity_factory.h | 9 + lib/gamacon/include/list.h | 18 ++ lib/gamacon/include/my.h | 125 +++++++++++++ lib/gamacon/include/prefab.h | 14 ++ lib/gamacon/include/quadtree.h | 54 ++++++ lib/gamacon/include/read_line.h | 12 ++ lib/gamacon/include/scene.h | 36 ++++ lib/gamacon/include/sfml_renderer.h | 43 +++++ lib/gamacon/include/sprite.h | 42 +++++ lib/gamacon/include/system.h | 30 +++ .../include/systems/camerafollow_system.h | 18 ++ .../include/systems/collision_system.h | 20 ++ .../controllers/keyboard_controller_system.h | 12 ++ lib/gamacon/include/systems/friction_system.h | 12 ++ lib/gamacon/include/systems/movable_system.h | 13 ++ lib/gamacon/include/systems/parallax_system.h | 12 ++ .../include/systems/sfml_renderer_system.h | 28 +++ lib/gamacon/include/tags.h | 13 ++ lib/gamacon/include/text.h | 14 ++ lib/gamacon/include/tupple.h | 23 +++ lib/gamacon/include/utility.h | 38 ++++ lib/gamacon/include/vector2.h | 17 ++ lib/gamacon/include/xml.h | 44 +++++ lib/gamacon/src/component.c | 62 ++++++ lib/gamacon/src/components/camera_follow.c | 52 ++++++ .../src/components/collision_component.c | 79 ++++++++ .../src/components/controllable_component.c | 68 +++++++ .../controllers/keyboard_controller.c | 68 +++++++ lib/gamacon/src/components/fixed_to_cam.c | 53 ++++++ .../src/components/friction_component.c | 75 ++++++++ lib/gamacon/src/components/friction_giver.c | 56 ++++++ .../src/components/movable_component.c | 59 ++++++ .../src/components/parallax_component.c | 53 ++++++ lib/gamacon/src/components/renderer.c | 97 ++++++++++ .../src/components/renderers/anim_renderer.c | 102 ++++++++++ .../components/renderers/sprite_renderer.c | 56 ++++++ .../src/components/renderers/text_renderer.c | 40 ++++ .../src/components/transform_component.c | 65 +++++++ .../src/deserializer/deserialize_entity.c | 48 +++++ lib/gamacon/src/deserializer/prefab.c | 44 +++++ lib/gamacon/src/engine/discard_player.c | 18 ++ lib/gamacon/src/engine/engine.c | 89 +++++++++ .../src/engine/engine_component_builder.c | 44 +++++ lib/gamacon/src/engine/engine_dataloader.c | 22 +++ lib/gamacon/src/engine/engine_internal.c | 37 ++++ .../src/engine/engine_system_builder.c | 55 ++++++ lib/gamacon/src/entity/entity.c | 76 ++++++++ lib/gamacon/src/entity/entity_factory.c | 87 +++++++++ lib/gamacon/src/scene/scene.c | 72 +++++++ lib/gamacon/src/scene/scene_destroy.c | 49 +++++ lib/gamacon/src/scene/scene_loader.c | 52 ++++++ .../src/sfml_renderer/sfml_dataloaders.c | 57 ++++++ lib/gamacon/src/sfml_renderer/sfml_drawer.c | 69 +++++++ .../src/sfml_renderer/sfml_functions.c | 72 +++++++ .../src/sfml_renderer/sfml_music_player.c | 25 +++ .../src/sfml_renderer/texture_utility.c | 51 +++++ lib/gamacon/src/system.c | 61 ++++++ .../src/systems/camera_follow_system.c | 50 +++++ lib/gamacon/src/systems/collision_system.c | 71 +++++++ .../controllers/keyboard_controller_system.c | 44 +++++ .../src/systems/fixed_to_cam_pseudosystem.c | 59 ++++++ lib/gamacon/src/systems/friction_system.c | 46 +++++ lib/gamacon/src/systems/movable_system.c | 73 ++++++++ lib/gamacon/src/systems/parallax_system.c | 49 +++++ .../src/systems/sfml_renderer_system.c | 104 +++++++++++ lib/gamacon/src/utility/arraylen.c | 15 ++ lib/gamacon/src/utility/list.c | 29 +++ lib/gamacon/src/utility/my_realloc.c | 23 +++ lib/gamacon/src/utility/tupple.c | 60 ++++++ lib/gamacon/src/utility/vector2.c | 24 +++ lib/gamacon/tests/deserializations.c | 28 +++ lib/gamacon/tests/game.gcprefab | 75 ++++++++ lib/gamacon/tests/game_loop.c | 27 +++ lib/gamacon/tests/player.gcprefab | 13 ++ lib/my/Makefile | 62 ++++++ lib/my/alphanum_helper.o | Bin 0 -> 1704 bytes lib/my/big_hexa_formater.o | Bin 0 -> 2336 bytes lib/my/char_formater.o | Bin 0 -> 1592 bytes lib/my/float_formater.o | Bin 0 -> 1944 bytes lib/my/get_nbr_size.o | Bin 0 -> 1472 bytes lib/my/hexa_formater.o | Bin 0 -> 2328 bytes lib/my/include/formaters.h | 37 ++++ lib/my/include/my.h | 127 +++++++++++++ lib/my/index_of.o | Bin 0 -> 1280 bytes lib/my/int_formater.o | Bin 0 -> 2488 bytes lib/my/libmy.a | Bin 0 -> 122232 bytes lib/my/my/alphanum_helper.c | 24 +++ lib/my/my/index_of.c | 15 ++ lib/my/my/my_compute_factorial_it.c | 22 +++ lib/my/my/my_compute_factorial_rec.c | 25 +++ lib/my/my/my_compute_power_it.c | 29 +++ lib/my/my/my_compute_square_root.c | 22 +++ lib/my/my/my_evil_str.c | 28 +++ lib/my/my/my_find_prime_sup.c | 18 ++ lib/my/my/my_getnbr.c | 69 +++++++ lib/my/my/my_getnbr_base.c | 75 ++++++++ lib/my/my/my_is_prime.c | 26 +++ lib/my/my/my_isneg.c | 17 ++ lib/my/my/my_print_alpha.c | 16 ++ lib/my/my/my_print_comb.c | 46 +++++ lib/my/my/my_print_comb2.c | 36 ++++ lib/my/my/my_print_combn.c | 62 ++++++ lib/my/my/my_print_digits.c | 16 ++ lib/my/my/my_print_revalpha.c | 16 ++ lib/my/my/my_put_nbr.c | 30 +++ lib/my/my/my_putchar.c | 13 ++ lib/my/my/my_putlong_base.c | 38 ++++ lib/my/my/my_putnbr_base.c | 38 ++++ lib/my/my/my_putstr.c | 18 ++ lib/my/my/my_revstr.c | 21 +++ lib/my/my/my_show_words_array.c | 19 ++ lib/my/my/my_showmem.c | 74 ++++++++ lib/my/my/my_showstr.c | 33 ++++ lib/my/my/my_sort_int_array.c | 24 +++ lib/my/my/my_str_isalpha.c | 24 +++ lib/my/my/my_str_islower.c | 33 ++++ lib/my/my/my_str_isnum.c | 22 +++ lib/my/my/my_str_isprintable.c | 22 +++ lib/my/my/my_str_isupper.c | 22 +++ lib/my/my/my_str_to_word_array.c | 70 +++++++ lib/my/my/my_strcapitalize.c | 32 ++++ lib/my/my/my_strcat.c | 19 ++ lib/my/my/my_strchr.c | 17 ++ lib/my/my/my_strcmp.c | 25 +++ lib/my/my/my_strcpy.c | 16 ++ lib/my/my/my_strdup.c | 21 +++ lib/my/my/my_strlen.c | 14 ++ lib/my/my/my_strlowcase.c | 15 ++ lib/my/my/my_strncat.c | 19 ++ lib/my/my/my_strncmp.c | 25 +++ lib/my/my/my_strncpy.c | 21 +++ lib/my/my/my_strstr.c | 26 +++ lib/my/my/my_strupcase.c | 15 ++ lib/my/my/my_swap.c | 13 ++ lib/my/my/tostr.c | 60 ++++++ lib/my/my/utility.c | 20 ++ lib/my/my_compute_factorial_it.o | Bin 0 -> 1296 bytes lib/my/my_compute_factorial_rec.o | Bin 0 -> 1544 bytes lib/my/my_compute_power_it.o | Bin 0 -> 1320 bytes lib/my/my_compute_square_root.o | Bin 0 -> 1288 bytes lib/my/my_evil_str.o | Bin 0 -> 1640 bytes lib/my/my_find_prime_sup.o | Bin 0 -> 1448 bytes lib/my/my_getnbr.o | Bin 0 -> 2208 bytes lib/my/my_getnbr_base.o | Bin 0 -> 2632 bytes lib/my/my_is_prime.o | Bin 0 -> 1320 bytes lib/my/my_isneg.o | Bin 0 -> 1440 bytes lib/my/my_print_alpha.o | Bin 0 -> 1440 bytes lib/my/my_print_comb.o | Bin 0 -> 2056 bytes lib/my/my_print_comb2.o | Bin 0 -> 2048 bytes lib/my/my_print_combn.o | Bin 0 -> 2256 bytes lib/my/my_print_digits.o | Bin 0 -> 1440 bytes lib/my/my_print_revalpha.o | Bin 0 -> 1440 bytes lib/my/my_put_nbr.o | Bin 0 -> 1704 bytes lib/my/my_putchar.o | Bin 0 -> 1408 bytes lib/my/my_putlong_base.o | Bin 0 -> 1880 bytes lib/my/my_putlonglong_base.o | Bin 0 -> 2056 bytes lib/my/my_putnbr_base.o | Bin 0 -> 1848 bytes lib/my/my_putstr.o | Bin 0 -> 1440 bytes lib/my/my_revstr.o | Bin 0 -> 1760 bytes lib/my/my_show_words_array.o | Bin 0 -> 1552 bytes lib/my/my_showmem.o | Bin 0 -> 3256 bytes lib/my/my_showstr.o | Bin 0 -> 2136 bytes lib/my/my_sort_int_array.o | Bin 0 -> 1568 bytes lib/my/my_str_isalpha.o | Bin 0 -> 1544 bytes lib/my/my_str_islower.o | Bin 0 -> 1872 bytes lib/my/my_str_isnum.o | Bin 0 -> 1512 bytes lib/my/my_str_isprintable.o | Bin 0 -> 1528 bytes lib/my/my_str_isupper.o | Bin 0 -> 1520 bytes lib/my/my_str_to_word_array.o | Bin 0 -> 2776 bytes lib/my/my_strcapitalize.o | Bin 0 -> 1816 bytes lib/my/my_strcat.o | Bin 0 -> 1504 bytes lib/my/my_strchr.o | Bin 0 -> 1288 bytes lib/my/my_strcmp.o | Bin 0 -> 1392 bytes lib/my/my_strcpy.o | Bin 0 -> 1296 bytes lib/my/my_strdup.o | Bin 0 -> 1552 bytes lib/my/my_strlen.o | Bin 0 -> 1248 bytes lib/my/my_strlowcase.o | Bin 0 -> 1328 bytes lib/my/my_strncat.o | Bin 0 -> 1520 bytes lib/my/my_strncmp.o | Bin 0 -> 1424 bytes lib/my/my_strncpy.o | Bin 0 -> 1336 bytes lib/my/my_strstr.o | Bin 0 -> 1440 bytes lib/my/my_strupcase.o | Bin 0 -> 1328 bytes lib/my/my_swap.o | Bin 0 -> 1240 bytes lib/my/no_format.o | Bin 0 -> 1536 bytes lib/my/octal_formater.o | Bin 0 -> 2320 bytes lib/my/printf.o | Bin 0 -> 4488 bytes lib/my/printf_utility.o | Bin 0 -> 1808 bytes lib/my/ptr_formater.o | Bin 0 -> 1488 bytes lib/my/src/#printf.c# | 95 ++++++++++ lib/my/src/formaters/big_hexa_formater.c | 31 +++ lib/my/src/formaters/char_formater.c | 18 ++ lib/my/src/formaters/float_formater.c | 24 +++ lib/my/src/formaters/hexa_formater.c | 31 +++ lib/my/src/formaters/int_formater.c | 33 ++++ lib/my/src/formaters/no_format.c | 16 ++ lib/my/src/formaters/octal_formater.c | 31 +++ lib/my/src/formaters/ptr_formater.c | 19 ++ lib/my/src/formaters/string_formater.c | 23 +++ .../formaters/string_nonprintable_formater.c | 19 ++ lib/my/src/formaters/ubinary_formater.c | 29 +++ lib/my/src/formaters/uint_formater.c | 29 +++ lib/my/src/get_nbr_size.c | 24 +++ lib/my/src/my_putlonglong_base.c | 42 +++++ lib/my/src/printf.c | 95 ++++++++++ lib/my/src/printf_utility.c | 37 ++++ lib/my/string_formater.o | Bin 0 -> 1800 bytes lib/my/string_nonprintable_formater.o | Bin 0 -> 1520 bytes lib/my/tests/test_printf.c | 176 ++++++++++++++++++ lib/my/tostr.o | Bin 0 -> 2224 bytes lib/my/ubinary_formater.o | Bin 0 -> 2152 bytes lib/my/uint_formater.o | Bin 0 -> 2152 bytes lib/my/utility.o | Bin 0 -> 1456 bytes lib/quadtree/.gitignore | 3 + lib/quadtree/LICENSE | 21 +++ lib/quadtree/Makefile | 60 ++++++ lib/quadtree/include/array.h | 11 ++ lib/quadtree/include/quadtree.h | 54 ++++++ lib/quadtree/include/quadtree_internal.h | 30 +++ lib/quadtree/src/array.c | 27 +++ lib/quadtree/src/qt_collide.c | 79 ++++++++ lib/quadtree/src/qt_destroy.c | 25 +++ lib/quadtree/src/qt_layer.c | 23 +++ lib/quadtree/src/qt_position_overlap.c | 35 ++++ lib/quadtree/src/qt_split.c | 55 ++++++ lib/quadtree/src/quadtree.c | 98 ++++++++++ lib/quadtree/src/utility/calloc.c | 19 ++ lib/quadtree/tests/test_add.c | 41 ++++ lib/quadtree/tests/test_collide.c | 25 +++ lib/xmlparser/.gitignore | 3 + lib/xmlparser/LICENSE | 21 +++ lib/xmlparser/Makefile | 73 ++++++++ lib/xmlparser/README.md | 28 +++ lib/xmlparser/include/my.h | 123 ++++++++++++ lib/xmlparser/include/xml.h | 44 +++++ lib/xmlparser/include/xml_internal.h | 20 ++ lib/xmlparser/src/child.c | 38 ++++ lib/xmlparser/src/floatutils.c | 20 ++ lib/xmlparser/src/helper.c | 42 +++++ lib/xmlparser/src/list_utility.c | 24 +++ lib/xmlparser/src/parsenode.c | 100 ++++++++++ lib/xmlparser/src/rawnode.c | 26 +++ lib/xmlparser/src/strangeget.c | 41 ++++ lib/xmlparser/src/xml_destroy.c | 33 ++++ lib/xmlparser/src/xmlget.c | 76 ++++++++ lib/xmlparser/src/xmlparser.c | 93 +++++++++ lib/xmlparser/src/xmlproperties.c | 85 +++++++++ lib/xmlparser/tests/test_basics.c | 83 +++++++++ lib/xmlparser/tests/test_main.c | 19 ++ lib/xmlparser/tests/testprolog.txt | 6 + lib/xmlparser/tests/tests_realxml.c | 47 +++++ lib/xmlparser/tests/teststring.txt | 6 + 270 files changed, 8094 insertions(+) create mode 100644 .github/workflows/main.yml create mode 100644 .gitmodules create mode 100644 lib/gamacon/.gitignore create mode 100644 lib/gamacon/Makefile create mode 100644 lib/gamacon/include/component.h create mode 100644 lib/gamacon/include/components/camerafollow_component.h create mode 100644 lib/gamacon/include/components/collision_component.h create mode 100644 lib/gamacon/include/components/controllable_component.h create mode 100644 lib/gamacon/include/components/controllers/keyboard_controller.h create mode 100644 lib/gamacon/include/components/fixed_to_cam_component.h create mode 100644 lib/gamacon/include/components/friction_component.h create mode 100644 lib/gamacon/include/components/friction_giver.h create mode 100644 lib/gamacon/include/components/movable_component.h create mode 100644 lib/gamacon/include/components/parallax_component.h create mode 100644 lib/gamacon/include/components/renderer.h create mode 100644 lib/gamacon/include/components/transform_component.h create mode 100644 lib/gamacon/include/data.h create mode 100644 lib/gamacon/include/engine.h create mode 100644 lib/gamacon/include/entity.h create mode 100644 lib/gamacon/include/entity_factory.h create mode 100644 lib/gamacon/include/list.h create mode 100644 lib/gamacon/include/my.h create mode 100644 lib/gamacon/include/prefab.h create mode 100644 lib/gamacon/include/quadtree.h create mode 100644 lib/gamacon/include/read_line.h create mode 100644 lib/gamacon/include/scene.h create mode 100644 lib/gamacon/include/sfml_renderer.h create mode 100644 lib/gamacon/include/sprite.h create mode 100644 lib/gamacon/include/system.h create mode 100644 lib/gamacon/include/systems/camerafollow_system.h create mode 100644 lib/gamacon/include/systems/collision_system.h create mode 100644 lib/gamacon/include/systems/controllers/keyboard_controller_system.h create mode 100644 lib/gamacon/include/systems/friction_system.h create mode 100644 lib/gamacon/include/systems/movable_system.h create mode 100644 lib/gamacon/include/systems/parallax_system.h create mode 100644 lib/gamacon/include/systems/sfml_renderer_system.h create mode 100644 lib/gamacon/include/tags.h create mode 100644 lib/gamacon/include/text.h create mode 100644 lib/gamacon/include/tupple.h create mode 100644 lib/gamacon/include/utility.h create mode 100644 lib/gamacon/include/vector2.h create mode 100644 lib/gamacon/include/xml.h create mode 100644 lib/gamacon/src/component.c create mode 100644 lib/gamacon/src/components/camera_follow.c create mode 100644 lib/gamacon/src/components/collision_component.c create mode 100644 lib/gamacon/src/components/controllable_component.c create mode 100644 lib/gamacon/src/components/controllers/keyboard_controller.c create mode 100644 lib/gamacon/src/components/fixed_to_cam.c create mode 100644 lib/gamacon/src/components/friction_component.c create mode 100644 lib/gamacon/src/components/friction_giver.c create mode 100644 lib/gamacon/src/components/movable_component.c create mode 100644 lib/gamacon/src/components/parallax_component.c create mode 100644 lib/gamacon/src/components/renderer.c create mode 100644 lib/gamacon/src/components/renderers/anim_renderer.c create mode 100644 lib/gamacon/src/components/renderers/sprite_renderer.c create mode 100644 lib/gamacon/src/components/renderers/text_renderer.c create mode 100644 lib/gamacon/src/components/transform_component.c create mode 100644 lib/gamacon/src/deserializer/deserialize_entity.c create mode 100644 lib/gamacon/src/deserializer/prefab.c create mode 100644 lib/gamacon/src/engine/discard_player.c create mode 100644 lib/gamacon/src/engine/engine.c create mode 100644 lib/gamacon/src/engine/engine_component_builder.c create mode 100644 lib/gamacon/src/engine/engine_dataloader.c create mode 100644 lib/gamacon/src/engine/engine_internal.c create mode 100644 lib/gamacon/src/engine/engine_system_builder.c create mode 100644 lib/gamacon/src/entity/entity.c create mode 100644 lib/gamacon/src/entity/entity_factory.c create mode 100644 lib/gamacon/src/scene/scene.c create mode 100644 lib/gamacon/src/scene/scene_destroy.c create mode 100644 lib/gamacon/src/scene/scene_loader.c create mode 100644 lib/gamacon/src/sfml_renderer/sfml_dataloaders.c create mode 100644 lib/gamacon/src/sfml_renderer/sfml_drawer.c create mode 100644 lib/gamacon/src/sfml_renderer/sfml_functions.c create mode 100644 lib/gamacon/src/sfml_renderer/sfml_music_player.c create mode 100644 lib/gamacon/src/sfml_renderer/texture_utility.c create mode 100644 lib/gamacon/src/system.c create mode 100644 lib/gamacon/src/systems/camera_follow_system.c create mode 100644 lib/gamacon/src/systems/collision_system.c create mode 100644 lib/gamacon/src/systems/controllers/keyboard_controller_system.c create mode 100644 lib/gamacon/src/systems/fixed_to_cam_pseudosystem.c create mode 100644 lib/gamacon/src/systems/friction_system.c create mode 100644 lib/gamacon/src/systems/movable_system.c create mode 100644 lib/gamacon/src/systems/parallax_system.c create mode 100644 lib/gamacon/src/systems/sfml_renderer_system.c create mode 100644 lib/gamacon/src/utility/arraylen.c create mode 100644 lib/gamacon/src/utility/list.c create mode 100644 lib/gamacon/src/utility/my_realloc.c create mode 100644 lib/gamacon/src/utility/tupple.c create mode 100644 lib/gamacon/src/utility/vector2.c create mode 100644 lib/gamacon/tests/deserializations.c create mode 100644 lib/gamacon/tests/game.gcprefab create mode 100644 lib/gamacon/tests/game_loop.c create mode 100644 lib/gamacon/tests/player.gcprefab create mode 100644 lib/my/Makefile create mode 100644 lib/my/alphanum_helper.o create mode 100644 lib/my/big_hexa_formater.o create mode 100644 lib/my/char_formater.o create mode 100644 lib/my/float_formater.o create mode 100644 lib/my/get_nbr_size.o create mode 100644 lib/my/hexa_formater.o create mode 100644 lib/my/include/formaters.h create mode 100644 lib/my/include/my.h create mode 100644 lib/my/index_of.o create mode 100644 lib/my/int_formater.o create mode 100644 lib/my/libmy.a create mode 100644 lib/my/my/alphanum_helper.c create mode 100644 lib/my/my/index_of.c create mode 100644 lib/my/my/my_compute_factorial_it.c create mode 100644 lib/my/my/my_compute_factorial_rec.c create mode 100644 lib/my/my/my_compute_power_it.c create mode 100644 lib/my/my/my_compute_square_root.c create mode 100644 lib/my/my/my_evil_str.c create mode 100644 lib/my/my/my_find_prime_sup.c create mode 100755 lib/my/my/my_getnbr.c create mode 100644 lib/my/my/my_getnbr_base.c create mode 100644 lib/my/my/my_is_prime.c create mode 100644 lib/my/my/my_isneg.c create mode 100644 lib/my/my/my_print_alpha.c create mode 100644 lib/my/my/my_print_comb.c create mode 100644 lib/my/my/my_print_comb2.c create mode 100644 lib/my/my/my_print_combn.c create mode 100644 lib/my/my/my_print_digits.c create mode 100644 lib/my/my/my_print_revalpha.c create mode 100644 lib/my/my/my_put_nbr.c create mode 100644 lib/my/my/my_putchar.c create mode 100644 lib/my/my/my_putlong_base.c create mode 100644 lib/my/my/my_putnbr_base.c create mode 100644 lib/my/my/my_putstr.c create mode 100644 lib/my/my/my_revstr.c create mode 100644 lib/my/my/my_show_words_array.c create mode 100644 lib/my/my/my_showmem.c create mode 100644 lib/my/my/my_showstr.c create mode 100644 lib/my/my/my_sort_int_array.c create mode 100644 lib/my/my/my_str_isalpha.c create mode 100644 lib/my/my/my_str_islower.c create mode 100644 lib/my/my/my_str_isnum.c create mode 100644 lib/my/my/my_str_isprintable.c create mode 100644 lib/my/my/my_str_isupper.c create mode 100644 lib/my/my/my_str_to_word_array.c create mode 100644 lib/my/my/my_strcapitalize.c create mode 100644 lib/my/my/my_strcat.c create mode 100644 lib/my/my/my_strchr.c create mode 100644 lib/my/my/my_strcmp.c create mode 100644 lib/my/my/my_strcpy.c create mode 100644 lib/my/my/my_strdup.c create mode 100644 lib/my/my/my_strlen.c create mode 100644 lib/my/my/my_strlowcase.c create mode 100644 lib/my/my/my_strncat.c create mode 100644 lib/my/my/my_strncmp.c create mode 100644 lib/my/my/my_strncpy.c create mode 100644 lib/my/my/my_strstr.c create mode 100644 lib/my/my/my_strupcase.c create mode 100644 lib/my/my/my_swap.c create mode 100644 lib/my/my/tostr.c create mode 100644 lib/my/my/utility.c create mode 100644 lib/my/my_compute_factorial_it.o create mode 100644 lib/my/my_compute_factorial_rec.o create mode 100644 lib/my/my_compute_power_it.o create mode 100644 lib/my/my_compute_square_root.o create mode 100644 lib/my/my_evil_str.o create mode 100644 lib/my/my_find_prime_sup.o create mode 100644 lib/my/my_getnbr.o create mode 100644 lib/my/my_getnbr_base.o create mode 100644 lib/my/my_is_prime.o create mode 100644 lib/my/my_isneg.o create mode 100644 lib/my/my_print_alpha.o create mode 100644 lib/my/my_print_comb.o create mode 100644 lib/my/my_print_comb2.o create mode 100644 lib/my/my_print_combn.o create mode 100644 lib/my/my_print_digits.o create mode 100644 lib/my/my_print_revalpha.o create mode 100644 lib/my/my_put_nbr.o create mode 100644 lib/my/my_putchar.o create mode 100644 lib/my/my_putlong_base.o create mode 100644 lib/my/my_putlonglong_base.o create mode 100644 lib/my/my_putnbr_base.o create mode 100644 lib/my/my_putstr.o create mode 100644 lib/my/my_revstr.o create mode 100644 lib/my/my_show_words_array.o create mode 100644 lib/my/my_showmem.o create mode 100644 lib/my/my_showstr.o create mode 100644 lib/my/my_sort_int_array.o create mode 100644 lib/my/my_str_isalpha.o create mode 100644 lib/my/my_str_islower.o create mode 100644 lib/my/my_str_isnum.o create mode 100644 lib/my/my_str_isprintable.o create mode 100644 lib/my/my_str_isupper.o create mode 100644 lib/my/my_str_to_word_array.o create mode 100644 lib/my/my_strcapitalize.o create mode 100644 lib/my/my_strcat.o create mode 100644 lib/my/my_strchr.o create mode 100644 lib/my/my_strcmp.o create mode 100644 lib/my/my_strcpy.o create mode 100644 lib/my/my_strdup.o create mode 100644 lib/my/my_strlen.o create mode 100644 lib/my/my_strlowcase.o create mode 100644 lib/my/my_strncat.o create mode 100644 lib/my/my_strncmp.o create mode 100644 lib/my/my_strncpy.o create mode 100644 lib/my/my_strstr.o create mode 100644 lib/my/my_strupcase.o create mode 100644 lib/my/my_swap.o create mode 100644 lib/my/no_format.o create mode 100644 lib/my/octal_formater.o create mode 100644 lib/my/printf.o create mode 100644 lib/my/printf_utility.o create mode 100644 lib/my/ptr_formater.o create mode 100644 lib/my/src/#printf.c# create mode 100644 lib/my/src/formaters/big_hexa_formater.c create mode 100644 lib/my/src/formaters/char_formater.c create mode 100644 lib/my/src/formaters/float_formater.c create mode 100644 lib/my/src/formaters/hexa_formater.c create mode 100644 lib/my/src/formaters/int_formater.c create mode 100644 lib/my/src/formaters/no_format.c create mode 100644 lib/my/src/formaters/octal_formater.c create mode 100644 lib/my/src/formaters/ptr_formater.c create mode 100644 lib/my/src/formaters/string_formater.c create mode 100644 lib/my/src/formaters/string_nonprintable_formater.c create mode 100644 lib/my/src/formaters/ubinary_formater.c create mode 100644 lib/my/src/formaters/uint_formater.c create mode 100644 lib/my/src/get_nbr_size.c create mode 100644 lib/my/src/my_putlonglong_base.c create mode 100644 lib/my/src/printf.c create mode 100644 lib/my/src/printf_utility.c create mode 100644 lib/my/string_formater.o create mode 100644 lib/my/string_nonprintable_formater.o create mode 100644 lib/my/tests/test_printf.c create mode 100644 lib/my/tostr.o create mode 100644 lib/my/ubinary_formater.o create mode 100644 lib/my/uint_formater.o create mode 100644 lib/my/utility.o create mode 100644 lib/quadtree/.gitignore create mode 100644 lib/quadtree/LICENSE create mode 100644 lib/quadtree/Makefile create mode 100644 lib/quadtree/include/array.h create mode 100644 lib/quadtree/include/quadtree.h create mode 100644 lib/quadtree/include/quadtree_internal.h create mode 100644 lib/quadtree/src/array.c create mode 100644 lib/quadtree/src/qt_collide.c create mode 100644 lib/quadtree/src/qt_destroy.c create mode 100644 lib/quadtree/src/qt_layer.c create mode 100644 lib/quadtree/src/qt_position_overlap.c create mode 100644 lib/quadtree/src/qt_split.c create mode 100644 lib/quadtree/src/quadtree.c create mode 100644 lib/quadtree/src/utility/calloc.c create mode 100644 lib/quadtree/tests/test_add.c create mode 100644 lib/quadtree/tests/test_collide.c create mode 100644 lib/xmlparser/.gitignore create mode 100644 lib/xmlparser/LICENSE create mode 100644 lib/xmlparser/Makefile create mode 100644 lib/xmlparser/README.md create mode 100644 lib/xmlparser/include/my.h create mode 100644 lib/xmlparser/include/xml.h create mode 100644 lib/xmlparser/include/xml_internal.h create mode 100644 lib/xmlparser/src/child.c create mode 100644 lib/xmlparser/src/floatutils.c create mode 100644 lib/xmlparser/src/helper.c create mode 100644 lib/xmlparser/src/list_utility.c create mode 100644 lib/xmlparser/src/parsenode.c create mode 100644 lib/xmlparser/src/rawnode.c create mode 100644 lib/xmlparser/src/strangeget.c create mode 100644 lib/xmlparser/src/xml_destroy.c create mode 100644 lib/xmlparser/src/xmlget.c create mode 100644 lib/xmlparser/src/xmlparser.c create mode 100644 lib/xmlparser/src/xmlproperties.c create mode 100644 lib/xmlparser/tests/test_basics.c create mode 100644 lib/xmlparser/tests/test_main.c create mode 100644 lib/xmlparser/tests/testprolog.txt create mode 100644 lib/xmlparser/tests/tests_realxml.c create mode 100644 lib/xmlparser/tests/teststring.txt diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml new file mode 100644 index 0000000..92e62ae --- /dev/null +++ b/.github/workflows/main.yml @@ -0,0 +1,43 @@ +name: CI + +on: [push] + +jobs: + build: + + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v1 + with: + submodules: true + - name: Run a one-line script + run: | + mkdir -p ~/.ssh + echo -ne $SSH_PRIVATE_KEY >> ~/.ssh/blih + chmod 400 ~/.ssh/blih + find . -regex '.*\/\.git.*' -delete + ls -lRa + echo -ne "Host git.epitech.eu\n\tHostname git.epitech.eu\n\tUser git\n\tIdentityFile $(readlink -f ~/.ssh/blih)\n" >> ~/.ssh/config + git config --global user.email "tristan.roux@epitech.eu" + git config --global user.name "Tristan Roux" + ssh-keyscan git.epitech.eu >> ~/.ssh/known_hosts + git clone git@git.epitech.eu:/tristan.roux@epitech.eu/MUL_my_runner_2019 /tmp/blihRepo + echo cloneDone + export REPOVAR=`pwd` + cd /tmp/blihRepo + echo cdDone + find . -not -path "./.git*" -delete + echo findDone + cp -r $REPOVAR/* . + echo cpDone + ls -lRa + git add --all + echo addDone + git commit -m "Sync" + echo Commid + git push origin master + echo Pushed + env: + SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }} + TEST: ${{ secrets.TEST }} diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..c44da6a --- /dev/null +++ b/.gitmodules @@ -0,0 +1,9 @@ +[submodule "Gamacon"] + path = lib/gamacon + url = https://github.com/AnonymusRaccoon/Gamacon +[submodule "lib/quadtree"] + path = lib/quadtree + url = https://github.com/AnonymusRaccoon/Quadtree +[submodule "lib/xmlparser"] + path = lib/xmlparser + url = https://github.com/AnonymusRaccoon/xmlParser diff --git a/lib/gamacon/.gitignore b/lib/gamacon/.gitignore new file mode 100644 index 0000000..d48d625 --- /dev/null +++ b/lib/gamacon/.gitignore @@ -0,0 +1,4 @@ +*.o +libgamacon.a +*.gcda +*.gcno \ No newline at end of file diff --git a/lib/gamacon/Makefile b/lib/gamacon/Makefile new file mode 100644 index 0000000..2ab9b7f --- /dev/null +++ b/lib/gamacon/Makefile @@ -0,0 +1,105 @@ +## +## EPITECH PROJECT, 2019 +## Gamacon +## File description: +## Makefile +## + +SRC = src/engine/engine.c \ + src/engine/engine_internal.c \ + src/engine/discard_player.c \ + src/engine/engine_dataloader.c \ + src/entity/entity.c \ + src/entity/entity_factory.c \ + src/component.c \ + src/components/movable_component.c \ + src/components/collision_component.c \ + src/components/transform_component.c \ + src/components/renderer.c \ + src/components/camera_follow.c \ + src/components/fixed_to_cam.c \ + src/components/parallax_component.c \ + src/components/controllable_component.c \ + src/components/friction_component.c \ + src/components/friction_giver.c \ + src/components/controllers/keyboard_controller.c \ + src/components/renderers/sprite_renderer.c \ + src/components/renderers/anim_renderer.c \ + src/components/renderers/text_renderer.c \ + src/scene/scene.c \ + src/scene/scene_loader.c \ + src/scene/scene_destroy.c \ + src/utility/arraylen.c \ + src/utility/list.c \ + src/utility/tupple.c \ + src/deserializer/deserialize_entity.c \ + src/deserializer/prefab.c \ + src/system.c \ + src/systems/sfml_renderer_system.c \ + src/systems/movable_system.c \ + src/systems/camera_follow_system.c \ + src/systems/collision_system.c \ + src/systems/parallax_system.c \ + src/systems/controllers/keyboard_controller_system.c \ + src/systems/friction_system.c \ + src/systems/fixed_to_cam_pseudosystem.c \ + src/engine/engine_system_builder.c \ + src/engine/engine_component_builder.c \ + src/utility/vector2.c \ + src/utility/my_realloc.c \ + src/sfml_renderer/sfml_dataloaders.c \ + src/sfml_renderer/sfml_music_player.c \ + src/sfml_renderer/texture_utility.c \ + src/sfml_renderer/sfml_drawer.c \ + src/sfml_renderer/sfml_functions.c + +OBJ = $(SRC:%.c=%.o) + +GCDA = *.gcda + +GCNO = *.gcno + +TESTS = tests/deserializations.c \ + tests/game_loop.c + +INCLUDE = -I ./include + +CFLAGS = $(INCLUDE) -Wall -Wshadow -Wextra + +LDFLAGS = -L ../my -L ../xmlparser -L ../quadtree\ +-lxmlparser -lquadtree -lmy -lcsfml-system -lcsfml-graphics -lcsfml-window -lm + +COVERAGE = --coverage -lcriterion + +NAME = libgamacon.a + +UT = ./ut + +CC = gcc + +AR = ar rc + +all: build + +build: $(OBJ) + $(AR) $(NAME) $(OBJ) + +tests_run: + $(CC) -o $(UT) $(SRC) $(TESTS) $(COVERAGE) $(CFLAGS) $(LDFLAGS) + $(UT) + +clean: + $(RM) $(OBJ) + $(RM) $(GCDA) + $(RM) $(GCNO) + +fclean: clean + $(RM) $(NAME) + $(RM) $(UT) + +re: fclean all + +dbg: CFLAGS += -g +dbg: re + +.PHONY: all build clean fclean \ No newline at end of file diff --git a/lib/gamacon/include/component.h b/lib/gamacon/include/component.h new file mode 100644 index 0000000..690fd89 --- /dev/null +++ b/lib/gamacon/include/component.h @@ -0,0 +1,36 @@ +/* +** EPITECH PROJECT, 2019 +** Gamacon +** File description: +** component +*/ + +typedef struct gc_component gc_component; + +#pragma once + +#include +#include "engine.h" +#include "entity.h" + +struct gc_component +{ + char *name; + unsigned size; + char **dependencies; + void (*ctr)(void *component, va_list); + void (*fdctr)(gc_entity *entity, gc_scene *scene, void *component, node *n); + void (*dtr)(void *component); + char *(*serialize)(void *component); + void (*destroy)(void *component); + + gc_component *next; + gc_component *prev; +}; + +void *new_component(const void *component, ...); +void component_destroy(void *component); +gc_component *component_remove(gc_component *cmp, const char *name); + +#define GETCMP(x) ((struct x *)entity->get_component(entity, #x)) +#define GETCOLCMP(x) ((struct x *)entity_get_component(entity_get(engine->scene, id), #x)) \ No newline at end of file diff --git a/lib/gamacon/include/components/camerafollow_component.h b/lib/gamacon/include/components/camerafollow_component.h new file mode 100644 index 0000000..11d50a9 --- /dev/null +++ b/lib/gamacon/include/components/camerafollow_component.h @@ -0,0 +1,12 @@ +/* +** EPITECH PROJECT, 2019 +** Gamacon +** File description: +** movable_component +*/ + +#pragma once + +#include "component.h" + +extern const gc_component camerafollow_component; \ No newline at end of file diff --git a/lib/gamacon/include/components/collision_component.h b/lib/gamacon/include/components/collision_component.h new file mode 100644 index 0000000..a1145da --- /dev/null +++ b/lib/gamacon/include/components/collision_component.h @@ -0,0 +1,30 @@ +/* +** EPITECH PROJECT, 2020 +** Twac +** File description: +** collision_component +*/ + +#pragma once + +#include "engine.h" +#include "entity.h" +#include + +struct collision_component +{ + gc_component base; + float distance_down; + float distance_top; + float distance_left; + float distance_right; + int layer; + void (**on_collide)(gc_engine *engine, gc_entity *entity, int id); + int collide_size; +}; + +typedef void (*collide_listener)(gc_engine *, gc_entity *, int); + +void add_on_collide(struct collision_component *, collide_listener); + +extern const struct collision_component collision_component; \ No newline at end of file diff --git a/lib/gamacon/include/components/controllable_component.h b/lib/gamacon/include/components/controllable_component.h new file mode 100644 index 0000000..0498b49 --- /dev/null +++ b/lib/gamacon/include/components/controllable_component.h @@ -0,0 +1,21 @@ +/* +** EPITECH PROJECT, 2019 +** Gamacon +** File description: +** movable_component +*/ + +#pragma once + +#include "component.h" +#include + +struct controllable_component +{ + gc_component base; + bool moving_left; + bool moving_right; + bool jumping; +}; + +extern const struct controllable_component controllable_component; \ No newline at end of file diff --git a/lib/gamacon/include/components/controllers/keyboard_controller.h b/lib/gamacon/include/components/controllers/keyboard_controller.h new file mode 100644 index 0000000..294fee0 --- /dev/null +++ b/lib/gamacon/include/components/controllers/keyboard_controller.h @@ -0,0 +1,21 @@ +/* +** EPITECH PROJECT, 2019 +** Gamacon +** File description: +** keyboard_component +*/ + +#pragma once + +#include "component.h" +#include + +struct keyboard_controller +{ + gc_component base; + int left_key; + int right_key; + int jump_key; +}; + +extern const struct keyboard_controller keyboard_controller; \ No newline at end of file diff --git a/lib/gamacon/include/components/fixed_to_cam_component.h b/lib/gamacon/include/components/fixed_to_cam_component.h new file mode 100644 index 0000000..9e2d794 --- /dev/null +++ b/lib/gamacon/include/components/fixed_to_cam_component.h @@ -0,0 +1,19 @@ +/* +** EPITECH PROJECT, 2019 +** Gamacon +** File description: +** movable_component +*/ + +#pragma once + +#include "component.h" +#include "vector2.h" + +struct fixed_to_cam +{ + gc_component base; + gc_vector2 offset; +}; + +extern const struct fixed_to_cam fixed_to_cam; \ No newline at end of file diff --git a/lib/gamacon/include/components/friction_component.h b/lib/gamacon/include/components/friction_component.h new file mode 100644 index 0000000..2afa367 --- /dev/null +++ b/lib/gamacon/include/components/friction_component.h @@ -0,0 +1,19 @@ +/* +** EPITECH PROJECT, 2019 +** Gamacon +** File description: +** gravity_component +*/ + +#pragma once + +#include "component.h" + +struct friction_component +{ + gc_component base; + int value; + int default_value; +}; + +extern const struct friction_component friction_component; \ No newline at end of file diff --git a/lib/gamacon/include/components/friction_giver.h b/lib/gamacon/include/components/friction_giver.h new file mode 100644 index 0000000..5b584b0 --- /dev/null +++ b/lib/gamacon/include/components/friction_giver.h @@ -0,0 +1,18 @@ +/* +** EPITECH PROJECT, 2020 +** Twac +** File description: +** friction_giver +*/ + +#pragma once + +#include "component.h" + +struct friction_giver +{ + gc_component base; + int value; +}; + +extern const struct friction_giver friction_giver; \ No newline at end of file diff --git a/lib/gamacon/include/components/movable_component.h b/lib/gamacon/include/components/movable_component.h new file mode 100644 index 0000000..f2a3866 --- /dev/null +++ b/lib/gamacon/include/components/movable_component.h @@ -0,0 +1,20 @@ +/* +** EPITECH PROJECT, 2019 +** Gamacon +** File description: +** movable_component +*/ + +#pragma once + +#include "component.h" +#include + +struct movable_component +{ + gc_component base; + gc_vector2 acceleration; + gc_vector2 velocity; +}; + +extern const struct movable_component movable_component; \ No newline at end of file diff --git a/lib/gamacon/include/components/parallax_component.h b/lib/gamacon/include/components/parallax_component.h new file mode 100644 index 0000000..21cb07f --- /dev/null +++ b/lib/gamacon/include/components/parallax_component.h @@ -0,0 +1,19 @@ +/* +** EPITECH PROJECT, 2019 +** Gamacon +** File description: +** parallax_component +*/ + +#pragma once + +#include "component.h" + +struct parallax_component +{ + gc_component base; + gc_vector2 old_pos; + float speed; +}; + +extern const struct parallax_component parallax_component; \ No newline at end of file diff --git a/lib/gamacon/include/components/renderer.h b/lib/gamacon/include/components/renderer.h new file mode 100644 index 0000000..7b25f30 --- /dev/null +++ b/lib/gamacon/include/components/renderer.h @@ -0,0 +1,37 @@ +/* +** EPITECH PROJECT, 2019 +** MUL_my_runner_2019 +** File description: +** texture_renderer +*/ + +#pragma once + +#include "component.h" +#include "vector2.h" + +typedef enum GC_TEXTURETYPE { + GC_NONE, + GC_TEXTUREREND, + GC_ANIMREND, + GC_TXTREND +} GC_TEXTURETYPE; + +struct renderer +{ + gc_component base; + enum GC_TEXTURETYPE type; + void *data; +}; + +void sprite_ctr(struct renderer *cmp, va_list args); +void sprite_fdctr(gc_scene *scene, struct renderer *cmp, node *n); + +void anim_ctr(struct renderer *cmp, va_list args); +void anim_fdctr(gc_scene *scene, struct renderer *cmp, node *n); +void rend_set_anim(struct renderer *rend, const char *name); + +void text_ctr(struct renderer *cmp, va_list args); +void text_fdctr(gc_scene *scene, struct renderer *cmp, node *n); + +extern const struct renderer renderer_component; \ No newline at end of file diff --git a/lib/gamacon/include/components/transform_component.h b/lib/gamacon/include/components/transform_component.h new file mode 100644 index 0000000..675a37f --- /dev/null +++ b/lib/gamacon/include/components/transform_component.h @@ -0,0 +1,20 @@ +/* +** EPITECH PROJECT, 2019 +** MUL_my_runner_2019 +** File description: +** position_component +*/ + +#pragma once + +#include "component.h" +#include "vector2.h" + +struct transform_component +{ + gc_component base; + gc_vector2 position; + gc_vector2 size; +}; + +extern const struct transform_component transform_component; \ No newline at end of file diff --git a/lib/gamacon/include/data.h b/lib/gamacon/include/data.h new file mode 100644 index 0000000..497d2a6 --- /dev/null +++ b/lib/gamacon/include/data.h @@ -0,0 +1,27 @@ +/* +** EPITECH PROJECT, 2020 +** Twac +** File description: +** data +*/ + +#pragma once + +#include "xml.h" + +typedef struct gc_data gc_data; +struct gc_data +{ + char *type; + char *name; + void *custom; + void (*destroy)(gc_data *data); +}; + +typedef int (*gc_loader)(gc_data *data, node *n); + +typedef struct gc_dataloader +{ + char *type; + gc_loader load; +} gc_dataloader; \ No newline at end of file diff --git a/lib/gamacon/include/engine.h b/lib/gamacon/include/engine.h new file mode 100644 index 0000000..8b1ee46 --- /dev/null +++ b/lib/gamacon/include/engine.h @@ -0,0 +1,71 @@ +/* +** EPITECH PROJECT, 2019 +** Gamacon +** File description: +** engine +*/ +typedef struct gc_engine gc_engine; + +#pragma once + +#include "xml.h" +#include "scene.h" +#include "vector2.h" +#include "system.h" +#include "list.h" +#include "data.h" +#include + +struct gc_engine +{ + gc_scene *scene; + bool should_close; + bool (*is_open)(gc_engine *engine); + bool (*has_focus)(gc_engine *engine); + bool (*is_keypressed)(int key); + void (*handle_events)(gc_engine *engine); + int (*game_loop)(gc_engine *engine, float dtime); + void (*draw)(gc_engine *engine); + int (*change_scene)(gc_engine *engine, gc_scene *scene); + void (*destroy)(gc_engine *engine); + + gc_list *systems; + void (*add_system)(gc_engine *engine, const void *system); + void *(*get_system)(gc_engine *engine, const char *name); + void (*finish_physics)(gc_engine *engine); + + gc_list *components; + void (*add_component)(gc_engine *engine, const void *component); + const void *(*get_component)(gc_engine *engine, const char *name); + + void (*play_music)(void *music); + void (*stop_music)(gc_engine *engine); + + gc_list *dataloaders; + void (*add_dataloader)(gc_engine *engine, char *type, gc_loader loader); +}; + +gc_engine *engine_create(void); +bool engine_is_open(gc_engine *engine); +bool engine_has_focus(gc_engine *engine); +bool engine_is_keypressed(int key); +void handle_events(gc_engine *engine); +void engine_draw(gc_engine *engine); +void engine_play_music(void *music); +void engine_stop_music(gc_engine *engine); + +int change_scene(gc_engine *engine, gc_scene *scene); + +void engine_add_buildin_systems(gc_engine *engine); +void *engine_get_system(gc_engine *engine, const char *name); +void engine_add_system(gc_engine *engine, const void *system); + +void engine_add_buildin_components(gc_engine *engine); +const void *engine_get_component(gc_engine *engine, const char *name); +void engine_add_component(gc_engine *engine, const void *component); + +void engine_add_dataloader(gc_engine *engine, char *type, gc_loader loader); + +int engine_use_sfml(gc_engine *engine, const char *title, int framerate); + +#define GETSYS(x) ((struct x *)engine->get_system(engine, #x)) \ No newline at end of file diff --git a/lib/gamacon/include/entity.h b/lib/gamacon/include/entity.h new file mode 100644 index 0000000..27ed8c3 --- /dev/null +++ b/lib/gamacon/include/entity.h @@ -0,0 +1,37 @@ +/* +** EPITECH PROJECT, 2019 +** Gamacon +** File description: +** entity +*/ + +typedef struct gc_entity gc_entity; + +#pragma once + +#include "component.h" +#include "vector2.h" +#include + +struct gc_entity +{ + int id; + gc_component *components; + gc_entity *(*add_component)(gc_entity *entity, void *component); + void *(*get_component)(const gc_entity *entity, const char *name); + bool (*has_component)(const gc_entity *entity, const char *name); + void (*remove_component)(const gc_scene *scene, const gc_entity *entity, \ +const char *name); + char *(*serialize)(gc_entity *entity, int fd); + void (*destroy)(gc_entity *entity); +}; + +gc_entity *entity_create(void); +gc_entity *entity_create_with_id(int id); +gc_entity *entity_get(gc_scene *scene, int id); +int entity_add(gc_scene *scene, gc_entity *entity); +gc_entity *entity_add_component(gc_entity *entity, void *component); +void *entity_get_component(const gc_entity *entity, const char *name); +void entity_remove_component(const gc_scene *scene, const gc_entity *entity, \ +const char *name); +char *entity_serialize(gc_entity *entity, int fd); \ No newline at end of file diff --git a/lib/gamacon/include/entity_factory.h b/lib/gamacon/include/entity_factory.h new file mode 100644 index 0000000..c35a2e6 --- /dev/null +++ b/lib/gamacon/include/entity_factory.h @@ -0,0 +1,9 @@ +/* +** EPITECH PROJECT, 2019 +** MUL_my_runner_2019 +** File description: +** entity_factory +*/ + +#pragma once + diff --git a/lib/gamacon/include/list.h b/lib/gamacon/include/list.h new file mode 100644 index 0000000..1a5f3fb --- /dev/null +++ b/lib/gamacon/include/list.h @@ -0,0 +1,18 @@ +/* +** EPITECH PROJECT, 2019 +** MUL_my_runner_2019 +** File description: +** list +*/ + +typedef struct gc_list gc_list; + +#pragma once + +struct gc_list +{ + void *data; + gc_list *next; +}; + +gc_list *list_add(gc_list *list, void *obj); \ No newline at end of file diff --git a/lib/gamacon/include/my.h b/lib/gamacon/include/my.h new file mode 100644 index 0000000..dc4a2d5 --- /dev/null +++ b/lib/gamacon/include/my.h @@ -0,0 +1,125 @@ +/* +** EPITECH PROJECT, 2019 +** My lib +** File description: +** Header file +*/ +#pragma once + +int my_str_islower_or_num(const char *str); + +int my_printf(const char *str, ...); + +int count_valid_queens_placements(int n); + +char *my_strchr(const char *str, char c); + +int my_compute_power_it(int n, int p); + +int my_compute_power_rec(int n, int p); + +int my_compute_factorial_it(int n); + +int my_compute_factorial_rec(int n); + +int my_compute_square_root(int n); + +char *my_evil_str(char *str); + +int my_find_prime_sup(int n); + +int my_getnbr_base(const char *str, const char *base); + +int my_getnbr(const char *str); + +int my_isneg(int n); + +int my_is_prime(int n); + +void my_print_alpha(void); + +void my_print_comb2(void); + +void my_print_combn(int n); + +void my_print_comb(void); + +void my_print_digits(void); + +void my_print_revalpha(void); + +void my_putchar(char c); + +void my_putlong_base(long n, const char *base); + +void my_putnbr_base(int n, const char *base); + +void my_put_nbr(int n); + +void my_putstr(const char *str); + +void my_revstr(char *str); + +void my_showmem(const char *str); + +void my_showstr(const char *str); + +void my_sort_int_array(int *array); + +int is_letter(char c); + +int is_alpha(char c); + +int is_num(char c); + +int is_digit(char c); + +char *my_strcapitalize(char *str); + +char *my_strcat(char *dest, const char *src); + +int my_strcmp(const char *s1, const char *s2); + +char *my_strcpy(const char *str); + +int my_str_isalpha(const char *str); + +int is_lowercase(char c); + +int my_str_islower(const char *str); + +int my_str_isnum(const char *str); + +int is_printable(char c); +int my_str_isprintable(const char *str); + +int is_upper(char c); +int my_str_isupper(const char *str); + +int my_strlen(const char *str); + +int my_strlowcase(const char *str); + +char *my_strncat(char *dest, const char *src, int n); + +int my_strncmp(const char *s1, const char *s2, int n); + +char *my_strncpy(char *dest, const char *src, int n); + +char *my_strstr(const char *str, const char *to_find); + +int my_strupcase(const char *str); + +void my_swap(int *a, int *b); + +char *my_strdup(const char *str); + +char **my_str_to_word_array(const char *str); + +int my_show_word_array(const char **words); + +int is_alphanum(char c); + +int first_alphanum(const char *str); + +int index_of(const char *str, char c); \ No newline at end of file diff --git a/lib/gamacon/include/prefab.h b/lib/gamacon/include/prefab.h new file mode 100644 index 0000000..50d91f7 --- /dev/null +++ b/lib/gamacon/include/prefab.h @@ -0,0 +1,14 @@ +/* +** EPITECH PROJECT, 2019 +** MUL_my_runner_2019 +** File description: +** prefab +*/ + +#pragma once + +#include "entity.h" + +int prefab_load(gc_engine *engine, const char *path); +int prefab_loadentities(node *n, gc_engine *engine, gc_scene *scene); +gc_entity *deserialize_entity(gc_engine *engine, gc_scene *scene, node *n); \ No newline at end of file diff --git a/lib/gamacon/include/quadtree.h b/lib/gamacon/include/quadtree.h new file mode 100644 index 0000000..64d3d07 --- /dev/null +++ b/lib/gamacon/include/quadtree.h @@ -0,0 +1,54 @@ +/* +** EPITECH PROJECT, 2019 +** quadtree +** File description: +** quadtree +*/ + +#pragma once + +#include + +#define MAXCOL 1024 +#define MAX_ENTITY 20 + +typedef struct quadtree quadtree; + +typedef struct qt_intrect +{ + float x; + float y; + int h; + int w; +} qt_intrect; + +typedef struct qt_object +{ + int id; + qt_intrect rect; + int layer; +} qt_object; + +typedef struct qt_collision +{ + float distance_left; + float distance_right; + float distance_top; + float distance_down; + int *collide_with; +} qt_collision; + +struct quadtree +{ + qt_intrect rect; + int capacity; + void *objects; +}; + +quadtree *qt_create(qt_intrect rect, int capacity); +int qt_add(quadtree *tree, qt_object obj); +qt_collision collision_get_info(quadtree *tree, int entity_id); +bool qt_collide(qt_intrect r1, qt_intrect r2); +qt_object *qt_getobj(quadtree *tree, int id); +int qt_update(quadtree *tree, qt_object obj); +void qt_destroy(quadtree *tree); \ No newline at end of file diff --git a/lib/gamacon/include/read_line.h b/lib/gamacon/include/read_line.h new file mode 100644 index 0000000..ca47c6b --- /dev/null +++ b/lib/gamacon/include/read_line.h @@ -0,0 +1,12 @@ +/* +** EPITECH PROJECT, 2019 +** Read line +** File description: +** read_file +*/ + +#pragma once + +#define READ_SIZE 1000 + +char *read_line(int fd); \ No newline at end of file diff --git a/lib/gamacon/include/scene.h b/lib/gamacon/include/scene.h new file mode 100644 index 0000000..40dca58 --- /dev/null +++ b/lib/gamacon/include/scene.h @@ -0,0 +1,36 @@ +/* +** EPITECH PROJECT, 2019 +** Gamacon +** File description: +** scene +*/ +typedef struct gc_scene gc_scene; + +#pragma once + +#include "engine.h" +#include "entity.h" +#include "list.h" +#include "tupple.h" +#include + +struct gc_scene +{ + gc_list *data; + void *(*get_data)(gc_scene *scene, const char *type, const char *name); + + void (*destroy)(gc_scene *scene); + + gc_list *entities; + gc_tupple *entities_by_cmp; + int (*add_entity)(gc_scene *scene, gc_entity *entity); + gc_entity *(*get_entity)(gc_scene *scene, int id); + gc_list *(*get_entity_by_cmp)(gc_scene *scene, const char *cmp_name); +}; + +gc_scene *scene_create(gc_engine *engine, const char *mappath); +int scene_add_entity(gc_scene *scene, gc_entity *entity); +void scene_load_data(gc_engine *engine, gc_scene *scene, node *n); +void *scene_get_data(gc_scene *scene, const char *type, const char *name); +void scene_destroy(gc_scene *scene); +int scene_load_musics(gc_scene *scene, node *n); \ No newline at end of file diff --git a/lib/gamacon/include/sfml_renderer.h b/lib/gamacon/include/sfml_renderer.h new file mode 100644 index 0000000..b283ccf --- /dev/null +++ b/lib/gamacon/include/sfml_renderer.h @@ -0,0 +1,43 @@ +/* +** EPITECH PROJECT, 2020 +** Twac +** File description: +** sfml_renderer +*/ + +#pragma once + +#include +#include "scene.h" +#include "sprite.h" +#include "text.h" +#include "components/transform_component.h" +#include "systems/sfml_renderer_system.h" + +int sfml_music_loader(gc_data *data, node *n); +int sfml_sprite_loader(gc_data *data, node *n); +int sfml_font_loader(gc_data *data, node *n); + +sfTexture *get_texture(gc_scene *scene, char *name); + +void sfmlrenderer_draw_texture(struct sfml_renderer_system *renderer, \ +struct transform_component *tra, gc_sprite *sprite); +void sfmlrenderer_draw_anim(struct sfml_renderer_system *renderer, \ +struct transform_component *tra, gc_animholder *holder, float dtime); +void sfmlrenderer_draw_txt(struct sfml_renderer_system *renderer, \ +struct transform_component *tra, gc_text *txt); + +void sfml_texture_destroy(gc_data *data); +void sfml_music_destroy(gc_data *data); +void sfml_font_destroy(gc_data *data); + +bool sfml_is_open(gc_engine *engine); +bool sfml_has_focus(gc_engine *engine); +bool sfml_is_keypressed(int key); +void sfml_handle_events(gc_engine *engine); +void sfml_draw(gc_engine *engine); +void sfml_play_music(void *music); +void sfml_stop_music(gc_engine *engine); +void entities_update_to_cam(gc_scene *scene, \ +struct sfml_renderer_system *renderer, struct camerafollow_system *cam); +void entities_update_to_cam_size(gc_scene *scene, gc_vector2 size); diff --git a/lib/gamacon/include/sprite.h b/lib/gamacon/include/sprite.h new file mode 100644 index 0000000..51325a7 --- /dev/null +++ b/lib/gamacon/include/sprite.h @@ -0,0 +1,42 @@ +/* +** EPITECH PROJECT, 2019 +** MUL_my_runner_2019 +** File description: +** sprite +*/ + +#pragma once + +#include "vector2.h" +#include + +typedef struct gc_int_rect +{ + float height; + float width; + float top; + float left; +} gc_int_rect; + +typedef struct gc_sprite { + void *texture; + gc_int_rect rect; + gc_vector2 pos; + gc_vector2 scale; +} gc_sprite; + +typedef struct gc_anim { + char *name; + int frame_count; + float frame_rate; + gc_int_rect rect; +} gc_anim; + +typedef struct gc_animholder { + gc_sprite *sprite; + gc_anim *anims; + int animcount; + + gc_anim *current; + float timesince_up; +} gc_animholder; \ No newline at end of file diff --git a/lib/gamacon/include/system.h b/lib/gamacon/include/system.h new file mode 100644 index 0000000..1f3306b --- /dev/null +++ b/lib/gamacon/include/system.h @@ -0,0 +1,30 @@ +/* +** EPITECH PROJECT, 2019 +** Gamacon +** File description: +** system +*/ + +typedef struct gc_system gc_system; + +#pragma once + +#include "entity.h" +#include +#include + +struct gc_system +{ + const char *name; + const char *component_name; + size_t size; + void (*ctr)(void *system, va_list list); + void (*dtr)(void *system); + bool (*check_dependencies)(const gc_system *, const gc_entity *); + void (*update_entity)(gc_engine *, void *system, gc_entity *, float dtime); + void (*destroy)(void *system); +}; + +bool system_check_dependencies(const gc_system *sys, const gc_entity *entity); +void *new_system(const void *system, ...); +void system_destroy(void *system); \ No newline at end of file diff --git a/lib/gamacon/include/systems/camerafollow_system.h b/lib/gamacon/include/systems/camerafollow_system.h new file mode 100644 index 0000000..d6246ef --- /dev/null +++ b/lib/gamacon/include/systems/camerafollow_system.h @@ -0,0 +1,18 @@ +/* +** EPITECH PROJECT, 2019 +** Gamacon +** File description: +** movable_component +*/ + +#pragma once + +#include "component.h" + +struct camerafollow_system +{ + gc_system base; + gc_vector2 cam_pos; +}; + +extern const struct camerafollow_system camerafollow_system; \ No newline at end of file diff --git a/lib/gamacon/include/systems/collision_system.h b/lib/gamacon/include/systems/collision_system.h new file mode 100644 index 0000000..bbf567e --- /dev/null +++ b/lib/gamacon/include/systems/collision_system.h @@ -0,0 +1,20 @@ +/* +** EPITECH PROJECT, 2019 +** MUL_my_runner_2019 +** File description: +** movable_system +*/ + +#pragma once + +#include "system.h" +#include "quadtree.h" + +typedef struct gc_collision_system +{ + gc_system base; + quadtree *tree; + +} gc_collision_system; + +extern const gc_collision_system collision_system; \ No newline at end of file diff --git a/lib/gamacon/include/systems/controllers/keyboard_controller_system.h b/lib/gamacon/include/systems/controllers/keyboard_controller_system.h new file mode 100644 index 0000000..4ea1f3a --- /dev/null +++ b/lib/gamacon/include/systems/controllers/keyboard_controller_system.h @@ -0,0 +1,12 @@ +/* +** EPITECH PROJECT, 2019 +** MUL_my_runner_2019 +** File description: +** texture_renderer_system +*/ + +#pragma once + +#include "system.h" + +extern const gc_system keyboard_controller_system; \ No newline at end of file diff --git a/lib/gamacon/include/systems/friction_system.h b/lib/gamacon/include/systems/friction_system.h new file mode 100644 index 0000000..224fa4f --- /dev/null +++ b/lib/gamacon/include/systems/friction_system.h @@ -0,0 +1,12 @@ +/* +** EPITECH PROJECT, 2019 +** MUL_my_runner_2019 +** File description: +** texture_renderer_system +*/ + +#pragma once + +#include "system.h" + +extern const gc_system friction_system; \ No newline at end of file diff --git a/lib/gamacon/include/systems/movable_system.h b/lib/gamacon/include/systems/movable_system.h new file mode 100644 index 0000000..19d105d --- /dev/null +++ b/lib/gamacon/include/systems/movable_system.h @@ -0,0 +1,13 @@ +/* +** EPITECH PROJECT, 2019 +** MUL_my_runner_2019 +** File description: +** movable_system +*/ + +#pragma once + +#include "system.h" +#include "quadtree.h" + +extern const gc_system movable_system; \ No newline at end of file diff --git a/lib/gamacon/include/systems/parallax_system.h b/lib/gamacon/include/systems/parallax_system.h new file mode 100644 index 0000000..f614f52 --- /dev/null +++ b/lib/gamacon/include/systems/parallax_system.h @@ -0,0 +1,12 @@ +/* +** EPITECH PROJECT, 2019 +** MUL_my_runner_2019 +** File description: +** texture_renderer_system +*/ + +#pragma once + +#include "system.h" + +extern const gc_system parallax_system; \ No newline at end of file diff --git a/lib/gamacon/include/systems/sfml_renderer_system.h b/lib/gamacon/include/systems/sfml_renderer_system.h new file mode 100644 index 0000000..cea8cd0 --- /dev/null +++ b/lib/gamacon/include/systems/sfml_renderer_system.h @@ -0,0 +1,28 @@ +/* +** EPITECH PROJECT, 2019 +** MUL_my_runner_2019 +** File description: +** texture_renderer_system +*/ + +#pragma once + +#include "system.h" +#include +#include "scene.h" +#include "systems/sfml_renderer_system.h" +#include "systems/camerafollow_system.h" + +struct sfml_renderer_system +{ + gc_system system; + sfRenderWindow *window; + sfSprite *sprite; + sfText *text; + sfView *view; +}; + +gc_system *gc_new_sfml_renderer(gc_engine *engine, \ +const char *title, int framerate); + +extern const struct sfml_renderer_system sfml_renderer; \ No newline at end of file diff --git a/lib/gamacon/include/tags.h b/lib/gamacon/include/tags.h new file mode 100644 index 0000000..718d73f --- /dev/null +++ b/lib/gamacon/include/tags.h @@ -0,0 +1,13 @@ +/* +** EPITECH PROJECT, 2019 +** Gamacon +** File description: +** tag +*/ + +#pragma once + +typedef enum tag +{ + none = 0 +} tag; \ No newline at end of file diff --git a/lib/gamacon/include/text.h b/lib/gamacon/include/text.h new file mode 100644 index 0000000..330f861 --- /dev/null +++ b/lib/gamacon/include/text.h @@ -0,0 +1,14 @@ +/* +** EPITECH PROJECT, 2020 +** Twac +** File description: +** text +*/ + +#pragma once + +typedef struct gc_text +{ + char *text; + void *font; +} gc_text; \ No newline at end of file diff --git a/lib/gamacon/include/tupple.h b/lib/gamacon/include/tupple.h new file mode 100644 index 0000000..c300c6c --- /dev/null +++ b/lib/gamacon/include/tupple.h @@ -0,0 +1,23 @@ +/* +** EPITECH PROJECT, 2019 +** MUL_my_runner_2019 +** File description: +** tupple +*/ + +typedef struct gc_tupple gc_tupple; + +#pragma once + +#include "list.h" +#include "entity.h" + +struct gc_tupple +{ + char *name; + gc_list *entities; + gc_tupple *next; +}; + +gc_tupple *tupple_add(gc_tupple *list, const char *name, gc_entity *entity); +void tup_remove(gc_tupple *tup, int id); \ No newline at end of file diff --git a/lib/gamacon/include/utility.h b/lib/gamacon/include/utility.h new file mode 100644 index 0000000..f5fa19e --- /dev/null +++ b/lib/gamacon/include/utility.h @@ -0,0 +1,38 @@ +/* +** EPITECH PROJECT, 2019 +** MUL_my_runner_2019 +** File description: +** utility +*/ + +#pragma once + +#include + +char *my_strdup(const char *src); +int my_printf(const char *fmt, ...); +int my_strlen(const char *str); +int arraylen(const char **array); +char *tostr(int n); +int my_atoi(const char *str); +int my_strcmp(const char *str1, const char *str2); +int my_strncmp(const char *str1, const char *str2, int n); +char *my_strchr(const char *str, char c); +int parse_arg_int(char **str); +float parse_arg_float(char **str); +char *parse_arg_str(char **str); +int my_pow(int nb, int p); +int my_sqrt(int nb); +void *my_realloc(void *oldptr, size_t oldsize, size_t newsize); + +#define MIN(x, y) ((x) < (y) ? (x) : (y)) +#define MAX(x, y) ((x) > (y) ? (x) : (y)) + +#define CLAMP(x, y) (((x) > (y)) ? ((x) = (y)) : (x)) +#define NCLAMP(x, y) (((x) < (y)) ? ((x) = (y)) : (x)) +#define ABSCLAMP(x, y) (((x) > 0) ? CLAMP((x), (y)) : NCLAMP((x), -(y))) + +#define GETSIGN(x) (((x) < 0) ? (-1) : (1)) +#define SET_SIGN(x, s) (x = (x) * (s) > 0 ? (x) : ((x) * (-1))) + +#define ABS(x) ((x) > 0 ? (x) : -(x)) \ No newline at end of file diff --git a/lib/gamacon/include/vector2.h b/lib/gamacon/include/vector2.h new file mode 100644 index 0000000..7071ed4 --- /dev/null +++ b/lib/gamacon/include/vector2.h @@ -0,0 +1,17 @@ +/* +** EPITECH PROJECT, 2019 +** Gamacon +** File description: +** vector2 +*/ + +#pragma once + +typedef struct gc_vector2 +{ + float x; + float y; +} gc_vector2; + +float gcvector_magnitude(gc_vector2 vec); +gc_vector2 gcvector2_normilize(gc_vector2 vec); \ No newline at end of file diff --git a/lib/gamacon/include/xml.h b/lib/gamacon/include/xml.h new file mode 100644 index 0000000..389ddb3 --- /dev/null +++ b/lib/gamacon/include/xml.h @@ -0,0 +1,44 @@ +/* +** EPITECH PROJECT, 2019 +** MUL_my_runner_2019 +** File description: +** xml +*/ + +typedef struct node node; +typedef struct dictionary dictionary; + +#pragma once + +#include +#include + +struct dictionary +{ + char *key; + char *value; + + dictionary *next; +}; + +struct node +{ + char *name; + dictionary *properties; + node *child; + + node *next; +}; + +node *xml_parse(const char *path); +node *xml_getnode(node *parent, const char *name); +bool xml_hasproperty(node *n, const char *key); +char *xml_getproperty(node *n, const char *key); +char *xml_gettempprop(node *n, const char *key); +int xml_getintprop(node *n, const char *key); +int xml_getbinaprop(node *n, const char *key); +int xml_gethexaprop(node *n, const char *key); +float xml_getfloatprop(node *n, const char *key); +int xml_getchildcount(node *n); +int xml_getchildcount_filtered(node *n, char *name); +void xml_destroy(node *n); \ No newline at end of file diff --git a/lib/gamacon/src/component.c b/lib/gamacon/src/component.c new file mode 100644 index 0000000..1764083 --- /dev/null +++ b/lib/gamacon/src/component.c @@ -0,0 +1,62 @@ +/* +** EPITECH PROJECT, 2019 +** Gamacon +** File description: +** component +*/ + +#include "component.h" +#include "components/transform_component.h" +#include "components/movable_component.h" +#include "components/renderer.h" +#include "components/parallax_component.h" +#include "utility.h" +#include + +const void *engine_get_component(gc_engine *engine, const char *name) +{ + for (gc_list *cmp = engine->components; cmp; cmp = cmp->next) { + if (!my_strcmp(((const gc_component *)cmp->data)->name, name)) + return (cmp->data); + } + return (NULL); +} + +void *new_component(const void *component, ...) +{ + gc_component *base = (gc_component *)component; + va_list args; + void *new_cmp = malloc(base->size); + + if (!new_cmp) + return (NULL); + *(gc_component *)new_cmp = *base; + if (((gc_component *)new_cmp)->ctr) { + va_start(args, component); + ((gc_component *)new_cmp)->ctr(new_cmp, args); + va_end(args); + } + return (new_cmp); +} + +void component_destroy(void *component) +{ + gc_component *cmp = (gc_component *)component; + if (cmp->dtr) + cmp->dtr(component); + free(component); +} + +gc_component *component_remove(gc_component *cmp, const char *name) +{ + for (; cmp; cmp = cmp->next) { + if (my_strcmp(cmp->name, name)) + continue; + if (cmp->prev) + cmp->prev->next = cmp->next; + if (cmp->next) + cmp->next->prev = cmp->prev; + return (cmp); + } + return (NULL); +} \ No newline at end of file diff --git a/lib/gamacon/src/components/camera_follow.c b/lib/gamacon/src/components/camera_follow.c new file mode 100644 index 0000000..2e58aea --- /dev/null +++ b/lib/gamacon/src/components/camera_follow.c @@ -0,0 +1,52 @@ +/* +** EPITECH PROJECT, 2020 +** Twac +** File description: +** camera_follow +*/ + +#include "xml.h" +#include "component.h" +#include "components/controllable_component.h" +#include "components/camerafollow_component.h" +#include "utility.h" +#include + +static void ctr(void *component, va_list args) +{ + (void)component; + (void)args; +} + +static void fdctr(gc_entity *entity, gc_scene *scene, void *component, node *n) +{ + (void)scene; + (void)entity; + (void)component; + (void)n; +} + +static void dtr(void *component) +{ + (void)component; +} + +static char *serialize(void *component) +{ + (void)component; + return (NULL); +} + +const gc_component camerafollow_component = { + name: "camerafollow_component", + size: sizeof(struct gc_component), + dependencies: (char *[]){ + "transform_component", + NULL + }, + ctr: &ctr, + fdctr: &fdctr, + dtr: &dtr, + serialize: &serialize, + destroy: &component_destroy +}; \ No newline at end of file diff --git a/lib/gamacon/src/components/collision_component.c b/lib/gamacon/src/components/collision_component.c new file mode 100644 index 0000000..f05e2ce --- /dev/null +++ b/lib/gamacon/src/components/collision_component.c @@ -0,0 +1,79 @@ +/* +** EPITECH PROJECT, 2020 +** Twac +** File description: +** collision_component +*/ + +#include "xml.h" +#include "component.h" +#include "components/collision_component.h" +#include "utility.h" +#include + +static void ctr(void *component, va_list args) +{ + struct collision_component *cmp = (struct collision_component *)component; + + cmp->distance_down = 1024; + cmp->distance_top = 1024; + cmp->distance_left = 1024; + cmp->distance_right = 1024; + cmp->layer = va_arg(args, int); + cmp->on_collide = NULL; + cmp->collide_size = 0; +} + +static void fdctr(gc_entity *entity, gc_scene *scene, void *component, node *n) +{ + struct collision_component *cmp = (struct collision_component *)component; + cmp->distance_down = 1024; + cmp->distance_top = 1024; + cmp->distance_left = 1024; + cmp->distance_right = 1024; + cmp->layer = xml_getbinaprop(n, "layer"); + cmp->on_collide = NULL; + cmp->collide_size = 0; + (void)scene; + (void)entity; +} + +static void dtr(void *component) +{ + struct collision_component *cmp = (struct collision_component *)component; + + if (cmp->on_collide) + free(cmp->on_collide); +} + +static char *serialize(void *component) +{ + (void)component; + return (NULL); +} + +void add_on_collide(struct collision_component *col, collide_listener list) +{ + int old = col->collide_size; + + col->collide_size += sizeof(list); + col->on_collide = my_realloc(col->on_collide, old, col->collide_size); + if (!col->on_collide) { + col->collide_size = 0; + return; + } + col->on_collide[old / sizeof(void (*)())] = list; +} + +const struct collision_component collision_component = { + base: { + name: "collision_component", + size: sizeof(struct collision_component), + dependencies: (char *[]){"collision_component", NULL}, + ctr: &ctr, + fdctr: &fdctr, + dtr: &dtr, + serialize: &serialize, + destroy: &component_destroy + } +}; \ No newline at end of file diff --git a/lib/gamacon/src/components/controllable_component.c b/lib/gamacon/src/components/controllable_component.c new file mode 100644 index 0000000..62fa2fc --- /dev/null +++ b/lib/gamacon/src/components/controllable_component.c @@ -0,0 +1,68 @@ +/* +** EPITECH PROJECT, 2019 +** MUL_my_runner_2019 +** File description: +** controllable_component +*/ + +#include "xml.h" +#include "component.h" +#include "components/controllable_component.h" +#include "utility.h" +#include + +static void controllable_ctr(void *component, va_list args) +{ + struct controllable_component *cmp = (struct controllable_component *)\ +component; + + cmp->moving_left = false; + cmp->moving_right = false; + cmp->jumping = false; + (void)args; +} + +static void controllable_fdctr(gc_entity *entity, gc_scene *scene, \ +void *component, node *n) +{ + struct controllable_component *cmp = (struct controllable_component *)\ +component; + + cmp->moving_left = false; + cmp->moving_right = false; + cmp->jumping = false; + (void)scene; + (void)entity; + (void)n; +} + +static void controllable_dtr(void *component) +{ + (void)component; +} + +static char *controllable_serialize(void *component) +{ + (void)component; + return (NULL); +} + +const struct controllable_component controllable_component = { + base: { + name: "controllable_component", + size: sizeof(struct controllable_component), + dependencies: (char *[]){ + "movable_component", + "transform_component", + NULL + }, + ctr: &controllable_ctr, + fdctr: &controllable_fdctr, + dtr: &controllable_dtr, + serialize: &controllable_serialize, + destroy: &component_destroy + }, + moving_left: false, + moving_right: false, + jumping: false +}; \ No newline at end of file diff --git a/lib/gamacon/src/components/controllers/keyboard_controller.c b/lib/gamacon/src/components/controllers/keyboard_controller.c new file mode 100644 index 0000000..9e07f2a --- /dev/null +++ b/lib/gamacon/src/components/controllers/keyboard_controller.c @@ -0,0 +1,68 @@ +/* +** EPITECH PROJECT, 2019 +** MUL_my_runner_2019 +** File description: +** keyboard_controller +*/ + + +#include "xml.h" +#include "component.h" +#include "components/controllable_component.h" +#include "components/controllers/keyboard_controller.h" +#include "utility.h" +#include + +static void ctr(void *component, va_list args) +{ + struct keyboard_controller *cmp = (struct keyboard_controller *)\ +component; + + cmp->left_key = va_arg(args, int); + cmp->right_key = va_arg(args, int); + cmp->jump_key = va_arg(args, int); +} + +static void fdctr(gc_entity *entity, gc_scene *scene, void *component, node *n) +{ + struct keyboard_controller *cmp = (struct keyboard_controller *)\ +component; + + cmp->left_key = xml_getintprop(n, "left"); + cmp->right_key = xml_getintprop(n, "right"); + cmp->jump_key = xml_getintprop(n, "jump"); + (void)scene; + (void)entity; +} + +static void dtr(void *component) +{ + (void)component; +} + +static char *serialize(void *component) +{ + (void)component; + return (NULL); +} + +const struct keyboard_controller keyboard_controller = { + base: { + name: "keyboard_controller", + size: sizeof(struct keyboard_controller), + dependencies: (char *[]){ + "movable_component", + "transform_component", + "controllable_component", + NULL + }, + ctr: &ctr, + fdctr: &fdctr, + dtr: &dtr, + serialize: &serialize, + destroy: &component_destroy + }, + left_key: 16, + right_key: 3, + jump_key: 57 +}; \ No newline at end of file diff --git a/lib/gamacon/src/components/fixed_to_cam.c b/lib/gamacon/src/components/fixed_to_cam.c new file mode 100644 index 0000000..7bcf6ab --- /dev/null +++ b/lib/gamacon/src/components/fixed_to_cam.c @@ -0,0 +1,53 @@ +/* +** EPITECH PROJECT, 2020 +** Twac +** File description: +** camera_follow +*/ + +#include "xml.h" +#include "component.h" +#include "components/fixed_to_cam_component.h" +#include "utility.h" +#include + +static void ctr(void *component, va_list args) +{ + struct fixed_to_cam *cmp = (struct fixed_to_cam *)component; + + cmp->offset = va_arg(args, gc_vector2); +} + +static void fdctr(gc_entity *entity, gc_scene *scene, void *component, node *n) +{ + struct fixed_to_cam *cmp = (struct fixed_to_cam *)component; + + n = xml_getnode(n, "Position"); + cmp->offset.x = xml_getintprop(n, "x"); + cmp->offset.y = xml_getintprop(n, "y"); + (void)scene; + (void)entity; +} + +static char *serialize(void *component) +{ + (void)component; + return (NULL); +} + +const struct fixed_to_cam fixed_to_cam = { + base: { + name: "fixed_to_cam", + size: sizeof(struct fixed_to_cam), + dependencies: (char *[]){ + "transform_component", + NULL + }, + ctr: &ctr, + fdctr: &fdctr, + dtr: NULL, + serialize: &serialize, + destroy: &component_destroy + }, + offset: (gc_vector2){0, 0} +}; \ No newline at end of file diff --git a/lib/gamacon/src/components/friction_component.c b/lib/gamacon/src/components/friction_component.c new file mode 100644 index 0000000..5a14b63 --- /dev/null +++ b/lib/gamacon/src/components/friction_component.c @@ -0,0 +1,75 @@ +/* +** EPITECH PROJECT, 2019 +** MUL_my_runner_2019 +** File description: +** friction_component +*/ + +#include "xml.h" +#include "component.h" +#include "components/friction_component.h" +#include "components/friction_giver.h" +#include "components/collision_component.h" +#include "utility.h" +#include + +static void on_collide(gc_engine *engine, gc_entity *entity, int id) +{ + struct friction_component *fric = GETCMP(friction_component); + struct friction_giver *f = GETCOLCMP(friction_giver); + + if (!f) + return; + fric->value = f->value; +} + +static void ctr(void *component, va_list args) +{ + struct friction_component *cmp = (struct friction_component *)component; + + cmp->value = va_arg(args, int); + cmp->default_value = cmp->value; +} + +static void fdctr(gc_entity *entity, gc_scene *scene, void *component, node *n) +{ + struct friction_component *cmp = (struct friction_component *)component; + struct collision_component *col = GETCMP(collision_component); + + cmp->value = xml_getfloatprop(n, "value"); + cmp->default_value = cmp->value; + if (!col) + return ((void)my_printf("Collision not yet setup, you should place the \ +friction component after the collision component.\n")); + add_on_collide(col, &on_collide); + (void)scene; +} + +static void dtr(void *component) +{ + (void)component; +} + +static char *serialize(void *component) +{ + (void)component; + return (NULL); +} + +const struct friction_component friction_component = { + base: { + name: "friction_component", + size: sizeof(struct friction_component), + dependencies: (char *[]){ + "movable_component", + "transform_component", + NULL + }, + ctr: &ctr, + fdctr: &fdctr, + dtr: &dtr, + serialize: &serialize, + destroy: &component_destroy + }, + value: 10 +}; \ No newline at end of file diff --git a/lib/gamacon/src/components/friction_giver.c b/lib/gamacon/src/components/friction_giver.c new file mode 100644 index 0000000..6b2358d --- /dev/null +++ b/lib/gamacon/src/components/friction_giver.c @@ -0,0 +1,56 @@ +/* +** EPITECH PROJECT, 2020 +** Twac +** File description: +** friction_giver +*/ + +#include "xml.h" +#include "entity.h" +#include "scene.h" +#include "components/friction_giver.h" + +static void ctr(void *component, va_list args) +{ + struct friction_giver *cmp = (struct friction_giver *)component; + + cmp->value = va_arg(args, double); +} + +static void fdctr(gc_entity *entity, gc_scene *scene, void *component, node *n) +{ + struct friction_giver *cmp = (struct friction_giver *)component; + + cmp->value = xml_getfloatprop(n, "value"); + (void)scene; + (void)entity; +} + +static void dtr(void *component) +{ + (void)component; +} + +static char *serialize(void *component) +{ + (void)component; + return (NULL); +} + +const struct friction_giver friction_giver = { + base: { + name: "friction_giver", + size: sizeof(struct friction_giver), + dependencies: (char *[]){ + "transform_component", + "friction_giver", + NULL + }, + ctr: &ctr, + fdctr: &fdctr, + dtr: &dtr, + serialize: &serialize, + destroy: &component_destroy + }, + value: 10 +}; \ No newline at end of file diff --git a/lib/gamacon/src/components/movable_component.c b/lib/gamacon/src/components/movable_component.c new file mode 100644 index 0000000..60f28ff --- /dev/null +++ b/lib/gamacon/src/components/movable_component.c @@ -0,0 +1,59 @@ +/* +** EPITECH PROJECT, 2019 +** Gamacon +** File description: +** movable_component +*/ + +#include "xml.h" +#include "component.h" +#include "components/movable_component.h" +#include "utility.h" +#include + +static void ctr(void *component, va_list args) +{ + struct movable_component *cmp = (struct movable_component *)component; + + cmp->acceleration.x = 0; + cmp->acceleration.y = 0; + cmp->velocity.x = 0; + cmp->velocity.y = 0; + (void)args; +} + +static void fdctr(gc_entity *entity, gc_scene *scene, void *component, node *n) +{ + (void)component; + (void)n; + (void)scene; + (void)entity; +} + +static void dtr(void *component) +{ + (void)component; +} + +static char *serialize(void *component) +{ + (void)component; + return (NULL); +} + +const struct movable_component movable_component = { + base: { + name: "movable_component", + size: sizeof(struct movable_component), + dependencies: (char *[]){ + "transform_component", + "collision_component", + NULL + }, + ctr: &ctr, + fdctr: &fdctr, + dtr: &dtr, + serialize: &serialize, + destroy: &component_destroy + } +}; \ No newline at end of file diff --git a/lib/gamacon/src/components/parallax_component.c b/lib/gamacon/src/components/parallax_component.c new file mode 100644 index 0000000..1e32346 --- /dev/null +++ b/lib/gamacon/src/components/parallax_component.c @@ -0,0 +1,53 @@ +/* +** EPITECH PROJECT, 2019 +** MUL_my_runner_2019 +** File description: +** parralax_component +*/ + +#include "xml.h" +#include "components/parallax_component.h" +#include "components/transform_component.h" + +static void ctr(void *component, va_list args) +{ + struct parallax_component *cmp = (struct parallax_component *)component; + + cmp->speed = va_arg(args, double); + cmp->old_pos = (gc_vector2){0, 0}; +} + +static void fdctr(gc_entity *entity, gc_scene *scene, void *component, node *n) +{ + struct parallax_component *cmp = (struct parallax_component *)component; + + cmp->speed = xml_getfloatprop(n, "speed"); + cmp->old_pos = (gc_vector2){0, 0}; + (void)scene; + (void)entity; +} + +static void dtr(void *component) +{ + (void)component; +} + +static char *serialize(void *component) +{ + (void)component; + return (NULL); +} + +const struct parallax_component parallax_component = { + base: { + name: "parallax_component", + size: sizeof(struct parallax_component), + dependencies: (char *[]){"transform_component", "renderer", NULL}, + ctr: &ctr, + fdctr: &fdctr, + dtr: &dtr, + serialize: &serialize, + destroy: &component_destroy + }, + speed: 0.5 +}; \ No newline at end of file diff --git a/lib/gamacon/src/components/renderer.c b/lib/gamacon/src/components/renderer.c new file mode 100644 index 0000000..6118a41 --- /dev/null +++ b/lib/gamacon/src/components/renderer.c @@ -0,0 +1,97 @@ +/* +** EPITECH PROJECT, 2019 +** MUL_my_runner_2019 +** File description: +** texture_renderer +*/ + +#include "engine.h" +#include "xml.h" +#include "utility.h" +#include "sprite.h" +#include "text.h" +#include "components/transform_component.h" +#include "components/renderer.h" +#include + +static void ctr(void *component, va_list args) +{ + struct renderer *cmp = (struct renderer *)component; + GC_TEXTURETYPE type = va_arg(args, GC_TEXTURETYPE); + + cmp->data = NULL; + if (type == GC_TEXTUREREND) + sprite_ctr(cmp, args); + if (type == GC_ANIMREND) + anim_ctr(cmp, args); + if (type == GC_TXTREND) + text_ctr(cmp, args); +} + +GC_TEXTURETYPE renderer_get_type(node *n) +{ + if (xml_getnode(n, "animation")) + return (GC_ANIMREND); + if (xml_hasproperty(n, "text")) + return (GC_TXTREND); + return (GC_TEXTUREREND); +} + +static void fdctr(gc_entity *entity, gc_scene *scene, void *component, node *n) +{ + struct renderer *cmp = (struct renderer *)component; + GC_TEXTURETYPE type = renderer_get_type(n); + + if (type == GC_TEXTUREREND) + sprite_fdctr(scene, cmp, n); + if (type == GC_ANIMREND) + anim_fdctr(scene, cmp, n); + if (type == GC_TXTREND) + text_fdctr(scene, cmp, n); + (void)entity; +} + +static void dtr(void *component) +{ + struct renderer *cmp = (struct renderer *)component; + + switch (cmp->type) { + case GC_ANIMREND: + for (int i = 0; i < ((gc_animholder *)cmp->data)->animcount; i++) { + if (my_strcmp(((gc_animholder *)cmp->data)->anims[i].name, "none")) + free(((gc_animholder *)cmp->data)->anims[i].name); + } + free(((gc_animholder *)cmp->data)->sprite); + free(((gc_animholder *)cmp->data)->anims); + break; + case GC_TXTREND: + free(((gc_text *)cmp->data)->text); + break; + default: + break; + } + free(cmp->data); +} + +static char *serialize(void *component) +{ + (void)component; + return (NULL); +} + +const struct renderer renderer_component = { + base: { + name: "renderer", + size: sizeof(struct renderer), + dependencies: (char *[]){"transform_component", NULL}, + ctr: &ctr, + fdctr: &fdctr, + dtr: &dtr, + serialize: &serialize, + destroy: &component_destroy, + next: NULL, + prev: NULL + }, + data: NULL, + type: GC_TEXTUREREND +}; \ No newline at end of file diff --git a/lib/gamacon/src/components/renderers/anim_renderer.c b/lib/gamacon/src/components/renderers/anim_renderer.c new file mode 100644 index 0000000..66f6d49 --- /dev/null +++ b/lib/gamacon/src/components/renderers/anim_renderer.c @@ -0,0 +1,102 @@ +/* +** EPITECH PROJECT, 2020 +** Twac +** File description: +** anim_renderer +*/ + +#include "components/renderer.h" +#include "vector2.h" +#include "sprite.h" +#include "xml.h" +#include "my.h" +#include +#include + +void rend_set_anim(struct renderer *rend, const char *name) +{ + gc_animholder *holder = (gc_animholder *)rend->data; + + if (holder->current && !my_strcmp(holder->current->name, name)) + return; + for (int i = 0; i < holder->animcount; i++) { + if (!my_strcmp(holder->anims[i].name, name)) { + holder->current = &holder->anims[i]; + holder->sprite->rect = holder->anims[i].rect; + return; + } + } + my_printf("Gamacon: unknown animation %s.\n", name); +} + +void anim_ctr(struct renderer *cmp, va_list args) +{ + sfVector2u size; + gc_sprite *sprite = malloc(sizeof(gc_sprite)); + + if (!sprite) + return; + cmp->data = sprite; + sprite->texture = va_arg(args, sfTexture *); + sprite->rect = va_arg(args, gc_int_rect); + if (sprite->texture && sprite->rect.height < 0) { + size = sfTexture_getSize(sprite->texture); + sprite->rect.height = (float)size.y; + sprite->rect.width = (float)size.x; + } +} + +void animation_fdctr(gc_anim *anim, gc_sprite *sprite, node *n) +{ + node *rect = xml_getnode(n, "Rect"); + int tmp; + + anim->name = xml_getproperty(n, "name"); + anim->frame_count = xml_getintprop(n, "frame_count"); + anim->frame_rate = xml_getfloatprop(n, "frame_rate"); + anim->rect.height = sprite->rect.height; + anim->rect.width = sprite->rect.width; + anim->rect.top = sprite->rect.top; + anim->rect.left = sprite->rect.left; + if ((tmp = xml_getfloatprop(rect, "height")) != 0) + anim->rect.height = tmp; + if ((tmp = xml_getfloatprop(rect, "width")) != 0) + anim->rect.width = tmp; + if ((tmp = xml_getfloatprop(rect, "top")) != 0) + anim->rect.top = tmp; + if ((tmp = xml_getfloatprop(rect, "left")) != 0) + anim->rect.left = tmp; +} + +void animation_setnone(gc_anim *anim, gc_sprite *sprite) +{ + anim->name = "none"; + anim->frame_count = 1; + anim->frame_rate = 0; + anim->rect = sprite->rect; +} + +void anim_fdctr(gc_scene *scene, struct renderer *cmp, node *n) +{ + gc_animholder *hold = malloc(sizeof(gc_animholder)); + int animcount = xml_getchildcount_filtered(n, "animation") + 1; + int i = 1; + + hold->anims = malloc(sizeof(gc_anim) * animcount); + if (!hold || !hold->anims) + return; + sprite_fdctr(scene, cmp, n); + hold->sprite = (gc_sprite *)cmp->data; + hold->current = NULL; + hold->animcount = animcount; + hold->timesince_up = 0; + cmp->data = hold; + animation_setnone(&hold->anims[0], hold->sprite); + for (n = n->child; n; n = n->next) { + if (my_strcmp(n->name, "animation")) + continue; + animation_fdctr(&hold->anims[i], hold->sprite, n); + i++; + } + cmp->type = GC_ANIMREND; +} \ No newline at end of file diff --git a/lib/gamacon/src/components/renderers/sprite_renderer.c b/lib/gamacon/src/components/renderers/sprite_renderer.c new file mode 100644 index 0000000..7447380 --- /dev/null +++ b/lib/gamacon/src/components/renderers/sprite_renderer.c @@ -0,0 +1,56 @@ +/* +** EPITECH PROJECT, 2020 +** Twac +** File description: +** sprite_renderer +*/ + +#include "components/renderer.h" +#include "vector2.h" +#include "xml.h" +#include "sprite.h" +#include "sfml_renderer.h" +#include +#include + +void sprite_ctr(struct renderer *cmp, va_list args) +{ + sfVector2u size; + gc_sprite *sprite; + + sprite = malloc(sizeof(gc_sprite)); + if (!sprite) + return; + cmp->data = sprite; + sprite->texture = va_arg(args, sfTexture *); + sprite->rect = va_arg(args, gc_int_rect); + if (sprite->texture && sprite->rect.height < 0) { + size = sfTexture_getSize(sprite->texture); + sprite->rect.height = (float)size.y; + sprite->rect.width = (float)size.x; + } + sprite->scale = (gc_vector2){1, 1}; +} + +void sprite_fdctr(gc_scene *scene, struct renderer *cmp, node *n) +{ + node *rect = xml_getnode(n, "Rect"); + sfVector2u size; + gc_sprite *sprite = malloc(sizeof(gc_sprite)); + + cmp->data = sprite; + if (!cmp->data) + return; + sprite->texture = get_texture(scene, xml_gettempprop(n, "src")); + sprite->rect.height = xml_getfloatprop(rect, "height"); + sprite->rect.width = xml_getfloatprop(rect, "width"); + sprite->rect.top = xml_getfloatprop(rect, "top"); + sprite->rect.left = xml_getfloatprop(rect, "left"); + if (sprite->texture && sprite->rect.height < 0) { + size = sfTexture_getSize(sprite->texture); + sprite->rect.height = (float)size.y; + sprite->rect.width = (float)size.x; + } + sprite->scale = (gc_vector2){1, 1}; + cmp->type = GC_TEXTUREREND; +} diff --git a/lib/gamacon/src/components/renderers/text_renderer.c b/lib/gamacon/src/components/renderers/text_renderer.c new file mode 100644 index 0000000..c12c725 --- /dev/null +++ b/lib/gamacon/src/components/renderers/text_renderer.c @@ -0,0 +1,40 @@ +/* +** EPITECH PROJECT, 2020 +** Twac +** File description: +** sprite_renderer +*/ + +#include "components/renderer.h" +#include "vector2.h" +#include "xml.h" +#include "sprite.h" +#include "text.h" +#include +#include + +void text_ctr(struct renderer *cmp, va_list args) +{ + gc_text *gctext = malloc(sizeof(gc_text)); + + if (!gctext) + return; + cmp->data = gctext; + gctext->text = va_arg(args, char *); + gctext->font = va_arg(args, sfFont *); + cmp->type = GC_TXTREND; +} + +void text_fdctr(gc_scene *scene, struct renderer *cmp, node *n) +{ + gc_text *gctext = malloc(sizeof(gc_text)); + + if (!gctext) + return; + cmp->data = gctext; + gctext->text = xml_getproperty(n, "text"); + if (!gctext->text) + return; + gctext->font = scene->get_data(scene, "font", xml_getproperty(n, "src")); + cmp->type = GC_TXTREND; +} diff --git a/lib/gamacon/src/components/transform_component.c b/lib/gamacon/src/components/transform_component.c new file mode 100644 index 0000000..0ee67dc --- /dev/null +++ b/lib/gamacon/src/components/transform_component.c @@ -0,0 +1,65 @@ +/* +** EPITECH PROJECT, 2019 +** MUL_my_runner_2019 +** File description: +** position_component +*/ + +#include "component.h" +#include "xml.h" +#include "components/transform_component.h" +#include "utility.h" +#include + +static void ctr(void *component, va_list args) +{ + struct transform_component *cmp = (struct transform_component *)component; + + cmp->position = va_arg(args, gc_vector2); + cmp->size = va_arg(args, gc_vector2); +} + +static void fdctr(gc_entity *entity, gc_scene *scene, void *component, node *n) +{ + struct transform_component *cmp = (struct transform_component *)component; + node *pos = xml_getnode(n, "Position"); + node *size = xml_getnode(n, "Size"); + + if (pos) { + cmp->position.x = xml_getintprop(pos, "x"); + cmp->position.y = xml_getintprop(pos, "y"); + } else { + cmp->position.x = 0; + cmp->position.y = 0; + } + if (size) { + cmp->size.x = xml_getintprop(size, "x"); + cmp->size.y = xml_getintprop(size, "y"); + } else { + cmp->size.x = 0; + cmp->size.y = 0; + } + (void)scene; + (void)entity; +} + +static char *serialize(void *component) +{ + (void)component; + return (NULL); +} + +const struct transform_component transform_component = { + base: { + name: "transform_component", + size: sizeof(struct transform_component), + dependencies: (char *[]){NULL}, + ctr: &ctr, + fdctr: &fdctr, + dtr: NULL, + serialize: &serialize, + destroy: &component_destroy + }, + position: {0, 0}, + size: {0, 0} +}; \ No newline at end of file diff --git a/lib/gamacon/src/deserializer/deserialize_entity.c b/lib/gamacon/src/deserializer/deserialize_entity.c new file mode 100644 index 0000000..d4ce4d0 --- /dev/null +++ b/lib/gamacon/src/deserializer/deserialize_entity.c @@ -0,0 +1,48 @@ +/* +** EPITECH PROJECT, 2019 +** MUL_my_runner_2019 +** File description: +** deserializer +*/ + +#include +#include "xml.h" +#include "read_line.h" +#include "utility.h" +#include "entity.h" +#include "engine.h" + +gc_component *deserialize_component(gc_engine *engine, gc_entity *entity, \ +gc_scene *scene, node *n) +{ + const void *model = engine->get_component(engine, n->name); + gc_component *cmp = NULL; + + if (!model) { + my_printf("Couldn't find a component with the name: %s\n", n->name); + return (NULL); + } + cmp = new_component(model, 0, 0, 0, 0, 0, 0, 0); + if (cmp->fdctr) + cmp->fdctr(entity, scene, cmp, n); + return (cmp); +} + +gc_entity *deserialize_entity(gc_engine *engine, gc_scene *scene, node *n) +{ + gc_entity *entity = NULL; + gc_component *cmp = NULL; + int id = xml_getintprop(n, "id"); + + if (id > 0) + entity = entity_create_with_id(id); + else + entity = entity_create(); + if (!entity) + return (NULL); + for (node *cmp_n = n->child; cmp_n; cmp_n = cmp_n->next) { + cmp = deserialize_component(engine, entity, scene, cmp_n); + entity->add_component(entity, cmp); + } + return (entity); +} \ No newline at end of file diff --git a/lib/gamacon/src/deserializer/prefab.c b/lib/gamacon/src/deserializer/prefab.c new file mode 100644 index 0000000..a9b7c19 --- /dev/null +++ b/lib/gamacon/src/deserializer/prefab.c @@ -0,0 +1,44 @@ +/* +** EPITECH PROJECT, 2019 +** MUL_my_runner_2019 +** File description: +** prefab +*/ + +#include "xml.h" +#include "engine.h" +#include "entity.h" +#include "prefab.h" +#include "read_line.h" +#include "utility.h" +#include +#include + +int prefab_load(gc_engine *engine, const char *path) +{ + node *n; + + if (!engine || !engine->scene) + return (-1); + n = xml_parse(path); + if (!n || prefab_loadentities(n, engine, engine->scene) < 0) + return (-1); + xml_destroy(n); + return (0); +} + +int prefab_loadentities(node *n, gc_engine *engine, gc_scene *scene) +{ + gc_entity *entity; + + n = xml_getnode(n, "gc_entities"); + if (!n) + return (-1); + for (node *ent_n = n->child; ent_n; ent_n = ent_n->next) { + entity = deserialize_entity(engine, scene, ent_n); + if (!entity) + return (-1); + scene->add_entity(scene, entity); + } + return (0); +} \ No newline at end of file diff --git a/lib/gamacon/src/engine/discard_player.c b/lib/gamacon/src/engine/discard_player.c new file mode 100644 index 0000000..33dbecd --- /dev/null +++ b/lib/gamacon/src/engine/discard_player.c @@ -0,0 +1,18 @@ +/* +** EPITECH PROJECT, 2020 +** Twac +** File description: +** discard_player +*/ + +#include "engine.h" + +void engine_play_music(void *music) +{ + (void)music; +} + +void engine_stop_music(gc_engine *engine) +{ + (void)engine; +} \ No newline at end of file diff --git a/lib/gamacon/src/engine/engine.c b/lib/gamacon/src/engine/engine.c new file mode 100644 index 0000000..948a491 --- /dev/null +++ b/lib/gamacon/src/engine/engine.c @@ -0,0 +1,89 @@ +/* +** EPITECH PROJECT, 2019 +** Gamacon +** File description: +** engine +*/ + +#include "engine.h" +#include "system.h" +#include "utility.h" +#include +#include +#include + +void update_system(gc_engine *engine, gc_system *sys, float dtime) +{ + gc_scene *scene = engine->scene; + gc_list *entities; + + if (!scene) + return; + entities = scene->get_entity_by_cmp(scene, sys->component_name); + for (gc_list *entity = entities; entity; entity = entity->next) { + if (sys->check_dependencies(sys, entity->data)) + sys->update_entity(engine, sys, entity->data, dtime); + else + my_printf("Entity %d does not have all the required components \ +for the system %s\n", ((gc_entity *)entity->data)->id, sys->name); + } +} + +int game_loop(gc_engine *engine, float dtime) +{ + if (!engine->has_focus(engine)) + return (0); + engine->handle_events(engine); + for (gc_list *sys = engine->systems; sys; sys = sys->next) + update_system(engine, sys->data, dtime); + engine->draw(engine); + return (0); +} + +void engine_destroy(gc_engine *engine) +{ + gc_list *next; + + if (engine->scene) + engine->scene->destroy(engine->scene); + for (gc_list *dl = engine->dataloaders; dl; dl = next) { + next = dl->next; + free(dl->data); + free(dl); + } + for (gc_list *system = engine->systems; system; system = next) { + next = system->next; + ((gc_system *)system->data)->destroy(system->data); + free(system); + } + for (gc_list *cmp = engine->components; cmp; cmp = next) { + next = cmp->next; + free(cmp); + } + free(engine); +} + +gc_engine *engine_create(void) +{ + gc_engine *engine = malloc(sizeof(gc_engine)); + + if (!engine) + return (NULL); + engine->scene = NULL; + engine->should_close = false; + engine->is_open = &engine_is_open; + engine->has_focus = &engine_has_focus; + engine->is_keypressed = &engine_is_keypressed; + engine->handle_events = &handle_events; + engine->game_loop = &game_loop; + engine->draw = &engine_draw; + engine->change_scene = &change_scene; + engine->play_music = &engine_play_music; + engine->stop_music = &engine_stop_music; + engine->destroy = &engine_destroy; + engine_add_buildin_systems(engine); + engine_add_buildin_components(engine); + engine->dataloaders = NULL; + engine->add_dataloader = &engine_add_dataloader; + return (engine); +} \ No newline at end of file diff --git a/lib/gamacon/src/engine/engine_component_builder.c b/lib/gamacon/src/engine/engine_component_builder.c new file mode 100644 index 0000000..bc83c39 --- /dev/null +++ b/lib/gamacon/src/engine/engine_component_builder.c @@ -0,0 +1,44 @@ +/* +** EPITECH PROJECT, 2019 +** MUL_my_runner_2019 +** File description: +** engine_system_builder +*/ + +#include "engine.h" +#include "system.h" +#include "components/movable_component.h" +#include "components/parallax_component.h" +#include "components/fixed_to_cam_component.h" +#include "components/renderer.h" +#include "components/camerafollow_component.h" +#include "components/transform_component.h" +#include "components/controllable_component.h" +#include "components/controllers/keyboard_controller.h" +#include "components/friction_component.h" +#include "components/friction_giver.h" +#include "components/collision_component.h" +#include + +void engine_add_component(gc_engine *engine, const void *component) +{ + engine->components = list_add(engine->components, (void *)component); +} + +void engine_add_buildin_components(gc_engine *engine) +{ + engine->components = NULL; + engine->add_component = &engine_add_component; + engine->get_component = &engine_get_component; + engine->add_component(engine, &transform_component); + engine->add_component(engine, &movable_component); + engine->add_component(engine, &renderer_component); + engine->add_component(engine, &camerafollow_component); + engine->add_component(engine, &fixed_to_cam); + engine->add_component(engine, ¶llax_component); + engine->add_component(engine, &controllable_component); + engine->add_component(engine, &keyboard_controller); + engine->add_component(engine, &friction_giver); + engine->add_component(engine, &friction_component); + engine->add_component(engine, &collision_component); +} \ No newline at end of file diff --git a/lib/gamacon/src/engine/engine_dataloader.c b/lib/gamacon/src/engine/engine_dataloader.c new file mode 100644 index 0000000..dd9e86c --- /dev/null +++ b/lib/gamacon/src/engine/engine_dataloader.c @@ -0,0 +1,22 @@ +/* +** EPITECH PROJECT, 2020 +** Twac +** File description: +** engine_dataloader +*/ + +#include "engine.h" +#include "data.h" +#include "my.h" +#include + +void engine_add_dataloader(gc_engine *engine, char *type, gc_loader loader) +{ + gc_dataloader *dataloader = malloc(sizeof(*dataloader)); + + if (!dataloader) + return ((void)my_printf("Couldn't malloc dataloader for %s\n", type)); + dataloader->type = type; + dataloader->load = loader; + engine->dataloaders = list_add(engine->dataloaders, dataloader); +} \ No newline at end of file diff --git a/lib/gamacon/src/engine/engine_internal.c b/lib/gamacon/src/engine/engine_internal.c new file mode 100644 index 0000000..fbe0732 --- /dev/null +++ b/lib/gamacon/src/engine/engine_internal.c @@ -0,0 +1,37 @@ +/* +** EPITECH PROJECT, 2019 +** Gamacon +** File description: +** engine_internal +*/ + +#include +#include "engine.h" + +bool engine_is_open(gc_engine *engine) +{ + (void)engine; + return (false); +} + +bool engine_has_focus(gc_engine *engine) +{ + (void)engine; + return (true); +} + +void handle_events(gc_engine *engine) +{ + (void)engine; +} + +void engine_draw(gc_engine *engine) +{ + (void)engine; +} + +bool engine_is_keypressed(int key) +{ + (void)key; + return (false); +} \ No newline at end of file diff --git a/lib/gamacon/src/engine/engine_system_builder.c b/lib/gamacon/src/engine/engine_system_builder.c new file mode 100644 index 0000000..a659c77 --- /dev/null +++ b/lib/gamacon/src/engine/engine_system_builder.c @@ -0,0 +1,55 @@ +/* +** EPITECH PROJECT, 2019 +** MUL_my_runner_2019 +** File description: +** engine_system_builder +*/ + +#include "engine.h" +#include "system.h" +#include "systems/sfml_renderer_system.h" +#include "systems/movable_system.h" +#include "systems/parallax_system.h" +#include "systems/controllers/keyboard_controller_system.h" +#include "systems/friction_system.h" +#include "systems/collision_system.h" +#include "systems/camerafollow_system.h" +#include "sfml_renderer.h" +#include + +void engine_add_system(gc_engine *engine, const void *system) +{ + engine->systems = list_add(engine->systems, (void *)system); +} + +void engine_finish_physics(gc_engine *engine) +{ + engine->add_system(engine, new_system(&movable_system)); +} + +void engine_add_buildin_systems(gc_engine *engine) +{ + engine->systems = NULL; + engine->add_system = &engine_add_system; + engine->get_system = &engine_get_system; + engine->finish_physics = &engine_finish_physics; + engine->add_system(engine, ¶llax_system); + engine->add_system(engine, &keyboard_controller_system); + engine->add_system(engine, &friction_system); + engine->add_system(engine, new_system(&collision_system, engine->scene)); +} + +int engine_use_sfml(gc_engine *engine, const char *title, int framerate) +{ + void *renderer = new_system(&sfml_renderer, engine, title, framerate); + void *camfollow = new_system(&camerafollow_system); + + if (!renderer || !camfollow) + return (-1); + engine->add_system(engine, renderer); + engine->add_system(engine, camfollow); + engine->add_dataloader(engine, "music", &sfml_music_loader); + engine->add_dataloader(engine, "sprite", &sfml_sprite_loader); + engine->add_dataloader(engine, "font", &sfml_font_loader); + return (0); +} \ No newline at end of file diff --git a/lib/gamacon/src/entity/entity.c b/lib/gamacon/src/entity/entity.c new file mode 100644 index 0000000..18fac9a --- /dev/null +++ b/lib/gamacon/src/entity/entity.c @@ -0,0 +1,76 @@ +/* +** EPITECH PROJECT, 2019 +** MUL_my_runner_2019 +** File description: +** entity +*/ + +#include "entity.h" +#include "utility.h" +#include +#include + +gc_entity *entity_get(gc_scene *scene, int id) +{ + if (!scene) + return (NULL); + for (gc_list *ent = scene->entities; ent; ent = ent->next) { + if (((gc_entity *)ent->data)->id == id) + return (ent->data); + } + return (NULL); +} + +void *entity_get_component(const gc_entity *entity, const char *name) +{ + if (!entity || !name) + return (NULL); + for (gc_component *cmp = entity->components; cmp; cmp = cmp->next) { + if (!my_strcmp(cmp->name, name)) + return (cmp); + } + return (NULL); +} + +bool entity_has_component(const gc_entity *entity, const char *name) +{ + for (gc_component *cmp = entity->components; cmp; cmp = cmp->next) { + if (!my_strcmp(cmp->name, name)) + return (true); + } + return (false); +} + +char *entity_serialize(gc_entity *entity, int fd) +{ + char *id = tostr(entity->id); + + write(fd, id, my_strlen(id)); + write(fd, ": ", 2); + for (gc_component *cmp = entity->components; cmp; cmp = cmp->next) + cmp->serialize(cmp); + free(id); + return (NULL); +} + +static void destroy(gc_entity *entity) +{ + gc_component *next = NULL; + + for (gc_component *cmp = entity->components; cmp; cmp = next) { + next = cmp->next; + cmp->destroy(cmp); + } + free(entity); +} + +const gc_entity entity_prefab = { + id: 0, + components: NULL, + add_component: &entity_add_component, + get_component: &entity_get_component, + has_component: &entity_has_component, + remove_component: &entity_remove_component, + serialize: &entity_serialize, + destroy: &destroy +}; \ No newline at end of file diff --git a/lib/gamacon/src/entity/entity_factory.c b/lib/gamacon/src/entity/entity_factory.c new file mode 100644 index 0000000..74ff7d2 --- /dev/null +++ b/lib/gamacon/src/entity/entity_factory.c @@ -0,0 +1,87 @@ +/* +** EPITECH PROJECT, 2019 +** MUL_my_runner_2019 +** File description: +** entity_factory +*/ + +#include "entity.h" +#include "component.h" +#include "my.h" +#include + +static unsigned int next_id = 0; +const gc_entity entity_prefab; + +gc_entity *entity_create(void) +{ + gc_entity *entity = malloc(sizeof(gc_entity)); + + if (!entity) + return (NULL); + *entity = entity_prefab; + entity->id = next_id; + next_id++; + return (entity); +} + +gc_entity *entity_create_with_id(int id) +{ + gc_entity *entity = malloc(sizeof(gc_entity)); + + if (!entity) + return (NULL); + *entity = entity_prefab; + entity->id = id; + return (entity); +} + +int entity_add(gc_scene *scene, gc_entity *e) +{ + char *name; + + scene->entities = list_add(scene->entities, e); + if (!scene->entities) + return (-1); + for (gc_component *cmp = e->components; cmp; cmp = cmp->next) { + name = cmp->name; + scene->entities_by_cmp = tupple_add(scene->entities_by_cmp, name, e); + if (!scene->entities_by_cmp) + return (-1); + } + return (0); +} + +gc_entity *entity_add_component(gc_entity *entity, void *component) +{ + gc_component *components = entity->components; + + if (!component) + return (NULL); + if (!components) + entity->components = component; + else { + while (components->next) + components = components->next; + ((gc_component *)component)->prev = components; + components->next = component; + } + return (entity); +} + +void entity_remove_component(const gc_scene *scene, const gc_entity *entity, \ +const char *name) +{ + gc_component *cmp; + + if (!scene || !entity || !entity->components) + return; + cmp = component_remove(entity->components, name); + if (!cmp) + return; + for (gc_tupple *tup = scene->entities_by_cmp; tup; tup = tup->next) { + if (!my_strcmp(tup->name, name)) + tup_remove(tup, entity->id); + } + component_destroy(cmp); +} \ No newline at end of file diff --git a/lib/gamacon/src/scene/scene.c b/lib/gamacon/src/scene/scene.c new file mode 100644 index 0000000..9aa5c72 --- /dev/null +++ b/lib/gamacon/src/scene/scene.c @@ -0,0 +1,72 @@ +/* +** EPITECH PROJECT, 2019 +** MUL_my_runner_2019 +** File description: +** scene +*/ + +#include "engine.h" +#include "entity.h" +#include "utility.h" +#include "prefab.h" +#include + +gc_list *get_entity_by_cmp(gc_scene *scene, const char *cmp_name) +{ + for (gc_tupple *tup = scene->entities_by_cmp; tup; tup = tup->next) { + if (!my_strcmp(tup->name, cmp_name)) + return (tup->entities); + } + return (NULL); +} + +void *scene_get_data(gc_scene *scene, const char *type, const char *name) +{ + gc_data *data; + + if (!scene || !scene->data) + return (NULL); + for (gc_list *li = scene->data; li; li = li->next) { + data = (gc_data *)li->data; + if (type && my_strcmp(data->type, type)) + continue; + if (!name || !my_strcmp(data->name, name)) + return (data->custom); + } + return (NULL); +} + +gc_scene *scene_create(gc_engine *engine, const char *xmlpath) +{ + gc_scene *scene = malloc(sizeof(gc_scene)); + node *n = NULL; + + if (!scene) + return (NULL); + if (xmlpath && !(n = xml_parse(xmlpath))) + return (NULL); + scene_load_data(engine, scene, n); + scene->entities = NULL; + scene->entities_by_cmp = NULL; + scene->add_entity = &entity_add; + scene->get_entity = &entity_get; + scene->get_entity_by_cmp = &get_entity_by_cmp; + scene->destroy = &scene_destroy; + scene->get_data = &scene_get_data; + prefab_loadentities(n, engine, scene); + xml_destroy(n); + return (scene); +} + +int change_scene(gc_engine *engine, gc_scene *scene) +{ + void *music = scene->get_data(scene, "music", NULL); + + engine->stop_music(engine); + if (engine->scene) + engine->scene->destroy(engine->scene); + engine->scene = scene; + if (music) + engine->play_music(music); + return (0); +} \ No newline at end of file diff --git a/lib/gamacon/src/scene/scene_destroy.c b/lib/gamacon/src/scene/scene_destroy.c new file mode 100644 index 0000000..7ef7f9d --- /dev/null +++ b/lib/gamacon/src/scene/scene_destroy.c @@ -0,0 +1,49 @@ +/* +** EPITECH PROJECT, 2020 +** Twac +** File description: +** scene_destroy +*/ + +#include "scene.h" +#include "data.h" +#include "list.h" +#include "tupple.h" +#include + +static void free_data(gc_scene *scene) +{ + void *next = NULL; + + for (gc_list *data = scene->data; data; data = next) { + next = data->next; + if (((gc_data *)data->data)->destroy) + ((gc_data *)data->data)->destroy(data->data); + free(((gc_data *)data->data)->type); + free(data->data); + free(data); + } +} + +void scene_destroy(gc_scene *scene) +{ + void *next = NULL; + gc_tupple *tup = scene->entities_by_cmp; + + for (gc_list *entity = scene->entities; entity; entity = next) { + next = entity->next; + ((gc_entity *)entity->data)->destroy(entity->data); + free(entity); + } + free_data(scene); + for (gc_tupple *tupple = tup; tupple; tupple = tup) { + tup = tupple->next; + for (gc_list *li = tupple->entities; li; li = next) { + next = li->next; + free(li); + } + free(tupple->name); + free(tupple); + } + free(scene); +} \ No newline at end of file diff --git a/lib/gamacon/src/scene/scene_loader.c b/lib/gamacon/src/scene/scene_loader.c new file mode 100644 index 0000000..d71d1e9 --- /dev/null +++ b/lib/gamacon/src/scene/scene_loader.c @@ -0,0 +1,52 @@ +/* +** EPITECH PROJECT, 2020 +** Twac +** File description: +** scene_music +*/ + +#include "engine.h" +#include "scene.h" +#include "xml.h" +#include "my.h" +#include "data.h" +#include +#include +#include + +gc_dataloader *gc_dataloader_from_type(gc_engine *engine, const char *type) +{ + gc_dataloader *loader; + + for (gc_list *li = engine->dataloaders; li; li = li->next) { + loader = (gc_dataloader *)li->data; + if (!my_strcmp(loader->type, type)) + return (loader); + } + return (NULL); +} + +void scene_load_data(gc_engine *engine, gc_scene *scene, node *n) +{ + gc_data *data; + gc_dataloader *loader; + + scene->data = NULL; + if (!(n = xml_getnode(n, "data"))) + return; + for (n = n->child; n; n = n->next) { + if (!(data = malloc(sizeof(*data)))) + return; + data->type = my_strdup(n->name); + data->name = xml_getproperty(n, "name"); + data->destroy = NULL; + loader = gc_dataloader_from_type(engine, data->type); + if (!loader) + return ((void)my_printf("Couldn't find data loader for the type %s\ +\n", data->type)); + if (loader->load(data, n) < 0) + return ((void)my_printf("Error while loading data %s (type %s).\ +\n", data->name, data->type)); + scene->data = list_add(scene->data, data); + } +} \ No newline at end of file diff --git a/lib/gamacon/src/sfml_renderer/sfml_dataloaders.c b/lib/gamacon/src/sfml_renderer/sfml_dataloaders.c new file mode 100644 index 0000000..0c0a887 --- /dev/null +++ b/lib/gamacon/src/sfml_renderer/sfml_dataloaders.c @@ -0,0 +1,57 @@ +/* +** EPITECH PROJECT, 2020 +** Twac +** File description: +** sfml_dataloaders +*/ + +#include "data.h" +#include "xml.h" +#include "sfml_renderer.h" +#include "my.h" +#include +#include +#include + +int sfml_music_loader(gc_data *data, node *n) +{ + char *path = xml_getproperty(n, "src"); + + if (!path) + return (-1); + data->name = path; + data->custom = sfMusic_createFromFile(path); + data->destroy = &sfml_music_destroy; + if (!data->custom) + return (-1); + return (0); +} + +int sfml_sprite_loader(gc_data *data, node *n) +{ + char *path = xml_getproperty(n, "src"); + + if (!path) + return (-1); + data->name = path; + data->custom = sfTexture_createFromFile(path, NULL); + if (!data->custom || !data->name) + return (-1); + sfTexture_setRepeated(data->custom, sfTrue); + data->destroy = &sfml_texture_destroy; + return (0); +} + +int sfml_font_loader(gc_data *data, node *n) +{ + char *path = xml_getproperty(n, "src"); + + if (!path) + return (-1); + data->name = path; + data->custom = sfFont_createFromFile(path); + if (!data->custom || !data->name) + return (-1); + data->destroy = &sfml_font_destroy; + return (0); +} \ No newline at end of file diff --git a/lib/gamacon/src/sfml_renderer/sfml_drawer.c b/lib/gamacon/src/sfml_renderer/sfml_drawer.c new file mode 100644 index 0000000..7606763 --- /dev/null +++ b/lib/gamacon/src/sfml_renderer/sfml_drawer.c @@ -0,0 +1,69 @@ +/* +** EPITECH PROJECT, 2020 +** Twac +** File description: +** sfml_drawer +*/ + +#include "sfml_renderer.h" +#include "vector2.h" +#include "sprite.h" +#include "text.h" +#include "components/transform_component.h" +#include "systems/sfml_renderer_system.h" +#include + +void sfmlrenderer_draw_texture(struct sfml_renderer_system *renderer, \ +struct transform_component *tra, gc_sprite *sprite) +{ + sfVector2f pos = (sfVector2f){tra->position.x, -tra->position.y}; + sfVector2f scale = (sfVector2f){ + tra->size.x * sprite->scale.x / sprite->rect.width, + tra->size.y * sprite->scale.y / sprite->rect.height + }; + + sprite->pos = tra->position; + if (!sprite->texture) + return; + sfSprite_setTexture(renderer->sprite, sprite->texture, true); + sfSprite_setTextureRect(renderer->sprite, (sfIntRect){ + (int)sprite->rect.left, (int)sprite->rect.top, + (int)sprite->rect.width, (int)sprite->rect.height + }); + sfSprite_setPosition(renderer->sprite, pos); + sfSprite_setScale(renderer->sprite, scale); + sfSprite_setOrigin(renderer->sprite, (sfVector2f){ + scale.x < 0 ? sprite->rect.width : 0, + scale.y < 0 ? sprite->rect.height : 0 + }); + sfRenderWindow_drawSprite(renderer->window, renderer->sprite, NULL); +} + +void sfmlrenderer_draw_anim(struct sfml_renderer_system *renderer, \ +struct transform_component *tra, gc_animholder *holder, float dtime) +{ + gc_int_rect *rec = &holder->sprite->rect; + gc_anim *curr = holder->current; + + if (curr) + holder->timesince_up += dtime; + if (curr && holder->timesince_up > 1 / curr->frame_rate) { + rec->left += rec->width; + holder->timesince_up = 0; + if (rec->left > curr->rect.left + rec->width * (curr->frame_count - 1)) + rec->left = curr->rect.left; + } + sfmlrenderer_draw_texture(renderer, tra, holder->sprite); +} + +void sfmlrenderer_draw_txt(struct sfml_renderer_system *renderer, \ +struct transform_component *tra, gc_text *txt) +{ + sfText_setString(renderer->text, txt->text); + sfText_setFont(renderer->text, txt->font); + sfText_setPosition(renderer->text, (sfVector2f){ + tra->position.x, + -tra->position.y + }); + sfRenderWindow_drawText(renderer->window, renderer->text, NULL); +} \ No newline at end of file diff --git a/lib/gamacon/src/sfml_renderer/sfml_functions.c b/lib/gamacon/src/sfml_renderer/sfml_functions.c new file mode 100644 index 0000000..d558534 --- /dev/null +++ b/lib/gamacon/src/sfml_renderer/sfml_functions.c @@ -0,0 +1,72 @@ +/* +** EPITECH PROJECT, 2019 +** MUL_my_runner_2019 +** File description: +** sfml_functions +*/ + +#include "engine.h" +#include +#include "sfml_renderer.h" +#include "systems/sfml_renderer_system.h" +#include "systems/camerafollow_system.h" +#include "components/transform_component.h" + +bool sfml_is_open(gc_engine *engine) +{ + struct sfml_renderer_system *renderer = GETSYS(sfml_renderer_system); + + if (engine->should_close) + return (false); + return (sfRenderWindow_isOpen(renderer->window)); +} + +bool sfml_has_focus(gc_engine *engine) +{ + struct sfml_renderer_system *renderer = GETSYS(sfml_renderer_system); + + return (sfRenderWindow_hasFocus(renderer->window)); +} + +bool sfml_is_keypressed(int key) +{ + return (sfKeyboard_isKeyPressed(key)); +} + +void sfml_handle_events(gc_engine *engine) +{ + struct sfml_renderer_system *renderer = GETSYS(sfml_renderer_system); + sfEvent event; + + while (sfRenderWindow_pollEvent(renderer->window, &event)) { + if (event.type == sfEvtClosed) + sfRenderWindow_close(renderer->window); + if (event.type == sfEvtResized) { + sfView_setSize(renderer->view, (sfVector2f){ + event.size.width, + event.size.height + }); + entities_update_to_cam_size(engine->scene, (gc_vector2) { + event.size.width, + event.size.height + }); + } + } +} + +void sfml_draw(gc_engine *engine) +{ + struct sfml_renderer_system *renderer = GETSYS(sfml_renderer_system); + struct camerafollow_system *cam = GETSYS(camerafollow_system); + + if (cam) { + sfView_setCenter(renderer->view, (sfVector2f){ + cam->cam_pos.x, + -cam->cam_pos.y + }); + sfRenderWindow_setView(renderer->window, renderer->view); + entities_update_to_cam(engine->scene, renderer, cam); + } + sfRenderWindow_display(renderer->window); + sfRenderWindow_clear(renderer->window, sfBlack); +} \ No newline at end of file diff --git a/lib/gamacon/src/sfml_renderer/sfml_music_player.c b/lib/gamacon/src/sfml_renderer/sfml_music_player.c new file mode 100644 index 0000000..4e95716 --- /dev/null +++ b/lib/gamacon/src/sfml_renderer/sfml_music_player.c @@ -0,0 +1,25 @@ +/* +** EPITECH PROJECT, 2020 +** Twac +** File description: +** sfml_music_player +*/ + +#include "engine.h" +#include + +void sfml_play_music(void *music) +{ + sfMusic_setLoop(music, true); + sfMusic_play(music); +} + +void sfml_stop_music(gc_engine *engine) +{ + void *music; + + if (!engine->scene) + return; + music = engine->scene->get_data(engine->scene, "music", NULL); + sfMusic_stop(music); +} \ No newline at end of file diff --git a/lib/gamacon/src/sfml_renderer/texture_utility.c b/lib/gamacon/src/sfml_renderer/texture_utility.c new file mode 100644 index 0000000..4d9315f --- /dev/null +++ b/lib/gamacon/src/sfml_renderer/texture_utility.c @@ -0,0 +1,51 @@ +/* +** EPITECH PROJECT, 2019 +** MUL_my_runner_2019 +** File description: +** renderer_loader +*/ + +#include "engine.h" +#include "utility.h" +#include "sfml_renderer.h" +#include +#include +#include + + +sfTexture *get_texture(gc_scene *scene, char *name) +{ + sfTexture *texture; + + if (!scene) { + my_printf("No scene, can't load textures\n"); + return (NULL); + } + if (!name) { + my_printf("Texture name: null. How should I find a texture ?\n"); + return (NULL); + } + texture = scene->get_data(scene, "sprite", name); + if (texture) + return (texture); + my_printf("Gamacon: no texture found for the name \"%s\"\n", name); + return (NULL); +} + +void sfml_texture_destroy(gc_data *data) +{ + sfTexture_destroy(data->custom); + free(data->name); +} + +void sfml_music_destroy(gc_data *data) +{ + sfMusic_destroy(data->custom); + free(data->name); +} + +void sfml_font_destroy(gc_data *data) +{ + sfFont_destroy(data->custom); + free(data->name); +} \ No newline at end of file diff --git a/lib/gamacon/src/system.c b/lib/gamacon/src/system.c new file mode 100644 index 0000000..ca938fc --- /dev/null +++ b/lib/gamacon/src/system.c @@ -0,0 +1,61 @@ +/* +** EPITECH PROJECT, 2019 +** Gamacon +** File description: +** component +*/ + +#include "system.h" +#include "utility.h" +#include + +bool system_check_dependencies(const gc_system *sys, const gc_entity *entity) +{ + void *cmp = entity->get_component(entity, sys->component_name); + gc_component *comp = (gc_component *)cmp; + + if (!comp) + return (false); + for (int i = 0; comp->dependencies[i]; i++) { + if (!entity->has_component(entity, comp->dependencies[i])) { + my_printf("\tMissing component: %s\n\n", comp->dependencies[i]); + return (false); + } + } + return (true); +} + +void *engine_get_system(gc_engine *engine, const char *name) +{ + for (gc_list *sys = engine->systems; sys; sys = sys->next) { + if (!my_strcmp(((const gc_system *)sys->data)->name, name)) + return (sys->data); + } + return (NULL); +} + +void *new_system(const void *system, ...) +{ + gc_system *base = (gc_system *)system; + va_list args; + void *new_sys = malloc(base->size); + + if (!new_sys) + return (NULL); + *(gc_system *)new_sys = *base; + if (((gc_system *)new_sys)->ctr) { + va_start(args, system); + ((gc_system *)new_sys)->ctr(new_sys, args); + va_end(args); + } + return (new_sys); +} + +void system_destroy(void *system) +{ + gc_system *sys = (gc_system *)system; + + if (sys->dtr) + sys->dtr(system); + free(system); +} \ No newline at end of file diff --git a/lib/gamacon/src/systems/camera_follow_system.c b/lib/gamacon/src/systems/camera_follow_system.c new file mode 100644 index 0000000..2a8c883 --- /dev/null +++ b/lib/gamacon/src/systems/camera_follow_system.c @@ -0,0 +1,50 @@ +/* +** EPITECH PROJECT, 2019 +** MUL_my_runner_2019 +** File description: +** friction +*/ + +#include "entity.h" +#include "system.h" +#include "vector2.h" +#include "utility.h" +#include "components/transform_component.h" +#include "components/camerafollow_component.h" +#include "systems/camerafollow_system.h" +#include "math.h" +#include + +static void update_entity(gc_engine *engine, void *system, \ +gc_entity *entity, float dtime) +{ + struct camerafollow_system *sys = (struct camerafollow_system *)system; + struct transform_component *tra = GETCMP(transform_component); + + sys->cam_pos.x = (sys->cam_pos.x + tra->position.x) / 2; + sys->cam_pos.y = (sys->cam_pos.y + tra->position.y) / 2; + (void)engine; + (void)dtime; +} + +static void ctr(void *system, va_list args) +{ + struct camerafollow_system *sys = (struct camerafollow_system *)system; + + sys->cam_pos = (gc_vector2){0, 0}; + (void)args; +} + +const struct camerafollow_system camerafollow_system = { + base: { + name: "camerafollow_system", + component_name: "camerafollow_component", + size: sizeof(struct camerafollow_system), + ctr: &ctr, + dtr: NULL, + check_dependencies: &system_check_dependencies, + update_entity: &update_entity, + destroy: &system_destroy + }, + cam_pos: (gc_vector2){0, 0} +}; \ No newline at end of file diff --git a/lib/gamacon/src/systems/collision_system.c b/lib/gamacon/src/systems/collision_system.c new file mode 100644 index 0000000..7a3a4af --- /dev/null +++ b/lib/gamacon/src/systems/collision_system.c @@ -0,0 +1,71 @@ +/* +** EPITECH PROJECT, 2020 +** Twac +** File description: +** collision_system +*/ + +#include "entity.h" +#include "system.h" +#include "vector2.h" +#include "utility.h" +#include "components/collision_component.h" +#include "components/transform_component.h" +#include "components/renderer.h" +#include "systems/collision_system.h" +#include + +void col_update_entity(gc_engine *engine, \ +void *system, gc_entity *entity, float dtime __attribute__((unused))) +{ + gc_collision_system *sys = (gc_collision_system *)system; + struct collision_component *col = GETCMP(collision_component); + struct transform_component *pos = GETCMP(transform_component); + qt_object obj = (qt_object) { + entity->id, + {pos->position.x, pos->position.y, pos->size.y, pos->size.x}, + col->layer + }; + qt_update(sys->tree, obj); + qt_collision qtcol = collision_get_info(sys->tree, entity->id); + col->distance_down = qtcol.distance_down; + col->distance_top = qtcol.distance_top; + col->distance_left = qtcol.distance_left; + col->distance_right = qtcol.distance_right; + if (!col->on_collide) + return; + for (int i = 0; qtcol.collide_with[i] != -1; i++) { + for (size_t j = 0; j < col->collide_size / sizeof(void (*)()); j++) + col->on_collide[j](engine, entity, qtcol.collide_with[i]); + } +} + +static void ctr(void *system, va_list args) +{ + gc_collision_system *col = (gc_collision_system *)system; + + col->tree = qt_create((qt_intrect){-1000, -1000, 2000, 2000}, 25); + (void)args; +} + +static void dtr(void *system) +{ + gc_collision_system *mov = (gc_collision_system *)system; + + qt_destroy(mov->tree); + (void)system; +} + +const gc_collision_system collision_system = { + base: { + name: "collision_system", + component_name: "collision_component", + size: sizeof(gc_collision_system), + ctr: &ctr, + dtr: &dtr, + check_dependencies: &system_check_dependencies, + update_entity: &col_update_entity, + destroy: &system_destroy + }, + tree: NULL +}; \ No newline at end of file diff --git a/lib/gamacon/src/systems/controllers/keyboard_controller_system.c b/lib/gamacon/src/systems/controllers/keyboard_controller_system.c new file mode 100644 index 0000000..90e539d --- /dev/null +++ b/lib/gamacon/src/systems/controllers/keyboard_controller_system.c @@ -0,0 +1,44 @@ +/* +** EPITECH PROJECT, 2019 +** MUL_my_runner_2019 +** File description: +** movable_system +*/ + +#include "entity.h" +#include "system.h" +#include "vector2.h" +#include "components/movable_component.h" +#include "components/controllable_component.h" +#include "components/controllers/keyboard_controller.h" +#include "components/renderer.h" +#include + +void keyboard_update_entity(gc_engine *engine, void *system, \ +gc_entity *entity, float dtime) +{ + struct controllable_component *con = GETCMP(controllable_component); + struct keyboard_controller *key = GETCMP(keyboard_controller); + + con->moving_left = engine->is_keypressed(key->left_key); + con->moving_right = engine->is_keypressed(key->right_key); + con->jumping = engine->is_keypressed(key->jump_key); + (void)system; + (void)dtime; +} + +void keyboard_destroy(void *system) +{ + (void)system; +} + +const gc_system keyboard_controller_system = { + name: "keyboard_controller_system", + component_name: "keyboard_controller", + size: sizeof(gc_system), + ctr: NULL, + dtr: NULL, + check_dependencies: &system_check_dependencies, + update_entity: &keyboard_update_entity, + destroy: &keyboard_destroy +}; \ No newline at end of file diff --git a/lib/gamacon/src/systems/fixed_to_cam_pseudosystem.c b/lib/gamacon/src/systems/fixed_to_cam_pseudosystem.c new file mode 100644 index 0000000..a45c36a --- /dev/null +++ b/lib/gamacon/src/systems/fixed_to_cam_pseudosystem.c @@ -0,0 +1,59 @@ +/* +** EPITECH PROJECT, 2020 +** Twac +** File description: +** update_to_cam +*/ + +#include "entity.h" +#include "scene.h" +#include "systems/camerafollow_system.h" +#include "component.h" +#include "components/transform_component.h" +#include "components/fixed_to_cam_component.h" +#include "systems/sfml_renderer_system.h" +#include "my.h" +#include + +void entities_update_to_cam(gc_scene *scene, \ +struct sfml_renderer_system *renderer, struct camerafollow_system *cam) +{ + gc_list *list; + gc_entity *entity; + sfVector2f size; + gc_vector2 offset; + struct transform_component *tra; + + list = scene->get_entity_by_cmp(scene, "fixed_to_cam"); + for (gc_list *li = list; li; li = li->next) { + entity = (gc_entity *)li->data; + tra = GETCMP(transform_component); + if (!tra) + continue; + size = sfView_getSize(renderer->view); + offset = GETCMP(fixed_to_cam)->offset; + tra->position = (gc_vector2) { + cam->cam_pos.x - size.x / 2 + offset.x, + cam->cam_pos.y + size.y / 2 - offset.y, + }; + } +} + +void entities_update_to_cam_size(gc_scene *scene, gc_vector2 size) +{ + gc_list *list; + gc_entity *entity; + struct transform_component *tra; + + list = scene->get_entity_by_cmp(scene, "fixed_to_cam"); + for (gc_list *li = list; li; li = li->next) { + entity = (gc_entity *)li->data; + tra = GETCMP(transform_component); + if (!tra) + continue; + tra->size = (gc_vector2) { + size.x, + size.y + }; + } +} \ No newline at end of file diff --git a/lib/gamacon/src/systems/friction_system.c b/lib/gamacon/src/systems/friction_system.c new file mode 100644 index 0000000..14e7335 --- /dev/null +++ b/lib/gamacon/src/systems/friction_system.c @@ -0,0 +1,46 @@ +/* +** EPITECH PROJECT, 2019 +** MUL_my_runner_2019 +** File description: +** friction +*/ + +#include "entity.h" +#include "system.h" +#include "vector2.h" +#include "utility.h" +#include "components/movable_component.h" +#include "components/friction_component.h" +#include "components/collision_component.h" +#include "math.h" +#include + +void fric_update_entity(gc_engine *engine, void *system, \ +gc_entity *entity, float dtime) +{ + struct friction_component *fric = GETCMP(friction_component); + struct movable_component *mov = GETCMP(movable_component); + + mov->acceleration.x -= fric->value * mov->velocity.x; + mov->acceleration.y -= fric->value * mov->velocity.y; + fric->value = fric->default_value; + (void)system; + (void)engine; + (void)dtime; +} + +void fric_destroy(void *system) +{ + (void)system; +} + +const gc_system friction_system = { + name: "friction_system", + component_name: "friction_component", + size: sizeof(gc_system), + ctr: NULL, + dtr: NULL, + check_dependencies: &system_check_dependencies, + update_entity: &fric_update_entity, + destroy: &fric_destroy +}; \ No newline at end of file diff --git a/lib/gamacon/src/systems/movable_system.c b/lib/gamacon/src/systems/movable_system.c new file mode 100644 index 0000000..9583872 --- /dev/null +++ b/lib/gamacon/src/systems/movable_system.c @@ -0,0 +1,73 @@ +/* +** EPITECH PROJECT, 2019 +** MUL_my_runner_2019 +** File description: +** movable_system +*/ + +#include "entity.h" +#include "system.h" +#include "vector2.h" +#include "utility.h" +#include "components/movable_component.h" +#include "components/collision_component.h" +#include "components/transform_component.h" +#include "components/renderer.h" +#include "systems/movable_system.h" +#include + +#include "components/controllable_component.h" + +void clamp_vel(struct movable_component *mov, struct collision_component *col) +{ + if ((col->distance_left == 0 && mov->velocity.x < 0) || + (col->distance_right == 0 && mov->velocity.x > 0)) + mov->velocity.x = 0; + if ((col->distance_down == 0 && mov->velocity.y < 0) || + (col->distance_top == 0 && mov->velocity.y > 0)) + mov->velocity.y = 0; +} + +static void update_entity(gc_engine *engine __attribute__((unused)), \ +void *system __attribute__((unused)), gc_entity *entity, float dtime) +{ + struct movable_component *mov = GETCMP(movable_component); + struct transform_component *pos = GETCMP(transform_component); + struct collision_component *col = GETCMP(collision_component); + + if (mov->velocity.x < 0) + pos->position.x -= MIN(mov->velocity.x * -dtime, col->distance_left); + else + pos->position.x += MIN(mov->velocity.x * dtime, col->distance_right); + if (mov->velocity.y < 0) + pos->position.y -= MIN(mov->velocity.y * -dtime, col->distance_down); + else + pos->position.y += MIN(mov->velocity.y * dtime, col->distance_top); + clamp_vel(mov, col); + mov->velocity.x += mov->acceleration.x * dtime; + mov->velocity.y += mov->acceleration.y * dtime; + mov->acceleration.x = 0; + mov->acceleration.y = 0; +} + +static void ctr(void *system, va_list args) +{ + (void)system; + (void)args; +} + +static void dtr(void *system) +{ + (void)system; +} + +const gc_system movable_system = { + name: "movable_system", + component_name: "movable_component", + size: sizeof(gc_system), + ctr: &ctr, + dtr: &dtr, + check_dependencies: &system_check_dependencies, + update_entity: &update_entity, + destroy: &system_destroy +}; \ No newline at end of file diff --git a/lib/gamacon/src/systems/parallax_system.c b/lib/gamacon/src/systems/parallax_system.c new file mode 100644 index 0000000..3818e03 --- /dev/null +++ b/lib/gamacon/src/systems/parallax_system.c @@ -0,0 +1,49 @@ +/* +** EPITECH PROJECT, 2019 +** MUL_my_runner_2019 +** File description: +** parallax_system +*/ + +#include "entity.h" +#include "system.h" +#include "sprite.h" +#include "vector2.h" +#include "components/parallax_component.h" +#include "components/renderer.h" +#include "components/transform_component.h" +#include + +void parallax_update_entity(gc_engine *engine, void *system, \ +gc_entity *entity, float dtime) +{ + struct renderer *text = GETCMP(renderer); + struct parallax_component *par = GETCMP(parallax_component); + struct transform_component *tra = GETCMP(transform_component); + gc_sprite *sprite; + + if (text->type != GC_TEXTUREREND || !text->data) + return; + sprite = ((gc_sprite *)text->data); + sprite->rect.left += (tra->position.x - par->old_pos.x) * par->speed; + par->old_pos = tra->position; + (void)system; + (void)engine; + (void)dtime; +} + +void parallax_destroy(void *system) +{ + (void)system; +} + +const gc_system parallax_system = { + name: "parallax_system", + component_name: "parallax_component", + size: sizeof(gc_system), + ctr: NULL, + dtr: NULL, + check_dependencies: &system_check_dependencies, + update_entity: ¶llax_update_entity, + destroy: ¶llax_destroy +}; \ No newline at end of file diff --git a/lib/gamacon/src/systems/sfml_renderer_system.c b/lib/gamacon/src/systems/sfml_renderer_system.c new file mode 100644 index 0000000..8fe3c65 --- /dev/null +++ b/lib/gamacon/src/systems/sfml_renderer_system.c @@ -0,0 +1,104 @@ +/* +** EPITECH PROJECT, 2019 +** MUL_my_runner_2019 +** File description: +** texture_renderer_system +*/ + +#include "entity.h" +#include "system.h" +#include "vector2.h" +#include "sprite.h" +#include "systems/sfml_renderer_system.h" +#include "components/transform_component.h" +#include "components/renderer.h" +#include "my.h" +#include "sfml_renderer.h" +#include "text.h" +#include + +void sfml_update_entity(gc_engine *engine, void *system, \ +gc_entity *entity, float dtime) +{ + struct transform_component *pos = GETCMP(transform_component); + struct renderer *text = GETCMP(renderer); + struct sfml_renderer_system *rend = (struct sfml_renderer_system *)system; + + if (!text->data) + return; + switch (text->type) { + case GC_TEXTUREREND: + sfmlrenderer_draw_texture(rend, pos, (gc_sprite *)text->data); + break; + case GC_ANIMREND: + sfmlrenderer_draw_anim(rend, pos, (gc_animholder *)text->data, dtime); + break; + case GC_TXTREND: + sfmlrenderer_draw_txt(rend, pos, (gc_text *)text->data); + break; + default: + my_printf("Trying to render a texture with an unknown type.\n"); + break; + } + (void)engine; +} + +void sfml_setup_options(gc_engine *engine) +{ + engine->is_open = &sfml_is_open; + engine->has_focus = &sfml_has_focus; + engine->is_keypressed = &sfml_is_keypressed; + engine->handle_events = &sfml_handle_events; + engine->draw = &sfml_draw; + engine->play_music = &sfml_play_music; + engine->stop_music = &sfml_stop_music; +} + +void sfmlrend_ctr(void *rend, va_list list) +{ + struct sfml_renderer_system *renderer = (struct sfml_renderer_system *)rend; + sfVideoMode mode = {800, 600, 32}; + gc_engine *engine = va_arg(list, gc_engine *); + const char *title = va_arg(list, const char *); + int framerate = va_arg(list, int); + + renderer->window = sfRenderWindow_create(mode, title, sfDefaultStyle, NULL); + renderer->sprite = sfSprite_create(); + renderer->view = sfView_create(); + renderer->text = sfText_create(); + if (!renderer->window || !renderer->sprite || \ +!renderer->view || !renderer->text) + return; + sfRenderWindow_setFramerateLimit(renderer->window, framerate); + sfView_setSize(renderer->view, (sfVector2f){800, 600}); + sfView_setCenter(renderer->view, (sfVector2f){400, -300}); + sfRenderWindow_setView(renderer->window, renderer->view); + sfml_setup_options(engine); +} + +void sfmlrend_dtr(void *system) +{ + struct sfml_renderer_system *renderer = (struct sfml_renderer_system *)\ +system; + + sfRenderWindow_destroy(renderer->window); + sfSprite_destroy(renderer->sprite); + sfText_destroy(renderer->text); + sfView_destroy(renderer->view); +} + +const struct sfml_renderer_system sfml_renderer = { + { + name: "sfml_renderer_system", + component_name: "renderer", + size: sizeof(struct sfml_renderer_system), + ctr: &sfmlrend_ctr, + dtr: &sfmlrend_dtr, + check_dependencies: &system_check_dependencies, + update_entity: &sfml_update_entity, + destroy: &system_destroy + }, + window: NULL, + sprite: NULL, + view: NULL +}; \ No newline at end of file diff --git a/lib/gamacon/src/utility/arraylen.c b/lib/gamacon/src/utility/arraylen.c new file mode 100644 index 0000000..83aae12 --- /dev/null +++ b/lib/gamacon/src/utility/arraylen.c @@ -0,0 +1,15 @@ +/* +** EPITECH PROJECT, 2019 +** MUL_my_runner_2019 +** File description: +** arraylen +*/ + +int arraylen(const char **array) +{ + int i = 0; + + while (array[i]) + i++; + return (i); +} \ No newline at end of file diff --git a/lib/gamacon/src/utility/list.c b/lib/gamacon/src/utility/list.c new file mode 100644 index 0000000..da5154a --- /dev/null +++ b/lib/gamacon/src/utility/list.c @@ -0,0 +1,29 @@ +/* +** EPITECH PROJECT, 2019 +** MUL_my_runner_2019 +** File description: +** list +*/ + +#include "list.h" +#include + +gc_list *list_add(gc_list *list, void *obj) +{ + gc_list *listconst = list; + + if (!list) { + list = malloc(sizeof(gc_list)); + listconst = list; + } else { + while (list->next) + list = list->next; + list->next = malloc(sizeof(gc_list)); + list = list->next; + } + if (!list) + return (NULL); + list->data = obj; + list->next = NULL; + return (listconst); +} \ No newline at end of file diff --git a/lib/gamacon/src/utility/my_realloc.c b/lib/gamacon/src/utility/my_realloc.c new file mode 100644 index 0000000..481c696 --- /dev/null +++ b/lib/gamacon/src/utility/my_realloc.c @@ -0,0 +1,23 @@ +/* +** EPITECH PROJECT, 2020 +** Twac +** File description: +** my_realloc +*/ + +#include +#include + +void *my_realloc(void *oldptr, size_t oldsize, size_t newsize) +{ + void *new = malloc(newsize); + + if (oldptr && new) { + for (size_t i = 0; i < oldsize && i < newsize; i++) { + ((char *)new)[i] = ((char *)oldptr)[i]; + } + } + if (oldptr) + free(oldptr); + return (new); +} \ No newline at end of file diff --git a/lib/gamacon/src/utility/tupple.c b/lib/gamacon/src/utility/tupple.c new file mode 100644 index 0000000..ffdd560 --- /dev/null +++ b/lib/gamacon/src/utility/tupple.c @@ -0,0 +1,60 @@ +/* +** EPITECH PROJECT, 2019 +** MUL_my_runner_2019 +** File description: +** tupple +*/ + +#include "tupple.h" +#include "entity.h" +#include "utility.h" +#include + +static int tupple_add_existing(gc_tupple *li, const char *name, gc_entity *ent) +{ + while (li && my_strcmp(li->name, name)) + li = li->next; + if (!li) + return (-1); + li->entities = list_add(li->entities, ent); + return (0); +} + +gc_tupple *tupple_add(gc_tupple *list, const char *name, gc_entity *entity) +{ + gc_tupple *listconst = list; + + if (!list) { + list = malloc(sizeof(gc_tupple)); + listconst = list; + } else { + if (!tupple_add_existing(list, name, entity)) + return (listconst); + while (list->next) + list = list->next; + list->next = malloc(sizeof(gc_tupple)); + list = list->next; + } + if (!list) + return (NULL); + list->name = my_strdup(name); + list->entities = list_add(NULL, entity); + list->next = NULL; + return (listconst); +} + +void tup_remove(gc_tupple *tup, int id) +{ + gc_list *prev = NULL; + + for (gc_list *ent = tup->entities; ent; ent = ent->next) { + if (((gc_entity *)ent->data)->id == id) { + if (prev) + prev->next = ent->next; + else + tup->entities = ent->next; + return; + } + prev = ent; + } +} \ No newline at end of file diff --git a/lib/gamacon/src/utility/vector2.c b/lib/gamacon/src/utility/vector2.c new file mode 100644 index 0000000..bb61b51 --- /dev/null +++ b/lib/gamacon/src/utility/vector2.c @@ -0,0 +1,24 @@ +/* +** EPITECH PROJECT, 2019 +** MUL_my_runner_2019 +** File description: +** vector2 +*/ + +#include "vector2.h" +#include "utility.h" +#include "math.h" + +float gcvector_magnitude(gc_vector2 vec) +{ + return (sqrt(pow(vec.x, 2) + pow(vec.y, 2))); +} + +gc_vector2 gcvector2_normilize(gc_vector2 vec) +{ + float mag = gcvector_magnitude(vec); + + vec.x = vec.x / mag; + vec.y = vec.y / mag; + return (vec); +} \ No newline at end of file diff --git a/lib/gamacon/tests/deserializations.c b/lib/gamacon/tests/deserializations.c new file mode 100644 index 0000000..8131e99 --- /dev/null +++ b/lib/gamacon/tests/deserializations.c @@ -0,0 +1,28 @@ +/* +** EPITECH PROJECT, 2019 +** MUL_my_runner_2019 +** File description: +** deserializations +*/ + +#include +#include +#include "engine.h" +#include "prefab.h" + +Test(deserialization, deserialize_entity) +{ + gc_engine *engine = engine_create(); + gc_scene *scene = scene_create((const char **){ NULL }); + int ret; + + engine->change_scene(engine, scene); + ret = prefab_load(engine, "tests/player.gcprefab"); + cr_assert_eq(ret, 0); + cr_assert_neq(engine->scene, NULL); + cr_assert_eq(((gc_entity *)engine->scene->entities->data)->id, 0); + cr_assert_str_eq(((gc_entity *)engine->scene->entities->data)->components->name, "transform_component"); + cr_assert_str_eq(((gc_entity *)engine->scene->entities->data)->components->next->name, "renderer"); + cr_assert_str_eq(((gc_entity *)engine->scene->entities->data)->components->next->next->name, "movable_component"); + cr_assert_str_eq(((gc_entity *)engine->scene->entities->data)->components->next->next->next->name, "controllable_component"); +} \ No newline at end of file diff --git a/lib/gamacon/tests/game.gcprefab b/lib/gamacon/tests/game.gcprefab new file mode 100644 index 0000000..40aa56c --- /dev/null +++ b/lib/gamacon/tests/game.gcprefab @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/lib/gamacon/tests/game_loop.c b/lib/gamacon/tests/game_loop.c new file mode 100644 index 0000000..13953fe --- /dev/null +++ b/lib/gamacon/tests/game_loop.c @@ -0,0 +1,27 @@ +/* +** EPITECH PROJECT, 2019 +** MUL_my_runner_2019 +** File description: +** game_loop +*/ + +#include +#include "engine.h" +#include "prefab.h" + +Test(getentities, filter) +{ + gc_engine *engine = engine_create(); + gc_scene *scene = scene_create((const char **){ NULL }); + gc_list *list; + int count = 0; + + engine->change_scene(engine, scene); + prefab_load(engine, "tests/game.gcprefab"); + list = engine->scene->get_entity_by_cmp(engine->scene, "movable_component"); + while (list) { + count++; + list = list->next; + } + cr_assert_eq(count, 3); +} \ No newline at end of file diff --git a/lib/gamacon/tests/player.gcprefab b/lib/gamacon/tests/player.gcprefab new file mode 100644 index 0000000..99b741c --- /dev/null +++ b/lib/gamacon/tests/player.gcprefab @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/lib/my/Makefile b/lib/my/Makefile new file mode 100644 index 0000000..52460df --- /dev/null +++ b/lib/my/Makefile @@ -0,0 +1,62 @@ +## +## EPITECH PROJECT, 2019 +## PSU_my_printf_bootstrap_2019 +## File description: +## Makefile +## + +SRC = src/printf.c \ + src/printf_utility.c \ + src/my_putlonglong_base.c \ + src/formaters/string_formater.c \ + src/formaters/string_nonprintable_formater.c \ + src/formaters/char_formater.c \ + src/formaters/int_formater.c \ + src/formaters/uint_formater.c \ + src/formaters/ptr_formater.c \ + src/formaters/ubinary_formater.c \ + src/formaters/octal_formater.c \ + src/formaters/hexa_formater.c \ + src/formaters/big_hexa_formater.c \ + src/formaters/float_formater.c \ + src/formaters/no_format.c \ + src/get_nbr_size.c \ + my/*.c + +OBJ = *.o + +TESTS = tests/test_printf.c + +INCLUDE = -I ./include + +COVERAGE = --coverage -lcriterion + +CC = gcc + +CFLAGS = -Wall -Wshadow -Wextra -Wno-unused-parameter + +NAME = libmy.a + +UT = ut + +all: build + +build: + $(CC) -c $(SRC) $(INCLUDE) $(CFLAGS) + ar rc $(NAME) $(OBJ) + +tests_run: + $(CC) -o $(UT) $(SRC) $(TESTS) $(INCLUDE) $(COVERAGE) $(CFLAGS) + ./$(UT) + +clean: + rm -rf $(OBJ) + rm -rf *.gc* + +fclean: clean + rm -rf $(NAME) + rm -rf $(UT) + +re: fclean all + +.PHONY = all build clean fclean \ No newline at end of file diff --git a/lib/my/alphanum_helper.o b/lib/my/alphanum_helper.o new file mode 100644 index 0000000000000000000000000000000000000000..f2fad4cc09f4057d5111262202126acd9b2bbdfe GIT binary patch literal 1704 zcmbu9&ubG=5XWZ|)2OW`Ru6?L1_XbAE-DDNNZB-OvPdvcTYsFEZL&4NBrVw&h=O>i zilLYO8U6**QwbC)z2$EZgh0G_^RQ57cHboHc5~4$yq$TUH#6_;>`UJ3#e7UrfTh3^ zjAu*%zQo7A=D8Zoz%;BG-5u&dOK+7L{?bKgWk=&!Y!^9pfA05cV zjM05JIMiK&!y7xgYn1!Ojy^Dye(Ecv_IsmxB7v*JE8DuOgu_1c+TZq$QAY<*$mJF@ zHw#bJZe-CW8TJ^1})oeG+s$Ji*TWT3!u5#Gw^jC9cHL5i-4UQxEMbAV?l_>9HyaJRiLALPY!xr;9Y5G0(2+CH%3E7+V#!oNwGoA48HiX}c`cJ=p&gcHqdBS@m0!<$Dp|tdyq1WmI^`@0u{BO(}z}DK}{Mb9W+?24R$w9(&+>9D9H^?g(_Go z458@KZ{SLF{?EDZd7(uk4T=K7 z6u1S|mY@JzN2`9&af8qXtq{}gANumIfNn39bUVML7quct0s7uoB&vZ)tirDDhG-6nGEmhDbg6Kv8~b%*IT^?`0{<)7~{C-(0fBp-D% z9>yTs_YNUf5pZ!hV=>u2u_G(%tlNbf&JO7b+yPt=ZiMX;Tie}k+|YJu|McahGO$6B zrCZ7p_}oB()j`s&(WyE4im~0EFZL!TK@a1~Tp_Z5|JpYRef~$DusWd9bkRE93Y2H#pcMQ{S8HR_8yxBkaw=q>Xy{P8|5Zb{?U?VQ zf)a<<`XlKP_`O%F&sX#20r>D&%Y2xrmia)stdhV7jZ&-X`k?lFeQ>NQ;@&B&JEVC! zYe#kgi=S)c>Si4tuEV2sc&rXL>Ts(Lhxpu#F>4h}V>**fnas+niTwKzn1hT zB>v8$=hNT&AnEBIh&%!G$tXXSimAE96f@(X=2+IPXN8xwlBUY60t0o*WG1NbTn^N1 z#%&}rsg#Aspr$j-Qt`cB&M`Cb6a^G!%^K5LGgaB|%6JEK0vJb2^S*>2GBR=h-Il8r zKGj`V=In}o^$UP;1Az#E~`{td^~V1LI|^D+%c;QrQ+1`o!r&0_%f&EZ0y2j(Dvz2WWct3-M5 zG#g2NpKD)vP#XlfUO7X=pZYl)#TXghR}9iA0^#QCr%I`jlU$Mu~HJ!Fp(r=>Mh%~njN=odydQMr`KSWD%ItD#i|yI&&?HUCBIxTE!cL~JO?bR z>)G{ntKM3-n)cd8*v+o!i6%0I_U9-cem}?tH8RR8~K)GuCrk? z&)M;SHEhoYw%Y9it9ROMXA`x}j^{8uJ-5R4fQ8{s%WArI+c~cPpG3!eIz#a%Y@kMv z&na3(v67RYL!%iPXe#!_5W+)`H_oBaKJqAE62aGn9zT)a#QnIV8Y*t$f@=P2{sQJw zP1z^X5OV*V6oi-iOTUD=$t4=k{|mU} Bn%V#W literal 0 HcmV?d00001 diff --git a/lib/my/float_formater.o b/lib/my/float_formater.o new file mode 100644 index 0000000000000000000000000000000000000000..3ef1c4e1c60f07b48abc50afb9a654cee7bd3acf GIT binary patch literal 1944 zcmbtU&1(};5TDIP8*OXSQbDNbdeK(uqJn4zHAzYPDA7u7u!68|}IW)#|?4N}bh#-9C9nEj;8?AdizNR$iF;FUMXnL9-uE8L85)Gjiq z#0sf$VKlfjjA*KC4+l58Tv{~5mRN{DW)Fud;Rsa19f@r;XzD9g!lzfcbJxj)d&t>G ztyIEy8tie0$aZ3D<5(fF#nL4=MQc*D>m_siGS#EA|S; z?N!cj)&o*WD)u_|mltc++gcm;r!p0NPrJmHE|C3!>?(>CdHfv(K7Uk6aanw>#$0pr z8Vn5#TvmF9ZlrpZe)YV1mUFtemL89SG#`<=+gd`)nEoi@G)NRG7dsSr85n5aFLz5w zsp5VUQG@Vv$1f)Po-}}rKR=N%lb^^?J%*-`3@uF<0W$daE5rUKekUTG4SiO>9kCNQ zB28?7i+kYlJ#ffO=X6WU0^x#p20?2H6Ge(X6G- zOqeidPFV&l@?HX{X*a}9z4qX3-2cTj@mg{G*>OcYMUh9~t#ptm#HSnrKiq&f=24JC zLV0M^M9nW`Eqwyiyk)w2Qdp)jt*e$XZ-IJWw{%b^@_A6roa>}>*{m^xv6-A@sCaSD zCnsD(Z7hZ{`3F?|Q<#XNOP?WL2j=@pLtyqfV`1WNh-J`YyD2um1us%kJ9% literal 0 HcmV?d00001 diff --git a/lib/my/get_nbr_size.o b/lib/my/get_nbr_size.o new file mode 100644 index 0000000000000000000000000000000000000000..e06d00a791a84a8cab512262e0c57c69850bf12e GIT binary patch literal 1472 zcmbtTPiqrF6n~p&TeV6ofx z2RfmIVw8Zo`qq zEWrE1kzPsF3e3VOSXJ>CHTY($xSy!_`JNieJr(aJ0~XF?G(nNWl& z6OCD>|H2>tgD)X7r`;$0M&#(5=`4>0BuqR!@gk?&4xI4mjwd=3bJOdB(`dGqt4*g> zuiuv|&PsK;DIM^8P8bDrPPmZn)H8sSxJHL#*cne_qKyiG2z!3ywoyjGSZ=Tuc$=<> zyzL0Yx*NG5+F=Nyv*r6<7rE|MtW<}o`Fc+y$$Da;QC%x?!SeN8E6LbFH}K} zz4Nd1brdp^F_uI^%&G9$cF_YXsrthF)>c2AdpZ;we&;2*m vrrZf_h?(rdH0uQ2m3;g!TU&st literal 0 HcmV?d00001 diff --git a/lib/my/hexa_formater.o b/lib/my/hexa_formater.o new file mode 100644 index 0000000000000000000000000000000000000000..283485e2eebd5ccb60e09daa53abf654754f1afe GIT binary patch literal 2328 zcmb_c%}*0S6n{&VFF`BeV1mXb7$b=;1w}yZcnn*C& zG(?a72cC>xym*0VBJsx2BNvkzJYa%J4<`8D?o2zZ+Y8|})A!~#zxT28X6AV`Hc}@^ zz(s=VP@QoU;QQgK9dXPEv_cES75j&>^ed#;izUU*Zz{#;rec3xO(Um7yrr`AYz)y- z5zX%TGh`~odqEen*A!_(DaK31wv}6rWZ2DH?Jg(MsH`Xsrr5LwiXAQge1|b{{l6sn zm>cmRl5E{RfLKMqkHd<2v0=U=%WGDr3$8mmq$F_%@Plw8Y!|VkJ6jFw(H+`9WofYt zRv(YjDMSfAiTV@A8%Y0WFc7 z(x(ANhlj6*&W+xUcZCMzUYW{8X?GP!Psc$j1f`CahQ`;J>LlVcNIp{P!K1;Kb;GUo zfe#W=9Nh1ZsE6S9uHRa~_v8Tt@aHE1jN~T)5Du$A2tb1{tC|7uuQveoRT8s~qiz%G zbiN(2(>Q{RBP!~RAAYR{ezOLCrw0D82L7l94k^8$snaB*AnagJ_{Lfn2Y}SOdW?E_{HwBpmbw;$IZK!Eo?b95E%_J;6!$42m}2 ze-4kM;n%-O_O$XoQUA!7`*YkcH^rW0`QNaD=`CpT@h8mNJA`1Hflp{6i1+*Ho%Zve MWA$r-FPUEde}bZGegFUf literal 0 HcmV?d00001 diff --git a/lib/my/include/formaters.h b/lib/my/include/formaters.h new file mode 100644 index 0000000..4d0d88e --- /dev/null +++ b/lib/my/include/formaters.h @@ -0,0 +1,37 @@ +/* +** EPITECH PROJECT, 2019 +** Formater struct +** File description: +** formaters +*/ + +#pragma once +#include + +#define MODIFIERS_SIZE 50 + +typedef struct formater +{ + int (*func)(va_list ap, char modifiers[MODIFIERS_SIZE]); + char flag; +} formater_t; + +int string_formater(va_list ap, char modifiers[MODIFIERS_SIZE]); +int string_nonprintable_formater(va_list ap, char modifiers[MODIFIERS_SIZE]); +int char_formater(va_list ap, char modifiers[MODIFIERS_SIZE]); +int int_formater(va_list ap, char modifiers[MODIFIERS_SIZE]); +int uint_formater(va_list ap, char modifiers[MODIFIERS_SIZE]); +int ptr_formater(va_list ap, char modifiers[MODIFIERS_SIZE]); +int ubinary_formater(va_list ap, char modifiers[MODIFIERS_SIZE]); +int octal_formater(va_list ap, char modifiers[MODIFIERS_SIZE]); +int hexa_formater(va_list ap, char modifiers[MODIFIERS_SIZE]); +int big_hexa_formater(va_list ap, char modifiers[MODIFIERS_SIZE]); +int float_formater(va_list ap, char modifiers[MODIFIERS_SIZE]); +int no_format(va_list ap, char modifiers[MODIFIERS_SIZE]); + +int count(char c, char *str); +int contains(char c, char *str); +int get_nbr_len(long long int n, const char *base); +int is_modifier(char c); +int last_mod(char *modifiers); +int my_putlonglong_base(long long int nbr, const char *base, int length); \ No newline at end of file diff --git a/lib/my/include/my.h b/lib/my/include/my.h new file mode 100644 index 0000000..3102a6f --- /dev/null +++ b/lib/my/include/my.h @@ -0,0 +1,127 @@ +/* +** EPITECH PROJECT, 2019 +** My lib +** File description: +** Header file +*/ +#pragma once + +int my_str_islower_or_num(const char *str); + +int my_printf(const char *str, ...); + +void print_ptr(void *ptr); + +void print_str_to(char *ptr, int max); + +int count_valid_queens_placements(int n); + +int my_compute_power_it(int n, int p); + +int my_compute_power_rec(int n, int p); + +int my_compute_factorial_it(int n); + +int my_compute_factorial_rec(int n); + +int my_sqrt(int nb); + +char *my_evil_str(char *str); + +int my_find_prime_sup(int n); + +int my_getnbr_base(const char *str, const char *base); + +int my_getnbr(const char *str); + +int my_isneg(int n); + +int my_is_prime(int n); + +void my_print_alpha(void); + +void my_print_comb2(void); + +void my_print_combn(int n); + +void my_print_comb(void); + +void my_print_digits(void); + +void my_print_revalpha(void); + +void my_putchar(char c); + +int my_putlong_base(long long nbr, const char *base); + +void my_putnbr_base(int n, const char *base); + +void my_put_nbr(int n); + +void my_putstr(const char *str); + +void my_revstr(char *str); + +int my_showmem(char *str, int size); + +void my_showstr(const char *str); + +void my_sort_int_array(int *array); + +int is_letter(char c); + +int is_alpha(char c); + +int is_num(char c); + +int is_digit(char c); + +char *my_strcapitalize(char *str); + +char *my_strcat(char *dest, const char *str); + +int my_strcmp(const char *s1, const char *s2); + +char *my_strcpy(char *dest, const char *src); + +int my_str_isalpha(const char *str); + +int is_lowercase(char c); + +int my_str_islower(const char *str); + +int my_str_isnum(const char *str); + +int is_printable(char c); +int my_str_isprintable(const char *str); + +int is_upper(char c); +int my_str_isupper(const char *str); + +int my_strlen(const char *str); + +int my_strlowcase(const char *str); + +char *my_strncat(char *dest, const char *str, int n); + +int my_strncmp(const char *s1, const char *s2, int n); + +char *my_strncpy(char *dest, const char *src, int n); + +char *my_strstr(const char *str, const char *to_find); + +int my_strupcase(const char *str); + +void my_swap(int *a, int *b); + +char *my_strdup(const char *str); + +char **my_str_to_word_array(const char *str); + +int my_show_word_array(const char **words); + +int is_alphanum(char c); + +int first_alphanum(const char *str); + +int index_of(const char *str, char c); \ No newline at end of file diff --git a/lib/my/index_of.o b/lib/my/index_of.o new file mode 100644 index 0000000000000000000000000000000000000000..6cd4389617a817e1c6bfd43394d4c318251add3c GIT binary patch literal 1280 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 YGTtK2M?Aa!E?&Qe>3>8J*|+ikFVZ_-o&W#< literal 0 HcmV?d00001 diff --git a/lib/my/my/alphanum_helper.c b/lib/my/my/alphanum_helper.c new file mode 100644 index 0000000..25a02b9 --- /dev/null +++ b/lib/my/my/alphanum_helper.c @@ -0,0 +1,24 @@ +/* +** EPITECH PROJECT, 2019 +** Helper for the task 4 +** File description: +** alphanum_helper +*/ + +int is_alpha(char c); + +int is_digit(char c); + +int is_alphanum(char c) +{ + return (is_alpha(c) || is_digit(c)); +} + +int first_alphanum(const char *str) +{ + for (int i = 0; str[i]; i++) { + if (is_alphanum(str[i])) + return i; + } + return (-1); +} diff --git a/lib/my/my/index_of.c b/lib/my/my/index_of.c new file mode 100644 index 0000000..733857c --- /dev/null +++ b/lib/my/my/index_of.c @@ -0,0 +1,15 @@ +/* +** EPITECH PROJECT, 2019 +** String helper +** File description: +** Index of char in a string +*/ + +int index_of(const char *str, const char c) +{ + for (int i = 0; str[i]; i++) { + if (str[i] == c) + return (i); + } + return (-1); +} \ No newline at end of file diff --git a/lib/my/my/my_compute_factorial_it.c b/lib/my/my/my_compute_factorial_it.c new file mode 100644 index 0000000..37f87bc --- /dev/null +++ b/lib/my/my/my_compute_factorial_it.c @@ -0,0 +1,22 @@ +/* +** EPITECH PROJECT, 2019 +** CPool_Day05_2019 +** File description: +** Factorials +*/ + +int my_compute_factorial_it(int nb) +{ + if (nb < 0) + return 0; + + int ret = 1; + while (nb > 0) { + ret *= nb; + nb--; + + if (ret < 0) + return 0; + } + return ret; +} diff --git a/lib/my/my/my_compute_factorial_rec.c b/lib/my/my/my_compute_factorial_rec.c new file mode 100644 index 0000000..de2d6e4 --- /dev/null +++ b/lib/my/my/my_compute_factorial_rec.c @@ -0,0 +1,25 @@ +/* +** EPITECH PROJECT, 2019 +** CPool_Day05_2019 +** File description: +** Factorials but in recursive mode +*/ + +int compute(int nb, int ret) +{ + if (ret < 0) + return (0); + + if (nb == 0) + return (ret); + + return (compute(nb - 1, ret * nb)); +} + +int my_compute_factorial_rec(int nb) +{ + if (nb == 0) + return (1); + + return (compute(nb, 1)); +} diff --git a/lib/my/my/my_compute_power_it.c b/lib/my/my/my_compute_power_it.c new file mode 100644 index 0000000..a9481bb --- /dev/null +++ b/lib/my/my/my_compute_power_it.c @@ -0,0 +1,29 @@ +/* +** EPITECH PROJECT, 2019 +** CPool_Day05_2019 +** File description: +** Power calculator +*/ + +int my_pow(int nb, int p) +{ + int ret = 1; + int mult = 1; + + if (p < 0) + return 0; + if (nb < 0) { + nb *= -1; + if (p % 2 == 1) + mult = -1; + } + while (p > 0) { + ret *= nb; + p--; + + if (ret < 0) + return (0); + } + + return (ret * mult); +} diff --git a/lib/my/my/my_compute_square_root.c b/lib/my/my/my_compute_square_root.c new file mode 100644 index 0000000..16e03e6 --- /dev/null +++ b/lib/my/my/my_compute_square_root.c @@ -0,0 +1,22 @@ +/* +** EPITECH PROJECT, 2019 +** CPool_Day05_2019 +** File description: +** Square root calculator +*/ + +int my_sqrt(int nb) +{ + if (nb < 0) + return 0; + + for (int i = 0; 1; i++) { + int power = i * i; + if (power == nb) + return i; + else if (power > nb) + return 0; + } + + return 0; +} diff --git a/lib/my/my/my_evil_str.c b/lib/my/my/my_evil_str.c new file mode 100644 index 0000000..3487c64 --- /dev/null +++ b/lib/my/my/my_evil_str.c @@ -0,0 +1,28 @@ +/* +** EPITECH PROJECT, 2019 +** CPool_Day04_2019 +** File description: +** Reverse string +*/ + +int my_putchar(char c); + +char *my_evil_str(char *str) +{ + int count = 0; + char buf[1598246]; + + while (1) { + buf[count] = str[count]; + if (*(str + count) != '\0') + count++; + else + break; + } + + for (int i = 0; i < count; i++) + str[i] = buf[count - i - 1]; + + str[count + 1] = '\0'; + return str; +} diff --git a/lib/my/my/my_find_prime_sup.c b/lib/my/my/my_find_prime_sup.c new file mode 100644 index 0000000..50ca6a8 --- /dev/null +++ b/lib/my/my/my_find_prime_sup.c @@ -0,0 +1,18 @@ +/* +** EPITECH PROJECT, 2019 +** CPool_Day05_2019 +** File description: +** Find a prime number greater than the given number +*/ + +int my_is_prime(int n); + +int my_find_prime_sup(int n) +{ + if (n <= 2) + return (2); + while (!my_is_prime(n)) + n++; + + return n; +} diff --git a/lib/my/my/my_getnbr.c b/lib/my/my/my_getnbr.c new file mode 100755 index 0000000..e5832e0 --- /dev/null +++ b/lib/my/my/my_getnbr.c @@ -0,0 +1,69 @@ +/* +** EPITECH PROJECT, 2019 +** CPool_Day04_2019 +** File description: +** Int parser +*/ + +int my_putchar(char c); + +static int parse(const char *str, int digit_count, int neg) +{ + int n = 0; + int add; + for (int power = 0; power < digit_count; power++) { + add = str[digit_count - power - 1] - '0'; + if (power == 10 && add > 2) + return 0; + + add *= neg; + for (int i = 0; i < power; i++) { + add *= 10; + if (add * neg < 0) + return 0; + } + n += add; + + if ((neg == -1 && n > 0) || (neg == 1 && n < 0)) + return 0; + } + return n; +} + +static int init_print(const char *str, int count, int s_index) +{ + int neg = 1; + + for (char c = str[s_index]; c == '-' || c == '+'; c = str[s_index]) { + if (c == '-') + neg *= -1; + s_index++; + count--; + } + + char buf[count]; + for (int i = 0; i < count; i++) + buf[i] = str[s_index + i]; + + + return parse(buf, count, neg); +} + +int my_getnbr(const char *str) +{ + int count = 0; + int start_index = -1; + char c; + + for (int i = 0; 1; i++) { + c = str[i]; + if ((c >= '0' && c <= '9') || c == '-' || c == '+') { + if (start_index == -1) + start_index = i; + count++; + } + else if (count > 0 || c == '\0') + break; + } + return init_print(str, count, start_index); +} diff --git a/lib/my/my/my_getnbr_base.c b/lib/my/my/my_getnbr_base.c new file mode 100644 index 0000000..e309364 --- /dev/null +++ b/lib/my/my/my_getnbr_base.c @@ -0,0 +1,75 @@ +/* +** EPITECH PROJECT, 2019 +** Get number with any base +** File description: +** Int library +*/ + +int my_strlen(const char *str); + +int my_pow(int i, int p); + +static int indexof(char c, const char *str) +{ + for (int i = 0; str[i] != '\0'; i++) { + if (str[i] == c) + return (i); + } + return (-1); +} + +static int parse(char *str, const char *base, long n, int i) +{ + int str_length = my_strlen(str); + int base_length = my_strlen(base); + int power; + int neg = 1; + + if (i < 0) { + neg = -1; + i *= -1; + } + power = my_pow(base_length, i - 1); + n += indexof(str[str_length - i], base) * power * neg; + if ((n > 0 && neg < 0) || (n < 0 && neg > 0)) + return (0); + if (str_length - i > 0) + return (parse(str, base, n, (i + 1) * neg)); + return (n); +} + +static int get_digit_count(const char *str, const char *base) +{ + int count = 0; + + for (int i = 0; str[i] != '\0'; i++) { + if (indexof(str[i], base) != -1) + count++; + else if (count > 0) + return (count); + } + return (count); +} + +int my_getnbr_base(const char *str, const char *base) +{ + int length = get_digit_count(str, base); + char num[length + 1]; + int start_index = 0; + int neg = 1; + + if (length == 0) + return 0; + for (int i = 0; str[i] != '\0'; i++) { + if (indexof(str[i], base) != -1) { + num[start_index] = str[i]; + start_index++; + } + else if (str[i] == '-') + neg *= -1; + else + break; + } + num[length] = '\0'; + return (parse(num, base, 0, neg)); +} diff --git a/lib/my/my/my_is_prime.c b/lib/my/my/my_is_prime.c new file mode 100644 index 0000000..18c5723 --- /dev/null +++ b/lib/my/my/my_is_prime.c @@ -0,0 +1,26 @@ +/* +** EPITECH PROJECT, 2019 +** CPool_Day05_2019 +** File description: +** Check if a number is a prime number +*/ + +int my_compute_square_root(int n); + +int my_is_prime(int n) +{ + int square; + + if (n <= 1) + return (0); + if (n == 2) + return (1); + for (int i = 0; i * i <= n; i++) + square = i; + for (int i = 2; i < square + 1; i++) { + if (n % i == 0) + return 0; + } + + return (1); +} diff --git a/lib/my/my/my_isneg.c b/lib/my/my/my_isneg.c new file mode 100644 index 0000000..9a91bd3 --- /dev/null +++ b/lib/my/my/my_isneg.c @@ -0,0 +1,17 @@ +/* +** EPITECH PROJECT, 2019 +** CPool_Day03_2019 +** File description: +** Task 4 +*/ + +int my_putchar(char c); + +int my_isneg(int n) +{ + if (n < 0) + my_putchar('N'); + else + my_putchar('P'); + return (0); +} diff --git a/lib/my/my/my_print_alpha.c b/lib/my/my/my_print_alpha.c new file mode 100644 index 0000000..9139faa --- /dev/null +++ b/lib/my/my/my_print_alpha.c @@ -0,0 +1,16 @@ +/* +** EPITECH PROJECT, 2019 +** CPool_Day03_2019 +** File description: +** First task +*/ + +int my_putchar(char c); + +int my_print_alpha(void) +{ + for (char i = 'a'; i <= 'z'; i++) { + my_putchar(i); + } + return (0); +} diff --git a/lib/my/my/my_print_comb.c b/lib/my/my/my_print_comb.c new file mode 100644 index 0000000..12b5280 --- /dev/null +++ b/lib/my/my/my_print_comb.c @@ -0,0 +1,46 @@ +/* +** EPITECH PROJECT, 2019 +** CPool_Day03_2019 +** File description: +** Task 5 +*/ + +int my_putchar(char c); + +static void print_c(char x, char y, char z) +{ + my_putchar(x); + my_putchar(y); + my_putchar(z); +} + +static void increment_y(char *x, char *y, char *z) +{ + *x = *x + 1; + *y = *x + 1; + *z = *y + 1; +} + +int my_print_comb(void) +{ + char x = '0'; + char y = '1'; + char z = '2'; + + while (1) { + print_c(x, y, z); + z++; + if (z > '9') { + y++; + z = y + 1; + } + if (y > '8') + increment_y(&x, &y, &z); + if (x <= '7') { + my_putchar(','); + my_putchar(' '); + } + else + return 0; + } +} diff --git a/lib/my/my/my_print_comb2.c b/lib/my/my/my_print_comb2.c new file mode 100644 index 0000000..fc60b16 --- /dev/null +++ b/lib/my/my/my_print_comb2.c @@ -0,0 +1,36 @@ +/* +** EPITECH PROJECT, 2019 +** CPool_Day03_2019 +** File description: +** Task 6 +*/ + +int my_putchar(char c); + +static void print_c2(int i, int j) +{ + my_putchar('0' + i / 10); + my_putchar('0' + i % 10); + my_putchar(' '); + my_putchar('0' + j / 10); + my_putchar('0' + j % 10); + + if (i != 98) { + my_putchar(','); + my_putchar(' '); + } +} + +static void get_group2(int i) +{ + for (int j = i + 1; j <= 99; j++) + print_c2(i, j); +} + +int my_print_comb2(void) +{ + for (int i = 0; i <= 98; i++) + get_group2(i); + + return (0); +} diff --git a/lib/my/my/my_print_combn.c b/lib/my/my/my_print_combn.c new file mode 100644 index 0000000..2907386 --- /dev/null +++ b/lib/my/my/my_print_combn.c @@ -0,0 +1,62 @@ +/* +** EPITECH PROJECT, 2019 +** CPool_Day03_2019 +** File description: +** Task 9 +*/ + +int my_putchar(char c); + +static int is_nbr_valid(int n, int i) +{ + if (n < 9) { + if (n >= i) + return (0); + else + return (1); + } + int j = n % 10; + + if (j >= i) + return (0); + return is_nbr_valid(n / 10, j); +} + +static void print_cn(int n) +{ + if (n > 9) + print_cn(n / 10); + + my_putchar('0' + n % 10); +} + +static void process_valid_number(int n, int starting, int last_valid) +{ + if (last_valid) { + my_putchar(','); + my_putchar(' '); + } + if (n < starting && starting != 1) + my_putchar('0'); + print_cn(n); +} + +int my_print_combn(int n) +{ + if (n > 10) + return 0; + + int starting = 1; + int last_valid = 0; + + for (int i = 0; i < n - 1; i++) + starting *= 10; + + for (int i = starting / 10; i < starting * 10; i++) { + if (is_nbr_valid(i, 10)) { + process_valid_number(i, starting, last_valid); + last_valid = 1; + } + } + return (0); +} diff --git a/lib/my/my/my_print_digits.c b/lib/my/my/my_print_digits.c new file mode 100644 index 0000000..69b9d48 --- /dev/null +++ b/lib/my/my/my_print_digits.c @@ -0,0 +1,16 @@ +/* +** EPITECH PROJECT, 2019 +** CPool_Day03_2019 +** File description: +** Task 3 +*/ + +int my_putchar(char n); + +int my_print_digits(void) +{ + for (char i = '0'; i <= '9'; i++) { + my_putchar(i); + } + return (0); +} diff --git a/lib/my/my/my_print_revalpha.c b/lib/my/my/my_print_revalpha.c new file mode 100644 index 0000000..c70547f --- /dev/null +++ b/lib/my/my/my_print_revalpha.c @@ -0,0 +1,16 @@ +/* +** EPITECH PROJECT, 2019 +** CPool_Day03_2019 +** File description: +** The second task +*/ + +int my_putchar(char c); + +int my_print_revalpha(void) +{ + for (char i = 'z'; i >= 'a'; i--) { + my_putchar(i); + } + return (0); +} diff --git a/lib/my/my/my_put_nbr.c b/lib/my/my/my_put_nbr.c new file mode 100644 index 0000000..6291012 --- /dev/null +++ b/lib/my/my/my_put_nbr.c @@ -0,0 +1,30 @@ +/* +** EPITECH PROJECT, 2019 +** CPool_Day03_2019 +** File description: +** Task 07 +*/ + +int my_putchar(char c); + +static void get_digit(long digit) +{ + long n = digit; + char c = '0' + n % 10; + if (n > 9) { + n /= 10; + get_digit(n); + } + my_putchar(c); +} + +int my_put_nbr(int n) +{ + long digit = n; + if (n < 0) { + my_putchar('-'); + digit *= -1; + } + get_digit(digit); + return (0); +} diff --git a/lib/my/my/my_putchar.c b/lib/my/my/my_putchar.c new file mode 100644 index 0000000..9e71ab6 --- /dev/null +++ b/lib/my/my/my_putchar.c @@ -0,0 +1,13 @@ +/* +** EPITECH PROJECT, 2019 +** Putchar +** File description: +** Yes +*/ + +#include + +void my_putchar(char c) +{ + write(1, &c, 1); +} diff --git a/lib/my/my/my_putlong_base.c b/lib/my/my/my_putlong_base.c new file mode 100644 index 0000000..afdcd5c --- /dev/null +++ b/lib/my/my/my_putlong_base.c @@ -0,0 +1,38 @@ +/* +** EPITECH PROJECT, 2019 +** Put nbr in a custom base +** File description: +** Might be useful later +*/ + +#include + +int my_strlen(const char *str); + +static void display_a_digit(char c) +{ + write(1, &c, 1); +} + +static void put_digit(long n, int base_length, const char *base) +{ + if (n > base_length - 1) + put_digit(n / base_length, base_length, base); + display_a_digit(base[n % base_length]); +} + +int my_putlong_base(long nbr, const char *base) +{ + int base_length = my_strlen(base); + + if (base_length < 2) { + display_a_digit('0'); + return (0); + } + if (nbr < 0) { + nbr *= -1; + display_a_digit('-'); + } + put_digit(nbr, base_length, base); + return (0); +} diff --git a/lib/my/my/my_putnbr_base.c b/lib/my/my/my_putnbr_base.c new file mode 100644 index 0000000..ac6ad41 --- /dev/null +++ b/lib/my/my/my_putnbr_base.c @@ -0,0 +1,38 @@ +/* +** EPITECH PROJECT, 2019 +** Put nbr in a custom base +** File description: +** Might be useful later +*/ + +#include + +int my_strlen(const char *str); + +static void display_a_digit(char c) +{ + write(1, &c, 1); +} + +static void put_digit(int n, int base_length, const char *base) +{ + if (n > base_length - 1) + put_digit(n / base_length, base_length, base); + display_a_digit(base[n % base_length]); +} + +int my_putnbr_base(int nbr, const char *base) +{ + int base_length = my_strlen(base); + + if (base_length < 2) { + display_a_digit('0'); + return (0); + } + if (nbr < 0) { + nbr *= -1; + display_a_digit('-'); + } + put_digit(nbr, base_length, base); + return (0); +} diff --git a/lib/my/my/my_putstr.c b/lib/my/my/my_putstr.c new file mode 100644 index 0000000..62611d5 --- /dev/null +++ b/lib/my/my/my_putstr.c @@ -0,0 +1,18 @@ +/* +** EPITECH PROJECT, 2019 +** CPool_Day04_2019 +** File description: +** Put string +*/ + +int my_putchar(char c); + +int my_putstr(const char *str) +{ + for (int i = 0; 1; i++) { + char c = *(str + i); + if (c == '\0') + return (0); + my_putchar(c); + } +} diff --git a/lib/my/my/my_revstr.c b/lib/my/my/my_revstr.c new file mode 100644 index 0000000..1de6af6 --- /dev/null +++ b/lib/my/my/my_revstr.c @@ -0,0 +1,21 @@ +/* +** EPITECH PROJECT, 2019 +** CPool_Day04_2019 +** File description: +** Reverse string +*/ + +int my_strlen(char *str); + +char *my_revstr(char *str) +{ + int length = my_strlen(str); + char dup[length + 1]; + + for (int i = 0; i < length; i++) + dup[i] = str[i]; + for (int i = 0; i < length; i++) + str[i] = dup[length - 1 - i]; + str[length] = '\0'; + return (str); +} diff --git a/lib/my/my/my_show_words_array.c b/lib/my/my/my_show_words_array.c new file mode 100644 index 0000000..f72f5a7 --- /dev/null +++ b/lib/my/my/my_show_words_array.c @@ -0,0 +1,19 @@ +/* +** EPITECH PROJECT, 2019 +** Show an array of words on the screen +** File description: +** Nothing to say +*/ + +void my_putstr(const char *str); + +void my_putchar(char c); + +int my_show_word_array(const char *words[]) +{ + for (int i = 0; words[i]; i++) { + my_putstr(words[i]); + my_putchar('\n'); + } + return (0); +} diff --git a/lib/my/my/my_showmem.c b/lib/my/my/my_showmem.c new file mode 100644 index 0000000..597ca1c --- /dev/null +++ b/lib/my/my/my_showmem.c @@ -0,0 +1,74 @@ +/* +** EPITECH PROJECT, 2019 +** Memory dump +** File description: +** Debug Library +*/ + +const char *hex = "0123456789abcdef"; + +#include "my.h" +#include + +int get_size(long n, const char *base); + +void my_putchar(char c); + +int is_printable(char c); + +void display_x_char(char c, int count) +{ + for (int i = 0; i < count; i++) + write(1, &c, 1); +} + +void print_ptr(void *ptr) +{ + write(1, "0x", 2); + my_putlong_base((long)ptr, hex); +} + +void print_hexa(char *ptr, int size) +{ + for (int i = 0; i < 16; i++) { + if (i >= size) { + display_x_char(' ', 40 - (i * 2 + i / 2)); + return; + } + if (ptr[i] < 16) + my_putchar('0'); + my_putlong_base((long)ptr[i], hex); + if (i % 2 == 1) + my_putchar(' '); + } +} + +void print_str_to(char *ptr, int max) +{ + int overflow = 0; + + for (int i = 0; i < max; i++) { + if (overflow || !is_printable(ptr[i])) + my_putchar('.'); + else + my_putchar(ptr[i]); + if (!overflow) + overflow = ptr[i] == '\0'; + } +} + +int my_showmem(char *str, int size) +{ + int padding = size % 16; + int line_count = padding == 0 ? size / 16 : size / 16 + 1; + char *ptr; + + for (int i = 0; i < line_count; i++) { + ptr = (str + i * 16); + print_ptr((void *)(ptr - str)); + print_hexa(ptr, size - i * 16); + print_str_to(ptr, 16); + my_putchar('\n'); + } + return (0); +} diff --git a/lib/my/my/my_showstr.c b/lib/my/my/my_showstr.c new file mode 100644 index 0000000..fdcecd2 --- /dev/null +++ b/lib/my/my/my_showstr.c @@ -0,0 +1,33 @@ +/* +** EPITECH PROJECT, 2019 +** Show Str With non printable values in hexa +** File description: +** Debugger Library +*/ + +#include + +int is_printable(char c); + +int my_putnbr_base(int i, const char *base); + +void puthex(char c) +{ + write(1, "\\", 1); + if (c < 8) + write(1, "0", 1); + if (c < 16) + write(1, "0", 1); + my_putnbr_base(c, "01234567"); +} + +int my_showstr(const char *str) +{ + for (int i = 0; str[i]; i++) { + if (is_printable(str[i])) + write(1, &(str[i]), 1); + else + puthex(str[i]); + } + return (0); +} diff --git a/lib/my/my/my_sort_int_array.c b/lib/my/my/my_sort_int_array.c new file mode 100644 index 0000000..643dc42 --- /dev/null +++ b/lib/my/my/my_sort_int_array.c @@ -0,0 +1,24 @@ +/* +** EPITECH PROJECT, 2019 +** CPool_Day04_2019 +** File description: +** Int array sorter +*/ + +static void sort_linear(int *array, int size) +{ + for (int i = 0; i < size - 1; i++) { + if (array[i] > array[i + 1]) { + int buf = array[i]; + array[i] = array[i + 1]; + array[i + 1] = buf; + } + } +} + +int my_sort_int_array(int *array, int size) +{ + for (int i = 0; i < size; i++) + sort_linear(array, size); + return (0); +} diff --git a/lib/my/my/my_str_isalpha.c b/lib/my/my/my_str_isalpha.c new file mode 100644 index 0000000..046c0fe --- /dev/null +++ b/lib/my/my/my_str_isalpha.c @@ -0,0 +1,24 @@ +/* +** EPITECH PROJECT, 2019 +** Str is alpha +** File description: +** Duplicate of the string.h (I think) +*/ + +int is_alpha(char c) +{ + if (c >= 'a' && c <= 'z') + return (1); + if (c >= 'A' && c <= 'Z') + return (1); + return (0); +} + +int my_str_isalpha(const char *str) +{ + for (int i = 0; str[i] != '\0'; i++) { + if (!is_alpha(str[i])) + return (0); + } + return (1); +} diff --git a/lib/my/my/my_str_islower.c b/lib/my/my/my_str_islower.c new file mode 100644 index 0000000..56d38c5 --- /dev/null +++ b/lib/my/my/my_str_islower.c @@ -0,0 +1,33 @@ +/* +** EPITECH PROJECT, 2019 +** Str is alpha +** File description: +** Duplicate of the string.h (I think) +*/ + +int is_digit(char c); + +int is_lowercase(char c) +{ + if (c >= 'a' && c <= 'z') + return (1); + return (0); +} + +int my_str_islower(const char *str) +{ + for (int i = 0; str[i] != '\0'; i++) { + if (!is_lowercase(str[i])) + return (0); + } + return (1); +} + +int my_str_islower_or_num(const char *str) +{ + for (int i = 0; str[i] != '\0'; i++) { + if (!is_lowercase(str[i]) && !is_digit(str[i])) + return (0); + } + return (1); +} diff --git a/lib/my/my/my_str_isnum.c b/lib/my/my/my_str_isnum.c new file mode 100644 index 0000000..2978430 --- /dev/null +++ b/lib/my/my/my_str_isnum.c @@ -0,0 +1,22 @@ +/* +** EPITECH PROJECT, 2019 +** Str is alpha +** File description: +** Duplicate of the string.h (I think) +*/ + +int is_digit(char c) +{ + if (c >= '0' && c <= '9') + return (1); + return (0); +} + +int my_str_isnum(const char *str) +{ + for (int i = 0; str[i] != '\0'; i++) { + if (!is_digit(str[i])) + return (0); + } + return (1); +} diff --git a/lib/my/my/my_str_isprintable.c b/lib/my/my/my_str_isprintable.c new file mode 100644 index 0000000..13a8f9e --- /dev/null +++ b/lib/my/my/my_str_isprintable.c @@ -0,0 +1,22 @@ +/* +** EPITECH PROJECT, 2019 +** Str is alpha +** File description: +** Duplicate of the string.h (I think) +*/ + +int is_printable(char c) +{ + if (c >= ' ' && c < 127) + return (1); + return (0); +} + +int my_str_isprintable(const char *str) +{ + for (int i = 0; str[i] != '\0'; i++) { + if (!is_printable(str[i])) + return (0); + } + return (1); +} diff --git a/lib/my/my/my_str_isupper.c b/lib/my/my/my_str_isupper.c new file mode 100644 index 0000000..ec4c8f7 --- /dev/null +++ b/lib/my/my/my_str_isupper.c @@ -0,0 +1,22 @@ +/* +** EPITECH PROJECT, 2019 +** Str is alpha +** File description: +** Duplicate of the string.h (I think) +*/ + +int is_upper(char c) +{ + if (c >= 'A' && c <= 'Z') + return (1); + return (0); +} + +int my_str_isupper(const char *str) +{ + for (int i = 0; str[i] != '\0'; i++) { + if (!is_upper(str[i])) + return (0); + } + return (1); +} diff --git a/lib/my/my/my_str_to_word_array.c b/lib/my/my/my_str_to_word_array.c new file mode 100644 index 0000000..97a191a --- /dev/null +++ b/lib/my/my/my_str_to_word_array.c @@ -0,0 +1,70 @@ +/* +** EPITECH PROJECT, 2019 +** Convert a string to a char ** +** File description: +** Split with every non alpha-numerical characters +*/ + +#include + +int is_alphanum(char c); + +int first_alphanum(const char *str); + +static int count_words(const char *str) +{ + int count = 1; + + if (first_alphanum(str) == -1) + return (0); + for (int i = first_alphanum(str); str[i + 1]; i++) { + if (!is_alphanum(str[i]) && is_alphanum(str[i + 1])) + count++; + } + return (count); +} + +static int get_word_length(const char *str, int n) +{ + int count = 0; + int word_length = 0; + + for (int i = first_alphanum(str); str[i]; i++) { + if (!is_alphanum(str[i]) && is_alphanum(str[i + 1])) + count++; + else if (count == n && is_alphanum(str[i])) + word_length++; + } + return (word_length); +} + +static char *get_word(const char *str, int n) +{ + int length = get_word_length(str, n); + char *ret = malloc(sizeof(*ret) * (length + 1)); + int count = 0; + int word_length = 0; + + for (int i = first_alphanum(str); word_length != length; i++) { + if (!is_alphanum(str[i]) && is_alphanum(str[i + 1])) + count++; + else if (count == n) { + ret[word_length] = str[i]; + word_length++; + } + } + ret[length] = '\0'; + return (ret); +} + +char **my_str_to_word_array(const char *str) +{ + int count = count_words(str); + char **ret = malloc(sizeof(*ret) * (count + 1)); + + for (int i = 0; i < count; i++) { + ret[i] = get_word(str, i); + } + ret[count] = 0; + return (ret); +} diff --git a/lib/my/my/my_strcapitalize.c b/lib/my/my/my_strcapitalize.c new file mode 100644 index 0000000..65b932f --- /dev/null +++ b/lib/my/my/my_strcapitalize.c @@ -0,0 +1,32 @@ +/* +** EPITECH PROJECT, 2019 +** ToUpercase +** File description: +** string.h +*/ + +int is_num(char c) +{ + return (c >= '0' && c <= '9'); +} + +int is_letter(char c) +{ + return ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')); +} + +char *my_strcapitalize(char *str) +{ + int capitalize_next = 1; + + for (int i = 0; str[i] != '\0'; i++) { + if (capitalize_next && str[i] > 'a' && str[i] < 'z') + str[i] += 'A' - 'a'; + + if (is_num(str[i]) || is_letter(str[i])) + capitalize_next = 1; + else + capitalize_next = 0; + } + return (str); +} diff --git a/lib/my/my/my_strcat.c b/lib/my/my/my_strcat.c new file mode 100644 index 0000000..1bc8e8e --- /dev/null +++ b/lib/my/my/my_strcat.c @@ -0,0 +1,19 @@ +/* +** EPITECH PROJECT, 2019 +** String cat +** File description: +** The end of the string.h lib +*/ + +int my_strlen(const char *dest); + +char *my_strcat(char *dest, const char *src) +{ + int i; + int dest_length = my_strlen(dest); + + for (i = 0; src[i]; i++) + dest[dest_length + i] = src[i]; + dest[dest_length + i] = '\0'; + return (dest); +} diff --git a/lib/my/my/my_strchr.c b/lib/my/my/my_strchr.c new file mode 100644 index 0000000..8bd6717 --- /dev/null +++ b/lib/my/my/my_strchr.c @@ -0,0 +1,17 @@ +/* +** EPITECH PROJECT, 2019 +** MUL_my_runner_2019 +** File description: +** my_strchr +*/ + +#include "stddef.h" + +char *my_strchr(char *str, char c) +{ + for (int i = 0; str[i]; i++) { + if (str[i] == c) + return (&str[i]); + } + return (NULL); +} \ No newline at end of file diff --git a/lib/my/my/my_strcmp.c b/lib/my/my/my_strcmp.c new file mode 100644 index 0000000..e3a4972 --- /dev/null +++ b/lib/my/my/my_strcmp.c @@ -0,0 +1,25 @@ +/* +** EPITECH PROJECT, 2019 +** StrCmp +** File description: +** String.h duplicate +*/ + +int my_strcmp(const char *str1, const char *str2) +{ + int i; + int ret; + + for (i = 0; str1[i] != '\0'; i++) { + if (str2[i] == '\0') + return str1[i]; + ret = str1[i] - str2[i]; + if (ret != 0) + return (ret); + } + + if (str2[i] == '\0') + return (0); + else + return -str2[i]; +} diff --git a/lib/my/my/my_strcpy.c b/lib/my/my/my_strcpy.c new file mode 100644 index 0000000..a1bf550 --- /dev/null +++ b/lib/my/my/my_strcpy.c @@ -0,0 +1,16 @@ +/* +** EPITECH PROJECT, 2019 +** String copy +** File description: +** Copy an entire string +*/ + +char *my_strcpy(char *dest, const char *src) +{ + int i; + + for (i = 0; src[i] != '\0'; i++) + dest[i] = src[i]; + dest[i] = '\0'; + return (dest); +} diff --git a/lib/my/my/my_strdup.c b/lib/my/my/my_strdup.c new file mode 100644 index 0000000..1ae14cc --- /dev/null +++ b/lib/my/my/my_strdup.c @@ -0,0 +1,21 @@ +/* +** EPITECH PROJECT, 2019 +** Str dup replicate +** File description: +** MALLOC YES +*/ + +#include + +int my_strlen(const char *src); + +char *my_strdup(const char *src) +{ + int length = my_strlen(src); + char *ret = malloc(sizeof(char) * (length + 1)); + + for (int i = 0; i < length; i++) + ret[i] = src[i]; + ret[length] = '\0'; + return (ret); +} diff --git a/lib/my/my/my_strlen.c b/lib/my/my/my_strlen.c new file mode 100644 index 0000000..82c15a2 --- /dev/null +++ b/lib/my/my/my_strlen.c @@ -0,0 +1,14 @@ +/* +** EPITECH PROJECT, 2019 +** CPool_Day04_2019 +** File description: +** Strlen +*/ + +int my_strlen(const char *str) +{ + for (int i = 0; 1; i++) { + if (*(str + i) == '\0') + return i; + } +} diff --git a/lib/my/my/my_strlowcase.c b/lib/my/my/my_strlowcase.c new file mode 100644 index 0000000..54adc9b --- /dev/null +++ b/lib/my/my/my_strlowcase.c @@ -0,0 +1,15 @@ +/* +** EPITECH PROJECT, 2019 +** ToUpercase +** File description: +** string.h +*/ + +char *my_strlowcase(char *str) +{ + for (int i = 0; str[i] != '\0'; i++) { + if (str[i] > 'A' && str[i] < 'Z') + str[i] += 'a' - 'A'; + } + return (str); +} diff --git a/lib/my/my/my_strncat.c b/lib/my/my/my_strncat.c new file mode 100644 index 0000000..7e5622d --- /dev/null +++ b/lib/my/my/my_strncat.c @@ -0,0 +1,19 @@ +/* +** EPITECH PROJECT, 2019 +** String N Cat +** File description: +** End of the string.h lib +*/ + +int my_strlen(const char *str); + +char *my_strncat(char *dest, const char *src, int n) +{ + int i; + int dest_length = my_strlen(dest); + + for (i = 0; i < n && src[i]; i++) + dest[dest_length + i] = src[i]; + dest[dest_length + i] = '\0'; + return (dest); +} diff --git a/lib/my/my/my_strncmp.c b/lib/my/my/my_strncmp.c new file mode 100644 index 0000000..c5918a1 --- /dev/null +++ b/lib/my/my/my_strncmp.c @@ -0,0 +1,25 @@ +/* +** EPITECH PROJECT, 2019 +** StrNCmp +** File description: +** String.h duplicate +*/ + +int my_strncmp(const char *str1, const char *str2, int n) +{ + int i; + int ret; + + for (i = 0; i < n && str1[i] != '\0'; i++) { + if (str2[i] == '\0') + return str1[i]; + ret = str1[i] - str2[i]; + if (ret != 0) + return (ret); + } + + if (i == n || str2[i] == '\0') + return (0); + else + return -str2[i]; +} diff --git a/lib/my/my/my_strncpy.c b/lib/my/my/my_strncpy.c new file mode 100644 index 0000000..cd39de4 --- /dev/null +++ b/lib/my/my/my_strncpy.c @@ -0,0 +1,21 @@ +/* +** EPITECH PROJECT, 2019 +** String copy n first chars +** File description: +** Same but different +*/ + +char *my_strncpy(char *dest, const char* src, int n) +{ + int overflow = 0; + + for (int i = 0; i < n; i++) { + if (overflow) + dest[i] = '\0'; + else { + dest[i] = src[i]; + overflow = (src[i] == '\0'); + } + } + return (dest); +} diff --git a/lib/my/my/my_strstr.c b/lib/my/my/my_strstr.c new file mode 100644 index 0000000..b93e9a8 --- /dev/null +++ b/lib/my/my/my_strstr.c @@ -0,0 +1,26 @@ +/* +** EPITECH PROJECT, 2019 +** StrStr duplicate +** File description: +** A search in string function +*/ + +char *my_strstr(char *str, const char *to_find) +{ + int i; + int search_index = 0; + + for (i = 0; str[i] != '\0'; i++) { + if (to_find[search_index] == '\0') + return (str + i - search_index); + if (str[i] == to_find[search_index]) + search_index++; + else if (str[i] == to_find[0]) + search_index = 1; + else + search_index = 0; + } + if (to_find[search_index] == '\0') + return (str + i - search_index); + return 0; +} diff --git a/lib/my/my/my_strupcase.c b/lib/my/my/my_strupcase.c new file mode 100644 index 0000000..e2e87cc --- /dev/null +++ b/lib/my/my/my_strupcase.c @@ -0,0 +1,15 @@ +/* +** EPITECH PROJECT, 2019 +** ToUpercase +** File description: +** string.h +*/ + +char *my_strupcase(char *str) +{ + for (int i = 0; str[i] != '\0'; i++) { + if (str[i] > 'a' && str[i] < 'z') + str[i] += 'A' - 'a'; + } + return (str); +} diff --git a/lib/my/my/my_swap.c b/lib/my/my/my_swap.c new file mode 100644 index 0000000..84ff01c --- /dev/null +++ b/lib/my/my/my_swap.c @@ -0,0 +1,13 @@ +/* +** EPITECH PROJECT, 2019 +** CPool_Day04_2019 +** File description: +** Swap int +*/ + +void my_swap(int *a, int *b) +{ + int n = *a; + *a = *b; + *b = n; +} diff --git a/lib/my/my/tostr.c b/lib/my/my/tostr.c new file mode 100644 index 0000000..ce3e977 --- /dev/null +++ b/lib/my/my/tostr.c @@ -0,0 +1,60 @@ +/* +** EPITECH PROJECT, 2019 +** Convering Between bases +** File description: +** Moldavie-Land +*/ + +#include + +static void put_digit(int n, const char *base, char *ret, int i) +{ + int base_length = 10; + + if (n > base_length - 1) + put_digit(n / base_length, base, ret, i - 1); + ret[i] = base[n % base_length]; +} + +char *putnbr_in(int nbr, const char *base, char *ret, int ret_length) +{ + int base_length = 10; + int i = ret_length; + + if (base_length < 2) { + ret = "0"; + return (ret); + } + if (nbr < 0) { + nbr *= -1; + ret[0] = '-'; + } else { + i--; + ret[i] = '\0'; + } + put_digit(nbr, base, ret, i); + return (ret); +} + +int get_new_size(int n) +{ + int base_size = 10; + int i = 1; + + while (n >= base_size) { + n /= base_size; + i++; + } + return (i); +} + +char *tostr(int n) +{ + const char *base = "0123456789"; + int count = get_new_size(n); + char *ret = malloc(sizeof(char) * (count + 1)); + + putnbr_in(n, base, ret, count); + ret[count] = '\0'; + return (ret); +} diff --git a/lib/my/my/utility.c b/lib/my/my/utility.c new file mode 100644 index 0000000..291e646 --- /dev/null +++ b/lib/my/my/utility.c @@ -0,0 +1,20 @@ +/* +** EPITECH PROJECT, 2019 +** Utility for the showmem +** File description: +** utility +*/ + +#include "my.h" + +int get_size(long n, const char *base) +{ + int base_size = my_strlen(base); + int i = 1; + + while (n >= base_size) { + n /= base_size; + i++; + } + return (i); +} \ No newline at end of file diff --git a/lib/my/my_compute_factorial_it.o b/lib/my/my_compute_factorial_it.o new file mode 100644 index 0000000000000000000000000000000000000000..16e0397faeddcdf5be300fa83f998c589ebb7f89 GIT binary patch literal 1296 zcmbtTJ4*vW5T48Vek&G2EMldCSws=kLL%W*L`1}t63%!*(KC`;!3fdfKnONAfw%XRVq=AURc%cTdPvCs=iw>{9^ShrJDOWAvFadVv`CV)&3E;jN0OaQr2`JUR0l;sxEnVfrg#GQ23&hT7* z*WOR>a+awV2};KTRh#6;G|Vfw+};A_@qD0nq{W?M4s6@zHn1(v1BQ)V=K!&T9CsLA zRNUisW)E22*|(Xqlg{RC*Abomr)YkmiSkGr%2S}A6*X~nKH>V=6XizqpCm^Seg0mIh4J4-;)cQ{ HQ|EsI8O>yh literal 0 HcmV?d00001 diff --git a/lib/my/my_compute_factorial_rec.o b/lib/my/my_compute_factorial_rec.o new file mode 100644 index 0000000000000000000000000000000000000000..f76995af54a0d66f4cba6295ebb6cd56267ce616 GIT binary patch literal 1544 zcmbtTL2DC16n>kvP1I^*5h>I|1Q825SWjBCtc2Jgq96qH6t?NM6}wH@Y#N2zcBOOeDl6HZ{AK`)b8IcSQZH^TA{<0 zutX*M(03Bop&2?!je7L0KKxmZ265D#3KpP_IP$wi{HbGKI=eQtyY&SmscM&7ArT^b#)DT;B0Ehdj5#4 zUfEihDVAQb^gQzzzzU{2r^_!3)l<`b4&WvBZh>bkVv_y!bRSe6P}MQ|y`Q&d=XQ?B z=3gFc&Xfn6rt@gdQapm6`isZ?<}&ppJz(yl=4GAS9csVdY_h%54U1J*tsofGU@U~qQ zdcBa;x*NKr);b+hT($4*Ft^hVJ;g8QYA1AC&qyWV-d1xXaD7kC{a;(*1b7?fmvfi{ zHdAvjBQ}c#UZ6)#mSn%Kn^)Od(n)V)k%4*tGrX6lf1~wJGFrH%{tvYMj?@4E literal 0 HcmV?d00001 diff --git a/lib/my/my_compute_power_it.o b/lib/my/my_compute_power_it.o new file mode 100644 index 0000000000000000000000000000000000000000..7e95ece18d48f7aaf4265d42b94815588426d0a4 GIT binary patch literal 1320 zcmbtTze^)Q6n>L<{<>462nvxif}nyo9D<-0MN?7AcMAt}mf<_1y3qr8D z_Wp`%ENn$kOG`U#4#Jtn>b4N{z0FJ<*R|0HyYIbkzHi>lyqSID$4rDVP{!aJJY@<6 z$VQ&xq#q{XBecTOT={RgR4o@O=Y~hZbK{6nqZL0}HFt`(Fjs&(B46`a6$xus0ADqQ34FzIfMWsM+CpqACoGQr_~HmNvjIGB zZJON5rq}YOZTWTH`-|fQ)RW-JB;~~QeaoD+)9pC~9d= zx~saW`dvDRv8u29xQ6M}Gdi%l zEiDBLe}Uj1uu2N;QV2Se?CQFnjSk$+%s1b+v$MO$=F&pIFhH6CbMTc(6d)P+ieuF< z2F=g}Ysunsu~0rKlp$Y#ONG+JgIS^A+^n=;-xbZbbMtN1Ea&PFD0SD8Bf$-ym=&Y+ zxPA|bczh;0oLF8PiB7W#Hcl&`b=4dghbv$lbQpat^$i!e!G6T)BTLe6zOCal5N{0! z;>aMt-)OcFyuSNYgT9jk1VI^I5eBj1XF;g*gOMHn1rPnedl88!`>D=IEGM5zXPvzq zw^QDJ&T{RPo6T~Trh>Qca1|-Hy<;&uliG4E#}=Lb=lW1iccY(BOf363zsU7BI)FG~`i-0k zzV3AW5EAIw{8c}ST3S=STMVlv`$r@oyzDRiB;qnwsh4V^#5#9T=)c`HVpl>lCA@Sr zt7;}D^a^7ti1CwX)FW`x(H%*>#EGW&Cdm{1(4=p~n6$c{aQ*BNf*a9)kP^l8`8%=Z Or+*Q|RYgmouKxhIHDGN3 literal 0 HcmV?d00001 diff --git a/lib/my/my_evil_str.o b/lib/my/my_evil_str.o new file mode 100644 index 0000000000000000000000000000000000000000..32bfa3c8b2c2588a5c9b9f24f6eafd11e41bdf7d GIT binary patch literal 1640 zcmbu8&ubGw6vy8tO`B>pv3MxdLoP~1U0M~<2$CNp86=pX?ZMNs-E2u|(n7LID}qQH zNeG1;Jb3W$C_N}t1*_m8NB;p)s0RxbiU{?+*_mYBPA~exWZr)E``(**Gy5cy&jvIN zq-k&q`cIMql!JXg!QBLmz;T#ituO59_o6ihto3^H<=2A}YY&{AKnZJQ_NTVC8y^r- zM4Nle>auo&giPy3Hll*QXg&{h5h_Knw&e`3@^Ecuv$Ng!BvS5NbM+TES!Wndue>$h zGV4ubV~rBU)CoH!)g8xpgp<^+HzDI9~laFu%Ty=(;)jrf60^4XMyyI!N5;c5KtSP z#Q^N`2Kp62Q%Y22~id3?0Ekhj;|ZsAoNVkI2SxL=UL}rjFoHT`}y3 z^A)4+)O5@H1V%1jNG0<|A)CFInKq`AseHx&1C^$=U|8h^W6qqfh+2DMrX3%{@%zBF znBW1NY4l95uT&j#7IZA^&SmMAp}-_bWq3n5;i4ftY1|ImeMp-z&|lph8;^?5{h6tSI8I zdy}Fs`zP^jbX5KSq3Az-buwP|pUU`aQ|_jy9~Lv+b&B=J)4BS4j|e&m<2eG zJ>qN^W?>x0V7=72DYbtkI!9jn$cr71U6A8ls;zt4sqS^IZ^`-FrF)Oo&nqbA^O^L^ z;-~dj>G$HTSm>t0>A3{j;RaTg z_k(IVuDl^Y96y!BF_TK-Fr=a}%Wxllu!m0}lMJ1wdq?DEaU^=Y0Y3EM!EPB_wfd&9 z->lh|;e6Q_)m{#aV!5)ED;t$UVO3u<)^bZ_-5|f3<45wAGZN6vM{#%$zN95juN-O# z0O7Q3*W5tuHhsO#sA=t)!nF=u5SylJg4l2z5Y>ilTXp2>4c8Lb5p#}fR(C;k-K}k7 zt7+Pn-0r_s8Z%H&L|-h690}Lmw|rm5q^EFDEwVVmGAWBNDaj|OX&>%Q=3huY+F=bD z7gdxaEU(d^oc|jC24g8_@WUY{;r)}o8O*#t>kO_i4xA8t4I3dG^{wC3-e^M4LJeGrZR1H-y(Y5)KL literal 0 HcmV?d00001 diff --git a/lib/my/my_getnbr.o b/lib/my/my_getnbr.o new file mode 100644 index 0000000000000000000000000000000000000000..2dffffe792749a6dade0c2ec1eb43214f0544767 GIT binary patch literal 2208 zcmbtU-)kII6h1TCZfd(RY3hSekwsc*iJ7+A2iu73Hs0haX(P4+_92X$&9({Yre${) z66vNXgC)Z#^fBOz|A7$}i4}B93u_;=gDKJn9~OzQx;|{_LIw;@&zZe9*^VoSo@MU& z=DX*ddw$&6Yix8_RTPk-z?-oBCRu>bc5dTD022^{J)m>@S8f+;c46Jts}DSXx4Y176`Sfp*D5*H=N#7T`J7d8 zv%)q5>Y$@HZTEInRa~Wvys-GFJTH9Sve>5Lu+2f{U0uUng*B{V)h|S?Vgs(l5G!;@ z1Ej+~i+Ska4YKu~kI(zQ@36-B9V+H5xBlQ*(W+f2+4{;PcXk{+gjsN#)sB@b%%$!) zY=x&?EN8V<&Jw#{Kd@N5KTwEljJp^622Ai8ykG4+{+K&<#v@@Wl9sL@PPK}*tQji zJy6{CTz7FtuOiErmtv}gyNCx_>FOF*Q+0ILIbE`U;C7|<(qF#M?Vq_*s7>t8s!=bUcR9cm?b1{1t@2S$d5PR0+7oY4=*PiU`d zM=1}0=UNJs58nf2u2)Le_NB08q^pJc{OY+&?8|qMZRQ(Pu0OCl!K|G2^qn7*3 zibM`5TQ(n%0m=Xw#*eB|rghK9sM}DXMNXIV^AcDV662VAe=|)0rixbp{+&;m} z_nr`3y|YPMgM+-1Mvo#>nW{spP0JHavWmoiolQPmMAI3?px*(lbVSYR0&bn!dCh z1K^Q}Po3I>&nDeZlsIA%RXo89E(rl7FZ(qa;$_~T<>#|zY67*HYw0P8a+ymh&CJZ1 zpiQRC6lfFqJZS05*=z=D(Pl5384d64K#)CXfq7=ixR6U_Gvc`at>PGgS`eOa0y&cF zRA`%sc5N~H5mE0FTTBa7#npRW@Xw$oU;Kmuk^IZ}Mtt}N-wvJI@@m;iO!^gkDCU3l zKZd?^zW7@})Dn4qpCp8q^-Fycd5POi*ZyVxW5Pdd{!kE$?LiUC{z>{B1fBZtiT-n8 zNd2d;Rr<^RQ|{rj$>n{~(APzAyOE`!sSy+;aeiu0+yb_w@tFK%}7Pl&&e^X<-v H!~RbIg6N54 literal 0 HcmV?d00001 diff --git a/lib/my/my_getnbr_base.o b/lib/my/my_getnbr_base.o new file mode 100644 index 0000000000000000000000000000000000000000..291dcb3231f37fe89668c482faaa7c68f7af133e GIT binary patch literal 2632 zcmbtU-D@0G6u+~ZkD3n?i=ddcECnUSc1aXLYmrRjO|CUH#bzyH*Xd?6X+o0Sx|y|! zxUn!Q8OLZI^CzSdFohtopsqyR`XUjQun#`e2PL|BNTHB@SY3Z-KDLu#1A=F{bI<*q zk9+R#+`S+0fxdtwF;^t^5__<6QN~2$1HH#mdsqu=W)WfhZj^+PzB|u%a=c8Y;xUt# zMSN43{H~BT+rDDY^PO}(z~WJzmnFaT!)*HJ^$H}qLFt6P(_Y`Zw| z18t*cY0qqquaYgtSL`mXv2>F~?Vn#*@G@D8ag#6GZ9`Y+PT6f+wA+^c+a?7q*ynW! z2g#azRV>Z71a!VC6(93?ursI9NB5#DI$y@c+!xG1o>7!Q1m##0OFz~H7+A@gkrlLd z(fGwa6bO15`wQb&VMgzah-Z&jd}{U9eH9C8;Vt>H9F^aemFNcR@9jMu>g<0law7CX z_?d7QosO|b?TJb6z0RbWcB!MK@z5gpI0Bpo$sm2?huc36^tLtx&cVaBogp0Z2Yssc z->UY@ghMp?RP9O2eiG38ghS?uf7gEg^WbN73-zBi=#9a5CCk@xI^aX0b?jcHmN{7S zMPV$6Uo8nDlV1)42zc^XTmXB*!QHjR0kDvRKSzZ@th3uHc5QI9{Zo*69yyOG$m%^S zTcx(qwf0LNfLi#41Mo}0593@nojR=^02@8PpH0mwS5+-BoKl8k(`q=*#uFpzOmdW6 zi>0Pj2AeW6esx?^;>mPEV@m(P;8}S<8SLx3$cL06`Ro8!D9N;znp6{{T}xi~Wn~J? zvG{}%ADd7{W8;&IB~T9ub*2TQj2D3Mu(_$<laUU9&OFjFj^4oe<)=BF?d?%RgF;|Cmn|NiujP)@)5e~s@(EajyCl~>$&`u}^y z-QS&0!|3W>KiyxDWAyvdy&{b6nOEkW_+>8$-Q~}P&q1lh|9lPp>6LNgUH)tBO}V=$ rDddJza1-=q41YZJwboHrou}(M>|XJo{}C8##cwpbEp4ps8bR=i1D#2B;~Hb51Ic{z&3v<)oy{?ypVl=Eq-pRMJ|f8ie2;@@k2{6nRxc)Nye&$t!O8 zme;6px#yHu&R^YH>Hg#jrJka*$ZJ^p@`u;lN3YxJ4a}s|Q^~=Zh2^2-BpYL+R7uwD zJJ606K|4rjy{+-aGu%NR^7N49>GiKY@n283HRxMdK}59C=Ih}3Eh-y}JRyJ>D2Jp7 zW0;Au7}Q76Sl#dqU-yOYK&DICkN1sKWgTWV?aW?b(=u6Bjr z%ytUC&q?H%2M(}x!!dxZ**36j-m=VH8SpN>@8f|R= literal 0 HcmV?d00001 diff --git a/lib/my/my_isneg.o b/lib/my/my_isneg.o new file mode 100644 index 0000000000000000000000000000000000000000..a20da3b46cadf924dcdb40b4e0ae09d857670439 GIT binary patch literal 1440 zcmbtT&r2Io5S~q1f2NX3iv>Ldgkq^atOv0k%EpjHBp9)J@U*OP+eo`nvRg0(Q4j=g z{S*3Uc(dTiKcpb&#hZtKev^H(Zr9Dle#?9Fz3@KGDNURHEOh z2X1z#Nf{cX^~ICFi$~Ylll}J5ew$jEvt{gFvd7iH*^2N}7B0@ITqw-vCd$j}?{Xj2 zjGCrbya5n~=-Gw?ue*Tn{)}$!lD5-{Z$^~H zlY}%fB_T~cNiwqZcF~_d(lbzoBlqdNBed5T*+*(YD+vJde zdm{eDOlSd&KmUCaFM871ocoj~pif_z{{fDT$8+9z?IF=09XHF12(%n3FTs-HO@053&@&+M F_jnP5n`~QlVfE@lq7p!SfOMAl(xR< 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 Ls3k>9uCD(J!dPm# literal 0 HcmV?d00001 diff --git a/lib/my/my_print_revalpha.o b/lib/my/my_print_revalpha.o new file mode 100644 index 0000000000000000000000000000000000000000..043859e620fc8638ccaff37a45263c32d03b1eba GIT binary patch literal 1440 zcmb_b&r2IY6n>ku{;0NYMM1EKoLUR*(DtN)vN3EDN-$vc(9?EIS5kCi*i1zQQ4~aP z{t5mSr6&;zZT&+8!Crb7w(srE;B+!xO207k-hA`EH#2WvcKup8=QyC?z%1OZ6bo>g zyY;=)^(QYzKRNz!Mf*cv{N&)uIr5Xeo#eyrWOm0EqSSPSaq@;iSqSS-%f{2-0{EE-K71Ko!}FMfdICdp7hpFnM( zwE_U^Y(;`EqZM&xo63vBHO@r1DS&^LWcecu6l}~mY2i3yEp~IC$7?Wf_S~^Gdq~f1S-t4Tl z)R~5I=y-t(%K5MQ*QlkO<~!B-!?>qIov-XPZYp1o+t(MGZ^qW8{;!@v?nr7TH7&WS zeu{pJj;;O^mip7bPU%(s=|1M!l>3|}M4!Ac^*U)yJ$+ZR_DI1`sjJdLgZci)xM$OQ M@>1_LExD%t5ASGf{{R30 literal 0 HcmV?d00001 diff --git a/lib/my/my_put_nbr.o b/lib/my/my_put_nbr.o new file mode 100644 index 0000000000000000000000000000000000000000..50a23cb728c7ce7dd4e783c74ffbc33334c0abf6 GIT binary patch literal 1704 zcmbtU&ubGw6n?v_t<@T15h>I|PSSu~Qo%#3XwtaJAkl!fpa)qt={6~vRFYL1Au0sK zC6^vV1TP-_6GTB9d(e8y$+H(BNG_fdL`dJ;ooSct21LIw^WJ>#XWmTmSj(hjNdf^0 zF2dePumEqAJw5KIaTtdqu*B>itkI1yyWU||J5S1+%}f-cQ#0EtA&j zUt-Zu%x<&RcbQ3TCT+54i`if8c4IU4OzW{my+8Ko+~4JJieW+fbEi5O432%!dZ zgA-&xNDr@rv>ukG#zzlr;Gj++M~m=^wnQlWR8Afpkzb&PYr8-^;yi7_{=hL469~G4 z1Mq7QWK;rg2tdJ45ERVhM+gbolgH_uJ1H>YcX!STj1J)s?&Bws3GZV8)FJ#F@)OvP z=);*6#g}UOz5AA4&Q;Vr6iiEBUM;Lzprm zfGM=l?Bcr~uF~PdiE(}mCB@>?cR=rea2gl!{ug@EUx=I$e)+_=`r~&15^c-- literal 0 HcmV?d00001 diff --git a/lib/my/my_putchar.o b/lib/my/my_putchar.o new file mode 100644 index 0000000000000000000000000000000000000000..0df36ea366906445cdfa49e670e868b75f92b7c2 GIT binary patch literal 1408 zcmbtT&r2IY6n>ldBmStQ;z3bxPenmTTM*QPB!*3bga)b}JS}TniL|R_Go`VY3PNcP zf`5uf@!~-!^bZj{c+gu90evq!FOKWvV!tr^-uvc#Z)V<1embRm!m@y2!3sP@%mN%G zp8QP9&A=cGz-F;=T|B-`H~#&0n#B{Rc|q!8o-}cdZDOj0l0-yc{N*d z%lZ7ev*B)JS4)ly-@`rWQ~61?2A!}UNAn?qt$4a-?WzGp?J$tuHd+}*w#r`UfANI$ z>k`C{Cp{3`wHk=ZK@j-+$n76UU*MI`)}&YY45F3pSKZyv3tD?oOa7O!QB8LrznKhj z1nzGXMY-&g9mhev$l%a%M@12%k%2z6MDZJBp6U}He@VN@nV`zHr)JQjny=NrM=jNy z$DxDQAJ$3qd40Ca8mFh$^+5Ak$5a^|;-0-3j9I_PiOO>Sm|jE2)c=$!$bF{%)4z=M w%$wGx+Gq4Zq|}D#t&=vcr@HapBL(M5w?KggMYox^=$Z7k+W%HNGjihkM=>v5RR910 literal 0 HcmV?d00001 diff --git a/lib/my/my_putlong_base.o b/lib/my/my_putlong_base.o new file mode 100644 index 0000000000000000000000000000000000000000..4729bfab3596b2da91261a820170e956ff4138fd GIT binary patch literal 1880 zcmbtU-Afcv6hE_TTKTnF4}yUULKNg=y=fn;E~B^D+9-vDVwzniUEEz|cO*A3gN5j_ z1U^Om6VX#dL{@_7OZg}G5)9Nsf#3#P+c~rM>Nt)sbztr}=XZYRoI7Xkodqp66i^h9 zqQFJi@gxdxvu?+ZIA#Qzpbx_Ry z*JjFk>nmt|_nv>UGf3Rs&t`mf18Ex!!?Yc)Rf_W!Wua}U7d`tNX1pf++i6yux1rF& zwr<-?JrwK0817@EbfrR#_-CroD-+h1VK^G?51$ymI(jnPr=C@@;87}tqTIg@%3Mh4 zY-%{Th@&`$7(FD%X&GnkTBJOR@8Wqs-7E5auKF z73$z;)h7f&-!Bb_2mR=Xx(Lm6bHC%k<@~hS z%p#VZwoDbzd{5pol2f2MbaPU_n=>+|X!qYLj1}nYdQVCOF_PakwY?J8EuHAlOe1a( z?T6xM<5hL!5U!Lt(*2Keh4prj%9D nU+&{DV)S_PsjheS2tkJcljOL>JC-(#`Q?`dNdFDDc=P`PJoJXz#SBQ&}D2OepU~P^^3BriXW@+^y(^=8J=H zkiZua^$&z^dlMC*nPB;*?p3djxHrLqy(kd8;P85$y%}#^*EjXR>^$?C@AJ&;vokxV z1baP_M1)D?I;o5VC8YLH#Sd6+fYg&Z5~Az}&HVJS!n{(XPn6<2jHYaT1$z^fiyLcP z<)>`6z$UjS3z-YbR>qX*bK0R49-V^`jr^huN`bzh+dGu4(gjPy)+zgHzAu$ZmgKXL z{GlvM*+&?fRLVBKCXLG<*e5d%!peGWu%1cTWS)g`pv+TH;EtG5%*+<0xn_jBvF#B1 z2B$Y?XlB+V=_a~;-&|=0VxEAxOgtySuJYEJ>{}&SVe>R5+W+Pmr69p8T~%^3-!XEb zzlg!?3&xr|_)a+*$yy1eEL|+^Y@U0E#qT%{%tt{ zG8e%UNTq-O`qEF89 zed8CXgI0utj`qsN8*F^X#*f3;;tLrbGftbK62*`d+J!1 z%WXHSOfEx*IsY{t?+q@6|0=tQ^_%Pve6cOjciNa;`ceq&&_z4I8J;t{E%EqiI|N_U zPvD#2xYd7%*Pn7B)*t^SB3{%VmvOF*A$|@=`96*S!{&^~yw2JKBJ&(h;lO6jvK)gs QxA-N#|GTzWbe-{k0jicZs{jB1 literal 0 HcmV?d00001 diff --git a/lib/my/my_putnbr_base.o b/lib/my/my_putnbr_base.o new file mode 100644 index 0000000000000000000000000000000000000000..c71f5995127ae974d15a67792636011cf55d8d18 GIT binary patch literal 1848 zcmbu8&1(}u6u{pmwN=~Nw0KY|8a#-iU7{zgMbeaQ7m3D?wjx-zn{>6oBrVx3He%=@ zpbkMOc=A8+FA(uyltQHkwMS3Vix4n}dTI^}@x9GVvfXYk`e63G`Mr;sc{{VB#K!}Y z1VSXZ2JM-k0GB)3cGNMW&;#8trLtdYsTN}Omx`^vQtS_ut+MqB=_*C8ZmhMUiZ)xS zt88k!tkkb6_R8_HV!zob*4byZ>_E28zE{6C8V%vtR8yO3S=m;l&AxZg_wf_^QhkB` zcGWN|)>O8%g;857dTC9j*rlQ^t@KwSIIB)$!h7Ps&zFidDD>{k)G9;d89@&&y;Z(p zmz5g(hWQB*ys-uoV`IbNvlBO`&V{eYm*fZ>r79@W(>ow7hor%tu7j(1)Dy^Pkes2< z=#kL#z*ujmjsZ9&-w1J(Y5E9%;IVT_`b2enBITv&1OgtwDo!r{3g3z@awBir!;TMpE_E3P>K3qjUfct#L zbDSQceQ%$5$QHE4B`cTAYf0TSp4|5(sO+!eO8-k0z&w98x zKgebwYw1bUR=%m{g_Solx@;NC7RYnDrGuO_O^{Oy*{qR6mRqn48L#}1Y3ZrQAUom4 zy!J4!XAQpGf2%N7pu6k6DN$r3KbxxcrC7HN;)Hq{bwjjg`PHUpPjUzc<!QcbZ>G#wG^)4OwvSYPO2bPC%Y7x9BWu?f!HcZ}+Y z{AHTBMD$Of>uC7(f0Z|c-XjV1pI*Jl7yYMgde=q-Z~6XjaeWvW4R1cx_4XbS)Ok^z XCNAOSTBIK>zx*E@-fu-V4R8Km;A`Z# literal 0 HcmV?d00001 diff --git a/lib/my/my_putstr.o b/lib/my/my_putstr.o new file mode 100644 index 0000000000000000000000000000000000000000..4618ed66968e49db79b0a34fc360729efc54bd88 GIT binary patch literal 1440 zcmbtT%}X0W6n~qjv8^9bgcj^!Pohu<>#6lnHik)-5*ny_@U*P!O2Dql?g&~C1wjm6 zJbLV3QF`j72kEIf`VSNW_R@0#_Pu0=jN|4~e_{5$`OW*9H!sJ$Qp#8sC|K|gdOO7e ze9825r=vPB0?%O0t^amU|JZK*sCmuXbaKJlZqRTqc+<5S<6q&Nw@!{)u%G)zr?(U1 z-+8Nk-K5PaZ(Fy&e*S=RvAATBk*TYxD#Mp&Oef_0F$rblwamsr?KfFDI>QmdzP zN93O4%0I9MnD4_wbm;Bvi$ugM=;`2kEi6~KC(nbLAH$N&K{tGg zt9{pnEqNLPZ4>}lau^AJ1Eq+&vZk~+{Nytc9tdEYzVLxc{~CQM<^nDqD*vQTqOS5QN%Np|-SkS|Xu4@zmHzi; z207*bM)M_A^-t07QAz9nY)b#>U#9$3|EV4`H^pwy2Qe%QrdcOn)1The>^)L&BmKl93b>HiPHrEb*# literal 0 HcmV?d00001 diff --git a/lib/my/my_revstr.o b/lib/my/my_revstr.o new file mode 100644 index 0000000000000000000000000000000000000000..7929fbaf9066231031961eeb25698e309c83fc65 GIT binary patch literal 1760 zcmbtT&ubGw6rRbZKeVllMNp_{E|wPUVymE5kZjAeqeKg~QAF#KrduLyT1-}HMNwFg zE^F0e{)ilUC`Aftpkj-sSVVg8(2G#igI@F^)b}7A&T2VDnhvm7wx`kq!Ejnz`DpH;*aqA1^cH#xV^Y%yWHO{;EgZ9$J`Q->w7)DF45HGv@ zub+IP7~vgnFuzsAV#QUqfOB7?4qL$7Sd*5Tm+HBbC?c1iYYbUzfdW3u7VmGYvVtpU z!}V;@qpaX03Ow}=;z9WyWjx=!6b{W%ixogtK-oG(SJS_R)w!Gd#GN~9WBkNPck^bA zyH`GMY+ToFXd~K9O&?hy1ATox(e{B$iH_(QwOc)oz)KZk=j z2K+%W*M$e8?TI`N^)=OAe5O1N&(}Puwd$0^6rx4Y4i2SZ@?$$_S_wRHLKOG~nF5)D zOd+*FG-RpUfv@?CZvv*pvmSTP!0m^DNAI^zAcFW)JMbhkt7nb7IWw!Ks+i~l@xfj# zt`GM253yl=SnG{59p@o%(wHJTfMjYyPo*dH@#L*Z(k&K(o!AZI_jcJ1iN}L{gNKg- zMhl7Ie&C;)o6VTXQSfHA?9&oujme~H8Z#zQ$C74}sH3?YQB%{Ij4=h=)U;`+aF06O zr4iK)H`4leHkmOh`Tr9{L62MVpKJ^`Gs@S8z@o|^`pY$8$hjJk9qyQ2a0?b ZNjZLaOr)zYdjSRM9|`hWC9(|s`acRu*Cqe} literal 0 HcmV?d00001 diff --git a/lib/my/my_show_words_array.o b/lib/my/my_show_words_array.o new file mode 100644 index 0000000000000000000000000000000000000000..9a9bdae9f47be12a05378982d7c643d628422a6b GIT binary patch literal 1552 zcmbVML2DC16n>knt+rLxQc!3QdlD5ps3+|~HVvB$5)5c_@U%|Tl?B~KcDJ+<#6wXC zLGai=;N4rjwIHQ<^G^tY_MrDbeQz_~d?%A6TQDKkcpW{2=#VKcQBsEV{RA&zg7K$Lt}y4=_tB2(Z$=ThbBcJ<}vtpT(oKzRs_JtUlDAKR0JEwi)f58F@nEzj=zD- zjJBWr81G#Nv?7D>kL^uH;KNQab@lJ8>pffMJf| z7%3|W-wKw6n;EcGkqKZcX$q{>j^l6*xwUo{GQ2|zX(n24faUIC6ueGEtjc(j=Awp+ zLb^-lNqfi<%tYo}n?oO}k%vu3B#WTxcm)?ptFH7->3mD_=FR*j*UiDqe-9lf=0)`n zP)jk@KGDpf^3Nzjjw-(z={_i1ciqt^nr-?vr2fpEK`#F%!SRu%B~#T;(ey5g>c1@m zsyb8s>D4N|;%Pr-ZlvHZbqH5(nBD+sO+CdmYmXE-GH8<~8qDv%j%!8w?^6F#(~@cG F{{!zdisk?S literal 0 HcmV?d00001 diff --git a/lib/my/my_showmem.o b/lib/my/my_showmem.o new file mode 100644 index 0000000000000000000000000000000000000000..8f4706647d9c61bf3a31bd172219df3bf03c1424 GIT binary patch literal 3256 zcmbtV-*4Mg6uxfDR!Uc=V@PP7Sa<-fDp=WIjM6dERc`%IZHR4x2f%YuZ>dO{Dt5NC zO4&phU{ysGVp2f}@mEY!r7b@u(e5pXf%=3dRHT&Tp-6l1L!@$!eQ$j0Ixlb}``-JV z@0@ebIoH=WjS`XckxPp8mr`hiE!)c0zLFbjauc=n z!^)D}SVd2Y^>Y!&8sY`HDJ;s(5xJKCV|n@E18N>ptOa|u1KCR_k>^<`i_amTEXuZG z{jOMRjvvo745l?JyGa9YtpM4Hu$do%ap@4Qta5qlsIdNvEmT*J0b#IWRbg9Um^$w2 zX&@=_DnzL%LRGv&PK!5siV>!#n{Y_$E@>S|ig>@oZ3@)imH$2}R11%V!D_)4vOQi1 z%)GGB6veMU-r3n{W$ta?hG2x1FI`x$N%jT*t{@&Qz^ziYwPd4)w*OLeocEid(T9h9_R!1-^aj^zQFohU0q#aC}hS!PjVC=!=fA1N-KI087-JMjT`WUrc|^ z(|?FKND*I5-?8ct&_0hi$oKea>2J66KOhcL!B0I{OLA0Hg&Ib60GoU>4RlI@%%H!LBJ1kc{#lT>_vF+{P^V*073ZM zfTJH~@AMR~i8lQADSsYD6sN~9#^4F^p8_2H4`YKsoSwso_CfqF0Z0C?l<%AYz({IN zH4^FTDLo~{NkY$&scB<2sm-Z5HJ;EiM4gyCe|B_IJwHBvLB6P796dWJtK@oS+SJKx zW_rd{XUzE>IlrdOS6#L;1)Z_VA}Dj(j{F%#XqGMGj|m!ISz7hyTg(`#F4z;(q_#w9e>< z_x}=y^L|VYf0pzA8He-yAKT#LxDgPHi)WnW8|QF59}G7+9M3+(Kjm;fE>Il7@cdUB zc42~M)YL(uKAe3Imwh-p_cwhwJKsO~aCVM~WXz>ZEe4~RamNIkW%Q&bnR?D7(v)Uu zM2Z;(kuqs_;b?Ix!Awe~<64qP@pLMs&w#;9+SDbu-Cs3KE&d5up)Wn5Udd=Fo$lrT z3}Gn-XIldQ-cX_8UXZvUHRhR_j-%W`* zO2qu}-emSHf838hHkz!{_%_`z-p@hy_y-S4wL~wKZ_pVh{`~Py3bMaRH+qe;#i`%^ EU!5s7DgXcg literal 0 HcmV?d00001 diff --git a/lib/my/my_showstr.o b/lib/my/my_showstr.o new file mode 100644 index 0000000000000000000000000000000000000000..cdef09cfc9787ad6e2bf2794e0b6a911b93acbbd GIT binary patch literal 2136 zcmbtU%}*0S6o1=QKm}Tf8X_jvi_xf?f}+8%w2-BZR!I<|2h6&yYuZ3tvb%(0LLfm6 z4Iy&(pYUXehuVZh!i}?c6B4|5^H9b2c4z1?Y%ltnnR)YjzxT28X1buKheL`2Tokwu zjU7h;x{o&WxTnUU1KMFcRr#J;`Vp!8TGs2I$uqUuPxddQ?~t}QUvFJF)6^DjW(!yK zIty0W^dhZoZLoaNRAqi=Q?FC}-RCPv%x|56AAz5H zK{hq8vj8gof<(ngL85|i83cj~t-`LMs(>F9AS$#RLOT)Z66*BM2C>sPB8S)jSDN6x zP4GD46racS&K9wUP54llGn`y$)^Tku3)3@h&MJeEOpgpE(#FW}@DqK^7)uPMbpvMY zylW93S;dTPWK74~GIz*3#^8}*M$)CW%arzz-&i}*s zcYOE|{}IDw{?jJ>jKpVK$P4^-)OkH01e|)t@v4A}^?wuaV*)?QaH^9AmpD^6&ie(L zGgrVP#MQO^HODpEnld%lD!ZV)G+h(4jN^c2m;6n(R475b8QlKlyj ddxsE287SA!!V$%jlQ;+Ye`NKWjK>$*|1XW<3=;qV literal 0 HcmV?d00001 diff --git a/lib/my/my_sort_int_array.o b/lib/my/my_sort_int_array.o new file mode 100644 index 0000000000000000000000000000000000000000..1cd5eea8c0ff76794e912e9508e543cd58a5b43d GIT binary patch literal 1568 zcmbtT&ui2`6n@FJwQ8+vX+fxm^;887qIg&pSy{#g5f8;+FS4dX^iQjG(yoH`F85sO1TU|lU@?VzI- zS@+gM8=zXHUxiq85HC)I|_*FS?P#N&E^?XIO>v5^6i|~rcs3iSYE0-w!528tqZ&Y?NHujNx?-uFuZ2Xw-<2q z-E>?OGv8V9!MJVvHW&+@2S&9~t2uSV>J8s9u%*R!*!Nz!&$7{aqXJJEB)Uv zjdJR(dXgn>J4~b$$`a^Y2~#`D)I{!~!ZV2DwftxO3DlA&{t|s5>QD5cX)ZzHJI+dT zIrWA}kim@HD;$&W07>S#ex4Rm&|c+WxS-owl0lq*J7l7rfO?z@ers&PGUuu>OruGtc10Th=N#9LDFryl48?pb_;2tR;Y@h z2mKlT0_jNtITTO!FL)3F>7m{{EY$by&P#`Jz32x!@4au{_h#nJ?52D7cFwX$V9`xF zii9N^${+bo;yN@;Cu!De{b>Dq@5Zk;;<;BNJg#pRc2J>LD-;mAAED z^jaI;T{i~Vo7{F|ue#@LyIs%P8~se9U)rtRF6Q30R||=^=d$p4+`L#nc z<9%GRC+`}{hTn5mAWAyVdV~X;b9VX_rCTqexSIR=32D50cQuqr$@CQH6%(%9n zqzBARC|=^^>`>R&Dq+;9EQbEli<)m&X)&xMt}%mLhM$_`1n6gcn4+Zk99w(>M>)dF z`ecV|^~j%R8#Pi}6R#00`F0dEBeEC#$R~R~49Tvp)a$`AbIU7HVDpQ(97cZiIoU~i zP^&y^`1L^6{a;(+0=RSYMjYmV52@*o$kl;<OYjY@tOj0pZWH58ix1 z-;k66bNx%4gPQ-UzrtG7?Ei4=1F}BenGRWB>@-h`ujhT&1I;&c?<>9jmXO|6nn%it zk^V`1hn=kcH&sD77y6ICOZ3uz?8jW2DRR_C4-ha;@CU7_M_se`Owp7odJ%yJ^ZciI QE=&JO>HGh$s$uGX0}(2XiU0rr literal 0 HcmV?d00001 diff --git a/lib/my/my_str_islower.o b/lib/my/my_str_islower.o new file mode 100644 index 0000000000000000000000000000000000000000..4c1c20b3294e0e51f3300e0867c18b0d0786ab92 GIT binary patch literal 1872 zcmbtU&1(}u6n~qvjUTCv#Y3Tr0Z}aI;>SgcNYc2;BB2pY4~n|kZdV&@64>3)v{)-t z#n6lYgy>%&JxQQQ@z#Gr2*iWprH6(3-tJ5?4y%IxVCTK}dtbww*;&_$`Iw>rhXU7O zU~v}U*3dxD1ZoD7a2V$F_LuhFYt4VY=2xDL;<~z?*rE!(;Vp`LuuUQQ#@7kGz1H2) zd?I^Oo0_j%yZWZq)s@|`4>0zz)86Tl?`5Z%2r_#oHZ)(617CES+d=)$yl`49T#(~` zDSY~m-oLbc%i2OAmzz$XEzHhMrLU@&)C;uhW3(WY)!U%7Qp#j9ao`P(;W%>i5l+#P zJ(7AA%Z-ja!~itOca3<&U0S$5Rt^Hlf1h~7GA(_-6BZyY0(1gH@O?kR1@Xue2IS*W z;m8VyFGR#)M6d>G91;UV(Bd#GSfM(OVqDlyFeBtnGM?MPY>-nK{}d%5mp4c%U1}`bj%q>GH3HQ#U0d=>rqOVWdb0*bp;(&97L8Iqe@81DNh;H!{oiLldO)_V+`)`wjm|;FCgpn(;A|^l@aE!g)Tgip2AIf$FZ*JaZnU z=Y(>RYmU8Ss-E5QKwU6B6V!Rv1=VWQYIYsDdc(6-y!Gc@&$OO^8id=6#v{k9*{t1v zi!@fCyDQ(U4041Yq3Ev^D`FB2nsr7bQLnJ8tuy{0O3I}(Axwk<&Y&cog)oZ4Di^~7TNd6A- H1UdgFxhvwr literal 0 HcmV?d00001 diff --git a/lib/my/my_str_isnum.o b/lib/my/my_str_isnum.o new file mode 100644 index 0000000000000000000000000000000000000000..24067757b93c9e42e4b5736ea656735c8f46c25c GIT binary patch literal 1512 zcmbu8&ubGw6vyADKjM$p#^NDTg@906(6M@JDY6pQE+Q4gLVM7#O;;Q2rjXr0TdWnT z($I^4jr1TA$f0WDJ9p47x|B zBSncinN!=0Op`|FA}!gC?~UIFR`_-|y!~dB+u6PB5i)d#j^OvK1s8k&N8WDic8;wO zuseNdg?71ZA6gyTXpeoOu`kWWaR+nnoAqoI*}cARg+|ixU9;Yb@_%j7La{hkm|9p| znl8+WyJCi;uOJ1>*m*+6R?e6h$)5Yj+quRJA9MrF{Y$wInd0d1b9Ue%=H|g!D`?bw z=4tEzmLi;Vkba${OwmAUC5ib!nmg0MK76acw_Q4VYb(T#ci%Bih?8 z`9ZBz@vC)Dl&RvE)+#S6!C#!+7U9dn&QZtkBvyfK2+u})I%EQ}6j$q#@VC9dS>-;c z#r?XnYVL+30(UDQvE~F0iB;bxQQq`Cx5})#8MuNU!7V><%CAU7?(TZ&Ma}Wtc(wm; z3!DOXoxBN?8T2~tdM$i)P4ECUGIfZtEKXkX^V}mAwS*L(WE(vBaz4W;MalJVvJY~e zHU19AA}9VaU26St9kQ*~SN)vEbk}eCK(kexLXX)1ljTyF+R|F?k=Ri6Q}`hpY4u;0 z3Dvn!fBaP{Ue!NsZRDPk8~up^>jHm>O~xZ{vi6K9FW1NY>PnvfGEb((AISLLe=CzD Gmg9zH<{TEY4)OD$jp16dGF24OR{O*zne1*QZnc^ z9eRoq?dJ|{Gd4{crIWO1H-9zvKUvYcjp)MLF&;O=!VW6*hIbJ6w2csZYp-ZGH@dr4 z1lXI|wj#UQvA3{CwZaPGN4l)bp3e$rIy8Wf4B&+UeE0}I%VbhJPuv4$n8B4F-yPZB zdL;<`N zEzhB!%r#~C?y@67cP%9G+zA~LOF=-Qy5f0mgIQxGbOnDDSAx)~z9bQcyS2&--|^gJ zxBnkYTmtVt{bo#N(3@oHkBHSZ#SVI8>X7XP*_@)}$9YCBdI>3hiEZ#apr&t{t()on zFY_X5{%ig<&P7f9bGp?2lR9Ku?XTupjp?C3bw{&Roejqh3>#U@}9Mj;_mz`xsA=vfs=sj zPVPF1TWh`u{=}ROdqf z@pmb`>Ob~luFVup$c-Li!Z^bpw5A?)&E7LbC0X<;CK}B1pXXSfeoyL;|6f_d)c*mv CH-+f{ literal 0 HcmV?d00001 diff --git a/lib/my/my_str_to_word_array.o b/lib/my/my_str_to_word_array.o new file mode 100644 index 0000000000000000000000000000000000000000..29d95e9a8ce0d201daa9029062aea0326461182c GIT binary patch literal 2776 zcmbtUO>7%Q6rS~l1ZdiXs)tG~l2!h~PnYm>fCiA$Xp$9*NY&H_1l4xqx=n?DV1Gn{ zim0?HVp)nfR$M?matFbsGHQ#}a`7QTz93m@kSy#&kbLkVVBVXZu_x1Yg~VI!&YSQ3 zzc)Ld(8c+brV&9Jd4mjg0wttAHsCXi&5&`jhh)w04>M?|&G6%9m3Gn8jA+vgt4-7j zx;=mFN90NOkA&Uv&$9#36x$nubj}56}*uE!Uc3kOHkaX z_}3!Zy?sMYFZ8#nw1c@oqPVCDx%W-zsf0Lk#@=W^J6h|Rh<0Y^mVe}a&UPm+_h6$k zaoO+ndUE#D(A;|HZ${ZoNVy*VhTS~^N+In)w4kCvqj=}ckanw-^}b5myvn+ehIG5- zMRYrEd)>UZ?NH@*zwHSMSY=adJqt6Qp_~3=yPQSYwwb$QM%k{Z-GPCAmI`PaX0#16 zYR}M)zX9pSu|cEu3mXBS(lVT)DJ&FA#C)&)jRkH+bSp0K=Y}rIfFj|rHL$wY(TFxM z;RCmLu}$;J;Z&4u3|jU5KfRtA>H%#)9t{}I#b3dzVx-l~Dtd@dMR0TKozpkS!ra`k z^wh#z*{9R58ZR2tgdAWxglHd~B-+}fc4&O;!LQ)d9|jy>q;K#uyKnN-)ZE_D)YqU9 z%U(kq=sJG-@}K(hcM%6-)9cIcGWp|xUu053uHq`>G|*FDG8HaOUhu~pA%FFfqvgJv;XvF_?OO)jH?c z#XJx9zn3(4z?P|hVg@jz-{q#jp0}6D@Pp?Ldzyh)rUw62U*QH1fe=}^A{pU5g7hT3 zh^sfyqbh*PKx+Kw07IXu`hT^5f%}9je-{b+{kzaXe38d7kPBW`eO^t73sv1EZm+bN zOmq8hWv9T4{t5U^V3PWOkYAx^xFYr+Az?52kNK#v(WJ)XU*ZWr4A>rcReSWCRO$&n Z|Ia}#lUn~HAWX7fzE literal 0 HcmV?d00001 diff --git a/lib/my/my_strcapitalize.o b/lib/my/my_strcapitalize.o new file mode 100644 index 0000000000000000000000000000000000000000..f701c96ea590f7ff4cc95f01b5c76ef8a870e4ab GIT binary patch literal 1816 zcmbu8&1(};5Wr`XHc2%#v3LknB;W@Mb!$C{Ek#zswu=;nLJx|XZsSU$*|a9FkOYzl zv64^({|5gE$w>k|1U>bt7rh9Pdhuiq3vp)i9(mm^9&}*e%>3r#y`6nq*H@MTiUL9u zxCJ9mP=LhP$ktp_gD9MYHKX;t)o<#~%c?V5o5Xd#9&S^I!|^udJ=&L3)@vb5snnvl zYHs=izjUMVGhwub$hhoZfED*-=b`SAMh}Y230h4NAXs?>cn=J27>{e_TxS* zr&0^a%gcAyt|aHx>*_Ts12{8Opj1{tDaDoPXgKl~-~B9ddPvUGa{E;Lbs#kvdW;F^ zQf!ep$}BA+{%jO~NF3!WEg~NHGE5-mBQ*9g_%-keLD2Vx0P>(;I#TKKNEty0N#4i| zLU`mzRuIM|Z)noorlj+@GeS1ax$xcDAiK!iMtrb686~#W~S*MeIK%0M}xFp%;(~TTX5GL7&`voY8%frOE3{GDKU< zPvARf_|1Qt55(Y!bhqhm74>5Nw2gOfw}it8KgS7P>#e80-q}-qgu@%;Na7vKX^i>R Nw>i8o)spG0{{xgY<#qr7 literal 0 HcmV?d00001 diff --git a/lib/my/my_strcat.o b/lib/my/my_strcat.o new file mode 100644 index 0000000000000000000000000000000000000000..0669e33a268467c5764607c507fb5d25111ec6f4 GIT binary patch literal 1504 zcmbtT&ubGw6n?YOwrZ=f2o~yLPg21S>P78Al7>wNiAJ=0@U(2#EdjeJWVg^3q(Vgu zd-1RFs-RfRDc(HhA_Vl}Er&pTFFUi@Zl@Q0%k2B!H}A*Jo45N`y=pK9N*FwViKSS8 zzA?e2F)YC>TmV~ieu{(Nrs%vHh|YFj#1`tq0l9Rn(V;aY^lK@$hQjONZeOro{Ad*0 zL)H~uSH$)}uN9K2Su3yBEl2Ke`YnJ3S%Xe^9@pq75mWLsMww9p;Nfl%x$CH-cA}dK zwf#+(NB&L({Dm92z}LeNxVIGqehazQR^)TM`Q|6$ugL7WaTCrl=ENX zZ(}UwOn)rIB&z;=Vy16ZU+ERxQ8;x%@I7l}aNf6pd&C`^8MJ@Mn0rzyrTVArhX{22 zZ)*Baf0>F`{nyo|+(r4JGg8y6Q*1t-?ls?gq+mhTze`3&WV)2Oj7S&%TE;(5Jrj_R F{|hylj2Qp` literal 0 HcmV?d00001 diff --git a/lib/my/my_strchr.o b/lib/my/my_strchr.o new file mode 100644 index 0000000000000000000000000000000000000000..f15cd7dd357c75e6f2d84bf1cac7b4c70018304b GIT binary patch literal 1288 zcmbtTJxc>Y5S>fn_jeE!REU)dx`-e|3yFj?hlqtFg@uIkJPGI}kUJp}#6l5+jjg}I z#!4&&1zSshfI`3~_5qzqcFkrz8y&cv**EX)?C$Ix>uW0kO#@*XEJ0%?Pyi#)h-0-d z23^nzDWmjel#a@!%DMjfq*p2RK6#;64eQys(94GQ+;-)349+r(W_b$guK)H zgU35sV(S4C@%Un7GO?bTiY%}>HcK$TVBLXsxB*(BUmNLeYrn(|k0MSV*(MFkz5Qo_ zcu#8}i3|e#jm{c^k59jB(Dx<)f*@UnBn)E4&w|k62P3=n7d-R>??EIi?WcA|VmZaM z>*cLXo>`3;AVN7b+G*2nnOk%`a~l|{>OLbP&n|etc1+I%w(YvWteoT6S;VqA&t}+) z8P_wdJz#lz-(+?sy_+{3yH@AF!w4=wy-;r?#uxrRFP{@vwsD*grgq>;CP}fXpTHbF zlfUYxQA=y`XNpnXME$S;xEJ+>pGRE8GWA-XNU_RY<@%;xBX+|zQAtao`b+4D(W{H$ zC)*1zG|WNLQICXP;6zhvlcY=o+DqL*2YS+~dcxJaC&@jpKSUGB)bkHu&QD+A#H6I9 HP}P3{tp;Sn literal 0 HcmV?d00001 diff --git a/lib/my/my_strcmp.o b/lib/my/my_strcmp.o new file mode 100644 index 0000000000000000000000000000000000000000..52532c7f6c31409769d3fb077e6307c05653aba6 GIT binary patch literal 1392 zcmbu8K}#D!6vy9YqiJh3sTd6CAw8*Jhaw1V4`n56T||mVgwL%_bbnMuZRz0?Q0^X512|K9AI*{|mMn}nu;Fb!VA za3(0g&&1F-BG-U1cm!KkcxHu1=T=zm{4u+amkqi^$8gqnSM6Xh7Xa1ypcvv+*dgJ7g)_Aaesv#Y6EtWzDZVeQoKXj@rz3G-gH zKb*p9q3|j{zxsA-A^(ysvF8*$MK3h%%O+@*j5hN)_236KW)>MeWT*66naF%k6vjsr zb&MboZ`9Ky{JoA_)nhvjpo7$ONvPvWoarzUhcSBe4xYTl$B|4*`-#4hqP)XxKPWlg zXXXrjfIO|C(N1sdmidQXVDA7!RevlBFK{aXu#a|N1KaU^V9tT(x%$Alg`5<9^_MV_(XBJ^k{jPSZp(wJlF@El&TQ>)%OQa#j65 DM}Lwv literal 0 HcmV?d00001 diff --git a/lib/my/my_strcpy.o b/lib/my/my_strcpy.o new file mode 100644 index 0000000000000000000000000000000000000000..be943156d3601b2b703d0a1a21c2011d29c634ee GIT binary patch literal 1296 zcmbtTOG_g`5U!p?*XQ~`P>6?!2X|p@mW2iNAdxUSh=|DMC^DIyMbL?o8NmqRK@meP z{sw=8h(|&2b;{9WE<(VI-aG`>s!6x$^v+&(3#Pm3tMBXT?&{e$7iJB{KpKN-XhaeP zSTY)ZDs)rO2_2BJijP)tuWA*yD>r71GEbu=vt~JEt7KLzRxV{QxVK7~s>SYm&f(ZN zFl(%dg6QGp_T4*%%K;$g1K~hD*0({G4nY&$-nWhVfBG<1Yo<%z;=3BqU%H3 z32uBCar(%zG|YVLJu=eWt;Py62#7X1a~xiNM`dG?Hv$j? z*7t!so1W+95X)@_F2_!c`+@DO1JAn~Hh0%nf8}k@4eR{xkiZ3~7y6B)#KQ0A6)|yD z8^M4uy#uEzN%3|480P4i{Hy*8YH7{-D@8|`tluvIG0XaL{*JixRqB}M{w%S%>5ftiSLC^|zP%mnQk~B=RNHCzy!PBzct^~{`l3k$@#X~?` z_TsUBh9|+BAXu!IT>KM+fF2^`kb_X)+nq_4?dGCiczNG^@5ju(oqa8;2LlQRVibx|?-Mijm1G2Bd?1Dt{dqYQ zL&NSz6|5iDadBvb^|8SY&whZnxt^9%3rfi9s=M(EOC@l5_ruCzRt^D%>jY|t!D!0)51 zsFpb?01bax(6Cb$G?>ehvCI4n{p2xy8I_g9d7@`T?E+fD9o(+z`JLV8 z&$vD1U{`F1)Btmx!y=4AE`iniH)8N(zvtyX<;pUF4q@sB4&@}tR{4_{qwnOe{2AoZnQEV+ehg!>i26b=U{Kg{ z-nr~Zwwk-a`E9#K?3!~HB`%rjKVc$9U!8%EEO)%nCQ<_?vC=c{Pd1)%> iMonCmPq=#bM7iblN63*xoqq^pLHuW)xFd1NRQX?T`%y3e literal 0 HcmV?d00001 diff --git a/lib/my/my_strlowcase.o b/lib/my/my_strlowcase.o new file mode 100644 index 0000000000000000000000000000000000000000..e56d46c3df0afe8f8af044e79d313d85a1ea1ba7 GIT binary patch literal 1328 zcmbtT%_~Gv6hCjq_ves>8fBD1ag$O=8cmOvB*`o+r002>;u+0*zQclKnv_4l-(h2; zER<5Sw6sxER`yezGw$WS>)G(Dd+#~Fdw%Dh`*o~OPlPlL1T+|fZ%?oQo1t$zUNYlQ z3pJ25vM)yVuyC&ziG7{T=|#iJ8#%pTX!*u#7#%+v`oS$6cdFcl5%W>mhx5pZUetUf z<~zOJx}xlhcQBbqjKsPpXOca!VK%_}sel&h5ZeA6XuABy77j{ zStwCo5!%KGB7#9@Q3h}CL9^k&lL82XbXbxwj59$9LwOL5(G|b&Wk2{PWSXUVN_(Uz zXK%^%GVAFb%XDpK`F(&G#UQ9+U)9Xrb3Ahy7^*+Vl(0N|*8{dOTN?Pj%t| literal 0 HcmV?d00001 diff --git a/lib/my/my_strncat.o b/lib/my/my_strncat.o new file mode 100644 index 0000000000000000000000000000000000000000..797e397e257779c9c5ff7f4f47831600d6185b45 GIT binary patch literal 1520 zcmbtTF>ljQ5WeR?TS_UR>QGb$PpC-nC``0SC~4&62?ZiSJun&97*(Q9rP!5Hq>7<{ zFkbp=m>7_dsK}HbkRc0FBp6`J5UJe7@2Rh@yTDn`clW*f?)>hZ-&pmk!5AoE@BofI zg#!FGj_uOeEWr$11Y5*E#Qv{k5$_E|ywi{Eo=7Y-4+j(#Tcbm3NY>A##2N~(i@SZn zy2+zaVh>qIcpZ`01Hn3%KfwoM-x@NEyKnXO=1;`q?%OXrpA&n8Fzcp?kkY0ody&z}iK&I5RnQfCs#WI4zQo^eWF5-y4-n6UIA? zARu3;H|OBbQQmGLw{rjmeDb7#newCn6L~OZnLGnOe+r*PWKR2@@fi`jimP}k8sPRB zI0U;+7`2+78*xu_z^T<6YvsDrs8*j^>&|+4t!_CoV9Rf+5{uHHlTPCr9i?JQoW@EU zEdUZj)1>#BNzBa7y|dUgTQYh*4&PKj@N%Hj9l*(@Nu}m z>AY;YfiKJbw=yvU%|P~sN{ErDKBrz9t8CKL59&n;moCp`6BZ^>wi0^|Ma&hzUn`HPqsGYUXUL;CH1uAX8Cll+1?Z1lu1{}(Ik8RE4Y`( NKal)q8kfv0|1VH*lO_NF literal 0 HcmV?d00001 diff --git a/lib/my/my_strncmp.o b/lib/my/my_strncmp.o new file mode 100644 index 0000000000000000000000000000000000000000..bcd08ca4726c200afea02cb5af224bb30a20d1a7 GIT binary patch literal 1424 zcmbu8&ubGw6vy8t{o&81mI~E+NKaabLlFdjfUJbEi%1V*ZkD=Tw*+)k$xa~^f`?XN z$;E?zi+GZt2YcL$P^5=mgqEH>nL{AHw>y(eC)rt2Zzrw|=iwYwoana`H4mI+kOJcUUZ!?-g$>E>-4>ciAnrK-n;zyaBAYPr+(TTC*3% z&wRuKyM~+|vS0LiI5GJlSH3uw`-vF@vW?Dq1pf50qWR2D0OUbyh9=BoB+K$JnuRfY z>;yhC#3ztUY5PgOk+Oo#l~B}cUhsx_+C(i-ln(9q*sfW)83=b37^>5;syyL01hAK` zaDlCcAuw+}2>cqd+Pd%=cI0L#T<;aIy8qf`esyK7?gqXpd8%<1)zlO7WNf)=|GVYf z{8#3X6Eiz;)l57=e;qkpm;cq5P)nuK+lr1fRewqWIjU``@iubh>#3zIn34NfvSYnQ zwjlL)^hMD(e+`a|Zl8^hZZG75GZK=HdZhGz`e&M!TvPuKW=^2X literal 0 HcmV?d00001 diff --git a/lib/my/my_strncpy.o b/lib/my/my_strncpy.o new file mode 100644 index 0000000000000000000000000000000000000000..c50335ee43a9d7697dc0f7eb0e8fbc181c8d83aa GIT binary patch literal 1336 zcmb<-^>JfjWMqH=Mg}_u1P><4z)-=2U^{@B4h-B3TnwQeoliYFYhQSDmOkhVy>s04 z2T1a`>mLyHI;^?&2SbTax9cB|yKvFKa4A zEdnBdfUzowfw4k>QJROHV*=1)GC(m927zV};m9Y@#^lV)##9GX0TRFtKw-kd@bN!3 zS!S#u#=yYLfD~v*8kvDI*Z?yFD>h-EYBn6=EEwW^KoKD%_kjHfQk7d7UtCg@mt0V( zmyE=L8K3}VfLx5?YQ5sh+>*p320fr|2%Q0Am84dbFzBTumLxLhB^4Jl=q2ap=BDNW z#q#n?QuTllqFY>&n4Ha^SCpEQsF#`%pH`HZn+mg%B3c@#8x$w#A>#lw74B~+A3aSg z0>wdM=rM5^svey}*RKv#07@?8>em741(^v>tUwwDVD<~a1fVp`ei&^E6o;{qm0m^W zAhFTadO`K0#5GXt22_s)l3oxKJ!`lE#Xzag0f>0bs31rmD2`zIVd5b7pxX`7 vA^>$L%pIIiz3BQu;^<)y(*FXgUlPPY0_gr11j=F4uK;ya2$Eh96J0+5u9|sp literal 0 HcmV?d00001 diff --git a/lib/my/my_strstr.o b/lib/my/my_strstr.o new file mode 100644 index 0000000000000000000000000000000000000000..284454e1bad459ae6404416f5c63d9399f5c8aac GIT binary patch literal 1440 zcmbtT&ubGw6n>Mmsa0!Y5h~V0JZVvfA_&!kM8nuc#DiGyB4r!56m(n3ZlEoc7V58% zi$|~i6UC#{LwoGeV=h8VE_%x$5WlxOW47aX(MNXX&G)|V&6|0XP4)18P6#q4=nf55 z1|@3e27V=RD|CuZ(wx`)?lm_Ky=J4mr+OUOQ(c~p-eG8|o>x2YTB_}dgW?Xo{?fS6 zQe9vi`RGmUB6f(_(WivX5seggN{M+#G%t;BOsDcmB8PVlz ztFEx~b5rG8@`jvd7^T+mshr4G=Z*$eLLaqY_18(CZ4AIZNE1Gw9h$v5)CS`-#q}umYcELFgO|PxmgX1hei$VC{O>S{1l$YzMk+e-@AK+4 zbF+2{3&!jYOxr{)vf<0X`I-Ey{u;EL)4Wr-iJAS!4WMVUznO0WH-46S&jmWT4>WeH z*T6ijpUEbLZ~r9}Fn)Cvd|7*?6Q0)~>$pcoZ*bnm-kT*`djD^{fQ{l~t*vL=zI#CQ ZR41L_MaJxFIg6M}|6c2#WVGzs`d`uRqpSb` literal 0 HcmV?d00001 diff --git a/lib/my/my_strupcase.o b/lib/my/my_strupcase.o new file mode 100644 index 0000000000000000000000000000000000000000..3842a7d7683c6957ac9cb73ec254c796715188d4 GIT binary patch literal 1328 zcmbtT-75r96hE`;`*X>IT56R-ag$O=T5ZE5N#ao&W3IWY|rd{f%vPa5t zvTLrF&ZI2UwVCB}DIB8#K^^{+yG-^6Y&N*oNtuz}8(Cn6>LT_6~A8 zyPnPPLWW$=w6=hy?QN6U$+gY2>DZNZ{yRjm0NsgtGI3t`Yv0_bTp2y+5U1Y6t(+v; zs=g0n^j!X`A4DzHtUOkn1;qO8g5a}QU(BP(3tLWok{!ubbLY6;ch|@jxMob!lBxb0 zI&$>-;`sT%3wCmnbaY2TFL>%lU7I9zywPWJ5cT+xR@D=)o;^}fpHEMda(1p_s#oe-t3!cWlxSmng-G|IDla!S%7$Gh|>d@h6v0; zA@6?X-N#esVo`TG&YLv2C^muq>9< z9?n2(M76}+)N}_6SV5jXvJ?%63(@CLW`44Q2^5bpsyz%}-$B!Q;K=}V@Ey)4)Nv-r zbeIUDF?(_hAO6Khkcs)~8Jv-_tY*=^H*Q&3A}&pGH>h-^T4pyb$0z}_ojUgwi5#=x z0J}6C16awnft72PWmb`^)*O>z8&bAol&^u+%^QQ6mEu+1uuQSj|6Bs))C={Gq{Xt{ zc}1+=xmDzeQ#)XZeATJ?HB6v;@>l&PYH3Zpq9Z2vkBzWAmnd1sjt~1&TmHa@rA|`E z2#6c$HO5c)k?nHljq01o;tbuow3orbi`XbGc+ydiq+aqtdz0jq2DA_EUZDZG0fO9%Pb`WDdcFbr-!2vvHRAm<&u>Tt!h3 zgd7Baj(Ab<&4aL3WvVu9Z|9;FdaCN{`l`CCIxpJ2PR;W`#Dg0!^#ld@ zSex3>#EhU03$PiFzs9e=2l4p%uXz0E$9p2jZ?00v2eQAB_4(6TfNraGJzVbI+&mwy zs>|vkZNQ1i7r=YE4&F}SEiKF+dW*c%h|?ljrcdKo@VeHj&-F2Y{24+e55Uh|*S7Dx z8Gw&Jm-v{;B|aQxe8G=bYRfv6HxhebE3bGjJFd$#zlZsaE}| z4N14R)@<~WwNB?&dn4IsG<)p?9+&rYRwX~hHE7&)%ip_|oMD_ga@4>>#wp%-A^>Xi zB-iN{YF$=(AXb?@OqI@dG^o3&PC;#rMxe@~a{5J{XG7c@7CKY-TvkRp?LWW(qGf|* zyG(OFEf@a}6(X13j6I16F%s#2r-i1nKiR#_bn4 zFq0WJu9*<7jZ(F6U~pf!WZ0Cn{vOS4@$@frvJ=gTsEIDdv*xH a7v^0d#}J11kmG2%_;>jH>0V@I*!(|+7G`4r literal 0 HcmV?d00001 diff --git a/lib/my/octal_formater.o b/lib/my/octal_formater.o new file mode 100644 index 0000000000000000000000000000000000000000..4a61f4cfe81375b1ab0b1824e962fd9536998ad7 GIT binary patch literal 2320 zcmb_c&1(}u6o1>*w$`@B&_kgLk&0N*?T1#apr$QJ7Y(-72Jy6R((MQ4Lv|;$6{=vV zu!N#V{{v5=7cX8~6fEBQC-fpj>OrAG4q|;TJCls-=2H5?}bV|LL0O~Qg^@VE8io!yIj)U!nR(FZR_sm^$c=K#9JvVPsR}~ z718WnI8CNroCtZ4yP+#vdNEllhSzR3li{}Pba;G+1 zNO%zsVw0U)2N0_WcsR^hB-#J#e#9Aw7*1zyo0+Tn}+$yE{#rv0bX4zOq~f zHYlQWOHm>p8i=qqNW69GS|wgFx!d#6-NGPfpF^XNk0(J{3@Kf$P0cTHixY^`AbC$)4!4J%H;lG5s_zt}RPdlb zq8@^udqHbz;Ee-N@fRd2MhX%Yq)RFhRA`cBHB*J)d{tB`9hUN}oE@=KI6|Bw zE39lFeyt83uY-@*!SC0>jXF5w)6C2mGkH5}GRxM|J^+ld#Q4Z?!WfUo@5ZK#so{}C z%z$*hkYo6tW9EF$fsE-eBb%Rw?2<8Sv0TcA1$&-ZG=EfJnS5@RhLJKI3ll*(>8VP` zj-vg0&y#0$@LswoDAeIr9D;vC!rLVLj)b>MctOJDIIA3|mqWKj#D5|2k4gAzAO8=} z|EUuadQMojl`%DDEi%xiO=g0Yavad?yf;bbvsnw9 zpyl$+((s|4cbJ)ehy-%8=8PHJ%<^hiciXoSK~FlG{{=)5BN6xBn|WMelkUPny^G?I zzj(blt*ZR+Ib5Nb`}OZfUyAup?{F^mr#mc*fBzv| zBusoqt6UzCz9X^-f1yWkQP?ss>`#a<`nmVGzn|X8fh%%Qv_<^|Jc&k7|0ejSRrHDa zN4~;e;FOPlZ-iiigRgkPRL3JY{QiXbdxsE|IOxzs694&+<64ma9M9jBe983t{{_pC BXx9J$ literal 0 HcmV?d00001 diff --git a/lib/my/printf.o b/lib/my/printf.o new file mode 100644 index 0000000000000000000000000000000000000000..8a7da155331eaab0f771b719eed06764d08e58c2 GIT binary patch literal 4488 zcmbVOZ){Ul6u++>j6Z|d;Xe?OMwwETrf4)^2g3EGA%uWCdc(hza5svkx=QY$ntAftZDP&h5SJ_3k}QI8EO< z=Xd_xbMHO(zW0gI)9uqVB1j|qNmCOjAvZTPsN?=t?Ja~aD-B|*zup%*2!g{ z`M!TSm3txIZCK73s@;Zs=Y66wuTk`|5lGWW0&&w*gn(XOU3zXI0?S67tM?u(FH`4o zA9z#eLO)}bB(NT*lw+)dnZ~MiP!Abr_0ZvQJ=8m)hfZA5L-DE}N>A&d;*1_Ty*NnA zEgd^ylGG_th}m7Ol@=g9&bwB+57HVYErAq4w~7$}R|2lIQaXyvDXjrkEB(d8ertg$ z%S>epT4Lq0HQm=y++Qm#f+Oz#DD%-)xD*A|`_bGZ&(Q}GE zpy&xj?^g5s9egzGZ#V4kA`WyI9}PQg*gr-b=n6g> z_OBZDi--gLiH#xb{@*p`z$_~t=-NX5VCPM>`d!}yg!tj-Mt;cTMt;I>{uL%aX99Uge62mZbXe#8UE{&XAnJr6wRfuHff%N{uP zgxk1Zc;J@-ZN9;y$l@v z-0J+>1IJGm%=0VH!+IWk*Mshsr`-c5xqK>PC&Dq3$mY|Q9nTj?!3J!|6oAk(*$i{G z28QEJV=QUqn_4zzTfk4yMw$^V>$ zZs{&3nq0Tb^MpW2Xj7b{A&>FHhz$g zzo^s@RP^1TyUl-`AL66DV4OdG4XN{w0){SfkAg}9{L@MJBZj2v6flgBpi!dDJYGJF zXy)ZK_?r?Yg_9R}yo{kN;suW1+ivwoc>JVr<-rIs?1{Khxk#!g2WKHc`EbaEy9?vyLKMOWRQJtEzYExLx2P;CtoYWr1R-0hN^ zukYM#>PxrX>r=qnZes$izO>v8Z~4_u`+Xa->GXW!a&~d;O5(PBOTIzDXK6!7FPA}T z#-*89^wUs zl&tQ^lF;f#S(lm7WFT+oOb2=0vOq4>Dis5tNUqkHA>*`Ox0qgd4zlfTl(b@9uNb`C ze~ScWpqcYeL=ri|Z%4R0`Fb&f2kKqYOQOESN0R1&a2yxK;-_On@E7q!ynll4_zO8< zo{4jaYbYq^zsBFhSSn@z8K4vp^=Zz%5Z4lN9*six`aK9D1AOzG^UfIMS>o|cI(Q)Z zC#d_V1ogkf8=`VY>OXzmB3|^L%J^$j$Twbpj>{7~)*nxK{k^AnLFVkkc;o3@;>_69 P2U*JJZh3 literal 0 HcmV?d00001 diff --git a/lib/my/ptr_formater.o b/lib/my/ptr_formater.o new file mode 100644 index 0000000000000000000000000000000000000000..e35fdb5551f18249f1936711ebae13609fc5cb30 GIT binary patch literal 1488 zcmbtT&ubGw6n>j%8*7yqdJw9x2N4Awe_gboY#KHhN-&}g=xN!cTOzti*o;^O@lX(! zrQko}-J1mu;;nyz7a^b*Z#f9{z1ol7W z+)Zz@zTS2{7)OtX!oxVK(UXPfrAxSe9%is5Ph(RU9RN0Y5emPDQbd^?C@l(}`b-2n z0@#)>d|}XB)C&h!5sqxaX-OVKNp;jHD*n9W^@(~X<8(neinxRZ<^0$9YZyy8@vk)p zRlhdJ=I>YcSVOEEW}RsZQe vdTq)*qYY7!7p7UKSUsM;tKNI0ekZ-18u_Nb{}j4R@ndG8h+THb+U literal 0 HcmV?d00001 diff --git a/lib/my/src/#printf.c# b/lib/my/src/#printf.c# new file mode 100644 index 0000000..c8715a9 --- /dev/null +++ b/lib/my/src/#printf.c# @@ -0,0 +1,95 @@ +/* +** EPITECH PROJECT, 2019 +** Sum stdarg +** File description: +** sum_stdarg +*/ + +#include "formaters.h" +#include "my.h" +#include +#include + +formater_t formaters[] = {{string_formater, 's'}, + {string_nonprintable_formater, 'S'}, + {char_formater, 'c'}, + {int_formater, 'i'}, + {int_formater, 'd'}, + {octal_formater, 'o'}, + {hexa_formater, 'x'}, + {big_hexa_formater, 'X'}, + {uint_formater, 'u'}, + {ptr_formater, 'p'}, + {ubinary_formater, 'b'}, + {float_formater, 'f'}, + {float_formater, 'F'}, + {no_format, '%'}, + {0, 0}}; + +const char modifiersCst[] = "#0-+ hl"; + +int format(va_list ap, char flag, char modifiers[MODIFIERS_SIZE]) +{ + for (int i = 0; formaters[i].flag; i++) { + if (formaters[i].flag == flag) { + return (formaters[i].func(ap, modifiers)); + } + } + return (0); +} + +int is_flag(char c) +{ + for (int i = 0; formaters[i].flag; i++) { + if (formaters[i].flag == c) { + return (1); + } + } + return (0); +} + +int is_modifier(char c) +{ + for (int i = 0; modifiersCst[i]; i++) { + if (modifiersCst[i] == c) + return (1); + } + return (0); +} + +int get_modifiers(const char *str, char flags[MODIFIERS_SIZE]) +{ + int i; + + for (i = 0; !is_flag(str[i]); i++) { + if (!is_modifier(str[i]) && !is_num(str[i])) + return (-1); + flags[i] = str[i]; + } + flags[i] = '\0'; + return (i); +} + +int my_printf(const char *str, ...) +{ + int count = 0; + va_list ap; + char modifiers[MODIFIERS_SIZE]; + int next_is_flag; + + va_start(ap, str); + for (int i = 0; str[i]; i++) { + if (str[i] == '%') { + next_is_flag = 1; + i++; + i += get_modifiers(&str[i], modifiers); + } else + next_is_flag = 0; + if (next_is_flag && is_flag(str[i])) + count += format(ap, str[i], modifiers); + else + count += write(1, &str[i], 1); + } + va_end(ap); + return (count); +} \ No newline at end of file diff --git a/lib/my/src/formaters/big_hexa_formater.c b/lib/my/src/formaters/big_hexa_formater.c new file mode 100644 index 0000000..5782ad8 --- /dev/null +++ b/lib/my/src/formaters/big_hexa_formater.c @@ -0,0 +1,31 @@ +/* +** EPITECH PROJECT, 2019 +** int formater +** File description: +** int_formater +*/ + +#include "formaters.h" +#include "my.h" +#include +#include + +int big_hexa_formater(va_list ap, char mod[MODIFIERS_SIZE]) +{ + long long int var; + int nbrlen; + + if (count('l', mod) >= 2) + var = va_arg(ap, unsigned long long int); + else if (count('l', mod) == 1) + var = va_arg(ap, unsigned long); + else + var = va_arg(ap, unsigned int); + if (contains('0', mod)) + nbrlen = my_getnbr(&mod[last_mod(mod)]); + else + nbrlen = 0; + if (var != 0 && contains('#', mod)) + nbrlen -= write(1, "0X", 2); + return (my_putlonglong_base(var, "0123456789ABCDEF", nbrlen)); +} \ No newline at end of file diff --git a/lib/my/src/formaters/char_formater.c b/lib/my/src/formaters/char_formater.c new file mode 100644 index 0000000..8ab20c7 --- /dev/null +++ b/lib/my/src/formaters/char_formater.c @@ -0,0 +1,18 @@ +/* +** EPITECH PROJECT, 2019 +** Char formater +** File description: +** char_formater +*/ + +#include "formaters.h" +#include "my.h" +#include +#include + +int char_formater(va_list ap, char mod[MODIFIERS_SIZE]) +{ + char var = (char)va_arg(ap, int); + + return (write(1, &var, 1)); +} \ No newline at end of file diff --git a/lib/my/src/formaters/float_formater.c b/lib/my/src/formaters/float_formater.c new file mode 100644 index 0000000..debc171 --- /dev/null +++ b/lib/my/src/formaters/float_formater.c @@ -0,0 +1,24 @@ +/* +** EPITECH PROJECT, 2019 +** int formater +** File description: +** int_formater +*/ + +#include "formaters.h" +#include "my.h" +#include +#include + +int float_formater(va_list ap, char mod[MODIFIERS_SIZE]) +{ + double var = va_arg(ap, double); + int decimal = (var - (int)var) * 1000000 + 1; + + while (decimal % 10 == 0) + decimal /= 10; + my_put_nbr((int)var); + write(1, ".", 1); + my_put_nbr(decimal); + return (0); +} \ No newline at end of file diff --git a/lib/my/src/formaters/hexa_formater.c b/lib/my/src/formaters/hexa_formater.c new file mode 100644 index 0000000..8c384ee --- /dev/null +++ b/lib/my/src/formaters/hexa_formater.c @@ -0,0 +1,31 @@ +/* +** EPITECH PROJECT, 2019 +** int formater +** File description: +** int_formater +*/ + +#include "formaters.h" +#include "my.h" +#include +#include + +int hexa_formater(va_list ap, char mod[MODIFIERS_SIZE]) +{ + long long int var; + int nbrlen; + + if (count('l', mod) >= 2) + var = va_arg(ap, unsigned long long int); + else if (count('l', mod) == 1) + var = va_arg(ap, unsigned long); + else + var = va_arg(ap, unsigned int); + if (contains('0', mod)) + nbrlen = my_getnbr(&mod[last_mod(mod)]); + else + nbrlen = 0; + if (var != 0 && contains('#', mod)) + nbrlen -= write(1, "0x", 2); + return (my_putlonglong_base(var, "0123456789abcdef", nbrlen)); +} \ No newline at end of file diff --git a/lib/my/src/formaters/int_formater.c b/lib/my/src/formaters/int_formater.c new file mode 100644 index 0000000..dc307c9 --- /dev/null +++ b/lib/my/src/formaters/int_formater.c @@ -0,0 +1,33 @@ +/* +** EPITECH PROJECT, 2019 +** int formater +** File description: +** int_formater +*/ + +#include "formaters.h" +#include "my.h" +#include +#include + +int int_formater(va_list ap, char mod[MODIFIERS_SIZE]) +{ + long long int var; + int nbrlen; + + if (count('l', mod) >= 2) + var = va_arg(ap, long long int); + else if (count('l', mod) == 1) + var = va_arg(ap, long); + else + var = va_arg(ap, int); + if (contains('0', mod)) + nbrlen = my_getnbr(&mod[last_mod(mod)]); + else + nbrlen = 0; + if (var >= 0 && contains(' ', mod) && !contains('+', mod)) + nbrlen -= write(1, " ", 1); + if (var >= 0 && contains('+', mod)) + nbrlen -= write(1, "+", 1); + return (my_putlonglong_base(var, "0123456789", nbrlen)); +} \ No newline at end of file diff --git a/lib/my/src/formaters/no_format.c b/lib/my/src/formaters/no_format.c new file mode 100644 index 0000000..178c22b --- /dev/null +++ b/lib/my/src/formaters/no_format.c @@ -0,0 +1,16 @@ +/* +** EPITECH PROJECT, 2019 +** int formater +** File description: +** int_formater +*/ + +#include "formaters.h" +#include "my.h" +#include +#include + +int no_format(va_list _ap, char mod[MODIFIERS_SIZE]) +{ + return (write(1, "%", 1)); +} \ No newline at end of file diff --git a/lib/my/src/formaters/octal_formater.c b/lib/my/src/formaters/octal_formater.c new file mode 100644 index 0000000..da7c016 --- /dev/null +++ b/lib/my/src/formaters/octal_formater.c @@ -0,0 +1,31 @@ +/* +** EPITECH PROJECT, 2019 +** int formater +** File description: +** int_formater +*/ + +#include "formaters.h" +#include "my.h" +#include +#include + +int octal_formater(va_list ap, char mod[MODIFIERS_SIZE]) +{ + long long int var; + int nbrlen; + + if (count('l', mod) >= 2) + var = va_arg(ap, unsigned long long int); + else if (count('l', mod) == 1) + var = va_arg(ap, unsigned long); + else + var = va_arg(ap, unsigned int); + if (contains('0', mod)) + nbrlen = my_getnbr(&mod[last_mod(mod)]); + else + nbrlen = 0; + if (var != 0 && contains('#', mod)) + nbrlen -= write(1, "0", 2); + return (my_putlonglong_base(var, "01234567", nbrlen)); +} \ No newline at end of file diff --git a/lib/my/src/formaters/ptr_formater.c b/lib/my/src/formaters/ptr_formater.c new file mode 100644 index 0000000..bcd0c41 --- /dev/null +++ b/lib/my/src/formaters/ptr_formater.c @@ -0,0 +1,19 @@ +/* +** EPITECH PROJECT, 2019 +** Char formater +** File description: +** char_formater +*/ + +#include "formaters.h" +#include "my.h" +#include +#include + +int ptr_formater(va_list ap, char mod[MODIFIERS_SIZE]) +{ + void *var = va_arg(ap, void *); + + print_ptr(var); + return (0); +} \ No newline at end of file diff --git a/lib/my/src/formaters/string_formater.c b/lib/my/src/formaters/string_formater.c new file mode 100644 index 0000000..91bf943 --- /dev/null +++ b/lib/my/src/formaters/string_formater.c @@ -0,0 +1,23 @@ +/* +** EPITECH PROJECT, 2019 +** String formater +** File description: +** string_formater +*/ + +#include +#include +#include "formaters.h" +#include "my.h" + +int string_formater(va_list ap, char mod[MODIFIERS_SIZE]) +{ + char *var = va_arg(ap, char *); + int length; + + if (contains('0', mod)) + length = my_getnbr(&mod[last_mod(mod)]); + else + length = my_strlen(var); + return (write(1, var, length)); +} \ No newline at end of file diff --git a/lib/my/src/formaters/string_nonprintable_formater.c b/lib/my/src/formaters/string_nonprintable_formater.c new file mode 100644 index 0000000..8520e83 --- /dev/null +++ b/lib/my/src/formaters/string_nonprintable_formater.c @@ -0,0 +1,19 @@ +/* +** EPITECH PROJECT, 2019 +** String formater +** File description: +** string_formater +*/ + +#include +#include +#include "formaters.h" +#include "my.h" + +int string_nonprintable_formater(va_list ap, char mod[MODIFIERS_SIZE]) +{ + char *var = va_arg(ap, char *); + + my_showstr(var); + return (0); +} \ No newline at end of file diff --git a/lib/my/src/formaters/ubinary_formater.c b/lib/my/src/formaters/ubinary_formater.c new file mode 100644 index 0000000..53779aa --- /dev/null +++ b/lib/my/src/formaters/ubinary_formater.c @@ -0,0 +1,29 @@ +/* +** EPITECH PROJECT, 2019 +** int formater +** File description: +** int_formater +*/ + +#include "formaters.h" +#include "my.h" +#include +#include + +int ubinary_formater(va_list ap, char mod[MODIFIERS_SIZE]) +{ + long long int var; + int nbrlen; + + if (count('l', mod) >= 2) + var = va_arg(ap, unsigned long long int); + else if (count('l', mod) == 1) + var = va_arg(ap, unsigned long); + else + var = va_arg(ap, unsigned int); + if (contains('0', mod)) + nbrlen = my_getnbr(&mod[last_mod(mod)]); + else + nbrlen = 0; + return (my_putlonglong_base(var, "01", nbrlen)); +} \ No newline at end of file diff --git a/lib/my/src/formaters/uint_formater.c b/lib/my/src/formaters/uint_formater.c new file mode 100644 index 0000000..47705a9 --- /dev/null +++ b/lib/my/src/formaters/uint_formater.c @@ -0,0 +1,29 @@ +/* +** EPITECH PROJECT, 2019 +** int formater +** File description: +** int_formater +*/ + +#include "formaters.h" +#include "my.h" +#include +#include + +int uint_formater(va_list ap, char mod[MODIFIERS_SIZE]) +{ + long long int var; + int nbrlen; + + if (count('l', mod) >= 2) + var = va_arg(ap, unsigned long long int); + else if (count('l', mod) == 1) + var = va_arg(ap, unsigned long); + else + var = va_arg(ap, unsigned int); + if (contains('0', mod)) + nbrlen = my_getnbr(&mod[last_mod(mod)]); + else + nbrlen = 0; + return (my_putlonglong_base(var, "0123456789", nbrlen)); +} \ No newline at end of file diff --git a/lib/my/src/get_nbr_size.c b/lib/my/src/get_nbr_size.c new file mode 100644 index 0000000..6157162 --- /dev/null +++ b/lib/my/src/get_nbr_size.c @@ -0,0 +1,24 @@ +/* +** EPITECH PROJECT, 2019 +** Get nbr size +** File description: +** get_nbr_size +*/ + +#include "my.h" + +int get_nbr_len(long long int n, const char *base) +{ + int base_size = my_strlen(base); + int i = 1; + + if (n < 0) { + n *= -1; + i++; + } + while (n >= base_size) { + n /= base_size; + i++; + } + return (i); +} \ No newline at end of file diff --git a/lib/my/src/my_putlonglong_base.c b/lib/my/src/my_putlonglong_base.c new file mode 100644 index 0000000..4d1159b --- /dev/null +++ b/lib/my/src/my_putlonglong_base.c @@ -0,0 +1,42 @@ +/* +** EPITECH PROJECT, 2019 +** Put nbr in a custom base +** File description: +** Might be useful later +*/ + +#include +#include "formaters.h" + +int my_strlen(const char *str); + +static void display_a_digit(char c) +{ + write(1, &c, 1); +} + +static void put_digit(long long int n, int base_length, const char *base) +{ + if (n > base_length - 1) + put_digit(n / base_length, base_length, base); + display_a_digit(base[n % base_length]); +} + +int my_putlonglong_base(long long int nbr, const char *base, int nbrlen) +{ + int base_length = my_strlen(base); + + if (base_length < 2) { + display_a_digit(base[0]); + return (0); + } + if (nbr < 0) { + nbr *= -1; + display_a_digit('-'); + nbrlen--; + } + for (int i = get_nbr_len(nbr, base); i < nbrlen; i++) + write(1, base, 1); + put_digit(nbr, base_length, base); + return (nbrlen + nbr < 0 ? 1 : 0); +} diff --git a/lib/my/src/printf.c b/lib/my/src/printf.c new file mode 100644 index 0000000..451fc28 --- /dev/null +++ b/lib/my/src/printf.c @@ -0,0 +1,95 @@ +/* +** EPITECH PROJECT, 2019 +** Sum stdarg +** File description: +** sum_stdarg +*/ + +#include "formaters.h" +#include "my.h" +#include +#include + +formater_t formaters[] = {{string_formater, 's'}, + {string_nonprintable_formater, 'S'}, + {char_formater, 'c'}, + {int_formater, 'i'}, + {int_formater, 'd'}, + {octal_formater, 'o'}, + {hexa_formater, 'x'}, + {big_hexa_formater, 'X'}, + {uint_formater, 'u'}, + {ptr_formater, 'p'}, + {ubinary_formater, 'b'}, + {float_formater, 'f'}, + {float_formater, 'F'}, + {no_format, '%'}, + {0, 0}}; + +const char modifiersCst[] = "#0-+ hl"; + +int format(va_list ap, char flag, char modifiers[MODIFIERS_SIZE]) +{ + for (int i = 0; formaters[i].flag; i++) { + if (formaters[i].flag == flag) { + return (formaters[i].func(ap, modifiers)); + } + } + return (0); +} + +int is_flag(char c) +{ + for (int i = 0; formaters[i].flag; i++) { + if (formaters[i].flag == c) { + return (1); + } + } + return (0); +} + +int is_modifier(char c) +{ + for (int i = 0; modifiersCst[i]; i++) { + if (modifiersCst[i] == c) + return (1); + } + return (0); +} + +int get_modifiers(const char *str, char flags[MODIFIERS_SIZE]) +{ + int i; + + for (i = 0; !is_flag(str[i]); i++) { + if (!is_modifier(str[i]) && !is_num(str[i])) + return (-1); + flags[i] = str[i]; + } + flags[i] = '\0'; + return (i); +} + +int my_printf(const char *str, ...) +{ + int count = 0; + va_list ap; + char modifiers[MODIFIERS_SIZE]; + int next_is_flag; + + va_start(ap, str); + for (int i = 0; str[i]; i++) { + if (str[i] == '%') { + next_is_flag = 1; + i++; + i += get_modifiers(&str[i], modifiers); + } else + next_is_flag = 0; + if (next_is_flag && is_flag(str[i])) + count += format(ap, str[i], modifiers); + else + count += write(1, &str[i], 1); + } + va_end(ap); + return (count); +} \ No newline at end of file diff --git a/lib/my/src/printf_utility.c b/lib/my/src/printf_utility.c new file mode 100644 index 0000000..22baf41 --- /dev/null +++ b/lib/my/src/printf_utility.c @@ -0,0 +1,37 @@ +/* +** EPITECH PROJECT, 2019 +** Utility for the flags +** File description: +** utility +*/ + +#include "formaters.h" + +int count(char c, char *str) +{ + int count = 0; + + for (int i = 0; str[i]; i++) { + if (str[i] == c) + count++; + } + return (count); +} + +int contains(char c, char *str) +{ + for (int i = 0; str[i]; i++) { + if (str[i] == c) + return (1); + } + return (0); +} + +int last_mod(char *modifiers) +{ + for (int i = 0; modifiers[i]; i++) { + if (!is_modifier(modifiers[i])) + return (i); + } + return (0); +} \ No newline at end of file diff --git a/lib/my/string_formater.o b/lib/my/string_formater.o new file mode 100644 index 0000000000000000000000000000000000000000..d759af2da94480fbd3d9f5031e7c3e8e97029a56 GIT binary patch literal 1800 zcmbu9&ubGw6vy8twT*3BW9*?&4}pp(==$SidyxEKlc5G9+8jJBn{=B5vm4kQX)1_^ zqOgQQ&;A7-J?OfKW}wcz?`-==j(IPK%zJ*w2HJ1{+oM~XS14qIN0|V5`%L-9 z2KC_}yR(|2z?(jr4|4J;w!?hJJbDJq(?{g9NS|ma%w^srO0$!RkC;IqUNmq5exAfVO~#%yKobArl*CSPO2T9u#x7H1 z__;Iu5|V7_|MA}u*%DgjOg6ys7+xI1AB^GkFVEsD_atS!A|a=YPBgl)T~4VzAfn>ZR;w4mt3 zr_p|&1llBsB0hsAxknI1JdGy#TY@O!vuKikAc!J9hbDOrV^TtxzoA8Sw=8Zn&~qp7 zZ5cUc*HF3H=b)||+yJ%Vx}Y|DmSx(=>>f8&yyiDuZZw~P>ZhA+eZw&<|6Tvi_>Ulm zwRG2`H!+WlB=1wO3vy*lei4n%B99iKi?KMDSiTjb2pIj#7MG#5Jz|oq$h8 Io^;XrKcK7BzW@LL literal 0 HcmV?d00001 diff --git a/lib/my/string_nonprintable_formater.o b/lib/my/string_nonprintable_formater.o new file mode 100644 index 0000000000000000000000000000000000000000..1dc5c7b2457c45e09bb75524b65210b05d62c568 GIT binary patch literal 1520 zcmbtT&ui2`6n@#&cCA&`r3axNau89_@yAIEO14XOhqAb0y9Y1E?3%h_lSmTjRuB&b zA%sHz5%1nCco1*?30{N+J?L!@LVYipG1)kJ&@arqH{YB0=FOXzmu9zJ(KL|I;1=X7 z$pU<<X7dV3)4T4Kk^JM*1rFCMiGQu51s6lr>0^bi+)~d2H09E`{sA41) zsxYUbG0OZO_@lq^Ix>wyKIt8iyNRQYql|SVR6K-H@Ys7~dA|1)mB=1!Io75hxOU_O zZ1`6*Se%i(U=Quc1~v#oU_;+^9S=Frj~s@*aVd=K;S*r#c4uU52Da;n z+Y|mXJ%ikV@VPFe6taGD zy@raa{$oY`>2H+&vi_7$`D}_kr3q0J2~)3=Z`q&TwOo6oeg(asF7l~-|5IpE`R|LQ L?&YqjR`&l1x*L!w literal 0 HcmV?d00001 diff --git a/lib/my/tests/test_printf.c b/lib/my/tests/test_printf.c new file mode 100644 index 0000000..3f944e9 --- /dev/null +++ b/lib/my/tests/test_printf.c @@ -0,0 +1,176 @@ +/* +** EPITECH PROJECT, 2019 +** Tests +** File description: +** test_disp_stdarg +*/ + +#include +#include +#include "my.h" + +Test(disp, first, .init = cr_redirect_stdout) +{ + my_printf("Insane %s, %c, %d, %s\n", "Yes", '8', 15, "Nope"); + cr_assert_stdout_eq_str("Insane Yes, 8, 15, Nope\n"); +} + +Test(disp, faketag, .init = cr_redirect_stdout) +{ + my_printf("Insane %Y, %c, %d, %s\n", '8', 15, "Nope"); + cr_assert_stdout_eq_str("Insane %Y, 8, 15, Nope\n"); +} + +Test(disp, str, .init = cr_redirect_stdout) +{ + my_printf("Insane %s\n", "156615"); + cr_assert_stdout_eq_str("Insane 156615\n"); +} + +Test(disp, uints, .init = cr_redirect_stdout) +{ + my_printf("Insane %u\n", 156615); + cr_assert_stdout_eq_str("Insane 156615\n"); +} + +Test(disp, characters, .init = cr_redirect_stdout) +{ + my_printf("Insane %c\n", '^'); + cr_assert_stdout_eq_str("Insane ^\n"); +} + +Test(disp, ints, .init = cr_redirect_stdout) +{ + my_printf("Insane %d, %i\n", 15, -15); + cr_assert_stdout_eq_str("Insane 15, -15\n"); +} + +Test(disp, ptr, .init = cr_redirect_stdout) +{ + int ptr = 15; + char *str = malloc(sizeof(char) * 25); + + my_printf("Insane %p\n", &ptr); + sprintf(str, "Insane %p\n", &ptr); + cr_assert_stdout_eq_str(str); +} + +Test(disp, nonprintable, .init = cr_redirect_stdout) +{ + my_printf("Insane %S\n", "\aYes\a"); + cr_assert_stdout_eq_str("Insane \\007Yes\\007\n"); +} + +Test(disp, binary, .init = cr_redirect_stdout) +{ + my_printf("%b\n", 153152); + cr_assert_stdout_eq_str("100101011001000000\n"); +} + +Test(disp, octal, .init = cr_redirect_stdout) +{ + my_printf("%o\n", 153152); + cr_assert_stdout_eq_str("453100\n"); +} + +Test(disp, hexa, .init = cr_redirect_stdout) +{ + my_printf("%x\n", 1561356523); + cr_assert_stdout_eq_str("5d1068eb\n"); +} + +Test(disp, bighexa, .init = cr_redirect_stdout) +{ + my_printf("%X\n", 1561356523); + cr_assert_stdout_eq_str("5D1068EB\n"); +} + +Test(disp, uintneg, .init = cr_redirect_stdout) +{ + my_printf("%u\n", -500); + cr_assert_stdout_eq_str("4294966796\n"); +} + +Test(disp, noformat, .init = cr_redirect_stdout) +{ + my_printf("%%\n"); + cr_assert_stdout_eq_str("%\n"); +} + +Test(disp, floats, .init = cr_redirect_stdout) +{ + my_printf("%f\n", 13.684); + cr_assert_stdout_eq_str("13.684\n"); +} + +Test(disp, morefloat, .init = cr_redirect_stdout) +{ + my_printf("%f\n", 18.138613); + cr_assert_stdout_eq_str("18.138613\n"); +} + +Test(my_printf, mouliS, .init = cr_redirect_stdout) +{ + my_printf("%S", "mouline\atte\n"); + cr_assert_stdout_eq_str("mouline\\007tte\\012"); +} + +Test(my_printf, simplePtr, .init = cr_redirect_stdout) +{ + my_printf("%p", 3456789); + cr_assert_stdout_eq_str("0x34bf15"); +} + +Test(my_printf, intLength, .init = cr_redirect_stdout) +{ + my_printf("%05i", 15); + cr_assert_stdout_eq_str("00015"); +} + +Test(my_printf, intPlusSize, .init = cr_redirect_stdout) +{ + my_printf("%0+5i", 15); + cr_assert_stdout_eq_str("+0015"); +} + +Test(my_printf, intLengthSpace, .init = cr_redirect_stdout) +{ + my_printf("% 05i", 15); + cr_assert_stdout_eq_str(" 0015"); +} + +Test(my_printf, intLengthSpacePlus, .init = cr_redirect_stdout) +{ + my_printf("% 0+5i", -15); + cr_assert_stdout_eq_str("-0015"); +} + +Test(my_printf, xLength, .init = cr_redirect_stdout) +{ + my_printf("%05X", 15); + cr_assert_stdout_eq_str("0000F"); +} + +Test(my_printf, xPlusSize, .init = cr_redirect_stdout) +{ + my_printf("%0+5X", 15); + cr_assert_stdout_eq_str("0000F"); +} + +Test(my_printf, xLengthSpace, .init = cr_redirect_stdout) +{ + my_printf("%#X", -15); + cr_assert_stdout_eq_str("0XFFFFFFF1"); +} + +Test(my_printf, xLengthSpacePlus, .init = cr_redirect_stdout) +{ + my_printf("%# +X", -15); + cr_assert_stdout_eq_str("0XFFFFFFF1"); +} + +Test(my_printf, stringWithMax, .init = cr_redirect_stdout) +{ + my_printf("%# +03s", "ABCDEFG"); + cr_assert_stdout_eq_str("ABC"); +} \ No newline at end of file diff --git a/lib/my/tostr.o b/lib/my/tostr.o new file mode 100644 index 0000000000000000000000000000000000000000..8d3041deaf28c65c79b5834eccc04af8f34df0f5 GIT binary patch literal 2224 zcmbtUOHUI~6h6};paKH2(4e6!Uy(^cQ4ymBa?31=CP?E(GEB<|jkG20pge3aX=0pA zNLb=O@E5qzg$W4=E0)BtU}J2g3tiDgV?Af)UYHC`O!Oo(_uTJ%=W)+{EU`$~CrKbg zg8OhZ6DYvUi6cE^t08EF28b%=Hzi*Tnz^E4&h9B@bjKVnY_RevBw4K7$BIiG7Aq_( z6^j+$9puX9hGIo`6pJBwz3{10IW%l5@ogKIwykJEiEr6NY3s}fcDF|g2_tx zTv=LbQI_p$6_Zh(o&5*-ToL9Q4#tW!U5C#7wtTWAS*+w_+)&QFW&VqEH<$%@F&f0mS0 zg+o|x$r{EQqgcnRi;G03(2`Rq)>PVD3qr7~`^L?lTet7@0t^if-VIzCdKkSL=#{(W zAmu=5a|VzWMnIZtmf9QY>Q}J%3y9N4GEKk!rsg-k!NywOBr+V^J;G5I>33*lUFhuurmuW|f5zl?Sd5u<%= z#?LEZ1gha+q_ajwj>F8Xp-vSo9CKhyu2iu)zPi2jTD z2rAX~?>*nYaZaTDBVXY!_K(tdbCb&)2d8))bXP?TvI~EDKfQZL_B{>`)5Im-^|zp{ PntwfidNr3Xsb2p-;37&t literal 0 HcmV?d00001 diff --git a/lib/my/ubinary_formater.o b/lib/my/ubinary_formater.o new file mode 100644 index 0000000000000000000000000000000000000000..88fca24624abc002586b9b847cb8cb3d708616d5 GIT binary patch literal 2152 zcmb`HTWb?R6vxkYwT-o{vGhTxLcj|ZbXx_%DrnM@cBsK>+u)Ndn{<1jx#;c$8^H?} z#bqh@G5X>M5CjW?#TV&E=!+1kFG3&sAhhRXXOii5^HO@k?40?{|IFpgOx~n3V{MuS z(lodS&6cD911Fn)vhF6K8@eFNyx(l)Z-RNRYRs!_F+aVZfbr4MJBfkuhuN!%VdJJjGxU)PO?x>7+Hzd$@9Kzs!UH{zj0#zm4mi~l z|Ijwt-L7*DC3PP4A?XSDw-?o?N8S_w9e+`#<494agL1hPfesx?tLf?xy?@HRo+!$~ojctMEd(G*89MS+0%C zsM`fm)5)C1@_#R|cP;oJT?jPNcVUtG`wH(?_+y3lD11rqHe_`AavWFDpHX-MeKOKh zX_(eA;c_Ra7o_Ld1)T}^DprfI#K7hCeBZu6P+K$%6Q3Xn(*9+ASU2ju?~8} lr-)N0nv5qF&N20W6!1AU6bq;2EcQjkuZ#6tN-VkI_dGp!to0)xYW?v;!6HS^1 z(lodQ^^v3iy+`YQ!gmwU0qu}s-cPpjJI=fpRpynqSS7i|ye}W~sHu`}WmkKdMp~_) z+xP4|xvcUq79ekfY2R2SQ>}EZ-fbnvYuoM)G>KNW%6!H=dIro(?*4j@bK>*=7AdEK z84qKT?R$qXR|W9paL019{W2qOH~6^#Zu%KwIm`gQ5GKM4h?m^iZrM!kQ2r{J9eldW zR)=UL6<vxcVuU=#e_!fDBDr|W&?hw0l(jXKWV_ByinxkY{@BD+;)uI z{xO)7sr1-r%1lp8JWfuV)1zalqzSoFxybRq$gPE<3wg`sW}!3#g=KTj=EbZ--qSMA zmx^=L%&g_wxB;{?LFZTGIQoD00(;Yd_lb`KRj^&r-&S~s!XGKTQ{jt(HzA{{%XM8v ze?sAL^vOt1t!9S1T;Ns~43|4WKQBGU&RYhzmpB+R7Pr92x-J+_DH!BRg@TP~Gm0f{ z8+dsxyWGkxqJYBed2`mW3L;Cj)eh{$F_K;_d@>Wr$mDqpMuArP)c0VcoF}mDGjWyH z1#H8f){!^kl;9Tx58ucSBHuz*>%#aFKA|}e8b5%sH0QqB;aILuXHT{8`uLUe>UiM=OQ>EXfK!p)ny00V+@BfF09}dOK{7XEAPE`HYMg3%*sD2bH<0X$; to92#*4ZRlopgbOnh$j}V9U@p0aFGUziRo&DzMoO?8)E-fO&K`h_2o~yLPokoON)K%hk~B;*lwd^LgQsO1R~yWxkexzPC>{#J zl7l_gqc@NK4<4%jgybSD=*5#20`utgwn6M3{wcbpd{!m`;nv4geJKXObdjGD#7}Of+U0KZn0~ zhMz)aHgli&KO#r{D4p>JxP1-}+p^th%RXztOHVpMd)EV}-e|5=8cwrTd&<|GwaQ9^ zJK*=7K=wLbH_kq%YS2Htgllw?h^=@Ui_B;Mu%PctcLTNTC3;h%p4V}i^mZh$=dN^t zZ3F?Z)|T&kUF5o3(qs7YcLV9RUIB~Uy-nvu&-Fc3?!T3d8R+fvFH=U2ME5tb5?_r; z&*P$AlyPOnR!z|Tn#4n@qeoElHx!?rq_^2*8B95{at95{`LFT!F_v + +#define MAXCOL 1024 +#define MAX_ENTITY 20 + +typedef struct quadtree quadtree; + +typedef struct qt_intrect +{ + float x; + float y; + int h; + int w; +} qt_intrect; + +typedef struct qt_object +{ + int id; + qt_intrect rect; + int layer; +} qt_object; + +typedef struct qt_collision +{ + float distance_left; + float distance_right; + float distance_top; + float distance_down; + int *collide_with; +} qt_collision; + +struct quadtree +{ + qt_intrect rect; + int capacity; + void *objects; +}; + +quadtree *qt_create(qt_intrect rect, int capacity); +int qt_add(quadtree *tree, qt_object obj); +qt_collision collision_get_info(quadtree *tree, int entity_id); +bool qt_collide(qt_intrect r1, qt_intrect r2); +qt_object *qt_getobj(quadtree *tree, int id); +int qt_update(quadtree *tree, qt_object obj); +void qt_destroy(quadtree *tree); \ No newline at end of file diff --git a/lib/quadtree/include/quadtree_internal.h b/lib/quadtree/include/quadtree_internal.h new file mode 100644 index 0000000..22b4ab4 --- /dev/null +++ b/lib/quadtree/include/quadtree_internal.h @@ -0,0 +1,30 @@ +/* +** EPITECH PROJECT, 2019 +** quadtree +** File description: +** quadtree_internal +*/ + +#pragma once + +#include "quadtree.h" +#include + +void *my_calloc(int capacity, int size); + +quadtree *qt_split(quadtree *tree); + +bool collision_overlapx(qt_intrect r1, qt_intrect r2); +bool collision_overlapy(qt_intrect r1, qt_intrect r2); + +bool collision_can_see(int l1, int l2); + +#define MIN(x, y) ((x) < (y) ? (x) : (y)) +#define MAX(x, y) ((x) < (y) ? (y) : (x)) + +#define CAN_BE_SEEN 0b10 +#define CAN_SEE 0b01 + +#define TREEOBJ_AT(x) (&((qt_object *)tree->objects)[i]) + +#define COLLISION_MAX ((qt_collision){MAXCOL, MAXCOL, MAXCOL, MAXCOL, NULL}) \ No newline at end of file diff --git a/lib/quadtree/src/array.c b/lib/quadtree/src/array.c new file mode 100644 index 0000000..19ff0c8 --- /dev/null +++ b/lib/quadtree/src/array.c @@ -0,0 +1,27 @@ +/* +** EPITECH PROJECT, 2020 +** Twac +** File description: +** array +*/ + +#include "quadtree.h" + +int arr_len(int *arr) +{ + int i = 0; + + while (arr[i] != -1) + i++; + return (i); +} + +void arr_add(int *arr, int n) +{ + int new = arr_len(arr); + + if (new + 1 > MAX_ENTITY) + return; + arr[new] = n; + arr[new + 1] = -1; +} \ No newline at end of file diff --git a/lib/quadtree/src/qt_collide.c b/lib/quadtree/src/qt_collide.c new file mode 100644 index 0000000..f886eb1 --- /dev/null +++ b/lib/quadtree/src/qt_collide.c @@ -0,0 +1,79 @@ +/* +** EPITECH PROJECT, 2019 +** MUL_my_runner_2019 +** File description: +** qt_getcollide +*/ + +#include "quadtree.h" +#include "quadtree_internal.h" +#include "array.h" + +qt_collision check_collisions(qt_object *obj1, qt_object *obj2, int *colwith) +{ + qt_intrect r1 = obj1->rect; + qt_intrect r2 = obj2->rect; + qt_collision col = COLLISION_MAX; + + if (collision_overlapy(r1, r2)) { + if (r1.x <= r2.x) + col.distance_right = r2.x - (r1.x + r1.w); + if (r2.x <= r1.x) + col.distance_left = r1.x - (r2.x + r2.w); + } + if (collision_overlapx(r1, r2)) { + if (r1.y >= r2.y) + col.distance_down = r1.y - r2.y - r1.h; + if (r2.y >= r1.y) + col.distance_top = r2.y - r1.y - r2.h; + } + if (col.distance_right == 0 || col.distance_down == 0 || + col.distance_left == 0 || col.distance_right == 0) + arr_add(colwith, obj2->id); + return (col); +} + +qt_collision sum_col(qt_collision col1, qt_collision col2) +{ + col1.distance_down = MAX(0, MIN(col1.distance_down, col2.distance_down)); + col1.distance_top = MAX(0, MIN(col1.distance_top, col2.distance_top)); + col1.distance_left = MAX(0, MIN(col1.distance_left, col2.distance_left)); + col1.distance_right = MAX(0, MIN(col1.distance_right, col2.distance_right)); + return (col1); +} + +qt_collision collrec(quadtree *tree, int id, qt_collision col, int *collidewith) +{ + qt_object *obj; + qt_object *tmp; + quadtree *child; + + if (tree->capacity == -1) { + for (int i = 0; i < 4; i++) { + child = &((quadtree *)tree->objects)[i]; + col = collrec(child, id, col, collidewith); + } + return (col); + } + obj = qt_getobj(tree, id); + if (!obj) + return (col); + for (int i = 0; i < tree->capacity && TREEOBJ_AT(i)->id != -1; i++) { + tmp = TREEOBJ_AT(i); + if (tmp->id == id || !collision_can_see(obj->layer, tmp->layer)) + continue; + col = sum_col(col, check_collisions(obj, tmp, collidewith)); + } + return (col); +} + +qt_collision collision_get_info(quadtree *tree, int id) +{ + qt_collision col = COLLISION_MAX; + static int collidewith[MAX_ENTITY + 1]; + + collidewith[0] = -1; + col = collrec(tree, id, col, collidewith); + col.collide_with = collidewith; + return (col); +} \ No newline at end of file diff --git a/lib/quadtree/src/qt_destroy.c b/lib/quadtree/src/qt_destroy.c new file mode 100644 index 0000000..e0f6918 --- /dev/null +++ b/lib/quadtree/src/qt_destroy.c @@ -0,0 +1,25 @@ +/* +** EPITECH PROJECT, 2019 +** MUL_my_runner_2019 +** File description: +** qt_destroy +*/ + +#include "quadtree.h" +#include + +void qt_child_destroy(quadtree *tree) +{ + if (tree->capacity < 0) { + for (int i = 0; i < 4; i++) { + qt_child_destroy(&((quadtree *)tree->objects)[i]); + } + } + free(tree->objects); +} + +void qt_destroy(quadtree *tree) +{ + qt_child_destroy(tree); + free(tree); +} \ No newline at end of file diff --git a/lib/quadtree/src/qt_layer.c b/lib/quadtree/src/qt_layer.c new file mode 100644 index 0000000..73815aa --- /dev/null +++ b/lib/quadtree/src/qt_layer.c @@ -0,0 +1,23 @@ +/* +** EPITECH PROJECT, 2020 +** Twac +** File description: +** qt_layer +*/ + +#include "quadtree_internal.h" +#include + +bool collision_can_see(int l1, int l2) +{ + int can_see = CAN_SEE; + int can_be_seen = CAN_BE_SEEN; + + for (int i = 0; i < 4; i++) { + if (l1 & can_see && l2 & can_be_seen) + return (true); + can_see <<= 2; + can_be_seen <<= 2; + } + return (false); +} \ No newline at end of file diff --git a/lib/quadtree/src/qt_position_overlap.c b/lib/quadtree/src/qt_position_overlap.c new file mode 100644 index 0000000..9bfa9fc --- /dev/null +++ b/lib/quadtree/src/qt_position_overlap.c @@ -0,0 +1,35 @@ +/* +** EPITECH PROJECT, 2020 +** Twac +** File description: +** qt_position_overlap +*/ + +#include "quadtree.h" + +//X1 is on the line or X2 is on the line or both X are on each side of the map +bool collision_overlapx(qt_intrect r1, qt_intrect r2) +{ + if (r1.x > r2.x && r1.x < r2.x + r2.w) + return (true); + if (r1.x + r1.w > r2.x && r1.x + r1.w < r2.x + r2.w) + return (true); + if (r1.x < r2.x && r1.x + r1.w > r2.x + r2.w) + return (true); + if (r1.x == r2.x) + return (true); + return (false); +} + +bool collision_overlapy(qt_intrect r1, qt_intrect r2) +{ + if (r1.y - r1.h < r2.y && r1.y - r1.h > r2.y - r2.h) + return (true); + if (r1.y < r2.y && r1.y - r1.h > r2.y - r2.h) + return (true); + if (r1.y < r2.y && r1.y > r2.y - r2.h) + return (true); + if (r1.y == r2.y) + return (true); + return (false); +} \ No newline at end of file diff --git a/lib/quadtree/src/qt_split.c b/lib/quadtree/src/qt_split.c new file mode 100644 index 0000000..43ee036 --- /dev/null +++ b/lib/quadtree/src/qt_split.c @@ -0,0 +1,55 @@ +/* +** EPITECH PROJECT, 2019 +** quadtree +** File description: +** qt_split +*/ + +#include "quadtree.h" +#include "quadtree_internal.h" +#include + +bool qt_collide(qt_intrect r1, qt_intrect r2) +{ + if (r1.x + r1.w < r2.x || r2.x + r2.w < r1.x) + return (false); + if (r1.y + r1.h < r2.y || r2.y + r2.h < r1.y) + return (false); + return (true); +} + +qt_object *qt_filter_objects(quadtree *tree, qt_intrect rect) +{ + qt_object *objs = my_calloc(tree->capacity, sizeof(qt_object)); + int len = 0; + + for (int i = 0; i < tree->capacity; i++) { + if (qt_collide(((qt_object *)tree->objects)[i].rect, rect)) + objs[len++] = ((qt_object *)tree->objects)[i]; + } + return (objs); +} + +quadtree *qt_split(quadtree *tree) +{ + quadtree *ret = malloc(sizeof(quadtree) * 4); + + if (!ret) + return (NULL); + for (int i = 0; i < 4; i++) { + ret[i].capacity = tree->capacity; + ret[i].rect.h = tree->rect.h / 2; + ret[i].rect.w = tree->rect.w / 2; + ret[i].rect.x = tree->rect.x; + if (i % 2) + ret[i].rect.x += tree->rect.w / 2; + ret[i].rect.y = tree->rect.y; + if (i > 1) + ret[i].rect.y += tree->rect.h / 2; + ret[i].objects = (void *)qt_filter_objects(tree, ret[i].rect); + } + tree->capacity = -1; + free(tree->objects); + tree->objects = (void *)ret; + return (ret); +} \ No newline at end of file diff --git a/lib/quadtree/src/quadtree.c b/lib/quadtree/src/quadtree.c new file mode 100644 index 0000000..5ff60ed --- /dev/null +++ b/lib/quadtree/src/quadtree.c @@ -0,0 +1,98 @@ +/* +** EPITECH PROJECT, 2019 +** quadtree +** File description: +** quadtree +*/ + +#include "quadtree.h" +#include "quadtree_internal.h" +#include +#include + +quadtree *qt_create(qt_intrect rect, int capacity) +{ + quadtree *tree = malloc(sizeof(quadtree)); + + if (!tree) + return (NULL); + tree->rect = rect; + tree->capacity = capacity; + tree->objects = my_calloc(capacity, sizeof(qt_object)); + if (!tree->objects) { + free(tree); + return (NULL); + } + return (tree); +} + +int qt_add(quadtree *tree, qt_object obj) +{ + int i = 0; + + if (tree->capacity > 0) { + while (i < tree->capacity && ((qt_object *)tree->objects)[i].id != -1) + i++; + if (i < tree->capacity) + ((qt_object *)tree->objects)[i] = obj; + else { + qt_split(tree); + qt_add(tree, obj); + } + return (0); + } + for (i = 0; i < 4; i++) { + if (qt_collide(((quadtree *)tree->objects)[i].rect, obj.rect)) + qt_add(&((quadtree *)tree->objects)[i], obj); + } + return (0); +} + +qt_object *qt_getobj(quadtree *tree, int id) +{ + qt_object *obj; + int cap = tree->capacity; + + if (tree->capacity == -1) { + for (int i = 0; i < 4; i++) { + obj = qt_getobj(((quadtree **)tree->objects)[i], id); + if (obj) + return (obj); + } + return (NULL); + } + for (int i = 0; i < cap && ((qt_object *)tree->objects)[i].id != -1; i++) { + if (((qt_object *)tree->objects)[i].id == id) + return (&((qt_object *)tree->objects)[i]); + } + return (NULL); +} + +int qt_remove(quadtree *tree, int id) +{ + int last = tree->capacity - 1; + qt_object *objects; + + if (tree->capacity == -1) { + for (int i = 0; i < 4; i++) { + qt_remove(&((quadtree *)tree->objects)[i], id); + } + return (0); + } + objects = (qt_object *)tree->objects; + while (last > 0 && ((qt_object *)tree->objects)[last].id == -1) + last--; + for (int i = 0; i < tree->capacity && objects[i].id != -1; i++) { + if (objects[i].id == id) { + objects[i] = objects[last]; + objects[last] = (qt_object){-1, {-1, -1, -1, -1}, -1}; + } + } + return (0); +} + +int qt_update(quadtree *tree, qt_object obj) +{ + qt_remove(tree, obj.id); + return (qt_add(tree, obj)); +} \ No newline at end of file diff --git a/lib/quadtree/src/utility/calloc.c b/lib/quadtree/src/utility/calloc.c new file mode 100644 index 0000000..ba6962f --- /dev/null +++ b/lib/quadtree/src/utility/calloc.c @@ -0,0 +1,19 @@ +/* +** EPITECH PROJECT, 2019 +** quadtree +** File description: +** calloc +*/ + +#include +#include + +void *my_calloc(int capacity, int size) +{ + void *alloc = malloc(capacity * size); + + if (!alloc) + return (NULL); + memset(alloc, -1, capacity * size); + return (alloc); +} \ No newline at end of file diff --git a/lib/quadtree/tests/test_add.c b/lib/quadtree/tests/test_add.c new file mode 100644 index 0000000..4fdc47e --- /dev/null +++ b/lib/quadtree/tests/test_add.c @@ -0,0 +1,41 @@ +/* +** EPITECH PROJECT, 2019 +** MUL_my_runner_2019 +** File description: +** test_add +*/ + +#include "quadtree.h" +#include "quadtree_internal.h" +#include + +Test(qt_add, without_split) +{ + quadtree *tree = qt_create((qt_intrect){0, 0, 1000, 1000}, 3); + + qt_add(tree, (qt_object){0, {0, 0, 100, 100}}); + qt_add(tree, (qt_object){1, {0, 0, 100, 100}}); + qt_add(tree, (qt_object){2, {0, 0, 100, 100}}); + cr_assert_eq(tree->capacity, 3); + cr_assert_eq(((qt_object *)tree->objects)[0].id, 0); + cr_assert_eq(((qt_object *)tree->objects)[1].id, 1); + cr_assert_eq(((qt_object *)tree->objects)[2].id, 2); +} + +Test(qt_add, with_split) +{ + quadtree *tree = qt_create((qt_intrect){0, 0, 1000, 1000}, 3); + quadtree *child; + + qt_add(tree, (qt_object){0, {0, 0, 100, 100}}); + qt_add(tree, (qt_object){1, {0, 0, 100, 100}}); + qt_add(tree, (qt_object){2, {0, 0, 100, 100}}); + qt_add(tree, (qt_object){4, {550, 0, 100, 100}}); + cr_assert_eq(tree->capacity, -1); + child = &((quadtree *)tree->objects)[0]; + cr_assert_eq(((qt_object *)child->objects)[0].id, 0); + cr_assert_eq(((qt_object *)child->objects)[1].id, 1); + cr_assert_eq(((qt_object *)child->objects)[2].id, 2); + child = &((quadtree *)tree->objects)[1]; + cr_assert_eq(((qt_object *)child->objects)[0].id, 4); +} \ No newline at end of file diff --git a/lib/quadtree/tests/test_collide.c b/lib/quadtree/tests/test_collide.c new file mode 100644 index 0000000..ac4fdbe --- /dev/null +++ b/lib/quadtree/tests/test_collide.c @@ -0,0 +1,25 @@ +/* +** EPITECH PROJECT, 2019 +** MUL_my_runner_2019 +** File description: +** test_collide +*/ + +#include +#include "quadtree.h" + +Test(collide, yes) +{ + qt_intrect r1 = {0, 0, 10, 10}; + qt_intrect r2 = {0, 0, 100, 100}; + + cr_assert_eq(qt_collide(r1, r2), true); +} + +Test(collide, no) +{ + qt_intrect r1 = {0, 0, -10, -10}; + qt_intrect r2 = {0, 0, 100, 100}; + + cr_assert_eq(qt_collide(r1, r2), false); +} \ No newline at end of file diff --git a/lib/xmlparser/.gitignore b/lib/xmlparser/.gitignore new file mode 100644 index 0000000..8e5d36f --- /dev/null +++ b/lib/xmlparser/.gitignore @@ -0,0 +1,3 @@ +*.o +*.gc* +libxmlparser.a \ No newline at end of file diff --git a/lib/xmlparser/LICENSE b/lib/xmlparser/LICENSE new file mode 100644 index 0000000..23c2e93 --- /dev/null +++ b/lib/xmlparser/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2019 Tristan Roux + +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. diff --git a/lib/xmlparser/Makefile b/lib/xmlparser/Makefile new file mode 100644 index 0000000..5076871 --- /dev/null +++ b/lib/xmlparser/Makefile @@ -0,0 +1,73 @@ +## +## EPITECH PROJECT, 2019 +## xmlparser +## File description: +## Makefile +## + +SRC = src/xmlparser.c \ + src/parsenode.c \ + src/list_utility.c \ + src/helper.c \ + src/xmlproperties.c \ + src/rawnode.c \ + src/xml_destroy.c \ + src/xmlget.c \ + src/strangeget.c \ + src/floatutils.c \ + src/child.c + +OBJ = $(SRC:%.c=%.o) + +TESTS = tests/test_basics.c \ + tests/tests_realxml.c + +TEST_MAIN = tests/test_main.c + +COVERAGE = --coverage -lcriterion + +INCLUDE = -I ./include + +CFLAGS = $(INCLUDE) -Wall -Wextra -Wshadow + +LDFLAGS = -lmy -L ../my + +CC = gcc + +AR = ar rc + +NAME = libxmlparser.a + +UT = ./ut + +FT = ./ft + +all: build + +build: $(OBJ) + $(AR) $(NAME) $(OBJ) + +tests_run: + $(CC) -o $(UT) $(SRC) $(TESTS) $(COVERAGE) $(CFLAGS) $(LDFLAGS) + $(UT) + +clean: + $(RM) $(OBJ) + $(RM) *.gc* + +fclean: clean + $(RM) $(NAME) + $(RM) $(UT) + $(RM) $(FT) + +re: fclean all + +dbg: CFLAGS += -g +dbg: re + +main-dbg: CFLAGS += -g +main-dbg: fclean +main-dbg: $(OBJ) + $(CC) -o $(FT) $(SRC) $(TEST_MAIN) $(CFLAGS) $(LDFLAGS) + +.PHONY: all build clean fclean diff --git a/lib/xmlparser/README.md b/lib/xmlparser/README.md new file mode 100644 index 0000000..b643cf6 --- /dev/null +++ b/lib/xmlparser/README.md @@ -0,0 +1,28 @@ +# XmlParser + +An xml parser in C. + +# Dependencies +To compile, you'll need gcc, ar rc and make. + +### System calls +Open, Close, Read, Stat + +## Build +Simple clone the repo and use the command ``make``. + +## Usage +Use ``xml_parse(path)`` to parse the whole xml. + +Use ``xml_getnode(xml, node_name)`` to get the first node with the name you inputed. + +Use ``xml_getproperty(key)`` to get an attribute of the xml. + +## Unsuported yet +Attributes with semi quotes (') instead of quotes (") + +Comments + +String containing multiples following spaces. + +String containing \n, \r or \t (theses specials chars are removed) diff --git a/lib/xmlparser/include/my.h b/lib/xmlparser/include/my.h new file mode 100644 index 0000000..dfd923f --- /dev/null +++ b/lib/xmlparser/include/my.h @@ -0,0 +1,123 @@ +/* +** EPITECH PROJECT, 2019 +** My lib +** File description: +** Header file +*/ +#pragma once + +int my_str_islower_or_num(const char *str); + +int count_valid_queens_placements(int n); + +char *my_strchr(char *str, char c); + +int my_compute_power_it(int n, int p); + +int my_compute_power_rec(int n, int p); + +int my_compute_factorial_it(int n); + +int my_compute_factorial_rec(int n); + +int my_compute_square_root(int n); + +char *my_evil_str(char *str); + +int my_find_prime_sup(int n); + +int my_getnbr_base(const char *str, const char *base); + +int my_getnbr(const char *str); + +int my_isneg(int n); + +int my_is_prime(int n); + +void my_print_alpha(void); + +void my_print_comb2(void); + +void my_print_combn(int n); + +void my_print_comb(void); + +void my_print_digits(void); + +void my_print_revalpha(void); + +void my_putchar(char c); + +void my_putlong_base(long n, const char *base); + +void my_putnbr_base(int n, const char *base); + +void my_put_nbr(int n); + +void my_putstr(const char *str); + +void my_revstr(char *str); + +void my_showmem(const char *str); + +void my_showstr(const char *str); + +void my_sort_int_array(int *array); + +int is_letter(char c); + +int is_alpha(char c); + +int is_num(char c); + +int is_digit(char c); + +char *my_strcapitalize(char *str); + +char *my_strcat(char *dest, const char *src); + +int my_strcmp(const char *s1, const char *s2); + +char *my_strcpy(const char *str); + +int my_str_isalpha(const char *str); + +int is_lowercase(char c); + +int my_str_islower(const char *str); + +int my_str_isnum(const char *str); + +int is_printable(char c); +int my_str_isprintable(const char *str); + +int is_upper(char c); +int my_str_isupper(const char *str); + +int my_strlen(const char *str); + +int my_strlowcase(const char *str); + +char *my_strncat(char *dest, const char *src, int n); + +int my_strncmp(const char *s1, const char *s2, int n); + +char *my_strncpy(char *dest, const char *src, int n); + +char *my_strstr(const char *str, const char *to_find); + +int my_strupcase(const char *str); + +void my_swap(int *a, int *b); + +char *my_strdup(const char *str); + +char **my_str_to_word_array(const char *str); + +int my_show_word_array(const char **words); + +int is_alphanum(char c); + +int first_alphanum(const char *str); + +int index_of(const char *str, char c); \ No newline at end of file diff --git a/lib/xmlparser/include/xml.h b/lib/xmlparser/include/xml.h new file mode 100644 index 0000000..389ddb3 --- /dev/null +++ b/lib/xmlparser/include/xml.h @@ -0,0 +1,44 @@ +/* +** EPITECH PROJECT, 2019 +** MUL_my_runner_2019 +** File description: +** xml +*/ + +typedef struct node node; +typedef struct dictionary dictionary; + +#pragma once + +#include +#include + +struct dictionary +{ + char *key; + char *value; + + dictionary *next; +}; + +struct node +{ + char *name; + dictionary *properties; + node *child; + + node *next; +}; + +node *xml_parse(const char *path); +node *xml_getnode(node *parent, const char *name); +bool xml_hasproperty(node *n, const char *key); +char *xml_getproperty(node *n, const char *key); +char *xml_gettempprop(node *n, const char *key); +int xml_getintprop(node *n, const char *key); +int xml_getbinaprop(node *n, const char *key); +int xml_gethexaprop(node *n, const char *key); +float xml_getfloatprop(node *n, const char *key); +int xml_getchildcount(node *n); +int xml_getchildcount_filtered(node *n, char *name); +void xml_destroy(node *n); \ No newline at end of file diff --git a/lib/xmlparser/include/xml_internal.h b/lib/xmlparser/include/xml_internal.h new file mode 100644 index 0000000..65ace57 --- /dev/null +++ b/lib/xmlparser/include/xml_internal.h @@ -0,0 +1,20 @@ +/* +** EPITECH PROJECT, 2019 +** xmlParser +** File description: +** xml_internal +*/ + +#pragma once + +#include + +void xml_fillclosing_br(char *buffer, const char *name); +char *xml_getname(char **nodestr, bool *has_parameters, bool *has_childs); +dictionary *xml_getproperties(char **nodestr, bool *can_have_child); +char *trimstr(char *str); +int xml_getstringdata(node *n, char **nodestr); +int xml_checkclosing(node *n, char **nodestr); +dictionary *property_add(dictionary *list, dictionary *property); +node *xml_parsenode(char **nodestr); +int get_int_size(int n); \ No newline at end of file diff --git a/lib/xmlparser/src/child.c b/lib/xmlparser/src/child.c new file mode 100644 index 0000000..99508f6 --- /dev/null +++ b/lib/xmlparser/src/child.c @@ -0,0 +1,38 @@ +/* +** EPITECH PROJECT, 2020 +** Twac +** File description: +** child +*/ + +#include "xml.h" +#include "my.h" + +int xml_getchildcount_filtered(node *n, char *name) +{ + int i = 0; + + if (!n || !n->child) + return (0); + n = n->child; + while (n->next) { + n = n->next; + if (!my_strcmp(n->name, name)) + i++; + } + return (i); +} + +int xml_getchildcount(node *n) +{ + int i = 1; + + if (!n || !n->child) + return (0); + n = n->child; + while (n->next) { + n = n->next; + i++; + } + return (i); +} \ No newline at end of file diff --git a/lib/xmlparser/src/floatutils.c b/lib/xmlparser/src/floatutils.c new file mode 100644 index 0000000..e4f59c3 --- /dev/null +++ b/lib/xmlparser/src/floatutils.c @@ -0,0 +1,20 @@ +/* +** EPITECH PROJECT, 2019 +** MUL_my_runner_2019 +** File description: +** floatutils +*/ + +#include "my.h" + +int get_int_size(int n) +{ + int base_size = my_strlen("0123456789"); + int i = 1; + + while (n >= base_size) { + n /= base_size; + i++; + } + return (i); +} \ No newline at end of file diff --git a/lib/xmlparser/src/helper.c b/lib/xmlparser/src/helper.c new file mode 100644 index 0000000..0a7dccb --- /dev/null +++ b/lib/xmlparser/src/helper.c @@ -0,0 +1,42 @@ +/* +** EPITECH PROJECT, 2019 +** xmlParser +** File description: +** helper +*/ + +#include "my.h" +#include + +void xml_fillclosing_br(char *buffer, const char *name) +{ + int i = my_strlen(name) + 2; + + buffer[0] = '<'; + buffer[1] = '/'; + buffer[2] = '\0'; + my_strcat(buffer, name); + buffer[i] = '>'; + buffer[i + 1] = '\0'; +} + +char *trimstr(char *str) +{ + int len = 0; + char *trimed; + + for (int i = 0; str[i]; i++) { + if (str[i] != '\t' && str[i] != '\n' && str[i] != '\r') + len++; + } + trimed = malloc(sizeof(char) * (len + 1)); + len = 0; + for (int i = 0; str[i]; i++) { + if (str[i] != '\t' && str[i] != '\n' && str[i] != '\r') { + trimed[len] = str[i]; + len++; + } + } + trimed[len] = '\0'; + return (trimed); +} \ No newline at end of file diff --git a/lib/xmlparser/src/list_utility.c b/lib/xmlparser/src/list_utility.c new file mode 100644 index 0000000..e6598e7 --- /dev/null +++ b/lib/xmlparser/src/list_utility.c @@ -0,0 +1,24 @@ +/* +** EPITECH PROJECT, 2019 +** xmlparser +** File description: +** list_utility +*/ + +#include "xml.h" +#include + +dictionary *property_add(dictionary *list, dictionary *property) +{ + dictionary *listconst = list; + + property->next = NULL; + if (!list) + return (property); + else { + while (list->next) + list = list->next; + list->next = property; + } + return (listconst); +} \ No newline at end of file diff --git a/lib/xmlparser/src/parsenode.c b/lib/xmlparser/src/parsenode.c new file mode 100644 index 0000000..5c6da93 --- /dev/null +++ b/lib/xmlparser/src/parsenode.c @@ -0,0 +1,100 @@ +/* +** EPITECH PROJECT, 2019 +** MUL_my_runner_2019 +** File description: +** parseline +*/ + +#include "xml.h" +#include "xml_internal.h" +#include "my.h" +#include +#include + +int xml_checkclosing(node *n, char **nodestr) +{ + if (!(*nodestr)[0] && (*nodestr)[1] == '/') { + if (my_strstr(*nodestr + 1, n->name) != *nodestr + 2) + return (-1); + *nodestr += 2 + my_strlen(n->name); + if ((*nodestr)[0] != '>') + return (-1); + *nodestr += 1; + return (0); + } + if (!(*nodestr)[0]) { + *nodestr += 1; + return (0); + } + return (-1); +} + +void xml_parsenext(node *n, char **nodestr, int depth) +{ + if (depth != 0) + n->next = xml_parsenode(nodestr); + else + n->next = NULL; +} + +int xml_parsechild(node *n, char **nodestr, bool has_child) +{ + char endname[my_strlen(n->name + 3)]; + static int depth = 0; + char *p; + + if (has_child) { + xml_fillclosing_br(endname, n->name); + p = my_strstr(*nodestr, endname); + if (!p) + return (-1); + *p = '\0'; + depth++; + n->child = xml_parsenode(nodestr); + if (xml_checkclosing(n, nodestr) < 0) + return (-1); + depth--; + } else + n->child = NULL; + xml_parsenext(n, nodestr, depth); + return (0); +} + +node *xml_parseproperties(node *n, char **str, bool has_params, bool has_childs) +{ + if (has_params) { + n->properties = xml_getproperties(str, &has_childs); + if (!n->properties) + return (NULL); + } + else + n->properties = NULL; + if (xml_parsechild(n, str, has_childs) < 0) + return (NULL); + return (n); +} + +node *xml_parsenode(char **nodestr) +{ + node *n = malloc(sizeof(node)); + bool has_param; + bool has_childs; + char *p = my_strchr(*nodestr, '>'); + + if (!n) + return (NULL); + if ((*nodestr)[0] == '<') { + if (p && (*nodestr)[1] != '/') { + *p = '\0'; + *nodestr += 1; + n->name = xml_getname(nodestr, &has_param, &has_childs); + if (n->name) + return (xml_parseproperties(n, nodestr, has_param, has_childs)); + } + } else if ((*nodestr)[1] != '/' && xml_getstringdata(n, nodestr) == 0) { + n->next = xml_parsenode(nodestr); + return (n); + } + free(n); + return (NULL); +} \ No newline at end of file diff --git a/lib/xmlparser/src/rawnode.c b/lib/xmlparser/src/rawnode.c new file mode 100644 index 0000000..6a53007 --- /dev/null +++ b/lib/xmlparser/src/rawnode.c @@ -0,0 +1,26 @@ +/* +** EPITECH PROJECT, 2019 +** xmlparser +** File description: +** rawnode +*/ + +#include "xml.h" +#include "xml_internal.h" +#include "my.h" +#include +#include + +int xml_getstringdata(node *n, char **nodestr) +{ + dictionary *prop = malloc(sizeof(dictionary)); + + prop->key = my_strdup("data"); + prop->value = my_strdup(*nodestr); + prop->next = NULL; + *nodestr += my_strlen(*nodestr); + n->name = my_strdup("data"); + n->child = NULL; + n->properties = prop; + return (0); +} \ No newline at end of file diff --git a/lib/xmlparser/src/strangeget.c b/lib/xmlparser/src/strangeget.c new file mode 100644 index 0000000..0e02eb6 --- /dev/null +++ b/lib/xmlparser/src/strangeget.c @@ -0,0 +1,41 @@ +/* +** EPITECH PROJECT, 2020 +** Twac +** File description: +** strangeget +*/ + +#include "xml.h" +#include "xml_internal.h" +#include "my.h" +#include + +int xml_gethexaprop(node *n, const char *key) +{ + char *prop = xml_gettempprop(n, key); + + if (!prop || my_strlen(prop) == 0) + return (0); + if (prop[0] == '0' && prop[1] == 'x') + prop += 2; + if (my_str_islower_or_num(prop)) + return (my_getnbr_base(prop, "0123456789abcdef")); + else + return (my_getnbr_base(prop, "0123456789ABCDEF")); +} + +int xml_getbinaprop(node *n, const char *key) +{ + char *prop = xml_gettempprop(n, key); + + if (!prop || my_strlen(prop) == 0) + return (0); + if (prop[0] == '0' && prop[1] == 'b') + prop += 2; + return (my_getnbr_base(prop, "01")); +} + +bool xml_hasproperty(node *n, const char *key) +{ + return (xml_gettempprop(n, key) != NULL); +} \ No newline at end of file diff --git a/lib/xmlparser/src/xml_destroy.c b/lib/xmlparser/src/xml_destroy.c new file mode 100644 index 0000000..137d4b3 --- /dev/null +++ b/lib/xmlparser/src/xml_destroy.c @@ -0,0 +1,33 @@ +/* +** EPITECH PROJECT, 2019 +** xmlparser +** File description: +** xml_destroy +*/ + +#include "xml.h" +#include + +void xml_free_dict(dictionary *dic) +{ + if (!dic) + return; + if (dic->next) + xml_free_dict(dic->next); + free(dic->key); + free(dic->value); + free(dic); +} + +void xml_destroy(node *n) +{ + if (!n) + return; + if (n->next) + xml_destroy(n->next); + if (n->child) + xml_destroy(n->child); + xml_free_dict(n->properties); + free(n->name); + free(n); +} \ No newline at end of file diff --git a/lib/xmlparser/src/xmlget.c b/lib/xmlparser/src/xmlget.c new file mode 100644 index 0000000..62b7bd5 --- /dev/null +++ b/lib/xmlparser/src/xmlget.c @@ -0,0 +1,76 @@ +/* +** EPITECH PROJECT, 2019 +** xmlparser +** File description: +** xmlget +*/ + +#include "xml.h" +#include "xml_internal.h" +#include "my.h" +#include "math.h" +#include + +char *xml_gettempprop(node *n, const char *key) +{ + if (!n) + return (NULL); + for (dictionary *prop = n->properties; prop; prop = prop->next) { + if (!my_strcmp(key, prop->key)) + return (prop->value); + } + return (NULL); +} + +char *xml_getproperty(node *n, const char *key) +{ + char *prop = xml_gettempprop(n, key); + + if (prop) + return (my_strdup(prop)); + return (NULL); +} + +int xml_getintprop(node *n, const char *key) +{ + char *prop = xml_gettempprop(n, key); + + if (!prop || my_strlen(prop) == 0) + return (0); + return (my_getnbr(prop)); +} + +float xml_getfloatprop(node *n, const char *key) +{ + char *prop = xml_gettempprop(n, key); + float nbr; + int deci; + + if (!prop) + return (0); + for (int i = 0; prop[i]; i++) { + if (!is_num(prop[i]) && prop[i] != '.') + return (-1); + } + nbr = (float)my_getnbr(prop); + prop += get_int_size(nbr); + if (*prop) { + deci = my_getnbr(prop + 1); + nbr += deci / pow(10, (float)get_int_size(deci)); + } + return (nbr); +} + +node *xml_getnode(node *parent, const char *name) +{ + node *tmp; + + if (!my_strcmp(parent->name, name)) + return (parent); + for (node *n = parent->child; n; n = n->next) { + tmp = xml_getnode(n, name); + if (tmp != NULL) + return (tmp); + } + return (NULL); +} \ No newline at end of file diff --git a/lib/xmlparser/src/xmlparser.c b/lib/xmlparser/src/xmlparser.c new file mode 100644 index 0000000..5bf3c62 --- /dev/null +++ b/lib/xmlparser/src/xmlparser.c @@ -0,0 +1,93 @@ +/* +** EPITECH PROJECT, 2019 +** MUL_my_runner_2019 +** File description: +** xmlparser +*/ + +#include "my.h" +#include "xml.h" +#include "xml_internal.h" +#include +#include +#include +#include +#include + +int xml_handle_prolog(char **nodestr) +{ + char *strconst = *nodestr; + + if (my_strstr(*nodestr, ""); + if (!*nodestr) { + free(strconst); + return (-1); + } + *nodestr += 2; + } + return (0); +} + +bool is_charvalid(char c) +{ + if (c == ' ' || c == '\t' || c == '\n' || c == '\r') + return (false); + if (c == '"' || c == '\'') + return (false); + if (c == '=') + return (false); + if (c == '>' || c == '<' || c == '/') + return (false); + return (true); +} + +bool is_space_usefull(char *nodestr, int i) +{ + if (i == 0 || (!is_charvalid(nodestr[i - 1]) && nodestr[i - 1] != '"')) + return (false); + if (i + 1 == my_strlen(nodestr) || !is_charvalid(nodestr[i + 1])) + return (false); + return (true); +} + +node *xml_parsestr(char *nodestr) +{ + node *n; + char *strconst = nodestr; + + if (xml_handle_prolog(&nodestr) < 0) + return (NULL); + for (int i = 0; nodestr[i]; i++) { + if (nodestr[i] == ' ' && !is_space_usefull(nodestr, i)) + nodestr[i] = '\t'; + } + nodestr = trimstr(nodestr); + free(strconst); + strconst = nodestr; + n = xml_parsenode(&nodestr); + free(strconst); + return (n); +} + +node *xml_parse(const char *path) +{ + node *n = NULL; + int fd = open(path, O_RDONLY); + struct stat stats; + char *nodestr; + int count; + + if (fd < 0) + return (NULL); + fstat(fd, &stats); + nodestr = malloc(stats.st_size + 1); + if (nodestr) { + count = read(fd, nodestr, stats.st_size); + nodestr[stats.st_size] = '\0'; + if (count == stats.st_size) + n = xml_parsestr(nodestr); + } + close(fd); + return (n); +} \ No newline at end of file diff --git a/lib/xmlparser/src/xmlproperties.c b/lib/xmlparser/src/xmlproperties.c new file mode 100644 index 0000000..5410260 --- /dev/null +++ b/lib/xmlparser/src/xmlproperties.c @@ -0,0 +1,85 @@ +/* +** EPITECH PROJECT, 2019 +** xmlparser +** File description: +** xmlproperties +*/ + +#include "my.h" +#include "xml.h" +#include "xml_internal.h" +#include +#include + +char *xml_getname(char **nodestr, bool *has_parameters, bool *has_childs) +{ + char *p = my_strchr(*nodestr, ' '); + char *name; + int i = 1; + + if (p) + *has_parameters = true; + else { + *has_parameters = false; + if (!(p = my_strchr(*nodestr, '/'))) { + p = my_strchr(*nodestr, '>'); + *has_childs = true; + } else { + i++; + *has_childs = false; + } if (!p) + p = *nodestr + my_strlen(*nodestr); + } + *p = '\0'; + name = my_strdup(*nodestr); + *nodestr = p + i; + return (name); +} + +dictionary *xml_parseproperty(char **nodestr) +{ + dictionary *property = malloc(sizeof(dictionary)); + char *p; + + if (!property) + return (NULL); + p = my_strchr(*nodestr, '='); + if (!p) + return (NULL); + *p = '\0'; + property->key = my_strdup(*nodestr); + *nodestr = p + 1; + if ((*nodestr)[0] != '"') + return (NULL); + *nodestr += 1; + p = my_strchr(*nodestr, '"'); + if (!p) + return (NULL); + *p = '\0'; + property->value = my_strdup(*nodestr); + *nodestr = p + 1; + return (property); +} + +dictionary *xml_getproperties(char **nodestr, bool *can_have_child) +{ + dictionary *properties = NULL; + dictionary *property = NULL; + + while ((*nodestr)[0] != '\0') { + property = xml_parseproperty(nodestr); + if (!property) + return (NULL); + properties = property_add(properties, property); + if ((*nodestr)[0] == ' ') + *nodestr += 1; + if ((*nodestr)[0] == '/') { + *nodestr += 1; + *can_have_child = false; + } + else + *can_have_child = true; + } + *nodestr += 1; + return (properties); +} \ No newline at end of file diff --git a/lib/xmlparser/tests/test_basics.c b/lib/xmlparser/tests/test_basics.c new file mode 100644 index 0000000..680bc0a --- /dev/null +++ b/lib/xmlparser/tests/test_basics.c @@ -0,0 +1,83 @@ +/* +** EPITECH PROJECT, 2019 +** xmlparser +** File description: +** test_basics +*/ + +#include "xml.h" +#include "xml_internal.h" +#include +#include + +Test(xml, simple) +{ + char *xml = strdup(""); + node *n = xml_parsenode(&xml); + + cr_assert_str_eq(n->name, "yes"); + cr_assert_eq(n->child, NULL); + cr_assert_eq(n->next, NULL); + cr_assert_eq(n->properties, NULL); +} + +Test(xml, withparam) +{ + char *xml = strdup(""); + node *n = xml_parsenode(&xml); + + cr_assert_str_eq(n->name, "yes"); + cr_assert_eq(n->child, NULL); + cr_assert_eq(n->next, NULL); + cr_assert_str_eq(n->properties->key, "params"); + cr_assert_str_eq(n->properties->value, "Test"); + cr_assert_eq(n->properties->next, NULL); +} + +Test(xml, withnext) +{ + char *xml = strdup(""); + node *n = xml_parsenode(&xml); + + cr_assert_str_eq(n->name, "yes"); + cr_assert_str_eq(n->child->name, "nop"); + cr_assert_eq(n->child->child, NULL); + cr_assert_eq(n->child->properties, NULL); + cr_assert_str_eq(n->child->next->name, "yep"); + cr_assert_eq(n->child->next->child, NULL); + cr_assert_eq(n->child->next->properties, NULL); + cr_assert_eq(n->child->next->next, NULL); + cr_assert_str_eq(n->properties->key, "params"); + cr_assert_str_eq(n->properties->value, "Test"); + cr_assert_eq(n->properties->next, NULL); +} + +Test(xml, withchild) +{ + char *xml = strdup(""); + node *n = xml_parsenode(&xml); + + cr_assert_str_eq(n->name, "yes"); + cr_expect_eq(n->next, NULL); + cr_assert_eq(n->properties, NULL); + cr_assert_str_eq(n->child->name, "nop"); + cr_assert_eq(n->child->child, NULL); + cr_assert_eq(n->child->properties, NULL); + cr_assert_eq(n->child->next, NULL); +} + +Test(xml, withchildwparams) +{ + char *xml = strdup(""); + node *n = xml_parsenode(&xml); + + cr_assert_str_eq(n->name, "yes"); + cr_assert_eq(n->next, NULL); + cr_assert_str_eq(n->properties->key, "params"); + cr_assert_str_eq(n->properties->value, "Test"); + cr_assert_eq(n->properties->next, NULL); + cr_assert_str_eq(n->child->name, "nop"); + cr_assert_eq(n->child->child, NULL); + cr_assert_eq(n->child->properties, NULL); + cr_assert_eq(n->child->next, NULL); +} \ No newline at end of file diff --git a/lib/xmlparser/tests/test_main.c b/lib/xmlparser/tests/test_main.c new file mode 100644 index 0000000..f1195cc --- /dev/null +++ b/lib/xmlparser/tests/test_main.c @@ -0,0 +1,19 @@ +/* +** EPITECH PROJECT, 2019 +** xmlparser +** File description: +** test_main +*/ + +#include "xml.h" +#include +#include + +int main(int argc, char **argv) +{ + if (argc != 2) + return (printf("Usage: %s xml_path\n", argv[0]), 0); + node *n = xml_parse(argv[1]); + xml_destroy(n); + return (0); +} \ No newline at end of file diff --git a/lib/xmlparser/tests/testprolog.txt b/lib/xmlparser/tests/testprolog.txt new file mode 100644 index 0000000..6c89782 --- /dev/null +++ b/lib/xmlparser/tests/testprolog.txt @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/lib/xmlparser/tests/tests_realxml.c b/lib/xmlparser/tests/tests_realxml.c new file mode 100644 index 0000000..3410c74 --- /dev/null +++ b/lib/xmlparser/tests/tests_realxml.c @@ -0,0 +1,47 @@ +/* +** EPITECH PROJECT, 2019 +** xmlparser +** File description: +** tests_realxml +*/ + +#include "xml.h" +#include +#include + +Test(xml, complete) +{ + node *n = xml_parse("tests/testprolog.txt"); + + cr_assert_str_eq(n->name, "yes"); + cr_assert_eq(n->next, NULL); + cr_assert_eq(n->properties, NULL); + cr_assert_str_eq(n->child->name, "nop"); + cr_assert_eq(n->child->child, NULL); + cr_assert_eq(n->child->properties, NULL); + cr_assert_str_eq(n->child->next->name, "Test"); + cr_assert_eq(n->child->next->properties, NULL); + cr_assert_eq(n->child->next->child, NULL); + cr_assert_eq(n->child->next->next, NULL); +} + +Test(xml, completewstring) +{ + node *n = xml_parse("tests/teststring.txt"); + + cr_assert_str_eq(n->name, "entity"); + cr_assert_eq(n->next, NULL); + cr_assert_str_eq(n->properties->key, "id"); + cr_assert_str_eq(n->properties->value, "0"); + cr_assert_eq(n->properties->next, NULL); + cr_assert_str_eq(n->child->name, "PositionComponent"); + cr_assert_eq(n->child->properties, NULL); + cr_assert_eq(n->child->next, NULL); + cr_assert_str_eq(n->child->child->name, "pos"); + cr_assert_str_eq(n->child->child->child->properties->value, "5,5"); + cr_assert_str_eq(n->child->child->next->name, "size"); + cr_assert_str_eq(n->child->child->next->properties->key, "x"); + cr_assert_str_eq(n->child->child->next->properties->value, "500"); + cr_assert_str_eq(n->child->child->next->properties->next->key, "y"); + cr_assert_str_eq(n->child->child->next->properties->next->value, "500"); +} \ No newline at end of file diff --git a/lib/xmlparser/tests/teststring.txt b/lib/xmlparser/tests/teststring.txt new file mode 100644 index 0000000..e368301 --- /dev/null +++ b/lib/xmlparser/tests/teststring.txt @@ -0,0 +1,6 @@ + + + 5, 5 + + + \ No newline at end of file