core: Add string-ref.
authorJan Nieuwenhuizen <janneke@gnu.org>
Thu, 15 Nov 2018 23:15:50 +0000 (00:15 +0100)
committerJan Nieuwenhuizen <janneke@gnu.org>
Thu, 15 Nov 2018 23:15:50 +0000 (00:15 +0100)
* src/strings.c (string_ref): New function.
* mes/module/mes/scm.mes (string-ref): Remove.

mes/module/mes/scm.mes
src/mes.c
src/strings.c

index 3ca92ca16abc2fc536510def19fa526925fc8b9e..c4d78035b40b1cb0917ccce4101ec6566137b149 100644 (file)
 (define (make-string n . fill)
   (list->string (apply make-list n fill)))
 
-(define (string-ref s k)
-  (list-ref (string->list s) k))
-
 (define (string-set! s k v)
   (list->string (list-set! (string->list s) k v)))
 
index e1752c9470fae3dd07d6d5014f047c44b0b9790f..32bfd7ee7dbad68ade86b36b53b64f97b180ad3b 100644 (file)
--- a/src/mes.c
+++ b/src/mes.c
@@ -1258,6 +1258,8 @@ eval_apply ()
           goto begin;
         }
     }
+  // write_error_ (CAR (r1));
+  // eputs ("\n");
   push_cc (CAR (r1), r1, r0, cell_vm_apply2);
   goto eval;
  apply2:
index 9073c2a9853543da8d506602301937523968154f..86828461ce6c2f82803a116ebe225d9dcea5ef6f 100644 (file)
@@ -18,6 +18,8 @@
  * along with GNU Mes.  If not, see <http://www.gnu.org/licenses/>.
  */
 
+#include <string.h>
+
 #define MAX_STRING 4096
 
 char const*
@@ -267,3 +269,16 @@ string_length (SCM string)
   assert (TYPE (string) == TSTRING);
   return MAKE_NUMBER (LENGTH (string));
 }
+
+SCM
+string_ref (SCM str, SCM k)
+{
+  assert (TYPE (str) == TSTRING);
+  assert (TYPE (k) == TNUMBER);
+  size_t size = LENGTH (str);
+  size_t i = VALUE (k);
+  if (i >= size)
+    error (cell_symbol_system_error, cons (MAKE_STRING0 ("value out of range"), k));
+  char const *p = CSTRING (str);
+  return MAKE_CHAR (p[i]);
+}