-/* Copyright (C) 1995,1996 Free Software Foundation, Inc.
+/* Copyright (C) 1995,1996,1998 Free Software Foundation, Inc.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
*
* 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>
+#endif
\f
*
*/
-#ifdef __STDC__
-static int
-prinstpt (SCM exp, SCM port, int writing)
-#else
+
static int
-prinstpt (exp, port, writing)
- SCM exp;
- SCM port;
- int writing;
-#endif
+prinstpt (SCM exp, SCM port, scm_print_state *pstate)
{
scm_prinport (exp, port, "string");
return !0;
}
-#ifdef __STDC__
-static int
-stputc (int c, SCM p)
-#else
+
static int
-stputc (c, p)
- int c;
- SCM p;
-#endif
+stputc (int c, SCM port)
{
+ SCM p = SCM_STREAM (port);
scm_sizet ind = SCM_INUM (SCM_CAR (p));
SCM_DEFER_INTS;
if (ind >= SCM_LENGTH (SCM_CDR (p)))
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 (str, siz, num, p)
- char *str;
- scm_sizet siz;
- scm_sizet num;
- SCM p;
-#endif
+stwrite (char *str,
+ scm_sizet siz,
+ scm_sizet num,
+ SCM port)
{
+ SCM p = SCM_STREAM (port);
+
scm_sizet ind = SCM_INUM (SCM_CAR (p));
scm_sizet len = siz * num;
char *dst;
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 (s, p)
- char *s;
- SCM p;
-#endif
+stputs (char *s, SCM port)
{
- stwrite (s, 1, strlen (s), p);
+ stwrite (s, 1, strlen (s), port);
return 0;
}
-#ifdef __STDC__
-static int
-stgetc (SCM p)
-#else
+
static int
-stgetc (p)
- SCM p;
-#endif
+stgetc (SCM port)
{
+ SCM p = SCM_STREAM (port);
+
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"
}