PUBLIC EjsAny *ejsDeserialize(Ejs *ejs, EjsString *str) { EjsObj *obj; JsonState js; if (!ejsIs(ejs, str, String)) { ejsThrowSyntaxError(ejs, "Object is not a string"); return 0; } if (str->length == 0) { return ESV(empty); } js.next = js.data = str->value; js.end = &js.data[str->length]; js.error = 0; if ((obj = parseLiteral(ejs, &js)) == 0) { if (js.error) { ejsThrowSyntaxError(ejs, "Cannot parse object literal. Error at position %d.\n" "===========================\n" "Offending text: %w\n" "===========================\n" "In literal %w" "\n===========================\n", (int) (js.error - js.data), js.error, js.data); } else { ejsThrowSyntaxError(ejs, "Cannot parse object literal. Undefined error"); } return 0; } return obj; }
int ejsLoadScriptFile(Ejs *ejs, cchar *path, cchar *cache, int flags) { EcCompiler *ec; if ((ec = ecCreateCompiler(ejs, flags)) == 0) { return MPR_ERR_MEMORY; } mprAddRoot(ec); if (cache) { ec->noout = 0; ecSetOutputFile(ec, cache); } else { ec->noout = 1; } if (ecCompile(ec, 1, (char**) &path) < 0) { if (flags & EC_FLAGS_THROW && !ejs->exception) { ejsThrowSyntaxError(ejs, "%s", ec->errorMsg ? ec->errorMsg : "Can't parse script"); } mprRemoveRoot(ec); return EJS_ERR; } mprRemoveRoot(ec); if (ejsRun(ejs) < 0) { return EJS_ERR; } return 0; }
/* Support routine. Not an class method */ PUBLIC void ejsLoadXMLString(Ejs *ejs, EjsXML *xml, EjsString *xmlString) { EjsXmlState *parser; MprXml *xp; xp = ejsCreateXmlParser(ejs, xml, "string"); parser = mprXmlGetParseArg(xp); parser->inputBuf = ejsToMulti(ejs, xmlString); parser->inputSize = slen(parser->inputBuf); mprXmlSetInputStream(xp, readStringData, (void*) 0); if (mprXmlParse(xp) < 0 && !ejsHasException(ejs)) { ejsThrowSyntaxError(ejs, "Cannot parse XML string: %s", mprXmlGetErrorMsg(xp)); } }
/* Load and initialize a script literal */ int ejsLoadScriptLiteral(Ejs *ejs, EjsString *script, cchar *cache, int flags) { EcCompiler *cp; cchar *path; if ((cp = ecCreateCompiler(ejs, flags)) == 0) { return MPR_ERR_MEMORY; } mprAddRoot(cp); if (cache) { cp->noout = 0; ecSetOutputFile(cp, cache); } else { cp->noout = 1; } // UNICODE -- should this API be multi or unicode if (ecOpenMemoryStream(cp, ejsToMulti(ejs, script), script->length) < 0) { mprError("Can't open memory stream"); mprRemoveRoot(cp); return EJS_ERR; } path = "__script__"; if (ecCompile(cp, 1, (char**) &path) < 0) { if (flags & EC_FLAGS_THROW) { ejsThrowSyntaxError(ejs, "%s", cp->errorMsg ? cp->errorMsg : "Can't parse script"); } mprRemoveRoot(cp); return EJS_ERR; } ecCloseStream(cp); mprRemoveRoot(cp); MPR_VERIFY_MEM(); if (ejsRun(ejs) < 0) { return EJS_ERR; } return 0; }
static int parserHandler(MprXml *xp, int state, cchar *tagName, cchar *attName, cchar *value) { Ejs *ejs; EjsXmlState *parser; EjsXmlTagState *tos; EjsName qname; EjsXML *xml, *node, *parent; parser = (EjsXmlState*) xp->parseArg; ejs = parser->ejs; tos = &parser->nodeStack[parser->topOfStack]; xml = tos->obj; mprAssert(xml); mprAssert(state >= 0); mprAssert(tagName && *tagName); switch (state) { case MPR_XML_PI: node = ejsCreateXML(ejs, EJS_XML_PROCESSING, NULL, xml, value); ejsAppendToXML(ejs, xml, node); break; case MPR_XML_COMMENT: node = ejsCreateXML(ejs, EJS_XML_COMMENT, NULL, xml, value); ejsAppendToXML(ejs, xml, node); break; case MPR_XML_NEW_ELT: if (parser->topOfStack > E4X_MAX_NODE_DEPTH) { ejsThrowSyntaxError(ejs, "XML nodes nested too deeply in %s at line %d", parser->filename, mprXmlGetLineNumber(xp)); return MPR_ERR_BAD_SYNTAX; } if (xml->kind <= 0) { ejsConfigureXML(ejs, xml, EJS_XML_ELEMENT, tagName, xml, NULL); } else { ejsName(&qname, 0, tagName); xml = ejsCreateXML(ejs, EJS_XML_ELEMENT, &qname, xml, NULL); tos = &parser->nodeStack[++(parser->topOfStack)]; tos->obj = (EjsXML*) xml; tos->attributes = 0; tos->comments = 0; } break; case MPR_XML_NEW_ATT: ejsName(&qname, 0, attName); node = ejsCreateXML(ejs, EJS_XML_ATTRIBUTE, &qname, xml, value); ejsAppendAttributeToXML(ejs, xml, node); break; case MPR_XML_SOLO_ELT_DEFINED: if (parser->topOfStack > 0) { parent = parser->nodeStack[parser->topOfStack - 1].obj; ejsAppendToXML(ejs, parent, xml); parser->topOfStack--; mprAssert(parser->topOfStack >= 0); tos = &parser->nodeStack[parser->topOfStack]; } break; case MPR_XML_ELT_DEFINED: if (parser->topOfStack > 0) { parent = parser->nodeStack[parser->topOfStack - 1].obj; ejsAppendToXML(ejs, parent, xml); } break; case MPR_XML_ELT_DATA: case MPR_XML_CDATA: ejsName(&qname, 0, attName); node = ejsCreateXML(ejs, EJS_XML_TEXT, &qname, xml, value); ejsAppendToXML(ejs, xml, node); break; case MPR_XML_END_ELT: /* * This is the closing element in a pair "<x>...</x>". * Pop the stack frame off the elt stack */ if (parser->topOfStack > 0) { parser->topOfStack--; mprAssert(parser->topOfStack >= 0); tos = &parser->nodeStack[parser->topOfStack]; } break; default: ejsThrowSyntaxError(ejs, "XML error in %s at %d\nDetails %s", parser->filename, mprXmlGetLineNumber(xp), mprXmlGetErrorMsg(xp)); mprAssert(0); return MPR_ERR_BAD_SYNTAX; } return 0; }
MAIN(ejsMain, int argc, char **argv, char **envp) { Mpr *mpr; Ejs *ejs; EcCompiler *ec; char *argp, *searchPath, *path, *homeDir; int nextArg, err, flags; /* Initialize Multithreaded Portable Runtime (MPR) */ mpr = mprCreate(argc, argv, 0); app = mprAllocObj(App, manageApp); mprAddRoot(app); mprAddStandardSignals(); if (mprStart(mpr) < 0) { mprError("Cannot start mpr services"); return EJS_ERR; } err = 0; searchPath = 0; argc = mpr->argc; argv = (char**) mpr->argv; for (nextArg = 1; nextArg < argc; nextArg++) { argp = argv[nextArg]; if (*argp != '-') { break; } if (smatch(argp, "--chdir") || smatch(argp, "--home") || smatch(argp, "-C")) { if (nextArg >= argc) { err++; } else { homeDir = argv[++nextArg]; if (chdir((char*) homeDir) < 0) { mprError("Cannot change directory to %s", homeDir); } } } else if (smatch(argp, "--debugger") || smatch(argp, "-D")) { mprSetDebugMode(1); } else if (smatch(argp, "--log")) { if (nextArg >= argc) { err++; } else { mprStartLogging(argv[++nextArg], 0); mprSetCmdlineLogging(1); } } else if (smatch(argp, "--name")) { /* Just ignore. Used to tag commands with a unique command line */ nextArg++; } else if (smatch(argp, "--search") || smatch(argp, "--searchpath")) { if (nextArg >= argc) { err++; } else { searchPath = argv[++nextArg]; } } else if (smatch(argp, "--verbose") || smatch(argp, "-v")) { mprStartLogging("stderr:1", 0); mprSetCmdlineLogging(1); } else if (smatch(argp, "--version") || smatch(argp, "-V")) { mprPrintf("%s-%s\n", BIT_VERSION, BIT_BUILD_NUMBER); return 0; } else { /* Ignore */ } } path = mprJoinPath(mprGetAppDir(), mprGetPathBase(argv[0])); path = mprReplacePathExt(path, ".es"); mprAddRoot(path); argv[0] = path; if ((ejs = ejsCreateVM(argc, (cchar **) &argv[0], 0)) == 0) { return MPR_ERR_MEMORY; } app->ejs = ejs; if (ejsLoadModules(ejs, searchPath, NULL) < 0) { return MPR_ERR_CANT_READ; } mprLog(2, "Load script \"%s\"", path); flags = EC_FLAGS_BIND | EC_FLAGS_DEBUG | EC_FLAGS_NO_OUT | EC_FLAGS_THROW; if ((ec = ecCreateCompiler(ejs, flags)) == 0) { return MPR_ERR_MEMORY; } mprAddRoot(ec); ecSetOptimizeLevel(ec, 9); ecSetWarnLevel(ec, 1); if (ecCompile(ec, 1, (char**) &path) < 0) { if (flags & EC_FLAGS_THROW) { ejsThrowSyntaxError(ejs, "%s", ec->errorMsg ? ec->errorMsg : "Cannot parse script"); ejsReportError(ejs, "Error in script"); } err = MPR_ERR; } else { mprRemoveRoot(ec); if (ejsRunProgram(ejs, NULL, NULL) < 0) { ejsReportError(ejs, "Error in script"); err = MPR_ERR; } } if (!err) { err = mpr->exitStatus; } app->ejs = 0; mprTerminate(MPR_EXIT_DEFAULT, err); ejsDestroyVM(ejs); mprDestroy(MPR_EXIT_DEFAULT); return err; }