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;
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;
<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.