mirror of https://github.com/axmolengine/axmol.git
Tidy thirdparty lua-cjson
This commit is contained in:
parent
4b7e098e65
commit
6acbbaf80f
|
@ -148,14 +148,6 @@ set(lua_bindings_headers
|
||||||
${COCOS_DEPRECATED_HEADER}
|
${COCOS_DEPRECATED_HEADER}
|
||||||
)
|
)
|
||||||
|
|
||||||
# lua-cjson
|
|
||||||
set(lua_bindings_files
|
|
||||||
${lua_bindings_files}
|
|
||||||
lua-cjson/fpconv.c
|
|
||||||
lua-cjson/strbuf.c
|
|
||||||
lua-cjson/lua_cjson.c
|
|
||||||
)
|
|
||||||
|
|
||||||
set(lua_bindings_files
|
set(lua_bindings_files
|
||||||
${lua_bindings_files}
|
${lua_bindings_files}
|
||||||
"${cocos_root}/thirdparty/yasio/bindings/lyasio.cpp"
|
"${cocos_root}/thirdparty/yasio/bindings/lyasio.cpp"
|
||||||
|
|
|
@ -1,204 +0,0 @@
|
||||||
/* fpconv - Floating point conversion routines
|
|
||||||
*
|
|
||||||
* Copyright (c) 2011-2012 Mark Pulford <mark@kyne.com.au>
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining
|
|
||||||
* a copy of this software and associated documentation files (the
|
|
||||||
* "Software"), to deal in the Software without restriction, including
|
|
||||||
* without limitation the rights to use, copy, modify, merge, publish,
|
|
||||||
* distribute, sublicense, and/or sell copies of the Software, and to
|
|
||||||
* permit persons to whom the Software is furnished to do so, subject to
|
|
||||||
* the following conditions:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice shall be
|
|
||||||
* included in all copies or substantial portions of the Software.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
||||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
||||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
|
||||||
* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
|
||||||
* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
|
||||||
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
|
||||||
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* JSON uses a '.' decimal separator. strtod() / sprintf() under C libraries
|
|
||||||
* with locale support will break when the decimal separator is a comma.
|
|
||||||
*
|
|
||||||
* fpconv_* will around these issues with a translation buffer if required.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <assert.h>
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
#include "fpconv.h"
|
|
||||||
|
|
||||||
/* Lua CJSON assumes the locale is the same for all threads within a
|
|
||||||
* process and doesn't change after initialisation.
|
|
||||||
*
|
|
||||||
* This avoids the need for per thread storage or expensive checks
|
|
||||||
* for call. */
|
|
||||||
static char locale_decimal_point = '.';
|
|
||||||
|
|
||||||
/* In theory multibyte decimal_points are possible, but
|
|
||||||
* Lua CJSON only supports UTF-8 and known locales only have
|
|
||||||
* single byte decimal points ([.,]).
|
|
||||||
*
|
|
||||||
* localconv() may not be thread safe (=>crash), and nl_langinfo() is
|
|
||||||
* not supported on some platforms. Use sprintf() instead - if the
|
|
||||||
* locale does change, at least Lua CJSON won't crash. */
|
|
||||||
static void fpconv_update_locale()
|
|
||||||
{
|
|
||||||
char buf[8];
|
|
||||||
|
|
||||||
snprintf(buf, sizeof(buf), "%.5g", 0.5);
|
|
||||||
|
|
||||||
/* Failing this test might imply the platform has a buggy dtoa
|
|
||||||
* implementation or wide characters */
|
|
||||||
if (buf[0] != '0' || buf[2] != '5' || buf[3] != 0) {
|
|
||||||
fprintf(stderr, "Warning: wide characters found or printf() bug.");
|
|
||||||
}
|
|
||||||
|
|
||||||
locale_decimal_point = buf[1];
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Check for a valid number character: [-+0-9a-yA-Y.]
|
|
||||||
* Eg: -0.6e+5, infinity, 0xF0.F0pF0
|
|
||||||
*
|
|
||||||
* Used to find the probable end of a number. It doesn't matter if
|
|
||||||
* invalid characters are counted - strtod() will find the valid
|
|
||||||
* number if it exists. The risk is that slightly more memory might
|
|
||||||
* be allocated before a parse error occurs. */
|
|
||||||
static inline int valid_number_character(char ch)
|
|
||||||
{
|
|
||||||
char lower_ch;
|
|
||||||
|
|
||||||
if ('0' <= ch && ch <= '9')
|
|
||||||
return 1;
|
|
||||||
if (ch == '-' || ch == '+' || ch == '.')
|
|
||||||
return 1;
|
|
||||||
|
|
||||||
/* Hex digits, exponent (e), base (p), "infinity",.. */
|
|
||||||
lower_ch = ch | 0x20;
|
|
||||||
if ('a' <= lower_ch && lower_ch <= 'y')
|
|
||||||
return 1;
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Calculate the size of the buffer required for a strtod locale
|
|
||||||
* conversion. */
|
|
||||||
static int strtod_buffer_size(const char *s)
|
|
||||||
{
|
|
||||||
const char *p = s;
|
|
||||||
|
|
||||||
while (valid_number_character(*p))
|
|
||||||
p++;
|
|
||||||
|
|
||||||
return p - s;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Similar to strtod(), but must be passed the current locale's decimal point
|
|
||||||
* character. Guaranteed to be called at the start of any valid number in a string */
|
|
||||||
double fpconv_strtod(const char *nptr, char **endptr)
|
|
||||||
{
|
|
||||||
char localbuf[FPCONV_G_FMT_BUFSIZE];
|
|
||||||
char *buf, *endbuf, *dp;
|
|
||||||
int buflen;
|
|
||||||
double value;
|
|
||||||
|
|
||||||
/* System strtod() is fine when decimal point is '.' */
|
|
||||||
if (locale_decimal_point == '.')
|
|
||||||
return strtod(nptr, endptr);
|
|
||||||
|
|
||||||
buflen = strtod_buffer_size(nptr);
|
|
||||||
if (!buflen) {
|
|
||||||
/* No valid characters found, standard strtod() return */
|
|
||||||
*endptr = (char *)nptr;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Duplicate number into buffer */
|
|
||||||
if (buflen >= FPCONV_G_FMT_BUFSIZE) {
|
|
||||||
/* Handle unusually large numbers */
|
|
||||||
buf = malloc(buflen + 1);
|
|
||||||
if (!buf) {
|
|
||||||
fprintf(stderr, "Out of memory");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
/* This is the common case.. */
|
|
||||||
buf = localbuf;
|
|
||||||
}
|
|
||||||
memcpy(buf, nptr, buflen);
|
|
||||||
buf[buflen] = 0;
|
|
||||||
|
|
||||||
/* Update decimal point character if found */
|
|
||||||
dp = strchr(buf, '.');
|
|
||||||
if (dp)
|
|
||||||
*dp = locale_decimal_point;
|
|
||||||
|
|
||||||
value = strtod(buf, &endbuf);
|
|
||||||
*endptr = (char *)&nptr[endbuf - buf];
|
|
||||||
if (buflen >= FPCONV_G_FMT_BUFSIZE)
|
|
||||||
free(buf);
|
|
||||||
|
|
||||||
return value;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* "fmt" must point to a buffer of at least 6 characters */
|
|
||||||
static void set_number_format(char *fmt, int precision)
|
|
||||||
{
|
|
||||||
int d1, d2, i;
|
|
||||||
|
|
||||||
assert(1 <= precision && precision <= 14);
|
|
||||||
|
|
||||||
/* Create printf format (%.14g) from precision */
|
|
||||||
d1 = precision / 10;
|
|
||||||
d2 = precision % 10;
|
|
||||||
fmt[0] = '%';
|
|
||||||
fmt[1] = '.';
|
|
||||||
i = 2;
|
|
||||||
if (d1) {
|
|
||||||
fmt[i++] = '0' + d1;
|
|
||||||
}
|
|
||||||
fmt[i++] = '0' + d2;
|
|
||||||
fmt[i++] = 'g';
|
|
||||||
fmt[i] = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Assumes there is always at least 32 characters available in the target buffer */
|
|
||||||
int fpconv_g_fmt(char *str, double num, int precision)
|
|
||||||
{
|
|
||||||
char buf[FPCONV_G_FMT_BUFSIZE];
|
|
||||||
char fmt[6];
|
|
||||||
int len;
|
|
||||||
char *b;
|
|
||||||
|
|
||||||
set_number_format(fmt, precision);
|
|
||||||
|
|
||||||
/* Pass through when decimal point character is dot. */
|
|
||||||
if (locale_decimal_point == '.')
|
|
||||||
return snprintf(str, FPCONV_G_FMT_BUFSIZE, fmt, num);
|
|
||||||
|
|
||||||
/* snprintf() to a buffer then translate for other decimal point characters */
|
|
||||||
len = snprintf(buf, FPCONV_G_FMT_BUFSIZE, fmt, num);
|
|
||||||
|
|
||||||
/* Copy into target location. Translate decimal point if required */
|
|
||||||
b = buf;
|
|
||||||
do {
|
|
||||||
*str++ = (*b == locale_decimal_point ? '.' : *b);
|
|
||||||
} while(*b++);
|
|
||||||
|
|
||||||
return len;
|
|
||||||
}
|
|
||||||
|
|
||||||
void fpconv_init()
|
|
||||||
{
|
|
||||||
fpconv_update_locale();
|
|
||||||
}
|
|
||||||
|
|
||||||
/* vi:ai et sw=4 ts=4:
|
|
||||||
*/
|
|
|
@ -1,31 +0,0 @@
|
||||||
/* Lua CJSON floating point conversion routines */
|
|
||||||
|
|
||||||
/* Buffer required to store the largest string representation of a double.
|
|
||||||
*
|
|
||||||
* Longest double printed with %.14g is 21 characters long:
|
|
||||||
* -1.7976931348623e+308 */
|
|
||||||
# define FPCONV_G_FMT_BUFSIZE 32
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef USE_INTERNAL_FPCONV
|
|
||||||
static inline void fpconv_init()
|
|
||||||
{
|
|
||||||
/* Do nothing - not required */
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
extern void fpconv_init();
|
|
||||||
#endif
|
|
||||||
|
|
||||||
extern int fpconv_g_fmt(char*, double, int);
|
|
||||||
extern double fpconv_strtod(const char*, char**);
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* vi:ai et sw=4 ts=4:
|
|
||||||
*/
|
|
File diff suppressed because it is too large
Load Diff
|
@ -1,20 +0,0 @@
|
||||||
|
|
||||||
#ifndef __LUA_CJSON_H_
|
|
||||||
#define __LUA_CJSON_H_
|
|
||||||
|
|
||||||
#include "lua.h"
|
|
||||||
|
|
||||||
#define USE_INTERNAL_FPCONV
|
|
||||||
|
|
||||||
#if defined(__cplusplus)
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
int luaopen_cjson(lua_State* l);
|
|
||||||
int luaopen_cjson_safe(lua_State* l);
|
|
||||||
|
|
||||||
#if defined(__cplusplus)
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif // __LUA_CJSON_H_
|
|
|
@ -1,252 +0,0 @@
|
||||||
/* strbuf - String buffer routines
|
|
||||||
*
|
|
||||||
* Copyright (c) 2010-2012 Mark Pulford <mark@kyne.com.au>
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining
|
|
||||||
* a copy of this software and associated documentation files (the
|
|
||||||
* "Software"), to deal in the Software without restriction, including
|
|
||||||
* without limitation the rights to use, copy, modify, merge, publish,
|
|
||||||
* distribute, sublicense, and/or sell copies of the Software, and to
|
|
||||||
* permit persons to whom the Software is furnished to do so, subject to
|
|
||||||
* the following conditions:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice shall be
|
|
||||||
* included in all copies or substantial portions of the Software.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
||||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
||||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
|
||||||
* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
|
||||||
* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
|
||||||
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
|
||||||
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <stdarg.h>
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
#include "strbuf.h"
|
|
||||||
|
|
||||||
static void die(const char *fmt, ...)
|
|
||||||
{
|
|
||||||
va_list arg;
|
|
||||||
|
|
||||||
va_start(arg, fmt);
|
|
||||||
vfprintf(stderr, fmt, arg);
|
|
||||||
va_end(arg);
|
|
||||||
fprintf(stderr, "\n");
|
|
||||||
|
|
||||||
exit(-1);
|
|
||||||
}
|
|
||||||
|
|
||||||
void strbuf_init(strbuf_t *s, int len)
|
|
||||||
{
|
|
||||||
int size;
|
|
||||||
|
|
||||||
if (len <= 0)
|
|
||||||
size = STRBUF_DEFAULT_SIZE;
|
|
||||||
else
|
|
||||||
size = len + 1; /* \0 terminator */
|
|
||||||
|
|
||||||
s->buf = NULL;
|
|
||||||
s->size = size;
|
|
||||||
s->length = 0;
|
|
||||||
s->increment = STRBUF_DEFAULT_INCREMENT;
|
|
||||||
s->dynamic = 0;
|
|
||||||
s->reallocs = 0;
|
|
||||||
s->debug = 0;
|
|
||||||
|
|
||||||
s->buf = (char *)malloc(size);
|
|
||||||
if (!s->buf)
|
|
||||||
die("Out of memory");
|
|
||||||
|
|
||||||
strbuf_ensure_null(s);
|
|
||||||
}
|
|
||||||
|
|
||||||
strbuf_t *strbuf_new(int len)
|
|
||||||
{
|
|
||||||
strbuf_t *s;
|
|
||||||
|
|
||||||
s = (strbuf_t*)malloc(sizeof(strbuf_t));
|
|
||||||
if (!s)
|
|
||||||
die("Out of memory");
|
|
||||||
|
|
||||||
strbuf_init(s, len);
|
|
||||||
|
|
||||||
/* Dynamic strbuf allocation / deallocation */
|
|
||||||
s->dynamic = 1;
|
|
||||||
|
|
||||||
return s;
|
|
||||||
}
|
|
||||||
|
|
||||||
void strbuf_set_increment(strbuf_t *s, int increment)
|
|
||||||
{
|
|
||||||
/* Increment > 0: Linear buffer growth rate
|
|
||||||
* Increment < -1: Exponential buffer growth rate */
|
|
||||||
if (increment == 0 || increment == -1)
|
|
||||||
die("BUG: Invalid string increment");
|
|
||||||
|
|
||||||
s->increment = increment;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void debug_stats(strbuf_t *s)
|
|
||||||
{
|
|
||||||
if (s->debug) {
|
|
||||||
fprintf(stderr, "strbuf(%lx) reallocs: %d, length: %d, size: %d\n",
|
|
||||||
(long)s, s->reallocs, s->length, s->size);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If strbuf_t has not been dynamically allocated, strbuf_free() can
|
|
||||||
* be called any number of times strbuf_init() */
|
|
||||||
void strbuf_free(strbuf_t *s)
|
|
||||||
{
|
|
||||||
debug_stats(s);
|
|
||||||
|
|
||||||
if (s->buf) {
|
|
||||||
free(s->buf);
|
|
||||||
s->buf = NULL;
|
|
||||||
}
|
|
||||||
if (s->dynamic)
|
|
||||||
free(s);
|
|
||||||
}
|
|
||||||
|
|
||||||
char *strbuf_free_to_string(strbuf_t *s, int *len)
|
|
||||||
{
|
|
||||||
char *buf;
|
|
||||||
|
|
||||||
debug_stats(s);
|
|
||||||
|
|
||||||
strbuf_ensure_null(s);
|
|
||||||
|
|
||||||
buf = s->buf;
|
|
||||||
if (len)
|
|
||||||
*len = s->length;
|
|
||||||
|
|
||||||
if (s->dynamic)
|
|
||||||
free(s);
|
|
||||||
|
|
||||||
return buf;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int calculate_new_size(strbuf_t *s, int len)
|
|
||||||
{
|
|
||||||
int reqsize, newsize;
|
|
||||||
|
|
||||||
if (len <= 0)
|
|
||||||
die("BUG: Invalid strbuf length requested");
|
|
||||||
|
|
||||||
/* Ensure there is room for optional NULL termination */
|
|
||||||
reqsize = len + 1;
|
|
||||||
|
|
||||||
/* If the user has requested to shrink the buffer, do it exactly */
|
|
||||||
if (s->size > reqsize)
|
|
||||||
return reqsize;
|
|
||||||
|
|
||||||
newsize = s->size;
|
|
||||||
if (s->increment < 0) {
|
|
||||||
/* Exponential sizing */
|
|
||||||
while (newsize < reqsize)
|
|
||||||
newsize *= -s->increment;
|
|
||||||
} else {
|
|
||||||
/* Linear sizing */
|
|
||||||
newsize = ((newsize + s->increment - 1) / s->increment) * s->increment;
|
|
||||||
}
|
|
||||||
|
|
||||||
return newsize;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* Ensure strbuf can handle a string length bytes long (ignoring NULL
|
|
||||||
* optional termination). */
|
|
||||||
void strbuf_resize(strbuf_t *s, int len)
|
|
||||||
{
|
|
||||||
int newsize;
|
|
||||||
|
|
||||||
newsize = calculate_new_size(s, len);
|
|
||||||
|
|
||||||
if (s->debug > 1) {
|
|
||||||
fprintf(stderr, "strbuf(%lx) resize: %d => %d\n",
|
|
||||||
(long)s, s->size, newsize);
|
|
||||||
}
|
|
||||||
|
|
||||||
s->size = newsize;
|
|
||||||
s->buf = (char *)realloc(s->buf, s->size);
|
|
||||||
if (!s->buf)
|
|
||||||
die("Out of memory");
|
|
||||||
s->reallocs++;
|
|
||||||
}
|
|
||||||
|
|
||||||
void strbuf_append_string(strbuf_t *s, const char *str)
|
|
||||||
{
|
|
||||||
int space, i;
|
|
||||||
|
|
||||||
space = strbuf_empty_length(s);
|
|
||||||
|
|
||||||
for (i = 0; str[i]; i++) {
|
|
||||||
if (space < 1) {
|
|
||||||
strbuf_resize(s, s->length + 1);
|
|
||||||
space = strbuf_empty_length(s);
|
|
||||||
}
|
|
||||||
|
|
||||||
s->buf[s->length] = str[i];
|
|
||||||
s->length++;
|
|
||||||
space--;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* strbuf_append_fmt() should only be used when an upper bound
|
|
||||||
* is known for the output string. */
|
|
||||||
void strbuf_append_fmt(strbuf_t *s, int len, const char *fmt, ...)
|
|
||||||
{
|
|
||||||
va_list arg;
|
|
||||||
int fmt_len;
|
|
||||||
|
|
||||||
strbuf_ensure_empty_length(s, len);
|
|
||||||
|
|
||||||
va_start(arg, fmt);
|
|
||||||
fmt_len = vsnprintf(s->buf + s->length, len, fmt, arg);
|
|
||||||
va_end(arg);
|
|
||||||
|
|
||||||
if (fmt_len < 0)
|
|
||||||
die("BUG: Unable to convert number"); /* This should never happen.. */
|
|
||||||
|
|
||||||
s->length += fmt_len;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* strbuf_append_fmt_retry() can be used when the there is no known
|
|
||||||
* upper bound for the output string. */
|
|
||||||
void strbuf_append_fmt_retry(strbuf_t *s, const char *fmt, ...)
|
|
||||||
{
|
|
||||||
va_list arg;
|
|
||||||
int fmt_len;
|
|
||||||
int empty_len;
|
|
||||||
int t;
|
|
||||||
|
|
||||||
/* If the first attempt to append fails, resize the buffer appropriately
|
|
||||||
* and try again */
|
|
||||||
for (t = 0; ; t++) {
|
|
||||||
va_start(arg, fmt);
|
|
||||||
/* Append the new formatted string */
|
|
||||||
/* fmt_len is the length of the string required, excluding the
|
|
||||||
* trailing NULL */
|
|
||||||
empty_len = strbuf_empty_length(s);
|
|
||||||
/* Add 1 since there is also space to store the terminating NULL. */
|
|
||||||
fmt_len = vsnprintf(s->buf + s->length, empty_len + 1, fmt, arg);
|
|
||||||
va_end(arg);
|
|
||||||
|
|
||||||
if (fmt_len <= empty_len)
|
|
||||||
break; /* SUCCESS */
|
|
||||||
if (t > 0)
|
|
||||||
die("BUG: length of formatted string changed");
|
|
||||||
|
|
||||||
strbuf_resize(s, s->length + fmt_len);
|
|
||||||
}
|
|
||||||
|
|
||||||
s->length += fmt_len;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* vi:ai et sw=4 ts=4:
|
|
||||||
*/
|
|
|
@ -1,159 +0,0 @@
|
||||||
/* strbuf - String buffer routines
|
|
||||||
*
|
|
||||||
* Copyright (c) 2010-2012 Mark Pulford <mark@kyne.com.au>
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining
|
|
||||||
* a copy of this software and associated documentation files (the
|
|
||||||
* "Software"), to deal in the Software without restriction, including
|
|
||||||
* without limitation the rights to use, copy, modify, merge, publish,
|
|
||||||
* distribute, sublicense, and/or sell copies of the Software, and to
|
|
||||||
* permit persons to whom the Software is furnished to do so, subject to
|
|
||||||
* the following conditions:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice shall be
|
|
||||||
* included in all copies or substantial portions of the Software.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
||||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
||||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
|
||||||
* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
|
||||||
* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
|
||||||
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
|
||||||
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <stdarg.h>
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
/* Size: Total bytes allocated to *buf
|
|
||||||
* Length: String length, excluding optional NULL terminator.
|
|
||||||
* Increment: Allocation increments when resizing the string buffer.
|
|
||||||
* Dynamic: True if created via strbuf_new()
|
|
||||||
*/
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
char *buf;
|
|
||||||
int size;
|
|
||||||
int length;
|
|
||||||
int increment;
|
|
||||||
int dynamic;
|
|
||||||
int reallocs;
|
|
||||||
int debug;
|
|
||||||
} strbuf_t;
|
|
||||||
|
|
||||||
#ifndef STRBUF_DEFAULT_SIZE
|
|
||||||
#define STRBUF_DEFAULT_SIZE 1023
|
|
||||||
#endif
|
|
||||||
#ifndef STRBUF_DEFAULT_INCREMENT
|
|
||||||
#define STRBUF_DEFAULT_INCREMENT -2
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Initialise */
|
|
||||||
extern strbuf_t *strbuf_new(int len);
|
|
||||||
extern void strbuf_init(strbuf_t *s, int len);
|
|
||||||
extern void strbuf_set_increment(strbuf_t *s, int increment);
|
|
||||||
|
|
||||||
/* Release */
|
|
||||||
extern void strbuf_free(strbuf_t *s);
|
|
||||||
extern char *strbuf_free_to_string(strbuf_t *s, int *len);
|
|
||||||
|
|
||||||
/* Management */
|
|
||||||
extern void strbuf_resize(strbuf_t *s, int len);
|
|
||||||
static int strbuf_empty_length(strbuf_t *s);
|
|
||||||
static int strbuf_length(strbuf_t *s);
|
|
||||||
static char *strbuf_string(strbuf_t *s, int *len);
|
|
||||||
static void strbuf_ensure_empty_length(strbuf_t *s, int len);
|
|
||||||
static char *strbuf_empty_ptr(strbuf_t *s);
|
|
||||||
static void strbuf_extend_length(strbuf_t *s, int len);
|
|
||||||
|
|
||||||
/* Update */
|
|
||||||
extern void strbuf_append_fmt(strbuf_t *s, int len, const char *fmt, ...);
|
|
||||||
extern void strbuf_append_fmt_retry(strbuf_t *s, const char *format, ...);
|
|
||||||
static void strbuf_append_mem(strbuf_t *s, const char *c, int len);
|
|
||||||
extern void strbuf_append_string(strbuf_t *s, const char *str);
|
|
||||||
static void strbuf_append_char(strbuf_t *s, const char c);
|
|
||||||
static void strbuf_ensure_null(strbuf_t *s);
|
|
||||||
|
|
||||||
/* Reset string for before use */
|
|
||||||
static inline void strbuf_reset(strbuf_t *s)
|
|
||||||
{
|
|
||||||
s->length = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline int strbuf_allocated(strbuf_t *s)
|
|
||||||
{
|
|
||||||
return s->buf != NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Return bytes remaining in the string buffer
|
|
||||||
* Ensure there is space for a NULL terminator. */
|
|
||||||
static inline int strbuf_empty_length(strbuf_t *s)
|
|
||||||
{
|
|
||||||
return s->size - s->length - 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void strbuf_ensure_empty_length(strbuf_t *s, int len)
|
|
||||||
{
|
|
||||||
if (len > strbuf_empty_length(s))
|
|
||||||
strbuf_resize(s, s->length + len);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline char *strbuf_empty_ptr(strbuf_t *s)
|
|
||||||
{
|
|
||||||
return s->buf + s->length;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void strbuf_extend_length(strbuf_t *s, int len)
|
|
||||||
{
|
|
||||||
s->length += len;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline int strbuf_length(strbuf_t *s)
|
|
||||||
{
|
|
||||||
return s->length;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void strbuf_append_char(strbuf_t *s, const char c)
|
|
||||||
{
|
|
||||||
strbuf_ensure_empty_length(s, 1);
|
|
||||||
s->buf[s->length++] = c;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void strbuf_append_char_unsafe(strbuf_t *s, const char c)
|
|
||||||
{
|
|
||||||
s->buf[s->length++] = c;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void strbuf_append_mem(strbuf_t *s, const char *c, int len)
|
|
||||||
{
|
|
||||||
strbuf_ensure_empty_length(s, len);
|
|
||||||
memcpy(s->buf + s->length, c, len);
|
|
||||||
s->length += len;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void strbuf_append_mem_unsafe(strbuf_t *s, const char *c, int len)
|
|
||||||
{
|
|
||||||
memcpy(s->buf + s->length, c, len);
|
|
||||||
s->length += len;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void strbuf_ensure_null(strbuf_t *s)
|
|
||||||
{
|
|
||||||
s->buf[s->length] = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline char *strbuf_string(strbuf_t *s, int *len)
|
|
||||||
{
|
|
||||||
if (len)
|
|
||||||
*len = s->length;
|
|
||||||
|
|
||||||
return s->buf;
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
/* vi:ai et sw=4 ts=4:
|
|
||||||
*/
|
|
|
@ -1,8 +1,9 @@
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
Copyright (c) 2017-2018 Xiamen Yaji Software Co., Ltd.
|
Copyright (c) 2017-2018 Xiamen Yaji Software Co., Ltd.
|
||||||
Copyright (c) 2020 c4games.com.
|
Copyright (c) 2020 c4games.com.
|
||||||
|
Copyright (c) 2021 Bytedance Inc.
|
||||||
|
|
||||||
http://www.cocos2d-x.org
|
https://adxe.org
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
@ -35,7 +36,7 @@
|
||||||
#include "scripting/lua-bindings/manual/audioengine/lua_cocos2dx_audioengine_manual.h"
|
#include "scripting/lua-bindings/manual/audioengine/lua_cocos2dx_audioengine_manual.h"
|
||||||
#include "scripting/lua-bindings/manual/physics3d/lua_cocos2dx_physics3d_manual.h"
|
#include "scripting/lua-bindings/manual/physics3d/lua_cocos2dx_physics3d_manual.h"
|
||||||
#include "scripting/lua-bindings/manual/navmesh/lua_cocos2dx_navmesh_manual.h"
|
#include "scripting/lua-bindings/manual/navmesh/lua_cocos2dx_navmesh_manual.h"
|
||||||
#include "scripting/lua-bindings/lua-cjson/lua_cjson.h"
|
#include "lua_cjson.h"
|
||||||
#include "yasio/bindings/yasio_cclua.hpp"
|
#include "yasio/bindings/yasio_cclua.hpp"
|
||||||
|
|
||||||
static void lua_register_extensions(lua_State* L) {
|
static void lua_register_extensions(lua_State* L) {
|
||||||
|
|
Loading…
Reference in New Issue