⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 esp.c

📁 samba最新软件
💻 C
📖 第 1 页 / 共 2 页
字号:
/******************************************************************************//* *	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 + -