Tiny XML library.

Overview

Mini-XML Version 3.2

Mini-XML is a small XML parsing library that you can use to read XML data files or strings in your application without requiring large non-standard libraries. Mini-XML only requires a "make" program and an ANSI C compatible compiler - GCC works, as do most vendors' ANSI C compilers.

Mini-XML provides the following functionality:

  • Reading of UTF-8 and UTF-16 and writing of UTF-8 encoded XML files and strings.
  • Data is stored in a linked-list tree structure, preserving the XML data hierarchy.
  • SAX (streamed) reading of XML files and strings to minimize memory usage.
  • Supports arbitrary element names, attributes, and attribute values with no preset limits, just available memory.
  • Supports integer, real, opaque ("cdata"), and text data types in "leaf" nodes.
  • Functions for creating and managing trees of data.
  • "Find" and "walk" functions for easily locating and navigating trees of data.

Mini-XML doesn't do validation or other types of processing on the data based upon schema files or other sources of definition information.

Note: Version 3.0 hides the definition of the mxml_node_t structure, requiring the use of the various accessor functions that were introduced in version 2.0.

Building Mini-XML

Mini-XML comes with an autoconf-based configure script; just type the following command to get things going:

./configure

The default install prefix is /usr/local, which can be overridden using the --prefix option:

./configure --prefix=/foo

Other configure options can be found using the --help option:

./configure --help

Once you have configured the software, type make to do the build and run the test program to verify that things are working, as follows:

make

If you are using Mini-XML under Microsoft Windows with Visual C++, use the included project files in the vcnet subdirectory to build the library instead. Note: The static library on Windows is NOT thread-safe.

Installing Mini-XML

The install target will install Mini-XML in the lib and include directories:

make install

Once you have installed it, use the -lmxml option to link your application against it.

Documentation

The documentation is available in the doc subdirectory in the files mxml.html (HTML) and mxml.epub (EPUB). You can also look at the testmxml.c source file for examples of using Mini-XML.

Mini-XML provides a single header file which you include:

#include <mxml.h>

Nodes (elements, comments, processing directives, integers, opaque strings, real numbers, and text strings) are represented by mxml_node_t objects. New nodes can be created using the mxmlNewElement(), mxmlNewInteger(), mxmlNewOpaque(), mxmlNewReal(), and mxmlNewText() functions. Only elements can have child nodes, and the top node must be the "?xml" processing directive.

You load an XML file using the mxmlLoadFile() function:

FILE *fp;
mxml_node_t *tree;

fp = fopen("filename.xml", "r");
tree = mxmlLoadFile(NULL, fp, MXML_OPAQUE_CALLBACK);
fclose(fp);

Similarly, you save an XML file using the mxmlSaveFile() function:

FILE *fp;
mxml_node_t *tree;

fp = fopen("filename.xml", "w");
mxmlSaveFile(tree, fp, MXML_NO_CALLBACK);
fclose(fp);

The mxmlLoadString(), mxmlSaveAllocString(), and mxmlSaveString() functions load XML node trees from and save XML node trees to strings:

char buffer[8192];
char *ptr;
mxml_node_t *tree;

...
tree = mxmlLoadString(NULL, buffer, MXML_OPAQUE_CALLBACK);

...
mxmlSaveString(tree, buffer, sizeof(buffer), MXML_NO_CALLBACK);

...
ptr = mxmlSaveAllocString(tree, MXML_NO_CALLBACK);

You can find a named element/node using the mxmlFindElement() function:

mxml_node_t *node = mxmlFindElement(tree, tree, "name", "attr",
				"value", MXML_DESCEND);

The name, attr, and value arguments can be passed as NULL to act as wildcards, e.g.:

/* Find the first "a" element */
node = mxmlFindElement(tree, tree, "a", NULL, NULL, MXML_DESCEND);

/* Find the first "a" element with "href" attribute */
node = mxmlFindElement(tree, tree, "a", "href", NULL, MXML_DESCEND);

/* Find the first "a" element with "href" to a URL */
node = mxmlFindElement(tree, tree, "a", "href",
		   "http://www.minixml.org/",
		   MXML_DESCEND);

/* Find the first element with a "src" attribute*/
node = mxmlFindElement(tree, tree, NULL, "src", NULL, MXML_DESCEND);

/* Find the first element with a "src" = "foo.jpg" */
node = mxmlFindElement(tree, tree, NULL, "src", "foo.jpg",
		   MXML_DESCEND);

You can also iterate with the same function:

mxml_node_t *node;

for (node = mxmlFindElement(tree, tree, "name", NULL, NULL,
			MXML_DESCEND);
 node != NULL;
 node = mxmlFindElement(node, tree, "name", NULL, NULL,
			MXML_DESCEND))
{
  ... do something ...
}

The mxmlFindPath() function finds the (first) value node under a specific element using an XPath:

mxml_node_t *value = mxmlFindPath(tree, "path/to/*/foo/bar");

The mxmlGetInteger(), mxmlGetOpaque(), mxmlGetReal(), and mxmlGetText() functions retrieve the corresponding value from a node:

mxml_node_t *node;

int intvalue = mxmlGetInteger(node);

const char *opaquevalue = mxmlGetOpaque(node);

double realvalue = mxmlGetReal(node);

int whitespacevalue;
const char *textvalue = mxmlGetText(node, &whitespacevalue);

Finally, once you are done with the XML data, use the mxmlDelete() function to recursively free the memory that is used for a particular node or the entire tree:

mxmlDelete(tree);

Getting Help And Reporting Problems

The Mini-XML project page provides access to the current version of this software, documentation, and Github issue tracking page.

Legal Stuff

Copyright © 2003-2020 by Michael R Sweet

The Mini-XML library is licensed under the Apache License Version 2.0 with an optional exception to allow linking against GPL2/LGPL2-only software. See the files "LICENSE" and "NOTICE" for more information.

Note: The exception listed in the NOTICE file only applies when linking against GPL2/LGPL2-only software. Some Apache License purists have objected to linking Apache Licensed code against Mini-XML with these exceptions on the grounds that it makes Mini-XML somehow incompatible with the Apache License. For that reason, people wishing to retain their Apache License purity may omit the exception from their copy of Mini-XML.

Note 2: IANAL, but I am beginning to dislike them!

