343 lines
12 KiB
C
343 lines
12 KiB
C
|
/*
|
||
|
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.
|
||
|
*/
|