home *** CD-ROM | disk | FTP | other *** search
/ Maximum CD 2000 April / maximum-cd-2000-04.iso / Utilities / InternetTools / dreamweaver3 / data1.cab / App_Files / Extending / c_files / mm_jsapi.h next >
Encoding:
C/C++ Source or Header  |  1999-12-09  |  8.0 KB  |  177 lines

  1. #ifndef _MM_JSAPI_H_
  2. #define _MM_JSAPI_H_
  3.  
  4. /*****************************************************************************
  5.  * Public data types
  6.  ****************************************************************************/
  7.  
  8. typedef struct JSContext JSContext;
  9. typedef struct JSObject JSObject;
  10. typedef long jsval;
  11. #ifndef JSBool
  12. typedef long JSBool;
  13. #endif
  14.  
  15. typedef JSBool (*JSNative)(JSContext *cx, JSObject *obj, unsigned int argc, 
  16.     jsval *argv, jsval *rval); 
  17.  
  18. /* Possible values for JSBool */
  19. #define JS_TRUE 1
  20. #define JS_FALSE 0
  21.  
  22.  
  23.  
  24. /*****************************************************************************
  25.  * Public functions
  26.  ****************************************************************************/
  27.  
  28. /* JSBool JS_DefineFunction(char *name, JSNative call, unsigned int nargs) */
  29. #define JS_DefineFunction(n, c, a) \
  30.     (mmEnv.defineFunction ? (*(mmEnv.defineFunction))(mmEnv.libObj, n, c, a) \
  31.                           : JS_FALSE)
  32.  
  33. /* char *JS_ValueToString(JSContext *cx, jsval v, unsigned int *pLength) */
  34. #define JS_ValueToString(c, v, l) \
  35.     (mmEnv.valueToString  ? (*(mmEnv.valueToString))(c, v, l) : (char *)0)
  36.  
  37. /* JSBool JS_ValueToInteger(JSContext *cx, jsval v, long *lp); */
  38. #define JS_ValueToInteger(c, v, l) \
  39.     (mmEnv.valueToInteger ? (*(mmEnv.valueToInteger))(c, v, l) : JS_FALSE)
  40.  
  41. /* JSBool JS_ValueToDouble(JSContext *cx, jsval v, double *dp); */
  42. #define JS_ValueToDouble(c, v, d) \
  43.     (mmEnv.valueToDouble  ? (*(mmEnv.valueToDouble))(c, v, d) : JS_FALSE)
  44.  
  45. /* JSBool JS_ValueToBoolean(JSContext *cx, jsval v, JSBool *bp); */
  46. #define JS_ValueToBoolean(c, v, b) \
  47.     (mmEnv.valueToBoolean ? (*(mmEnv.valueToBoolean))(c, v, b) : JS_FALSE)
  48.  
  49. /* JSBool JS_ValueToObject(JSContext *cx, jsval v, JSObject **op); */
  50. #define JS_ValueToObject(c, v, o) \
  51.     (mmEnv.valueToObject  ? (*(mmEnv.valueToObject))(c, v, o) : JS_FALSE)
  52.  
  53. /* JSBool JS_StringToValue(JSContext *cx, char *bytes, uint sz, jsval *vp); */
  54. #define JS_StringToValue(c, b, s, v) \
  55.     (mmEnv.stringToValue  ? (*(mmEnv.stringToValue))(c, b, s, v) : JS_FALSE)
  56.  
  57. /* JSBool JS_DoubleToValue(JSContext *cx, double dv, jsval *vp); */
  58. #define JS_DoubleToValue(c, d, v) \
  59.     (mmEnv.doubleToValue  ? (*(mmEnv.doubleToValue))(c, d, v) : JS_FALSE)
  60.  
  61. /* jsval JS_IntegerToValue(long lv); */
  62. #define JS_IntegerToValue(lv)       (((jsval)(lv) << 1) | 0x1)
  63.  
  64. /* jsval JS_BooleanToValue(JSBool bv); */
  65. #define JS_BooleanToValue(bv)       (((jsval)(bv) << 3) | 0x6)
  66.  
  67. /* jsval JS_ObjectToValue(JSObject *obj); */
  68. #define JS_ObjectToValue(ov)        ((jsval)(ov))
  69.  
  70. /* char *JS_ObjectType(JSObject *obj); */
  71. #define JS_ObjectType(o) \
  72.     (mmEnv.objectType     ? (*(mmEnv.objectType))(o) : (char *)0)
  73.  
  74. /* JSObject *JS_NewArrayObject(JSContext *cx, unsigned int length, jsval *v) */
  75. #define JS_NewArrayObject(c, l, v) \
  76.     (mmEnv.newArrayObject ? (*(mmEnv.newArrayObject))(c, l, v) : (JSObject *)0)
  77.  
  78. /* long JS_GetArrayLength(JSContext *cx, JSObject *obj) */
  79. #define JS_GetArrayLength(c, o) \
  80.     (mmEnv.getArrayLength ? (*(mmEnv.getArrayLength))(c, o) : -1)
  81.  
  82. /* JSBool JS_GetElement(JSContext *cx, JSObject *obj, jsint idx, jsval *vp) */
  83. #define JS_GetElement(c, o, i, v) \
  84.     (mmEnv.getElement     ? (*(mmEnv.getElement))(c, o, i, v) : JS_FALSE)
  85.  
  86. /* JSBool JS_SetElement(JSContext *cx, JSObject *obj, jsint idx, jsval *vp) */
  87. #define JS_SetElement(c, o, i, v) \
  88.     (mmEnv.setElement     ? (*(mmEnv.setElement))(c, o, i, v) : JS_FALSE)
  89.  
  90. /* JSBool JS_ExecuteScript(JSContext *cx, JSObject *obj, char *script,
  91.  *     unsigned int sz, jsval *rval) */
  92. #define JS_ExecuteScript(c, o, s, z, r) \
  93.     (mmEnv.executeScript  ? (*(mmEnv.executeScript))(c, o, s, z, __FILE__, \
  94.         __LINE__, r) : JS_FALSE)
  95.  
  96. /* JSBool JS_ReportError(JSContext *cx, char *error, unsigned int sz) */
  97. #define JS_ReportError(c, e, s) \
  98.     (mmEnv.reportError    ? (*(mmEnv.reportError))(c, e, s) : JS_FALSE)
  99.  
  100.  
  101.  
  102. /*****************************************************************************
  103.  * Private data types, macros, and globals
  104.  ****************************************************************************/
  105.  
  106. typedef struct {
  107.     JSObject *libObj;
  108.     JSBool (*defineFunction)(JSObject *libObj, char *name, JSNative call,
  109.         unsigned int nargs);
  110.     char *(*valueToString)(JSContext *cx, jsval v, unsigned int *pLength);
  111.     JSBool (*valueToInteger)(JSContext *cx, jsval v, long *lp);
  112.     JSBool (*valueToDouble)(JSContext *cx, jsval v, double *dp);
  113.     JSBool (*valueToBoolean)(JSContext *cx, jsval v, JSBool *bp);
  114.     JSBool (*valueToObject)(JSContext *cx, jsval v, JSObject **op);
  115.     JSBool (*stringToValue)(JSContext *cx, char *b, unsigned int sz,
  116.         jsval *vp);
  117.     JSBool (*doubleToValue)(JSContext *cx, double dv, jsval *vp);
  118.     char *(*objectType)(JSObject *obj);
  119.     JSObject *(*newArrayObject)(JSContext *cx, unsigned int length, jsval *vp);
  120.     long (*getArrayLength)(JSContext *cx, JSObject *obj);
  121.     JSBool (*getElement)(JSContext *cx, JSObject *obj, unsigned int idx,
  122.         jsval *vp);
  123.     JSBool (*setElement)(JSContext *cx, JSObject *obj, unsigned int idx,
  124.         jsval *vp);
  125.     JSBool (*executeScript)(JSContext *cx, JSObject *obj, char *script,
  126.         unsigned int sz, const char *file, unsigned int lineNum, jsval *rval);
  127.     JSBool (*reportError)(JSContext *cx, char *error, unsigned int sz);
  128. } MM_Environment;
  129.  
  130. extern MM_Environment mmEnv;
  131.  
  132. // Declare the external entry point and linkage
  133. #ifdef _WIN32
  134. #   ifndef _MAC  
  135.     // Windows
  136.     __declspec( dllexport ) void MM_InitWrapper( MM_Environment *env, unsigned int envSize );
  137. #   else
  138.     // Mac with MSVC++ Win32 portability lib
  139.     extern void MM_InitWrapper( MM_Environment *env, unsigned int envSize );
  140. #   endif
  141. #else
  142.     // Codewarrior
  143. #   pragma export on    
  144.     extern void MM_InitWrapper( MM_Environment *env, unsigned int envSize );
  145. #   pragma export off
  146. #endif
  147.  
  148.  
  149. #define MM_STATE                                                                \
  150.     /* Definitions of global variables */                                       \
  151.     MM_Environment mmEnv;                                                       \
  152.                                                                                 \
  153.     void                                                                        \
  154.     MM_InitWrapper(MM_Environment *env, unsigned int envSize)                   \
  155.     {                                                                           \
  156.         extern void MM_Init();                                                  \
  157.                                                                                 \
  158.         char **envPtr = (char **)env;                                           \
  159.         char **mmPtr =  (char **)(&mmEnv);                                      \
  160.         char **envEnd = (char **)((char *)envPtr + envSize);                    \
  161.         char **mmEnd =  (char **)((char *)mmPtr  + sizeof(MM_Environment));     \
  162.                                                                                 \
  163.         /* Copy fields from env to mmEnv, one pointer at a time */              \
  164.         while (mmPtr < mmEnd && envPtr < envEnd)                                \
  165.             *mmPtr++ = *envPtr++;                                               \
  166.                                                                                 \
  167.       /* If env doesn't define all of mmEnv's fields, set extras to NULL */     \
  168.         while (mmPtr < mmEnd)                                                   \
  169.             *mmPtr++ = (char *)0;                                               \
  170.                                                                                 \
  171.       /* Call user's MM_Init function */                                        \
  172.       MM_Init();                                                                \
  173.     }                                                                           \
  174.                                                                              
  175. #endif /* _MM_JSAPI_H_ */
  176.  
  177.