EdgeGateway_FSU/DevicePortGet/lib/goahead/include/js.h

343 lines
12 KiB
C
Raw Normal View History

2024-03-15 17:25:04 +08:00
/*
js.h -- JavaScript header
Copyright (c) All Rights Reserved. See details at the end of the file.
*/
#ifndef _h_JS
#define _h_JS 1
/********************************* Includes ***********************************/
#include "goahead.h"
#if ME_GOAHEAD_JAVASCRIPT
/********************************** Defines ***********************************/
#ifdef __cplusplus
extern "C" {
#endif
/*
Constants
*/
#define JS_INC 110 /* Growth for tags/tokens */
#define JS_SCRIPT_INC 1023 /* Growth for ej scripts */
#define JS_OFFSET 1 /* hAlloc doesn't like 0 entries */
#define JS_MAX_RECURSE 100 /* Sanity for maximum recursion */
/*
Javascript Lexical analyser tokens
*/
#define TOK_ERR -1 /* Any error */
#define TOK_LPAREN 1 /* ( */
#define TOK_RPAREN 2 /* ) */
#define TOK_IF 3 /* if */
#define TOK_ELSE 4 /* else */
#define TOK_LBRACE 5 /* { */
#define TOK_RBRACE 6 /* } */
#define TOK_LOGICAL 7 /* ||, &&, ! */
#define TOK_EXPR 8 /* +, -, /, % */
#define TOK_SEMI 9 /* ; */
#define TOK_LITERAL 10 /* literal string */
#define TOK_FUNCTION 11 /* function name */
#define TOK_NEWLINE 12 /* newline white space */
#define TOK_ID 13 /* function name */
#define TOK_EOF 14 /* End of script */
#define TOK_COMMA 15 /* Comma */
#define TOK_VAR 16 /* var */
#define TOK_ASSIGNMENT 17 /* = */
#define TOK_FOR 18 /* for */
#define TOK_INC_DEC 19 /* ++, -- */
#define TOK_RETURN 20 /* return */
/*
Expression operators
*/
#define EXPR_LESS 1 /* < */
#define EXPR_LESSEQ 2 /* <= */
#define EXPR_GREATER 3 /* > */
#define EXPR_GREATEREQ 4 /* >= */
#define EXPR_EQ 5 /* == */
#define EXPR_NOTEQ 6 /* != */
#define EXPR_PLUS 7 /* + */
#define EXPR_MINUS 8 /* - */
#define EXPR_DIV 9 /* / */
#define EXPR_MOD 10 /* % */
#define EXPR_LSHIFT 11 /* << */
#define EXPR_RSHIFT 12 /* >> */
#define EXPR_MUL 13 /* * */
#define EXPR_ASSIGNMENT 14 /* = */
#define EXPR_INC 15 /* ++ */
#define EXPR_DEC 16 /* -- */
#define EXPR_BOOL_COMP 17 /* ! */
/*
Conditional operators
*/
#define COND_AND 1 /* && */
#define COND_OR 2 /* || */
#define COND_NOT 3 /* ! */
/*
States
*/
#define STATE_ERR -1 /* Error state */
#define STATE_EOF 1 /* End of file */
#define STATE_COND 2 /* Parsing a "(conditional)" stmt */
#define STATE_COND_DONE 3
#define STATE_RELEXP 4 /* Parsing a relational expr */
#define STATE_RELEXP_DONE 5
#define STATE_EXPR 6 /* Parsing an expression */
#define STATE_EXPR_DONE 7
#define STATE_STMT 8 /* Parsing General statement */
#define STATE_STMT_DONE 9
#define STATE_STMT_BLOCK_DONE 10 /* End of block "}" */
#define STATE_ARG_LIST 11 /* Function arg list */
#define STATE_ARG_LIST_DONE 12
#define STATE_DEC_LIST 16 /* Declaration list */
#define STATE_DEC_LIST_DONE 17
#define STATE_DEC 18
#define STATE_DEC_DONE 19
#define STATE_RET 20 /* Return statement */
#define STATE_BEGIN STATE_STMT
/*
Flags. Used in Js and as parameter to parse()
*/
#define FLAGS_EXE 0x1 /* Execute statements */
#define FLAGS_VARIABLES 0x2 /* Allocated variables store */
#define FLAGS_FUNCTIONS 0x4 /* Allocated function store */
/*
Function call structure
*/
typedef struct JsFun {
char *fname; /* Function name */
char **args; /* Args for function (halloc) */
int nArgs; /* Number of args */
} JsFun;
/*
Evaluation block structure
*/
typedef struct JsInput {
WebsBuf tokbuf; /* Current token */
WebsBuf script; /* Input script for parsing */
char *putBackToken; /* Putback token string */
int putBackTokenId; /* Putback token ID */
char *line; /* Current line */
int lineLength; /* Current line length */
int lineNumber; /* Parse line number */
int lineColumn; /* Column in line */
} JsInput;
/**
Javascript engine structure
@defgroup Js Js
*/
typedef struct Js {
JsInput *input; /* Input evaluation block */
WebsHash functions; /* Symbol table for functions */
WebsHash *variables; /* hAlloc list of variables */
int variableMax; /* Number of entries */
JsFun *func; /* Current function */
char *result; /* Current expression result */
char *error; /* Error message */
char *token; /* Pointer to token string */
int tid; /* Current token id */
int jid; /* Halloc handle */
int flags; /* Flags */
void *userHandle; /* User defined handle */
} Js;
/**
Javascript function procedure
@ingroup Js
*/
typedef int (*JsProc)(int jid, void *handle, int argc, char **argv);
/******************************** Prototypes **********************************/
/**
Utility routine to parse function arguments
@param argc Count of arguments in argv
@param argv Array of arguments
@param fmt Printf style format string
@return Count of the arguments parsed
@ingroup Js
*/
PUBLIC int jsArgs(int argc, char **argv, cchar *fmt, ...);
/**
Close a javascript engine
@param jid Javascript ID allocated via jsOpenEngine
@ingroup Js
*/
PUBLIC void jsCloseEngine(int jid);
/**
Emit a parse error
@param js Javascript engine object
@param fmt Error message format string
@ingroup Js
*/
PUBLIC void jsError(Js *js, cchar *fmt, ...);
/**
Parse and evaluate a script. Return the last function return value.
@param jid Javascript ID allocated via jsOpenEngine
@param script Script to evaluate
@param emsg Pointer to a string to receive any error message
@param str String value to use as the result. Set to null for errors.
@ingroup Js
*/
PUBLIC char *jsEval(int jid, cchar *script, char **emsg);
/**
Get the function result value
@param jid Javascript ID allocated via jsOpenEngine
@return Function return value string. Caller must not free.
@ingroup Js
*/
PUBLIC cchar *jsGetResult(int jid);
/**
Get a variable value
@param jid Javascript ID allocated via jsOpenEngine
@param var Variable name
@param value Returned value.
@return If successful, a positive variable index, otherwise -1. This will be zero for global variables
and > 0 for local variables.
@ingroup Js
*/
PUBLIC int jsGetVar(int jid, cchar *var, cchar **value);
/**
Open a new javascript engine
@param variables Hash table of variables
@param functions Hash table of functions
@ingroup Js
*/
PUBLIC int jsOpenEngine(WebsHash variables, WebsHash functions);
/**
Set a local variable
@param jid Javascript ID allocated via jsOpenEngine
@param var Variable name
@param value Value to use
@ingroup Js
*/
PUBLIC void jsSetLocalVar(int jid, cchar *var, cchar *value);
/**
Set a global variable
@param jid Javascript ID allocated via jsOpenEngine
@param var Variable name
@param value value to use
@ingroup Js
*/
PUBLIC void jsSetGlobalVar(int jid, cchar *var, cchar *value);
/**
Set the function return result
@param jid Javascript ID allocated via jsOpenEngine
@param str String value to use as the result
@ingroup Js
*/
PUBLIC void jsSetResult(int jid, cchar *str);
/**
Set a variable value in the top most variable frame
@param jid Javascript ID allocated via jsOpenEngine
@param var Variable name
@param value Value to set
@ingroup Js
*/
PUBLIC void jsSetVar(int jid, cchar *var, cchar *value);
/**
Set a global function
@param jid Javascript ID allocated via jsOpenEngine
@param name Javascript function name
@param fn C function providing the implementation.
@ingroup Js
*/
PUBLIC int jsSetGlobalFunction(int jid, cchar *name, JsProc fn);
/*
Internal API
*/
PUBLIC int jsCloseBlock(int jid, int vid);
PUBLIC char *jsEvalBlock(int jid, cchar *script, char **emsg);
PUBLIC WebsHash jsGetFunctionTable(int jid);
PUBLIC void *jsGetGlobalFunction(int jid, cchar *name);
PUBLIC int jsGetLineNumber(int jid);
PUBLIC void *jsGetUserHandle(int jid);
PUBLIC WebsHash jsGetVariableTable(int jid);
PUBLIC int jsLexOpen(Js *ep);
PUBLIC void jsLexClose(Js *ep);
PUBLIC int jsLexOpenScript(Js *ep, cchar *script);
PUBLIC void jsLexCloseScript(Js *ep);
PUBLIC void jsLexSaveInputState(Js *ep, JsInput *state);
PUBLIC void jsLexFreeInputState(Js *ep, JsInput *state);
PUBLIC void jsLexRestoreInputState(Js *ep, JsInput *state);
PUBLIC int jsLexGetToken(Js *ep, int state);
PUBLIC void jsLexPutbackToken(Js *ep, int tid, cchar *string);
PUBLIC int jsOpenBlock(int jid);
PUBLIC int jsRemoveGlobalFunction(int jid, cchar *name);
PUBLIC int jsSetGlobalFunctionDirect(WebsHash functions, cchar *name, JsProc fn);
PUBLIC void jsSetUserHandle(int jid, void *handle);
#if ME_GOAHEAD_LEGACY
typedef Js ej_t;
typedef JsInput jsinput_t;
typedef JsFun jsfunc_t;
#define ejOpenBlock jsOpenBlock
#define ejCloseBlock jsCloseBlock
#define ejEvalBlock jsEvalBlock
#define ejRemoveGlobalFunction jsRemoveGlobalFunction
#define ejGetGlobalFunction jsGetGlobalFunction
#define ejSetGlobalFunctionDirect jsSetGlobalFunctionDirect
#define ejError jsError
#define ejSetUserHandle jsSetUserHandle
#define ejGetUserHandle jsGetUserHandle
#define ejGetLineNumber jsGetLineNumber
#define ejGetResult jsGetResult
#define ejSetLocalVar jsSetLocalVar
#define ejSetGlobalVar jsSetGlobalVar
#define ejLexOpen jsLexOpen
#define ejLexClose jsLexClose
#define ejLexOpenScript jsLexOpenScript
#define ejLexCloseScript jsLexCloseScript
#define ejLexSaveInputState jsLexSaveInputState
#define ejLexFreeInputState jsLexFreeInputState
#define ejLexRestoreInputState jsLexRestoreInputState
#define ejLexGetToken jsLexGetToken
#define ejLexPutbackToken jsLexPutbackToken
#define ejGetVariableTable jsGetVariableTable
#define ejGetFunctionTable jsGetFunctionTable
#define ejArgs jsArgs
#define ejSetResult jsSetResult
#define ejOpenEngine jsOpenEngine
#define ejCloseEngine jsCloseEngine
#define ejSetGlobalFunction jsSetGlobalFunction
#define ejSetVar jsSetVar
#define ejGetVar jsGetVar
#define ejEval jsEval
#endif
#ifdef __cplusplus
}
#endif
#endif /* ME_GOAHEAD_JAVASCRIPT */
#endif /* _h_JS */
/*
Copyright (c) Embedthis Software. All Rights Reserved.
This software is distributed under commercial and open source licenses.
You may use the Embedthis GoAhead open source license or you may acquire
a commercial license from Embedthis Software. You agree to be fully bound
by the terms of either license. Consult the LICENSE.md distributed with
this software for full details and other copyrights.
*/