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; }
static int blockingFileCopy(HttpConn *conn, cchar *path) { MprFile *file; char buf[MPR_BUFSIZE]; ssize bytes, nbytes, offset; int oldMode; file = mprOpenFile(path, O_RDONLY | O_BINARY, 0); if (file == 0) { mprError("Can't open %s", path); return MPR_ERR_CANT_OPEN; } mprAddRoot(file); oldMode = mprSetSocketBlockingMode(conn->sock, 1); while ((bytes = mprReadFile(file, buf, sizeof(buf))) > 0) { offset = 0; while (bytes > 0) { if ((nbytes = httpWriteBlock(conn->writeq, &buf[offset], bytes)) < 0) { mprCloseFile(file); mprRemoveRoot(file); return MPR_ERR_CANT_WRITE; } bytes -= nbytes; offset += nbytes; mprAssert(bytes >= 0); } mprYield(0); } httpFlushQueue(conn->writeq, 1); mprSetSocketBlockingMode(conn->sock, oldMode); mprCloseFile(file); mprRemoveRoot(file); return 0; }
static int blockingFileCopy(HttpConn *conn, cchar *path) { MprFile *file; char buf[ME_MAX_BUFFER]; ssize bytes, nbytes, offset; file = mprOpenFile(path, O_RDONLY | O_BINARY, 0); if (file == 0) { mprLog("error http client", 0, "Cannot open %s", path); return MPR_ERR_CANT_OPEN; } mprAddRoot(file); while ((bytes = mprReadFile(file, buf, sizeof(buf))) > 0) { offset = 0; while (bytes > 0) { if ((nbytes = httpWriteBlock(conn->writeq, &buf[offset], bytes, HTTP_BLOCK)) < 0) { mprCloseFile(file); mprRemoveRoot(file); return MPR_ERR_CANT_WRITE; } bytes -= nbytes; offset += nbytes; assert(bytes >= 0); } } httpFlushQueue(conn->writeq, HTTP_BLOCK); mprCloseFile(file); mprRemoveRoot(file); return 0; }
/* Create a simple stand-alone web server */ int main(int argc, char **argv, char **envp) { Mpr *mpr; MaAppweb *appweb; MaServer *server; int rc; rc = MPR_ERR_CANT_CREATE; if ((mpr = mprCreate(0, NULL, MPR_USER_EVENTS_THREAD)) == 0) { mprError("Cannot create the web server runtime"); return -1; } mprStart(); appweb = maCreateAppweb(mpr); mprAddRoot(appweb); server = maCreateServer(appweb, 0); if (maParseConfig(server, "appweb.conf", 0) < 0) { mprError("Cannot parse the config file %s", "appweb.conf"); return -1; } httpDefineAction("/action/myaction", myaction); if (maStartServer(server) < 0) { mprError("Cannot start the web server"); return -1; } mprServiceEvents(-1, 0); maStopServer(server); mprRemoveRoot(appweb); mprDestroy(MPR_EXIT_DEFAULT); return 0; }
PUBLIC void httpReturnConn(HttpConn *conn) { assert(conn->borrowed); if (conn->borrowed) { conn->borrowed = 0; mprRemoveRoot(conn); httpEnableConnEvents(conn); } }
static int runServer(cchar *configFile, cchar *ip, int port, cchar *home, cchar *documents) { MaAppweb *appweb; MaServer *server; if (mprStart() < 0) { mprLog("error appweb", 0, "Cannot start the web server runtime"); return MPR_ERR_CANT_CREATE; } if ((appweb = maCreateAppweb()) == 0) { mprLog("error appweb", 0, "Cannot create appweb object"); return MPR_ERR_CANT_CREATE; } mprAddRoot(appweb); if ((server = maCreateServer(appweb, 0)) == 0) { mprLog("error appweb", 0, "Cannot create the web server"); mprRemoveRoot(appweb); return MPR_ERR_CANT_CREATE; } if (home) { if (maConfigureServer(server, 0, home, documents, ip, port, 0) < 0) { mprLog("error appweb", 0, "Cannot create the web server"); mprRemoveRoot(appweb); return MPR_ERR_BAD_STATE; } } else { if (maParseConfig(server, configFile, 0) < 0) { mprLog("error appweb", 0, "Cannot parse the config file %s", configFile); mprRemoveRoot(appweb); return MPR_ERR_CANT_READ; } } if (maStartServer(server) < 0) { mprLog("error appweb", 0, "Cannot start the web server"); mprRemoveRoot(appweb); return MPR_ERR_CANT_COMPLETE; } mprServiceEvents(-1, 0); maStopServer(server); mprRemoveRoot(appweb); return 0; }
static int termLock(MprTestGroup *gp) { mprGlobalLock(gp); if (--threadCount == 0) { if (mutex) { mprRemoveRoot(mutex); mutex = 0; } } mprGlobalUnlock(gp); return 0; }
/* Convenience method to issue a client http request. Assumes the Mpr and Http services are created and initialized. */ PUBLIC HttpConn *httpRequest(cchar *method, cchar *uri, cchar *data, char **err) { HttpConn *conn; MprDispatcher *dispatcher; ssize len; if (err) { *err = 0; } dispatcher = mprCreateDispatcher("httpRequest", MPR_DISPATCHER_AUTO); mprStartDispatcher(dispatcher); conn = httpCreateConn(NULL, dispatcher); mprAddRoot(conn); /* Open a connection to issue the request. Then finalize the request output - this forces the request out. */ if (httpConnect(conn, method, uri, NULL) < 0) { mprRemoveRoot(conn); httpDestroyConn(conn); *err = sfmt("Cannot connect to %s", uri); return 0; } if (data) { len = slen(data); if (httpWriteBlock(conn->writeq, data, len, HTTP_BLOCK) != len) { *err = sclone("Cannot write request body data"); } } httpFinalizeOutput(conn); if (httpWait(conn, HTTP_STATE_CONTENT, MPR_MAX_TIMEOUT) < 0) { mprRemoveRoot(conn); httpDestroyConn(conn); *err = sclone("No response"); return 0; } mprRemoveRoot(conn); return conn; }
/* 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; }
/* Convenience method to issue a client http request. Assumes the Mpr and Http services are created and initialized. */ PUBLIC HttpStream *httpRequest(cchar *method, cchar *uri, cchar *data, int protocol, char **err) { HttpNet *net; HttpStream *stream; MprDispatcher *dispatcher; assert(err); dispatcher = mprCreateDispatcher("httpRequest", MPR_DISPATCHER_AUTO); mprStartDispatcher(dispatcher); net = httpCreateNet(dispatcher, NULL, protocol, 0); if ((stream = httpCreateStream(net, 0)) == 0) { return 0; } mprAddRoot(stream); if (clientRequest(stream, method, uri, data, protocol, err) < 0) { mprRemoveRoot(stream); httpDestroyNet(net); return 0; } mprRemoveRoot(stream); return stream; }
static int doRequest(HttpConn *conn, cchar *url, MprList *files) { MprTicks mark, remaining; HttpLimits *limits; MprFile *outFile; cchar *path; assert(url && *url); limits = conn->limits; mprTrace(4, "fetch: %s %s", app->method, url); mark = mprGetTicks(); if (issueRequest(conn, url, files) < 0) { return MPR_ERR_CANT_CONNECT; } remaining = limits->requestTimeout; if (app->outFilename) { path = app->loadThreads > 1 ? sfmt("%s-%s.tmp", app->outFilename, mprGetCurrentThreadName()): app->outFilename; if ((outFile = mprOpenFile(path, O_CREAT | O_WRONLY | O_TRUNC | O_TEXT, 0664)) == 0) { mprError("Cannot open %s", path); return MPR_ERR_CANT_OPEN; } } else { outFile = mprGetStdout(); } mprAddRoot(outFile); while (!conn->tx->finalized && conn->state < HTTP_STATE_COMPLETE && remaining > 0) { remaining = mprGetRemainingTicks(mark, limits->requestTimeout); readBody(conn, outFile); httpWait(conn, 0, remaining); } if (conn->state < HTTP_STATE_COMPLETE && !conn->error) { httpError(conn, HTTP_ABORT | HTTP_CODE_REQUEST_TIMEOUT, "Inactive request timed out, exceeded request timeout %d", app->timeout); } else { readBody(conn, outFile); } if (app->outFilename) { mprCloseFile(outFile); } mprRemoveRoot(outFile); reportResponse(conn, url, mprGetTicks() - mark); httpDestroyRx(conn->rx); httpDestroyTx(conn->tx); return 0; }
/* Run a web server not based on a config file. */ int maRunSimpleWebServer(cchar *ip, int port, cchar *home, cchar *documents) { Mpr *mpr; MaServer *server; MaAppweb *appweb; int rc; /* Initialize and start the portable runtime services. */ rc = MPR_ERR_CANT_CREATE; if ((mpr = mprCreate(0, NULL, 0)) == 0) { mprError("Can't create the web server runtime"); } else { if (mprStart(mpr) < 0) { mprError("Can't start the web server runtime"); } else { if ((appweb = maCreateAppweb(mpr)) == 0) { mprError("Can't create the web server http services"); } else { mprAddRoot(appweb); if ((server = maCreateServer(appweb, 0)) == 0) { mprError("Can't create the web server"); } else { if (maConfigureServer(server, 0, home, documents, ip, port) < 0) { mprError("Can't create the web server"); } else { if (maStartServer(server) < 0) { mprError("Can't start the web server"); } else { mprServiceEvents(-1, 0); rc = 0; } maStopServer(server); } } mprRemoveRoot(appweb); } } mprDestroy(MPR_EXIT_DEFAULT); } return rc; }
/* Wait for a command to complete. Return 0 if the command completed, otherwise it will return MPR_ERR_TIMEOUT. */ PUBLIC int mprWaitForCmd(MprCmd *cmd, MprTicks timeout) { MprTicks expires, remaining, delay; int64 dispatcherMark; assert(cmd); if (timeout < 0) { timeout = MAXINT; } if (mprGetDebugMode()) { timeout = MAXINT; } if (cmd->stopped) { timeout = 0; } expires = mprGetTicks() + timeout; remaining = timeout; /* Add root to allow callers to use mprRunCmd without first managing the cmd */ mprAddRoot(cmd); dispatcherMark = mprGetEventMark(cmd->dispatcher); while (!cmd->complete && remaining > 0) { if (mprShouldAbortRequests()) { break; } delay = (cmd->eofCount >= cmd->requiredEof) ? 10 : remaining; if (!MPR->eventing) { mprServiceEvents(delay, MPR_SERVICE_NO_BLOCK); delay = 0; } mprWaitForEvent(cmd->dispatcher, delay, dispatcherMark); remaining = (expires - mprGetTicks()); dispatcherMark = mprGetEventMark(cmd->dispatcher); } mprRemoveRoot(cmd); if (cmd->pid) { return MPR_ERR_TIMEOUT; } return 0; }
static int doRequest(HttpConn *conn, cchar *url, MprList *files) { MprFile *outFile; cchar *path; assert(url && *url); if (issueRequest(conn, url, files) < 0) { if (conn->rx && conn->rx->status) { reportResponse(conn, url); } return MPR_ERR_CANT_CONNECT; } if (app->outFilename) { path = app->loadThreads > 1 ? sfmt("%s-%s.tmp", app->outFilename, mprGetCurrentThreadName()): app->outFilename; if ((outFile = mprOpenFile(path, O_CREAT | O_WRONLY | O_TRUNC | O_TEXT, 0664)) == 0) { mprLog("error http", 0, "Cannot open %s", path); return MPR_ERR_CANT_OPEN; } } else { outFile = mprGetStdout(); } mprAddRoot(outFile); readBody(conn, outFile); while (conn->state < HTTP_STATE_COMPLETE && !httpRequestExpired(conn, -1)) { readBody(conn, outFile); httpWait(conn, 0, -1); } if (conn->state < HTTP_STATE_COMPLETE && !conn->error) { httpError(conn, HTTP_ABORT | HTTP_CODE_REQUEST_TIMEOUT, "Request timed out"); } if (app->outFilename) { mprCloseFile(outFile); } mprRemoveRoot(outFile); reportResponse(conn, url); httpDestroyRx(conn->rx); httpDestroyTx(conn->tx); return 0; }
/* Create a web server described by a config file. */ int maRunWebServer(cchar *configFile) { Mpr *mpr; MaAppweb *appweb; MaServer *server; int rc; rc = MPR_ERR_CANT_CREATE; if ((mpr = mprCreate(0, NULL, 0)) == 0) { mprError("Can't create the web server runtime"); } else { if (mprStart() < 0) { mprError("Can't start the web server runtime"); } else { if ((appweb = maCreateAppweb(mpr)) == 0) { mprError("Can't create appweb object"); } else { mprAddRoot(appweb); if ((server = maCreateServer(appweb, 0)) == 0) { mprError("Can't create the web server"); } else { if (maParseConfig(server, configFile, 0) < 0) { mprError("Can't parse the config file %s", configFile); } else { if (maStartServer(server) < 0) { mprError("Can't start the web server"); } else { mprServiceEvents(-1, 0); rc = 0; } maStopServer(server); } } mprRemoveRoot(appweb); } } } mprDestroy(MPR_EXIT_DEFAULT); return rc; }
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; }
static EjsString *serialize(Ejs *ejs, EjsAny *vp, Json *json) { EjsName qname; EjsFunction *fn; EjsString *result, *sv; EjsTrait *trait; EjsObj *pp, *obj, *replacerArgs[2]; wchar *cp; cchar *key; int c, isArray, i, count, slotNum, quotes; /* The main code below can handle Arrays, Objects, objects derrived from Object and also native classes with properties. All others just use toString. */ count = ejsIsPot(ejs, vp) ? ejsGetLength(ejs, vp) : 0; if (count == 0 && TYPE(vp) != ESV(Object) && TYPE(vp) != ESV(Array)) { // OPT - need some flag for this test. if (!ejsIsDefined(ejs, vp) || ejsIs(ejs, vp, Boolean) || ejsIs(ejs, vp, Number)) { return ejsToString(ejs, vp); } else if (json->regexp) { return ejsToString(ejs, vp); } else { return ejsToLiteralString(ejs, vp); } } obj = vp; json->nest++; if (json->buf == 0) { json->buf = mprCreateBuf(0, 0); mprAddRoot(json->buf); } isArray = ejsIs(ejs, vp, Array); mprPutCharToWideBuf(json->buf, isArray ? '[' : '{'); if (json->pretty) { mprPutCharToWideBuf(json->buf, '\n'); } if (++ejs->serializeDepth <= json->depth && !VISITED(obj)) { SET_VISITED(obj, 1); for (slotNum = 0; slotNum < count && !ejs->exception; slotNum++) { trait = ejsGetPropertyTraits(ejs, obj, slotNum); if (trait && (trait->attributes & (EJS_TRAIT_HIDDEN | EJS_TRAIT_DELETED | EJS_FUN_INITIALIZER | EJS_FUN_MODULE_INITIALIZER)) && !json->hidden) { continue; } pp = ejsGetProperty(ejs, obj, slotNum); if (ejs->exception) { SET_VISITED(obj, 0); json->nest--; return 0; } if (pp == 0) { continue; } if (isArray) { key = itos(slotNum); qname.name = ejsCreateStringFromAsc(ejs, key); qname.space = ESV(empty); } else { qname = ejsGetPropertyName(ejs, vp, slotNum); } quotes = json->quotes; if (!quotes) { // UNICODE for (cp = qname.name->value; cp < &qname.name->value[qname.name->length]; cp++) { if (!isalnum((uchar) *cp) && *cp != '_') { quotes = 1; break; } } } if (json->pretty) { for (i = 0; i < ejs->serializeDepth; i++) { mprPutStringToWideBuf(json->buf, json->indent); } } if (!isArray) { if (json->namespaces) { if (qname.space != ESV(empty)) { mprPutToBuf(json->buf, "\"%@\"::", qname.space); } } if (quotes) { mprPutCharToWideBuf(json->buf, '"'); } for (cp = qname.name->value; cp && *cp; cp++) { c = *cp; if (c == '"' || c == '\\') { mprPutCharToWideBuf(json->buf, '\\'); mprPutCharToWideBuf(json->buf, c); } else { mprPutCharToWideBuf(json->buf, c); } } if (quotes) { mprPutCharToWideBuf(json->buf, '"'); } mprPutCharToWideBuf(json->buf, ':'); if (json->pretty) { mprPutCharToWideBuf(json->buf, ' '); } } fn = (EjsFunction*) ejsGetPropertyByName(ejs, TYPE(pp)->prototype, N(NULL, "toJSON")); // OPT - check that this is going directly to serialize most of the time if (!ejsIsFunction(ejs, fn) || (fn->isNativeProc && fn->body.proc == (EjsProc) ejsObjToJSON)) { sv = serialize(ejs, pp, json); } else { sv = (EjsString*) ejsRunFunction(ejs, fn, pp, 1, &json->options); } if (sv == 0 || !ejsIs(ejs, sv, String)) { if (ejs->exception) { ejsThrowTypeError(ejs, "Cannot serialize property %@", qname.name); SET_VISITED(obj, 0); return 0; } } else { if (json->replacer) { replacerArgs[0] = (EjsObj*) qname.name; replacerArgs[1] = (EjsObj*) sv; /* function replacer(key: String, value: String): String */ sv = ejsRunFunction(ejs, json->replacer, obj, 2, (EjsObj**) replacerArgs); } mprPutBlockToBuf(json->buf, sv->value, sv->length * sizeof(wchar)); } if ((slotNum + 1) < count || json->commas) { mprPutCharToWideBuf(json->buf, ','); } if (json->pretty) { mprPutCharToWideBuf(json->buf, '\n'); } } SET_VISITED(obj, 0); } --ejs->serializeDepth; if (json->pretty) { for (i = ejs->serializeDepth; i > 0; i--) { mprPutStringToWideBuf(json->buf, json->indent); } } mprPutCharToWideBuf(json->buf, isArray ? ']' : '}'); mprAddNullToWideBuf(json->buf); if (--json->nest == 0) { result = ejsCreateString(ejs, mprGetBufStart(json->buf), mprGetBufLength(json->buf) / sizeof(wchar)); mprRemoveRoot(json->buf); } else { result = 0; } return result; }
MAIN(ejsmodMain, int argc, char **argv, char **envp) { Mpr *mpr; EjsMod *mp; Ejs *ejs; MprList *requiredModules; char *argp, *searchPath, *output, *modules, *name, *tok; int nextArg, err, flags; err = 0; output = searchPath = 0; requiredModules = 0; /* Initialze the Multithreaded Portable Runtime (MPR) */ mpr = mprCreate(argc, argv, 0); mprSetAppName(argv[0], 0, 0); /* Allocate the primary control structure */ if ((mp = mprAllocObj(EjsMod, manageMod)) == NULL) { return MPR_ERR_MEMORY; } mprAddRoot(mp); mp->lstRecords = mprCreateList(0, 0); mp->blocks = mprCreateList(0, 0); mp->docDir = sclone("."); mp->outputDir = sclone("."); for (nextArg = 1; nextArg < argc; nextArg++) { argp = argv[nextArg]; if (*argp != '-') { break; } if (strcmp(argp, "--cslots") == 0) { mp->cslots = 1; mp->genSlots = 1; } else if (strcmp(argp, "--debugger") == 0 || strcmp(argp, "-D") == 0) { mprSetDebugMode(1); } else if (strcmp(argp, "--depends") == 0) { mp->depends = 1; } else if (strcmp(argp, "--dir") == 0) { if (nextArg >= argc) { err++; } else { mp->outputDir = sclone(argv[++nextArg]); } } else if (strcmp(argp, "--error") == 0) { /* Undocumented switch */ mp->exitOnError++; mp->warnOnError++; } else if (strcmp(argp, "--html") == 0) { if (nextArg >= argc) { err++; } else { mp->docDir = sclone(argv[++nextArg]); mp->html = 1; } } else if (strcmp(argp, "--listing") == 0) { mp->listing = 1; mp->showAsm = 1; } else if (strcmp(argp, "--log") == 0) { /* Undocumented switch */ if (nextArg >= argc) { err++; } else { mprStartLogging(argv[++nextArg], 0); mprSetCmdlineLogging(1); } } else if (strcmp(argp, "--out") == 0) { if (nextArg >= argc) { err++; } else { output = argv[++nextArg]; mp->cslots = 1; mp->genSlots = 1; } } else if (strcmp(argp, "--search") == 0 || strcmp(argp, "--searchpath") == 0) { if (nextArg >= argc) { err++; } else { searchPath = argv[++nextArg]; } } else if (strcmp(argp, "--version") == 0 || strcmp(argp, "-V") == 0) { mprPrintfError("%s %s-%s\n", BIT_NAME, BIT_VERSION, BIT_NUMBER); return 0; } else if (strcmp(argp, "--require") == 0) { if (nextArg >= argc) { err++; } else { if (requiredModules == 0) { requiredModules = mprCreateList(-1, 0); } modules = sclone(argv[++nextArg]); /* Fix for Xcode and Visual Studio */ if (modules[0] == ' ' || scmp(modules, "null") == 0) { modules[0] = '\0'; } name = stok(modules, " \t", &tok); while (name != NULL) { require(requiredModules, name); name = stok(NULL, " \t", &tok); } } } else if (strcmp(argp, "--warn") == 0) { mp->warnOnError++; } else if (strcmp(argp, "--xml") == 0) { mp->xml = 1; } else { err++; break; } } if (argc == nextArg) { err++; } if (mp->genSlots == 0 && mp->listing == 0 && mp->html == 0 && mp->xml == 0 && mp->depends == 0) { mp->listing = 1; } if (mp->depends && requiredModules == 0) { requiredModules = mprCreateList(-1, 0); } if (err) { /* Examples: ejsmod file.mod # Defaults to --listing ejsmod --listing embedthis.mod ejsmod --out slots.h embedthis.mod */ mprPrintfError("Usage: %s [options] modules ...\n" " Ejscript module manager options:\n" " --cslots # Generate a C slot definitions file\n" " --html dir # Generate HTML documentation to the specified directory\n" " --listing # Create assembler listing files (default)\n" " --out file # Output file for all C slots (implies --cslots)\n" " --require \"modules\" # List of modules to preload\n" " --search ejsPath # Module file search path\n" " --version # Emit the program version information\n" " --warn # Warn about undocumented methods or parameters in doc\n\n", mpr->name); return -1; } /* Need an interpreter to load modules */ flags = EJS_FLAG_NO_INIT; if (mp->html || mp->xml) { flags |= EJS_FLAG_DOC; } if ((ejs = ejsCreateVM(0, 0, flags)) == 0) { return MPR_ERR_MEMORY; } if (ejsLoadModules(ejs, searchPath, requiredModules) < 0) { return MPR_ERR_CANT_READ; } mp->ejs = ejs; if (nextArg < argc) { if (process(mp, output, argc - nextArg, &argv[nextArg]) < 0) { err++; } } if (mp->errorCount > 0) { err = -1; } mprRemoveRoot(mp); ejsDestroyVM(ejs); mprDestroy(MPR_EXIT_DEFAULT); return err; }