void OBNC_Exit(int status)
{
-#if OBNC_CONFIG_TARGET_EMB
- while (1);
-#else
exit(status);
-#endif
}
{
return (x >= 0)? x % y: ((x % y) + y) % y;
}
-
-
-unsigned OBNC_INTEGER OBNC_Range(OBNC_INTEGER m, OBNC_INTEGER n)
-{
- return (m <= n)?
- (unsigned OBNC_INTEGER) ((((unsigned OBNC_INTEGER) -2) << n) ^ (((unsigned OBNC_INTEGER) -1) << m)):
- (unsigned OBNC_INTEGER) 0x0u;
-}
-
-
-OBNC_INTEGER OBNC_Ror(OBNC_INTEGER x, OBNC_INTEGER n)
-{
- return (OBNC_INTEGER) (((unsigned OBNC_INTEGER) x >> n) | ((unsigned OBNC_INTEGER) x << (((unsigned OBNC_INTEGER) sizeof (OBNC_INTEGER) << 3) - (size_t) n)));
-}
-
-
-void OBNC_Pack(OBNC_REAL *x, OBNC_INTEGER n)
-{
- *x = OBNC_REAL_SUFFIX(ldexp)(*x, (int) n);
-}
-
-
-void OBNC_Unpk(OBNC_REAL *x, OBNC_INTEGER *n)
-{
- int t;
-
- *x = OBNC_REAL_SUFFIX(frexp)(*x, &t);
- *n = (OBNC_INTEGER) t;
- *x += *x;
- (*n)--;
-}
#include <stdlib.h>
#include <string.h>
-#if OBNC_CONFIG_TARGET_EMB
- #define OBNC_CFILE ""
- #define OBNC_OBNFILE ""
-#else
- #define OBNC_CFILE __FILE__
- #define OBNC_OBNFILE OBERON_SOURCE_FILENAME
-#endif
+#define OBNC_CFILE __FILE__
+#define OBNC_OBNFILE OBERON_SOURCE_FILENAME
/*Run-time exceptions*/
#define OBNC_ABS_INT(x) OBNC_INT_PREFIX(abs)(x)
#define OBNC_ABS_FLT(x) OBNC_REAL_SUFFIX(fabs)(x)
-#define OBNC_ODD(x) (((x) & 1) == 1)
-#define OBNC_LSL(x, n) ((OBNC_INTEGER) (x) << (n))
-#define OBNC_ASR(x, n) ((OBNC_INTEGER) (x) >> (n))
-#define OBNC_ROR(x, n) ((OBNC_INTEGER) (((unsigned OBNC_INTEGER) (x) >> (n)) | ((unsigned OBNC_INTEGER) (x) << ((sizeof (OBNC_INTEGER) << 3) - (size_t) (n)))))
/*Type conversions*/
#define OBNC_FLOOR(x) ((OBNC_INTEGER) OBNC_REAL_SUFFIX(floor)(x))
-#define OBNC_FLT(x) ((OBNC_REAL) (x))
-#define OBNC_ORD(x) ((OBNC_INTEGER) (x))
-#define OBNC_CHR(x) ((char) (x))
+#define OBNC_FLT(x) ((OBNC_REAL) (x))
+#define OBNC_ORD(x) ((OBNC_INTEGER) (x))
+#define OBNC_CHR(x) ((char) (x))
/*Predefined proper procedures*/
-#define OBNC_INC(v) (v)++
+#define OBNC_INC(v) (v)++
#define OBNC_INC_N(v, n) (v) += (n)
-#define OBNC_DEC(v) (v)--
+#define OBNC_DEC(v) (v)--
#define OBNC_DEC_N(v, n) (v) -= (n)
-#define OBNC_INCL(v, x) (v) |= (1 << (x))
-#define OBNC_EXCL(v, x) (v) &= ~((unsigned OBNC_INTEGER) 1 << (x))
-
#define OBNC_NEW(v, vtd, vHeapType, allocKind) \
{ \
vHeapType *p = OBNC_Allocate(sizeof *p, (allocKind)); \
OBNC_ExitTrap(); \
}
-#define OBNC_PACK(x, n) (x) = OBNC_REAL_SUFFIX(ldexp)(x, n)
-
-#if OBNC_CONFIG_C_INT_TYPE != OBNC_CONFIG_INT
- #define OBNC_UNPK(x, n) OBNC_Unpk(&(x), &(n))
-#else
- #define OBNC_UNPK(x, n) (x) = OBNC_REAL_SUFFIX(frexp)(x, &(n)); (x) += (x); (n)--
-#endif
-
/*SYSTEM procedures*/
#ifndef OBNC_ADR
#define OBNC_MOD(x, y) (((x) >= 0)? (x) % (y): (((x) % (y)) + (y)) % (y))
-#define OBNC_RANGE(m, n) \
- (((m) <= (n))? \
- (unsigned OBNC_INTEGER) ((((unsigned OBNC_INTEGER) -2) << (n)) ^ (((unsigned OBNC_INTEGER) -1)) << (m)): \
- (unsigned OBNC_INTEGER) 0x0u)
-
#define OBNC_IN(x, A) ((int) ((((unsigned OBNC_INTEGER) 1) << (x)) & (A)))
/*Structured assignments*/
OBNC_INTEGER OBNC_Mod(OBNC_INTEGER x, OBNC_INTEGER y);
-unsigned OBNC_INTEGER OBNC_Range(OBNC_INTEGER m, OBNC_INTEGER n);
-
-OBNC_INTEGER OBNC_Ror(OBNC_INTEGER x, OBNC_INTEGER n);
-
-void OBNC_Pack(OBNC_REAL *x, OBNC_INTEGER n);
-
-void OBNC_Unpk(OBNC_REAL *x, OBNC_INTEGER *n);
-
/*On small systems fprintf takes up too much memory*/
void OBNC_WriteInt(OBNC_INTEGER x, OBNC_INTEGER n, FILE *f);
}
-static void TestODD(void)
-{
- assert(! OBNC_ODD(-2));
- assert(OBNC_ODD(-1));
- assert(! OBNC_ODD(0));
- assert(OBNC_ODD(1));
- assert(! OBNC_ODD(2));
-}
-
-
-static void TestLSL(void)
-{
- assert(OBNC_LSL(0, 0) == 0);
- assert(OBNC_LSL(0, 1) == 0);
- assert(OBNC_LSL(1, 0) == 1);
- assert(OBNC_LSL(1, 1) == 2);
-}
-
-
-static void TestASR(void)
-{
- assert(OBNC_ASR(0, 0) == 0);
- assert(OBNC_ASR(0, 1) == 0);
- assert(OBNC_ASR(1, 0) == 1);
- assert(OBNC_ASR(1, 1) == 0);
- assert(OBNC_ASR(~0, 1) == ~0);
-}
-
-
-static void TestROR(void)
-{
- assert(OBNC_ROR(0, 1) == 0);
- assert(OBNC_ROR(2, 1) == 1);
- assert(OBNC_ROR(1, 2) == (OBNC_INTEGER) 1 << (INTEGER_BITS - 2));
-}
-
-
static void TestFLOOR(void)
{
assert(OBNC_FLOOR(-1.5) == -2);
}
-static void TestINCL(void)
-{
- int A;
-
- A = 0;
- OBNC_INCL(A, 0);
- assert(A == 1);
-}
-
-
-static void TestEXCL(void)
-{
- unsigned OBNC_INTEGER A;
-
- A = 1;
- OBNC_EXCL(A, 0);
- assert(A == 0);
-}
-
-
static void TestNEW(void)
{
struct { int *typeID; int x; } *v;
}
-static void TestPACK(void)
-{
- const double eps = 0.01;
- OBNC_REAL x;
-
- x = 1.0;
- OBNC_PACK(x, 2);
- assert(OBNC_ABS_FLT(x - OBNC_REAL_SUFFIX(4.0)) < eps);
-}
-
-
-static void TestUNPK(void)
-{
- OBNC_REAL x;
- OBNC_INTEGER n;
-
- x = 4.0;
- OBNC_UNPK(x, n);
- assert(x >= 1.0);
- assert(x < 2.0);
- assert(n == 2);
-}
-
-
static void TestCMP(void)
{
char s[4], t[4];
OBNC_Init(0, NULL);
TestABS();
- TestODD();
- TestLSL();
- TestASR();
- TestROR();
TestFLOOR();
TestFLT();
TestORD();
TestCHR();
TestINC();
TestDEC();
- TestINCL();
- TestEXCL();
TestNEW();
TestASSERT();
- TestPACK();
- TestUNPK();
TestCMP();
return 0;
switch (symbol) {
case TREES_ABS_PROC:
- case TREES_ODD_PROC:
case TREES_LEN_PROC:
- case TREES_LSL_PROC:
- case TREES_ASR_PROC:
- case TREES_ROR_PROC:
case TREES_FLOOR_PROC:
case TREES_FLT_PROC:
case TREES_ORD_PROC:
case TREES_CHR_PROC:
case TREES_INC_PROC:
case TREES_DEC_PROC:
- case TREES_INCL_PROC:
- case TREES_EXCL_PROC:
/*case TREES_NEW_PROC*/
case TREES_ASSERT_PROC:
- case TREES_PACK_PROC:
- case TREES_UNPK_PROC:
case TREES_ADR_PROC:
case TREES_SIZE_PROC:
case TREES_BIT_PROC:
fprintf(file, ")");
addressOperationUsed = 1;
break;
- case TREES_ASR_PROC:
- Indent(file, indent);
- fprintf(file, "OBNC_ASR(");
- Generate(Trees_Left(node), file, 0);
- fprintf(file, ")");
- break;
case TREES_ASSERT_PROC:
GenerateAssert(node, file, indent);
break;
case TREES_DESIGNATOR:
GenerateDesignator(node, file);
break;
- case TREES_EXCL_PROC:
- Indent(file, indent);
- fprintf(file, "OBNC_EXCL(");
- Generate(Trees_Left(node), file, 0);
- fprintf(file, ");\n");
- break;
case TREES_EXP_LIST:
GenerateExpList(node, file);
break;
fprintf(file, ");\n");
}
break;
- case TREES_INCL_PROC:
- Indent(file, indent);
- fprintf(file, "OBNC_INCL(");
- Generate(Trees_Left(node), file, 0);
- fprintf(file, ");\n");
- break;
case TREES_INTEGER_TYPE:
fprintf(file, "OBNC_INTEGER");
break;
GenerateArrayLength(Trees_Type(var), EntireVar(var), ArrayDimension(var), file);
}
break;
- case TREES_LSL_PROC:
- fprintf(file, "OBNC_LSL(");
- Generate(Trees_Left(node), file, 0);
- fprintf(file, ")");
- break;
case TREES_NEW_PROC:
GenerateMemoryAllocation(Trees_Left(Trees_Left(node)), file, indent);
break;
- case TREES_ODD_PROC:
- fprintf(file, "OBNC_ODD(");
- Generate(Trees_Left(node), file, 0);
- fprintf(file, ")");
- break;
case TREES_ORD_PROC:
fprintf(file, "OBNC_ORD(");
if (Types_IsChar(Trees_Type(Trees_Left(Trees_Left(node))))) {
GenerateWithPrecedence(Trees_Left(node), file);
fprintf(file, ")");
break;
- case TREES_PACK_PROC:
- {
- Trees_Node params = Trees_Left(node);
-
- Indent(file, indent);
- if (ContainsProcedureCall(params)) {
- fprintf(file, "OBNC_Pack(&(");
- Generate(Trees_Left(params), file, 0);
- fprintf(file, "), ");
- Generate(Trees_Right(params), file, 0);
- fprintf(file, ");\n");
- } else {
- fprintf(file, "OBNC_PACK(");
- Generate(params, file, 0);
- fprintf(file, ");\n");
- }
- }
- break;
case TREES_PROCEDURE_CALL:
GenerateProcedureCall(node, file, indent);
break;
case TREES_REAL_TYPE:
fprintf(file, "OBNC_REAL");
break;
- case TREES_ROR_PROC:
- if (ContainsProcedureCall(Trees_Left(node)) || ContainsProcedureCall(Trees_Right(node))) {
- fprintf(file, "OBNC_Ror(");
- } else {
- fprintf(file, "OBNC_ROR(");
- }
- Generate(Trees_Left(node), file, 0);
- fprintf(file, ")");
- break;
case TREES_SIZE_PROC:
fprintf(file, "OBNC_SIZE(");
Generate(Trees_Left(node), file, 0);
Generate(Trees_Left(node), file, indent);
Generate(Trees_Right(node), file, indent);
break;
- case TREES_UNPK_PROC:
- {
- Trees_Node params = Trees_Left(node);
-
- Indent(file, indent);
- if (ContainsProcedureCall(params)) {
- fprintf(file, "OBNC_Unpk(&(");
- Generate(Trees_Left(params), file, 0);
- fprintf(file, "), &(");
- Generate(Trees_Right(params), file, 0);
- fprintf(file, "));\n");
- } else {
- fprintf(file, "OBNC_UNPK(");
- Generate(params, file, 0);
- fprintf(file, ");\n");
- }
- }
- break;
case TREES_VAL_PROC:
fprintf(file, "OBNC_VAL(");
Generate(Trees_Left(node), file, 0);
case TREES_ADR_PROC:
printf("SYSTEM.ADR");
break;
- case TREES_ASR_PROC:
- printf("ASR");
- break;
case TREES_ASSERT_PROC:
printf("ASSERT");
break;
case TREES_DESIGNATOR:
printf("designator");
break;
- case TREES_EXCL_PROC:
- printf("EXCL");
- break;
case TREES_EXP_LIST:
printf("ExpList");
break;
case TREES_INC_PROC:
printf("INC");
break;
- case TREES_INCL_PROC:
- printf("INCL");
- break;
case TREES_INTEGER_TYPE:
printf("IntegerType");
break;
case TREES_LEN_PROC:
printf("LEN");
break;
- case TREES_LSL_PROC:
- printf("LSL");
- break;
case TREES_NEW_PROC:
printf("NEW");
break;
case TREES_NIL_TYPE:
printf("NilType");
break;
- case TREES_ODD_PROC:
- printf("ODD");
- break;
case TREES_ORD_PROC:
printf("ORD");
break;
- case TREES_PACK_PROC:
- printf("PACK");
- break;
case TREES_PROCEDURE_CALL:
printf("ProcedureCall");
break;
case TREES_REAL_TYPE:
printf("RealType");
break;
- case TREES_ROR_PROC:
- printf("ROR");
- break;
case TREES_SIZE_PROC:
printf("SYSTEM.SIZE");
break;
case TREES_STRING_TYPE:
printf("StringType");
break;
- case TREES_UNPK_PROC:
- printf("UNPK");
- break;
case TREES_VAL_PROC:
printf("SYSTEM.VAL");
break;
TREES_NIL_TYPE,
TREES_ABS_PROC,
- TREES_ASR_PROC,
TREES_ASSERT_PROC,
TREES_CHR_PROC,
TREES_DEC_PROC,
- TREES_EXCL_PROC,
TREES_FLOOR_PROC,
TREES_FLT_PROC,
TREES_INC_PROC,
- TREES_INCL_PROC,
TREES_LEN_PROC,
- TREES_LSL_PROC,
TREES_NEW_PROC,
- TREES_ODD_PROC,
TREES_ORD_PROC,
- TREES_PACK_PROC,
- TREES_ROR_PROC,
- TREES_UNPK_PROC,
TREES_CASE,
TREES_CASE_LABEL_LIST,
case TREES_BYTE_TYPE:
case TREES_STRING_TYPE:
case TREES_ABS_PROC:
- case TREES_ASR_PROC:
case TREES_ASSERT_PROC:
case TREES_CHR_PROC:
case TREES_DEC_PROC:
- case TREES_EXCL_PROC:
case TREES_FLOOR_PROC:
case TREES_FLT_PROC:
case TREES_INC_PROC:
- case TREES_INCL_PROC:
case TREES_LEN_PROC:
- case TREES_LSL_PROC:
case TREES_NEW_PROC:
case TREES_NIL_TYPE:
- case TREES_ODD_PROC:
case TREES_ORD_PROC:
- case TREES_PACK_PROC:
- case TREES_ROR_PROC:
- case TREES_UNPK_PROC:
case TREES_ADR_PROC:
case TREES_SIZE_PROC:
predeclared = 0;
switch (Trees_Symbol(Types_Structure(type))) {
case TREES_ABS_PROC:
- case TREES_ASR_PROC:
case TREES_ASSERT_PROC:
case TREES_CHR_PROC:
case TREES_DEC_PROC:
- case TREES_EXCL_PROC:
case TREES_FLOOR_PROC:
case TREES_FLT_PROC:
case TREES_INC_PROC:
- case TREES_INCL_PROC:
case TREES_LEN_PROC:
- case TREES_LSL_PROC:
case TREES_NEW_PROC:
- case TREES_ODD_PROC:
case TREES_ORD_PROC:
- case TREES_PACK_PROC:
- case TREES_ROR_PROC:
- case TREES_UNPK_PROC:
/*SYSTEM*/
case TREES_ADR_PROC:
case TREES_SIZE_PROC: