Added start of ogl_editor and tundra files to build everything
This commit is contained in:
parent
bdca635226
commit
921e9c85df
1215
ogl_editor/data/macosx/appnib.xib
Normal file
1215
ogl_editor/data/macosx/appnib.xib
Normal file
File diff suppressed because it is too large
Load Diff
BIN
ogl_editor/data/macosx/icon.icns
Normal file
BIN
ogl_editor/data/macosx/icon.icns
Normal file
Binary file not shown.
32
ogl_editor/data/macosx/info.plist
Normal file
32
ogl_editor/data/macosx/info.plist
Normal file
@ -0,0 +1,32 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>CFBundleDevelopmentRegion</key>
|
||||
<string>English</string>
|
||||
<key>CFBundleExecutable</key>
|
||||
<string>editor</string>
|
||||
<key>CFBundleIconFile</key>
|
||||
<string>icon</string>
|
||||
<key>CFBundleIdentifier</key>
|
||||
<string>com.yourcompany.someid</string>
|
||||
<key>CFBundleInfoDictionaryVersion</key>
|
||||
<string>6.0</string>
|
||||
<key>CFBundleName</key>
|
||||
<string>My Application</string>
|
||||
<key>CFBundlePackageType</key>
|
||||
<string>APPL</string>
|
||||
<key>CFBundleShortVersionString</key>
|
||||
<string>1.0</string>
|
||||
<key>CFBundleSignature</key>
|
||||
<string>????</string>
|
||||
<key>CFBundleVersion</key>
|
||||
<string>1</string>
|
||||
<key>LSMinimumSystemVersion</key>
|
||||
<string>10.6.4</string>
|
||||
<key>NSMainNibFile</key>
|
||||
<string>appnib</string>
|
||||
<key>NSPrincipalClass</key>
|
||||
<string>NSApplication</string>
|
||||
</dict>
|
||||
</plist>
|
||||
103
ogl_editor/src/Core/Types.h
Normal file
103
ogl_editor/src/Core/Types.h
Normal file
@ -0,0 +1,103 @@
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <stddef.h>
|
||||
|
||||
typedef unsigned int uint;
|
||||
|
||||
#if defined(ROCKETGUI_WIN32)
|
||||
|
||||
#include <xmmintrin.h> // __m128
|
||||
|
||||
#if defined(__GNUC__)
|
||||
#include <stdint.h>
|
||||
#else
|
||||
|
||||
typedef unsigned char uint8_t;
|
||||
typedef signed char int8_t;
|
||||
|
||||
typedef unsigned short uint16_t;
|
||||
typedef signed short int16_t;
|
||||
|
||||
typedef unsigned int uint32_t;
|
||||
typedef signed int int32_t;
|
||||
|
||||
typedef unsigned __int64 uint64_t;
|
||||
typedef signed __int64 int64_t;
|
||||
|
||||
typedef __m128 uint128_t;
|
||||
typedef __m128 int128_t;
|
||||
|
||||
typedef unsigned char bool;
|
||||
|
||||
#ifndef true
|
||||
#define true 1
|
||||
#endif
|
||||
|
||||
#ifndef false
|
||||
#define false 0
|
||||
#endif
|
||||
|
||||
#pragma warning(disable: 4100 4127 4201)
|
||||
#endif
|
||||
|
||||
#define ROCKETGUI_LIKELY(exp) exp
|
||||
#define ROCKETGUI_UNLIKELY(exp) exp
|
||||
#define ROCKETGUI_INLINE __forceinline
|
||||
#define ROCKETGUI_RESTRICT __restrict
|
||||
#define ROCKETGUI_ALIGN(x) __declspec(align(x))
|
||||
#define ROCKETGUI_UNCACHEDAC_PTR(x) x
|
||||
#define ROCKETGUI_UNCACHED_PTR(x) x
|
||||
#define ROCKETGUI_CACHED_PTR(x) x
|
||||
#define ROCKETGUI_ALIGNOF(t) __alignof(t)
|
||||
#define ROCKETGUI_BREAK __debugbreak()
|
||||
|
||||
#if defined(_WIN64)
|
||||
#define ROCKETGUI_X64
|
||||
#endif
|
||||
|
||||
#elif defined(ROCKETGUI_UNIX) || defined(ROCKETGUI_MACOSX)
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
#if defined(__SSE__)
|
||||
#include <xmmintrin.h>
|
||||
|
||||
typedef __m128 uint128_t;
|
||||
typedef __m128 int128_t;
|
||||
#else
|
||||
#error No SSE support detected
|
||||
#endif
|
||||
|
||||
#define ROCKETGUI_LIKELY(exp) __builtin_expect(exp, 1)
|
||||
#define ROCKETGUI_UNLIKELY(exp) __builtin_expect(exp, 0)
|
||||
#define ROCKETGUI_INLINE inline
|
||||
#define ROCKETGUI_RESTRICT __restrict
|
||||
#define ROCKETGUI_ALIGN(x) __attribute__((aligned(x)))
|
||||
#define ROCKETGUI_UNCACHEDAC_PTR(x) x
|
||||
#define ROCKETGUI_UNCACHED_PTR(x) x
|
||||
#define ROCKETGUI_CACHED_PTR(x) x
|
||||
#define ROCKETGUI_ALIGNOF(t) __alignof__(t)
|
||||
#define ROCKETGUI_BREAK ((*(volatile uint32_t *)(0)) = 0x666)
|
||||
|
||||
#include <stdbool.h>
|
||||
|
||||
#ifndef true
|
||||
#define true 1
|
||||
#endif
|
||||
|
||||
#ifndef false
|
||||
#define false 0
|
||||
#endif
|
||||
|
||||
#if defined(__LP64__)
|
||||
#define ROCKETGUI_X64
|
||||
#endif
|
||||
|
||||
#else
|
||||
#error Platform not supported
|
||||
#endif
|
||||
|
||||
#define sizeof_array(array) (int)(sizeof(array) / sizeof(array[0]))
|
||||
|
||||
54
ogl_editor/src/Editor.c
Normal file
54
ogl_editor/src/Editor.c
Normal file
@ -0,0 +1,54 @@
|
||||
#include "RocketGui.h"
|
||||
#include <string.h>
|
||||
|
||||
typedef struct RETrack
|
||||
{
|
||||
char* name;
|
||||
} RETrack;
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
typedef struct Editor
|
||||
{
|
||||
RETrack tracks[64]; // temporary max level
|
||||
int windowWidth;
|
||||
int windowHeight;
|
||||
int trackCount;
|
||||
int currentRow;
|
||||
} Editor;
|
||||
|
||||
static Editor s_editor;
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
void Editor_init()
|
||||
{
|
||||
memset(&s_editor, 0, sizeof(Editor));
|
||||
|
||||
s_editor.tracks[0].name = strdup("DemoTrack");
|
||||
s_editor.tracks[1].name = strdup("CameraTestZ");
|
||||
s_editor.tracks[2].name = strdup("TestName 3");
|
||||
s_editor.tracks[3].name = strdup("TestName 4");
|
||||
s_editor.trackCount = 4;
|
||||
|
||||
s_editor.windowWidth = 800;
|
||||
s_editor.windowHeight = 600;
|
||||
|
||||
RocketGui_init();
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
void Editor_guiUpdate()
|
||||
{
|
||||
RocketGui_begin();
|
||||
|
||||
RocketGui_beginHorizontalStackPanelXY(2, 2);
|
||||
|
||||
RocketGui_textLabel("Test");
|
||||
RocketGui_textLabel("Test2");
|
||||
RocketGui_textLabel("Test");
|
||||
|
||||
RocketGui_end();
|
||||
}
|
||||
|
||||
14
ogl_editor/src/External/mxml/ANNOUNCEMENT
vendored
Normal file
14
ogl_editor/src/External/mxml/ANNOUNCEMENT
vendored
Normal file
@ -0,0 +1,14 @@
|
||||
Mini-XML 2.7 is now available for download from:
|
||||
|
||||
http://www.minixml.org/software.php
|
||||
|
||||
Mini-XML 2.7 fixes some minor platform and XML issues. Changes include:
|
||||
|
||||
- Updated the source headers to reference the Mini-XML license and its
|
||||
exceptions to the LGPL2 (STR #108)
|
||||
- The shared library did not include a destructor for the thread-
|
||||
specific data key on UNIX-based operating systems (STR #103)
|
||||
- mxmlLoad* did not error out on XML with multiple root nodes (STR #101)
|
||||
- Fixed an issue with the _mxml_vstrdupf function (STR #107)
|
||||
- mxmlSave* no longer write all siblings of the passed node, just that
|
||||
node and its children (STR #109)
|
||||
345
ogl_editor/src/External/mxml/CHANGES
vendored
Normal file
345
ogl_editor/src/External/mxml/CHANGES
vendored
Normal file
@ -0,0 +1,345 @@
|
||||
CHANGES - 2011-12-20
|
||||
--------------------
|
||||
|
||||
CHANGES IN Mini-XML 2.7
|
||||
|
||||
- Added 64-bit configurations to the VC++ project files (STR #129)
|
||||
- Fixed conformance of mxmldoc's HTML and CSS output.
|
||||
- Added data accessor ("get") functions and made the mxml_node_t and
|
||||
mxml_index_t structures private but still available in the Mini-XML
|
||||
header to preserve source compatibility (STR #118)
|
||||
- Updated the source headers to reference the Mini-XML license and its
|
||||
exceptions to the LGPL2 (STR #108)
|
||||
- Fixed a memory leak when loading a badly-formed XML file (STR #121)
|
||||
- Added a new mxmlFindPath() function to find the value node of a
|
||||
named element (STR #110)
|
||||
- Building a static version of the library did not work on Windows
|
||||
(STR #112)
|
||||
- The shared library did not include a destructor for the thread-
|
||||
specific data key on UNIX-based operating systems (STR #103)
|
||||
- mxmlLoad* did not error out on XML with multiple root nodes (STR #101)
|
||||
- Fixed an issue with the _mxml_vstrdupf function (STR #107)
|
||||
- mxmlSave* no longer write all siblings of the passed node, just that
|
||||
node and its children (STR #109)
|
||||
|
||||
|
||||
CHANGES IN Mini-XML 2.6
|
||||
|
||||
- Documentation fixes (STR #91, STR #92)
|
||||
- The mxmldoc program did not handle typedef comments properly (STR #72)
|
||||
- Added support for "long long" printf formats.
|
||||
- The XML parser now ignores BOMs in UTF-8 XML files (STR #89)
|
||||
- The mxmldoc program now supports generating Xcode documentation sets.
|
||||
- mxmlSave*() did not output UTF-8 correctly on some platforms.
|
||||
- mxmlNewXML() now adds encoding="utf-8" in the ?xml directive to avoid
|
||||
problems with non-conformant XML parsers that assume something other
|
||||
than UTF-8 as the default encoding.
|
||||
- Wrapping was not disabled when mxmlSetWrapMargin(0) was called, and
|
||||
"<?xml ... ?>" was always followed by a newline (STR #76)
|
||||
- The mxml.pc.in file was broken (STR #79)
|
||||
- The mxmldoc program now handles "typedef enum name {} name" correctly
|
||||
(STR #72)
|
||||
|
||||
|
||||
CHANGES IN Mini-XML 2.5
|
||||
|
||||
- The mxmldoc program now makes greater use of CSS and
|
||||
supports a --css option to embed an alternate stylesheet.
|
||||
- The mxmldoc program now supports --header and --footer
|
||||
options to insert documentation content before and
|
||||
after the generated content.
|
||||
- The mxmldoc program now supports a --framed option to
|
||||
generate framed HTML output.
|
||||
- The mxmldoc program now creates a table of contents
|
||||
including any headings in the --intro file when
|
||||
generating HTML output.
|
||||
- The man pages and man page output from mxmldoc did
|
||||
not use "\-" for dashes (STR #68)
|
||||
- The debug version of the Mini-XML DLL could not be
|
||||
built (STR #65)
|
||||
- Processing instructions and directives did not work
|
||||
when not at the top level of a document (STR #67)
|
||||
- Spaces around the "=" in attributes were not supported
|
||||
(STR #67)
|
||||
|
||||
|
||||
CHANGES IN Mini-XML 2.4
|
||||
|
||||
- Fixed shared library build problems on HP-UX and Mac OS X.
|
||||
- The mxmldoc program did not output argument descriptions
|
||||
for functions properly.
|
||||
- All global settings (custom, error, and entity callbacks
|
||||
and the wrap margin) are now managed separately for each
|
||||
thread.
|
||||
- Added mxmlElementDeleteAttr() function (STR #59)
|
||||
- mxmlElementSetAttrf() did not work (STR #57)
|
||||
- mxmlLoad*() incorrectly treated declarations as parent
|
||||
elements (STR #56)
|
||||
- mxmlLoad*() incorrectly allowed attributes without values
|
||||
(STR #47)
|
||||
- Fixed Visual C++ build problems (STR #49)
|
||||
- mxmlLoad*() did not return NULL when an element contained
|
||||
an error (STR #46)
|
||||
- Added support for the apos character entity (STR #54)
|
||||
- Fixed whitespace detection with Unicode characters (STR
|
||||
#48)
|
||||
- mxmlWalkNext() and mxmlWalkPrev() did not work correctly
|
||||
when called with a node with no children as the top node
|
||||
(STR #53)
|
||||
|
||||
|
||||
CHANGES IN Mini-XML 2.3
|
||||
|
||||
- Added two exceptions to the LGPL to support static
|
||||
linking of applications against Mini-XML
|
||||
- The mxmldoc utility can now generate man pages, too.
|
||||
- Added a mxmlNewXML() function
|
||||
- Added a mxmlElementSetAttrf() function (STR #43)
|
||||
- Added snprintf() emulation function for test program (STR
|
||||
#32)
|
||||
- Added the _CRT_SECURE_NO_DEPRECATE definition when
|
||||
building on VC++ 2005 (STR #36)
|
||||
- mxmlLoad*() did not detect missing > characters in
|
||||
elements (STR #41)
|
||||
- mxmlLoad*() did not detect missing close tags at the end
|
||||
of an XML document (STR #45)
|
||||
- Added user_data and ref_count members to mxml_node_t
|
||||
structure
|
||||
- Added mxmlReleaseNode() and mxmlRetainNode() APIs for
|
||||
reference-counted nodes
|
||||
- Added mxmlSetWrapMargin() to control the wrapping of XML
|
||||
output
|
||||
- Added conditional check for EINTR error code for
|
||||
certain Windows compilers that do not define it (STR
|
||||
#33)
|
||||
- The mxmldoc program now generates correct HTML 4.0
|
||||
output - previously it generated invalid XHTML
|
||||
- The mxmldoc program now supports "@deprecated@,
|
||||
"@private@", and "@since version@" comments
|
||||
- Fixed function and enumeration type bugs in mxmldoc.
|
||||
- Fixed the XML schema for mxmldoc
|
||||
- The mxmldoc program now supports --intro, --section,
|
||||
and --title options
|
||||
- The mxmlLoad*() functions could leak a node on an error
|
||||
(STR #27)
|
||||
- The mxml_vsnprintf() function could get in an infinite
|
||||
loop on a buffer overflow (STR #25)
|
||||
- Added new mxmlNewCDATA() and mxmlSetCDATA() functions
|
||||
to create and set CDATA nodes, which are really just
|
||||
special element nodes
|
||||
- Added new MXML_IGNORE type and MXML_IGNORE_CB callback
|
||||
to ignore non-element nodes, e.g. whitespace
|
||||
- mxmlLoad*() crashed when reporting an error in some
|
||||
invalid XML (STR #23)
|
||||
|
||||
|
||||
CHANGES IN Mini-XML 2.2.2
|
||||
|
||||
- mxmlLoad*() did not treat custom data as opaque, so
|
||||
whitespace characters would be lost.
|
||||
|
||||
|
||||
CHANGES IN Mini-XML 2.2.1
|
||||
|
||||
- mxmlLoadFd(), mxmlLoadFile(), and mxmlLoadString() now
|
||||
correctly return NULL on error (STR #21)
|
||||
- mxmlNewInteger(), mxmlNewOpaque(), mxmlNewReal(),
|
||||
mxmlNewText(), and mxmlNewTextf() incorrectly required
|
||||
a parent node (STR #22)
|
||||
- Fixed an XML output bug in mxmldoc.
|
||||
- The "make install" target now uses the install command
|
||||
to set the proper permissions on UNIX/Linux/OSX.
|
||||
- Fixed a MingW/Cygwin compilation problem (STR #18)
|
||||
|
||||
|
||||
CHANGES IN Mini-XML 2.2
|
||||
|
||||
- Added shared library support (STR #17)
|
||||
- mxmlLoad*() now returns an error when an XML stream
|
||||
contains illegal control characters (STR #10)
|
||||
- mxmlLoad*() now returns an error when an element
|
||||
contains two attributes with the same name in
|
||||
conformance with the XML spec (STR #16)
|
||||
- Added support for CDATA (STR #14, STR #15)
|
||||
- Updated comment and processing instruction handling -
|
||||
no entity support per XML specification.
|
||||
- Added checking for invalid comment termination ("--->"
|
||||
is not allowed)
|
||||
|
||||
|
||||
CHANGES IN Mini-XML 2.1
|
||||
|
||||
- Added support for custom data nodes (STR #6)
|
||||
- Now treat UTF-8 sequences which are longer than
|
||||
necessary as an error (STR #4)
|
||||
- Fixed entity number support (STR #8)
|
||||
- Fixed mxmlLoadString() bug with UTF-8 (STR #7)
|
||||
- Fixed entity lookup bug (STR #5)
|
||||
- Added mxmlLoadFd() and mxmlSaveFd() functions.
|
||||
- Fixed multi-word UTF-16 handling.
|
||||
|
||||
|
||||
CHANGES IN Mini-XML 2.0
|
||||
|
||||
- New programmers manual.
|
||||
- Added Visual C++ project files for Microsoft Windows
|
||||
users.
|
||||
- Added optimizations to mxmldoc, mxmlSaveFile(), and
|
||||
mxmlIndexNew() (STR #2)
|
||||
- mxmlEntityAddCallback() now returns an integer status
|
||||
(STR #2)
|
||||
- Added UTF-16 support (input only; all output is UTF-8)
|
||||
- Added index functions to build a searchable index of
|
||||
XML nodes.
|
||||
- Added character entity callback interface to support
|
||||
additional character entities beyond those defined in
|
||||
the XHTML specification.
|
||||
- Added support for XHTML character entities.
|
||||
- The mxmldoc utility now produces XML output which
|
||||
conforms to an updated XML schema, described in the file
|
||||
"doc/mxmldoc.xsd".
|
||||
- Changed the whitespace callback interface to return
|
||||
strings instead of a single character, allowing for
|
||||
greater control over the formatting of XML files
|
||||
written using Mini-XML. THIS CHANGE WILL REQUIRE
|
||||
CHANGES TO YOUR 1.x CODE IF YOU USE WHITESPACE
|
||||
CALLBACKS.
|
||||
- The mxmldoc utility is now capable of documenting C++
|
||||
classes, functions, and structures, and correctly
|
||||
handles C++ comments.
|
||||
- Added new modular tests for mxmldoc.
|
||||
- Updated the mxmldoc output to be more compatible with
|
||||
embedding in manuals produced with HTMLDOC.
|
||||
- The makefile incorrectly included a "/" separator
|
||||
between the destination path and install path. This
|
||||
caused problems when building and installing with
|
||||
MingW.
|
||||
|
||||
|
||||
CHANGES IN Mini-XML 1.3
|
||||
|
||||
- Fixes for mxmldoc.
|
||||
- Added support for reading standard HTML entity names.
|
||||
- mxmlLoadString/File() did not decode character
|
||||
entities in element names, attribute names, or
|
||||
attribute values.
|
||||
- mxmlLoadString/File() would crash when loading non-
|
||||
conformant XML data under an existing parent (top)
|
||||
node.
|
||||
- Fixed several bugs in the mxmldoc utility.
|
||||
- Added new error callback function to catch a variety
|
||||
of errors and log them to someplace other than stderr.
|
||||
- The mxmlElementSetAttr() function now allows for NULL
|
||||
attribute values.
|
||||
- The load and save functions now properly handle quoted
|
||||
element and attribute name strings properly, e.g. for
|
||||
!DOCTYPE declarations.
|
||||
|
||||
|
||||
CHANGES IN Mini-XML 1.2
|
||||
|
||||
- Added new "set" methods to set the value of a node.
|
||||
- Added new formatted text methods mxmlNewTextf() and
|
||||
mxmlSetTextf() to create/set a text node value using
|
||||
printf-style formats.
|
||||
- Added new standard callbacks for use with the mxmlLoad
|
||||
functions.
|
||||
- Updated the HTML documentation to include examples of
|
||||
the walk and load function output.
|
||||
- Added --with/without-ansi configure option to control
|
||||
the strdup() function check.
|
||||
- Added --with/without-snprintf configure option to
|
||||
control the snprintf() and vsnprintf() function
|
||||
checks.
|
||||
|
||||
|
||||
CHANGES IN Mini-XML 1.1.2
|
||||
|
||||
- The mxml(3) man page wasn't updated for the string
|
||||
functions.
|
||||
- mxmlSaveString() returned the wrong number of
|
||||
characters.
|
||||
- mxml_add_char() updated the buffer pointer in the
|
||||
wrong place.
|
||||
|
||||
|
||||
CHANGES IN Mini-XML 1.1.1
|
||||
|
||||
- The private mxml_add_ch() function did not update the
|
||||
start-of-buffer pointer which could cause a crash when
|
||||
using mxmlSaveString().
|
||||
- The private mxml_write_ws() function called putc()
|
||||
instead of using the proper callback which could cause
|
||||
a crash when using mxmlSaveString().
|
||||
- Added a mxmlSaveAllocString() convenience function for
|
||||
saving an XML node tree to an allocated string.
|
||||
|
||||
|
||||
CHANGES IN Mini-XML 1.1
|
||||
|
||||
- The mxmlLoadFile() function now uses dynamically
|
||||
allocated string buffers for element names, attribute
|
||||
names, and attribute values. Previously they were
|
||||
capped at 16383, 255, and 255 bytes, respectively.
|
||||
- Added a new mxmlLoadString() function for loading an
|
||||
XML node tree from a string.
|
||||
- Added a new mxmlSaveString() function for saving an
|
||||
XML node tree to a string.
|
||||
- Add emulation of strdup() if the local platform does
|
||||
not provide the function.
|
||||
|
||||
|
||||
CHANGES IN Mini-XML 1.0
|
||||
|
||||
- The mxmldoc program now handles function arguments,
|
||||
structures, unions, enumerations, classes, and
|
||||
typedefs properly.
|
||||
- Documentation provided via mxmldoc and more in-line
|
||||
comments in the code.
|
||||
- Added man pages and packaging files.
|
||||
|
||||
|
||||
CHANGES IN Mini-XML 0.93
|
||||
|
||||
- New mxmldoc example program that is also used to
|
||||
create and update code documentation using XML and
|
||||
produce HTML reference pages.
|
||||
- Added mxmlAdd() and mxmlRemove() functions to add and
|
||||
remove nodes from a tree. This provides more
|
||||
flexibility over where the nodes are inserted and
|
||||
allows nodes to be moved within the tree as needed.
|
||||
- mxmlLoadFile() now correctly handles comments.
|
||||
- mxmlLoadFile() now supports the required "gt", "quot",
|
||||
and "nbsp" character entities.
|
||||
- mxmlSaveFile() now uses newlines as whitespace
|
||||
when valid to do so.
|
||||
- mxmlFindElement() now also takes attribute name and
|
||||
attribute value string arguments to limit the search
|
||||
to specific elements with attributes and/or values.
|
||||
NULL pointers can be used as "wildcards".
|
||||
- Added uninstall target to makefile, and auto-reconfig
|
||||
if Makefile.in or configure.in are changed.
|
||||
- mxmlFindElement(), mxmlWalkNext(), and mxmlWalkPrev()
|
||||
now all provide "descend" arguments to control whether
|
||||
they descend into child nodes in the tree.
|
||||
- Fixed some whitespace issues in mxmlLoadFile().
|
||||
- Fixed Unicode output and whitespace issues in
|
||||
mxmlSaveFile().
|
||||
- mxmlSaveFile() now supports a whitespace callback to
|
||||
provide more human-readable XML output under program
|
||||
control.
|
||||
|
||||
|
||||
CHANGES IN Mini-XML 0.92
|
||||
|
||||
- mxmlSaveFile() didn't return a value on success.
|
||||
|
||||
|
||||
CHANGES IN Mini-XML 0.91
|
||||
|
||||
- mxmlWalkNext() would go into an infinite loop.
|
||||
|
||||
|
||||
CHANGES IN Mini-XML 0.9
|
||||
|
||||
- Initial public release.
|
||||
507
ogl_editor/src/External/mxml/COPYING
vendored
Normal file
507
ogl_editor/src/External/mxml/COPYING
vendored
Normal file
@ -0,0 +1,507 @@
|
||||
Mini-XML License
|
||||
September 18, 2010
|
||||
|
||||
|
||||
The Mini-XML library and included programs are provided under the
|
||||
terms of the GNU Library General Public License version 2 (LGPL2)
|
||||
with the following exceptions:
|
||||
|
||||
1. Static linking of applications to the Mini-XML library
|
||||
does not constitute a derivative work and does not require
|
||||
the author to provide source code for the application, use
|
||||
the shared Mini-XML libraries, or link their applications
|
||||
against a user-supplied version of Mini-XML.
|
||||
|
||||
If you link the application to a modified version of
|
||||
Mini-XML, then the changes to Mini-XML must be provided
|
||||
under the terms of the LGPL2 in sections 1, 2, and 4.
|
||||
|
||||
2. You do not have to provide a copy of the Mini-XML license
|
||||
with programs that are linked to the Mini-XML library, nor
|
||||
do you have to identify the Mini-XML license in your
|
||||
program or documentation as required by section 6 of the
|
||||
LGPL2.
|
||||
|
||||
|
||||
GNU LIBRARY GENERAL PUBLIC LICENSE
|
||||
Version 2, June 1991
|
||||
|
||||
Copyright (C) 1991 Free Software Foundation, Inc.
|
||||
59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
of this license document, but changing it is not allowed.
|
||||
|
||||
[This is the first released version of the library GPL. It is
|
||||
numbered 2 because it goes with version 2 of the ordinary GPL.]
|
||||
|
||||
Preamble
|
||||
|
||||
The licenses for most software are designed to take away your
|
||||
freedom to share and change it. By contrast, the GNU General Public
|
||||
Licenses are intended to guarantee your freedom to share and change
|
||||
free software--to make sure the software is free for all its users.
|
||||
|
||||
This license, the Library General Public License, applies to some
|
||||
specially designated Free Software Foundation software, and to any
|
||||
other libraries whose authors decide to use it. You can use it for
|
||||
your libraries, too.
|
||||
|
||||
When we speak of free software, we are referring to freedom, not
|
||||
price. Our General Public Licenses are designed to make sure that you
|
||||
have the freedom to distribute copies of free software (and charge for
|
||||
this service if you wish), that you receive source code or can get it
|
||||
if you want it, that you can change the software or use pieces of it
|
||||
in new free programs; and that you know you can do these things.
|
||||
|
||||
To protect your rights, we need to make restrictions that forbid
|
||||
anyone to deny you these rights or to ask you to surrender the rights.
|
||||
These restrictions translate to certain responsibilities for you if
|
||||
you distribute copies of the library, or if you modify it.
|
||||
|
||||
For example, if you distribute copies of the library, whether gratis
|
||||
or for a fee, you must give the recipients all the rights that we gave
|
||||
you. You must make sure that they, too, receive or can get the source
|
||||
code. If you link a program with the library, you must provide
|
||||
complete object files to the recipients so that they can relink them
|
||||
with the library, after making changes to the library and recompiling
|
||||
it. And you must show them these terms so they know their rights.
|
||||
|
||||
Our method of protecting your rights has two steps: (1) copyright
|
||||
the library, and (2) offer you this license which gives you legal
|
||||
permission to copy, distribute and/or modify the library.
|
||||
|
||||
Also, for each distributor's protection, we want to make certain
|
||||
that everyone understands that there is no warranty for this free
|
||||
library. If the library is modified by someone else and passed on, we
|
||||
want its recipients to know that what they have is not the original
|
||||
version, so that any problems introduced by others will not reflect on
|
||||
the original authors' reputations.
|
||||
|
||||
Finally, any free program is threatened constantly by software
|
||||
patents. We wish to avoid the danger that companies distributing free
|
||||
software will individually obtain patent licenses, thus in effect
|
||||
transforming the program into proprietary software. To prevent this,
|
||||
we have made it clear that any patent must be licensed for everyone's
|
||||
free use or not licensed at all.
|
||||
|
||||
Most GNU software, including some libraries, is covered by the ordinary
|
||||
GNU General Public License, which was designed for utility programs. This
|
||||
license, the GNU Library General Public License, applies to certain
|
||||
designated libraries. This license is quite different from the ordinary
|
||||
one; be sure to read it in full, and don't assume that anything in it is
|
||||
the same as in the ordinary license.
|
||||
|
||||
The reason we have a separate public license for some libraries is that
|
||||
they blur the distinction we usually make between modifying or adding to a
|
||||
program and simply using it. Linking a program with a library, without
|
||||
changing the library, is in some sense simply using the library, and is
|
||||
analogous to running a utility program or application program. However, in
|
||||
a textual and legal sense, the linked executable is a combined work, a
|
||||
derivative of the original library, and the ordinary General Public License
|
||||
treats it as such.
|
||||
|
||||
Because of this blurred distinction, using the ordinary General
|
||||
Public License for libraries did not effectively promote software
|
||||
sharing, because most developers did not use the libraries. We
|
||||
concluded that weaker conditions might promote sharing better.
|
||||
|
||||
However, unrestricted linking of non-free programs would deprive the
|
||||
users of those programs of all benefit from the free status of the
|
||||
libraries themselves. This Library General Public License is intended to
|
||||
permit developers of non-free programs to use free libraries, while
|
||||
preserving your freedom as a user of such programs to change the free
|
||||
libraries that are incorporated in them. (We have not seen how to achieve
|
||||
this as regards changes in header files, but we have achieved it as regards
|
||||
changes in the actual functions of the Library.) The hope is that this
|
||||
will lead to faster development of free libraries.
|
||||
|
||||
The precise terms and conditions for copying, distribution and
|
||||
modification follow. Pay close attention to the difference between a
|
||||
"work based on the library" and a "work that uses the library". The
|
||||
former contains code derived from the library, while the latter only
|
||||
works together with the library.
|
||||
|
||||
Note that it is possible for a library to be covered by the ordinary
|
||||
General Public License rather than by this special one.
|
||||
|
||||
GNU LIBRARY GENERAL PUBLIC LICENSE
|
||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||
|
||||
0. This License Agreement applies to any software library which
|
||||
contains a notice placed by the copyright holder or other authorized
|
||||
party saying it may be distributed under the terms of this Library
|
||||
General Public License (also called "this License"). Each licensee is
|
||||
addressed as "you".
|
||||
|
||||
A "library" means a collection of software functions and/or data
|
||||
prepared so as to be conveniently linked with application programs
|
||||
(which use some of those functions and data) to form executables.
|
||||
|
||||
The "Library", below, refers to any such software library or work
|
||||
which has been distributed under these terms. A "work based on the
|
||||
Library" means either the Library or any derivative work under
|
||||
copyright law: that is to say, a work containing the Library or a
|
||||
portion of it, either verbatim or with modifications and/or translated
|
||||
straightforwardly into another language. (Hereinafter, translation is
|
||||
included without limitation in the term "modification".)
|
||||
|
||||
"Source code" for a work means the preferred form of the work for
|
||||
making modifications to it. For a library, complete source code means
|
||||
all the source code for all modules it contains, plus any associated
|
||||
interface definition files, plus the scripts used to control compilation
|
||||
and installation of the library.
|
||||
|
||||
Activities other than copying, distribution and modification are not
|
||||
covered by this License; they are outside its scope. The act of
|
||||
running a program using the Library is not restricted, and output from
|
||||
such a program is covered only if its contents constitute a work based
|
||||
on the Library (independent of the use of the Library in a tool for
|
||||
writing it). Whether that is true depends on what the Library does
|
||||
and what the program that uses the Library does.
|
||||
|
||||
1. You may copy and distribute verbatim copies of the Library's
|
||||
complete source code as you receive it, in any medium, provided that
|
||||
you conspicuously and appropriately publish on each copy an
|
||||
appropriate copyright notice and disclaimer of warranty; keep intact
|
||||
all the notices that refer to this License and to the absence of any
|
||||
warranty; and distribute a copy of this License along with the
|
||||
Library.
|
||||
|
||||
You may charge a fee for the physical act of transferring a copy,
|
||||
and you may at your option offer warranty protection in exchange for a
|
||||
fee.
|
||||
|
||||
2. You may modify your copy or copies of the Library or any portion
|
||||
of it, thus forming a work based on the Library, and copy and
|
||||
distribute such modifications or work under the terms of Section 1
|
||||
above, provided that you also meet all of these conditions:
|
||||
|
||||
a) The modified work must itself be a software library.
|
||||
|
||||
b) You must cause the files modified to carry prominent notices
|
||||
stating that you changed the files and the date of any change.
|
||||
|
||||
c) You must cause the whole of the work to be licensed at no
|
||||
charge to all third parties under the terms of this License.
|
||||
|
||||
d) If a facility in the modified Library refers to a function or a
|
||||
table of data to be supplied by an application program that uses
|
||||
the facility, other than as an argument passed when the facility
|
||||
is invoked, then you must make a good faith effort to ensure that,
|
||||
in the event an application does not supply such function or
|
||||
table, the facility still operates, and performs whatever part of
|
||||
its purpose remains meaningful.
|
||||
|
||||
(For example, a function in a library to compute square roots has
|
||||
a purpose that is entirely well-defined independent of the
|
||||
application. Therefore, Subsection 2d requires that any
|
||||
application-supplied function or table used by this function must
|
||||
be optional: if the application does not supply it, the square
|
||||
root function must still compute square roots.)
|
||||
|
||||
These requirements apply to the modified work as a whole. If
|
||||
identifiable sections of that work are not derived from the Library,
|
||||
and can be reasonably considered independent and separate works in
|
||||
themselves, then this License, and its terms, do not apply to those
|
||||
sections when you distribute them as separate works. But when you
|
||||
distribute the same sections as part of a whole which is a work based
|
||||
on the Library, the distribution of the whole must be on the terms of
|
||||
this License, whose permissions for other licensees extend to the
|
||||
entire whole, and thus to each and every part regardless of who wrote
|
||||
it.
|
||||
|
||||
Thus, it is not the intent of this section to claim rights or contest
|
||||
your rights to work written entirely by you; rather, the intent is to
|
||||
exercise the right to control the distribution of derivative or
|
||||
collective works based on the Library.
|
||||
|
||||
In addition, mere aggregation of another work not based on the Library
|
||||
with the Library (or with a work based on the Library) on a volume of
|
||||
a storage or distribution medium does not bring the other work under
|
||||
the scope of this License.
|
||||
|
||||
3. You may opt to apply the terms of the ordinary GNU General Public
|
||||
License instead of this License to a given copy of the Library. To do
|
||||
this, you must alter all the notices that refer to this License, so
|
||||
that they refer to the ordinary GNU General Public License, version 2,
|
||||
instead of to this License. (If a newer version than version 2 of the
|
||||
ordinary GNU General Public License has appeared, then you can specify
|
||||
that version instead if you wish.) Do not make any other change in
|
||||
these notices.
|
||||
|
||||
Once this change is made in a given copy, it is irreversible for
|
||||
that copy, so the ordinary GNU General Public License applies to all
|
||||
subsequent copies and derivative works made from that copy.
|
||||
|
||||
This option is useful when you wish to copy part of the code of
|
||||
the Library into a program that is not a library.
|
||||
|
||||
4. You may copy and distribute the Library (or a portion or
|
||||
derivative of it, under Section 2) in object code or executable form
|
||||
under the terms of Sections 1 and 2 above provided that you accompany
|
||||
it with the complete corresponding machine-readable source code, which
|
||||
must be distributed under the terms of Sections 1 and 2 above on a
|
||||
medium customarily used for software interchange.
|
||||
|
||||
If distribution of object code is made by offering access to copy
|
||||
from a designated place, then offering equivalent access to copy the
|
||||
source code from the same place satisfies the requirement to
|
||||
distribute the source code, even though third parties are not
|
||||
compelled to copy the source along with the object code.
|
||||
|
||||
5. A program that contains no derivative of any portion of the
|
||||
Library, but is designed to work with the Library by being compiled or
|
||||
linked with it, is called a "work that uses the Library". Such a
|
||||
work, in isolation, is not a derivative work of the Library, and
|
||||
therefore falls outside the scope of this License.
|
||||
|
||||
However, linking a "work that uses the Library" with the Library
|
||||
creates an executable that is a derivative of the Library (because it
|
||||
contains portions of the Library), rather than a "work that uses the
|
||||
library". The executable is therefore covered by this License.
|
||||
Section 6 states terms for distribution of such executables.
|
||||
|
||||
When a "work that uses the Library" uses material from a header file
|
||||
that is part of the Library, the object code for the work may be a
|
||||
derivative work of the Library even though the source code is not.
|
||||
Whether this is true is especially significant if the work can be
|
||||
linked without the Library, or if the work is itself a library. The
|
||||
threshold for this to be true is not precisely defined by law.
|
||||
|
||||
If such an object file uses only numerical parameters, data
|
||||
structure layouts and accessors, and small macros and small inline
|
||||
functions (ten lines or less in length), then the use of the object
|
||||
file is unrestricted, regardless of whether it is legally a derivative
|
||||
work. (Executables containing this object code plus portions of the
|
||||
Library will still fall under Section 6.)
|
||||
|
||||
Otherwise, if the work is a derivative of the Library, you may
|
||||
distribute the object code for the work under the terms of Section 6.
|
||||
Any executables containing that work also fall under Section 6,
|
||||
whether or not they are linked directly with the Library itself.
|
||||
|
||||
6. As an exception to the Sections above, you may also compile or
|
||||
link a "work that uses the Library" with the Library to produce a
|
||||
work containing portions of the Library, and distribute that work
|
||||
under terms of your choice, provided that the terms permit
|
||||
modification of the work for the customer's own use and reverse
|
||||
engineering for debugging such modifications.
|
||||
|
||||
You must give prominent notice with each copy of the work that the
|
||||
Library is used in it and that the Library and its use are covered by
|
||||
this License. You must supply a copy of this License. If the work
|
||||
during execution displays copyright notices, you must include the
|
||||
copyright notice for the Library among them, as well as a reference
|
||||
directing the user to the copy of this License. Also, you must do one
|
||||
of these things:
|
||||
|
||||
a) Accompany the work with the complete corresponding
|
||||
machine-readable source code for the Library including whatever
|
||||
changes were used in the work (which must be distributed under
|
||||
Sections 1 and 2 above); and, if the work is an executable linked
|
||||
with the Library, with the complete machine-readable "work that
|
||||
uses the Library", as object code and/or source code, so that the
|
||||
user can modify the Library and then relink to produce a modified
|
||||
executable containing the modified Library. (It is understood
|
||||
that the user who changes the contents of definitions files in the
|
||||
Library will not necessarily be able to recompile the application
|
||||
to use the modified definitions.)
|
||||
|
||||
b) Accompany the work with a written offer, valid for at
|
||||
least three years, to give the same user the materials
|
||||
specified in Subsection 6a, above, for a charge no more
|
||||
than the cost of performing this distribution.
|
||||
|
||||
c) If distribution of the work is made by offering access to copy
|
||||
from a designated place, offer equivalent access to copy the above
|
||||
specified materials from the same place.
|
||||
|
||||
d) Verify that the user has already received a copy of these
|
||||
materials or that you have already sent this user a copy.
|
||||
|
||||
For an executable, the required form of the "work that uses the
|
||||
Library" must include any data and utility programs needed for
|
||||
reproducing the executable from it. However, as a special exception,
|
||||
the source code distributed need not include anything that is normally
|
||||
distributed (in either source or binary form) with the major
|
||||
components (compiler, kernel, and so on) of the operating system on
|
||||
which the executable runs, unless that component itself accompanies
|
||||
the executable.
|
||||
|
||||
It may happen that this requirement contradicts the license
|
||||
restrictions of other proprietary libraries that do not normally
|
||||
accompany the operating system. Such a contradiction means you cannot
|
||||
use both them and the Library together in an executable that you
|
||||
distribute.
|
||||
|
||||
7. You may place library facilities that are a work based on the
|
||||
Library side-by-side in a single library together with other library
|
||||
facilities not covered by this License, and distribute such a combined
|
||||
library, provided that the separate distribution of the work based on
|
||||
the Library and of the other library facilities is otherwise
|
||||
permitted, and provided that you do these two things:
|
||||
|
||||
a) Accompany the combined library with a copy of the same work
|
||||
based on the Library, uncombined with any other library
|
||||
facilities. This must be distributed under the terms of the
|
||||
Sections above.
|
||||
|
||||
b) Give prominent notice with the combined library of the fact
|
||||
that part of it is a work based on the Library, and explaining
|
||||
where to find the accompanying uncombined form of the same work.
|
||||
|
||||
8. You may not copy, modify, sublicense, link with, or distribute
|
||||
the Library except as expressly provided under this License. Any
|
||||
attempt otherwise to copy, modify, sublicense, link with, or
|
||||
distribute the Library is void, and will automatically terminate your
|
||||
rights under this License. However, parties who have received copies,
|
||||
or rights, from you under this License will not have their licenses
|
||||
terminated so long as such parties remain in full compliance.
|
||||
|
||||
9. You are not required to accept this License, since you have not
|
||||
signed it. However, nothing else grants you permission to modify or
|
||||
distribute the Library or its derivative works. These actions are
|
||||
prohibited by law if you do not accept this License. Therefore, by
|
||||
modifying or distributing the Library (or any work based on the
|
||||
Library), you indicate your acceptance of this License to do so, and
|
||||
all its terms and conditions for copying, distributing or modifying
|
||||
the Library or works based on it.
|
||||
|
||||
10. Each time you redistribute the Library (or any work based on the
|
||||
Library), the recipient automatically receives a license from the
|
||||
original licensor to copy, distribute, link with or modify the Library
|
||||
subject to these terms and conditions. You may not impose any further
|
||||
restrictions on the recipients' exercise of the rights granted herein.
|
||||
You are not responsible for enforcing compliance by third parties to
|
||||
this License.
|
||||
|
||||
11. If, as a consequence of a court judgment or allegation of patent
|
||||
infringement or for any other reason (not limited to patent issues),
|
||||
conditions are imposed on you (whether by court order, agreement or
|
||||
otherwise) that contradict the conditions of this License, they do not
|
||||
excuse you from the conditions of this License. If you cannot
|
||||
distribute so as to satisfy simultaneously your obligations under this
|
||||
License and any other pertinent obligations, then as a consequence you
|
||||
may not distribute the Library at all. For example, if a patent
|
||||
license would not permit royalty-free redistribution of the Library by
|
||||
all those who receive copies directly or indirectly through you, then
|
||||
the only way you could satisfy both it and this License would be to
|
||||
refrain entirely from distribution of the Library.
|
||||
|
||||
If any portion of this section is held invalid or unenforceable under any
|
||||
particular circumstance, the balance of the section is intended to apply,
|
||||
and the section as a whole is intended to apply in other circumstances.
|
||||
|
||||
It is not the purpose of this section to induce you to infringe any
|
||||
patents or other property right claims or to contest validity of any
|
||||
such claims; this section has the sole purpose of protecting the
|
||||
integrity of the free software distribution system which is
|
||||
implemented by public license practices. Many people have made
|
||||
generous contributions to the wide range of software distributed
|
||||
through that system in reliance on consistent application of that
|
||||
system; it is up to the author/donor to decide if he or she is willing
|
||||
to distribute software through any other system and a licensee cannot
|
||||
impose that choice.
|
||||
|
||||
This section is intended to make thoroughly clear what is believed to
|
||||
be a consequence of the rest of this License.
|
||||
|
||||
12. If the distribution and/or use of the Library is restricted in
|
||||
certain countries either by patents or by copyrighted interfaces, the
|
||||
original copyright holder who places the Library under this License may add
|
||||
an explicit geographical distribution limitation excluding those countries,
|
||||
so that distribution is permitted only in or among countries not thus
|
||||
excluded. In such case, this License incorporates the limitation as if
|
||||
written in the body of this License.
|
||||
|
||||
13. The Free Software Foundation may publish revised and/or new
|
||||
versions of the Library General Public License from time to time.
|
||||
Such new versions will be similar in spirit to the present version,
|
||||
but may differ in detail to address new problems or concerns.
|
||||
|
||||
Each version is given a distinguishing version number. If the Library
|
||||
specifies a version number of this License which applies to it and
|
||||
"any later version", you have the option of following the terms and
|
||||
conditions either of that version or of any later version published by
|
||||
the Free Software Foundation. If the Library does not specify a
|
||||
license version number, you may choose any version ever published by
|
||||
the Free Software Foundation.
|
||||
|
||||
14. If you wish to incorporate parts of the Library into other free
|
||||
programs whose distribution conditions are incompatible with these,
|
||||
write to the author to ask for permission. For software which is
|
||||
copyrighted by the Free Software Foundation, write to the Free
|
||||
Software Foundation; we sometimes make exceptions for this. Our
|
||||
decision will be guided by the two goals of preserving the free status
|
||||
of all derivatives of our free software and of promoting the sharing
|
||||
and reuse of software generally.
|
||||
|
||||
NO WARRANTY
|
||||
|
||||
15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
|
||||
WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
|
||||
EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
|
||||
OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
|
||||
KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
|
||||
LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
|
||||
THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
|
||||
|
||||
16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
|
||||
WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
|
||||
AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
|
||||
FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
|
||||
CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
|
||||
LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
|
||||
RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
|
||||
FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
|
||||
SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
|
||||
DAMAGES.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
Appendix: How to Apply These Terms to Your New Libraries
|
||||
|
||||
If you develop a new library, and you want it to be of the greatest
|
||||
possible use to the public, we recommend making it free software that
|
||||
everyone can redistribute and change. You can do so by permitting
|
||||
redistribution under these terms (or, alternatively, under the terms of the
|
||||
ordinary General Public License).
|
||||
|
||||
To apply these terms, attach the following notices to the library. It is
|
||||
safest to attach them to the start of each source file to most effectively
|
||||
convey the exclusion of warranty; and each file should have at least the
|
||||
"copyright" line and a pointer to where the full notice is found.
|
||||
|
||||
<one line to give the library's name and a brief idea of what it does.>
|
||||
Copyright (C) <year> <name of author>
|
||||
|
||||
This library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Library General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2 of the License, or (at your option) any later version.
|
||||
|
||||
This library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Library General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Library General Public
|
||||
License along with this library; if not, write to the Free
|
||||
Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
|
||||
Also add information on how to contact you by electronic and paper mail.
|
||||
|
||||
You should also get your employer (if you work as a programmer) or your
|
||||
school, if any, to sign a "copyright disclaimer" for the library, if
|
||||
necessary. Here is a sample; alter the names:
|
||||
|
||||
Yoyodyne, Inc., hereby disclaims all copyright interest in the
|
||||
library `Frob' (a library for tweaking knobs) written by James Random Hacker.
|
||||
|
||||
<signature of Ty Coon>, 1 April 1990
|
||||
Ty Coon, President of Vice
|
||||
|
||||
That's all there is to it!
|
||||
196
ogl_editor/src/External/mxml/README
vendored
Normal file
196
ogl_editor/src/External/mxml/README
vendored
Normal file
@ -0,0 +1,196 @@
|
||||
README - 2011-12-20
|
||||
-------------------
|
||||
|
||||
|
||||
INTRODUCTION
|
||||
|
||||
This README file describes the Mini-XML library version 2.7.
|
||||
|
||||
Mini-XML is a small XML parsing library that you can use to read XML and
|
||||
XML-like data files in your application without requiring large non-standard
|
||||
libraries. Mini-XML only requires an ANSI C compatible compiler (GCC works,
|
||||
as do most vendors' ANSI C compilers) and a "make" program.
|
||||
|
||||
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.
|
||||
- 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.
|
||||
|
||||
|
||||
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++ 2008, use
|
||||
the included project files in the "vcnet" subdirectory to build the library
|
||||
instead.
|
||||
|
||||
|
||||
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.pdf" (PDF). You can also look at the
|
||||
"testmxml.c" and "mxmldoc.c" source files for examples of using Mini-XML.
|
||||
|
||||
Mini-XML provides a single header file which you include:
|
||||
|
||||
#include <mxml.h>
|
||||
|
||||
Nodes are defined by the "mxml_node_t" structure; the "type" member defines
|
||||
the node type (element, integer, opaque, real, or text) which determines
|
||||
which value you want to look at in the "value" union. 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 an element, usually "?xml".
|
||||
|
||||
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_NO_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_NO_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 a "path":
|
||||
|
||||
mxml_node_t *value = mxmlFindPath(tree, "path/to/*/foo/bar");
|
||||
|
||||
The "mxmlGetInteger()", "mxmlGetOpaque()", "mxmlGetReal()", and
|
||||
"mxmlGetText()" functions retrieve the 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 web site provides access to a discussion forum and bug
|
||||
reporting page:
|
||||
|
||||
http://www.minixml.org/
|
||||
|
||||
|
||||
LEGAL STUFF
|
||||
|
||||
The Mini-XML library is Copyright 2003-2011 by Michael Sweet. License terms
|
||||
are described in the file "COPYING".
|
||||
96
ogl_editor/src/External/mxml/config.h
vendored
Normal file
96
ogl_editor/src/External/mxml/config.h
vendored
Normal file
@ -0,0 +1,96 @@
|
||||
/* config.h. Generated from config.h.in by configure. */
|
||||
/*
|
||||
* "$Id: config.h.in 408 2010-09-19 05:26:46Z mike $"
|
||||
*
|
||||
* Configuration file for Mini-XML, a small XML-like file parsing library.
|
||||
*
|
||||
* Copyright 2003-2010 by Michael R Sweet.
|
||||
*
|
||||
* These coded instructions, statements, and computer programs are the
|
||||
* property of Michael R Sweet and are protected by Federal copyright
|
||||
* law. Distribution and use rights are outlined in the file "COPYING"
|
||||
* which should have been included with this file. If this file is
|
||||
* missing or damaged, see the license at:
|
||||
*
|
||||
* http://www.minixml.org/
|
||||
*/
|
||||
|
||||
/*
|
||||
* Include necessary headers...
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <stdarg.h>
|
||||
#include <ctype.h>
|
||||
|
||||
|
||||
/*
|
||||
* Version number...
|
||||
*/
|
||||
|
||||
#define MXML_VERSION "Mini-XML v2.7"
|
||||
|
||||
|
||||
/*
|
||||
* Inline function support...
|
||||
*/
|
||||
|
||||
#define inline
|
||||
|
||||
|
||||
/*
|
||||
* Long long support...
|
||||
*/
|
||||
|
||||
#define HAVE_LONG_LONG 1
|
||||
|
||||
|
||||
/*
|
||||
* Do we have the snprintf() and vsnprintf() functions?
|
||||
*/
|
||||
|
||||
#define HAVE_SNPRINTF 1
|
||||
#define HAVE_VSNPRINTF 1
|
||||
|
||||
|
||||
/*
|
||||
* Do we have the strXXX() functions?
|
||||
*/
|
||||
|
||||
#define HAVE_STRDUP 1
|
||||
|
||||
|
||||
/*
|
||||
* Do we have threading support?
|
||||
*/
|
||||
|
||||
#define HAVE_PTHREAD_H 1
|
||||
|
||||
|
||||
/*
|
||||
* Define prototypes for string functions as needed...
|
||||
*/
|
||||
|
||||
# ifndef HAVE_STRDUP
|
||||
extern char *_mxml_strdup(const char *);
|
||||
# define strdup _mxml_strdup
|
||||
# endif /* !HAVE_STRDUP */
|
||||
|
||||
extern char *_mxml_strdupf(const char *, ...);
|
||||
extern char *_mxml_vstrdupf(const char *, va_list);
|
||||
|
||||
# ifndef HAVE_SNPRINTF
|
||||
extern int _mxml_snprintf(char *, size_t, const char *, ...);
|
||||
# define snprintf _mxml_snprintf
|
||||
# endif /* !HAVE_SNPRINTF */
|
||||
|
||||
# ifndef HAVE_VSNPRINTF
|
||||
extern int _mxml_vsnprintf(char *, size_t, const char *, va_list);
|
||||
# define vsnprintf _mxml_vsnprintf
|
||||
# endif /* !HAVE_VSNPRINTF */
|
||||
|
||||
/*
|
||||
* End of "$Id: config.h.in 408 2010-09-19 05:26:46Z mike $".
|
||||
*/
|
||||
319
ogl_editor/src/External/mxml/mxml-attr.c
vendored
Normal file
319
ogl_editor/src/External/mxml/mxml-attr.c
vendored
Normal file
@ -0,0 +1,319 @@
|
||||
/*
|
||||
* "$Id: mxml-attr.c 408 2010-09-19 05:26:46Z mike $"
|
||||
*
|
||||
* Attribute support code for Mini-XML, a small XML-like file parsing library.
|
||||
*
|
||||
* Copyright 2003-2010 by Michael R Sweet.
|
||||
*
|
||||
* These coded instructions, statements, and computer programs are the
|
||||
* property of Michael R Sweet and are protected by Federal copyright
|
||||
* law. Distribution and use rights are outlined in the file "COPYING"
|
||||
* which should have been included with this file. If this file is
|
||||
* missing or damaged, see the license at:
|
||||
*
|
||||
* http://www.minixml.org/
|
||||
*
|
||||
* Contents:
|
||||
*
|
||||
* mxmlElementDeleteAttr() - Delete an attribute.
|
||||
* mxmlElementGetAttr() - Get an attribute.
|
||||
* mxmlElementSetAttr() - Set an attribute.
|
||||
* mxmlElementSetAttrf() - Set an attribute with a formatted value.
|
||||
* mxml_set_attr() - Set or add an attribute name/value pair.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Include necessary headers...
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
#include "mxml.h"
|
||||
|
||||
|
||||
/*
|
||||
* Local functions...
|
||||
*/
|
||||
|
||||
static int mxml_set_attr(mxml_node_t *node, const char *name,
|
||||
char *value);
|
||||
|
||||
|
||||
/*
|
||||
* 'mxmlElementDeleteAttr()' - Delete an attribute.
|
||||
*
|
||||
* @since Mini-XML 2.4@
|
||||
*/
|
||||
|
||||
void
|
||||
mxmlElementDeleteAttr(mxml_node_t *node,/* I - Element */
|
||||
const char *name)/* I - Attribute name */
|
||||
{
|
||||
int i; /* Looping var */
|
||||
mxml_attr_t *attr; /* Cirrent attribute */
|
||||
|
||||
|
||||
#ifdef DEBUG
|
||||
fprintf(stderr, "mxmlElementDeleteAttr(node=%p, name=\"%s\")\n",
|
||||
node, name ? name : "(null)");
|
||||
#endif /* DEBUG */
|
||||
|
||||
/*
|
||||
* Range check input...
|
||||
*/
|
||||
|
||||
if (!node || node->type != MXML_ELEMENT || !name)
|
||||
return;
|
||||
|
||||
/*
|
||||
* Look for the attribute...
|
||||
*/
|
||||
|
||||
for (i = node->value.element.num_attrs, attr = node->value.element.attrs;
|
||||
i > 0;
|
||||
i --, attr ++)
|
||||
{
|
||||
#ifdef DEBUG
|
||||
printf(" %s=\"%s\"\n", attr->name, attr->value);
|
||||
#endif /* DEBUG */
|
||||
|
||||
if (!strcmp(attr->name, name))
|
||||
{
|
||||
/*
|
||||
* Delete this attribute...
|
||||
*/
|
||||
|
||||
free(attr->name);
|
||||
free(attr->value);
|
||||
|
||||
i --;
|
||||
if (i > 0)
|
||||
memmove(attr, attr + 1, i * sizeof(mxml_attr_t));
|
||||
|
||||
node->value.element.num_attrs --;
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'mxmlElementGetAttr()' - Get an attribute.
|
||||
*
|
||||
* This function returns NULL if the node is not an element or the
|
||||
* named attribute does not exist.
|
||||
*/
|
||||
|
||||
const char * /* O - Attribute value or NULL */
|
||||
mxmlElementGetAttr(mxml_node_t *node, /* I - Element node */
|
||||
const char *name) /* I - Name of attribute */
|
||||
{
|
||||
int i; /* Looping var */
|
||||
mxml_attr_t *attr; /* Cirrent attribute */
|
||||
|
||||
|
||||
#ifdef DEBUG
|
||||
fprintf(stderr, "mxmlElementGetAttr(node=%p, name=\"%s\")\n",
|
||||
node, name ? name : "(null)");
|
||||
#endif /* DEBUG */
|
||||
|
||||
/*
|
||||
* Range check input...
|
||||
*/
|
||||
|
||||
if (!node || node->type != MXML_ELEMENT || !name)
|
||||
return (NULL);
|
||||
|
||||
/*
|
||||
* Look for the attribute...
|
||||
*/
|
||||
|
||||
for (i = node->value.element.num_attrs, attr = node->value.element.attrs;
|
||||
i > 0;
|
||||
i --, attr ++)
|
||||
{
|
||||
#ifdef DEBUG
|
||||
printf(" %s=\"%s\"\n", attr->name, attr->value);
|
||||
#endif /* DEBUG */
|
||||
|
||||
if (!strcmp(attr->name, name))
|
||||
{
|
||||
#ifdef DEBUG
|
||||
printf(" Returning \"%s\"!\n", attr->value);
|
||||
#endif /* DEBUG */
|
||||
return (attr->value);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Didn't find attribute, so return NULL...
|
||||
*/
|
||||
|
||||
#ifdef DEBUG
|
||||
puts(" Returning NULL!\n");
|
||||
#endif /* DEBUG */
|
||||
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'mxmlElementSetAttr()' - Set an attribute.
|
||||
*
|
||||
* If the named attribute already exists, the value of the attribute
|
||||
* is replaced by the new string value. The string value is copied
|
||||
* into the element node. This function does nothing if the node is
|
||||
* not an element.
|
||||
*/
|
||||
|
||||
void
|
||||
mxmlElementSetAttr(mxml_node_t *node, /* I - Element node */
|
||||
const char *name, /* I - Name of attribute */
|
||||
const char *value) /* I - Attribute value */
|
||||
{
|
||||
char *valuec; /* Copy of value */
|
||||
|
||||
|
||||
#ifdef DEBUG
|
||||
fprintf(stderr, "mxmlElementSetAttr(node=%p, name=\"%s\", value=\"%s\")\n",
|
||||
node, name ? name : "(null)", value ? value : "(null)");
|
||||
#endif /* DEBUG */
|
||||
|
||||
/*
|
||||
* Range check input...
|
||||
*/
|
||||
|
||||
if (!node || node->type != MXML_ELEMENT || !name)
|
||||
return;
|
||||
|
||||
if (value)
|
||||
valuec = strdup(value);
|
||||
else
|
||||
valuec = NULL;
|
||||
|
||||
if (mxml_set_attr(node, name, valuec))
|
||||
free(valuec);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'mxmlElementSetAttrf()' - Set an attribute with a formatted value.
|
||||
*
|
||||
* If the named attribute already exists, the value of the attribute
|
||||
* is replaced by the new formatted string. The formatted string value is
|
||||
* copied into the element node. This function does nothing if the node
|
||||
* is not an element.
|
||||
*
|
||||
* @since Mini-XML 2.3@
|
||||
*/
|
||||
|
||||
void
|
||||
mxmlElementSetAttrf(mxml_node_t *node, /* I - Element node */
|
||||
const char *name, /* I - Name of attribute */
|
||||
const char *format,/* I - Printf-style attribute value */
|
||||
...) /* I - Additional arguments as needed */
|
||||
{
|
||||
va_list ap; /* Argument pointer */
|
||||
char *value; /* Value */
|
||||
|
||||
|
||||
#ifdef DEBUG
|
||||
fprintf(stderr,
|
||||
"mxmlElementSetAttrf(node=%p, name=\"%s\", format=\"%s\", ...)\n",
|
||||
node, name ? name : "(null)", format ? format : "(null)");
|
||||
#endif /* DEBUG */
|
||||
|
||||
/*
|
||||
* Range check input...
|
||||
*/
|
||||
|
||||
if (!node || node->type != MXML_ELEMENT || !name || !format)
|
||||
return;
|
||||
|
||||
/*
|
||||
* Format the value...
|
||||
*/
|
||||
|
||||
va_start(ap, format);
|
||||
value = _mxml_vstrdupf(format, ap);
|
||||
va_end(ap);
|
||||
|
||||
if (!value)
|
||||
mxml_error("Unable to allocate memory for attribute '%s' in element %s!",
|
||||
name, node->value.element.name);
|
||||
else if (mxml_set_attr(node, name, value))
|
||||
free(value);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'mxml_set_attr()' - Set or add an attribute name/value pair.
|
||||
*/
|
||||
|
||||
static int /* O - 0 on success, -1 on failure */
|
||||
mxml_set_attr(mxml_node_t *node, /* I - Element node */
|
||||
const char *name, /* I - Attribute name */
|
||||
char *value) /* I - Attribute value */
|
||||
{
|
||||
int i; /* Looping var */
|
||||
mxml_attr_t *attr; /* New attribute */
|
||||
|
||||
|
||||
/*
|
||||
* Look for the attribute...
|
||||
*/
|
||||
|
||||
for (i = node->value.element.num_attrs, attr = node->value.element.attrs;
|
||||
i > 0;
|
||||
i --, attr ++)
|
||||
if (!strcmp(attr->name, name))
|
||||
{
|
||||
/*
|
||||
* Free the old value as needed...
|
||||
*/
|
||||
|
||||
if (attr->value)
|
||||
free(attr->value);
|
||||
|
||||
attr->value = value;
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
||||
/*
|
||||
* Add a new attribute...
|
||||
*/
|
||||
|
||||
if (node->value.element.num_attrs == 0)
|
||||
attr = malloc(sizeof(mxml_attr_t));
|
||||
else
|
||||
attr = realloc(node->value.element.attrs,
|
||||
(node->value.element.num_attrs + 1) * sizeof(mxml_attr_t));
|
||||
|
||||
if (!attr)
|
||||
{
|
||||
mxml_error("Unable to allocate memory for attribute '%s' in element %s!",
|
||||
name, node->value.element.name);
|
||||
return (-1);
|
||||
}
|
||||
|
||||
node->value.element.attrs = attr;
|
||||
attr += node->value.element.num_attrs;
|
||||
|
||||
if ((attr->name = strdup(name)) == NULL)
|
||||
{
|
||||
mxml_error("Unable to allocate memory for attribute '%s' in element %s!",
|
||||
name, node->value.element.name);
|
||||
return (-1);
|
||||
}
|
||||
|
||||
attr->value = value;
|
||||
|
||||
node->value.element.num_attrs ++;
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* End of "$Id: mxml-attr.c 408 2010-09-19 05:26:46Z mike $".
|
||||
*/
|
||||
460
ogl_editor/src/External/mxml/mxml-entity.c
vendored
Normal file
460
ogl_editor/src/External/mxml/mxml-entity.c
vendored
Normal file
@ -0,0 +1,460 @@
|
||||
/*
|
||||
* "$Id: mxml-entity.c 408 2010-09-19 05:26:46Z mike $"
|
||||
*
|
||||
* Character entity support code for Mini-XML, a small XML-like
|
||||
* file parsing library.
|
||||
*
|
||||
* Copyright 2003-2010 by Michael R Sweet.
|
||||
*
|
||||
* These coded instructions, statements, and computer programs are the
|
||||
* property of Michael R Sweet and are protected by Federal copyright
|
||||
* law. Distribution and use rights are outlined in the file "COPYING"
|
||||
* which should have been included with this file. If this file is
|
||||
* missing or damaged, see the license at:
|
||||
*
|
||||
* http://www.minixml.org/
|
||||
*
|
||||
* Contents:
|
||||
*
|
||||
* mxmlEntityAddCallback() - Add a callback to convert entities to
|
||||
* Unicode.
|
||||
* mxmlEntityGetName() - Get the name that corresponds to the
|
||||
* character value.
|
||||
* mxmlEntityGetValue() - Get the character corresponding to a named
|
||||
* entity.
|
||||
* mxmlEntityRemoveCallback() - Remove a callback.
|
||||
* _mxml_entity_cb() - Lookup standard (X)HTML entities.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Include necessary headers...
|
||||
*/
|
||||
|
||||
#include "mxml-private.h"
|
||||
|
||||
|
||||
/*
|
||||
* 'mxmlEntityAddCallback()' - Add a callback to convert entities to Unicode.
|
||||
*/
|
||||
|
||||
int /* O - 0 on success, -1 on failure */
|
||||
mxmlEntityAddCallback(
|
||||
mxml_entity_cb_t cb) /* I - Callback function to add */
|
||||
{
|
||||
_mxml_global_t *global = _mxml_global();
|
||||
/* Global data */
|
||||
|
||||
|
||||
if (global->num_entity_cbs < (int)(sizeof(global->entity_cbs) / sizeof(global->entity_cbs[0])))
|
||||
{
|
||||
global->entity_cbs[global->num_entity_cbs] = cb;
|
||||
global->num_entity_cbs ++;
|
||||
|
||||
return (0);
|
||||
}
|
||||
else
|
||||
{
|
||||
mxml_error("Unable to add entity callback!");
|
||||
|
||||
return (-1);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'mxmlEntityGetName()' - Get the name that corresponds to the character value.
|
||||
*
|
||||
* If val does not need to be represented by a named entity, NULL is returned.
|
||||
*/
|
||||
|
||||
const char * /* O - Entity name or NULL */
|
||||
mxmlEntityGetName(int val) /* I - Character value */
|
||||
{
|
||||
switch (val)
|
||||
{
|
||||
case '&' :
|
||||
return ("amp");
|
||||
|
||||
case '<' :
|
||||
return ("lt");
|
||||
|
||||
case '>' :
|
||||
return ("gt");
|
||||
|
||||
case '\"' :
|
||||
return ("quot");
|
||||
|
||||
default :
|
||||
return (NULL);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'mxmlEntityGetValue()' - Get the character corresponding to a named entity.
|
||||
*
|
||||
* The entity name can also be a numeric constant. -1 is returned if the
|
||||
* name is not known.
|
||||
*/
|
||||
|
||||
int /* O - Character value or -1 on error */
|
||||
mxmlEntityGetValue(const char *name) /* I - Entity name */
|
||||
{
|
||||
int i; /* Looping var */
|
||||
int ch; /* Character value */
|
||||
_mxml_global_t *global = _mxml_global();
|
||||
/* Global data */
|
||||
|
||||
|
||||
for (i = 0; i < global->num_entity_cbs; i ++)
|
||||
if ((ch = (global->entity_cbs[i])(name)) >= 0)
|
||||
return (ch);
|
||||
|
||||
return (-1);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'mxmlEntityRemoveCallback()' - Remove a callback.
|
||||
*/
|
||||
|
||||
void
|
||||
mxmlEntityRemoveCallback(
|
||||
mxml_entity_cb_t cb) /* I - Callback function to remove */
|
||||
{
|
||||
int i; /* Looping var */
|
||||
_mxml_global_t *global = _mxml_global();
|
||||
/* Global data */
|
||||
|
||||
|
||||
for (i = 0; i < global->num_entity_cbs; i ++)
|
||||
if (cb == global->entity_cbs[i])
|
||||
{
|
||||
/*
|
||||
* Remove the callback...
|
||||
*/
|
||||
|
||||
global->num_entity_cbs --;
|
||||
|
||||
if (i < global->num_entity_cbs)
|
||||
memmove(global->entity_cbs + i, global->entity_cbs + i + 1,
|
||||
(global->num_entity_cbs - i) * sizeof(global->entity_cbs[0]));
|
||||
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* '_mxml_entity_cb()' - Lookup standard (X)HTML entities.
|
||||
*/
|
||||
|
||||
int /* O - Unicode value or -1 */
|
||||
_mxml_entity_cb(const char *name) /* I - Entity name */
|
||||
{
|
||||
int diff, /* Difference between names */
|
||||
current, /* Current entity in search */
|
||||
first, /* First entity in search */
|
||||
last; /* Last entity in search */
|
||||
static const struct
|
||||
{
|
||||
const char *name; /* Entity name */
|
||||
int val; /* Character value */
|
||||
} entities[] =
|
||||
{
|
||||
{ "AElig", 198 },
|
||||
{ "Aacute", 193 },
|
||||
{ "Acirc", 194 },
|
||||
{ "Agrave", 192 },
|
||||
{ "Alpha", 913 },
|
||||
{ "Aring", 197 },
|
||||
{ "Atilde", 195 },
|
||||
{ "Auml", 196 },
|
||||
{ "Beta", 914 },
|
||||
{ "Ccedil", 199 },
|
||||
{ "Chi", 935 },
|
||||
{ "Dagger", 8225 },
|
||||
{ "Delta", 916 },
|
||||
{ "Dstrok", 208 },
|
||||
{ "ETH", 208 },
|
||||
{ "Eacute", 201 },
|
||||
{ "Ecirc", 202 },
|
||||
{ "Egrave", 200 },
|
||||
{ "Epsilon", 917 },
|
||||
{ "Eta", 919 },
|
||||
{ "Euml", 203 },
|
||||
{ "Gamma", 915 },
|
||||
{ "Iacute", 205 },
|
||||
{ "Icirc", 206 },
|
||||
{ "Igrave", 204 },
|
||||
{ "Iota", 921 },
|
||||
{ "Iuml", 207 },
|
||||
{ "Kappa", 922 },
|
||||
{ "Lambda", 923 },
|
||||
{ "Mu", 924 },
|
||||
{ "Ntilde", 209 },
|
||||
{ "Nu", 925 },
|
||||
{ "OElig", 338 },
|
||||
{ "Oacute", 211 },
|
||||
{ "Ocirc", 212 },
|
||||
{ "Ograve", 210 },
|
||||
{ "Omega", 937 },
|
||||
{ "Omicron", 927 },
|
||||
{ "Oslash", 216 },
|
||||
{ "Otilde", 213 },
|
||||
{ "Ouml", 214 },
|
||||
{ "Phi", 934 },
|
||||
{ "Pi", 928 },
|
||||
{ "Prime", 8243 },
|
||||
{ "Psi", 936 },
|
||||
{ "Rho", 929 },
|
||||
{ "Scaron", 352 },
|
||||
{ "Sigma", 931 },
|
||||
{ "THORN", 222 },
|
||||
{ "Tau", 932 },
|
||||
{ "Theta", 920 },
|
||||
{ "Uacute", 218 },
|
||||
{ "Ucirc", 219 },
|
||||
{ "Ugrave", 217 },
|
||||
{ "Upsilon", 933 },
|
||||
{ "Uuml", 220 },
|
||||
{ "Xi", 926 },
|
||||
{ "Yacute", 221 },
|
||||
{ "Yuml", 376 },
|
||||
{ "Zeta", 918 },
|
||||
{ "aacute", 225 },
|
||||
{ "acirc", 226 },
|
||||
{ "acute", 180 },
|
||||
{ "aelig", 230 },
|
||||
{ "agrave", 224 },
|
||||
{ "alefsym", 8501 },
|
||||
{ "alpha", 945 },
|
||||
{ "amp", '&' },
|
||||
{ "and", 8743 },
|
||||
{ "ang", 8736 },
|
||||
{ "apos", '\'' },
|
||||
{ "aring", 229 },
|
||||
{ "asymp", 8776 },
|
||||
{ "atilde", 227 },
|
||||
{ "auml", 228 },
|
||||
{ "bdquo", 8222 },
|
||||
{ "beta", 946 },
|
||||
{ "brkbar", 166 },
|
||||
{ "brvbar", 166 },
|
||||
{ "bull", 8226 },
|
||||
{ "cap", 8745 },
|
||||
{ "ccedil", 231 },
|
||||
{ "cedil", 184 },
|
||||
{ "cent", 162 },
|
||||
{ "chi", 967 },
|
||||
{ "circ", 710 },
|
||||
{ "clubs", 9827 },
|
||||
{ "cong", 8773 },
|
||||
{ "copy", 169 },
|
||||
{ "crarr", 8629 },
|
||||
{ "cup", 8746 },
|
||||
{ "curren", 164 },
|
||||
{ "dArr", 8659 },
|
||||
{ "dagger", 8224 },
|
||||
{ "darr", 8595 },
|
||||
{ "deg", 176 },
|
||||
{ "delta", 948 },
|
||||
{ "diams", 9830 },
|
||||
{ "die", 168 },
|
||||
{ "divide", 247 },
|
||||
{ "eacute", 233 },
|
||||
{ "ecirc", 234 },
|
||||
{ "egrave", 232 },
|
||||
{ "empty", 8709 },
|
||||
{ "emsp", 8195 },
|
||||
{ "ensp", 8194 },
|
||||
{ "epsilon", 949 },
|
||||
{ "equiv", 8801 },
|
||||
{ "eta", 951 },
|
||||
{ "eth", 240 },
|
||||
{ "euml", 235 },
|
||||
{ "euro", 8364 },
|
||||
{ "exist", 8707 },
|
||||
{ "fnof", 402 },
|
||||
{ "forall", 8704 },
|
||||
{ "frac12", 189 },
|
||||
{ "frac14", 188 },
|
||||
{ "frac34", 190 },
|
||||
{ "frasl", 8260 },
|
||||
{ "gamma", 947 },
|
||||
{ "ge", 8805 },
|
||||
{ "gt", '>' },
|
||||
{ "hArr", 8660 },
|
||||
{ "harr", 8596 },
|
||||
{ "hearts", 9829 },
|
||||
{ "hellip", 8230 },
|
||||
{ "hibar", 175 },
|
||||
{ "iacute", 237 },
|
||||
{ "icirc", 238 },
|
||||
{ "iexcl", 161 },
|
||||
{ "igrave", 236 },
|
||||
{ "image", 8465 },
|
||||
{ "infin", 8734 },
|
||||
{ "int", 8747 },
|
||||
{ "iota", 953 },
|
||||
{ "iquest", 191 },
|
||||
{ "isin", 8712 },
|
||||
{ "iuml", 239 },
|
||||
{ "kappa", 954 },
|
||||
{ "lArr", 8656 },
|
||||
{ "lambda", 955 },
|
||||
{ "lang", 9001 },
|
||||
{ "laquo", 171 },
|
||||
{ "larr", 8592 },
|
||||
{ "lceil", 8968 },
|
||||
{ "ldquo", 8220 },
|
||||
{ "le", 8804 },
|
||||
{ "lfloor", 8970 },
|
||||
{ "lowast", 8727 },
|
||||
{ "loz", 9674 },
|
||||
{ "lrm", 8206 },
|
||||
{ "lsaquo", 8249 },
|
||||
{ "lsquo", 8216 },
|
||||
{ "lt", '<' },
|
||||
{ "macr", 175 },
|
||||
{ "mdash", 8212 },
|
||||
{ "micro", 181 },
|
||||
{ "middot", 183 },
|
||||
{ "minus", 8722 },
|
||||
{ "mu", 956 },
|
||||
{ "nabla", 8711 },
|
||||
{ "nbsp", 160 },
|
||||
{ "ndash", 8211 },
|
||||
{ "ne", 8800 },
|
||||
{ "ni", 8715 },
|
||||
{ "not", 172 },
|
||||
{ "notin", 8713 },
|
||||
{ "nsub", 8836 },
|
||||
{ "ntilde", 241 },
|
||||
{ "nu", 957 },
|
||||
{ "oacute", 243 },
|
||||
{ "ocirc", 244 },
|
||||
{ "oelig", 339 },
|
||||
{ "ograve", 242 },
|
||||
{ "oline", 8254 },
|
||||
{ "omega", 969 },
|
||||
{ "omicron", 959 },
|
||||
{ "oplus", 8853 },
|
||||
{ "or", 8744 },
|
||||
{ "ordf", 170 },
|
||||
{ "ordm", 186 },
|
||||
{ "oslash", 248 },
|
||||
{ "otilde", 245 },
|
||||
{ "otimes", 8855 },
|
||||
{ "ouml", 246 },
|
||||
{ "para", 182 },
|
||||
{ "part", 8706 },
|
||||
{ "permil", 8240 },
|
||||
{ "perp", 8869 },
|
||||
{ "phi", 966 },
|
||||
{ "pi", 960 },
|
||||
{ "piv", 982 },
|
||||
{ "plusmn", 177 },
|
||||
{ "pound", 163 },
|
||||
{ "prime", 8242 },
|
||||
{ "prod", 8719 },
|
||||
{ "prop", 8733 },
|
||||
{ "psi", 968 },
|
||||
{ "quot", '\"' },
|
||||
{ "rArr", 8658 },
|
||||
{ "radic", 8730 },
|
||||
{ "rang", 9002 },
|
||||
{ "raquo", 187 },
|
||||
{ "rarr", 8594 },
|
||||
{ "rceil", 8969 },
|
||||
{ "rdquo", 8221 },
|
||||
{ "real", 8476 },
|
||||
{ "reg", 174 },
|
||||
{ "rfloor", 8971 },
|
||||
{ "rho", 961 },
|
||||
{ "rlm", 8207 },
|
||||
{ "rsaquo", 8250 },
|
||||
{ "rsquo", 8217 },
|
||||
{ "sbquo", 8218 },
|
||||
{ "scaron", 353 },
|
||||
{ "sdot", 8901 },
|
||||
{ "sect", 167 },
|
||||
{ "shy", 173 },
|
||||
{ "sigma", 963 },
|
||||
{ "sigmaf", 962 },
|
||||
{ "sim", 8764 },
|
||||
{ "spades", 9824 },
|
||||
{ "sub", 8834 },
|
||||
{ "sube", 8838 },
|
||||
{ "sum", 8721 },
|
||||
{ "sup", 8835 },
|
||||
{ "sup1", 185 },
|
||||
{ "sup2", 178 },
|
||||
{ "sup3", 179 },
|
||||
{ "supe", 8839 },
|
||||
{ "szlig", 223 },
|
||||
{ "tau", 964 },
|
||||
{ "there4", 8756 },
|
||||
{ "theta", 952 },
|
||||
{ "thetasym", 977 },
|
||||
{ "thinsp", 8201 },
|
||||
{ "thorn", 254 },
|
||||
{ "tilde", 732 },
|
||||
{ "times", 215 },
|
||||
{ "trade", 8482 },
|
||||
{ "uArr", 8657 },
|
||||
{ "uacute", 250 },
|
||||
{ "uarr", 8593 },
|
||||
{ "ucirc", 251 },
|
||||
{ "ugrave", 249 },
|
||||
{ "uml", 168 },
|
||||
{ "upsih", 978 },
|
||||
{ "upsilon", 965 },
|
||||
{ "uuml", 252 },
|
||||
{ "weierp", 8472 },
|
||||
{ "xi", 958 },
|
||||
{ "yacute", 253 },
|
||||
{ "yen", 165 },
|
||||
{ "yuml", 255 },
|
||||
{ "zeta", 950 },
|
||||
{ "zwj", 8205 },
|
||||
{ "zwnj", 8204 }
|
||||
};
|
||||
|
||||
|
||||
/*
|
||||
* Do a binary search for the named entity...
|
||||
*/
|
||||
|
||||
first = 0;
|
||||
last = (int)(sizeof(entities) / sizeof(entities[0]) - 1);
|
||||
|
||||
while ((last - first) > 1)
|
||||
{
|
||||
current = (first + last) / 2;
|
||||
|
||||
if ((diff = strcmp(name, entities[current].name)) == 0)
|
||||
return (entities[current].val);
|
||||
else if (diff < 0)
|
||||
last = current;
|
||||
else
|
||||
first = current;
|
||||
}
|
||||
|
||||
/*
|
||||
* If we get here, there is a small chance that there is still
|
||||
* a match; check first and last...
|
||||
*/
|
||||
|
||||
if (!strcmp(name, entities[first].name))
|
||||
return (entities[first].val);
|
||||
else if (!strcmp(name, entities[last].name))
|
||||
return (entities[last].val);
|
||||
else
|
||||
return (-1);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* End of "$Id: mxml-entity.c 408 2010-09-19 05:26:46Z mike $".
|
||||
*/
|
||||
3080
ogl_editor/src/External/mxml/mxml-file.c
vendored
Normal file
3080
ogl_editor/src/External/mxml/mxml-file.c
vendored
Normal file
File diff suppressed because it is too large
Load Diff
471
ogl_editor/src/External/mxml/mxml-get.c
vendored
Normal file
471
ogl_editor/src/External/mxml/mxml-get.c
vendored
Normal file
@ -0,0 +1,471 @@
|
||||
/*
|
||||
* "$Id: mxml-get.c 427 2011-01-03 02:03:29Z mike $"
|
||||
*
|
||||
* Node get functions for Mini-XML, a small XML-like file parsing library.
|
||||
*
|
||||
* Copyright 2011 by Michael R Sweet.
|
||||
*
|
||||
* These coded instructions, statements, and computer programs are the
|
||||
* property of Michael R Sweet and are protected by Federal copyright
|
||||
* law. Distribution and use rights are outlined in the file "COPYING"
|
||||
* which should have been included with this file. If this file is
|
||||
* missing or damaged, see the license at:
|
||||
*
|
||||
* http://www.minixml.org/
|
||||
*
|
||||
* Contents:
|
||||
*
|
||||
* mxmlGetCDATA() - Get the value for a CDATA node.
|
||||
* mxmlGetCustom() - Get the value for a custom node.
|
||||
* mxmlGetElement() - Get the name for an element node.
|
||||
* mxmlGetFirstChild() - Get the first child of an element node.
|
||||
* mxmlGetInteger() - Get the integer value from the specified node or its
|
||||
* first child.
|
||||
* mxmlGetLastChild() - Get the last child of an element node.
|
||||
* mxmlGetNextSibling() - Get the next node for the current parent.
|
||||
* mxmlGetOpaque() - Get an opaque string value for a node or its first
|
||||
* child.
|
||||
* mxmlGetParent() - Get the parent node.
|
||||
* mxmlGetPrevSibling() - Get the previous node for the current parent.
|
||||
* mxmlGetReal() - Get the real value for a node or its first child.
|
||||
* mxmlGetText() - Get the text value for a node or its first child.
|
||||
* mxmlGetType() - Get the node type.
|
||||
* mxmlGetUserData() - Get the user data pointer for a node.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Include necessary headers...
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
#include "mxml.h"
|
||||
|
||||
|
||||
/*
|
||||
* 'mxmlGetCDATA()' - Get the value for a CDATA node.
|
||||
*
|
||||
* @code NULL@ is returned if the node is not a CDATA element.
|
||||
*
|
||||
* @since Mini-XML 2.7@
|
||||
*/
|
||||
|
||||
const char * /* O - CDATA value or NULL */
|
||||
mxmlGetCDATA(mxml_node_t *node) /* I - Node to get */
|
||||
{
|
||||
/*
|
||||
* Range check input...
|
||||
*/
|
||||
|
||||
if (!node || node->type != MXML_ELEMENT ||
|
||||
strncmp(node->value.element.name, "![CDATA[", 8))
|
||||
return (NULL);
|
||||
|
||||
/*
|
||||
* Return the text following the CDATA declaration...
|
||||
*/
|
||||
|
||||
return (node->value.element.name + 8);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'mxmlGetCustom()' - Get the value for a custom node.
|
||||
*
|
||||
* @code NULL@ is returned if the node (or its first child) is not a custom
|
||||
* value node.
|
||||
*
|
||||
* @since Mini-XML 2.7@
|
||||
*/
|
||||
|
||||
const void * /* O - Custom value or NULL */
|
||||
mxmlGetCustom(mxml_node_t *node) /* I - Node to get */
|
||||
{
|
||||
/*
|
||||
* Range check input...
|
||||
*/
|
||||
|
||||
if (!node)
|
||||
return (NULL);
|
||||
|
||||
/*
|
||||
* Return the integer value...
|
||||
*/
|
||||
|
||||
if (node->type == MXML_CUSTOM)
|
||||
return (node->value.custom.data);
|
||||
else if (node->type == MXML_ELEMENT &&
|
||||
node->child &&
|
||||
node->child->type == MXML_CUSTOM)
|
||||
return (node->child->value.custom.data);
|
||||
else
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'mxmlGetElement()' - Get the name for an element node.
|
||||
*
|
||||
* @code NULL@ is returned if the node is not an element node.
|
||||
*
|
||||
* @since Mini-XML 2.7@
|
||||
*/
|
||||
|
||||
const char * /* O - Element name or NULL */
|
||||
mxmlGetElement(mxml_node_t *node) /* I - Node to get */
|
||||
{
|
||||
/*
|
||||
* Range check input...
|
||||
*/
|
||||
|
||||
if (!node || node->type != MXML_ELEMENT)
|
||||
return (NULL);
|
||||
|
||||
/*
|
||||
* Return the element name...
|
||||
*/
|
||||
|
||||
return (node->value.element.name);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'mxmlGetFirstChild()' - Get the first child of an element node.
|
||||
*
|
||||
* @code NULL@ is returned if the node is not an element node or if the node
|
||||
* has no children.
|
||||
*
|
||||
* @since Mini-XML 2.7@
|
||||
*/
|
||||
|
||||
mxml_node_t * /* O - First child or NULL */
|
||||
mxmlGetFirstChild(mxml_node_t *node) /* I - Node to get */
|
||||
{
|
||||
/*
|
||||
* Range check input...
|
||||
*/
|
||||
|
||||
if (!node || node->type != MXML_ELEMENT)
|
||||
return (NULL);
|
||||
|
||||
/*
|
||||
* Return the first child node...
|
||||
*/
|
||||
|
||||
return (node->child);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'mxmlGetInteger()' - Get the integer value from the specified node or its
|
||||
* first child.
|
||||
*
|
||||
* 0 is returned if the node (or its first child) is not an integer value node.
|
||||
*
|
||||
* @since Mini-XML 2.7@
|
||||
*/
|
||||
|
||||
int /* O - Integer value or 0 */
|
||||
mxmlGetInteger(mxml_node_t *node) /* I - Node to get */
|
||||
{
|
||||
/*
|
||||
* Range check input...
|
||||
*/
|
||||
|
||||
if (!node)
|
||||
return (0);
|
||||
|
||||
/*
|
||||
* Return the integer value...
|
||||
*/
|
||||
|
||||
if (node->type == MXML_INTEGER)
|
||||
return (node->value.integer);
|
||||
else if (node->type == MXML_ELEMENT &&
|
||||
node->child &&
|
||||
node->child->type == MXML_INTEGER)
|
||||
return (node->child->value.integer);
|
||||
else
|
||||
return (0);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'mxmlGetLastChild()' - Get the last child of an element node.
|
||||
*
|
||||
* @code NULL@ is returned if the node is not an element node or if the node
|
||||
* has no children.
|
||||
*
|
||||
* @since Mini-XML 2.7@
|
||||
*/
|
||||
|
||||
mxml_node_t * /* O - Last child or NULL */
|
||||
mxmlGetLastChild(mxml_node_t *node) /* I - Node to get */
|
||||
{
|
||||
/*
|
||||
* Range check input...
|
||||
*/
|
||||
|
||||
if (!node || node->type != MXML_ELEMENT)
|
||||
return (NULL);
|
||||
|
||||
/*
|
||||
* Return the node type...
|
||||
*/
|
||||
|
||||
return (node->last_child);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'mxmlGetNextSibling()' - Get the next node for the current parent.
|
||||
*
|
||||
* @code NULL@ is returned if this is the last child for the current parent.
|
||||
*
|
||||
* @since Mini-XML 2.7@
|
||||
*/
|
||||
|
||||
mxml_node_t *
|
||||
mxmlGetNextSibling(mxml_node_t *node) /* I - Node to get */
|
||||
{
|
||||
/*
|
||||
* Range check input...
|
||||
*/
|
||||
|
||||
if (!node)
|
||||
return (NULL);
|
||||
|
||||
/*
|
||||
* Return the node type...
|
||||
*/
|
||||
|
||||
return (node->next);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'mxmlGetOpaque()' - Get an opaque string value for a node or its first child.
|
||||
*
|
||||
* @code NULL@ is returned if the node (or its first child) is not an opaque
|
||||
* value node.
|
||||
*
|
||||
* @since Mini-XML 2.7@
|
||||
*/
|
||||
|
||||
const char * /* O - Opaque string or NULL */
|
||||
mxmlGetOpaque(mxml_node_t *node) /* I - Node to get */
|
||||
{
|
||||
/*
|
||||
* Range check input...
|
||||
*/
|
||||
|
||||
if (!node)
|
||||
return (NULL);
|
||||
|
||||
/*
|
||||
* Return the integer value...
|
||||
*/
|
||||
|
||||
if (node->type == MXML_OPAQUE)
|
||||
return (node->value.opaque);
|
||||
else if (node->type == MXML_ELEMENT &&
|
||||
node->child &&
|
||||
node->child->type == MXML_OPAQUE)
|
||||
return (node->child->value.opaque);
|
||||
else
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'mxmlGetParent()' - Get the parent node.
|
||||
*
|
||||
* @code NULL@ is returned for a root node.
|
||||
*
|
||||
* @since Mini-XML 2.7@
|
||||
*/
|
||||
|
||||
mxml_node_t * /* O - Parent node or NULL */
|
||||
mxmlGetParent(mxml_node_t *node) /* I - Node to get */
|
||||
{
|
||||
/*
|
||||
* Range check input...
|
||||
*/
|
||||
|
||||
if (!node)
|
||||
return (NULL);
|
||||
|
||||
/*
|
||||
* Return the node type...
|
||||
*/
|
||||
|
||||
return (node->parent);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'mxmlGetPrevSibling()' - Get the previous node for the current parent.
|
||||
*
|
||||
* @code NULL@ is returned if this is the first child for the current parent.
|
||||
*
|
||||
* @since Mini-XML 2.7@
|
||||
*/
|
||||
|
||||
mxml_node_t * /* O - Previous node or NULL */
|
||||
mxmlGetPrevSibling(mxml_node_t *node) /* I - Node to get */
|
||||
{
|
||||
/*
|
||||
* Range check input...
|
||||
*/
|
||||
|
||||
if (!node)
|
||||
return (NULL);
|
||||
|
||||
/*
|
||||
* Return the node type...
|
||||
*/
|
||||
|
||||
return (node->prev);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'mxmlGetReal()' - Get the real value for a node or its first child.
|
||||
*
|
||||
* 0.0 is returned if the node (or its first child) is not a real value node.
|
||||
*
|
||||
* @since Mini-XML 2.7@
|
||||
*/
|
||||
|
||||
double /* O - Real value or 0.0 */
|
||||
mxmlGetReal(mxml_node_t *node) /* I - Node to get */
|
||||
{
|
||||
/*
|
||||
* Range check input...
|
||||
*/
|
||||
|
||||
if (!node)
|
||||
return (0.0);
|
||||
|
||||
/*
|
||||
* Return the integer value...
|
||||
*/
|
||||
|
||||
if (node->type == MXML_REAL)
|
||||
return (node->value.real);
|
||||
else if (node->type == MXML_ELEMENT &&
|
||||
node->child &&
|
||||
node->child->type == MXML_REAL)
|
||||
return (node->child->value.real);
|
||||
else
|
||||
return (0.0);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'mxmlGetText()' - Get the text value for a node or its first child.
|
||||
*
|
||||
* @code NULL@ is returned if the node (or its first child) is not a text node.
|
||||
* The "whitespace" argument can be NULL.
|
||||
*
|
||||
* @since Mini-XML 2.7@
|
||||
*/
|
||||
|
||||
const char * /* O - Text string or NULL */
|
||||
mxmlGetText(mxml_node_t *node, /* I - Node to get */
|
||||
int *whitespace) /* O - 1 if string is preceded by whitespace, 0 otherwise */
|
||||
{
|
||||
/*
|
||||
* Range check input...
|
||||
*/
|
||||
|
||||
if (!node)
|
||||
{
|
||||
if (whitespace)
|
||||
*whitespace = 0;
|
||||
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
/*
|
||||
* Return the integer value...
|
||||
*/
|
||||
|
||||
if (node->type == MXML_TEXT)
|
||||
{
|
||||
if (whitespace)
|
||||
*whitespace = node->value.text.whitespace;
|
||||
|
||||
return (node->value.text.string);
|
||||
}
|
||||
else if (node->type == MXML_ELEMENT &&
|
||||
node->child &&
|
||||
node->child->type == MXML_TEXT)
|
||||
{
|
||||
if (whitespace)
|
||||
*whitespace = node->child->value.text.whitespace;
|
||||
|
||||
return (node->child->value.text.string);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (whitespace)
|
||||
*whitespace = 0;
|
||||
|
||||
return (NULL);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'mxmlGetType()' - Get the node type.
|
||||
*
|
||||
* @code MXML_IGNORE@ is returned if "node" is @code NULL@.
|
||||
*
|
||||
* @since Mini-XML 2.7@
|
||||
*/
|
||||
|
||||
mxml_type_t /* O - Type of node */
|
||||
mxmlGetType(mxml_node_t *node) /* I - Node to get */
|
||||
{
|
||||
/*
|
||||
* Range check input...
|
||||
*/
|
||||
|
||||
if (!node)
|
||||
return (MXML_IGNORE);
|
||||
|
||||
/*
|
||||
* Return the node type...
|
||||
*/
|
||||
|
||||
return (node->type);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'mxmlGetUserData()' - Get the user data pointer for a node.
|
||||
*
|
||||
* @since Mini-XML 2.7@
|
||||
*/
|
||||
|
||||
void * /* O - User data pointer */
|
||||
mxmlGetUserData(mxml_node_t *node) /* I - Node to get */
|
||||
{
|
||||
/*
|
||||
* Range check input...
|
||||
*/
|
||||
|
||||
if (!node)
|
||||
return (NULL);
|
||||
|
||||
/*
|
||||
* Return the user data pointer...
|
||||
*/
|
||||
|
||||
return (node->user_data);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* End of "$Id: mxml-get.c 427 2011-01-03 02:03:29Z mike $".
|
||||
*/
|
||||
662
ogl_editor/src/External/mxml/mxml-index.c
vendored
Normal file
662
ogl_editor/src/External/mxml/mxml-index.c
vendored
Normal file
@ -0,0 +1,662 @@
|
||||
/*
|
||||
* "$Id: mxml-index.c 426 2011-01-01 23:42:17Z mike $"
|
||||
*
|
||||
* Index support code for Mini-XML, a small XML-like file parsing library.
|
||||
*
|
||||
* Copyright 2003-2011 by Michael R Sweet.
|
||||
*
|
||||
* These coded instructions, statements, and computer programs are the
|
||||
* property of Michael R Sweet and are protected by Federal copyright
|
||||
* law. Distribution and use rights are outlined in the file "COPYING"
|
||||
* which should have been included with this file. If this file is
|
||||
* missing or damaged, see the license at:
|
||||
*
|
||||
* http://www.minixml.org/
|
||||
*
|
||||
* Contents:
|
||||
*
|
||||
*/
|
||||
|
||||
/*
|
||||
* Include necessary headers...
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
#include "mxml.h"
|
||||
|
||||
|
||||
/*
|
||||
* Sort functions...
|
||||
*/
|
||||
|
||||
static int index_compare(mxml_index_t *ind, mxml_node_t *first,
|
||||
mxml_node_t *second);
|
||||
static int index_find(mxml_index_t *ind, const char *element,
|
||||
const char *value, mxml_node_t *node);
|
||||
static void index_sort(mxml_index_t *ind, int left, int right);
|
||||
|
||||
|
||||
/*
|
||||
* 'mxmlIndexDelete()' - Delete an index.
|
||||
*/
|
||||
|
||||
void
|
||||
mxmlIndexDelete(mxml_index_t *ind) /* I - Index to delete */
|
||||
{
|
||||
/*
|
||||
* Range check input..
|
||||
*/
|
||||
|
||||
if (!ind)
|
||||
return;
|
||||
|
||||
/*
|
||||
* Free memory...
|
||||
*/
|
||||
|
||||
if (ind->attr)
|
||||
free(ind->attr);
|
||||
|
||||
if (ind->alloc_nodes)
|
||||
free(ind->nodes);
|
||||
|
||||
free(ind);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'mxmlIndexEnum()' - Return the next node in the index.
|
||||
*
|
||||
* Nodes are returned in the sorted order of the index.
|
||||
*/
|
||||
|
||||
mxml_node_t * /* O - Next node or NULL if there is none */
|
||||
mxmlIndexEnum(mxml_index_t *ind) /* I - Index to enumerate */
|
||||
{
|
||||
/*
|
||||
* Range check input...
|
||||
*/
|
||||
|
||||
if (!ind)
|
||||
return (NULL);
|
||||
|
||||
/*
|
||||
* Return the next node...
|
||||
*/
|
||||
|
||||
if (ind->cur_node < ind->num_nodes)
|
||||
return (ind->nodes[ind->cur_node ++]);
|
||||
else
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'mxmlIndexFind()' - Find the next matching node.
|
||||
*
|
||||
* You should call mxmlIndexReset() prior to using this function for
|
||||
* the first time with a particular set of "element" and "value"
|
||||
* strings. Passing NULL for both "element" and "value" is equivalent
|
||||
* to calling mxmlIndexEnum().
|
||||
*/
|
||||
|
||||
mxml_node_t * /* O - Node or NULL if none found */
|
||||
mxmlIndexFind(mxml_index_t *ind, /* I - Index to search */
|
||||
const char *element, /* I - Element name to find, if any */
|
||||
const char *value) /* I - Attribute value, if any */
|
||||
{
|
||||
int diff, /* Difference between names */
|
||||
current, /* Current entity in search */
|
||||
first, /* First entity in search */
|
||||
last; /* Last entity in search */
|
||||
|
||||
|
||||
#ifdef DEBUG
|
||||
printf("mxmlIndexFind(ind=%p, element=\"%s\", value=\"%s\")\n",
|
||||
ind, element ? element : "(null)", value ? value : "(null)");
|
||||
#endif /* DEBUG */
|
||||
|
||||
/*
|
||||
* Range check input...
|
||||
*/
|
||||
|
||||
if (!ind || (!ind->attr && value))
|
||||
{
|
||||
#ifdef DEBUG
|
||||
puts(" returning NULL...");
|
||||
printf(" ind->attr=\"%s\"\n", ind->attr ? ind->attr : "(null)");
|
||||
#endif /* DEBUG */
|
||||
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
/*
|
||||
* If both element and value are NULL, just enumerate the nodes in the
|
||||
* index...
|
||||
*/
|
||||
|
||||
if (!element && !value)
|
||||
return (mxmlIndexEnum(ind));
|
||||
|
||||
/*
|
||||
* If there are no nodes in the index, return NULL...
|
||||
*/
|
||||
|
||||
if (!ind->num_nodes)
|
||||
{
|
||||
#ifdef DEBUG
|
||||
puts(" returning NULL...");
|
||||
puts(" no nodes!");
|
||||
#endif /* DEBUG */
|
||||
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
/*
|
||||
* If cur_node == 0, then find the first matching node...
|
||||
*/
|
||||
|
||||
if (ind->cur_node == 0)
|
||||
{
|
||||
/*
|
||||
* Find the first node using a modified binary search algorithm...
|
||||
*/
|
||||
|
||||
first = 0;
|
||||
last = ind->num_nodes - 1;
|
||||
|
||||
#ifdef DEBUG
|
||||
printf(" find first time, num_nodes=%d...\n", ind->num_nodes);
|
||||
#endif /* DEBUG */
|
||||
|
||||
while ((last - first) > 1)
|
||||
{
|
||||
current = (first + last) / 2;
|
||||
|
||||
#ifdef DEBUG
|
||||
printf(" first=%d, last=%d, current=%d\n", first, last, current);
|
||||
#endif /* DEBUG */
|
||||
|
||||
if ((diff = index_find(ind, element, value, ind->nodes[current])) == 0)
|
||||
{
|
||||
/*
|
||||
* Found a match, move back to find the first...
|
||||
*/
|
||||
|
||||
#ifdef DEBUG
|
||||
puts(" match!");
|
||||
#endif /* DEBUG */
|
||||
|
||||
while (current > 0 &&
|
||||
!index_find(ind, element, value, ind->nodes[current - 1]))
|
||||
current --;
|
||||
|
||||
#ifdef DEBUG
|
||||
printf(" returning first match=%d\n", current);
|
||||
#endif /* DEBUG */
|
||||
|
||||
/*
|
||||
* Return the first match and save the index to the next...
|
||||
*/
|
||||
|
||||
ind->cur_node = current + 1;
|
||||
|
||||
return (ind->nodes[current]);
|
||||
}
|
||||
else if (diff < 0)
|
||||
last = current;
|
||||
else
|
||||
first = current;
|
||||
|
||||
#ifdef DEBUG
|
||||
printf(" diff=%d\n", diff);
|
||||
#endif /* DEBUG */
|
||||
}
|
||||
|
||||
/*
|
||||
* If we get this far, then we found exactly 0 or 1 matches...
|
||||
*/
|
||||
|
||||
for (current = first; current <= last; current ++)
|
||||
if (!index_find(ind, element, value, ind->nodes[current]))
|
||||
{
|
||||
/*
|
||||
* Found exactly one (or possibly two) match...
|
||||
*/
|
||||
|
||||
#ifdef DEBUG
|
||||
printf(" returning only match %d...\n", current);
|
||||
#endif /* DEBUG */
|
||||
|
||||
ind->cur_node = current + 1;
|
||||
|
||||
return (ind->nodes[current]);
|
||||
}
|
||||
|
||||
/*
|
||||
* No matches...
|
||||
*/
|
||||
|
||||
ind->cur_node = ind->num_nodes;
|
||||
|
||||
#ifdef DEBUG
|
||||
puts(" returning NULL...");
|
||||
#endif /* DEBUG */
|
||||
|
||||
return (NULL);
|
||||
}
|
||||
else if (ind->cur_node < ind->num_nodes &&
|
||||
!index_find(ind, element, value, ind->nodes[ind->cur_node]))
|
||||
{
|
||||
/*
|
||||
* Return the next matching node...
|
||||
*/
|
||||
|
||||
#ifdef DEBUG
|
||||
printf(" returning next match %d...\n", ind->cur_node);
|
||||
#endif /* DEBUG */
|
||||
|
||||
return (ind->nodes[ind->cur_node ++]);
|
||||
}
|
||||
|
||||
/*
|
||||
* If we get this far, then we have no matches...
|
||||
*/
|
||||
|
||||
ind->cur_node = ind->num_nodes;
|
||||
|
||||
#ifdef DEBUG
|
||||
puts(" returning NULL...");
|
||||
#endif /* DEBUG */
|
||||
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'mxmlIndexGetCount()' - Get the number of nodes in an index.
|
||||
*
|
||||
* @since Mini-XML 2.7@
|
||||
*/
|
||||
|
||||
int /* I - Number of nodes in index */
|
||||
mxmlIndexGetCount(mxml_index_t *ind) /* I - Index of nodes */
|
||||
{
|
||||
/*
|
||||
* Range check input...
|
||||
*/
|
||||
|
||||
if (!ind)
|
||||
return (0);
|
||||
|
||||
/*
|
||||
* Return the number of nodes in the index...
|
||||
*/
|
||||
|
||||
return (ind->num_nodes);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'mxmlIndexNew()' - Create a new index.
|
||||
*
|
||||
* The index will contain all nodes that contain the named element and/or
|
||||
* attribute. If both "element" and "attr" are NULL, then the index will
|
||||
* contain a sorted list of the elements in the node tree. Nodes are
|
||||
* sorted by element name and optionally by attribute value if the "attr"
|
||||
* argument is not NULL.
|
||||
*/
|
||||
|
||||
mxml_index_t * /* O - New index */
|
||||
mxmlIndexNew(mxml_node_t *node, /* I - XML node tree */
|
||||
const char *element, /* I - Element to index or NULL for all */
|
||||
const char *attr) /* I - Attribute to index or NULL for none */
|
||||
{
|
||||
mxml_index_t *ind; /* New index */
|
||||
mxml_node_t *current, /* Current node in index */
|
||||
**temp; /* Temporary node pointer array */
|
||||
|
||||
|
||||
/*
|
||||
* Range check input...
|
||||
*/
|
||||
|
||||
#ifdef DEBUG
|
||||
printf("mxmlIndexNew(node=%p, element=\"%s\", attr=\"%s\")\n",
|
||||
node, element ? element : "(null)", attr ? attr : "(null)");
|
||||
#endif /* DEBUG */
|
||||
|
||||
if (!node)
|
||||
return (NULL);
|
||||
|
||||
/*
|
||||
* Create a new index...
|
||||
*/
|
||||
|
||||
if ((ind = calloc(1, sizeof(mxml_index_t))) == NULL)
|
||||
{
|
||||
mxml_error("Unable to allocate %d bytes for index - %s",
|
||||
sizeof(mxml_index_t), strerror(errno));
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
if (attr)
|
||||
ind->attr = strdup(attr);
|
||||
|
||||
if (!element && !attr)
|
||||
current = node;
|
||||
else
|
||||
current = mxmlFindElement(node, node, element, attr, NULL, MXML_DESCEND);
|
||||
|
||||
while (current)
|
||||
{
|
||||
if (ind->num_nodes >= ind->alloc_nodes)
|
||||
{
|
||||
if (!ind->alloc_nodes)
|
||||
temp = malloc(64 * sizeof(mxml_node_t *));
|
||||
else
|
||||
temp = realloc(ind->nodes, (ind->alloc_nodes + 64) * sizeof(mxml_node_t *));
|
||||
|
||||
if (!temp)
|
||||
{
|
||||
/*
|
||||
* Unable to allocate memory for the index, so abort...
|
||||
*/
|
||||
|
||||
mxml_error("Unable to allocate %d bytes for index: %s",
|
||||
(ind->alloc_nodes + 64) * sizeof(mxml_node_t *),
|
||||
strerror(errno));
|
||||
|
||||
mxmlIndexDelete(ind);
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
ind->nodes = temp;
|
||||
ind->alloc_nodes += 64;
|
||||
}
|
||||
|
||||
ind->nodes[ind->num_nodes ++] = current;
|
||||
|
||||
current = mxmlFindElement(current, node, element, attr, NULL, MXML_DESCEND);
|
||||
}
|
||||
|
||||
/*
|
||||
* Sort nodes based upon the search criteria...
|
||||
*/
|
||||
|
||||
#ifdef DEBUG
|
||||
{
|
||||
int i; /* Looping var */
|
||||
|
||||
|
||||
printf("%d node(s) in index.\n\n", ind->num_nodes);
|
||||
|
||||
if (attr)
|
||||
{
|
||||
printf("Node Address Element %s\n", attr);
|
||||
puts("-------- -------- -------------- ------------------------------");
|
||||
|
||||
for (i = 0; i < ind->num_nodes; i ++)
|
||||
printf("%8d %-8p %-14.14s %s\n", i, ind->nodes[i],
|
||||
ind->nodes[i]->value.element.name,
|
||||
mxmlElementGetAttr(ind->nodes[i], attr));
|
||||
}
|
||||
else
|
||||
{
|
||||
puts("Node Address Element");
|
||||
puts("-------- -------- --------------");
|
||||
|
||||
for (i = 0; i < ind->num_nodes; i ++)
|
||||
printf("%8d %-8p %s\n", i, ind->nodes[i],
|
||||
ind->nodes[i]->value.element.name);
|
||||
}
|
||||
|
||||
putchar('\n');
|
||||
}
|
||||
#endif /* DEBUG */
|
||||
|
||||
if (ind->num_nodes > 1)
|
||||
index_sort(ind, 0, ind->num_nodes - 1);
|
||||
|
||||
#ifdef DEBUG
|
||||
{
|
||||
int i; /* Looping var */
|
||||
|
||||
|
||||
puts("After sorting:\n");
|
||||
|
||||
if (attr)
|
||||
{
|
||||
printf("Node Address Element %s\n", attr);
|
||||
puts("-------- -------- -------------- ------------------------------");
|
||||
|
||||
for (i = 0; i < ind->num_nodes; i ++)
|
||||
printf("%8d %-8p %-14.14s %s\n", i, ind->nodes[i],
|
||||
ind->nodes[i]->value.element.name,
|
||||
mxmlElementGetAttr(ind->nodes[i], attr));
|
||||
}
|
||||
else
|
||||
{
|
||||
puts("Node Address Element");
|
||||
puts("-------- -------- --------------");
|
||||
|
||||
for (i = 0; i < ind->num_nodes; i ++)
|
||||
printf("%8d %-8p %s\n", i, ind->nodes[i],
|
||||
ind->nodes[i]->value.element.name);
|
||||
}
|
||||
|
||||
putchar('\n');
|
||||
}
|
||||
#endif /* DEBUG */
|
||||
|
||||
/*
|
||||
* Return the new index...
|
||||
*/
|
||||
|
||||
return (ind);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'mxmlIndexReset()' - Reset the enumeration/find pointer in the index and
|
||||
* return the first node in the index.
|
||||
*
|
||||
* This function should be called prior to using mxmlIndexEnum() or
|
||||
* mxmlIndexFind() for the first time.
|
||||
*/
|
||||
|
||||
mxml_node_t * /* O - First node or NULL if there is none */
|
||||
mxmlIndexReset(mxml_index_t *ind) /* I - Index to reset */
|
||||
{
|
||||
#ifdef DEBUG
|
||||
printf("mxmlIndexReset(ind=%p)\n", ind);
|
||||
#endif /* DEBUG */
|
||||
|
||||
/*
|
||||
* Range check input...
|
||||
*/
|
||||
|
||||
if (!ind)
|
||||
return (NULL);
|
||||
|
||||
/*
|
||||
* Set the index to the first element...
|
||||
*/
|
||||
|
||||
ind->cur_node = 0;
|
||||
|
||||
/*
|
||||
* Return the first node...
|
||||
*/
|
||||
|
||||
if (ind->num_nodes)
|
||||
return (ind->nodes[0]);
|
||||
else
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'index_compare()' - Compare two nodes.
|
||||
*/
|
||||
|
||||
static int /* O - Result of comparison */
|
||||
index_compare(mxml_index_t *ind, /* I - Index */
|
||||
mxml_node_t *first, /* I - First node */
|
||||
mxml_node_t *second) /* I - Second node */
|
||||
{
|
||||
int diff; /* Difference */
|
||||
|
||||
|
||||
/*
|
||||
* Check the element name...
|
||||
*/
|
||||
|
||||
if ((diff = strcmp(first->value.element.name,
|
||||
second->value.element.name)) != 0)
|
||||
return (diff);
|
||||
|
||||
/*
|
||||
* Check the attribute value...
|
||||
*/
|
||||
|
||||
if (ind->attr)
|
||||
{
|
||||
if ((diff = strcmp(mxmlElementGetAttr(first, ind->attr),
|
||||
mxmlElementGetAttr(second, ind->attr))) != 0)
|
||||
return (diff);
|
||||
}
|
||||
|
||||
/*
|
||||
* No difference, return 0...
|
||||
*/
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'index_find()' - Compare a node with index values.
|
||||
*/
|
||||
|
||||
static int /* O - Result of comparison */
|
||||
index_find(mxml_index_t *ind, /* I - Index */
|
||||
const char *element, /* I - Element name or NULL */
|
||||
const char *value, /* I - Attribute value or NULL */
|
||||
mxml_node_t *node) /* I - Node */
|
||||
{
|
||||
int diff; /* Difference */
|
||||
|
||||
|
||||
/*
|
||||
* Check the element name...
|
||||
*/
|
||||
|
||||
if (element)
|
||||
{
|
||||
if ((diff = strcmp(element, node->value.element.name)) != 0)
|
||||
return (diff);
|
||||
}
|
||||
|
||||
/*
|
||||
* Check the attribute value...
|
||||
*/
|
||||
|
||||
if (value)
|
||||
{
|
||||
if ((diff = strcmp(value, mxmlElementGetAttr(node, ind->attr))) != 0)
|
||||
return (diff);
|
||||
}
|
||||
|
||||
/*
|
||||
* No difference, return 0...
|
||||
*/
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'index_sort()' - Sort the nodes in the index...
|
||||
*
|
||||
* This function implements the classic quicksort algorithm...
|
||||
*/
|
||||
|
||||
static void
|
||||
index_sort(mxml_index_t *ind, /* I - Index to sort */
|
||||
int left, /* I - Left node in partition */
|
||||
int right) /* I - Right node in partition */
|
||||
{
|
||||
mxml_node_t *pivot, /* Pivot node */
|
||||
*temp; /* Swap node */
|
||||
int templ, /* Temporary left node */
|
||||
tempr; /* Temporary right node */
|
||||
|
||||
|
||||
/*
|
||||
* Loop until we have sorted all the way to the right...
|
||||
*/
|
||||
|
||||
do
|
||||
{
|
||||
/*
|
||||
* Sort the pivot in the current partition...
|
||||
*/
|
||||
|
||||
pivot = ind->nodes[left];
|
||||
|
||||
for (templ = left, tempr = right; templ < tempr;)
|
||||
{
|
||||
/*
|
||||
* Move left while left node <= pivot node...
|
||||
*/
|
||||
|
||||
while ((templ < right) &&
|
||||
index_compare(ind, ind->nodes[templ], pivot) <= 0)
|
||||
templ ++;
|
||||
|
||||
/*
|
||||
* Move right while right node > pivot node...
|
||||
*/
|
||||
|
||||
while ((tempr > left) &&
|
||||
index_compare(ind, ind->nodes[tempr], pivot) > 0)
|
||||
tempr --;
|
||||
|
||||
/*
|
||||
* Swap nodes if needed...
|
||||
*/
|
||||
|
||||
if (templ < tempr)
|
||||
{
|
||||
temp = ind->nodes[templ];
|
||||
ind->nodes[templ] = ind->nodes[tempr];
|
||||
ind->nodes[tempr] = temp;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* When we get here, the right (tempr) node is the new position for the
|
||||
* pivot node...
|
||||
*/
|
||||
|
||||
if (index_compare(ind, pivot, ind->nodes[tempr]) > 0)
|
||||
{
|
||||
ind->nodes[left] = ind->nodes[tempr];
|
||||
ind->nodes[tempr] = pivot;
|
||||
}
|
||||
|
||||
/*
|
||||
* Recursively sort the left partition as needed...
|
||||
*/
|
||||
|
||||
if (left < (tempr - 1))
|
||||
index_sort(ind, left, tempr - 1);
|
||||
}
|
||||
while (right > (left = tempr + 1));
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* End of "$Id: mxml-index.c 426 2011-01-01 23:42:17Z mike $".
|
||||
*/
|
||||
807
ogl_editor/src/External/mxml/mxml-node.c
vendored
Normal file
807
ogl_editor/src/External/mxml/mxml-node.c
vendored
Normal file
@ -0,0 +1,807 @@
|
||||
/*
|
||||
* "$Id: mxml-node.c 436 2011-01-22 01:02:05Z mike $"
|
||||
*
|
||||
* Node support code for Mini-XML, a small XML-like file parsing library.
|
||||
*
|
||||
* Copyright 2003-2011 by Michael R Sweet.
|
||||
*
|
||||
* These coded instructions, statements, and computer programs are the
|
||||
* property of Michael R Sweet and are protected by Federal copyright
|
||||
* law. Distribution and use rights are outlined in the file "COPYING"
|
||||
* which should have been included with this file. If this file is
|
||||
* missing or damaged, see the license at:
|
||||
*
|
||||
* http://www.minixml.org/
|
||||
*
|
||||
* Contents:
|
||||
*
|
||||
* mxmlAdd() - Add a node to a tree.
|
||||
* mxmlDelete() - Delete a node and all of its children.
|
||||
* mxmlGetRefCount() - Get the current reference (use) count for a node.
|
||||
* mxmlNewCDATA() - Create a new CDATA node.
|
||||
* mxmlNewCustom() - Create a new custom data node.
|
||||
* mxmlNewElement() - Create a new element node.
|
||||
* mxmlNewInteger() - Create a new integer node.
|
||||
* mxmlNewOpaque() - Create a new opaque string.
|
||||
* mxmlNewReal() - Create a new real number node.
|
||||
* mxmlNewText() - Create a new text fragment node.
|
||||
* mxmlNewTextf() - Create a new formatted text fragment node.
|
||||
* mxmlRemove() - Remove a node from its parent.
|
||||
* mxmlNewXML() - Create a new XML document tree.
|
||||
* mxmlRelease() - Release a node.
|
||||
* mxmlRetain() - Retain a node.
|
||||
* mxml_new() - Create a new node.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Include necessary headers...
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
#include "mxml.h"
|
||||
|
||||
|
||||
/*
|
||||
* Local functions...
|
||||
*/
|
||||
|
||||
static mxml_node_t *mxml_new(mxml_node_t *parent, mxml_type_t type);
|
||||
|
||||
|
||||
/*
|
||||
* 'mxmlAdd()' - Add a node to a tree.
|
||||
*
|
||||
* Adds the specified node to the parent. If the child argument is not
|
||||
* NULL, puts the new node before or after the specified child depending
|
||||
* on the value of the where argument. If the child argument is NULL,
|
||||
* puts the new node at the beginning of the child list (MXML_ADD_BEFORE)
|
||||
* or at the end of the child list (MXML_ADD_AFTER). The constant
|
||||
* MXML_ADD_TO_PARENT can be used to specify a NULL child pointer.
|
||||
*/
|
||||
|
||||
void
|
||||
mxmlAdd(mxml_node_t *parent, /* I - Parent node */
|
||||
int where, /* I - Where to add, MXML_ADD_BEFORE or MXML_ADD_AFTER */
|
||||
mxml_node_t *child, /* I - Child node for where or MXML_ADD_TO_PARENT */
|
||||
mxml_node_t *node) /* I - Node to add */
|
||||
{
|
||||
#ifdef DEBUG
|
||||
fprintf(stderr, "mxmlAdd(parent=%p, where=%d, child=%p, node=%p)\n", parent,
|
||||
where, child, node);
|
||||
#endif /* DEBUG */
|
||||
|
||||
/*
|
||||
* Range check input...
|
||||
*/
|
||||
|
||||
if (!parent || !node)
|
||||
return;
|
||||
|
||||
#if DEBUG > 1
|
||||
fprintf(stderr, " BEFORE: node->parent=%p\n", node->parent);
|
||||
if (parent)
|
||||
{
|
||||
fprintf(stderr, " BEFORE: parent->child=%p\n", parent->child);
|
||||
fprintf(stderr, " BEFORE: parent->last_child=%p\n", parent->last_child);
|
||||
fprintf(stderr, " BEFORE: parent->prev=%p\n", parent->prev);
|
||||
fprintf(stderr, " BEFORE: parent->next=%p\n", parent->next);
|
||||
}
|
||||
#endif /* DEBUG > 1 */
|
||||
|
||||
/*
|
||||
* Remove the node from any existing parent...
|
||||
*/
|
||||
|
||||
if (node->parent)
|
||||
mxmlRemove(node);
|
||||
|
||||
/*
|
||||
* Reset pointers...
|
||||
*/
|
||||
|
||||
node->parent = parent;
|
||||
|
||||
switch (where)
|
||||
{
|
||||
case MXML_ADD_BEFORE :
|
||||
if (!child || child == parent->child || child->parent != parent)
|
||||
{
|
||||
/*
|
||||
* Insert as first node under parent...
|
||||
*/
|
||||
|
||||
node->next = parent->child;
|
||||
|
||||
if (parent->child)
|
||||
parent->child->prev = node;
|
||||
else
|
||||
parent->last_child = node;
|
||||
|
||||
parent->child = node;
|
||||
}
|
||||
else
|
||||
{
|
||||
/*
|
||||
* Insert node before this child...
|
||||
*/
|
||||
|
||||
node->next = child;
|
||||
node->prev = child->prev;
|
||||
|
||||
if (child->prev)
|
||||
child->prev->next = node;
|
||||
else
|
||||
parent->child = node;
|
||||
|
||||
child->prev = node;
|
||||
}
|
||||
break;
|
||||
|
||||
case MXML_ADD_AFTER :
|
||||
if (!child || child == parent->last_child || child->parent != parent)
|
||||
{
|
||||
/*
|
||||
* Insert as last node under parent...
|
||||
*/
|
||||
|
||||
node->parent = parent;
|
||||
node->prev = parent->last_child;
|
||||
|
||||
if (parent->last_child)
|
||||
parent->last_child->next = node;
|
||||
else
|
||||
parent->child = node;
|
||||
|
||||
parent->last_child = node;
|
||||
}
|
||||
else
|
||||
{
|
||||
/*
|
||||
* Insert node after this child...
|
||||
*/
|
||||
|
||||
node->prev = child;
|
||||
node->next = child->next;
|
||||
|
||||
if (child->next)
|
||||
child->next->prev = node;
|
||||
else
|
||||
parent->last_child = node;
|
||||
|
||||
child->next = node;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
#if DEBUG > 1
|
||||
fprintf(stderr, " AFTER: node->parent=%p\n", node->parent);
|
||||
if (parent)
|
||||
{
|
||||
fprintf(stderr, " AFTER: parent->child=%p\n", parent->child);
|
||||
fprintf(stderr, " AFTER: parent->last_child=%p\n", parent->last_child);
|
||||
fprintf(stderr, " AFTER: parent->prev=%p\n", parent->prev);
|
||||
fprintf(stderr, " AFTER: parent->next=%p\n", parent->next);
|
||||
}
|
||||
#endif /* DEBUG > 1 */
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'mxmlDelete()' - Delete a node and all of its children.
|
||||
*
|
||||
* If the specified node has a parent, this function first removes the
|
||||
* node from its parent using the mxmlRemove() function.
|
||||
*/
|
||||
|
||||
void
|
||||
mxmlDelete(mxml_node_t *node) /* I - Node to delete */
|
||||
{
|
||||
int i; /* Looping var */
|
||||
|
||||
|
||||
#ifdef DEBUG
|
||||
fprintf(stderr, "mxmlDelete(node=%p)\n", node);
|
||||
#endif /* DEBUG */
|
||||
|
||||
/*
|
||||
* Range check input...
|
||||
*/
|
||||
|
||||
if (!node)
|
||||
return;
|
||||
|
||||
/*
|
||||
* Remove the node from its parent, if any...
|
||||
*/
|
||||
|
||||
mxmlRemove(node);
|
||||
|
||||
/*
|
||||
* Delete children...
|
||||
*/
|
||||
|
||||
while (node->child)
|
||||
mxmlDelete(node->child);
|
||||
|
||||
/*
|
||||
* Now delete any node data...
|
||||
*/
|
||||
|
||||
switch (node->type)
|
||||
{
|
||||
case MXML_ELEMENT :
|
||||
if (node->value.element.name)
|
||||
free(node->value.element.name);
|
||||
|
||||
if (node->value.element.num_attrs)
|
||||
{
|
||||
for (i = 0; i < node->value.element.num_attrs; i ++)
|
||||
{
|
||||
if (node->value.element.attrs[i].name)
|
||||
free(node->value.element.attrs[i].name);
|
||||
if (node->value.element.attrs[i].value)
|
||||
free(node->value.element.attrs[i].value);
|
||||
}
|
||||
|
||||
free(node->value.element.attrs);
|
||||
}
|
||||
break;
|
||||
case MXML_INTEGER :
|
||||
/* Nothing to do */
|
||||
break;
|
||||
case MXML_OPAQUE :
|
||||
if (node->value.opaque)
|
||||
free(node->value.opaque);
|
||||
break;
|
||||
case MXML_REAL :
|
||||
/* Nothing to do */
|
||||
break;
|
||||
case MXML_TEXT :
|
||||
if (node->value.text.string)
|
||||
free(node->value.text.string);
|
||||
break;
|
||||
case MXML_CUSTOM :
|
||||
if (node->value.custom.data &&
|
||||
node->value.custom.destroy)
|
||||
(*(node->value.custom.destroy))(node->value.custom.data);
|
||||
break;
|
||||
default :
|
||||
break;
|
||||
}
|
||||
|
||||
/*
|
||||
* Free this node...
|
||||
*/
|
||||
|
||||
free(node);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'mxmlGetRefCount()' - Get the current reference (use) count for a node.
|
||||
*
|
||||
* The initial reference count of new nodes is 1. Use the @link mxmlRetain@
|
||||
* and @link mxmlRelease@ functions to increment and decrement a node's
|
||||
* reference count.
|
||||
*
|
||||
* @since Mini-XML 2.7@.
|
||||
*/
|
||||
|
||||
int /* O - Reference count */
|
||||
mxmlGetRefCount(mxml_node_t *node) /* I - Node */
|
||||
{
|
||||
/*
|
||||
* Range check input...
|
||||
*/
|
||||
|
||||
if (!node)
|
||||
return (0);
|
||||
|
||||
/*
|
||||
* Return the reference count...
|
||||
*/
|
||||
|
||||
return (node->ref_count);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'mxmlNewCDATA()' - Create a new CDATA node.
|
||||
*
|
||||
* The new CDATA node is added to the end of the specified parent's child
|
||||
* list. The constant MXML_NO_PARENT can be used to specify that the new
|
||||
* CDATA node has no parent. The data string must be nul-terminated and
|
||||
* is copied into the new node. CDATA nodes use the MXML_ELEMENT type.
|
||||
*
|
||||
* @since Mini-XML 2.3@
|
||||
*/
|
||||
|
||||
mxml_node_t * /* O - New node */
|
||||
mxmlNewCDATA(mxml_node_t *parent, /* I - Parent node or MXML_NO_PARENT */
|
||||
const char *data) /* I - Data string */
|
||||
{
|
||||
mxml_node_t *node; /* New node */
|
||||
|
||||
|
||||
#ifdef DEBUG
|
||||
fprintf(stderr, "mxmlNewCDATA(parent=%p, data=\"%s\")\n",
|
||||
parent, data ? data : "(null)");
|
||||
#endif /* DEBUG */
|
||||
|
||||
/*
|
||||
* Range check input...
|
||||
*/
|
||||
|
||||
if (!data)
|
||||
return (NULL);
|
||||
|
||||
/*
|
||||
* Create the node and set the name value...
|
||||
*/
|
||||
|
||||
if ((node = mxml_new(parent, MXML_ELEMENT)) != NULL)
|
||||
node->value.element.name = _mxml_strdupf("![CDATA[%s]]", data);
|
||||
|
||||
return (node);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'mxmlNewCustom()' - Create a new custom data node.
|
||||
*
|
||||
* The new custom node is added to the end of the specified parent's child
|
||||
* list. The constant MXML_NO_PARENT can be used to specify that the new
|
||||
* element node has no parent. NULL can be passed when the data in the
|
||||
* node is not dynamically allocated or is separately managed.
|
||||
*
|
||||
* @since Mini-XML 2.1@
|
||||
*/
|
||||
|
||||
mxml_node_t * /* O - New node */
|
||||
mxmlNewCustom(
|
||||
mxml_node_t *parent, /* I - Parent node or MXML_NO_PARENT */
|
||||
void *data, /* I - Pointer to data */
|
||||
mxml_custom_destroy_cb_t destroy) /* I - Function to destroy data */
|
||||
{
|
||||
mxml_node_t *node; /* New node */
|
||||
|
||||
|
||||
#ifdef DEBUG
|
||||
fprintf(stderr, "mxmlNewCustom(parent=%p, data=%p, destroy=%p)\n", parent,
|
||||
data, destroy);
|
||||
#endif /* DEBUG */
|
||||
|
||||
/*
|
||||
* Create the node and set the value...
|
||||
*/
|
||||
|
||||
if ((node = mxml_new(parent, MXML_CUSTOM)) != NULL)
|
||||
{
|
||||
node->value.custom.data = data;
|
||||
node->value.custom.destroy = destroy;
|
||||
}
|
||||
|
||||
return (node);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'mxmlNewElement()' - Create a new element node.
|
||||
*
|
||||
* The new element node is added to the end of the specified parent's child
|
||||
* list. The constant MXML_NO_PARENT can be used to specify that the new
|
||||
* element node has no parent.
|
||||
*/
|
||||
|
||||
mxml_node_t * /* O - New node */
|
||||
mxmlNewElement(mxml_node_t *parent, /* I - Parent node or MXML_NO_PARENT */
|
||||
const char *name) /* I - Name of element */
|
||||
{
|
||||
mxml_node_t *node; /* New node */
|
||||
|
||||
|
||||
#ifdef DEBUG
|
||||
fprintf(stderr, "mxmlNewElement(parent=%p, name=\"%s\")\n", parent,
|
||||
name ? name : "(null)");
|
||||
#endif /* DEBUG */
|
||||
|
||||
/*
|
||||
* Range check input...
|
||||
*/
|
||||
|
||||
if (!name)
|
||||
return (NULL);
|
||||
|
||||
/*
|
||||
* Create the node and set the element name...
|
||||
*/
|
||||
|
||||
if ((node = mxml_new(parent, MXML_ELEMENT)) != NULL)
|
||||
node->value.element.name = strdup(name);
|
||||
|
||||
return (node);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'mxmlNewInteger()' - Create a new integer node.
|
||||
*
|
||||
* The new integer node is added to the end of the specified parent's child
|
||||
* list. The constant MXML_NO_PARENT can be used to specify that the new
|
||||
* integer node has no parent.
|
||||
*/
|
||||
|
||||
mxml_node_t * /* O - New node */
|
||||
mxmlNewInteger(mxml_node_t *parent, /* I - Parent node or MXML_NO_PARENT */
|
||||
int integer) /* I - Integer value */
|
||||
{
|
||||
mxml_node_t *node; /* New node */
|
||||
|
||||
|
||||
#ifdef DEBUG
|
||||
fprintf(stderr, "mxmlNewInteger(parent=%p, integer=%d)\n", parent, integer);
|
||||
#endif /* DEBUG */
|
||||
|
||||
/*
|
||||
* Create the node and set the element name...
|
||||
*/
|
||||
|
||||
if ((node = mxml_new(parent, MXML_INTEGER)) != NULL)
|
||||
node->value.integer = integer;
|
||||
|
||||
return (node);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'mxmlNewOpaque()' - Create a new opaque string.
|
||||
*
|
||||
* The new opaque node is added to the end of the specified parent's child
|
||||
* list. The constant MXML_NO_PARENT can be used to specify that the new
|
||||
* opaque node has no parent. The opaque string must be nul-terminated and
|
||||
* is copied into the new node.
|
||||
*/
|
||||
|
||||
mxml_node_t * /* O - New node */
|
||||
mxmlNewOpaque(mxml_node_t *parent, /* I - Parent node or MXML_NO_PARENT */
|
||||
const char *opaque) /* I - Opaque string */
|
||||
{
|
||||
mxml_node_t *node; /* New node */
|
||||
|
||||
|
||||
#ifdef DEBUG
|
||||
fprintf(stderr, "mxmlNewOpaque(parent=%p, opaque=\"%s\")\n", parent,
|
||||
opaque ? opaque : "(null)");
|
||||
#endif /* DEBUG */
|
||||
|
||||
/*
|
||||
* Range check input...
|
||||
*/
|
||||
|
||||
if (!opaque)
|
||||
return (NULL);
|
||||
|
||||
/*
|
||||
* Create the node and set the element name...
|
||||
*/
|
||||
|
||||
if ((node = mxml_new(parent, MXML_OPAQUE)) != NULL)
|
||||
node->value.opaque = strdup(opaque);
|
||||
|
||||
return (node);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'mxmlNewReal()' - Create a new real number node.
|
||||
*
|
||||
* The new real number node is added to the end of the specified parent's
|
||||
* child list. The constant MXML_NO_PARENT can be used to specify that
|
||||
* the new real number node has no parent.
|
||||
*/
|
||||
|
||||
mxml_node_t * /* O - New node */
|
||||
mxmlNewReal(mxml_node_t *parent, /* I - Parent node or MXML_NO_PARENT */
|
||||
double real) /* I - Real number value */
|
||||
{
|
||||
mxml_node_t *node; /* New node */
|
||||
|
||||
|
||||
#ifdef DEBUG
|
||||
fprintf(stderr, "mxmlNewReal(parent=%p, real=%g)\n", parent, real);
|
||||
#endif /* DEBUG */
|
||||
|
||||
/*
|
||||
* Create the node and set the element name...
|
||||
*/
|
||||
|
||||
if ((node = mxml_new(parent, MXML_REAL)) != NULL)
|
||||
node->value.real = real;
|
||||
|
||||
return (node);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'mxmlNewText()' - Create a new text fragment node.
|
||||
*
|
||||
* The new text node is added to the end of the specified parent's child
|
||||
* list. The constant MXML_NO_PARENT can be used to specify that the new
|
||||
* text node has no parent. The whitespace parameter is used to specify
|
||||
* whether leading whitespace is present before the node. The text
|
||||
* string must be nul-terminated and is copied into the new node.
|
||||
*/
|
||||
|
||||
mxml_node_t * /* O - New node */
|
||||
mxmlNewText(mxml_node_t *parent, /* I - Parent node or MXML_NO_PARENT */
|
||||
int whitespace, /* I - 1 = leading whitespace, 0 = no whitespace */
|
||||
const char *string) /* I - String */
|
||||
{
|
||||
mxml_node_t *node; /* New node */
|
||||
|
||||
|
||||
#ifdef DEBUG
|
||||
fprintf(stderr, "mxmlNewText(parent=%p, whitespace=%d, string=\"%s\")\n",
|
||||
parent, whitespace, string ? string : "(null)");
|
||||
#endif /* DEBUG */
|
||||
|
||||
/*
|
||||
* Range check input...
|
||||
*/
|
||||
|
||||
if (!string)
|
||||
return (NULL);
|
||||
|
||||
/*
|
||||
* Create the node and set the text value...
|
||||
*/
|
||||
|
||||
if ((node = mxml_new(parent, MXML_TEXT)) != NULL)
|
||||
{
|
||||
node->value.text.whitespace = whitespace;
|
||||
node->value.text.string = strdup(string);
|
||||
}
|
||||
|
||||
return (node);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'mxmlNewTextf()' - Create a new formatted text fragment node.
|
||||
*
|
||||
* The new text node is added to the end of the specified parent's child
|
||||
* list. The constant MXML_NO_PARENT can be used to specify that the new
|
||||
* text node has no parent. The whitespace parameter is used to specify
|
||||
* whether leading whitespace is present before the node. The format
|
||||
* string must be nul-terminated and is formatted into the new node.
|
||||
*/
|
||||
|
||||
mxml_node_t * /* O - New node */
|
||||
mxmlNewTextf(mxml_node_t *parent, /* I - Parent node or MXML_NO_PARENT */
|
||||
int whitespace, /* I - 1 = leading whitespace, 0 = no whitespace */
|
||||
const char *format, /* I - Printf-style frmat string */
|
||||
...) /* I - Additional args as needed */
|
||||
{
|
||||
mxml_node_t *node; /* New node */
|
||||
va_list ap; /* Pointer to arguments */
|
||||
|
||||
|
||||
#ifdef DEBUG
|
||||
fprintf(stderr, "mxmlNewTextf(parent=%p, whitespace=%d, format=\"%s\", ...)\n",
|
||||
parent, whitespace, format ? format : "(null)");
|
||||
#endif /* DEBUG */
|
||||
|
||||
/*
|
||||
* Range check input...
|
||||
*/
|
||||
|
||||
if (!format)
|
||||
return (NULL);
|
||||
|
||||
/*
|
||||
* Create the node and set the text value...
|
||||
*/
|
||||
|
||||
if ((node = mxml_new(parent, MXML_TEXT)) != NULL)
|
||||
{
|
||||
va_start(ap, format);
|
||||
|
||||
node->value.text.whitespace = whitespace;
|
||||
node->value.text.string = _mxml_vstrdupf(format, ap);
|
||||
|
||||
va_end(ap);
|
||||
}
|
||||
|
||||
return (node);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'mxmlRemove()' - Remove a node from its parent.
|
||||
*
|
||||
* Does not free memory used by the node - use mxmlDelete() for that.
|
||||
* This function does nothing if the node has no parent.
|
||||
*/
|
||||
|
||||
void
|
||||
mxmlRemove(mxml_node_t *node) /* I - Node to remove */
|
||||
{
|
||||
#ifdef DEBUG
|
||||
fprintf(stderr, "mxmlRemove(node=%p)\n", node);
|
||||
#endif /* DEBUG */
|
||||
|
||||
/*
|
||||
* Range check input...
|
||||
*/
|
||||
|
||||
if (!node || !node->parent)
|
||||
return;
|
||||
|
||||
/*
|
||||
* Remove from parent...
|
||||
*/
|
||||
|
||||
#if DEBUG > 1
|
||||
fprintf(stderr, " BEFORE: node->parent=%p\n", node->parent);
|
||||
if (node->parent)
|
||||
{
|
||||
fprintf(stderr, " BEFORE: node->parent->child=%p\n", node->parent->child);
|
||||
fprintf(stderr, " BEFORE: node->parent->last_child=%p\n", node->parent->last_child);
|
||||
}
|
||||
fprintf(stderr, " BEFORE: node->child=%p\n", node->child);
|
||||
fprintf(stderr, " BEFORE: node->last_child=%p\n", node->last_child);
|
||||
fprintf(stderr, " BEFORE: node->prev=%p\n", node->prev);
|
||||
fprintf(stderr, " BEFORE: node->next=%p\n", node->next);
|
||||
#endif /* DEBUG > 1 */
|
||||
|
||||
if (node->prev)
|
||||
node->prev->next = node->next;
|
||||
else
|
||||
node->parent->child = node->next;
|
||||
|
||||
if (node->next)
|
||||
node->next->prev = node->prev;
|
||||
else
|
||||
node->parent->last_child = node->prev;
|
||||
|
||||
node->parent = NULL;
|
||||
node->prev = NULL;
|
||||
node->next = NULL;
|
||||
|
||||
#if DEBUG > 1
|
||||
fprintf(stderr, " AFTER: node->parent=%p\n", node->parent);
|
||||
if (node->parent)
|
||||
{
|
||||
fprintf(stderr, " AFTER: node->parent->child=%p\n", node->parent->child);
|
||||
fprintf(stderr, " AFTER: node->parent->last_child=%p\n", node->parent->last_child);
|
||||
}
|
||||
fprintf(stderr, " AFTER: node->child=%p\n", node->child);
|
||||
fprintf(stderr, " AFTER: node->last_child=%p\n", node->last_child);
|
||||
fprintf(stderr, " AFTER: node->prev=%p\n", node->prev);
|
||||
fprintf(stderr, " AFTER: node->next=%p\n", node->next);
|
||||
#endif /* DEBUG > 1 */
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'mxmlNewXML()' - Create a new XML document tree.
|
||||
*
|
||||
* The "version" argument specifies the version number to put in the
|
||||
* ?xml element node. If NULL, version 1.0 is assumed.
|
||||
*
|
||||
* @since Mini-XML 2.3@
|
||||
*/
|
||||
|
||||
mxml_node_t * /* O - New ?xml node */
|
||||
mxmlNewXML(const char *version) /* I - Version number to use */
|
||||
{
|
||||
char element[1024]; /* Element text */
|
||||
|
||||
|
||||
snprintf(element, sizeof(element), "?xml version=\"%s\" encoding=\"utf-8\"?",
|
||||
version ? version : "1.0");
|
||||
|
||||
return (mxmlNewElement(NULL, element));
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'mxmlRelease()' - Release a node.
|
||||
*
|
||||
* When the reference count reaches zero, the node (and any children)
|
||||
* is deleted via mxmlDelete().
|
||||
*
|
||||
* @since Mini-XML 2.3@
|
||||
*/
|
||||
|
||||
int /* O - New reference count */
|
||||
mxmlRelease(mxml_node_t *node) /* I - Node */
|
||||
{
|
||||
if (node)
|
||||
{
|
||||
if ((-- node->ref_count) <= 0)
|
||||
{
|
||||
mxmlDelete(node);
|
||||
return (0);
|
||||
}
|
||||
else
|
||||
return (node->ref_count);
|
||||
}
|
||||
else
|
||||
return (-1);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'mxmlRetain()' - Retain a node.
|
||||
*
|
||||
* @since Mini-XML 2.3@
|
||||
*/
|
||||
|
||||
int /* O - New reference count */
|
||||
mxmlRetain(mxml_node_t *node) /* I - Node */
|
||||
{
|
||||
if (node)
|
||||
return (++ node->ref_count);
|
||||
else
|
||||
return (-1);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'mxml_new()' - Create a new node.
|
||||
*/
|
||||
|
||||
static mxml_node_t * /* O - New node */
|
||||
mxml_new(mxml_node_t *parent, /* I - Parent node */
|
||||
mxml_type_t type) /* I - Node type */
|
||||
{
|
||||
mxml_node_t *node; /* New node */
|
||||
|
||||
|
||||
#if DEBUG > 1
|
||||
fprintf(stderr, "mxml_new(parent=%p, type=%d)\n", parent, type);
|
||||
#endif /* DEBUG > 1 */
|
||||
|
||||
/*
|
||||
* Allocate memory for the node...
|
||||
*/
|
||||
|
||||
if ((node = calloc(1, sizeof(mxml_node_t))) == NULL)
|
||||
{
|
||||
#if DEBUG > 1
|
||||
fputs(" returning NULL\n", stderr);
|
||||
#endif /* DEBUG > 1 */
|
||||
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
#if DEBUG > 1
|
||||
fprintf(stderr, " returning %p\n", node);
|
||||
#endif /* DEBUG > 1 */
|
||||
|
||||
/*
|
||||
* Set the node type...
|
||||
*/
|
||||
|
||||
node->type = type;
|
||||
node->ref_count = 1;
|
||||
|
||||
/*
|
||||
* Add to the parent if present...
|
||||
*/
|
||||
|
||||
if (parent)
|
||||
mxmlAdd(parent, MXML_ADD_AFTER, MXML_ADD_TO_PARENT, node);
|
||||
|
||||
/*
|
||||
* Return the new node...
|
||||
*/
|
||||
|
||||
return (node);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* End of "$Id: mxml-node.c 436 2011-01-22 01:02:05Z mike $".
|
||||
*/
|
||||
331
ogl_editor/src/External/mxml/mxml-private.c
vendored
Normal file
331
ogl_editor/src/External/mxml/mxml-private.c
vendored
Normal file
@ -0,0 +1,331 @@
|
||||
/*
|
||||
* "$Id: mxml-private.c 422 2010-11-07 22:55:11Z mike $"
|
||||
*
|
||||
* Private functions for Mini-XML, a small XML-like file parsing library.
|
||||
*
|
||||
* Copyright 2003-2010 by Michael R Sweet.
|
||||
*
|
||||
* These coded instructions, statements, and computer programs are the
|
||||
* property of Michael R Sweet and are protected by Federal copyright
|
||||
* law. Distribution and use rights are outlined in the file "COPYING"
|
||||
* which should have been included with this file. If this file is
|
||||
* missing or damaged, see the license at:
|
||||
*
|
||||
* http://www.minixml.org/
|
||||
*
|
||||
* Contents:
|
||||
*
|
||||
* mxml_error() - Display an error message.
|
||||
* mxml_integer_cb() - Default callback for integer values.
|
||||
* mxml_opaque_cb() - Default callback for opaque values.
|
||||
* mxml_real_cb() - Default callback for real number values.
|
||||
* _mxml_global() - Get global data.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Include necessary headers...
|
||||
*/
|
||||
|
||||
#include "mxml-private.h"
|
||||
|
||||
|
||||
/*
|
||||
* Some crazy people think that unloading a shared object is a good or safe
|
||||
* thing to do. Unfortunately, most objects are simply *not* safe to unload
|
||||
* and bad things *will* happen.
|
||||
*
|
||||
* The following mess of conditional code allows us to provide a destructor
|
||||
* function in Mini-XML for our thread-global storage so that it can possibly
|
||||
* be unloaded safely, although since there is no standard way to do so I
|
||||
* can't even provide any guarantees that you can do it safely on all platforms.
|
||||
*
|
||||
* This code currently supports AIX, HP-UX, Linux, Mac OS X, Solaris, and
|
||||
* Windows. It might work on the BSDs and IRIX, but I haven't tested that.
|
||||
*/
|
||||
|
||||
#if defined(__sun) || defined(_AIX)
|
||||
# pragma fini(_mxml_fini)
|
||||
# define _MXML_FINI _mxml_fini
|
||||
#elif defined(__hpux)
|
||||
# pragma FINI _mxml_fini
|
||||
# define _MXML_FINI _mxml_fini
|
||||
#elif defined(__GNUC__) /* Linux and Mac OS X */
|
||||
# define _MXML_FINI __attribute((destructor)) _mxml_fini
|
||||
#else
|
||||
# define _MXML_FINI _fini
|
||||
#endif /* __sun */
|
||||
|
||||
|
||||
/*
|
||||
* 'mxml_error()' - Display an error message.
|
||||
*/
|
||||
|
||||
void
|
||||
mxml_error(const char *format, /* I - Printf-style format string */
|
||||
...) /* I - Additional arguments as needed */
|
||||
{
|
||||
va_list ap; /* Pointer to arguments */
|
||||
char s[1024]; /* Message string */
|
||||
_mxml_global_t *global = _mxml_global();
|
||||
/* Global data */
|
||||
|
||||
|
||||
/*
|
||||
* Range check input...
|
||||
*/
|
||||
|
||||
if (!format)
|
||||
return;
|
||||
|
||||
/*
|
||||
* Format the error message string...
|
||||
*/
|
||||
|
||||
va_start(ap, format);
|
||||
|
||||
vsnprintf(s, sizeof(s), format, ap);
|
||||
|
||||
va_end(ap);
|
||||
|
||||
/*
|
||||
* And then display the error message...
|
||||
*/
|
||||
|
||||
if (global->error_cb)
|
||||
(*global->error_cb)(s);
|
||||
else
|
||||
fprintf(stderr, "mxml: %s\n", s);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'mxml_ignore_cb()' - Default callback for ignored values.
|
||||
*/
|
||||
|
||||
mxml_type_t /* O - Node type */
|
||||
mxml_ignore_cb(mxml_node_t *node) /* I - Current node */
|
||||
{
|
||||
(void)node;
|
||||
|
||||
return (MXML_IGNORE);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'mxml_integer_cb()' - Default callback for integer values.
|
||||
*/
|
||||
|
||||
mxml_type_t /* O - Node type */
|
||||
mxml_integer_cb(mxml_node_t *node) /* I - Current node */
|
||||
{
|
||||
(void)node;
|
||||
|
||||
return (MXML_INTEGER);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'mxml_opaque_cb()' - Default callback for opaque values.
|
||||
*/
|
||||
|
||||
mxml_type_t /* O - Node type */
|
||||
mxml_opaque_cb(mxml_node_t *node) /* I - Current node */
|
||||
{
|
||||
(void)node;
|
||||
|
||||
return (MXML_OPAQUE);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'mxml_real_cb()' - Default callback for real number values.
|
||||
*/
|
||||
|
||||
mxml_type_t /* O - Node type */
|
||||
mxml_real_cb(mxml_node_t *node) /* I - Current node */
|
||||
{
|
||||
(void)node;
|
||||
|
||||
return (MXML_REAL);
|
||||
}
|
||||
|
||||
|
||||
#ifdef HAVE_PTHREAD_H /**** POSIX threading ****/
|
||||
# include <pthread.h>
|
||||
|
||||
static pthread_key_t _mxml_key = -1; /* Thread local storage key */
|
||||
static pthread_once_t _mxml_key_once = PTHREAD_ONCE_INIT;
|
||||
/* One-time initialization object */
|
||||
static void _mxml_init(void);
|
||||
static void _mxml_destructor(void *g);
|
||||
|
||||
|
||||
/*
|
||||
* '_mxml_destructor()' - Free memory used for globals...
|
||||
*/
|
||||
|
||||
static void
|
||||
_mxml_destructor(void *g) /* I - Global data */
|
||||
{
|
||||
free(g);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* '_mxml_fini()' - Clean up when unloaded.
|
||||
*/
|
||||
|
||||
static void
|
||||
_MXML_FINI(void)
|
||||
{
|
||||
_mxml_global_t *global; /* Global data */
|
||||
|
||||
|
||||
if (_mxml_key != -1)
|
||||
{
|
||||
if ((global = (_mxml_global_t *)pthread_getspecific(_mxml_key)) != NULL)
|
||||
_mxml_destructor(global);
|
||||
|
||||
pthread_key_delete(_mxml_key);
|
||||
_mxml_key = -1;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* '_mxml_global()' - Get global data.
|
||||
*/
|
||||
|
||||
_mxml_global_t * /* O - Global data */
|
||||
_mxml_global(void)
|
||||
{
|
||||
_mxml_global_t *global; /* Global data */
|
||||
|
||||
|
||||
pthread_once(&_mxml_key_once, _mxml_init);
|
||||
|
||||
if ((global = (_mxml_global_t *)pthread_getspecific(_mxml_key)) == NULL)
|
||||
{
|
||||
global = (_mxml_global_t *)calloc(1, sizeof(_mxml_global_t));
|
||||
pthread_setspecific(_mxml_key, global);
|
||||
|
||||
global->num_entity_cbs = 1;
|
||||
global->entity_cbs[0] = _mxml_entity_cb;
|
||||
global->wrap = 72;
|
||||
}
|
||||
|
||||
return (global);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* '_mxml_init()' - Initialize global data...
|
||||
*/
|
||||
|
||||
static void
|
||||
_mxml_init(void)
|
||||
{
|
||||
pthread_key_create(&_mxml_key, _mxml_destructor);
|
||||
}
|
||||
|
||||
|
||||
#elif defined(WIN32) && defined(MXML1_EXPORTS) /**** WIN32 threading ****/
|
||||
# include <windows.h>
|
||||
|
||||
static DWORD _mxml_tls_index; /* Index for global storage */
|
||||
|
||||
|
||||
/*
|
||||
* 'DllMain()' - Main entry for library.
|
||||
*/
|
||||
|
||||
BOOL WINAPI /* O - Success/failure */
|
||||
DllMain(HINSTANCE hinst, /* I - DLL module handle */
|
||||
DWORD reason, /* I - Reason */
|
||||
LPVOID reserved) /* I - Unused */
|
||||
{
|
||||
_mxml_global_t *global; /* Global data */
|
||||
|
||||
|
||||
(void)hinst;
|
||||
(void)reserved;
|
||||
|
||||
switch (reason)
|
||||
{
|
||||
case DLL_PROCESS_ATTACH : /* Called on library initialization */
|
||||
if ((_mxml_tls_index = TlsAlloc()) == TLS_OUT_OF_INDEXES)
|
||||
return (FALSE);
|
||||
break;
|
||||
|
||||
case DLL_THREAD_DETACH : /* Called when a thread terminates */
|
||||
if ((global = (_mxml_global_t *)TlsGetValue(_mxml_tls_index)) != NULL)
|
||||
free(global);
|
||||
break;
|
||||
|
||||
case DLL_PROCESS_DETACH : /* Called when library is unloaded */
|
||||
if ((global = (_mxml_global_t *)TlsGetValue(_mxml_tls_index)) != NULL)
|
||||
free(global);
|
||||
|
||||
TlsFree(_mxml_tls_index);
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
return (TRUE);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* '_mxml_global()' - Get global data.
|
||||
*/
|
||||
|
||||
_mxml_global_t * /* O - Global data */
|
||||
_mxml_global(void)
|
||||
{
|
||||
_mxml_global_t *global; /* Global data */
|
||||
|
||||
|
||||
if ((global = (_mxml_global_t *)TlsGetValue(_mxml_tls_index)) == NULL)
|
||||
{
|
||||
global = (_mxml_global_t *)calloc(1, sizeof(_mxml_global_t));
|
||||
|
||||
global->num_entity_cbs = 1;
|
||||
global->entity_cbs[0] = _mxml_entity_cb;
|
||||
global->wrap = 72;
|
||||
|
||||
TlsSetValue(_mxml_tls_index, (LPVOID)global);
|
||||
}
|
||||
|
||||
return (global);
|
||||
}
|
||||
|
||||
|
||||
#else /**** No threading ****/
|
||||
/*
|
||||
* '_mxml_global()' - Get global data.
|
||||
*/
|
||||
|
||||
_mxml_global_t * /* O - Global data */
|
||||
_mxml_global(void)
|
||||
{
|
||||
static _mxml_global_t global = /* Global data */
|
||||
{
|
||||
NULL, /* error_cb */
|
||||
1, /* num_entity_cbs */
|
||||
{ _mxml_entity_cb }, /* entity_cbs */
|
||||
72, /* wrap */
|
||||
NULL, /* custom_load_cb */
|
||||
NULL /* custom_save_cb */
|
||||
};
|
||||
|
||||
|
||||
return (&global);
|
||||
}
|
||||
#endif /* HAVE_PTHREAD_H */
|
||||
|
||||
|
||||
/*
|
||||
* End of "$Id: mxml-private.c 422 2010-11-07 22:55:11Z mike $".
|
||||
*/
|
||||
50
ogl_editor/src/External/mxml/mxml-private.h
vendored
Normal file
50
ogl_editor/src/External/mxml/mxml-private.h
vendored
Normal file
@ -0,0 +1,50 @@
|
||||
/*
|
||||
* "$Id: mxml-private.h 408 2010-09-19 05:26:46Z mike $"
|
||||
*
|
||||
* Private definitions for Mini-XML, a small XML-like file parsing library.
|
||||
*
|
||||
* Copyright 2003-2010 by Michael R Sweet.
|
||||
*
|
||||
* These coded instructions, statements, and computer programs are the
|
||||
* property of Michael R Sweet and are protected by Federal copyright
|
||||
* law. Distribution and use rights are outlined in the file "COPYING"
|
||||
* which should have been included with this file. If this file is
|
||||
* missing or damaged, see the license at:
|
||||
*
|
||||
* http://www.minixml.org/
|
||||
*/
|
||||
|
||||
/*
|
||||
* Include necessary headers...
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
#include "mxml.h"
|
||||
|
||||
|
||||
/*
|
||||
* Global, per-thread data...
|
||||
*/
|
||||
|
||||
typedef struct _mxml_global_s
|
||||
{
|
||||
void (*error_cb)(const char *);
|
||||
int num_entity_cbs;
|
||||
int (*entity_cbs[100])(const char *name);
|
||||
int wrap;
|
||||
mxml_custom_load_cb_t custom_load_cb;
|
||||
mxml_custom_save_cb_t custom_save_cb;
|
||||
} _mxml_global_t;
|
||||
|
||||
|
||||
/*
|
||||
* Functions...
|
||||
*/
|
||||
|
||||
extern _mxml_global_t *_mxml_global(void);
|
||||
extern int _mxml_entity_cb(const char *name);
|
||||
|
||||
|
||||
/*
|
||||
* End of "$Id: mxml-private.h 408 2010-09-19 05:26:46Z mike $".
|
||||
*/
|
||||
287
ogl_editor/src/External/mxml/mxml-search.c
vendored
Normal file
287
ogl_editor/src/External/mxml/mxml-search.c
vendored
Normal file
@ -0,0 +1,287 @@
|
||||
/*
|
||||
* "$Id: mxml-search.c 427 2011-01-03 02:03:29Z mike $"
|
||||
*
|
||||
* Search/navigation functions for Mini-XML, a small XML-like file
|
||||
* parsing library.
|
||||
*
|
||||
* Copyright 2003-2010 by Michael R Sweet.
|
||||
*
|
||||
* These coded instructions, statements, and computer programs are the
|
||||
* property of Michael R Sweet and are protected by Federal copyright
|
||||
* law. Distribution and use rights are outlined in the file "COPYING"
|
||||
* which should have been included with this file. If this file is
|
||||
* missing or damaged, see the license at:
|
||||
*
|
||||
* http://www.minixml.org/
|
||||
*
|
||||
* Contents:
|
||||
*
|
||||
* mxmlFindElement() - Find the named element.
|
||||
* mxmlFindValue() - Find a value with the given path.
|
||||
* mxmlWalkNext() - Walk to the next logical node in the tree.
|
||||
* mxmlWalkPrev() - Walk to the previous logical node in the tree.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Include necessary headers...
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
#include "mxml.h"
|
||||
|
||||
|
||||
/*
|
||||
* 'mxmlFindElement()' - Find the named element.
|
||||
*
|
||||
* The search is constrained by the name, attribute name, and value; any
|
||||
* NULL names or values are treated as wildcards, so different kinds of
|
||||
* searches can be implemented by looking for all elements of a given name
|
||||
* or all elements with a specific attribute. The descend argument determines
|
||||
* whether the search descends into child nodes; normally you will use
|
||||
* MXML_DESCEND_FIRST for the initial search and MXML_NO_DESCEND to find
|
||||
* additional direct descendents of the node. The top node argument
|
||||
* constrains the search to a particular node's children.
|
||||
*/
|
||||
|
||||
mxml_node_t * /* O - Element node or NULL */
|
||||
mxmlFindElement(mxml_node_t *node, /* I - Current node */
|
||||
mxml_node_t *top, /* I - Top node */
|
||||
const char *name, /* I - Element name or NULL for any */
|
||||
const char *attr, /* I - Attribute name, or NULL for none */
|
||||
const char *value, /* I - Attribute value, or NULL for any */
|
||||
int descend) /* I - Descend into tree - MXML_DESCEND, MXML_NO_DESCEND, or MXML_DESCEND_FIRST */
|
||||
{
|
||||
const char *temp; /* Current attribute value */
|
||||
|
||||
|
||||
/*
|
||||
* Range check input...
|
||||
*/
|
||||
|
||||
if (!node || !top || (!attr && value))
|
||||
return (NULL);
|
||||
|
||||
/*
|
||||
* Start with the next node...
|
||||
*/
|
||||
|
||||
node = mxmlWalkNext(node, top, descend);
|
||||
|
||||
/*
|
||||
* Loop until we find a matching element...
|
||||
*/
|
||||
|
||||
while (node != NULL)
|
||||
{
|
||||
/*
|
||||
* See if this node matches...
|
||||
*/
|
||||
|
||||
if (node->type == MXML_ELEMENT &&
|
||||
node->value.element.name &&
|
||||
(!name || !strcmp(node->value.element.name, name)))
|
||||
{
|
||||
/*
|
||||
* See if we need to check for an attribute...
|
||||
*/
|
||||
|
||||
if (!attr)
|
||||
return (node); /* No attribute search, return it... */
|
||||
|
||||
/*
|
||||
* Check for the attribute...
|
||||
*/
|
||||
|
||||
if ((temp = mxmlElementGetAttr(node, attr)) != NULL)
|
||||
{
|
||||
/*
|
||||
* OK, we have the attribute, does it match?
|
||||
*/
|
||||
|
||||
if (!value || !strcmp(value, temp))
|
||||
return (node); /* Yes, return it... */
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* No match, move on to the next node...
|
||||
*/
|
||||
|
||||
if (descend == MXML_DESCEND)
|
||||
node = mxmlWalkNext(node, top, MXML_DESCEND);
|
||||
else
|
||||
node = node->next;
|
||||
}
|
||||
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'mxmlFindPath()' - Find a node with the given path.
|
||||
*
|
||||
* The "path" is a slash-separated list of element names. The name "*" is
|
||||
* considered a wildcard for one or more levels of elements. For example,
|
||||
* "foo/one/two", "bar/two/one", "*\/one", and so forth.
|
||||
*
|
||||
* The first child node of the found node is returned if the given node has
|
||||
* children and the first child is a value node.
|
||||
*
|
||||
* @since Mini-XML 2.7@
|
||||
*/
|
||||
|
||||
mxml_node_t * /* O - Found node or NULL */
|
||||
mxmlFindPath(mxml_node_t *top, /* I - Top node */
|
||||
const char *path) /* I - Path to element */
|
||||
{
|
||||
mxml_node_t *node; /* Current node */
|
||||
char element[256]; /* Current element name */
|
||||
const char *pathsep; /* Separator in path */
|
||||
int descend; /* mxmlFindElement option */
|
||||
|
||||
|
||||
/*
|
||||
* Range check input...
|
||||
*/
|
||||
|
||||
if (!top || !path || !*path)
|
||||
return (NULL);
|
||||
|
||||
/*
|
||||
* Search each element in the path...
|
||||
*/
|
||||
|
||||
node = top;
|
||||
while (*path)
|
||||
{
|
||||
/*
|
||||
* Handle wildcards...
|
||||
*/
|
||||
|
||||
if (!strncmp(path, "*/", 2))
|
||||
{
|
||||
path += 2;
|
||||
descend = MXML_DESCEND;
|
||||
}
|
||||
else
|
||||
descend = MXML_DESCEND_FIRST;
|
||||
|
||||
/*
|
||||
* Get the next element in the path...
|
||||
*/
|
||||
|
||||
if ((pathsep = strchr(path, '/')) == NULL)
|
||||
pathsep = path + strlen(path);
|
||||
|
||||
if (pathsep == path || (pathsep - path) >= sizeof(element))
|
||||
return (NULL);
|
||||
|
||||
memcpy(element, path, pathsep - path);
|
||||
element[pathsep - path] = '\0';
|
||||
|
||||
if (*pathsep)
|
||||
path = pathsep + 1;
|
||||
else
|
||||
path = pathsep;
|
||||
|
||||
/*
|
||||
* Search for the element...
|
||||
*/
|
||||
|
||||
if ((node = mxmlFindElement(node, node, element, NULL, NULL,
|
||||
descend)) == NULL)
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
/*
|
||||
* If we get this far, return the node or its first child...
|
||||
*/
|
||||
|
||||
if (node->child && node->child->type != MXML_ELEMENT)
|
||||
return (node->child);
|
||||
else
|
||||
return (node);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'mxmlWalkNext()' - Walk to the next logical node in the tree.
|
||||
*
|
||||
* The descend argument controls whether the first child is considered
|
||||
* to be the next node. The top node argument constrains the walk to
|
||||
* the node's children.
|
||||
*/
|
||||
|
||||
mxml_node_t * /* O - Next node or NULL */
|
||||
mxmlWalkNext(mxml_node_t *node, /* I - Current node */
|
||||
mxml_node_t *top, /* I - Top node */
|
||||
int descend) /* I - Descend into tree - MXML_DESCEND, MXML_NO_DESCEND, or MXML_DESCEND_FIRST */
|
||||
{
|
||||
if (!node)
|
||||
return (NULL);
|
||||
else if (node->child && descend)
|
||||
return (node->child);
|
||||
else if (node == top)
|
||||
return (NULL);
|
||||
else if (node->next)
|
||||
return (node->next);
|
||||
else if (node->parent && node->parent != top)
|
||||
{
|
||||
node = node->parent;
|
||||
|
||||
while (!node->next)
|
||||
if (node->parent == top || !node->parent)
|
||||
return (NULL);
|
||||
else
|
||||
node = node->parent;
|
||||
|
||||
return (node->next);
|
||||
}
|
||||
else
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'mxmlWalkPrev()' - Walk to the previous logical node in the tree.
|
||||
*
|
||||
* The descend argument controls whether the previous node's last child
|
||||
* is considered to be the previous node. The top node argument constrains
|
||||
* the walk to the node's children.
|
||||
*/
|
||||
|
||||
mxml_node_t * /* O - Previous node or NULL */
|
||||
mxmlWalkPrev(mxml_node_t *node, /* I - Current node */
|
||||
mxml_node_t *top, /* I - Top node */
|
||||
int descend) /* I - Descend into tree - MXML_DESCEND, MXML_NO_DESCEND, or MXML_DESCEND_FIRST */
|
||||
{
|
||||
if (!node || node == top)
|
||||
return (NULL);
|
||||
else if (node->prev)
|
||||
{
|
||||
if (node->prev->last_child && descend)
|
||||
{
|
||||
/*
|
||||
* Find the last child under the previous node...
|
||||
*/
|
||||
|
||||
node = node->prev->last_child;
|
||||
|
||||
while (node->last_child)
|
||||
node = node->last_child;
|
||||
|
||||
return (node);
|
||||
}
|
||||
else
|
||||
return (node->prev);
|
||||
}
|
||||
else if (node->parent != top)
|
||||
return (node->parent);
|
||||
else
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* End of "$Id: mxml-search.c 427 2011-01-03 02:03:29Z mike $".
|
||||
*/
|
||||
349
ogl_editor/src/External/mxml/mxml-set.c
vendored
Normal file
349
ogl_editor/src/External/mxml/mxml-set.c
vendored
Normal file
@ -0,0 +1,349 @@
|
||||
/*
|
||||
* "$Id: mxml-set.c 441 2011-12-09 23:49:00Z mike $"
|
||||
*
|
||||
* Node set functions for Mini-XML, a small XML-like file parsing library.
|
||||
*
|
||||
* Copyright 2003-2011 by Michael R Sweet.
|
||||
*
|
||||
* These coded instructions, statements, and computer programs are the
|
||||
* property of Michael R Sweet and are protected by Federal copyright
|
||||
* law. Distribution and use rights are outlined in the file "COPYING"
|
||||
* which should have been included with this file. If this file is
|
||||
* missing or damaged, see the license at:
|
||||
*
|
||||
* http://www.minixml.org/
|
||||
*
|
||||
* Contents:
|
||||
*
|
||||
* mxmlSetCDATA() - Set the element name of a CDATA node.
|
||||
* mxmlSetCustom() - Set the data and destructor of a custom data node.
|
||||
* mxmlSetElement() - Set the name of an element node.
|
||||
* mxmlSetInteger() - Set the value of an integer node.
|
||||
* mxmlSetOpaque() - Set the value of an opaque node.
|
||||
* mxmlSetReal() - Set the value of a real number node.
|
||||
* mxmlSetText() - Set the value of a text node.
|
||||
* mxmlSetTextf() - Set the value of a text node to a formatted string.
|
||||
* mxmlSetUserData() - Set the user data pointer for a node.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Include necessary headers...
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
#include "mxml.h"
|
||||
|
||||
|
||||
/*
|
||||
* 'mxmlSetCDATA()' - Set the element name of a CDATA node.
|
||||
*
|
||||
* The node is not changed if it (or its first child) is not a CDATA element node.
|
||||
*
|
||||
* @since Mini-XML 2.3@
|
||||
*/
|
||||
|
||||
int /* O - 0 on success, -1 on failure */
|
||||
mxmlSetCDATA(mxml_node_t *node, /* I - Node to set */
|
||||
const char *data) /* I - New data string */
|
||||
{
|
||||
/*
|
||||
* Range check input...
|
||||
*/
|
||||
|
||||
if (node && node->type == MXML_ELEMENT &&
|
||||
strncmp(node->value.element.name, "![CDATA[", 8) &&
|
||||
node->child && node->child->type == MXML_ELEMENT &&
|
||||
!strncmp(node->child->value.element.name, "![CDATA[", 8))
|
||||
node = node->child;
|
||||
|
||||
if (!node || node->type != MXML_ELEMENT || !data ||
|
||||
strncmp(node->value.element.name, "![CDATA[", 8))
|
||||
return (-1);
|
||||
|
||||
/*
|
||||
* Free any old element value and set the new value...
|
||||
*/
|
||||
|
||||
if (node->value.element.name)
|
||||
free(node->value.element.name);
|
||||
|
||||
node->value.element.name = _mxml_strdupf("![CDATA[%s]]", data);
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'mxmlSetCustom()' - Set the data and destructor of a custom data node.
|
||||
*
|
||||
* The node is not changed if it (or its first child) is not a custom node.
|
||||
*
|
||||
* @since Mini-XML 2.1@
|
||||
*/
|
||||
|
||||
int /* O - 0 on success, -1 on failure */
|
||||
mxmlSetCustom(
|
||||
mxml_node_t *node, /* I - Node to set */
|
||||
void *data, /* I - New data pointer */
|
||||
mxml_custom_destroy_cb_t destroy) /* I - New destructor function */
|
||||
{
|
||||
/*
|
||||
* Range check input...
|
||||
*/
|
||||
|
||||
if (node && node->type == MXML_ELEMENT &&
|
||||
node->child && node->child->type == MXML_CUSTOM)
|
||||
node = node->child;
|
||||
|
||||
if (!node || node->type != MXML_CUSTOM)
|
||||
return (-1);
|
||||
|
||||
/*
|
||||
* Free any old element value and set the new value...
|
||||
*/
|
||||
|
||||
if (node->value.custom.data && node->value.custom.destroy)
|
||||
(*(node->value.custom.destroy))(node->value.custom.data);
|
||||
|
||||
node->value.custom.data = data;
|
||||
node->value.custom.destroy = destroy;
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'mxmlSetElement()' - Set the name of an element node.
|
||||
*
|
||||
* The node is not changed if it is not an element node.
|
||||
*/
|
||||
|
||||
int /* O - 0 on success, -1 on failure */
|
||||
mxmlSetElement(mxml_node_t *node, /* I - Node to set */
|
||||
const char *name) /* I - New name string */
|
||||
{
|
||||
/*
|
||||
* Range check input...
|
||||
*/
|
||||
|
||||
if (!node || node->type != MXML_ELEMENT || !name)
|
||||
return (-1);
|
||||
|
||||
/*
|
||||
* Free any old element value and set the new value...
|
||||
*/
|
||||
|
||||
if (node->value.element.name)
|
||||
free(node->value.element.name);
|
||||
|
||||
node->value.element.name = strdup(name);
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'mxmlSetInteger()' - Set the value of an integer node.
|
||||
*
|
||||
* The node is not changed if it (or its first child) is not an integer node.
|
||||
*/
|
||||
|
||||
int /* O - 0 on success, -1 on failure */
|
||||
mxmlSetInteger(mxml_node_t *node, /* I - Node to set */
|
||||
int integer) /* I - Integer value */
|
||||
{
|
||||
/*
|
||||
* Range check input...
|
||||
*/
|
||||
|
||||
if (node && node->type == MXML_ELEMENT &&
|
||||
node->child && node->child->type == MXML_INTEGER)
|
||||
node = node->child;
|
||||
|
||||
if (!node || node->type != MXML_INTEGER)
|
||||
return (-1);
|
||||
|
||||
/*
|
||||
* Set the new value and return...
|
||||
*/
|
||||
|
||||
node->value.integer = integer;
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'mxmlSetOpaque()' - Set the value of an opaque node.
|
||||
*
|
||||
* The node is not changed if it (or its first child) is not an opaque node.
|
||||
*/
|
||||
|
||||
int /* O - 0 on success, -1 on failure */
|
||||
mxmlSetOpaque(mxml_node_t *node, /* I - Node to set */
|
||||
const char *opaque) /* I - Opaque string */
|
||||
{
|
||||
/*
|
||||
* Range check input...
|
||||
*/
|
||||
|
||||
if (node && node->type == MXML_ELEMENT &&
|
||||
node->child && node->child->type == MXML_OPAQUE)
|
||||
node = node->child;
|
||||
|
||||
if (!node || node->type != MXML_OPAQUE || !opaque)
|
||||
return (-1);
|
||||
|
||||
/*
|
||||
* Free any old opaque value and set the new value...
|
||||
*/
|
||||
|
||||
if (node->value.opaque)
|
||||
free(node->value.opaque);
|
||||
|
||||
node->value.opaque = strdup(opaque);
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'mxmlSetReal()' - Set the value of a real number node.
|
||||
*
|
||||
* The node is not changed if it (or its first child) is not a real number node.
|
||||
*/
|
||||
|
||||
int /* O - 0 on success, -1 on failure */
|
||||
mxmlSetReal(mxml_node_t *node, /* I - Node to set */
|
||||
double real) /* I - Real number value */
|
||||
{
|
||||
/*
|
||||
* Range check input...
|
||||
*/
|
||||
|
||||
if (node && node->type == MXML_ELEMENT &&
|
||||
node->child && node->child->type == MXML_REAL)
|
||||
node = node->child;
|
||||
|
||||
if (!node || node->type != MXML_REAL)
|
||||
return (-1);
|
||||
|
||||
/*
|
||||
* Set the new value and return...
|
||||
*/
|
||||
|
||||
node->value.real = real;
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'mxmlSetText()' - Set the value of a text node.
|
||||
*
|
||||
* The node is not changed if it (or its first child) is not a text node.
|
||||
*/
|
||||
|
||||
int /* O - 0 on success, -1 on failure */
|
||||
mxmlSetText(mxml_node_t *node, /* I - Node to set */
|
||||
int whitespace, /* I - 1 = leading whitespace, 0 = no whitespace */
|
||||
const char *string) /* I - String */
|
||||
{
|
||||
/*
|
||||
* Range check input...
|
||||
*/
|
||||
|
||||
if (node && node->type == MXML_ELEMENT &&
|
||||
node->child && node->child->type == MXML_TEXT)
|
||||
node = node->child;
|
||||
|
||||
if (!node || node->type != MXML_TEXT || !string)
|
||||
return (-1);
|
||||
|
||||
/*
|
||||
* Free any old string value and set the new value...
|
||||
*/
|
||||
|
||||
if (node->value.text.string)
|
||||
free(node->value.text.string);
|
||||
|
||||
node->value.text.whitespace = whitespace;
|
||||
node->value.text.string = strdup(string);
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'mxmlSetTextf()' - Set the value of a text node to a formatted string.
|
||||
*
|
||||
* The node is not changed if it (or its first child) is not a text node.
|
||||
*/
|
||||
|
||||
int /* O - 0 on success, -1 on failure */
|
||||
mxmlSetTextf(mxml_node_t *node, /* I - Node to set */
|
||||
int whitespace, /* I - 1 = leading whitespace, 0 = no whitespace */
|
||||
const char *format, /* I - Printf-style format string */
|
||||
...) /* I - Additional arguments as needed */
|
||||
{
|
||||
va_list ap; /* Pointer to arguments */
|
||||
|
||||
|
||||
/*
|
||||
* Range check input...
|
||||
*/
|
||||
|
||||
if (node && node->type == MXML_ELEMENT &&
|
||||
node->child && node->child->type == MXML_TEXT)
|
||||
node = node->child;
|
||||
|
||||
if (!node || node->type != MXML_TEXT || !format)
|
||||
return (-1);
|
||||
|
||||
/*
|
||||
* Free any old string value and set the new value...
|
||||
*/
|
||||
|
||||
if (node->value.text.string)
|
||||
free(node->value.text.string);
|
||||
|
||||
va_start(ap, format);
|
||||
|
||||
node->value.text.whitespace = whitespace;
|
||||
node->value.text.string = _mxml_strdupf(format, ap);
|
||||
|
||||
va_end(ap);
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'mxmlSetUserData()' - Set the user data pointer for a node.
|
||||
*
|
||||
* @since Mini-XML 2.7@
|
||||
*/
|
||||
|
||||
int /* O - 0 on success, -1 on failure */
|
||||
mxmlSetUserData(mxml_node_t *node, /* I - Node to set */
|
||||
void *data) /* I - User data pointer */
|
||||
{
|
||||
/*
|
||||
* Range check input...
|
||||
*/
|
||||
|
||||
if (!node)
|
||||
return (-1);
|
||||
|
||||
/*
|
||||
* Set the user data pointer and return...
|
||||
*/
|
||||
|
||||
node->user_data = data;
|
||||
return (0);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* End of "$Id: mxml-set.c 441 2011-12-09 23:49:00Z mike $".
|
||||
*/
|
||||
476
ogl_editor/src/External/mxml/mxml-string.c
vendored
Normal file
476
ogl_editor/src/External/mxml/mxml-string.c
vendored
Normal file
@ -0,0 +1,476 @@
|
||||
/*
|
||||
* "$Id: mxml-string.c 424 2010-12-25 16:21:50Z mike $"
|
||||
*
|
||||
* String functions for Mini-XML, a small XML-like file parsing library.
|
||||
*
|
||||
* Copyright 2003-2010 by Michael R Sweet.
|
||||
*
|
||||
* These coded instructions, statements, and computer programs are the
|
||||
* property of Michael R Sweet and are protected by Federal copyright
|
||||
* law. Distribution and use rights are outlined in the file "COPYING"
|
||||
* which should have been included with this file. If this file is
|
||||
* missing or damaged, see the license at:
|
||||
*
|
||||
* http://www.minixml.org/
|
||||
*
|
||||
* Contents:
|
||||
*
|
||||
* _mxml_snprintf() - Format a string.
|
||||
* _mxml_strdup() - Duplicate a string.
|
||||
* _mxml_strdupf() - Format and duplicate a string.
|
||||
* _mxml_vsnprintf() - Format a string into a fixed size buffer.
|
||||
* _mxml_vstrdupf() - Format and duplicate a string.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Include necessary headers...
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
|
||||
|
||||
/*
|
||||
* The va_copy macro is part of C99, but many compilers don't implement it.
|
||||
* Provide a "direct assignment" implmentation when va_copy isn't defined...
|
||||
*/
|
||||
|
||||
#ifndef va_copy
|
||||
# ifdef __va_copy
|
||||
# define va_copy(dst,src) __va_copy(dst,src)
|
||||
# else
|
||||
# define va_copy(dst,src) memcpy(&dst, &src, sizeof(va_list))
|
||||
# endif /* __va_copy */
|
||||
#endif /* va_copy */
|
||||
|
||||
|
||||
#ifndef HAVE_SNPRINTF
|
||||
/*
|
||||
* '_mxml_snprintf()' - Format a string.
|
||||
*/
|
||||
|
||||
int /* O - Number of bytes formatted */
|
||||
_mxml_snprintf(char *buffer, /* I - Output buffer */
|
||||
size_t bufsize, /* I - Size of output buffer */
|
||||
const char *format, /* I - Printf-style format string */
|
||||
...) /* I - Additional arguments as needed */
|
||||
{
|
||||
va_list ap; /* Argument list */
|
||||
int bytes; /* Number of bytes formatted */
|
||||
|
||||
|
||||
va_start(ap, format);
|
||||
bytes = vsnprintf(buffer, bufsize, format, ap);
|
||||
va_end(ap);
|
||||
|
||||
return (bytes);
|
||||
}
|
||||
#endif /* !HAVE_SNPRINTF */
|
||||
|
||||
|
||||
/*
|
||||
* '_mxml_strdup()' - Duplicate a string.
|
||||
*/
|
||||
|
||||
#ifndef HAVE_STRDUP
|
||||
char * /* O - New string pointer */
|
||||
_mxml_strdup(const char *s) /* I - String to duplicate */
|
||||
{
|
||||
char *t; /* New string pointer */
|
||||
|
||||
|
||||
if (s == NULL)
|
||||
return (NULL);
|
||||
|
||||
if ((t = malloc(strlen(s) + 1)) == NULL)
|
||||
return (NULL);
|
||||
|
||||
return (strcpy(t, s));
|
||||
}
|
||||
#endif /* !HAVE_STRDUP */
|
||||
|
||||
|
||||
/*
|
||||
* '_mxml_strdupf()' - Format and duplicate a string.
|
||||
*/
|
||||
|
||||
char * /* O - New string pointer */
|
||||
_mxml_strdupf(const char *format, /* I - Printf-style format string */
|
||||
...) /* I - Additional arguments as needed */
|
||||
{
|
||||
va_list ap; /* Pointer to additional arguments */
|
||||
char *s; /* Pointer to formatted string */
|
||||
|
||||
|
||||
/*
|
||||
* Get a pointer to the additional arguments, format the string,
|
||||
* and return it...
|
||||
*/
|
||||
|
||||
va_start(ap, format);
|
||||
s = _mxml_vstrdupf(format, ap);
|
||||
va_end(ap);
|
||||
|
||||
return (s);
|
||||
}
|
||||
|
||||
|
||||
#ifndef HAVE_VSNPRINTF
|
||||
/*
|
||||
* '_mxml_vsnprintf()' - Format a string into a fixed size buffer.
|
||||
*/
|
||||
|
||||
int /* O - Number of bytes formatted */
|
||||
_mxml_vsnprintf(char *buffer, /* O - Output buffer */
|
||||
size_t bufsize, /* O - Size of output buffer */
|
||||
const char *format, /* I - Printf-style format string */
|
||||
va_list ap) /* I - Pointer to additional arguments */
|
||||
{
|
||||
char *bufptr, /* Pointer to position in buffer */
|
||||
*bufend, /* Pointer to end of buffer */
|
||||
sign, /* Sign of format width */
|
||||
size, /* Size character (h, l, L) */
|
||||
type; /* Format type character */
|
||||
int width, /* Width of field */
|
||||
prec; /* Number of characters of precision */
|
||||
char tformat[100], /* Temporary format string for sprintf() */
|
||||
*tptr, /* Pointer into temporary format */
|
||||
temp[1024]; /* Buffer for formatted numbers */
|
||||
char *s; /* Pointer to string */
|
||||
int slen; /* Length of string */
|
||||
int bytes; /* Total number of bytes needed */
|
||||
|
||||
|
||||
/*
|
||||
* Loop through the format string, formatting as needed...
|
||||
*/
|
||||
|
||||
bufptr = buffer;
|
||||
bufend = buffer + bufsize - 1;
|
||||
bytes = 0;
|
||||
|
||||
while (*format)
|
||||
{
|
||||
if (*format == '%')
|
||||
{
|
||||
tptr = tformat;
|
||||
*tptr++ = *format++;
|
||||
|
||||
if (*format == '%')
|
||||
{
|
||||
if (bufptr && bufptr < bufend) *bufptr++ = *format;
|
||||
bytes ++;
|
||||
format ++;
|
||||
continue;
|
||||
}
|
||||
else if (strchr(" -+#\'", *format))
|
||||
{
|
||||
*tptr++ = *format;
|
||||
sign = *format++;
|
||||
}
|
||||
else
|
||||
sign = 0;
|
||||
|
||||
if (*format == '*')
|
||||
{
|
||||
/*
|
||||
* Get width from argument...
|
||||
*/
|
||||
|
||||
format ++;
|
||||
width = va_arg(ap, int);
|
||||
|
||||
snprintf(tptr, sizeof(tformat) - (tptr - tformat), "%d", width);
|
||||
tptr += strlen(tptr);
|
||||
}
|
||||
else
|
||||
{
|
||||
width = 0;
|
||||
|
||||
while (isdigit(*format & 255))
|
||||
{
|
||||
if (tptr < (tformat + sizeof(tformat) - 1))
|
||||
*tptr++ = *format;
|
||||
|
||||
width = width * 10 + *format++ - '0';
|
||||
}
|
||||
}
|
||||
|
||||
if (*format == '.')
|
||||
{
|
||||
if (tptr < (tformat + sizeof(tformat) - 1))
|
||||
*tptr++ = *format;
|
||||
|
||||
format ++;
|
||||
|
||||
if (*format == '*')
|
||||
{
|
||||
/*
|
||||
* Get precision from argument...
|
||||
*/
|
||||
|
||||
format ++;
|
||||
prec = va_arg(ap, int);
|
||||
|
||||
snprintf(tptr, sizeof(tformat) - (tptr - tformat), "%d", prec);
|
||||
tptr += strlen(tptr);
|
||||
}
|
||||
else
|
||||
{
|
||||
prec = 0;
|
||||
|
||||
while (isdigit(*format & 255))
|
||||
{
|
||||
if (tptr < (tformat + sizeof(tformat) - 1))
|
||||
*tptr++ = *format;
|
||||
|
||||
prec = prec * 10 + *format++ - '0';
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
prec = -1;
|
||||
|
||||
if (*format == 'l' && format[1] == 'l')
|
||||
{
|
||||
size = 'L';
|
||||
|
||||
if (tptr < (tformat + sizeof(tformat) - 2))
|
||||
{
|
||||
*tptr++ = 'l';
|
||||
*tptr++ = 'l';
|
||||
}
|
||||
|
||||
format += 2;
|
||||
}
|
||||
else if (*format == 'h' || *format == 'l' || *format == 'L')
|
||||
{
|
||||
if (tptr < (tformat + sizeof(tformat) - 1))
|
||||
*tptr++ = *format;
|
||||
|
||||
size = *format++;
|
||||
}
|
||||
|
||||
if (!*format)
|
||||
break;
|
||||
|
||||
if (tptr < (tformat + sizeof(tformat) - 1))
|
||||
*tptr++ = *format;
|
||||
|
||||
type = *format++;
|
||||
*tptr = '\0';
|
||||
|
||||
switch (type)
|
||||
{
|
||||
case 'E' : /* Floating point formats */
|
||||
case 'G' :
|
||||
case 'e' :
|
||||
case 'f' :
|
||||
case 'g' :
|
||||
if ((width + 2) > sizeof(temp))
|
||||
break;
|
||||
|
||||
sprintf(temp, tformat, va_arg(ap, double));
|
||||
|
||||
bytes += strlen(temp);
|
||||
|
||||
if (bufptr)
|
||||
{
|
||||
if ((bufptr + strlen(temp)) > bufend)
|
||||
{
|
||||
strncpy(bufptr, temp, (size_t)(bufend - bufptr));
|
||||
bufptr = bufend;
|
||||
}
|
||||
else
|
||||
{
|
||||
strcpy(bufptr, temp);
|
||||
bufptr += strlen(temp);
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case 'B' : /* Integer formats */
|
||||
case 'X' :
|
||||
case 'b' :
|
||||
case 'd' :
|
||||
case 'i' :
|
||||
case 'o' :
|
||||
case 'u' :
|
||||
case 'x' :
|
||||
if ((width + 2) > sizeof(temp))
|
||||
break;
|
||||
|
||||
#ifdef HAVE_LONG_LONG
|
||||
if (size == 'L')
|
||||
sprintf(temp, tformat, va_arg(ap, long long));
|
||||
else
|
||||
#endif /* HAVE_LONG_LONG */
|
||||
sprintf(temp, tformat, va_arg(ap, int));
|
||||
|
||||
bytes += strlen(temp);
|
||||
|
||||
if (bufptr)
|
||||
{
|
||||
if ((bufptr + strlen(temp)) > bufend)
|
||||
{
|
||||
strncpy(bufptr, temp, (size_t)(bufend - bufptr));
|
||||
bufptr = bufend;
|
||||
}
|
||||
else
|
||||
{
|
||||
strcpy(bufptr, temp);
|
||||
bufptr += strlen(temp);
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case 'p' : /* Pointer value */
|
||||
if ((width + 2) > sizeof(temp))
|
||||
break;
|
||||
|
||||
sprintf(temp, tformat, va_arg(ap, void *));
|
||||
|
||||
bytes += strlen(temp);
|
||||
|
||||
if (bufptr)
|
||||
{
|
||||
if ((bufptr + strlen(temp)) > bufend)
|
||||
{
|
||||
strncpy(bufptr, temp, (size_t)(bufend - bufptr));
|
||||
bufptr = bufend;
|
||||
}
|
||||
else
|
||||
{
|
||||
strcpy(bufptr, temp);
|
||||
bufptr += strlen(temp);
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case 'c' : /* Character or character array */
|
||||
bytes += width;
|
||||
|
||||
if (bufptr)
|
||||
{
|
||||
if (width <= 1)
|
||||
*bufptr++ = va_arg(ap, int);
|
||||
else
|
||||
{
|
||||
if ((bufptr + width) > bufend)
|
||||
width = bufend - bufptr;
|
||||
|
||||
memcpy(bufptr, va_arg(ap, char *), (size_t)width);
|
||||
bufptr += width;
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case 's' : /* String */
|
||||
if ((s = va_arg(ap, char *)) == NULL)
|
||||
s = "(null)";
|
||||
|
||||
slen = strlen(s);
|
||||
if (slen > width && prec != width)
|
||||
width = slen;
|
||||
|
||||
bytes += width;
|
||||
|
||||
if (bufptr)
|
||||
{
|
||||
if ((bufptr + width) > bufend)
|
||||
width = bufend - bufptr;
|
||||
|
||||
if (slen > width)
|
||||
slen = width;
|
||||
|
||||
if (sign == '-')
|
||||
{
|
||||
strncpy(bufptr, s, (size_t)slen);
|
||||
memset(bufptr + slen, ' ', (size_t)(width - slen));
|
||||
}
|
||||
else
|
||||
{
|
||||
memset(bufptr, ' ', (size_t)(width - slen));
|
||||
strncpy(bufptr + width - slen, s, (size_t)slen);
|
||||
}
|
||||
|
||||
bufptr += width;
|
||||
}
|
||||
break;
|
||||
|
||||
case 'n' : /* Output number of chars so far */
|
||||
*(va_arg(ap, int *)) = bytes;
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
bytes ++;
|
||||
|
||||
if (bufptr && bufptr < bufend)
|
||||
*bufptr++ = *format;
|
||||
|
||||
format ++;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Nul-terminate the string and return the number of characters needed.
|
||||
*/
|
||||
|
||||
*bufptr = '\0';
|
||||
|
||||
return (bytes);
|
||||
}
|
||||
#endif /* !HAVE_VSNPRINTF */
|
||||
|
||||
|
||||
/*
|
||||
* '_mxml_vstrdupf()' - Format and duplicate a string.
|
||||
*/
|
||||
|
||||
char * /* O - New string pointer */
|
||||
_mxml_vstrdupf(const char *format, /* I - Printf-style format string */
|
||||
va_list ap) /* I - Pointer to additional arguments */
|
||||
{
|
||||
int bytes; /* Number of bytes required */
|
||||
char *buffer, /* String buffer */
|
||||
temp[256]; /* Small buffer for first vsnprintf */
|
||||
va_list apcopy; /* Copy of argument list */
|
||||
|
||||
|
||||
/*
|
||||
* First format with a tiny buffer; this will tell us how many bytes are
|
||||
* needed...
|
||||
*/
|
||||
|
||||
va_copy(apcopy, ap);
|
||||
bytes = vsnprintf(temp, sizeof(temp), format, apcopy);
|
||||
|
||||
if (bytes < sizeof(temp))
|
||||
{
|
||||
/*
|
||||
* Hey, the formatted string fits in the tiny buffer, so just dup that...
|
||||
*/
|
||||
|
||||
return (strdup(temp));
|
||||
}
|
||||
|
||||
/*
|
||||
* Allocate memory for the whole thing and reformat to the new, larger
|
||||
* buffer...
|
||||
*/
|
||||
|
||||
if ((buffer = calloc(1, bytes + 1)) != NULL)
|
||||
vsnprintf(buffer, bytes + 1, format, ap);
|
||||
|
||||
/*
|
||||
* Return the new string...
|
||||
*/
|
||||
|
||||
return (buffer);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* End of "$Id: mxml-string.c 424 2010-12-25 16:21:50Z mike $".
|
||||
*/
|
||||
329
ogl_editor/src/External/mxml/mxml.h
vendored
Normal file
329
ogl_editor/src/External/mxml/mxml.h
vendored
Normal file
@ -0,0 +1,329 @@
|
||||
/*
|
||||
* "$Id: mxml.h 427 2011-01-03 02:03:29Z mike $"
|
||||
*
|
||||
* Header file for Mini-XML, a small XML-like file parsing library.
|
||||
*
|
||||
* Copyright 2003-2011 by Michael R Sweet.
|
||||
*
|
||||
* These coded instructions, statements, and computer programs are the
|
||||
* property of Michael R Sweet and are protected by Federal copyright
|
||||
* law. Distribution and use rights are outlined in the file "COPYING"
|
||||
* which should have been included with this file. If this file is
|
||||
* missing or damaged, see the license at:
|
||||
*
|
||||
* http://www.minixml.org/
|
||||
*/
|
||||
|
||||
/*
|
||||
* Prevent multiple inclusion...
|
||||
*/
|
||||
|
||||
#ifndef _mxml_h_
|
||||
# define _mxml_h_
|
||||
|
||||
/*
|
||||
* Include necessary headers...
|
||||
*/
|
||||
|
||||
# include <stdio.h>
|
||||
# include <stdlib.h>
|
||||
# include <string.h>
|
||||
# include <ctype.h>
|
||||
# include <errno.h>
|
||||
|
||||
|
||||
/*
|
||||
* Constants...
|
||||
*/
|
||||
|
||||
# define MXML_TAB 8 /* Tabs every N columns */
|
||||
|
||||
# define MXML_NO_CALLBACK 0 /* Don't use a type callback */
|
||||
# define MXML_INTEGER_CALLBACK mxml_integer_cb
|
||||
/* Treat all data as integers */
|
||||
# define MXML_OPAQUE_CALLBACK mxml_opaque_cb
|
||||
/* Treat all data as opaque */
|
||||
# define MXML_REAL_CALLBACK mxml_real_cb
|
||||
/* Treat all data as real numbers */
|
||||
# define MXML_TEXT_CALLBACK 0 /* Treat all data as text */
|
||||
# define MXML_IGNORE_CALLBACK mxml_ignore_cb
|
||||
/* Ignore all non-element content */
|
||||
|
||||
# define MXML_NO_PARENT 0 /* No parent for the node */
|
||||
|
||||
# define MXML_DESCEND 1 /* Descend when finding/walking */
|
||||
# define MXML_NO_DESCEND 0 /* Don't descend when finding/walking */
|
||||
# define MXML_DESCEND_FIRST -1 /* Descend for first find */
|
||||
|
||||
# define MXML_WS_BEFORE_OPEN 0 /* Callback for before open tag */
|
||||
# define MXML_WS_AFTER_OPEN 1 /* Callback for after open tag */
|
||||
# define MXML_WS_BEFORE_CLOSE 2 /* Callback for before close tag */
|
||||
# define MXML_WS_AFTER_CLOSE 3 /* Callback for after close tag */
|
||||
|
||||
# define MXML_ADD_BEFORE 0 /* Add node before specified node */
|
||||
# define MXML_ADD_AFTER 1 /* Add node after specified node */
|
||||
# define MXML_ADD_TO_PARENT NULL /* Add node relative to parent */
|
||||
|
||||
|
||||
/*
|
||||
* Data types...
|
||||
*/
|
||||
|
||||
typedef enum mxml_sax_event_e /**** SAX event type. ****/
|
||||
{
|
||||
MXML_SAX_CDATA, /* CDATA node */
|
||||
MXML_SAX_COMMENT, /* Comment node */
|
||||
MXML_SAX_DATA, /* Data node */
|
||||
MXML_SAX_DIRECTIVE, /* Processing directive node */
|
||||
MXML_SAX_ELEMENT_CLOSE, /* Element closed */
|
||||
MXML_SAX_ELEMENT_OPEN /* Element opened */
|
||||
} mxml_sax_event_t;
|
||||
|
||||
typedef enum mxml_type_e /**** The XML node type. ****/
|
||||
{
|
||||
MXML_IGNORE = -1, /* Ignore/throw away node @since Mini-XML 2.3@ */
|
||||
MXML_ELEMENT, /* XML element with attributes */
|
||||
MXML_INTEGER, /* Integer value */
|
||||
MXML_OPAQUE, /* Opaque string */
|
||||
MXML_REAL, /* Real value */
|
||||
MXML_TEXT, /* Text fragment */
|
||||
MXML_CUSTOM /* Custom data @since Mini-XML 2.1@ */
|
||||
} mxml_type_t;
|
||||
|
||||
typedef void (*mxml_custom_destroy_cb_t)(void *);
|
||||
/**** Custom data destructor ****/
|
||||
|
||||
typedef void (*mxml_error_cb_t)(const char *);
|
||||
/**** Error callback function ****/
|
||||
|
||||
typedef struct mxml_attr_s /**** An XML element attribute value. @private@ ****/
|
||||
{
|
||||
char *name; /* Attribute name */
|
||||
char *value; /* Attribute value */
|
||||
} mxml_attr_t;
|
||||
|
||||
typedef struct mxml_element_s /**** An XML element value. @private@ ****/
|
||||
{
|
||||
char *name; /* Name of element */
|
||||
int num_attrs; /* Number of attributes */
|
||||
mxml_attr_t *attrs; /* Attributes */
|
||||
} mxml_element_t;
|
||||
|
||||
typedef struct mxml_text_s /**** An XML text value. @private@ ****/
|
||||
{
|
||||
int whitespace; /* Leading whitespace? */
|
||||
char *string; /* Fragment string */
|
||||
} mxml_text_t;
|
||||
|
||||
typedef struct mxml_custom_s /**** An XML custom value. @private@ ****/
|
||||
{
|
||||
void *data; /* Pointer to (allocated) custom data */
|
||||
mxml_custom_destroy_cb_t destroy; /* Pointer to destructor function */
|
||||
} mxml_custom_t;
|
||||
|
||||
typedef union mxml_value_u /**** An XML node value. @private@ ****/
|
||||
{
|
||||
mxml_element_t element; /* Element */
|
||||
int integer; /* Integer number */
|
||||
char *opaque; /* Opaque string */
|
||||
double real; /* Real number */
|
||||
mxml_text_t text; /* Text fragment */
|
||||
mxml_custom_t custom; /* Custom data @since Mini-XML 2.1@ */
|
||||
} mxml_value_t;
|
||||
|
||||
struct mxml_node_s /**** An XML node. @private@ ****/
|
||||
{
|
||||
mxml_type_t type; /* Node type */
|
||||
struct mxml_node_s *next; /* Next node under same parent */
|
||||
struct mxml_node_s *prev; /* Previous node under same parent */
|
||||
struct mxml_node_s *parent; /* Parent node */
|
||||
struct mxml_node_s *child; /* First child node */
|
||||
struct mxml_node_s *last_child; /* Last child node */
|
||||
mxml_value_t value; /* Node value */
|
||||
int ref_count; /* Use count */
|
||||
void *user_data; /* User data */
|
||||
};
|
||||
|
||||
typedef struct mxml_node_s mxml_node_t; /**** An XML node. ****/
|
||||
|
||||
struct mxml_index_s /**** An XML node index. @private@ ****/
|
||||
{
|
||||
char *attr; /* Attribute used for indexing or NULL */
|
||||
int num_nodes; /* Number of nodes in index */
|
||||
int alloc_nodes; /* Allocated nodes in index */
|
||||
int cur_node; /* Current node */
|
||||
mxml_node_t **nodes; /* Node array */
|
||||
};
|
||||
|
||||
typedef struct mxml_index_s mxml_index_t;
|
||||
/**** An XML node index. ****/
|
||||
|
||||
typedef int (*mxml_custom_load_cb_t)(mxml_node_t *, const char *);
|
||||
/**** Custom data load callback function ****/
|
||||
|
||||
typedef char *(*mxml_custom_save_cb_t)(mxml_node_t *);
|
||||
/**** Custom data save callback function ****/
|
||||
|
||||
typedef int (*mxml_entity_cb_t)(const char *);
|
||||
/**** Entity callback function */
|
||||
|
||||
typedef mxml_type_t (*mxml_load_cb_t)(mxml_node_t *);
|
||||
/**** Load callback function ****/
|
||||
|
||||
typedef const char *(*mxml_save_cb_t)(mxml_node_t *, int);
|
||||
/**** Save callback function ****/
|
||||
|
||||
typedef void (*mxml_sax_cb_t)(mxml_node_t *, mxml_sax_event_t, void *);
|
||||
/**** SAX callback function ****/
|
||||
|
||||
|
||||
/*
|
||||
* C++ support...
|
||||
*/
|
||||
|
||||
# ifdef __cplusplus
|
||||
extern "C" {
|
||||
# endif /* __cplusplus */
|
||||
|
||||
/*
|
||||
* Prototypes...
|
||||
*/
|
||||
|
||||
extern void mxmlAdd(mxml_node_t *parent, int where,
|
||||
mxml_node_t *child, mxml_node_t *node);
|
||||
extern void mxmlDelete(mxml_node_t *node);
|
||||
extern void mxmlElementDeleteAttr(mxml_node_t *node,
|
||||
const char *name);
|
||||
extern const char *mxmlElementGetAttr(mxml_node_t *node, const char *name);
|
||||
extern void mxmlElementSetAttr(mxml_node_t *node, const char *name,
|
||||
const char *value);
|
||||
extern void mxmlElementSetAttrf(mxml_node_t *node, const char *name,
|
||||
const char *format, ...)
|
||||
# ifdef __GNUC__
|
||||
__attribute__ ((__format__ (__printf__, 3, 4)))
|
||||
# endif /* __GNUC__ */
|
||||
;
|
||||
extern int mxmlEntityAddCallback(mxml_entity_cb_t cb);
|
||||
extern const char *mxmlEntityGetName(int val);
|
||||
extern int mxmlEntityGetValue(const char *name);
|
||||
extern void mxmlEntityRemoveCallback(mxml_entity_cb_t cb);
|
||||
extern mxml_node_t *mxmlFindElement(mxml_node_t *node, mxml_node_t *top,
|
||||
const char *name, const char *attr,
|
||||
const char *value, int descend);
|
||||
extern mxml_node_t *mxmlFindPath(mxml_node_t *node, const char *path);
|
||||
extern const char *mxmlGetCDATA(mxml_node_t *node);
|
||||
extern const void *mxmlGetCustom(mxml_node_t *node);
|
||||
extern const char *mxmlGetElement(mxml_node_t *node);
|
||||
extern mxml_node_t *mxmlGetFirstChild(mxml_node_t *node);
|
||||
extern int mxmlGetInteger(mxml_node_t *node);
|
||||
extern mxml_node_t *mxmlGetLastChild(mxml_node_t *node);
|
||||
extern mxml_node_t *mxmlGetNextSibling(mxml_node_t *node);
|
||||
extern const char *mxmlGetOpaque(mxml_node_t *node);
|
||||
extern mxml_node_t *mxmlGetParent(mxml_node_t *node);
|
||||
extern mxml_node_t *mxmlGetPrevSibling(mxml_node_t *node);
|
||||
extern double mxmlGetReal(mxml_node_t *node);
|
||||
extern int mxmlGetRefCount(mxml_node_t *node);
|
||||
extern const char *mxmlGetText(mxml_node_t *node, int *whitespace);
|
||||
extern mxml_type_t mxmlGetType(mxml_node_t *node);
|
||||
extern void *mxmlGetUserData(mxml_node_t *node);
|
||||
extern void mxmlIndexDelete(mxml_index_t *ind);
|
||||
extern mxml_node_t *mxmlIndexEnum(mxml_index_t *ind);
|
||||
extern mxml_node_t *mxmlIndexFind(mxml_index_t *ind,
|
||||
const char *element,
|
||||
const char *value);
|
||||
extern int mxmlIndexGetCount(mxml_index_t *ind);
|
||||
extern mxml_index_t *mxmlIndexNew(mxml_node_t *node, const char *element,
|
||||
const char *attr);
|
||||
extern mxml_node_t *mxmlIndexReset(mxml_index_t *ind);
|
||||
extern mxml_node_t *mxmlLoadFd(mxml_node_t *top, int fd,
|
||||
mxml_type_t (*cb)(mxml_node_t *));
|
||||
extern mxml_node_t *mxmlLoadFile(mxml_node_t *top, FILE *fp,
|
||||
mxml_type_t (*cb)(mxml_node_t *));
|
||||
extern mxml_node_t *mxmlLoadString(mxml_node_t *top, const char *s,
|
||||
mxml_type_t (*cb)(mxml_node_t *));
|
||||
extern mxml_node_t *mxmlNewCDATA(mxml_node_t *parent, const char *string);
|
||||
extern mxml_node_t *mxmlNewCustom(mxml_node_t *parent, void *data,
|
||||
mxml_custom_destroy_cb_t destroy);
|
||||
extern mxml_node_t *mxmlNewElement(mxml_node_t *parent, const char *name);
|
||||
extern mxml_node_t *mxmlNewInteger(mxml_node_t *parent, int integer);
|
||||
extern mxml_node_t *mxmlNewOpaque(mxml_node_t *parent, const char *opaque);
|
||||
extern mxml_node_t *mxmlNewReal(mxml_node_t *parent, double real);
|
||||
extern mxml_node_t *mxmlNewText(mxml_node_t *parent, int whitespace,
|
||||
const char *string);
|
||||
extern mxml_node_t *mxmlNewTextf(mxml_node_t *parent, int whitespace,
|
||||
const char *format, ...)
|
||||
# ifdef __GNUC__
|
||||
__attribute__ ((__format__ (__printf__, 3, 4)))
|
||||
# endif /* __GNUC__ */
|
||||
;
|
||||
extern mxml_node_t *mxmlNewXML(const char *version);
|
||||
extern int mxmlRelease(mxml_node_t *node);
|
||||
extern void mxmlRemove(mxml_node_t *node);
|
||||
extern int mxmlRetain(mxml_node_t *node);
|
||||
extern char *mxmlSaveAllocString(mxml_node_t *node,
|
||||
mxml_save_cb_t cb);
|
||||
extern int mxmlSaveFd(mxml_node_t *node, int fd,
|
||||
mxml_save_cb_t cb);
|
||||
extern int mxmlSaveFile(mxml_node_t *node, FILE *fp,
|
||||
mxml_save_cb_t cb);
|
||||
extern int mxmlSaveString(mxml_node_t *node, char *buffer,
|
||||
int bufsize, mxml_save_cb_t cb);
|
||||
extern mxml_node_t *mxmlSAXLoadFd(mxml_node_t *top, int fd,
|
||||
mxml_type_t (*cb)(mxml_node_t *),
|
||||
mxml_sax_cb_t sax, void *sax_data);
|
||||
extern mxml_node_t *mxmlSAXLoadFile(mxml_node_t *top, FILE *fp,
|
||||
mxml_type_t (*cb)(mxml_node_t *),
|
||||
mxml_sax_cb_t sax, void *sax_data);
|
||||
extern mxml_node_t *mxmlSAXLoadString(mxml_node_t *top, const char *s,
|
||||
mxml_type_t (*cb)(mxml_node_t *),
|
||||
mxml_sax_cb_t sax, void *sax_data);
|
||||
extern int mxmlSetCDATA(mxml_node_t *node, const char *data);
|
||||
extern int mxmlSetCustom(mxml_node_t *node, void *data,
|
||||
mxml_custom_destroy_cb_t destroy);
|
||||
extern void mxmlSetCustomHandlers(mxml_custom_load_cb_t load,
|
||||
mxml_custom_save_cb_t save);
|
||||
extern int mxmlSetElement(mxml_node_t *node, const char *name);
|
||||
extern void mxmlSetErrorCallback(mxml_error_cb_t cb);
|
||||
extern int mxmlSetInteger(mxml_node_t *node, int integer);
|
||||
extern int mxmlSetOpaque(mxml_node_t *node, const char *opaque);
|
||||
extern int mxmlSetReal(mxml_node_t *node, double real);
|
||||
extern int mxmlSetText(mxml_node_t *node, int whitespace,
|
||||
const char *string);
|
||||
extern int mxmlSetTextf(mxml_node_t *node, int whitespace,
|
||||
const char *format, ...)
|
||||
# ifdef __GNUC__
|
||||
__attribute__ ((__format__ (__printf__, 3, 4)))
|
||||
# endif /* __GNUC__ */
|
||||
;
|
||||
extern int mxmlSetUserData(mxml_node_t *node, void *data);
|
||||
extern void mxmlSetWrapMargin(int column);
|
||||
extern mxml_node_t *mxmlWalkNext(mxml_node_t *node, mxml_node_t *top,
|
||||
int descend);
|
||||
extern mxml_node_t *mxmlWalkPrev(mxml_node_t *node, mxml_node_t *top,
|
||||
int descend);
|
||||
|
||||
|
||||
/*
|
||||
* Semi-private functions...
|
||||
*/
|
||||
|
||||
extern void mxml_error(const char *format, ...);
|
||||
extern mxml_type_t mxml_ignore_cb(mxml_node_t *node);
|
||||
extern mxml_type_t mxml_integer_cb(mxml_node_t *node);
|
||||
extern mxml_type_t mxml_opaque_cb(mxml_node_t *node);
|
||||
extern mxml_type_t mxml_real_cb(mxml_node_t *node);
|
||||
|
||||
|
||||
/*
|
||||
* C++ support...
|
||||
*/
|
||||
|
||||
# ifdef __cplusplus
|
||||
}
|
||||
# endif /* __cplusplus */
|
||||
#endif /* !_mxml_h_ */
|
||||
|
||||
|
||||
/*
|
||||
* End of "$Id: mxml.h 427 2011-01-03 02:03:29Z mike $".
|
||||
*/
|
||||
368
ogl_editor/src/MicroknightFont.c
Normal file
368
ogl_editor/src/MicroknightFont.c
Normal file
@ -0,0 +1,368 @@
|
||||
#include "MicroknightFont.h"
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// Microknight font (128x128 packed with 1 bit per pixel)
|
||||
|
||||
unsigned char s_microkinghtFontData[] =
|
||||
{
|
||||
0x00,0x0c,0x1b,0x0d,0x81,0x03,0x01,0xc0,0x30,0x18,0x18,0x00,0x00,0x00,0x00,0x00,
|
||||
0x00,0x0c,0x1b,0x0d,0x87,0xc4,0xb3,0x60,0x30,0x30,0x0c,0x1b,0x03,0x00,0x00,0x00,
|
||||
0x00,0x0c,0x09,0x1f,0xcd,0x03,0xe1,0xc0,0x10,0x60,0x06,0x0e,0x03,0x00,0x00,0x00,
|
||||
0x00,0x0c,0x00,0x0d,0x87,0xc0,0xc3,0xd8,0x20,0x60,0x06,0x3f,0x8f,0xc0,0x03,0xe0,
|
||||
0x00,0x0c,0x00,0x1f,0xc1,0x61,0x83,0x70,0x00,0x60,0x06,0x0e,0x03,0x01,0x80,0x00,
|
||||
0x00,0x00,0x00,0x0d,0x81,0x63,0x63,0x60,0x00,0x30,0x0c,0x1b,0x03,0x01,0x80,0x00,
|
||||
0x00,0x0c,0x00,0x0d,0x87,0xc6,0x91,0xf0,0x00,0x18,0x18,0x00,0x00,0x00,0x80,0x00,
|
||||
0x00,0x00,0x00,0x00,0x01,0x00,0x60,0x18,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,
|
||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
||||
0x00,0x00,0x00,0x03,0x07,0xc1,0xe0,0x61,0xf0,0x70,0x7f,0x1e,0x0f,0x00,0x00,0x00,
|
||||
0x00,0x03,0x1e,0x03,0x00,0x60,0x30,0x61,0x80,0xc0,0x03,0x33,0x19,0x81,0x80,0xc0,
|
||||
0x00,0x06,0x33,0x07,0x03,0xc0,0xe0,0xc1,0xf8,0xfc,0x06,0x1f,0x18,0xc1,0x80,0xc0,
|
||||
0x00,0x0c,0x37,0x83,0x06,0x00,0x31,0xb0,0x0c,0xc6,0x0c,0x31,0x98,0xc0,0x00,0x00,
|
||||
0x00,0x18,0x3d,0x83,0x0c,0x02,0x33,0x30,0x8c,0xc6,0x0c,0x31,0x8f,0xc0,0x00,0x00,
|
||||
0x18,0x30,0x39,0x83,0x0c,0x06,0x33,0xf9,0x98,0xcc,0x0c,0x33,0x00,0xc1,0x80,0xc0,
|
||||
0x18,0x60,0x1f,0x0f,0xcf,0xe3,0xe0,0x30,0xf0,0x78,0x0c,0x1e,0x03,0x81,0x80,0x40,
|
||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,
|
||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
||||
0x00,0x00,0x00,0x0f,0x83,0x83,0xc3,0xe0,0xf0,0xf8,0x7f,0x3f,0x87,0x0c,0x63,0xf0,
|
||||
0x18,0x00,0x0c,0x18,0xc6,0xc6,0x63,0x31,0x98,0xcc,0x60,0x30,0x0c,0x0c,0x60,0xc0,
|
||||
0x30,0x3e,0x06,0x00,0xcd,0xe6,0x33,0xf1,0x80,0xc6,0x7e,0x3f,0x18,0x0c,0x60,0xc0,
|
||||
0x60,0x00,0x03,0x07,0x8f,0x67,0xf3,0x19,0x80,0xc6,0x60,0x30,0x19,0xcf,0xe0,0xc0,
|
||||
0x30,0x3e,0x06,0x06,0x0d,0xe6,0x33,0x19,0x80,0xc6,0x60,0x30,0x18,0xcc,0x60,0xc0,
|
||||
0x18,0x00,0x0c,0x00,0x0c,0x06,0x33,0x31,0x8c,0xc6,0x60,0x30,0x18,0xcc,0x60,0xc0,
|
||||
0x00,0x00,0x00,0x06,0x06,0x66,0x33,0xe0,0xf8,0xfc,0x7f,0x30,0x0f,0xcc,0x63,0xf0,
|
||||
0x00,0x00,0x00,0x00,0x03,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x00,0x00,
|
||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
||||
0x0e,0x63,0x30,0x18,0xcc,0x63,0xc3,0xe0,0xf0,0xf8,0x3c,0x1f,0x98,0xcc,0x66,0x30,
|
||||
0x06,0x66,0x30,0x1d,0xce,0x66,0x63,0x31,0x98,0xcc,0x60,0x06,0x18,0xcc,0x66,0x30,
|
||||
0x06,0x6c,0x30,0x1f,0xcf,0x66,0x33,0x19,0x8c,0xc6,0x3e,0x06,0x18,0xcc,0x66,0x30,
|
||||
0x06,0x78,0x30,0x1a,0xcd,0xe6,0x33,0x19,0x8c,0xc6,0x03,0x06,0x18,0xc6,0xc6,0xb0,
|
||||
0xc6,0x6c,0x30,0x18,0xcc,0xe6,0x33,0xf1,0x8c,0xfc,0x23,0x06,0x18,0xc6,0xc7,0xf0,
|
||||
0xc6,0x66,0x30,0x18,0xcc,0x66,0x33,0x01,0xac,0xd8,0x63,0x06,0x18,0xc3,0x87,0x70,
|
||||
0x7c,0x63,0x3f,0x98,0xcc,0x63,0xe3,0x00,0xf8,0xcc,0x3e,0x06,0x0f,0x83,0x86,0x30,
|
||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x06,0x00,0x00,0x00,0x00,0x00,0x00,
|
||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
||||
0xc6,0x63,0x3f,0x87,0x00,0x01,0xc0,0x40,0x00,0x18,0x00,0x30,0x00,0x00,0x60,0x00,
|
||||
0x6c,0x63,0x03,0x06,0x0c,0x00,0xc0,0xe0,0x00,0x18,0x1e,0x3e,0x0f,0x03,0xe3,0xc0,
|
||||
0x38,0x63,0x06,0x06,0x06,0x00,0xc1,0xb0,0x00,0x10,0x03,0x33,0x19,0x86,0x66,0x60,
|
||||
0x38,0x3e,0x0c,0x06,0x03,0x00,0xc0,0x00,0x00,0x08,0x3f,0x31,0x98,0x0c,0x67,0xe0,
|
||||
0x6c,0x06,0x18,0x06,0x01,0x80,0xc0,0x00,0x00,0x00,0x63,0x31,0x98,0x0c,0x66,0x00,
|
||||
0xc6,0x06,0x30,0x06,0x00,0xc0,0xc0,0x00,0x00,0x00,0x63,0x31,0x98,0xcc,0x66,0x30,
|
||||
0xc6,0x06,0x3f,0x87,0x00,0x61,0xc0,0x00,0x00,0x00,0x3f,0x3f,0x0f,0x87,0xe3,0xe0,
|
||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
||||
0x38,0x00,0x30,0x03,0x00,0xc6,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
||||
0x6c,0x3f,0x3e,0x00,0x00,0x06,0x60,0x61,0x88,0xf8,0x3c,0x3e,0x07,0xcf,0xc3,0xc0,
|
||||
0x60,0x63,0x33,0x07,0x01,0xc6,0xc0,0x61,0xdc,0xcc,0x66,0x33,0x0c,0xcc,0x66,0x00,
|
||||
0x78,0x63,0x31,0x83,0x00,0xc7,0x80,0x61,0xfc,0xc6,0x63,0x31,0x98,0xcc,0x03,0xe0,
|
||||
0x60,0x63,0x31,0x83,0x00,0xc6,0xc0,0x61,0xac,0xc6,0x63,0x31,0x98,0xcc,0x00,0x30,
|
||||
0x60,0x3f,0x31,0x83,0x00,0xc6,0x60,0x61,0x8c,0xc6,0x63,0x31,0x98,0xcc,0x06,0x30,
|
||||
0x60,0x03,0x31,0x8f,0xc4,0xc6,0x31,0xf9,0x8c,0xc6,0x3e,0x3f,0x0f,0xcc,0x03,0xe0,
|
||||
0x60,0x3e,0x00,0x00,0x03,0x80,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0xc0,0x00,0x00,
|
||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
||||
0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x18,0x1c,0x87,0x00,0x00,0xc0,
|
||||
0x7c,0x63,0x31,0x98,0xcc,0x66,0x33,0xf8,0x30,0x18,0x0c,0x27,0x0e,0x00,0x00,0x00,
|
||||
0x30,0x63,0x31,0x9a,0xc6,0xc6,0x30,0x30,0x30,0x18,0x0c,0x00,0x1c,0x00,0x00,0xc0,
|
||||
0x30,0x63,0x1b,0x1f,0xc3,0x86,0x30,0x60,0x60,0x18,0x06,0x00,0x18,0x20,0x00,0xc0,
|
||||
0x30,0x63,0x1b,0x0f,0x83,0x86,0x30,0xc0,0x30,0x18,0x0c,0x00,0x10,0x60,0x00,0xc0,
|
||||
0x32,0x63,0x0e,0x0d,0x86,0xc3,0xf1,0x80,0x30,0x18,0x0c,0x00,0x00,0xe0,0x00,0xc0,
|
||||
0x1c,0x3f,0x0e,0x08,0x8c,0x60,0x33,0xf8,0x18,0x18,0x18,0x00,0x01,0xc0,0x00,0xc0,
|
||||
0x00,0x00,0x00,0x00,0x00,0x03,0xe0,0x00,0x00,0x18,0x00,0x00,0x03,0x80,0x00,0x00,
|
||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
||||
0x30,0x1c,0x00,0x18,0xc1,0x83,0xc1,0xb0,0x78,0x00,0x00,0x1f,0x00,0x03,0xc3,0xe0,
|
||||
0x78,0x36,0x31,0x98,0xc1,0x86,0x00,0x00,0x84,0x7e,0x1b,0x03,0x00,0x04,0x20,0x00,
|
||||
0xcc,0x30,0x1f,0x18,0xc1,0x83,0xe0,0x01,0x32,0xc6,0x36,0x00,0x00,0x0b,0x90,0x00,
|
||||
0xc0,0x7c,0x31,0x8f,0x80,0x06,0x30,0x01,0x42,0xc6,0x6c,0x00,0x0f,0x8a,0x50,0x00,
|
||||
0xc0,0x30,0x31,0x81,0x81,0x86,0x30,0x01,0x42,0x7e,0x36,0x00,0x00,0x0b,0x90,0x00,
|
||||
0xc6,0x30,0x1f,0x07,0xc1,0x83,0xe0,0x01,0x32,0x00,0x1b,0x00,0x00,0x0a,0x50,0x00,
|
||||
0x7c,0x7f,0x31,0x81,0x81,0x80,0x30,0x00,0x84,0x7c,0x00,0x00,0x00,0x04,0x20,0x00,
|
||||
0x30,0x00,0x00,0x00,0x00,0x01,0xe0,0x00,0x78,0x00,0x00,0x00,0x00,0x03,0xc0,0x00,
|
||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
||||
0x38,0x00,0x1c,0x0e,0x01,0x80,0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x06,0x03,0x00,
|
||||
0x6c,0x08,0x06,0x03,0x03,0x06,0x31,0xf8,0x00,0x00,0x38,0x1f,0x1b,0x0e,0x67,0x30,
|
||||
0x6c,0x3e,0x0c,0x06,0x06,0x06,0x33,0xd0,0x30,0x00,0x18,0x31,0x8d,0x86,0xc3,0x60,
|
||||
0x38,0x08,0x18,0x03,0x00,0x06,0x31,0xd0,0x30,0x00,0x18,0x31,0x86,0xc7,0xa3,0xc0,
|
||||
0x00,0x00,0x1e,0x0e,0x00,0x06,0x30,0x50,0x00,0x00,0x3c,0x1f,0x0d,0x83,0x61,0xf0,
|
||||
0x00,0x3e,0x00,0x00,0x00,0x06,0x30,0x50,0x00,0x00,0x00,0x00,0x1b,0x06,0xf3,0x18,
|
||||
0x00,0x00,0x00,0x00,0x00,0x07,0xe0,0x50,0x00,0x18,0x00,0x1f,0x00,0x0c,0xf6,0x70,
|
||||
0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x30,0xf8,
|
||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
||||
0xe0,0x18,0x0c,0x03,0x03,0x03,0x91,0xb0,0xf0,0x3f,0x3c,0x0c,0x03,0x01,0x83,0x60,
|
||||
0x36,0x00,0x02,0x04,0x0c,0xc4,0xe0,0x01,0x98,0x6c,0x66,0x02,0x04,0x06,0x60,0x00,
|
||||
0x6c,0x18,0x1e,0x0f,0x07,0x83,0xc1,0xe0,0xf0,0xcf,0x60,0x3f,0x9f,0xcf,0xe7,0xf0,
|
||||
0x3a,0x1e,0x33,0x19,0x8c,0xc6,0x63,0x31,0x98,0xfc,0x60,0x30,0x18,0x0c,0x06,0x00,
|
||||
0xf6,0x03,0x3f,0x9f,0xcf,0xe7,0xf3,0xf9,0xfc,0xcc,0x60,0x3f,0x1f,0x8f,0xc7,0xe0,
|
||||
0x6f,0x63,0x31,0x98,0xcc,0x66,0x33,0x19,0x8c,0xcc,0x63,0x30,0x18,0x0c,0x06,0x00,
|
||||
0xcf,0x3e,0x31,0x98,0xcc,0x66,0x33,0x19,0x8c,0xcf,0x3e,0x3f,0x9f,0xcf,0xe7,0xf0,
|
||||
0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x00,0x00,
|
||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
||||
0x30,0x0c,0x06,0x0d,0x8f,0x83,0x90,0xc0,0x30,0x30,0x39,0x1b,0x00,0x07,0x81,0x80,
|
||||
0x08,0x10,0x19,0x80,0x0c,0xc4,0xe0,0x20,0x40,0xcc,0x4e,0x00,0x0f,0x8c,0xc0,0x40,
|
||||
0x7e,0x3f,0x1f,0x8f,0xcc,0x67,0x31,0xe0,0xf0,0x78,0x3c,0x1e,0x1a,0xcd,0xe6,0x30,
|
||||
0x18,0x0c,0x06,0x03,0x0e,0x67,0xb3,0x31,0x98,0xcc,0x66,0x33,0x1f,0xef,0x66,0x30,
|
||||
0x18,0x0c,0x06,0x03,0x0c,0x66,0xf3,0x19,0x8c,0xc6,0x63,0x31,0x9b,0x6e,0x66,0x30,
|
||||
0x18,0x0c,0x06,0x03,0x0c,0x66,0x73,0x19,0x8c,0xc6,0x63,0x31,0x98,0xec,0x66,0x30,
|
||||
0x7e,0x3f,0x1f,0x8f,0xcf,0xc6,0x31,0xf0,0xf8,0x7c,0x3e,0x1f,0x0f,0xc7,0xc3,0xe0,
|
||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
||||
0x18,0x0c,0x1b,0x03,0x0c,0x00,0x00,0xc0,0x30,0x18,0x39,0x1b,0x07,0x80,0x00,0x00,
|
||||
0x20,0x33,0x00,0x04,0x0f,0x83,0xc0,0x20,0x40,0x66,0x4e,0x00,0x0c,0xc7,0xe3,0xc0,
|
||||
0xc6,0x63,0x31,0x98,0xcc,0xc6,0x60,0xf0,0x78,0x3c,0x1e,0x0f,0x07,0x81,0xb6,0x60,
|
||||
0xc6,0x63,0x31,0x98,0xcc,0x66,0xe0,0x18,0x0c,0x06,0x03,0x01,0x80,0xc7,0xf6,0x00,
|
||||
0xc6,0x63,0x31,0x8f,0x8f,0xc6,0x31,0xf8,0xfc,0x7e,0x3f,0x1f,0x8f,0xcd,0x86,0x00,
|
||||
0xc6,0x63,0x31,0x81,0x8c,0x06,0x33,0x19,0x8c,0xc6,0x63,0x31,0x98,0xcd,0x86,0x30,
|
||||
0x7c,0x3e,0x1f,0x01,0x8c,0x06,0xe1,0xf8,0xfc,0x7e,0x3f,0x1f,0x8f,0xc7,0xf3,0xe0,
|
||||
0x00,0x00,0x00,0x00,0x0c,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x80,
|
||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
||||
0x30,0x0c,0x0c,0x0d,0x83,0x00,0xc0,0x60,0xd8,0x0c,0x39,0x0c,0x03,0x01,0x83,0x90,
|
||||
0x08,0x10,0x33,0x00,0x00,0x81,0x01,0x98,0x00,0x16,0x4e,0x02,0x04,0x06,0x64,0xe0,
|
||||
0x78,0x3c,0x1e,0x0f,0x03,0x81,0xc0,0xe0,0x70,0x3e,0x7c,0x1e,0x0f,0x07,0x83,0xc0,
|
||||
0xfc,0x7e,0x3f,0x1f,0x81,0x80,0xc0,0x60,0x30,0x66,0x66,0x33,0x19,0x8c,0xc6,0x60,
|
||||
0xc0,0x60,0x30,0x18,0x01,0x80,0xc0,0x60,0x30,0xc6,0x63,0x31,0x98,0xcc,0x66,0x30,
|
||||
0xc6,0x63,0x31,0x98,0xc1,0x80,0xc0,0x60,0x30,0xc6,0x63,0x31,0x98,0xcc,0x66,0x30,
|
||||
0x7c,0x3e,0x1f,0x0f,0x87,0xe3,0xf1,0xf8,0xfc,0x7e,0x63,0x1f,0x0f,0x87,0xc3,0xe0,
|
||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
||||
0x6c,0x00,0x00,0x06,0x01,0x80,0xc1,0xb0,0x30,0xc0,0x36,0x00,0x00,0x00,0x00,0x00,
|
||||
0x00,0x0c,0x1e,0x01,0x02,0x03,0x30,0x00,0x40,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,
|
||||
0x78,0x00,0x33,0x18,0xcc,0x66,0x33,0x19,0x8c,0xf8,0x63,0x00,0x00,0x00,0x00,0x00,
|
||||
0xcc,0x3f,0x37,0x98,0xcc,0x66,0x33,0x19,0x8c,0xcc,0x63,0x00,0x00,0x00,0x00,0x00,
|
||||
0xc6,0x00,0x3d,0x98,0xcc,0x66,0x33,0x19,0x8c,0xc6,0x63,0x00,0x00,0x00,0x00,0x00,
|
||||
0xc6,0x0c,0x39,0x98,0xcc,0x66,0x33,0x18,0xfc,0xfc,0x3f,0x00,0x00,0x00,0x00,0x00,
|
||||
0x7c,0x00,0x1f,0x0f,0xc7,0xe3,0xf1,0xf8,0x0c,0xc0,0x03,0x00,0x00,0x00,0x00,0x00,
|
||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0xc0,0x3e,0x00,0x00,0x00,0x00,0x00,
|
||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
||||
};
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// Font layout (generated from Angelcode Bitmap Font generator)
|
||||
|
||||
struct MicroknightLayout s_microknightLayout[] =
|
||||
{
|
||||
{ 0, 0 },
|
||||
{ 9, 0 },
|
||||
{ 18, 0 },
|
||||
{ 27, 0 },
|
||||
{ 36, 0 },
|
||||
{ 45, 0 },
|
||||
{ 54, 0 },
|
||||
{ 63, 0 },
|
||||
{ 72, 0 },
|
||||
{ 81, 0 },
|
||||
{ 90, 0 },
|
||||
{ 99, 0 },
|
||||
{ 108, 0 },
|
||||
{ 117, 0 },
|
||||
{ 0, 9 },
|
||||
{ 9, 9 },
|
||||
{ 18, 9 },
|
||||
{ 27, 9 },
|
||||
{ 36, 9 },
|
||||
{ 45, 9 },
|
||||
{ 54, 9 },
|
||||
{ 63, 9 },
|
||||
{ 72, 9 },
|
||||
{ 81, 9 },
|
||||
{ 90, 9 },
|
||||
{ 99, 9 },
|
||||
{ 108, 9 },
|
||||
{ 117, 9 },
|
||||
{ 0, 18 },
|
||||
{ 9, 18 },
|
||||
{ 18, 18 },
|
||||
{ 27, 18 },
|
||||
{ 36, 18 },
|
||||
{ 45, 18 },
|
||||
{ 54, 18 },
|
||||
{ 63, 18 },
|
||||
{ 72, 18 },
|
||||
{ 81, 18 },
|
||||
{ 90, 18 },
|
||||
{ 99, 18 },
|
||||
{ 108, 18 },
|
||||
{ 117, 18 },
|
||||
{ 0, 27 },
|
||||
{ 9, 27 },
|
||||
{ 18, 27 },
|
||||
{ 27, 27 },
|
||||
{ 36, 27 },
|
||||
{ 45, 27 },
|
||||
{ 54, 27 },
|
||||
{ 63, 27 },
|
||||
{ 72, 27 },
|
||||
{ 81, 27 },
|
||||
{ 90, 27 },
|
||||
{ 99, 27 },
|
||||
{ 108, 27 },
|
||||
{ 117, 27 },
|
||||
{ 0, 36 },
|
||||
{ 9, 36 },
|
||||
{ 18, 36 },
|
||||
{ 27, 36 },
|
||||
{ 36, 36 },
|
||||
{ 45, 36 },
|
||||
{ 54, 36 },
|
||||
{ 63, 36 },
|
||||
{ 72, 36 },
|
||||
{ 81, 36 },
|
||||
{ 90, 36 },
|
||||
{ 99, 36 },
|
||||
{ 108, 36 },
|
||||
{ 117, 36 },
|
||||
{ 0, 45 },
|
||||
{ 9, 45 },
|
||||
{ 18, 45 },
|
||||
{ 27, 45 },
|
||||
{ 36, 45 },
|
||||
{ 45, 45 },
|
||||
{ 54, 45 },
|
||||
{ 63, 45 },
|
||||
{ 72, 45 },
|
||||
{ 81, 45 },
|
||||
{ 90, 45 },
|
||||
{ 99, 45 },
|
||||
{ 108, 45 },
|
||||
{ 117, 45 },
|
||||
{ 0, 54 },
|
||||
{ 9, 54 },
|
||||
{ 18, 54 },
|
||||
{ 27, 54 },
|
||||
{ 36, 54 },
|
||||
{ 45, 54 },
|
||||
{ 54, 54 },
|
||||
{ 63, 54 },
|
||||
{ 72, 54 },
|
||||
{ 81, 54 },
|
||||
{ 90, 54 },
|
||||
{ 99, 54 },
|
||||
{ 0, 0 },
|
||||
{ 0, 0 },
|
||||
{ 0, 0 },
|
||||
{ 0, 0 },
|
||||
{ 0, 0 },
|
||||
{ 0, 0 },
|
||||
{ 0, 0 },
|
||||
{ 0, 0 },
|
||||
{ 0, 0 },
|
||||
{ 0, 0 },
|
||||
{ 0, 0 },
|
||||
{ 0, 0 },
|
||||
{ 0, 0 },
|
||||
{ 0, 0 },
|
||||
{ 0, 0 },
|
||||
{ 0, 0 },
|
||||
{ 0, 0 },
|
||||
{ 0, 0 },
|
||||
{ 0, 0 },
|
||||
{ 0, 0 },
|
||||
{ 0, 0 },
|
||||
{ 0, 0 },
|
||||
{ 0, 0 },
|
||||
{ 0, 0 },
|
||||
{ 0, 0 },
|
||||
{ 0, 0 },
|
||||
{ 0, 0 },
|
||||
{ 0, 0 },
|
||||
{ 0, 0 },
|
||||
{ 0, 0 },
|
||||
{ 0, 0 },
|
||||
{ 0, 0 },
|
||||
{ 108, 54 },
|
||||
{ 117, 54 },
|
||||
{ 0, 63 },
|
||||
{ 9, 63 },
|
||||
{ 18, 63 },
|
||||
{ 27, 63 },
|
||||
{ 36, 63 },
|
||||
{ 45, 63 },
|
||||
{ 54, 63 },
|
||||
{ 63, 63 },
|
||||
{ 72, 63 },
|
||||
{ 81, 63 },
|
||||
{ 90, 63 },
|
||||
{ 99, 63 },
|
||||
{ 108, 63 },
|
||||
{ 117, 63 },
|
||||
{ 0, 72 },
|
||||
{ 9, 72 },
|
||||
{ 18, 72 },
|
||||
{ 27, 72 },
|
||||
{ 36, 72 },
|
||||
{ 45, 72 },
|
||||
{ 54, 72 },
|
||||
{ 63, 72 },
|
||||
{ 72, 72 },
|
||||
{ 81, 72 },
|
||||
{ 90, 72 },
|
||||
{ 99, 72 },
|
||||
{ 108, 72 },
|
||||
{ 117, 72 },
|
||||
{ 0, 81 },
|
||||
{ 9, 81 },
|
||||
{ 18, 81 },
|
||||
{ 27, 81 },
|
||||
{ 36, 81 },
|
||||
{ 45, 81 },
|
||||
{ 54, 81 },
|
||||
{ 63, 81 },
|
||||
{ 72, 81 },
|
||||
{ 81, 81 },
|
||||
{ 90, 81 },
|
||||
{ 99, 81 },
|
||||
{ 108, 81 },
|
||||
{ 117, 81 },
|
||||
{ 0, 90 },
|
||||
{ 9, 90 },
|
||||
{ 18, 90 },
|
||||
{ 27, 90 },
|
||||
{ 36, 90 },
|
||||
{ 45, 90 },
|
||||
{ 54, 90 },
|
||||
{ 63, 90 },
|
||||
{ 72, 90 },
|
||||
{ 81, 90 },
|
||||
{ 90, 90 },
|
||||
{ 99, 90 },
|
||||
{ 108, 90 },
|
||||
{ 117, 90 },
|
||||
{ 0, 99 },
|
||||
{ 9, 99 },
|
||||
{ 18, 99 },
|
||||
{ 27, 99 },
|
||||
{ 36, 99 },
|
||||
{ 45, 99 },
|
||||
{ 54, 99 },
|
||||
{ 63, 99 },
|
||||
{ 72, 99 },
|
||||
{ 81, 99 },
|
||||
{ 90, 99 },
|
||||
{ 99, 99 },
|
||||
{ 108, 99 },
|
||||
{ 117, 99 },
|
||||
{ 0, 108 },
|
||||
{ 9, 108 },
|
||||
{ 18, 108 },
|
||||
{ 27, 108 },
|
||||
{ 36, 108 },
|
||||
{ 45, 108 },
|
||||
{ 54, 108 },
|
||||
{ 63, 108 },
|
||||
{ 72, 108 },
|
||||
{ 81, 108 },
|
||||
{ 90, 108 },
|
||||
{ 99, 108 },
|
||||
{ 108, 108 },
|
||||
{ 117, 108 },
|
||||
{ 0, 117 },
|
||||
{ 9, 117 },
|
||||
{ 18, 117 },
|
||||
{ 27, 117 },
|
||||
{ 36, 117 },
|
||||
{ 45, 117 },
|
||||
{ 54, 117 },
|
||||
{ 63, 117 },
|
||||
{ 72, 117 },
|
||||
{ 81, 117 },
|
||||
};
|
||||
|
||||
15
ogl_editor/src/MicroknightFont.h
Normal file
15
ogl_editor/src/MicroknightFont.h
Normal file
@ -0,0 +1,15 @@
|
||||
#pragma once
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
typedef struct MicroknightLayout
|
||||
{
|
||||
unsigned short x;
|
||||
unsigned short y;
|
||||
} MicroknightLayout;
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
extern unsigned char s_microkinghtFontData[];
|
||||
extern struct MicroknightLayout s_microknightLayout[];
|
||||
|
||||
205
ogl_editor/src/OpenGLRenderer/OpenGLRenderer.c
Normal file
205
ogl_editor/src/OpenGLRenderer/OpenGLRenderer.c
Normal file
@ -0,0 +1,205 @@
|
||||
#include "OpenGLRenderer.h"
|
||||
#include "Core/Types.h"
|
||||
#include "../MicroknightFont.h"
|
||||
#include <OpenGL/OpenGL.h>
|
||||
#include <OpenGL/gl.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
unsigned int s_fontTexture;
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
void GFXBackend_create()
|
||||
{
|
||||
// set the background colour
|
||||
glClearColor(0.0, 0.0, 0.0, 1.0);
|
||||
glClearDepth(1.0);
|
||||
glDisable(GL_DEPTH_TEST);
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
void GFXBackend_setFont(void* font, int w, int h)
|
||||
{
|
||||
glGenTextures(1, &s_fontTexture);
|
||||
glBindTexture(GL_TEXTURE_2D, s_fontTexture);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
|
||||
|
||||
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, font);
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
void GFXBackend_updateViewPort(int width, int height)
|
||||
{
|
||||
glViewport(0, 0, width, height);
|
||||
glMatrixMode(GL_PROJECTION);
|
||||
glLoadIdentity();
|
||||
glOrtho(0, width, height, 0, 0, 1);
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
void GFXBackend_draw()
|
||||
{
|
||||
glClear(GL_COLOR_BUFFER_BIT);
|
||||
|
||||
// prepare for primitive drawing
|
||||
glMatrixMode(GL_MODELVIEW);
|
||||
glLoadIdentity();
|
||||
|
||||
glFlush();
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
void GFXBackend_destroy()
|
||||
{
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
void GFXBackend_drawTextHorizontal(int x, int y, const char* text)
|
||||
{
|
||||
const int charOffset = 32;
|
||||
char c = *text++;
|
||||
|
||||
glEnable(GL_TEXTURE_2D);
|
||||
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
|
||||
glBindTexture(GL_TEXTURE_2D, s_fontTexture);
|
||||
glBegin(GL_QUADS);
|
||||
|
||||
while (c != 0)
|
||||
{
|
||||
int offset = c - charOffset;
|
||||
uint16_t font_x = s_microknightLayout[offset].x;
|
||||
uint16_t font_y = s_microknightLayout[offset].y;
|
||||
const float font_0 = ((float)font_x) / 128.0f;
|
||||
const float font_1 = ((float)font_y) / 128.0f;
|
||||
const float font_2 = ((float)font_x + 8) / 128.0f;
|
||||
const float font_3 = ((float)font_y + 8) / 128.0f;
|
||||
|
||||
glTexCoord2f(font_0, font_1);
|
||||
glVertex2i(x, y);
|
||||
glTexCoord2f(font_0, font_3);
|
||||
glVertex2i(x, y + 8);
|
||||
glTexCoord2f(font_2, font_3);
|
||||
glVertex2i(x + 8,y + 8);
|
||||
glTexCoord2f(font_2, font_1);
|
||||
glVertex2i(x + 8,y);
|
||||
|
||||
c = *text++;
|
||||
x += 8;
|
||||
}
|
||||
|
||||
glEnd();
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
int GFXBackend_getTextPixelLength(const char* text)
|
||||
{
|
||||
// hardcoded for now
|
||||
return (strlen(text) - 1) * 9;
|
||||
}
|
||||
|
||||
void GFXBackend_drawLine(int x, int y, int xEnd, int yEnd)
|
||||
{
|
||||
glColor4f(0.5f, 0.5f, 0.5f, 0.5f);
|
||||
glDisable(GL_TEXTURE_2D);
|
||||
glBegin(GL_LINES);
|
||||
glVertex2i(x, y);
|
||||
glVertex2i(xEnd, yEnd);
|
||||
glVertex2i(x + 1, y);
|
||||
glVertex2i(xEnd + 1, yEnd);
|
||||
glEnd();
|
||||
}
|
||||
|
||||
struct RETrack;
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
int GFXBackend_drawTrack(int xPos, int yPos, struct RETrack* track)
|
||||
{
|
||||
/*
|
||||
int i, count;
|
||||
int trackWidth = GFXBackend_getTextPixelLength(track->name) + 4;
|
||||
|
||||
// at least 30 pixels in width
|
||||
|
||||
if (trackWidth < 30)
|
||||
trackWidth = 30;
|
||||
|
||||
glColor3f(1.0f, 1.0f, 1.0f);
|
||||
GFXBackend_drawTextHorizontal(xPos, yPos, track->name);
|
||||
|
||||
GFXBackend_drawLine(xPos + trackWidth, yPos, xPos + trackWidth, yPos + 800); // TODO: proper y-size according to window size
|
||||
|
||||
for (i = 2, count = 30; i < count; ++i)
|
||||
{
|
||||
drawRow(xPos, (i * 20));
|
||||
}
|
||||
|
||||
return trackWidth + 8;
|
||||
*/
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
void OpenGL_drawPosition(int row, int xPos, int yPos, int height)
|
||||
{
|
||||
/*
|
||||
int i, count;
|
||||
|
||||
// so yeah, we can make this smarter
|
||||
// TODO: remove sprintf (may be ok)
|
||||
// TODO: Build one list of quads instead of glVertex crap
|
||||
|
||||
for (i = 0, count = (height - yPos); i < count; i += s_fontWidth)
|
||||
{
|
||||
char tempString[64];
|
||||
sprintf(tempString, "%08d", row);
|
||||
|
||||
if (row & 7)
|
||||
glColor4f(0.5f, 0.5f, 0.5f, 0.5f);
|
||||
else
|
||||
glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
|
||||
|
||||
OpenGL_drawTextHorizontal(xPos, yPos, tempString);
|
||||
row++;
|
||||
yPos += s_fontWidth;
|
||||
}
|
||||
*/
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
static void quad(int x, int y, int width, int height)
|
||||
{
|
||||
glVertex2i(x, y);
|
||||
glVertex2i(x, y + height);
|
||||
glVertex2i(x + width,y + height);
|
||||
glVertex2i(x + width,y);
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
void drawRow(int x, int rowOffset)
|
||||
{
|
||||
glBegin(GL_QUADS);
|
||||
quad(x, rowOffset, 8, 1);
|
||||
quad(x + 10, rowOffset, 8, 1);
|
||||
quad(x + 20, rowOffset, 8, 1);
|
||||
glEnd();
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
8
ogl_editor/src/OpenGLRenderer/OpenGLRenderer.h
Normal file
8
ogl_editor/src/OpenGLRenderer/OpenGLRenderer.h
Normal file
@ -0,0 +1,8 @@
|
||||
#pragma once
|
||||
|
||||
void GFXBackend_create();
|
||||
void GFXBackend_destroy();
|
||||
void GFXBackend_draw();
|
||||
void GFXBackend_updateViewPort(int width, int height);
|
||||
void GFXBackend_setFont(void* data, int width, int height);
|
||||
|
||||
497
ogl_editor/src/RocketGui.c
Normal file
497
ogl_editor/src/RocketGui.c
Normal file
@ -0,0 +1,497 @@
|
||||
#include "RocketGui.h"
|
||||
#include "MicroknightFont.h"
|
||||
#include <OpenGLRenderer/OpenGLRenderer.h>
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#if defined(ROCKETGUI_MACOSX)
|
||||
#include <sys/syslimits.h>
|
||||
#else
|
||||
// TODO: Include correct path
|
||||
#define PATH_MAX 1024
|
||||
#endif
|
||||
|
||||
///
|
||||
|
||||
enum
|
||||
{
|
||||
MAX_CONTROLS = 1024,
|
||||
MAX_IMAGES = 1024,
|
||||
};
|
||||
|
||||
RocketGuiState g_rocketGuiState;
|
||||
uint32_t s_controlId;
|
||||
|
||||
const int s_fontWidth = 9;
|
||||
const int s_fontHeight = 9;
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
enum GuiPlacementState
|
||||
{
|
||||
PLACEMENTSTATE_NONE,
|
||||
PLACEMENTSTATE_HORIZONAL,
|
||||
PLACEMENTSTATE_VERTICAL,
|
||||
};
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
typedef struct GuiPlacementInfo
|
||||
{
|
||||
enum GuiPlacementState state;
|
||||
int x;
|
||||
int y;
|
||||
|
||||
} GuiPlacementInfo;
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
static GuiPlacementInfo g_placementInfo;
|
||||
RocketControlInfo g_controls[MAX_CONTROLS];
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
void RocketGui_beginHorizontalStackPanelXY(int x, int y)
|
||||
{
|
||||
g_placementInfo.state = PLACEMENTSTATE_HORIZONAL;
|
||||
g_placementInfo.x = x;
|
||||
g_placementInfo.y = y;
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
void RocketGui_beginVerticalStackPanelXY(int x, int y)
|
||||
{
|
||||
g_placementInfo.state = PLACEMENTSTATE_VERTICAL;
|
||||
g_placementInfo.x = x;
|
||||
g_placementInfo.y = y;
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
void RocketGui_begin()
|
||||
{
|
||||
s_controlId = 1;
|
||||
g_controls[0].type = DRAWTYPE_NONE;
|
||||
memset(&g_placementInfo, 0, sizeof(GuiPlacementInfo));
|
||||
}
|
||||
|
||||
/*
|
||||
struct LoadedImages
|
||||
{
|
||||
char filename[PATH_MAX][MAX_IMAGES];
|
||||
RocketImage image[MAX_IMAGES];
|
||||
uint32_t count;
|
||||
} g_loadedImages;
|
||||
*/
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
static bool RocketGui_regionHit(const RocketControlInfo* control)
|
||||
{
|
||||
if (g_rocketGuiState.mousex < control->x ||
|
||||
g_rocketGuiState.mousey < control->y ||
|
||||
g_rocketGuiState.mousex >= control->x + control->width ||
|
||||
g_rocketGuiState.mousey >= control->y + control->height)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
static void initFont()
|
||||
{
|
||||
uint32_t i;
|
||||
uint32_t* fontData;
|
||||
uint32_t* tempColorData = fontData = (uint32_t*)malloc(128 * 128 * sizeof(uint32_t));
|
||||
const uint8_t* data = s_microkinghtFontData;
|
||||
|
||||
// Build new texture
|
||||
|
||||
const uint32_t fontColor = 0x7fffffff;
|
||||
|
||||
for (i = 0; i < (128 * 128) / 8; ++i)
|
||||
{
|
||||
uint8_t color = *data++;
|
||||
*tempColorData++ = ((color >> 7) & 1) ? fontColor : 0;
|
||||
*tempColorData++ = ((color >> 6) & 1) ? fontColor : 0;
|
||||
*tempColorData++ = ((color >> 5) & 1) ? fontColor : 0;
|
||||
*tempColorData++ = ((color >> 4) & 1) ? fontColor : 0;
|
||||
*tempColorData++ = ((color >> 3) & 1) ? fontColor : 0;
|
||||
*tempColorData++ = ((color >> 2) & 1) ? fontColor : 0;
|
||||
*tempColorData++ = ((color >> 1) & 1) ? fontColor : 0;
|
||||
*tempColorData++ = ((color >> 0) & 1) ? fontColor : 0;
|
||||
}
|
||||
|
||||
GFXBackend_setFont(fontData, 128, 128);
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
void RocketGui_init()
|
||||
{
|
||||
initFont();
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
void RocketGui_reset()
|
||||
{
|
||||
//memset(&g_loadedImages, 0, sizeof(struct LoadedImages)); // not really needed but good when debugging
|
||||
g_rocketGuiState.mousex = -1;
|
||||
g_rocketGuiState.mousey = -1;
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
/*
|
||||
static RocketImage* loadImage(const char* filename)
|
||||
{
|
||||
uint32_t i;
|
||||
uint32_t index = g_loadedImages.count;
|
||||
|
||||
HIPPO_ASSERT(filename);
|
||||
|
||||
// TODO: Hash filenames?
|
||||
|
||||
for (i = 0; i != index; ++i)
|
||||
{
|
||||
if (!strcmp(filename, g_loadedImages.filename[i]))
|
||||
return &g_loadedImages.image[i];
|
||||
}
|
||||
|
||||
// Load new image
|
||||
|
||||
if (!RocketImageLoader_loadFile(&g_loadedImages.image[index], filename))
|
||||
{
|
||||
printf("Unable to load %s\n", filename);
|
||||
return 0;
|
||||
}
|
||||
|
||||
strcpy(g_loadedImages.filename[index], filename); g_loadedImages.count++;
|
||||
|
||||
return &g_loadedImages.image[index];
|
||||
}
|
||||
*/
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
static void updatePlacement()
|
||||
{
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
static bool RocketGui_regionHitSlider(const RocketControlInfo* control)
|
||||
{
|
||||
if (g_rocketGuiState.mousex < control->sliderThumbX ||
|
||||
g_rocketGuiState.mousey < control->sliderThumbY ||
|
||||
g_rocketGuiState.mousex >= control->sliderThumbX + control->sliderThumbWidth ||
|
||||
g_rocketGuiState.mousey >= control->sliderThumbY + control->sliderThumbHeight)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
void RocketGui_drawBorder(uint32_t color0, uint32_t color1, int x, int y, int w, int h)
|
||||
{
|
||||
RocketGui_fill(color0, x, y, 1, h);
|
||||
RocketGui_fill(color0, x, y, w, 1);
|
||||
RocketGui_fill(color1, x + w, y, 1, h);
|
||||
RocketGui_fill(color1, x, y + h, w, 1);
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
void RocketGui_fill(uint32_t color, int x, int y, int w, int h)
|
||||
{
|
||||
uint32_t controlId = 0;
|
||||
RocketControlInfo* control = 0;
|
||||
|
||||
// Setup the control
|
||||
controlId = s_controlId++;
|
||||
control = &g_controls[controlId];
|
||||
control->type = DRAWTYPE_FILL;
|
||||
control->x = x;
|
||||
control->y = y;
|
||||
control->width = w;
|
||||
control->height = h;
|
||||
control->color = color;
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
void RocketGui_textLabelXY(const char* text, int x, int y)
|
||||
{
|
||||
uint32_t controlId = 0;
|
||||
RocketControlInfo* control = 0;
|
||||
|
||||
// Setup the control
|
||||
controlId = s_controlId++;
|
||||
control = &g_controls[controlId];
|
||||
control->type = DRAWTYPE_TEXT;
|
||||
control->color = 0;
|
||||
control->x = x;
|
||||
control->y = y;
|
||||
control->text = (char*)text;
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
float floatClamp(float value, float low, float high)
|
||||
{
|
||||
if (value < low)
|
||||
value = low;
|
||||
|
||||
if (value > high)
|
||||
value = high;
|
||||
|
||||
return value;
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
bool RocketGui_slider(int x, int y, int w, int h, int start, int end, enum RocketSliderDirection dir, int itemSpace, int* value)
|
||||
{
|
||||
int thumbPosition = 0;
|
||||
uint32_t controlId = 0;
|
||||
float thumbSize = 0.0f, range;
|
||||
RocketControlInfo* control = 0;
|
||||
|
||||
// Setup the control
|
||||
controlId = s_controlId++;
|
||||
control = &g_controls[controlId];
|
||||
control->type = DRAWTYPE_SLIDER;
|
||||
control->x = x;
|
||||
control->y = y;
|
||||
control->width = w;
|
||||
control->height = h;
|
||||
|
||||
// considering how much stuff we have have in the slider we need to calculate how much space the scolling area actually
|
||||
// is so we can resize the thumb
|
||||
|
||||
range = end - start;
|
||||
|
||||
if (dir == SLIDERDIRECTION_VERTICAL)
|
||||
{
|
||||
float v = *value;
|
||||
int itemsHeight = (end - start) * itemSpace;
|
||||
int sliderHeigthArea = h - y;
|
||||
|
||||
if (itemsHeight <= 0)
|
||||
itemsHeight = 1;
|
||||
|
||||
thumbPosition = y + ((v / range) * h);
|
||||
|
||||
thumbSize = (float)sliderHeigthArea / (float)itemsHeight;
|
||||
thumbSize = /*floatClamp(thumbSize, 0.05, 1.0f)*/ 1.0f * sliderHeigthArea;
|
||||
|
||||
control->sliderThumbX = x + 1;
|
||||
control->sliderThumbY = thumbPosition + 1;
|
||||
control->sliderThumbWidth = w - 1;
|
||||
control->sliderThumbHeight = (int)thumbSize;
|
||||
}
|
||||
else
|
||||
{
|
||||
// handle Horizontal here:
|
||||
}
|
||||
|
||||
if (RocketGui_regionHitSlider(control))
|
||||
{
|
||||
g_rocketGuiState.hotItem = controlId;
|
||||
if (g_rocketGuiState.activeItem == 0 && g_rocketGuiState.mouseDown)
|
||||
g_rocketGuiState.activeItem = controlId;
|
||||
}
|
||||
|
||||
//
|
||||
|
||||
|
||||
if (g_rocketGuiState.activeItem == controlId)
|
||||
{
|
||||
if (dir == SLIDERDIRECTION_VERTICAL)
|
||||
{
|
||||
float mouseYrelative;
|
||||
int mousePos = g_rocketGuiState.mousey - (y + control->sliderThumbHeight / 2);
|
||||
int mouseYlimit = control->height - control->sliderThumbHeight;
|
||||
if (mousePos < 0) mousePos = 0;
|
||||
if (mousePos > mouseYlimit) mousePos = mouseYlimit;
|
||||
|
||||
mouseYrelative = (float)mousePos / (float)control->height;
|
||||
control->sliderThumbY = (int)(y + mouseYrelative * h);
|
||||
*value = start + (range * mouseYrelative);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
RocketControlInfo* RocketGui_textLabel(const char* text)
|
||||
{
|
||||
uint32_t controlId = 0;
|
||||
RocketControlInfo* control = 0;
|
||||
|
||||
// Setup the control
|
||||
controlId = s_controlId++;
|
||||
control = &g_controls[controlId];
|
||||
control->type = DRAWTYPE_TEXT;
|
||||
control->x = g_placementInfo.x;
|
||||
control->y = g_placementInfo.y;
|
||||
control->width = strlen(text) * 9; // fix me
|
||||
control->height = 9; // fixme
|
||||
control->text = (char*)text;
|
||||
control->color = 0;
|
||||
|
||||
switch (g_placementInfo.state)
|
||||
{
|
||||
case PLACEMENTSTATE_NONE :
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
case PLACEMENTSTATE_HORIZONAL :
|
||||
{
|
||||
g_placementInfo.x += control->width;
|
||||
break;
|
||||
}
|
||||
|
||||
case PLACEMENTSTATE_VERTICAL :
|
||||
{
|
||||
g_placementInfo.y += 9; // TODO: Use correct size from font
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return control;
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
static uint32_t genericImageControl(const char* filename)
|
||||
{
|
||||
uint32_t controlId = 0;
|
||||
RocketControlInfo* control = 0;
|
||||
struct RocketImage* image = 0; //loadImage(filename);
|
||||
|
||||
if (!image)
|
||||
return ~0;
|
||||
|
||||
// Setup the control
|
||||
|
||||
controlId = s_controlId++;
|
||||
control = &g_controls[controlId];
|
||||
control->type = DRAWTYPE_IMAGE;
|
||||
control->x = g_placementInfo.x;
|
||||
control->y = g_placementInfo.y;
|
||||
//control->width = image->width;
|
||||
//control->height = image->height;
|
||||
control->imageData = image;
|
||||
|
||||
updatePlacement();
|
||||
|
||||
switch (g_placementInfo.state)
|
||||
{
|
||||
case PLACEMENTSTATE_NONE :
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
case PLACEMENTSTATE_HORIZONAL :
|
||||
{
|
||||
//g_placementInfo.x += image->width;
|
||||
break;
|
||||
}
|
||||
|
||||
case PLACEMENTSTATE_VERTICAL :
|
||||
{
|
||||
//g_placementInfo.y += image->height;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return controlId;
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
void RocketGui_staticImage(const char* filename)
|
||||
{
|
||||
genericImageControl(filename);
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
/*
|
||||
static void highlightControl(RocketControlInfo* control)
|
||||
{
|
||||
RocketGui_fill(0xb0ffffff, control->x, control->y, control->width, control->height);
|
||||
}
|
||||
*/
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
bool RocketGui_buttonImage(const char* filename)
|
||||
{
|
||||
RocketControlInfo* control;
|
||||
uint32_t controlId = 0;
|
||||
|
||||
controlId = genericImageControl(filename);
|
||||
|
||||
if (controlId == ~0)
|
||||
return false;
|
||||
|
||||
control = &g_controls[controlId];
|
||||
|
||||
if (RocketGui_regionHit(control))
|
||||
{
|
||||
g_rocketGuiState.hotItem = controlId;
|
||||
if (g_rocketGuiState.activeItem == 0 && g_rocketGuiState.mouseDown)
|
||||
g_rocketGuiState.activeItem = controlId;
|
||||
|
||||
//highlightControl(control);
|
||||
}
|
||||
|
||||
if (g_rocketGuiState.mouseDown == 0 && g_rocketGuiState.hotItem == controlId && g_rocketGuiState.activeItem == controlId)
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
void RocketGui_end()
|
||||
{
|
||||
if (g_rocketGuiState.mouseDown == 0)
|
||||
{
|
||||
g_rocketGuiState.activeItem = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (g_rocketGuiState.activeItem == 0)
|
||||
g_rocketGuiState.activeItem = -1;
|
||||
}
|
||||
|
||||
GFXBackend_draw();
|
||||
|
||||
//RocketWindow_refresh();
|
||||
}
|
||||
|
||||
97
ogl_editor/src/RocketGui.h
Normal file
97
ogl_editor/src/RocketGui.h
Normal file
@ -0,0 +1,97 @@
|
||||
#pragma once
|
||||
|
||||
#include <Core/Types.h>
|
||||
|
||||
struct RocketImage;
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
typedef struct RocketGuiState
|
||||
{
|
||||
int mousex;
|
||||
int mousey;
|
||||
int mouseDown;
|
||||
|
||||
int hotItem;
|
||||
int activeItem;
|
||||
|
||||
int kbdItem;
|
||||
int keyEntered;
|
||||
int keyMod;
|
||||
|
||||
int lastWidget;
|
||||
|
||||
} RocketGuiState;
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
enum RocketDrawType
|
||||
{
|
||||
DRAWTYPE_NONE,
|
||||
DRAWTYPE_FILL,
|
||||
DRAWTYPE_IMAGE,
|
||||
DRAWTYPE_TEXT,
|
||||
DRAWTYPE_SLIDER,
|
||||
};
|
||||
|
||||
enum RocketSliderDirection
|
||||
{
|
||||
SLIDERDIRECTION_HORIZONTAL,
|
||||
SLIDERDIRECTION_VERTICAL,
|
||||
};
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
typedef struct RocketControlInfo
|
||||
{
|
||||
enum RocketDrawType type;
|
||||
|
||||
int x;
|
||||
int y;
|
||||
int width;
|
||||
int height;
|
||||
|
||||
unsigned int color;
|
||||
struct RocketImage* imageData;
|
||||
char* text;
|
||||
|
||||
// todo: Use union with all data instead
|
||||
int sliderThumbX;
|
||||
int sliderThumbY;
|
||||
int sliderThumbWidth;
|
||||
int sliderThumbHeight;
|
||||
|
||||
} RocketControlInfo;
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
void RocketGui_init();
|
||||
void RocketGui_reset();
|
||||
void RocketGui_begin();
|
||||
void RocketGui_end();
|
||||
|
||||
void RocketGui_beginVerticalStackPanelXY(int x, int y);
|
||||
void RocketGui_beginHorizontalStackPanelXY(int x, int y);
|
||||
|
||||
void RocketGui_beginVerticalStackPanel();
|
||||
void RocketGui_beginHorizontalStackPanel();
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// Different controlls and gui functions
|
||||
|
||||
RocketControlInfo* RocketGui_textLabel(const char* text);
|
||||
|
||||
void RocketGui_staticImage(const char* filename);
|
||||
void RocketGui_fill(uint32_t color, int x, int y, int w, int h);
|
||||
void RocketGui_drawBorder(uint32_t color0, uint32_t color1, int x, int y, int w, int h);
|
||||
void RocketGui_textLabelXY(const char* text, int x, int y);
|
||||
|
||||
bool RocketGui_slider(int x, int y, int w, int h, int start, int end,
|
||||
enum RocketSliderDirection dir, int itemSpace, int* value);
|
||||
|
||||
bool RocketGui_buttonCoords(const char* text, int x, int y);
|
||||
bool RocketGui_buttonCoordsImage(const char* text, int x, int y);
|
||||
|
||||
bool RocketGui_button(const char* text);
|
||||
bool RocketGui_buttonImage(const char* filename);
|
||||
|
||||
9
ogl_editor/src/macosx/RocketView.h
Normal file
9
ogl_editor/src/macosx/RocketView.h
Normal file
@ -0,0 +1,9 @@
|
||||
#import <AppKit/AppKit.h>
|
||||
|
||||
@interface RocketView : NSView
|
||||
{
|
||||
NSOpenGLContext* oglContext;
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
108
ogl_editor/src/macosx/RocketView.m
Normal file
108
ogl_editor/src/macosx/RocketView.m
Normal file
@ -0,0 +1,108 @@
|
||||
//
|
||||
|
||||
#import "RocketView.h"
|
||||
#include <OpenGLRenderer/OpenGLRenderer.h>
|
||||
|
||||
extern void Editor_init();
|
||||
extern void Editor_guiUpdate();
|
||||
|
||||
@implementation RocketView
|
||||
|
||||
- (id)initWithFrame:(NSRect)frame
|
||||
{
|
||||
self = [super initWithFrame:frame];
|
||||
if (self == nil)
|
||||
return nil;
|
||||
|
||||
// create and activate the context object which maintains the OpenGL state
|
||||
oglContext = [[NSOpenGLContext alloc] initWithFormat: [NSOpenGLView defaultPixelFormat] shareContext: nil];
|
||||
[oglContext makeCurrentContext];
|
||||
|
||||
GFXBackend_create();
|
||||
Editor_init();
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
- (void)lockFocus
|
||||
{
|
||||
NSOpenGLContext* context = oglContext;
|
||||
|
||||
// make sure we are ready to draw
|
||||
[super lockFocus];
|
||||
|
||||
// when we are about to draw, make sure we are linked to the view
|
||||
// It is not possible to call setView: earlier (will yield 'invalid drawable')
|
||||
if ([context view] != self)
|
||||
{
|
||||
[context setView:self];
|
||||
}
|
||||
|
||||
// make us the current OpenGL context
|
||||
[context makeCurrentContext];
|
||||
}
|
||||
|
||||
// this is called whenever the view changes (is unhidden or resized)
|
||||
- (void)drawRect:(NSRect)frameRect
|
||||
{
|
||||
// inform the context that the view has been resized
|
||||
[oglContext update];
|
||||
|
||||
GFXBackend_updateViewPort(frameRect.size.width, frameRect.size.height);
|
||||
Editor_guiUpdate();
|
||||
}
|
||||
|
||||
- (void)keyDown:(NSEvent *)theEvent
|
||||
{
|
||||
if ([theEvent modifierFlags] & NSNumericPadKeyMask) { // arrow keys have this mask
|
||||
NSString *theArrow = [theEvent charactersIgnoringModifiers];
|
||||
unichar keyChar = 0;
|
||||
if ( [theArrow length] == 0 )
|
||||
return; // reject dead keys
|
||||
if ( [theArrow length] == 1 ) {
|
||||
keyChar = [theArrow characterAtIndex:0];
|
||||
if ( keyChar == NSLeftArrowFunctionKey ) {
|
||||
printf("LeftArrow\n");
|
||||
return;
|
||||
}
|
||||
if ( keyChar == NSRightArrowFunctionKey ) {
|
||||
printf("RightArrow\n");
|
||||
return;
|
||||
}
|
||||
if ( keyChar == NSUpArrowFunctionKey ) {
|
||||
printf("UpArrow\n");
|
||||
return;
|
||||
}
|
||||
if ( keyChar == NSDownArrowFunctionKey ) {
|
||||
printf("DownArrow\n");
|
||||
return;
|
||||
}
|
||||
[super keyDown:theEvent];
|
||||
}
|
||||
}
|
||||
[super keyDown:theEvent];
|
||||
}
|
||||
|
||||
- (BOOL)acceptsFirstResponder
|
||||
{
|
||||
return YES;
|
||||
}
|
||||
|
||||
- (void)mouseDown:(NSEvent *)theEvent
|
||||
{
|
||||
printf("mouseDown\n");
|
||||
[[self nextResponder] mouseDown:theEvent];
|
||||
}
|
||||
|
||||
-(BOOL) isOpaque
|
||||
{
|
||||
return YES;
|
||||
}
|
||||
|
||||
-(void) dealloc
|
||||
{
|
||||
GFXBackend_destroy();
|
||||
[super dealloc];
|
||||
}
|
||||
|
||||
@end
|
||||
14
ogl_editor/src/macosx/delegate.h
Normal file
14
ogl_editor/src/macosx/delegate.h
Normal file
@ -0,0 +1,14 @@
|
||||
|
||||
#import <Cocoa/Cocoa.h>
|
||||
|
||||
@interface MinimalAppAppDelegate : NSObject <NSApplicationDelegate> {
|
||||
NSWindow *window;
|
||||
NSButton *button;
|
||||
}
|
||||
|
||||
- (IBAction) buttonClicked:(id)sender;
|
||||
|
||||
@property (assign) IBOutlet NSWindow *window;
|
||||
@property (assign) IBOutlet NSButton *button;
|
||||
|
||||
@end
|
||||
19
ogl_editor/src/macosx/delegate.m
Normal file
19
ogl_editor/src/macosx/delegate.m
Normal file
@ -0,0 +1,19 @@
|
||||
|
||||
#import "delegate.h"
|
||||
|
||||
@implementation MinimalAppAppDelegate
|
||||
|
||||
@synthesize window;
|
||||
@synthesize button;
|
||||
|
||||
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
|
||||
// Insert code here to initialize your application
|
||||
}
|
||||
|
||||
- (IBAction) buttonClicked:(id)sender {
|
||||
NSRunAlertPanel(@"Hello, world",
|
||||
@"Hello",
|
||||
@"OK", nil, nil);
|
||||
}
|
||||
|
||||
@end
|
||||
8
ogl_editor/src/macosx/main.m
Normal file
8
ogl_editor/src/macosx/main.m
Normal file
@ -0,0 +1,8 @@
|
||||
|
||||
#import <OpenGL/OpenGL.h>
|
||||
#import <Cocoa/Cocoa.h>
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
return NSApplicationMain(argc, (const char **) argv);
|
||||
}
|
||||
24
tundra.lua
Normal file
24
tundra.lua
Normal file
@ -0,0 +1,24 @@
|
||||
|
||||
Build {
|
||||
Units = "units.lua",
|
||||
|
||||
SyntaxExtensions = { "tundra.syntax.glob", "tundra.syntax.osx-bundle" },
|
||||
|
||||
Configs = {
|
||||
{
|
||||
Name = "macosx-clang",
|
||||
DefaultOnHost = "macosx",
|
||||
Tools = { "clang-osx" },
|
||||
Env = {
|
||||
LIBPATH = { "/usr/lib/gcc/i686-apple-darwin10/4.2.1/x86_64" },
|
||||
CPPDEFS = { "SDLROCKET_MACOSX" },
|
||||
CCOPTS = {
|
||||
{ "-g", "-O0" ; Config = { "*-gcc-debug", "*-clang-debug" } }
|
||||
},
|
||||
CXXOPTS = {
|
||||
{ "-g", "-O0"; Config = "macosx-clang-debug" },
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
90
units.lua
Normal file
90
units.lua
Normal file
@ -0,0 +1,90 @@
|
||||
StaticLibrary {
|
||||
Name = "mxml",
|
||||
|
||||
Env = {
|
||||
CPPPATH = { "." },
|
||||
PROGOPTS = {
|
||||
{ "/SUBSYSTEM:WINDOWS", "/DEBUG"; Config = { "win32-*-*", "win64-*-*" } },
|
||||
},
|
||||
|
||||
CPPDEFS = {
|
||||
{"_THREAD_SAFE", "_REENTRANT"; Config = "macosx-*-*" }
|
||||
},
|
||||
|
||||
CCOPTS = {
|
||||
{ "-Wall"; Config = "macosx-clang-*" },
|
||||
},
|
||||
},
|
||||
|
||||
Sources = {
|
||||
Glob {
|
||||
Dir = "ogl_editor/src/External/mxml",
|
||||
Extensions = { ".c" },
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
StaticLibrary {
|
||||
Name = "sync",
|
||||
|
||||
Sources = {
|
||||
Glob {
|
||||
Dir = "sync",
|
||||
Extensions = { ".c" },
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
|
||||
Program {
|
||||
Name = "editor",
|
||||
|
||||
Env = {
|
||||
CPPPATH = { ".", "ogl_editor/src" },
|
||||
PROGOPTS = {
|
||||
{ "/SUBSYSTEM:WINDOWS", "/DEBUG"; Config = { "win32-*-*", "win64-*-*" } },
|
||||
},
|
||||
|
||||
CPPDEFS = {
|
||||
{ "ROCKETGUI_MACOSX", Config = "macosx-*-*" },
|
||||
{ "ROCKETGUI_WIN32"; Config = { "win32-*-*", "win64-*-*" } },
|
||||
},
|
||||
|
||||
CCOPTS = {
|
||||
{ "-Werror", "-pedantic-errors", "-Wall"; Config = "macosx-clang-*" },
|
||||
},
|
||||
},
|
||||
|
||||
Depends = { "sync", "mxml" },
|
||||
|
||||
Frameworks = { "Cocoa", "OpenGL" },
|
||||
|
||||
Sources = {
|
||||
FGlob {
|
||||
Dir = "ogl_editor/src",
|
||||
Extensions = { ".c", ".m" },
|
||||
Filters = {
|
||||
{ Pattern = "macosx"; Config = "macosx-*-*" },
|
||||
{ Pattern = "windows"; Config = { "win32-*-*", "win64-*-*" } },
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
Default "editor"
|
||||
|
||||
local rocketBundle = OsxBundle
|
||||
{
|
||||
Depends = { "editor" },
|
||||
Target = "$(OBJECTDIR)/RocketEditor.app",
|
||||
InfoPList = "ogl_editor/data/macosx/Info.plist",
|
||||
Executable = "$(OBJECTDIR)/editor",
|
||||
Resources = {
|
||||
CompileNib { Source = "ogl_editor/data/macosx/appnib.xib", Target = "appnib.nib" },
|
||||
"ogl_editor/data/macosx/icon.icns",
|
||||
},
|
||||
}
|
||||
|
||||
Default(rocketBundle)
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user