--- /dev/null
+#ifndef _JDISP_MACROS_JSH\r
+#define _JDISP_MACROS_JSH\r
+\r
+/*\r
+ * primitive macros\r
+ */\r
+#define FATAL(msg) alert(msg)\r
+\r
+#define STR_VEC2D(x, y) ("(" + Number(x) + "," + Number(y) + ")")\r
+#define STR_POINT(pos) ((IS_OBJECT(pos)) ? STR_VEC2D(pos.x, pos.y) : '(not-a-point)')\r
+#define STR_DIM(a) ((IS_OBJECT(a)) ? (a.width, a.height) : '(not-a-dimension)')\r
+\r
+#define IS_FUNCTION(n) (typeof (n) === 'function')\r
+#define IS_OBJECT(n) (typeof (n) === 'object')\r
+#define IS_DEFINED(n) (typeof (n) !== 'undefined')\r
+#define IS_STRING(n) (typeof (n) === 'string')\r
+#define IS_NUMBER(n) (typeof (n) === 'number')\r
+#define IS_NULL(n) ((n) === null)\r
+#define IS_NON_NULL_OBJECT(n) (!IS_NULL(n) && IS_OBJECT(n))\r
+#define IS_ARRAY(n) (n instanceof Array)\r
+\r
+#define INVOKE_IF_SET_RAW(h, args...) if (IS_FUNCTION(h)) h(args)\r
+#define INVOKE_IF_SET(h, args...) do { \\r
+ INVOKE_IF_SET_RAW(h, args); \\r
+} while (0)\r
+#define DEFAULT_VALUE(h, d) ((IS_DEFINED(h) && !IS_NULL(h)) ? (h) : (d))\r
+#define EVAL_RAW(txt) (function () {\\r
+ if (window.execScript) {window.execScript(txt);} \\r
+ else {window.eval(txt);} })()\r
+#define EVAL(txt) do { EVAL_RAW(txt); } while(0)\r
+#define SET_IF_DEF(name, val) if (IS_DEFINED(val)) name = val\r
+#define IMPORT_ARGUMENT(name) SET_IF_DEF(this.name, name)\r
+\r
+#define EMPTY_DICT() new Object()\r
+#define EMPTY_ARRAY() new Array()\r
+\r
+#define HAS_SUBSTRING(d, str) (String(d).indexOf(str) !== -1)\r
+#ifdef DEBUG\r
+# define LOG_DEBUG(msg) jdisp.logging.stdout.append(msg)\r
+#else\r
+# define LOG_DEBUG(msg)\r
+#endif\r
+#define TRACE(msg) jdisp.logging.stdout.append(__FILE__ + ': ' + msg)\r
+\r
+#define COUNTER_TICK(sec) jdisp.logging.counter.tick(sec)\r
+#define COUNTER_BEGIN(sec) jdisp.logging.counter.begin(sec)\r
+#define COUNTER_END(sec) jdisp.logging.counter.end(sec)\r
+\r
+#endif /* _JDISP_MACROS_JSH */\r