Changeset 2d8a770

Apr 29, 2021, 11:00:18 AM (7 weeks ago)
Andrew Beach <ajbeach@…>
arm-eh, jacob/cs343-translation, master
3ec79f7 (diff), a6c45c6 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent.

Merge branch 'andrew-mmath' into branch 'master', some major LaTeX changes and some thesis work.

7 edited


  • doc/theses/andrew_beach_MMath/Makefile

    r3ec79f7 r2d8a770  
    3434        ${LATEX} ${BASE}
    3535        ${BIBTEX} ${BUILD}/${BASE}
    36         ${LATEX} ${BASE}
    3736        ${GLOSSARY} ${BUILD}/${BASE}
    3837        ${LATEX} ${BASE}
  • doc/theses/andrew_beach_MMath/cfalab.sty

    r3ec79f7 r2d8a770  
    1111% Other packages required.
     13% Access to new basic LaTeX tools and other low level commands.
     15% Code formatting tools and environments.
     17% Automatically adds spaces.
     19% Improved reference tools.
    1622% Symbols: All symbols are zero argument robust commands with special rules
    2127% \newsymbolcmd{<command>}{<replacement text>}
    22 %     Defines <command> to be a symbol that has the given <replacement text>.
     28% Defines <command> to be a symbol that has the given <replacement text>.
    2935% C++ with kerning. (No standard number support.)
    30 \newsymbolcmd\CPP{\textrm{C}\kern-.1em\hbox{+\kern-.25em+}}
    32 % This is executed very early in the \begin{document} code.
     38% This is executed very early in the \begin{document} code, before the
     39% document's contents but after packages are loaded.
    3441  \@ifpackageloaded{hyperref}{
    3643    \pdfstringdefDisableCommands{
    3744      \def\CFA{CFA}
    38       \def\CPP{C++}
     45      \def\Cpp{C++}
     46      \def\lstinline{}
    3947    }
    4048  }{}
     51% \colour{<colour>}{<text>}
     52% Just \color but using the LaTeX style instead of TeX style command.
     55% \code*{<code>}
     56% Use the listings package to format a snipit of <code>.
     62% Use the listings package to format a block of CFA code.
     63% Extra listings options can be passed in as an optional argument.
     66% \settextunderscore{(new|old)}
     67% Redefines the underscore either as a new repersentation or the old one.
     68% Not that some other packages (ex. hyperref) can override this. Set it up
     69% after loading them.
     72    \leavevmode\makebox[1.2ex][c]{\rule{1ex}{0.075ex}}}
     74    \renewcommand\textunderscore{\csuse{cfalab@textunderscore@#1}}}
    4376% The CFA listings language. Based off of ANCI C and including GCC extensions.
    63 % The cfalab style defines some common settings useful in different languages.
    64 \lstdefinestyle{cfalab}{%
    65     columns=fullflexible,
    66     basicstyle=\linespread{0.9}\tt,
    67     stringstyle=\tt,
     96% Create an internal paragraph indent amount. This is used internally to
     97% mimic the standard indent even when it has been overriden in the document.
     101% The cfacommon style has many useful defaults for CFA and other types of
     102% code. Use the listings option "style=cfacommon" to load them.
     104  columns=fullflexible,
     105  basicstyle=\linespread{0.9}\sf,
     106  stringstyle=\tt,
     107  tabsize=5,
     108  % Indent code to paragraph indentation.
     109  xleftmargin=\cfalab@parindent,
     110  % Allow ASCII characters in the range 128-255.
     111  extendedchars=true,
     112  % This allows you to use "math mode" to insert LaTeX into the code.
     113  % Use \( and \) if you need to insert math mode inside that code.
     114  escapechar=\$,
     115  % Disable LaTeX math escape in CFA code $...$
     116  mathescape=false,
     117  keepspaces=true,
     118  % Do not show spaces with cup.
     119  showstringspaces=false,
     120  % Show blank lines at end of code.
     121  showlines=true,
     122  % Spacing above/below code block.
     123  aboveskip=4pt,belowskip=0pt,
     124  numberstyle=\footnotesize\sf,
     125  % Replace/adjust listing characters that look bad in sanserif.
     126  literate={-}{\makebox[1ex][c]{\raisebox{0.4ex}{\rule{0.75ex}{0.1ex}}}}1
     127    {^}{\raisebox{0.6ex}{$\scriptscriptstyle\land\,$}}1
     128    {~}{\raisebox{0.3ex}{$\scriptstyle\sim\,$}}1 {`}{\ttfamily\upshape\hspace*{-0.1ex}`}1
     129    {<-}{$\leftarrow$}2 {=>}{$\Rightarrow$}2
     130    {->}{\makebox[1ex][c]{\raisebox{0.4ex}{\rule{0.8ex}{0.075ex}}}\kern-0.2ex\textgreater}2,
    70 % \code*[<escape character>]{<code>}
    71 %     Use the listings package to format a snipit of <code>.
    72 %     The <escape character> must be a character that does not appear in
    73 %     <code> and defaults to a backtick.
    74 \newcommand*\codeC[2][\`]{\lstinline[language=C]#1#2#1}
    75 \newcommand*\codeCFA[2][\`]{\lstinline[language=CFA]#1#2#1}
     133% common.tex Compatablity ===================================================
     134% Below this line is for compatability with the old common.tex file.
    77 % \settextunderscore{(new|old)}
    78 %     Redefines the underscore either as a new repersentation or the old one.
    79 %     Not that some other packages (ex. hyperref) can override this. Set it
    80 %     up after loading them.
    81 \let\cfalab@textunderscore@old=\textunderscore
    82 \newcommand\cfalab@textunderscore@new{%
    83     \leavevmode\makebox[1.2ex][c]{\rule{1ex}{0.075ex}}}
    84 \newcommand\settextunderscore[1]{%
    85     \renewcommand\textunderscore{\csuse{cfalab@textunderscore@#1}}}
     136% Backwards compatable way to activate the cfacommon style.
     139% A couple of abbreviations are provided. Just ones someone liked.
     141% Abbreviation formatting commands (renew to customize):
     144% Abbreviations that, if not followed by a comma or colon, add a comma.
     146  \@ifnextchar{,}{}{\@ifnextchar{:}{}{,\xspace}}}
     150% Abbreviations that, if not followed by a period, add a period.
  • doc/theses/andrew_beach_MMath/existing.tex

    r3ec79f7 r2d8a770  
    1616to be defined~\cite{Moss18}.
    18 char i; int i; double i;                        $\C[3.75in]{// variable overload}$
    19 int f(); double f();                            $\C{// return overload}$
    20 void g( int ); void g( double );        $\C{// parameter overload}\CRT$
     18char i; int i; double i;
     19int f(); double f();
     20void g( int ); void g( double );
    2222This feature requires name mangling so the assembly symbols are unique for
    2626mangling is:
    28 // name mangling
     28// name mangling on by default
    2929int i; // _X1ii_1
    30 @extern "C"@ {  // no name mangling
     30extern "C" {  // disables name mangling
    3131        int j; // j
    32         @extern "Cforall"@ {  // name mangling
     32        extern "Cforall" {  // enables name mangling
    3333                int k; // _X1ki_1
    3434        }
    35         // no name mangling
    36 }
    37 // name mangling
     35        // revert to no name mangling
     37// revert to name mangling
    3939Both forms of @extern@ affect all the declarations within their nested lexical
    5151int i, j;
    52 int @&@ ri = i, @&&@ rri = ri;
     52int & ri = i, && rri = ri;
    5353rri = 3;  // auto-dereference assign to i
    54 @&@ri = @&@j; // rebindable
     54&ri = &j; // rebindable
    5555ri = 5;   // assign to j
    6565In general, operator names in \CFA are constructed by bracketing an operator
    66 token with @?@, which indicates the position of the arguments. For example, infixed
    67 multiplication is @?*?@ while prefix dereference is @*?@. This syntax make it
    68 easy to tell the difference between prefix operations (such as @++?@) and
    69 post-fix operations (@?++@).
     66token with @?@, which indicates the position of the arguments. For example,
     67infixed multiplication is @?*?@ while prefix dereference is @*?@.
     68This syntax make it easy to tell the difference between prefix operations
     69(such as @++?@) and post-fix operations (@?++@).
    7171The special name for a constructor is @?{}@, which comes from the
    72 initialization syntax in C. The special name for a destructor is @^{}@, where
    73 the @^@ has no special meaning.
     72initialization syntax in C. That initialation syntax is also the operator
     73form. \CFA will generate a constructor call each time a variable is declared,
     74passing the initialization arguments to the constructort.
     76struct Example { ... };
     77void ?{}(Example & this) { ... }
     79        Example a;
     80        Example b = {};
     82void ?{}(Example & this, char first, int num) { ... }
     84        Example c = {'a', 2};
     87Both @a@ and @b@ will be initalized with the first constructor (there is no
     88general way to skip initialation) while @c@ will be initalized with the
    7491% I don't like the \^{} symbol but $^\wedge$ isn't better.
    75 \begin{cfa}
    76 struct T { ... };
    77 void ?@{}@(@T &@ this, ...) { ... }  // constructor
    78 void ?@^{}@(@T &@ this, ...) { ... } // destructor
     92Similarly destructors use the special name @^?{}@ (the @^@ has no special
     93meaning). They can be called explicatly as well but normally they are
     94implicitly called on a variable when it goes out of scope.
     96void ^?{}(Example & this) { ... }
    80         T s = @{@ ... @}@;  // same constructor/initialization braces
    81 } // destructor call automatically generated
    82 \end{cfa}
    83 The first parameter is a reference parameter to the type for the
    84 constructor/destructor. Destructors may have multiple parameters.  The compiler
    85 implicitly matches an overloaded constructor @void ^?{}(T &, ...);@ to an
    86 object declaration with associated initialization, and generates a construction
    87 call after the object is allocated. When an object goes out of scope, the
    88 matching overloaded destructor @void ^?{}(T &);@ is called.  Without explicit
    89 definition, \CFA creates a default and copy constructor, destructor and
    90 assignment (like \Cpp). It is possible to define constructors/destructors for
    91 basic and existing types (unlike \Cpp).
     98    Example d;
     99} // <- implicit destructor call
     101No operator name is restricted in what function signatures they may be bound
     102to although most of the forms cannot be called in operator form. Some
     103``near-misses" will generate warnings.
     105Whenever a type is defined, \CFA will create a default zero-argument
     106constructor, a copy constructor, a series of argument-per-field constructors
     107and a destructor. All user constructors are defined after this.
     108Because operators are never part of the type definition they may be added
     109at any time, including on built-in types.
    105123works on any type @T@:
    107 @forall( T )@ @T@ identity( @T@ val ) { return val; }
    108 int forty_two = identity( 42 ); // T bound to int, forty_two == 42
    109 \end{cfa}
     125forall( T ) T identity( T val ) { return val; }
     126int forty_two = identity( 42 );
     127char capital_a = identity( 'A' );
     129Each use of a polymorphic declaration will resolve its polymorphic parameters
     130(in this case, just @T@) to concrete types (@int@ in the first use and @char@
     131in the second).
    111133To allow a polymorphic function to be separately compiled, the type @T@ must be
    115137types used in a function, \eg:
    117 forall( T @| { void do_once(T); }@) // assertion
     139forall( T | { void do_once(T); })
    118140void do_twice(T value) {
    119141        do_once(value);
    120142        do_once(value);
    122 void do_once(@int@ i) { ... }  // provide assertion
    123 @int@ i;
    124 do_twice(i); // implicitly pass assertion do_once to do_twice
    125 \end{cfa}
    126 Any object with a type fulfilling the assertion may be passed as an argument to
    127 a @do_twice@ call.
    129146A polymorphic function can be used in the same way as a normal function.  The
    132149all the variables replaced with the concrete types from the arguments) is
    133150defined at a call site.
     152void do_once(int i) { ... }
     153int i;
     156Any object with a type fulfilling the assertion may be passed as an argument to
     157a @do_twice@ call.
    135159Note, a function named @do_once@ is not required in the scope of @do_twice@ to
    140 void do_once(double y) { ... } // global
     164void do_once(double y) { ... }
    141165int quadruple(int x) {
    142         void do_once(int y) { y = y * 2; } // local
    143         do_twice(x); // using local "do_once"
     166        void do_once(int y) { y = y * 2; }
     167        do_twice(x);
    144168        return x;
    150174function. The matched assertion function is then passed as a function pointer
    151175to @do_twice@ and called within it.
     176The global definition of @do_once@ is ignored.
    153178To avoid typing long lists of assertions, constraints can be collect into
    161186and the @forall@ list in the previous example is replaced with the trait.
    163 forall(dtype T | @done_once(T)@)
     188forall(dtype T | done_once(T))
    165190In general, a trait can contain an arbitrary number of assertions, both
    172197declarations instead of parameters, returns, and local variable declarations.
    174 forall(dtype @T@)
     199forall(dtype T)
    175200struct node {
    176         node(@T@) * next;  // generic linked node
    177         @T@ * data;
    178 }
    179 node(@int@) inode;
    180 \end{cfa}
    181 The generic type @node(T)@ is an example of a polymorphic-type usage.  Like \Cpp
    182 template usage, a polymorphic-type usage must specify a type parameter.
     201        node(T) * next;  // generic linked node
     202        T * data;
     204node(int) inode;
     206The generic type @node(T)@ is an example of a polymorphic type usage.  Like \Cpp
     207template usage, a polymorphic type usage must specify a type parameter.
    184209There are many other polymorphism features in \CFA but these are the ones used
    219244Each coroutine has a @main@ function, which takes a reference to a coroutine
    220245object and returns @void@.
    221 \begin{cfa}[numbers=left]
    222 void main(@CountUp & this@) { // argument matches trait is_coroutine
    223         unsigned int up = 0;  // retained between calls
    224         while (true) {
    225                 next = up; // make "up" available outside function
    226                 @suspend;@$\label{suspend}$
    227                 up += 1;
     247void main(CountUp & this) {
     248    for (unsigned int next = 0 ; true ; ++next) {
     249                next = up;
     250                suspend;$\label{suspend}$
    228251        }
    256 void example(MonitorA & @mutex@ argA, MonitorB & @mutex@ argB);
     279void example(MonitorA & mutex argA, MonitorB & mutex argB);
    258281When the function is called, it implicitly acquires the monitor lock for all of
  • doc/theses/andrew_beach_MMath/features.tex

    r3ec79f7 r2d8a770  
    2121The raise is the starting point for exception handling. It marks the beginning
    22 of exception handling by \newterm{raising} an excepion, which passes it to
     22of exception handling by raising an excepion, which passes it to
    2323the EHM.
    101101between different sub-hierarchies.
    102102This design is used in \CFA even though it is not a object-orientated
    103 language using different tools to create the hierarchy.
     103language; so different tools are used to create the hierarchy.
    105105% Could I cite the rational for the Python IO exception rework?
    124124Virtual types and casts are not part of \CFA's EHM nor are they required for
    125 any EHM. But \CFA uses a hierarchial system of exceptions and this feature
    126 is leveraged to create that.
    128 % Maybe talk about why the virtual system is so minimal.
    129 % Created for but not a part of the exception system.
     125any EHM.
     126However the \CFA uses a hierarchy built with the virtual system as the basis
     127for exceptions and exception matching.
     129The virtual system would have ideally been part of \CFA before the work
     130on exception handling began, but unfortunately it was not.
     131Because of this only the features and framework needed for the EHM were
     132designed and implemented. Other features were considered to ensure that
     133the structure could accomidate other desirable features but they were not
     135The rest of this section will only discuss the finalized portion of the
     136virtual system.
    131138The virtual system supports multiple ``trees" of types. Each tree is
    175182While much of the virtual infrastructure is created, it is currently only used
    176183internally for exception handling. The only user-level feature is the virtual
    177 cast, which is the same as the \Cpp \lstinline[language=C++]|dynamic_cast|.
     184cast, which is the same as the \Cpp \codeCpp{dynamic_cast}.
    198205trait is_exception(exceptT &, virtualT &) {
    199         virtualT const & get_exception_vtable(exceptT *);
     206        // Numerous imaginary assertions.
    202209The trait is defined over two types, the exception type and the virtual table
    203 type. This should be one-to-one: each exception type has only one virtual
    204 table type and vice versa. The only assertion in the trait is
    205 @get_exception_vtable@, which takes a pointer of the exception type and
    206 returns a reference to the virtual table type instance.
    208 % TODO: This section, and all references to get_exception_vtable, are
    209 % out-of-data. Perhaps wait until the update is finished before rewriting it.
    210 The function @get_exception_vtable@ is actually a constant function.
    211 Regardless of the value passed in (including the null pointer) it should
    212 return a reference to the virtual table instance for that type.
    213 The reason it is a function instead of a constant is that it make type
    214 annotations easier to write as you can use the exception type instead of the
    215 virtual table type; which usually has a mangled name.
    216 % Also \CFA's trait system handles functions better than constants and doing
    217 % it this way reduce the amount of boiler plate we need.
     210type. Each exception type should have but a single virtual table type.
     211Now there are no actual assertions in this trait because the trait system
     212actually can't express them (adding such assertions would be part of
     213completing the virtual system). The imaginary assertions would probably come
     214from a trait defined by the virtual system, and state that the exception type
     215is a virtual type, is a decendent of @exception_t@ (the base exception type)
     216and note its virtual table type.
    219218% I did have a note about how it is the programmer's responsibility to make
    235234Both traits ensure a pair of types are an exception type and its virtual table
    236235and defines one of the two default handlers. The default handlers are used
    237 as fallbacks and are discussed in detail in \VRef{s:ExceptionHandling}.
     236as fallbacks and are discussed in detail in \vref{s:ExceptionHandling}.
    239238However, all three of these traits can be tricky to use directly.
    351350for particular exception type.
    352351The global default termination handler performs a cancellation
    353 \see{\VRef{s:Cancellation}} on the current stack with the copied exception.
     352(see \vref{s:Cancellation}) on the current stack with the copied exception.
    427426\subsubsection{Resumption Marking}
    428428A key difference between resumption and termination is that resumption does
    429429not unwind the stack. A side effect that is that when a handler is matched
    472472The symmetry between resumption termination is why this pattern was picked.
    473473Other patterns, such as marking just the handlers that caught, also work but
    474 lack the symmetry means there are less rules to remember.
     474lack the symmetry means there are more rules to remember.
    476476\section{Conditional Catch}
    558558If there are further handlers after this handler only the first version will
    559 check them. If multiple handlers on a single try block could handle the same
    560 exception the translations get more complex but they are equivilantly
     559check them. If multiple handlers on a single try block that could handle the
     560same exception the translations get more complex but they are equivilantly
    633633and the current stack is
    634634unwound. After that it depends one which stack is being cancelled.
    635 \begin{description}
    636 \item[Main Stack:]
     636\paragraph{Main Stack}
    637637The main stack is the one used by the program main at the start of execution,
    638638and is the only stack in a sequential program.
    645645to, so it would have be explicitly managed.
    647 \item[Thread Stack:]
     647\paragraph{Thread Stack}
    648648A thread stack is created for a \CFA @thread@ object or object that satisfies
    649649the @is_thread@ trait.
    671671Also you can always add an explicit join if that is the desired behaviour.
    673 \item[Coroutine Stack:]
     673\paragraph{Coroutine Stack}
    674674A coroutine stack is created for a @coroutine@ object or object that
    675675satisfies the @is_coroutine@ trait.
    685685(in terms of coroutine state) called resume on this coroutine, so the message
    686686is passed to the latter.
    687 \end{description}
  • doc/theses/andrew_beach_MMath/future.tex

    r3ec79f7 r2d8a770  
    110110\section{Zero-Cost Try}
    111111\CFA does not have zero-cost try-statements because the compiler generates C
    112 code rather than assembler code \see{\VPageref{p:zero-cost}}. When the compiler
     112code rather than assembler code (see \vpageref{p:zero-cost}). When the compiler
    113113does create its own assembly (or LLVM byte-code), then zero-cost try-statements
    114114are possible. The downside of zero-cost try-statements is the LSDA complexity,
  • doc/theses/andrew_beach_MMath/implement.tex

    r3ec79f7 r2d8a770  
    99% Virtual table rules. Virtual tables, the pointer to them and the cast.
    1010While the \CFA virtual system currently has only one public feature, virtual
    11 cast \see{\VPageref{p:VirtualCast}}, substantial structure is required to
    12 support it, and provide features for exception handling and the standard
    13 library.
     11cast (see the virtual cast feature \vpageref{p:VirtualCast}),
     12substantial structure is required to support it,
     13and provide features for exception handling and the standard library.
    1515\subsection{Virtual Type}
    215215\subsection{libunwind Usage}
    216216Libunwind, accessed through @unwind.h@ on most platforms, is a C library that
    217 provides \CC-style stack-unwinding. Its operation is divided into two phases:
     217provides \Cpp-style stack-unwinding. Its operation is divided into two phases:
    218218search and cleanup. The dynamic target search -- phase 1 -- is used to scan the
    219219stack and decide where unwinding should stop (but no unwinding occurs). The
    291291@_UA_FORCE_UNWIND@ specifies a forced unwind call. Forced unwind only performs
    292292the cleanup phase and uses a different means to decide when to stop
    293 \see{\VRef{s:ForcedUnwind}}.
     293(see \vref{s:ForcedUnwind}).
    401401Termination exceptions use libunwind heavily because it matches the intended
    402 use from \CC exceptions closely. The main complication for \CFA is that the
     402use from \Cpp exceptions closely. The main complication for \CFA is that the
    403403compiler generates C code, making it very difficult to generate the assembly to
    404404form the LSDA for try blocks or destructors.
    510510% Recursive Resumption Stuff:
    511 Search skipping \see{\VPageref{p:searchskip}}, which ignores parts of the stack
     511Search skipping (see \vpageref{s:ResumptionMarking}), which ignores parts of
     512the stack
    512513already examined, is accomplished by updating the front of the list as the
    513514search continues. Before the handler at a node is called the head of the list
    554555Cancellation also uses libunwind to do its stack traversal and unwinding,
    555556however it uses a different primary function @_Unwind_ForcedUnwind@. Details
    556 of its interface can be found in the \VRef{s:ForcedUnwind}.
     557of its interface can be found in the \vref{s:ForcedUnwind}.
    558559The first step of cancellation is to find the cancelled stack and its type:
  • doc/theses/andrew_beach_MMath/uw-ethesis.tex

    r3ec79f7 r2d8a770  
    6666% Tip: Photographs should be cropped and compressed so as not to be too large.
    68 % To create a PDF output that is optimized for double-sided printing:
    69 % 1) comment-out the \documentclass statement in the preamble below, and
    70 %    un-comment the second \documentclass line.
    71 % 2) change the value assigned below to the boolean variable "PrintVersion"
    72 %    from "false" to "true".
    7468% ======================================================================
    7569%   D O C U M E N T   P R E A M B L E
    89 % Some LaTeX commands I define for my own nomenclature.
    90 % If you have to, it's easier to make changes to nomenclature once here than
    91 % in a million places throughout your thesis!
    92 \newcommand{\package}[1]{\textbf{#1}} % package names in bold text
    93 \newcommand{\cmmd}[1]{\textbackslash\texttt{#1}} % command name in tt font
    94 \newcommand{\href}[1]{#1} % does nothing, but defines the command so the
    95 % print-optimized version will ignore \href tags (redefined by hyperref pkg).
    96 % Anything defined here may be redefined by packages added below...
     83% Does nothing, ignores \href tags (redefined by hyperref package).
    9886% For a nomenclature (optional; available from
    10795% Adds todos (Must be included after comment.)
     97% cfa macros used in the document
    110100% Hyperlinks make it very easy to navigate an electronic document.
    210 % cfa macros used in the document
    211 %\usepackage{cfalab}
    212 % I'm going to bring back eventually.
    213 \makeatletter
    214 % Combines all \CC* commands:
    215 \newrobustcmd*\Cpp[1][\xspace]{\cfalab@Cpp#1}
    216 \newcommand\cfalab@Cpp{C\kern-.1em\hbox{+\kern-.25em+}}
    217 % Optional arguments do not work with pdf string. (Some fix-up required.)
    218 \pdfstringdefDisableCommands{\def\Cpp{C++}}
    220 % Wrappers for inline code snippits.
    221 \newrobustcmd*\codeCFA[1]{\lstinline[language=CFA]{#1}}
    222 \newrobustcmd*\codeC[1]{\lstinline[language=C]{#1}}
    223 \newrobustcmd*\codeCpp[1]{\lstinline[language=C++]{#1}}
    224 \newrobustcmd*\codePy[1]{\lstinline[language=Python]{#1}}
    226 % Colour text, formatted in LaTeX style instead of TeX style.
    227 \newcommand*\colour[2]{{\color{#1}#2}}
    228 \makeatother
    230 \input{common}
    231 % CFA code-style for all languages
    232 \CFAStyle
    233 % CFA default lnaguage
    234 \lstset{language=CFA,basicstyle=\linespread{0.9}\tt}
     200% listings package configuation:
    235204% Annotations from Peter:
    236205\newcommand{\PAB}[1]{{\color{blue}PAB: #1}}
Note: See TracChangeset for help on using the changeset viewer.