mescc: Support regular C99 compile, headers + mlibc.
[mes.git] / src / lib.c
1 /* -*-comment-start: "//";comment-end:""-*-
2  * Mes --- Maxwell Equations of Software
3  * Copyright © 2016,2017 Jan Nieuwenhuizen <janneke@gnu.org>
4  *
5  * This file is part of Mes.
6  *
7  * Mes is free software; you can redistribute it and/or modify it
8  * under the terms of the GNU General Public License as published by
9  * the Free Software Foundation; either version 3 of the License, or (at
10  * your option) any later version.
11  *
12  * Mes is distributed in the hope that it will be useful, but
13  * WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with Mes.  If not, see <http://www.gnu.org/licenses/>.
19  */
20
21 #if !__MESC__
22 #define fputs fdputs
23 #endif
24
25 int g_depth;
26 SCM fdisplay_ (SCM, int);
27
28 SCM
29 display_helper (SCM x, int cont, char* sep, int fd)
30 {
31   fputs (sep, fd);
32   if (g_depth == 0) return cell_unspecified;
33   g_depth = g_depth - 1;
34   
35   switch (TYPE (x))
36     {
37     case TCHAR:
38       {
39         fputs ("#\\", fd);
40         fputc (VALUE (x), fd);
41         break;
42       }
43     case TFUNCTION:
44       {
45         fputs ("#<procedure ", fd);
46         char const *p = "?";
47         if (FUNCTION (x).name != 0)
48           p = FUNCTION (x).name;
49         fputs (p, fd);
50         fputs ("[", fd);
51         fputs (itoa (CDR (x)), fd);
52         fputs (",", fd);
53         fputs (itoa (x), fd);
54         fputs ("]>", fd);
55         break;
56       }
57     case TMACRO:
58       {
59         fputs ("#<macro ", fd);
60         display_helper (cdr (x), cont, "", fd);
61         fputs (">", fd);
62         break;
63       }
64     case TNUMBER:
65       {
66         fputs (itoa (VALUE (x)), fd);
67         break;
68       }
69     case TPAIR:
70       {
71         if (!cont) fputs ("(", fd);
72         if (x && x != cell_nil) fdisplay_ (CAR (x), fd);
73         if (CDR (x) && TYPE (CDR (x)) == TPAIR)
74           display_helper (CDR (x), 1, " ", fd);
75         else if (CDR (x) && CDR (x) != cell_nil)
76           {
77             if (TYPE (CDR (x)) != TPAIR)
78               fputs (" . ", fd);
79             fdisplay_ (CDR (x), fd);
80           }
81         if (!cont) fputs (")", fd);
82         break;
83       }
84     case TSPECIAL:
85     case TSTRING:
86     case TSYMBOL:
87       {
88         SCM t = CAR (x);
89         while (t && t != cell_nil)
90           {
91             fputc (VALUE (CAR (t)), fd);
92             t = CDR (t);
93           }
94         break;
95       }
96     default:
97       {
98         fputs ("<", fd);
99         fputs (itoa (TYPE (x)), fd);
100         fputs (":", fd);
101         fputs (itoa (x), fd);
102         fputs (">", fd);
103         break;
104       }
105     }
106   return 0;
107 }
108
109 SCM
110 display_ (SCM x)
111 {
112   g_depth = 5;
113   return display_helper (x, 0, "", STDOUT);
114 }
115
116 SCM
117 display_error_ (SCM x)
118 {
119   g_depth = 5;
120   return display_helper (x, 0, "", STDERR);
121 }
122
123 SCM
124 fdisplay_ (SCM x, int fd) ///((internal))
125 {
126   g_depth = 5;
127   return display_helper (x, 0, "", fd);
128 }
129
130 SCM
131 exit_ (SCM x) ///((name . "exit"))
132 {
133   assert (TYPE (x) == TNUMBER);
134   exit (VALUE (x));
135 }
136
137 SCM
138 xassq (SCM x, SCM a) ///for speed in core only
139 {
140   while (a != cell_nil && x != CDAR (a)) a = CDR (a);
141   return a != cell_nil ? CAR (a) : cell_f;
142 }