    <rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:admin="http://webns.net/mvcb/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:content="http://purl.org/rss/1.0/modules/content/">
     <channel>
        <title>ACCU  :: I Like Whitespace</title>
        <link>https://members.accu.org/index.php/articles/2063</link>
        <description>Professionalism in Programming</description>
        <dc:language>en-us</dc:language> 
        <dc:creator>Administrator</dc:creator> 
        <admin:generatorAgent rdf:resource="http://www.xaraya.org" /> 
        <admin:errorReportsTo rdf:resource="mailto:webeditor@accu.org" />
       <sy:updatePeriod>hourly</sy:updatePeriod>
       <sy:updateFrequency>1</sy:updateFrequency>
       <docs>http://backend.userland.com/rss</docs>




<div class="xar-mod-head"><span class="xar-mod-title">Programming Topics + Overload Journal #125 - February 2015</span></div>

<table border="0" cellpadding="1" cellspacing="0">
    <tbody>
    <tr>
        <td valign="top">
            Browse in :
       </td>
       <td valign="top">

                                            <a href="https://members.accu.org/index.php/articles/">All</a>

                     &gt;                         <a href="https://members.accu.org/index.php/articles/c13/">Topics</a>

                     &gt;                         <a href="https://members.accu.org/index.php/articles/c65/">Programming</a>
<br />

                                            <a href="https://members.accu.org/index.php/articles/">All</a>

                     &gt;                         <a href="https://members.accu.org/index.php/articles/c76/">Journals</a>

                     &gt;                         <a href="https://members.accu.org/index.php/articles/c78/">Overload</a>

                     &gt;                         <a href="https://members.accu.org/index.php/articles/c346/">o125</a>
<br />

                                            <a href="https://members.accu.org/index.php/articles/c65-346/">Any of these categories</a>

                    -                        <a href="https://members.accu.org/index.php/articles/c65+346/">All of these categories</a>
<br />
</td>
   </tr>
   </tbody>
</table>




<div class="xar-error">
   <p>
 <strong>Note:</strong> when you create a new publication type,
the articles module will automatically use the templates
<em>user-display-[publicationtype].xt</em>
and <em>user-summary-[publicationtype].xt</em>.
If those templates do not exist when you try to preview or display a new article,
you'll get this warning :-)  Please place your own templates in themes/<em>yourtheme</em>/modules/articles . The templates will get the extension .xt there. </p>
</div>
<div class="xar-norm xar-standard-box-padding">
   <h1><strong>Title:</strong>&nbsp;I Like Whitespace</h1>
<p><strong>Author:</strong>&nbsp;Martin Moene</p>
<p>
<strong>Date:</strong> 04 February 2015 17:09:46 +00:00 or Wed, 04 February 2015 17:09:46 +00:00</p>
<p><strong>Summary:</strong>&nbsp;Programming style can cause endless arguments. Bob Schmidt shares why he thinks whitespace matters.</p>
<p><strong>Body:</strong>&nbsp;<p class="EditorIntro">This article contains sarcasm and (possibly failed) attempts at humor. My sarcasm font is broken, so youâ€™re just going to have to recognize those sections without any help from me.</p>

<p>I know that nothing attracts more heat than light than discussions about programming style. Where do the braces go; how many spaces to indent; in C++ where should the <code>const</code> keyword be placed. We all have opinions on all of these subjects, and more. Most aspects of programming style are matters of taste, and taste is subjective. My style is, of course, the only correct one.</p>

<p>I use a lot of whitespace when writing code. From reviewing and maintaining a lot of code written by others I know that this is not a common practice. I think it is an issue of weak thumbs and pinky fingers. Later Iâ€™ll suggest exercises for strengthening these digits so that inserting additional whitespace (in the form of spaces, carriage returns and (temporary) tabs) will become easier.</p>

<h2>Motivation</h2>

<p>Back in the mid-1980s I had the misfortune of working on a system that used RATFOR, a language created by Brian Kernighan that is a pre-compiler for FORTRAN 66 [<a href="#[Kernighan76]">Kernighan76</a>]. RATFOR provides modern programming structure syntax to FORTRAN 66, ostensibly making it easier to write good code than straight FORTRAN.</p>

