summaryrefslogtreecommitdiff
path: root/src/core
diff options
context:
space:
mode:
authoradmin (centauri.fritz.box) <puppet@mx.buetow.org>2014-06-30 23:53:09 +0200
committeradmin (centauri.fritz.box) <puppet@mx.buetow.org>2014-06-30 23:53:09 +0200
commitac9339b92d8eb95d54c04cc1f507131642052199 (patch)
tree9213a8bd41ba14bd8ed48c8bbc96851453b87f2d /src/core
parent63cf3028445d8d213ffc774f77aafd7283cb4fbd (diff)
parent9bf07e1dfa69b5d6e4c296c0690b5ed91f909b7b (diff)
Merge remote-tracking branch 'remotes/github/v0.1' into v0.1
Diffstat (limited to 'src/core')
-rw-r--r--src/core/convert.c65
-rw-r--r--src/core/convert.h36
-rw-r--r--src/core/function.c857
-rw-r--r--src/core/function.h50
-rw-r--r--src/core/garbage.c94
-rw-r--r--src/core/garbage.h42
-rw-r--r--src/core/interpret.c1151
-rw-r--r--src/core/interpret.h57
-rw-r--r--src/core/scanner.c152
-rw-r--r--src/core/scanner.h19
-rw-r--r--src/core/scope.c53
-rw-r--r--src/core/scope.h37
-rw-r--r--src/core/symbol.c108
-rw-r--r--src/core/symbol.h47
-rw-r--r--src/core/token.c334
-rw-r--r--src/core/token.h149
16 files changed, 2508 insertions, 743 deletions
diff --git a/src/core/convert.c b/src/core/convert.c
index cf8987e..73fb8a2 100644
--- a/src/core/convert.c
+++ b/src/core/convert.c
@@ -1,14 +1,13 @@
/*:*
*: File: ./src/core/convert.c
*: A simple interpreter
- *:
- *: WWW : http://fype.buetow.org
- *: AUTHOR : http://paul.buetow.org
- *: E-Mail : fype at dev.buetow.org
- *:
- *: Copyright (c) 2005 - 2009, Dipl.-Inform. (FH) Paul C. Buetow
+ *:
+ *: WWW : http://fype.buetow.org
+ *: E-Mail : fype@dev.buetow.org
+ *:
+ *: Copyright (c) 2005 2006 2007 2008, Dipl.-Inf. (FH) Paul C. Buetow
*: All rights reserved.
- *:
+ *:
*: Redistribution and use in source and binary forms, with or without modi-
*: fication, are permitted provided that the following conditions are met:
*: * Redistributions of source code must retain the above copyright
@@ -16,25 +15,24 @@
*: * Redistributions in binary form must reproduce the above copyright
*: notice, this list of conditions and the following disclaimer in the
*: documentation and/or other materials provided with the distribution.
- *: * Neither the name of buetow.org nor the names of its contributors may
- *: be used to endorse or promote products derived from this software
+ *: * Neither the name of P. B. Labs nor the names of its contributors may
+ *: be used to endorse or promote products derived from this software
*: without specific prior written permission.
- *:
- *: THIS SOFTWARE IS PROVIDED BY PAUL C. BUETOW AS IS'' AND ANY EXPRESS OR
- *: IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ *:
+ *: THIS SOFTWARE IS PROVIDED BY Paul Buetow AS IS'' AND ANY EXPRESS OR
+ *: IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
*: WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- *: DISCLAIMED. IN NO EVENT SHALL PAUL C. BUETOW BE LIABLE FOR ANY DIRECT,
- *: INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- *: (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- *: SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ *: DISCLAIMED. IN NO EVENT SHALL Paul Buetow BE LIABLE FOR ANY DIRECT,
+ *: INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ *: (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ *: SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
*: HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
- *: STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
- *: IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ *: STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+ *: IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
*: POSSIBILITY OF SUCH DAMAGE.
*:*/
#include "convert.h"
-#include "../data/array.h"
void
convert_to_integer(Token *p_token) {
@@ -49,10 +47,6 @@ convert_to_integer(Token *p_token) {
token_set_tt(p_token, TT_INTEGER);
token_set_ival(p_token, atoi(token_get_val(p_token)));
break;
- case TT_ARRAY:
- token_set_tt(p_token, TT_INTEGER);
- token_set_ival(p_token, array_get_size(p_token->p_array));
- break;
default:
ERROR("Ouups(%s)", tt_get_name(token_get_tt(p_token)));
break;
@@ -68,9 +62,6 @@ convert_to_integer_get(Token *p_token) {
return ((int) token_get_dval(p_token));
case TT_STRING:
return (atoi(token_get_val(p_token)));
- case TT_ARRAY:
- return (array_get_size(p_token->p_array));
- break;
default:
ERROR("Ouups(%s)", tt_get_name(token_get_tt(p_token)));
}
@@ -91,10 +82,6 @@ convert_to_double(Token *p_token) {
token_set_tt(p_token, TT_DOUBLE);
token_set_dval(p_token, atof(token_get_val(p_token)));
break;
- case TT_ARRAY:
- token_set_tt(p_token, TT_DOUBLE);
- token_set_dval(p_token, array_get_size(p_token->p_array));
- break;
default:
token_print_val(p_token);
ERROR("Datatype conversion error '%s'", token_get_val(p_token));
@@ -126,16 +113,6 @@ convert_to_string(Token *p_token) {
strcpy(p_token->c_val, c_tmp);
p_token->c_val[i_len] = 0;
}
- case TT_ARRAY:
- {
- token_set_tt(p_token, TT_STRING);
- char c_tmp[1024];
- sprintf(c_tmp, "%d", array_get_size(p_token->p_array));
- int i_len = strlen(c_tmp);
- p_token->c_val = realloc(p_token->c_val, sizeof(char) * (i_len + 1));
- strcpy(p_token->c_val, c_tmp);
- p_token->c_val[i_len] = 0;
- }
break;
case TT_STRING:
break;
@@ -146,11 +123,6 @@ convert_to_string(Token *p_token) {
}
void
-convert_to_array(Token *p_token) {
- ERROR("not yet implemented");
-}
-
-void
convert_to_tt(Token *p_token, TokenType tt) {
switch (tt) {
case TT_INTEGER:
@@ -162,9 +134,6 @@ convert_to_tt(Token *p_token, TokenType tt) {
case TT_STRING:
convert_to_string(p_token);
break;
- case TT_ARRAY:
- convert_to_array(p_token);
- break;
default:
ERROR("Ouups!");
}
diff --git a/src/core/convert.h b/src/core/convert.h
index 9dcf23e..0c8b7da 100644
--- a/src/core/convert.h
+++ b/src/core/convert.h
@@ -1,14 +1,13 @@
/*:*
*: File: ./src/core/convert.h
*: A simple interpreter
- *:
- *: WWW : http://fype.buetow.org
- *: AUTHOR : http://paul.buetow.org
- *: E-Mail : fype at dev.buetow.org
- *:
- *: Copyright (c) 2005 - 2009, Dipl.-Inform. (FH) Paul C. Buetow
+ *:
+ *: WWW : http://fype.buetow.org
+ *: E-Mail : fype@dev.buetow.org
+ *:
+ *: Copyright (c) 2005 2006 2007 2008, Dipl.-Inf. (FH) Paul C. Buetow
*: All rights reserved.
- *:
+ *:
*: Redistribution and use in source and binary forms, with or without modi-
*: fication, are permitted provided that the following conditions are met:
*: * Redistributions of source code must retain the above copyright
@@ -16,20 +15,20 @@
*: * Redistributions in binary form must reproduce the above copyright
*: notice, this list of conditions and the following disclaimer in the
*: documentation and/or other materials provided with the distribution.
- *: * Neither the name of buetow.org nor the names of its contributors may
- *: be used to endorse or promote products derived from this software
+ *: * Neither the name of P. B. Labs nor the names of its contributors may
+ *: be used to endorse or promote products derived from this software
*: without specific prior written permission.
- *:
- *: THIS SOFTWARE IS PROVIDED BY PAUL C. BUETOW AS IS'' AND ANY EXPRESS OR
- *: IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ *:
+ *: THIS SOFTWARE IS PROVIDED BY Paul Buetow AS IS'' AND ANY EXPRESS OR
+ *: IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
*: WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- *: DISCLAIMED. IN NO EVENT SHALL PAUL C. BUETOW BE LIABLE FOR ANY DIRECT,
- *: INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- *: (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- *: SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ *: DISCLAIMED. IN NO EVENT SHALL Paul Buetow BE LIABLE FOR ANY DIRECT,
+ *: INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ *: (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ *: SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
*: HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
- *: STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
- *: IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ *: STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+ *: IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
*: POSSIBILITY OF SUCH DAMAGE.
*:*/
@@ -46,7 +45,6 @@ int convert_to_integer_get(Token *p_token);
void convert_to_integer(Token *p_token);
void convert_to_double(Token *p_token);
void convert_to_string(Token *p_token);
-void convert_to_array(Token *p_token);
void convert_to_tt(Token *p_token, TokenType tt);
TokenType convert_to_highest(Token *p_token1, Token *p_token2);
TokenType convert_function_arg_types_to_highest(Stack *p_stack_args, int
diff --git a/src/core/function.c b/src/core/function.c
index 70166ed..fda40b8 100644
--- a/src/core/function.c
+++ b/src/core/function.c
@@ -1,14 +1,13 @@
/*:*
*: File: ./src/core/function.c
*: A simple interpreter
- *:
- *: WWW : http://fype.buetow.org
- *: AUTHOR : http://paul.buetow.org
- *: E-Mail : fype at dev.buetow.org
- *:
- *: Copyright (c) 2005 - 2009, Dipl.-Inform. (FH) Paul C. Buetow
+ *:
+ *: WWW : http://fype.buetow.org
+ *: E-Mail : fype@dev.buetow.org
+ *:
+ *: Copyright (c) 2005 2006 2007 2008, Dipl.-Inf. (FH) Paul C. Buetow
*: All rights reserved.
- *:
+ *:
*: Redistribution and use in source and binary forms, with or without modi-
*: fication, are permitted provided that the following conditions are met:
*: * Redistributions of source code must retain the above copyright
@@ -16,36 +15,844 @@
*: * Redistributions in binary form must reproduce the above copyright
*: notice, this list of conditions and the following disclaimer in the
*: documentation and/or other materials provided with the distribution.
- *: * Neither the name of buetow.org nor the names of its contributors may
- *: be used to endorse or promote products derived from this software
+ *: * Neither the name of P. B. Labs nor the names of its contributors may
+ *: be used to endorse or promote products derived from this software
*: without specific prior written permission.
- *:
- *: THIS SOFTWARE IS PROVIDED BY PAUL C. BUETOW AS IS'' AND ANY EXPRESS OR
- *: IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ *:
+ *: THIS SOFTWARE IS PROVIDED BY Paul Buetow AS IS'' AND ANY EXPRESS OR
+ *: IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
*: WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- *: DISCLAIMED. IN NO EVENT SHALL PAUL C. BUETOW BE LIABLE FOR ANY DIRECT,
- *: INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- *: (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- *: SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ *: DISCLAIMED. IN NO EVENT SHALL Paul Buetow BE LIABLE FOR ANY DIRECT,
+ *: INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ *: (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ *: SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
*: HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
- *: STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
- *: IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ *: STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+ *: IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
*: POSSIBILITY OF SUCH DAMAGE.
*:*/
-#include "../defines.h"
+#include <stdlib.h>
+#include <sys/types.h>
+#include <unistd.h>
#include "function.h"
-Function*
-function_new() {
- Function *p_function = malloc(sizeof(Function));
+#include "convert.h"
+#include "scope.h"
+#include "symbol.h"
- return (p_function);
+#define _FUNCTION_ERROR(m,t) \
+ ERROR(\
+ "%s: Function error in %s line %d pos %d near '%s'", m, \
+ token_get_filename(t), \
+ token_get_line_nr(t), \
+ token_get_pos_nr(t), \
+ token_get_val(t) \
+ )
+
+void
+_process(Interpret *p_interpret, Token *p_token_store, Token *p_token_op,
+ Token *p_token_op2, Token *p_token_next) {
+
+ TokenType tt_op = token_get_tt(p_token_op);
+ TokenType tt_op2 = p_token_op2 == NULL
+ ? TT_NONE
+ : token_get_tt(p_token_op2);
+
+#ifdef DEBUG_FUNCTION_PROCESS
+ if (p_token_op2 == NULL)
+ printf("PROCESS OPERATOR %s\n", tt_get_name(tt_op));
+ else
+ printf("PROCESS OPERATOR %s %s\n", tt_get_name(tt_op),
+ tt_get_name(tt_op2));
+
+ token_print(p_token_next);
+ printf("\n");
+ token_print(p_token_store);
+ printf("\n");
+#endif /* DEBUG_FUNCTION_PROCESS */
+
+ if (p_token_op2 != NULL) {
+ switch (tt_op) {
+ case TT_NOT:
+ switch (tt_op2) {
+ case TT_ASSIGN:
+ tt_op = TT_NEQ;
+ break;
+ default:
+ break;
+ }
+ break;
+ case TT_ASSIGN:
+ switch (tt_op2) {
+ case TT_ASSIGN:
+ tt_op = TT_EQ;
+ break;
+ default:
+ break;
+ }
+ break;
+ case TT_LT:
+ switch (tt_op2) {
+ case TT_ASSIGN:
+ tt_op = TT_LE;
+ break;
+ default:
+ break;
+ }
+ break;
+ case TT_GT:
+ switch (tt_op2) {
+ case TT_ASSIGN:
+ tt_op = TT_GE;
+ break;
+ default:
+ break;
+ }
+ break;
+ case TT_DDOT:
+ switch (tt_op2) {
+ case TT_LT:
+ tt_op = TT_LSHIFT;
+ break;
+ case TT_GT:
+ tt_op = TT_RSHIFT;
+ break;
+ default:
+ break;
+ }
+ break;
+ default:
+ break;
+ }
+ } else {
+ switch (tt_op) {
+ case TT_ASSIGN:
+ {
+ Token *p_token_assign = p_interpret->p_token_temp;
+ TokenType tt_assign = token_get_tt(p_token_assign);
+
+ if (tt_assign != TT_IDENT) {
+ _FUNCTION_ERROR("Can only assign to symbols",
+ p_token_store);
+ }
+
+ Symbol *p_symbol = scope_get(p_interpret->p_scope,
+ token_get_val(p_token_assign));
+
+ if (p_symbol == NULL) {
+ _FUNCTION_ERROR("No such symbol",
+ p_token_assign);
+ }
+
+ symbol_set_val(p_symbol, p_token_store);
+ symbol_set_sym(p_symbol, SYM_VARIABLE);
+
+ return;
+ }
+
+ break;
+ NO_DEFAULT;
+ }
+ }
+
+ p_token_next = token_new_copy(p_token_next);
+ TokenType tt_highest = convert_to_highest(p_token_store, p_token_next);
+
+#ifdef DEBUG_FUNCTION_PROCESS
+ printf("===> %s %s %s\n",
+ tt_get_name(tt_highest),
+ tt_get_name(tt_op),
+ tt_get_name(tt_highest));
+#endif /* DEBUG_FUNCTION_PROCESS */
+
+ switch (tt_op) {
+ case TT_ADD:
+ switch (tt_highest) {
+ case TT_INTEGER:
+ token_set_ival(p_token_store,
+ token_get_ival(p_token_next) +
+ token_get_ival(p_token_store));
+ break;
+ case TT_DOUBLE:
+ token_set_dval(p_token_store,
+ token_get_dval(p_token_next) +
+ token_get_dval(p_token_store));
+ case TT_STRING:
+ token_set_ival(p_token_store,
+ atoi(token_get_val(p_token_next)) +
+ atoi(token_get_val(p_token_store)));
+ token_set_tt(p_token_store, TT_INTEGER);
+ break;
+ NO_DEFAULT;
+ }
+ break;
+ case TT_SUB:
+ switch (tt_highest) {
+ case TT_INTEGER:
+ token_set_ival(p_token_store,
+ token_get_ival(p_token_next) -
+ token_get_ival(p_token_store));
+ break;
+ case TT_DOUBLE:
+ token_set_dval(p_token_store,
+ token_get_dval(p_token_next) -
+ token_get_dval(p_token_store));
+ break;
+ case TT_STRING:
+ token_set_ival(p_token_store,
+ atoi(token_get_val(p_token_next)) -
+ atoi(token_get_val(p_token_store)));
+ token_set_tt(p_token_store, TT_INTEGER);
+ break;
+ NO_DEFAULT;
+ }
+ break;
+ case TT_MULT:
+ switch (tt_highest) {
+ case TT_INTEGER:
+ token_set_ival(p_token_store,
+ token_get_ival(p_token_next) *
+ token_get_ival(p_token_store));
+ break;
+ case TT_DOUBLE:
+ token_set_dval(p_token_store,
+ token_get_dval(p_token_next) *
+ token_get_dval(p_token_store));
+ break;
+ case TT_STRING:
+ token_set_ival(p_token_store,
+ atoi(token_get_val(p_token_next)) *
+ atoi(token_get_val(p_token_store)));
+ token_set_tt(p_token_store, TT_INTEGER);
+ break;
+ NO_DEFAULT;
+ }
+ break;
+ case TT_DIV:
+ switch (tt_highest) {
+ case TT_INTEGER:
+ token_set_ival(p_token_store,
+ (int) token_get_ival(p_token_next) /
+ token_get_ival(p_token_store));
+ break;
+ case TT_DOUBLE:
+ token_set_dval(p_token_store,
+ token_get_dval(p_token_next) /
+ token_get_dval(p_token_store));
+ break;
+ case TT_STRING:
+ token_set_dval(p_token_store,
+ atof(token_get_val(p_token_next)) /
+ atof(token_get_val(p_token_store)));
+ token_set_tt(p_token_store, TT_DOUBLE);
+ break;
+ NO_DEFAULT;
+ }
+ break;
+ case TT_EQ:
+ switch (tt_highest) {
+ case TT_INTEGER:
+ token_set_ival(p_token_store,
+ (int) token_get_ival(p_token_next) ==
+ token_get_ival(p_token_store));
+ break;
+ case TT_DOUBLE:
+ token_set_ival(p_token_store,
+ token_get_dval(p_token_next) ==
+ token_get_dval(p_token_store));
+ token_set_tt(p_token_store, TT_INTEGER);
+ break;
+ case TT_STRING:
+ token_set_ival(p_token_store,
+ strcmp(token_get_val(p_token_next),
+ token_get_val(p_token_store)) == 0);
+ token_set_tt(p_token_store, TT_INTEGER);
+ break;
+ NO_DEFAULT;
+ }
+ break;
+ case TT_NEQ:
+ switch (tt_highest) {
+ case TT_INTEGER:
+ token_set_ival(p_token_store,
+ (int) token_get_ival(p_token_next) !=
+ token_get_ival(p_token_store));
+ break;
+ case TT_DOUBLE:
+ token_set_ival(p_token_store,
+ token_get_dval(p_token_next) !=
+ token_get_dval(p_token_store));
+ token_set_tt(p_token_store, TT_INTEGER);
+ break;
+ case TT_STRING:
+ token_set_ival(p_token_store,
+ strcmp(token_get_val(p_token_next),
+ token_get_val(p_token_store)) != 0);
+ token_set_tt(p_token_store, TT_INTEGER);
+ break;
+ NO_DEFAULT;
+ }
+ break;
+ case TT_LE:
+ switch (tt_highest) {
+ case TT_INTEGER:
+ token_set_ival(p_token_store,
+ (int) token_get_ival(p_token_next) <=
+ token_get_ival(p_token_store));
+ break;
+ case TT_DOUBLE:
+ token_set_ival(p_token_store,
+ token_get_dval(p_token_next) <=
+ token_get_dval(p_token_store));
+ token_set_tt(p_token_store, TT_INTEGER);
+ break;
+ case TT_STRING:
+ token_set_ival(p_token_store,
+ strcmp(token_get_val(p_token_next),
+ token_get_val(p_token_store)) <= 0);
+ token_set_tt(p_token_store, TT_INTEGER);
+ break;
+ NO_DEFAULT;
+ }
+ break;
+ case TT_GE:
+ switch (tt_highest) {
+ case TT_INTEGER:
+ token_set_ival(p_token_store,
+ (int) token_get_ival(p_token_next) >=
+ token_get_ival(p_token_store));
+ break;
+ case TT_DOUBLE:
+ token_set_ival(p_token_store,
+ token_get_dval(p_token_next) >=
+ token_get_dval(p_token_store));
+ token_set_tt(p_token_store, TT_INTEGER);
+ break;
+ case TT_STRING:
+ token_set_ival(p_token_store,
+ strcmp(token_get_val(p_token_next),
+ token_get_val(p_token_store)) >= 0);
+ token_set_tt(p_token_store, TT_INTEGER);
+ break;
+ NO_DEFAULT;
+ }
+ break;
+ case TT_LT:
+ switch (tt_highest) {
+ case TT_INTEGER:
+ token_set_ival(p_token_store,
+ (int) token_get_ival(p_token_next) <
+ token_get_ival(p_token_store));
+ break;
+ case TT_DOUBLE:
+ token_set_ival(p_token_store,
+ token_get_dval(p_token_next) <
+ token_get_dval(p_token_store));
+ token_set_tt(p_token_store, TT_INTEGER);
+ break;
+ case TT_STRING:
+ token_set_ival(p_token_store,
+ strcmp(token_get_val(p_token_next),
+ token_get_val(p_token_store)) < 0);
+ token_set_tt(p_token_store, TT_INTEGER);
+ break;
+ NO_DEFAULT;
+ }
+ break;
+ case TT_GT:
+ switch (tt_highest) {
+ case TT_INTEGER:
+ token_set_ival(p_token_store,
+ (int) token_get_ival(p_token_next) >
+ token_get_ival(p_token_store));
+ break;
+ case TT_DOUBLE:
+ token_set_ival(p_token_store,
+ token_get_dval(p_token_next) >
+ token_get_dval(p_token_store));
+ token_set_tt(p_token_store, TT_INTEGER);
+ break;
+ case TT_STRING:
+ token_set_ival(p_token_store,
+ strcmp(token_get_val(p_token_next),
+ token_get_val(p_token_store)) > 0);
+ token_set_tt(p_token_store, TT_INTEGER);
+ break;
+ NO_DEFAULT;
+ }
+ break;
+ case TT_AND:
+ switch (tt_highest) {
+ case TT_INTEGER:
+ token_set_ival(p_token_store,
+ (int) token_get_ival(p_token_next) &
+ token_get_ival(p_token_store));
+ break;
+ case TT_DOUBLE:
+ token_set_ival(p_token_store,
+ (int) token_get_dval(p_token_next) &
+ (int) token_get_dval(p_token_store));
+ token_set_tt(p_token_store, TT_INTEGER);
+ break;
+ case TT_STRING:
+ token_set_ival(p_token_store,
+ atoi(token_get_val(p_token_next)) &
+ atoi(token_get_val(p_token_store)));
+ token_set_tt(p_token_store, TT_INTEGER);
+ break;
+ NO_DEFAULT;
+ }
+ break;
+ case TT_OR:
+ switch (tt_highest) {
+ case TT_INTEGER:
+ token_set_ival(p_token_store,
+ (int) token_get_ival(p_token_next) |
+ token_get_ival(p_token_store));
+ break;
+ case TT_DOUBLE:
+ token_set_ival(p_token_store,
+ (int) token_get_dval(p_token_next) |
+ (int) token_get_dval(p_token_store));
+ token_set_tt(p_token_store, TT_INTEGER);
+ break;
+ case TT_STRING:
+ token_set_ival(p_token_store,
+ atoi(token_get_val(p_token_next)) |
+ atoi(token_get_val(p_token_store)));
+ token_set_tt(p_token_store, TT_INTEGER);
+ break;
+ NO_DEFAULT;
+ }
+ break;
+ case TT_XOR:
+ switch (tt_highest) {
+ case TT_INTEGER:
+ token_set_ival(p_token_store,
+ (int) token_get_ival(p_token_next) ^
+ token_get_ival(p_token_store));
+ break;
+ case TT_DOUBLE:
+ token_set_ival(p_token_store,
+ (int) token_get_dval(p_token_next) ^
+ (int) token_get_dval(p_token_store));
+ token_set_tt(p_token_store, TT_INTEGER);
+ break;
+ case TT_STRING:
+ token_set_ival(p_token_store,
+ atoi(token_get_val(p_token_next)) ^
+ atoi(token_get_val(p_token_store)));
+ token_set_tt(p_token_store, TT_INTEGER);
+ break;
+ NO_DEFAULT;
+ }
+ break;
+ case TT_LSHIFT:
+ switch (tt_highest) {
+ case TT_INTEGER:
+ token_set_ival(p_token_store,
+ (int) token_get_ival(p_token_next) <<
+ token_get_ival(p_token_store));
+ break;
+ case TT_DOUBLE:
+ token_set_ival(p_token_store,
+ (int) token_get_dval(p_token_next) <<
+ (int) token_get_dval(p_token_store));
+ token_set_tt(p_token_store, TT_INTEGER);
+ break;
+ case TT_STRING:
+ token_set_ival(p_token_store,
+ atoi(token_get_val(p_token_next)) <<
+ atoi(token_get_val(p_token_store)));
+ token_set_tt(p_token_store, TT_INTEGER);
+ break;
+ NO_DEFAULT;
+ }
+ break;
+ case TT_RSHIFT:
+ switch (tt_highest) {
+ case TT_INTEGER:
+ token_set_ival(p_token_store,
+ (int) token_get_ival(p_token_next) >>
+ token_get_ival(p_token_store));
+ break;
+ case TT_DOUBLE:
+ token_set_ival(p_token_store,
+ (int) token_get_dval(p_token_next) >>
+ (int) token_get_dval(p_token_store));
+ token_set_tt(p_token_store, TT_INTEGER);
+ break;
+ case TT_STRING:
+ token_set_ival(p_token_store,
+ atoi(token_get_val(p_token_next)) >>
+ atoi(token_get_val(p_token_store)));
+ token_set_tt(p_token_store, TT_INTEGER);
+ break;
+ NO_DEFAULT;
+ }
+ break;
+
+ default:
+ _FUNCTION_ERROR("No such function/operator", p_token_op);
+ }
+
+#ifdef DEBUG_FUNCTION_PROCESS
+ token_print(p_token_store);
+ printf("\n\n");
+#endif /* DEBUG_FUNCTION_PROCESS */
+
+ token_delete(p_token_next);
+}
+
+void
+function_process(Interpret *p_interpret, Token *p_token_op,
+ Token *p_token_op2, Stack *p_stack_args, int i_args) {
+
+ Token *p_token_store = token_new_copy(stack_pop(p_stack_args));
+
+ for (int i = 0; i < i_args -1 && !stack_empty(p_stack_args); ++i) {
+ Token *p_token_next = stack_pop(p_stack_args);
+
+ _process(p_interpret, p_token_store, p_token_op,
+ p_token_op2, p_token_next);
+ }
+
+ stack_push(p_stack_args, p_token_store);
+}
+
+_Bool
+function_is_buildin(Token *p_token_ident) {
+ if (strcmp("assert", token_get_val(p_token_ident)) == 0)
+ return (true);
+
+ if (strcmp("decr", token_get_val(p_token_ident)) == 0)
+ return (true);
+
+ if (strcmp("double", token_get_val(p_token_ident)) == 0)
+ return (true);
+
+ if (strcmp("end", token_get_val(p_token_ident)) == 0)
+ return (true);
+
+ if (strcmp("exit", token_get_val(p_token_ident)) == 0)
+ return (true);
+
+ if (strcmp("fork", token_get_val(p_token_ident)) == 0)
+ return (true);
+
+ if (strcmp("gc", token_get_val(p_token_ident)) == 0)
+ return (true);
+
+ if (strcmp("incr", token_get_val(p_token_ident)) == 0)
+ return (true);
+
+ if (strcmp("integer", token_get_val(p_token_ident)) == 0)
+ return (true);
+
+ if (strcmp("ln", token_get_val(p_token_ident)) == 0)
+ return (true);
+
+ if (strcmp("neg", token_get_val(p_token_ident)) == 0)
+ return (true);
+
+ if (strcmp("no", token_get_val(p_token_ident)) == 0)
+ return (true);
+
+ if (strcmp("put", token_get_val(p_token_ident)) == 0)
+ return (true);
+
+ if (strcmp("say", token_get_val(p_token_ident)) == 0)
+ return (true);
+
+ if (strcmp("string", token_get_val(p_token_ident)) == 0)
+ return (true);
+
+ if (strcmp("yes", token_get_val(p_token_ident)) == 0)
+ return (true);
+
+ if (strcmp("not", token_get_val(p_token_ident)) == 0)
+ return (true);
+
+ return (false);
+}
+
+void
+function_process_buildin(Interpret *p_interpret, Token *p_token_ident,
+ Stack *p_stack_args) {
+
+ if (strcmp("assert", token_get_val(p_token_ident)) == 0) {
+ if (0 == stack_size(p_stack_args))
+ _FUNCTION_ERROR("No argument given", p_token_ident);
+
+ Token *p_token = stack_top(p_stack_args);
+
+ switch (token_get_tt(p_token)) {
+ case TT_INTEGER:
+ if (token_get_ival(p_token) == 0)
+ _FUNCTION_ERROR("Assert failed", p_token);
+ break;
+ case TT_DOUBLE:
+ if (token_get_dval(p_token) == 0)
+ _FUNCTION_ERROR("Assert failed", p_token);
+ break;
+ case TT_STRING:
+ if (atoi(token_get_val(p_token)) == 0)
+ _FUNCTION_ERROR("Assert failed", p_token);
+ break;
+ NO_DEFAULT;
+ }
+
+ } else if (strcmp("decr", token_get_val(p_token_ident)) == 0) {
+ if (0 == stack_size(p_stack_args))
+ _FUNCTION_ERROR("No argument given", p_token_ident);
+
+ Token *p_token = stack_top(p_stack_args);
+ switch (token_get_tt(p_token)) {
+ case TT_INTEGER:
+ token_set_ival(p_token, token_get_ival(p_token) - 1);
+ break;
+ case TT_DOUBLE:
+ token_set_dval(p_token, token_get_dval(p_token) - 1);
+ break;
+ case TT_STRING:
+ convert_to_integer(p_token);
+ token_set_ival(p_token, token_get_ival(p_token) - 1);
+ break;
+ NO_DEFAULT;
+ }
+
+ } else if (strcmp("double", token_get_val(p_token_ident)) == 0) {
+ if (0 == stack_size(p_stack_args))
+ _FUNCTION_ERROR("No argument given", p_token_ident);
+
+ Token *p_token = token_new_copy(stack_pop(p_stack_args));
+ convert_to_double(p_token);
+ stack_push(p_stack_args, p_token);
+
+ } else if (strcmp("end", token_get_val(p_token_ident)) == 0) {
+ exit(0);
+
+ } else if (strcmp("fork", token_get_val(p_token_ident)) == 0) {
+ Token *p_token = token_new_integer((int) fork());
+ stack_push(p_stack_args, p_token);
+
+ } else if (strcmp("gc", token_get_val(p_token_ident)) == 0) {
+ int i_count = garbage_collect();
+ printf("ICOUNT %d\n", i_count);
+ Token *p_token = token_new_integer(i_count);
+ stack_push(p_stack_args, p_token);
+
+ } else if (strcmp("exit", token_get_val(p_token_ident)) == 0) {
+ if (0 == stack_size(p_stack_args))
+ _FUNCTION_ERROR("No argument given", p_token_ident);
+
+ Token *p_token = stack_top(p_stack_args);
+ p_token = token_new_copy(p_token);
+ convert_to_integer(p_token);
+ exit(token_get_ival(p_token));
+
+ } else if (strcmp("incr", token_get_val(p_token_ident)) == 0) {
+ if (0 == stack_size(p_stack_args))
+ _FUNCTION_ERROR("No argument given", p_token_ident);
+
+ Token *p_token = stack_top(p_stack_args);
+ switch (token_get_tt(p_token)) {
+ case TT_INTEGER:
+ token_set_ival(p_token, token_get_ival(p_token) + 1);
+ break;
+ case TT_DOUBLE:
+ token_set_dval(p_token, token_get_dval(p_token) + 1);
+ break;
+ case TT_STRING:
+ convert_to_integer(p_token);
+ token_set_ival(p_token, token_get_ival(p_token) + 1);
+ break;
+ NO_DEFAULT;
+ }
+
+ } else if (strcmp("integer", token_get_val(p_token_ident)) == 0) {
+ if (0 == stack_size(p_stack_args))
+ _FUNCTION_ERROR("No argument given", p_token_ident);
+
+ Token *p_token = token_new_copy(stack_pop(p_stack_args));
+ convert_to_integer(p_token);
+ stack_push(p_stack_args, p_token);
+
+ } else if (strcmp("ln", token_get_val(p_token_ident)) == 0) {