Changes in / [78885b5:bc1ab61]
- Files:
-
- 2 added
- 7 deleted
- 12 edited
-
doc/refrat/refrat.tex (modified) (8 diffs)
-
doc/user/user.tex (modified) (36 diffs)
-
src/driver/cfa.cc (modified) (3 diffs)
-
src/examples/io.c (deleted)
-
src/examples/io.data (deleted)
-
src/examples/rational.c (deleted)
-
src/examples/rational.cc (deleted)
-
src/examples/read.c (added)
-
src/examples/read.data (added)
-
src/libcfa/Makefile.am (modified) (2 diffs)
-
src/libcfa/Makefile.in (modified) (3 diffs)
-
src/libcfa/fstream (modified) (3 diffs)
-
src/libcfa/fstream.c (modified) (7 diffs)
-
src/libcfa/iostream (modified) (4 diffs)
-
src/libcfa/iostream.c (modified) (21 diffs)
-
src/libcfa/limits (modified) (1 diff)
-
src/libcfa/limits.c (deleted)
-
src/libcfa/rational (deleted)
-
src/libcfa/rational.c (deleted)
-
src/libcfa/stdlib (modified) (4 diffs)
-
src/libcfa/stdlib.c (modified) (2 diffs)
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 Waterloo4 %%5 %% The contents of this file are covered under the licence agreement in the6 %% file "LICENCE" distributed with Cforall.7 %%8 %% refrat.tex --9 %%10 %% Author : Peter A. Buhr11 %% Created On : Wed Apr 6 14:52:25 201612 %% Last Modified By : Peter A. Buhr13 %% Last Modified On : Wed Apr 6 21:57:27 201614 %% Update Count : 215 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%16 17 1 % requires tex packages: texlive-base texlive-latex-base tex-common texlive-humanities texlive-latex-extra texlive-fonts-recommended 18 2 … … 21 5 22 6 % Latex packages used in the document. 7 23 8 \usepackage{fullpage,times} 24 9 \usepackage{xspace} … … 38 23 % Names used in the document. 39 24 40 \newcommand{\CFA}{C$\ mathbf\forall$\xspace} % set language symbolic name25 \newcommand{\CFA}{C$\forall$\xspace} % set language symbolic name 41 26 \newcommand{\CFL}{Cforall\xspace} % set language text name 42 27 \newcommand{\CC}{C\kern-.1em\hbox{+\kern-.25em+}\xspace} % CC symbolic name … … 166 151 % CFA based on ANSI C 167 152 \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,}, 172 156 }% 173 157 … … 179 163 xleftmargin=\parindent, 180 164 escapechar=@, 181 mathescape=true,182 165 keepspaces=true, 183 166 showstringspaces=false, 184 167 showlines=true, 185 aboveskip=6pt,186 belowskip=4pt,187 168 }% 188 169 … … 190 171 % replace/adjust listings characters that look bad in sanserif 191 172 \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 195 174 \lst@ProcessOther{"3C}{\lst@ttfamily{<}{\texttt{<}}} % replace less than 196 175 \lst@ProcessOther{"3E}{\lst@ttfamily{<}{\texttt{>}}} % replace greater than 197 176 \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 200 178 \lst@ProcessOther{"7E}{\raisebox{0.3ex}{$\scriptstyle\sim\,$}} % replace tilde 201 179 %\lst@ProcessOther{"7E}{\raisebox{-.4ex}[1ex][0pt]{\textasciitilde}} % lower tilde … … 3865 3843 ``\lstinline$Safe_pointer$ acts like a pointer to \lstinline$int$''. 3866 3844 \begin{lstlisting} 3867 trait ptr_to( otype P | pointer( P ), otype T ) {@\impl{ptr_to}@@\use{pointer}@3845 trait ptr_to( type P | pointer( P ), otype T ) {@\impl{ptr_to}@@\use{pointer}@ 3868 3846 lvalue T *?( P ); 3869 3847 lvalue T ?[?]( P, long int ); 3870 3848 }; 3871 trait ptr_to_const( otype P | pointer( P ), otype T ) {@\impl{ptr_to_const}@3849 trait ptr_to_const( type P | pointer( P ), otype T ) {@\impl{ptr_to_const}@ 3872 3850 const lvalue T *?( P ); 3873 3851 const lvalue T ?[?]( P, long int );@\use{pointer}@ 3874 3852 }; 3875 trait ptr_to_volatile( otype P | pointer( P ), otype T ) }@\impl{ptr_to_volatile}@3853 trait ptr_to_volatile( type P | pointer( P ), otype T ) }@\impl{ptr_to_volatile}@ 3876 3854 volatile lvalue T *?( P ); 3877 3855 volatile lvalue T ?[?]( P, long int );@\use{pointer}@ 3878 3856 }; 3879 trait ptr_to_const_volatile( otype P | pointer( P ), otype T ) }@\impl{ptr_to_const_volatile}@3857 trait ptr_to_const_volatile( type P | pointer( P ), otype T ) }@\impl{ptr_to_const_volatile}@ 3880 3858 const volatile lvalue T *?( P );@\use{pointer}@ 3881 3859 const volatile lvalue T ?[?]( P, long int ); … … 3887 3865 ``\lstinline$ptr_to$'' specifications. 3888 3866 \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}@ {3867 trait 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}@ { 3890 3868 P ?=?( P *, T * ); 3891 3869 T * ?=?( T **, P ); 3892 3870 }; 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}@) {3871 trait 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}@) { 3894 3872 P ?=?( P *, const T * ); 3895 3873 const T * ?=?( const T **, P ); 3896 3874 }; 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}@3875 trait 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}@ 3898 3876 P ?=?( P *, volatile T * ); 3899 3877 volatile T * ?=?( volatile T **, P ); 3900 3878 }; 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}@3879 trait 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}@ 3903 3881 P ?=?( P *, const volatile T * ); 3904 3882 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 Waterloo4 %%5 %% The contents of this file are covered under the licence agreement in the6 %% file "LICENCE" distributed with Cforall.7 %%8 %% user.tex --9 %%10 %% Author : Peter A. Buhr11 %% Created On : Wed Apr 6 14:53:29 201612 %% Last Modified By : Peter A. Buhr13 %% Last Modified On : Wed Apr 6 17:37:39 201614 %% Update Count : 3415 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%16 17 1 % requires tex packages: texlive-base texlive-latex-base tex-common texlive-humanities texlive-latex-extra texlive-fonts-recommended 18 2 … … 21 5 22 6 % Latex packages used in the document. 23 \usepackage[T1]{fontenc} 24 \usepackage{textcomp} 25 \usepackage[latin1]{inputenc} 26 \usepackage{upquote} 7 27 8 \usepackage{fullpage,times} 28 9 \usepackage{xspace} … … 43 24 % Names used in the document. 44 25 45 \newcommand{\CFA}{C$\ mathbf\forall$\xspace} % set language symbolic name26 \newcommand{\CFA}{C$\forall$\xspace} % set language symbolic name 46 27 \newcommand{\CFL}{Cforall\xspace} % set language text name 47 28 \newcommand{\CC}{C\kern-.1em\hbox{+\kern-.25em+}\xspace} % CC symbolic name … … 179 160 % CFA based on ANSI C 180 161 \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,}, 186 165 }% 187 166 … … 197 176 showstringspaces=false, 198 177 showlines=true, 199 aboveskip=6pt,200 belowskip=4pt,201 literate={\\`}{\raisebox{0.3ex}{\ttfamily\upshape \hspace*{-2pt}`}}1, % escape \`, otherwise used to highlight in red202 %extendedchars=true,203 178 }% 204 179 … … 206 181 % replace/adjust listings characters that look bad in sanserif 207 182 \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 211 184 \lst@ProcessOther{"3C}{\lst@ttfamily{<}{\texttt{<}}} % replace less than 212 185 \lst@ProcessOther{"3E}{\lst@ttfamily{<}{\texttt{>}}} % replace greater than 213 186 \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 216 188 \lst@ProcessOther{"7E}{\raisebox{0.3ex}{$\scriptstyle\sim\,$}} % replace tilde 217 189 %\lst@ProcessOther{"7E}{\raisebox{-.4ex}[1ex][0pt]{\textasciitilde}} % lower tilde … … 394 366 395 367 The command \lstinline@cfa@ is used to compile \CFA program(s). 396 This command works like the GNU \lstinline@gcc@ \index{gcc}command, e.g.:368 This command works like the GNU \lstinline@gcc@ command, e.g.: 397 369 \begin{lstlisting} 398 370 cfa [ gcc-options ] C/@{\CFA}@-files [ assembler/loader-files ] 399 371 \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: 372 The following additional option is available: 407 373 \begin{description} 408 374 \item … … 416 382 Numeric constants are extended to allow \Index{underscore}s within constants\index{constant!underscore}, e.g.: 417 383 \begin{lstlisting} 418 2 `_`147`_`483`_`648; // decimal constant384 2_147_483_648; // decimal constant 419 385 56_ul; // decimal unsigned long constant 420 386 0_377; // octal constant … … 485 451 \multicolumn{1}{c@{\hspace{30pt}}}{\textbf{\CFA}} & \multicolumn{1}{c}{\textbf{C}} \\ 486 452 \begin{lstlisting} 487 `* int x, y;` 453 * int x, y; 488 454 \end{lstlisting} 489 455 & … … 605 571 The point of the new syntax is to allow returning multiple values from a routine~\cite{CLU,Galletly96}, e.g.: 606 572 \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 ) { 608 574 @\emph{routine body}@ 609 575 } … … 673 639 Because 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: 674 640 \begin{lstlisting} 675 `[ int x ]`f() {641 [ int x ] f() { 676 642 ... x = 0; ... x = y; ... 677 `return;`// implicitly return x643 return; // implicitly return x 678 644 } 679 645 \end{lstlisting} … … 731 697 for example, the following is incorrect: 732 698 \begin{lstlisting} 733 * [ int x ] f () fp; // routine name "f"is not allowed699 * [ int x ] f () fp; // routine name ``f'' is not allowed 734 700 \end{lstlisting} 735 701 … … 898 864 \subsection{Type Nesting} 899 865 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.866 C allows \Index{type nesting}, but the nested types are hoisted\index{type!hoisting} (refactored) into the enclosing scope. 901 867 \begin{quote2} 902 868 \begin{tabular}{@{}l@{\hspace{30pt}}l|l@{}} … … 953 919 954 920 int fred() { 955 s.t.c = `S.`R; // type qualification956 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; 959 925 } 960 926 \end{lstlisting} 961 927 \end{tabular} 962 928 \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. 931 Nested types are not hoisted and can be referenced using the field selection operator ``\lstinline@.@'', unlike the \CC scope-resolution operator ``\lstinline@::@''. 932 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. 965 933 966 934 … … 976 944 \begin{lstlisting} 977 945 const 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. 946 int a[size]; 947 948 qsort( 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} 1007 954 1008 955 … … 1066 1013 1067 1014 \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 1015 Change: A struct is a scope in C++, not in C 1016 Rationale: Class scope is crucial to C++, and a struct is a class. 1017 Effect on original feature: Change to semantics of well-defined feature. 1018 Difficulty of converting: Semantic transformation. 1019 How widely used: C programs use struct extremely frequently, but the change is only noticeable when 1020 struct, enumeration, or enumerator names are referred to outside the struct. The latter is probably 1021 rare. 1079 1022 1080 1023 \item … … 1242 1185 First the right-hand tuple is flattened and then the values are assigned individually. 1243 1186 Flattening 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 ]@.1187 For example, the type \lstinline@[ int, [ int, int ], int ]@ can be coerced, using flattening, into the type lstinline@[ int, int, int, int ]@. 1245 1188 1246 1189 A \newterm{structuring coercion} is the opposite of flattening; … … 1409 1352 \multicolumn{1}{c@{\hspace{30pt}}}{\textbf{\CFA}} & \multicolumn{1}{c}{\textbf{C}} \\ 1410 1353 \begin{lstlisting} 1411 `L1:`for ( ... ) {1412 `L2:`for ( ... ) {1413 `L3:`for ( ... ) {1414 ... break `L1`; ...1415 ... break `L2`; ...1416 ... break `L3`; // or break1354 L1: for ( ... ) { 1355 L2: for ( ... ) { 1356 L3: for ( ... ) { 1357 ... break L1; ... 1358 ... break L2; ... 1359 ... break L3; // or break 1417 1360 } 1418 1361 } … … 1439 1382 \multicolumn{1}{c@{\hspace{30pt}}}{\textbf{\CFA}} & \multicolumn{1}{c}{\textbf{C}} \\ 1440 1383 \begin{lstlisting} 1441 `L1`: for ( ... ) {1442 `L2`: for ( ... ) {1443 `L3`: for ( ... ) {1444 ... continue `L1`; ...1445 ... continue `L2`; ...1446 ... continue `L3`; ...1384 L1: for ( ... ) { 1385 L2: for ( ... ) { 1386 L3: for ( ... ) { 1387 ... continue L1; ... 1388 ... continue L2; ... 1389 ... continue L3; ... 1447 1390 1448 1391 } … … 1680 1623 \begin{lstlisting} 1681 1624 switch ( i ) { 1682 `case 1, 3, 5`:1625 case 1, 3, 5: 1683 1626 ... 1684 `case 2, 4, 6`:1627 case 2, 4, 6: 1685 1628 ... 1686 1629 } … … 1691 1634 case 1: case 3 : case 5: 1692 1635 ... 1693 case 2: case 4 : case 6: 1636 case 2: case 4 : case 6: /* even values */ 1694 1637 ... 1695 1638 } … … 1712 1655 \begin{lstlisting} 1713 1656 switch ( i ) { 1714 `case 1~5:`1657 case 1~5 1715 1658 ... 1716 `case 10~15:`1659 case 10~15 1717 1660 ... 1718 1661 } … … 1729 1672 & 1730 1673 \begin{lstlisting} 1731 1732 1674 // 1, 2, 3, 4, 5 1733 1675 … … 2226 2168 2227 2169 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 } 2291 2171 2292 2172 \CFA supports parametric polymorphism to allow users to define generic functions and types. … … 2577 2457 2578 2458 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 2462 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. 2463 The general case is printing out a sequence of variables separated by whitespace. 2464 \begin{lstlisting} 2465 int x = 0, y = 1, z = 2; 2466 sout | x | y | z | endl; 2467 2468 cout << x << " " << y << " " << z << endl; 2469 \end{lstlisting} 2470 The \CC form takes almost twice as many characters. 2471 2472 The logical-or operator is used because it is the lowest priority overloadable operator, other than assignment. 2473 Therefore, most output expressions do not require parenthesis. 2474 \begin{lstlisting} 2475 int x = 0, y = 1, z = 2; 2476 sout | x * 3 | y + 1 | z << 2 | x == y | (x | y) | (x || y) | (x > z ? 1 : 2) | endl; 2477 2478 cout << x * 3 << y + 1 << (z << 2) << (x == y) << (x | y) << (x || y) << (x > z ? 1 : 2) << endl; 2479 \end{lstlisting} 2480 2481 Finally, 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 2487 int 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 2526 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 2527 $ a.out 2528 A 2529 1 2 3 4 5 6 7 8 2530 1.1 1.2 1.3 2531 1.11.21.3 2532 1.1+2.3i, $1.1-2.3i, $1.1-2.3i 2533 , $abcxyz 2534 abcxyz 2535 \end{lstlisting} 2536 \end{figure} 2537 2538 2539 \section{Standard Library} 2540 \label{s:StandardLibrary} 2541 2542 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. 2543 2544 2545 \subsection{malloc} 2546 2547 \begin{lstlisting} 2548 forall( otype T ) T * malloc( void ); 2549 forall( otype T ) T * malloc( char fill ); 2550 forall( otype T ) T * malloc( T * ptr, size_t size ); 2551 forall( otype T ) T * malloc( T * ptr, size_t size, unsigned char fill ); 2552 forall( otype T ) T * calloc( size_t size ); 2553 forall( otype T ) T * realloc( T * ptr, size_t size ); 2554 forall( otype T ) T * realloc( T * ptr, size_t size, unsigned char fill ); 2555 2556 forall( otype T ) T * aligned_alloc( size_t alignment ); 2557 forall( otype T ) T * memalign( size_t alignment ); // deprecated 2558 forall( otype T ) int posix_memalign( T ** ptr, size_t alignment ); 2559 2560 forall( otype T ) T * memset( T * ptr, unsigned char fill ); // use default value '\0' for fill 2561 forall( otype T ) T * memset( T * ptr ); // remove when default value available 2562 \end{lstlisting} 2563 2564 2565 \subsection{ato/strto} 2566 2567 \begin{lstlisting} 2568 int ato( const char * ptr ); 2569 unsigned int ato( const char * ptr ); 2570 long int ato( const char * ptr ); 2571 unsigned long int ato( const char * ptr ); 2572 long long int ato( const char * ptr ); 2573 unsigned long long int ato( const char * ptr ); 2574 float ato( const char * ptr ); 2575 double ato( const char * ptr ); 2576 long double ato( const char * ptr ); 2577 float _Complex ato( const char * ptr ); 2578 double _Complex ato( const char * ptr ); 2579 long double _Complex ato( const char * ptr ); 2580 2581 int strto( const char * sptr, char ** eptr, int base ); 2582 unsigned int strto( const char * sptr, char ** eptr, int base ); 2583 long int strto( const char * sptr, char ** eptr, int base ); 2584 unsigned long int strto( const char * sptr, char ** eptr, int base ); 2585 long long int strto( const char * sptr, char ** eptr, int base ); 2586 unsigned long long int strto( const char * sptr, char ** eptr, int base ); 2587 float strto( const char * sptr, char ** eptr ); 2588 double strto( const char * sptr, char ** eptr ); 2589 long double strto( const char * sptr, char ** eptr ); 2590 float _Complex strto( const char * sptr, char ** eptr ); 2591 double _Complex strto( const char * sptr, char ** eptr ); 2592 long double _Complex strto( const char * sptr, char ** eptr ); 2593 \end{lstlisting} 2594 2595 2596 \subsection{bsearch/qsort} 2597 2598 \begin{lstlisting} 2599 forall( otype T | { int ?<?( T, T ); } ) 2600 T * bsearch( const T key, const T * arr, size_t dimension ); 2601 2602 forall( otype T | { int ?<?( T, T ); } ) 2603 void qsort( const T * arr, size_t dimension ); 2604 \end{lstlisting} 2605 2606 2607 \subsection{abs} 2608 2609 \begin{lstlisting} 2610 char abs( char ); 2611 extern "C" { 2612 int abs( int ); // use default C routine for int 2613 } // extern 2614 long int abs( long int ); 2615 long long int abs( long long int ); 2616 float abs( float ); 2617 double abs( double ); 2618 long double abs( long double ); 2619 float _Complex abs( float _Complex ); 2620 double _Complex abs( double _Complex ); 2621 long double _Complex abs( long double _Complex ); 2622 \end{lstlisting} 2623 2624 2625 \subsection{random} 2626 2627 \begin{lstlisting} 2628 void randseed( long int s ); 2629 char random(); 2630 int random(); 2631 unsigned int random(); 2632 long int random(); 2633 unsigned long int random(); 2634 float random(); 2635 double random(); 2636 float _Complex random(); 2637 double _Complex random(); 2638 long double _Complex random(); 2639 \end{lstlisting} 2640 2641 2642 \subsection{min/max/swap} 2643 2644 \begin{lstlisting} 2645 forall( otype T | { int ?<?( T, T ); } ) 2646 T min( const T t1, const T t2 ); 2647 2648 forall( otype T | { int ?>?( T, T ); } ) 2649 T max( const T t1, const T t2 ); 2650 2651 forall( otype T ) 2652 void swap( T * t1, T * t2 ); 2653 \end{lstlisting} 2623 2654 2624 2655 … … 2645 2676 2646 2677 task creates a type with implicit locking, separate stack, and a thread 2647 2648 2678 2649 2679 \subsection{Monitors} … … 3745 3775 \multicolumn{1}{c|}{\textbf{\CFA/\CC}} & \multicolumn{1}{c|}{\textbf{Go}} & \multicolumn{1}{c}{\textbf{Rust}} \\ 3746 3776 \hline 3747 \begin{lstlisting} [boxpos=t]3777 \begin{lstlisting} 3748 3778 extern "C" { 3749 3779 #include <sys/types.h> … … 3752 3782 } 3753 3783 size_t fileSize( const char *path ) { 3754 st ruct stat s;3784 stat s; 3755 3785 stat(path, &s); 3756 3786 return s.st_size; … … 3758 3788 \end{lstlisting} 3759 3789 & 3760 \begin{lstlisting} [boxpos=t]3790 \begin{lstlisting} 3761 3791 /* 3762 3792 #cgo … … 3777 3807 \end{lstlisting} 3778 3808 & 3779 \begin{lstlisting} [boxpos=t]3809 \begin{lstlisting} 3780 3810 use libc::{c_int, size_t}; 3811 3812 // The following declarations are 3781 3813 // translated from sys/stat.h 3782 3814 #[repr(C)] … … 3786 3818 ... 3787 3819 } 3820 3788 3821 #[link(name = "libc")] 3789 3822 extern { … … 3791 3824 buf: *mut stat_t) -> c_int; 3792 3825 } 3826 3793 3827 fn fileSize(path: *const u8) -> size_t 3794 3828 { 3795 3829 unsafe { 3796 let mut buf: stat_t = uninit();3797 stat(path, &mut buf);3798 buf.st_size3830 let mut buf: stat_t = uninit(); 3831 stat(path, &mut buf); 3832 buf.st_size 3799 3833 } 3800 3834 } … … 3919 3953 3920 3954 3921 \begin{comment}3922 3955 \subsubsection{Modules/Packages} 3923 3956 … … 3999 4032 } 4000 4033 \end{lstlisting} 4001 \end{comment}4002 4003 4034 4004 4035 \subsubsection{Parallel Tasks} … … 4156 4187 \end{flushleft} 4157 4188 4158 \lstset{basicstyle=\sf\relsize{-1}}4159 4160 4161 4189 \subsection{Summary of Language Comparison} 4162 4190 … … 4225 4253 D does not have any built-in concurrency constructs in the 4226 4254 language, though it does have a standard library for concurrency which includes the low-level primitives for concurrency. 4227 4228 4229 \appendix4230 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 \item4277 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 34283 \end{lstlisting}4284 \item4285 A seperator does not appear before or after a character literal or variable.4286 \begin{lstlisting}4287 sout | '1' | '2' | '3' | endl;4288 1234289 \end{lstlisting}4290 \item4291 A seperator does not appear before or after a null (empty) C string4292 \begin{lstlisting}4293 sout | 1 | "" | 2 | "" | 3 | endl;4294 1234295 \end{lstlisting}4296 which is a local mechanism to disable insertion of the separator character.4297 \item4298 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 «84306 \end{lstlisting}4307 %$4308 \item4309 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 \item4318 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" x4324 \end{lstlisting}4325 \begin{lstlisting}[showtabs=true,aboveskip=0pt]4326 sout | "x\t" | 1 | "\tx" | endl;4327 x 1 x4328 \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 line4333 \end{lstlisting}4334 \begin{lstlisting}[mathescape=off,showspaces=true,aboveskip=0pt,belowskip=0pt]4335 1 2 34336 \end{lstlisting}4337 \begin{lstlisting}[mathescape=off,aboveskip=0pt,belowskip=0pt]4338 sout | 1 | sepOff | 2 | 3 | endl; // turn off implicit separator temporarily4339 \end{lstlisting}4340 \begin{lstlisting}[mathescape=off,showspaces=true,aboveskip=0pt,belowskip=0pt]4341 12 34342 \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 prints4345 \end{lstlisting}4346 \begin{lstlisting}[mathescape=off,showspaces=true,aboveskip=0pt,belowskip=0pt]4347 1234348 \end{lstlisting}4349 \begin{lstlisting}[mathescape=off,aboveskip=0pt,belowskip=0pt]4350 sout | 1 | sepOn | 2 | 3 | endl; // turn on implicit separator temporarily4351 \end{lstlisting}4352 \begin{lstlisting}[mathescape=off,showspaces=true,aboveskip=0pt,belowskip=0pt]4353 1 234354 \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 prints4357 \end{lstlisting}4358 \begin{lstlisting}[mathescape=off,showspaces=true,aboveskip=0pt,belowskip=0pt]4359 1 2 34360 \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, $34368 \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 types4378 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 file4395 open( &in, "input.data", "r" );4396 4397 &in | &c // character4398 | &si | &usi | &i | &ui | &li | &uli | &lli | &ulli // integral4399 | &f | &d | &ld // floating point4400 | &fc | &dc | &ldc // floating-point complex4401 | cstr( s1 ) | cstr( s2, 10 ); // C string, length unchecked and checked4402 4403 sout | c | ' ' | endl // character4404 | si | usi | i | ui | li | uli | lli | ulli | endl // integral4405 | f | d | ld | endl // floating point4406 | fc | dc | ldc | endl; // complex4407 sout | endl;4408 sout | f | "" | d | "" | ld | endl // floating point without separator4409 | sepDisable | fc | dc | ldc | sepEnable | endl // complex without separator4410 | sepOn | s1 | sepOff | s2 | endl // local separator removal4411 | s1 | "" | s2 | endl; // C string withou separator4412 sout | endl;4413 sepSet( sout, ", $" ); // change separator, maximum of 15 characters4414 sout | f | d | ld | endl // floating point without separator4415 | fc | dc | ldc | endl // complex without separator4416 | s1 | s2 | endl;4417 }4418 4419 $ cat input.data4420 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 xyz4421 $ a.out4422 A4423 1 2 3 4 5 6 7 84424 1.1 1.2 1.34425 1.1+2.3i 1.1-2.3i 1.1-2.3i4426 4427 1.11.21.34428 1.1+2.3i1.1-2.3i1.1-2.3i4429 abcxyz4430 abcxyz4431 4432 1.1, $1.2, $1.34433 1.1+2.3i, $1.1-2.3i, $1.1-2.3i4434 abc, $xyz4435 \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 ); // deprecated4460 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 fill4463 forall( otype T ) T * memset( T * ptr ); // remove when default value available4464 \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 int4515 } // 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 double4533 } // extern "C"4534 long double floor( long double );4535 4536 float ceil( float );4537 extern "C" {4538 double ceil( double ); // use C routine for double4539 } // 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}4573 4255 4574 4256 -
src/driver/cfa.cc
r78885b5 rbc1ab61 10 10 // Created On : Tue Aug 20 13:44:49 2002 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Wed Apr 6 14:04:22201613 // Update Count : 1 3212 // Last Modified On : Thu Jan 28 18:24:06 2016 13 // Update Count : 127 14 14 // 15 15 … … 165 165 nargs += 1; 166 166 } else if ( prefix( arg, "-std=" ) ) { 167 std_flag = true; // -std=XX provided167 std_flag = true; // std=XX provided 168 168 args[nargs] = argv[i]; // pass the argument along 169 169 nargs += 1; … … 307 307 nargs += 1; 308 308 if ( ! std_flag ) { // default c99, if none specified 309 args[nargs] = "-std= gnu99";309 args[nargs] = "-std=c99"; 310 310 nargs += 1; 311 311 } // if -
src/libcfa/Makefile.am
r78885b5 rbc1ab61 11 11 ## Created On : Sun May 31 08:54:01 2015 12 12 ## Last Modified By : Peter A. Buhr 13 ## Last Modified On : Wed Apr 6 21:10:44201614 ## Update Count : 1 2313 ## Last Modified On : Wed Mar 2 22:59:23 2016 14 ## Update Count : 119 15 15 ############################################################################### 16 16 … … 60 60 ${CC} ${CFLAGS} -c -o $@ $< 61 61 62 libs = limits stdlib iostream fstream iterator rational62 libs = stdlib iostream fstream iterator 63 63 libcfa_a_SOURCES = libcfa-prelude.c ${libs:=.c} 64 64 65 cheaders = # expat66 cfaheaders = #limits65 cheaders = # expat 66 cfaheaders = limits 67 67 include_HEADERS = ${cheaders:=.h} ${libs} ${cfaheaders} 68 68 -
src/libcfa/Makefile.in
r78885b5 rbc1ab61 83 83 libcfa_a_AR = $(AR) $(ARFLAGS) 84 84 libcfa_a_LIBADD = 85 am__objects_1 = limits.$(OBJEXT) stdlib.$(OBJEXT) iostream.$(OBJEXT) \86 fstream.$(OBJEXT) iterator.$(OBJEXT) rational.$(OBJEXT)85 am__objects_1 = stdlib.$(OBJEXT) iostream.$(OBJEXT) fstream.$(OBJEXT) \ 86 iterator.$(OBJEXT) 87 87 am_libcfa_a_OBJECTS = libcfa-prelude.$(OBJEXT) $(am__objects_1) 88 88 libcfa_a_OBJECTS = $(am_libcfa_a_OBJECTS) … … 213 213 MAINTAINERCLEANFILES = ${addprefix ${libdir}/,${cfalib_DATA}} \ 214 214 ${addprefix ${libdir}/,${lib_LIBRARIES}} ${includedir}/* 215 libs = limits stdlib iostream fstream iterator rational215 libs = stdlib iostream fstream iterator 216 216 libcfa_a_SOURCES = libcfa-prelude.c ${libs:=.c} 217 cheaders = # expat218 cfaheaders = #limits217 cheaders = # expat 218 cfaheaders = limits 219 219 include_HEADERS = ${cheaders:=.h} ${libs} ${cfaheaders} 220 220 all: all-am … … 297 297 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/iterator.Po@am__quote@ 298 298 @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@301 299 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stdlib.Po@am__quote@ 302 300 -
src/libcfa/fstream
r78885b5 rbc1ab61 10 10 // Created On : Wed May 27 17:56:53 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Tue Apr 5 22:37:12201613 // Update Count : 8212 // Last Modified On : Wed Mar 2 15:08:14 2016 13 // Update Count : 78 14 14 // 15 15 … … 20 20 21 21 enum { separateSize = 16 }; 22 struct ofstream { 23 void *file; 24 _Bool sepDefault; 25 _Bool sepOnOff; 26 char separator[separateSize]; 27 }; // ofstream 22 struct ofstream { void *file; int separate; char separator[separateSize]; }; 28 23 29 24 _Bool sepPrt( ofstream * ); 30 25 void sepOn( ofstream * ); 31 26 void sepOff( ofstream * ); 32 void sepReset( ofstream * );33 void sepReset( ofstream *, _Bool );34 27 void sepSet( ofstream *, const char * ); 35 28 const char * sepGet( ofstream * ); 36 _BoolsepDisable( ofstream * );37 _BoolsepEnable( ofstream * );29 void sepDisable( ofstream * ); 30 void sepEnable( ofstream * ); 38 31 int fail( ofstream * ); 39 32 int flush( ofstream * ); … … 46 39 47 40 // implement context istream 48 struct ifstream { 49 void *file; 50 }; // ifstream 41 struct ifstream { void *file; }; 51 42 52 43 int fail( ifstream * is ); -
src/libcfa/fstream.c
r78885b5 rbc1ab61 10 10 // Created On : Wed May 27 17:56:53 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Wed Apr 6 17:55:27201613 // Update Count : 1 7612 // Last Modified On : Mon Feb 29 18:41:10 2016 13 // Update Count : 162 14 14 // 15 15 … … 25 25 } 26 26 27 #define IO_MSG "I/O error :"27 #define IO_MSG "I/O error " 28 28 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; } 30 void sepOn( ofstream * os ) { if ( os->separate != 2 ) os->separate = 1; } 31 void sepOff( ofstream * os ) { if ( os->separate != 2 ) os->separate = 0; } 34 32 void sepSet( ofstream * os, const char * s ) { 35 33 strncpy( &(os->separator[0]), s, separateSize - 1 ); … … 37 35 } // sepSet 38 36 const 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 37 void sepDisable( ofstream *os ) { os->separate = 2; } 38 void sepEnable( ofstream *os ) { os->separate = 0; } 51 39 52 40 int fail( ofstream * os ) { … … 61 49 FILE *file = fopen( name, mode ); 62 50 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" ); 65 52 exit( EXIT_FAILURE ); 66 53 } // if … … 107 94 108 95 109 static ofstream soutFile = { (FILE *)(&_IO_2_1_stdout_), 1,0, { ' ', '\0' } };96 static ofstream soutFile = { (FILE *)(&_IO_2_1_stdout_), 0, { ' ', '\0' } }; 110 97 ofstream *sout = &soutFile; 111 static ofstream serrFile = { (FILE *)(&_IO_2_1_stderr_), 1,0, { ' ', '\0' } };98 static ofstream serrFile = { (FILE *)(&_IO_2_1_stderr_), 0, { ' ', '\0' } }; 112 99 ofstream *serr = &serrFile; 113 100 … … 127 114 FILE *t = fopen( name, mode ); 128 115 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" ); 131 117 exit( EXIT_FAILURE ); 132 118 } // if … … 189 175 // Local Variables: // 190 176 // tab-width: 4 // 177 // compile-command: "cfa fstream.c" // 191 178 // End: // -
src/libcfa/iostream
r78885b5 rbc1ab61 10 10 // Created On : Wed May 27 17:56:53 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Tue Apr 5 22:32:37 201613 // Update Count : 9012 // Last Modified On : Wed Mar 2 18:05:27 2016 13 // Update Count : 85 14 14 // 15 15 … … 23 23 void sepOn( ostype * ); 24 24 void sepOff( ostype * ); 25 void sepReset( ostype * );26 void sepReset( ostype *, _Bool );27 25 void sepSet( ostype *, const char * ); 28 26 const char * sepGet( ostype * ); 29 _BoolsepDisable( ostype * );30 _BoolsepEnable( ostype * );27 void sepDisable( ostype * ); 28 void sepEnable( ostype * ); 31 29 int fail( ostype * ); 32 30 int flush( ostype * ); … … 69 67 forall( dtype ostype | ostream( ostype ) ) ostype * sepOn( ostype * ); 70 68 forall( 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 * );73 69 74 70 // writes the range [begin, end) to the given stream … … 114 110 forall( dtype istype | istream( istype ) ) istype * ?|?( istype *, long double _Complex * ); 115 111 116 struct _Istream_ cstrUC{ char * s; };117 _Istream_ cstrUC cstr( char * );118 forall( dtype istype | istream( istype ) ) istype * ?|?( istype *, _Istream_ cstrUC);112 struct _Istream_str1 { char * s; }; 113 _Istream_str1 str( char * ); 114 forall( dtype istype | istream( istype ) ) istype * ?|?( istype *, _Istream_str1 ); 119 115 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);116 struct _Istream_str2 { char * s; int size; }; 117 _Istream_str2 str( char *, int size ); 118 forall( dtype istype | istream( istype ) ) istype * ?|?( istype *, _Istream_str2 ); 123 119 124 120 #endif // __IOSTREAM_H__ -
src/libcfa/iostream.c
r78885b5 rbc1ab61 10 10 // Created On : Wed May 27 17:56:53 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Wed Apr 6 16:13:29201613 // Update Count : 2 7812 // Last Modified On : Mon Mar 7 13:51:23 2016 13 // Update Count : 227 14 14 // 15 15 … … 27 27 ostype * ?|?( ostype *os, char c ) { 28 28 prtfmt( os, "%c", c ); 29 sepOff( os );30 29 return os; 31 30 } // ?|? … … 33 32 forall( dtype ostype | ostream( ostype ) ) 34 33 ostype * ?|?( 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 ); 37 35 prtfmt( os, "%hd", si ); 38 36 return os; … … 41 39 forall( dtype ostype | ostream( ostype ) ) 42 40 ostype * ?|?( 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 ); 45 42 prtfmt( os, "%hu", usi ); 46 43 return os; … … 49 46 forall( dtype ostype | ostream( ostype ) ) 50 47 ostype * ?|?( 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 ); 53 49 prtfmt( os, "%d", i ); 54 50 return os; … … 57 53 forall( dtype ostype | ostream( ostype ) ) 58 54 ostype * ?|?( 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 ); 61 56 prtfmt( os, "%u", ui ); 62 57 return os; … … 65 60 forall( dtype ostype | ostream( ostype ) ) 66 61 ostype * ?|?( 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 ); 69 63 prtfmt( os, "%ld", li ); 70 64 return os; … … 73 67 forall( dtype ostype | ostream( ostype ) ) 74 68 ostype * ?|?( 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 ); 77 70 prtfmt( os, "%lu", uli ); 78 71 return os; … … 81 74 forall( dtype ostype | ostream( ostype ) ) 82 75 ostype * ?|?( 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 ); 85 77 prtfmt( os, "%lld", lli ); 86 78 return os; … … 89 81 forall( dtype ostype | ostream( ostype ) ) 90 82 ostype * ?|?( 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 ); 93 84 prtfmt( os, "%llu", ulli ); 94 85 return os; … … 97 88 forall( dtype ostype | ostream( ostype ) ) 98 89 ostype * ?|?( 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 ); 101 91 prtfmt( os, "%g", f ); 102 92 return os; … … 105 95 forall( dtype ostype | ostream( ostype ) ) 106 96 ostype * ?|?( 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 ); 109 98 prtfmt( os, "%.*lg", DBL_DIG, d ); 110 99 return os; … … 113 102 forall( dtype ostype | ostream( ostype ) ) 114 103 ostype * ?|?( 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 ); 117 105 prtfmt( os, "%.*Lg", LDBL_DIG, ld ); 118 106 return os; … … 122 110 ostype * ?|?( ostype *os, float _Complex fc ) { 123 111 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'; 128 114 return os; 129 115 } // ?|? … … 132 118 ostype * ?|?( ostype *os, double _Complex dc ) { 133 119 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'; 138 122 return os; 139 123 } // ?|? … … 142 126 ostype * ?|?( ostype *os, long double _Complex ldc ) { 143 127 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'; 148 130 return os; 149 131 } // ?|? … … 152 134 ostype * ?|?( ostype *os, const char *cp ) { 153 135 enum { Open = 1, Close, OpenClose }; 154 static const unsignedchar mask[256] = {136 static const char mask[256] = { 155 137 // opening delimiters 156 138 ['('] : 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, 158 140 // closing delimiters 159 141 [','] : Close, ['.'] : Close, [':'] : Close, [';'] : Close, ['!'] : Close, ['?'] : Close, 160 142 [')'] : Close, [']'] : Close, ['}'] : Close, 161 ['%'] : Close, [ (unsigned char)'¢'] : Close, [(unsigned char)'»'] : Close,143 ['%'] : Close, [L'»'] : Close, 162 144 // opening-closing delimiters 163 145 ['\''] : OpenClose, ['`'] : OpenClose, ['"'] : OpenClose, 164 ['\f'] : OpenClose, ['\n'] : OpenClose, ['\r'] : OpenClose, ['\t'] : OpenClose, ['\v'] : OpenClose, // isspace165 146 }; // mask 166 147 … … 168 149 // null string => no separator 169 150 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 ) { 173 153 prtfmt( os, "%s", sepGet( os ) ); 174 154 } // if 175 155 // last character IS spacing or opening punctuation => turn off separator for next item 176 156 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 ) { 179 158 sepOff( os ); 180 159 } else { … … 186 165 forall( dtype ostype | ostream( ostype ) ) 187 166 ostype * ?|?( 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 ); 190 168 prtfmt( os, "%p", p ); 191 169 return os; … … 218 196 } // sepOff 219 197 220 forall( dtype ostype | ostream( ostype ) )221 ostype * sepEnable( ostype * os ) {222 sepEnable( os );223 return os;224 } // sepEnable225 226 forall( dtype ostype | ostream( ostype ) )227 ostype * sepDisable( ostype * os ) {228 sepDisable( os );229 return os;230 } // sepDisable231 232 198 //--------------------------------------- 233 199 … … 344 310 } // ?|? 345 311 346 _Istream_ cstrUC cstr( char * s ) { _Istream_cstrUCs = { 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 } // cstr352 353 _Istream_ cstrC cstr( char * s, int size ) { _Istream_cstrCs = { 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; } 313 forall( dtype istype | istream( istype ) ) 314 istype * ?|?( 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; } 320 forall( dtype istype | istream( istype ) ) 321 istype * ?|?( istype * is, _Istream_str2 str ) { 356 322 char buf[16]; 357 sprintf( buf, "%%%ds", cstr.size );358 scanfmt( is, buf, cstr.s );359 return is; 360 } // cstr323 sprintf( buf, "%%%ds", str.size ); 324 scanfmt( is, buf, str.s ); 325 return is; 326 } // str 361 327 362 328 // Local Variables: // -
src/libcfa/limits
r78885b5 rbc1ab61 1 //2 // Cforall Version 1.0.0 Copyright (C) 2016 University of Waterloo3 //4 // The contents of this file are covered under the licence agreement in the5 // file "LICENCE" distributed with Cforall.6 //7 // limits --8 //9 // Author : Peter A. Buhr10 // Created On : Wed Apr 6 18:06:52 201611 // Last Modified By : Peter A. Buhr12 // Last Modified On : Wed Apr 6 21:08:16 201613 // Update Count : 614 //15 16 1 // Integral Constants 17 2 18 extern const short int MIN;19 extern const int MIN;20 extern const long int MIN;21 extern const long long int MIN;3 const short int MIN = -32768; 4 const int MIN = -2147483648; 5 const long int MIN = -9223372036854775807L - 1L; 6 const long long int MIN = -9223372036854775807LL - 1LL; 22 7 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;8 const short int MAX = 32767; 9 const unsigned short int MAX = 65535; 10 const int MAX = 2147483647; 11 const unsigned int MAX = 4294967295_U; 12 const long int MAX = 9223372036854775807_L; 13 const unsigned long int MAX = 4294967295_U; 14 const long long int MAX = 9223372036854775807_LL; 15 const unsigned long long int MAX = 18446744073709551615_ULL; 31 16 32 17 // Floating-Point Constants 33 18 34 extern const float PI;// pi35 extern const float PI_2;// pi / 236 extern const float PI_4;// pi / 437 extern const float _1_PI;// 1 / pi38 extern const float _2_PI;// 2 / pi39 extern const float _2_SQRT_PI;// 2 / sqrt(pi)19 const float PI = 3.141592_F; // pi 20 const float PI_2 = 1.570796_F; // pi / 2 21 const float PI_4 = 0.7853981_F; // pi / 4 22 const float _1_PI = 0.3183098_F; // 1 / pi 23 const float _2_PI = 0.6366197_F; // 2 / pi 24 const float _2_SQRT_PI = 1.128379_F; // 2 / sqrt(pi) 40 25 41 extern const double PI;// pi42 extern const double PI_2;// pi / 243 extern const double PI_4;// pi / 444 extern const double _1_PI;// 1 / pi45 extern const double _2_PI;// 2 / pi46 extern const double _2_SQRT_PI;// 2 / sqrt(pi)26 const double PI = 3.14159265358979323846_D; // pi 27 const double PI_2 = 1.57079632679489661923_D; // pi / 2 28 const double PI_4 = 0.78539816339744830962_D; // pi / 4 29 const double _1_PI = 0.31830988618379067154_D; // 1 / pi 30 const double _2_PI = 0.63661977236758134308_D; // 2 / pi 31 const double _2_SQRT_PI = 1.12837916709551257390_D; // 2 / sqrt(pi) 47 32 48 extern const long double PI;// pi49 extern const long double PI_2;// pi / 250 extern const long double PI_4;// pi / 451 extern const long double _1_PI;// 1 / pi52 extern const long double _2_PI;// 2 / pi53 extern const long double _2_SQRT_PI;// 2 / sqrt(pi)33 const long double PI = 3.1415926535897932384626433832795029_DL; // pi 34 const long double PI_2 = 1.5707963267948966192313216916397514_DL; // pi / 2 35 const long double PI_4 = 0.7853981633974483096156608458198757_DL; // pi / 4 36 const long double _1_PI = 0.3183098861837906715377675267450287_DL; // 1 / pi 37 const long double _2_PI = 0.6366197723675813430755350534900574_DL; // 2 / pi 38 const long double _2_SQRT_PI = 1.1283791670955125738961589031215452_DL; // 2 / sqrt(pi) 54 39 55 extern const _Complex PI;// pi56 extern const _Complex PI_2;// pi / 257 extern const _Complex PI_4;// pi / 458 extern const _Complex _1_PI;// 1 / pi59 extern const _Complex _2_PI;// 2 / pi60 extern const _Complex _2_SQRT_PI;// 2 / sqrt(pi)40 const _Complex PI = 3.14159265358979323846_D+0.0_iD; // pi 41 const _Complex PI_2 = 1.57079632679489661923_D+0.0_iD; // pi / 2 42 const _Complex PI_4 = 0.78539816339744830962_D+0.0_iD; // pi / 4 43 const _Complex _1_PI = 0.31830988618379067154_D+0.0_iD; // 1 / pi 44 const _Complex _2_PI = 0.63661977236758134308_D+0.0_iD; // 2 / pi 45 const _Complex _2_SQRT_PI = 1.12837916709551257390_D+0.0_iD; // 2 / sqrt(pi) 61 46 62 extern const long _Complex PI;// pi63 extern const long _Complex PI_2;// pi / 264 extern const long _Complex PI_4;// pi / 465 extern const long _Complex _1_PI;// 1 / pi66 extern const long _Complex _2_PI;// 2 / pi67 extern const long _Complex _2_SQRT_PI;// 2 / sqrt(pi)47 const long _Complex PI = 3.1415926535897932384626433832795029_L+0.0iL; // pi 48 const long _Complex PI_2 = 1.5707963267948966192313216916397514_L+0.0iL; // pi / 2 49 const long _Complex PI_4 = 0.7853981633974483096156608458198757_L+0.0iL; // pi / 4 50 const long _Complex _1_PI = 0.3183098861837906715377675267450287_L+0.0iL; // 1 / pi 51 const long _Complex _2_PI = 0.6366197723675813430755350534900574_L+0.0iL; // 2 / pi 52 const long _Complex _2_SQRT_PI = 1.1283791670955125738961589031215452_L+0.0iL; // 2 / sqrt(pi) 68 53 69 extern const float E;// e70 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)54 const float E = 2.718281; // e 55 const float LOG2_E = 1.442695; // log_2(e) 56 const float LOG10_E = 0.4342944; // log_10(e) 57 const float LN_2 = 0.6931471; // log_e(2) 58 const float LN_10 = 2.302585; // log_e(10) 59 const float SQRT_2 = 1.414213; // sqrt(2) 60 const float _1_SQRT_2 = 0.7071067; // 1 / sqrt(2) 76 61 77 extern const double E;// e78 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)62 const double E = 2.7182818284590452354_D; // e 63 const double LOG2_E = 1.4426950408889634074_D; // log_2(e) 64 const double LOG10_E = 0.43429448190325182765_D; // log_10(e) 65 const double LN_2 = 0.69314718055994530942_D; // log_e(2) 66 const double LN_10 = 2.30258509299404568402_D; // log_e(10) 67 const double SQRT_2 = 1.41421356237309504880_D; // sqrt(2) 68 const double _1_SQRT_2 = 0.70710678118654752440_D; // 1 / sqrt(2) 84 69 85 extern const long double E;// e86 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)70 const long double E = 2.7182818284590452353602874713526625_DL; // e 71 const long double LOG2_E = 1.4426950408889634073599246810018921_DL; // log_2(e) 72 const long double LOG10_E = 0.4342944819032518276511289189166051_DL; // log_10(e) 73 const long double LN_2 = 0.6931471805599453094172321214581766_DL; // log_e(2) 74 const long double LN_10 = 2.3025850929940456840179914546843642_DL; // log_e(10) 75 const long double SQRT_2 = 1.4142135623730950488016887242096981_DL; // sqrt(2) 76 const long double _1_SQRT_2 = 0.7071067811865475244008443621048490_DL; // 1/sqrt(2) 92 77 93 extern const _Complex E;// e94 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)78 const _Complex E = 2.7182818284590452354_D+0.0_iD; // e 79 const _Complex LOG2_E = 1.4426950408889634074_D+0.0_iD; // log_2(e) 80 const _Complex LOG10_E = 0.43429448190325182765_D+0.0_iD; // log_10(e) 81 const _Complex LN_2 = 0.69314718055994530942_D+0.0_iD; // log_e(2) 82 const _Complex LN_10 = 2.30258509299404568402_D+0.0_iD; // log_e(10) 83 const _Complex SQRT_2 = 1.41421356237309504880_D+0.0_iD; // sqrt(2) 84 const _Complex _1_SQRT_2 = 0.70710678118654752440_D+0.0_iD; // 1 / sqrt(2) 100 85 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: // 86 const long _Complex E = 2.7182818284590452353602874713526625_L+0.0_iL; // e 87 const long _Complex LOG2_E = 1.4426950408889634073599246810018921_L+0.0_iL; // log_2(e) 88 const long _Complex LOG10_E = 0.4342944819032518276511289189166051_L+0.0_iL; // log_10(e) 89 const long _Complex LN_2 = 0.6931471805599453094172321214581766_L+0.0_iL; // log_e(2) 90 const long _Complex LN_10 = 2.3025850929940456840179914546843642_L+0.0_iL; // log_e(10) 91 const long _Complex SQRT_2 = 1.4142135623730950488016887242096981_L+0.0_iL; // sqrt(2) 92 const long _Complex _1_SQRT_2 = 0.7071067811865475244008443621048490_L+0.0_iL; // 1 / sqrt(2) -
src/libcfa/stdlib
r78885b5 rbc1ab61 10 10 // Created On : Thu Jan 28 17:12:35 2016 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Fri Apr 1 22:26:14 201613 // Update Count : 7312 // Last Modified On : Tue Mar 22 22:34:24 2016 13 // Update Count : 69 14 14 // 15 15 … … 18 18 extern "C" { 19 19 #include <stddef.h> // size_t 20 #include <math.h> // floor21 20 } // extern "C" 22 21 … … 81 80 char abs( char ); 82 81 extern "C" { 83 int abs( int ); // use default C routine for int84 } // extern "C"82 int abs( int ); // use default C routine for int 83 } // extern 85 84 long int abs( long int ); 86 85 long long int abs( long long int ); … … 91 90 double _Complex abs( double _Complex ); 92 91 long double _Complex abs( long double _Complex ); 93 94 //---------------------------------------95 96 float floor( float );97 extern "C" {98 double floor( double ); // use C routine for double99 } // extern "C"100 long double floor( long double );101 102 float ceil( float );103 extern "C" {104 double ceil( double ); // use C routine for double105 } // extern "C"106 long double ceil( long double );107 92 108 93 //--------------------------------------- -
src/libcfa/stdlib.c
r78885b5 rbc1ab61 10 10 // Created On : Thu Jan 28 17:10:29 2016 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Wed Mar 30 10:48:41201613 // Update Count : 14 912 // Last Modified On : Wed Mar 23 13:26:42 2016 13 // Update Count : 146 14 14 // 15 15 … … 243 243 //--------------------------------------- 244 244 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 253 245 void rand48seed( long int s ) { srand48( s ); } 254 246 char rand48() { return mrand48(); }
Note:
See TracChangeset
for help on using the changeset viewer.