<p>A code beautifier was part of the RATFOR software tool set. Running a source file through the beautifier generated a hard-copy listing of the source, with indentations based on the source syntax. It was an OK tool for the time, although it didnâ€™t always represent the true structure of the code correctly.</p>

<p>Unfortunately, the presence of the beautifier gave some of the original programmers on the project â€˜permissionâ€™ to not structure their source code. Open a source file on a programmerâ€™s terminal, and every line started in the far left-hand column. (See Listing 1.)</p>

<table class="sidebartable">
	<tr>
		<td>
			<pre class="programlisting">
IF(A&lt;B) THEN
[
IF(B&lt;C) THEN
[
CALL X(A)
]
ELSE
[
CALL Y(B)
]
ENDIF
]
ELSE
[
CALL Z(C)
]
ENDIF
			</pre>
		</td>
	</tr>
	<tr>
		<td class="title">Listing 1</td>
	</tr>
</table>

<p>This was perhaps the ugliest code I have ever had the misfortune to work on. I would completely format the entire source file prior to trying to fix or enhance the code. (I have not yet recovered from the trauma, in spite of all the software conference â€˜therapyâ€™ Iâ€™ve attended in the intervening years.)</p>

<p>It was working on this ugly RATFOR code that first got me really thinking about coding style. When I first started programming, back in the dark ages of 1981, any resemblance my code had to a style was strictly an accident. I like to think my coding style has evolved a lot since then. Today I prefer a style that showcases the code and its structure, so I don't have to go looking for it.</p>

<h2>Spaces</h2>

<p>Iwouldnâ€™treadalineoftextinanarticleifitwaswrittenlikethis. So why should I have to read a line of code formatted like this:</p>

<pre class="programlisting">
   for(int i=0;i&lt;someMaxValue;++i)</pre>
   
<p>I believe it is so much easier to read if it is written more like this:</p>

<pre class="programlisting">
  for ( int i = 0;   i &lt; some_max_value;   ++ i )</pre>

<p>Note the extra spaces: on either side of the opening parenthesis; on both sides of the assignment and less than operators; and multiple spaces after the semicolons. The multiple spaces after the semicolons make each of the sections of the for statement stand out.</p>

<p>For more complex cases, separate the three sections of a <code>for</code> statement to separate lines (see Listing 2).</p>

<table class="sidebartable">
	<tr>
		<td>
			<pre class="programlisting">
for ( int i = 0, j = 0;
      i &lt; some_max_value   &amp;&amp;   j &lt; some_other_max_value;
      ++ i, ++ j )
			</pre>
		</td>
	</tr>
	<tr>
		<td class="title">Listing 2</td>
	</tr>
</table>

<p>Long iterator type names can lead to long <code>for</code> statements; the multi-line version of the <code>for</code> statement is particularly useful there. (Note that the new <code>auto</code> keyword should help alleviate some of those problems.)</p>

<p>I see a lot of code where an array index is itself an index into an array â€“ sometimes to a third level. (See first line in Listing 3.)</p>

<table class="sidebartable">
	<tr>
		<td>
			<pre class="programlisting">
array1[array2[array3[index3].index2].index1]

x = array1[ array2[ array3[ index3 ].index2 ].index1 ]
			</pre>
		</td>
	</tr>
	<tr>
		<td class="title">Listing 3</td>
	</tr>
</table>

<p>I find this difficult to parse mentally. When writing array subscripts, I put a space after the opening bracket and one before the closing bracket (see second line in Listing 3).</p>

<p>Admittedly, it is clearer to pull the nested indices out into their own variables, but I still like to put spaces around the index:</p>

<pre class="programlisting">
  index2 = array3[ index3 ].index2;
  index1 = array2[ index2 ].index1;
  x      = array1[ index1 ];</pre>
  
<p>For complex Boolean expressions I tend to use extra spaces to separate sub-expressions:</p>

<pre class="programlisting">
  if ( ( x &lt; 0 ) || ( y &gt; 0 ) )</pre>
  
<p>At times Iâ€™ll use extra spaces instead of parenthesis:</p>

<pre class="programlisting">
  if ( x &lt; 0   ||   y &gt; 0 )</pre>

<p>I find either of the previous versions easier to parse than either of these options:</p>

<pre class="programlisting">
  if((x&lt;0)||(y&gt;0))</pre>
  
<p>or</p>

