;; Copyright (C) 2014-2021 Free Software Foundation, Inc.
;;
;; This program is free software; you can redistribute it and/or modify
;; it under the terms of the GNU General Public License as published by
;; the Free Software Foundation; either version 3 of the License, or
;; (at your option) any later version.
;;
;; This program is distributed in the hope that it will be useful,
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
;; GNU General Public License for more details.
;;
;; You should have received a copy of the GNU General Public License
;; along with this program.  If not, see <http://www.gnu.org/licenses/>.

(use-modules (gdb) (gdb printing))

(define (make-pp_s-printer val)
  (make-pretty-printer-worker
   #f
   (lambda (printer)
     (let ((m (value-field val "m")))
       (format #f "m=<~A>" m)))
   #f))

(define (make-pp_ss-printer val)
  (make-pretty-printer-worker
   #f
   (lambda (printer) "super struct")
   (lambda (printer)
     (make-iterator val
		    (make-field-iterator (value-type val))
		    (lambda (iter)
		      (let ((field (iterator-next!
				    (iterator-progress iter))))
			(if (end-of-iteration? field)
			    field
			    (let ((name (field-name field)))
			      (cons name (value-field val name))))))))))

(define (get-type-for-printing val)
  "Return type of val, stripping away typedefs, etc."
  (let ((type (value-type val)))
    (if (= (type-code type) TYPE_CODE_REF)
	(set! type (type-target type)))
    (type-strip-typedefs (type-unqualified type))))

(define (make-pretty-printer-dict)
  (let ((dict (make-hash-table)))
    (hash-set! dict "struct s" make-pp_s-printer)
    (hash-set! dict "s" make-pp_s-printer)
    (hash-set! dict "struct ss" make-pp_ss-printer)
    (hash-set! dict "ss" make-pp_ss-printer)
    dict))

(define *pretty-printer*
 (make-pretty-printer
  "pretty-printer-test"
  (let ((pretty-printers-dict (make-pretty-printer-dict)))
    (lambda (matcher val)
      "Look-up and return a pretty-printer that can print val."
      (let ((type (get-type-for-printing val)))
	(let ((typename (type-tag type)))
	  (if typename
	      (let ((printer-maker (hash-ref pretty-printers-dict typename)))
		(and printer-maker (printer-maker val)))
	      #f)))))))

(append-pretty-printer! #f *pretty-printer*)
