(2024-09-09) Making pure C great again (feat. Mongoose) ------------------------------------------------------- Here, I'm not going to talk about that Mongoose that has something to do with MongoDB, I don't even know what it does. I'm going to talk about that Mongoose that resides on https://mongoose.ws and is an "industrial-grade" networking library with more or less complete Web server capabilities. It's written in pure C and compilable directly with your own sources: you just add mongoose.c and mongoose.h to the project, include the .h file in the source and the .c file to the list of files passed to the compiler, and that's it. I, for instance, could not find the process as straighforward for libhttp, which they say had been derived from Mongoose some time ago. I've stumbled upon this library when looking to simplify my upcoming livestream chat aggregation server to make it not use raw socket and become more cross-platform in the future. The backend-server-frontend interaction concept had changed several times but I still liked the idea the core should be written in pure C with little to no third-party additions, and its structure should be kept as simple and robust as possible. The amount of manual work, however, began to overwhelm me and made it look not so simple anymore, so I started to look for alternatives. And this is the one I decided to use after all. Of course, Mongoose does have some issues on its own: it doesn't compile with -std=c89 (or pretty much any -std for that matter), it can throw out "Illegal instruction" errors when compiled with -O flags (and I'm not even sure what's to blame here — Alpine Linux, musl or Mongoose codebase itself), and it leads to pretty heavy binaries even when no additional compiler flags are switched on. However, despite all this, the package provided here is so complete that I can live without -O flags and C89 compatibility. You get your own multiprotocol networking, API server, static file server, WebSockets, JSON decoding, string processing and much, much more in a single place. It's adding to C almost everything that I have missed here from what I have in Python. And it's also said to be extremely portable across various OSes and architectures, which is quite important for what I'm trying to achieve here. By the way, I'm also still looking for a pure C, lightweight, cross-platform desktop GUI library. The closest to what I want is libui/libui-ng, but its almost non-existent scrolling capabilities make it a no-go for most real use cases. Dear ImGUI+cimgui, raylib+raygui and Nuklear only seem tiny, but the first two of them are built on top of OpenGL, which is quite far from my definition of lightweight, and the third one requires providing your own platform-dependent rendering code. In fact, the search for a sane desktop GUI is still ongoing, but for now Web-based seems like the only choice. Lastly, I think pure C programming is still underrated. Of course it requires you to adhere to strict security practices in terms of memory management and type checking, but when done properly, it rewards you with full knowledge about the internal flow of the program and unparalleled execution speed and resource efficiency, something that's sadly often forgot about these days. --- Luxferre ---