wmi-1.3.16 from opsview.com
This commit is contained in:
@@ -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
@@ -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
@@ -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
Reference in New Issue
Block a user