<pre class="programlisting">
  if(x&lt;0||y&gt;0)</pre>
  
<p>If you continue reading you will notice that I also put a space after a function name and before the opening parenthesis of the parameter list. This is a holdover from my FORTRAN days (which werenâ€™t that long ago) when I used that space to differentiate between a function name (with the space) and an array name (without the space).</p>

<pre class="programlisting">
  X = SINE ( ANGLE )
  Y = ARRAY( ELEMENT )</pre>

<h2>Blank lines</h2>

<p>Like spaces, I use blank lines liberally in my code. I use a blank line to separate variable declarations from other statements in a function, particularly in C where the declarations typically occur at the beginning of a function, or the beginning of a block. I also use a blank line to visually separate different steps in the code, such as the setup of a function call and the call itself.</p>

<pre class="programlisting">
  message.header = TYPE;
  message.body   = contents;
 
  status = send_message ( &amp;message );</pre>
  
<p>A line with nothing but a curly brace is a blank line for this purpose.</p>

<pre class="programlisting">
  if ( something )
  {
      do_something_else ();
  }</pre>
  
<p>Putting the brace on the line after the <code>if</code> statement provides visual separation for the then clause.</p>

<h2>Alignment</h2>

<p>I find it easier to read code when certain aspects of the code are aligned. Consider variable definitions:</p>

<pre class="programlisting">
  int x=0;
  short longer_name=1;
  char short_name[2]={0,0};</pre>
  
<p>I find this style easier to follow:</p>

<pre class="programlisting">
  int   x               = 0;
  short longer_name     = 1;
  char  short_name[ 2 ] = { 0, 0 };</pre>

<p>Aligning types, names, equal signs, and initial values makes each section of a definition stand out. The example here is trivial, but recently Iâ€™ve been working on some legacy C code with functions that have 20 or more definitions at the beginning of each function. My eyes started to water when I had to find a particular entry in the list. (Itâ€™s fixed, now.)</p>

<p>When making multiple assignments, I like to align the equals sign (see Listing 4).</p>

<table class="sidebartable">
	<tr>
		<td>
			<pre class="programlisting">
structure.element_the_first = 1;
structure.second_element    = 2;
structure.third_element     = function_that_returns_the_needed_value ();
			</pre>
		</td>
	</tr>
	<tr>
		<td class="title">Listing 4</td>
	</tr>
</table>

<p>Complex Boolean expressions are a place where spacing and alignment can come into play at the same time.</p>

<p>Who can look at this mess and easily tell whatâ€™s going on? </p>

<pre class="programlisting">
  if(((x==0)&amp;&amp;(x==1))||((y==3)&amp;&amp;((z==5)||(z==6))))</pre>

<p>Using a combination of spacing and alignment makes it a little easier to parse mentally:</p>

<pre class="programlisting">
  if ( ( ( x == 0 ) &amp;&amp; ( x == 1 )      ) ||
       ( ( y == 3                 ) &amp;&amp;
         ( ( z == 5 ) || z == 6 ) )    )    )</pre>

<h2>Camel case</h2>

<p>I donâ€™t like writing or reading names in camel case. iWouldnâ€™tReadTextIfItWasWrittenLikeThis, so why should I have to read variable and function names written this way? We canâ€™t embed spaces in names (unless youâ€™re still writing in FORTRAN, which deletes whitespace prior to parsing), so the best we can do is use the underscore. <code>some_max_value </code>is easier to read than <code>SomeMaxValue</code>, and the longer and more descriptive the name the easier it is.</p>

<h2>Braces and indentation</h2>

<p>I used to think that three-space indentation was just about perfect. One or two spaces arenâ€™t enough visually, and four or more pushed code way too far to the right, particularly on old 80-character wide TTY terminals.</p>

<pre class="programlisting">
  if ( x == 0 )
     {
     process_x_when_0 ();
     }
  else
     {
     process_x_when_not_0 ();
     }</pre>

<p>Note that using three space indentation, and indenting the braces, causes the <code>if</code> and <code>else</code> blocks to line up under the opening parenthesis of the <code>if</code> statement (assuming you put a space between the <code>if</code> and the opening parenthesis). I found this visually appealing, and I wrote a lot of code that way.</p>

