This is a small file ment to test the noweb prettyprinting filter for C and HTML.

Fist some simple noweb stuff.

<*>=
<a chunk>

An empty chunk.

<a chunk>=
<a chunk>

<a chunk>+=
<another chunk><and still another chunk>

Now let's start with some C stuff.

<some variable declarations>=
int an_int,
another_int,
and_still_another_int;
char c,
d;
float a,
b;
float pi;
double a,
b,
c,
e,
f,
g;

<some modified variable declarations>=
short i1;
short int i2;
long i3;
long int i4;
long double doublette;
unsigned int big_one;
signed char odd_one;

<some initialized variables>=
int i=1234;
int a,
b,
i,
g,
l,
o,
n,
g,
r,
o,
w,
o,
f,
in,
t,
e,
g,
e,
r,
s;
long l=123456789L;

Let's try some octal and other esoteric stuff.

<some more initialized variables>=
float f1=123.4,
f2=1 e-2,
f3=1;
int octal_int=0777;

The first line is an unsigned long with value 15.

<some more initialized variables>+=
int hex_int=0x1f;
float pi=3.141,
pi2;
long hex_long=0XFUL;
char initialized_char='c',
another_one='x',
difficult_ones=n,
another_difficult_one=777,
bell=007;

<some constants>=
const float e=2.71828182845905;
const char msg[]="warning: ";i>;

Now for some pointers and arrays.

<some pointers>=
int *ip;
int int_array[];
int int_array[1000];
char *a_string;
char **an_array_of_strings;
char *s="a string!";
int ****hey;
int ****hey_hoh;
int *zero=NULL;

<some big initializers>=
int_array[]int_array[];

Now for some operators.

<some operators>=
x+x;
x-x;
x*x;
x<x;
x%x;
x<y;
x<=y;
x>=y;
x>y;
x==y;
x!=y;
x&y;
x&&y;
x|y;
x||y;
~x;
++x;
x++;
--x;
x--;
x+=2;
x-=2;
x*=2;
x<=2;

<conditional expressions>=
a/i>-x;

<referncing and derefencing>=
p=&i;
c=*a;
cc=a->b;
ccc=a.b;

\section{Control Flow}

<some conditionals>=
if (a==1)s=1;
elses=2;
if (a)  

<happy if's>=
if (a!=0)
  {
    b=1;
    c=2;
  }
  if (n>0)if (a>b)z=a;
      elsez=b;
      
    
  

<some else-if's>=
if (a==b)s1();
  elseif (a!=b)s2();
      elses3();
      
    
  

<switch and alike>=
switch (a)
  {
    case 1:s1;
    break;
    case 2:s2;
    break;
    default:s3;
  }
  

<some loops>=
for(i=0;isspace(s[i]);i++);;) {
  do_forever = 1;
}
while (c < 100) c++;
while (c<1000

<labels and goto>=
for(i=1;i<10;i++)
  {
    if (disaster)goto error;
    
  }
  
error:i=42;

Constructed Types

Types defined by typedef should be handled like normal types and be typeset just like them.

<a few typedefs>=
typedef int Length;
typedef char *String;
Length len;
Length len,
maxlen;

Let's see if if works in another chunk too.

<a few typedefs>+=
String a_string;
Length first=100;

Hard Stuff

<Chop resulting text into lines and send them to application>=
char *entire_pped_code=has_been_pped.str();
(pp->ppcb)(pp->user_data,
STRING,
" ");
(pp->ppcb)(pp->user_data,
LITERAL,
"\\begin{ppcode}");
char *line=strtok(entire_pped_code,
"\n");
do
{
  if (strlen(line)==0)
    {
      (pp->ppcb)(pp->user_data,
      NEWLINE,
      NULL);
      continue;
    }
    if (*line=='@')
      {
        (pp->ppcb)(pp->user_data,
        WHATSIT,
        line);
      }
      else
        {
          (pp->ppcb)(pp->user_data,
          LITERAL,
          line);
          (pp->ppcb)(pp->user_data,
          NEWLINE,
          NULL);
        }
        
      
    
  
}
while ((line=strtok(NULL,
"\n"))!=NULL);
(pp->ppcb)(pp->user_data,
LITERAL,
"\\end{ppcode}");

Finally, it's our responsibility to cleanup the output strstream, because we've called the str() function on it.

<Chop resulting text into lines and send them to application>+=
delete entire_pped_code;/i>.str();
(pp->ppcb)(pp->user_data,
STRING,
" ");
(p

Some more hard stuff (taken from t1.w).

<main>=
mlp=NULL;
/* init match list pointer */
mp=mlp;
hp=rp->right;
/* point |hp| to beginning of round list */
while (hp!=NULL)
  {
    if (hp->type==matches)
      {
        if (mp==NULL)
          {
            /* take this node as hew head */
            mp=new_node();
            check_node(mp);
            mp->type=matches;
            mp->right=hp->right;
            mp->left=NULL;
            /* terminate list */
            mlp=mp;
          }
          else
            {
              /* add this one to the back */
              mp->left=new_node();
              check_node(mp->left);
              mp=mp->left;
              mp->type=matches;
              mp->right=hp->right;
              mp->left=NULL;
              /* terminate list */
            }
            
          
        
      }
      hp=hp->left;
      /* look at next item of the list */
    
  }
  

That's it.