(define (hex2:immediate o)
(if hex? (string-append "%0x" (dec->hex o))
- (format #f "%~a" o)))
+ (string-append "%" (number->string o))))
(define (hex2:immediate1 o)
(if hex? (string-append "!0x" (dec->hex o))
- (format #f "!~a" o)))
+ (string-append "!" (number->string o))))
(define (object->M1 o)
(let* ((functions (assoc-ref o 'functions))
(strings (filter (lambda (g) (and (pair? g) (eq? (car g) #:string))) global-names)))
(define (string->label o)
(let ((index (list-index (lambda (s) (equal? s o)) strings)))
- (format #f "_string_~a_~a" file-name index)))
+ (if index
+ (string-append "_string_" file-name "_" (number->string index))
+ "")))
(define (text->M1 o)
- (pmatch o
- ;; FIXME
- ((#:address (#:string ,string)) (hex2:address (string->label `(#:string ,string))))
- ((#:string (#:address ,address)) (hex2:address address))
- ((#:address (#:address ,address)) (hex2:address address))
-
- ((#:string ,string) (hex2:address (string->label o)))
- ((#:address ,address) (hex2:address address))
- ((#:offset ,offset) (hex2:offset offset))
- ((#:offset1 ,offset1) (hex2:offset1 offset1))
- ((#:immediate ,immediate) (hex2:immediate immediate))
- ((#:immediate1 ,immediate1) (hex2:immediate1 immediate1))
- (_ (cond ((char? o) (text->M1 (char->integer o)))
- ((string? o) (format #f "~a" o))
- ((number? o) (let ((o (if (< o #x80) o (- o #x100))))
- (if hex? (string-append "!0x"
- (if (and (>= o 0) (< o 16)) "0" "")
- (number->string o 16))
- (string-append "!" (number->string o)))))
- (else (format #f "~a" o))))))
+ (cond
+ ((char? o) (text->M1 (char->integer o)))
+ ((string? o) o)
+ ((symbol? o) (symbol->string o))
+ ((number? o) (let ((o (if (< o #x80) o (- o #x100))))
+ (if hex? (string-append "!0x"
+ (if (and (>= o 0) (< o 16)) "0" "")
+ (number->string o 16))
+ (string-append "!" (number->string o)))))
+ ((and (pair? o) (keyword? (car o)))
+ (pmatch o
+ ;; FIXME
+ ((#:address (#:string ,string)) (hex2:address (string->label `(#:string ,string))))
+ ((#:string (#:address ,address)) (hex2:address address))
+ ((#:address (#:address ,address)) (hex2:address address))
+ ((#:string ,string) (hex2:address (string->label o)))
+ ((#:address ,address) (hex2:address address))
+ ((#:offset ,offset) (hex2:offset offset))
+ ((#:offset1 ,offset1) (hex2:offset1 offset1))
+ ((#:immediate ,immediate) (hex2:immediate immediate))
+ ((#:immediate1 ,immediate1) (hex2:immediate1 immediate1))))
+ ((pair? o) (string-join (map text->M1 o)))))
(define (write-function o)
(let ((name (car o))
(text (cdr o)))
(define (line->M1 o)
(cond ((eq? (car o) #:label)
- (format #t ":~a" (cadr o)))
+ (core:display (string-append ":" (cadr o))))
((eq? (car o) #:comment)
- (format #t "\t\t\t\t\t# ~a" (cadr o)))
+ (core:display (string-append "\t\t\t\t\t# " (text->M1 (cadr o)))))
((or (string? (car o)) (symbol? (car o)))
- (format #t "\t~a" (string-join (map text->M1 o) " ")))
+ (core:display (string-append "\t" (string-join (map text->M1 o) " "))))
(else (error "line->M1 invalid line:" o)))
(newline))
- (format #t "\n\n:~a\n" name)
+ (core:display (string-append "\n\n:" name "\n"))
(for-each line->M1 (apply append text))))
(define (write-global o)
(define (labelize o)
(string-label (string->label label))
(string? (not (equal? string-label "_string_#f")))
(global? (member label global-names)))
- (if (or global? string?) (format #f "&~a" label)
+ (if (or global? string?) (string-append "&" label)
(begin (if (not function?) (stderr "warning: unresolved label: ~s\n" label))
- (format #f "&~a" label))))))
+ (string-append "&" label))))))
(let* ((label (if (not (and (pair? (car o)) (eq? (caar o) #:string))) (car o)
- (string->label (car o))))
+ (string->label (car o))))
(data (cdr o))
(data (filter-map labelize data))
(len (length data))