[comp.lang.c++] C++ Pretty Printers

warsaw@nlm.nih.gov (Barry A. Warsaw) (12/21/90)

Last week I posted a request to c.l.c++ asking for C++ pretty
printers.  Well I suppose C++ is being introduced into the mainstream
so rapidly that there just isn't much currently available -- I
received more responses asking for summaries than I did with actual
information!  Anyway, thanks to Tom Ngo who told me about c++2latex
(see below). As you'll see, there are some hidden things in SunOS 4.1,
indicating perhaps that the state of C++ pretty printers and other
support tools will become more widely available as C++ takes over the
world :-).

1. C++ code reformatters

There are currently no reformatting filters which understand C++
syntax along the lines of cb and indent for C.  Both of these tools
perform rather poorly when gobbing down C++. Specifically constructs
such as "::" and "//" don't get handled very well. Something along the
lines of indent++ which understands these special C++ constructs and
provides all the reformatting capabilities that indent does would fit
the bill nicely. This is what I really thought of when I asked for
pretty printers, but I guess I'll have to wait.


2. C++ code stylizers

What I mean by this are programs which will take C++ code and somehow
highlight certain constructs such as comment blocks and keywords,
outputting printer-ready files.  Here there appears to be a few more
options.  The first comes with SunOS (4.1 atleast): vgrind.  The
manpage for vgrind(1) doesn't indicate that it understands the C++
language, but the -lC++ switch works on my machine, though I've heard
that others with SunOS4.1 haven't be able to get it to work. Vgrind
uses a file /usr/lib/vgrindsdef. Check for the section beginning with
C++|c++:.  If they're in there (after the yacc definitions), then
-lC++ should work.  I suspect the manpage will eventually catch up
with reality...

Tom Ngo describes a package written by Norbert Kiesel called c++2latex
which does a similar thing as vgrind, but spits out complete LaTeX
files. It seems to have a few more highlighting options than vgrind,
such as the ability to specify the font for keywords, cpp directives,
and string constants.  Apparently it can be got from:

	tupac-amaru.informatik.rwth-aachen.de (192.35.229.9)

In the file: C++2LaTeX-1.1.PL.1.tar.Z. There must be Stateside ftp
sites which have this, but I haven't yet gone poking around, either on
tupac or perhaps uunet. Tom also sent me some "trivial patches to
c++2latex.l which make it recognize #line directives and not double
space // comments."  I include this patch at after my .siggy.

From the manpage Tom sent me:

C++2LATEX(1)      ConvexOS Programmer's Manual      C++2LATEX(1)

NAME
     c++2latex - C/C++ to LaTeX converter

SYNOPSIS
     c++2latex [-a] [-c] [-h] [-i length] [-o [-H font] [-K font]
     [-P font] [+ansi-c] [+complete-file] [+header] [+indentation
     length] [+output path] [+font-size size] [+pipe] [+comment-
     font [+keyword-font font] [+cpp-font font] [+header-font
     font] [+string-font font] [+tabstop wide] [+version] [path]

DESCRIPTION
     c++2latex is a tool for generating LateX source from ANSI-C
     or C++ programs.  It recogizes all keywords, strings, and
     comments. These recognized parts can be set in different
     fonts.  c++2latex can generate complete LaTeX files which
     can directly passed through latex(1) or parts of LaTeX files
     which can be included in other files (either direct or by
     the \input or \include commands).


3. C++ editing

Finally, though this isn't strictly what I had in mind regarding
pretty printers, and most of you probably know these exist, I thought
it might be worth mentioning that there are at least two different
versions of a C++ mode for GNUemacs. lisp-dir-apropos shows one
version by David Detlefs, et al, and another by Bruce Eckel and Thomas
Keffer.  Here are the relevent details:

c++-mode-2 (1.0)  87-12-08
	 Bruce Eckel,Thomas Keffer, <eckel@beluga.ocean.washington.edu,uw-beaver!beluga!eckel,keffer@sperm.ocean.washington.edu>
	 tut.cis.ohio-state.edu:pub/gnu/emacs/elisp-archive/as-is/c++-mode-2.el.Z
	 Another C++ major mode.
c++-mode		  89-11-07
	 Dave Detlefs, et al, <dld@cs.cmu.edu>
	 tut.cis.ohio-state.edu:pub/gnu/emacs/elisp-archive/modes/c++-mode.el.Z
	 C++ major mode.

Personally, I'm using Detlefs' C++ mode and in general it works very
nice. I've noticed a few pecularities and have emailed to the authors,
but haven't heard back yet. I have yet to try c++-mode-2 so I can't
comment on that, but c++-mode works just fine for the most part.

Well that's about the state of affairs as of 17:31pm 20-Dec-1990. No
doubt this information will be obsolete tomorrow morning, the way C++
usage is growing in leaps and bounds! :-).  Hope this was helpful, and
please post any new findings or corrections to the whole newsgroup.
Judging from my incoming mail, there's lots of us who are interested.

Waiting anxiously to taste Saber-C++,
-Barry

NAME: Barry A. Warsaw                 USMAIL: National Library of Medicine
TELE: (301) 496-1936                          Lister Hill National Center for
INET: warsaw@nlm.nih.gov                          Biomedical Communications
UUCP: uunet!nlm.nih.gov!warsaw                Information Technology Branch
                                              8600 Rockville Pike
                                              Bldg. 38A, Rm. 7s722
                                              Bethesda, Md.  20894

===========================================================================
*** /tmp/,RCSt1019814	Tue Nov 27 13:08:59 1990
--- c++2latex.l	Tue Nov 27 13:07:45 1990
***************
*** 89,94 ****
--- 89,95 ----
  "#"[ \t]*"elif"		|
  "#"[ \t]*"else"		|
  "#"[ \t]*"error"	|
+ "#"[ \t]*"line"		|
  "#"[ \t]*"endif"	CPP;
  
  
***************
*** 206,212 ****
  <BCOMMENT>^[ \t]+		IND;
  <BCOMMENT>.			SUB (yytext);
  
! <CPLUSPLUS>"//".*$		{ OUT ("{$//$\\"); 
  				  OUT (comment_font); OUT ("{}");
  			          SUB (yytext + 2);
  				  OUT ("}\\mbox{}\\\\\n"); }
--- 208,214 ----
  <BCOMMENT>^[ \t]+		IND;
  <BCOMMENT>.			SUB (yytext);
  
! <CPLUSPLUS>"//".*"\n"		{ OUT ("{$//$\\"); 
  				  OUT (comment_font); OUT ("{}");
  			          SUB (yytext + 2);
  				  OUT ("}\\mbox{}\\\\\n"); }