<p>Iâ€™ve since adopted a four space indentation, with the braces lined up with the <code>if</code> and <code>else</code> keywords, for one major reason â€“ it is the common indentation used by my major customer (they have no standards), and it is easier in this case to adapt than be the odd man out. Plus, taking the advice of Bob Martin, I donâ€™t write functions with large, heavily indented <code>if</code>-<code>then</code>-<code>else</code> trees anymore [<a href="#[Martin09]">Martin09</a>]. (But note that Bob is against the aligning rules I use, so heâ€™s not right about <em>everything</em>.)</p>

<pre class="programlisting">
  if ( x == 0 )
  {
      process_x_when_0 ();
  }
  else
  {
      process_x_when_not_0 ();
  }</pre>

<p>I really donâ€™t like this style:</p>

<pre class="programlisting">
  if ( x == 0 ) {
      process_x_when_0 ();
  }
  else {
      process_x_when_not_0 ();
  }</pre>
  
<p>I like putting my opening and closing braces on separate lines, for two reasons: they are always easy to find, and the line with nothing on it but the brace provides a line of whitespace around the statements that make up the <code>then</code> and <code>else</code> clauses.</p>

<p>MISRA standards [<a href="#[MISRA13]">MISRA13</a>] require that braces be used around <code>if</code> and <code>else</code> clauses even if there is only one statement in the clause (as in each of the three previous examples). I try not to write code that looks like this:</p>

<pre class="programlisting">
  if ( x == 0 )
      process_x_when_0 ();
  else
      process_x_when_not_0 ();</pre>
	  
<p>The standard is meant to eliminate problems introduced in maintenance:</p>

<pre class="programlisting">
  if ( x == 0 )
      process_x_when_0 ();
  else
      process_x_when_not_0 ();
      process_something_else ();  // ALWAYS EXECUTED</pre>

<p>Or with nested <code>if</code> statements (I have seen an error of this type just recently):</p>

<pre class="programlisting">
  if ( x == 0 )
      if ( y == 0 )
          process_x_and_y_are_0 ();
  else
      process_x_is_not_0 ();</pre>
	  
<p>This only works the way you want it to with properly applied braces:</p>

<pre class="programlisting">
  if ( x == 0 )
  {
      if ( y == 0 )
      {
          process_x_and_y_are_0 ();
      }
  }
  else
  {
      process_x_is_not_0 ();
  }</pre>
  
<p>I admit that I do, sometimes, omit the braces, based on the context of the code. Iâ€™m working on forcing myself to always include them.</p>

<p><em>Editor's note: The two listings of above example have been corrected with respect to the article in the printed magazine.</em></p>

<h2>Tabs</h2>

<p>If you donâ€™t want to over-work your thumbs hitting the space bar, by all means use the tab key, but please, set your editor to replace tabs with spaces. Two things frustrate me when it comes to the tab character remaining in code. I have to figure out what tab setting was used to begin with (seconds of my life I will never get back), and if Iâ€™m editing a line and delete a tab I now have to re-add spaces I may not have wanted to delete.</p>

<h2>const</h2>

<p>Where, exactly, should <code>const</code> be placed in a definition or declaration?</p>

<p>The most common placement of <code>const</code> is (was?) as in Listing 5.</p>

<table class="sidebartable">
	<tr>
		<td>
			<pre class="programlisting">
const int        i;    // i is a const int
      int* const p1;   // p1 is a const ptr to int
const int*       p2;   // p2 is a ptr to a const int
const int* const p3;   // p3 is a const ptr to a const int
			</pre>
		</td>
	</tr>
	<tr>
		<td class="title">Listing 5</td>
	</tr>
</table>

<p>Dan Saks is an advocate of placing <code>const</code> in a way that makes it easy to read the declaration, when read from right to left [<a href="#[Saks88]">Saks88</a>] (see Listing 6).</p>

<table class="sidebartable">
	<tr>
		<td>
			<pre class="programlisting">
int  const        i;   // i is a const int
int* const        p1;  // p1 is a const ptr to int
int  const*       p2;  // p2 is a ptr to a const int
int  const* const p3;  // p3 is a const ptr to a const int
			</pre>
		</td>
	</tr>
	<tr>
		<td class="title">Listing 6</td>
	</tr>
</table>

<p>In a conversation with Dan, I mentioned that I was using the other style, because in general I didnâ€™t find it difficult to parse mentally. Dan explained to me that I wasnâ€™t the person I should be writing it for, and Iâ€™ve used his style ever since. (I can be persuaded.)</p>

