📄 esp.c
字号:
/******************************************************************************//* * Get the next ESP input token. input points to the next input token. * parse->token will hold the parsed token. The function returns the token id. */static int getEspToken(int state, EspParse *parse){ char *cp; int tid, done, c, quoted; tid = ESP_TOK_LITERAL; parse->tokp = parse->token; parse->tokp[0] = '\0'; quoted = 0; c = *parse->inp++; for (done = 0; !done; c = *parse->inp++) { /* * Get room for more characters in the token buffer */ if (parse->tokp >= parse->endp) { parse->token = (char*) mprRealloc(parse->token, parse->tokLen + ESP_TOK_INCR); if (parse->token == 0) { return ESP_TOK_ERR; } parse->token[parse->tokLen] = '\0'; parse->tokp = &parse->token[parse->tokLen - 1]; parse->tokLen += ESP_TOK_INCR; parse->endp = &parse->token[parse->tokLen - 1]; } switch (c) { case 0: if (*parse->token) { done++; parse->inp--; break; } return ESP_TOK_EOF; default: if (c == '\"' && state != ESP_STATE_IN_ESP_TAG) { *parse->tokp++ = '\\'; } *parse->tokp++ = c; quoted = 0; break; case '\\': quoted = 1; *parse->tokp++ = c; break; case '@': if (*parse->inp == '@' && state != ESP_STATE_IN_ESP_TAG) { if (quoted) { parse->tokp--; quoted = 0; } else { if (*parse->token) { parse->inp--; } else { parse->inp++; tid = ESP_TOK_ATAT; if (getIdentifier(parse) < 0) { return ESP_TOK_ERR; } } done++; break; } } *parse->tokp++ = c; break; case '<': if (*parse->inp == '%' && state != ESP_STATE_IN_ESP_TAG) { if (quoted) { parse->tokp--; quoted = 0; *parse->tokp++ = c; break; } if (*parse->token) { parse->inp--; done++; break; } parse->inp++; while (isspace((int) *parse->inp)) { parse->inp++; } if (*parse->inp == '=') { parse->inp++; while (isspace((int) *parse->inp)) { parse->inp++; } tid = ESP_TOK_EQUALS; if (getIdentifier(parse) < 0) { return ESP_TOK_ERR; } done++; break; } if (*parse->inp == 'i' && strncmp(parse->inp, "include", 7) == 0 && isspace((int) parse->inp[7])) { tid = ESP_TOK_INCLUDE; parse->inp += 7; while (isspace((int) *parse->inp)) { parse->inp++; } while (*parse->inp && !isspace((int) *parse->inp) && *parse->inp != '%' && parse->tokp < parse->endp) { *parse->tokp++ = *parse->inp++; } *parse->tokp = '\0'; if (parse->token[0] == '"') { parse->tokp = parse->token; for (cp = &parse->token[1]; *cp; ) { *parse->tokp++ = *cp++; } if (cp[-1] == '"') { parse->tokp--; } *parse->tokp = '\0'; } } else { tid = ESP_TOK_START_ESP; } done++; break; } *parse->tokp++ = c; break; case '%': if (*parse->inp == '>' && state == ESP_STATE_IN_ESP_TAG) { if (quoted) { parse->tokp--; quoted = 0; } else { if (*parse->token) { parse->inp--; } else { tid = ESP_TOK_END_ESP; parse->inp++; } done++; break; } } *parse->tokp++ = c; break; } } *parse->tokp = '\0'; parse->inp--; return tid;}/******************************************************************************//* * Convert an ESP page into a JavaScript. We also expand include files. */static int buildScript(EspRequest *ep, char **jsBuf, char *input, char **errMsg){ EspParse parse; char path[MPR_MAX_FNAME], dir[MPR_MAX_FNAME], incPath[MPR_MAX_FNAME]; char *incBuf, *incText; int state, tid, len, rc, maxScriptSize, incSize; mprAssert(ep); mprAssert(jsBuf); mprAssert(input); rc = 0; len = 0; state = ESP_STATE_BEGIN; if (errMsg) { *errMsg = 0; } memset(&parse, 0, sizeof(parse)); parse.token = (char*) mprMalloc(ESP_TOK_INCR); if (parse.token == 0) { return MPR_ERR_CANT_ALLOCATE; } parse.token[0] = '\0'; parse.tokLen = ESP_TOK_INCR; parse.endp = &parse.token[parse.tokLen - 1]; parse.tokp = parse.token; parse.inBuf = input; parse.inp = parse.inBuf; maxScriptSize = esp->maxScriptSize; tid = getEspToken(state, &parse); while (tid != ESP_TOK_EOF && len >= 0) { switch (tid) { default: case ESP_TOK_ERR: mprFree(parse.token); return MPR_ERR_BAD_SYNTAX; case ESP_TOK_LITERAL: len = mprReallocStrcat(jsBuf, maxScriptSize, len, 0, "write(\"", parse.token, "\");\n", NULL); break; case ESP_TOK_ATAT: /* * Trick to get undefined variables to evaluate to "". * Catenate with "" to cause toString to run. */ len = mprReallocStrcat(jsBuf, maxScriptSize, len, 0, "write(\"\" + ", parse.token, ");\n", NULL); break; case ESP_TOK_EQUALS: len = mprReallocStrcat(jsBuf, maxScriptSize, len, 0, "write(\"\" + ", parse.token, ");\n", NULL); state = ESP_STATE_IN_ESP_TAG; break; case ESP_TOK_START_ESP: state = ESP_STATE_IN_ESP_TAG; tid = getEspToken(state, &parse); while (tid != ESP_TOK_EOF && tid != ESP_TOK_EOF && tid != ESP_TOK_END_ESP && len >= 0) { len = mprReallocStrcat(jsBuf, maxScriptSize, len, 0, parse.token, NULL); tid = getEspToken(state, &parse); } state = ESP_STATE_BEGIN; break; case ESP_TOK_END_ESP: state = ESP_STATE_BEGIN; break; case ESP_TOK_INCLUDE: if (parse.token[0] == '/') { mprStrcpy(incPath, sizeof(incPath), parse.token); } else { mprGetDirName(dir, sizeof(dir), ep->uri); mprSprintf(incPath, sizeof(incPath), "%s/%s", dir, parse.token); } if (esp->mapToStorage(ep->requestHandle, path, sizeof(path), incPath, 0) < 0) { mprAllocSprintf(errMsg, MPR_MAX_STRING, "Can't find include file: %s", path); rc = MPR_ERR_CANT_OPEN; break; } if (esp->readFile(ep->requestHandle, &incText, &incSize, path) < 0){ mprAllocSprintf(errMsg, MPR_MAX_STRING, "Can't read include file: %s", path); rc = MPR_ERR_CANT_READ; break; } incText[incSize] = '\0'; /* * Recurse and process the include script */ incBuf = 0; if ((rc = buildScript(ep, &incBuf, incText, errMsg)) < 0) { mprFree(incText); mprFree(parse.token); return rc; } len = mprReallocStrcat(jsBuf, maxScriptSize, len, 0, incBuf, NULL); mprFree(incText); mprFree(incBuf); state = ESP_STATE_IN_ESP_TAG; break; } tid = getEspToken(state, &parse); } mprFree(parse.token); if (len < 0) { mprAllocSprintf(errMsg, MPR_MAX_STRING, "Script token is too big in %s.\nConfigured maximum is %d.", path, maxScriptSize); return MPR_ERR_WONT_FIT; } return rc;}/******************************************************************************//******************************* Wrapped Routines *****************************//******************************************************************************/int espCopyVar(EspRequest *ep, char *var, MprVar *value, int copyDepth){ return ejsCopyVar(ep->eid, var, value, copyDepth);}/******************************************************************************/MprVar espCreateObjVar(char *name, int hashSize){ return ejsCreateObj(name, hashSize);}/******************************************************************************/MprVar espCreateArrayVar(char *name, int size){ return ejsCreateArray(name, size);}/******************************************************************************/bool espDestroyVar(MprVar *obj){ return ejsDestroyVar(obj);}/******************************************************************************/MprVar *espCreateProperty(MprVar *obj, char *property, MprVar *newValue){ return mprCreateProperty(obj, property, newValue);}/******************************************************************************/MprVar *espCreatePropertyValue(MprVar *obj, char *property, MprVar newValue){ return mprCreatePropertyValue(obj, property, newValue);}/******************************************************************************/void espDefineFunction(EspRequest *ep, const char *functionName, char *args, char *body){ ejsDefineFunction(ep->eid, functionName, args, body);}/******************************************************************************/int espDeleteProperty(MprVar *obj, char *property){ return mprDeleteProperty(obj, property);}/******************************************************************************/int espDeleteVar(EspRequest *ep, char *var){ return ejsDeleteVar(ep->eid, var);}/******************************************************************************/int espEvalFile(EspRequest *ep, char *path, MprVar *result, char **emsg){ return ejsEvalFile(ep->eid, path, result, emsg);}/******************************************************************************/int espEvalScript(EspRequest *ep, char *script, MprVar *result, char **emsg){ return ejsEvalScript(ep->eid, script, result, emsg);}/******************************************************************************/int espGetPropertyCount(MprVar *obj, int includeFlags){ if (obj->type != MPR_TYPE_OBJECT) { return MPR_ERR_BAD_STATE; } return mprGetPropertyCount(obj, includeFlags);}/******************************************************************************/MprVar *espGetFirstProperty(MprVar *obj, int includeFlags){ return mprGetFirstProperty(obj, includeFlags);}/******************************************************************************/MprVar *espGetGlobalObject(EspRequest *ep){ return ejsGetGlobalObject(ep->eid);}/******************************************************************************/MprVar *espGetLocalObject(EspRequest *ep){ return ejsGetLocalObject(ep->eid);}/******************************************************************************/MprVar *espGetNextProperty(MprVar *obj, MprVar *currentProperty, int includeFlags){ return mprGetNextProperty(obj, currentProperty, includeFlags);}/******************************************************************************/MprVar *espGetProperty(MprVar *obj, char *property, MprVar *value){ return mprGetProperty(obj, property, value);}/******************************************************************************/void *espGetThisPtr(EspRequest *ep){ return ejsGetThisPtr(ep->eid);}/******************************************************************************/#if XX_UNUSED_XX int espReadProperty(MprVar *dest, MprVar *prop){ mprAssert(prop); mprAssert(dest); *dest = *prop; return 0;}#endif/******************************************************************************/int espReadVar(EspRequest *ep, char *var, MprVar *value){ return ejsReadVar(ep->eid, var, value);}/******************************************************************************/int espRunFunction(EspRequest *ep, MprVar *obj, char *functionName, MprArray *args){ return ejsRunFunction(ep->eid, obj, functionName, args);}/******************************************************************************/MprVar *espSetProperty(MprVar *obj, char *property, MprVar *newValue){ return mprSetProperty(obj, property, newValue);}/******************************************************************************/MprVar *espSetPropertyValue(MprVar *obj, char *property, MprVar newValue){ return mprSetPropertyValue(obj, property, newValue);}/******************************************************************************/int espWriteVar(EspRequest *ep, char *var, MprVar *value){ return ejsWriteVar(ep->eid, var, value);}/******************************************************************************/int espWriteVarValue(EspRequest *ep, char *var, MprVar value){ return ejsWriteVarValue(ep->eid, var, value);}/******************************************************************************/#if XX_UNUSED_XXint espWriteProperty(MprVar *prop, MprVar *newValue){ return mprWriteProperty(prop, newValue);}/******************************************************************************/int espWritePropertyValue(MprVar *prop, MprVar newValue){ return mprWritePropertyValue(prop, newValue);}#endif/******************************************************************************/#else /* !BLD_FEATURE_ESP_MODULE */void espDummy() {}/******************************************************************************/#endif /* BLD_FEATURE_ESP_MODULE *//* * 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 */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -