Changes in / [78885b5:bc1ab61]


Ignore:
Files:
2 added
7 deleted
12 edited

Legend:

Unmodified
Added
Removed
  • doc/refrat/refrat.tex

    r78885b5 rbc1ab61  
    1 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -*- Mode: Latex -*- %%%%%%%%%%%%%%%%%%%%%%%%%%%%
    2 %%
    3 %% Cforall Version 1.0.0 Copyright (C) 2016 University of Waterloo
    4 %%
    5 %% The contents of this file are covered under the licence agreement in the
    6 %% file "LICENCE" distributed with Cforall.
    7 %%
    8 %% refrat.tex --
    9 %%
    10 %% Author           : Peter A. Buhr
    11 %% Created On       : Wed Apr  6 14:52:25 2016
    12 %% Last Modified By : Peter A. Buhr
    13 %% Last Modified On : Wed Apr  6 21:57:27 2016
    14 %% Update Count     : 2
    15 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    16 
    171% requires tex packages: texlive-base texlive-latex-base tex-common texlive-humanities texlive-latex-extra texlive-fonts-recommended
    182
     
    215
    226% Latex packages used in the document.
     7
    238\usepackage{fullpage,times}
    249\usepackage{xspace}
     
    3823% Names used in the document.
    3924
    40 \newcommand{\CFA}{C$\mathbf\forall$\xspace}     % set language symbolic name
     25\newcommand{\CFA}{C$\forall$\xspace}    % set language symbolic name
    4126\newcommand{\CFL}{Cforall\xspace}               % set language text name
    4227\newcommand{\CC}{C\kern-.1em\hbox{+\kern-.25em+}\xspace} % CC symbolic name
     
    166151% CFA based on ANSI C
    167152\lstdefinelanguage{CFA}[ANSI]{C}%
    168 {morekeywords={_Alignas,_Alignof,__alignof,__alignof__,asm,__asm,__asm__,_At,_Atomic,__attribute,__attribute__,auto,
    169     _Bool,catch,catchResume,choose,_Complex,__complex,__complex__,__const,__const__,disable,dtype,enable,__extension__,
    170         fallthru,finally,forall,ftype,_Generic,_Imaginary,inline,__label__,lvalue,_Noreturn,otype,restrict,_Static_assert,
    171         _Thread_local,throw,throwResume,trait,try,typeof,__typeof,__typeof__,},
     153{morekeywords={asm,_Alignas,_Alignof,_At,_Atomic,_Bool,catch,catchResume,choose,_Complex,trait,disable,dtype,enable,
     154        fallthru,finally,forall,ftype,_Generic,_Imaginary,inline,lvalue,_Noreturn,otype,restrict,_Static_assert,
     155        _Thread_local,throw,throwResume,try,},
    172156}%
    173157
     
    179163xleftmargin=\parindent,
    180164escapechar=@,
    181 mathescape=true,
    182165keepspaces=true,
    183166showstringspaces=false,
    184167showlines=true,
    185 aboveskip=6pt,
    186 belowskip=4pt,
    187168}%
    188169
     
    190171% replace/adjust listings characters that look bad in sanserif
    191172\lst@CCPutMacro
    192 \lst@ProcessOther{"22}{\lst@ttfamily{"}{\raisebox{0.3ex}{\ttfamily\upshape "}}} % replace double quote
    193 \lst@ProcessOther{"27}{\lst@ttfamily{'}{\raisebox{0.3ex}{\ttfamily\upshape '\hspace*{-2pt}}}} % replace single quote
    194 \lst@ProcessOther{"2D}{\lst@ttfamily{-}{\ttfamily\upshape -}} % replace minus
     173\lst@ProcessOther{"2D}{\lst@ttfamily{-{}}{{\ttfamily\upshape -}}} % replace minus
    195174\lst@ProcessOther{"3C}{\lst@ttfamily{<}{\texttt{<}}} % replace less than
    196175\lst@ProcessOther{"3E}{\lst@ttfamily{<}{\texttt{>}}} % replace greater than
    197176\lst@ProcessOther{"5E}{\raisebox{0.4ex}{$\scriptstyle\land\,$}} % replace circumflex
    198 \lst@ProcessOther{"5F}{\lst@ttfamily{\char95}{{\makebox[1.2ex][c]{\rule{1ex}{0.1ex}}}}} % replace underscore
    199 \lst@ProcessOther{"60}{\lst@ttfamily{`}{\raisebox{0.3ex}{\ttfamily\upshape \hspace*{-2pt}`}}} % replace backquote
     177\lst@ProcessLetter{"5F}{\lst@ttfamily{\char95}{{\makebox[1.2ex][c]{\rule{1ex}{0.1ex}}}}} % replace underscore
    200178\lst@ProcessOther{"7E}{\raisebox{0.3ex}{$\scriptstyle\sim\,$}} % replace tilde
    201179%\lst@ProcessOther{"7E}{\raisebox{-.4ex}[1ex][0pt]{\textasciitilde}} % lower tilde
     
    38653843``\lstinline$Safe_pointer$ acts like a pointer to \lstinline$int$''.
    38663844\begin{lstlisting}
    3867 trait ptr_to( otype P | pointer( P ), otype T ) {@\impl{ptr_to}@@\use{pointer}@
     3845trait ptr_to( type P | pointer( P ), otype T ) {@\impl{ptr_to}@@\use{pointer}@
    38683846        lvalue T *?( P );
    38693847        lvalue T ?[?]( P, long int );
    38703848};
    3871 trait ptr_to_const( otype P | pointer( P ), otype T ) {@\impl{ptr_to_const}@
     3849trait ptr_to_const( type P | pointer( P ), otype T ) {@\impl{ptr_to_const}@
    38723850        const lvalue T *?( P );
    38733851        const lvalue T ?[?]( P, long int );@\use{pointer}@
    38743852};
    3875 trait ptr_to_volatile( otype P | pointer( P ), otype T ) }@\impl{ptr_to_volatile}@
     3853trait ptr_to_volatile( type P | pointer( P ), otype T ) }@\impl{ptr_to_volatile}@
    38763854        volatile lvalue T *?( P );
    38773855        volatile lvalue T ?[?]( P, long int );@\use{pointer}@
    38783856};
    3879 trait ptr_to_const_volatile( otype P | pointer( P ), otype T ) }@\impl{ptr_to_const_volatile}@
     3857trait ptr_to_const_volatile( type P | pointer( P ), otype T ) }@\impl{ptr_to_const_volatile}@
    38803858        const volatile lvalue T *?( P );@\use{pointer}@
    38813859        const volatile lvalue T ?[?]( P, long int );
     
    38873865``\lstinline$ptr_to$'' specifications.
    38883866\begin{lstlisting}
    3889 trait m_l_ptr_to( otype P | m_l_pointer( P ),@\use{m_l_pointer}@@\impl{m_l_ptr_to}@ otype T | ptr_to( P, T )@\use{ptr_to}@ {
     3867trait m_l_ptr_to( type P | m_l_pointer( P ),@\use{m_l_pointer}@@\impl{m_l_ptr_to}@ otype T | ptr_to( P, T )@\use{ptr_to}@ {
    38903868        P ?=?( P *, T * );
    38913869        T * ?=?( T **, P );
    38923870};
    3893 trait m_l_ptr_to_const( otype P | m_l_pointer( P ),@\use{m_l_pointer}@@\impl{m_l_ptr_to_const}@ otype T | ptr_to_const( P, T )@\use{ptr_to_const}@) {
     3871trait m_l_ptr_to_const( type P | m_l_pointer( P ),@\use{m_l_pointer}@@\impl{m_l_ptr_to_const}@ otype T | ptr_to_const( P, T )@\use{ptr_to_const}@) {
    38943872        P ?=?( P *, const T * );
    38953873        const T * ?=?( const T **, P );
    38963874};
    3897 trait m_l_ptr_to_volatile( otype P | m_l_pointer( P ),@\use{m_l_pointer}@@\impl{m_l_ptr_to_volatile}@ otype T | ptr_to_volatile( P, T )) {@\use{ptr_to_volatile}@
     3875trait m_l_ptr_to_volatile( type P | m_l_pointer( P ),@\use{m_l_pointer}@@\impl{m_l_ptr_to_volatile}@ otype T | ptr_to_volatile( P, T )) {@\use{ptr_to_volatile}@
    38983876        P ?=?( P *, volatile T * );
    38993877        volatile T * ?=?( volatile T **, P );
    39003878};
    3901 trait m_l_ptr_to_const_volatile( otype P | ptr_to_const_volatile( P ),@\use{ptr_to_const_volatile}@@\impl{m_l_ptr_to_const_volatile}@
    3902                 otype T | m_l_ptr_to_volatile( P, T ) | m_l_ptr_to_const( P )) {@\use{m_l_ptr_to_const}@@\use{m_l_ptr_to_volatile}@
     3879trait m_l_ptr_to_const_volatile( type P | ptr_to_const_volatile( P ),@\use{ptr_to_const_volatile}@@\impl{m_l_ptr_to_const_volatile}@
     3880                type T | m_l_ptr_to_volatile( P, T ) | m_l_ptr_to_const( P )) {@\use{m_l_ptr_to_const}@@\use{m_l_ptr_to_volatile}@
    39033881        P ?=?( P *, const volatile T * );
    39043882        const volatile T * ?=?( const volatile T **, P );
  • doc/user/user.tex

    r78885b5 rbc1ab61  
    1 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -*- Mode: Latex -*- %%%%%%%%%%%%%%%%%%%%%%%%%%%%
    2 %%
    3 %% Cforall Version 1.0.0 Copyright (C) 2016 University of Waterloo
    4 %%
    5 %% The contents of this file are covered under the licence agreement in the
    6 %% file "LICENCE" distributed with Cforall.
    7 %%
    8 %% user.tex --
    9 %%
    10 %% Author           : Peter A. Buhr
    11 %% Created On       : Wed Apr  6 14:53:29 2016
    12 %% Last Modified By : Peter A. Buhr
    13 %% Last Modified On : Wed Apr  6 17:37:39 2016
    14 %% Update Count     : 34
    15 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    16 
    171% requires tex packages: texlive-base texlive-latex-base tex-common texlive-humanities texlive-latex-extra texlive-fonts-recommended
    182
     
    215
    226% Latex packages used in the document.
    23 \usepackage[T1]{fontenc}
    24 \usepackage{textcomp}
    25 \usepackage[latin1]{inputenc}
    26 \usepackage{upquote}
     7
    278\usepackage{fullpage,times}
    289\usepackage{xspace}
     
    4324% Names used in the document.
    4425
    45 \newcommand{\CFA}{C$\mathbf\forall$\xspace}     % set language symbolic name
     26\newcommand{\CFA}{C$\forall$\xspace}    % set language symbolic name
    4627\newcommand{\CFL}{Cforall\xspace}               % set language text name
    4728\newcommand{\CC}{C\kern-.1em\hbox{+\kern-.25em+}\xspace} % CC symbolic name
     
    179160% CFA based on ANSI C
    180161\lstdefinelanguage{CFA}[ANSI]{C}%
    181 {morekeywords={_Alignas,_Alignof,__alignof,__alignof__,asm,__asm,__asm__,_At,_Atomic,__attribute,__attribute__,auto,
    182     _Bool,catch,catchResume,choose,_Complex,__complex,__complex__,__const,__const__,disable,dtype,enable,__extension__,
    183         fallthru,finally,forall,ftype,_Generic,_Imaginary,inline,__label__,lvalue,_Noreturn,otype,restrict,_Static_assert,
    184         _Thread_local,throw,throwResume,trait,try,typeof,__typeof,__typeof__,},
    185   moredelim=**[is][\color{red}]{`}{`},
     162{morekeywords={asm,_Alignas,_Alignof,_At,_Atomic,_Bool,catch,catchResume,choose,_Complex,trait,disable,dtype,enable,
     163        fallthru,finally,forall,ftype,_Generic,_Imaginary,inline,lvalue,_Noreturn,otype,restrict,_Static_assert,
     164        _Thread_local,throw,throwResume,try,},
    186165}%
    187166
     
    197176showstringspaces=false,
    198177showlines=true,
    199 aboveskip=6pt,
    200 belowskip=4pt,
    201 literate={\\`}{\raisebox{0.3ex}{\ttfamily\upshape \hspace*{-2pt}`}}1, % escape \`, otherwise used to highlight in red
    202 %extendedchars=true,
    203178}%
    204179
     
    206181% replace/adjust listings characters that look bad in sanserif
    207182\lst@CCPutMacro
    208 \lst@ProcessOther{"22}{\lst@ttfamily{"}{\raisebox{0.3ex}{\ttfamily\upshape "}}} % replace double quote
    209 \lst@ProcessOther{"27}{\lst@ttfamily{'}{\raisebox{0.3ex}{\ttfamily\upshape '\hspace*{-2pt}}}} % replace single quote
    210 \lst@ProcessOther{"2D}{\lst@ttfamily{-}{\ttfamily\upshape -}} % replace minus
     183\lst@ProcessOther{"2D}{\lst@ttfamily{-{}}{{\ttfamily\upshape -}}} % replace minus
    211184\lst@ProcessOther{"3C}{\lst@ttfamily{<}{\texttt{<}}} % replace less than
    212185\lst@ProcessOther{"3E}{\lst@ttfamily{<}{\texttt{>}}} % replace greater than
    213186\lst@ProcessOther{"5E}{\raisebox{0.4ex}{$\scriptstyle\land\,$}} % replace circumflex
    214 \lst@ProcessOther{"5F}{\lst@ttfamily{\char95}{{\makebox[1.2ex][c]{\rule{1ex}{0.1ex}}}}} % replace underscore
    215 \lst@ProcessOther{"60}{\lst@ttfamily{`}{\raisebox{0.3ex}{\ttfamily\upshape \hspace*{-2pt}`}}} % replace backquote
     187\lst@ProcessLetter{"5F}{\lst@ttfamily{\char95}{{\makebox[1.2ex][c]{\rule{1ex}{0.1ex}}}}} % replace underscore
    216188\lst@ProcessOther{"7E}{\raisebox{0.3ex}{$\scriptstyle\sim\,$}} % replace tilde
    217189%\lst@ProcessOther{"7E}{\raisebox{-.4ex}[1ex][0pt]{\textasciitilde}} % lower tilde
     
    394366
    395367The command \lstinline@cfa@ is used to compile \CFA program(s).
    396 This command works like the GNU \lstinline@gcc@\index{gcc} command, e.g.:
     368This command works like the GNU \lstinline@gcc@ command, e.g.:
    397369\begin{lstlisting}
    398370cfa [ gcc-options ] C/@{\CFA}@-files [ assembler/loader-files ]
    399371\end{lstlisting}
    400 By default, \CFA programs having the following \lstinline@gcc@ flags turned on:
    401 \begin{description}
    402 \item
    403 \hspace*{-4pt}\lstinline@-std=gnu99@
    404 The 1999 C standard plus GNU extensions.
    405 \end{description}
    406 The following new \CFA option is available:
     372The following additional option is available:
    407373\begin{description}
    408374\item
     
    416382Numeric constants are extended to allow \Index{underscore}s within constants\index{constant!underscore}, e.g.:
    417383\begin{lstlisting}
    418 2`_`147`_`483`_`648;                            // decimal constant
     3842_147_483_648;                          // decimal constant
    41938556_ul;                                          // decimal unsigned long constant
    4203860_377;                                          // octal constant
     
    485451\multicolumn{1}{c@{\hspace{30pt}}}{\textbf{\CFA}}       & \multicolumn{1}{c}{\textbf{C}}        \\
    486452\begin{lstlisting}
    487 `* int x, y;`
     453* int x, y;
    488454\end{lstlisting}
    489455&
     
    605571The point of the new syntax is to allow returning multiple values from a routine~\cite{CLU,Galletly96}, e.g.:
    606572\begin{lstlisting}
    607 `[ int o1, int o2, char o3 ]` f( int i1, char i2, char i3 ) {
     573[ int o1, int o2, char o3 ] f( int i1, char i2, char i3 ) {
    608574        @\emph{routine body}@
    609575}
     
    673639Because the value in the return variable is automatically returned when a \CFA routine terminates, the \lstinline@return@ statement \emph{does not} contain an expression, as in:
    674640\begin{lstlisting}
    675 `[ int x ]` f() {
     641[ int x ] f() {
    676642        ... x = 0; ... x = y; ...
    677         `return;` // implicitly return x
     643        return; // implicitly return x
    678644}
    679645\end{lstlisting}
     
    731697for example, the following is incorrect:
    732698\begin{lstlisting}
    733 * [ int x ] f () fp;            // routine name "f" is not allowed
     699* [ int x ] f () fp;            // routine name ``f'' is not allowed
    734700\end{lstlisting}
    735701
     
    898864\subsection{Type Nesting}
    899865
    900 \CFA allows \Index{type nesting}, and type qualification of the nested types, where as C hoists\index{type!hoisting} (refactors) nested types into the enclosing scope and has no type qualification.
     866C allows \Index{type nesting}, but the nested types are hoisted\index{type!hoisting} (refactored) into the enclosing scope.
    901867\begin{quote2}
    902868\begin{tabular}{@{}l@{\hspace{30pt}}l|l@{}}
     
    953919
    954920int fred() {
    955         s.t.c = `S.`R;  // type qualification
    956         struct `S.`T t = { `S.`R, 1, 2 };
    957         enum `S.`C c;
    958         union `S.T.`U u;
     921        s.t.c = S.R;
     922        struct S.T t = { S.R, 1, 2 };
     923        enum S.C c;
     924        union S.T.U u;
    959925}
    960926\end{lstlisting}
    961927\end{tabular}
    962928\end{quote2}
    963 In the left example in C, types \lstinline@C@, \lstinline@U@ and \lstinline@T@ are implicitly hoisted outside of type \lstinline@S@ into the containing block scope.
    964 In the right example in \CFA, the types are not hoisted and accessed using the field-selection operator ``\lstinline@.@'' for type qualification, as does Java, rather than the \CC type-selection operator ``\lstinline@::@''.
     929
     930\CFA is C \emph{incompatible} on this issue, and provides semantics similar to \CC.
     931Nested types are not hoisted and can be referenced using the field selection operator ``\lstinline@.@'', unlike the \CC scope-resolution operator ``\lstinline@::@''.
     932Given that nested types in C are equivalent to not using them, i.e., they are essentially useless, it is unlikely there are any realistic usages that break because of this incompatibility.
    965933
    966934
     
    976944\begin{lstlisting}
    977945const unsigned int size = 10;
    978 int ia[size];
    979 ...                                             // assign values to array ia
    980 qsort( ia, size );              // sort ascending order using builtin ?<?
    981 {
    982         `int ?<?( int x, int y ) { return x > y; }` // nested routine
    983         qsort( ia, size );      // sort descending order by local redefinition
    984 }
    985 \end{lstlisting}
    986 
    987 Nested routines are not first-class, meaning a nested routine cannot be returned if it has references to variables in its enclosing blocks;
    988 the only exception is references to the external block of the translation unit, as these variables persist for the duration of the program.
    989 The following program in undefined in \CFA (and \lstinline@gcc@\index{gcc})
    990 \begin{lstlisting}
    991 [* [int]( int )] foo() {                // int (*foo())( int )
    992         int `i` = 7;
    993         int bar( int p ) {
    994                 `i` += 1;                                       // dependent on local variable
    995                 sout | `i` | endl;
    996         }
    997         return bar;                                     // undefined because of local dependence
    998 }
    999 int main() {
    1000         * [int](int) fp = foo();        // int (*fp)(int)
    1001     sout | fp( 3 ) | endl;
    1002 }
    1003 \end{lstlisting}
    1004 because
    1005 
    1006 Currently, there are no \Index{lambda} expressions, i.e., unnamed routines because routine names are very important to properly select the correct routine.
     946int a[size];
     947
     948qsort( a, size );               // ascending order using built in ?<?
     949{                                               // descending order by local redefinition
     950        int ?<?( int a, int b ) { return a > b; } // nested routine
     951        qsort( a, size );
     952}
     953\end{lstlisting}
    1007954
    1008955
     
    10661013
    10671014\item
    1068 Change: A struct is a scope in C++, not in C \\
    1069 Rationale: Class scope is crucial to C++, and a struct is a class. \\
    1070 Effect on original feature: Change to semantics of well-defined feature. \\
    1071 Difficulty of converting: Semantic transformation. \\
    1072 How widely used: C programs use struct extremely frequently, but the change is only noticeable when struct, enumeration, or enumerator names are referred to outside the struct.
    1073 The latter is probably rare.
    1074 
    1075 \CFA is C \emph{incompatible} on this issue, and provides semantics similar to \CC.
    1076 Nested types are not hoisted and can be referenced using the field selection operator ``\lstinline@.@'', unlike the \CC scope-resolution operator ``\lstinline@::@''.
    1077 Given that nested types in C are equivalent to not using them, i.e., they are essentially useless, it is unlikely there are any realistic usages that break because of this incompatibility.
    1078 
     1015Change: A struct is a scope in C++, not in C
     1016Rationale: Class scope is crucial to C++, and a struct is a class.
     1017Effect on original feature: Change to semantics of well-defined feature.
     1018Difficulty of converting: Semantic transformation.
     1019How widely used: C programs use struct extremely frequently, but the change is only noticeable when
     1020struct, enumeration, or enumerator names are referred to outside the struct. The latter is probably
     1021rare.
    10791022
    10801023\item
     
    12421185First the right-hand tuple is flattened and then the values are assigned individually.
    12431186Flattening is also performed on tuple types.
    1244 For example, the type \lstinline@[ int, [ int, int ], int ]@ can be coerced, using flattening, into the type \lstinline@[ int, int, int, int ]@.
     1187For example, the type \lstinline@[ int, [ int, int ], int ]@ can be coerced, using flattening, into the type lstinline@[ int, int, int, int ]@.
    12451188
    12461189A \newterm{structuring coercion} is the opposite of flattening;
     
    14091352\multicolumn{1}{c@{\hspace{30pt}}}{\textbf{\CFA}}       & \multicolumn{1}{c}{\textbf{C}}        \\
    14101353\begin{lstlisting}
    1411 `L1:` for ( ... ) {
    1412         `L2:` for ( ... ) {
    1413                 `L3:` for ( ... ) {
    1414                         ... break `L1`; ...
    1415                         ... break `L2`; ...
    1416                         ... break `L3`; // or break
     1354L1: for ( ... ) {
     1355        L2: for ( ... ) {
     1356                L3: for ( ... ) {
     1357                        ... break L1; ...
     1358                        ... break L2; ...
     1359                        ... break L3; // or break
    14171360                }
    14181361        }
     
    14391382\multicolumn{1}{c@{\hspace{30pt}}}{\textbf{\CFA}}       & \multicolumn{1}{c}{\textbf{C}}        \\
    14401383\begin{lstlisting}
    1441 `L1`: for ( ... ) {
    1442         `L2`: for ( ... ) {
    1443                 `L3`: for ( ... ) {
    1444                         ... continue `L1`; ...
    1445                         ... continue `L2`; ...
    1446                         ... continue `L3`; ...
     1384L1: for ( ... ) {
     1385        L2: for ( ... ) {
     1386                L3: for ( ... ) {
     1387                        ... continue L1; ...
     1388                        ... continue L2; ...
     1389                        ... continue L3; ...
    14471390
    14481391                }
     
    16801623\begin{lstlisting}
    16811624switch ( i ) {
    1682   `case 1, 3, 5`:
     1625  case 1, 3, 5:
    16831626        ...
    1684   `case 2, 4, 6`:
     1627  case 2, 4, 6:
    16851628        ...
    16861629}
     
    16911634  case 1: case 3 : case 5:
    16921635        ...
    1693   case 2: case 4 : case 6:
     1636  case 2: case 4 : case 6: /* even values */
    16941637        ...
    16951638}
     
    17121655\begin{lstlisting}
    17131656switch ( i ) {
    1714   `case 1~5:`
     1657  case 1~5
    17151658        ...
    1716   `case 10~15:`
     1659  case 10~15
    17171660        ...
    17181661}
     
    17291672&
    17301673\begin{lstlisting}
    1731 
    17321674// 1, 2, 3, 4, 5
    17331675
     
    22262168
    22272169
    2228 \section{Auto Type-Inferencing}
    2229 
    2230 Auto type-inferencing occurs in a declaration where a variable's type is inferred from its initialization expression type.
    2231 \begin{quote2}
    2232 \begin{tabular}{@{}l@{\hspace{30pt}}ll@{}}
    2233 \multicolumn{1}{c@{\hspace{30pt}}}{\textbf{\CC}}        & \multicolumn{1}{c}{\lstinline@gcc@}\index{gcc} \\
    2234 \begin{lstlisting}
    2235 
    2236 auto j = 3.0 * 4;
    2237 int i;
    2238 auto k = i;
    2239 \end{lstlisting}
    2240 &
    2241 \begin{lstlisting}
    2242 #define expr 3.0 * i
    2243 typeof(expr) j = expr;
    2244 int i;
    2245 typeof(i) k = i;
    2246 \end{lstlisting}
    2247 &
    2248 \begin{lstlisting}
    2249 
    2250 // use type of initialization expression
    2251 
    2252 // use type of primary variable
    2253 \end{lstlisting}
    2254 \end{tabular}
    2255 \end{quote2}
    2256 The two important capabilities are:
    2257 \begin{itemize}
    2258 \item
    2259 preventing having to determine or write out long generic types,
    2260 \item
    2261 ensure secondary variables, related to a primary variable, always have the same type.
    2262 \end{itemize}
    2263 
    2264 In \CFA, \lstinline@typedef@ provides a mechanism to alias long type names with short ones, both globally and locally, but not eliminate the use of the short name.
    2265 \lstinline@gcc@ provides \lstinline@typeof@ to declare a secondary variable from a primary variable.
    2266 \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.
    2267 Only for overloaded routines with the same return type is variable type-inferencing possible.
    2268 Finally, \lstinline@auto@ presents the programming problem of tracking down a type when the type is actually needed.
    2269 For example, given
    2270 \begin{lstlisting}
    2271 auto j = `...`
    2272 \end{lstlisting}
    2273 and the need to write a routine to compute using \lstinline@j@
    2274 \begin{lstlisting}
    2275 void rtn( `...` parm );
    2276 rtn( j );
    2277 \end{lstlisting}
    2278 A programmer must work backwards to determine the type of \lstinline@j@'s initialization expression, reconstructing the possibly long generic type-name.
    2279 In this situation, having the type name or a short alias is very useful.
    2280 
    2281 There is also the conundrum in type inferencing of when to \emph{\Index{brand}} a type.
    2282 That is, when is the type of the variable more important than the type of its initialization expression.
    2283 For example, if a change is made in an initialization expression, it can cause hundreds or thousands of cascading type changes and/or errors.
    2284 At some point, a programmer wants the type of the variable to remain constant and the expression to be in error when it changes.
    2285 
    2286 Given \lstinline@typedef@ and \lstinline@typeof@ in \CFA, and the strong need to use the type of left-hand side in inferencing, auto type-inferencing is not supported at this time.
    2287 Should a significant need arise, this feature can be revisited.
    2288 
    2289 
    2290 \section{Generics}
     2170\section{Generics }
    22912171
    22922172\CFA supports parametric polymorphism to allow users to define generic functions and types.
     
    25772457
    25782458
    2579 \section{Syntactic Anomalies}
    2580 
    2581 The number 0 and 1 are treated specially in \CFA, and can be redefined as variables.
    2582 One syntactic anomaly is when a field in an structure is names 0 or 1:
    2583 \begin{lstlisting}
    2584 struct S {
    2585         int 0, 1;
    2586 } s;
    2587 \end{lstlisting}
    2588 The problem occurs in accesing these fields using the selection operation ``\lstinline@.@'':
    2589 \begin{lstlisting}
    2590 s.0 = 0;        // ambiguity with floating constant .0
    2591 s.1 = 1;        // ambiguity with floating constant .1
    2592 \end{lstlisting}
    2593 To make this work, a space is required after the field selection:
    2594 \begin{lstlisting}
    2595 `s.@\textvisiblespace@0` = 0;
    2596 `s.@\textvisiblespace@1` = 1;
    2597 \end{lstlisting}
    2598 While this sytact is awkward, it is unlikely many programers will name fields of a structure 0 or 1.
    2599 Like the \CC lexical problem with closing template-syntax, e.g, \lstinline@Foo<Bar<int`>>`@, this issue can be solved with a more powerful lexer/parser.
    2600 
    2601 There are several ambiguous cases with operator identifiers, e.g., \lstinline@int *?*?()@, where the string \lstinline@*?*?@ can be lexed as \lstinline@*@/\lstinline@?*?@ or \lstinline@*?@/\lstinline@*?@.
    2602 Since it is common practise to put a unary operator juxtaposed to an identifier, e.g., \lstinline@*i@, users will be annoyed if they cannot do this with respect to operator identifiers.
    2603 Even with this special hack, there are 5 general cases that cannot be handled.
    2604 The first case is for the function-call identifier \lstinline@?()@:
    2605 \begin{lstlisting}
    2606 int *@\textvisiblespace@?()();  // declaration: space required after '*'
    2607 *@\textvisiblespace@?()();              // expression: space required after '*'
    2608 \end{lstlisting}
    2609 Without the space, the string \lstinline@*?()@ is ambiguous without N character look ahead;
    2610 it requires scanning ahead to determine if there is a \lstinline@'('@, which is the start of an argument/parameter list.
    2611 
    2612 The 4 remaining cases occur in expressions:
    2613 \begin{lstlisting}
    2614 i++@\textvisiblespace@?i:0;             // space required before '?'
    2615 i--@\textvisiblespace@?i:0;             // space required before '?'
    2616 i@\textvisiblespace@?++i:0;             // space required after '?'
    2617 i@\textvisiblespace@?--i:0;             // space required after '?'
    2618 \end{lstlisting}
    2619 In the first two cases, the string \lstinline@i++?@ is ambiguous, where this string can be lexed as \lstinline@i@ / \lstinline@++?@ or \lstinline@i++@ / \lstinline@?@;
    2620 it requires scanning ahead to determine if there is a \lstinline@'('@, which is the start of an argument list.
    2621 In the second two cases, the string \lstinline@?++x@ is ambiguous, where this string can be lexed as \lstinline@?++@ / \lstinline@x@ or \lstinline@?@ / y\lstinline@++x@;
    2622 it requires scanning ahead to determine if there is a \lstinline@'('@, which is the start of an argument list.
     2459\section{I/O Library}
     2460\label{s:IOLibrary}
     2461
     2462The goal for \CFA I/O is to make I/O as simple as possible for the general case, while fully supporting polmorphism and user defined types in a consistent way.
     2463The general case is printing out a sequence of variables separated by whitespace.
     2464\begin{lstlisting}
     2465int x = 0, y = 1, z = 2;
     2466sout | x | y | z | endl;
     2467
     2468cout << x << " " << y << " " << z << endl;
     2469\end{lstlisting}
     2470The \CC form takes almost twice as many characters.
     2471
     2472The logical-or operator is used because it is the lowest priority overloadable operator, other than assignment.
     2473Therefore, most output expressions do not require parenthesis.
     2474\begin{lstlisting}
     2475int x = 0, y = 1, z = 2;
     2476sout | x * 3 | y + 1 | z << 2 | x == y | (x | y) | (x || y) | (x > z ? 1 : 2) | endl;
     2477
     2478cout << x * 3 << y + 1 << (z << 2) << (x == y) << (x | y) << (x || y) << (x > z ? 1 : 2) << endl;
     2479\end{lstlisting}
     2480
     2481Finally, the logical-or operator has a link with the Shell pipe-operator for moving data, although data flows in the opposite direction.
     2482
     2483\begin{figure}
     2484\begin{lstlisting}[mathescape=off]
     2485#include <fstream>
     2486
     2487int main() {
     2488        char c;
     2489        short int si;
     2490        unsigned short int usi;
     2491        int i;
     2492        unsigned int ui;
     2493        long int li;
     2494        unsigned long int uli;
     2495        long long int lli;
     2496        unsigned long long int ulli;
     2497        float f;
     2498        double d;
     2499        long double ld;
     2500        float _Complex fc;
     2501        double _Complex dc;
     2502        long double _Complex ldc;
     2503        char s1[10], s2[10];
     2504
     2505        ifstream in;
     2506        open( &in, "read.data", "r" );
     2507
     2508        &in | &c
     2509                | &si | &usi | &i | &ui | &li | &uli | &lli | &ulli
     2510                | &f | &d | &ld
     2511                | &fc | &dc | &ldc
     2512                | str( s1 ) | str( s2, 10 );
     2513
     2514        sout | c | ' ' | endl
     2515                 | si | usi | i | ui | li | uli | lli | ulli | endl
     2516                 | f | d | ld | endl
     2517                 | f | "" | d | "" | ld | endl;
     2518
     2519        sepSet( sout, ", $" );
     2520        sout | fc | dc | ldc | endl
     2521                 | sepOn | s1 | sepOff | s2 | endl
     2522                 | s1 | "" | s2 | endl;
     2523}
     2524
     2525$ cat read.data
     2526A 1 2 3 4 5 6 7 8 1.1 1.2 1.3 1.1+2.3 1.1-2.3 1.1-2.3 abc xyz
     2527$ a.out
     2528A
     25291 2 3 4 5 6 7 8
     25301.1 1.2 1.3
     25311.11.21.3
     25321.1+2.3i, $1.1-2.3i, $1.1-2.3i
     2533, $abcxyz
     2534abcxyz
     2535\end{lstlisting}
     2536\end{figure}
     2537
     2538
     2539\section{Standard Library}
     2540\label{s:StandardLibrary}
     2541
     2542The goal of the \CFA standard-library is to wrap many of the existing C library-routines that are explicitly polymorphic into implicitly polymorphic versions.
     2543
     2544
     2545\subsection{malloc}
     2546
     2547\begin{lstlisting}
     2548forall( otype T ) T * malloc( void );
     2549forall( otype T ) T * malloc( char fill );
     2550forall( otype T ) T * malloc( T * ptr, size_t size );
     2551forall( otype T ) T * malloc( T * ptr, size_t size, unsigned char fill );
     2552forall( otype T ) T * calloc( size_t size );
     2553forall( otype T ) T * realloc( T * ptr, size_t size );
     2554forall( otype T ) T * realloc( T * ptr, size_t size, unsigned char fill );
     2555
     2556forall( otype T ) T * aligned_alloc( size_t alignment );
     2557forall( otype T ) T * memalign( size_t alignment );             // deprecated
     2558forall( otype T ) int posix_memalign( T ** ptr, size_t alignment );
     2559
     2560forall( otype T ) T * memset( T * ptr, unsigned char fill ); // use default value '\0' for fill
     2561forall( otype T ) T * memset( T * ptr );                                // remove when default value available
     2562\end{lstlisting}
     2563
     2564
     2565\subsection{ato/strto}
     2566
     2567\begin{lstlisting}
     2568int ato( const char * ptr );
     2569unsigned int ato( const char * ptr );
     2570long int ato( const char * ptr );
     2571unsigned long int ato( const char * ptr );
     2572long long int ato( const char * ptr );
     2573unsigned long long int ato( const char * ptr );
     2574float ato( const char * ptr );
     2575double ato( const char * ptr );
     2576long double ato( const char * ptr );
     2577float _Complex ato( const char * ptr );
     2578double _Complex ato( const char * ptr );
     2579long double _Complex ato( const char * ptr );
     2580
     2581int strto( const char * sptr, char ** eptr, int base );
     2582unsigned int strto( const char * sptr, char ** eptr, int base );
     2583long int strto( const char * sptr, char ** eptr, int base );
     2584unsigned long int strto( const char * sptr, char ** eptr, int base );
     2585long long int strto( const char * sptr, char ** eptr, int base );
     2586unsigned long long int strto( const char * sptr, char ** eptr, int base );
     2587float strto( const char * sptr, char ** eptr );
     2588double strto( const char * sptr, char ** eptr );
     2589long double strto( const char * sptr, char ** eptr );
     2590float _Complex strto( const char * sptr, char ** eptr );
     2591double _Complex strto( const char * sptr, char ** eptr );
     2592long double _Complex strto( const char * sptr, char ** eptr );
     2593\end{lstlisting}
     2594
     2595
     2596\subsection{bsearch/qsort}
     2597
     2598\begin{lstlisting}
     2599forall( otype T | { int ?<?( T, T ); } )
     2600T * bsearch( const T key, const T * arr, size_t dimension );
     2601
     2602forall( otype T | { int ?<?( T, T ); } )
     2603void qsort( const T * arr, size_t dimension );
     2604\end{lstlisting}
     2605
     2606
     2607\subsection{abs}
     2608
     2609\begin{lstlisting}
     2610char abs( char );
     2611extern "C" {
     2612int abs( int );         // use default C routine for int
     2613} // extern
     2614long int abs( long int );
     2615long long int abs( long long int );
     2616float abs( float );
     2617double abs( double );
     2618long double abs( long double );
     2619float _Complex abs( float _Complex );
     2620double _Complex abs( double _Complex );
     2621long double _Complex abs( long double _Complex );
     2622\end{lstlisting}
     2623
     2624
     2625\subsection{random}
     2626
     2627\begin{lstlisting}
     2628void randseed( long int s );
     2629char random();
     2630int random();
     2631unsigned int random();
     2632long int random();
     2633unsigned long int random();
     2634float random();
     2635double random();
     2636float _Complex random();
     2637double _Complex random();
     2638long double _Complex random();
     2639\end{lstlisting}
     2640
     2641
     2642\subsection{min/max/swap}
     2643
     2644\begin{lstlisting}
     2645forall( otype T | { int ?<?( T, T ); } )
     2646T min( const T t1, const T t2 );
     2647
     2648forall( otype T | { int ?>?( T, T ); } )
     2649T max( const T t1, const T t2 );
     2650
     2651forall( otype T )
     2652void swap( T * t1, T * t2 );
     2653\end{lstlisting}
    26232654
    26242655
     
    26452676
    26462677task creates a type with implicit locking, separate stack, and a thread
    2647 
    26482678
    26492679\subsection{Monitors}
     
    37453775\multicolumn{1}{c|}{\textbf{\CFA/\CC}} & \multicolumn{1}{c|}{\textbf{Go}} & \multicolumn{1}{c}{\textbf{Rust}}   \\
    37463776\hline
    3747 \begin{lstlisting}[boxpos=t]
     3777\begin{lstlisting}
    37483778extern "C" {
    37493779#include <sys/types.h>
     
    37523782}
    37533783size_t fileSize( const char *path ) {
    3754         struct stat s;
     3784        stat s;
    37553785        stat(path, &s);
    37563786        return s.st_size;
     
    37583788\end{lstlisting}
    37593789&
    3760 \begin{lstlisting}[boxpos=t]
     3790\begin{lstlisting}
    37613791/*
    37623792#cgo
     
    37773807\end{lstlisting}
    37783808&
    3779 \begin{lstlisting}[boxpos=t]
     3809\begin{lstlisting}
    37803810use libc::{c_int, size_t};
     3811
     3812// The following declarations are
    37813813// translated from sys/stat.h
    37823814#[repr(C)]
     
    37863818        ...
    37873819}
     3820
    37883821#[link(name = "libc")]
    37893822extern {
     
    37913824        buf: *mut stat_t) -> c_int;
    37923825}
     3826
    37933827fn fileSize(path: *const u8) -> size_t
    37943828{
    37953829        unsafe {
    3796                 let mut buf: stat_t = uninit();
    3797                 stat(path, &mut buf);
    3798                 buf.st_size
     3830        let mut buf: stat_t = uninit();
     3831        stat(path, &mut buf);
     3832        buf.st_size
    37993833        }
    38003834}
     
    39193953
    39203954
    3921 \begin{comment}
    39223955\subsubsection{Modules/Packages}
    39233956
     
    39994032}
    40004033\end{lstlisting}
    4001 \end{comment}
    4002 
    40034034
    40044035\subsubsection{Parallel Tasks}
     
    41564187\end{flushleft}
    41574188
    4158 \lstset{basicstyle=\sf\relsize{-1}}
    4159 
    4160 
    41614189\subsection{Summary of Language Comparison}
    41624190
     
    42254253D does not have any built-in concurrency constructs in the
    42264254language, though it does have a standard library for concurrency which includes the low-level primitives for concurrency.
    4227 
    4228 
    4229 \appendix
    4230 
    4231 
    4232 \section{I/O Library}
    4233 \label{s:IOLibrary}
    4234 \index{input/output library}
    4235 
    4236 The goal for \CFA I/O is to make I/O as simple as possible for the general case, while fully supporting polmorphism and user defined types in a consistent way.
    4237 The general case is printing out a sequence of variables separated by whitespace.
    4238 \begin{quote2}
    4239 \begin{tabular}{@{}l@{\hspace{30pt}}l@{}}
    4240 \multicolumn{1}{c@{\hspace{30pt}}}{\textbf{\CFA}}       & \multicolumn{1}{c}{\textbf{\CC}}      \\
    4241 \begin{lstlisting}
    4242 int x = 0, y = 1, z = 2;
    4243 `sout` `|` x `|` y `|` z `| endl`;
    4244 \end{lstlisting}
    4245 &
    4246 \begin{lstlisting}
    4247 
    4248 cout << x << " " << y << " " << z << endl;
    4249 \end{lstlisting}
    4250 \end{tabular}
    4251 \end{quote2}
    4252 The \CFA form is half as many characters, and is similar to Python I/O with respect to implicit separators.
    4253 
    4254 The logical-or operator is used because it is the lowest-priority overloadable operator, other than assignment.
    4255 Therefore, fewer output expressions require parenthesis.
    4256 \begin{quote2}
    4257 \begin{tabular}{@{}ll@{}}
    4258 \textbf{\CFA:}
    4259 &
    4260 \begin{lstlisting}
    4261 sout | x * 3 | y + 1 | z << 2 | x == y | (x | y) | (x || y) | (x > z ? 1 : 2) | endl;
    4262 \end{lstlisting}
    4263 \\
    4264 \textbf{\CC:}
    4265 &
    4266 \begin{lstlisting}
    4267 cout << x * 3 << y + 1 << (z << 2) << (x == y) << (x | y) << (x || y) << (x > z ? 1 : 2) << endl;
    4268 \end{lstlisting}
    4269 \end{tabular}
    4270 \end{quote2}
    4271 Finally, the logical-or operator has a link with the Shell pipe-operator for moving data, although data flows in the opposite direction.
    4272 
    4273 The implicit seperator\index{I/O separator} character (space/blank) is a separator not a terminator.
    4274 The rules for implicitly adding the separator are:
    4275 \begin{enumerate}
    4276 \item
    4277 A seperator does not appear at the start or end of a line.
    4278 \begin{lstlisting}[belowskip=0pt]
    4279 sout 1 | 2 | 3 | endl;
    4280 \end{lstlisting}
    4281 \begin{lstlisting}[mathescape=off,showspaces=true,aboveskip=0pt,belowskip=0pt]
    4282 1 2 3
    4283 \end{lstlisting}
    4284 \item
    4285 A seperator does not appear before or after a character literal or variable.
    4286 \begin{lstlisting}
    4287 sout | '1' | '2' | '3' | endl;
    4288 123
    4289 \end{lstlisting}
    4290 \item
    4291 A seperator does not appear before or after a null (empty) C string
    4292 \begin{lstlisting}
    4293 sout | 1 | "" | 2 | "" | 3 | endl;
    4294 123
    4295 \end{lstlisting}
    4296 which is a local mechanism to disable insertion of the separator character.
    4297 \item
    4298 A seperator does not appear before a C string starting with the \Index{extended ASCII}\index{ASCII} characters: \lstinline[mathescape=off]@([{$£¥¿«@
    4299 %$
    4300 \begin{lstlisting}[mathescape=off]
    4301 sout | "x (" | 1 | "x [" | 2 | "x {" | 3 | "x $" | 4 | "x £" | 5 | "x ¥" | 6 | "x ¿" | 7 | "x «" | 8 | endl;
    4302 \end{lstlisting}
    4303 %$
    4304 \begin{lstlisting}[mathescape=off,showspaces=true,aboveskip=0pt,belowskip=0pt]
    4305 x (1 x [2 x {3 x $4 x £5 x ¥6 x ¿7 x «8
    4306 \end{lstlisting}
    4307 %$
    4308 \item
    4309 A seperator does not appear after a C string ending with the extended ASCII characters: \lstinline@,.:;!?)]}%¢»@
    4310 \begin{lstlisting}[belowskip=0pt]
    4311 sout | 1 | ", x" | 2 | ". x" | 3 | ": x" | 4 | "; x" | 5 | "! x" | 6 | "? x" | 7 | ") x" | 8 | "] x" | 9 | "} x"
    4312          | 10 | "% x" | 11 | L"¢ x" | 12 | L"» x" | endl;
    4313 \end{lstlisting}
    4314 \begin{lstlisting}[mathescape=off,showspaces=true,aboveskip=0pt,belowskip=0pt]
    4315 1, x 2. x 3: x 4; x 5! x 6? x 7) x 8] x 9} x 10% x 11¢ 12»
    4316 \end{lstlisting}
    4317 \item
    4318 A seperator does not appear before or after a C string begining/ending with the characters: \lstinline@\f\n\r\t\v\`'"@
    4319 \begin{lstlisting}[belowskip=0pt]
    4320 sout | "x '" | 1 | "' x \`" | 2 | "\` x \"" | 3 | "\" x" | endl;
    4321 \end{lstlisting}
    4322 \begin{lstlisting}[mathescape=off,showspaces=true,aboveskip=0pt,belowskip=0pt]
    4323 x '1' x \`2\` x "3" x
    4324 \end{lstlisting}
    4325 \begin{lstlisting}[showtabs=true,aboveskip=0pt]
    4326 sout | "x\t" | 1 | "\tx" | endl;
    4327 x       1       x
    4328 \end{lstlisting}
    4329 \end{enumerate}
    4330 The following \CC-style \Index{manipulator}s allow further control over implicit seperation.
    4331 \begin{lstlisting}[mathescape=off,belowskip=0pt]
    4332 sout | sepOn | 1 | 2 | 3 | sepOn | endl;        // separator at start of line
    4333 \end{lstlisting}
    4334 \begin{lstlisting}[mathescape=off,showspaces=true,aboveskip=0pt,belowskip=0pt]
    4335  1 2 3
    4336 \end{lstlisting}
    4337 \begin{lstlisting}[mathescape=off,aboveskip=0pt,belowskip=0pt]
    4338 sout | 1 | sepOff | 2 | 3 | endl;                       // turn off implicit separator temporarily
    4339 \end{lstlisting}
    4340 \begin{lstlisting}[mathescape=off,showspaces=true,aboveskip=0pt,belowskip=0pt]
    4341 12 3
    4342 \end{lstlisting}
    4343 \begin{lstlisting}[mathescape=off,aboveskip=0pt,belowskip=0pt]
    4344 sout | sepDisable | 1 | 2 | 3 | endl;           // turn off implicit separation, affects all subsequent prints
    4345 \end{lstlisting}
    4346 \begin{lstlisting}[mathescape=off,showspaces=true,aboveskip=0pt,belowskip=0pt]
    4347 123
    4348 \end{lstlisting}
    4349 \begin{lstlisting}[mathescape=off,aboveskip=0pt,belowskip=0pt]
    4350 sout | 1 | sepOn | 2 | 3 | endl;                        // turn on implicit separator temporarily
    4351 \end{lstlisting}
    4352 \begin{lstlisting}[mathescape=off,showspaces=true,aboveskip=0pt,belowskip=0pt]
    4353 1 23
    4354 \end{lstlisting}
    4355 \begin{lstlisting}[mathescape=off,aboveskip=0pt,belowskip=0pt]
    4356 sout | sepEnable | 1 | 2 | 3 | endl;            // turn on implicit separation, affects all subsequent prints
    4357 \end{lstlisting}
    4358 \begin{lstlisting}[mathescape=off,showspaces=true,aboveskip=0pt,belowskip=0pt]
    4359 1 2 3
    4360 \end{lstlisting}
    4361 \begin{lstlisting}[mathescape=off,aboveskip=0pt,aboveskip=0pt,belowskip=0pt]
    4362 sepSet( sout, ", $" );                                          // change separator from " " to ", $"
    4363 sout | 1 | 2 | 3 | endl;
    4364 \end{lstlisting}
    4365 %$
    4366 \begin{lstlisting}[mathescape=off,showspaces=true,aboveskip=0pt]
    4367 1, $2, $3
    4368 \end{lstlisting}
    4369 %$
    4370 \VRef[Figure]{f:ExampleIO} shows an example of input and output I/O in \CFA.
    4371 
    4372 \begin{figure}
    4373 \begin{lstlisting}[mathescape=off]
    4374 #include <fstream>
    4375 
    4376 int main() {
    4377         char c;                                                                                                         // basic types
    4378         short int si;
    4379         unsigned short int usi;
    4380         int i;
    4381         unsigned int ui;
    4382         long int li;
    4383         unsigned long int uli;
    4384         long long int lli;
    4385         unsigned long long int ulli;
    4386         float f;
    4387         double d;
    4388         long double ld;
    4389         float _Complex fc;
    4390         double _Complex dc;
    4391         long double _Complex ldc;
    4392         char s1[10], s2[10];
    4393 
    4394         ifstream in;                                                                                            // create / open file
    4395         open( &in, "input.data", "r" );
    4396 
    4397         &in | &c                                                                                                        // character
    4398                 | &si | &usi | &i | &ui | &li | &uli | &lli | &ulli             // integral
    4399                 | &f | &d | &ld                                                                                 // floating point
    4400                 | &fc | &dc | &ldc                                                                              // floating-point complex
    4401                 | cstr( s1 ) | cstr( s2, 10 );                                                  // C string, length unchecked and checked
    4402 
    4403         sout | c | ' ' | endl                                                                           // character
    4404                  | si | usi | i | ui | li | uli | lli | ulli | endl             // integral
    4405                  | f | d | ld | endl                                                                    // floating point
    4406                  | fc | dc | ldc | endl;                                                                // complex
    4407         sout | endl;
    4408         sout | f | "" | d | "" | ld | endl                                                      // floating point without separator
    4409                  | sepDisable | fc | dc | ldc | sepEnable | endl                // complex without separator
    4410                  | sepOn | s1 | sepOff | s2 | endl                                              // local separator removal
    4411                  | s1 | "" | s2 | endl;                                                                 // C string withou separator
    4412         sout | endl;
    4413         sepSet( sout, ", $" );                                                                          // change separator, maximum of 15 characters
    4414         sout | f | d | ld | endl                                                                        // floating point without separator
    4415                  | fc | dc | ldc | endl                                                                 // complex without separator
    4416                  | s1 | s2 | endl;
    4417 }
    4418 
    4419 $ cat input.data
    4420 A 1 2 3 4 5 6 7 8 1.1 1.2 1.3 1.1+2.3 1.1-2.3 1.1-2.3 abc xyz
    4421 $ a.out
    4422 A
    4423 1 2 3 4 5 6 7 8
    4424 1.1 1.2 1.3
    4425 1.1+2.3i 1.1-2.3i 1.1-2.3i
    4426 
    4427 1.11.21.3
    4428 1.1+2.3i1.1-2.3i1.1-2.3i
    4429  abcxyz
    4430 abcxyz
    4431 
    4432 1.1, $1.2, $1.3
    4433 1.1+2.3i, $1.1-2.3i, $1.1-2.3i
    4434 abc, $xyz
    4435 \end{lstlisting}
    4436 \caption{Example I/O}
    4437 \label{f:ExampleIO}
    4438 \end{figure}
    4439 
    4440 
    4441 \section{Standard Library}
    4442 \label{s:StandardLibrary}
    4443 
    4444 The goal of the \CFA standard-library is to wrap many of the existing C library-routines that are explicitly polymorphic into implicitly polymorphic versions.
    4445 
    4446 
    4447 \subsection{malloc}
    4448 
    4449 \begin{lstlisting}
    4450 forall( otype T ) T * malloc( void );
    4451 forall( otype T ) T * malloc( char fill );
    4452 forall( otype T ) T * malloc( T * ptr, size_t size );
    4453 forall( otype T ) T * malloc( T * ptr, size_t size, unsigned char fill );
    4454 forall( otype T ) T * calloc( size_t size );
    4455 forall( otype T ) T * realloc( T * ptr, size_t size );
    4456 forall( otype T ) T * realloc( T * ptr, size_t size, unsigned char fill );
    4457 
    4458 forall( otype T ) T * aligned_alloc( size_t alignment );
    4459 forall( otype T ) T * memalign( size_t alignment );             // deprecated
    4460 forall( otype T ) int posix_memalign( T ** ptr, size_t alignment );
    4461 
    4462 forall( otype T ) T * memset( T * ptr, unsigned char fill ); // use default value '\0' for fill
    4463 forall( otype T ) T * memset( T * ptr );                                // remove when default value available
    4464 \end{lstlisting}
    4465 
    4466 
    4467 \subsection{ato/strto}
    4468 
    4469 \begin{lstlisting}
    4470 int ato( const char * ptr );
    4471 unsigned int ato( const char * ptr );
    4472 long int ato( const char * ptr );
    4473 unsigned long int ato( const char * ptr );
    4474 long long int ato( const char * ptr );
    4475 unsigned long long int ato( const char * ptr );
    4476 float ato( const char * ptr );
    4477 double ato( const char * ptr );
    4478 long double ato( const char * ptr );
    4479 float _Complex ato( const char * ptr );
    4480 double _Complex ato( const char * ptr );
    4481 long double _Complex ato( const char * ptr );
    4482 
    4483 int strto( const char * sptr, char ** eptr, int base );
    4484 unsigned int strto( const char * sptr, char ** eptr, int base );
    4485 long int strto( const char * sptr, char ** eptr, int base );
    4486 unsigned long int strto( const char * sptr, char ** eptr, int base );
    4487 long long int strto( const char * sptr, char ** eptr, int base );
    4488 unsigned long long int strto( const char * sptr, char ** eptr, int base );
    4489 float strto( const char * sptr, char ** eptr );
    4490 double strto( const char * sptr, char ** eptr );
    4491 long double strto( const char * sptr, char ** eptr );
    4492 float _Complex strto( const char * sptr, char ** eptr );
    4493 double _Complex strto( const char * sptr, char ** eptr );
    4494 long double _Complex strto( const char * sptr, char ** eptr );
    4495 \end{lstlisting}
    4496 
    4497 
    4498 \subsection{bsearch/qsort}
    4499 
    4500 \begin{lstlisting}
    4501 forall( otype T | { int ?<?( T, T ); } )
    4502 T * bsearch( const T key, const T * arr, size_t dimension );
    4503 
    4504 forall( otype T | { int ?<?( T, T ); } )
    4505 void qsort( const T * arr, size_t dimension );
    4506 \end{lstlisting}
    4507 
    4508 
    4509 \subsection{abs}
    4510 
    4511 \begin{lstlisting}
    4512 char abs( char );
    4513 extern "C" {
    4514 int abs( int );                         // use default C routine for int
    4515 } // extern "C"
    4516 long int abs( long int );
    4517 long long int abs( long long int );
    4518 float abs( float );
    4519 double abs( double );
    4520 long double abs( long double );
    4521 float _Complex abs( float _Complex );
    4522 double _Complex abs( double _Complex );
    4523 long double _Complex abs( long double _Complex );
    4524 \end{lstlisting}
    4525 
    4526 
    4527 \subsection{floor/ceil}
    4528 
    4529 \begin{lstlisting}
    4530 float floor( float );
    4531 extern "C" {
    4532 double floor( double );         // use C routine for double
    4533 } // extern "C"
    4534 long double floor( long double );
    4535 
    4536 float ceil( float );
    4537 extern "C" {
    4538 double ceil( double );          // use C routine for double
    4539 } // extern "C"
    4540 long double ceil( long double );
    4541 \end{lstlisting}
    4542 
    4543 
    4544 \subsection{random}
    4545 
    4546 \begin{lstlisting}
    4547 void rand48seed( long int s );
    4548 char rand48();
    4549 int rand48();
    4550 unsigned int rand48();
    4551 long int rand48();
    4552 unsigned long int rand48();
    4553 float rand48();
    4554 double rand48();
    4555 float _Complex rand48();
    4556 double _Complex rand48();
    4557 long double _Complex rand48();
    4558 \end{lstlisting}
    4559 
    4560 
    4561 \subsection{min/max/swap}
    4562 
    4563 \begin{lstlisting}
    4564 forall( otype T | { int ?<?( T, T ); } )
    4565 T min( const T t1, const T t2 );
    4566 
    4567 forall( otype T | { int ?>?( T, T ); } )
    4568 T max( const T t1, const T t2 );
    4569 
    4570 forall( otype T )
    4571 void swap( T * t1, T * t2 );
    4572 \end{lstlisting}
    45734255
    45744256
  • src/driver/cfa.cc

    r78885b5 rbc1ab61  
    1010// Created On       : Tue Aug 20 13:44:49 2002
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Wed Apr  6 14:04:22 2016
    13 // Update Count     : 132
     12// Last Modified On : Thu Jan 28 18:24:06 2016
     13// Update Count     : 127
    1414//
    1515
     
    165165                                nargs += 1;
    166166                        } else if ( prefix( arg, "-std=" ) ) {
    167                                 std_flag = true;                                                // -std=XX provided
     167                                std_flag = true;                                                // std=XX provided
    168168                                args[nargs] = argv[i];                                  // pass the argument along
    169169                                nargs += 1;
     
    307307                nargs += 1;
    308308                if ( ! std_flag ) {                                                             // default c99, if none specified
    309                         args[nargs] = "-std=gnu99";
     309                        args[nargs] = "-std=c99";
    310310                        nargs += 1;
    311311                } // if
  • src/libcfa/Makefile.am

    r78885b5 rbc1ab61  
    1111## Created On       : Sun May 31 08:54:01 2015
    1212## Last Modified By : Peter A. Buhr
    13 ## Last Modified On : Wed Apr  6 21:10:44 2016
    14 ## Update Count     : 123
     13## Last Modified On : Wed Mar  2 22:59:23 2016
     14## Update Count     : 119
    1515###############################################################################
    1616
     
    6060        ${CC} ${CFLAGS} -c -o $@ $<
    6161
    62 libs = limits stdlib iostream fstream iterator rational
     62libs = stdlib iostream fstream iterator
    6363libcfa_a_SOURCES = libcfa-prelude.c ${libs:=.c}
    6464
    65 cheaders = # expat
    66 cfaheaders = # limits
     65cheaders = #  expat
     66cfaheaders = limits
    6767include_HEADERS = ${cheaders:=.h} ${libs} ${cfaheaders}
    6868
  • src/libcfa/Makefile.in

    r78885b5 rbc1ab61  
    8383libcfa_a_AR = $(AR) $(ARFLAGS)
    8484libcfa_a_LIBADD =
    85 am__objects_1 = limits.$(OBJEXT) stdlib.$(OBJEXT) iostream.$(OBJEXT) \
    86         fstream.$(OBJEXT) iterator.$(OBJEXT) rational.$(OBJEXT)
     85am__objects_1 = stdlib.$(OBJEXT) iostream.$(OBJEXT) fstream.$(OBJEXT) \
     86        iterator.$(OBJEXT)
    8787am_libcfa_a_OBJECTS = libcfa-prelude.$(OBJEXT) $(am__objects_1)
    8888libcfa_a_OBJECTS = $(am_libcfa_a_OBJECTS)
     
    213213MAINTAINERCLEANFILES = ${addprefix ${libdir}/,${cfalib_DATA}} \
    214214        ${addprefix ${libdir}/,${lib_LIBRARIES}} ${includedir}/*
    215 libs = limits stdlib iostream fstream iterator rational
     215libs = stdlib iostream fstream iterator
    216216libcfa_a_SOURCES = libcfa-prelude.c ${libs:=.c}
    217 cheaders = # expat
    218 cfaheaders = # limits
     217cheaders = #  expat
     218cfaheaders = limits
    219219include_HEADERS = ${cheaders:=.h} ${libs} ${cfaheaders}
    220220all: all-am
     
    297297@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/iterator.Po@am__quote@
    298298@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcfa-prelude.Po@am__quote@
    299 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/limits.Po@am__quote@
    300 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rational.Po@am__quote@
    301299@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stdlib.Po@am__quote@
    302300
  • src/libcfa/fstream

    r78885b5 rbc1ab61  
    1010// Created On       : Wed May 27 17:56:53 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Tue Apr  5 22:37:12 2016
    13 // Update Count     : 82
     12// Last Modified On : Wed Mar  2 15:08:14 2016
     13// Update Count     : 78
    1414//
    1515
     
    2020
    2121enum { separateSize = 16 };
    22 struct ofstream {
    23         void *file;
    24         _Bool sepDefault;
    25         _Bool sepOnOff;
    26         char separator[separateSize];
    27 }; // ofstream
     22struct ofstream { void *file; int separate; char separator[separateSize]; };
    2823
    2924_Bool sepPrt( ofstream * );
    3025void sepOn( ofstream * );
    3126void sepOff( ofstream * );
    32 void sepReset( ofstream * );
    33 void sepReset( ofstream *, _Bool );
    3427void sepSet( ofstream *, const char * );
    3528const char * sepGet( ofstream * );
    36 _Bool sepDisable( ofstream * );
    37 _Bool sepEnable( ofstream * );
     29void sepDisable( ofstream * );
     30void sepEnable( ofstream * );
    3831int fail( ofstream * );
    3932int flush( ofstream * );
     
    4639
    4740// implement context istream
    48 struct ifstream {
    49         void *file;
    50 }; // ifstream
     41struct ifstream { void *file; };
    5142
    5243int fail( ifstream * is );
  • src/libcfa/fstream.c

    r78885b5 rbc1ab61  
    1010// Created On       : Wed May 27 17:56:53 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Wed Apr  6 17:55:27 2016
    13 // Update Count     : 176
     12// Last Modified On : Mon Feb 29 18:41:10 2016
     13// Update Count     : 162
    1414//
    1515
     
    2525}
    2626
    27 #define IO_MSG "I/O error: "
     27#define IO_MSG "I/O error "
    2828
    29 _Bool sepPrt( ofstream * os ) { return os->sepOnOff; }
    30 void sepOn( ofstream * os ) { os->sepOnOff = 1; }
    31 void sepOff( ofstream * os ) { os->sepOnOff = 0; }
    32 void sepReset( ofstream * os ) { os->sepOnOff = os->sepDefault; }
    33 void sepReset( ofstream * os, _Bool reset ) { os->sepDefault = reset; os->sepOnOff = os->sepDefault; }
     29_Bool sepPrt( ofstream * os ) { return os->separate == 1; }
     30void sepOn( ofstream * os ) { if ( os->separate != 2 ) os->separate = 1; }
     31void sepOff( ofstream * os ) { if ( os->separate != 2 ) os->separate = 0; }
    3432void sepSet( ofstream * os, const char * s ) {
    3533        strncpy( &(os->separator[0]), s, separateSize - 1 );
     
    3735} // sepSet
    3836const char * sepGet( ofstream * os ) { return &(os->separator[0]); }
    39 _Bool sepDisable( ofstream *os ) {
    40         _Bool temp = os->sepDefault;
    41         os->sepDefault = 0;
    42         sepReset( os );
    43         return temp;
    44 } // sepDisable
    45 _Bool sepEnable( ofstream *os ) {
    46         _Bool temp = os->sepDefault;
    47         os->sepDefault = 1;
    48         sepReset( os );
    49         return temp;
    50 } // sepEnable
     37void sepDisable( ofstream *os ) { os->separate = 2; }
     38void sepEnable( ofstream *os ) { os->separate = 0; }
    5139
    5240int fail( ofstream * os ) {
     
    6149        FILE *file = fopen( name, mode );
    6250        if ( file == 0 ) {                                                                      // do not change unless successful
    63                 fprintf( stderr, IO_MSG "open output file \"%s\", ", name );
    64                 perror( 0 );
     51                perror( IO_MSG "open output" );
    6552                exit( EXIT_FAILURE );
    6653        } // if
     
    10794
    10895
    109 static ofstream soutFile = { (FILE *)(&_IO_2_1_stdout_), 1, 0, { ' ', '\0' } };
     96static ofstream soutFile = { (FILE *)(&_IO_2_1_stdout_), 0, { ' ', '\0' } };
    11097ofstream *sout = &soutFile;
    111 static ofstream serrFile = { (FILE *)(&_IO_2_1_stderr_), 1, 0, { ' ', '\0' } };
     98static ofstream serrFile = { (FILE *)(&_IO_2_1_stderr_), 0, { ' ', '\0' } };
    11299ofstream *serr = &serrFile;
    113100
     
    127114        FILE *t = fopen( name, mode );
    128115        if ( t == 0 ) {                                                                         // do not change unless successful
    129                 fprintf( stderr, IO_MSG "open input file \"%s\", ", name );
    130                 perror( 0 );
     116                perror( IO_MSG "open input" );
    131117                exit( EXIT_FAILURE );
    132118        } // if
     
    189175// Local Variables: //
    190176// tab-width: 4 //
     177// compile-command: "cfa fstream.c" //
    191178// End: //
  • src/libcfa/iostream

    r78885b5 rbc1ab61  
    1010// Created On       : Wed May 27 17:56:53 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Tue Apr  5 22:32:37 2016
    13 // Update Count     : 90
     12// Last Modified On : Wed Mar  2 18:05:27 2016
     13// Update Count     : 85
    1414//
    1515
     
    2323        void sepOn( ostype * );
    2424        void sepOff( ostype * );
    25         void sepReset( ostype * );
    26         void sepReset( ostype *, _Bool );
    2725        void sepSet( ostype *, const char * );
    2826        const char * sepGet( ostype * );
    29         _Bool sepDisable( ostype * );
    30         _Bool sepEnable( ostype * );
     27        void sepDisable( ostype * );
     28        void sepEnable( ostype * );
    3129        int fail( ostype * );
    3230        int flush( ostype * );
     
    6967forall( dtype ostype | ostream( ostype ) ) ostype * sepOn( ostype * );
    7068forall( dtype ostype | ostream( ostype ) ) ostype * sepOff( ostype * );
    71 forall( dtype ostype | ostream( ostype ) ) ostype * sepDisable( ostype * );
    72 forall( dtype ostype | ostream( ostype ) ) ostype * sepEnable( ostype * );
    7369
    7470// writes the range [begin, end) to the given stream
     
    114110forall( dtype istype | istream( istype ) ) istype * ?|?( istype *, long double _Complex * );
    115111
    116 struct _Istream_cstrUC { char * s; };
    117 _Istream_cstrUC cstr( char * );
    118 forall( dtype istype | istream( istype ) ) istype * ?|?( istype *, _Istream_cstrUC );
     112struct _Istream_str1 { char * s; };
     113_Istream_str1 str( char * );
     114forall( dtype istype | istream( istype ) ) istype * ?|?( istype *, _Istream_str1 );
    119115
    120 struct _Istream_cstrC { char * s; int size; };
    121 _Istream_cstrC cstr( char *, int size );
    122 forall( dtype istype | istream( istype ) ) istype * ?|?( istype *, _Istream_cstrC );
     116struct _Istream_str2 { char * s; int size; };
     117_Istream_str2 str( char *, int size );
     118forall( dtype istype | istream( istype ) ) istype * ?|?( istype *, _Istream_str2 );
    123119
    124120#endif // __IOSTREAM_H__
  • src/libcfa/iostream.c

    r78885b5 rbc1ab61  
    1010// Created On       : Wed May 27 17:56:53 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Wed Apr  6 16:13:29 2016
    13 // Update Count     : 278
     12// Last Modified On : Mon Mar  7 13:51:23 2016
     13// Update Count     : 227
    1414//
    1515
     
    2727ostype * ?|?( ostype *os, char c ) {
    2828        prtfmt( os, "%c", c );
    29         sepOff( os );
    3029        return os;
    3130} // ?|?
     
    3332forall( dtype ostype | ostream( ostype ) )
    3433ostype * ?|?( ostype *os, short int si ) {
    35         if ( sepPrt( os ) ) prtfmt( os, "%s", sepGet( os ) );
    36         sepReset( os );
     34        if ( sepPrt( os ) ) prtfmt( os, "%s", sepGet( os ) ); else sepOn( os );
    3735        prtfmt( os, "%hd", si );
    3836        return os;
     
    4139forall( dtype ostype | ostream( ostype ) )
    4240ostype * ?|?( ostype *os, unsigned short int usi ) {
    43         if ( sepPrt( os ) ) prtfmt( os, "%s", sepGet( os ) );
    44         sepReset( os );
     41        if ( sepPrt( os ) ) prtfmt( os, "%s", sepGet( os ) ); else sepOn( os );
    4542        prtfmt( os, "%hu", usi );
    4643        return os;
     
    4946forall( dtype ostype | ostream( ostype ) )
    5047ostype * ?|?( ostype *os, int i ) {
    51         if ( sepPrt( os ) ) prtfmt( os, "%s", sepGet( os ) );
    52         sepReset( os );
     48        if ( sepPrt( os ) ) prtfmt( os, "%s", sepGet( os ) ); else sepOn( os );
    5349        prtfmt( os, "%d", i );
    5450        return os;
     
    5753forall( dtype ostype | ostream( ostype ) )
    5854ostype * ?|?( ostype *os, unsigned int ui ) {
    59         if ( sepPrt( os ) ) prtfmt( os, "%s", sepGet( os ) );
    60         sepReset( os );
     55        if ( sepPrt( os ) ) prtfmt( os, "%s", sepGet( os ) ); else sepOn( os );
    6156        prtfmt( os, "%u", ui );
    6257        return os;
     
    6560forall( dtype ostype | ostream( ostype ) )
    6661ostype * ?|?( ostype *os, long int li ) {
    67         if ( sepPrt( os ) ) prtfmt( os, "%s", sepGet( os ) );
    68         sepReset( os );
     62        if ( sepPrt( os ) ) prtfmt( os, "%s", sepGet( os ) ); else sepOn( os );
    6963        prtfmt( os, "%ld", li );
    7064        return os;
     
    7367forall( dtype ostype | ostream( ostype ) )
    7468ostype * ?|?( ostype *os, unsigned long int uli ) {
    75         if ( sepPrt( os ) ) prtfmt( os, "%s", sepGet( os ) );
    76         sepReset( os );
     69        if ( sepPrt( os ) ) prtfmt( os, "%s", sepGet( os ) ); else sepOn( os );
    7770        prtfmt( os, "%lu", uli );
    7871        return os;
     
    8174forall( dtype ostype | ostream( ostype ) )
    8275ostype * ?|?( ostype *os, long long int lli ) {
    83         if ( sepPrt( os ) ) prtfmt( os, "%s", sepGet( os ) );
    84         sepReset( os );
     76        if ( sepPrt( os ) ) prtfmt( os, "%s", sepGet( os ) ); else sepOn( os );
    8577        prtfmt( os, "%lld", lli );
    8678        return os;
     
    8981forall( dtype ostype | ostream( ostype ) )
    9082ostype * ?|?( ostype *os, unsigned long long int ulli ) {
    91         if ( sepPrt( os ) ) prtfmt( os, "%s", sepGet( os ) );
    92         sepReset( os );
     83        if ( sepPrt( os ) ) prtfmt( os, "%s", sepGet( os ) ); else sepOn( os );
    9384        prtfmt( os, "%llu", ulli );
    9485        return os;
     
    9788forall( dtype ostype | ostream( ostype ) )
    9889ostype * ?|?( ostype *os, float f ) {
    99         if ( sepPrt( os ) ) prtfmt( os, "%s", sepGet( os ) );
    100         sepReset( os );
     90        if ( sepPrt( os ) ) prtfmt( os, "%s", sepGet( os ) ); else sepOn( os );
    10191        prtfmt( os, "%g", f );
    10292        return os;
     
    10595forall( dtype ostype | ostream( ostype ) )
    10696ostype * ?|?( ostype *os, double d ) {
    107         if ( sepPrt( os ) ) prtfmt( os, "%s", sepGet( os ) );
    108         sepReset( os );
     97        if ( sepPrt( os ) ) prtfmt( os, "%s", sepGet( os ) ); else sepOn( os );
    10998        prtfmt( os, "%.*lg", DBL_DIG, d );
    11099        return os;
     
    113102forall( dtype ostype | ostream( ostype ) )
    114103ostype * ?|?( ostype *os, long double ld ) {
    115         if ( sepPrt( os ) ) prtfmt( os, "%s", sepGet( os ) );
    116         sepReset( os );
     104        if ( sepPrt( os ) ) prtfmt( os, "%s", sepGet( os ) ); else sepOn( os );
    117105        prtfmt( os, "%.*Lg", LDBL_DIG, ld );
    118106        return os;
     
    122110ostype * ?|?( ostype *os, float _Complex fc ) {
    123111        os | crealf( fc );
    124         _Bool temp = sepDisable( os );                                          // disable separators within complex value
    125         if ( cimagf( fc ) >= 0 ) os | '+';                                      // negative value prints '-'
    126         os | cimagf( fc ) | 'i';
    127         sepReset( os, temp );                                                           // reset separator
     112        if ( cimagf( fc ) >= 0 ) os | '+';
     113        os | "" | cimagf( fc ) | 'i';
    128114        return os;
    129115} // ?|?
     
    132118ostype * ?|?( ostype *os, double _Complex dc ) {
    133119        os | creal( dc );
    134         _Bool temp = sepDisable( os );                                          // disable separators within complex value
    135         if ( cimag( dc ) >= 0 ) os | '+';                                       // negative value prints '-'
    136         os | cimag( dc ) | 'i';
    137         sepReset( os, temp );                                                           // reset separator
     120        if ( cimag( dc ) >= 0 ) os | '+';
     121        os | "" | cimag( dc ) | 'i';
    138122        return os;
    139123} // ?|?
     
    142126ostype * ?|?( ostype *os, long double _Complex ldc ) {
    143127        os | creall( ldc );
    144         _Bool temp = sepDisable( os );                                          // disable separators within complex value
    145         if ( cimagl( ldc ) >= 0 ) os | '+';                                     // negative value prints '-'
    146         os | cimagl( ldc ) | 'i';
    147         sepReset( os, temp );                                                           // reset separator
     128        if ( cimagl( ldc ) >= 0 ) os | '+';
     129        os | "" | cimagl( ldc ) | 'i';
    148130        return os;
    149131} // ?|?
     
    152134ostype * ?|?( ostype *os, const char *cp ) {
    153135        enum { Open = 1, Close, OpenClose };
    154         static const unsigned char mask[256] = {
     136        static const char mask[256] = {
    155137                // opening delimiters
    156138                ['('] : Open, ['['] : Open, ['{'] : Open,
    157                 ['$'] : Open, [(unsigned char)'£'] : Open, [(unsigned char)'¥'] : Open, [(unsigned char)'¿'] : Open, [(unsigned char)'«'] : Open,
     139                ['$'] : Open, [L'£'] : Open, [L'¥'] : Open, [L'¢'] : Open, [L'¿'] : Open, [L'«'] : Open,
    158140                // closing delimiters
    159141                [','] : Close, ['.'] : Close, [':'] : Close, [';'] : Close, ['!'] : Close, ['?'] : Close,
    160142                [')'] : Close, [']'] : Close, ['}'] : Close,
    161                 ['%'] : Close, [(unsigned char)'¢'] : Close, [(unsigned char)'»'] : Close,
     143                ['%'] : Close, [L'»'] : Close,
    162144                // opening-closing delimiters
    163145                ['\''] : OpenClose, ['`'] : OpenClose, ['"'] : OpenClose,
    164                 ['\f'] : OpenClose, ['\n'] : OpenClose, ['\r'] : OpenClose, ['\t'] : OpenClose, ['\v'] : OpenClose, // isspace
    165146        }; // mask
    166147
     
    168149        // null string => no separator
    169150  if ( len == 0 ) { sepOff( os ); return os; }
    170         // first character IS NOT spacing or closing punctuation => add left separator
    171         unsigned char ch = cp[0];                                                       // must make unsigned
    172         if ( sepPrt( os ) && mask[ ch ] != Close && mask[ ch ] != OpenClose ) {
     151        // first character NOT spacing or closing punctuation => add left separator
     152        if ( sepPrt( os ) && isspace( cp[0] ) == 0 && mask[ cp[0] ] != Close && mask[ cp[0] ] != OpenClose ) {
    173153                prtfmt( os, "%s", sepGet( os ) );
    174154        } // if
    175155        // last character IS spacing or opening punctuation => turn off separator for next item
    176156        unsigned int posn = len - 1;
    177         ch = cp[posn];                                                                          // must make unsigned
    178         if ( mask[ ch ] == Open || mask[ ch ] == OpenClose ) {
     157        if ( isspace( cp[posn] ) || mask[ cp[posn] ] == Open || mask[ cp[posn] ] == OpenClose ) {
    179158                sepOff( os );
    180159        } else {
     
    186165forall( dtype ostype | ostream( ostype ) )
    187166ostype * ?|?( ostype *os, const void *p ) {
    188         if ( sepPrt( os ) ) prtfmt( os, "%s", sepGet( os ) );
    189         sepReset( os );
     167        if ( sepPrt( os ) ) prtfmt( os, "%s", sepGet( os ) ); else sepOn( os );
    190168        prtfmt( os, "%p", p );
    191169        return os;
     
    218196} // sepOff
    219197
    220 forall( dtype ostype | ostream( ostype ) )
    221 ostype * sepEnable( ostype * os ) {
    222         sepEnable( os );
    223         return os;
    224 } // sepEnable
    225 
    226 forall( dtype ostype | ostream( ostype ) )
    227 ostype * sepDisable( ostype * os ) {
    228         sepDisable( os );
    229         return os;
    230 } // sepDisable
    231 
    232198//---------------------------------------
    233199
     
    344310} // ?|?
    345311
    346 _Istream_cstrUC cstr( char * s ) { _Istream_cstrUC s = { s }; return s; }
    347 forall( dtype istype | istream( istype ) )
    348 istype * ?|?( istype * is, _Istream_cstrUC cstr ) {
    349         scanfmt( is, "%s", cstr.s );
    350         return is;
    351 } // cstr
    352 
    353 _Istream_cstrC cstr( char * s, int size ) { _Istream_cstrC s = { s, size }; return s; }
    354 forall( dtype istype | istream( istype ) )
    355 istype * ?|?( istype * is, _Istream_cstrC cstr ) {
     312_Istream_str1 str( char * s ) { _Istream_str1 s = { s }; return s; }
     313forall( dtype istype | istream( istype ) )
     314istype * ?|?( istype * is, _Istream_str1 str ) {
     315        scanfmt( is, "%s", str.s );
     316        return is;
     317} // str
     318
     319_Istream_str2 str( char * s, int size ) { _Istream_str2 s = { s, size }; return s; }
     320forall( dtype istype | istream( istype ) )
     321istype * ?|?( istype * is, _Istream_str2 str ) {
    356322        char buf[16];
    357         sprintf( buf, "%%%ds", cstr.size );
    358         scanfmt( is, buf, cstr.s );
    359         return is;
    360 } // cstr
     323        sprintf( buf, "%%%ds", str.size );
     324        scanfmt( is, buf, str.s );
     325        return is;
     326} // str
    361327
    362328// Local Variables: //
  • src/libcfa/limits

    r78885b5 rbc1ab61  
    1 //
    2 // Cforall Version 1.0.0 Copyright (C) 2016 University of Waterloo
    3 //
    4 // The contents of this file are covered under the licence agreement in the
    5 // file "LICENCE" distributed with Cforall.
    6 //
    7 // limits --
    8 //
    9 // Author           : Peter A. Buhr
    10 // Created On       : Wed Apr  6 18:06:52 2016
    11 // Last Modified By : Peter A. Buhr
    12 // Last Modified On : Wed Apr  6 21:08:16 2016
    13 // Update Count     : 6
    14 //
    15 
    161// Integral Constants
    172
    18 extern const short int MIN;
    19 extern const int MIN;
    20 extern const long int MIN;
    21 extern const long long int MIN;
     3const short int MIN = -32768;
     4const int MIN = -2147483648;
     5const long int MIN = -9223372036854775807L - 1L;
     6const long long int MIN = -9223372036854775807LL - 1LL;
    227
    23 extern const short int MAX;
    24 extern const unsigned short int MAX;
    25 extern const int MAX;
    26 extern const unsigned int MAX;
    27 extern const long int MAX;
    28 extern const unsigned long int MAX;
    29 extern const long long int MAX;
    30 extern const unsigned long long int MAX;
     8const short int MAX = 32767;
     9const unsigned short int MAX = 65535;
     10const int MAX = 2147483647;
     11const unsigned int MAX = 4294967295_U;
     12const long int MAX = 9223372036854775807_L;
     13const unsigned long int MAX = 4294967295_U;
     14const long long int MAX = 9223372036854775807_LL;
     15const unsigned long long int MAX = 18446744073709551615_ULL;
    3116
    3217// Floating-Point Constants
    3318
    34 extern const float PI;                                                                  // pi
    35 extern const float PI_2;                                                                // pi / 2
    36 extern const float PI_4;                                                                // pi / 4
    37 extern const float _1_PI;                                                               // 1 / pi
    38 extern const float _2_PI;                                                               // 2 / pi
    39 extern const float _2_SQRT_PI;                                                  // 2 / sqrt(pi)
     19const float PI = 3.141592_F;                            // pi
     20const float PI_2 = 1.570796_F;                          // pi / 2
     21const float PI_4 = 0.7853981_F;                         // pi / 4
     22const float _1_PI = 0.3183098_F;                        // 1 / pi
     23const float _2_PI = 0.6366197_F;                        // 2 / pi
     24const float _2_SQRT_PI = 1.128379_F;                    // 2 / sqrt(pi)
    4025
    41 extern const double PI;                                                                 // pi
    42 extern const double PI_2;                                                               // pi / 2
    43 extern const double PI_4;                                                               // pi / 4
    44 extern const double _1_PI;                                                              // 1 / pi
    45 extern const double _2_PI;                                                              // 2 / pi
    46 extern const double _2_SQRT_PI;                                                 // 2 / sqrt(pi)
     26const double PI = 3.14159265358979323846_D;             // pi
     27const double PI_2 = 1.57079632679489661923_D;           // pi / 2
     28const double PI_4 = 0.78539816339744830962_D;           // pi / 4
     29const double _1_PI = 0.31830988618379067154_D;          // 1 / pi
     30const double _2_PI = 0.63661977236758134308_D;          // 2 / pi
     31const double _2_SQRT_PI = 1.12837916709551257390_D;     // 2 / sqrt(pi)
    4732
    48 extern const long double PI;                                                    // pi
    49 extern const long double PI_2;                                                  // pi / 2
    50 extern const long double PI_4;                                                  // pi / 4
    51 extern const long double _1_PI;                                                 // 1 / pi
    52 extern const long double _2_PI;                                                 // 2 / pi
    53 extern const long double _2_SQRT_PI;                                    // 2 / sqrt(pi)
     33const long double PI = 3.1415926535897932384626433832795029_DL; // pi
     34const long double PI_2 = 1.5707963267948966192313216916397514_DL; // pi / 2
     35const long double PI_4 = 0.7853981633974483096156608458198757_DL; // pi / 4
     36const long double _1_PI = 0.3183098861837906715377675267450287_DL; // 1 / pi
     37const long double _2_PI = 0.6366197723675813430755350534900574_DL; // 2 / pi
     38const long double _2_SQRT_PI = 1.1283791670955125738961589031215452_DL; // 2 / sqrt(pi)
    5439
    55 extern const _Complex PI;                                                               // pi
    56 extern const _Complex PI_2;                                                             // pi / 2
    57 extern const _Complex PI_4;                                                             // pi / 4
    58 extern const _Complex _1_PI;                                                    // 1 / pi
    59 extern const _Complex _2_PI;                                                    // 2 / pi
    60 extern const _Complex _2_SQRT_PI;                                               // 2 / sqrt(pi)
     40const _Complex PI = 3.14159265358979323846_D+0.0_iD;    // pi
     41const _Complex PI_2 = 1.57079632679489661923_D+0.0_iD;  // pi / 2
     42const _Complex PI_4 = 0.78539816339744830962_D+0.0_iD;  // pi / 4
     43const _Complex _1_PI = 0.31830988618379067154_D+0.0_iD; // 1 / pi
     44const _Complex _2_PI = 0.63661977236758134308_D+0.0_iD; // 2 / pi
     45const _Complex _2_SQRT_PI = 1.12837916709551257390_D+0.0_iD; // 2 / sqrt(pi)
    6146
    62 extern const long _Complex PI;                                                  // pi
    63 extern const long _Complex PI_2;                                                // pi / 2
    64 extern const long _Complex PI_4;                                                // pi / 4
    65 extern const long _Complex _1_PI;                                               // 1 / pi
    66 extern const long _Complex _2_PI;                                               // 2 / pi
    67 extern const long _Complex _2_SQRT_PI;                                  // 2 / sqrt(pi)
     47const long _Complex PI = 3.1415926535897932384626433832795029_L+0.0iL; // pi
     48const long _Complex PI_2 = 1.5707963267948966192313216916397514_L+0.0iL; // pi / 2
     49const long _Complex PI_4 = 0.7853981633974483096156608458198757_L+0.0iL; // pi / 4
     50const long _Complex _1_PI = 0.3183098861837906715377675267450287_L+0.0iL; // 1 / pi
     51const long _Complex _2_PI = 0.6366197723675813430755350534900574_L+0.0iL; // 2 / pi
     52const long _Complex _2_SQRT_PI = 1.1283791670955125738961589031215452_L+0.0iL; // 2 / sqrt(pi)
    6853
    69 extern const float E;                                                                   // e
    70 extern const float LOG2_E;                                                              // log_2(e)
    71 extern const float LOG10_E;                                                             // log_10(e)
    72 extern const float LN_2;                                                                // log_e(2)
    73 extern const float LN_10;                                                               // log_e(10)
    74 extern const float SQRT_2;                                                              // sqrt(2)
    75 extern const float _1_SQRT_2;                                                   // 1 / sqrt(2)
     54const float E = 2.718281;                               // e
     55const float LOG2_E = 1.442695;                          // log_2(e)
     56const float LOG10_E = 0.4342944;                        // log_10(e)
     57const float LN_2 = 0.6931471;                           // log_e(2)
     58const float LN_10 = 2.302585;                           // log_e(10)
     59const float SQRT_2 = 1.414213;                          // sqrt(2)
     60const float _1_SQRT_2 = 0.7071067;                      // 1 / sqrt(2)
    7661
    77 extern const double E;                                                                  // e
    78 extern const double LOG2_E;                                                             // log_2(e)
    79 extern const double LOG10_E;                                                    // log_10(e)
    80 extern const double LN_2;                                                               // log_e(2)
    81 extern const double LN_10;                                                              // log_e(10)
    82 extern const double SQRT_2;                                                             // sqrt(2)
    83 extern const double _1_SQRT_2;                                                  // 1 / sqrt(2)
     62const double E = 2.7182818284590452354_D;               // e
     63const double LOG2_E = 1.4426950408889634074_D;          // log_2(e)
     64const double LOG10_E = 0.43429448190325182765_D;        // log_10(e)
     65const double LN_2 = 0.69314718055994530942_D;           // log_e(2)
     66const double LN_10 = 2.30258509299404568402_D;          // log_e(10)
     67const double SQRT_2 = 1.41421356237309504880_D;         // sqrt(2)
     68const double _1_SQRT_2 = 0.70710678118654752440_D;      // 1 / sqrt(2)
    8469
    85 extern const long double E;                                                             // e
    86 extern const long double LOG2_E;                                                // log_2(e)
    87 extern const long double LOG10_E;                                               // log_10(e)
    88 extern const long double LN_2;                                                  // log_e(2)
    89 extern const long double LN_10;                                                 // log_e(10)
    90 extern const long double SQRT_2;                                                // sqrt(2)
    91 extern const long double _1_SQRT_2;                                             // 1/sqrt(2)
     70const long double E = 2.7182818284590452353602874713526625_DL; // e
     71const long double LOG2_E = 1.4426950408889634073599246810018921_DL; // log_2(e)
     72const long double LOG10_E = 0.4342944819032518276511289189166051_DL; // log_10(e)
     73const long double LN_2 = 0.6931471805599453094172321214581766_DL; // log_e(2)
     74const long double LN_10 = 2.3025850929940456840179914546843642_DL; // log_e(10)
     75const long double SQRT_2 = 1.4142135623730950488016887242096981_DL; // sqrt(2)
     76const long double _1_SQRT_2 = 0.7071067811865475244008443621048490_DL; // 1/sqrt(2)
    9277
    93 extern const _Complex E;                                                                // e
    94 extern const _Complex LOG2_E;                                                   // log_2(e)
    95 extern const _Complex LOG10_E;                                                  // log_10(e)
    96 extern const _Complex LN_2;                                                             // log_e(2)
    97 extern const _Complex LN_10;                                                    // log_e(10)
    98 extern const _Complex SQRT_2;                                                   // sqrt(2)
    99 extern const _Complex _1_SQRT_2;                                                // 1 / sqrt(2)
     78const _Complex E = 2.7182818284590452354_D+0.0_iD;      // e
     79const _Complex LOG2_E = 1.4426950408889634074_D+0.0_iD; // log_2(e)
     80const _Complex LOG10_E = 0.43429448190325182765_D+0.0_iD; // log_10(e)
     81const _Complex LN_2 = 0.69314718055994530942_D+0.0_iD;  // log_e(2)
     82const _Complex LN_10 = 2.30258509299404568402_D+0.0_iD; // log_e(10)
     83const _Complex SQRT_2 = 1.41421356237309504880_D+0.0_iD;        // sqrt(2)
     84const _Complex _1_SQRT_2 = 0.70710678118654752440_D+0.0_iD; // 1 / sqrt(2)
    10085
    101 extern const long _Complex E;                                                   // e
    102 extern const long _Complex LOG2_E;                                              // log_2(e)
    103 extern const long _Complex LOG10_E;                                             // log_10(e)
    104 extern const long _Complex LN_2;                                                // log_e(2)
    105 extern const long _Complex LN_10;                                               // log_e(10)
    106 extern const long _Complex SQRT_2;                                              // sqrt(2)
    107 extern const long _Complex _1_SQRT_2;                                   // 1 / sqrt(2)
    108 
    109 // Local Variables: //
    110 // mode: c //
    111 // tab-width: 4 //
    112 // End: //
     86const long _Complex E = 2.7182818284590452353602874713526625_L+0.0_iL; // e
     87const long _Complex LOG2_E = 1.4426950408889634073599246810018921_L+0.0_iL; // log_2(e)
     88const long _Complex LOG10_E = 0.4342944819032518276511289189166051_L+0.0_iL; // log_10(e)
     89const long _Complex LN_2 = 0.6931471805599453094172321214581766_L+0.0_iL; // log_e(2)
     90const long _Complex LN_10 = 2.3025850929940456840179914546843642_L+0.0_iL; // log_e(10)
     91const long _Complex SQRT_2 = 1.4142135623730950488016887242096981_L+0.0_iL; // sqrt(2)
     92const long _Complex _1_SQRT_2 = 0.7071067811865475244008443621048490_L+0.0_iL; // 1 / sqrt(2)
  • src/libcfa/stdlib

    r78885b5 rbc1ab61  
    1010// Created On       : Thu Jan 28 17:12:35 2016
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Fri Apr  1 22:26:14 2016
    13 // Update Count     : 73
     12// Last Modified On : Tue Mar 22 22:34:24 2016
     13// Update Count     : 69
    1414//
    1515
     
    1818extern "C" {
    1919#include <stddef.h>                                                                             // size_t
    20 #include <math.h>                                                                               // floor
    2120} // extern "C"
    2221
     
    8180char abs( char );
    8281extern "C" {
    83 int abs( int );                         // use default C routine for int
    84 } // extern "C"
     82int abs( int );         // use default C routine for int
     83} // extern
    8584long int abs( long int );
    8685long long int abs( long long int );
     
    9190double _Complex abs( double _Complex );
    9291long double _Complex abs( long double _Complex );
    93 
    94 //---------------------------------------
    95 
    96 float floor( float );
    97 extern "C" {
    98 double floor( double );         // use C routine for double
    99 } // extern "C"
    100 long double floor( long double );
    101 
    102 float ceil( float );
    103 extern "C" {
    104 double ceil( double );          // use C routine for double
    105 } // extern "C"
    106 long double ceil( long double );
    10792
    10893//---------------------------------------
  • src/libcfa/stdlib.c

    r78885b5 rbc1ab61  
    1010// Created On       : Thu Jan 28 17:10:29 2016
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Wed Mar 30 10:48:41 2016
    13 // Update Count     : 149
     12// Last Modified On : Wed Mar 23 13:26:42 2016
     13// Update Count     : 146
    1414//
    1515
     
    243243//---------------------------------------
    244244
    245 float floor( float v ) { return floorf( v ); }
    246 long double floor( long double v ) { return floorl( v ); }
    247 
    248 float ceil( float v ) { return ceilf( v ); }
    249 long double ceil( long double v ) { return ceill( v ); }
    250 
    251 //---------------------------------------
    252 
    253245void rand48seed( long int s ) { srand48( s ); }
    254246char rand48() { return mrand48(); }
Note: See TracChangeset for help on using the changeset viewer.