* are those of the authors and should not be interpreted as representing
* official policies, either expressed or implied, of the Jim Tcl Project.
**/
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
#define __JIM_CORE__
#define JIM_OPTIMIZATION /* comment to avoid optimizations and reduce size */
#define JIM_DYNLIB /* Dynamic library support for UNIX and WIN32 */
#endif /* JIM_ANSIC */
-#ifndef _GNU_SOURCE
-#define _GNU_SOURCE /* for vasprintf() */
-#endif
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
#include <stdarg.h>
-#include <ctype.h>
#include <limits.h>
-#include <assert.h>
-#include <errno.h>
-#include <time.h>
-#if defined(WIN32)
-/* sys/time - need is different */
-#else
-#include <sys/time.h> // for gettimeofday()
-#endif
#include "replacements.h"
#endif /* WIN32 */
#endif /* JIM_DYNLIB */
-#ifndef WIN32
-#include <unistd.h>
-#endif
-
#ifdef __ECOS
#include <cyg/jimtcl/jim.h>
#else
static void JimFreeCallFrame(Jim_Interp *interp, Jim_CallFrame *cf, int flags);
static void JimRegisterCoreApi(Jim_Interp *interp);
-static Jim_HashTableType JimVariablesHashTableType;
+static Jim_HashTableType *getJimVariablesHashTableType(void);
/* -----------------------------------------------------------------------------
* Utility functions
* Ignores `locale' stuff. Assumes that the upper and lower case
* alphabets and digits are each contiguous.
*/
-#ifdef HAVE_LONG_LONG
+#ifdef HAVE_LONG_LONG_INT
#define JimIsAscii(c) (((c) & ~0x7f) == 0)
static jim_wide JimStrtoll(const char *nptr, char **endptr, register int base)
{
{
char *endptr;
-#ifdef HAVE_LONG_LONG
+#ifdef HAVE_LONG_LONG_INT
*widePtr = JimStrtoll(str, &endptr, base);
#else
*widePtr = strtol(str, &endptr, base);
Jim_ListLength(interp, staticsListObjPtr, &len);
if (len != 0) {
cmdPtr->staticVars = Jim_Alloc(sizeof(Jim_HashTable));
- Jim_InitHashTable(cmdPtr->staticVars, &JimVariablesHashTableType,
+ Jim_InitHashTable(cmdPtr->staticVars, getJimVariablesHashTableType(),
interp);
for (i = 0; i < len; i++) {
Jim_Obj *objPtr, *initObjPtr, *nameObjPtr;
JimVariablesHTValDestructor /* val destructor */
};
+static Jim_HashTableType *getJimVariablesHashTableType(void)
+{
+ return &JimVariablesHashTableType;
+}
+
/* -----------------------------------------------------------------------------
* Variable object
* ---------------------------------------------------------------------------*/
scanned += 1;
break;
case 'd': case 'o': case 'x': case 'u': case 'i': {
+ jim_wide jwvalue;
+ long lvalue;
char *endp; /* Position where the number finished */
int base = descr->type == 'o' ? 8
: descr->type == 'x' ? 16
do {
/* Try to scan a number with the given base */
if (descr->modifier == 'l')
-#ifdef HAVE_LONG_LONG
- *(jim_wide*)value = JimStrtoll(tok, &endp, base);
+ {
+#ifdef HAVE_LONG_LONG_INT
+ jwvalue = JimStrtoll(tok, &endp, base),
#else
- *(jim_wide*)value = strtol(tok, &endp, base);
+ jwvalue = strtol(tok, &endp, base),
#endif
+ memcpy(value, &jwvalue, sizeof(jim_wide));
+ }
else
+ {
if (descr->type == 'u')
- *(long*)value = strtoul(tok, &endp, base);
+ lvalue = strtoul(tok, &endp, base);
else
- *(long*)value = strtol(tok, &endp, base);
+ lvalue = strtol(tok, &endp, base);
+ memcpy(value, &lvalue, sizeof(lvalue));
+ }
/* If scanning failed, and base was undetermined, simply
* put it to 10 and try once more. This should catch the
* case where %i begin to parse a number prefix (e.g.
if (endp != tok) {
/* There was some number sucessfully scanned! */
if (descr->modifier == 'l')
- *valObjPtr = Jim_NewIntObj(interp, *(jim_wide*)value);
+ *valObjPtr = Jim_NewIntObj(interp, jwvalue);
else
- *valObjPtr = Jim_NewIntObj(interp, *(long*)value);
+ *valObjPtr = Jim_NewIntObj(interp, lvalue);
/* Adjust the number-of-chars scanned so far */
scanned += endp - tok;
} else {
case 'e': case 'f': case 'g': {
char *endp;
- *(double*)value = strtod(tok, &endp);
+ double dvalue = strtod(tok, &endp);
+ memcpy(value, &dvalue, sizeof(double));
if (endp != tok) {
/* There was some number sucessfully scanned! */
- *valObjPtr = Jim_NewDoubleObj(interp, *(double*)value);
+ *valObjPtr = Jim_NewDoubleObj(interp, dvalue);
/* Adjust the number-of-chars scanned so far */
scanned += endp - tok;
} else {
if (argc == 1) {
-#ifndef HAVE_UNISTD_H
+#ifdef NEED_ENVIRON_EXTERN
extern char **environ;
#endif