Revert "update upstream sources"
[clinton/guile-figl.git] / maint / update-enumerations
CommitLineData
092cacd7
AW
1#!/usr/bin/env guile
2!#
3
62c85b51
DH
4;;; figl
5;;; Copyright (C) 2013 Andy Wingo <wingo@pobox.com>
6;;; Copyright (C) 2013 Daniel Hartwig <mandyke@gmail.com>
7;;;
8;;; Figl is free software: you can redistribute it and/or modify it
9;;; under the terms of the GNU Lesser General Public License as
10;;; published by the Free Software Foundation, either version 3 of the
11;;; License, or (at your option) any later version.
12;;;
13;;; Figl is distributed in the hope that it will be useful, but WITHOUT
14;;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
15;;; or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General
16;;; Public License for more details.
17;;;
18;;; You should have received a copy of the GNU Lesser General Public
19;;; License along with this program. If not, see
20;;; <http://www.gnu.org/licenses/>.
21
22;;; Commentary:
23;;
24;; Generate Scheme enumerations for the GL API.
25;;
26;;; Code:
27
092cacd7
AW
28(use-modules (figl parse)
29 (figl config)
30 (ice-9 match)
31 (sxml fold)
32 ((srfi srfi-1) #:select (append-map))
94e407a1 33 (srfi srfi-69) ; alist->hash-table
092cacd7
AW
34 (texinfo serialize)
35 (texinfo plain-text)
36 (ice-9 pretty-print))
37
38(setlocale LC_ALL "")
39
40(print-disable 'escape-newlines)
41
42(define (list-intersperse src-l elem)
43 (if (null? src-l) src-l
44 (let loop ((l (cdr src-l)) (dest (cons (car src-l) '())))
45 (if (null? l) (reverse dest)
46 (loop (cdr l) (cons (car l) (cons elem dest)))))))
47
48(define (module-name->scm-name mod-name)
49 (string-join (list (abs-top-srcdir)
50 "figl"
51 (symbol->string mod-name)
52 "enums.scm")
53 "/"))
54
092cacd7
AW
55(define (module-name->texi-name mod-name)
56 (in-vicinity
57 (in-vicinity (abs-top-srcdir) "doc")
029af955
AW
58 (string-append "low-level-" (symbol->string mod-name) "-enums.texi")))
59
60(define (strip-bit name)
61 (let ((str (symbol->string name)))
62 (cond
63 ((string-suffix? "-bit" str)
64 (string->symbol (substring str 0 (- (string-length str) 4))))
65 ((string-suffix? "-bits" str)
66 (string->symbol (substring str 0 (- (string-length str) 5))))
67 (else #f))))
68
94e407a1
DH
69(define type-map-table (make-parameter #f))
70
71(define (use-type-map tm)
72 (type-map-table (alist->hash-table tm eq? hashq)))
73
74(define (type-map type)
75 (hash-table-ref/default (type-map-table) type #f))
76
77;; TODO: Some guesswork is applied here due to inconsistency between
78;; the various .spec and type map files. Ideally, the type map can
79;; determine whether a type is a bitfield or enum. However, some
80;; definitions in enum.spec use a different name to those in gl.spec
81;; and gl.tm. For example, BufferAccessMask is known as
82;; ARB_map_buffer_range in enum.spec.
83;;
84;; Perhaps provide an additional map to translate these odd enum.spec
85;; names.
86
029af955 87(define (bitfield? enum)
94e407a1
DH
88 (let* ((type (make-gl-param-type (gl-enumeration-category enum)
89 'in
90 'value))
91 (mapped-type (type-map type)))
92 (if mapped-type
93 (eq? (gl-param-type-type mapped-type) 'GLbitfield)
94 ;; otherwise, resort to guesswork
95 (and-map (match-lambda ((name . value) (strip-bit name)))
96 (gl-enumeration-values enum)))))
092cacd7
AW
97
98(define (write-scm mod-name enums port)
99 (display "\
100;;; figl -*- mode: scheme; coding: utf-8 -*-
101;;; Copyright (C) 2013 Andy Wingo <wingo@pobox.com>
62c85b51 102;;; Copyright (C) 2013 Daniel Hartwig <mandyke@gmail.com>
092cacd7
AW
103;;;
104;;; Figl is free software: you can redistribute it and/or modify it
105;;; under the terms of the GNU Lesser General Public License as
106;;; published by the Free Software Foundation, either version 3 of the
107;;; License, or (at your option) any later version.
108;;;
109;;; Figl is distributed in the hope that it will be useful, but WITHOUT
110;;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
111;;; or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General
112;;; Public License for more details.
113;;;
114;;; You should have received a copy of the GNU Lesser General Public
115;;; License along with this program. If not, see
116;;; <http://www.gnu.org/licenses/>.
117;;;
118;;; Derived from the API specifications at www.opengl.org/registry/api/.
119;;;
120;;; Automatically generated; you probably don't want to edit this. To
121;;; update, run \"make update-enums\" in the top-level build tree.
122;;;
123
124" port)
125 (pretty-print
126 `(define-module (figl ,mod-name enums)
127 #:use-module (figl runtime)
128 #:export ,(map gl-enumeration-category enums))
129 port)
130 (newline port)
131 (for-each
132 (lambda (enum)
092cacd7
AW
133 (pretty-print
134 (if (bitfield? enum)
135 `(define-bitfield ,(gl-enumeration-category enum)
136 ,@(map (match-lambda
94e407a1
DH
137 ((name . value) (list (or (strip-bit name) name)
138 value)))
092cacd7
AW
139 (gl-enumeration-values enum)))
140 `(define-enumeration ,(gl-enumeration-category enum)
141 ,@(map (match-lambda
142 ((name . value) (list name value)))
143 (gl-enumeration-values enum))))
144 port)
145 (newline port))
146 enums))
147
029af955 148(define (write-texi mod-name enums port)
b6b1f58d
DH
149 ;; FIXME: stexi->texi seems to have some issues with multiline
150 ;; comments, otherwise this notice should appear in the fragment
151 ;; itself. Maybe I am not doing it right.
152 (display
153 (string-append
154 "@c This is part of the Figl Reference Manual.\n"
155 "@c Copyright (c) 2013 Andy Wingo and others\n"
156 "@c See the file figl.texi for copying conditions.\n")
157 port)
092cacd7
AW
158 (display
159 (stexi->texi
160 `(*fragment*
161 (para "The functions from this section may be had by loading "
162 "the module:")
029af955 163 (example "(use-modules (figl " ,(object->string mod-name) " enums)")
092cacd7 164 ,@(map
029af955
AW
165 (lambda (enum)
166 (if (bitfield? enum)
167 `(defmac (% (name ,(symbol->string (gl-enumeration-category enum)))
168 (arguments "bit..."))
169 (para
170 "Bitfield constructor. The symbolic " (var "bit")
171 " arguments are replaced with their corresponding numeric "
172 "values and combined with " (code "logior") " at "
173 "compile-time. The symbolic arguments known to this "
174 "bitfield constructor are:")
175 (para
176 ,@(list-intersperse
177 (map (lambda (name)
94e407a1
DH
178 `(code ,(symbol->string (or (strip-bit name)
179 name))))
029af955
AW
180 (map car (gl-enumeration-values enum)))
181 ", ")
182 "."))
183 `(defmac (% (name ,(symbol->string (gl-enumeration-category enum)))
184 (arguments "enum"))
185 (para
c7b5f548 186 "Enumerated value. The symbolic " (var "enum") " argument "
029af955
AW
187 "is replaced with its corresponding numeric value at "
188 "compile-time. The symbolic arguments known to this "
189 "enumerated value form are:")
190 (para
191 ,@(list-intersperse
192 (map (lambda (name) `(code ,(symbol->string name)))
193 (map car (gl-enumeration-values enum)))
194 ", ")
195 "."))))
196 enums)))
092cacd7
AW
197 port))
198
199(define (write-enumerations mod-name enums)
200 (call-with-output-file (module-name->scm-name mod-name)
201 (lambda (port)
202 (write-scm mod-name enums port)))
092cacd7
AW
203 (call-with-output-file (module-name->texi-name mod-name)
204 (lambda (port)
205 (write-texi mod-name enums port))))
206
207(define* (main arg0)
94e407a1 208 (use-type-map (parse-gl-type-map "gl.tm"))
704372ea 209 (write-enumerations 'gl (parse-gl-enumerations "enum.spec"))
94e407a1 210 (use-type-map (parse-gl-type-map "glx.tm"))
704372ea 211 (write-enumerations 'glx (parse-gl-enumerations "glxenum.spec")))
092cacd7
AW
212
213(when (batch-mode?)
214 (apply main (command-line)))