Issues
  • mxmlLoadFile() does not load element text content

    mxmlLoadFile() does not load element text content

    Version: 2.8 Original reporter: Jonas Bauman

    loading a file using:

    mxmlLoadFile(NULL, fp, MXML_TEXT_CALLBACK)

    will complete successfully, but any text contained between tags will not be loaded and mxmlGetText() will always return NULL. This used to work in version 2.6.

    For example, if I load the test.xml file included with the source code, then immediately save the resulting node to a new file using mxmlSaveFile(), I get the following output:

    bug 
    opened by michaelrsweet 26
  • Cross-compiling Windows DLL using MingW on Linux

    Cross-compiling Windows DLL using MingW on Linux

    Please add ability to cross-compile mxml as a shared library for MS Windows.

    Currently your library is packaged by MXE project but only for static targets. Also this will be useful for libomemo project.

    enhancement 
    opened by tehnick 20
  • detected memory leaks

    detected memory leaks

    When I build mxml with AddressSanitizer(export CFLAGS="-g -fsanitize=address" CXXFLAGS="-g -fsanitize=address" LDFLAGS="-fsanitize=address" before ./configure), there are detected memory leaks when make. Here is ASAN information:

    ==29484==ERROR: LeakSanitizer: detected memory leaks
    
    Indirect leak of 5984 byte(s) in 68 object(s) allocated from:
        #0 0x7f28b77de79a in __interceptor_calloc (/usr/lib/x86_64-linux-gnu/libasan.so.2+0x9879a)
        #1 0x4196be in mxml_new /home/fouzhe/my_fuzz/mxml/mxml-node.c:844
    
    Indirect leak of 215 byte(s) in 25 object(s) allocated from:
        #0 0x7f28b77a830f in strdup (/usr/lib/x86_64-linux-gnu/libasan.so.2+0x6230f)
        #1 0x4197fc in mxmlNewElement /home/fouzhe/my_fuzz/mxml/mxml-node.c:386
    
    Indirect leak of 112 byte(s) in 7 object(s) allocated from:
        #0 0x7f28b77de602 in malloc (/usr/lib/x86_64-linux-gnu/libasan.so.2+0x98602)
        #1 0x41422c in mxml_set_attr /home/fouzhe/my_fuzz/mxml/mxml-attr.c:322
    
    Indirect leak of 99 byte(s) in 9 object(s) allocated from:
        #0 0x7f28b77a830f in strdup (/usr/lib/x86_64-linux-gnu/libasan.so.2+0x6230f)
        #1 0x41472b in mxmlElementSetAttr /home/fouzhe/my_fuzz/mxml/mxml-attr.c:224
    
    Indirect leak of 56 byte(s) in 1 object(s) allocated from:
        #0 0x7f28b77a830f in strdup (/usr/lib/x86_64-linux-gnu/libasan.so.2+0x6230f)
        #1 0x419882 in mxmlNewOpaque /home/fouzhe/my_fuzz/mxml/mxml-node.c:455
        #2 0x62635f797469746d  (<unknown module>)
    
    Indirect leak of 54 byte(s) in 2 object(s) allocated from:
        #0 0x7f28b77a830f in strdup (/usr/lib/x86_64-linux-gnu/libasan.so.2+0x6230f)
        #1 0x419882 in mxmlNewOpaque /home/fouzhe/my_fuzz/mxml/mxml-node.c:455
        #2 0x706972637365641f  (<unknown module>)
    
    Indirect leak of 50 byte(s) in 9 object(s) allocated from:
        #0 0x7f28b77a830f in strdup (/usr/lib/x86_64-linux-gnu/libasan.so.2+0x6230f)
        #1 0x4142b2 in mxml_set_attr /home/fouzhe/my_fuzz/mxml/mxml-attr.c:337
    
    Indirect leak of 34 byte(s) in 17 object(s) allocated from:
        #0 0x7f28b77a830f in strdup (/usr/lib/x86_64-linux-gnu/libasan.so.2+0x6230f)
        #1 0x419af3 in mxmlNewText /home/fouzhe/my_fuzz/mxml/mxml-node.c:574
    
    Indirect leak of 32 byte(s) in 1 object(s) allocated from:
        #0 0x7f28b77de961 in realloc (/usr/lib/x86_64-linux-gnu/libasan.so.2+0x98961)
        #1 0x414240 in mxml_set_attr /home/fouzhe/my_fuzz/mxml/mxml-attr.c:324
    
    Indirect leak of 30 byte(s) in 6 object(s) allocated from:
        #0 0x7f28b77a830f in strdup (/usr/lib/x86_64-linux-gnu/libasan.so.2+0x6230f)
        #1 0x419af3 in mxmlNewText /home/fouzhe/my_fuzz/mxml/mxml-node.c:574
        #2 0x745f62635f6373  (<unknown module>)
    
    Indirect leak of 27 byte(s) in 1 object(s) allocated from:
        #0 0x7f28b77a830f in strdup (/usr/lib/x86_64-linux-gnu/libasan.so.2+0x6230f)
        #1 0x419882 in mxmlNewOpaque /home/fouzhe/my_fuzz/mxml/mxml-node.c:455
    
    Indirect leak of 24 byte(s) in 1 object(s) allocated from:
        #0 0x7f28b77a830f in strdup (/usr/lib/x86_64-linux-gnu/libasan.so.2+0x6230f)
        #1 0x419882 in mxmlNewOpaque /home/fouzhe/my_fuzz/mxml/mxml-node.c:455
        #2 0x756c61762065646e  (<unknown module>)
    
    Indirect leak of 23 byte(s) in 3 object(s) allocated from:
        #0 0x7f28b77a830f in strdup (/usr/lib/x86_64-linux-gnu/libasan.so.2+0x6230f)
        #1 0x419af3 in mxmlNewText /home/fouzhe/my_fuzz/mxml/mxml-node.c:574
        #2 0x726f74706971ff  (<unknown module>)
    
    Indirect leak of 17 byte(s) in 1 object(s) allocated from:
        #0 0x7f28b77a830f in strdup (/usr/lib/x86_64-linux-gnu/libasan.so.2+0x6230f)
        #1 0x419882 in mxmlNewOpaque /home/fouzhe/my_fuzz/mxml/mxml-node.c:455
        #2 0x7265666675622071  (<unknown module>)
    
    Indirect leak of 16 byte(s) in 1 object(s) allocated from:
        #0 0x7f28b77a830f in strdup (/usr/lib/x86_64-linux-gnu/libasan.so.2+0x6230f)
        #1 0x419882 in mxmlNewOpaque /home/fouzhe/my_fuzz/mxml/mxml-node.c:455
        #2 0x656d616e207973  (<unknown module>)
    
    Indirect leak of 16 byte(s) in 1 object(s) allocated from:
        #0 0x7f28b77a830f in strdup (/usr/lib/x86_64-linux-gnu/libasan.so.2+0x6230f)
        #1 0x419882 in mxmlNewOpaque /home/fouzhe/my_fuzz/mxml/mxml-node.c:455
        #2 0x726f7470697262  (<unknown module>)
    
    Indirect leak of 14 byte(s) in 1 object(s) allocated from:
        #0 0x7f28b77a830f in strdup (/usr/lib/x86_64-linux-gnu/libasan.so.2+0x6230f)
        #1 0x419af3 in mxmlNewText /home/fouzhe/my_fuzz/mxml/mxml-node.c:574
        #2 0x7400735f667561  (<unknown module>)
    
    Indirect leak of 11 byte(s) in 2 object(s) allocated from:
        #0 0x7f28b77a830f in strdup (/usr/lib/x86_64-linux-gnu/libasan.so.2+0x6230f)
        #1 0x419af3 in mxmlNewText /home/fouzhe/my_fuzz/mxml/mxml-node.c:574
        #2 0x62635f79746973  (<unknown module>)
    
    Indirect leak of 11 byte(s) in 2 object(s) allocated from:
        #0 0x7f28b77a830f in strdup (/usr/lib/x86_64-linux-gnu/libasan.so.2+0x6230f)
        #1 0x419af3 in mxmlNewText /home/fouzhe/my_fuzz/mxml/mxml-node.c:574
        #2 0x6b0a2e2e2e74726e  (<unknown module>)
    
    Indirect leak of 5 byte(s) in 1 object(s) allocated from:
        #0 0x7f28b77a830f in strdup (/usr/lib/x86_64-linux-gnu/libasan.so.2+0x6230f)
        #1 0x419af3 in mxmlNewText /home/fouzhe/my_fuzz/mxml/mxml-node.c:574
        #2 0x6e6f697469736f6f  (<unknown module>)
    
    Indirect leak of 4 byte(s) in 1 object(s) allocated from:
        #0 0x7f28b77a830f in strdup (/usr/lib/x86_64-linux-gnu/libasan.so.2+0x6230f)
        #1 0x419af3 in mxmlNewText /home/fouzhe/my_fuzz/mxml/mxml-node.c:574
        #2 0x7463757274732063  (<unknown module>)
    
    Indirect leak of 4 byte(s) in 1 object(s) allocated from:
        #0 0x7f28b77a830f in strdup (/usr/lib/x86_64-linux-gnu/libasan.so.2+0x6230f)
        #1 0x419af3 in mxmlNewText /home/fouzhe/my_fuzz/mxml/mxml-node.c:574
        #2 0x62635f797469746d  (<unknown module>)
    
    Indirect leak of 4 byte(s) in 1 object(s) allocated from:
        #0 0x7f28b77a830f in strdup (/usr/lib/x86_64-linux-gnu/libasan.so.2+0x6230f)
        #1 0x419af3 in mxmlNewText /home/fouzhe/my_fuzz/mxml/mxml-node.c:574
        #2 0xa2e2e2e74726e  (<unknown module>)
    
    SUMMARY: AddressSanitizer: 6842 byte(s) leaked in 162 allocation(s).
    
    wontfix 
    opened by fouzhe 13
  • Two stack exhaustation parsing xml files using mxml

    Two stack exhaustation parsing xml files using mxml

    Version: 2.9 Original reporter: Gustavo Grieco

    I reported these issues in oss-security. Details and reproducers are here:

    http://www.openwall.com/lists/oss-security/2016/05/07/8

    Regards, Gus.

    bug 
    opened by michaelrsweet 13
  • heap-use-after-free in Function mxmlWalkNext

    heap-use-after-free in Function mxmlWalkNext

    I used clang 6.0 and AddressSanitizer to build mxml 2.12, this file can cause heap-use-after-free in mxmlWalkNext in mxml-search.c when executing this command:

    ./mxmldoc $crash
    

    This is the ASAN information:

    ==2544==ERROR: AddressSanitizer: heap-use-after-free on address 0x608000008ec0 at pc 0x7fedf0751729 bp 0x7fff65264ee0 sp 0x7fff65264ed0
    READ of size 8 at 0x608000008ec0 thread T0
        #0 0x7fedf0751728 in mxmlWalkNext /home/fouzhe/my_fuzz/mxml/mxml-search.c:212
        #1 0x7fedf075180c in mxmlFindElement /home/fouzhe/my_fuzz/mxml/mxml-search.c:101
        #2 0x405074 in sort_node /home/fouzhe/my_fuzz/mxml/mxmldoc.c:3372
        #3 0x405b5d in scan_file /home/fouzhe/my_fuzz/mxml/mxmldoc.c:1981
        #4 0x402b1d in main /home/fouzhe/my_fuzz/mxml/mxmldoc.c:503
        #5 0x7fedeff5d82f in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x2082f)
        #6 0x402ff8 in _start (/home/fouzhe/my_fuzz/mxml/mxmldoc+0x402ff8)
    
    0x608000008ec0 is located 32 bytes inside of 88-byte region [0x608000008ea0,0x608000008ef8)
    freed by thread T0 here:
        #0 0x7fedf09f92ca in __interceptor_free (/usr/lib/x86_64-linux-gnu/libasan.so.2+0x982ca)
        #1 0x4050c1 in sort_node /home/fouzhe/my_fuzz/mxml/mxmldoc.c:3389
    
    previously allocated by thread T0 here:
        #0 0x7fedf09f979a in __interceptor_calloc (/usr/lib/x86_64-linux-gnu/libasan.so.2+0x9879a)
        #1 0x7fedf0750e50 in mxml_new /home/fouzhe/my_fuzz/mxml/mxml-node.c:844
    
    SUMMARY: AddressSanitizer: heap-use-after-free /home/fouzhe/my_fuzz/mxml/mxml-search.c:212 mxmlWalkNext
    Shadow bytes around the buggy address:
      0x0c107fff9180: fa fa fa fa 00 00 00 00 00 00 00 00 00 00 00 fa
      0x0c107fff9190: fa fa fa fa 00 00 00 00 00 00 00 00 00 00 00 fa
      0x0c107fff91a0: fa fa fa fa 00 00 00 00 00 00 00 00 00 00 00 fa
      0x0c107fff91b0: fa fa fa fa fd fd fd fd fd fd fd fd fd fd fd fa
      0x0c107fff91c0: fa fa fa fa fd fd fd fd fd fd fd fd fd fd fd fa
    =>0x0c107fff91d0: fa fa fa fa fd fd fd fd[fd]fd fd fd fd fd fd fa
      0x0c107fff91e0: fa fa fa fa fd fd fd fd fd fd fd fd fd fd fd fa
      0x0c107fff91f0: fa fa fa fa fd fd fd fd fd fd fd fd fd fd fd fa
      0x0c107fff9200: fa fa fa fa fd fd fd fd fd fd fd fd fd fd fd fa
      0x0c107fff9210: fa fa fa fa fd fd fd fd fd fd fd fd fd fd fd fa
      0x0c107fff9220: fa fa fa fa fd fd fd fd fd fd fd fd fd fd fd fa
    Shadow byte legend (one shadow byte represents 8 application bytes):
      Addressable:           00
      Partially addressable: 01 02 03 04 05 06 07
      Heap left redzone:       fa
      Heap right redzone:      fb
      Freed heap region:       fd
      Stack left redzone:      f1
      Stack mid redzone:       f2
      Stack right redzone:     f3
      Stack partial redzone:   f4
      Stack after return:      f5
      Stack use after scope:   f8
      Global redzone:          f9
      Global init order:       f6
      Poisoned by user:        f7
      Container overflow:      fc
      Array cookie:            ac
      Intra object redzone:    bb
      ASan internal:           fe
    ==2544==ABORTING
    
    duplicate 
    opened by fouzhe 12
  • Make error: unable to find utility

    Make error: unable to find utility "docsetutil"

    Hi, I'm trying to install this on a macbook pro 2015 with osx 10.11.6 following the instructions on the README.

    Configuring works fine but I get the following error on make:

    | => make install Compiling mxml-attr.c Compiling mxml-entity.c Compiling mxml-file.c Compiling mxml-get.c Compiling mxml-index.c Compiling mxml-node.c Compiling mxml-search.c Compiling mxml-set.c Compiling mxml-private.c Compiling mxml-string.c Creating libmxml.1.dylib... Compiling mxmldoc.c Compiling mmd.c Compiling zipc.c Linking mxmldoc... Creating libmxml.a... a - mxml-attr.o a - mxml-entity.o a - mxml-file.o a - mxml-get.o a - mxml-index.o a - mxml-node.o a - mxml-search.o a - mxml-set.o a - mxml-private.o a - mxml-string.o Compiling testmxml.c Linking testmxml... Testing library... Stdio file test passed! String test passed! File descriptor test passed! Linking mxmldoc-static... Generating API documentation... xcrun: error: unable to find utility "docsetutil", not a developer tool or in PATH mxmldoc: docsetutil exited with status 72 xcrun: error: unable to find utility "docsetutil", not a developer tool or in PATH make: *** [mxml.xml] Error 1

    I've tried configuring it both to /usr and /usr/local but I get the same error. Any suggestions?

    bug 
    opened by rceballos98 10
  • Add minimal cmake-based build

    Add minimal cmake-based build

    Allows support for cross-compiling both static and shared libs. Tested using MXE with: {i686-w64-mingw32,x86_64-w64-mingw32}.{static,shared}

    Closes #188

    enhancement 
    opened by tonytheodore 9
  • XML parser does not error out on bad <name=value> elements.

    XML parser does not error out on bad elements.

    Version: 2.8 Original reporter: Zvika Meiseles

    Adding the following tag to an XML file causes no failure, and the parser simply ignores it:

    <type="opaque"/>
    

    The xml was then loaded by my code, which uses MXML, and sent to a Java process that threw an exception when trying to handle it.

    Since it is not a valid XML tag, I would expect the parser to fail.

    bug 
    opened by michaelrsweet 9
  • _mxml_init / _mxml_destructor causes SEGV in main app.

    _mxml_init / _mxml_destructor causes SEGV in main app.

    Version: 2.6 Original reporter:

    We are developing an application plugin (a .so) on Linux that uses mxml. Unfortunately mxml causes the main application to SEGV. Having inspected the code thoroughly I have deduced why: Main application (Rosegarden DAW) starts thread to scan for plugins Rosegarden loads our plugin and invokes function to fetch descriptor plugin's descriptor. libmxml.so is loaded automatically with plugin.so. plugin.so loads some xml _mxml_init is invoked. Thread specific key is created with _mxml_destructor attached. plugin.so returns descriptor. RG unloads plugin.so and libxml.so RG thread ends. Thread cleanup calls _xml_destructor, which is no longer there - SEGV.

    FIX - a fini routine is needed to call pthread_key_delete to remove the thread specific key.

    bug 
    opened by michaelrsweet 8
  • Add context, preprocess callback, and whitespace callbacks

    Add context, preprocess callback, and whitespace callbacks

    Version: -feature Original reporter: Michael Sweet

    For the C++ interface for MiniXML I am working on, I need to be able to set the user_data value for a node from within the load callback. For example, when calling mxmlLoadFile it is not possible to do this. A workaround would be if a top node is specified (say by calling mxmlNewXML and setting the user_data field), but then the top level encoding from the file is repeated.

    This would be easiest to do if a user data argument could be added to the load callback. Thus, the function would be:

    cb(node,context)

    I could then use the context to set the user_data field in the nodes while I am parsing them. Could this be added?

    enhancement 
    opened by michaelrsweet 8
  • stack-buffer-overflow and heap-buffer-overflow

    stack-buffer-overflow and heap-buffer-overflow

    Hi,

    We have used Mini-xml in our project, so I test v3.2 and master branch and found something:

    Fisrt, there are some memory leaks in v3.2 and master:

    =================================================================
    ==111401==ERROR: LeakSanitizer: detected memory leaks
    
    Direct leak of 6 byte(s) in 1 object(s) allocated from:
        #0 in strdup (/opt/mnt/software/mxml32/a.out+0x46f260)
        #1 in mxmlSaveAllocString /opt/mnt/software/mxml32/mxml-file.c:227:13
        #2 in LLVMFuzzerTestOneInput /opt/mnt/software/mxml32/mxml_fuzzer.cpp:23:8
        #3 in fuzzer::Fuzzer::ExecuteCallback(unsigned char const*, unsigned long) (/opt/mnt/software/mxml32/a     .out+0x42f357)
        #4 in fuzzer::Fuzzer::MutateAndTestOne() (/opt/mnt/software/mxml32/a.out+0x439bc4)
        #5 in fuzzer::Fuzzer::Loop(std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::a     llocator<char> >, fuzzer::fuzzer_allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<     char> > > > const&) (/opt/mnt/software/mxml32/a.out+0x43b22f)
        #6 in fuzzer::FuzzerDriver(int*, char***, int (*)(unsigned char const*, unsigned long)) (/opt/mnt/soft     ware/mxml32/a.out+0x42a5ec)
        #7 in main (/opt/mnt/software/mxml32/a.out+0x41d4b2)
        #8 in __libc_start_main /build/glibc-S9d2JN/glibc-2.27/csu/../csu/libc-start.c:310
    
    SUMMARY: AddressSanitizer: 6 byte(s) leaked in 1 allocation(s).
    INFO: to ignore leaks on libFuzzer side use -detect_leaks=0.
    

    and : this is your testmxml.c:

    ...
    Creating libmxml.so.1.6...
    Creating libmxml.a...
    a - mxml-attr.o
    a - mxml-entity.o
    a - mxml-file.o
    a - mxml-get.o
    a - mxml-index.o
    a - mxml-node.o
    a - mxml-search.o
    a - mxml-set.o
    a - mxml-private.o
    a - mxml-string.o
    Compiling testmxml.c
    Linking testmxml...
    Testing library...
    
    =================================================================
    ==113129==ERROR: LeakSanitizer: detected memory leaks
    
    Direct leak of 88 byte(s) in 1 object(s) allocated from:
        #0 in calloc (/opt/mnt/software/mxml32/testmxml+0x4da178)
        #1 in mxml_new /opt/mnt/software/mxml32/mxml-node.c:841:15
        #2 in mxmlNewElement /opt/mnt/software/mxml32/mxml-node.c:382:15
        #3 in mxml_load_data /opt/mnt/software/mxml32/mxml-file.c:1783:14
        #4 in mxmlSAXLoadFile /opt/mnt/software/mxml32/mxml-file.c:467:11
        #5 in main /opt/mnt/software/mxml32/testmxml.c:676:5
        #6 in __libc_start_main /build/glibc-S9d2JN/glibc-2.27/csu/../csu/libc-start.c:310
    
    Indirect leak of 37 byte(s) in 1 object(s) allocated from:
        #0 in __interceptor_strdup (/opt/mnt/software/mxml32/testmxml+0x436770)
        #1 in mxmlNewElement /opt/mnt/software/mxml32/mxml-node.c:383:32
        #2 in mxml_load_data /opt/mnt/software/mxml32/mxml-file.c:1783:14
        #3 in mxmlSAXLoadFile /opt/mnt/software/mxml32/mxml-file.c:467:11
        #4 in main /opt/mnt/software/mxml32/testmxml.c:676:5
        #5 in __libc_start_main /build/glibc-S9d2JN/glibc-2.27/csu/../csu/libc-start.c:310
    
    SUMMARY: AddressSanitizer: 125 byte(s) leaked in 2 allocation(s).
    Makefile:271: recipe for target 'testmxml' failed
    make: *** [testmxml] Error 1
    

    also ,we I input an unformed string to mxmlLoadString, there will be a stack-buffer-overflow and heap-buffer-overflow. I think if you add a longth check in mxml_string_getc when every pointer change("like (*s)++"), will be better? Of course Maybe I have use it in a wrong . you can check it here: this is my testcase:

    #include <string>
    #include <vector>
    #include <assert.h>
    #include "mxml.h"
    
    extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
    
    std::string c(reinterpret_cast<const char *>(data), size);
    
    char *ptr;
    
    mxml_node_t *tree;
    
    tree = mxmlLoadString(NULL, c.c_str(), MXML_NO_CALLBACK);
    
    if(tree){
            ptr = mxmlSaveAllocString(tree, MXML_NO_CALLBACK);
            if(!ptr) assert(false);
            mxmlDelete(tree);
    }
    
    return 0;
    }
    
    

    you can compile your lib with CFLAGS =+ "-g -O0 -fno-omit-frame-pointer -gline-tables-only -fsanitize=address -fsanitize-address-use-after-scope -fsanitize=fuzzer-no-link" and LDFLAGS =+"-fsanitize=fuzzer-no-link -fsanitize=address" and clang++ -g -O1 -fno-omit-frame-pointer -gline-tables-only -fsanitize=address -fsanitize-address-use-after-scope -fsanitize=fuzzer-no-link mxml_fuzzer.cpp -I ./ -fsanitize=fuzzer ./libmxml.a

    run and these are the backtrace:

    =================================================================
    ==2858==ERROR: AddressSanitizer: stack-buffer-overflow on address 0x7ffed9190220 at pc 0x00000055a6f2 bp 0x7ffed918edc0 sp 0x7ffed918edb8
    READ of size 1 at 0x7ffed9190220 thread T0
        #0 in mxml_string_getc /opt/mnt/software/mxml32/mxml-file.c:2611:16
        #1 in mxml_parse_element /opt/mnt/software/mxml32/mxml-file.c:2141:16
        #2 in mxml_load_data /opt/mnt/software/mxml32/mxml-file.c:1977:14
        #3 in mxmlLoadString /opt/mnt/software/mxml32/mxml-file.c:180:11
        #4 in LLVMFuzzerTestOneInput /opt/mnt/software/mxml32/mxml_fuzzer.cpp:12:8
        #5 in fuzzer::Fuzzer::ExecuteCallback(unsigned char const*, unsigned long) (/opt/mnt/software/mxml32/a.out+0x42f357)
        #6 in fuzzer::RunOneTest(fuzzer::Fuzzer*, char const*, unsigned long) (/opt/mnt/software/mxml32/a.out+0x41f7ea)
        #7 in fuzzer::FuzzerDriver(int*, char***, int (*)(unsigned char const*, unsigned long)) (/opt/mnt/software/mxml32/a.out+0x42a7b0)
        #8 in main (/opt/mnt/software/mxml32/a.out+0x41d4b2)
        #9 in __libc_start_main /build/glibc-S9d2JN/glibc-2.27/csu/../csu/libc-start.c:310
        #10 in _start (/opt/mnt/software/mxml32/a.out+0x41d529)
    
    =================================================================
    ==6265==ERROR: AddressSanitizer: heap-buffer-overflow on address 0x612000000a73 at pc 0x000000558e2d bp 0x7ffe13e2caa0 sp 0x7ffe13e2ca98
    READ of size 1 at 0x612000000a73 thread T0
        #0 in mxml_string_getc /opt/mnt/software/mxml32/mxml-file.c:2422:13
        #1 in mxml_load_data /opt/mnt/software/mxml32/mxml-file.c:1558:20
        #2 in mxmlLoadString /opt/mnt/software/mxml32/mxml-file.c:180:11
        #3 in LLVMFuzzerTestOneInput /opt/mnt/software/mxml32/mxml_fuzzer.cpp:12:8
        #4 in fuzzer::Fuzzer::ExecuteCallback(unsigned char const*, unsigned long) (/opt/mnt/software/mxml32/a.out+0x42f357)
        #5 in fuzzer::RunOneTest(fuzzer::Fuzzer*, char const*, unsigned long) (/opt/mnt/software/mxml32/a.out+0x41f7ea)
        #6 in fuzzer::FuzzerDriver(int*, char***, int (*)(unsigned char const*, unsigned long)) (/opt/mnt/software/mxml32/a.out+0x42a7b0)
        #7 in main (/opt/mnt/software/mxml32/a.out+0x41d4b2)
        #8 in __libc_start_main /build/glibc-S9d2JN/glibc-2.27/csu/../csu/libc-start.c:310
        #9 in _start (/opt/mnt/software/mxml32/a.out+0x41d529)
    
    
    investigating 
    opened by liweiii 7
  • configure error

    configure error

    hi there,

    how to fix the configure error?

    checking build system type... x86_64-unknown-linux-gnu checking host system type... x86_64-unknown-linux-gnu checking for gcc... gcc checking whether the C compiler works... yes checking for C compiler default output file name... a.out checking for suffix of executables... checking whether we are cross compiling... no checking for suffix of object files... o checking whether the compiler supports GNU C... yes checking whether gcc accepts -g... yes checking for gcc option to enable C11 features... none needed checking for g++... g++ checking whether the compiler supports GNU C++... yes checking whether g++ accepts -g... yes checking for g++ option to enable C++11 features... none needed checking for a BSD-compatible install... /bin/install -c checking for ranlib... ranlib checking for ar... ar checking for cp... /bin/cp checking for ldconfig... /sbin/ldconfig checking for ln... /bin/ln checking for mkdir... /bin/mkdir checking for rm... /bin/rm checking for inline... inline checking for strdup... yes checking for strlcat... no checking for strlcpy... no checking for snprintf... yes checking for vasprintf... yes checking for vsnprintf... yes checking for unsigned long long int... yes checking for long long int... yes checking for stdio.h... yes checking for stdlib.h... yes checking for string.h... yes checking for inttypes.h... yes checking for stdint.h... yes checking for strings.h... yes checking for sys/stat.h... yes checking for sys/types.h... yes checking for unistd.h... yes checking for pthread.h... yes checking for pthread_create using -lpthreads... no checking for pthread_create using -lpthread... yes checking for shared library support... yes checking whether compiler supports -Wno-char-subscripts... yes checking whether compiler supports -Wno-format-truncation... yes checking whether compiler supports -Wno-format-y2k... yes checking whether compiler supports -Wno-switch... yes checking whether compiler supports -Wno-unused-result... yes configure: creating ./config.status ./config.status: line 527: 0a1,76: command not found ./config.status: line 528: syntax error near unexpected token newline' ./config.status: line 528:> # This file is a shell script that caches the results of configure'

    unable-to-reproduce 
    opened by robinqhuang 3
  • Simplified file loading option?

    Simplified file loading option?

    Hi,

    Could we add another loading option that takes a file path string and returns the XML tree?

    Something like:

    mxml_node_t *tree;
    
    tree = mxmlLoadFilePath(NULL, "/path/to/filename.xml", MXML_OPAQUE_CALLBACK);
    

    I know it's a trivial wrapper on mxmlLoadFile() but I think it could be useful for new users.

    enhancement priority-low 
    opened by bucanero 0
  • Support CMake builds of library itself and generate finders

    Support CMake builds of library itself and generate finders

    Thank you so much for your wonderful library! I would like to suggest adding CMake build support that was tested for few weeks in my project and seems to be proper designed according to modern CMake guidances.

    Everything you need to have inside your own CMakeLists.txt is

    find_package(mxml)
    target_link_libraries(${PROJECT_NAME} PRIVATE MSweet::mxml)
    
    enhancement platform issue priority-low 
    opened by widgetii 3
  • feature request: mxml as single header + source library

    feature request: mxml as single header + source library

    Would you consider making an amalgamated version of mxml which would allow to add 2 files to a project (mxml.h + mxml.c) and be built as part of the project?

    enhancement priority-low 
    opened by aganm 2
  • Add file/line data in the tree

    Add file/line data in the tree

    I would like a way to retrieve the source file and line where data in a tree originates from (opaque values and attributes). I am not aware of a way to do that with mxml right now.

    enhancement priority-low 
    opened by aganm 1
