Hex Artifact Content
Not logged in

Artifact a3d716dbc4f3760ac849bc63817bae3c80b0cd36:


0000: 3b 3b 3b 3b 20 66 6d 74 2d 63 2e 73 63 6d 20 2d  ;;;; fmt-c.scm -
0010: 2d 20 66 6d 74 20 6d 6f 64 75 6c 65 20 66 6f 72  - fmt module for
0020: 20 65 6d 69 74 74 69 6e 67 2f 70 72 65 74 74 79   emitting/pretty
0030: 2d 70 72 69 6e 74 69 6e 67 20 43 20 63 6f 64 65  -printing C code
0040: 0a 3b 3b 0a 3b 3b 20 43 6f 70 79 72 69 67 68 74  .;;.;; Copyright
0050: 20 28 63 29 20 32 30 30 37 20 41 6c 65 78 20 53   (c) 2007 Alex S
0060: 68 69 6e 6e 2e 20 20 41 6c 6c 20 72 69 67 68 74  hinn.  All right
0070: 73 20 72 65 73 65 72 76 65 64 2e 0a 3b 3b 20 42  s reserved..;; B
0080: 53 44 2d 73 74 79 6c 65 20 6c 69 63 65 6e 73 65  SD-style license
0090: 3a 20 68 74 74 70 3a 2f 2f 73 79 6e 74 68 63 6f  : http://synthco
00a0: 64 65 2e 63 6f 6d 2f 6c 69 63 65 6e 73 65 2e 74  de.com/license.t
00b0: 78 74 0a 0a 23 21 72 36 72 73 0a 28 6c 69 62 72  xt..#!r6rs.(libr
00c0: 61 72 79 0a 20 28 66 6d 74 20 63 29 0a 20 28 65  ary. (fmt c). (e
00d0: 78 70 6f 72 74 0a 20 20 66 6d 74 2d 69 6e 2d 6d  xport.  fmt-in-m
00e0: 61 63 72 6f 3f 20 66 6d 74 2d 65 78 70 72 65 73  acro? fmt-expres
00f0: 73 69 6f 6e 3f 20 66 6d 74 2d 72 65 74 75 72 6e  sion? fmt-return
0100: 3f 20 66 6d 74 2d 64 65 66 61 75 6c 74 2d 74 79  ? fmt-default-ty
0110: 70 65 0a 20 20 66 6d 74 2d 6e 65 77 6c 69 6e 65  pe.  fmt-newline
0120: 2d 62 65 66 6f 72 65 2d 62 72 61 63 65 3f 20 66  -before-brace? f
0130: 6d 74 2d 62 72 61 63 65 6c 65 73 73 2d 62 6f 64  mt-braceless-bod
0140: 69 65 73 3f 0a 20 20 66 6d 74 2d 69 6e 64 65 6e  ies?.  fmt-inden
0150: 74 2d 73 70 61 63 65 20 66 6d 74 2d 73 77 69 74  t-space fmt-swit
0160: 63 68 2d 69 6e 64 65 6e 74 2d 73 70 61 63 65 20  ch-indent-space 
0170: 66 6d 74 2d 6f 70 20 66 6d 74 2d 67 65 6e 0a 20  fmt-op fmt-gen. 
0180: 20 63 2d 69 6e 2d 65 78 70 72 20 63 2d 69 6e 2d   c-in-expr c-in-
0190: 73 74 6d 74 20 63 2d 69 6e 2d 74 65 73 74 0a 20  stmt c-in-test. 
01a0: 20 63 2d 70 61 72 65 6e 20 63 2d 6d 61 79 62 65   c-paren c-maybe
01b0: 2d 70 61 72 65 6e 20 63 2d 74 79 70 65 20 63 2d  -paren c-type c-
01c0: 6c 69 74 65 72 61 6c 3f 20 63 2d 6c 69 74 65 72  literal? c-liter
01d0: 61 6c 20 63 68 61 72 2d 3e 63 2d 63 68 61 72 0a  al char->c-char.
01e0: 20 20 63 2d 73 74 72 75 63 74 20 63 2d 75 6e 69    c-struct c-uni
01f0: 6f 6e 20 63 2d 63 6c 61 73 73 20 63 2d 65 6e 75  on c-class c-enu
0200: 6d 20 63 2d 74 79 70 65 64 65 66 20 63 2d 63 61  m c-typedef c-ca
0210: 73 74 0a 20 20 63 2d 65 78 70 72 20 63 2d 65 78  st.  c-expr c-ex
0220: 70 72 2f 73 65 78 70 20 63 2d 61 70 70 6c 79 20  pr/sexp c-apply 
0230: 63 2d 6f 70 20 63 2d 69 6e 64 65 6e 74 20 63 2d  c-op c-indent c-
0240: 63 75 72 72 65 6e 74 2d 69 6e 64 65 6e 74 2d 73  current-indent-s
0250: 74 72 69 6e 67 0a 20 20 63 2d 77 72 61 70 2d 73  tring.  c-wrap-s
0260: 74 6d 74 20 63 2d 6f 70 65 6e 2d 62 72 61 63 65  tmt c-open-brace
0270: 20 63 2d 63 6c 6f 73 65 2d 62 72 61 63 65 0a 20   c-close-brace. 
0280: 20 63 2d 62 6c 6f 63 6b 20 63 2d 62 72 61 63 65   c-block c-brace
0290: 64 2d 62 6c 6f 63 6b 20 63 2d 62 65 67 69 6e 0a  d-block c-begin.
02a0: 20 20 63 2d 66 75 6e 20 63 2d 76 61 72 20 63 2d    c-fun c-var c-
02b0: 70 72 6f 74 6f 74 79 70 65 20 63 2d 70 61 72 61  prototype c-para
02c0: 6d 20 63 2d 70 61 72 61 6d 2d 6c 69 73 74 0a 20  m c-param-list. 
02d0: 20 63 2d 77 68 69 6c 65 20 63 2d 66 6f 72 20 63   c-while c-for c
02e0: 2d 69 66 20 63 2d 73 77 69 74 63 68 0a 20 20 63  -if c-switch.  c
02f0: 2d 63 61 73 65 20 63 2d 63 61 73 65 2f 66 61 6c  -case c-case/fal
0300: 6c 74 68 72 6f 75 67 68 20 63 2d 64 65 66 61 75  lthrough c-defau
0310: 6c 74 0a 20 20 63 2d 62 72 65 61 6b 20 63 2d 63  lt.  c-break c-c
0320: 6f 6e 74 69 6e 75 65 20 63 2d 72 65 74 75 72 6e  ontinue c-return
0330: 20 63 2d 67 6f 74 6f 20 63 2d 6c 61 62 65 6c 0a   c-goto c-label.
0340: 20 20 63 2d 73 74 61 74 69 63 20 63 2d 63 6f 6e    c-static c-con
0350: 73 74 20 63 2d 65 78 74 65 72 6e 20 63 2d 76 6f  st c-extern c-vo
0360: 6c 61 74 69 6c 65 20 63 2d 61 75 74 6f 20 63 2d  latile c-auto c-
0370: 72 65 73 74 72 69 63 74 20 63 2d 69 6e 6c 69 6e  restrict c-inlin
0380: 65 0a 20 20 63 2b 2b 20 63 2d 2d 20 63 2b 20 63  e.  c++ c-- c+ c
0390: 2d 20 63 2a 20 63 2f 20 63 25 20 63 26 20 63 5e  - c* c/ c% c& c^
03a0: 20 63 7e 20 63 21 20 63 26 26 20 63 3c 3c 20 63   c~ c! c&& c<< c
03b0: 3e 3e 20 63 3d 3d 20 63 21 3d 20 3b 20 20 7c 63  >> c== c!= ;  |c
03c0: 5c 7c 7c 20 20 7c 63 5c 7c 5c 7c 7c 0a 20 20 63  \||  |c\|\||.  c
03d0: 3c 20 63 3e 20 63 3c 3d 20 63 3e 3d 20 63 3d 20  < c> c<= c>= c= 
03e0: 63 2b 3d 20 63 2d 3d 20 63 2a 3d 20 63 2f 3d 20  c+= c-= c*= c/= 
03f0: 63 25 3d 20 63 26 3d 20 63 5e 3d 20 63 3c 3c 3d  c%= c&= c^= c<<=
0400: 20 63 3e 3e 3d 20 3b 2b 2b 63 20 2d 2d 63 20 3b   c>>= ;++c --c ;
0410: 20 20 7c 63 5c 7c 3d 7c 0a 20 20 63 2b 2b 2f 70    |c\|=|.  c++/p
0420: 6f 73 74 20 63 2d 2d 2f 70 6f 73 74 20 63 2e 20  ost c--/post c. 
0430: 63 2d 3e 0a 20 20 63 2d 62 69 74 2d 6f 72 20 63  c->.  c-bit-or c
0440: 2d 6f 72 20 63 2d 62 69 74 2d 6f 72 3d 0a 20 20  -or c-bit-or=.  
0450: 63 70 70 2d 69 66 20 63 70 70 2d 69 66 64 65 66  cpp-if cpp-ifdef
0460: 20 63 70 70 2d 69 66 6e 64 65 66 20 63 70 70 2d   cpp-ifndef cpp-
0470: 65 6c 69 66 20 63 70 70 2d 65 6e 64 69 66 20 63  elif cpp-endif c
0480: 70 70 2d 65 6c 73 65 20 63 70 70 2d 75 6e 64 65  pp-else cpp-unde
0490: 66 0a 20 20 63 70 70 2d 69 6e 63 6c 75 64 65 20  f.  cpp-include 
04a0: 63 70 70 2d 64 65 66 69 6e 65 20 63 70 70 2d 77  cpp-define cpp-w
04b0: 72 61 70 2d 68 65 61 64 65 72 20 63 70 70 2d 70  rap-header cpp-p
04c0: 72 61 67 6d 61 20 63 70 70 2d 6c 69 6e 65 0a 20  ragma cpp-line. 
04d0: 20 63 70 70 2d 65 72 72 6f 72 20 63 70 70 2d 77   cpp-error cpp-w
04e0: 61 72 6e 69 6e 67 20 63 70 70 2d 73 74 72 69 6e  arning cpp-strin
04f0: 67 69 66 79 20 63 70 70 2d 73 79 6d 2d 63 61 74  gify cpp-sym-cat
0500: 0a 20 20 63 2d 63 6f 6d 6d 65 6e 74 20 63 2d 62  .  c-comment c-b
0510: 6c 6f 63 6b 2d 63 6f 6d 6d 65 6e 74 20 63 2d 61  lock-comment c-a
0520: 74 74 72 69 62 75 74 65 0a 20 20 29 0a 0a 20 28  ttribute.  ).. (
0530: 69 6d 70 6f 72 74 20 28 63 68 65 7a 73 63 68 65  import (chezsche
0540: 6d 65 29 20 0a 09 20 28 66 6d 74 20 66 6d 74 29  me) .. (fmt fmt)
0550: 0a 09 20 28 73 72 66 69 20 70 72 69 76 61 74 65  .. (srfi private
0560: 20 69 6e 63 6c 75 64 65 29 0a 09 20 28 6f 6e 6c   include).. (onl
0570: 79 20 28 73 72 66 69 20 73 31 20 6c 69 73 74 73  y (srfi s1 lists
0580: 29 20 65 76 65 72 79 29 0a 09 20 28 6f 6e 6c 79  ) every).. (only
0590: 20 28 73 72 66 69 20 73 31 33 20 73 74 72 69 6e   (srfi s13 strin
05a0: 67 73 29 20 73 75 62 73 74 72 69 6e 67 2f 73 68  gs) substring/sh
05b0: 61 72 65 64 20 73 74 72 69 6e 67 2d 69 6e 64 65  ared string-inde
05c0: 78 20 73 74 72 69 6e 67 2d 69 6e 64 65 78 2d 72  x string-index-r
05d0: 69 67 68 74 29 29 0a 0a 20 28 69 6e 63 6c 75 64  ight)).. (includ
05e0: 65 2f 72 65 73 6f 6c 76 65 20 28 22 66 6d 74 22  e/resolve ("fmt"
05f0: 29 20 22 66 6d 74 2d 63 2e 73 63 6d 22 29 0a 0a  ) "fmt-c.scm")..
0600: 20 29 0a                                          ).