修复.git
This commit is contained in:
@@ -171,8 +171,7 @@
|
|||||||
<ClInclude Include="head.h" />
|
<ClInclude Include="head.h" />
|
||||||
<ClInclude Include="hooks.h" />
|
<ClInclude Include="hooks.h" />
|
||||||
<ClInclude Include="interface.h" />
|
<ClInclude Include="interface.h" />
|
||||||
<ClInclude Include="lua-cjson\fpconv.h" />
|
<ClInclude Include="luaCjson\strbuf.h" />
|
||||||
<ClInclude Include="lua-cjson\strbuf.h" />
|
|
||||||
<ClInclude Include="lua\lapi.h" />
|
<ClInclude Include="lua\lapi.h" />
|
||||||
<ClInclude Include="lua\lauxlib.h" />
|
<ClInclude Include="lua\lauxlib.h" />
|
||||||
<ClInclude Include="lua\lcode.h" />
|
<ClInclude Include="lua\lcode.h" />
|
||||||
@@ -264,9 +263,9 @@
|
|||||||
<ClCompile Include="global.cpp" />
|
<ClCompile Include="global.cpp" />
|
||||||
<ClCompile Include="hooks.cpp" />
|
<ClCompile Include="hooks.cpp" />
|
||||||
<ClCompile Include="interface.cpp" />
|
<ClCompile Include="interface.cpp" />
|
||||||
<ClCompile Include="lua-cjson\fpconv.c" />
|
<ClCompile Include="luaCjson\fpconv.c" />
|
||||||
<ClCompile Include="lua-cjson\lua_cjson.c" />
|
<ClCompile Include="luaCjson\lua_cjson.c" />
|
||||||
<ClCompile Include="lua-cjson\strbuf.c" />
|
<ClCompile Include="luaCjson\strbuf.c" />
|
||||||
<ClCompile Include="lua\lapi.c" />
|
<ClCompile Include="lua\lapi.c" />
|
||||||
<ClCompile Include="lua\lauxlib.c" />
|
<ClCompile Include="lua\lauxlib.c" />
|
||||||
<ClCompile Include="lua\lbaselib.c" />
|
<ClCompile Include="lua\lbaselib.c" />
|
||||||
|
|||||||
@@ -363,15 +363,12 @@
|
|||||||
<ClInclude Include="sdk\public\Vector_Sdk.h">
|
<ClInclude Include="sdk\public\Vector_Sdk.h">
|
||||||
<Filter>头文件\sdk\public</Filter>
|
<Filter>头文件\sdk\public</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
<ClInclude Include="lua-cjson\strbuf.h">
|
|
||||||
<Filter>源文件\script_engine\lua_cjson</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="lua-cjson\fpconv.h">
|
|
||||||
<Filter>源文件\script_engine\lua_cjson</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="Server.h">
|
<ClInclude Include="Server.h">
|
||||||
<Filter>头文件\http</Filter>
|
<Filter>头文件\http</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
|
<ClInclude Include="luaCjson\strbuf.h">
|
||||||
|
<Filter>源文件\script_engine\lua_cjson</Filter>
|
||||||
|
</ClInclude>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClCompile Include="dllmain.cpp">
|
<ClCompile Include="dllmain.cpp">
|
||||||
@@ -554,18 +551,18 @@
|
|||||||
<ClCompile Include="version_hijack.cpp">
|
<ClCompile Include="version_hijack.cpp">
|
||||||
<Filter>源文件\hijack</Filter>
|
<Filter>源文件\hijack</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<ClCompile Include="lua-cjson\lua_cjson.c">
|
|
||||||
<Filter>源文件\script_engine\lua_cjson</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="lua-cjson\strbuf.c">
|
|
||||||
<Filter>源文件\script_engine\lua_cjson</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="lua-cjson\fpconv.c">
|
|
||||||
<Filter>源文件\script_engine\lua_cjson</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="Server.cpp">
|
<ClCompile Include="Server.cpp">
|
||||||
<Filter>源文件\http</Filter>
|
<Filter>源文件\http</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
<ClCompile Include="luaCjson\lua_cjson.c">
|
||||||
|
<Filter>源文件\script_engine\lua_cjson</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="luaCjson\strbuf.c">
|
||||||
|
<Filter>源文件\script_engine\lua_cjson</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="luaCjson\fpconv.c">
|
||||||
|
<Filter>源文件\script_engine\lua_cjson</Filter>
|
||||||
|
</ClCompile>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<None Include="cpp.hint" />
|
<None Include="cpp.hint" />
|
||||||
|
|||||||
Submodule csgo2/lua-cjson deleted from 2bfad8f5ee
6205
csgo2/luaCjson/dtoa.c
Normal file
6205
csgo2/luaCjson/dtoa.c
Normal file
File diff suppressed because it is too large
Load Diff
78
csgo2/luaCjson/dtoa_config.h
Normal file
78
csgo2/luaCjson/dtoa_config.h
Normal file
@@ -0,0 +1,78 @@
|
|||||||
|
#ifndef _DTOA_CONFIG_H
|
||||||
|
#define _DTOA_CONFIG_H
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
/* Ensure dtoa.c does not USE_LOCALE. Lua CJSON must not use locale
|
||||||
|
* aware conversion routines. */
|
||||||
|
#undef USE_LOCALE
|
||||||
|
|
||||||
|
/* dtoa.c should not touch errno, Lua CJSON does not use it, and it
|
||||||
|
* may not be threadsafe */
|
||||||
|
#define NO_ERRNO
|
||||||
|
|
||||||
|
#define Long int32_t
|
||||||
|
#define ULong uint32_t
|
||||||
|
#define Llong int64_t
|
||||||
|
#define ULLong uint64_t
|
||||||
|
|
||||||
|
#ifdef IEEE_BIG_ENDIAN
|
||||||
|
#define IEEE_MC68k
|
||||||
|
#else
|
||||||
|
#define IEEE_8087
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define MALLOC xmalloc
|
||||||
|
|
||||||
|
static void *xmalloc(size_t size)
|
||||||
|
{
|
||||||
|
void *p;
|
||||||
|
|
||||||
|
p = malloc(size);
|
||||||
|
if (!p) {
|
||||||
|
fprintf(stderr, "Out of memory");
|
||||||
|
abort();
|
||||||
|
}
|
||||||
|
|
||||||
|
return p;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef MULTIPLE_THREADS
|
||||||
|
|
||||||
|
/* Enable locking to support multi-threaded applications */
|
||||||
|
|
||||||
|
#include <pthread.h>
|
||||||
|
|
||||||
|
static pthread_mutex_t private_dtoa_lock[2] = {
|
||||||
|
PTHREAD_MUTEX_INITIALIZER,
|
||||||
|
PTHREAD_MUTEX_INITIALIZER
|
||||||
|
};
|
||||||
|
|
||||||
|
#define dtoa_get_threadno pthread_self
|
||||||
|
void
|
||||||
|
set_max_dtoa_threads(unsigned int n);
|
||||||
|
|
||||||
|
#define ACQUIRE_DTOA_LOCK(n) do { \
|
||||||
|
int r = pthread_mutex_lock(&private_dtoa_lock[n]); \
|
||||||
|
if (r) { \
|
||||||
|
fprintf(stderr, "pthread_mutex_lock failed with %d\n", r); \
|
||||||
|
abort(); \
|
||||||
|
} \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define FREE_DTOA_LOCK(n) do { \
|
||||||
|
int r = pthread_mutex_unlock(&private_dtoa_lock[n]); \
|
||||||
|
if (r) { \
|
||||||
|
fprintf(stderr, "pthread_mutex_unlock failed with %d\n", r);\
|
||||||
|
abort(); \
|
||||||
|
} \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#endif /* MULTIPLE_THREADS */
|
||||||
|
|
||||||
|
#endif /* _DTOA_CONFIG_H */
|
||||||
|
|
||||||
|
/* vi:ai et sw=4 ts=4:
|
||||||
|
*/
|
||||||
211
csgo2/luaCjson/fpconv.c
Normal file
211
csgo2/luaCjson/fpconv.c
Normal file
@@ -0,0 +1,211 @@
|
|||||||
|
/* 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"
|
||||||
|
|
||||||
|
/* Workaround for MSVC */
|
||||||
|
#ifdef _MSC_VER
|
||||||
|
#define inline __inline
|
||||||
|
#define snprintf sprintf_s
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* 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(void)
|
||||||
|
{
|
||||||
|
char buf[8];
|
||||||
|
|
||||||
|
snprintf(buf, sizeof(buf), "%g", 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, "Error: wide characters found or printf() bug.");
|
||||||
|
abort();
|
||||||
|
}
|
||||||
|
|
||||||
|
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");
|
||||||
|
abort();
|
||||||
|
}
|
||||||
|
} 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 <= 16);
|
||||||
|
|
||||||
|
/* 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(void)
|
||||||
|
{
|
||||||
|
fpconv_update_locale();
|
||||||
|
}
|
||||||
|
|
||||||
|
/* vi:ai et sw=4 ts=4:
|
||||||
|
*/
|
||||||
32
csgo2/luaCjson/fpconv.h
Normal file
32
csgo2/luaCjson/fpconv.h
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
/* 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 USE_INTERNAL_FPCONV
|
||||||
|
#ifdef MULTIPLE_THREADS
|
||||||
|
#include "dtoa_config.h"
|
||||||
|
#include <unistd.h>
|
||||||
|
static inline void fpconv_init()
|
||||||
|
{
|
||||||
|
// Add one to try and avoid core id multiplier alignment
|
||||||
|
set_max_dtoa_threads((sysconf(_SC_NPROCESSORS_CONF) + 1) * 3);
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
static inline void fpconv_init()
|
||||||
|
{
|
||||||
|
/* Do nothing - not required */
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#else
|
||||||
|
extern void fpconv_init(void);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
extern int fpconv_g_fmt(char*, double, int);
|
||||||
|
extern double fpconv_strtod(const char*, char**);
|
||||||
|
|
||||||
|
/* vi:ai et sw=4 ts=4:
|
||||||
|
*/
|
||||||
111
csgo2/luaCjson/g_fmt.c
Normal file
111
csgo2/luaCjson/g_fmt.c
Normal file
@@ -0,0 +1,111 @@
|
|||||||
|
/****************************************************************
|
||||||
|
*
|
||||||
|
* The author of this software is David M. Gay.
|
||||||
|
*
|
||||||
|
* Copyright (c) 1991, 1996 by Lucent Technologies.
|
||||||
|
*
|
||||||
|
* Permission to use, copy, modify, and distribute this software for any
|
||||||
|
* purpose without fee is hereby granted, provided that this entire notice
|
||||||
|
* is included in all copies of any software which is or includes a copy
|
||||||
|
* or modification of this software and in all copies of the supporting
|
||||||
|
* documentation for such software.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
|
||||||
|
* WARRANTY. IN PARTICULAR, NEITHER THE AUTHOR NOR LUCENT MAKES ANY
|
||||||
|
* REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY
|
||||||
|
* OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
|
||||||
|
*
|
||||||
|
***************************************************************/
|
||||||
|
|
||||||
|
/* g_fmt(buf,x) stores the closest decimal approximation to x in buf;
|
||||||
|
* it suffices to declare buf
|
||||||
|
* char buf[32];
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
extern char *dtoa(double, int, int, int *, int *, char **);
|
||||||
|
extern int g_fmt(char *, double, int);
|
||||||
|
extern void freedtoa(char*);
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
int
|
||||||
|
fpconv_g_fmt(char *b, double x, int precision)
|
||||||
|
{
|
||||||
|
register int i, k;
|
||||||
|
register char *s;
|
||||||
|
int decpt, j, sign;
|
||||||
|
char *b0, *s0, *se;
|
||||||
|
|
||||||
|
b0 = b;
|
||||||
|
#ifdef IGNORE_ZERO_SIGN
|
||||||
|
if (!x) {
|
||||||
|
*b++ = '0';
|
||||||
|
*b = 0;
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
s = s0 = dtoa(x, 2, precision, &decpt, &sign, &se);
|
||||||
|
if (sign)
|
||||||
|
*b++ = '-';
|
||||||
|
if (decpt == 9999) /* Infinity or Nan */ {
|
||||||
|
while((*b++ = *s++));
|
||||||
|
/* "b" is used to calculate the return length. Decrement to exclude the
|
||||||
|
* Null terminator from the length */
|
||||||
|
b--;
|
||||||
|
goto done0;
|
||||||
|
}
|
||||||
|
if (decpt <= -4 || decpt > precision) {
|
||||||
|
*b++ = *s++;
|
||||||
|
if (*s) {
|
||||||
|
*b++ = '.';
|
||||||
|
while((*b = *s++))
|
||||||
|
b++;
|
||||||
|
}
|
||||||
|
*b++ = 'e';
|
||||||
|
/* sprintf(b, "%+.2d", decpt - 1); */
|
||||||
|
if (--decpt < 0) {
|
||||||
|
*b++ = '-';
|
||||||
|
decpt = -decpt;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
*b++ = '+';
|
||||||
|
for(j = 2, k = 10; 10*k <= decpt; j++, k *= 10);
|
||||||
|
for(;;) {
|
||||||
|
i = decpt / k;
|
||||||
|
*b++ = i + '0';
|
||||||
|
if (--j <= 0)
|
||||||
|
break;
|
||||||
|
decpt -= i*k;
|
||||||
|
decpt *= 10;
|
||||||
|
}
|
||||||
|
*b = 0;
|
||||||
|
}
|
||||||
|
else if (decpt <= 0) {
|
||||||
|
*b++ = '0';
|
||||||
|
*b++ = '.';
|
||||||
|
for(; decpt < 0; decpt++)
|
||||||
|
*b++ = '0';
|
||||||
|
while((*b++ = *s++));
|
||||||
|
b--;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
while((*b = *s++)) {
|
||||||
|
b++;
|
||||||
|
if (--decpt == 0 && *s)
|
||||||
|
*b++ = '.';
|
||||||
|
}
|
||||||
|
for(; decpt > 0; decpt--)
|
||||||
|
*b++ = '0';
|
||||||
|
*b = 0;
|
||||||
|
}
|
||||||
|
done0:
|
||||||
|
freedtoa(s0);
|
||||||
|
#ifdef IGNORE_ZERO_SIGN
|
||||||
|
done:
|
||||||
|
#endif
|
||||||
|
return b - b0;
|
||||||
|
}
|
||||||
1623
csgo2/luaCjson/lua_cjson.c
Normal file
1623
csgo2/luaCjson/lua_cjson.c
Normal file
File diff suppressed because it is too large
Load Diff
199
csgo2/luaCjson/strbuf.c
Normal file
199
csgo2/luaCjson/strbuf.c
Normal file
@@ -0,0 +1,199 @@
|
|||||||
|
/* 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 <stdint.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");
|
||||||
|
|
||||||
|
abort();
|
||||||
|
}
|
||||||
|
|
||||||
|
void strbuf_init(strbuf_t *s, size_t len)
|
||||||
|
{
|
||||||
|
size_t size;
|
||||||
|
|
||||||
|
if (!len)
|
||||||
|
size = STRBUF_DEFAULT_SIZE;
|
||||||
|
else
|
||||||
|
size = len + 1;
|
||||||
|
if (size < len)
|
||||||
|
die("Overflow, len: %zu", len);
|
||||||
|
s->buf = NULL;
|
||||||
|
s->size = size;
|
||||||
|
s->length = 0;
|
||||||
|
s->dynamic = 0;
|
||||||
|
s->reallocs = 0;
|
||||||
|
s->debug = 0;
|
||||||
|
|
||||||
|
s->buf = malloc(size);
|
||||||
|
if (!s->buf)
|
||||||
|
die("Out of memory");
|
||||||
|
|
||||||
|
strbuf_ensure_null(s);
|
||||||
|
}
|
||||||
|
|
||||||
|
strbuf_t *strbuf_new(size_t len)
|
||||||
|
{
|
||||||
|
strbuf_t *s;
|
||||||
|
|
||||||
|
s = malloc(sizeof(strbuf_t));
|
||||||
|
if (!s)
|
||||||
|
die("Out of memory");
|
||||||
|
|
||||||
|
strbuf_init(s, len);
|
||||||
|
|
||||||
|
/* Dynamic strbuf allocation / deallocation */
|
||||||
|
s->dynamic = 1;
|
||||||
|
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void debug_stats(strbuf_t *s)
|
||||||
|
{
|
||||||
|
if (s->debug) {
|
||||||
|
fprintf(stderr, "strbuf(%lx) reallocs: %d, length: %zd, size: %zd\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, size_t *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 size_t calculate_new_size(strbuf_t *s, size_t len)
|
||||||
|
{
|
||||||
|
size_t reqsize, newsize;
|
||||||
|
|
||||||
|
if (len <= 0)
|
||||||
|
die("BUG: Invalid strbuf length requested");
|
||||||
|
|
||||||
|
/* Ensure there is room for optional NULL termination */
|
||||||
|
reqsize = len + 1;
|
||||||
|
if (reqsize < len)
|
||||||
|
die("Overflow, len: %zu", len);
|
||||||
|
|
||||||
|
/* If the user has requested to shrink the buffer, do it exactly */
|
||||||
|
if (s->size > reqsize)
|
||||||
|
return reqsize;
|
||||||
|
|
||||||
|
newsize = s->size;
|
||||||
|
if (reqsize >= SIZE_MAX / 2) {
|
||||||
|
newsize = reqsize;
|
||||||
|
} else {
|
||||||
|
/* Exponential sizing */
|
||||||
|
while (newsize < reqsize)
|
||||||
|
newsize *= 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (newsize < reqsize)
|
||||||
|
die("BUG: strbuf length would overflow, len: %zu", len);
|
||||||
|
|
||||||
|
|
||||||
|
return newsize;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* Ensure strbuf can handle a string length bytes long (ignoring NULL
|
||||||
|
* optional termination). */
|
||||||
|
void strbuf_resize(strbuf_t *s, size_t len)
|
||||||
|
{
|
||||||
|
size_t newsize;
|
||||||
|
|
||||||
|
newsize = calculate_new_size(s, len);
|
||||||
|
|
||||||
|
if (s->debug > 1) {
|
||||||
|
fprintf(stderr, "strbuf(%lx) resize: %zd => %zd\n",
|
||||||
|
(long)s, s->size, newsize);
|
||||||
|
}
|
||||||
|
|
||||||
|
s->size = newsize;
|
||||||
|
s->buf = realloc(s->buf, s->size);
|
||||||
|
if (!s->buf)
|
||||||
|
die("Out of memory, len: %zu", len);
|
||||||
|
s->reallocs++;
|
||||||
|
}
|
||||||
|
|
||||||
|
void strbuf_append_string(strbuf_t *s, const char *str)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
size_t space;
|
||||||
|
|
||||||
|
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--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* vi:ai et sw=4 ts=4:
|
||||||
|
*/
|
||||||
157
csgo2/luaCjson/strbuf.h
Normal file
157
csgo2/luaCjson/strbuf.h
Normal file
@@ -0,0 +1,157 @@
|
|||||||
|
/* 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>
|
||||||
|
|
||||||
|
/* Workaround for MSVC */
|
||||||
|
#ifdef _MSC_VER
|
||||||
|
#define inline __inline
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Size: Total bytes allocated to *buf
|
||||||
|
* Length: String length, excluding optional NULL terminator.
|
||||||
|
* Dynamic: True if created via strbuf_new()
|
||||||
|
*/
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
char *buf;
|
||||||
|
size_t size;
|
||||||
|
size_t length;
|
||||||
|
int dynamic;
|
||||||
|
int reallocs;
|
||||||
|
int debug;
|
||||||
|
} strbuf_t;
|
||||||
|
|
||||||
|
#ifndef STRBUF_DEFAULT_SIZE
|
||||||
|
#define STRBUF_DEFAULT_SIZE 1023
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Initialise */
|
||||||
|
extern strbuf_t *strbuf_new(size_t len);
|
||||||
|
extern void strbuf_init(strbuf_t *s, size_t len);
|
||||||
|
|
||||||
|
/* Release */
|
||||||
|
extern void strbuf_free(strbuf_t *s);
|
||||||
|
extern char *strbuf_free_to_string(strbuf_t *s, size_t *len);
|
||||||
|
|
||||||
|
/* Management */
|
||||||
|
extern void strbuf_resize(strbuf_t *s, size_t len);
|
||||||
|
static size_t strbuf_empty_length(strbuf_t *s);
|
||||||
|
static size_t strbuf_length(strbuf_t *s);
|
||||||
|
static char *strbuf_string(strbuf_t *s, size_t *len);
|
||||||
|
static void strbuf_ensure_empty_length(strbuf_t *s, size_t len);
|
||||||
|
static char *strbuf_empty_ptr(strbuf_t *s);
|
||||||
|
static void strbuf_extend_length(strbuf_t *s, size_t len);
|
||||||
|
static void strbuf_set_length(strbuf_t *s, int len);
|
||||||
|
|
||||||
|
/* Update */
|
||||||
|
static void strbuf_append_mem(strbuf_t *s, const char *c, size_t 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 size_t strbuf_empty_length(strbuf_t *s)
|
||||||
|
{
|
||||||
|
return s->size - s->length - 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void strbuf_ensure_empty_length(strbuf_t *s, size_t 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_set_length(strbuf_t *s, int len)
|
||||||
|
{
|
||||||
|
s->length = len;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void strbuf_extend_length(strbuf_t *s, size_t len)
|
||||||
|
{
|
||||||
|
s->length += len;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline size_t 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, size_t 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, size_t 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, size_t *len)
|
||||||
|
{
|
||||||
|
if (len)
|
||||||
|
*len = s->length;
|
||||||
|
|
||||||
|
return s->buf;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* vi:ai et sw=4 ts=4:
|
||||||
|
*/
|
||||||
Reference in New Issue
Block a user