<p>So what does this have to do with whitespace? As you can see, in either style I like to line up the <code>const</code> keywords in a block of declarations. I think itâ€™s an important part of a declaration, and the alignment makes the <code>const</code> (or lack of it) pop out. (And line up the comments, too; it makes them easier to read.) I treat the <code>volatile</code> keyword the same way.</p>

<h2>Function parameters</h2>

<p>I write function prototypes like this:</p>

<pre class="programlisting">
  int function_name ( int        first_parameter,
                      double     second_paramter,
                      CLASS_NAME third_parameter );</pre>
					  
<p>When calling a function I will format it in a similar way. Having each parameter on a separate line makes them easy to distinquish from one another, and it is easy to add a comment to a parameter (which I find particularly useful when calling one of Microsoftâ€™s multi-parameter SDK functions):</p>

<pre class="programlisting">
  int result = function_name ( first_parameter,
                               second_parameter,
                               class_parameter );</pre>
							   
<p>There are some exceptions. For functions with only two parameters, I tend to put them on the same line as the function name; two parameters are not hard to pick out on one line (Listing 7).</p>

<table class="sidebartable">
	<tr>
		<td>
			<pre class="programlisting">
int result = function_name ( first_parameter, second_parameter );
			</pre>
		</td>
	</tr>
	<tr>
		<td class="title">Listing 7</td>
	</tr>
</table>

<p>I do the same thing for standard library and STL functions and member functions, regardless of the number of parameters, because the parameter lists for these functions tend to be well known.</p>

<p>In his presentation â€˜Seven Ineffective Coding Habits of Many Programmersâ€™, Kevlin Henney [<a href="#[Henney14]">Henney14</a>] talks about â€œ<em>unsustainable spacing</em>â€ (approximately minute 24), and rejects the idea of certain styles of aligning code as being unmaintainable. He makes the point that maintaining certain styles (mine being one) is â€œ<em>doomed to failure</em>â€ unless the code never changes. He uses as an example changing the name of a function.</p>

<p>Changing the name of the function breaks the alignment (see Listing 8).</p>

<table class="sidebartable">
	<tr>
		<td>
			<pre class="programlisting">
int  not_aligned_like_this ( int     first_parameter,
                             String  second_parameter )

int  new_function_name ( int   first_parameter,
                              short second_parameter )
			</pre>
		</td>
	</tr>
	<tr>
		<td class="title">Listing 8</td>
	</tr>
</table>

<p>Kevlin suggests the style in Listing 9, or something similar, because performing a refactoring such as changing the name doesnâ€™t break the alignment.</p>

<table class="sidebartable">
	<tr>
		<td>
			<pre class="programlisting">
int  original_function_name (
    int   first_parameter,
    short second_parameter )

int  new_function_name ( 
    int   first_parameter,
    short second_parameter )
			</pre>
		</td>
	</tr>
	<tr>
		<td class="title">Listing 9</td>
	</tr>
</table>

<p>I see Kevlinâ€™s point, but Iâ€™m not â€¦ wait, hold the presses.</p>

<p>I have had a rough time with this section on function parameter placement. As I said in my opening note, this is nothing but an opinion piece, and my goal was to document the way I do things, give an explanation as to why I do it that way, and leave it up to you, dear reader, to ignore what I have to say and do it the way you want. Thatâ€™s fine; I donâ€™t really expect to sway many opinions. (Maybe one person? Anybody? &lt;crickets&gt;)</p>

<p>The problem occurred when I tried to pick a rhetorical fight with Kevlin with regard to placement and alignment of function parameters. I really donâ€™t like the style Kevlin advocates in his presentation. There is something about starting the parameter list on the line after the function call I find aesthetically unpleasing. I tried five or six times to justify using my style, and not his, but I kept running into this wall.</p>

<p class="blockquote">With all due respect to Kevlin, just how often is a function name changed over a large code base? I donâ€™t work on any code base that easily allows that type of change. Changing a widely used function name isnâ€™t something to be taken lightly, and if you do it you should be prepared to do it correctly. (OK, Bob, but what are you going to do when you start working on a code base that <em>does</em> allow those types of changes, and actively encourages them?)</p>

