From 5a5907add80a0bd7652bc5b3cf3ca2ca99c286b4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20H=C3=BCbinette=20=28Hubbe=29?= <hubbe@hubbe.net> Date: Tue, 25 Nov 1997 22:35:31 -0800 Subject: [PATCH] a bunch of bugs fixed Rev: tutorial/.cvsignore:1.7 Rev: tutorial/Makefile:1.9 Rev: tutorial/Wmml.pmod:1.11 Rev: tutorial/html.pike:1.8 Rev: tutorial/pike.gif:1.3 Rev: tutorial/tutorial.wmml:1.34 --- tutorial/.cvsignore | 3 + tutorial/.gitignore | 3 + tutorial/Makefile | 42 +----- tutorial/Wmml.pmod | 57 +++++--- tutorial/html.pike | 49 +++++-- tutorial/pike.gif | Bin 27671 -> 4231 bytes tutorial/tutorial.wmml | 307 ++++++++++++++++++++++------------------- 7 files changed, 258 insertions(+), 203 deletions(-) diff --git a/tutorial/.cvsignore b/tutorial/.cvsignore index 018e49b41f..af09125e69 100644 --- a/tutorial/.cvsignore +++ b/tutorial/.cvsignore @@ -11,3 +11,6 @@ tutorial.log tutorial.mif tutorial.tex tutorial_*.html +tut*.html +*.md +*.files diff --git a/tutorial/.gitignore b/tutorial/.gitignore index 04c9ff9342..dd9f1caedb 100644 --- a/tutorial/.gitignore +++ b/tutorial/.gitignore @@ -11,3 +11,6 @@ /tutorial.mif /tutorial.tex /tutorial_*.html +/tut*.html +/*.md +/*.files diff --git a/tutorial/Makefile b/tutorial/Makefile index 2e694d7efc..10ff9a6c00 100644 --- a/tutorial/Makefile +++ b/tutorial/Makefile @@ -2,10 +2,12 @@ all: tutorial.html tutorial_onepage.html # lenna.gif lenna-mirrorx.gif lenna-mirrory.gif lenna-rotate.gif lenna-skewx.gif lenna-skewy.gif -tutorial.html: tutorial.wmml +.DUMMY: + +tutorial.html: .DUMMY ./wmmltohtml2 <tutorial.wmml html tutorial -tutorial_onepage.html: tutorial.wmml +tutorial_onepage.html: .DUMMY ./wmmltohtml2 <tutorial.wmml html_onepage tutorial_onepage Image.wmml : @@ -18,39 +20,7 @@ clean: rm *.html illustration_cache illustration*.gif export: - (cd .. ; tar czvf tutorial.tar.gz \ - tutorial/tutorial*.html \ - tutorial/left.gif tutorial/right.gif tutorial/up.gif \ - tutorial/multipart.gif \ - tutorial/illustration*.gif - -# tutorial.html: tutorial.wmml wmml_to_html -# ./wmml_to_html <tutorial.wmml >tutorial.html - -BG_R=A0 -BG_G=E0 -BG_B=C0 - -PIKE_BG=0x$(BG_R),0x$(BG_G),0x$(BG_B) -P=pike -e 'write(Image.image()->fromppm(Process.popen("rasttopnm lenna.rs")) -Q=->scale(1.0/3)->change_color($(PIKE_BG),255,0,255)->toppm())'|ppmquant 256|ppmtogif -T=-trans rgb:ff/00/ff - -lenna.gif: lenna.rs Makefile - $P $Q >lenna.gif - -lenna-mirrorx.gif: lenna.rs Makefile - $P ->mirrorx() $Q >lenna-mirrorx.gif - -lenna-mirrory.gif: lenna.rs Makefile - $P ->mirrory() $Q >lenna-mirrory.gif - -lenna-rotate.gif: lenna.rs Makefile - $P ->rotate(45, $(PIKE_BG) )->autocrop() $Q $T >lenna-rotate.gif - -lenna-skewx.gif: lenna.rs Makefile - $P ->skewx(0.3, $(PIKE_BG) ) $Q $T >lenna-skewx.gif + tar czvTf tutorial.files tutorial.tar.gz + tar czvTf tutorial_onepage.files tutorial_onepage.tar.gz -lenna-skewy.gif: lenna.rs Makefile - $P ->skewy(0.3, $(PIKE_BG) ) $Q $T >lenna-skewy.gif diff --git a/tutorial/Wmml.pmod b/tutorial/Wmml.pmod index 9c5e85fd51..dc3d508015 100644 --- a/tutorial/Wmml.pmod +++ b/tutorial/Wmml.pmod @@ -73,6 +73,7 @@ static private int verify_any(SGML data, string in) case "ex_keyword": case "ex_string": case "ex_comment": + case "ex_meta": case "example": if(!x->data) { @@ -85,6 +86,7 @@ static private int verify_any(SGML data, string in) case "ex_indent": case "ex_br": + case "include": case "dt": case "dd": case "li": @@ -210,24 +212,26 @@ INDEX group_index_by_character(INDEX i) return m; } -multiset reserved_pike = -(< +string * reserved_pike = +({ "array","break","case","catch","continue","default","do","else","float", "for","foreach","function","gauge","if","inherit","inline","int","lambda", "mapping","mixed","multiset","nomask","object","predef","private","program", "protected","public","return","sscanf","static","string","switch","typeof", "varargs","void","while" ->); +}); -multiset reserved_c = -(< +string *reserved_c = +({ "break","case","continue","default","do","else","float","double", "for","if","int","char","short","unsigned","long", "public","return","static","switch", "void","while" ->); +}); -object(Tag) parse_pike_code(string x, int pos, multiset(string) reserved) +object(Tag) parse_pike_code(string x, + int pos, + mapping(string:string) reserved_type) { int p,e; int tabindented=-1; @@ -260,10 +264,7 @@ object(Tag) parse_pike_code(string x, int pos, multiset(string) reserved) } string id=x[p..--e]; - if(reserved[id]) - ret+=({ Tag("ex_keyword",([]), pos+e, ({ id }) ) }); - else - ret+=({ Tag("ex_identifier",([]), pos+e, ({ id }) ) }); + ret+=({ Tag(reserved_type[id]||"ex_identifier",([]), pos+e, ({ id }) ) }); break; } @@ -497,15 +498,16 @@ SGML fix_class(TAG t, string name) t->data=low_make_concrete_wmml(t->data), t->file); - classbase->pop(); - - return ({ + SGML ret= + ({ Tag("anchor", (["name":classbase->query(),"type":t->tag]), t->pos, ({t}), t->file) }); + classbase->pop(); + return ret; } SGML low_make_concrete_wmml(SGML data) @@ -687,20 +689,33 @@ SGML low_make_concrete_wmml(SGML data) })); continue; } - + case "example": + mapping reswords=([]); + + if(tag->params->meta) + foreach(tag->params->meta/",",string t) + reswords[t]="ex_meta"; + + switch(tag->params->language) { case "pike": + foreach(reserved_pike,string keyword) + reswords[keyword]="ex_keyword"; + ret+=({parse_pike_code(tag->data[0], tag->pos, - reserved_pike)}); + reswords)}); continue; case "c": + foreach(reserved_c,string keyword) + reswords[keyword]="ex_keyword"; + ret+=({parse_pike_code(tag->data[0], tag->pos, - reserved_c)}); + reswords)}); continue; } } @@ -736,9 +751,10 @@ int gifnum; mapping gifcache=([]); mapping srccache=([]); -string mkgif(object o) +string mkgif(mixed o) { - string g=o->togif(); + string g=stringp(o)?o:o->togif(); + int key=hash(g); foreach(gifcache[key]||({}),string file) @@ -781,7 +797,7 @@ object render_illustration(string pike_code, mapping params, float dpi) img->fromppm(Process.popen("anytopnm 2>/dev/null "+src))); if(scale!=1.0) img=img->scale(scale); return compile_string("import Image;\n" - "object `()(object src){ "+pike_code+" ; }")()(img); + "mixed `()(object src){ "+pike_code+" ; }")()(img); } private static string mkkey(mapping params, mixed ... other) @@ -789,6 +805,7 @@ private static string mkkey(mapping params, mixed ... other) params+=([]); m_delete(params,"align"); m_delete(params,"alt"); + m_delete(params,"__from__"); if(params->src) if(mixed x=file_stat(params->src)) params->mtime=(string)(x[3]); diff --git a/tutorial/html.pike b/tutorial/html.pike index 7a17f736c4..2dde82b330 100644 --- a/tutorial/html.pike +++ b/tutorial/html.pike @@ -7,6 +7,18 @@ mapping(string:SGML) sections=([]); mapping(string:string) link_to_page=([]); mapping(string:TAG) link_to_data=([]); string basename; +object files; + +multiset exported=(<>); + +void add_file_to_export_list(string f) +{ + if(!exported[f]) + { + exported[f]=1; + files->write(f+"\n"); + } +} string mkfilename(string section) { @@ -14,6 +26,13 @@ string mkfilename(string section) return basename+"_"+section+".html"; } +string mklinkname(string section) +{ + string s=mkfilename(section); + int q=sizeof(basename/"/"); + return (s/"/")[q-1..]*"/"; +} + TAG mkimgtag(string file, mapping params) { @@ -21,6 +40,7 @@ TAG mkimgtag(string file, mapping params) p->src=file; if(params->align) p->align=params->align; if(params->alt) p->align=params->alt; + add_file_to_export_list(file); return Sgml.Tag("img",p,0); } @@ -305,7 +325,7 @@ SGML convert(SGML data) { werror("Warning: Cannot find link "+to+" (near "+data->location()+")\n"); } - data->params->href=mkfilename(link_to_page[to])+"#"+to; + data->params->href=mklinkname(link_to_page[to])+"#"+to; break; } @@ -322,7 +342,7 @@ SGML convert(SGML data) else data->data=({"unknown"}); data->tag="a"; - data->params->href=mkfilename(link_to_page[to])+"#"+to; + data->params->href=mklinkname(link_to_page[to])+"#"+to; break; } @@ -338,6 +358,7 @@ SGML convert(SGML data) case "example": data->tag="blockquote";break; case "ex_keyword": data->tag="b";break; + case "ex_meta": data->tag="i";break; case "ex_br": data->tag="br"; break; case "ex_indent": @@ -468,6 +489,10 @@ SGML convert(SGML data) continue; } + case "img": + add_file_to_export_list(data->params->src); + break; + case "illustration": ret+=({ mkimgtag(Wmml.illustration_to_gif(data,75.0),data->params) }); continue; @@ -601,10 +626,10 @@ SGML low_split(SGML data) Sgml.Tag("frameset",(["cols":"30%,*"]),0, ({ "\n", - Sgml.Tag("frame",(["src":mkfilename("toc_frame"),"name":"toc"])), + Sgml.Tag("frame",(["src":mklinkname("toc_frame"),"name":"toc"])), "\n", - Sgml.Tag("frame",(["src":mkfilename("firstpage"),"name":"display"])), + Sgml.Tag("frame",(["src":mklinkname("firstpage"),"name":"display"])), "\n", })), @@ -628,6 +653,11 @@ SGML low_split(SGML data) return current; } +SGML split(SGML data) +{ + return low_split(data); +} + void low_collect_links(SGML data, string file) { foreach(data,TAG t) @@ -680,11 +710,13 @@ string prevify(string num) void output(string base, WMML data) { + files=Stdio.File(base+".files","wct"); + basename=base; werror("Splitting "); sections=([]); - sections[""]=low_split(data->data); + sections[""]=split(data->data); werror("Finding links "); foreach(indices(sections), string file) @@ -720,7 +752,7 @@ void output(string base, WMML data) if(name && sections[to]) { - links+=({ Sgml.Tag("a",(["href":mkfilename(to)]),0, + links+=({ Sgml.Tag("a",(["href":mklinkname(to)]),0, ({ Sgml.Tag("img",([ "src":"left.gif", @@ -733,7 +765,7 @@ void output(string base, WMML data) } name=0; - links+=({ Sgml.Tag("a",(["href":mkfilename("")]),0, + links+=({ Sgml.Tag("a",(["href":mklinkname("")]),0, ({ Sgml.Tag("img", ([ @@ -765,7 +797,7 @@ void output(string base, WMML data) if(name && sections[to]) { - links+=({ Sgml.Tag("a",(["href":mkfilename(to)]),0, + links+=({ Sgml.Tag("a",(["href":mklinkname(to)]),0, ({ Sgml.Tag("img",([ "src":"right.gif", @@ -812,6 +844,7 @@ void output(string base, WMML data) werror("->String"); string data=Sgml.generate(data,Html.mktag); werror("->disk"); + add_file_to_export_list(filename); out::open(filename,"wct"); out::write(data); out::close(); diff --git a/tutorial/pike.gif b/tutorial/pike.gif index 77a5dd17497c98aa8cda421b8f7f993d66adbdbd..663ae033d80b157f90b03a327b2f80e3af58bd74 100644 GIT binary patch literal 4231 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 QUV)q=<C(u02M2WGe*w9~i~s-t literal 27671 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%0D*FfVey5BzTv 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 a=EKyhAENGli2m=x43Ce>yUq{<ru`o~TVaX- diff --git a/tutorial/tutorial.wmml b/tutorial/tutorial.wmml index 6eb4f5f1f5..2fcfce9c98 100644 --- a/tutorial/tutorial.wmml +++ b/tutorial/tutorial.wmml @@ -1,10 +1,12 @@ +<!-- <head> <title>Pike tutorial</title> </head> +--> -<!-- Allmänt: Sök på "'" och byt ut nästan alla 'foo' mot <i>foo</i> - Ändra alla kommandon under SEE ALSO till <tt>foo</tt> - Det står "return" på miljoner ställen där det ska stå "returns" --> +<!-- +TODO: Add a section about casts +--> <firstpage> <p> @@ -364,20 +366,20 @@ program however. Therefore we have <b>control structures</b> to make Pike execute pieces of code in more interesting orders than from top to bottom. <p> We have already seen an example of the <tt>if</tt> statement: -<pre> - if( <i>expression </i> ) - <i>statement1 </i> ; +<example language=pike meta=expression,statement1,statement2> + if( expression ) + statement1; else - <i>statement2 </i> ; -</pre> + statement2; +</example> <!-- FIX ME: should if have a capital letter or not? --> <tt>if</tt> simply evaluates the expression and if the result is true it executes <i>statement1</i>, otherwise it executes <i>statement2</i>. If you have no need for statement2 you can leave out the whole else<!-- FIX ME: tt/italics --> part like this: -<pre> - if( <i>expression </i> ) - <i>statement1 </i> ; -</pre> +<example language=pike meta=expression,statement1> + if( expression ) + statement1; +</example> In this case <i>statement1</i> is evaluated if <i>expression</i> is true, otherwise nothing is evaluated. <p> @@ -385,10 +387,10 @@ nothing is evaluated. understand what <tt>if</tt> does.</b> <p> Another very simple control structure is the <tt>while</tt> statement: -<pre> - while( <i>expression </i> ) - <i>statement </i> ; -</pre> +<example language=pike meta=expression,statemente> + while( expression ) + statement; +</example> This statement evaluates <i>expression</i> and if it is found to be true it evaluates <i>statement</i>. After that it starts over and evaluates <i>expression</i> again. This continues until <i>expression</i> is no longer true. This type of @@ -401,12 +403,12 @@ interesting programming. Another control structure we have already seen is the function. A function is simply a block of Pike code that can be executed with different arguments from different places in the program. A function is declared like this: -<pre> - <i>modifiers type name </i> ( <i>type name1 </i>, <i>type name2 </i>, <i>... </i> ) +<example language=pike meta=modifiers,type,name1,name2,statements> + modifiers type name(type name1, type name2, ...) { - <i> statements </i> + statements } -</pre> +</example> The <i>modifiers</i> are optional. See <ref to=modifiers> for more details about modifiers. The <i>type </i> specifies what kind of data the function returns. For example, the word <tt>int</tt> would signify that the function returns @@ -903,12 +905,12 @@ described again in this chapter. The simplest one is called the <b>if statement</b>. It can be written anywhere where a statement is expected and it looks like this: -<pre> - if ( <i>expression</i> ) - <i>statement1</i> ; +<example language=pre meta=expression,statement1,statement2> + if( expression ) + statement1; else - <i>statement2</i> ; -</pre> + statement2; +</example> Please note that there is no semicolon after the parenthesis or after the <tt>else</tt>. Step by step, <tt>if</tt> does the following: <ol> @@ -925,31 +927,31 @@ In short, <i>statement1</i> is executed if <i>expression</i> is <b>true</b> otherwise <i>statement2</i> is executed. If you are not interested in having something executed if the expression is false you can drop the whole else part like this: -<pre> - if ( <i>expression</i> ) - <i>statement1</i> ; -</pre> +<example language=pike meta=expression,statement1> + if( expression ) + statement1; +</example> If on the other hand you are not interested in evaluating something if the expression is <b>false</b> you should use the <b>not</b> operator to negate the true/false value of the expression. See chapter 5 for more information about the <b>not</b> operator. It would look like this: -<pre> - if ( ! <i>expression</i> ) - <i>statement2</i> ; -</pre> +<example language=pike meta=expression,statement2> + if( ! expression ) + statement2 ; +</example> Any of the statements here and in the rest of this chapter can also be a <b>block</b> of statements. A block is a list of statements, separated by semicolons and enclosed by brackets. Note that you should never put a semicolon after a block of statements. The example above would look like this; -<pre> - if ( ! <i>expression</i> ) +<example language=pike meta=expression,statement> + if ( ! expression ) { - <i>statement</i> ; - <i>statement</i> ; - <i>statement</i> ; + statement; + statement; + statement; } -</pre> +</example> </section> <section title="Switch"> @@ -958,25 +960,25 @@ A more sophisticated condition control structure is the <b>switch statement</b>. A switch lets you select one of many choices depending on the value of an expression and it can look something like this: -<pre> - switch ( <i>expression</i> ) +<example language=pike meta=expression,constant1,constant2,constant3,constant4,expressions1,expressions2,expressions3,expressions5> + switch ( expression ) { - case <i>constant1</i>: - <i>expressions1</i> ; + case constant1: + expressions1; break; - case <i>constant2</i>: - <i>expressions2</i> ; + case constant2: + expressions2; break; - case <i>constant3</i> .. <i>constant4</i>: - <i>expressions3</i> ; + case constant3 .. constant4: + expressions3; break; default: - <i>expressions5</i> ; + expressions5; } -</pre> +</example> As you can see, a switch statement is a bit more complicated than an if statement. It is still fairly simple however. It starts by evaluating the expression it then searches all the <tt>case</tt> statements in the @@ -1008,10 +1010,10 @@ one at the right time makes the code a lot shorter and simpler. <section title="while"> <tt>While</tt> is the simplest of the loop control structures. It looks just like an <tt>if</tt> statement without the else part: -<pre> - while ( <i>expression</i> ) - <i>statement</i> ; -</pre> +<example language=pike meta=expression,statement> + while ( expression ) + statement; +</example> The difference in how it works isn't that big either, the statement is executed if the expression is true. Then the expression is evaluated again, and if it is true the statement is executed again. Then it @@ -1033,20 +1035,20 @@ This would call show_record with the values 1, 2, 3 and 4. <tt>For</tt> is simply an extension of <tt>while</tt>. It provides an even shorter and more compact way of writing loops. The syntax looks like this: -<pre> - for ( <i>initializer statement</i> ; <i>expression</i> ; <i>incrementor expression</i> ) - <i>statement</i> ; -</pre> +<example language=pike meta=initializer_statement,expression,increment_expression,statement> + for ( initializer_statement ; expression ; incrementor_expression ) + statement ; +</example> For does the following steps: <ol> -<li> Executes the the <i>initializer statement</i>. The initializer statement +<li> Executes the the <i>initializer_statement</i>. The initializer statement is executed only once and is most commonly used to initialize the loop variable. <li> Evaluates <i>expression</i> <li> If the result was false it exits the loop and continues with the program after the loop. <li> Executes <i>statement</i>. -<li> Executes the <i>incrementor expression</i>. +<li> Executes the <i>increment_expression</i>. <li> Starts over from 2. </ol> This means that the example in the while section can be written like this: @@ -1062,11 +1064,11 @@ Sometimes it is unpractical that the expression is always evaluated before the first time the loop is executed. Quite often you want to execute something, and then do it over and over until some condition is satisfied. This is exactly when you should use the do-while statement. -<pre> +<example language=pike meta=statement,expression> do - <i>statement</i> ; - while ( <i>expression</i> ); -</pre> + statement; + while ( expression ); +</example> As usual, the <i>statement</i> can also be a block of statements, and then you do not need a semicolon after it. To clarify, this statement executes <i>statement</i> first, and then evaluates the <i>expression</i>. If the @@ -1090,14 +1092,14 @@ the modem by using the functions <tt>write</tt> and <tt>gets</tt>. evaluated for each iteration in the loop. Instead, <tt>foreach</tt> executes the statement once for each element in an array. <tt>Foreach</tt> looks like this: -<pre> - foreach ( <i>array expression</i>, <i>variable</i> ) - <i>statement</i> ; -</pre> +<example language=pike meta=array_expression,variable,statement> + foreach ( array_expression, variable ) + statement ; +</example> We have already seen an example of <tt>foreach</tt> in the <tt>find_song</tt> function in chapter 2. What foreach does is: <ol> -<li> It evaluates the <i>array expression</i> which must return an array. +<li> It evaluates the <i>array_expression</i> which must return an array. <li> If the array is empty, exit the loop. <li> It then assigns the first element from the array to the <i>variable</i>. <li> Then it executes the <i>statement</i>. @@ -1107,14 +1109,14 @@ function in chapter 2. What foreach does is: </ol> <tt>Foreach</tt> is not really necessary, but it is faster and clearer than doing the same thing with a <tt>for</tt> loop, as shown here: -<pre> - array tmp1= <i>array expression</i> ; +<example language=pike meta=array_expression,variable,statement> + array tmp1= array_expression; for ( tmp2 = 0; tmp2 < sizeof(tmp1); tmp2++ ) { - <i>variable</i> = tmp1 [ tmp2 ]; - <i>statement</i> ; + variable = tmp1 [ tmp2 ]; + statement; } -</pre> +</example> <p> </section> </section> @@ -1272,11 +1274,11 @@ need decimals. For this purpose you use <tt>float</tt>. Floats are normally and very small numbers, but only with 9 accurate digits. To write a floating point constant, you just put in the decimals or write it in the exponential form: -<pre> +<example language=pike> 3.14159265358979323846264338327950288419716939937510 // Pi 1.0e9 // A billion 1.0e-9 // A billionth -</pre> +</example> Of course you do not need this many decimals, but it doesn't hurt either. Usually digits after the ninth digit are ignored, but on some architectures <tt>float</tt> might have higher accuracy than that. In the exponential form, @@ -1783,10 +1785,10 @@ section again. <dt> compiling <dd> All programs are generated by compiling a file or a string. For this purpose there are two functions: -<pre> - program compile_file(string <i>filename</i>); - program compile_string(string <i>p</i>, string <i>filename</i>); -</pre> +<example language=pike meta=p,filename> + program compile_file(string filename); + program compile_string(string p, string filename); +</example> <tt>Compile_file</tt> simply reads the file given as argument, compiles it and returns the resulting program. <tt>Compile_string</tt> instead compiles whatever is in the string <i>p</i>. The second argument, @@ -1937,9 +1939,9 @@ For convenience, there is also a simple way to write a function inside another function. To do this you use the <tt>lambda</tt> keyword. The syntax is the same as for a normal function, except you write <tt>lambda</tt> instead of the function name: -<pre> - lambda ( <i>types</i> ) { <i>statements</i> } -</pre> +<example language=pike meta=types,statements> + lambda ( types ) { statements } +</example> The major difference is that this is an expression that can be used inside other function. Example: <example language=pike> @@ -2020,13 +2022,19 @@ than that, let's look at a few examples: array x; // x is an array of mixed mixed x; // x can be any type string *x; // x is an array of strings - mapping(string:int) x; // x is a mapping mapping from int to string - object(Stdio.File) x; // x is a clone of Stdio.File - // x is a function that takes two integer arguments and returns a string + // x is a mapping mapping from int to string + mapping(string:int) x; + + // x is a clone of Stdio.File + object(Stdio.File) x; + + // x is a function that takes two integer + // arguments and returns a string function(int,int:string) x; - // x is a function taking any amount of integer arguments and returns nothing. + // x is a function taking any amount of + // integer arguments and returns nothing. function(int...:void) x; // x is ... complicated @@ -2464,22 +2472,22 @@ arguments to a suitable range. This means that There is really only one assignment operator, but it can be combined with lots of other operators to make the code shorter. An assignment looks like this: -<pre> - <i>variable</i> = <i>expression</i> ; -</pre> +<example language=pike meta=variable,expression> + variable = expression; +</example> The <i>variable</i> can be a local variable, a global variable or an index in an array, object, multiset or mapping. This will of course set the value stored in <i>variable</i> to <i>expression</i>. Note that the above is also an expression which returns the value of the <i>expression</i>. This can be used in some interesting ways: -<pre> - <i>variable1</i> = <i>variable2</i> = 1; // Assign 1 to both variables - <i>variable1</i> =(<i>variable2</i> = 1); // Same as above +<example language=pike meta=variable1,variable2,expression> + variable1 = variable2 = 1; // Assign 1 to both variables + variable1 =(variable2 = 1); // Same as above // Write the value of the expression, if any - if(<i>variable</i> = <i>expression</i>) + if(variable = expression) write(variable); -</pre> +</example> Using assignments like this can however be confusing to novice users, or users who come from a Pascal or Basic background. Especially the if statement can be mistaken for <tt>if(<i>variable</i> == <i>expression</i>)</tt> which @@ -2753,11 +2761,11 @@ If you don't want to put each program in a separate file, you can use the <tt>class</tt> keyword to write all your classes in one file. We have already seen an example how this in chapter 4, but let's go over it in more detail. The syntax looks like this: -<pre> - class <i>class_name</i> { - <i>class definition</i> +<example language=pike meta=class_name,class_definition> + class class_name { + class_definition } -</pre> +</example> This construction can be used almost anywhere within a normal program. It can be used outside all functions, but it can also be used as an expression in which case the defined class will be returned. In this case you may also @@ -3067,9 +3075,9 @@ Sscanf may look exactly like a normal function, but normal functions can not set the variables you send to it. The purpose of sscanf is to match one string against a format string and place the matching results into a list of variables. The syntax looks like this: -<pre> - int sscanf(string <i>str</i>, string <I>fmt</I>, <i>lvalue</i> ...) -</pre> +<example language=pike meta=str,fmt,lvalue> + int sscanf(string str, string fmt, lvalue ...) +</example> The string <i>str</i> will be matched against the format string <i>fmt</i>. <i>fmt</i> can contain strings separated by %d,%s,%c and %f. Every % corresponds to one <i>lvalue</i>. @@ -3129,17 +3137,17 @@ Let's look at a couple of examples: <section title="catch & throw"> Catch is used to trap errors and other exceptions in Pike. It works by making a block of code into an expression, like this: -<pre> - catch { <i>statements</i> } -</pre> +<example language=pike meta=statements> + catch { statements } +</example> If an error occurs, catch will return a description of the error. The description of the error has the following format: -<pre> +<example language=pike> ({ - "<i>error description</i>", + "error description", backtrace() }) -</pre> +</example> If no error occurs, catch will return zero. You may emulate your own errors using the function throw, described in <ref to=functions>. <p> @@ -3156,9 +3164,9 @@ Example: <anchor name=gauge> <section title="gauge"> The syntax for gauge is the same as the syntax for catch: -<pre> - gauge { <i>statements</i> } -</pre> +<example language=pike meta=statements> + gauge { statements } +</example> However, gauge simply returns how many milliseconds the code took to execute. This can be used to find out how fast your code actually is.. :) Only CPU time used by the Pike process is measured. This means that if it takes @@ -3296,7 +3304,7 @@ cloned for to find the identifiers. <section title="How to write a module"> Here is an example of a simple module: <example language=pike> - constant PI = 3.15; + constant PI = 3.14159265358979323846264338327950288419716939937510; float cos2(float f) { return pow(cos(f),2.0); } </example> if we save this short file as <tt>Trig.pike.pmod</tt> we can now use this @@ -4308,7 +4316,7 @@ this instance of the program. (and thus the connection) Remove the leading slash. <p> <example language=pike> - input=combine_path(BASE,input); + input=BASE+combine_path("/",input); </example> Combine the requested file with the base of the HTML tree, this gives us a full filename beginning with a slash. The HTML tree is the @@ -4397,9 +4405,7 @@ End of create() }; </example> End of the new class. -<pre> - -</pre> +<p> Next we define the function called when someone connects. <p> <example language=pike> @@ -4482,7 +4488,7 @@ a slow machine available for the server. </chapter> </module> -<module name=Threads> +<module name=Thread> <chapter title="Threads"> Threads are used to run several Pike functions at the same time without having to start several Pike processes. Using threads often simplifies coding and because the @@ -4566,7 +4572,7 @@ makes it very simple to write threaded programs. Let's look at an example: int main(int argc, array(string) argv) { for(int e=0;e<4;e++) // Start workers - thread_create(worker,argv[1]); + thread_create(worker,argv[e]); for(int e=2;e<argc;e++) // Feed workers Fifo::write(argv[1]); for(int e=0;e<4;e++) // Tell workers to die @@ -5078,7 +5084,7 @@ class worker // Open the requested file sscanf(input,"%*[/]%s",input); - input=combine_path(BASE,input); + input=BASE+combine_path("/",input); if(!file::open(input,"r")) { @@ -5289,7 +5295,7 @@ first call that returned true instead or returning an array of the returned values. If no call returns true, -1 is returned. <p> <dt><encaps>SEE ALSO</encaps><dd> -<link to=Array.sum_arrays>Array.sum_arrays</link> and <link to=Array.filter_array>Array.filter_array</link> +<link to=Array.sum_arrays>Array.sum_arrays</link> and <link to=Array.filter>Array.filter</link> <p> </dl> </anchor> @@ -5320,7 +5326,7 @@ return res;<br> <p>Simple ehh? <p> <dt><encaps>SEE ALSO</encaps><dd> -<link to=Array.map_array>Array.map</link>, <link to=Array.filter>Array.filter</link> and <link to=Array.search_array>Array.search_array</link> +<link to=Array.map>Array.map</link>, <link to=Array.filter>Array.filter</link> and <link to=Array.search_array>Array.search_array</link> </dl> </anchor> @@ -5367,13 +5373,8 @@ values removed. The order of the values in the result is undefined. </section> </chapter> -<chapter title="Other modules"> - -Pike also include a number of smaller modules. These modules implement support -for various algorithms, data structures and system routines. - <anchor name=Image> -<section title=Image> +<chapter title=Image> The Image module is used to manipulate bit-mapped color images. It can read PPM images and do various manipulations, or it can be used to create completely new images. The created images can be @@ -5411,13 +5412,19 @@ Let's look at an example of how this can be used: </example> This very simple example can be used as a CGI script to produce a gif image which says what time it is in white text on a black background. -<p> -The Image module manual is not yet a part of this book, but it can be -found at <a href=http://www.mirar.org/image>http://www.mirar.org/image</a>. -</section> +<hr newpage> + +<include file=Image.wmml> + +</chapter> </anchor> +<chapter title="Other modules"> + +Pike also include a number of smaller modules. These modules implement support +for various algorithms, data structures and system routines. + <anchor name=System> <section title="System"> The system module contains some system-specific functions that may or may @@ -6112,7 +6119,7 @@ argument can be used to free up a little memory after the regexp has been used. <p> <dt><encaps>SEE ALSO</encaps><dd> -<link to=clone>clone</link> and <link to=Yp.regexp.match>Yp.regexp->match</link> +<link to=clone>clone</link> and <link to=Regexp.match>Regexp->match</link> <p> </dl> @@ -6132,13 +6139,13 @@ Return 1 if <i>s</i> matches the regexp bound to the object regexp, zero otherwise. <p> <dt><encaps>SEE ALSO</encaps><dd> -<link to=Regexp.create>Regexp->create</link> and <link to=Yp.regexp.split>regexp->split</link> +<link to=Regexp.create>Regexp->create</link> and <link to=Regexp.split>Regexp->split</link> <p> </dl> </anchor> <hr noshade size=1> -<anchor name=split> +<anchor name=Regexp.split> <dl> <dt><encaps>NAME</encaps><dd> <tt>Regexp.split</tt> - split a string according to a pattern @@ -7673,7 +7680,7 @@ the function uses the following guesses: </tt> <p> <dt><encaps>DESCRIPTION</encaps><dd> -This function is the inverse of the <link to=tokenize>tokenize</link> function. +This function is the inverse of the <link to=MIME.tokenize>tokenize</link> function. A header field value is constructed from a sequence of lexical elements. Characters (<tt>int</tt>s) are taken to be special-characters, whereas strings are encoded as atoms or quoted-strings, depending on whether @@ -8059,7 +8066,7 @@ for transmitting the message over protocols such as ESMTP and NNTP. The body will be encoded using the current transfer encoding, and subparts of a multipart will be collected recursively. If the message is a multipart and no boundary string has been set, one is generated using -<link to=generate_boundary>generate_boundary</link>. +<link to=MIME.generate_boundary>generate_boundary</link>. <p> <dt><encaps>EXAMPLES</encaps><dd> <pre> @@ -8278,7 +8285,7 @@ This is equivalent of calling <dt><encaps>DESCRIPTION</encaps><dd> Replaces the body entity of the data with a new piece of raw data. The new data should comply to the format indicated by the -<link to=type>type</link> and <link to=subtype>subtype</link> attributes. +<link to=MIME.Message.type>type</link> and <link to=MIME.Message.subtype>subtype</link> attributes. Do not use this method unless you know what you are doing. <p> <dt><encaps>SEE ALSO</encaps><dd> @@ -8324,7 +8331,7 @@ function instead. Select a new transfer encoding for this message. The <tt>Content-Transfer-Encoding</tt> header will be modified accordingly, and subsequent calls to <tt>getencoded</tt> will produce data encoded using -the new encoding. See <link to=MIME.Message.encode>encode</link> for a list of valid +the new encoding. See <link to=MIME.encode>encode</link> for a list of valid encodings. <p> <dt><encaps>SEE ALSO</encaps><dd> @@ -8514,6 +8521,28 @@ This function is the same as all_constants. <hr newpage> +<anchor name=Simulate.explode> +<dl> +<dt><encaps>NAME</encaps><dd> +<tt>Simulate.explode</tt> - explode a string on a delimeter +<p> +<dt><encaps>SYNTAX</encaps><dd> +<tt>string explode(string <I>s</I>, string <I>delimiter</I>);<br> +</tt> +<p> +<dt><encaps>DESCRIPTION</encaps><dd> +This function is really the same as the division operator. +It simly divides the string <i>s</i> into an array by splitting +<i>s</i> at every occurance of <i>delimeter</i>. +<p> +<dt><encaps>SEE ALSO</encaps><dd> +<link to=Simulate.implode>Simulate.implode</link> +<p> +</dl> + +</anchor> +<hr newpage> + <anchor name=Simulate.filter_array> <dl> <dt><encaps>NAME</encaps><dd> @@ -9397,7 +9426,7 @@ could be written in Pike as: aggregate_multiset... <p> <dt><encaps>SEE ALSO</encaps><dd> -<link to=sizeof>sizeof</link>, <link to=multisetp>multisetp</link> and <link to=Simulate.mkmultiset>Simulate.mkmultiset</link> +<link to=sizeof>sizeof</link>, <link to=multisetp>multisetp</link> and <link to=mkmultiset>mkmultiset</link> <p> </dl> </anchor> @@ -10481,7 +10510,7 @@ which reflects if the <i>str</i> matches <i>glob</i>. When given an array as second argument, an array containing all matching strings is returned. <p> <dt><encaps>SEE ALSO</encaps><dd> -<link to=sscanf>sscanf</link> and <link to=Regexp.regexp>Regexp.regexp</link> +<link to=sscanf>sscanf</link> and <link to=Regexp>Regexp</link> <p> </dl> </anchor> -- GitLab