Changeset: 1b2ff595f020 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=1b2ff595f020
Added Files:
monetdb5/mal/mal_prelude.c
monetdb5/mal/mal_prelude.h
Modified Files:
README.md
monetdb5/mal/CMakeLists.txt
monetdb5/mal/mal_import.c
monetdb5/mal/mal_import.h
monetdb5/mal/mel.h
Branch: mbedded
Log Message:
Small step to add Functions.
diffs (truncated from 541 to 300 lines):
diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -14,7 +14,7 @@ to build and *install* it from source. I
```
mkdir build
cd build
-cmake -DCMAKE_INSTALL_PREFIX=/tmp/monetdb ${SOURCE}
+cmake -DCMAKE_INSTALL_PREFIX=$PREFIX ${SOURCE}
cmake --build .
cmake --build . --target install
```
diff --git a/monetdb5/mal/CMakeLists.txt b/monetdb5/mal/CMakeLists.txt
--- a/monetdb5/mal/CMakeLists.txt
+++ b/monetdb5/mal/CMakeLists.txt
@@ -50,6 +50,7 @@ target_sources(mal
mal_utils.c mal_utils.h
mal_embedded.c mal_embedded.h
mal_private.h
+ mal_prelude.c
mel.h
PUBLIC
${CMAKE_CURRENT_SOURCE_DIR}/mal_client.h
diff --git a/monetdb5/mal/mal_import.c b/monetdb5/mal/mal_import.c
--- a/monetdb5/mal/mal_import.c
+++ b/monetdb5/mal/mal_import.c
@@ -33,180 +33,6 @@
#include "mal_authorize.h"
#include "mal_private.h"
-#define MAX_MAL_MODULES 128
-static int mel_modules = 0;
-static str mel_module_name[MAX_MAL_MODULES] = {0};
-static mel_atom *mel_module_atoms[MAX_MAL_MODULES] = {0};
-static mel_func *mel_module_funcs[MAX_MAL_MODULES] = {0};
-
-void
-mal_module(str name, mel_atom *atoms, mel_func *funcs)
-{
- assert (mel_modules < MAX_MAL_MODULES);
- mel_module_name[mel_modules] = name;
- mel_module_atoms[mel_modules] = atoms;
- mel_module_funcs[mel_modules] = funcs;
- mel_modules++;
-}
-
-#define MAX_MAL_MODULES 128
-static int mal_modules = 0;
-static str mal_module_name[MAX_MAL_MODULES] = {0};
-static unsigned char *mal_module_code[MAX_MAL_MODULES] = {0};
-
-static void
-initModule(Client c, char *name)
-{
- if (!getName(name))
- return;
- Module m = getModule(getName(name));
- if (m) { /* run prelude */
- Symbol s = findSymbolInModule(m, getName("prelude"));
-
- if (s) {
- InstrPtr pci = getInstrPtr(s->def, 0);
-
- if (pci && pci->token == COMMANDsymbol &&
pci->argc == 1) {
- int ret = 0;
-
- assert(pci->fcn != NULL);
- (*pci->fcn)(&ret);
- (void)ret;
- } else if (pci && pci->token == PATTERNsymbol) {
- assert(pci->fcn != NULL);
- (*pci->fcn)(c, NULL, NULL, NULL);
- }
- }
- }
-}
-
-void
-mal_register(str name, unsigned char *code)
-{
- assert (mal_modules < MAX_MAL_MODULES);
- mal_module_name[mal_modules] = name;
- mal_module_code[mal_modules] = code;
- mal_modules++;
-}
-
-static str
-addAtom( mel_atom *atoms)
-{
- for(; atoms && atoms->name; atoms++) {
- int i = ATOMallocate(atoms->name);
- if (is_int_nil(i))
- throw(TYPE,"addAtom", SQLSTATE(HY013) MAL_MALLOC_FAIL);
- if (atoms->basetype) {
- int tpe = ATOMindex(atoms->basetype);
- if (tpe < 0)
- throw(TYPE,"addAtom", SQLSTATE(HY013)
MAL_MALLOC_FAIL);
- BATatoms[i] = BATatoms[tpe];
- strcpy_len(BATatoms[i].name, atoms->name,
sizeof(BATatoms[i].name));
- BATatoms[i].storage = ATOMstorage(tpe);
- } else { /* cannot overload void atoms */
- BATatoms[i].storage = i;
- BATatoms[i].linear = false;
- }
- if (atoms->del)
- BATatoms[i].atomDel = (void (*)(Heap *, var_t
*))atoms->del;
- if (atoms->cmp) {
- BATatoms[i].atomCmp = (int (*)(const void *, const void
*))atoms->del;
- BATatoms[i].linear = true;
- }
- if (atoms->fromstr)
- BATatoms[i].atomFromStr = (ssize_t (*)(const char *,
size_t *, ptr *, bool))atoms->fromstr;
- if (atoms->tostr)
- BATatoms[i].atomToStr = (ssize_t (*)(str *, size_t *,
const void *, bool))atoms->tostr;
- if (atoms->fix)
- BATatoms[i].atomFix = (gdk_return (*)(const void
*))atoms->fix;
- if (atoms->unfix)
- BATatoms[i].atomUnfix = (gdk_return (*)(const void
*))atoms->unfix;
- if (atoms->heap) {
- BATatoms[i].size = sizeof(var_t);
- assert_shift_width(ATOMelmshift(ATOMsize(i)),
ATOMsize(i));
- BATatoms[i].atomHeap = (void (*)(Heap *,
size_t))atoms->heap;
- }
- if (atoms->hash)
- BATatoms[i].atomHash = (BUN (*)(const void
*))atoms->hash;
- if (atoms->length)
- BATatoms[i].atomLen = (size_t (*)(const void
*))atoms->length;
- if (atoms->null) {
- const void *atmnull = ((const void
*(*)(void))atoms->null)();
-
- BATatoms[i].atomNull = atmnull;
- }
- if (atoms->nequal)
- BATatoms[i].atomCmp = (int (*)(const void *, const void
*))atoms->nequal;
- if (atoms->put)
- BATatoms[i].atomPut = (var_t (*)(Heap *, var_t *, const
void *))atoms->put;
- if (atoms->storage)
- BATatoms[i].storage = (*(int
(*)(void))atoms->storage)();
- if (atoms->read)
- BATatoms[i].atomRead = (void *(*)(void *, stream *,
size_t))atoms->read;
- if (atoms->write)
- BATatoms[i].atomWrite = (gdk_return (*)(const void *,
stream *, size_t))atoms->write;
- }
- return MAL_SUCCEED;
-}
-
-static str
-malIncludeDefault(Client c, int listing, int embedded)
-{
- int i;
-
- for(i = 0; i<mel_modules; i++) {
- if (embedded && strcmp(mel_module_name[i], "mal_mapi") == 0) /*
skip mapi in the embedded version */
- continue;
- if (mel_module_atoms[i]) {
- str msg = addAtom(mel_module_atoms[i]);
- if (msg)
- return msg;
- }
- /* HERE we need to register the command/pattern's */
- }
- for(i = 0; i<mal_modules; i++) {
- if (embedded && strcmp(mal_module_name[i], "mal_mapi") == 0) /*
skip mapi in the embedded version */
- continue;
- str msg = malIncludeString(c, mal_module_name[i],
(str)mal_module_code[i], listing);
- if (msg)
- return msg;
- }
- /* execute preludes */
- for(i = 0; i<mal_modules; i++) {
- if (strcmp(mal_module_name[i], "sql") == 0) /* skip sql should
be last to startup */
- continue;
- initModule(c, mal_module_name[i]);
- }
- return MAL_SUCCEED;
-}
-
-str
-malIncludeModules(Client c, char *modules[], int listing, int embedded)
-{
- int i;
- str msg;
-
- for(i = 0; modules[i]; i++) {
- /* load library */
- if ((msg = loadLibrary(modules[i], listing)) != NULL)
- return msg;
- }
- /* only when the libraries are loaded the code is dynamically added,
the second call this
- * isn't done. So here the mal_modules counter is reset for this
- */
-
- /* load the mal code for these modules and execute preludes */
- if ((msg = malIncludeDefault(c, listing, embedded)) != NULL)
- return msg;
- for(int i = 0; modules[i]; i++) {
- if (strcmp(modules[i], "sql") == 0) { /* start now */
- initModule(c, modules[i]);
- break;
- }
- }
- return MAL_SUCCEED;
-}
-
void
slash_2_dir_sep(str fname)
{
diff --git a/monetdb5/mal/mal_import.h b/monetdb5/mal/mal_import.h
--- a/monetdb5/mal/mal_import.h
+++ b/monetdb5/mal/mal_import.h
@@ -13,12 +13,8 @@
#include "mal_client.h"
#include "mal_session.h"
#include "mal_utils.h"
+#include "mal_prelude.h"
-#include "mel.h"
-mal_export void mal_module(str name, mel_atom *atoms, mel_func *funcs);
-
-mal_export void mal_register(str name, unsigned char *code);
-mal_export str malIncludeModules(Client c, char *modules[], int listing, int
embedded);
mal_export str malIncludeString(Client c, const str name, const str mal, int
listing);
mal_export str malInclude(Client c, str name, int listing);
diff --git a/monetdb5/mal/mal_prelude.c b/monetdb5/mal/mal_prelude.c
new file mode 100644
--- /dev/null
+++ b/monetdb5/mal/mal_prelude.c
@@ -0,0 +1,272 @@
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ * Copyright 1997 - July 2008 CWI, August 2008 - 2020 MonetDB B.V.
+ */
+
+/* Author(s) M.L. Kersten
+ * This module takes the statically defined modules, atoms, commands and
patterns
+ * and populate the internal structures.
+ *
+*/
+
+#include "monetdb_config.h"
+#include "mal_import.h"
+#include "mal_interpreter.h" /* for showErrors() */
+#include "mal_linker.h" /* for loadModuleLibrary() */
+#include "mal_scenario.h"
+#include "mal_parser.h"
+#include "mal_authorize.h"
+#include "mal_private.h"
+
+#include "mal_prelude.h"
+
+#define MAX_MAL_MODULES 128
+static int mel_modules = 0;
+static str mel_module_name[MAX_MAL_MODULES] = {0};
+static mel_atom *mel_module_atoms[MAX_MAL_MODULES] = {0};
+static mel_func *mel_module_funcs[MAX_MAL_MODULES] = {0};
+
+/* the MAL modules contains text to be parsed */
+static int mal_modules = 0;
+static str mal_module_name[MAX_MAL_MODULES] = {0};
+static unsigned char *mal_module_code[MAX_MAL_MODULES] = {0};
+
+int
+mal_startup(void)
+{
+ /* clean up the MAL internal structures before restart */
+ return 0;
+}
+
+/* all MAL related functions register themselves
+* the order in which these registrations happen is significant
+* because there may be dependencies among the definitions.
+* For example, you better know the atoms before you use them
+*/
+
+void
+mal_module(str name, mel_atom *atoms, mel_func *funcs)
+{
+ assert (mel_modules < MAX_MAL_MODULES);
+ mel_module_name[mel_modules] = name;
+ mel_module_atoms[mel_modules] = atoms;
+ mel_module_funcs[mel_modules] = funcs;
+ mel_modules++;
+}
+
+void
+mal_register(str name, unsigned char *code)
+{
+ assert (mal_modules < MAX_MAL_MODULES);
+ mal_module_name[mal_modules] = name;
+ mal_module_code[mal_modules] = code;
+ mal_modules++;
+}
+
+
+static void
+initModule(Client c, char *name)
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list