diff --git a/src/oberon.c b/src/oberon.c
index 1d00f22f5cf68f87e364a09fc60e984be5635d23..8b94271a6033d4675f4c8026d316980139a85d18 100644 (file)
--- a/src/oberon.c
+++ b/src/oberon.c
// LIBRARY
// =======================================================================
-static void
-register_default_types(oberon_context_t * ctx)
-{
- ctx -> notype_type = oberon_new_type_ptr(OBERON_TYPE_NOTYPE);
- oberon_generator_init_type(ctx, ctx -> notype_type);
-
- ctx -> nil_type = oberon_new_type_ptr(OBERON_TYPE_NIL);
- oberon_generator_init_type(ctx, ctx -> nil_type);
-
- ctx -> string_type = oberon_new_type_string(1);
- oberon_generator_init_type(ctx, ctx -> string_type);
-
- ctx -> bool_type = oberon_new_type_boolean();
- oberon_define_type(ctx -> world_scope, "BOOLEAN", ctx -> bool_type, 1);
-
- ctx -> char_type = oberon_new_type_char(1);
- oberon_define_type(ctx -> world_scope, "CHAR", ctx -> char_type, 1);
-
- ctx -> byte_type = oberon_new_type_integer(1);
- oberon_define_type(ctx -> world_scope, "SHORTINT", ctx -> byte_type, 1);
-
- ctx -> shortint_type = oberon_new_type_integer(2);
- oberon_define_type(ctx -> world_scope, "INTEGER", ctx -> shortint_type, 1);
-
- ctx -> int_type = oberon_new_type_integer(4);
- oberon_define_type(ctx -> world_scope, "LONGINT", ctx -> int_type, 1);
-
- ctx -> longint_type = oberon_new_type_integer(8);
- oberon_define_type(ctx -> world_scope, "HUGEINT", ctx -> longint_type, 1);
-
- ctx -> real_type = oberon_new_type_real(4);
- oberon_define_type(ctx -> world_scope, "REAL", ctx -> real_type, 1);
-
- ctx -> longreal_type = oberon_new_type_real(8);
- oberon_define_type(ctx -> world_scope, "LONGREAL", ctx -> longreal_type, 1);
-
- ctx -> set_type = oberon_new_type_set(4);
- oberon_define_type(ctx -> world_scope, "SET", ctx -> set_type, 1);
-}
-
-static void
-oberon_new_intrinsic(oberon_context_t * ctx, char * name, GenerateFuncCallback f, GenerateProcCallback p)
-{
- oberon_object_t * proc;
- proc = oberon_define_object(ctx -> decl, name, OBERON_CLASS_PROC, true, false, false);
- proc -> type = oberon_new_type_ptr(OBERON_TYPE_PROCEDURE);
- proc -> type -> sysproc = true;
- proc -> type -> genfunc = f;
- proc -> type -> genproc = p;
-}
-
static oberon_expr_t *
oberon_make_min_call(oberon_context_t * ctx, int num_args, oberon_expr_t * list_args)
{
@@ -4377,6 +4326,60 @@ oberon_make_odd_call(oberon_context_t * ctx, int num_args, oberon_expr_t * list_
return expr;
}
+static oberon_expr_t *
+oberon_make_short_call(oberon_context_t * ctx, int num_args, oberon_expr_t * list_args)
+{
+ if(num_args < 1)
+ {
+ oberon_error(ctx, "too few arguments");
+ }
+
+ if(num_args > 1)
+ {
+ oberon_error(ctx, "too mach arguments");
+ }
+
+ oberon_expr_t * arg;
+ arg = list_args;
+ oberon_check_src(ctx, arg);
+
+ if(arg -> result -> shorter == NULL)
+ {
+ oberon_error(ctx, "already shorter");
+ }
+
+ oberon_expr_t * expr;
+ expr = oberon_cast_expr(ctx, arg, arg -> result -> shorter);
+ return expr;
+}
+
+static oberon_expr_t *
+oberon_make_long_call(oberon_context_t * ctx, int num_args, oberon_expr_t * list_args)
+{
+ if(num_args < 1)
+ {
+ oberon_error(ctx, "too few arguments");
+ }
+
+ if(num_args > 1)
+ {
+ oberon_error(ctx, "too mach arguments");
+ }
+
+ oberon_expr_t * arg;
+ arg = list_args;
+ oberon_check_src(ctx, arg);
+
+ if(arg -> result -> longer == NULL)
+ {
+ oberon_error(ctx, "already longer");
+ }
+
+ oberon_expr_t * expr;
+ expr = oberon_cast_expr(ctx, arg, arg -> result -> longer);
+ return expr;
+}
+
static oberon_expr_t *
oberon_make_len_call(oberon_context_t * ctx, int num_args, oberon_expr_t * list_args)
{
constant -> value = (oberon_item_t *) expr;
}
+static void
+register_default_types(oberon_context_t * ctx)
+{
+ ctx -> notype_type = oberon_new_type_ptr(OBERON_TYPE_NOTYPE);
+ oberon_generator_init_type(ctx, ctx -> notype_type);
+
+ ctx -> nil_type = oberon_new_type_ptr(OBERON_TYPE_NIL);
+ oberon_generator_init_type(ctx, ctx -> nil_type);
+
+ ctx -> string_type = oberon_new_type_string(1);
+ oberon_generator_init_type(ctx, ctx -> string_type);
+
+ ctx -> bool_type = oberon_new_type_boolean();
+ oberon_define_type(ctx -> world_scope, "BOOLEAN", ctx -> bool_type, 1);
+
+ ctx -> char_type = oberon_new_type_char(1);
+ oberon_define_type(ctx -> world_scope, "CHAR", ctx -> char_type, 1);
+
+ ctx -> byte_type = oberon_new_type_integer(1);
+ oberon_define_type(ctx -> world_scope, "SHORTINT", ctx -> byte_type, 1);
+
+ ctx -> shortint_type = oberon_new_type_integer(2);
+ oberon_define_type(ctx -> world_scope, "INTEGER", ctx -> shortint_type, 1);
+
+ ctx -> int_type = oberon_new_type_integer(4);
+ oberon_define_type(ctx -> world_scope, "LONGINT", ctx -> int_type, 1);
+
+ ctx -> longint_type = oberon_new_type_integer(8);
+ oberon_define_type(ctx -> world_scope, "HUGEINT", ctx -> longint_type, 1);
+
+ ctx -> real_type = oberon_new_type_real(4);
+ oberon_define_type(ctx -> world_scope, "REAL", ctx -> real_type, 1);
+
+ ctx -> longreal_type = oberon_new_type_real(8);
+ oberon_define_type(ctx -> world_scope, "LONGREAL", ctx -> longreal_type, 1);
+
+ ctx -> set_type = oberon_new_type_set(4);
+ oberon_define_type(ctx -> world_scope, "SET", ctx -> set_type, 1);
+
+
+
+ ctx -> byte_type -> shorter = NULL;
+ ctx -> byte_type -> longer = ctx -> shortint_type;
+
+ ctx -> shortint_type -> shorter = ctx -> byte_type;
+ ctx -> shortint_type -> longer = ctx -> int_type;
+
+ ctx -> int_type -> shorter = ctx -> shortint_type;
+ ctx -> int_type -> longer = ctx -> longint_type;
+
+ ctx -> longint_type -> shorter = ctx -> int_type;
+ ctx -> longint_type -> longer = NULL;
+
+ ctx -> real_type -> shorter = NULL;
+ ctx -> real_type -> longer = ctx -> longreal_type;
+
+ ctx -> longreal_type -> shorter = ctx -> real_type;
+ ctx -> longreal_type -> longer = NULL;
+}
+
+static void
+oberon_new_intrinsic(oberon_context_t * ctx, char * name, GenerateFuncCallback f, GenerateProcCallback p)
+{
+ oberon_object_t * proc;
+ proc = oberon_define_object(ctx -> decl, name, OBERON_CLASS_PROC, true, false, false);
+ proc -> type = oberon_new_type_ptr(OBERON_TYPE_PROCEDURE);
+ proc -> type -> sysproc = true;
+ proc -> type -> genfunc = f;
+ proc -> type -> genproc = p;
+}
+
oberon_context_t *
oberon_create_context(ModuleImportCallback import_module)
{
oberon_new_intrinsic(ctx, "CHR", oberon_make_chr_call, NULL);
oberon_new_intrinsic(ctx, "ENTIER", oberon_make_entier_call, NULL);
oberon_new_intrinsic(ctx, "LEN", oberon_make_len_call, NULL);
- //oberon_new_intrinsic(ctx, "LONG", oberon_make_long_call, NULL);
+ oberon_new_intrinsic(ctx, "LONG", oberon_make_long_call, NULL);
oberon_new_intrinsic(ctx, "MAX", oberon_make_max_call, NULL);
oberon_new_intrinsic(ctx, "MIN", oberon_make_min_call, NULL);
oberon_new_intrinsic(ctx, "ODD", oberon_make_odd_call, NULL);
oberon_new_intrinsic(ctx, "ORD", oberon_make_ord_call, NULL);
- //oberon_new_intrinsic(ctx, "SHORT", oberon_make_short_call, NULL);
+ oberon_new_intrinsic(ctx, "SHORT", oberon_make_short_call, NULL);
oberon_new_intrinsic(ctx, "SIZE", oberon_make_size_call, NULL);
/* Procedures */