Releases(v3.3.1)
  • v3.3(Nov 6, 2021)

    Mini-XML 3.3 is a bug fix release. Changes include:

    • Cleaned up usage of free throughout the library (Issue #276)
    • Added more error handling to the library (Issue #277)
    • Fixed potential memory leak in mxmlLoad* functions (Issue #278, Issue #279)
    • Fixed mxmlSaveString with a buffer size of 0 (Issue #284)
    • Fixed MXML_MINOR_VERSION value in "mxml.h" (Issue #285)
    • Fixed POSIX threading support for MingW (Issue #287)
    • Fixed some minor memory leaks found by Coverity.

    Enjoy!

    Source code(tar.gz)
    Source code(zip)
    mxml-3.3.tar.gz(1.47 MB)
    mxml-3.3.tar.gz.sig(566 bytes)
    mxml-3.3.zip(1.49 MB)
    mxml-3.3.zip.sig(566 bytes)
  • v3.2(Oct 9, 2020)

    Mini-XML 3.2 adds support for the Haiku operating system and fixes bugs. Changes include:

    • Added support for shared libraries on Haiku (Issue #262)
    • Fixed handling of unquoted attribute values that start with a Unicode character (Issue #264)
    • Fixed handling of elements that start with a Unicode character (Issue #267)
    • Fixed some minor issues identified by the LGTM security scanner.

    Enjoy!

    Source code(tar.gz)
    Source code(zip)
    mxml-3.2.tar.gz(8.84 MB)
    mxml-3.2.tar.gz.sig(566 bytes)
  • v3.1(Aug 29, 2019)

    Mini-XML 3.1 fixes some installation issues and adds better error reporting. Changes include:

    • The mxmlLoad* functions now print an error when the XML does not start with < and no parent node is supplied (Issue #256, Issue #259)
    • Fixed an issue with "make install" trying to install old files (Issue #257)
    • Fixed some DSO installation issues on Linux.

    Enjoy!

    Source code(tar.gz)
    Source code(zip)
    mxml-3.1.tar.gz(8.83 MB)
    mxml-3.1.tar.gz.sig(566 bytes)
  • v3.0(Mar 2, 2019)

    Mini-XML 3.0 is a major release that changes the license to Apache 2.0 with exceptions for linking to GPL2-only code, hides the definition of the internal mxml_node_t structure, removes the "mxmldoc" utility (which is now maintained in the separate "codedoc" project), and fixes several bugs. Changes include:

    • Changed the license to Apache 2.0 with exceptions (Issue #239)
    • All of the internal node structures are now moved out of the public header (Issue #240)
    • Fixed a potential buffer overflow when writing floating point data (Issue #233)
    • Moved mxmldoc to a new codedoc project whose focus is on generating code documentation (Issue #235, Issue #236, Issue #237)
    • Error messages now include the line number of the error (Issue #230)
    • The mxmlSetCDATA, mxmlSetElement, mxmlSetOpaque, mxmlSetOpaquef, mxmlSetText, and mxmlSetTextf functions caused a use-after-free bug if the value came from the same node (Issue #241)
    • The mxmlSetOpaquef and mxmlSetTextf functions did not work (Issue #244)
    • The _mxml_strdupf function did not work on Windows (Issue #245)

    Enjoy!

    Source code(tar.gz)
    Source code(zip)
    mxml-3.0.tar.gz(8.83 MB)
    mxml-3.0.tar.gz.sig(566 bytes)
  • v2.12(Oct 2, 2018)

    Mini-XML 2.12 fixes several bugs, updates the build system on macOS and Windows, and updates the markdown and EPUB support.

    Changes include:

    • Added yet more documentation about using MXML_OPAQUE_CALLBACK when you want to get full strings for inline text instead of separated words (Issue #190)
    • No longer build documentation sets on macOS since Xcode no longer supports them (Issue #198)
    • Updated the va_copy macro for use with BCC (Issue #211)
    • The mxmlNewCDATA and mxmlSetCDATA functions incorrectly added the XML trailer "]]" to the string (Issue #216)
    • Cross-compiling failed on install (Issue #218)
    • Fixed a crash bug in the mxmlWrite functions (Issue #228)
    • The mxmlWrite functions no longer write the siblings of the passed node (Issue #228)
    • Updated the markdown and ZIP container libraries used for mxmldoc.

    Enjoy!

    (Source archive updated Jan 17, 2019 to include mxml-2.12/ subdirectory prefix, sorry folks!)

    Source code(tar.gz)
    Source code(zip)
    mxml-2.12.tar.gz(8.69 MB)
    mxml-2.12.tar.gz.sig(566 bytes)
  • v2.11(Oct 28, 2017)

    Mini-XML 2.11 fixes a number of bugs, adds support for reproducible builds, cross-compilation, and enumeration of element attributes, and adds support for generating EPUB documentation using mxmldoc. Changes include:

    • CDATA nodes now omit the trailing "]]" for convenience (Issue #170)
    • Fixed a memory leak in mxmlDelete (Issue #183)
    • mxmlElementSetAttrf did not work with some versions of Visual Studio (Issue #184)
    • Added mxmlElementGetAttrByIndex and mxmlELementGetAttrCount functions (Issue #185)
    • The configure script now properly supports cross-compilation (Issue #188)
    • The mxmldoc utility now supports generation of EPUB files (Issue #189)
    • The mxmldoc utility now supports the SOURCE_DATE_EPOCH environment variable for reproducible builds (Issue #193)
    • The mxmldoc utility now supports Markdown (Issue #194)
    • Fixed writing of custom data values (Issue #201)
    • Added mxmlNewOpaquef and mxmlSetOpaquef functions to add and set formatted opaque string values.
    • The mxmldoc utility scanned and loaded descriptive text differently, causing the detailed descriptions ("discussion") to be lost in generated documentation.
    • The mxmldoc utility now supports @exclude [email protected] comments to exclude documentation based on the output format. The format string can be all to exclude documentation for all formats or a comma-delimited list such as @exclude man,[email protected].

    Enjoy!

    Source code(tar.gz)
    Source code(zip)
    mxml-2.11.tar.gz(8.73 MB)
  • release-2.10(Feb 27, 2017)

    Mini-XML 2.10 fixes some stack overflow, XML, and API issues. Changes include:

    • The version number in mxml.h was wrong (Bug #532)
    • The mxml.spec file was out of date (Bug #521)
    • Mini-XML no longer allows malformed element names (Bug #509)
    • mxmlLoad* and mxmlSAXLoad* did not properly create text nodes when MXML_TEXT_CALLBACK was specified (Bug #531)
    • mxmlDelete used a recursive algorithm which could require large amounts of stack space depending on the file (Bug #549, CVE-2016-4570)
    • mxmlWrite* used a recursive algorithm which could require large amounts of stack space depending on the file (Bug #549, CVE-2016-4571)

    Enjoy!

    Source code(tar.gz)
    Source code(zip)
    mxml-2.10.tar.gz(259.17 KB)
  • release-2.9(Feb 27, 2017)

  • release-2.8(Feb 27, 2017)

    Mini-XML 2.8 fixes some minor platform and XML issues. Changes include:

    • Now call docsetutil using xcrun on OS X (Bug #458)
    • mxmldoc did not escape special HTML characters inside @code [email protected] comments.
    • Fixed a memory leak in mxmlElementDeleteAttr (Bug #452)
    • Added MXML_MAJOR/MINOR_VERSION definitions to mxml.h (Bug #461)
    • Fixed a bug reading UTF-16 characters from a file (Bug #454)

    Enjoy!

    Source code(tar.gz)
    Source code(zip)
    mxml-2.8.tar.gz(257.85 KB)
Owner
Michael R Sweet
CTO of Lakeside Robotics, I am the creator of CUPS, HTMLDOC, and many other open source projects, author of many standards, and helped create AirPrint.
Michael R Sweet
Expat - a C library for parsing XML

Fast streaming XML parser written in C

Expat development team 770 Aug 5, 2022
A library to serialize custom classes to and from XML by adding a very minimal amount of code to a class.

ai-xml submodule This repository is a git submodule providing a C++ framework for serializing classes to and from XML with a minimal amount of code pe

Carlo Wood 1 Feb 16, 2021
TinyXML2 is a simple, small, efficient, C++ XML parser that can be easily integrated into other programs.

TinyXML-2 TinyXML-2 is a simple, small, efficient, C++ XML parser that can be easily integrated into other programs. The master is hosted on github: h

Lee Thomason 4.2k Aug 2, 2022
pugixml is a Light-weight, simple and fast XML parser for C++ with XPath support

pugixml is a C++ XML processing library, which consists of a DOM-like interface with rich traversal/modification capabilities, an extremely fast XML parser which constructs the DOM tree from an XML file/buffer, and an XPath 1.0 implementation for complex data-driven tree queries. Full Unicode support is also available, with Unicode interface variants and conversions between different Unicode encodings (which happen automatically during parsing/saving).

Arseny Kapoulkine 3.1k Jul 30, 2022
Tiny XML library.

Mini-XML Version 3.2 Mini-XML is a small XML parsing library that you can use to read XML data files or strings in your application without requiring

Michael R Sweet 346 Jul 29, 2022
C++ reflection library with Lua binding, and JSON and XML serialisation.

Ponder Linux & OSX: - Windows: Currents status: 3.2-alpha. API is unstable as features added/changed. New: Version 3 V1 replaced Boost with C++11. V2

Bill Quith 548 Jul 29, 2022
Expat - a C library for parsing XML

Fast streaming XML parser written in C

Expat development team 770 Aug 5, 2022
The libxo library allows an application to generate text, XML, JSON, and HTML output using a common set of function calls. The application decides at run time which output style should be produced.

libxo libxo - A Library for Generating Text, XML, JSON, and HTML Output The libxo library allows an application to generate text, XML, JSON, and HTML

Juniper Networks 242 Jul 19, 2022
A library to serialize custom classes to and from XML by adding a very minimal amount of code to a class.

ai-xml submodule This repository is a git submodule providing a C++ framework for serializing classes to and from XML with a minimal amount of code pe

Carlo Wood 1 Feb 16, 2021
A library to handle Apple Property List format in binary or XML

libplist A small portable C library to handle Apple Property List files in binary or XML format. Features The project provides an interface to read an

libimobiledevice 408 Jul 24, 2022
A small C library for building user interfaces with C, XML and CSS

LCUI A small C library for building user interfaces with C, XML and CSS. Table of contents Table of contents Introduction Features Screenshots Related

Liu 3.8k Aug 7, 2022
nanoc is a tiny subset of C and a tiny compiler that targets 32-bit x86 machines.

nanoc is a tiny subset of C and a tiny compiler that targets 32-bit x86 machines. Tiny? The only types are: int (32-bit signed integer) char (8-

Ajay Tatachar 16 Feb 13, 2022
GPU Accelerated C++ User Interface, with WYSIWYG developing tools, XML supports, built-in data binding and MVVM features.

GacUI GPU Accelerated C++ User Interface, with WYSIWYG developing tools, XML supports, built-in data binding and MVVM features. Read the LICENSE first

Vczh Libraries 2.1k Jul 29, 2022
TinyXML2 is a simple, small, efficient, C++ XML parser that can be easily integrated into other programs.

TinyXML-2 TinyXML-2 is a simple, small, efficient, C++ XML parser that can be easily integrated into other programs. The master is hosted on github: h

Lee Thomason 4.2k Aug 2, 2022
pugixml is a Light-weight, simple and fast XML parser for C++ with XPath support

pugixml is a C++ XML processing library, which consists of a DOM-like interface with rich traversal/modification capabilities, an extremely fast XML parser which constructs the DOM tree from an XML file/buffer, and an XPath 1.0 implementation for complex data-driven tree queries. Full Unicode support is also available, with Unicode interface variants and conversions between different Unicode encodings (which happen automatically during parsing/saving).

Arseny Kapoulkine 3.1k Jul 30, 2022
convert json/xml/bson to c++ struct

xpack 用于在C++结构体和json/xml之间互相转换, bson在xbson中支持。 只需要头文件, 无需编译库文件。 具体可以参考example的例子 基本用法 容器支持 FLAG 别名 位域 继承 枚举 自定义编解码 char数组 第三方类和结构体 格式化缩进 XML数组 Qt支持 重要

null 396 Jul 29, 2022
A C++ binding for the OpenGL API, generated using the gl.xml specification.

glbinding is a cross-platform C++ binding for the OpenGL API. glbinding leverages C++11 features like enum classes, lambdas, and variadic templates, i

CG Internals 734 Aug 3, 2022
XML toolkit from the GNOME project

XML toolkit from the GNOME project

GNOME Github Mirror 391 Jul 25, 2022
Header-only, event based, tiny and easy to use libuv wrapper in modern C++ - now available as also shared/static library!

Do you have a question that doesn't require you to open an issue? Join the gitter channel. If you use uvw and you want to say thanks or support the pr

Michele Caini 1.5k Jul 30, 2022
Tiny ISO-compliant C++ EXIF and XMP parsing library for JPEG.

TinyEXIF: Tiny ISO-compliant C++ EXIF and XMP parsing library for JPEG Introduction TinyEXIF is a tiny, lightweight C++ library for parsing the metada

cDc 78 Jul 31, 2022
A tiny JSON library for C++11.

json11 json11 is a tiny JSON library for C++11, providing JSON parsing and serialization. The core object provided by the library is json11::Json. A J

Dropbox 2.4k Aug 6, 2022
Minimal Linux Live (MLL) is a tiny educational Linux distribution, which is designed to be built from scratch by using a collection of automated shell scripts. Minimal Linux Live offers a core environment with just the Linux kernel, GNU C library, and Busybox userland utilities.

Minimal Linux Live (MLL) is a tiny educational Linux distribution, which is designed to be built from scratch by using a collection of automated shell scripts. Minimal Linux Live offers a core environment with just the Linux kernel, GNU C library, and Busybox userland utilities.

John Davidson 1.3k Aug 2, 2022
QtLottie is a tiny C++ library that can render Adobe® After Effects™ animations exported as JSON with Bodymovin.

QtLottie QtLottie is a tiny C++ library that can render Adobe® After Effects™ animations exported as JSON with Bodymovin. Features Support many After

Yuhang Zhao 28 Jun 23, 2022
C++ trainable detection library based on libtorch (or pytorch c++). Yolov4 tiny provided now.

C++ Library with Neural Networks for Object Detection Based on LibTorch. ?? Libtorch Tutorials ?? Visit Libtorch Tutorials Project if you want to know

null 47 Jul 12, 2022
Header-only, event based, tiny and easy to use libuv wrapper in modern C++ - now available as also shared/static library!

Do you have a question that doesn't require you to open an issue? Join the gitter channel. If you use uvw and you want to say thanks or support the pr

Michele Caini 1.5k Jul 30, 2022
MMCTX (Memory Management ConTeXualizer), is a tiny (< 300 lines), single header C99 library that allows for easier memory management by implementing contexts that remember allocations for you and provide freeall()-like functionality.

MMCTX (Memory Management ConTeXualizer), is a tiny (< 300 lines), single header C99 library that allows for easier memory management by implementing contexts that remember allocations for you and provide freeall()-like functionality.

A.P. Jo. 4 Oct 2, 2021
dos-like is a programming library/framework, kind of like a tiny game engin

dos-like is a programming library/framework, kind of like a tiny game engine, for writing games and programs with a similar feel to MS-DOS productions from the early 90s. But rather than writing code that would run on a real DOS machine, dos-like is about making programs which runs on modern platforms like Windows, Mac and Linux, but which attempts to recreate the look, feel, and sound of old DOS programs.

Mattias Gustavsson 774 Aug 3, 2022
A tiny cross-platform webview library for C/C++/Golang to build modern cross-platform GUIs.

webview for golang and c/c++ A tiny cross-platform webview library for C/C++/Golang to build modern cross-platform GUIs. The goal of the project is to

polevpn 14 Jul 5, 2022