4 #ifndef _SPIDERSCRIPT_H_
5 #define _SPIDERSCRIPT_H_
9 #define ERRPTR ((void*)((intptr_t)0-1))
12 * \brief Opaque script handle
14 typedef struct sSpiderScript tSpiderScript;
16 typedef struct sSpiderVariant tSpiderVariant;
17 typedef struct sSpiderFunction tSpiderFunction;
18 typedef struct sSpiderValue tSpiderValue;
19 typedef struct sSpiderObjectDef tSpiderObjectDef;
20 typedef struct sSpiderObject tSpiderObject;
24 * \brief SpiderScript Variable Datatypes
25 * \todo Expand the descriptions
27 enum eSpiderScript_DataTypes
29 SS_DATATYPE_UNDEF, //!< Undefined
30 SS_DATATYPE_NULL, //!< NULL (Probably will never be used)
31 SS_DATATYPE_DYNAMIC, //!< Dynamically typed variable (will this be used?)
32 SS_DATATYPE_OPAQUE, //!< Opaque data type
33 SS_DATATYPE_OBJECT, //!< Object reference
34 SS_DATATYPE_ARRAY, //!< Array
35 SS_DATATYPE_INTEGER, //!< Integer (64-bits)
36 SS_DATATYPE_REAL, //!< Real Number (double)
37 SS_DATATYPE_STRING, //!< String
42 * \brief Variant of SpiderScript
46 const char *Name; // Just for debug
48 int bDyamicTyped; //!< Use static typing
50 tSpiderFunction *Functions; //!< Functions (Linked List)
52 int NConstants; //!< Number of constants
53 tSpiderValue *Constants; //!< Number of constants
57 * \brief SpiderScript data object
61 enum eSpiderScript_DataTypes Type; //!< Variable type
62 int ReferenceCount; //!< Reference count
65 uint64_t Integer; //!< Integer data
66 double Real; //!< Real Number data
71 int Length; //!< Length
72 char Data[]; //!< Actual string (\a Length bytes)
75 * \brief Variable data
78 int Length; //!< Length of the array
79 tSpiderValue *Items[]; //!< Array elements (\a Length long)
86 void *Data; //!< Data (can be anywhere)
87 int Size; //!< Data size (zero means full opaque)
88 void (*Destroy)(void *Data); //!< Called on GC
92 * \brief Object Instance
94 tSpiderObject *Object;
99 * \brief Object Definition
101 * Internal representation of an arbitary object.
103 struct sSpiderObjectDef
107 struct sSpiderObjectDef *Next; //!< Internal linked list
109 * \brief Object type name
111 const char* const Name;
113 * \brief Construct an instance of the object
114 * \param NArgs Number of arguments
115 * \param Args Argument count
116 * \return Pointer to an object instance (which must be fully valid)
117 * \retval NULL Invalid parameter (usually, actually just a NULL value)
118 * \retval ERRPTR Invalid parameter count
120 tSpiderObject *(*Constructor)(int NArgs, tSpiderValue *Args);
123 * \brief Clean up and destroy the object
124 * \param This Object instace
125 * \note The object pointer (\a This) should be invalidated and freed
128 void (*Destructor)(tSpiderObject *This);
130 int NAttributes; //!< Number of attributes
132 //! Attribute definitions
134 const char *Name; //!< Attribute Name
135 int bReadOnly; //!< Allow writes to the attribute?
139 int NMethods; //!< Number of methods
140 tSpiderFunction *Methods; //!< Method Definitions
144 * \brief Object Instance
148 tSpiderObjectDef *Type; //!< Object Type
149 int NReferences; //!< Number of references
150 void *OpaqueData; //!< Pointer to the end of the \a Attributes array
151 tSpiderValue *Attributes[]; //!< Attribute Array
155 * \brief Represents a function avaliable to a script
157 struct sSpiderFunction
160 * \brief Next function in list
162 struct sSpiderFunction *Next;
165 * \brief Function name
169 * \brief Function handler
171 tSpiderValue *(*Handler)(tSpiderScript *Script, int nParams, tSpiderValue **Parameters);
173 * \brief Argument types
175 * Zero or -1 terminated array of \a eSpiderScript_DataTypes.
176 * If the final entry is zero, the function has a fixed number of
177 * parameters, if the final entry is -1, the function has a variable
178 * number of arguments.
180 int ArgTypes[]; // Zero (or -1) terminated array of parameter types
186 * \brief Parse a file into a script
187 * \param Variant Variant structure
188 * \param Filename File to parse
189 * \return Script suitable for execution
191 extern tSpiderScript *SpiderScript_ParseFile(tSpiderVariant *Variant, const char *Filename);
193 * \brief Execute a method from a script
194 * \param Script Script to run
195 * \param Function Name of function to run ("" for the 'main')
196 * \return Return value
198 extern tSpiderValue *SpiderScript_ExecuteMethod(tSpiderScript *Script,
199 const char *Function,
200 int NArguments, tSpiderValue **Arguments
204 * \brief Free a script
205 * \param Script Script structure to free
207 extern void SpiderScript_Free(tSpiderScript *Script);
210 * \name tSpiderValue Manipulation functions
213 extern tSpiderValue *SpiderScript_CreateInteger(uint64_t Value);
214 extern tSpiderValue *SpiderScript_CreateReal(double Value);
215 extern tSpiderValue *SpiderScript_CreateString(int Length, const char *Data);
216 extern tSpiderValue *SpiderScript_CastValueTo(int Type, tSpiderValue *Source);
217 extern int SpiderScript_IsValueTrue(tSpiderValue *Value);
218 extern char *SpiderScript_DumpValue(tSpiderValue *Value);