c-io.scm 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  1. ; Part of Scheme 48 1.9. See file COPYING for notices and license.
  2. ; Authors: Richard Kelsey, Marcus Crestani
  3. (define (write-c-io-call call port name . args)
  4. (format port name)
  5. (writec port #\()
  6. (for-each (lambda (arg)
  7. (cond ((string? arg)
  8. (format port arg))
  9. ((variable? arg)
  10. (c-variable arg port))
  11. (else
  12. (c-value (call-arg call arg) port))))
  13. args)
  14. (writec port #\)))
  15. ; stdin, stdout, and stderr cannot be variables because they may be macros in C.
  16. (define-c-generator stdin #t
  17. (lambda (call port indent)
  18. (format port "stdin")))
  19. (define-c-generator stdout #t
  20. (lambda (call port indent)
  21. (format port "stdout")))
  22. (define-c-generator stderr #t
  23. (lambda (call port indent)
  24. (format port "stderr")))
  25. ; char eof? status
  26. (define-c-generator read-char #f
  27. (lambda (call port indent)
  28. (indent-to port indent)
  29. (let ((vars (lambda-variables (call-arg call 0))))
  30. (write-c-io-call call port "PS_READ_CHAR" 1 ", "
  31. (car vars) ", " (cadr vars) ", " (caddr vars)))))
  32. (define-c-generator peek-char #f
  33. (lambda (call port indent)
  34. (indent-to port indent)
  35. (let ((vars (lambda-variables (call-arg call 0))))
  36. (write-c-io-call call port "PS_PEEK_CHAR" 1 ", "
  37. (car vars) ", " (cadr vars) ", " (caddr vars)))))
  38. (define-c-generator read-integer #f
  39. (lambda (call port indent)
  40. (indent-to port indent)
  41. (let ((vars (lambda-variables (call-arg call 0))))
  42. (write-c-io-call call port "PS_READ_INTEGER" 1 ", "
  43. (car vars) ", " (cadr vars) ", " (caddr vars)))))
  44. (define-c-generator write-char #f
  45. (lambda (call port indent)
  46. (indent-to port indent)
  47. (let ((vars (lambda-variables (call-arg call 0))))
  48. (if (used? (car vars))
  49. (write-c-io-call call port "PS_WRITE_CHAR" 1 ", " 2 ", " (car vars))
  50. (begin
  51. (display "{ long ignoreXX;" port)
  52. (indent-to port indent)
  53. (write-c-io-call call port "PS_WRITE_CHAR" 1 ", " 2 ", ignoreXX")
  54. (display " }" port))))))
  55. (define-c-generator write-string #t
  56. (lambda (call port indent)
  57. (write-c-io-call call port "ps_write_string" 0 ", " 1)))
  58. (define-c-generator write-integer #t
  59. (lambda (call port indent)
  60. (write-c-io-call call port "ps_write_integer" 0 ", " 1)))
  61. (define-c-generator force-output #t
  62. (lambda (call port indent)
  63. (write-c-io-call call port "ps_flush" 0)))
  64. (define-c-generator read-block #f
  65. (lambda (call port indent)
  66. (let ((vars (lambda-variables (call-arg call 0))))
  67. (c-assign-to-variable (car vars) port indent)
  68. (write-c-io-call call port "ps_read_block" 1 ", ((char *) " 2 "), " 3
  69. ", &" (cadr vars) ", &" (caddr vars))
  70. (write-char #\; port))))
  71. (define-c-generator write-block #t
  72. (lambda (call port indent)
  73. (write-c-io-call call port "ps_write_block" 0 ", ((char *) " 1 ")"
  74. ", " 2)))
  75. ; (read-block (lambda (okay? eof? got) ...) port buffer count)
  76. ;
  77. ;(define-c-generator read-block #f
  78. ; (lambda (call port indent)
  79. ; (let* ((cont (call-arg call 0))
  80. ; (vars (lambda-variables cont)))
  81. ; ;; got = ps_read(port, buffer, count, &okay?, &eof?);
  82. ; (c-assign-to-variable (caddr vars) port indent)
  83. ; (write-c-io-call call port
  84. ; "ps_read" 1 ", (void *)" 2 ", " 3 ", &" (car vars)
  85. ; ", &" (cadr vars))
  86. ; (write-char #\; port))))
  87. ;
  88. ;; (write-block (lambda (okay? sent) ...) port buffer count)
  89. ;
  90. ;(define-c-generator write-block #f
  91. ; (lambda (call port indent)
  92. ; (let* ((cont (call-arg call 0))
  93. ; (vars (lambda-variables cont)))
  94. ; ;; sent = ps_write(port, buffer, count, &okay?);
  95. ; (c-assign-to-variable (cadr vars) port indent)
  96. ; (write-c-io-call call port
  97. ; "ps_write" 1 ", (void *)" 2 ", " 3 ", &" (car vars))
  98. ; (write-char #\; port))))
  99. (define-c-generator open-input-file #f
  100. (lambda (call port indent)
  101. (let ((vars (lambda-variables (call-arg call 0))))
  102. (c-assign-to-variable (car vars) port indent)
  103. (write-c-io-call call port "ps_open_input_file" 1 ", &" (cadr vars))
  104. (write-char #\; port))))
  105. (define-c-generator open-output-file #f
  106. (lambda (call port indent)
  107. (let ((vars (lambda-variables (call-arg call 0))))
  108. (c-assign-to-variable (car vars) port indent)
  109. (write-c-io-call call port "ps_open_output_file" 1 ", &" (cadr vars))
  110. (write-char #\; port))))
  111. (define-c-generator close-input-port #t
  112. (lambda (call port indent)
  113. (write-c-io-call call port "ps_close" 0)))
  114. (define-c-generator close-output-port #t
  115. (lambda (call port indent)
  116. (write-c-io-call call port "ps_close" 0)))
  117. (define-c-generator abort #t
  118. (lambda (call port indent)
  119. (format port "(exit -1)")))
  120. (define-c-generator error #f
  121. (lambda (call port indent)
  122. (indent-to port indent)
  123. (format port "ps_error(")
  124. (c-value (call-arg call 1) port)
  125. (format port ", ~D" (- (call-arg-count call) 2))
  126. (do ((i 2 (+ i 1)))
  127. ((= i (call-arg-count call)))
  128. (format port ", ")
  129. (c-value (call-arg call i) port))
  130. (format port ");")))
  131. (define-c-generator error-string #t
  132. (lambda (call port indent)
  133. (write-c-io-call call port "ps_error_string" 0)))
  134. ; (c-e-v <proc> <nargs> <pointer-to-args>)
  135. (define-c-generator call-external-value #t
  136. (lambda (call port indent)
  137. (format port "((long(*)())")
  138. (c-value (call-arg call 0) port)
  139. (format port ")(")
  140. (c-value (call-arg call 1) port)
  141. (format port ", ")
  142. (c-value (call-arg call 2) port)
  143. (writec port #\))))
  144. (define-c-generator call-external-value-2 #t
  145. (lambda (call port indent)
  146. (format port "((long(*)())")
  147. (c-value (call-arg call 0) port)
  148. (format port ")(")
  149. (c-value (call-arg call 1) port)
  150. (format port ", ")
  151. (c-value (call-arg call 2) port)
  152. (writec port #\))))