Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • doc/user/user.tex

    rfe97a7d8 r67f2170  
    1111%% Created On       : Wed Apr  6 14:53:29 2016
    1212%% Last Modified By : Peter A. Buhr
    13 %% Last Modified On : Sat Jul 22 11:01:19 2017
    14 %% Update Count     : 2878
     13%% Last Modified On : Fri Jul  7 10:36:39 2017
     14%% Update Count     : 2547
    1515%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    1616
     
    5757\CFAStyle                                                                                               % use default CFA format-style
    5858
    59 \lstnewenvironment{C++}[1][]
    60 {\lstset{language=C++,moredelim=**[is][\protect\color{red}]{®}{®}#1}}
    61 {}
    62 
    6359% inline code ©...© (copyright symbol) emacs: C-q M-)
    6460% red highlighting ®...® (registered trademark symbol) emacs: C-q M-.
     
    141137
    142138\CFA{}\index{cforall@\CFA}\footnote{Pronounced ``\Index*{C-for-all}'', and written \CFA, CFA, or \CFL.} is a modern general-purpose programming-language, designed as an evolutionary step forward for the C programming language.
    143 The syntax of \CFA builds from C and should look immediately familiar to C/\Index*[C++]{\CC{}} programmers.
     139The syntax of the \CFA language builds from C, and should look immediately familiar to C/\Index*[C++]{\CC{}} programmers.
    144140% Any language feature that is not described here can be assumed to be using the standard \Celeven syntax.
    145 \CFA adds many modern programming-language features that directly lead to increased \emph{\Index{safety}} and \emph{\Index{productivity}}, while maintaining interoperability with existing C programs and achieving similar performance.
    146 Like C, \CFA is a statically typed, procedural (non-\Index{object-oriented}) language with a low-overhead runtime, meaning there is no global \Index{garbage-collection}, but \Index{regional garbage-collection}\index{garbage-collection!regional} is possible.
     141\CFA adds many modern programming-language features that directly lead to increased \emph{\Index{safety}} and \emph{\Index{productivity}}, while maintaining interoperability with existing C programs and achieving C performance.
     142Like C, \CFA is a statically typed, procedural language with a low-overhead runtime, meaning there is no global \Index{garbage-collection}, but \Index{regional garbage-collection}\index{garbage-collection!regional} is possible.
    147143The primary new features include parametric-polymorphic routines and types, exceptions, concurrency, and modules.
    148144
    149 One of the main design philosophies of \CFA is to ``\Index{describe not prescribe}'', which means \CFA tries to provide a pathway from low-level C programming to high-level \CFA programming, but it does not force programmers to ``do the right thing''.
    150 Programmers can cautiously add \CFA extensions to their C programs in any order and at any time to incrementally move towards safer, higher-level programming.
    151 A programmer is always free to reach back to C from \CFA, for any reason, and in many cases, new \CFA features can be locally switched back to there C counterpart.
    152 There is no notion or requirement for \emph{rewriting} a legacy C program in \CFA;
    153 instead, a programmer evolves a legacy program into \CFA by incrementally incorporating \CFA features.
    154 As well, new programs can be written in \CFA using a combination of C and \CFA features.
    155 
    156 \Index*[C++]{\CC{}} had a similar goal 30 years ago, allowing object-oriented programming to be incrementally added to C.
    157 However, \CC currently has the disadvantages of a strong object-oriented bias, multiple legacy design-choices that cannot be updated, and active divergence of the language model from C, all of which requires significant effort and training to incrementally add \CC to a C-based project.
     145One of the main design philosophies of \CFA is to ``describe not prescribe'', which means \CFA tries to provide a pathway from low-level C programming to high-level \CFA programming, but it does not force programmers to ``do the right thing''.
     146Programmers can cautiously add \CFA extensions to their C programs in any order and at any time to incrementally move towards safer, higher-level programming features.
     147A programmer is always free to reach back to C from \CFA for any reason, and in many cases, new \CFA features have a fallback to a C mechanism.
     148There is no notion or requirement for rewriting a legacy C program in \CFA;
     149instead, a programmer evolves an existing C program into \CFA by incrementally incorporating \CFA features.
     150New programs can be written in \CFA using a combination of C and \CFA features.
     151\Index*[C++]{\CC{}} had a similar goal 30 years ago, but currently has the disadvantages of multiple legacy design-choices that cannot be updated and active divergence of the language model from C, requiring significant effort and training to incrementally add \CC to a C-based project.
    158152In contrast, \CFA has 30 years of hindsight and a clean starting point.
    159153
     
    162156\begin{quote2}
    163157\begin{tabular}{@{}l@{\hspace{1.5em}}l@{\hspace{1.5em}}l@{}}
    164 \multicolumn{1}{c@{\hspace{1.5em}}}{\textbf{C}} & \multicolumn{1}{c}{\textbf{\CFA}}     & \multicolumn{1}{c}{\textbf{\CC}}      \\
    165 \begin{cfa}
     158\multicolumn{1}{c@{\hspace{1.5em}}}{\textbf{\CFA}}      & \multicolumn{1}{c}{\textbf{C}}        & \multicolumn{1}{c}{\textbf{\CC}}      \\
     159\begin{cfa}
     160#include <fstream>§\indexc{fstream}§
     161
     162int main( void ) {
     163        int x = 0, y = 1, z = 2;
     164        ®sout | x | y | z | endl;®
     165}
     166\end{cfa}
     167&
     168\begin{lstlisting}
    166169#include <stdio.h>§\indexc{stdio.h}§
    167170
     
    170173        ®printf( "%d %d %d\n", x, y, z );®
    171174}
    172 \end{cfa}
     175\end{lstlisting}
    173176&
    174 \begin{cfa}
    175 #include <fstream>§\indexc{fstream}§
    176 
    177 int main( void ) {
    178         int x = 0, y = 1, z = 2;
    179         ®sout | x | y | z | endl;®§\indexc{sout}§
    180 }
    181 \end{cfa}
    182 &
    183 \begin{cfa}
     177\begin{lstlisting}
    184178#include <iostream>§\indexc{iostream}§
    185179using namespace std;
     
    188182        ®cout<<x<<" "<<y<<" "<<z<<endl;®
    189183}
    190 \end{cfa}
     184\end{lstlisting}
    191185\end{tabular}
    192186\end{quote2}
    193187While the \CFA I/O looks similar to the \Index*[C++]{\CC{}} output style, there are important differences, such as automatic spacing between variables as in \Index*{Python} (see~\VRef{s:IOLibrary}).
    194188
    195 \subsection{Background}
    196 
    197189This document is a programmer reference-manual for the \CFA programming language.
    198190The manual covers the core features of the language and runtime-system, with simple examples illustrating syntax and semantics of each feature.
    199191The manual does not teach programming, i.e., how to combine the new constructs to build complex programs.
    200 A reader should already have an intermediate knowledge of control flow, data structures, and concurrency issues to understand the ideas presented, as well as some experience programming in C/\CC.
    201 Implementers should refer to the \CFA Programming Language Specification for details about the language syntax and semantics.
     192A reader should already have an intermediate knowledge of control flow, data structures, and concurrency issues to understand the ideas presented as well as some experience programming in C/\CC.
     193Implementers may refer to the \CFA Programming Language Specification for details about the language syntax and semantics.
    202194Changes to the syntax and additional features are expected to be included in later revisions.
    203195
     
    208200This installation base and the programmers producing it represent a massive software-engineering investment spanning decades and likely to continue for decades more.
    209201Even with all its problems, C continues to be popular because it allows writing software at virtually any level in a computer system without restriction.
    210 For system programming, where direct access to hardware, storage management, and real-time issues are a requirement, C is usually the only language of choice.
     202For system programming, where direct access to hardware and dealing with real-time issues is a requirement, C is usually the language of choice.
    211203The TIOBE index~\cite{TIOBE} for March 2016 showed the following programming-language popularity: \Index*{Java} 20.5\%, C 14.5\%, \Index*[C++]{\CC{}} 6.7\%, \Csharp 4.3\%, \Index*{Python} 4.3\%, where the next 50 languages are less than 3\% each with a long tail.
    212204As well, for 30 years, C has been the number 1 and 2 most popular programming language:
     
    224216\end{center}
    225217Hence, C is still an extremely important programming language, with double the usage of \Index*[C++]{\CC{}}; in many cases, \CC is often used solely as a better C.
    226 Love it or hate it, C has been an important and influential part of computer science for 40 years and its appeal is not diminishing.
    227 Unfortunately, C has many problems and omissions that make it an unacceptable programming language for modern needs.
    228 
    229 As stated, the goal of the \CFA project is to engineer modern language-features into C in an evolutionary rather than revolutionary way.
     218Love it or hate it, C has been an important and influential part of computer science for 40 years and sit appeal is not diminishing.
     219Unfortunately, C has too many problems and omissions to make it an acceptable programming language for modern needs.
     220
     221As stated, the goal of the \CFA project is to engineer modern language features into C in an evolutionary rather than revolutionary way.
    230222\CC~\cite{C++14,C++} is an example of a similar project;
    231 however, it largely extended the C language, and did not address most of C's existing problems.\footnote{%
     223however, it largely extended the language, and did not address many existing problems.\footnote{%
    232224Two important existing problems addressed were changing the type of character literals from ©int© to ©char© and enumerator from ©int© to the type of its enumerators.}
    233 \Index*{Fortran}~\cite{Fortran08}, \Index*{Ada}~\cite{Ada12}, and \Index*{Cobol}~\cite{Cobol14} are examples of programming languages that took an evolutionary approach, where modern language-features (\eg objects, concurrency) are added and problems fixed within the framework of the existing language.
     225\Index*{Fortran}~\cite{Fortran08}, \Index*{Ada}~\cite{Ada12}, and \Index*{Cobol}~\cite{Cobol14} are examples of programming languages that took an evolutionary approach, where modern language features (\eg objects, concurrency) are added and problems fixed within the framework of the existing language.
    234226\Index*{Java}~\cite{Java8}, \Index*{Go}~\cite{Go}, \Index*{Rust}~\cite{Rust} and \Index*{D}~\cite{D} are examples of the revolutionary approach for modernizing C/\CC, resulting in a new language rather than an extension of the descendent.
    235 These languages have different syntax and semantics from C, do not interoperate directly with C, and are not systems languages because of restrictive memory-management or garbage collection.
     227These languages have different syntax and semantics from C, and do not interoperate directly with C, largely because of garbage collection.
    236228As a result, there is a significant learning curve to move to these languages, and C legacy-code must be rewritten.
    237 These costs can be prohibitive for many companies with a large software-base in C/\CC, and a significant number of programmers require retraining to the new programming language.
    238 
    239 The result of this project is a language that is largely backwards compatible with \Index*[C11]{\Celeven{}}~\cite{C11}, but fixes many of the well known C problems while containing modern language-features.
     229These costs can be prohibitive for many companies with a large software base in C/\CC, and a significant number of programmers requiring retraining to a new programming language.
     230
     231The result of this project is a language that is largely backwards compatible with \Index*[C11]{\Celeven{}}~\cite{C11}, but fixing some of the well known C problems and containing many modern language features.
    240232Without significant extension to the C programming language, it is becoming unable to cope with the needs of modern programming problems and programmers;
    241233as a result, it will fade into disuse.
    242234Considering the large body of existing C code and programmers, there is significant impetus to ensure C is transformed into a modern programming language.
    243 While \Index*[C11]{\Celeven{}} made a few simple extensions to the language, nothing was added to address existing problems in the language or to augment the language with modern language-features.
    244 While some may argue that modern language-features may make C complex and inefficient, it is clear a language without modern capabilities is insufficient for the advanced programming problems existing today.
     235While \Index*[C11]{\Celeven{}} made a few simple extensions to the language, nothing was added to address existing problems in the language or to augment the language with modern language features.
     236While some may argue that modern language features may make C complex and inefficient, it is clear a language without modern capabilities is insufficient for the advanced programming problems existing today.
    245237
    246238
    247239\section{History}
    248240
    249 The \CFA project started with \Index*{K-W C}~\cite{Buhr94a,Till89}, which extended C with new declaration syntax, multiple return values from routines, and advanced assignment capabilities using the notion of tuples.
     241The \CFA project started with \Index*{K-W C}~\cite{Buhr94a,Till89}, which extended C with new declaration syntax, multiple return values from routines, and extended assignment capabilities using the notion of tuples.
    250242(See~\cite{Werther96} for similar work in \Index*[C++]{\CC{}}.)
    251 The first \CFA implementation of these extensions was by Esteves~\cite{Esteves04}.
    252 
    253 The signature feature of \CFA is \emph{\Index{overload}able} \Index{parametric-polymorphic} functions~\cite{forceone:impl,Cormack90,Duggan96} with functions generalized using a ©forall© clause (giving the language its name):
     243A first \CFA implementation of these extensions was by Esteves~\cite{Esteves04}.
     244The signature feature of \CFA is parametric-polymorphic functions~\cite{forceone:impl,Cormack90,Duggan96} with functions generalized using a ©forall© clause (giving the language its name):
    254245\begin{lstlisting}
    255246®forall( otype T )® T identity( T val ) { return val; }
     
    257248\end{lstlisting}
    258249% extending the C type system with parametric polymorphism and overloading, as opposed to the \Index*[C++]{\CC{}} approach of object-oriented extensions.
    259 \CFA{}\hspace{1pt}'s polymorphism was originally formalized by Ditchfield~\cite{Ditchfield92}, and first implemented by Bilson~\cite{Bilson03}.
     250\CFA{}\hspace{1pt}'s polymorphism was originally formalized by Ditchfiled~\cite{Ditchfield92}, and first implemented by Bilson~\cite{Bilson03}.
    260251However, at that time, there was little interesting in extending C, so work did not continue.
    261 As the saying goes, ``\Index*{What goes around, comes around.}'', and there is now renewed interest in the C programming language because of legacy code-bases, so the \CFA project has been restarted.
     252As the saying goes, ``What goes around, comes around.'', and there is now renewed interest in the C programming language because of legacy code-bases, so the \CFA project has been restarted.
    262253
    263254
     
    266257
    267258\CFA is designed to integrate directly with existing C programs and libraries.
    268 The most important feature of \Index{interoperability} is using the same \Index{calling convention}s, so there is no complex interface or overhead to call existing C routines.
     259The most important feature of \Index{interoperability} is using the same \Index{calling convention}s, so there is no overhead to call existing C routines.
    269260This feature allows \CFA programmers to take advantage of the existing panoply of C libraries to access thousands of external software features.
    270261Language developers often state that adequate \Index{library support} takes more work than designing and implementing the language itself.
    271262Fortunately, \CFA, like \Index*[C++]{\CC{}}, starts with immediate access to all exiting C libraries, and in many cases, can easily wrap library routines with simpler and safer interfaces, at very low cost.
    272 Hence, \CFA begins by leveraging the large repository of C libraries, and than allows programmers to incrementally augment their C programs with modern \Index{backward-compatible} features.
     263Hence, \CFA begins by leveraging the large repository of C libraries with little cost.
    273264
    274265\begin{comment}
     
    313304\end{comment}
    314305
    315 However, it is necessary to differentiate between C and \CFA code because of name \Index{overload}ing, as for \CC.
     306However, it is necessary to differentiate between C and \CFA code because of name overloading, as for \CC.
    316307For example, the C math-library provides the following routines for computing the absolute value of the basic types: ©abs©, ©labs©, ©llabs©, ©fabs©, ©fabsf©, ©fabsl©, ©cabsf©, ©cabs©, and ©cabsl©.
    317 Whereas, \CFA wraps each of these routines into ones with the overloaded name ©abs©:
     308Whereas, \CFA wraps each of these routines into ones with the common name ©abs©:
    318309\begin{cfa}
    319310char abs( char );
    320 ®extern "C" {® int abs( int ); ®}®              §\C{// use default C routine for int}§
     311®extern "C" {®
     312int abs( int );                                                 §\C{// use default C routine for int}§
     313®}® // extern "C"
    321314long int abs( long int );
    322315long long int abs( long long int );
     
    333326Hence, there is the same need as in \CC, to know if a name is a C or \CFA name, so it can be correctly formed.
    334327There is no way around this problem, other than C's approach of creating unique names for each pairing of operation and type.
    335 
    336 This example strongly illustrates a core idea in \CFA: \emph{the \Index{power of a name}}.
     328This example strongly illustrates a core idea in \CFA: \emph{the power of a name}.
    337329The name ``©abs©'' evokes the notion of absolute value, and many mathematical types provide the notion of absolute value.
    338 Hence, knowing the name ©abs© is sufficient to apply it to any type where it is applicable.
    339 The time savings and safety of using one name uniformly versus $N$ unique names cannot be underestimated.
    340 
    341 
    342 \section[Compiling a CFA Program]{Compiling a \CFA Program}
    343 
    344 The command ©cfa© is used to compile a \CFA program and is based on the \Index{GNU} \Indexc{gcc} command, \eg:
    345 \begin{cfa}
    346 cfa§\indexc{cfa}\index{compilation!cfa@©cfa©}§ [ gcc-options ] C/§\CFA{}§-files [ assembler/loader-files ]
     330Hence, knowing the name ©abs© should be sufficient to apply it to any type where it is applicable.
     331The time savings and safety of using one name uniformly versus $N$ unique names should not be underestimated.
     332
     333
     334\section[Compiling CFA Program]{Compiling \CFA Program}
     335
     336The command ©cfa© is used to compile \CFA program(s), and is based on the GNU \Indexc{gcc} command, \eg:
     337\begin{cfa}
     338cfa§\indexc{cfa}\index{compilation!cfa@©cfa©}§ [ gcc-options ] C/§\CFA§-files [ assembler/loader-files ]
    347339\end{cfa}
    348340\CFA programs having the following ©gcc© flags turned on:
     
    352344The 1999 C standard plus GNU extensions.
    353345\item
    354 \Indexc[deletekeywords=inline]{-fgnu89-inline}\index{compilation option!-fgnu89-inline@{\lstinline[deletekeywords=inline]$-fgnu89-inline$}}
     346{\lstset{deletekeywords={inline}}
     347\Indexc{-fgnu89-inline}\index{compilation option!-fgnu89-inline@{©-fgnu89-inline©}}
    355348Use the traditional GNU semantics for inline routines in C99 mode, which allows inline routines in header files.
     349}%
    356350\end{description}
    357351The following new \CFA options are available:
     
    360354\Indexc{-CFA}\index{compilation option!-CFA@©-CFA©}
    361355Only the C preprocessor and the \CFA translator steps are performed and the transformed program is written to standard output, which makes it possible to examine the code generated by the \CFA translator.
    362 The generated code starts with the standard \CFA \Index{prelude}.
     356The generated code started with the standard \CFA prelude.
    363357
    364358\item
    365359\Indexc{-debug}\index{compilation option!-debug@©-debug©}
    366360The program is linked with the debugging version of the runtime system.
    367 The debug version performs runtime checks to help during the debugging phase of a \CFA program, but can substantially slow program execution.
     361The debug version performs runtime checks to help during the debugging phase of a \CFA program, but substantially slows the execution of the program.
    368362The runtime checks should only be removed after the program is completely debugged.
    369363\textbf{This option is the default.}
     
    372366\Indexc{-nodebug}\index{compilation option!-nodebug@©-nodebug©}
    373367The program is linked with the non-debugging version of the runtime system, so the execution of the program is faster.
    374 \Emph{However, no runtime checks or ©assert©s are performed so errors usually result in abnormal program behaviour or termination.}
     368\Emph{However, no runtime checks or ©assert©s are performed so errors usually result in abnormal program termination.}
    375369
    376370\item
     
    392386\textbf{This option is the default.}
    393387
    394 \begin{comment}
    395388\item
    396389\Indexc{-no-include-stdhdr}\index{compilation option!-no-include-stdhdr@©-no-include-stdhdr©}
    397390Do not supply ©extern "C"© wrappers for \Celeven standard include files (see~\VRef{s:StandardHeaders}).
    398391\textbf{This option is \emph{not} the default.}
    399 \end{comment}
    400392\end{description}
    401393
     
    418410\item
    419411\Indexc{__CFA__}\index{preprocessor variables!__CFA__@©__CFA__©},
    420 \Indexc{__CFORALL__}\index{preprocessor variables!__CFORALL__@©__CFORALL__©}, and
     412\Indexc{__CFORALL__}\index{preprocessor variables!__CFORALL__@©__CFORALL__©} and
    421413\Indexc{__cforall}\index{preprocessor variables!__cforall@©__cforall©}
    422414are always available during preprocessing and have no value.
    423415\end{description}
    424416These preprocessor variables allow conditional compilation of programs that must work differently in these situations.
    425 For example, to toggle between C and \CFA extensions, use the following:
     417For example, to toggle between C and \CFA extensions, using the following:
    426418\begin{cfa}
    427419#ifndef __CFORALL__
     
    434426
    435427
    436 \section{Constant Underscores}
    437 
    438 Numeric constants are extended to allow \Index{underscore}s\index{constant!underscore}, \eg:
     428\section{Constants Underscores}
     429
     430Numeric constants are extended to allow \Index{underscore}s within constants\index{constant!underscore}, \eg:
    439431\begin{cfa}
    4404322®_®147®_®483®_®648;                                    §\C{// decimal constant}§
     
    449441L®_®§"\texttt{\textbackslash{x}}§®_®§\texttt{ff}§®_®§\texttt{ee}"§;     §\C{// wide character constant}§
    450442\end{cfa}
    451 The rules for placement of underscores are:
    452 \begin{enumerate}[topsep=5pt,itemsep=5pt,parsep=0pt]
     443The rules for placement of underscores is as follows:
     444\begin{enumerate}
    453445\item
    454446A sequence of underscores is disallowed, \eg ©12__34© is invalid.
     
    471463\label{s:BackquoteIdentifiers}
    472464
    473 \CFA introduces several new keywords (see \VRef{s:CFAKeywords}) that can clash with existing C variable-names in legacy code.
    474 Keyword clashes are accommodated by syntactic transformations using the \CFA backquote escape-mechanism:
     465\CFA accommodates keyword clashes with existing C variable-names by syntactic transformations using the \CFA backquote escape-mechanism:
    475466\begin{cfa}
    476467int ®`®otype®`® = 3;                    §\C{// make keyword an identifier}§
    477468double ®`®forall®`® = 3.5;
    478469\end{cfa}
    479 
    480470Existing C programs with keyword clashes can be converted by enclosing keyword identifiers in backquotes, and eventually the identifier name can be changed to a non-keyword name.
    481 \VRef[Figure]{f:HeaderFileInterposition} shows how clashes in existing C header-files (see~\VRef{s:StandardHeaders}) can be handled using preprocessor \newterm{interposition}: ©#include_next© and ©-I filename©.
    482 Several common C header-files with keyword clashes are fixed in the standard \CFA header-library, so there is a seamless programming-experience.
     471\VRef[Figure]{f:InterpositionHeaderFile} shows how clashes in C header files (see~\VRef{s:StandardHeaders}) can be handled using preprocessor \newterm{interposition}: ©#include_next© and ©-I filename©:
    483472
    484473\begin{figure}
    485474\begin{cfa}
    486 // include file uses the CFA keyword "with".
    487 #if ! defined( with )                   §\C{// nesting ?}§
    488 #define with ®`®with®`®                 §\C{// make keyword an identifier}§
     475// include file uses the CFA keyword "otype".
     476#if ! defined( otype )                  §\C{// nesting ?}§
     477#define otype ®`®otype®`®               §\C{// make keyword an identifier}§
    489478#define __CFA_BFD_H__
    490 #endif
    491 
    492 ®#include_next <bfdlink.h>              §\C{// must have internal check for multiple expansion}§
    493 ®
    494 #if defined( with ) && defined( __CFA_BFD_H__ ) §\C{// reset only if set}§
    495 #undef with
     479#endif // ! otype
     480
     481#®include_next® <bfd.h>                 §\C{// must have internal check for multiple expansion}§
     482
     483#if defined( otype ) && defined( __CFA_BFD_H__ )        §\C{// reset only if set}§
     484#undef otype
    496485#undef __CFA_BFD_H__
    497 #endif
    498 \end{cfa}
    499 \caption{Header-File Interposition}
    500 \label{f:HeaderFileInterposition}
     486#endif // otype && __CFA_BFD_H__
     487\end{cfa}
     488\caption{Interposition of Header File}
     489\label{f:InterpositionHeaderFile}
    501490\end{figure}
    502491
    503492
    504 \section{\texorpdfstring{Labelled \LstKeywordStyle{continue} / \LstKeywordStyle{break}}{Labelled continue / break}}
     493\section{Labelled Continue/Break}
    505494
    506495While C provides ©continue© and ©break© statements for altering control flow, both are restricted to one level of nesting for a particular control structure.
    507496Unfortunately, this restriction forces programmers to use \Indexc{goto} to achieve the equivalent control-flow for more than one level of nesting.
    508 To prevent having to switch to the ©goto©, \CFA extends the \Indexc{continue}\index{continue@\lstinline $continue$!labelled}\index{labelled!continue@©continue©} and \Indexc{break}\index{break@\lstinline $break$!labelled}\index{labelled!break@©break©} with a target label to support static multi-level exit\index{multi-level exit}\index{static multi-level exit}~\cite{Buhr85}, as in Java.
     497To prevent having to switch to the ©goto©, \CFA extends the \Indexc{continue}\index{continue@\lstinline $continue$!labelled}\index{labelled!continue@©continue©} and \Indexc{break}\index{break@\lstinline $break$!labelled}\index{labelled!break@©break©} with a target label to support static multi-level exit\index{multi-level exit}\index{static multi-level exit}~\cite{Buhr85,Java}.
    509498For both ©continue© and ©break©, the target label must be directly associated with a ©for©, ©while© or ©do© statement;
    510499for ©break©, the target label can also be associated with a ©switch©, ©if© or compound (©{}©) statement.
     
    523512                        ®LF:® for ( ... ) {
    524513                                ®LW:® while ( ... ) {
    525                                         ... break ®LC®; ...             // terminate compound
    526                                         ... break ®LS®; ...             // terminate switch
    527                                         ... break ®LIF®; ...    // terminate if
    528                                         ... continue ®LF;® ...  // resume loop
    529                                         ... break ®LF®; ...             // terminate loop
    530                                         ... continue ®LW®; ...  // resume loop
    531                                         ... break ®LW®; ...             // terminate loop
     514                                        ... break ®LC®; ...                     // terminate compound
     515                                        ... break ®LS®; ...                     // terminate switch
     516                                        ... break ®LIF®; ...                    // terminate if
     517                                        ... continue ®LF;® ...   // resume loop
     518                                        ... break ®LF®; ...                     // terminate loop
     519                                        ... continue ®LW®; ...   // resume loop
     520                                        ... break ®LW®; ...               // terminate loop
    532521                                } // while
    533522                        } // for
    534523                } else {
    535                         ... break ®LIF®; ...                    // terminate if
     524                        ... break ®LIF®; ...                                     // terminate if
    536525                } // if
    537526        } // switch
     
    575564                          LF: for ( ;; ) {
    576565                                  LW: while ( 1 ) {
    577                                                 break LC;               // terminate compound
    578                                                 break LS;               // terminate switch
    579                                                 break LIF;              // terminate if
    580                                                 continue LF;    // resume loop
    581                                                 break LF;               // terminate loop
    582                                                 continue LW;    // resume loop
    583                                                 break LW;               // terminate loop
     566                                                break LC;                       // terminate compound
     567                                                break LS;                       // terminate switch
     568                                                break LIF;                      // terminate if
     569                                                continue LF;     // resume loop
     570                                                break LF;                       // terminate loop
     571                                                continue LW;     // resume loop
     572                                                break LW;                 // terminate loop
    584573                                        } // while
    585574                                } // for
    586575                        } else {
    587                                 break LIF;                              // terminate if
     576                                break LIF;                                      // terminate if
    588577                        } // if
    589578                } // switch
     
    624613\item
    625614They cannot branch into a control structure.
    626 This restriction prevents missing declarations and/or initializations at the start of a control structure resulting in undefined behaviour.
     615This restriction prevents missing initialization at the start of a control structure resulting in undefined behaviour.
    627616\end{itemize}
    628617The advantage of the labelled ©continue©/©break© is allowing static multi-level exits without having to use the ©goto© statement, and tying control flow to the target control structure rather than an arbitrary point in a program.
    629 Furthermore, the location of the label at the \emph{beginning} of the target control structure informs the reader (\Index{eye candy}) that complex control-flow is occurring in the body of the control structure.
     618Furthermore, the location of the label at the \emph{beginning} of the target control structure informs the reader that complex control-flow is occurring in the body of the control structure.
    630619With ©goto©, the label is at the end of the control structure, which fails to convey this important clue early enough to the reader.
    631620Finally, using an explicit target for the transfer instead of an implicit target allows new constructs to be added or removed without affecting existing constructs.
     
    633622
    634623
    635 \section{\texorpdfstring{\LstKeywordStyle{switch} Statement}{switch Statement}}
     624\section{Switch Statement}
    636625
    637626C allows a number of questionable forms for the ©switch© statement:
     
    674663        ®// open input file
    675664®} else if ( argc == 2 ) {
    676         ®// open input file (duplicate)
     665        ®// open input file
    677666
    678667®} else {
     
    687676\begin{cfa}
    688677switch ( i ) {
    689   ®case 1: case 3: case 5:®     // odd values
    690         // odd action
     678  case 1: case 3: case 5:       // odd values
     679        // same action
    691680        break;
    692   ®case 2: case 4: case 6:®     // even values
    693         // even action
     681  case 2: case 4: case 6:       // even values
     682        // same action
    694683        break;
    695684}
     
    697686However, this situation is handled in other languages without fall-through by allowing a list of case values.
    698687While fall-through itself is not a problem, the problem occurs when fall-through is the default, as this semantics is unintuitive to many programmers and is different from virtually all other programming languages with a ©switch© statement.
    699 Hence, default fall-through semantics results in a large number of programming errors as programmers often \emph{forget} the ©break© statement at the end of a ©case© clause, resulting in inadvertent fall-through.
     688Hence, default fall-through semantics results in a large number of programming errors as programmers often forget the ©break© statement at the end of a ©case© clause, resulting in inadvertent fall-through.
    700689
    701690\item
     
    719708The problem with this usage is branching into control structures, which is known to cause both comprehension and technical difficulties.
    720709The comprehension problem occurs from the inability to determine how control reaches a particular point due to the number of branches leading to it.
    721 The technical problem results from the inability to ensure declaration and initialization of variables when blocks are not entered at the beginning.
    722 There are no positive arguments for this kind of control flow, and therefore, there is a strong impetus to eliminate it.
     710The technical problem results from the inability to ensure allocation and initialization of variables when blocks are not entered at the beginning.
     711Often transferring into a block can bypass variable declaration and/or its initialization, which results in subsequent errors.
     712There are virtually no positive arguments for this kind of control flow, and therefore, there is a strong impetus to eliminate it.
    723713Nevertheless, C does have an idiom where this capability is used, known as ``\Index*{Duff's device}''~\cite{Duff83}:
    724714\begin{cfa}
     
    780770and there is only a medium amount of fall-through from one ©case© clause to the next, and most of these result from a list of case values executing common code, rather than a sequence of case actions that compound.
    781771\end{itemize}
    782 These observations put into perspective the \CFA changes to the ©switch©.
     772These observations help to put the \CFA changes to the ©switch© into perspective.
    783773\begin{enumerate}
    784774\item
     
    801791  case 7:
    802792        ...
    803         ®break®                                         §\C{// redundant explicit end of switch}§
     793        ®break®                                         §\C{// explicit end of switch}§
    804794  default:
    805795        j = 3;
     
    807797\end{cfa}
    808798Like the ©switch© statement, the ©choose© statement retains the fall-through semantics for a list of ©case© clauses;
    809 An implicit ©break© is applied only at the end of the \emph{statements} following a ©case© clause.
    810 An explicit ©fallthru© is retained because it is a C-idiom most C programmers expect, and its absence might discourage programmers from using the ©choose© statement.
     799the implicit ©break© is applied only at the end of the \emph{statements} following a ©case© clause.
     800The explicit ©fallthru© is retained because it is a C-idiom most C programmers expect, and its absence might discourage programmers from using the ©choose© statement.
    811801As well, allowing an explicit ©break© from the ©choose© is a carry over from the ©switch© statement, and expected by C programmers.
    812802\item
     
    837827
    838828
    839 \section{\texorpdfstring{\LstKeywordStyle{case} Clause}{case Clause}}
     829\section{Case Clause}
    840830
    841831C restricts the ©case© clause of a ©switch© statement to a single value.
     
    913903
    914904
    915 \section{\texorpdfstring{\LstKeywordStyle{with} Clause / Statement}{with Clause / Statement}}
    916 \label{s:WithClauseStatement}
    917 
    918 In \Index{object-oriented} programming, there is an implicit first parameter, often names \textbf{©self©} or \textbf{©this©}, which is elided.
    919 \begin{C++}
    920 class C {
    921         int i, j;
    922         int mem() {              ®// implicit "this" parameter
    923 ®               i = 1;          ®// this->i
    924 ®               j = 3;          ®// this->j
    925 ®       }
    926 }
    927 \end{C++}
    928 Since CFA is non-object-oriented, the equivalent object-oriented program looks like:
    929 \begin{cfa}
    930 struct S { int i, j; };
    931 int mem( S &this ) {    // explicit "this" parameter
    932         ®this.®i = 1;                     // "this" is not elided
    933         ®this.®j = 2;
    934 }
    935 \end{cfa}
    936 but it is cumbersome having to write "©this.©" many times in a member.
    937 
    938 \CFA provides a ©with© clause/statement (see Pascal~\cite[\S~4.F]{Pascal}) to elided the "©this.©" by opening a scope containing field identifiers, changing the qualified fields into variables and giving an opportunity for optimizing qualified references.
    939 \begin{cfa}
    940 int mem( S &this ) ®with this® {        // with clause
    941         i = 1;                  ®// this.i
    942 ®       j = 2;                  ®// this.j
    943 ®}
    944 \end{cfa}
    945 which extends to multiple routine parameters:
    946 \begin{cfa}
    947 struct T { double m, n; };
    948 int mem2( S &this1, T &this2 ) ®with this1, this2® {
    949         i = 1; j = 2;
    950         m = 1.0; n = 2.0;
    951 }
    952 \end{cfa}
    953 
    954 The statement form is used within a block:
    955 \begin{cfa}
    956 int foo() {
    957         struct S1 { ... } s1;
    958         struct S2 { ... } s2;
    959         ®with s1® {                     // with statement
    960                 // access fields of s1 without qualification
    961                 ®with s2® {  // nesting
    962                         // access fields of s1 and s2 without qualification
    963                 }
    964         }
    965         ®with s1, s2® {
    966                 // access unambiguous fields of s1 and s2 without qualification
    967         }
    968 }
    969 \end{cfa}
    970 
    971 When opening multiple structures, fields with the same name and type are ambiguous and must be fully qualified.
    972 For fields with the same name but different type, context/cast can be used to disambiguate.
    973 \begin{cfa}
    974 struct S { int i; int j; double m; } a, c;
    975 struct T { int i; int k; int m } b, c;
    976 ®with a, b® {
    977         j + k;                                          §\C{// unambiguous, unique names define unique types}§
    978         i;                                                      §\C{// ambiguous, same name and type}§
    979         a.i + b.i;                                      §\C{// unambiguous, qualification defines unique names}§
    980         m;                                                      §\C{// ambiguous, same name and no context to define unique type}§
    981         m = 5.0;                                        §\C{// unambiguous, same name and context defines unique type}§
    982         m = 1;                                          §\C{// unambiguous, same name and context defines unique type}§
    983 }
    984 ®with c® { ... }                                §\C{// ambiguous, same name and no context}§
    985 ®with (S)c® { ... }                             §\C{// unambiguous, same name and cast defines unique type}§
    986 \end{cfa}
    987 
    988 
    989905\section{Exception Handling}
    990 \label{s:ExceptionHandling}
    991906
    992907Exception handling provides two mechanism: change of control flow from a raise to a handler, and communication from the raise to the handler.
    993 Transfer of control can be local, within a routine, or non-local, among routines.
    994 Non-local transfer can cause stack unwinding, i.e., non-local routine termination, depending on the kind of raise.
    995 \begin{cfa}
    996 exception_t E {};                               §\C{// exception type}§
     908\begin{cfa}
     909exception void h( int i );
     910exception int h( int i, double d );
     911
    997912void f(...) {
    998         ... throw E{}; ...                      §\C{// termination}§
    999         ... throwResume E{}; ...        §\C{// resumption}§
    1000 }
     913        ... throw h( 3 );
     914        ... i = resume h( 3, 5.1 );
     915}
     916
    1001917try {
    1002918        f(...);
    1003 } catch( E e : §boolean-predicate§ ) {                  §\C{// termination handler}§
    1004         // recover and continue
    1005 } catchResume( E e : §boolean-predicate§ ) {    §\C{// resumption handler}§
    1006         // repair and return
     919} catch h( int w ) {
     920        // reset
     921} resume h( int p, double x ) {
     922        return 17;  // recover
    1007923} finally {
    1008         // always executed
    1009 }
    1010 \end{cfa}
    1011 The kind of raise and handler match: ©throw© with ©catch© and ©throwResume© with ©catchResume©.
    1012 Then the exception type must match along with any additonal predicate must be true.
    1013 The ©catch© and ©catchResume© handlers may appear in any oder.
    1014 However, the ©finally© clause must appear at the end of the ©try© statement.
     924}
     925\end{cfa}
     926So the type raised would be the mangled name of the exception prototype and that name would be matched at the handler clauses by comparing the strings.
     927The arguments for the call would have to be packed in a message and unpacked at handler clause and then a call made to the handler.
    1015928
    1016929
     
    12231136
    12241137
    1225 \section{Exponentiation Operator}
    1226 
    1227 C, \CC, and Java (and many other programming languages) have no exponentiation operator\index{exponentiation!operator}\index{operator!exponentiation}, \ie $x^y$, and instead use a routine, like \Indexc{pow}, to perform the exponentiation operation.
    1228 \CFA extends the basic operators with the exponentiation operator ©?\?©\index{?\\?@\lstinline$?\?$} and ©?\=?©\index{?\\=?@\lstinline$?\=?$}, as in, ©x \ y© and ©x \= y©, which means $x^y$ and $x \leftarrow x^y$.
    1229 The priority of the exponentiation operator is between the cast and multiplicative operators, so that ©w * (int)x \ (int)y * z© is parenthesized as ©((w * (((int)x) \ ((int)y))) * z)©.
    1230 
    1231 As for \Index{division}, there are exponentiation operators for integral and floating-point types, including the builtin \Index{complex} types.
    1232 Unsigned integral exponentiation\index{exponentiation!unsigned integral} is performed with repeated multiplication (or shifting if the base is 2).
    1233 Signed integral exponentiation\index{exponentiation!signed integral} is performed with repeated multiplication (or shifting if the base is 2), but yields a floating-point result because $b^{-e}=1/b^e$.
    1234 Hence, it is important to designate exponent integral-constants as unsigned or signed: ©3 \ 3u© return an integral result, while ©3 \ 3© returns a floating-point result.
    1235 Floating-point exponentiation\index{exponentiation!floating point} is performed using \Index{logarithm}s\index{exponentiation!logarithm}, so the base cannot be negative.
    1236 \begin{cfa}
    1237 sout | 2 ®\® 8u | 4 ®\® 3u | -4 ®\® 3u | 4 ®\® -3 | -4 ®\® -3 | 4.0 ®\® 2.1 | (1.0f+2.0fi) ®\® (3.0f+2.0fi) | endl;
    1238 256 64 -64 0.015625 -0.015625 18.3791736799526 0.264715-1.1922i
    1239 \end{cfa}
    1240 Parenthesis are necessary for the complex constants or the expresion is parsed as ©1.0f+(2.0fi \ 3.0f)+2.0fi©.
    1241 The exponentiation operator is available for all the basic types, but for user-defined types, only the integral-computation versions are available.
    1242 For returning an integral value, the user type ©T© must define multiplication, ©*©, and one, ©1©;
    1243 for returning a floating-point value, an additional divide of type ©T© into a ©double© returning a ©double© (©double ?/?( double, T )©) is necessary for negative exponents.
    1244 
    1245 
    1246 \section{Pointer / Reference}
     1138\section{Pointer/Reference}
    12471139
    12481140C provides a \newterm{pointer type};
     
    12521144An integer constant expression with the value 0, or such an expression cast to type ©void *©, is called a \newterm{null-pointer constant}.\footnote{
    12531145One way to conceptualize the null pointer is that no variable is placed at this address, so the null-pointer address can be used to denote an uninitialized pointer/reference object;
    1254 \ie the null pointer is guaranteed to compare unequal to a pointer to any object or routine.
    1255 In general, a value with special meaning among a set of values is called a \emph{\Index{sentinel value}}, \eg ©-1© as a return code value.}
     1146\ie the null pointer is guaranteed to compare unequal to a pointer to any object or routine.}
    12561147An address is \newterm{sound}, if it points to a valid memory location in scope, \ie within the program's execution-environment and has not been freed.
    12571148Dereferencing an \newterm{unsound} address, including the null pointer, is \Index{undefined}, often resulting in a \Index{memory fault}.
     
    12881179\hline
    12891180\begin{cfa}
    1290 lda             r1,100  // load address of x
    1291 ld               r2,(r1)          // load value of x
    1292 lda             r3,104  // load address of y
    1293 st               r2,(r3)          // store x into y
     1181lda             r1,100                  // load address of x
     1182ld               r2,(r1)                  // load value of x
     1183lda             r3,104                  // load address of y
     1184st               r2,(r3)                  // store x into y
    12941185\end{cfa}
    12951186&
    12961187\begin{cfa}
    12971188
    1298 ld              r2,(100)        // load value of x
    1299 
    1300 st              r2,(104)        // store x into y
     1189ld              r2,(100)                // load value of x
     1190
     1191st              r2,(104)                // store x into y
    13011192\end{cfa}
    13021193\end{tabular}
     
    15941485
    15951486\item
    1596 lvalue to reference conversion: \lstinline[deletekeywords=lvalue]$lvalue-type cv1 T$ converts to ©cv2 T &©, which allows implicitly converting variables to references.
     1487lvalue to reference conversion: \lstinline[deletekeywords={lvalue}]@lvalue-type cv1 T@ converts to ©cv2 T &©, which allows implicitly converting variables to references.
    15971488\begin{cfa}
    15981489int x, &r = ®x®, f( int & p ); // lvalue variable (int) convert to reference (int &)
     
    27032594\begin{cfa}[belowskip=0pt]
    27042595char store[®sepSize®];                                          §\C{// sepSize is the maximum separator size}§
    2705 strcpy( store, sepGet( sout ) );                          §\C{// copy current separator}§
    2706 sepSet( sout, "_" );                                            §\C{// change separator to underscore}§
     2596strcpy( store, sepGet( sout ) );
     2597sepSet( sout, "_" );
    27072598sout | 1 | 2 | 3 | endl;
    27082599\end{cfa}
     
    27112602\end{cfa}
    27122603\begin{cfa}[belowskip=0pt]
    2713 sepSet( sout, store );                                          §\C{// change separator back to original}§
     2604sepSet( sout, store );
    27142605sout | 1 | 2 | 3 | endl;
    27152606\end{cfa}
     
    32683159\Indexc{gcc} provides ©typeof© to declare a secondary variable from a primary variable.
    32693160\CFA also relies heavily on the specification of the left-hand side of assignment for type inferencing, so in many cases it is crucial to specify the type of the left-hand side to select the correct type of the right-hand expression.
    3270 Only for overloaded routines \emph{with the same return type} is variable type-inferencing possible.
     3161Only for overloaded routines with the same return type is variable type-inferencing possible.
    32713162Finally, ©auto© presents the programming problem of tracking down a type when the type is actually needed.
    32723163For example, given
     
    53675258
    53685259
    5369 \section{\texorpdfstring{\CFA Keywords}{Cforall Keywords}}
     5260\section{\CFA Keywords}
    53705261\label{s:CFAKeywords}
    53715262
    5372 \CFA introduces the following new keywords.
    5373 
    53745263\begin{quote2}
    5375 \begin{tabular}{lllll}
     5264\begin{tabular}{llll}
    53765265\begin{tabular}{@{}l@{}}
    5377 ©_At©                   \\
     5266©_AT©                   \\
    53785267©catch©                 \\
    53795268©catchResume©   \\
    53805269©choose©                \\
    53815270©coroutine©             \\
     5271©disable©               \\
    53825272\end{tabular}
    53835273&
    53845274\begin{tabular}{@{}l@{}}
    5385 ©disable©               \\
    53865275©dtype©                 \\
    53875276©enable©                \\
    53885277©fallthrough©   \\
    53895278©fallthru©              \\
     5279©finally©               \\
     5280©forall©                \\
    53905281\end{tabular}
    53915282&
    53925283\begin{tabular}{@{}l@{}}
    5393 ©finally©               \\
    5394 ©forall©                \\
    53955284©ftype©                 \\
    53965285©lvalue©                \\
    53975286©monitor©               \\
     5287©mutex©                 \\
     5288©one_t©                 \\
     5289©otype©                 \\
    53985290\end{tabular}
    53995291&
    54005292\begin{tabular}{@{}l@{}}
    5401 ©mutex©                 \\
    5402 ©one_t©                 \\
    5403 ©otype©                 \\
    54045293©throw©                 \\
    54055294©throwResume©   \\
    5406 \end{tabular}
    5407 &
    5408 \begin{tabular}{@{}l@{}}
    54095295©trait©                 \\
    54105296©try©                   \\
    54115297©ttype©                 \\
    5412 ©with©                  \\
    54135298©zero_t©                \\
    54145299\end{tabular}
     
    54455330g( p1, p2 ) int p1, p2;                 §\C{// int g( int p1, int p2 );}§
    54465331\end{cfa}
    5447 \CFA continues to support K\&R routine definitions:
     5332\CFA supports K\&R routine definitions:
    54485333\begin{cfa}
    54495334f( a, b, c )                                    §\C{// default int return}§
     
    55865471\Celeven prescribes the following standard header-files~\cite[\S~7.1.2]{C11} and \CFA adds to this list:
    55875472\begin{quote2}
    5588 \begin{tabular}{@{}lllll|l@{}}
    5589 \multicolumn{5}{c|}{C11} & \multicolumn{1}{c}{\CFA}             \\
     5473\lstset{deletekeywords={float}}
     5474\begin{tabular}{@{}llll|l@{}}
     5475\multicolumn{4}{c|}{C11} & \multicolumn{1}{c}{\CFA}             \\
    55905476\hline
    55915477\begin{tabular}{@{}l@{}}
     
    55955481\Indexc{errno.h}                \\
    55965482\Indexc{fenv.h}                 \\
    5597 \Indexc[deletekeywords=float]{float.h} \\
     5483\Indexc{float.h}                \\
     5484\Indexc{inttypes.h}             \\
     5485\Indexc{iso646.h}               \\
    55985486\end{tabular}
    55995487&
    56005488\begin{tabular}{@{}l@{}}
    5601 \Indexc{inttypes.h}             \\
    5602 \Indexc{iso646.h}               \\
    56035489\Indexc{limits.h}               \\
    56045490\Indexc{locale.h}               \\
    56055491\Indexc{math.h}                 \\
    56065492\Indexc{setjmp.h}               \\
    5607 \end{tabular}
    5608 &
    5609 \begin{tabular}{@{}l@{}}
    56105493\Indexc{signal.h}               \\
    56115494\Indexc{stdalign.h}             \\
    56125495\Indexc{stdarg.h}               \\
    56135496\Indexc{stdatomic.h}    \\
    5614 \Indexc{stdbool.h}              \\
    5615 \Indexc{stddef.h}               \\
    56165497\end{tabular}
    56175498&
    56185499\begin{tabular}{@{}l@{}}
     5500\Indexc{stdbool.h}              \\
     5501\Indexc{stddef.h}               \\
    56195502\Indexc{stdint.h}               \\
    56205503\Indexc{stdio.h}                \\
     
    56325515\Indexc{wctype.h}               \\
    56335516                                                \\
     5517                                                \\
     5518                                                \\
    56345519\end{tabular}
    56355520&
     
    56375522\Indexc{unistd.h}               \\
    56385523\Indexc{gmp.h}                  \\
     5524                                                \\
     5525                                                \\
    56395526                                                \\
    56405527                                                \\
     
    56765563The table shows allocation routines supporting different combinations of storage-management capabilities:
    56775564\begin{center}
    5678 \begin{tabular}{@{}r|r|l|l|l|l@{}}
    5679 \multicolumn{1}{c}{}&           & \multicolumn{1}{c|}{fill}     & resize        & alignment     & array \\
     5565\begin{tabular}{@{}lr|l|l|l|l@{}}
     5566                &                                       & \multicolumn{1}{c|}{fill}     & resize        & alignment     & array \\
    56805567\hline
    56815568C               & ©malloc©                      & no                    & no            & no            & no    \\
     
    56845571                & ©memalign©            & no                    & no            & yes           & no    \\
    56855572                & ©posix_memalign©      & no                    & no            & yes           & no    \\
    5686 \hline
    56875573C11             & ©aligned_alloc©       & no                    & no            & yes           & no    \\
    5688 \hline
    56895574\CFA    & ©alloc©                       & no/copy/yes   & no/yes        & no            & yes   \\
    56905575                & ©align_alloc©         & no/yes                & no            & yes           & yes   \\
Note: See TracChangeset for help on using the changeset viewer.