Guest User

Untitled

a guest
Jul 17th, 2018
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.36 KB | None | 0 0
  1. ;; skkserv
  2. (require-extension (srfi 1 48))
  3.  
  4. (require "util.scm")
  5. (require "socket.scm")
  6. (require "i18n.scm")
  7. (require "input-parse.scm")
  8. (require-dynlib "look")
  9.  
  10. (define socks (tcp-listen "localhost" 1178))
  11. (define dict (string-append (home-directory (user-name)) "/.uim.d/dict/SKK-JISYO"))
  12. (define cand-max 1000)
  13.  
  14. ;; XXX: srfi-13
  15. (define (string-concatenate-reverse strs final end)
  16. (define (string-xcopy! target tstart s sfrom sto)
  17. (do ((i sfrom (inc i)) (j tstart (inc j)))
  18. ((>= i sto))
  19. (string-set! target j (string-ref s i))))
  20. (if (null? strs) (substring final 0 end)
  21. (let*
  22. ((total-len
  23. (let loop ((len end) (lst strs))
  24. (if (null? lst) len
  25. (loop (+ len (string-length (car lst))) (cdr lst)))))
  26. (result (make-string total-len)))
  27. (let loop ((len end) (j total-len) (str final) (lst strs))
  28. (string-xcopy! result (- j len) str 0 len)
  29. (if (null? lst) result
  30. (loop (string-length (car lst)) (- j len)
  31. (car lst) (cdr lst)))))))
  32.  
  33. (define (skk-parse-line line)
  34. (define (skk-key-state port)
  35. (next-token '(#\space #\tab) '(#\space *eof*) (N_ "Invalid skk entry") port))
  36. (define (skk-entry-state port)
  37. (and (eq? #\/ (skip-while '(#\space #\tab) port))
  38. (let loop ((val (next-token '(#\/) '(#\/ *eof*) (N_ "Invalid skk value") port))
  39. (rest '()))
  40. (if (or (eof-object? val)
  41. (string=? val ""))
  42. (reverse rest)
  43. (loop (next-token '(#\/) '(#\/ *eof*) (N_ "Invalid skk value") port)
  44. (cons val rest))))))
  45. (call-with-input-string line
  46. (lambda (port)
  47. (and-let* ((key (skk-key-state port))
  48. (value (skk-entry-state port)))
  49. (values key value)))))
  50.  
  51. (define (skkserv:receive-search s exact-match?)
  52. (define (read-word c rest)
  53. (cond ((eof-object? c)
  54. (values #f (list->string (reverse rest))))
  55. ((eq? (car c) #\space)
  56. (values #t (list->string (reverse rest))))
  57. (else
  58. (read-word (file-read s 1) (cons (car c) rest)))))
  59. (define (normalize sl) ;; drop noise
  60. (let ((ent (find-tail (lambda (c) (eq? c #\/))
  61. (reverse (string->list sl)))))
  62. (if ent
  63. (list->string (reverse ent))
  64. "")))
  65. (receive (cont? ret)
  66. (read-word (file-read s 1) '())
  67. (let ((look (look-lib-look #f #f cand-max dict ret))) ;; return raw text (text1 text2 ...)
  68. (if (null? look)
  69. (begin
  70. ;; not found
  71. (file-write s '(#\4 #\space))
  72. #t)
  73. (let* ((recv-cand (filter-map (lambda (ent)
  74. (receive (key value)
  75. (skk-parse-line (string-append ret (normalize ent)))
  76. (if exact-match?
  77. (if (string=? key ret)
  78. value
  79. #f)
  80. value)))
  81. look))
  82. (recv-string (string-join (apply append recv-cand) "/")))
  83. ;;(print recv-string)
  84. (if (string=? recv-string "")
  85. (file-write s '(#\4 #\space))
  86. (begin
  87. (file-write s '(#\1 #\/))
  88. (file-write s (string->list recv-string))
  89. (file-write s '(#\/ #\newline))))
  90. #t)))))
  91.  
  92.  
  93. (define (skkserv:receive-version s)
  94. ;;(file-write s (string->list (uim-version))))
  95. (file-write s '(#\1 #\. #\0 #\space)))
  96.  
  97. (define (skkserv:receive-hostname s)
  98. ;; XXX
  99. (file-write s (string->list (format "~a:~a: " "localhost" "0.0.0.0"))))
  100.  
  101. (define (read-req s)
  102. (define (reqno? c)
  103. (find (lambda (x) (eq? c x)) '(#\0 #\1 #\2 #\3 #\4)))
  104. (let loop ((c (file-read s 1)))
  105. (if (or (eof-object? c)
  106. (reqno? (car c)))
  107. c
  108. (loop (file-read s 1)))))
  109.  
  110. (define server (make-tcp-server
  111. (lambda (s)
  112. ;;(display "connected.\n")
  113. (let loop ((req (read-req s)))
  114. (if (eof-object? req)
  115. (file-close s)
  116. (let ((reqno (car req)))
  117. ;;(write `(reqno ,reqno))(newline)
  118. (cond ((eq? reqno #\0)
  119. (file-close s))
  120. ((eq? reqno #\1)
  121. (if (skkserv:receive-search s #t)
  122. (loop (read-req s))
  123. (file-close s)))
  124. ((eq? reqno #\2)
  125. (skkserv:receive-version s)
  126. (loop (read-req s)))
  127. ((eq? reqno #\3)
  128. (skkserv:receive-hostname s)
  129. (loop (read-req s)))
  130. ((eq? reqno #\4)
  131. (if (skkserv:receive-search s #f)
  132. (loop (read-req s))
  133. (file-close s)))
  134. (else
  135. (loop (read-req s))))))))))
  136.  
  137. ;;(display "skkserver starting.\n")
  138. (server socks)
Add Comment
Please, Sign In to add comment