aboutsummaryrefslogtreecommitdiff
path: root/backendC/CleanCompilerSources/tcsupport_2.c
diff options
context:
space:
mode:
Diffstat (limited to 'backendC/CleanCompilerSources/tcsupport_2.c')
-rw-r--r--backendC/CleanCompilerSources/tcsupport_2.c187
1 files changed, 187 insertions, 0 deletions
diff --git a/backendC/CleanCompilerSources/tcsupport_2.c b/backendC/CleanCompilerSources/tcsupport_2.c
new file mode 100644
index 0000000..173f6e1
--- /dev/null
+++ b/backendC/CleanCompilerSources/tcsupport_2.c
@@ -0,0 +1,187 @@
+/*
+ Version 1.2 21/01/1997
+
+ Author: Sjaak Smetsers
+*/
+
+#pragma options (!macsbug_names)
+
+#include "system.h"
+
+#include "settings.h"
+#include "syntaxtr.t"
+#include "comsupport.h"
+
+#include "sizes.h"
+#include "checker.h"
+#include "checksupport.h"
+#include "tctypes.t"
+#include "typechecker.h"
+#include "typechecker2.h"
+#include "typeconv.h"
+#include "tcsupport.h"
+#include "overloading.h"
+#include "scanner.h"
+#include "comparser.h"
+#include "buildtree.h"
+
+BITVECT DetermineUniPropOfTypeCons (SymbDef typecons)
+{
+ if (typecons -> sdef_kind == TYPE || typecons -> sdef_kind == RECORDTYPE)
+ return (typecons -> sdef_type) ? typecons -> sdef_type -> type_uniprop : ALLBITSSET;
+ else
+ return (typecons -> sdef_kind == TYPESYN) ? typecons -> sdef_syn_type -> syntype_uniprop : ALLBITSSET;
+
+} /* DetermineUniPropOfTypeCons */
+
+BITVECT DetermineConsVarsOfTypeCons (SymbDef typecons, ConsVarList * cons_vars)
+{
+ if (typecons -> sdef_kind == TYPE || typecons -> sdef_kind == RECORDTYPE)
+ { if (typecons -> sdef_type)
+ { * cons_vars = typecons -> sdef_type -> type_lhs -> ft_cons_vars;
+ return typecons -> sdef_type -> type_consvars;
+ }
+ else
+ { * cons_vars = NULL;
+ return ALLBITSCLEAR;
+ }
+ }
+ else if (typecons -> sdef_kind == TYPESYN)
+ { * cons_vars = typecons -> sdef_syn_type -> syn_lhs -> ft_cons_vars ;
+ return typecons -> sdef_syn_type -> syn_consvars;
+ }
+ else
+ { * cons_vars = NULL;
+ return ALLBITSCLEAR;
+ }
+
+} /* DetermineConsVarsOfTypeCons */
+
+TypeCell SkipIndirectionChain (TypeCell type)
+{
+ MemoryCheck (type);
+ for (; type -> tc_kind == Indirection; type = type -> contents_indirect)
+ MemoryCheck (type);
+ return type;
+} /* SkipIndirectionChain */
+
+#define SubstitutedType(typeargs) ((typeargs)[-1])
+
+TypeCell SkipTypeSynIndirection (TypeCell type)
+{
+ if (type -> tc_kind == ConstructorType && type -> tc_expanded)
+ { type = SubstitutedType (type -> contents_tc_args);
+ SkipIndirections (type);
+ }
+ return type;
+
+} /* SkipTypeSynIndirection */
+
+void PrintNodeSymbol (Node node, int arg_nr, File file)
+{
+ Symbol rootsymb;
+
+ switch (node -> node_kind)
+ {
+ case IfNode:
+ switch (arg_nr)
+ {
+ case 1: FPutS ("condition part of guard or if rule", file);
+ return;
+ case 2: FPutS ("then part of guard or if rule", file);
+ return;
+ case 3: FPutS ("else part of guard or if rule", file);
+ return;
+ default: FPutS ("guard or if rule", file);
+ return;
+ }
+ break;
+ case SelectorNode:
+ if (arg_nr == 1)
+ FPutS ("argument of selection", file);
+ else
+ FPutS ("selection", file);
+ return;
+ case MatchNode:
+ if (arg_nr == 1)
+ { FPutS ("rhs selection of", file);
+ break;
+ }
+ else
+ { FPutS ("rhs selection", file);
+ return;
+ }
+ case UpdateNode:
+ FPutS ("update of record", file);
+ break;
+ case NodeIdNode:
+ if (node -> node_node_id -> nid_ident != NULL)
+ { Ident id = node -> node_node_id -> nid_ident;
+ if (TestMark (node -> node_node_id, nid_mark2, NID_FIELD_NAME_MASK))
+ { SymbDef rec_symb = (SymbDef) id -> ident_environ;
+
+ FPrintF (file, "field %s of record %s", id -> ident_name, rec_symb -> sdef_ident -> ident_name);
+ }
+ else
+ FPutS (id -> ident_name, file);
+ }
+ else if (node -> node_node_id -> nid_node)
+ PrintNodeSymbol (node -> node_node_id -> nid_node, 0, file);
+ return;
+ default:
+ break;
+ }
+
+ rootsymb = node -> node_symbol;
+
+ if (rootsymb -> symb_kind == select_symb)
+ { if (arg_nr == 1)
+ { FPrintF (file, "%d-tuple selection of ", rootsymb -> symb_arity);
+ PrintNodeSymbol (node -> node_arguments -> arg_node, 0, file);
+ }
+ else
+ FPrintF (file, "selection of the %d-th argument of a %d-tuple ", node -> node_arity, rootsymb -> symb_arity);
+ }
+ else if (rootsymb -> symb_kind == apply_symb)
+ { if (arg_nr == 1)
+ PrintNodeSymbol (node -> node_arguments -> arg_node, 0, file);
+ else
+ { Node argnode;
+ for (arg_nr = 1, argnode = node -> node_arguments -> arg_node;
+ argnode -> node_kind == NormalNode && argnode -> node_symbol -> symb_kind == apply_symb;
+ argnode = argnode -> node_arguments -> arg_node)
+ arg_nr ++;
+ PrintNodeSymbol (argnode, arg_nr, file);
+ }
+ }
+ else if (rootsymb -> symb_kind == tuple_symb)
+ { int tup_arity = node -> node_arity;
+ FPutS ("(_", file);
+ for (tup_arity--; tup_arity > 0; tup_arity--)
+ FPutS (",_", file);
+ FPutC (')', file);
+ }
+ else
+ { if (arg_nr > 0)
+ { if (rootsymb -> symb_kind == definition && rootsymb -> symb_def -> sdef_kind == IMPRULE)
+ { if (arg_nr <= rootsymb -> symb_def -> sdef_nr_of_lifted_nodeids)
+ { Args lifted_arg;
+ int i;
+
+ for (i = 1, lifted_arg = node -> node_arguments; i < arg_nr; i ++, lifted_arg = lifted_arg -> arg_next)
+ ;
+ if (lifted_arg -> arg_node -> node_kind == NodeIdNode)
+ FPrintF (StdError, "internal argument %s of ", lifted_arg -> arg_node -> node_node_id -> nid_ident -> ident_name);
+ else
+ FPrintF (StdError, "internal argument %d of ", arg_nr);
+ }
+ else
+ FPrintF (StdError, "argument %d of ", arg_nr - rootsymb -> symb_def -> sdef_nr_of_lifted_nodeids);
+ }
+ else
+ FPrintF (StdError, "argument %d of ", arg_nr);
+ }
+ PrintSymbol (rootsymb, file);
+ }
+
+} /* PrintNodeSymbol */