* coop.c, iselect.c: Since thread switches are now performed with
[bpt/guile.git] / libguile / strports.c
index ae9e53e..4e0ea1a 100644 (file)
@@ -12,7 +12,8 @@
  * 
  * 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"
 
@@ -227,6 +228,61 @@ scm_call_with_input_string (str, proc)
 }
 
 
+
+/* 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 
@@ -248,6 +304,7 @@ scm_ptobfuns scm_stptob =
   stwrite,
   noop0,
   stgetc,
+  scm_generic_fgets,
   0
 };