* Unparse expressions and types - for use in error messages, type checker
* and for debugging.
*
- * Hugs 98 is Copyright (c) Mark P Jones, Alastair Reid and the Yale
- * Haskell Group 1994-99, and is distributed as Open Source software
- * under the Artistic License; see the file "Artistic" that is included
- * in the distribution for details.
+ * The Hugs 98 system is Copyright (c) Mark P Jones, Alastair Reid, the
+ * Yale Haskell Group, and the Oregon Graduate Institute of Science and
+ * Technology, 1994-1999, All rights reserved. It is distributed as
+ * free software under the license in the file "License", which is
+ * included in the distribution.
*
* $RCSfile: output.c,v $
- * $Revision: 1.3 $
- * $Date: 1999/02/03 17:08:33 $
+ * $Revision: 1.18 $
+ * $Date: 2000/04/25 17:43:50 $
* ------------------------------------------------------------------------*/
-#include "prelude.h"
+#include "hugsbasictypes.h"
#include "storage.h"
#include "connect.h"
#include "errors.h"
#include <ctype.h>
-/*#define DEBUG_SHOWSC*/ /* Must also be set in compiler.c */
-
#define DEPTH_LIMIT 15
/* --------------------------------------------------------------------------
* Local function prototypes:
* ------------------------------------------------------------------------*/
-static Void local putChr Args((Int));
-static Void local putStr Args((String));
-static Void local putInt Args((Int));
-
-static Void local put Args((Int,Cell));
-static Void local putFlds Args((Cell,List));
-static Void local putComp Args((Cell,List));
-static Void local putQual Args((Cell));
-static Bool local isDictVal Args((Cell));
-static Cell local maySkipDict Args((Cell));
-static Void local putAp Args((Int,Cell));
-static Void local putOverInfix Args((Int,Text,Syntax,Cell));
-static Void local putInfix Args((Int,Text,Syntax,Cell,Cell));
-static Void local putSimpleAp Args((Cell,Int));
-static Void local putTuple Args((Int,Cell));
-static Int local unusedTups Args((Int,Cell));
-static Void local unlexVar Args((Text));
-static Void local unlexOp Args((Text));
-static Void local unlexCharConst Args((Cell));
-static Void local unlexStrConst Args((Text));
-
-static Void local putSigType Args((Cell));
-static Void local putContext Args((List,List,Int));
-static Void local putPred Args((Cell,Int));
-static Void local putType Args((Cell,Int,Int));
-static Void local putTyVar Args((Int));
-static Bool local putTupleType Args((Cell,Int));
-static Void local putApType Args((Type,Int,Int));
-
-static Void local putKind Args((Kind));
-static Void local putKinds Args((Kinds));
+static Void local put ( Int,Cell );
+static Void local putFlds ( Cell,List );
+static Void local putComp ( Cell,List );
+static Void local putQual ( Cell );
+static Bool local isDictVal ( Cell );
+static Cell local maySkipDict ( Cell );
+static Void local putAp ( Int,Cell );
+static Void local putOverInfix ( Int,Text,Syntax,Cell );
+static Void local putInfix ( Int,Text,Syntax,Cell,Cell );
+static Void local putSimpleAp ( Cell,Int );
+static Void local putTuple ( Int,Cell );
+static Int local unusedTups ( Int,Cell );
+static Void local unlexOp ( Text );
+
+static Void local putSigType ( Cell );
+static Void local putContext ( List,List,Int );
+static Void local putPred ( Cell,Int );
+static Void local putType ( Cell,Int,Int );
+static Void local putTyVar ( Int );
+static Bool local putTupleType ( Cell,Int );
+static Void local putApType ( Type,Int,Int );
+
+static Void local putKind ( Kind );
+static Void local putKinds ( Kinds );
+
/* --------------------------------------------------------------------------
* Basic output routines:
* ------------------------------------------------------------------------*/
-static FILE *outputStream; /* current output stream */
-#ifdef DEBUG_SHOWSC
-static Int outColumn = 0; /* current output column number */
-#endif
+FILE *outputStream; /* current output stream */
+Int outColumn = 0; /* current output column number */
#define OPEN(b) if (b) putChr('(');
#define CLOSE(b) if (b) putChr(')');
-static Void local putChr(c) /* print single character */
+Void putChr(c) /* print single character */
Int c; {
Putc(c,outputStream);
-#ifdef DEBUG_SHOWSC
outColumn++;
-#endif
}
-static Void local putStr(s) /* print string */
+Void putStr(s) /* print string */
String s; {
for (; *s; s++) {
Putc(*s,outputStream);
-#ifdef DEBUG_SHOWSC
outColumn++;
-#endif
}
}
-static Void local putInt(n) /* print integer */
+Void putInt(n) /* print integer */
Int n; {
static char intBuf[16];
sprintf(intBuf,"%d",n);
putStr(intBuf);
}
+Void putPtr(p) /* print pointer */
+Ptr p; {
+ static char intBuf[16];
+ sprintf(intBuf,"%p",p);
+ putStr(intBuf);
+}
+
/* --------------------------------------------------------------------------
* Precedence values (See Haskell 1.3 report, p.12):
* ------------------------------------------------------------------------*/
case CONOPCELL : unlexVar(textOf(e));
break;
+#if IPARAM
+ case IPVAR : putChr('?');
+ unlexVar(textOf(e));
+ break;
+
+ case WITHEXP : OPEN(d>WHERE_PREC);
+ putStr("dlet {...} in ");
+ put(WHERE_PREC+1,fst(snd(e)));
+ CLOSE(d>WHERE_PREC);
+ break;
+#endif
+
#if TREX
case RECSEL : putChr('#');
unlexVar(extText(snd(e)));
case DOCOMP : putStr("do {...}");
break;
+ case MDOCOMP : putStr("do {...}");
+ break;
+
case COMP : putComp(fst(snd(e)),snd(snd(e)));
break;
}
break;
-#if BIGNUMS
- case NEGNUM :
- case ZERONUM :
- case POSNUM : xs = bigOut(e,NIL,d>=UMINUS_PREC);
- for (; nonNull(xs); xs=tl(xs))
- putChr(charOf(arg(hd(xs))));
- break;
-#endif
-
case FLOATCELL : { Float f = floatOf(e);
if (f<0 && d>=UMINUS_PREC) putChr('(');
- putStr(floatToString(f));
+ putStr(floatToString(e));
if (f<0 && d>=UMINUS_PREC) putChr(')');
}
break;
break;
case LETREC : OPEN(d>WHERE_PREC);
-#if DEBUG_CODE
+#if 0
putStr("let {");
put(NEVER,fst(snd(e)));
putStr("} in ");
case CASE : putStr("case ");
put(NEVER,fst(snd(e)));
-#if DEBUG_CODE
+#if 0
putStr(" of {");
put(NEVER,snd(snd(e)));
putChr('}');
static Bool local isDictVal(e) /* Look for dictionary value */
Cell e; {
-#if !DEBUG_CODE
+#if 0 /* was !DEBUG_CODE -- is it necessary? */
Cell h = getHead(e);
switch (whatIs(h)) {
case DICTVAR : return TRUE;
Int d;
Cell e; {
Cell h;
- Text t;
+ Text t = 0; /* bogus init to keep gcc -O happy */
Syntax sy;
Int args = 0;
}
switch (whatIs(h)) {
-#if NPLUSK
case ADDPAT : if (args==1)
putInfix(d,textPlus,syntaxOf(namePlus),
arg(e),mkInt(intValOf(fun(e))));
else
putStr("ADDPAT");
return;
-#endif
case TUPLE : OPEN(args>tupleOf(h) && d>=FUN_PREC);
putTuple(tupleOf(h),e);
case NAME : if (args==1 &&
((h==nameFromInt && isInt(arg(e))) ||
-#if BIGNUMS
- (h==nameFromInteger && isBignum(arg(e))) ||
-#endif
(h==nameFromDouble && isFloat(arg(e))))) {
put(d,arg(e));
return;
return ts;
}
-static Void local unlexVar(t) /* print text as a variable name */
-Text t; { /* operator symbols must be enclosed*/
- String s = textToStr(t); /* in parentheses... except [] ... */
-
- if ((isascii(s[0]) && isalpha(s[0])) || s[0]=='_' || s[0]=='[' || s[0]=='(')
+Void unlexVarStr(s)
+String s; {
+ if ((isascii((int)(s[0])) && isalpha((int)(s[0])))
+ || s[0]=='_' || s[0]=='[' || s[0]=='('
+ || s[0]=='$'
+ || (s[0]==':' && s[1]=='D')
+ )
putStr(s);
else {
putChr('(');
}
}
+Void unlexVar(t) /* print text as a variable name */
+Text t; { /* operator symbols must be enclosed*/
+ unlexVarStr(textToStr(t)); /* in parentheses... except [] ... */
+}
+
static Void local unlexOp(t) /* print text as operator name */
Text t; { /* alpha numeric symbols must be */
String s = textToStr(t); /* enclosed by backquotes */
- if (isascii(s[0]) && isalpha(s[0])) {
+ if (isascii((int)(s[0])) && isalpha((int)(s[0]))) {
putChr('`');
putStr(s);
putChr('`');
putStr(s);
}
-static Void local unlexCharConst(c)
+Void unlexCharConst(c)
Cell c; {
putChr('\'');
putStr(unlexChar(c,'\''));
putChr('\'');
}
-static Void local unlexStrConst(t)
+Void unlexStrConst(t)
Text t; {
String s = textToStr(t);
static Char SO = 14; /* ASCII code for '\SO' */
Char c = ' ';
if ((lastWasSO && *ch=='H') ||
- (lastWasEsc && lastWasDigit && isascii(*ch) && isdigit(*ch)))
+ (lastWasEsc && lastWasDigit
+ && isascii((int)(*ch)) && isdigit((int)(*ch))))
putStr("\\&");
lastWasEsc = (*ch=='\\');
Int fr; {
Int len = length(ps) + length(qs);
Int c = len;
- if (len!=1) {
+#if IPARAM
+ Bool useParens = len!=1 || isIP(fun(hd(ps)));
+#else
+ Bool useParens = len!=1;
+#endif
+ if (useParens)
putChr('(');
- }
for (; nonNull(ps); ps=tl(ps)) {
putPred(hd(ps),fr);
if (--c > 0) {
putStr(", ");
}
}
- if (len!=1) {
+ if (useParens)
putChr(')');
- }
}
static Void local putPred(pi,fr) /* Output predicate */
return;
}
#endif
+#if IPARAM
+ if (whatIs(fun(pi)) == IPCELL) {
+ putChr('?');
+ putPred(fun(pi),fr);
+ putStr(" :: ");
+ putType(arg(pi),NEVER,fr);
+ return;
+ }
+#endif
putPred(fun(pi),fr);
putChr(' ');
putType(arg(pi),ALWAYS,fr);
putStr(textToStr(cclass(pi).text));
else if (isCon(pi))
putStr(textToStr(textOf(pi)));
+#if IPARAM
+ else if (whatIs(pi) == IPCELL)
+ unlexVar(textOf(pi));
+#endif
else
putStr("<unknownPredicate>");
}
for (; isAp(ks); ks=tl(ks)) {
putTyVar(fr++);
if (isAp(tl(ks)))
- putChr(',');
+ putChr(' ');
}
putStr(". ");
putType(monotypeOf(t),NEVER,fr);
CLOSE(prec>=ARROW_PREC);
return;
}
+#if 0
else if (argCount==1) {
putChr('(');
putType(arg(t),ARROW_PREC,fr);
putStr("->)");
return;
}
+#endif
}
else if (isTuple(typeHead)) {
if (argCount==tupleOf(typeHead)) {
putStr(punc);
punc = ", ";
putStr(textToStr(extText(typeHead)));
- putStr("::");
+ putStr(" :: ");
putType(extField(t),NEVER,fr);
t = extRow(t);
typeHead = getHead(t);
* Main drivers:
* ------------------------------------------------------------------------*/
+FILE *mystdout ( Void ) {
+ /* We use this from the gdb command line when debugging */
+ return stdout;
+}
+
Void printExp(fp,e) /* print expr on specified stream */
FILE *fp;
Cell e; {
putKinds(ks);
}
+Void printFD(fp,fd) /* print functional dependency */
+FILE* fp;
+Pair fd; {
+ List us;
+ outputStream = fp;
+ for (us=fst(fd); nonNull(us); us=tl(us)) {
+ putTyVar(offsetOf(hd(us)));
+ if (nonNull(tl(us))) {
+ putChr(' ');
+ }
+ }
+ putStr(" -> ");
+ for (us=snd(fd); nonNull(us); us=tl(us)) {
+ putTyVar(offsetOf(hd(us)));
+ if (nonNull(tl(us))) {
+ putChr(' ');
+ }
+ }
+}
+
/*-------------------------------------------------------------------------*/