Revision: 6550
Author: [email protected]
Date: Tue Jul 20 03:49:16 2010
Log: * uim/fileio.c (c_file_position_whence, c_file_position_set):
* scm/fileio.scm (file-position):
  - New function.
* uim/fileio.c (uim_plugin_instance_init, uim_plugin_instance_quit):
  - Add scheme function (file-position-set!) and (file-position-whence?).

http://code.google.com/p/uim/source/detail?r=6550

Modified:
 /trunk/scm/fileio.scm
 /trunk/uim/fileio.c

=======================================
--- /trunk/scm/fileio.scm       Thu May  6 09:38:31 2010
+++ /trunk/scm/fileio.scm       Tue Jul 20 03:49:16 2010
@@ -37,6 +37,7 @@

 (define file-open-flags-alist (file-open-flags?))
 (define file-open-mode-alist (file-open-mode?))
+(define file-position-whence-alist (file-position-whence?))
 (define file-poll-flags-alist (file-poll-flags?))

 (define (file-set-flag l alist)
@@ -51,6 +52,9 @@
 (define (file-poll-flags-number l)
   (file-set-flag l file-poll-flags-alist))

+(define (file-position field)
+ (file-position-set! field 0 (assq-cdr '$SEEK_CUR file-position-whence-alist)))
+
 (define (string->file-buf str)
   (string->list str))
 (define (file-buf->string buf)
@@ -63,6 +67,42 @@
 (define (file-write-string s str)
   (file-write s (string->file-buf str)))

+(define (file-read-string-with-terminate-char socket term-char)
+  (let loop ((c (file-read socket 1))
+             (rest '()))
+    (cond ((eof-object? c)
+           (uim-notify-fatal (N_ "unexpected terminate string."))
+           "")
+          ((eq? (car c) term-char)
+           (file-buf->string (reverse rest)))
+          (else
+           (loop (file-read socket 1) (cons (car c) rest))))))
+
+(define (file-read-string-with-terminate-chars socket term-chars)
+  (let ((buf (file-read socket (length term-chars))))
+    (cond ((eof-object? buf)
+           (raise (N_ "unexpected terminate string.")))
+          ((equal? term-chars buf)
+           "")
+          (else
+           (let loop ((c (file-read socket 1))
+                      (buf buf)
+                      (rest '()))
+             (cond ((eof-object? c)
+                    (raise (N_ "unexpected terminate string.")))
+                   ((equal? term-chars (append (cdr buf) c))
+                    (file-buf->string (append rest (list (car buf)))))
+                   (else
+                    ;; enqueue
+                    (loop (file-read socket 1)
+                          (append (cdr buf) c)
+                          (append rest (list (car buf)))))))))))
+
+(define (file-read-string-with-terminate socket term-char)
+  (if (char? term-char)
+      (file-read-string-with-terminate-char socket term-char)
+      (file-read-string-with-terminate-chars socket term-char)))
+
 (define-record-type file-port
   (make-file-port context fd inbufsiz inbuf read write) file-port?
   (context  context?  context!)
=======================================
--- /trunk/uim/fileio.c Sun Apr  4 20:35:54 2010
+++ /trunk/uim/fileio.c Tue Jul 20 03:49:16 2010
@@ -228,6 +228,33 @@
   return ret_;
 }

+const static opt_args position_whence[] = {
+  { SEEK_SET, "$SEEK_SET" },
+  { SEEK_CUR, "$SEEK_CUR" },
+  { SEEK_END, "$SEEK_END" },
+  { 0, 0 }
+};
+
+static uim_lisp uim_lisp_position_whence;
+static uim_lisp
+c_file_position_whence(void)
+{
+  return uim_lisp_position_whence;
+}
+
+static uim_lisp
+c_file_position_set(uim_lisp fildes_, uim_lisp offset_, uim_lisp whence_)
+{
+  int ret = 0;
+
+  ret = lseek(C_INT(fildes_), C_INT(offset_), C_INT(whence_));
+  if (ret == -1) {
+    uim_lisp err_ = LIST3(fildes_, offset_, whence_);
+    ERROR_OBJ(strerror(errno), err_);
+  }
+  return MAKE_INT(ret);
+}
+
 static uim_lisp
 c_duplicate2_fileno(uim_lisp oldd_, uim_lisp newd_)
 {
@@ -351,6 +378,11 @@
   uim_scm_init_proc1("file-close", c_file_close);
   uim_scm_init_proc2("file-read", c_file_read);
   uim_scm_init_proc2("file-write", c_file_write);
+  uim_scm_init_proc3("file-position-set!", c_file_position_set);
+  uim_scm_init_proc0("file-position-whence?", c_file_position_whence);
+  uim_lisp_position_whence = make_arg_list(position_whence);
+  uim_scm_gc_protect(&uim_lisp_position_whence);
+
   uim_scm_init_proc2("duplicate2-fileno", c_duplicate2_fileno);

   uim_scm_init_proc2("file-poll", c_file_poll);
@@ -366,5 +398,6 @@
 {
   uim_scm_gc_unprotect(&uim_lisp_open_flags);
   uim_scm_gc_unprotect(&uim_lisp_open_mode);
+  uim_scm_gc_unprotect(&uim_lisp_position_whence);
   uim_scm_gc_unprotect(&uim_lisp_poll_flags);
 }

Reply via email to