Index: doc/uC++toCFA/.gitignore
===================================================================
--- doc/uC++toCFA/.gitignore	(revision 697c957be6bf6545b625badf5b5dcf7f766e5f9d)
+++ doc/uC++toCFA/.gitignore	(revision 697c957be6bf6545b625badf5b5dcf7f766e5f9d)
@@ -0,0 +1,4 @@
+# generated by latex
+build/*
+*.pdf
+*.ps
Index: doc/uC++toCFA/Makefile
===================================================================
--- doc/uC++toCFA/Makefile	(revision 697c957be6bf6545b625badf5b5dcf7f766e5f9d)
+++ doc/uC++toCFA/Makefile	(revision 697c957be6bf6545b625badf5b5dcf7f766e5f9d)
@@ -0,0 +1,92 @@
+## Define the configuration variables.
+
+Build = build
+Figures = figures
+Macros = ../LaTeXmacros
+TeXLIB = .:${Macros}:${Build}:
+LaTeX  = TEXINPUTS=${TeXLIB} && export TEXINPUTS && latex -halt-on-error -output-directory=${Build}
+BibTeX = BIBINPUTS=../bibliography: && export BIBINPUTS && bibtex
+
+MAKEFLAGS = --no-print-directory --silent #
+VPATH = ${Build} ${Figures}
+
+## Define the text source files.
+
+SOURCES = ${addsuffix .tex, \
+uC++toCFA \
+../refrat/keywords \
+../refrat/operidents \
+}
+
+FIGURES = ${addsuffix .tex, \
+}
+
+PICTURES = ${addsuffix .pstex, \
+}
+
+PROGRAMS = ${addsuffix .tex, \
+}
+
+GRAPHS = ${addsuffix .tex, \
+}
+
+## Define the documents that need to be made.
+
+DOCUMENT = uC++toCFA.pdf
+BASE = ${basename ${DOCUMENT}}
+
+# Directives #
+
+.PHONY : all clean					# not file names
+
+all : ${DOCUMENT}
+
+clean :
+	@rm -frv ${DOCUMENT} ${BASE}.ps ${Build}
+
+# File Dependencies #
+
+build/version: ../../configure | ${Build}
+	../../configure --version | grep "cfa-cc configure" | grep -oEe "([0-9]+\.)+[0-9]+" > $@
+
+${DOCUMENT} : ${BASE}.ps
+	ps2pdf -dPDFSETTINGS=/prepress $<
+
+${BASE}.ps : ${BASE}.dvi
+	dvips ${Build}/$< -o $@
+
+${BASE}.dvi : Makefile ${GRAPHS} ${PROGRAMS} ${PICTURES} ${FIGURES} ${SOURCES} \
+		${Macros}/common.sty ${Macros}/lstlang.sty ${Macros}/indexstyle ../bibliography/pl.bib build/version | ${Build}
+	# Conditionally create an empty *.ind (index) file for inclusion until makeindex is run.
+	if [ ! -r ${basename $@}.ind ] ; then touch ${Build}/${basename $@}.ind ; fi
+	# Must have *.aux file containing citations for bibtex
+	if [ ! -r ${basename $@}.aux ] ; then ${LaTeX} ${basename $@}.tex ; fi
+	-${BibTeX} ${Build}/${basename $@}
+	# Some citations reference others so run again to resolve these citations
+	${LaTeX} ${basename $@}.tex
+#	-${BibTeX} ${Build}/${basename $@}
+	# Make index from *.aux entries and input index at end of document
+	makeindex -s ${Macros}/indexstyle ${Build}/${basename $@}.idx
+	# Run again to finish citations
+	${LaTeX} ${basename $@}.tex
+	# Run again to get index title into table of contents
+#	${LaTeX} ${basename $@}.tex
+
+## Define the default recipes.
+
+${Build} :
+	mkdir -p ${Build}
+
+%.tex : %.fig | ${Build}
+	fig2dev -L eepic $< > ${Build}/$@
+
+%.ps : %.fig | ${Build}
+	fig2dev -L ps $< > ${Build}/$@
+
+%.pstex : %.fig | ${Build}
+	fig2dev -L pstex $< > ${Build}/$@
+	fig2dev -L pstex_t -p ${Build}/$@ $< > ${Build}/$@_t
+
+# Local Variables: #
+# compile-command: "make" #
+# End: #
Index: doc/uC++toCFA/uC++toCFA.tex
===================================================================
--- doc/uC++toCFA/uC++toCFA.tex	(revision 697c957be6bf6545b625badf5b5dcf7f766e5f9d)
+++ doc/uC++toCFA/uC++toCFA.tex	(revision 697c957be6bf6545b625badf5b5dcf7f766e5f9d)
@@ -0,0 +1,580 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -*- Mode: Latex -*- %%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% Cforall Version 1.0.0 Copyright (C) 2016 University of Waterloo
+%%
+%% The contents of this file are covered under the licence agreement in the
+%% file "LICENCE" distributed with Cforall.
+%%
+%% user.tex --
+%%
+%% Author           : Peter A. Buhr
+%% Created On       : Wed Apr  6 14:53:29 2016
+%% Last Modified By : Peter A. Buhr
+%% Last Modified On : Sun Sep 17 09:10:12 2023
+%% Update Count     : 5883
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% requires tex packages: texlive-base texlive-latex-base tex-common texlive-humanities texlive-latex-extra texlive-fonts-recommended
+
+\documentclass[11pt]{article}
+
+\makeatletter
+\def\@maketitle{%
+    \newpage
+    \null
+%   \vskip 2em%
+    \begin{center}%
+	\let \footnote \thanks
+        {\LARGE\bf \@title \par}%
+        \@ifundefined{@author}{}
+        {
+            \ifx\@empty\@author
+            \else
+                \vskip 1.5em%
+                {\large
+                    \lineskip .5em%
+                    \begin{tabular}[t]{c}%
+                        \@author
+                    \end{tabular}%
+                    \par
+                }%
+	    \fi
+        }%
+        \ifx\@empty\@date
+        \else
+            \vskip 1em%
+	    {\large \@date}%
+        \fi
+    \end{center}%
+    \par
+%   \vskip 1.5em
+}%maketitle
+\makeatother
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% Latex packages used in the document.
+%\usepackage[T1]{fontenc}                                % allow Latin1 (extended ASCII) characters
+%\usepackage{textcomp}
+%\usepackage[latin1]{inputenc}
+
+\usepackage{fullpage,times,comment}
+\usepackage{epic,eepic}
+\usepackage{upquote}									% switch curled `'" to straight
+\usepackage[labelformat=simple,aboveskip=0pt,farskip=0pt]{subfig}
+\renewcommand{\thesubfigure}{\alph{subfigure})}
+\usepackage{latexsym}                                   % \Box glyph
+\usepackage{mathptmx}                                   % better math font with "times"
+\usepackage[usenames]{color}
+\usepackage[pagewise]{lineno}
+\renewcommand{\linenumberfont}{\scriptsize\sffamily}
+\input{common}											% common CFA document macros
+\usepackage[dvips,plainpages=false,pdfpagelabels,pdfpagemode=UseNone,colorlinks=true,pagebackref=true,linkcolor=blue,citecolor=blue,urlcolor=blue,pagebackref=true,breaklinks=true]{hyperref}
+\usepackage{breakurl}
+
+\renewcommand\footnoterule{\kern -3pt\rule{0.3\linewidth}{0.15pt}\kern 2pt}
+\newcommand{\uC}{$\mu$\CC}
+
+% Default underscore is too low and wide. Cannot use lstlisting "literate" as replacing underscore
+% removes it as a variable-name character so keywords in variables are highlighted. MUST APPEAR
+% AFTER HYPERREF.
+\renewcommand{\textunderscore}{\leavevmode\makebox[1.2ex][c]{\rule{1ex}{0.075ex}}}
+
+\setlength{\topmargin}{-0.45in}							% move running title into header
+\setlength{\headsep}{0.25in}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\setlength{\gcolumnposn}{3in}
+\CFAStyle												% use default CFA format-style
+\lstset{language=CFA}									% CFA default lnaguage
+\lstnewenvironment{C++}[1][]                            % use C++ style
+{\lstset{language=C++,escapechar=\$,mathescape=false,moredelim=**[is][\protect\color{red}]{@}{@},#1}}{}
+\lstnewenvironment{uC++}[1][]
+{\lstset{language=uC++,escapechar=\$,mathescape=false,moredelim=**[is][\protect\color{red}]{@}{@},#1}}{}
+
+\newsavebox{\myboxA}
+\newsavebox{\myboxB}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% Names used in the document.
+\newcommand{\Version}{\input{build/version}}
+\newcommand{\Textbf}[2][red]{{\color{#1}{\textbf{#2}}}}
+\newcommand{\Emph}[2][red]{{\color{#1}\textbf{\emph{#2}}}}
+\newcommand{\R}[1]{{\color{red}#1}}
+\newcommand{\RB}[1]{\Textbf{#1}}
+\newcommand{\B}[1]{{\Textbf[blue]{#1}}}
+\newcommand{\G}[1]{{\Textbf[OliveGreen]{#1}}}
+\newcommand{\Sp}{\R{\textvisiblespace}}
+\newcommand{\KWC}{K-W C\xspace}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\setcounter{secnumdepth}{3}                             % number subsubsections
+\setcounter{tocdepth}{3}                                % subsubsections in table of contents
+\makeindex
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\title{\vspace*{-0.5in}
+\CC/\uC to \CFA Cheat Sheet}
+%\author{Peter A. Buhr}
+\date{}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\begin{document}
+\pagestyle{headings}
+% changed after setting pagestyle
+\renewcommand{\sectionmark}[1]{\markboth{\thesection\quad #1}{\thesection\quad #1}}
+\renewcommand{\subsectionmark}[1]{\markboth{\thesubsection\quad #1}{\thesubsection\quad #1}}
+
+%\linenumbers                                            % comment out to turn off line numbering
+
+\maketitle
+\vspace*{-0.55in}
+
+\section{Introduction}
+
+\CFA is NOT an object-oriented programming-language.
+\CFA uses parametric polymorphism and allows overloading of variables and routines:
+\begin{cfa}
+int i;  char i;  double i;		// overload name i
+int i();  double i();  char i();
+i += 1;			$\C[1.5in]{// int i}$
+i += 1.0;		$\C{// double i}$
+i += 'a'; 		$\C{// char i}$
+int j = i();	$\C{// int i()}$
+double j = i();	$\C{// double i();}$
+char j = i();	$\C{// char i()}\CRT$
+\end{cfa}
+\CFA has rebindable references.
+
+\begin{cquote}
+\begin{tabular}{l|l}
+\multicolumn{2}{l}{\lstinline{	int x = 1, y = 2, * p1x = &x, * p1y = &y, ** p2i = &p1x,}} \\
+\multicolumn{2}{l}{\lstinline{\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ && r1x = x, & r1y = y, && r2i = r1x;}} \\
+\begin{uC++}
+**p2i = 3;
+p2i = &p1y;
+**p2i = 3;
+p1x = p1y;
+**p2i = 4;
+p1x = @nullptr@;
+\end{uC++}
+&
+\begin{cfa}
+r2i = 3; $\C[1.0in]{// change x}$
+&r2i = &r1y; $\C{// change p2i / r2i}$
+r2i = 3; $\C{// change y}$
+&r1x = &r1y; $\C{// change p1x / r1x}$
+r2i = 4; $\C{// change y}$
+&r1x = @0p@; $\C{// reset}\CRT$
+\end{cfa}
+\end{tabular}
+\end{cquote}
+Non-rebindable reference (\CC reference) is a @const@ reference (@const@ pointer).
+\begin{cfa}
+int & @const@ cr = x; // must initialize, no null pointer
+int & @const@ & @const@ crcr = cr; // generalize
+\end{cfa}
+Aggregate qualification is reduced or eliminated by opening scopes using the @with@ clause.
+\begin{cfa}
+struct S { int i; int j; double m; };  // field i has same type in structures S and T
+struct T { int i; int k; int m; };
+void foo( S s, T t ) @with(s, t)@ {   // open structure scope s and t in parallel
+	j + k;				$\C[1.6in]{// unambiguous, s.j + t.k}$
+	m = 5.0;			$\C{// unambiguous, s.m = 5.0}$
+	m = 1;				$\C{// unambiguous, t.m = 1}$
+	int a = m;			$\C{// unambiguous, a = t.m}$
+	double b = m;		$\C{// unambiguous, b = s.m}$
+	int c = s.i + t.i;	$\C{// unambiguous with qualification}$
+	(double)m;			$\C{// unambiguous with cast s.m}\CRT$
+}
+\end{cfa}
+\noindent
+In subsequent code examples, the left example is \CC/\uC and the right example is \CFA.
+
+
+\section{Looping}
+
+\begin{cquote}
+\begin{tabular}{l|l}
+\begin{uC++}
+for ( ;; ) { ... } / while ( true ) { ... }
+for ( int i = 0; i < 10; i += 1 ) { ... }
+for ( int i = 5; i < 15; i += 2 ) { ... }
+int i = 0
+for ( i = 0; i < 10; i += 1 ) { ... }
+if ( i == 10 ) { ... }
+\end{uC++}
+&
+\begin{cfa}
+for () { ... } / while () { ... }
+for ( 10 ) { ... } / for ( i; 10 ) { ... }
+for ( i; 5~15~2 ) { ... }
+
+for ( i; 10 ) { ... }
+else { ... } // i == 10
+\end{cfa}
+\end{tabular}
+\end{cquote}
+
+
+\section{Exceptions}
+
+Currently, \CFA uses macros @ExceptionDecl@ and @ExceptionInst@ to declare and instantiate an exception.
+\begin{cquote}
+\begin{tabular}{l|ll}
+\begin{uC++}
+
+struct E {		// local or global scope
+	... // exception fields
+};
+try {
+	...
+	if ( ... ) _Resume E( /* initialization */ );
+	if ( ... ) _Throw E( /* initialization */ );
+	...
+} _CatchResume( E & ) { // should be reference
+	...
+} catch( E & ) {
+	...
+}
+\end{uC++}
+&
+\begin{cfa}
+#include <Exception.hfa>
+@ExceptionDecl@( E,		// must be global scope
+	... // exception fields
+);
+try {
+	...
+	if ( ... ) throwResume @ExceptionInst@( E, /* intialization */ );
+	if ( ... ) throw @ExceptionInst@( E, /* intialization */ );
+	...
+} catchResume( E * ) { // must be pointer
+	...
+} catch( E * ) {
+	...
+}
+\end{cfa}
+\end{tabular}
+\end{cquote}
+
+
+\section{Stream I/O}
+
+\CFA output streams automatically separate values and insert a newline at the end of the print.
+
+\begin{cquote}
+\begin{tabular}{l|l}
+\begin{uC++}
+#include <@iostream@>
+using namespace std;
+int i;   double d;   char c;
+cin >> i >> d >> c;
+cout << i << ' ' << d << ' ' << c | endl;
+\end{uC++}
+&
+\begin{cfa}
+#include <@fstream.hfa@>
+
+int i;   double d;   char c;
+sin | i | d | c;
+sout | i | d | c
+\end{cfa}
+\end{tabular}
+\end{cquote}
+
+
+\section{String}
+
+\begin{cquote}
+\begin{tabular}{l|l}
+\multicolumn{2}{l}{\lstinline{string s1, s2;}} \\
+\begin{uC++}
+s1 = "hi";
+s2 = s1;
+s1 += s2;
+s1 == s2; s1 != s2;
+s1 < s2; s1 <= s2; s1 > s2; s1 >= s2;
+s1.length();
+s1[3];
+s1.substr( 2 ); s1.substr( 2, 3 );
+s1.replace( 2, 5, s2 );
+s1.find( s2 ), s1.rfind( s2 );
+s1.find_first_of( s2 ); s1.find_last_of( s2 );
+s1.find_first_not_of(s2 ); s1.find_last_not_of( s2 );
+getline( cin, s1 );
+cout << s1 << endl;
+\end{uC++}
+&
+\begin{cfa}
+s1 = "hi";
+s2 = s1;
+s1 += s2;
+s1 == s2; s1 != s2;
+s1 < s2; s1 <= s2; s1 > s2; s1 >= s2;
+size( s1 );
+s1[3];
+s1( 2 ); s1( 2, 3 );
+//s1.replace( 2, 5, s2 );
+find( s1, s2 ), rfind( s1, s2 );
+find_first_of( .substr, s2 ); s1.find_last_of( s2 );
+s1.find_first_not_of(s2 ); s1.find_last_not_of( s2 );
+sin | getline( s1 );
+sout | s1;
+\end{cfa}
+\end{tabular}
+\end{cquote}
+
+
+\section{Constructor / Destructor}
+
+\begin{cquote}
+\begin{tabular}{l|l}
+\begin{uC++}
+struct S {
+	... // fields
+	@S@(...) { ... }
+	@~S@(...) { ... }
+};
+\end{uC++}
+&
+\begin{cfa}
+struct S {
+	... // fields
+};
+@?{}@( @S & s,@ ...) { ... }
+@^?{}@( @S & s@ ) { ... }
+\end{cfa}
+\end{tabular}
+\end{cquote}
+
+
+\section{\texorpdfstring{Structures (object-oriented \protect\vs routine style)}{Structures (object-oriented vs. routine style)}}
+
+\begin{cquote}
+\begin{tabular}{l|l}
+\begin{uC++}
+struct S {
+	int i = 0;
+	int setter( int j ) { int t = i; i = j; return t; }
+	int getter() { return i; }
+};
+
+S s;
+@s.@setter( 3 );  // object-oriented call
+int k = @s.@getter();
+\end{uC++}
+&
+\begin{cfa}
+struct S {
+	int i;
+};
+void ?{}( S & s ) { s.i = 0; }
+int setter( @S & s,@ int j ) @with(s)@ { int t = i; i = j; return t; }
+int getter( @S & s@ ) @with(s)@ { return i; }
+S s;
+setter( @s,@ 3 );  // normal routine call
+int k = getter( @s@ );
+\end{cfa}
+\end{tabular}
+\end{cquote}
+
+
+\section{\texorpdfstring{\lstinline{uNoCtor}}{uNoCtor}}
+
+\begin{cquote}
+\begin{tabular}{l|l}
+\begin{uC++}
+struct S {
+	int i;
+	S( int i ) { S::i = i; cout << S::i << endl; }
+};
+@uNoCtor<S>@ s[10];
+int main() {
+	for ( int i = 0; i < 10; i += 1 ) {
+		s[i].ctor( i );
+	}
+	for ( int i = 0; i < 10; i += 1 ) {
+		cout << s[i]@->@i << endl;
+	}
+}
+\end{uC++}
+&
+\begin{cfa}
+struct S {
+	int i;
+};
+void ?{}( S & s, int i ) { s.i = i; sout | s.i; }
+S s[10] @$\color{red}@$= {}@;
+int main() {
+	for ( i; 10 ) {
+		?{}( s[i], i );  // call constructor
+	}
+	for ( i; 10 ) {
+		sout | s[i]@.@i; // dot not arrow
+	}
+}
+\end{cfa}
+\end{tabular}
+\end{cquote}
+
+
+\section{Coroutines}
+
+\begin{cquote}
+\begin{tabular}{l|ll}
+\begin{uC++}
+
+_Coroutine C {
+	// private coroutine fields
+	void main() {
+		... suspend(); ...
+		... _Resume E( ... ) _At partner;
+	}
+  public:
+	void mem( ... ) {
+		... resume() ...
+	}
+};
+\end{uC++}
+&
+\begin{cfa}
+#include <$coroutine$.hfa>
+coroutine C {
+	// private coroutine fields
+
+};
+void main( C & c ) {
+	... suspend; ... // keyword not routine
+	... resumeAt( partner, ExceptionInst( E, ... ) );
+}
+void mem( C & c, ... ) {
+	... resume(); ...
+}
+\end{cfa}
+\\
+\multicolumn{2}{l}{\lstinline{C c;}}
+\end{tabular}
+\end{cquote}
+
+
+\section{Locks}
+
+\begin{cquote}
+\begin{tabular}{l|ll}
+\begin{uC++}
+
+uOwnerLock m;
+uCondLock s;
+bool avail = true;
+m.acquire();
+if ( ! avail ) s.wait( m );
+else {
+	avail = false;
+	m.release();
+}
+@osacquire( cout )@ << i << endl;
+\end{uC++}
+&
+\begin{cfa}
+#include <locks.hfa>
+owner_lock m;
+condition_variable( owner_lock ) s;
+bool avail = true;
+lock( m );
+if ( ! avail ) wait( s, m );
+else {
+	avail = false;
+	unlock( m );
+}
+@mutex( sout )@ sout | i;  // safe I/O
+\end{cfa}
+\end{tabular}
+\end{cquote}
+
+
+\section{Monitors}
+
+\begin{cquote}
+\begin{tabular}{l|ll}
+\begin{uC++}
+
+@_Monitor@ M {
+	@uCondition@ c;
+	bool avail = true;
+  public:
+
+	void rtn() {
+		if ( ! avail ) c.wait();
+		else avail = false;
+	}
+};
+\end{uC++}
+&
+\begin{cfa}
+#include <$monitor$.hfa>
+@monitor@ M {
+	@condition@ c;
+	bool avail;
+};
+void ?{}( M & m ) { m.avail = true; }
+void rtn( M & m ) with( m ) {
+	if ( ! avail ) wait( c );
+	else avail = false;
+}
+
+\end{cfa}
+\\
+\multicolumn{2}{l}{\lstinline{M m;}}
+\end{tabular}
+\end{cquote}
+
+
+\section{Threads}
+
+\begin{cquote}
+\begin{tabular}{l|ll}
+\begin{uC++}
+
+@_Task@ T {
+	// private task fields
+	void main() {
+		... _Resume E( ... ) _At partner;
+	}
+  public:
+};
+\end{uC++}
+&
+\begin{cfa}
+#include <$thread$.hfa>
+@thread@ T {
+	// private task fields
+
+};
+void main( @T & t@ ) {
+	... resumeAt( partner, ExceptionInst( E, ... ) );
+}
+\end{cfa}
+\\
+\multicolumn{2}{l}{\lstinline{T t; // start thread in main routine}}
+\end{tabular}
+\end{cquote}
+
+
+\input{uC++toCFA.ind}
+
+% \bibliographystyle{plain}
+% \bibliography{pl}
+
+\end{document}
+
+% Local Variables: %
+% tab-width: 4 %
+% fill-column: 100 %
+% compile-command: "make" %
+% End: %
