wmi-1.3.16 from opsview.com

This commit is contained in:
Are Casilla
2019-02-16 00:16:52 +01:00
parent 163fdd3d1b
commit 17b3af2911
2146 changed files with 678824 additions and 0 deletions
@@ -0,0 +1 @@
.updated
@@ -0,0 +1,21 @@
#
# Makefile to build the EJS Classes
#
# Copyright (c) Mbedthis Software LLC, 2003-2006. All Rights Reserved.
#
COMPILE := *.c
EXPORT_OBJECTS := yes
MAKE_IFLAGS := -I.. -I../../mpr -I../../exml
include make.dep
compileExtra: .updated
.updated: $(FILES)
@touch .updated
## Local variables:
## tab-width: 4
## End:
## vim: tw=78 sw=4 ts=4
@@ -0,0 +1,167 @@
/*
* @file ejsArray.c
* @brief Array class
*/
/********************************* Copyright **********************************/
/*
* @copy default
*
* Copyright (c) Mbedthis Software LLC, 2003-2006. All Rights Reserved.
* Copyright (c) Michael O'Brien, 1994-1995. All Rights Reserved.
*
* This software is distributed under commercial and open source licenses.
* You may use the GPL open source license described below or you may acquire
* a commercial license from Mbedthis Software. You agree to be fully bound
* by the terms of either license. Consult the LICENSE.TXT distributed with
* this software for full details.
*
* This software is open source; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at your
* option) any later version. See the GNU General Public License for more
* details at: http://www.mbedthis.com/downloads/gplLicense.html
*
* This program is distributed WITHOUT ANY WARRANTY; without even the
* implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
*
* This GPL license does NOT permit incorporating this software into
* proprietary programs. If you are unable to comply with the GPL, you must
* acquire a commercial license to use this software. Commercial licenses
* for this software and support services are available from Mbedthis
* Software at http://www.mbedthis.com
*
* @end
*/
/********************************** Includes **********************************/
#include "ejs.h"
#if BLD_FEATURE_EJS
/************************************ Code ************************************/
int ejsDefineArrayClass(Ejs *ep)
{
if (ejsDefineClass(ep, "Array", "Object", ejsArrayConstructor) == 0) {
return MPR_ERR_CANT_INITIALIZE;
}
return 0;
}
/******************************************************************************/
/*
* Routine to create the base array type
*/
EjsVar *ejsCreateArrayInternal(EJS_LOC_DEC(ep, loc), int size)
{
EjsProperty *pp;
EjsVar *obj, *vp;
/* MOB -- need to supply hash size -- max(size, 503)); */
obj = ejsCreateSimpleObjInternal(EJS_LOC_PASS(ep, loc), "Array");
if (obj == 0) {
mprAssert(0);
return obj;
}
obj->isArray = 1;
/* MOB -- call constructor here and replace this code */
pp = ejsSetPropertyToInteger(ep, obj, "length", size);
ejsMakePropertyEnumerable(pp, 0);
vp = ejsGetVarPtr(pp);
vp->isArrayLength = 1;
return obj;
}
/******************************************************************************/
EjsVar *ejsAddArrayElt(Ejs *ep, EjsVar *op, EjsVar *element,
EjsCopyDepth copyDepth)
{
EjsProperty *pp;
EjsVar *vp;
char idx[16];
int length;
mprAssert(op->isArray);
length = ejsGetPropertyAsInteger(ep, op, "length");
mprItoa(idx, sizeof(idx), length);
pp = ejsCreateProperty(ep, op, idx);
vp = ejsGetVarPtr(pp);
ejsWriteVar(ep, vp, element, copyDepth);
ejsSetPropertyToInteger(ep, op, "length", length + 1);
return vp;
}
/******************************************************************************/
/*
* Constructor
*/
int ejsArrayConstructor(Ejs *ep, EjsVar *thisObj, int argc, EjsVar **argv)
{
EjsProperty *pp;
EjsVar *vp;
char idx[16];
int i, max;
thisObj->isArray = 1;
max = 0;
if (argc > 0) {
if (argc == 1 && ejsVarIsNumber(argv[0])) {
/*
* x = new Array(size);
*/
max = (int) ejsVarToInteger(argv[0]);
} else {
/*
* x = new Array(element0, element1, ..., elementN):
*/
max = argc;
for (i = 0; i < max; i++) {
mprItoa(idx, sizeof(idx), i);
pp = ejsCreateSimpleProperty(ep, thisObj, idx);
vp = ejsGetVarPtr(pp);
ejsWriteVar(ep, vp, argv[i], EJS_SHALLOW_COPY);
}
}
}
pp = ejsCreateSimpleProperty(ep, thisObj, "length");
ejsMakePropertyEnumerable(pp, 0);
vp = ejsGetVarPtr(pp);
ejsWriteVarAsInteger(ep, vp, max);
vp->isArrayLength = 1;
return 0;
}
/******************************************************************************/
#else
void ejsArrayDummy() {}
/******************************************************************************/
#endif /* BLD_FEATURE_EJS */
/*
* Local variables:
* tab-width: 4
* c-basic-offset: 4
* End:
* vim:tw=78
* vim600: sw=4 ts=4 fdm=marker
* vim<600: sw=4 ts=4
*/
+197
View File
@@ -0,0 +1,197 @@
/*
* @file ejsStndClasses.c
* @brief EJS support methods
*/
/********************************* Copyright **********************************/
/*
* @copy default
*
* Copyright (c) Mbedthis Software LLC, 2003-2006. All Rights Reserved.
* Copyright (c) Michael O'Brien, 1994-1995. All Rights Reserved.
*
* This software is distributed under commercial and open source licenses.
* You may use the GPL open source license described below or you may acquire
* a commercial license from Mbedthis Software. You agree to be fully bound
* by the terms of either license. Consult the LICENSE.TXT distributed with
* this software for full details.
*
* This software is open source; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at your
* option) any later version. See the GNU General Public License for more
* details at: http://www.mbedthis.com/downloads/gplLicense.html
*
* This program is distributed WITHOUT ANY WARRANTY; without even the
* implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
*
* This GPL license does NOT permit incorporating this software into
* proprietary programs. If you are unable to comply with the GPL, you must
* acquire a commercial license to use this software. Commercial licenses
* for this software and support services are available from Mbedthis
* Software at http://www.mbedthis.com
*
* @end
*/
/********************************** Includes **********************************/
#include "ejs.h"
#if BLD_FEATURE_EJS && 0
/******************************************************************************/
/*
* Date constructor
*
* Date();
* Date(milliseconds);
* Date(dateString);
* Date(year, month, date);
* Date(year, month, date, hour, minute, second);
*/
int ejsDateConstructor(Ejs *ep, EjsVar *thisObj, int argc, EjsVar **argv)
{
return 0;
}
/******************************************************************************/
static int load(Ejs *ep, EjsVar *thisObj, int argc, EjsVar **argv)
{
const char *fileName;
XmlState *parser;
Exml *xp;
MprFile *file;
if (argc != 1 || !ejsVarIsString(argv[0])) {
ejsError(ep, EJS_ARG_ERROR, "Bad args. Usage: load(fileName);");
return -1;
}
fileName = argv[0]->string;
/* FUTURE -- not romable
Need rom code in MPR not MprServices
*/
file = mprOpen(ep, fileName, O_RDONLY, 0664);
if (file == 0) {
ejsError(ep, EJS_IO_ERROR, "Can't open: %s", fileName);
return -1;
}
xp = initParser(ep, thisObj, fileName);
parser = exmlGetParseArg(xp);
exmlSetInputStream(xp, readFileData, (void*) file);
if (exmlParse(xp) < 0) {
if (! ejsGotException(ep)) {
ejsError(ep, EJS_IO_ERROR, "Can't parse XML file: %s\nDetails %s",
fileName, exmlGetErrorMsg(xp));
}
termParser(xp);
mprClose(file);
return -1;
}
ejsSetReturnValue(ep, parser->nodeStack[0].obj);
termParser(xp);
mprClose(file);
return 0;
}
/******************************************************************************/
int ejsDefineDateClass(Ejs *ep)
{
EjsVar *dateClass;
dateClass = ejsDefineClass(ep, "Date", "Object", ejsDateConstructor);
if (dateClass == 0) {
return MPR_ERR_CANT_INITIALIZE;
}
ejsDefineCMethod(ep, dateClass, "getDate", xxxProc, EJS_NO_LOCAL);
/* Returns "Friday" or 4 ? */
ejsDefineCMethod(ep, dateClass, "getDay", xxxProc, EJS_NO_LOCAL);
ejsDefineCMethod(ep, dateClass, "getMonth", xxxProc, EJS_NO_LOCAL);
ejsDefineCMethod(ep, dateClass, "getFullYear", xxxProc, EJS_NO_LOCAL);
ejsDefineCMethod(ep, dateClass, "getYear", xxxProc, EJS_NO_LOCAL);
ejsDefineCMethod(ep, dateClass, "getHours", xxxProc, EJS_NO_LOCAL);
ejsDefineCMethod(ep, dateClass, "getMinutes", xxxProc, EJS_NO_LOCAL);
ejsDefineCMethod(ep, dateClass, "getSeconds", xxxProc, EJS_NO_LOCAL);
ejsDefineCMethod(ep, dateClass, "getMilliseconds", xxxProc, EJS_NO_LOCAL);
ejsDefineCMethod(ep, dateClass, "getTime", xxxProc, EJS_NO_LOCAL);
ejsDefineCMethod(ep, dateClass, "getTimeZoneOffset", xxxProc, EJS_NO_LOCAL);
ejsDefineCMethod(ep, dateClass, "parse", xxxProc, EJS_NO_LOCAL);
ejsDefineCMethod(ep, dateClass, "setDate", xxxProc, EJS_NO_LOCAL);
ejsDefineCMethod(ep, dateClass, "setMonth", xxxProc, EJS_NO_LOCAL);
ejsDefineCMethod(ep, dateClass, "setFullYear", xxxProc, EJS_NO_LOCAL);
ejsDefineCMethod(ep, dateClass, "setYear", xxxProc, EJS_NO_LOCAL);
ejsDefineCMethod(ep, dateClass, "setMinutes", xxxProc, EJS_NO_LOCAL);
ejsDefineCMethod(ep, dateClass, "setSeconds", xxxProc, EJS_NO_LOCAL);
ejsDefineCMethod(ep, dateClass, "setMilliseconds", xxxProc, EJS_NO_LOCAL);
ejsDefineCMethod(ep, dateClass, "setTime", xxxProc, EJS_NO_LOCAL);
ejsDefineCMethod(ep, dateClass, "toString", xxxProc, EJS_NO_LOCAL);
ejsDefineCMethod(ep, dateClass, "toGMTString", xxxProc, EJS_NO_LOCAL);
ejsDefineCMethod(ep, dateClass, "toUTCString", xxxProc, EJS_NO_LOCAL);
ejsDefineCMethod(ep, dateClass, "toLocaleString", xxxProc, EJS_NO_LOCAL);
ejsDefineCMethod(ep, dateClass, "UTC", xxxProc, EJS_NO_LOCAL);
ejsDefineCMethod(ep, dateClass, "valueOf", xxxProc, EJS_NO_LOCAL);
/*
UTC: getUTCDate, getUTCDay, getUTCMonth, getUTCFullYear, getUTCHours,
getUTCMinutes, getUTCSeconds, getUTCMilliseconds
setUTCDate, setUTCDay, setUTCMonth, setUTCFullYear, setUTCHours,
setUTCMinutes, setUTCSeconds, setUTCMilliseconds
*/
return ejsObjHasErrors(dateClass) ? MPR_ERR_CANT_INITIALIZE : 0;
}
/******************************************************************************/
/*
Time is since 1970/01/01 GMT
Normal: Fri Feb 10 2006 05:06:44 GMT-0800 (Pacific Standard Time)
UTC: Sat, 11 Feb 2006 05:06:44 GMT
// Using without New
println(Date());
var myDate = new Date();
myDate.setFullYear(2010, 0, 14);
var today = new Date();
if (myDate > today) {
} else {
}
X=Date() should be equivalent to X=(new Date()).toString()
*/
/******************************************************************************/
#else
void ejsStndClassesDummy() {}
/******************************************************************************/
#endif /* BLD_FEATURE_EJS */
/*
* Local variables:
* tab-width: 4
* c-basic-offset: 4
* End:
* vim:tw=78
* vim600: sw=4 ts=4 fdm=marker
* vim<600: sw=4 ts=4
*/
+140
View File
@@ -0,0 +1,140 @@
/*
* @file ejsError.c
* @brief Error class
*/
/********************************* Copyright **********************************/
/*
* @copy default
*
* Copyright (c) Mbedthis Software LLC, 2003-2006. All Rights Reserved.
* Copyright (c) Michael O'Brien, 1994-1995. All Rights Reserved.
*
* This software is distributed under commercial and open source licenses.
* You may use the GPL open source license described below or you may acquire
* a commercial license from Mbedthis Software. You agree to be fully bound
* by the terms of either license. Consult the LICENSE.TXT distributed with
* this software for full details.
*
* This software is open source; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at your
* option) any later version. See the GNU General Public License for more
* details at: http://www.mbedthis.com/downloads/gplLicense.html
*
* This program is distributed WITHOUT ANY WARRANTY; without even the
* implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
*
* This GPL license does NOT permit incorporating this software into
* proprietary programs. If you are unable to comply with the GPL, you must
* acquire a commercial license to use this software. Commercial licenses
* for this software and support services are available from Mbedthis
* Software at http://www.mbedthis.com
*
* @end
*/
/********************************** Includes **********************************/
#include "ejs.h"
#if BLD_FEATURE_EJS
/************************************ Code ************************************/
/*
* Parse the args and return the message. Convert non-string args using
* .toString.
*/
static char *getMessage(Ejs *ep, int argc, EjsVar **argv)
{
if (argc == 0) {
return "";
} else if (argc == 1) {
if (! ejsVarIsString(argv[0])) {
if (ejsRunMethod(ep, argv[0], "toString", 0) < 0) {
return 0;
}
return ep->result->string;
} else {
return argv[0]->string;
}
} else {
/* Don't call ejsError here or it will go recursive. */
return 0;
}
}
/******************************************************************************/
/*
* Error Constructor and also used for constructor for sub classes.
*
* Usage: new Error([message])
*/
int ejsErrorCons(Ejs *ep, EjsVar *thisObj, int argc, EjsVar **argv)
{
char *msg, *stack;
msg = getMessage(ep, argc, argv);
if (msg == 0) {
return -1;
}
ejsSetPropertyToString(ep, thisObj, "name", ejsGetBaseClassName(thisObj));
ejsSetPropertyToString(ep, thisObj, "message", msg);
ejsSetPropertyToUndefined(ep, thisObj, "stack");
stack = ejsFormatStack(ep);
if (stack) {
ejsSetPropertyToString(ep, thisObj, "stack", stack);
mprFree(stack);
}
if (ejsObjHasErrors(thisObj)) {
return -1;
}
return 0;
}
/******************************************************************************/
int ejsDefineErrorClasses(Ejs *ep)
{
if (ejsDefineClass(ep, "Error", "Object", ejsErrorCons) == 0 ||
ejsDefineClass(ep, "AssertError", "Error", ejsErrorCons) == 0 ||
ejsDefineClass(ep, "EvalError", "Error", ejsErrorCons) == 0 ||
ejsDefineClass(ep, "InternalError", "Error", ejsErrorCons) == 0 ||
ejsDefineClass(ep, "IOError", "Error", ejsErrorCons) == 0 ||
ejsDefineClass(ep, "MemoryError", "Error", ejsErrorCons) == 0 ||
ejsDefineClass(ep, "RangeError", "Error", ejsErrorCons) == 0 ||
ejsDefineClass(ep, "ReferenceError", "Error", ejsErrorCons) == 0 ||
ejsDefineClass(ep, "SyntaxError", "Error", ejsErrorCons) == 0 ||
ejsDefineClass(ep, "TypeError", "Error", ejsErrorCons) == 0) {
return MPR_ERR_CANT_INITIALIZE;
}
return 0;
}
/******************************************************************************/
#else
void ejsErrorDummy() {}
/******************************************************************************/
#endif /* BLD_FEATURE_EJS */
/*
* Local variables:
* tab-width: 4
* c-basic-offset: 4
* End:
* vim:tw=78
* vim600: sw=4 ts=4 fdm=marker
* vim<600: sw=4 ts=4
*/
@@ -0,0 +1,588 @@
/*
* @file ejsObject.c
* @brief Object class
*/
/********************************* Copyright **********************************/
/*
* @copy default
*
* Copyright (c) Mbedthis Software LLC, 2003-2006. All Rights Reserved.
* Copyright (c) Michael O'Brien, 1994-1995. All Rights Reserved.
*
* This software is distributed under commercial and open source licenses.
* You may use the GPL open source license described below or you may acquire
* a commercial license from Mbedthis Software. You agree to be fully bound
* by the terms of either license. Consult the LICENSE.TXT distributed with
* this software for full details.
*
* This software is open source; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at your
* option) any later version. See the GNU General Public License for more
* details at: http://www.mbedthis.com/downloads/gplLicense.html
*
* This program is distributed WITHOUT ANY WARRANTY; without even the
* implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
*
* This GPL license does NOT permit incorporating this software into
* proprietary programs. If you are unable to comply with the GPL, you must
* acquire a commercial license to use this software. Commercial licenses
* for this software and support services are available from Mbedthis
* Software at http://www.mbedthis.com
*
* @end
*/
/********************************** Includes **********************************/
#include "ejs.h"
#if BLD_FEATURE_EJS
/****************************** Forward Declarations **************************/
/*
* Support routines
*/
static void formatVar(Ejs *ep, MprBuf *bp, EjsVar *vp);
/******************************************************************************/
/*
* Routine to create an object of the desired class. Class name may
* contain "."
*
* The created object will be a stand-alone class NOT entered into the
* properties of any other object. Callers must do this if required. ClassName
* may contain "." and is interpreted relative to "obj" if supplied.
*
* Note: this does not call the constructors for the various objects and base
* classes.
*/
EjsVar *ejsCreateSimpleObjInternal(EJS_LOC_DEC(ep, loc), const char *className)
{
EjsVar *baseClass;
if (className && *className) {
baseClass = ejsGetClass(ep, 0, className);
if (baseClass == 0) {
mprError(ep, MPR_LOC, "Can't find base class %s", className);
return 0;
}
} else {
baseClass = 0;
}
return ejsCreateSimpleObjUsingClassInt(EJS_LOC_PASS(ep, loc),
baseClass);
}
/******************************************************************************/
/*
* Create an object based upon the specified base class object. It will be a
* stand-alone class not entered into the properties of any other object.
* Callers must do this if required.
*
* Note: this does not call the constructors for the various objects and base
* classes.
*/
EjsVar *ejsCreateSimpleObjUsingClassInt(EJS_LOC_DEC(ep, loc),
EjsVar *baseClass)
{
EjsVar *vp;
mprAssert(baseClass);
if (baseClass == 0) {
mprError(ep, MPR_LOC, "Missing base class\n");
return 0;
}
vp = ejsCreateObjVarInternal(EJS_LOC_PASS(ep, loc));
if (vp == 0) {
return vp;
}
ejsSetBaseClass(vp, baseClass);
/*
* This makes all internal method accesses faster
* NOTE: this code is duplicated in ejsCreateSimpleClass
*/
mprAssert(vp->objectState);
vp->objectState->methods = baseClass->objectState->methods;
return vp;
}
/******************************************************************************/
void ejsSetMethods(Ejs *ep, EjsVar *op)
{
op->objectState->methods = ep->global->objectState->methods;
}
/******************************************************************************/
/******************************** Internal Methods ****************************/
/******************************************************************************/
static EjsVar *createObjProperty(Ejs *ep, EjsVar *obj, const char *property)
{
return ejsGetVarPtr(ejsCreateSimpleProperty(ep, obj, property));
}
/******************************************************************************/
static int deleteObjProperty(Ejs *ep, EjsVar *obj, const char *property)
{
return ejsDeleteProperty(ep, obj, property);
}
/******************************************************************************/
static EjsVar *getObjProperty(Ejs *ep, EjsVar *obj, const char *property)
{
return ejsGetVarPtr(ejsGetSimpleProperty(ep, obj, property));
}
/******************************************************************************/
/*
* Set the value of a property. Create if it does not exist
*/
static EjsVar *setObjProperty(Ejs *ep, EjsVar *obj, const char *property,
const EjsVar *value)
{
EjsProperty *pp;
EjsVar *vp;
pp = ejsCreateSimpleProperty(ep, obj, property);
if (pp == 0) {
mprAssert(pp);
return 0;
}
vp = ejsGetVarPtr(pp);
if (ejsWriteVar(ep, vp, value, EJS_SHALLOW_COPY) < 0) {
mprAssert(0);
return 0;
}
return ejsGetVarPtr(pp);
}
/******************************************************************************/
/*********************************** Constructors *****************************/
/******************************************************************************/
#if UNUSED
/*
* Object constructor. We don't use this for speed. Think very carefully if
* you add an object constructor.
*/
int ejsObjectConstructor(Ejs *ep, EjsVar *thisObj, int argc, EjsVar **argv)
{
return 0;
}
#endif
/******************************************************************************/
/******************************** Visible Methods *****************************/
/******************************************************************************/
static int cloneMethod(Ejs *ep, EjsVar *thisObj, int argc, EjsVar **argv)
{
int copyDepth;
copyDepth = EJS_DEEP_COPY;
if (argc == 1 && ejsVarToBoolean(argv[0])) {
copyDepth = EJS_RECURSIVE_DEEP_COPY;
}
ejsWriteVar(ep, ep->result, thisObj, copyDepth);
return 0;
}
/******************************************************************************/
static int toStringMethod(Ejs *ep, EjsVar *thisObj, int argc, EjsVar **argv)
{
MprBuf *bp;
int saveMaxDepth, saveDepth, saveFlags;
saveMaxDepth = ep->maxDepth;
if (argc >= 1) {
ep->maxDepth = ejsVarToInteger(argv[0]);
} else if (ep->maxDepth == 0) {
ep->maxDepth = MAXINT;
}
saveFlags = ep->flags;
if (argc >= 2) {
if (ejsVarToBoolean(argv[1])) {
ep->flags |= EJS_FLAGS_ENUM_HIDDEN;
}
}
if (argc == 3) {
if (ejsVarToBoolean(argv[2])) {
ep->flags |= EJS_FLAGS_ENUM_BASE;
}
}
bp = mprCreateBuf(ep, 0, 0);
saveDepth = ep->depth;
formatVar(ep, bp, thisObj);
ep->depth = saveDepth;
ep->maxDepth = saveMaxDepth;
mprAddNullToBuf(bp);
ejsWriteVarAsString(ep, ep->result, mprGetBufStart(bp));
mprFree(bp);
ep->flags = saveFlags;
return 0;
}
/******************************************************************************/
static int valueOfMethod(Ejs *ep, EjsVar *thisObj, int argc, EjsVar **argv)
{
if (argc != 0) {
mprAssert(0);
return -1;
}
switch (thisObj->type) {
default:
case EJS_TYPE_UNDEFINED:
case EJS_TYPE_NULL:
case EJS_TYPE_CMETHOD:
case EJS_TYPE_OBJECT:
case EJS_TYPE_METHOD:
case EJS_TYPE_STRING_CMETHOD:
ejsWriteVar(ep, ep->result, thisObj, EJS_SHALLOW_COPY);
break;
case EJS_TYPE_STRING:
ejsWriteVarAsInteger(ep, ep->result, atoi(thisObj->string));
break;
case EJS_TYPE_BOOL:
case EJS_TYPE_INT:
#if BLD_FEATURE_INT64
case EJS_TYPE_INT64:
#endif
#if BLD_FEATURE_FLOATING_POINT
case EJS_TYPE_FLOAT:
#endif
ejsWriteVar(ep, ep->result, thisObj, EJS_SHALLOW_COPY);
break;
}
return 0;
}
/******************************************************************************/
static int hashGetAccessor(Ejs *ejs, EjsVar *thisObj, int argc, EjsVar **argv)
{
ejsSetReturnValueToInteger(ejs, (int) thisObj->objectState);
return 0;
}
/******************************************************************************/
static int classGetAccessor(Ejs *ejs, EjsVar *thisObj, int argc, EjsVar **argv)
{
if (thisObj->objectState == 0 || thisObj->objectState->baseClass == 0) {
ejsSetReturnValueToString(ejs, "object");
} else {
ejsSetReturnValueToString(ejs,
thisObj->objectState->baseClass->objectState->className);
}
return 0;
}
/******************************************************************************/
/*
* Format an object. Called recursively to format properties and contained
* objects.
*/
static void formatVar(Ejs *ep, MprBuf *bp, EjsVar *vp)
{
EjsProperty *pp, *first;
EjsVar *propVar, *baseClass;
char *buf, *value;
int i;
if (vp->type == EJS_TYPE_OBJECT) {
if (!vp->objectState->visited) {
mprPutStringToBuf(bp, vp->isArray ? "[\n" : "{\n");
ep->depth++;
vp->objectState->visited = 1;
if (ep->depth <= ep->maxDepth) {
first = ejsGetFirstProperty(vp, EJS_ENUM_ALL);
if (ep->flags & EJS_FLAGS_ENUM_BASE) {
baseClass = vp->objectState->baseClass;
if (baseClass) {
for (i = 0; i < ep->depth; i++) {
mprPutStringToBuf(bp, " ");
}
mprPutStringToBuf(bp, baseClass->objectState->objName);
mprPutStringToBuf(bp, ": /* Base Class */ ");
if (baseClass->objectState == vp->objectState) {
value = "this";
} else if (ejsRunMethodCmd(ep, baseClass, "toString",
"%d", ep->maxDepth) < 0) {
value = "[object Object]";
} else {
mprAssert(ejsVarIsString(ep->result));
value = ep->result->string;
}
mprPutStringToBuf(bp, value);
if (first) {
mprPutStringToBuf(bp, ",\n");
}
}
}
pp = first;
while (pp) {
if (! pp->dontEnumerate ||
ep->flags & EJS_FLAGS_ENUM_HIDDEN) {
for (i = 0; i < ep->depth; i++) {
mprPutStringToBuf(bp, " ");
}
if (! vp->isArray) {
mprPutStringToBuf(bp, pp->name);
mprPutStringToBuf(bp, ": ");
}
propVar = ejsGetVarPtr(pp);
if (propVar->type == EJS_TYPE_OBJECT) {
if (pp->var.objectState == vp->objectState) {
value = "this";
} else if (ejsRunMethodCmd(ep, propVar,
"toString", "%d", ep->maxDepth) < 0) {
value = "[object Object]";
} else {
mprAssert(ejsVarIsString(ep->result));
value = ep->result->string;
}
mprPutStringToBuf(bp, value);
} else {
formatVar(ep, bp, &pp->var);
}
pp = ejsGetNextProperty(pp, EJS_ENUM_ALL);
if (pp) {
mprPutStringToBuf(bp, ",\n");
}
} else {
pp = ejsGetNextProperty(pp, EJS_ENUM_ALL);
}
}
}
vp->objectState->visited = 0;
mprPutCharToBuf(bp, '\n');
ep->depth--;
for (i = 0; i < ep->depth; i++) {
mprPutStringToBuf(bp, " ");
}
mprPutCharToBuf(bp, vp->isArray ? ']' : '}');
}
} else if (vp->type == EJS_TYPE_METHOD) {
mprPutStringToBuf(bp, "function (");
for (i = 0; i < vp->method.args->length; i++) {
mprPutStringToBuf(bp, vp->method.args->items[i]);
if ((i + 1) < vp->method.args->length) {
mprPutStringToBuf(bp, ", ");
}
}
mprPutStringToBuf(bp, ") {");
mprPutStringToBuf(bp, vp->method.body);
for (i = 0; i < ep->depth; i++) {
mprPutStringToBuf(bp, " ");
}
mprPutStringToBuf(bp, "}");
} else {
if (vp->type == EJS_TYPE_STRING) {
mprPutCharToBuf(bp, '\"');
}
/*
* We don't use ejsVarToString for arrays, objects and strings.
* This is because ejsVarToString does not call "obj.toString"
* and it is not required for strings.
* MOB - rc
*/
buf = ejsVarToString(ep, vp);
mprPutStringToBuf(bp, buf);
if (vp->type == EJS_TYPE_STRING) {
mprPutCharToBuf(bp, '\"');
}
}
}
/******************************************************************************/
/*
* mixin code. Blends code at the "thisObj" level.
*/
static int mixinMethod(Ejs *ep, EjsVar *thisObj, int argc, EjsVar **argv)
{
EjsProperty *pp;
char *buf;
int fid, i, rc;
mprAssert(argv);
/*
* Create a variable scope block set to the current object
*/
rc = 0;
fid = ejsSetBlock(ep, thisObj);
for (i = 0; i < argc; i++) {
if (ejsVarIsString(argv[i])) {
rc = ejsEvalScript(ep, argv[i]->string, 0);
} else if (ejsVarIsObject(argv[i])) {
/* MOB -- OPT. When we have proper scope chains, we should just
refer to the module and not copy */
pp = ejsGetFirstProperty(argv[i], EJS_ENUM_ALL);
while (pp) {
ejsSetProperty(ep, thisObj, pp->name, ejsGetVarPtr(pp));
pp = ejsGetNextProperty(pp, EJS_ENUM_ALL);
}
} else {
/* MOB - rc */
buf = ejsVarToString(ep, argv[i]);
rc = ejsEvalScript(ep, buf, 0);
}
if (rc < 0) {
ejsCloseBlock(ep, fid);
return -1;
}
}
ejsCloseBlock(ep, fid);
return 0;
}
/******************************************************************************/
/*
* Create the object class
*/
int ejsDefineObjectClass(Ejs *ep)
{
EjsMethods *methods;
EjsProperty *objectProp, *protoProp;
EjsVar *op, *globalClass;
/*
* Must specially hand-craft the object class as it is the base class
* of all objects.
*/
op = ejsCreateObjVar(ep);
if (op == 0) {
return MPR_ERR_CANT_CREATE;
}
ejsSetClassName(ep, op, "Object");
/*
* Don't use a constructor for objects for speed
*/
ejsMakeClassNoConstructor(op);
/*
* MOB -- should mark properties as public / private and class or instance.
*/
ejsDefineCMethod(ep, op, "clone", cloneMethod, EJS_NO_LOCAL);
ejsDefineCMethod(ep, op, "toString", toStringMethod, EJS_NO_LOCAL);
ejsDefineCMethod(ep, op, "valueOf", valueOfMethod, EJS_NO_LOCAL);
ejsDefineCMethod(ep, op, "mixin", mixinMethod, EJS_NO_LOCAL);
ejsDefineCAccessors(ep, op, "hash", hashGetAccessor, 0, EJS_NO_LOCAL);
ejsDefineCAccessors(ep, op, "baseClass", classGetAccessor, 0, EJS_NO_LOCAL);
/*
* MOB -- make this an accessor
*/
protoProp = ejsSetProperty(ep, op, "prototype", op);
if (protoProp == 0) {
ejsFreeVar(ep, op);
return MPR_ERR_CANT_CREATE;
}
/*
* Setup the internal methods. Most classes will never override these.
* The XML class will. We rely on talloc to free internal. Use "ep" as
* the parent as we need "methods" to live while the interpreter lives.
*/
methods = mprAllocTypeZeroed(ep, EjsMethods);
op->objectState->methods = methods;
methods->createProperty = createObjProperty;
methods->deleteProperty = deleteObjProperty;
methods->getProperty = getObjProperty;
methods->setProperty = setObjProperty;
objectProp = ejsSetPropertyAndFree(ep, ep->global, "Object", op);
/*
* Change the global class to use Object's methods
*/
globalClass = ep->service->globalClass;
globalClass->objectState->methods = methods;
globalClass->objectState->baseClass = ejsGetVarPtr(protoProp);
ep->objectClass = ejsGetVarPtr(objectProp);
if (ejsObjHasErrors(ejsGetVarPtr(objectProp))) {
ejsFreeVar(ep, op);
return MPR_ERR_CANT_CREATE;
}
return 0;
}
/******************************************************************************/
#else
void ejsObjectDummy() {}
/******************************************************************************/
#endif /* BLD_FEATURE_EJS */
/*
* Local variables:
* tab-width: 4
* c-basic-offset: 4
* End:
* vim:tw=78
* vim600: sw=4 ts=4 fdm=marker
* vim<600: sw=4 ts=4
*/
@@ -0,0 +1,144 @@
/*
* @file ejsStndClasses.c
* @brief EJS support methods
*/
/********************************* Copyright **********************************/
/*
* @copy default
*
* Copyright (c) Mbedthis Software LLC, 2003-2006. All Rights Reserved.
* Copyright (c) Michael O'Brien, 1994-1995. All Rights Reserved.
*
* This software is distributed under commercial and open source licenses.
* You may use the GPL open source license described below or you may acquire
* a commercial license from Mbedthis Software. You agree to be fully bound
* by the terms of either license. Consult the LICENSE.TXT distributed with
* this software for full details.
*
* This software is open source; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at your
* option) any later version. See the GNU General Public License for more
* details at: http://www.mbedthis.com/downloads/gplLicense.html
*
* This program is distributed WITHOUT ANY WARRANTY; without even the
* implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
*
* This GPL license does NOT permit incorporating this software into
* proprietary programs. If you are unable to comply with the GPL, you must
* acquire a commercial license to use this software. Commercial licenses
* for this software and support services are available from Mbedthis
* Software at http://www.mbedthis.com
*
* @end
*/
/********************************** Includes **********************************/
#include "ejs.h"
#if BLD_FEATURE_EJS
/******************************************************************************/
/******************************* Function Class *******************************/
/******************************************************************************/
int ejsDefineFunctionClass(Ejs *ep)
{
if (ejsDefineClass(ep, "Function", "Object", ejsFunctionConstructor) == 0) {
return MPR_ERR_CANT_INITIALIZE;
}
return 0;
}
/******************************************************************************/
/*
* Function constructor
*/
int ejsFunctionConstructor(Ejs *ep, EjsVar *thisObj, int argc, EjsVar **argv)
{
int rc;
if (argc != 1 || !ejsVarIsString(argv[0])) {
ejsArgError(ep, "Usage: Function(\"function (arg) { script };\");");
}
rc = ejsEvalScript(ep, argv[0]->string, 0);
/*
* Note: this will convert the object into a method. It will cease to be
* an object.
*/
if (rc == 0 && ejsVarIsMethod(ep->result)) {
/*
* Must make thisObj collectable.
*/
ejsMakeObjPermanent(thisObj, 0);
ejsMakeObjLive(thisObj, 1);
mprAssert(ejsObjIsCollectable(thisObj));
ejsWriteVar(ep, thisObj, ep->result, EJS_SHALLOW_COPY);
}
return rc;
}
/******************************************************************************/
/******************************* Boolean Class ********************************/
/******************************************************************************/
int ejsDefineBooleanClass(Ejs *ep)
{
if (ejsDefineClass(ep, "Boolean", "Object", ejsBooleanConstructor) == 0){
return MPR_ERR_CANT_INITIALIZE;
}
return 0;
}
/******************************************************************************/
/*
* Boolean constructor
*/
int ejsBooleanConstructor(Ejs *ep, EjsVar *thisObj, int argc, EjsVar **argv)
{
return 0;
}
/******************************************************************************/
/******************************** Number Class ********************************/
/******************************************************************************/
int ejsDefineNumberClass(Ejs *ep)
{
if (ejsDefineClass(ep, "Number", "Object", ejsNumberConstructor) == 0) {
return MPR_ERR_CANT_INITIALIZE;
}
return 0;
}
/******************************************************************************/
/*
* Number constructor
*/
int ejsNumberConstructor(Ejs *ep, EjsVar *thisObj, int argc, EjsVar **argv)
{
return 0;
}
/******************************************************************************/
#else
void ejsStndClassesDummy() {}
/******************************************************************************/
#endif /* BLD_FEATURE_EJS */
/*
* Local variables:
* tab-width: 4
* c-basic-offset: 4
* End:
* vim:tw=78
* vim600: sw=4 ts=4 fdm=marker
* vim<600: sw=4 ts=4
*/
@@ -0,0 +1,381 @@
/*
* @file ejsString.c
* @brief EJScript string class
*/
/********************************* Copyright **********************************/
/*
* @copy default
*
* Copyright (c) Mbedthis Software LLC, 2003-2006. All Rights Reserved.
* Copyright (c) Michael O'Brien, 1994-1995. All Rights Reserved.
*
* This software is distributed under commercial and open source licenses.
* You may use the GPL open source license described below or you may acquire
* a commercial license from Mbedthis Software. You agree to be fully bound
* by the terms of either license. Consult the LICENSE.TXT distributed with
* this software for full details.
*
* This software is open source; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at your
* option) any later version. See the GNU General Public License for more
* details at: http://www.mbedthis.com/downloads/gplLicense.html
*
* This program is distributed WITHOUT ANY WARRANTY; without even the
* implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
*
* This GPL license does NOT permit incorporating this software into
* proprietary programs. If you are unable to comply with the GPL, you must
* acquire a commercial license to use this software. Commercial licenses
* for this software and support services are available from Mbedthis
* Software at http://www.mbedthis.com
*
* @end
*/
/********************************** Includes **********************************/
#include "ejs.h"
#if BLD_FEATURE_EJS
/******************************************************************************/
/*********************************** Constructors *****************************/
/******************************************************************************/
/*
* String constructor.
*/
int ejsStringConstructor(Ejs *ejs, EjsVar *thisObj, int argc, EjsVar **argv)
{
char *str;
if (argc == 0) {
ejsSetReturnValueToString(ejs, "");
} else if (argc == 1) {
/* MOB -- rc */
str = ejsVarToString(ejs, argv[0]);
ejsSetReturnValueToString(ejs, str);
} else {
ejsArgError(ejs, "usage: String([var])");
return -1;
}
return 0;
}
/******************************************************************************/
/******************************** Visible Methods *****************************/
/******************************************************************************/
/*
* Return a string containing the character at a given index
*
* String string.charAt(Number)
*/
static int charAt(Ejs *ejs, EjsVar *thisObj, int argc, EjsVar **argv)
{
EjsNum num;
char buf[2];
if (argc != 1) {
ejsArgError(ejs, "usage: charAt(integer)");
return -1;
}
num = ejsVarToNumber(argv[0]);
if (num < 0 || num >= thisObj->length) {
ejsError(ejs, EJS_RANGE_ERROR, "Bad index");
return -1;
}
mprAssert(ejsVarIsString(thisObj));
buf[0] = argv[0]->string[num];
buf[1] = '\0';
ejsSetReturnValueToString(ejs, buf);
return 0;
}
/******************************************************************************/
/*
* Return an integer containing the character at a given index
*
* Number string.charCodeAt(Number)
*/
static EjsNum charCodeAt(Ejs *ejs, EjsVar *thisObj, int argc, EjsVar **argv)
{
EjsNum num;
if (argc != 1) {
ejsArgError(ejs, "usage: charCodeAt(integer)");
return -1;
}
num = ejsVarToNumber(argv[0]);
if (num < 0 || num >= thisObj->length) {
ejsError(ejs, EJS_RANGE_ERROR, "Bad index");
return -1;
}
ejsSetReturnValueToNumber(ejs, (EjsNum) argv[0]->string[num]);
return 0;
}
/******************************************************************************/
/*
* Catenate
*
* String string.catenate(var, ...)
*/
static int concat(Ejs *ejs, EjsVar *thisObj, int argc, EjsVar **argv)
{
int i;
if (argc == 0) {
ejsArgError(ejs, "usage: concat(String, ...)");
return -1;
}
mprAssert(ejsVarIsString(thisObj));
for (i = 0; i < argc; i++) {
if (ejsStrcat(ejs, thisObj, argv[i]) < 0) {
ejsMemoryError(ejs);
return -1;
}
}
ejsSetReturnValue(ejs, thisObj);
return 0;
}
/******************************************************************************/
/*
* Return the position of the first occurance of a substring
*
* Number string.indexOf(String subString [, Number start])
*/
static int indexOf(Ejs *ejs, EjsVar *thisObj, int argc, EjsVar **argv)
{
char *pat, *s1, *s2, *origin;
int start, i;
if (argc == 0 || argc > 2) {
ejsArgError(ejs, "usage: indexOf(String [, Number])");
return -1;
}
pat = ejsVarToString(ejs, argv[0]);
if (argc == 2) {
start = ejsVarToNumber(argv[1]);
if (start > thisObj->length) {
start = thisObj->length;
}
} else {
start = 0;
}
i = start;
for (origin = &thisObj->string[i]; i < thisObj->length; i++, origin++) {
s1 = origin;
for (s2 = pat; *s1 && *s2; s1++, s2++) {
if (*s1 != *s2) {
break;
}
}
if (*s2 == '\0') {
ejsSetReturnValueToNumber(ejs, (EjsNum) (origin - thisObj->string));
}
}
ejsSetReturnValueToNumber(ejs, (EjsNum) -1);
return 0;
}
/******************************************************************************/
/*
* Return the position of the last occurance of a substring
*
* Number string.lastIndexOf(String subString [, Number start])
*/
static int lastIndexOf(Ejs *ejs, EjsVar *thisObj, int argc, EjsVar **argv)
{
char *pat, *s1, *s2, *origin;
int start;
if (argc == 0 || argc > 2) {
ejsArgError(ejs, "usage: indexOf(String [, Number])");
return -1;
}
pat = ejsVarToString(ejs, argv[0]);
if (argc == 2) {
start = ejsVarToNumber(argv[1]);
if (start > thisObj->length) {
start = thisObj->length;
}
} else {
start = 0;
}
origin = &thisObj->string[thisObj->length - 1];
for (; origin >= &thisObj->string[start]; origin--) {
s1 = origin;
for (s2 = pat; *s1 && *s2; s1++, s2++) {
if (*s1 != *s2) {
break;
}
}
if (*s2 == '\0') {
ejsSetReturnValueToNumber(ejs, (EjsNum) (origin - thisObj->string));
}
}
ejsSetReturnValueToNumber(ejs, (EjsNum) -1);
return 0;
}
/******************************************************************************/
/*
* Return a substring
*
* Number string.slice(Number start, Number end)
*/
static int slice(Ejs *ejs, EjsVar *thisObj, int argc, EjsVar **argv)
{
EjsNum start, end;
if (argc != 2) {
ejsArgError(ejs, "usage: slice(Number, Number)");
return -1;
}
start = ejsVarToNumber(argv[0]);
end = ejsVarToNumber(argv[1]);
if (start < 0 || start >= thisObj->length) {
ejsError(ejs, EJS_RANGE_ERROR, "Bad start index");
return-1;
}
if (end < 0 || end >= thisObj->length) {
ejsError(ejs, EJS_RANGE_ERROR, "Bad end index");
return -1;
}
mprAssert(ejsVarIsString(thisObj));
ejsSetReturnValueToBinaryString(ejs, (uchar*) &thisObj->string[start],
end - start);
return 0;
}
/******************************************************************************/
/*
* Split a string
*
* Number string.split(String delimiter [, Number limit])
*/
static int split(Ejs *ejs, EjsVar *thisObj, int argc, EjsVar **argv)
{
EjsVar *array, *vp;
char *delim, *last, *cp;
int len, limit, alloc;
if (argc == 0 || argc > 2) {
ejsArgError(ejs, "usage: split(String [, Number])");
return -1;
}
delim = ejsVarToStringEx(ejs, argv[0], &alloc);
limit = ejsVarToNumber(argv[1]);
array = ejsCreateArray(ejs, 0);
len = strlen(delim);
last = thisObj->string;
for (cp = last; *cp; cp++) {
if (*cp == *delim && strncmp(cp, delim, len) == 0) {
if (cp > last) {
vp = ejsCreateBinaryStringVar(ejs, (uchar*) last, (cp - last));
ejsAddArrayElt(ejs, array, vp, EJS_SHALLOW_COPY);
ejsFreeVar(ejs, vp);
}
}
}
ejsSetReturnValue(ejs, array);
ejsFreeVar(ejs, array);
if (alloc) {
mprFree(delim);
}
return 0;
}
/******************************************************************************/
/*
* Create the object class
*/
int ejsDefineStringClass(Ejs *ejs)
{
EjsVar *sc;
sc = ejsDefineClass(ejs, "String", "Object", ejsStringConstructor);
if (sc == 0) {
return MPR_ERR_CANT_INITIALIZE;
}
ejsDefineCMethod(ejs, sc, "charAt", charAt, EJS_NO_LOCAL);
ejsDefineCMethod(ejs, sc, "charCodeAt", charCodeAt, EJS_NO_LOCAL);
ejsDefineCMethod(ejs, sc, "concat", concat, EJS_NO_LOCAL);
ejsDefineCMethod(ejs, sc, "indexOf", indexOf, EJS_NO_LOCAL);
ejsDefineCMethod(ejs, sc, "lastIndexOf", lastIndexOf, EJS_NO_LOCAL);
ejsDefineCMethod(ejs, sc, "slice", slice, EJS_NO_LOCAL);
ejsDefineCMethod(ejs, sc, "split", split, EJS_NO_LOCAL);
#if UNUSED
ejsDefineCMethod(ejs, sc, "match", match, EJS_NO_LOCAL);
ejsDefineCMethod(ejs, sc, "replace", replace, EJS_NO_LOCAL);
ejsDefineCMethod(ejs, sc, "search", search, EJS_NO_LOCAL);
ejsDefineCMethod(ejs, sc, "substring", substring, EJS_NO_LOCAL);
// MOB bad name
ejsDefineCMethod(ejs, sc, "substr", substr, EJS_NO_LOCAL);
ejsDefineCMethod(ejs, sc, "toLowerCase", toLowerCase, EJS_NO_LOCAL);
ejsDefineCMethod(ejs, sc, "toUpperCase", toUpperCase, EJS_NO_LOCAL);
// Static method
ejsDefineCMethod(ejs, sc, "fromCharCode", fromCharCode, 0, EJS_NO_LOCAL);
#endif
if (ejsObjHasErrors(sc)) {
ejsFreeVar(ejs, sc);
return MPR_ERR_CANT_CREATE;
}
return 0;
}
/******************************************************************************/
#endif /* BLD_FEATURE_EJS */
/*
* Local variables:
* tab-width: 4
* c-basic-offset: 4
* End:
* vim:tw=78
* vim600: sw=4 ts=4 fdm=marker
* vim<600: sw=4 ts=4
*/
File diff suppressed because it is too large Load Diff