*
* You should have received a copy of the GNU General Public License
* along with this software; see the file COPYING. If not, write to
- * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ * the Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307 USA
*
* As a special exception, the Free Software Foundation gives permission
* for additional uses of the text contained in its release of GUILE.
*
* If you write modifications of your own for GUILE, it is your choice
* whether to permit this exception to apply to your modifications.
- * If you do not wish that, delete this exception notice.
- */
+ * If you do not wish that, delete this exception notice. */
\f
#include <stdio.h>
#include "_scm.h"
+#include "unif.h"
+#include "eval.h"
+#include "read.h"
+
+#include "strports.h"
#ifdef HAVE_STRING_H
#include <string.h>
*
*/
-#ifdef __STDC__
-static int
-prinstpt (SCM exp, SCM port, int writing)
-#else
+
+static int prinstpt SCM_P ((SCM exp, SCM port, scm_print_state *pstate));
+
static int
-prinstpt (exp, port, writing)
+prinstpt (exp, port, pstate)
SCM exp;
SCM port;
- int writing;
-#endif
+ scm_print_state *pstate;
{
scm_prinport (exp, port, "string");
return !0;
}
-#ifdef __STDC__
-static int
-stputc (int c, SCM p)
-#else
+
+static int stputc SCM_P ((int c, SCM p));
+
static int
stputc (c, p)
int c;
SCM p;
-#endif
{
scm_sizet ind = SCM_INUM (SCM_CAR (p));
SCM_DEFER_INTS;
scm_vector_set_length_x (SCM_CDR (p), SCM_MAKINUM (ind + (ind >> 1)));
SCM_ALLOW_INTS;
SCM_CHARS (SCM_CDR (p))[ind] = c;
- SCM_CAR (p) = SCM_MAKINUM (ind + 1);
+ SCM_SETCAR (p, SCM_MAKINUM (ind + 1));
return c;
}
-#ifdef __STDC__
-static scm_sizet
-stwrite (char *str, scm_sizet siz, scm_sizet num, SCM p)
-#else
+
+static scm_sizet stwrite SCM_P ((char *str, scm_sizet siz, scm_sizet num, SCM p));
+
static scm_sizet
stwrite (str, siz, num, p)
char *str;
scm_sizet siz;
scm_sizet num;
SCM p;
-#endif
{
scm_sizet ind = SCM_INUM (SCM_CAR (p));
scm_sizet len = siz * num;
dst = &(SCM_CHARS (SCM_CDR (p))[ind]);
while (len--)
dst[len] = str[len];
- SCM_CAR (p) = SCM_MAKINUM (ind + siz * num);
+ SCM_SETCAR (p, SCM_MAKINUM (ind + siz * num));
return num;
}
-#ifdef __STDC__
-static int
-stputs (char *s, SCM p)
-#else
+
+static int stputs SCM_P ((char *s, SCM p));
+
static int
stputs (s, p)
char *s;
SCM p;
-#endif
{
stwrite (s, 1, strlen (s), p);
return 0;
}
-#ifdef __STDC__
-static int
-stgetc (SCM p)
-#else
+
+static int stgetc SCM_P ((SCM p));
+
static int
stgetc (p)
SCM p;
-#endif
{
scm_sizet ind = SCM_INUM (SCM_CAR (p));
if (ind >= SCM_ROLENGTH (SCM_CDR (p)))
return EOF;
- SCM_CAR (p) = SCM_MAKINUM (ind + 1);
+ SCM_SETCAR (p, SCM_MAKINUM (ind + 1));
return SCM_ROUCHARS (SCM_CDR (p))[ind];
}
-#ifdef __STDC__
-SCM
-scm_mkstrport (SCM pos, SCM str, long modes, char * caller)
-#else
+
SCM
scm_mkstrport (pos, str, modes, caller)
SCM pos;
SCM str;
long modes;
char * caller;
-#endif
{
SCM z;
SCM stream;
SCM_NEWCELL (z);
SCM_DEFER_INTS;
pt = scm_add_to_port_table (z);
- SCM_CAR (z) = scm_tc16_strport | modes;
+ SCM_SETCAR (z, scm_tc16_strport | modes);
SCM_SETPTAB_ENTRY (z, pt);
SCM_SETSTREAM (z, stream);
SCM_ALLOW_INTS;
}
SCM_PROC(s_call_with_output_string, "call-with-output-string", 1, 0, 0, scm_call_with_output_string);
-#ifdef __STDC__
-SCM
-scm_call_with_output_string (SCM proc)
-#else
+
SCM
scm_call_with_output_string (proc)
SCM proc;
-#endif
{
SCM p;
p = scm_mkstrport(SCM_INUM0, scm_make_string(SCM_MAKINUM(30), SCM_UNDEFINED),
/* Return a Scheme string obtained by printing a given object.
*/
-#ifdef __STDC__
-SCM
-scm_strprint_obj (SCM obj)
-#else
+
SCM
scm_strprint_obj (obj)
SCM obj;
-#endif
{
SCM str;
SCM port;
str = scm_makstr (64, 0);
port = scm_mkstrport (SCM_MAKINUM (0), str, SCM_OPN | SCM_WRTNG, "scm_strprint_obj");
- scm_iprin1 (obj, port, 1);
+ scm_prin1 (obj, port, 1);
{
SCM answer;
SCM_DEFER_INTS;
SCM_PROC(s_call_with_input_string, "call-with-input-string", 2, 0, 0, scm_call_with_input_string);
-#ifdef __STDC__
-SCM
-scm_call_with_input_string (SCM str, SCM proc)
-#else
+
SCM
scm_call_with_input_string (str, proc)
SCM str;
SCM proc;
-#endif
{
SCM p = scm_mkstrport(SCM_INUM0, str, SCM_OPN | SCM_RDNG, s_call_with_input_string);
return scm_apply (proc, p, scm_listofnull);
}
-#ifdef __STDC__
-static int
-noop0 (FILE *stream)
-#else
+
+
+/* Given a null-terminated string EXPR containing a Scheme expression
+ read it, and return it as an SCM value. */
+SCM
+scm_read_0str (expr)
+ char *expr;
+{
+ SCM port = scm_mkstrport (SCM_MAKINUM (0),
+ scm_makfrom0str (expr),
+ SCM_OPN | SCM_RDNG,
+ "scm_eval_0str");
+ SCM form;
+
+ /* Read expressions from that port; ignore the values. */
+ form = scm_read (port);
+
+ scm_close_port (port);
+ return form;
+}
+
+/* Given a null-terminated string EXPR containing Scheme program text,
+ evaluate it, and return the result of the last expression evaluated. */
+SCM
+scm_eval_0str (expr)
+ char *expr;
+{
+ return scm_eval_string (scm_makfrom0str (expr));
+}
+
+
+SCM_PROC (s_eval_string, "eval-string", 1, 0, 0, scm_eval_string);
+
+SCM
+scm_eval_string (string)
+ SCM string;
+{
+ SCM port = scm_mkstrport (SCM_MAKINUM (0), string, SCM_OPN | SCM_RDNG,
+ "scm_eval_0str");
+ SCM form;
+ SCM ans = SCM_UNSPECIFIED;
+
+ /* Read expressions from that port; ignore the values. */
+ while (!SCM_EOF_OBJECT_P (form = scm_read (port)))
+ ans = scm_eval_x (form);
+
+ /* Don't close the port here; if we re-enter this function via a
+ continuation, then the next time we enter it, we'll get an error.
+ It's a string port anyway, so there's no advantage to closing it
+ early. */
+
+ return ans;
+}
+
+
+
+static int noop0 SCM_P ((SCM stream));
+
static int
noop0 (stream)
- FILE *stream;
-#endif
+ SCM stream;
{
return 0;
}
stwrite,
noop0,
stgetc,
+ scm_generic_fgets,
0
};
-#ifdef __STDC__
-void
-scm_init_strports (void)
-#else
+
void
scm_init_strports ()
-#endif
{
#include "strports.x"
}