<p class="blockquote">I see Kevlinâ€™s point, but using the shortcomings of our current tool set to advocate use of such an ugly style is wrong. (Compromise isnâ€™t a dirty word, Bob.)</p>

<p>And on it went.</p>

<p>In his presentation Kevlin asks a rhetorical question, â€œ<em>Why do you choose an approach that is difficult to maintain?</em>â€ I do it because I feel it is the right thing to do. I truly believe if weâ€™re not actively improving our code we are passively making it worse. I consider it part of doing a good job, and nobody said it would be easy.</p>

<p>Then Kevlin followed up with â€œ<em>Do your colleagues also do what you do?</em>â€ Sadly, the answer is no. And that is where I kept getting tripped up in my counter-argument.</p>

<p>So, after all of the false starts I realized that I do see Kevlinâ€™s point, and most of my justifications boiled down to â€œthis is the way I have always done it, I like it that way, and I donâ€™t want to changeâ€. Not exactly the end to the rhetorical fight I envisioned when I started this section.</p>

<p>Now the question is, will I actually change the way I write function prototypes and calls? The answer is, I donâ€™t know. I will try to come up with a style that satisfies my need for readability and consistency, and Kevlinâ€™s need for sustainability. It's the aesthetic issue that is going to be the problem. (Cue cognitive disconnect in five, four, threeâ€¦)</p>

<h2>Conclusion</h2>

<p>Most of us, if not all of us, spend a lot more time reading code than writing it. My chosen style isnâ€™t more efficient on the writing end; on the contrary, I would say that it takes a bit more time. It is not easier to write code in this style â€“ I would say that it requires a bit more discipline. I believe the payoff occurs when the code is read, by myself or by others.</p>

<p>Thirty years ago, when hard drives were expensive, programmers were cheap, and programmerâ€™s terminals had 23 lines and 80 columns, it might have made sense to use the fewest number of characters possible to implement code. Here we are in 2015, where terabyte drives are almost trivially cheap, programmers are expensive, and we are no longer using TTYs. Making use of whitespace to make code easier to read for ourselves and our colleagues makes sense â€“ to me, at least.</p>

<h2>Acknowledgements</h2>

<p>As always, my thanks to Fran and the reviewers. You read this and published it anyway. And a special thank you to Kevlin Henney, who didnâ€™t volunteer for the rhetorical fight, but easily won it, anyway.</p>

<h2>References</h2>

<p class="bibliomixed"><a id="[Henney14]"></a>[Henney14] â€˜Seven Ineffective Coding Habits of Many Programmersâ€™, Henney, Kevlin, NDC 2014 <a href="http://vimeo.com/97329157">http://vimeo.com/97329157</a></p>

<p class="bibliomixed"><a id="[Kernighan76]"></a>[Kernighan76]  <em>Software Tools, </em>Kernighan, Brian and Plauger, P.J., Addison-Wesley Professional, 1976</p>

<p class="bibliomixed"><a id="[Martin09]"></a>[Martin09]  <em>Clean Code, </em>Martin, Robert C., Prentice Hall, 2009</p>

<p class="bibliomixed"><a id="[MISRA13]"></a>[MISRA13]  â€˜Guidelines for the use of the C language in critical systemsâ€™, MISRA, <a href="http://www.misra-c.com/">http://www.misra-c.com/</a></p>

<p class="bibliomixed"><a id="[Saks88]"></a>[Saks88]  â€˜Placing const in Declarationsâ€™, Saks, Dan, <em>Embedded Systems Programming</em>, June 1988</p>

<h3>Exercises</h3>

<p class="bibliomixed">â€˜Pinky Finger Workoutâ€™, typingweb, <a href="http://www.nmh.org/ccurl/275/700/thumb-exercises-active.pdf">https://www.typingweb.com/tutor/lesson/index/id/357/</a></p>

<p class="bibliomixed">â€˜Thumb Exercises: Active Motionâ€™, Northwestern Memorial Hospital, <a href="http://www.nmh.org/ccurl/275/700/thumb-exercises-active.pdf">http://www.nmh.org/ccurl/275/700/thumb-exercises-active.pdf</a></p>
</p>
<p><strong>Notes:</strong>&nbsp;</p>
<p><em>More fields may be available via dynamicdata ..</em></p>
</div>
</channel>
</rss>
