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.