File: parse-macros.lisp

package info (click to toggle)
cl-umlisp 1%3A2007ac.2-6
  • links: PTS, VCS
  • area: contrib
  • in suites: bullseye, buster, jessie, jessie-kfreebsd, stretch, wheezy
  • size: 296 kB
  • ctags: 418
  • sloc: lisp: 3,593; makefile: 55
file content (102 lines) | stat: -rw-r--r-- 4,095 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
;;;; -*- Mode: Lisp; Syntax: ANSI-Common-Lisp; Base: 10; Package: umlisp -*-
;;;; *************************************************************************
;;;; FILE IDENTIFICATION
;;;;
;;;; Name:     parse-macros.lisp
;;;; Purpose:  Macros for UMLS file parsing
;;;; Author:   Kevin M. Rosenberg
;;;; Created:  Apr 2000
;;;;
;;;; $Id$
;;;;
;;;; This file, part of UMLisp, is
;;;;    Copyright (c) 2000-2006 by Kevin M. Rosenberg, M.D.
;;;;
;;;; UMLisp users are granted the rights to distribute and use this software
;;;; as governed by the terms of the GNU General Public License.
;;;; *************************************************************************

(in-package #:umlisp)

(defun read-umls-line (strm &optional (eof 'eof))
  "Read a line from a UMLS stream, split into fields"
  (let ((line (read-line strm nil eof)))
    (if (eq line eof)
        eof
        (delimited-string-to-list line #\| t))))

(defun source-files (path)
  (if (probe-file path)
      (list path)
    (sort
     (directory (make-pathname :defaults path
                               :type :wild
                               :name (concatenate 'string (pathname-name path)
                                                  (aif (pathname-type path)
                                                       (concatenate 'string "." it)
                                                       ""))))
     #'(lambda (a b)
         (string-lessp (pathname-type a) (pathname-type b))))))

(defmacro with-buffered-reading-umls-file ((line path) &body body)
  "Opens a UMLS and processes each parsed line with (body) argument"
  (let ((ustream (gensym "STRM-"))
        (buffer (gensym "BUF-"))
        (eof (gensym "EOF-"))
        (files (gensym "FILES-")))
    `(let ((,eof (gensym "EOFSYM-"))
           (,buffer (make-fields-buffer))
           (,files (source-files ,path)))
       (with-open-file (,ustream (first ,files) :direction :input
                        #+(and clisp unicode) :external-format
                        #+(and clisp unicode) charset:utf-8)
         (do ((,line (read-buffered-fields ,buffer ,ustream #\| ,eof)
                     (read-buffered-fields ,buffer ,ustream #\| ,eof)))
             ((eq ,line ,eof) t)
           (setq ,line (coerce ,line 'list))
           (print ,line)
           ,@body)))))

(defmacro with-reading-umls-file ((line path) &body body)
  "Opens a UMLS and processes each parsed line with (body) argument"
  (let ((ustream (gensym "STRM-"))
        (eof (gensym "EOF-"))
        (files (gensym "FILES-")))
    `(let ((,eof (gensym "EOFSYM-"))
           (,files (source-files ,path)))
      (unless ,files
        (error "Can't find files for ~A~%" (namestring ,path)))
      (with-open-file (,ustream (first ,files) :direction :input
                       #+(and clisp unicode) :external-format
                       #+(and clisp unicode) charset:utf-8)
        (do ((,line (read-umls-line ,ustream ,eof)
                    (read-umls-line ,ustream ,eof)))
            ((eq ,line ,eof) t)
          (locally (declare (type list ,line))
                   ,@body))))))

(defmacro with-umls-ufile ((line ufile) &body body)
  "Opens a UMLS and processes each parsed line with (body) argument"
  `(with-reading-umls-file (,line (ufile-pathname ,ufile))
     ,@body))

(defmacro with-umls-file ((line ufile) &body body)
  "Opens a UMLS and processes each parsed line with (body) argument"
  `(with-reading-umls-file (,line (umls-pathname ,ufile))
     ,@body))

(defmacro with-buffered-umls-file ((line filename) &body body)
  "Opens a UMLS and processes each parsed line with (body) argument"
  (let ((ustream (gensym "STRM-"))
        (buffer (gensym "BUF-"))
        (eof (gensym "EOF-")))
    `(let ((,buffer (make-fields-buffer))
           (,eof (gensym "EOFSYM-")))
      (with-open-file
          (,ustream (umls-pathname ,filename) :direction :input)
        (do ((,line (read-buffered-fields ,buffer ,ustream #\| ,eof)
                    (read-buffered-fields ,buffer ,ustream #\| ,eof)))
            ((eq ,line ,eof) t)
          ,@body)))))