Cross-references

This commit is contained in:
Graham Nelson 2020-04-09 18:32:37 +01:00
parent 699a03b74e
commit 9d1c0173b8
57 changed files with 2781 additions and 1624 deletions

View file

@ -13,6 +13,8 @@ where to put the result: and so we arrive at the front door of the routine
|Weaver::weave_source| below.
=
source_line *current_weave_line = NULL;
int Weaver::weave_source(web *W, weave_target *wv) {
text_stream TO_struct;
text_stream *OUT = &TO_struct;
@ -113,6 +115,7 @@ typedef struct weaver_state {
@<Weave this section@> =
paragraph *current_paragraph = NULL;
for (source_line *L = S->first_line; L; L = L->next_line) {
current_weave_line = L;
if ((Tags::tagged_with(L->owning_paragraph, wv->theme_match)) &&
(LanguageMethods::skip_in_weaving(S->sect_language, wv, L) == FALSE)) {
lines_woven++;

View file

@ -156,7 +156,7 @@ int ACMESupport::parse_comment(programming_language *pl,
for (int i=0; i<Str::len(line); i++) {
wchar_t c = Str::get_at(line, i);
if (c_mode == 2) {
if (ACMESupport::text_at(line, i, pl->multiline_comment_close)) {
if (Str::includes_at(line, i, pl->multiline_comment_close)) {
c_mode = 0; c_end = i; i += Str::len(pl->multiline_comment_close) - 1;
}
} else {
@ -167,28 +167,30 @@ int ACMESupport::parse_comment(programming_language *pl,
if (q_mode == 0) q_mode = 2;
else if (q_mode == 2) q_mode = 0;
}
if (c == Str::get_first_char(pl->character_literal)) {
if (q_mode == 0) q_mode = 1;
else if (q_mode == 1) q_mode = 0;
}
if (ACMESupport::text_at(line, i, pl->multiline_comment_open)) {
c_mode = 2; c_position = i; non_white_space = FALSE;
i += Str::len(pl->multiline_comment_open) - 1;
}
if (c_mode == 0) {
if (ACMESupport::text_at(line, i, pl->line_comment)) {
c_mode = 1; c_position = i; c_end = Str::len(line); non_white_space = FALSE;
i += Str::len(pl->line_comment) - 1;
if (q_mode == 0) {
if (c == Str::get_first_char(pl->character_literal)) {
if (q_mode == 0) q_mode = 1;
else if (q_mode == 1) q_mode = 0;
}
if (ACMESupport::text_at(line, i, pl->whole_line_comment)) {
int material_exists = FALSE;
for (int j=0; j<i; j++)
if (!(Characters::is_whitespace(Str::get_at(line, j))))
material_exists = TRUE;
if (material_exists == FALSE) {
c_mode = 1; c_position = i; c_end = Str::len(line);
non_white_space = FALSE;
i += Str::len(pl->whole_line_comment) - 1;
if (Str::includes_at(line, i, pl->multiline_comment_open)) {
c_mode = 2; c_position = i; non_white_space = FALSE;
i += Str::len(pl->multiline_comment_open) - 1;
}
if (c_mode == 0) {
if (Str::includes_at(line, i, pl->line_comment)) {
c_mode = 1; c_position = i; c_end = Str::len(line); non_white_space = FALSE;
i += Str::len(pl->line_comment) - 1;
}
if (Str::includes_at(line, i, pl->whole_line_comment)) {
int material_exists = FALSE;
for (int j=0; j<i; j++)
if (!(Characters::is_whitespace(Str::get_at(line, j))))
material_exists = TRUE;
if (material_exists == FALSE) {
c_mode = 1; c_position = i; c_end = Str::len(line);
non_white_space = FALSE;
i += Str::len(pl->whole_line_comment) - 1;
}
}
}
}
@ -207,16 +209,6 @@ int ACMESupport::parse_comment(programming_language *pl,
return FALSE;
}
int ACMESupport::text_at(text_stream *line, int i, text_stream *pattern) {
if (Str::len(pattern) == 0) return FALSE;
if (i < 0) return FALSE;
if (i + Str::len(pattern) > Str::len(line)) return FALSE;
LOOP_THROUGH_TEXT(pos, pattern)
if (Str::get(pos) != Str::get_at(line, i++))
return FALSE;
return TRUE;
}
@ This is here so that tangling the Standard Rules extension doesn't insert
a spurious comment betraying Inweb's involvement in the process.

View file

@ -111,26 +111,26 @@ void Painter::syntax_colour_inner(programming_language *pl,
if ((Str::get_at(colouring, i) == PLAIN_COLOUR) ||
(Str::get_at(colouring, i) == IDENTIFIER_COLOUR)) {
wchar_t c = Str::get_at(matter, i);
if (ACMESupport::text_at(matter, i, pl->binary_literal_prefix)) {
if (Str::includes_at(matter, i, pl->binary_literal_prefix)) {
base = 2;
for (int j=0; j<Str::len(pl->binary_literal_prefix); j++)
Str::put_at(colouring, i+j, (char) CONSTANT_COLOUR);
dec_possible = TRUE;
continue;
} else if (ACMESupport::text_at(matter, i, pl->octal_literal_prefix)) {
} else if (Str::includes_at(matter, i, pl->octal_literal_prefix)) {
base = 8;
for (int j=0; j<Str::len(pl->octal_literal_prefix); j++)
Str::put_at(colouring, i+j, (char) CONSTANT_COLOUR);
dec_possible = TRUE;
continue;
} else if (ACMESupport::text_at(matter, i, pl->hexadecimal_literal_prefix)) {
} else if (Str::includes_at(matter, i, pl->hexadecimal_literal_prefix)) {
base = 16;
for (int j=0; j<Str::len(pl->hexadecimal_literal_prefix); j++)
Str::put_at(colouring, i+j, (char) CONSTANT_COLOUR);
dec_possible = TRUE;
continue;
}
if ((ACMESupport::text_at(matter, i, pl->negative_literal_prefix)) &&
if ((Str::includes_at(matter, i, pl->negative_literal_prefix)) &&
(dec_possible) && (base == 0)) {
base = 10;
Str::put_at(colouring, i, (char) CONSTANT_COLOUR);
@ -228,7 +228,7 @@ void Painter::execute(hash_table *HT, colouring_language_block *block, text_stre
int L = Str::len(block->run_instance) - 1;
if (L >= 0)
for (int count=1, i=from; i<=to - L; i++)
if (ACMESupport::text_at(matter, i, block->run_instance)) {
if (Str::includes_at(matter, i, block->run_instance)) {
Painter::execute_rule(HT, rule, matter, colouring, i, i+L, count++);
i += L;
}
@ -321,7 +321,7 @@ int Painter::satisfies(hash_table *HT, colouring_rule *rule, text_stream *matter
if ((rule->match_prefix == SPACED_RULE_PREFIX) && (pos == from))
return FALSE;
}
if (ACMESupport::text_at(matter,
if (Str::includes_at(matter,
pos-Str::len(rule->match_text), rule->match_text) == FALSE)
return FALSE;
rule->fix_position = pos-Str::len(rule->match_text);
@ -334,7 +334,7 @@ int Painter::satisfies(hash_table *HT, colouring_rule *rule, text_stream *matter
if ((rule->match_prefix == SPACED_RULE_SUFFIX) && (pos == from))
return FALSE;
}
if (ACMESupport::text_at(matter, pos, rule->match_text) == FALSE)
if (Str::includes_at(matter, pos, rule->match_text) == FALSE)
return FALSE;
rule->fix_position = pos;
} else {

View file

@ -1,7 +1,7 @@
[Formats::] Weave Formats.
[Formats::] Format Methods.
To characterise the different weaving output formats (text, typeset,
web and so on).
To characterise the relevant differences in behaviour between the
various weaving formats offered, such as HTML, ePub, or TeX.
@h Formats.
Exactly as in the previous chapter, each format expresses its behaviour
@ -168,10 +168,11 @@ VMETHOD_TYPE(PARAGRAPH_HEADING_FOR_MTID, weave_format *wf, text_stream *OUT,
weave_target *wv, text_stream *TeX_macro, section *S, paragraph *P,
text_stream *heading_text, text_stream *chaptermark, text_stream *sectionmark, int weight)
void Formats::paragraph_heading(OUTPUT_STREAM, weave_target *wv, text_stream *TeX_macro,
section *S, paragraph *P, text_stream *heading_text, text_stream *chaptermark, text_stream *sectionmark,
int weight) {
section *S, paragraph *P, text_stream *heading_text, text_stream *chaptermark,
text_stream *sectionmark, int weight) {
weave_format *wf = wv->format;
VMETHOD_CALL(wf, PARAGRAPH_HEADING_FOR_MTID, OUT, wv, TeX_macro, S, P, heading_text, chaptermark, sectionmark, weight);
VMETHOD_CALL(wf, PARAGRAPH_HEADING_FOR_MTID, OUT, wv, TeX_macro, S, P,
heading_text, chaptermark, sectionmark, weight);
}
@ The following method is expected to weave a piece of code, which has already
@ -236,7 +237,8 @@ a convenience for Inform 7 code commentary.
@e DISPLAY_LINE_FOR_MTID
=
VMETHOD_TYPE(DISPLAY_LINE_FOR_MTID, weave_format *wf, text_stream *OUT, weave_target *wv, text_stream *from)
VMETHOD_TYPE(DISPLAY_LINE_FOR_MTID, weave_format *wf, text_stream *OUT,
weave_target *wv, text_stream *from)
void Formats::display_line(OUTPUT_STREAM, weave_target *wv, text_stream *from) {
weave_format *wf = wv->format;
VMETHOD_CALL(wf, DISPLAY_LINE_FOR_MTID, OUT, wv, from);
@ -395,28 +397,45 @@ void Formats::text_comment(OUTPUT_STREAM, weave_target *wv, text_stream *id) {
void Formats::text_r(OUTPUT_STREAM, weave_target *wv, text_stream *id,
int within, int comments) {
text_stream *notation = Bibliographic::get_datum(wv->weave_web->md,
text_stream *code_in_comments_notation =
Bibliographic::get_datum(wv->weave_web->md,
(comments)?(I"Code In Code Comments Notation"):(I"Code In Commentary Notation"));
if (Str::ne(notation, I"Off")) {
for (int i=0; i < Str::len(id); i++) {
if (Str::get_at(id, i) == '\\') i += Str::len(notation) - 1;
else if (ACMESupport::text_at(id, i, notation)) {
TEMPORARY_TEXT(before);
Str::copy(before, id); Str::truncate(before, i);
TEMPORARY_TEXT(after);
Str::substr(after, Str::at(id, i + Str::len(notation)), Str::end(id));
Formats::text_r(OUT, wv, before, within, comments);
Formats::text_r(OUT, wv, after, (within)?FALSE:TRUE, comments);
DISCARD_TEXT(before);
DISCARD_TEXT(after);
return;
}
if (Str::ne(code_in_comments_notation, I"Off")) @<Split text and code extracts@>;
if (within == FALSE) @<Recognose hyperlinks@>;
text_stream *xref_notation = Bibliographic::get_datum(wv->weave_web->md,
I"Cross-References Notation");
if (Str::ne(xref_notation, I"Off")) @<Recognise cross-references@>;
if (within) {
Formats::source_fragment(OUT, wv, id);
} else {
Formats::text_fragment(OUT, wv, id);
}
}
@<Split text and code extracts@> =
for (int i=0; i < Str::len(id); i++) {
if (Str::get_at(id, i) == '\\') i += Str::len(code_in_comments_notation) - 1;
else if (Str::includes_at(id, i, code_in_comments_notation)) {
TEMPORARY_TEXT(before);
Str::copy(before, id); Str::truncate(before, i);
TEMPORARY_TEXT(after);
Str::substr(after, Str::at(id,
i + Str::len(code_in_comments_notation)), Str::end(id));
Formats::text_r(OUT, wv, before, within, comments);
Formats::text_r(OUT, wv, after, (within)?FALSE:TRUE, comments);
DISCARD_TEXT(before);
DISCARD_TEXT(after);
return;
}
}
@<Recognose hyperlinks@> =
for (int i=0; i < Str::len(id); i++) {
if ((within == FALSE) &&
((ACMESupport::text_at(id, i, I"http://")) ||
(ACMESupport::text_at(id, i, I"https://")))) {
if ((Str::includes_at(id, i, I"http://")) ||
(Str::includes_at(id, i, I"https://"))) {
TEMPORARY_TEXT(before);
Str::copy(before, id); Str::truncate(before, i);
TEMPORARY_TEXT(after);
@ -426,16 +445,90 @@ void Formats::text_r(OUTPUT_STREAM, weave_target *wv, text_stream *id,
Formats::text_r(OUT, wv, before, within, comments);
Formats::url(OUT, wv, mr.exp[0], mr.exp[0], TRUE);
Formats::text_r(OUT, wv, mr.exp[1], within, comments);
Regexp::dispose_of(&mr);
return;
}
Regexp::dispose_of(&mr);
DISCARD_TEXT(before);
DISCARD_TEXT(after);
}
}
if (within) {
Formats::source_fragment(OUT, wv, id);
@<Recognise cross-references@> =
int N = Str::len(xref_notation);
for (int i=0; i < Str::len(id); i++) {
if ((within == FALSE) && (Str::includes_at(id, i, xref_notation))) {
int j = i + N+1;
while (j < Str::len(id)) {
if (Str::includes_at(id, j, xref_notation)) {
int allow = FALSE;
TEMPORARY_TEXT(before);
TEMPORARY_TEXT(reference);
TEMPORARY_TEXT(after);
Str::substr(before, Str::start(id), Str::at(id, i));
Str::substr(reference, Str::at(id, i + N), Str::at(id, j));
Str::substr(after, Str::at(id, j + N), Str::end(id));
@<Attempt to resolve the cross-reference@>;
DISCARD_TEXT(before);
DISCARD_TEXT(reference);
DISCARD_TEXT(after);
if (allow) return;
}
j++;
}
}
}
@<Attempt to resolve the cross-reference@> =
TEMPORARY_TEXT(url);
TEMPORARY_TEXT(title);
if (Formats::resolve_reference_in_weave(url, title, wv, reference,
current_weave_line)) {
Formats::text_r(OUT, wv, before, within, comments);
Formats::url(OUT, wv, url, title, FALSE);
Formats::text_r(OUT, wv, after, within, comments);
allow = TRUE;
}
DISCARD_TEXT(url);
DISCARD_TEXT(title);
@ The following must decide what a reference like "Chapter 3" should refer
to: that is, whether it makes unamgiguous sense, and if so, what URL we should
link to, and what the full text of the link might be.
=
int Formats::resolve_reference_in_weave(text_stream *url, text_stream *title,
weave_target *wv, text_stream *text, source_line *L) {
module *found_M = NULL;
section_md *found_Sm = NULL;
int named_as_module = FALSE;
int N = WebModules::named_reference(&found_M, &found_Sm, &named_as_module,
title, wv->weave_web->md->as_module, text, FALSE);
if (N == 0) {
Main::error_in_web(I"No section has this name", L);
return FALSE;
} else if (N > 1) {
Main::error_in_web(I"Multiple sections might be meant here", L);
WebModules::named_reference(&found_M, &found_Sm, &named_as_module,
title, wv->weave_web->md->as_module, text, TRUE);
return FALSE;
} else {
Formats::text_fragment(OUT, wv, id);
chapter *C;
section *S, *found_S = NULL;
LOOP_OVER_LINKED_LIST(C, chapter, wv->weave_web->chapters)
LOOP_OVER_LINKED_LIST(S, section, C->sections)
if (S->md == found_Sm) found_S = S;
if (found_S == NULL) internal_error("could not locate S");
if (found_M == NULL) internal_error("could not locate M");
if (found_M != wv->weave_web->md->as_module) {
WRITE_TO(url, "../%S-module/", found_M->module_name);
}
HTMLFormat::section_URL(url, wv, found_S);
if ((named_as_module == FALSE) && (found_M != wv->weave_web->md->as_module)) {
WRITE_TO(title, " (in %S)", found_M->module_name);
}
return TRUE;
}
}

View file

@ -312,21 +312,13 @@ void HTMLFormat::source_code(weave_format *self, text_stream *OUT, weave_target
int current_colour = -1, colour_wanted = PLAIN_COLOUR;
for (int i=0; i < Str::len(matter); i++) {
colour_wanted = Str::get_at(colouring, i); @<Adjust code colour as necessary@>;
if ((linked) &&
((ACMESupport::text_at(matter, i, I"http://")) ||
(ACMESupport::text_at(matter, i, I"https://")))) {
TEMPORARY_TEXT(before);
Str::copy(before, matter); Str::truncate(before, i);
TEMPORARY_TEXT(after);
Str::substr(after, Str::at(matter, i), Str::end(matter));
match_results mr = Regexp::create_mr();
if (Regexp::match(&mr, after, L"(https*://%C+)(%c*)")) {
Formats::url(OUT, wv, mr.exp[0], mr.exp[0], TRUE);
i += Str::len(mr.exp[0]);
}
DISCARD_TEXT(before);
DISCARD_TEXT(after);
}
if (linked) {
@<Pick up hyperlinking at the eleventh hour@>;
text_stream *xref_notation = Bibliographic::get_datum(wv->weave_web->md,
I"Cross-References Notation");
if (Str::ne(xref_notation, I"Off"))
@<Pick up cross-references at the eleventh hour@>;
}
if (Str::get_at(matter, i) == '<') WRITE("&lt;");
else if (Str::get_at(matter, i) == '>') WRITE("&gt;");
else if (Str::get_at(matter, i) == '&') WRITE("&amp;");
@ -345,6 +337,48 @@ void HTMLFormat::source_code(weave_format *self, text_stream *OUT, weave_target
}
}
@<Pick up hyperlinking at the eleventh hour@> =
if ((Str::includes_at(matter, i, I"http://")) ||
(Str::includes_at(matter, i, I"https://"))) {
TEMPORARY_TEXT(before);
Str::copy(before, matter); Str::truncate(before, i);
TEMPORARY_TEXT(after);
Str::substr(after, Str::at(matter, i), Str::end(matter));
match_results mr = Regexp::create_mr();
if (Regexp::match(&mr, after, L"(https*://%C+)(%c*)")) {
Formats::url(OUT, wv, mr.exp[0], mr.exp[0], TRUE);
i += Str::len(mr.exp[0]);
}
DISCARD_TEXT(before);
DISCARD_TEXT(after);
}
@<Pick up cross-references at the eleventh hour@> =
int N = Str::len(xref_notation);
if ((Str::includes_at(matter, i, xref_notation))) {
int j = i + N+1;
while (j < Str::len(matter)) {
if (Str::includes_at(matter, j, xref_notation)) {
TEMPORARY_TEXT(reference);
Str::substr(reference, Str::at(matter, i + N), Str::at(matter, j));
@<Attempt to resolve the cross-reference@>;
DISCARD_TEXT(reference);
}
j++;
}
}
@<Attempt to resolve the cross-reference@> =
TEMPORARY_TEXT(url);
TEMPORARY_TEXT(title);
if (Formats::resolve_reference_in_weave(url, title, wv, reference,
current_weave_line)) {
Formats::url(OUT, wv, url, title, FALSE);
i = j + N;
}
DISCARD_TEXT(url);
DISCARD_TEXT(title);
@<Adjust code colour as necessary@> =
if (colour_wanted != current_colour) {
if (current_colour >= 0) HTML_CLOSE("span");
@ -519,7 +553,7 @@ void HTMLFormat::change_colour(weave_format *self, text_stream *OUT, weave_targe
int col, int in_code) {
char *cl = "plain";
switch (col) {
case DEFINITION_COLOUR: cl = "cwebmacrotext"; break;
case DEFINITION_COLOUR: cl = "cwebmacrotext"; break;
case FUNCTION_COLOUR: cl = "functiontext"; break;
case IDENTIFIER_COLOUR: cl = "identifier"; break;
case ELEMENT_COLOUR: cl = "element"; break;
@ -581,6 +615,15 @@ void HTMLFormat::locale(weave_format *self, text_stream *OUT, weave_target *wv,
}
@ =
void HTMLFormat::section_URL(OUTPUT_STREAM, weave_target *wv, section *from) {
TEMPORARY_TEXT(linkto);
Str::copy(linkto, from->sect_range);
LOOP_THROUGH_TEXT(pos, linkto)
if ((Str::get(pos) == '/') || (Str::get(pos) == ' '))
Str::put(pos, '-');
WRITE_TO(linkto, ".html");
WRITE("%S", linkto);
}
void HTMLFormat::xref(OUTPUT_STREAM, weave_target *wv, paragraph *P, section *from,
int a_link) {
TEMPORARY_TEXT(linkto);
@ -591,14 +634,17 @@ void HTMLFormat::xref(OUTPUT_STREAM, weave_target *wv, paragraph *P, section *fr
Str::put(pos, '-');
WRITE_TO(linkto, ".html");
}
WRITE("%S%s%S", linkto, (a_link)?"#":"", P->ornament);
WRITE("%S", linkto);
if (P) WRITE("%s%S", (a_link)?"#":"", P->ornament);
DISCARD_TEXT(linkto);
WRITE("P");
text_stream *N = P->paragraph_number;
LOOP_THROUGH_TEXT(pos, N)
if (Str::get(pos) == '.') WRITE("_");
else PUT(Str::get(pos));
if (P) {
WRITE("P");
text_stream *N = P->paragraph_number;
LOOP_THROUGH_TEXT(pos, N)
if (Str::get(pos) == '.') WRITE("_");
else PUT(Str::get(pos));
}
}
@ =

View file

@ -58,7 +58,7 @@ in different programming languages."
Chapter 5: Formats
"Weaving to a variety of different human-readable formats."
Weave Formats
Format Methods
Plain Text Format
TeX Format
HTML Formats

View file

@ -381,6 +381,51 @@ produces:
Compare: https://en.wikipedia.org/wiki/Crocheting_Adventures_with_Hyperbolic_Planes
=
@ Cross-references are also allowed. These are normally written within |//|
signs and are only available in the commentary of a web. They allow us to
place cross-references like so:
= (text)
To see how cross-references are implemented, see //Format Methods//,
or more generally the whole of //Chapter 5//; to decipher the text,
Inweb uses code from //foundation// at //foundation: Web Modules//.
=
To see how cross-references are implemented, see //Format Methods//,
or more generally the whole of //Chapter 5//; to decipher the text,
Inweb uses code from //foundation// at //foundation: Web Modules//.
What happened in that last sentence is that Inweb noticed the following:
(a) "Format Methods" is the name of a section of code in the Inweb web;
(b) The web also has a "Chapter 5";
(c) It uses a module called "foundation";
(d) And that module has a section called "Web Modules".
Inweb then made links accordingly. Chapters, which can be referred to either
numerically, link to the first section in them; modules likewise.
Errors are thrown if these references are in any way ambiguous. They are not
case sensitive.
Cross-references also work inside text extracts marked as |hyperlinked|.
= (text)
= (hyperlinked text)
See the //Manual// for more on this.
=
=
produces:
= (hyperlinked text)
See the //Manual// for more on this.
=
This notation may be inconvenient if you need |//| for something else, but it
can be configured in the Contents page of a web, say like so:
= (text as Inweb)
Cross-References Notation: &&&
=
It's also possible to disable cross-referencing entirely with:
= (text as Inweb)
Cross-References Notation: Off
=
@ Pictures must be in PNG, JPG or PDF format and can be included with lines
like:
= (text as Inweb)

View file

@ -6,6 +6,8 @@ What Inweb is, and why it is not CWEB.
Inweb is a modern system for literate programming written for the Inform
programming language project.
//Patterns//
This means that it is a preprocessor and organiser of source code. It reads in
a "web", an expression of a program which mixes code with heavy quantities of
commentary. Inweb can do two basic things: "weave" the web into a booklet or

File diff suppressed because it is too large Load diff

View file

@ -1,7 +1,7 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Foundation</title>
<title>Foundation Module</title>
<meta name="viewport" content="width=device-width initial-scale=1">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta http-equiv="Content-Language" content="en-gb">
@ -23,8 +23,8 @@
</nav>
<main role="main">
<!--Weave of 'Foundation' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="index.html">foundation</a></li><li><a href="index.html#1">Chapter 1: Setting Up</a></li><li><b>Foundation</b></li></ul><p class="purpose">Starting up and shutting down.</p>
<!--Weave of 'Foundation Module' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="index.html">foundation</a></li><li><a href="index.html#1">Chapter 1: Setting Up</a></li><li><b>Foundation Module</b></li></ul><p class="purpose">Starting up and shutting down.</p>
<ul class="toc"><li><a href="#SP1">&#167;1. Introduction</a></li><li><a href="#SP2">&#167;2. Basic definitions</a></li><li><a href="#SP8">&#167;8. The beginning and the end</a></li></ul><hr class="tocbar">

View file

@ -615,7 +615,7 @@ actually running a one-line AppleScript here.
<p class="endnote">This paragraph is used only if PLATFORM_POSIX is defined.</p>
<hr class="tocbar">
<ul class="toc"><li><a href="1-fnd.html">Back to 'Foundation'</a></li><li><a href="1-wp.html">Continue with 'Windows Platform'</a></li></ul><hr class="tocbar">
<ul class="toc"><li><a href="1-fm.html">Back to 'Foundation Module'</a></li><li><a href="1-wp.html">Continue with 'Windows Platform'</a></li></ul><hr class="tocbar">
<!--End of weave-->
</main>
</body>

View file

@ -119,7 +119,7 @@ trace-sentences mode, that is, between asterisk sentences.
<p class="inwebparagraph"></p>
<p class="endnote">The function Log::declare_aspect is used in 1/fnd (<a href="1-fnd.html#SP8_2">&#167;8.2</a>).</p>
<p class="endnote">The function Log::declare_aspect is used in 1/fm (<a href="1-fm.html#SP8_2">&#167;8.2</a>).</p>
<p class="inwebparagraph"><a id="SP4_1"></a><b>&#167;4.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Empty the aspects table</span> <span class="cwebmacronumber">4.1</span>&gt; =
@ -226,7 +226,7 @@ temporarily the sentence tracing file: but we don't care.
<p class="endnote">The function Log::open_alternative appears nowhere else.</p>
<p class="endnote">The function Log::close is used in 1/fnd (<a href="1-fnd.html#SP9">&#167;9</a>).</p>
<p class="endnote">The function Log::close is used in 1/fm (<a href="1-fm.html#SP9">&#167;9</a>).</p>
<p class="inwebparagraph"><a id="SP6"></a><b>&#167;6. Subheadings. </b>To provide signposts in what is otherwise a huge amorphous pile of text,
the debugging log can be divided into "phases", subdivided into "stages".
@ -280,7 +280,7 @@ debug log, and is used when errors occur.
<p class="inwebparagraph"></p>
<p class="endnote">The function Log::aspect_switched_on is used in <a href="#SP11">&#167;11</a>, 1/fnd (<a href="1-fnd.html#SP9">&#167;9</a>), 2/str (<a href="2-str.html#SP3">&#167;3</a>).</p>
<p class="endnote">The function Log::aspect_switched_on is used in <a href="#SP11">&#167;11</a>, 1/fm (<a href="1-fm.html#SP9">&#167;9</a>), 2/str (<a href="2-str.html#SP3">&#167;3</a>).</p>
<p class="endnote">The function Log::set_aspect appears nowhere else.</p>

View file

@ -161,7 +161,7 @@ begin as soon as this is initialised.
<p class="inwebparagraph"></p>
<p class="endnote">The function Memory::start is used in 1/fnd (<a href="1-fnd.html#SP8">&#167;8</a>).</p>
<p class="endnote">The function Memory::start is used in 1/fm (<a href="1-fm.html#SP8">&#167;8</a>).</p>
<p class="inwebparagraph"><a id="SP6"></a><b>&#167;6. Architecture. </b>The memory manager is built in three levels, with its interface to the user
being entirely at level 3 (except that when it shuts down it calls a level 1
@ -341,7 +341,7 @@ block.
<p class="inwebparagraph"></p>
<p class="endnote">The function Memory::free is used in 1/fnd (<a href="1-fnd.html#SP9">&#167;9</a>).</p>
<p class="endnote">The function Memory::free is used in 1/fm (<a href="1-fm.html#SP9">&#167;9</a>).</p>
<p class="inwebparagraph"><a id="SP13"></a><b>&#167;13. Level 2: memory frames and integrity checking. </b>Within these extensive blocks of contiguous memory, we place the actual
objects in between "memory frames", which are only used at present to police
@ -1063,7 +1063,7 @@ report in the debugging log (for which, see below).
<p class="inwebparagraph"></p>
<p class="endnote">The function Memory::log_statistics is used in 1/fnd (<a href="1-fnd.html#SP9">&#167;9</a>).</p>
<p class="endnote">The function Memory::log_statistics is used in 1/fm (<a href="1-fm.html#SP9">&#167;9</a>).</p>
<p class="inwebparagraph"><a id="SP32_1"></a><b>&#167;32.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Calculate the memory usage for objects</span> <span class="cwebmacronumber">32.1</span>&gt; =

View file

@ -473,7 +473,7 @@ is clear, that is, no conversion is made.
<p class="inwebparagraph"></p>
<p class="endnote">The function Streams::log is used in 1/fnd (<a href="1-fnd.html#SP8_3">&#167;8.3</a>).</p>
<p class="endnote">The function Streams::log is used in 1/fm (<a href="1-fm.html#SP8_3">&#167;8.3</a>).</p>
<p class="inwebparagraph"><a id="SP22"></a><b>&#167;22. Standard I/O wrappers. </b>The first call to <code class="display"><span class="extract">Streams::get_stdout()</span></code> creates a suitable wrapper for <code class="display"><span class="extract">stdout</span></code>
and returns a <code class="display"><span class="extract">text_stream *</span></code> pointer to it; subsequent calls just return this wrapper.
@ -1285,7 +1285,7 @@ to open similar ones again).
<p class="inwebparagraph"></p>
<p class="endnote">The function Streams::writer is used in 1/fnd (<a href="1-fnd.html#SP8_1">&#167;8.1</a>).</p>
<p class="endnote">The function Streams::writer is used in 1/fm (<a href="1-fm.html#SP8_1">&#167;8.1</a>).</p>
<hr class="tocbar">
<ul class="toc"><li><a href="2-mmr.html">Back to 'Memory'</a></li><li><a href="2-wal.html">Continue with 'Writers and Loggers'</a></li></ul><hr class="tocbar">

View file

@ -126,9 +126,9 @@ because the loggers don't use format strings.)
<p class="inwebparagraph"></p>
<p class="endnote">The function Writers::register_writer is used in 1/fnd (<a href="1-fnd.html#SP8_1">&#167;8.1</a>).</p>
<p class="endnote">The function Writers::register_writer is used in 1/fm (<a href="1-fm.html#SP8_1">&#167;8.1</a>).</p>
<p class="endnote">The function Writers::register_logger is used in 1/fnd (<a href="1-fnd.html#SP8_3">&#167;8.3</a>).</p>
<p class="endnote">The function Writers::register_logger is used in 1/fm (<a href="1-fm.html#SP8_3">&#167;8.3</a>).</p>
<p class="endnote">The function Writers::register_writer_I appears nowhere else.</p>
@ -331,7 +331,7 @@ file encodings, but expanding <code class="display"><span class="extract">%s</sp
<span class="plain">#</span><span class="identifier">pragma</span><span class="plain"> </span><span class="identifier">clang</span><span class="plain"> </span><span class="identifier">diagnostic</span><span class="plain"> </span><span class="identifier">push</span>
<span class="plain">#</span><span class="identifier">pragma</span><span class="plain"> </span><span class="identifier">clang</span><span class="plain"> </span><span class="identifier">diagnostic</span><span class="plain"> </span><span class="identifier">ignored</span><span class="plain"> </span><span class="string">"-Wformat-nonliteral"</span>
<span class="reserved">switch</span><span class="plain"> (</span><span class="identifier">esc_number</span><span class="plain">) {</span>
<span class="reserved">case</span><span class="plain"> </span><span class="character">'c'</span><span class="plain">: </span><span class="reserved">case</span><span class="plain"> </span><span class="character">'d'</span><span class="plain">: </span><span class="reserved">case</span><span class="plain"> </span><span class="character">'i'</span><span class="plain">: </span><span class="reserved">case</span><span class="plain"> </span><span class="character">'x'</span><span class="plain">: { </span><span class="comment"> <code class="display"><span class="extract">char</span></code> is promoted to <code class="display"><span class="extract">int</span></code> in variable arguments</span>
<span class="reserved">case</span><span class="plain"> </span><span class="character">'c'</span><span class="plain">: </span><span class="reserved">case</span><span class="plain"> </span><span class="character">'d'</span><span class="plain">: </span><span class="reserved">case</span><span class="plain"> </span><span class="character">'i'</span><span class="plain">: </span><span class="reserved">case</span><span class="plain"> </span><span class="character">'x'</span><span class="plain">: { /* |</span><span class="reserved">char</span><span class="plain">| </span><span class="identifier">is</span><span class="plain"> </span><span class="identifier">promoted</span><span class="plain"> </span><span class="identifier">to</span><span class="plain"> |</span><span class="reserved">int</span><span class="plain">| </span><span class="identifier">in</span><span class="plain"> </span><span class="identifier">variable</span><span class="plain"> </span><span class="identifier">arguments</span><span class="plain"> */</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">ival</span><span class="plain"> = </span><span class="identifier">va_arg</span><span class="plain">(</span><span class="identifier">ap</span><span class="plain">, </span><span class="reserved">int</span><span class="plain">);</span>
<span class="reserved">char</span><span class="plain"> </span><span class="identifier">temp</span><span class="plain">[256];</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">snprintf</span><span class="plain">(</span><span class="identifier">temp</span><span class="plain">, </span><span class="constant">255</span><span class="plain">, </span><span class="identifier">format_string</span><span class="plain">, </span><span class="identifier">ival</span><span class="plain">) &gt;= </span><span class="constant">255</span><span class="plain">) </span><span class="identifier">strcpy</span><span class="plain">(</span><span class="identifier">temp</span><span class="plain">, </span><span class="string">"?"</span><span class="plain">);</span>

View file

@ -153,11 +153,11 @@ swtich, and then the client should call:
<p class="inwebparagraph"></p>
<p class="endnote">The function CommandLine::begin_group is used in 1/fnd (<a href="1-fnd.html#SP8_5">&#167;8.5</a>).</p>
<p class="endnote">The function CommandLine::begin_group is used in 1/fm (<a href="1-fm.html#SP8_5">&#167;8.5</a>).</p>
<p class="endnote">The function CommandLine::end_group is used in 1/fnd (<a href="1-fnd.html#SP8_5">&#167;8.5</a>).</p>
<p class="endnote">The function CommandLine::end_group is used in 1/fm (<a href="1-fm.html#SP8_5">&#167;8.5</a>).</p>
<p class="endnote">The function CommandLine::declare_switch is used in <a href="#SP6">&#167;6</a>, 1/fnd (<a href="1-fnd.html#SP8_5">&#167;8.5</a>).</p>
<p class="endnote">The function CommandLine::declare_switch is used in <a href="#SP6">&#167;6</a>, 1/fm (<a href="1-fm.html#SP8_5">&#167;8.5</a>).</p>
<p class="endnote">The function CommandLine::declare_switch_p is used in <a href="#SP6">&#167;6</a>.</p>
@ -225,7 +225,7 @@ section. So the sorting version of <code class="display"><span class="extract">n
<p class="inwebparagraph"></p>
<p class="endnote">The function CommandLine::declare_boolean_switch is used in 1/fnd (<a href="1-fnd.html#SP8_5">&#167;8.5</a>).</p>
<p class="endnote">The function CommandLine::declare_boolean_switch is used in 1/fm (<a href="1-fm.html#SP8_5">&#167;8.5</a>).</p>
<p class="endnote">The function CommandLine::declare_numerical_switch appears nowhere else.</p>
@ -280,7 +280,7 @@ through the file if one has by that point been provided.
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">i</span><span class="plain">=1; </span><span class="identifier">i</span><span class="plain">&lt;</span><span class="identifier">argc</span><span class="plain">; </span><span class="identifier">i</span><span class="plain">++) {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">switched</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
<span class="reserved">char</span><span class="plain"> *</span><span class="identifier">p</span><span class="plain"> = </span><span class="identifier">argv</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">];</span>
<span class="reserved">while</span><span class="plain"> (</span><span class="identifier">p</span><span class="plain">[0] == </span><span class="character">'-'</span><span class="plain">) { </span><span class="identifier">p</span><span class="plain">++; </span><span class="identifier">switched</span><span class="plain"> = </span><span class="constant">TRUE</span><span class="plain">; } </span><span class="comment"> allow a doubled-dash as a single</span>
<span class="reserved">while</span><span class="plain"> (</span><span class="identifier">p</span><span class="plain">[0] == </span><span class="character">'-'</span><span class="plain">) { </span><span class="identifier">p</span><span class="plain">++; </span><span class="identifier">switched</span><span class="plain"> = </span><span class="constant">TRUE</span><span class="plain">; } /* </span><span class="identifier">allow</span><span class="plain"> </span><span class="identifier">a</span><span class="plain"> </span><span class="identifier">doubled</span><span class="plain">-</span><span class="identifier">dash</span><span class="plain"> </span><span class="identifier">as</span><span class="plain"> </span><span class="identifier">a</span><span class="plain"> </span><span class="identifier">single</span><span class="plain"> */</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">opt</span><span class="plain">);</span>
<span class="functiontext">Streams::write_locale_string</span><span class="plain">(</span><span class="identifier">opt</span><span class="plain">, </span><span class="identifier">p</span><span class="plain">);</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">arg</span><span class="plain">);</span>

View file

@ -133,7 +133,7 @@ as Unicode code points, regardless of what text encoding the locale has.)
<p class="inwebparagraph"></p>
<p class="endnote">The function Filenames::writer is used in 1/fnd (<a href="1-fnd.html#SP8_1">&#167;8.1</a>).</p>
<p class="endnote">The function Filenames::writer is used in 1/fm (<a href="1-fm.html#SP8_1">&#167;8.1</a>).</p>
<p class="inwebparagraph"><a id="SP5"></a><b>&#167;5. </b>And again relative to a given pathname:
</p>

View file

@ -103,7 +103,7 @@ host file system.
<p class="inwebparagraph"></p>
<p class="endnote">The function Pathnames::start is used in 1/fnd (<a href="1-fnd.html#SP8">&#167;8</a>).</p>
<p class="endnote">The function Pathnames::start is used in 1/fm (<a href="1-fm.html#SP8">&#167;8</a>).</p>
<p class="inwebparagraph"><a id="SP3"></a><b>&#167;3. Installation folder. </b></p>
@ -225,7 +225,7 @@ except possibly for an initial slash, so for example <code class="display"><span
<p class="inwebparagraph"></p>
<p class="endnote">The function Pathnames::writer is used in 1/fnd (<a href="1-fnd.html#SP8_1">&#167;8.1</a>), 3/fln (<a href="3-fln.html#SP4">&#167;4</a>).</p>
<p class="endnote">The function Pathnames::writer is used in 1/fm (<a href="1-fm.html#SP8_1">&#167;8.1</a>), 3/fln (<a href="3-fln.html#SP4">&#167;4</a>).</p>
<p class="endnote">The function Pathnames::writer_r appears nowhere else.</p>

View file

@ -45,7 +45,7 @@
<p class="inwebparagraph"></p>
<p class="endnote">The function Time::begin is used in 1/fnd (<a href="1-fnd.html#SP8">&#167;8</a>).</p>
<p class="endnote">The function Time::begin is used in 1/fm (<a href="1-fm.html#SP8">&#167;8</a>).</p>
<p class="inwebparagraph"><a id="SP2"></a><b>&#167;2. </b>The command line option <code class="display"><span class="extract">-fixtime</span></code> causes any tool compiled with Foundation
to fix the date as 11 a.m. on 28 March 2016, which is Inform's birthday. This

View file

@ -191,7 +191,7 @@ hand. This I think makes for opaque code. So:
<p class="endnote">The function CStrings::truncated_strcpy is used in 2/dl (<a href="2-dl.html#SP6">&#167;6</a>).</p>
<hr class="tocbar">
<ul class="toc"><li><a href="4-chr.html">Back to 'Characters'</a></li><li><a href="4-ws.html">Continue with 'Wide Strings.w'</a></li></ul><hr class="tocbar">
<ul class="toc"><li><a href="4-chr.html">Back to 'Characters'</a></li><li><a href="4-ws.html">Continue with 'Wide Strings'</a></li></ul><hr class="tocbar">
<!--End of weave-->
</main>
</body>

View file

@ -211,7 +211,7 @@ are not. They are simply a little faster to access if short.
<p class="endnote">The structure match_result is private to this section.</p>
<p class="endnote">The structure match_results is accessed in 3/cla, 8/ws, 8/bf and here.</p>
<p class="endnote">The structure match_results is accessed in 3/cla, 8/ws, 8/wm, 8/bf and here.</p>
<p class="inwebparagraph"><a id="SP9"></a><b>&#167;9. </b>Match result objects are inherently ephemeral, and we can expect to be
creating them and throwing them away frequently. This must be done
@ -245,9 +245,9 @@ deallocate.
<p class="inwebparagraph"></p>
<p class="endnote">The function Regexp::create_mr is used in <a href="#SP14">&#167;14</a>, 3/cla (<a href="3-cla.html#SP11">&#167;11</a>, <a href="3-cla.html#SP12">&#167;12</a>), 8/ws (<a href="8-ws.html#SP7_3_2">&#167;7.3.2</a>, <a href="8-ws.html#SP7_3_3_2">&#167;7.3.3.2</a>, <a href="8-ws.html#SP7_3_3_2_1">&#167;7.3.3.2.1</a>, <a href="8-ws.html#SP7_2_2_1">&#167;7.2.2.1</a>, <a href="8-ws.html#SP7_2_2_3">&#167;7.2.2.3</a>), 8/bf (<a href="8-bf.html#SP3">&#167;3</a>).</p>
<p class="endnote">The function Regexp::create_mr is used in <a href="#SP14">&#167;14</a>, 3/cla (<a href="3-cla.html#SP11">&#167;11</a>, <a href="3-cla.html#SP12">&#167;12</a>), 8/ws (<a href="8-ws.html#SP7_3_2">&#167;7.3.2</a>, <a href="8-ws.html#SP7_3_3_2">&#167;7.3.3.2</a>, <a href="8-ws.html#SP7_3_3_2_1">&#167;7.3.3.2.1</a>, <a href="8-ws.html#SP7_2_1">&#167;7.2.1</a>, <a href="8-ws.html#SP7_2_2_1">&#167;7.2.2.1</a>, <a href="8-ws.html#SP7_2_2_3">&#167;7.2.2.3</a>), 8/wm (<a href="8-wm.html#SP9">&#167;9</a>), 8/bf (<a href="8-bf.html#SP3">&#167;3</a>).</p>
<p class="endnote">The function Regexp::dispose_of is used in <a href="#SP10">&#167;10</a>, <a href="#SP14">&#167;14</a>, 3/cla (<a href="3-cla.html#SP11">&#167;11</a>), 8/ws (<a href="8-ws.html#SP7_3_2">&#167;7.3.2</a>, <a href="8-ws.html#SP7_3_3_2">&#167;7.3.3.2</a>, <a href="8-ws.html#SP7_3_3_2_1">&#167;7.3.3.2.1</a>, <a href="8-ws.html#SP7_2_2_1">&#167;7.2.2.1</a>, <a href="8-ws.html#SP7_2_2_3">&#167;7.2.2.3</a>), 8/bf (<a href="8-bf.html#SP3">&#167;3</a>).</p>
<p class="endnote">The function Regexp::dispose_of is used in <a href="#SP10">&#167;10</a>, <a href="#SP14">&#167;14</a>, 3/cla (<a href="3-cla.html#SP11">&#167;11</a>), 8/ws (<a href="8-ws.html#SP7_3_2">&#167;7.3.2</a>, <a href="8-ws.html#SP7_3_3_2">&#167;7.3.3.2</a>, <a href="8-ws.html#SP7_3_3_2_1">&#167;7.3.3.2.1</a>, <a href="8-ws.html#SP7_2_1">&#167;7.2.1</a>, <a href="8-ws.html#SP7_2_2_1">&#167;7.2.2.1</a>, <a href="8-ws.html#SP7_2_2_3">&#167;7.2.2.3</a>), 8/wm (<a href="8-wm.html#SP9">&#167;9</a>), 8/bf (<a href="8-bf.html#SP3">&#167;3</a>).</p>
<p class="inwebparagraph"><a id="SP10"></a><b>&#167;10. </b>So, then: the matcher itself.
</p>
@ -294,7 +294,7 @@ deallocate.
<p class="inwebparagraph"></p>
<p class="endnote">The function Regexp::match is used in 3/cla (<a href="3-cla.html#SP11">&#167;11</a>, <a href="3-cla.html#SP12">&#167;12</a>), 8/ws (<a href="8-ws.html#SP7_3_2">&#167;7.3.2</a>, <a href="8-ws.html#SP7_3_3_2">&#167;7.3.3.2</a>, <a href="8-ws.html#SP7_3_3_2_1">&#167;7.3.3.2.1</a>, <a href="8-ws.html#SP7_2_2_1">&#167;7.2.2.1</a>, <a href="8-ws.html#SP7_2_2_3">&#167;7.2.2.3</a>), 8/bf (<a href="8-bf.html#SP3">&#167;3</a>).</p>
<p class="endnote">The function Regexp::match is used in 3/cla (<a href="3-cla.html#SP11">&#167;11</a>, <a href="3-cla.html#SP12">&#167;12</a>), 8/ws (<a href="8-ws.html#SP7_3_2">&#167;7.3.2</a>, <a href="8-ws.html#SP7_3_3_2">&#167;7.3.3.2</a>, <a href="8-ws.html#SP7_3_3_2_1">&#167;7.3.3.2.1</a>, <a href="8-ws.html#SP7_2_1">&#167;7.2.1</a>, <a href="8-ws.html#SP7_2_2_1">&#167;7.2.2.1</a>, <a href="8-ws.html#SP7_2_2_3">&#167;7.2.2.3</a>), 8/wm (<a href="8-wm.html#SP9">&#167;9</a>), 8/bf (<a href="8-bf.html#SP3">&#167;3</a>).</p>
<p class="endnote">The function Regexp::match_from appears nowhere else.</p>

View file

@ -499,7 +499,7 @@ at those positions may well not be, of course.)
<p class="endnote">The function Str::eq is used in 2/dl (<a href="2-dl.html#SP9">&#167;9</a>), 2/dct (<a href="2-dct.html#SP7_3">&#167;7.3</a>), 3/pth (<a href="3-pth.html#SP3">&#167;3</a>), 3/fln (<a href="3-fln.html#SP11">&#167;11</a>), 8/ws (<a href="8-ws.html#SP7_1">&#167;7.1</a>), 8/bdfw (<a href="8-bdfw.html#SP6">&#167;6</a>).</p>
<p class="endnote">The function Str::eq_insensitive appears nowhere else.</p>
<p class="endnote">The function Str::eq_insensitive is used in 8/wm (<a href="8-wm.html#SP9">&#167;9</a>, <a href="8-wm.html#SP9_1">&#167;9.1</a>).</p>
<p class="endnote">The function Str::ne is used in 7/vn (<a href="7-vn.html#SP8">&#167;8</a>), 8/bf (<a href="8-bf.html#SP8">&#167;8</a>).</p>
@ -802,6 +802,16 @@ for the staff of a publishing house.)
<span class="plain">}</span>
<span class="reserved">return</span><span class="plain"> </span><span class="constant">FALSE</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Str::includes_at</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">line</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">i</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">pattern</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::len</span><span class="plain">(</span><span class="identifier">pattern</span><span class="plain">) == </span><span class="constant">0</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="constant">FALSE</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">i</span><span class="plain"> &lt; </span><span class="constant">0</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="constant">FALSE</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">i</span><span class="plain"> + </span><span class="functiontext">Str::len</span><span class="plain">(</span><span class="identifier">pattern</span><span class="plain">) &gt; </span><span class="functiontext">Str::len</span><span class="plain">(</span><span class="identifier">line</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="constant">FALSE</span><span class="plain">;</span>
<span class="identifier">LOOP_THROUGH_TEXT</span><span class="plain">(</span><span class="identifier">pos</span><span class="plain">, </span><span class="identifier">pattern</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::get</span><span class="plain">(</span><span class="identifier">pos</span><span class="plain">) != </span><span class="functiontext">Str::get_at</span><span class="plain">(</span><span class="identifier">line</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">++))</span>
<span class="reserved">return</span><span class="plain"> </span><span class="constant">FALSE</span><span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="constant">TRUE</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
@ -816,6 +826,8 @@ for the staff of a publishing house.)
<p class="endnote">The function Str::includes appears nowhere else.</p>
<p class="endnote">The function Str::includes_at appears nowhere else.</p>
<p class="inwebparagraph"><a id="SP26"></a><b>&#167;26. Shim for literal storage. </b>This is where all of those I-literals created by Inweb are stored at run-time.
Note that every instance of, say, <code class="display"><span class="extract">I"fish"</span></code> would return the same string,
that is, the same <code class="display"><span class="extract">text_stream *</span></code> value. To prevent nasty accidents, this
@ -866,7 +878,7 @@ is run just once per I-literal in the source code, when the program starts up.
<p class="endnote">This code is used in <a href="#SP26">&#167;26</a>.</p>
<hr class="tocbar">
<ul class="toc"><li><a href="4-ws.html">Back to 'Wide Strings.w'</a></li><li><a href="4-tf.html">Continue with 'Text Files'</a></li></ul><hr class="tocbar">
<ul class="toc"><li><a href="4-ws.html">Back to 'Wide Strings'</a></li><li><a href="4-tf.html">Continue with 'Text Files'</a></li></ul><hr class="tocbar">
<!--End of weave-->
</main>
</body>

View file

@ -525,7 +525,7 @@ trie in turn until one matches (if it does).
<p class="inwebparagraph"></p>
<p class="endnote">The function Tries::log_avinue is used in 1/fnd (<a href="1-fnd.html#SP8_3">&#167;8.3</a>).</p>
<p class="endnote">The function Tries::log_avinue is used in 1/fm (<a href="1-fm.html#SP8_3">&#167;8.3</a>).</p>
<p class="endnote">The function Tries::log appears nowhere else.</p>

View file

@ -393,7 +393,7 @@ marks, and that will have to do.
<pre class="displaydefn">
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">c</span><span class="plain">&lt;</span><span class="constant">0xC0</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="character">'?'</span><span class="plain">; </span><span class="comment"> malformed UTF-8</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">c</span><span class="plain">&lt;</span><span class="constant">0xC0</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="character">'?'</span><span class="plain">; /* </span><span class="identifier">malformed</span><span class="plain"> </span><span class="identifier">UTF</span><span class="plain">-8 */</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">c</span><span class="plain">&lt;</span><span class="constant">0xE0</span><span class="plain">) { </span><span class="identifier">c</span><span class="plain"> = </span><span class="identifier">c</span><span class="plain"> &amp; </span><span class="constant">0x1f</span><span class="plain">; </span><span class="identifier">conts</span><span class="plain"> = </span><span class="constant">1</span><span class="plain">; }</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">c</span><span class="plain">&lt;</span><span class="constant">0xF0</span><span class="plain">) { </span><span class="identifier">c</span><span class="plain"> = </span><span class="identifier">c</span><span class="plain"> &amp; </span><span class="constant">0xf</span><span class="plain">; </span><span class="identifier">conts</span><span class="plain"> = </span><span class="constant">2</span><span class="plain">; }</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">c</span><span class="plain">&lt;</span><span class="constant">0xF8</span><span class="plain">) { </span><span class="identifier">c</span><span class="plain"> = </span><span class="identifier">c</span><span class="plain"> &amp; </span><span class="constant">0x7</span><span class="plain">; </span><span class="identifier">conts</span><span class="plain"> = </span><span class="constant">3</span><span class="plain">; }</span>
@ -402,7 +402,7 @@ marks, and that will have to do.
<span class="reserved">while</span><span class="plain"> (</span><span class="identifier">conts</span><span class="plain"> &gt; </span><span class="constant">0</span><span class="plain">) {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">d</span><span class="plain"> = </span><span class="identifier">EOF</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">from</span><span class="plain">) </span><span class="identifier">d</span><span class="plain"> = </span><span class="identifier">fgetc</span><span class="plain">(</span><span class="identifier">from</span><span class="plain">); </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">or_from</span><span class="plain">) </span><span class="identifier">d</span><span class="plain"> = ((</span><span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">char</span><span class="plain">) *((*</span><span class="identifier">or_from</span><span class="plain">)++));</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">d</span><span class="plain"> == </span><span class="identifier">EOF</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="character">'?'</span><span class="plain">; </span><span class="comment"> malformed UTF-8</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">d</span><span class="plain"> == </span><span class="identifier">EOF</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="character">'?'</span><span class="plain">; /* </span><span class="identifier">malformed</span><span class="plain"> </span><span class="identifier">UTF</span><span class="plain">-8 */</span>
<span class="identifier">c</span><span class="plain"> = </span><span class="identifier">c</span><span class="plain"> &lt;&lt; </span><span class="constant">6</span><span class="plain">;</span>
<span class="identifier">c</span><span class="plain"> = </span><span class="identifier">c</span><span class="plain"> + (</span><span class="identifier">d</span><span class="plain"> &amp; </span><span class="constant">0x3F</span><span class="plain">);</span>
<span class="identifier">conts</span><span class="plain">--;</span>
@ -436,7 +436,7 @@ in scientific notation.
<pre class="displaydefn">
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">c</span><span class="plain"> == </span><span class="constant">0xa1</span><span class="plain">) || (</span><span class="identifier">c</span><span class="plain"> == </span><span class="constant">0xa3</span><span class="plain">) || (</span><span class="identifier">c</span><span class="plain"> == </span><span class="constant">0xbf</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">c</span><span class="plain">; </span><span class="comment"> pound sign, inverted ! and ?</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">c</span><span class="plain"> == </span><span class="constant">0xd7</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="character">'x'</span><span class="plain">; </span><span class="comment"> convert multiplication sign to lower case "x"</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">c</span><span class="plain"> == </span><span class="constant">0xd7</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="character">'x'</span><span class="plain">; /* </span><span class="identifier">convert</span><span class="plain"> </span><span class="identifier">multiplication</span><span class="plain"> </span><span class="identifier">sign</span><span class="plain"> </span><span class="identifier">to</span><span class="plain"> </span><span class="identifier">lower</span><span class="plain"> </span><span class="reserved">case</span><span class="plain"> </span><span class="string">"x"</span><span class="plain"> */</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">c</span><span class="plain"> &gt;= </span><span class="constant">0xc0</span><span class="plain">) &amp;&amp; (</span><span class="identifier">c</span><span class="plain"> &lt;= </span><span class="constant">0xff</span><span class="plain">)) { </span><span class="comment"> accented West European letters, but...</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">c</span><span class="plain"> != </span><span class="constant">0xd0</span><span class="plain">) &amp;&amp; (</span><span class="identifier">c</span><span class="plain"> != </span><span class="constant">0xf0</span><span class="plain">) &amp;&amp; </span><span class="comment"> not Icelandic eths</span>
<span class="plain">(</span><span class="identifier">c</span><span class="plain"> != </span><span class="constant">0xde</span><span class="plain">) &amp;&amp; (</span><span class="identifier">c</span><span class="plain"> != </span><span class="constant">0xfe</span><span class="plain">) &amp;&amp; </span><span class="comment"> nor Icelandic thorns</span>
@ -462,13 +462,13 @@ hyphens into em-rules when they are flanked by spaces, and so on.
<pre class="displaydefn">
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">c</span><span class="plain"> == </span><span class="constant">0x85</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="character">'\x0d'</span><span class="plain">; </span><span class="comment"> NEL, or "next line"</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">c</span><span class="plain"> == </span><span class="constant">0xa0</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="character">' '</span><span class="plain">; </span><span class="comment"> non-breaking space</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">c</span><span class="plain"> &gt;= </span><span class="constant">0x2000</span><span class="plain">) &amp;&amp; (</span><span class="identifier">c</span><span class="plain"> &lt;= </span><span class="constant">0x200a</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="character">' '</span><span class="plain">; </span><span class="comment"> space variants</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">c</span><span class="plain"> &gt;= </span><span class="constant">0x2010</span><span class="plain">) &amp;&amp; (</span><span class="identifier">c</span><span class="plain"> &lt;= </span><span class="constant">0x2014</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="character">'-'</span><span class="plain">; </span><span class="comment"> rules and dashes</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">c</span><span class="plain"> &gt;= </span><span class="constant">0x2018</span><span class="plain">) &amp;&amp; (</span><span class="identifier">c</span><span class="plain"> &lt;= </span><span class="constant">0x2019</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="character">'\''</span><span class="plain">; </span><span class="comment"> smart single quotes</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">c</span><span class="plain"> &gt;= </span><span class="constant">0x201c</span><span class="plain">) &amp;&amp; (</span><span class="identifier">c</span><span class="plain"> &lt;= </span><span class="constant">0x201d</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="character">'"'</span><span class="plain">; </span><span class="comment"> smart double quotes</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">c</span><span class="plain"> &gt;= </span><span class="constant">0x2028</span><span class="plain">) &amp;&amp; (</span><span class="identifier">c</span><span class="plain"> &lt;= </span><span class="constant">0x2029</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="character">'\x0d'</span><span class="plain">; </span><span class="comment"> fancy newlines</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">c</span><span class="plain"> == </span><span class="constant">0x85</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="character">'\x0d'</span><span class="plain">; /* </span><span class="identifier">NEL</span><span class="plain">, </span><span class="identifier">or</span><span class="plain"> </span><span class="string">"next line"</span><span class="plain"> */</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">c</span><span class="plain"> == </span><span class="constant">0xa0</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="character">' '</span><span class="plain">; /* </span><span class="identifier">non</span><span class="plain">-</span><span class="identifier">breaking</span><span class="plain"> </span><span class="identifier">space</span><span class="plain"> */</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">c</span><span class="plain"> &gt;= </span><span class="constant">0x2000</span><span class="plain">) &amp;&amp; (</span><span class="identifier">c</span><span class="plain"> &lt;= </span><span class="constant">0x200a</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="character">' '</span><span class="plain">; /* </span><span class="identifier">space</span><span class="plain"> </span><span class="identifier">variants</span><span class="plain"> */</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">c</span><span class="plain"> &gt;= </span><span class="constant">0x2010</span><span class="plain">) &amp;&amp; (</span><span class="identifier">c</span><span class="plain"> &lt;= </span><span class="constant">0x2014</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="character">'-'</span><span class="plain">; /* </span><span class="identifier">rules</span><span class="plain"> </span><span class="identifier">and</span><span class="plain"> </span><span class="identifier">dashes</span><span class="plain"> */</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">c</span><span class="plain"> &gt;= </span><span class="constant">0x2018</span><span class="plain">) &amp;&amp; (</span><span class="identifier">c</span><span class="plain"> &lt;= </span><span class="constant">0x2019</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="character">'\''</span><span class="plain">; /* </span><span class="identifier">smart</span><span class="plain"> </span><span class="identifier">single</span><span class="plain"> </span><span class="identifier">quotes</span><span class="plain"> */</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">c</span><span class="plain"> &gt;= </span><span class="constant">0x201c</span><span class="plain">) &amp;&amp; (</span><span class="identifier">c</span><span class="plain"> &lt;= </span><span class="constant">0x201d</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="character">'"'</span><span class="plain">; /* </span><span class="identifier">smart</span><span class="plain"> </span><span class="reserved">double</span><span class="plain"> </span><span class="identifier">quotes</span><span class="plain"> */</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">c</span><span class="plain"> &gt;= </span><span class="constant">0x2028</span><span class="plain">) &amp;&amp; (</span><span class="identifier">c</span><span class="plain"> &lt;= </span><span class="constant">0x2029</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="character">'\x0d'</span><span class="plain">; /* </span><span class="identifier">fancy</span><span class="plain"> </span><span class="identifier">newlines</span><span class="plain"> */</span>
</pre>
<p class="inwebparagraph"></p>

View file

@ -1,7 +1,7 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Wide Strings.w</title>
<title>Wide Strings</title>
<meta name="viewport" content="width=device-width initial-scale=1">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta http-equiv="Content-Language" content="en-gb">
@ -23,8 +23,8 @@
</nav>
<main role="main">
<!--Weave of 'Wide Strings.w' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="index.html">foundation</a></li><li><a href="index.html#4">Chapter 4: Text Handling</a></li><li><b>Wide Strings.w</b></li></ul><p class="purpose">A minimal library for handling wide C strings.</p>
<!--Weave of 'Wide Strings' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="index.html">foundation</a></li><li><a href="index.html#4">Chapter 4: Text Handling</a></li><li><b>Wide Strings</b></li></ul><p class="purpose">A minimal library for handling wide C strings.</p>
<p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. </b>By "wide string", we mean an array of <code class="display"><span class="extract">wchar_t</span></code>. A pointer to this type
is what is returned by an L-literal in ANSI C, such as <code class="display"><span class="extract">L"look, I'm wide"</span></code>.

View file

@ -480,9 +480,9 @@ images" at the ThreePress Consulting blog.)
<span class="identifier">content</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"&lt;?xml version='1.0' encoding='utf-8'?&gt;\n"</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"&lt;package xmlns=\"http:</span><span class="comment">www.idpf.org/2007/opf\"\n");</span>
<span class="string">WRITE("</span><span class="identifier">xmlns:dc</span><span class="plain">=\</span><span class="string">"http:</span><span class="comment">purl.org/dc/elements/1.1/\"\n");</span>
<span class="string">WRITE("</span><span class="identifier">unique</span><span class="plain">-</span><span class="identifier">identifier</span><span class="plain">=\</span><span class="string">"bookid\" version=\"2.0\"&gt;\n"</span><span class="plain">); </span><span class="constant">INDENT</span><span class="plain">;</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"&lt;package xmlns=\"http://www.idpf.org/2007/opf\"\n"</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"xmlns:dc=\"http://purl.org/dc/elements/1.1/\"\n"</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"unique-identifier=\"bookid\" version=\"2.0\"&gt;\n"</span><span class="plain">); </span><span class="constant">INDENT</span><span class="plain">;</span>
&lt;<span class="cwebmacro">Write the OPF metadata</span> <span class="cwebmacronumber">7.2.1</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Write the OPF manifest</span> <span class="cwebmacronumber">7.2.2</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Write the OPF spine</span> <span class="cwebmacronumber">7.2.3</span>&gt;<span class="plain">;</span>
@ -663,15 +663,15 @@ impaired people.
<span class="identifier">toc</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"&lt;?xml version='1.0' encoding='utf-8'?&gt;\n"</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"&lt;!DOCTYPE ncx PUBLIC \"-</span><span class="comment">NISO//DTD ncx 2005-1//EN\"\n");</span>
<span class="string">WRITE("</span><span class="plain"> \</span><span class="string">"http:</span><span class="comment">www.daisy.org/z3986/2005/ncx-2005-1.dtd\"&gt;\n");</span>
<span class="string">WRITE("</span><span class="plain">&lt;</span><span class="identifier">ncx</span><span class="plain"> </span><span class="identifier">xmlns</span><span class="plain">=\</span><span class="string">"http:</span><span class="comment">www.daisy.org/z3986/2005/ncx/\" version=\"2005-1\"&gt;\n");</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"&lt;!DOCTYPE ncx PUBLIC \"-//NISO//DTD ncx 2005-1//EN\"\n"</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" \"http://www.daisy.org/z3986/2005/ncx-2005-1.dtd\"&gt;\n"</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"&lt;ncx xmlns=\"http://www.daisy.org/z3986/2005/ncx/\" version=\"2005-1\"&gt;\n"</span><span class="plain">);</span>
<span class="string">int depth = 1; </span><span class="comment"> there are surely at least sections</span>
<span class="string">if (LinkedLists::len(B-&gt;ebook_chapter_list) &gt; 0) depth = 2;</span>
<span class="string">if (LinkedLists::len(B-&gt;ebook_volume_list) &gt; 0) depth = 3;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">depth</span><span class="plain"> = </span><span class="constant">1</span><span class="plain">; </span><span class="comment"> there are surely at least sections</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">LinkedLists::len</span><span class="plain">(</span><span class="identifier">B</span><span class="plain">-&gt;</span><span class="element">ebook_chapter_list</span><span class="plain">) &gt; </span><span class="constant">0</span><span class="plain">) </span><span class="identifier">depth</span><span class="plain"> = </span><span class="constant">2</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">LinkedLists::len</span><span class="plain">(</span><span class="identifier">B</span><span class="plain">-&gt;</span><span class="element">ebook_volume_list</span><span class="plain">) &gt; </span><span class="constant">0</span><span class="plain">) </span><span class="identifier">depth</span><span class="plain"> = </span><span class="constant">3</span><span class="plain">;</span>
&lt;<span class="cwebmacro">Write the NCX metadata</span> <span class="cwebmacronumber">7.3.1</span>&gt;<span class="string">;</span>
&lt;<span class="cwebmacro">Write the NCX metadata</span> <span class="cwebmacronumber">7.3.1</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Write the NCX navigation map</span> <span class="cwebmacronumber">7.3.2</span>&gt;<span class="plain">;</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"&lt;/ncx&gt;\n"</span><span class="plain">);</span>

View file

@ -268,17 +268,17 @@ of which are variadic and have to be written out the old-fashioned way:
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">HTML::begin_head</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">CSS_file</span><span class="plain">) {</span>
<span class="reserved">HTML_file_state</span><span class="plain"> *</span><span class="identifier">hs</span><span class="plain"> = </span><span class="functiontext">Streams::get_HTML_file_state</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">hs</span><span class="plain">) &amp;&amp; (</span><span class="identifier">hs</span><span class="plain">-&gt;</span><span class="element">XHTML_flag</span><span class="plain">)) {</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"&lt;!DOCTYPE html PUBLIC \"-</span><span class="comment">W3C//DTD XHTML 1.1//EN\" ");</span>
<span class="string">WRITE("</span><span class="plain">\</span><span class="string">"http:</span><span class="comment">www.w3.org/TR/xhtml11/DTD/xhtml11.dtd\"&gt;\n");</span>
<span class="string">HTML_OPEN_WITH("</span><span class="identifier">html</span><span class="string">", "</span><span class="identifier">xmlns</span><span class="plain">=\</span><span class="string">"http:</span><span class="comment">www.w3.org/1999/xhtml\"");</span>
<span class="string">} else {</span>
<span class="string">WRITE("</span><span class="plain">&lt;!</span><span class="identifier">DOCTYPE</span><span class="plain"> </span><span class="identifier">html</span><span class="plain"> </span><span class="identifier">PUBLIC</span><span class="plain"> \</span><span class="string">"-</span><span class="comment">W3C//DTD HTML 4.01 Transitional//EN\" ");</span>
<span class="string">WRITE("</span><span class="plain">\</span><span class="string">"http:</span><span class="comment">www.w3.org/TR/html4/loose.dtd\"&gt;\n");</span>
<span class="string">HTML_OPEN("</span><span class="identifier">html</span><span class="string">");</span>
<span class="string">}</span>
<span class="string">WRITE("</span><span class="plain">\</span><span class="identifier">n</span><span class="string">");</span>
<span class="string">HTML_OPEN("</span><span class="identifier">head</span><span class="string">");</span>
<span class="string">HTML_TAG_WITH("</span><span class="identifier">meta</span><span class="string">", "</span><span class="identifier">http</span><span class="plain">-</span><span class="identifier">equiv</span><span class="plain">=\</span><span class="string">"Content-Type\" content=\"text/html; charset=UTF-8\""</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"&lt;!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.1//EN\" "</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"\"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd\"&gt;\n"</span><span class="plain">);</span>
<span class="identifier">HTML_OPEN_WITH</span><span class="plain">(</span><span class="string">"html"</span><span class="plain">, </span><span class="string">"xmlns=\"http://www.w3.org/1999/xhtml\""</span><span class="plain">);</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"&lt;!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" "</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"\"http://www.w3.org/TR/html4/loose.dtd\"&gt;\n"</span><span class="plain">);</span>
<span class="identifier">HTML_OPEN</span><span class="plain">(</span><span class="string">"html"</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"\n"</span><span class="plain">);</span>
<span class="identifier">HTML_OPEN</span><span class="plain">(</span><span class="string">"head"</span><span class="plain">);</span>
<span class="identifier">HTML_TAG_WITH</span><span class="plain">(</span><span class="string">"meta"</span><span class="plain">, </span><span class="string">"http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\""</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">CSS_file</span><span class="plain">)</span>
<span class="identifier">HTML_TAG_WITH</span><span class="plain">(</span><span class="string">"link"</span><span class="plain">, </span><span class="string">"href=\"%/f\" rel=\"stylesheet\" type=\"text/css\""</span><span class="plain">, </span><span class="identifier">CSS_file</span><span class="plain">);</span>
<span class="plain">}</span>

View file

@ -193,7 +193,7 @@ to catch this sort of slip.
<p class="inwebparagraph"></p>
<p class="endnote">The function VersionNumbers::writer is used in 1/fnd (<a href="1-fnd.html#SP8_1">&#167;8.1</a>).</p>
<p class="endnote">The function VersionNumbers::writer is used in 1/fm (<a href="1-fm.html#SP8_1">&#167;8.1</a>).</p>
<p class="inwebparagraph"><a id="SP7"></a><b>&#167;7. </b>Parsing is much more of a slog. The following returns a null version if
the text <code class="display"><span class="extract">T</span></code> is in any respect malformed, i.e., if it deviates from the

View file

@ -111,6 +111,7 @@ convenient to store them directly here than to use a dictionary.
<span class="identifier">bd</span><span class="plain"> = </span><span class="functiontext">Bibliographic::set_datum</span><span class="plain">(</span><span class="identifier">Wm</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"TeX Mathematics Notation"</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"On"</span><span class="plain">); </span><span class="identifier">bd</span><span class="plain">-&gt;</span><span class="element">on_or_off</span><span class="plain"> = </span><span class="constant">TRUE</span><span class="plain">;</span>
<span class="identifier">bd</span><span class="plain"> = </span><span class="functiontext">Bibliographic::set_datum</span><span class="plain">(</span><span class="identifier">Wm</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Code In Commentary Notation"</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"|"</span><span class="plain">);</span>
<span class="identifier">bd</span><span class="plain"> = </span><span class="functiontext">Bibliographic::set_datum</span><span class="plain">(</span><span class="identifier">Wm</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Code In Code Comments Notation"</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"|"</span><span class="plain">);</span>
<span class="identifier">bd</span><span class="plain"> = </span><span class="functiontext">Bibliographic::set_datum</span><span class="plain">(</span><span class="identifier">Wm</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Cross-References Notation"</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"//"</span><span class="plain">);</span>
<span class="identifier">bd</span><span class="plain"> = </span><span class="functiontext">Bibliographic::set_datum</span><span class="plain">(</span><span class="identifier">Wm</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Web Syntax Version"</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>

View file

@ -26,7 +26,7 @@
<!--Weave of 'Web Modules' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="index.html">foundation</a></li><li><a href="index.html#8">Chapter 8: Literate Programming</a></li><li><b>Web Modules</b></li></ul><p class="purpose">To search for included modules, and track dependencies between them.</p>
<ul class="toc"><li><a href="#SP1">&#167;1. Creation</a></li><li><a href="#SP4">&#167;4. Dependencies</a></li><li><a href="#SP5">&#167;5. Searching</a></li></ul><hr class="tocbar">
<ul class="toc"><li><a href="#SP1">&#167;1. Creation</a></li><li><a href="#SP4">&#167;4. Dependencies</a></li><li><a href="#SP5">&#167;5. Searching</a></li><li><a href="#SP9">&#167;9. Resolving cross-reference names</a></li></ul><hr class="tocbar">
<p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. Creation. </b>Each web of source material discovered by Inweb is given one of the following.
Ordinarily these are found only when reading in a web for weaving, tangling
@ -51,6 +51,7 @@ means.
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">linked_list</span><span class="plain"> *</span><span class="identifier">dependencies</span><span class="plain">; </span><span class="comment"> of <code class="display"><span class="extract">module</span></code>: which other modules does this need?</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">module_tag</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">origin_marker</span><span class="plain">; </span><span class="comment"> one of the <code class="display"><span class="extract">*_MOM</span></code> values above</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">linked_list</span><span class="plain"> *</span><span class="identifier">chapters_md</span><span class="plain">; </span><span class="comment"> of <code class="display"><span class="extract">chapter_md</span></code>: just the ones in this module</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">linked_list</span><span class="plain"> *</span><span class="identifier">sections_md</span><span class="plain">; </span><span class="comment"> of <code class="display"><span class="extract">section_md</span></code>: just the ones in this module</span>
<span class="constant">MEMORY_MANAGEMENT</span>
<span class="plain">} </span><span class="reserved">module</span><span class="plain">;</span>
@ -70,6 +71,7 @@ means.
<span class="identifier">M</span><span class="plain">-&gt;</span><span class="element">dependencies</span><span class="plain"> = </span><span class="identifier">NEW_LINKED_LIST</span><span class="plain">(</span><span class="reserved">module</span><span class="plain">);</span>
<span class="identifier">M</span><span class="plain">-&gt;</span><span class="element">origin_marker</span><span class="plain"> = </span><span class="identifier">m</span><span class="plain">;</span>
<span class="identifier">M</span><span class="plain">-&gt;</span><span class="element">module_tag</span><span class="plain"> = </span><span class="identifier">I</span><span class="string">"miscellaneous"</span><span class="plain">;</span>
<span class="identifier">M</span><span class="plain">-&gt;</span><span class="element">chapters_md</span><span class="plain"> = </span><span class="identifier">NEW_LINKED_LIST</span><span class="plain">(</span><span class="reserved">chapter_md</span><span class="plain">);</span>
<span class="identifier">M</span><span class="plain">-&gt;</span><span class="element">sections_md</span><span class="plain"> = </span><span class="identifier">NEW_LINKED_LIST</span><span class="plain">(</span><span class="reserved">section_md</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">M</span><span class="plain">;</span>
<span class="plain">}</span>
@ -206,6 +208,143 @@ sought if it looks like a web.
<p class="endnote">The function WebModules::exists is used in <a href="#SP7">&#167;7</a>.</p>
<p class="inwebparagraph"><a id="SP9"></a><b>&#167;9. Resolving cross-reference names. </b>Suppose we are in module <code class="display"><span class="extract">from_M</span></code> and want to understand which section of
a relevant web <code class="display"><span class="extract">text</span></code> might refer to. It could be the name of a module,
either this one or one dependent on it; or the name of a chapter in one
of those, or the shortened forms of those; or the name of a section. It
may match multiple possibilities: we return how many, and if this is
positive, we write the module in which the first find was made in <code class="display"><span class="extract">*return M</span></code>,
the section in <code class="display"><span class="extract">*return_Sm</span></code>, and set the flag <code class="display"><span class="extract">*named_as_module</span></code> according
to whether the reference was a bare module name (say, "foundation") or not.
</p>
<p class="inwebparagraph">Note that we consider first the possibilities within <code class="display"><span class="extract">from_M</span></code>: we only
look at other modules if there are none. Thus, an unambiguous result in
<code class="display"><span class="extract">from_M</span></code> is good enough, even if there are other possibilities elsewhere.
</p>
<p class="inwebparagraph">A reference in the form <code class="display"><span class="extract">module: reference</span></code> is taken to be in the module
of that name: for example, <code class="display"><span class="extract">"foundation: Web Modules"</span></code> would find the
section of code you are now reading.
</p>
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">WebModules::named_reference</span><span class="plain">(</span><span class="reserved">module</span><span class="plain"> **</span><span class="identifier">return_M</span><span class="plain">, </span><span class="reserved">section_md</span><span class="plain"> **</span><span class="identifier">return_Sm</span><span class="plain">,</span>
<span class="reserved">int</span><span class="plain"> *</span><span class="identifier">named_as_module</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">title</span><span class="plain">, </span><span class="reserved">module</span><span class="plain"> *</span><span class="identifier">from_M</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">text</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">list</span><span class="plain">) {</span>
<span class="plain">*</span><span class="identifier">return_M</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">; *</span><span class="identifier">return_Sm</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">; *</span><span class="identifier">named_as_module</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
<span class="reserved">module</span><span class="plain"> *</span><span class="identifier">M</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">finds</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">from_M</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="constant">0</span><span class="plain">;</span>
<span class="reserved">match_results</span><span class="plain"> </span><span class="identifier">mr</span><span class="plain"> = </span><span class="functiontext">Regexp::create_mr</span><span class="plain">();</span>
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">seek</span><span class="plain"> = </span><span class="identifier">text</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">text</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"(%C+?): *(%c+?) *"</span><span class="plain">)) {</span>
<span class="identifier">LOOP_OVER_LINKED_LIST</span><span class="plain">(</span><span class="identifier">M</span><span class="plain">, </span><span class="reserved">module</span><span class="plain">, </span><span class="identifier">from_M</span><span class="plain">-&gt;</span><span class="element">dependencies</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq_insensitive</span><span class="plain">(</span><span class="identifier">M</span><span class="plain">-&gt;</span><span class="element">module_name</span><span class="plain">, </span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[0])) {</span>
<span class="identifier">seek</span><span class="plain"> = </span><span class="identifier">mr</span><span class="plain">.</span><span class="identifier">exp</span><span class="plain">[1];</span>
&lt;<span class="cwebmacro">Look for references to chapters or sections in M</span> <span class="cwebmacronumber">9.1</span>&gt;<span class="plain">;</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="functiontext">Regexp::dispose_of</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">);</span>
<span class="identifier">seek</span><span class="plain"> = </span><span class="identifier">text</span><span class="plain">;</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">stage</span><span class="plain"> = </span><span class="constant">1</span><span class="plain">; ((</span><span class="identifier">finds</span><span class="plain"> == </span><span class="constant">0</span><span class="plain">) &amp;&amp; (</span><span class="identifier">stage</span><span class="plain"> &lt;= </span><span class="constant">2</span><span class="plain">)); </span><span class="identifier">stage</span><span class="plain">++) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">stage</span><span class="plain"> == </span><span class="constant">1</span><span class="plain">) {</span>
<span class="identifier">M</span><span class="plain"> = </span><span class="identifier">from_M</span><span class="plain">;</span>
&lt;<span class="cwebmacro">Look for references to chapters or sections in M</span> <span class="cwebmacronumber">9.1</span>&gt;<span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">stage</span><span class="plain"> == </span><span class="constant">2</span><span class="plain">) {</span>
<span class="identifier">LOOP_OVER_LINKED_LIST</span><span class="plain">(</span><span class="identifier">M</span><span class="plain">, </span><span class="reserved">module</span><span class="plain">, </span><span class="identifier">from_M</span><span class="plain">-&gt;</span><span class="element">dependencies</span><span class="plain">)</span>
&lt;<span class="cwebmacro">Look for references to chapters or sections in M</span> <span class="cwebmacronumber">9.1</span>&gt;<span class="plain">;</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">finds</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function WebModules::named_reference appears nowhere else.</p>
<p class="inwebparagraph"><a id="SP9_1"></a><b>&#167;9.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Look for references to chapters or sections in M</span> <span class="cwebmacronumber">9.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">M</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"no module"</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq_insensitive</span><span class="plain">(</span><span class="identifier">M</span><span class="plain">-&gt;</span><span class="element">module_name</span><span class="plain">, </span><span class="identifier">seek</span><span class="plain">))</span>
&lt;<span class="cwebmacro">Found first section in module</span> <span class="cwebmacronumber">9.1.1</span>&gt;<span class="plain">;</span>
<span class="reserved">chapter_md</span><span class="plain"> *</span><span class="identifier">Cm</span><span class="plain">;</span>
<span class="reserved">section_md</span><span class="plain"> *</span><span class="identifier">Sm</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER_LINKED_LIST</span><span class="plain">(</span><span class="identifier">Cm</span><span class="plain">, </span><span class="reserved">chapter_md</span><span class="plain">, </span><span class="identifier">M</span><span class="plain">-&gt;</span><span class="element">chapters_md</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="functiontext">Str::eq_insensitive</span><span class="plain">(</span><span class="identifier">Cm</span><span class="plain">-&gt;</span><span class="element">ch_title</span><span class="plain">, </span><span class="identifier">seek</span><span class="plain">)) ||</span>
<span class="plain">(</span><span class="functiontext">Str::eq_insensitive</span><span class="plain">(</span><span class="identifier">Cm</span><span class="plain">-&gt;</span><span class="element">ch_basic_title</span><span class="plain">, </span><span class="identifier">seek</span><span class="plain">)) ||</span>
<span class="plain">(</span><span class="functiontext">Str::eq_insensitive</span><span class="plain">(</span><span class="identifier">Cm</span><span class="plain">-&gt;</span><span class="element">ch_decorated_title</span><span class="plain">, </span><span class="identifier">seek</span><span class="plain">)))</span>
&lt;<span class="cwebmacro">Found first section in chapter</span> <span class="cwebmacronumber">9.1.2</span>&gt;<span class="plain">;</span>
<span class="identifier">LOOP_OVER_LINKED_LIST</span><span class="plain">(</span><span class="identifier">Sm</span><span class="plain">, </span><span class="reserved">section_md</span><span class="plain">, </span><span class="identifier">Cm</span><span class="plain">-&gt;</span><span class="element">sections_md</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq_insensitive</span><span class="plain">(</span><span class="identifier">Sm</span><span class="plain">-&gt;</span><span class="element">sect_title</span><span class="plain">, </span><span class="identifier">seek</span><span class="plain">))</span>
&lt;<span class="cwebmacro">Found section by name</span> <span class="cwebmacronumber">9.1.3</span>&gt;<span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP9">&#167;9</a> (three times).</p>
<p class="inwebparagraph"><a id="SP9_1_1"></a><b>&#167;9.1.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Found first section in module</span> <span class="cwebmacronumber">9.1.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">finds</span><span class="plain">++;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">finds</span><span class="plain"> == </span><span class="constant">1</span><span class="plain">) {</span>
<span class="plain">*</span><span class="identifier">return_M</span><span class="plain"> = </span><span class="identifier">M</span><span class="plain">; *</span><span class="identifier">return_Sm</span><span class="plain"> = </span><span class="identifier">FIRST_IN_LINKED_LIST</span><span class="plain">(</span><span class="reserved">section_md</span><span class="plain">, </span><span class="identifier">M</span><span class="plain">-&gt;</span><span class="element">sections_md</span><span class="plain">);</span>
<span class="plain">*</span><span class="identifier">named_as_module</span><span class="plain"> = </span><span class="constant">TRUE</span><span class="plain">;</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">title</span><span class="plain">, </span><span class="string">"the %S module"</span><span class="plain">, </span><span class="identifier">M</span><span class="plain">-&gt;</span><span class="element">module_name</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">list</span><span class="plain">) </span><span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="constant">STDERR</span><span class="plain">, </span><span class="string">"(%d) Module '%S'\n"</span><span class="plain">, </span><span class="identifier">finds</span><span class="plain">, </span><span class="identifier">M</span><span class="plain">-&gt;</span><span class="element">module_name</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP9_1">&#167;9.1</a>.</p>
<p class="inwebparagraph"><a id="SP9_1_2"></a><b>&#167;9.1.2. </b><code class="display">
&lt;<span class="cwebmacrodefn">Found first section in chapter</span> <span class="cwebmacronumber">9.1.2</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">finds</span><span class="plain">++;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">finds</span><span class="plain"> == </span><span class="constant">1</span><span class="plain">) {</span>
<span class="plain">*</span><span class="identifier">return_M</span><span class="plain"> = </span><span class="identifier">M</span><span class="plain">; *</span><span class="identifier">return_Sm</span><span class="plain"> = </span><span class="identifier">FIRST_IN_LINKED_LIST</span><span class="plain">(</span><span class="reserved">section_md</span><span class="plain">, </span><span class="identifier">Cm</span><span class="plain">-&gt;</span><span class="element">sections_md</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">title</span><span class="plain">, </span><span class="string">"%S"</span><span class="plain">, </span><span class="identifier">Cm</span><span class="plain">-&gt;</span><span class="element">ch_title</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">list</span><span class="plain">) </span><span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="constant">STDERR</span><span class="plain">, </span><span class="string">"(%d) Chapter '%S'\n"</span><span class="plain">, </span><span class="identifier">finds</span><span class="plain">, </span><span class="identifier">Cm</span><span class="plain">-&gt;</span><span class="element">ch_title</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP9_1">&#167;9.1</a>.</p>
<p class="inwebparagraph"><a id="SP9_1_3"></a><b>&#167;9.1.3. </b><code class="display">
&lt;<span class="cwebmacrodefn">Found section by name</span> <span class="cwebmacronumber">9.1.3</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">finds</span><span class="plain">++;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">finds</span><span class="plain"> == </span><span class="constant">1</span><span class="plain">) {</span>
<span class="plain">*</span><span class="identifier">return_M</span><span class="plain"> = </span><span class="identifier">M</span><span class="plain">; *</span><span class="identifier">return_Sm</span><span class="plain"> = </span><span class="identifier">Sm</span><span class="plain">;</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">title</span><span class="plain">, </span><span class="string">"%S"</span><span class="plain">, </span><span class="identifier">Sm</span><span class="plain">-&gt;</span><span class="element">sect_title</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">list</span><span class="plain">) </span><span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="constant">STDERR</span><span class="plain">, </span><span class="string">"(%d) Section '%S'\n"</span><span class="plain">, </span><span class="identifier">finds</span><span class="plain">, </span><span class="identifier">Sm</span><span class="plain">-&gt;</span><span class="element">sect_title</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP9_1">&#167;9.1</a>.</p>
<hr class="tocbar">
<ul class="toc"><li><a href="8-bdfw.html">Back to 'Bibliographic Data for Webs'</a></li><li><a href="8-bf.html">Continue with 'Build Files'</a></li></ul><hr class="tocbar">
<!--End of weave-->

View file

@ -91,6 +91,8 @@ produce the following metadata structure.
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">chapter_md</span><span class="plain"> {</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">ch_range</span><span class="plain">; </span><span class="comment"> e.g., <code class="display"><span class="extract">P</span></code> for Preliminaries, <code class="display"><span class="extract">7</span></code> for Chapter 7, <code class="display"><span class="extract">C</span></code> for Appendix C</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">ch_title</span><span class="plain">; </span><span class="comment"> e.g., "Chapter 3: Fresh Water Fish"</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">ch_basic_title</span><span class="plain">; </span><span class="comment"> e.g., "Chapter 3"</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">ch_decorated_title</span><span class="plain">; </span><span class="comment"> e.g., "Fresh Water Fish"</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">rubric</span><span class="plain">; </span><span class="comment"> optional; without double-quotation marks</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">ch_language_name</span><span class="plain">; </span><span class="comment"> in which most of the sections are written</span>
@ -127,7 +129,7 @@ produce the following metadata structure.
<p class="inwebparagraph"></p>
<p class="endnote">The structure section_md is accessed in 5/htm and here.</p>
<p class="endnote">The structure section_md is accessed in 5/htm, 8/wm and here.</p>
<p class="inwebparagraph"><a id="SP5"></a><b>&#167;5. Reading from the file system. </b>Webs can be stored in two ways: as a directory containing a multitude of files,
in which case the pathname <code class="display"><span class="extract">P</span></code> is supplied; or as a single file with everything
@ -700,7 +702,17 @@ with the same language as the main web unless stated otherwise.
<pre class="displaydefn">
<span class="reserved">chapter_md</span><span class="plain"> *</span><span class="identifier">Cm</span><span class="plain"> = </span><span class="identifier">CREATE</span><span class="plain">(</span><span class="reserved">chapter_md</span><span class="plain">);</span>
<span class="identifier">Cm</span><span class="plain">-&gt;</span><span class="element">ch_range</span><span class="plain"> = </span><span class="functiontext">Str::duplicate</span><span class="plain">(</span><span class="identifier">new_chapter_range</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">line</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">PRINT</span><span class="plain">(</span><span class="string">"Nullity!\n"</span><span class="plain">);</span>
<span class="identifier">Cm</span><span class="plain">-&gt;</span><span class="element">ch_title</span><span class="plain"> = </span><span class="functiontext">Str::duplicate</span><span class="plain">(</span><span class="identifier">line</span><span class="plain">);</span>
<span class="reserved">match_results</span><span class="plain"> </span><span class="identifier">mr</span><span class="plain"> = </span><span class="functiontext">Regexp::create_mr</span><span class="plain">();</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">Cm</span><span class="plain">-&gt;</span><span class="element">ch_title</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"(%c*?): *(%c*)"</span><span class="plain">)) {</span>
<span class="identifier">Cm</span><span class="plain">-&gt;</span><span class="element">ch_basic_title</span><span class="plain"> = </span><span class="functiontext">Str::duplicate</span><span class="plain">(</span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[0]);</span>
<span class="identifier">Cm</span><span class="plain">-&gt;</span><span class="element">ch_decorated_title</span><span class="plain"> = </span><span class="functiontext">Str::duplicate</span><span class="plain">(</span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[1]);</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
<span class="identifier">Cm</span><span class="plain">-&gt;</span><span class="element">ch_basic_title</span><span class="plain"> = </span><span class="functiontext">Str::duplicate</span><span class="plain">(</span><span class="identifier">Cm</span><span class="plain">-&gt;</span><span class="element">ch_title</span><span class="plain">);</span>
<span class="identifier">Cm</span><span class="plain">-&gt;</span><span class="element">ch_decorated_title</span><span class="plain"> = </span><span class="functiontext">Str::new</span><span class="plain">();</span>
<span class="plain">}</span>
<span class="functiontext">Regexp::dispose_of</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">);</span>
<span class="identifier">Cm</span><span class="plain">-&gt;</span><span class="element">rubric</span><span class="plain"> = </span><span class="functiontext">Str::new</span><span class="plain">();</span>
<span class="identifier">Cm</span><span class="plain">-&gt;</span><span class="element">ch_language_name</span><span class="plain"> = </span><span class="identifier">language_name</span><span class="plain">;</span>
<span class="identifier">Cm</span><span class="plain">-&gt;</span><span class="element">imported</span><span class="plain"> = </span><span class="constant">TRUE</span><span class="plain">;</span>
@ -708,6 +720,7 @@ with the same language as the main web unless stated otherwise.
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">RS</span><span class="plain">-&gt;</span><span class="element">main_web_not_module</span><span class="plain">) </span><span class="identifier">Cm</span><span class="plain">-&gt;</span><span class="identifier">imported</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
<span class="identifier">ADD_TO_LINKED_LIST</span><span class="plain">(</span><span class="identifier">Cm</span><span class="plain">, </span><span class="reserved">chapter_md</span><span class="plain">, </span><span class="identifier">RS</span><span class="plain">-&gt;</span><span class="element">Wm</span><span class="plain">-&gt;</span><span class="element">chapters_md</span><span class="plain">);</span>
<span class="identifier">ADD_TO_LINKED_LIST</span><span class="plain">(</span><span class="identifier">Cm</span><span class="plain">, </span><span class="reserved">chapter_md</span><span class="plain">, </span><span class="identifier">RS</span><span class="plain">-&gt;</span><span class="element">reading_from</span><span class="plain">-&gt;</span><span class="element">chapters_md</span><span class="plain">);</span>
<span class="identifier">RS</span><span class="plain">-&gt;</span><span class="element">chapter_being_scanned</span><span class="plain"> = </span><span class="identifier">Cm</span><span class="plain">;</span>
</pre>
@ -728,7 +741,6 @@ we also read in and process its file.
<pre class="displaydefn">
<span class="reserved">section_md</span><span class="plain"> *</span><span class="identifier">Sm</span><span class="plain"> = </span><span class="identifier">CREATE</span><span class="plain">(</span><span class="reserved">section_md</span><span class="plain">);</span>
<span class="identifier">Sm</span><span class="plain"> = </span><span class="identifier">CREATE</span><span class="plain">(</span><span class="reserved">section_md</span><span class="plain">);</span>
&lt;<span class="cwebmacro">Initialise the section structure</span> <span class="cwebmacronumber">7.2.2.1</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Add the section to the web and the current chapter</span> <span class="cwebmacronumber">7.2.2.2</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Work out the language and tangle target for the section</span> <span class="cwebmacronumber">7.2.2.3</span>&gt;<span class="plain">;</span>

View file

@ -30,7 +30,7 @@
<p><span class="purpose">Absolute basics.</span></p>
<ul class="sectionlist">
<li>
<p><a href="1-fnd.html"><spon class="sectiontitle">Foundation</span></a> -
<p><a href="1-fm.html"><spon class="sectiontitle">Foundation Module</span></a> -
<span class="purpose">Starting up and shutting down.</span></p>
</li>
<li>
@ -128,7 +128,7 @@
<span class="purpose">A minimal library for handling C-style strings.</span></p>
</li>
<li>
<p><a href="4-ws.html"><spon class="sectiontitle">Wide Strings.w</span></a> -
<p><a href="4-ws.html"><spon class="sectiontitle">Wide Strings</span></a> -
<span class="purpose">A minimal library for handling wide C strings.</span></p>
</li>
<li>

View file

@ -517,7 +517,7 @@ source:
<p class="inwebparagraph"></p>
<p class="endnote">The function Main::error_in_web is used in 1/cnf (<a href="1-cnf.html#SP5">&#167;5</a>), 2/tp (<a href="2-tp.html#SP1_1_6_3">&#167;1.1.6.3</a>, <a href="2-tp.html#SP1_1_6_4">&#167;1.1.6.4</a>, <a href="2-tp.html#SP1_1_6_7">&#167;1.1.6.7</a>, <a href="2-tp.html#SP1_1_6_7_1">&#167;1.1.6.7.1</a>, <a href="2-tp.html#SP1_1_6_5_1">&#167;1.1.6.5.1</a>, <a href="2-tp.html#SP1_1_6_5_1_1">&#167;1.1.6.5.1.1</a>, <a href="2-tp.html#SP1_1_6_5_1_2">&#167;1.1.6.5.1.2</a>, <a href="2-tp.html#SP1_1_6_5_1_3">&#167;1.1.6.5.1.3</a>, <a href="2-tp.html#SP1_1_6_5_1_4">&#167;1.1.6.5.1.4</a>, <a href="2-tp.html#SP1_1_6_5_1_7">&#167;1.1.6.5.1.7</a>, <a href="2-tp.html#SP3">&#167;3</a>), 2/ec (<a href="2-ec.html#SP3_1">&#167;3.1</a>, <a href="2-ec.html#SP3_2">&#167;3.2</a>, <a href="2-ec.html#SP3_3">&#167;3.3</a>), 3/ta (<a href="3-ta.html#SP4_1">&#167;4.1</a>), 3/tt (<a href="3-tt.html#SP1_1_1_1">&#167;1.1.1.1</a>, <a href="3-tt.html#SP3_1">&#167;3.1</a>), 4/lm (<a href="4-lm.html#SP8">&#167;8</a>), 4/cl (<a href="4-cl.html#SP2">&#167;2</a>, <a href="4-cl.html#SP2_1">&#167;2.1</a>, <a href="4-cl.html#SP2_4_2_1">&#167;2.4.2.1</a>, <a href="4-cl.html#SP2_4_2_5">&#167;2.4.2.5</a>, <a href="4-cl.html#SP10">&#167;10</a>).</p>
<p class="endnote">The function Main::error_in_web is used in 1/cnf (<a href="1-cnf.html#SP5">&#167;5</a>), 2/tp (<a href="2-tp.html#SP1_1_6_3">&#167;1.1.6.3</a>, <a href="2-tp.html#SP1_1_6_4">&#167;1.1.6.4</a>, <a href="2-tp.html#SP1_1_6_7">&#167;1.1.6.7</a>, <a href="2-tp.html#SP1_1_6_7_1">&#167;1.1.6.7.1</a>, <a href="2-tp.html#SP1_1_6_5_1">&#167;1.1.6.5.1</a>, <a href="2-tp.html#SP1_1_6_5_1_1">&#167;1.1.6.5.1.1</a>, <a href="2-tp.html#SP1_1_6_5_1_2">&#167;1.1.6.5.1.2</a>, <a href="2-tp.html#SP1_1_6_5_1_3">&#167;1.1.6.5.1.3</a>, <a href="2-tp.html#SP1_1_6_5_1_4">&#167;1.1.6.5.1.4</a>, <a href="2-tp.html#SP1_1_6_5_1_7">&#167;1.1.6.5.1.7</a>, <a href="2-tp.html#SP3">&#167;3</a>), 2/ec (<a href="2-ec.html#SP3_1">&#167;3.1</a>, <a href="2-ec.html#SP3_2">&#167;3.2</a>, <a href="2-ec.html#SP3_3">&#167;3.3</a>), 3/ta (<a href="3-ta.html#SP4_1">&#167;4.1</a>), 3/tt (<a href="3-tt.html#SP1_1_1_1">&#167;1.1.1.1</a>, <a href="3-tt.html#SP3_1">&#167;3.1</a>), 4/lm (<a href="4-lm.html#SP8">&#167;8</a>), 4/cl (<a href="4-cl.html#SP2">&#167;2</a>, <a href="4-cl.html#SP2_1">&#167;2.1</a>, <a href="4-cl.html#SP2_4_2_1">&#167;2.4.2.1</a>, <a href="4-cl.html#SP2_4_2_5">&#167;2.4.2.5</a>, <a href="4-cl.html#SP10">&#167;10</a>), 5/fm (<a href="5-fm.html#SP24">&#167;24</a>).</p>
<hr class="tocbar">
<ul class="toc"><li><a href="1-bsc.html">Back to 'Basics'</a></li><li><a href="1-cnf.html">Continue with 'Configuration'</a></li></ul><hr class="tocbar">

View file

@ -60,7 +60,7 @@ to such a name, and to read it in. This structure holds the result:
<p class="inwebparagraph"></p>
<p class="endnote">The structure weave_pattern is accessed in 1/pc, 3/ts, 3/ti, 3/tw, 5/wf, 5/tf, 5/hf, 5/rtt and here.</p>
<p class="endnote">The structure weave_pattern is accessed in 1/pc, 3/ts, 3/ti, 3/tw, 5/fm, 5/tf, 5/hf, 5/rtt and here.</p>
<p class="inwebparagraph"><a id="SP2"></a><b>&#167;2. </b>When a given web needs a pattern with a given name, this is where it comes.
</p>

View file

@ -76,7 +76,7 @@ each of which has a list of <code class="display"><span class="extract">section<
<p class="inwebparagraph"></p>
<p class="endnote">The structure web is accessed in 1/pc, 1/ptt, 2/tp, 2/pn, 3/ta, 3/ts, 3/ti, 3/tw, 3/tt, 4/pl, 4/cl, 4/is, 5/wf, 5/ptf, 5/tf, 5/hf, 6/mkf, 6/rw and here.</p>
<p class="endnote">The structure web is accessed in 1/pc, 1/ptt, 2/tp, 2/pn, 3/ta, 3/ts, 3/ti, 3/tw, 3/tt, 4/pl, 4/cl, 4/is, 5/fm, 5/ptf, 5/tf, 5/hf, 6/mkf, 6/rw and here.</p>
<p class="inwebparagraph"><a id="SP2"></a><b>&#167;2. </b>And for a chapter:
</p>
@ -96,7 +96,7 @@ each of which has a list of <code class="display"><span class="extract">section<
<p class="inwebparagraph"></p>
<p class="endnote">The structure chapter is accessed in 1/pc, 1/ptt, 2/tp, 2/pn, 3/ta, 3/ts, 3/ti, 3/tw, 3/tt, 4/pl, 4/cl, 4/is, 5/wf, 5/ptf, 5/tf, 5/hf, 6/mkf, 6/rw and here.</p>
<p class="endnote">The structure chapter is accessed in 1/pc, 1/ptt, 2/tp, 2/pn, 3/ta, 3/ts, 3/ti, 3/tw, 3/tt, 4/pl, 4/cl, 4/is, 5/fm, 5/ptf, 5/tf, 5/hf, 6/mkf, 6/rw and here.</p>
<p class="inwebparagraph"><a id="SP3"></a><b>&#167;3. </b>And lastly for a section.
</p>
@ -134,7 +134,7 @@ each of which has a list of <code class="display"><span class="extract">section<
<p class="inwebparagraph"></p>
<p class="endnote">The structure section is accessed in 1/pc, 1/ptt, 2/tp, 2/pm, 2/tgs, 2/pn, 3/ta, 3/ts, 3/ti, 3/tw, 3/tt, 4/pl, 4/lm, 4/as, 4/cl, 4/is, 5/wf, 5/ptf, 5/tf, 5/hf, 6/mkf, 6/rw and here.</p>
<p class="endnote">The structure section is accessed in 1/pc, 1/ptt, 2/tp, 2/pm, 2/tgs, 2/pn, 3/ta, 3/ts, 3/ti, 3/tw, 3/tt, 4/pl, 4/lm, 4/as, 4/cl, 4/is, 5/fm, 5/ptf, 5/tf, 5/hf, 6/mkf, 6/rw and here.</p>
<p class="inwebparagraph"><a id="SP4"></a><b>&#167;4. </b>The following routine makes the <code class="display"><span class="extract">web</span></code>-<code class="display"><span class="extract">chapter</span></code>-<code class="display"><span class="extract">section</span></code> tree out of a
<code class="display"><span class="extract">web_md</span></code>-<code class="display"><span class="extract">chapter_md</span></code>-<code class="display"><span class="extract">section_md</span></code> tree:

View file

@ -339,7 +339,7 @@ in Aho, Sethi and Ullman, "Compilers: Principles, Techniques and Tools"
<span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">hash_code</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
<span class="reserved">string_position</span><span class="plain"> </span><span class="identifier">p</span><span class="plain"> = </span><span class="functiontext">Str::start</span><span class="plain">(</span><span class="identifier">text</span><span class="plain">);</span>
<span class="reserved">switch</span><span class="plain">(</span><span class="functiontext">Str::get</span><span class="plain">(</span><span class="identifier">p</span><span class="plain">)) {</span>
<span class="reserved">case</span><span class="plain"> </span><span class="character">'-'</span><span class="plain">: </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::len</span><span class="plain">(</span><span class="identifier">text</span><span class="plain">) == </span><span class="constant">1</span><span class="plain">) </span><span class="reserved">break</span><span class="plain">; </span><span class="comment"> an isolated minus sign is an ordinary word</span>
<span class="reserved">case</span><span class="plain"> </span><span class="character">'-'</span><span class="plain">: </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::len</span><span class="plain">(</span><span class="identifier">text</span><span class="plain">) == </span><span class="constant">1</span><span class="plain">) </span><span class="reserved">break</span><span class="plain">; /* </span><span class="identifier">an</span><span class="plain"> </span><span class="identifier">isolated</span><span class="plain"> </span><span class="identifier">minus</span><span class="plain"> </span><span class="identifier">sign</span><span class="plain"> </span><span class="identifier">is</span><span class="plain"> </span><span class="identifier">an</span><span class="plain"> </span><span class="identifier">ordinary</span><span class="plain"> </span><span class="identifier">word</span><span class="plain"> */</span>
<span class="comment"> and otherwise fall into...</span>
<span class="reserved">case</span><span class="plain"> </span><span class="character">'0'</span><span class="plain">: </span><span class="reserved">case</span><span class="plain"> </span><span class="character">'1'</span><span class="plain">: </span><span class="reserved">case</span><span class="plain"> </span><span class="character">'2'</span><span class="plain">: </span><span class="reserved">case</span><span class="plain"> </span><span class="character">'3'</span><span class="plain">: </span><span class="reserved">case</span><span class="plain"> </span><span class="character">'4'</span><span class="plain">:</span>
<span class="reserved">case</span><span class="plain"> </span><span class="character">'5'</span><span class="plain">: </span><span class="reserved">case</span><span class="plain"> </span><span class="character">'6'</span><span class="plain">: </span><span class="reserved">case</span><span class="plain"> </span><span class="character">'7'</span><span class="plain">: </span><span class="reserved">case</span><span class="plain"> </span><span class="character">'8'</span><span class="plain">: </span><span class="reserved">case</span><span class="plain"> </span><span class="character">'9'</span><span class="plain">: {</span>

View file

@ -125,7 +125,7 @@ the call comes from Program Control).
<p class="inwebparagraph"></p>
<p class="endnote">The structure weave_target is accessed in 3/ti, 3/tw, 4/is, 5/wf, 5/tf, 5/hf, 5/rtt and here.</p>
<p class="endnote">The structure weave_target is accessed in 3/ti, 3/tw, 4/is, 5/fm, 5/tf, 5/hf, 5/rtt and here.</p>
<p class="inwebparagraph"><a id="SP2_2"></a><b>&#167;2.2. </b><code class="display">
&lt;<span class="cwebmacrodefn">Compile a set of instructions for the weaver</span> <span class="cwebmacronumber">2.2</span>&gt; =

View file

@ -39,6 +39,8 @@ where to put the result: and so we arrive at the front door of the routine
</p>
<pre class="display">
<span class="reserved">source_line</span><span class="plain"> *</span><span class="identifier">current_weave_line</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Weaver::weave_source</span><span class="plain">(</span><span class="reserved">web</span><span class="plain"> *</span><span class="identifier">W</span><span class="plain">, </span><span class="reserved">weave_target</span><span class="plain"> *</span><span class="identifier">wv</span><span class="plain">) {</span>
<span class="reserved">text_stream</span><span class="plain"> </span><span class="identifier">TO_struct</span><span class="plain">;</span>
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">OUT</span><span class="plain"> = &amp;</span><span class="identifier">TO_struct</span><span class="plain">;</span>
@ -218,6 +220,7 @@ where to put the result: and so we arrive at the front door of the routine
<pre class="displaydefn">
<span class="reserved">paragraph</span><span class="plain"> *</span><span class="identifier">current_paragraph</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">source_line</span><span class="plain"> *</span><span class="identifier">L</span><span class="plain"> = </span><span class="identifier">S</span><span class="plain">-&gt;</span><span class="element">first_line</span><span class="plain">; </span><span class="identifier">L</span><span class="plain">; </span><span class="identifier">L</span><span class="plain"> = </span><span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">next_line</span><span class="plain">) {</span>
<span class="identifier">current_weave_line</span><span class="plain"> = </span><span class="identifier">L</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="functiontext">Tags::tagged_with</span><span class="plain">(</span><span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">owning_paragraph</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">-&gt;</span><span class="element">theme_match</span><span class="plain">)) &amp;&amp;</span>
<span class="plain">(</span><span class="functiontext">LanguageMethods::skip_in_weaving</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">-&gt;</span><span class="element">sect_language</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="identifier">L</span><span class="plain">) == </span><span class="constant">FALSE</span><span class="plain">)) {</span>
<span class="identifier">lines_woven</span><span class="plain">++;</span>

View file

@ -194,7 +194,7 @@ files to crash Inweb.)
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">i</span><span class="plain">=0; </span><span class="identifier">i</span><span class="plain">&lt;</span><span class="functiontext">Str::len</span><span class="plain">(</span><span class="identifier">line</span><span class="plain">); </span><span class="identifier">i</span><span class="plain">++) {</span>
<span class="identifier">wchar_t</span><span class="plain"> </span><span class="identifier">c</span><span class="plain"> = </span><span class="functiontext">Str::get_at</span><span class="plain">(</span><span class="identifier">line</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">c_mode</span><span class="plain"> == </span><span class="constant">2</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">ACMESupport::text_at</span><span class="plain">(</span><span class="identifier">line</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">, </span><span class="identifier">pl</span><span class="plain">-&gt;</span><span class="element">multiline_comment_close</span><span class="plain">)) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::includes_at</span><span class="plain">(</span><span class="identifier">line</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">, </span><span class="identifier">pl</span><span class="plain">-&gt;</span><span class="element">multiline_comment_close</span><span class="plain">)) {</span>
<span class="identifier">c_mode</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">; </span><span class="identifier">c_end</span><span class="plain"> = </span><span class="identifier">i</span><span class="plain">; </span><span class="identifier">i</span><span class="plain"> += </span><span class="functiontext">Str::len</span><span class="plain">(</span><span class="identifier">pl</span><span class="plain">-&gt;</span><span class="element">multiline_comment_close</span><span class="plain">) - </span><span class="constant">1</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
@ -205,28 +205,30 @@ files to crash Inweb.)
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">q_mode</span><span class="plain"> == </span><span class="constant">0</span><span class="plain">) </span><span class="identifier">q_mode</span><span class="plain"> = </span><span class="constant">2</span><span class="plain">;</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">q_mode</span><span class="plain"> == </span><span class="constant">2</span><span class="plain">) </span><span class="identifier">q_mode</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">c</span><span class="plain"> == </span><span class="functiontext">Str::get_first_char</span><span class="plain">(</span><span class="identifier">pl</span><span class="plain">-&gt;</span><span class="identifier">character_literal</span><span class="plain">)) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">q_mode</span><span class="plain"> == </span><span class="constant">0</span><span class="plain">) </span><span class="identifier">q_mode</span><span class="plain"> = </span><span class="constant">1</span><span class="plain">;</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">q_mode</span><span class="plain"> == </span><span class="constant">1</span><span class="plain">) </span><span class="identifier">q_mode</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">ACMESupport::text_at</span><span class="plain">(</span><span class="identifier">line</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">, </span><span class="identifier">pl</span><span class="plain">-&gt;</span><span class="element">multiline_comment_open</span><span class="plain">)) {</span>
<span class="identifier">c_mode</span><span class="plain"> = </span><span class="constant">2</span><span class="plain">; </span><span class="identifier">c_position</span><span class="plain"> = </span><span class="identifier">i</span><span class="plain">; </span><span class="identifier">non_white_space</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
<span class="identifier">i</span><span class="plain"> += </span><span class="functiontext">Str::len</span><span class="plain">(</span><span class="identifier">pl</span><span class="plain">-&gt;</span><span class="element">multiline_comment_open</span><span class="plain">) - </span><span class="constant">1</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">c_mode</span><span class="plain"> == </span><span class="constant">0</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">ACMESupport::text_at</span><span class="plain">(</span><span class="identifier">line</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">, </span><span class="identifier">pl</span><span class="plain">-&gt;</span><span class="element">line_comment</span><span class="plain">)) {</span>
<span class="identifier">c_mode</span><span class="plain"> = </span><span class="constant">1</span><span class="plain">; </span><span class="identifier">c_position</span><span class="plain"> = </span><span class="identifier">i</span><span class="plain">; </span><span class="identifier">c_end</span><span class="plain"> = </span><span class="functiontext">Str::len</span><span class="plain">(</span><span class="identifier">line</span><span class="plain">); </span><span class="identifier">non_white_space</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
<span class="identifier">i</span><span class="plain"> += </span><span class="functiontext">Str::len</span><span class="plain">(</span><span class="identifier">pl</span><span class="plain">-&gt;</span><span class="element">line_comment</span><span class="plain">) - </span><span class="constant">1</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">q_mode</span><span class="plain"> == </span><span class="constant">0</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">c</span><span class="plain"> == </span><span class="functiontext">Str::get_first_char</span><span class="plain">(</span><span class="identifier">pl</span><span class="plain">-&gt;</span><span class="identifier">character_literal</span><span class="plain">)) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">q_mode</span><span class="plain"> == </span><span class="constant">0</span><span class="plain">) </span><span class="identifier">q_mode</span><span class="plain"> = </span><span class="constant">1</span><span class="plain">;</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">q_mode</span><span class="plain"> == </span><span class="constant">1</span><span class="plain">) </span><span class="identifier">q_mode</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">ACMESupport::text_at</span><span class="plain">(</span><span class="identifier">line</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">, </span><span class="identifier">pl</span><span class="plain">-&gt;</span><span class="element">whole_line_comment</span><span class="plain">)) {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">material_exists</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">j</span><span class="plain">=0; </span><span class="identifier">j</span><span class="plain">&lt;</span><span class="identifier">i</span><span class="plain">; </span><span class="identifier">j</span><span class="plain">++)</span>
<span class="reserved">if</span><span class="plain"> (!(</span><span class="functiontext">Characters::is_whitespace</span><span class="plain">(</span><span class="functiontext">Str::get_at</span><span class="plain">(</span><span class="identifier">line</span><span class="plain">, </span><span class="identifier">j</span><span class="plain">))))</span>
<span class="identifier">material_exists</span><span class="plain"> = </span><span class="constant">TRUE</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">material_exists</span><span class="plain"> == </span><span class="constant">FALSE</span><span class="plain">) {</span>
<span class="identifier">c_mode</span><span class="plain"> = </span><span class="constant">1</span><span class="plain">; </span><span class="identifier">c_position</span><span class="plain"> = </span><span class="identifier">i</span><span class="plain">; </span><span class="identifier">c_end</span><span class="plain"> = </span><span class="functiontext">Str::len</span><span class="plain">(</span><span class="identifier">line</span><span class="plain">);</span>
<span class="identifier">non_white_space</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
<span class="identifier">i</span><span class="plain"> += </span><span class="functiontext">Str::len</span><span class="plain">(</span><span class="identifier">pl</span><span class="plain">-&gt;</span><span class="element">whole_line_comment</span><span class="plain">) - </span><span class="constant">1</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::includes_at</span><span class="plain">(</span><span class="identifier">line</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">, </span><span class="identifier">pl</span><span class="plain">-&gt;</span><span class="element">multiline_comment_open</span><span class="plain">)) {</span>
<span class="identifier">c_mode</span><span class="plain"> = </span><span class="constant">2</span><span class="plain">; </span><span class="identifier">c_position</span><span class="plain"> = </span><span class="identifier">i</span><span class="plain">; </span><span class="identifier">non_white_space</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
<span class="identifier">i</span><span class="plain"> += </span><span class="functiontext">Str::len</span><span class="plain">(</span><span class="identifier">pl</span><span class="plain">-&gt;</span><span class="element">multiline_comment_open</span><span class="plain">) - </span><span class="constant">1</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">c_mode</span><span class="plain"> == </span><span class="constant">0</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::includes_at</span><span class="plain">(</span><span class="identifier">line</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">, </span><span class="identifier">pl</span><span class="plain">-&gt;</span><span class="element">line_comment</span><span class="plain">)) {</span>
<span class="identifier">c_mode</span><span class="plain"> = </span><span class="constant">1</span><span class="plain">; </span><span class="identifier">c_position</span><span class="plain"> = </span><span class="identifier">i</span><span class="plain">; </span><span class="identifier">c_end</span><span class="plain"> = </span><span class="functiontext">Str::len</span><span class="plain">(</span><span class="identifier">line</span><span class="plain">); </span><span class="identifier">non_white_space</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
<span class="identifier">i</span><span class="plain"> += </span><span class="functiontext">Str::len</span><span class="plain">(</span><span class="identifier">pl</span><span class="plain">-&gt;</span><span class="element">line_comment</span><span class="plain">) - </span><span class="constant">1</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::includes_at</span><span class="plain">(</span><span class="identifier">line</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">, </span><span class="identifier">pl</span><span class="plain">-&gt;</span><span class="element">whole_line_comment</span><span class="plain">)) {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">material_exists</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">j</span><span class="plain">=0; </span><span class="identifier">j</span><span class="plain">&lt;</span><span class="identifier">i</span><span class="plain">; </span><span class="identifier">j</span><span class="plain">++)</span>
<span class="reserved">if</span><span class="plain"> (!(</span><span class="functiontext">Characters::is_whitespace</span><span class="plain">(</span><span class="functiontext">Str::get_at</span><span class="plain">(</span><span class="identifier">line</span><span class="plain">, </span><span class="identifier">j</span><span class="plain">))))</span>
<span class="identifier">material_exists</span><span class="plain"> = </span><span class="constant">TRUE</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">material_exists</span><span class="plain"> == </span><span class="constant">FALSE</span><span class="plain">) {</span>
<span class="identifier">c_mode</span><span class="plain"> = </span><span class="constant">1</span><span class="plain">; </span><span class="identifier">c_position</span><span class="plain"> = </span><span class="identifier">i</span><span class="plain">; </span><span class="identifier">c_end</span><span class="plain"> = </span><span class="functiontext">Str::len</span><span class="plain">(</span><span class="identifier">line</span><span class="plain">);</span>
<span class="identifier">non_white_space</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
<span class="identifier">i</span><span class="plain"> += </span><span class="functiontext">Str::len</span><span class="plain">(</span><span class="identifier">pl</span><span class="plain">-&gt;</span><span class="element">whole_line_comment</span><span class="plain">) - </span><span class="constant">1</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="plain">}</span>
@ -244,16 +246,6 @@ files to crash Inweb.)
<span class="plain">}</span>
<span class="reserved">return</span><span class="plain"> </span><span class="constant">FALSE</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">ACMESupport::text_at</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">line</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">i</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">pattern</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::len</span><span class="plain">(</span><span class="identifier">pattern</span><span class="plain">) == </span><span class="constant">0</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="constant">FALSE</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">i</span><span class="plain"> &lt; </span><span class="constant">0</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="constant">FALSE</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">i</span><span class="plain"> + </span><span class="functiontext">Str::len</span><span class="plain">(</span><span class="identifier">pattern</span><span class="plain">) &gt; </span><span class="functiontext">Str::len</span><span class="plain">(</span><span class="identifier">line</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="constant">FALSE</span><span class="plain">;</span>
<span class="identifier">LOOP_THROUGH_TEXT</span><span class="plain">(</span><span class="identifier">pos</span><span class="plain">, </span><span class="identifier">pattern</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::get</span><span class="plain">(</span><span class="identifier">pos</span><span class="plain">) != </span><span class="functiontext">Str::get_at</span><span class="plain">(</span><span class="identifier">line</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">++))</span>
<span class="reserved">return</span><span class="plain"> </span><span class="constant">FALSE</span><span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="constant">TRUE</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
@ -280,8 +272,6 @@ files to crash Inweb.)
<p class="endnote">The function ACMESupport::parse_comment is used in <a href="#SP1">&#167;1</a>.</p>
<p class="endnote">The function ACMESupport::text_at is used in 4/tp (<a href="4-tp.html#SP2_2">&#167;2.2</a>, <a href="4-tp.html#SP3">&#167;3</a>, <a href="4-tp.html#SP5">&#167;5</a>), 5/wf (<a href="5-wf.html#SP23">&#167;23</a>), 5/hf (<a href="5-hf.html#SP10">&#167;10</a>).</p>
<p class="inwebparagraph"><a id="SP4"></a><b>&#167;4. </b>This is here so that tangling the Standard Rules extension doesn't insert
a spurious comment betraying Inweb's involvement in the process.
</p>

View file

@ -310,7 +310,7 @@ the sake of an illustrative example, let's suppose that line is:
<span class="functiontext">Str::trim_white_space</span><span class="plain">(</span><span class="identifier">p</span><span class="plain">);</span>
&lt;<span class="cwebmacro">Remove C type modifiers from the front of p</span> <span class="cwebmacronumber">2.2.3.1</span>&gt;<span class="plain">;</span>
<span class="reserved">string_position</span><span class="plain"> </span><span class="identifier">pos</span><span class="plain"> = </span><span class="functiontext">Str::start</span><span class="plain">(</span><span class="identifier">p</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::get</span><span class="plain">(</span><span class="identifier">pos</span><span class="plain">) != </span><span class="character">'/'</span><span class="plain">) { </span><span class="comment"> a slash must introduce a comment here</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::get</span><span class="plain">(</span><span class="identifier">pos</span><span class="plain">) != </span><span class="character">'/'</span><span class="plain">) { /* </span><span class="identifier">a</span><span class="plain"> </span><span class="identifier">slash</span><span class="plain"> </span><span class="identifier">must</span><span class="plain"> </span><span class="identifier">introduce</span><span class="plain"> </span><span class="identifier">a</span><span class="plain"> </span><span class="identifier">comment</span><span class="plain"> </span><span class="identifier">here</span><span class="plain"> */</span>
&lt;<span class="cwebmacro">Move pos past the type name</span> <span class="cwebmacronumber">2.2.3.2</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Move pos past any typographical type modifiers</span> <span class="cwebmacronumber">2.2.3.3</span>&gt;<span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::in_range</span><span class="plain">(</span><span class="identifier">pos</span><span class="plain">)) {</span>

View file

@ -343,7 +343,7 @@ adds generic method calls to give effect to the settings in the definition.
<span class="functiontext">Str::trim_white_space</span><span class="plain">(</span><span class="identifier">line</span><span class="plain">); </span><span class="comment"> ignore trailing space</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::len</span><span class="plain">(</span><span class="identifier">line</span><span class="plain">) == </span><span class="constant">0</span><span class="plain">) </span><span class="reserved">return</span><span class="plain">; </span><span class="comment"> ignore blank lines</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::get_first_char</span><span class="plain">(</span><span class="identifier">line</span><span class="plain">) == </span><span class="character">'#'</span><span class="plain">) </span><span class="reserved">return</span><span class="plain">; </span><span class="comment"> lines opening with <code class="display"><span class="extract">#</span></code> are comments</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::get_first_char</span><span class="plain">(</span><span class="identifier">line</span><span class="plain">) == </span><span class="character">'#'</span><span class="plain">) </span><span class="reserved">return</span><span class="plain">; /* </span><span class="identifier">lines</span><span class="plain"> </span><span class="identifier">opening</span><span class="plain"> </span><span class="identifier">with</span><span class="plain"> |#| </span><span class="identifier">are</span><span class="plain"> </span><span class="identifier">comments</span><span class="plain"> */</span>
<span class="reserved">match_results</span><span class="plain"> </span><span class="identifier">mr</span><span class="plain"> = </span><span class="functiontext">Regexp::create_mr</span><span class="plain">();</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">state</span><span class="plain">-&gt;</span><span class="identifier">current_block</span><span class="plain">) </span>&lt;<span class="cwebmacro">Syntax inside a colouring program</span> <span class="cwebmacronumber">8.2</span>&gt;

View file

@ -173,26 +173,26 @@ its colouring program.
<span class="reserved">if</span><span class="plain"> ((</span><span class="functiontext">Str::get_at</span><span class="plain">(</span><span class="identifier">colouring</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">) == </span><span class="constant">PLAIN_COLOUR</span><span class="plain">) ||</span>
<span class="plain">(</span><span class="functiontext">Str::get_at</span><span class="plain">(</span><span class="identifier">colouring</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">) == </span><span class="constant">IDENTIFIER_COLOUR</span><span class="plain">)) {</span>
<span class="identifier">wchar_t</span><span class="plain"> </span><span class="identifier">c</span><span class="plain"> = </span><span class="functiontext">Str::get_at</span><span class="plain">(</span><span class="identifier">matter</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">ACMESupport::text_at</span><span class="plain">(</span><span class="identifier">matter</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">, </span><span class="identifier">pl</span><span class="plain">-&gt;</span><span class="element">binary_literal_prefix</span><span class="plain">)) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::includes_at</span><span class="plain">(</span><span class="identifier">matter</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">, </span><span class="identifier">pl</span><span class="plain">-&gt;</span><span class="element">binary_literal_prefix</span><span class="plain">)) {</span>
<span class="identifier">base</span><span class="plain"> = </span><span class="constant">2</span><span class="plain">;</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">j</span><span class="plain">=0; </span><span class="identifier">j</span><span class="plain">&lt;</span><span class="functiontext">Str::len</span><span class="plain">(</span><span class="identifier">pl</span><span class="plain">-&gt;</span><span class="element">binary_literal_prefix</span><span class="plain">); </span><span class="identifier">j</span><span class="plain">++)</span>
<span class="functiontext">Str::put_at</span><span class="plain">(</span><span class="identifier">colouring</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">+</span><span class="identifier">j</span><span class="plain">, (</span><span class="reserved">char</span><span class="plain">) </span><span class="constant">CONSTANT_COLOUR</span><span class="plain">);</span>
<span class="identifier">dec_possible</span><span class="plain"> = </span><span class="constant">TRUE</span><span class="plain">;</span>
<span class="reserved">continue</span><span class="plain">;</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">ACMESupport::text_at</span><span class="plain">(</span><span class="identifier">matter</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">, </span><span class="identifier">pl</span><span class="plain">-&gt;</span><span class="element">octal_literal_prefix</span><span class="plain">)) {</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::includes_at</span><span class="plain">(</span><span class="identifier">matter</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">, </span><span class="identifier">pl</span><span class="plain">-&gt;</span><span class="element">octal_literal_prefix</span><span class="plain">)) {</span>
<span class="identifier">base</span><span class="plain"> = </span><span class="constant">8</span><span class="plain">;</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">j</span><span class="plain">=0; </span><span class="identifier">j</span><span class="plain">&lt;</span><span class="functiontext">Str::len</span><span class="plain">(</span><span class="identifier">pl</span><span class="plain">-&gt;</span><span class="element">octal_literal_prefix</span><span class="plain">); </span><span class="identifier">j</span><span class="plain">++)</span>
<span class="functiontext">Str::put_at</span><span class="plain">(</span><span class="identifier">colouring</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">+</span><span class="identifier">j</span><span class="plain">, (</span><span class="reserved">char</span><span class="plain">) </span><span class="constant">CONSTANT_COLOUR</span><span class="plain">);</span>
<span class="identifier">dec_possible</span><span class="plain"> = </span><span class="constant">TRUE</span><span class="plain">;</span>
<span class="reserved">continue</span><span class="plain">;</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">ACMESupport::text_at</span><span class="plain">(</span><span class="identifier">matter</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">, </span><span class="identifier">pl</span><span class="plain">-&gt;</span><span class="element">hexadecimal_literal_prefix</span><span class="plain">)) {</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::includes_at</span><span class="plain">(</span><span class="identifier">matter</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">, </span><span class="identifier">pl</span><span class="plain">-&gt;</span><span class="element">hexadecimal_literal_prefix</span><span class="plain">)) {</span>
<span class="identifier">base</span><span class="plain"> = </span><span class="constant">16</span><span class="plain">;</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">j</span><span class="plain">=0; </span><span class="identifier">j</span><span class="plain">&lt;</span><span class="functiontext">Str::len</span><span class="plain">(</span><span class="identifier">pl</span><span class="plain">-&gt;</span><span class="element">hexadecimal_literal_prefix</span><span class="plain">); </span><span class="identifier">j</span><span class="plain">++)</span>
<span class="functiontext">Str::put_at</span><span class="plain">(</span><span class="identifier">colouring</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">+</span><span class="identifier">j</span><span class="plain">, (</span><span class="reserved">char</span><span class="plain">) </span><span class="constant">CONSTANT_COLOUR</span><span class="plain">);</span>
<span class="identifier">dec_possible</span><span class="plain"> = </span><span class="constant">TRUE</span><span class="plain">;</span>
<span class="reserved">continue</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="functiontext">ACMESupport::text_at</span><span class="plain">(</span><span class="identifier">matter</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">, </span><span class="identifier">pl</span><span class="plain">-&gt;</span><span class="element">negative_literal_prefix</span><span class="plain">)) &amp;&amp;</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="functiontext">Str::includes_at</span><span class="plain">(</span><span class="identifier">matter</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">, </span><span class="identifier">pl</span><span class="plain">-&gt;</span><span class="element">negative_literal_prefix</span><span class="plain">)) &amp;&amp;</span>
<span class="plain">(</span><span class="identifier">dec_possible</span><span class="plain">) &amp;&amp; (</span><span class="identifier">base</span><span class="plain"> == </span><span class="constant">0</span><span class="plain">)) {</span>
<span class="identifier">base</span><span class="plain"> = </span><span class="constant">10</span><span class="plain">;</span>
<span class="functiontext">Str::put_at</span><span class="plain">(</span><span class="identifier">colouring</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">, (</span><span class="reserved">char</span><span class="plain">) </span><span class="constant">CONSTANT_COLOUR</span><span class="plain">);</span>
@ -314,7 +314,7 @@ rule across the whole snippet before moving on to the next.
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">L</span><span class="plain"> = </span><span class="functiontext">Str::len</span><span class="plain">(</span><span class="identifier">block</span><span class="plain">-&gt;</span><span class="element">run_instance</span><span class="plain">) - </span><span class="constant">1</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">L</span><span class="plain"> &gt;= </span><span class="constant">0</span><span class="plain">)</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">count</span><span class="plain">=1, </span><span class="identifier">i</span><span class="plain">=</span><span class="identifier">from</span><span class="plain">; </span><span class="identifier">i</span><span class="plain">&lt;=</span><span class="identifier">to</span><span class="plain"> - </span><span class="identifier">L</span><span class="plain">; </span><span class="identifier">i</span><span class="plain">++)</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">ACMESupport::text_at</span><span class="plain">(</span><span class="identifier">matter</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">, </span><span class="identifier">block</span><span class="plain">-&gt;</span><span class="element">run_instance</span><span class="plain">)) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::includes_at</span><span class="plain">(</span><span class="identifier">matter</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">, </span><span class="identifier">block</span><span class="plain">-&gt;</span><span class="element">run_instance</span><span class="plain">)) {</span>
<span class="functiontext">Painter::execute_rule</span><span class="plain">(</span><span class="identifier">HT</span><span class="plain">, </span><span class="identifier">rule</span><span class="plain">, </span><span class="identifier">matter</span><span class="plain">, </span><span class="identifier">colouring</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">+</span><span class="identifier">L</span><span class="plain">, </span><span class="identifier">count</span><span class="plain">++);</span>
<span class="identifier">i</span><span class="plain"> += </span><span class="identifier">L</span><span class="plain">;</span>
<span class="plain">}</span>
@ -422,7 +422,7 @@ rule across the whole snippet before moving on to the next.
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">rule</span><span class="plain">-&gt;</span><span class="identifier">match_prefix</span><span class="plain"> == </span><span class="constant">SPACED_RULE_PREFIX</span><span class="plain">) &amp;&amp; (</span><span class="identifier">pos</span><span class="plain"> == </span><span class="identifier">from</span><span class="plain">))</span>
<span class="reserved">return</span><span class="plain"> </span><span class="constant">FALSE</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">ACMESupport::text_at</span><span class="plain">(</span><span class="identifier">matter</span><span class="plain">,</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::includes_at</span><span class="plain">(</span><span class="identifier">matter</span><span class="plain">,</span>
<span class="identifier">pos</span><span class="plain">-</span><span class="functiontext">Str::len</span><span class="plain">(</span><span class="identifier">rule</span><span class="plain">-&gt;</span><span class="element">match_text</span><span class="plain">), </span><span class="identifier">rule</span><span class="plain">-&gt;</span><span class="element">match_text</span><span class="plain">) == </span><span class="constant">FALSE</span><span class="plain">)</span>
<span class="reserved">return</span><span class="plain"> </span><span class="constant">FALSE</span><span class="plain">;</span>
<span class="identifier">rule</span><span class="plain">-&gt;</span><span class="element">fix_position</span><span class="plain"> = </span><span class="identifier">pos</span><span class="plain">-</span><span class="functiontext">Str::len</span><span class="plain">(</span><span class="identifier">rule</span><span class="plain">-&gt;</span><span class="element">match_text</span><span class="plain">);</span>
@ -435,7 +435,7 @@ rule across the whole snippet before moving on to the next.
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">rule</span><span class="plain">-&gt;</span><span class="identifier">match_prefix</span><span class="plain"> == </span><span class="constant">SPACED_RULE_SUFFIX</span><span class="plain">) &amp;&amp; (</span><span class="identifier">pos</span><span class="plain"> == </span><span class="identifier">from</span><span class="plain">))</span>
<span class="reserved">return</span><span class="plain"> </span><span class="constant">FALSE</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">ACMESupport::text_at</span><span class="plain">(</span><span class="identifier">matter</span><span class="plain">, </span><span class="identifier">pos</span><span class="plain">, </span><span class="identifier">rule</span><span class="plain">-&gt;</span><span class="element">match_text</span><span class="plain">) == </span><span class="constant">FALSE</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::includes_at</span><span class="plain">(</span><span class="identifier">matter</span><span class="plain">, </span><span class="identifier">pos</span><span class="plain">, </span><span class="identifier">rule</span><span class="plain">-&gt;</span><span class="element">match_text</span><span class="plain">) == </span><span class="constant">FALSE</span><span class="plain">)</span>
<span class="reserved">return</span><span class="plain"> </span><span class="constant">FALSE</span><span class="plain">;</span>
<span class="identifier">rule</span><span class="plain">-&gt;</span><span class="element">fix_position</span><span class="plain"> = </span><span class="identifier">pos</span><span class="plain">;</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>

View file

@ -1,7 +1,7 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Weave Formats</title>
<title>Format Methods</title>
<meta name="viewport" content="width=device-width initial-scale=1">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta http-equiv="Content-Language" content="en-gb">
@ -23,10 +23,10 @@
</nav>
<main role="main">
<!--Weave of 'Weave Formats' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="index.html">inweb</a></li><li><a href="index.html#5">Chapter 5: Formats</a></li><li><b>Weave Formats</b></li></ul><p class="purpose">To characterise the different weaving output formats (text, typeset, web and so on).</p>
<!--Weave of 'Format Methods' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="index.html">inweb</a></li><li><a href="index.html#5">Chapter 5: Formats</a></li><li><b>Format Methods</b></li></ul><p class="purpose">To characterise the relevant differences in behaviour between the various weaving formats offered, such as HTML, ePub, or TeX.</p>
<ul class="toc"><li><a href="#SP1">&#167;1. Formats</a></li><li><a href="#SP3">&#167;3. Creation</a></li><li><a href="#SP4">&#167;4. Methods</a></li><li><a href="#SP29">&#167;29. Post-processing</a></li></ul><hr class="tocbar">
<ul class="toc"><li><a href="#SP1">&#167;1. Formats</a></li><li><a href="#SP3">&#167;3. Creation</a></li><li><a href="#SP4">&#167;4. Methods</a></li><li><a href="#SP30">&#167;30. Post-processing</a></li></ul><hr class="tocbar">
<p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. Formats. </b>Exactly as in the previous chapter, each format expresses its behaviour
through optional method calls.
@ -61,7 +61,7 @@ through optional method calls.
<p class="endnote">The function Formats::create_weave_format is used in 5/ptf (<a href="5-ptf.html#SP1">&#167;1</a>), 5/tf (<a href="5-tf.html#SP1_1">&#167;1.1</a>, <a href="5-tf.html#SP1_2">&#167;1.2</a>, <a href="5-tf.html#SP1_3">&#167;1.3</a>), 5/hf (<a href="5-hf.html#SP1_1">&#167;1.1</a>, <a href="5-hf.html#SP1_2">&#167;1.2</a>).</p>
<p class="endnote">The function Formats::find_by_name is used in <a href="#SP31">&#167;31</a>, 1/ptt (<a href="1-ptt.html#SP3_2">&#167;3.2</a>).</p>
<p class="endnote">The function Formats::find_by_name is used in <a href="#SP32">&#167;32</a>, 1/ptt (<a href="1-ptt.html#SP3_2">&#167;3.2</a>).</p>
<p class="endnote">The structure weave_format is accessed in 3/ts and here.</p>
@ -275,10 +275,11 @@ the benefit of the TeX format, and all other formats can leave them be.
<span class="reserved">weave_target</span><span class="plain"> *</span><span class="identifier">wv</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">TeX_macro</span><span class="plain">, </span><span class="reserved">section</span><span class="plain"> *</span><span class="identifier">S</span><span class="plain">, </span><span class="reserved">paragraph</span><span class="plain"> *</span><span class="identifier">P</span><span class="plain">,</span>
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">heading_text</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">chaptermark</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">sectionmark</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">weight</span><span class="plain">)</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Formats::paragraph_heading</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">weave_target</span><span class="plain"> *</span><span class="identifier">wv</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">TeX_macro</span><span class="plain">,</span>
<span class="reserved">section</span><span class="plain"> *</span><span class="identifier">S</span><span class="plain">, </span><span class="reserved">paragraph</span><span class="plain"> *</span><span class="identifier">P</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">heading_text</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">chaptermark</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">sectionmark</span><span class="plain">,</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">weight</span><span class="plain">) {</span>
<span class="reserved">section</span><span class="plain"> *</span><span class="identifier">S</span><span class="plain">, </span><span class="reserved">paragraph</span><span class="plain"> *</span><span class="identifier">P</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">heading_text</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">chaptermark</span><span class="plain">,</span>
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">sectionmark</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">weight</span><span class="plain">) {</span>
<span class="reserved">weave_format</span><span class="plain"> *</span><span class="identifier">wf</span><span class="plain"> = </span><span class="identifier">wv</span><span class="plain">-&gt;</span><span class="element">format</span><span class="plain">;</span>
<span class="identifier">VMETHOD_CALL</span><span class="plain">(</span><span class="identifier">wf</span><span class="plain">, </span><span class="constant">PARAGRAPH_HEADING_FOR_MTID</span><span class="plain">, </span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="identifier">TeX_macro</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">, </span><span class="identifier">P</span><span class="plain">, </span><span class="identifier">heading_text</span><span class="plain">, </span><span class="identifier">chaptermark</span><span class="plain">, </span><span class="identifier">sectionmark</span><span class="plain">, </span><span class="identifier">weight</span><span class="plain">);</span>
<span class="identifier">VMETHOD_CALL</span><span class="plain">(</span><span class="identifier">wf</span><span class="plain">, </span><span class="constant">PARAGRAPH_HEADING_FOR_MTID</span><span class="plain">, </span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="identifier">TeX_macro</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">, </span><span class="identifier">P</span><span class="plain">,</span>
<span class="identifier">heading_text</span><span class="plain">, </span><span class="identifier">chaptermark</span><span class="plain">, </span><span class="identifier">sectionmark</span><span class="plain">, </span><span class="identifier">weight</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
@ -367,7 +368,7 @@ drably in a uniform <code class="display"><span class="extract">EXTRACT_COLOUR</
<p class="inwebparagraph"></p>
<p class="endnote">The function Formats::url is used in <a href="#SP23">&#167;23</a>, 5/hf (<a href="5-hf.html#SP10">&#167;10</a>).</p>
<p class="endnote">The function Formats::url is used in <a href="#SP23_2">&#167;23.2</a>, <a href="#SP23_3_1">&#167;23.3.1</a>, 5/hf (<a href="5-hf.html#SP10_1">&#167;10.1</a>, <a href="5-hf.html#SP10_2_1">&#167;10.2.1</a>).</p>
<p class="inwebparagraph"><a id="SP13"></a><b>&#167;13. </b>This method produces the <code class="display"><span class="extract">&gt;&gt; Example</span></code> bits of example source text, really
a convenience for Inform 7 code commentary.
@ -379,7 +380,8 @@ a convenience for Inform 7 code commentary.
</pre>
<pre class="display">
<span class="identifier">VMETHOD_TYPE</span><span class="plain">(</span><span class="constant">DISPLAY_LINE_FOR_MTID</span><span class="plain">, </span><span class="reserved">weave_format</span><span class="plain"> *</span><span class="identifier">wf</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">OUT</span><span class="plain">, </span><span class="reserved">weave_target</span><span class="plain"> *</span><span class="identifier">wv</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">from</span><span class="plain">)</span>
<span class="identifier">VMETHOD_TYPE</span><span class="plain">(</span><span class="constant">DISPLAY_LINE_FOR_MTID</span><span class="plain">, </span><span class="reserved">weave_format</span><span class="plain"> *</span><span class="identifier">wf</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">OUT</span><span class="plain">,</span>
<span class="reserved">weave_target</span><span class="plain"> *</span><span class="identifier">wv</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">from</span><span class="plain">)</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Formats::display_line</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">weave_target</span><span class="plain"> *</span><span class="identifier">wv</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">from</span><span class="plain">) {</span>
<span class="reserved">weave_format</span><span class="plain"> *</span><span class="identifier">wf</span><span class="plain"> = </span><span class="identifier">wv</span><span class="plain">-&gt;</span><span class="element">format</span><span class="plain">;</span>
<span class="identifier">VMETHOD_CALL</span><span class="plain">(</span><span class="identifier">wf</span><span class="plain">, </span><span class="constant">DISPLAY_LINE_FOR_MTID</span><span class="plain">, </span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="identifier">from</span><span class="plain">);</span>
@ -610,7 +612,7 @@ nothing.
<p class="inwebparagraph"></p>
<p class="endnote">The function Formats::change_colour is used in 5/tf (<a href="5-tf.html#SP8_2">&#167;8.2</a>, <a href="5-tf.html#SP15">&#167;15</a>), 5/hf (<a href="5-hf.html#SP10_1">&#167;10.1</a>).</p>
<p class="endnote">The function Formats::change_colour is used in 5/tf (<a href="5-tf.html#SP8_2">&#167;8.2</a>, <a href="5-tf.html#SP15">&#167;15</a>), 5/hf (<a href="5-hf.html#SP10_3">&#167;10.3</a>).</p>
<p class="inwebparagraph"><a id="SP23"></a><b>&#167;23. </b>The following takes text, divides it up at stroke-mark boundaries &mdash;
that is, <code class="display"><span class="extract">this is inside</span></code>, this is outside &mdash; and sends contiguous pieces
@ -628,49 +630,23 @@ as appropriate.
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Formats::text_r</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">weave_target</span><span class="plain"> *</span><span class="identifier">wv</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">id</span><span class="plain">,</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">within</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">comments</span><span class="plain">) {</span>
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">notation</span><span class="plain"> = </span><span class="functiontext">Bibliographic::get_datum</span><span class="plain">(</span><span class="identifier">wv</span><span class="plain">-&gt;</span><span class="element">weave_web</span><span class="plain">-&gt;</span><span class="element">md</span><span class="plain">,</span>
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">code_in_comments_notation</span><span class="plain"> =</span>
<span class="functiontext">Bibliographic::get_datum</span><span class="plain">(</span><span class="identifier">wv</span><span class="plain">-&gt;</span><span class="element">weave_web</span><span class="plain">-&gt;</span><span class="element">md</span><span class="plain">,</span>
<span class="plain">(</span><span class="identifier">comments</span><span class="plain">)?(</span><span class="identifier">I</span><span class="string">"Code In Code Comments Notation"</span><span class="plain">):(</span><span class="identifier">I</span><span class="string">"Code In Commentary Notation"</span><span class="plain">));</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::ne</span><span class="plain">(</span><span class="identifier">notation</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Off"</span><span class="plain">)) {</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">i</span><span class="plain">=0; </span><span class="identifier">i</span><span class="plain"> &lt; </span><span class="functiontext">Str::len</span><span class="plain">(</span><span class="identifier">id</span><span class="plain">); </span><span class="identifier">i</span><span class="plain">++) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::get_at</span><span class="plain">(</span><span class="identifier">id</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">) == </span><span class="character">'\\'</span><span class="plain">) </span><span class="identifier">i</span><span class="plain"> += </span><span class="functiontext">Str::len</span><span class="plain">(</span><span class="identifier">notation</span><span class="plain">) - </span><span class="constant">1</span><span class="plain">;</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">ACMESupport::text_at</span><span class="plain">(</span><span class="identifier">id</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">, </span><span class="identifier">notation</span><span class="plain">)) {</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">before</span><span class="plain">);</span>
<span class="functiontext">Str::copy</span><span class="plain">(</span><span class="identifier">before</span><span class="plain">, </span><span class="identifier">id</span><span class="plain">); </span><span class="functiontext">Str::truncate</span><span class="plain">(</span><span class="identifier">before</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">);</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">after</span><span class="plain">);</span>
<span class="functiontext">Str::substr</span><span class="plain">(</span><span class="identifier">after</span><span class="plain">, </span><span class="functiontext">Str::at</span><span class="plain">(</span><span class="identifier">id</span><span class="plain">, </span><span class="identifier">i</span><span class="plain"> + </span><span class="functiontext">Str::len</span><span class="plain">(</span><span class="identifier">notation</span><span class="plain">)), </span><span class="functiontext">Str::end</span><span class="plain">(</span><span class="identifier">id</span><span class="plain">));</span>
<span class="functiontext">Formats::text_r</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="identifier">before</span><span class="plain">, </span><span class="identifier">within</span><span class="plain">, </span><span class="identifier">comments</span><span class="plain">);</span>
<span class="functiontext">Formats::text_r</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="identifier">after</span><span class="plain">, (</span><span class="identifier">within</span><span class="plain">)?</span><span class="identifier">FALSE:TRUE</span><span class="plain">, </span><span class="identifier">comments</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">before</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">after</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::ne</span><span class="plain">(</span><span class="identifier">code_in_comments_notation</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Off"</span><span class="plain">)) </span>&lt;<span class="cwebmacro">Split text and code extracts</span> <span class="cwebmacronumber">23.1</span>&gt;<span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">within</span><span class="plain"> == </span><span class="constant">FALSE</span><span class="plain">) </span>&lt;<span class="cwebmacro">Recognose hyperlinks</span> <span class="cwebmacronumber">23.2</span>&gt;<span class="plain">;</span>
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">xref_notation</span><span class="plain"> = </span><span class="functiontext">Bibliographic::get_datum</span><span class="plain">(</span><span class="identifier">wv</span><span class="plain">-&gt;</span><span class="element">weave_web</span><span class="plain">-&gt;</span><span class="element">md</span><span class="plain">,</span>
<span class="identifier">I</span><span class="string">"Cross-References Notation"</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::ne</span><span class="plain">(</span><span class="identifier">xref_notation</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Off"</span><span class="plain">)) </span>&lt;<span class="cwebmacro">Recognise cross-references</span> <span class="cwebmacronumber">23.3</span>&gt;<span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">within</span><span class="plain">) {</span>
<span class="functiontext">Formats::source_fragment</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="identifier">id</span><span class="plain">);</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
<span class="functiontext">Formats::text_fragment</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="identifier">id</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">i</span><span class="plain">=0; </span><span class="identifier">i</span><span class="plain"> &lt; </span><span class="functiontext">Str::len</span><span class="plain">(</span><span class="identifier">id</span><span class="plain">); </span><span class="identifier">i</span><span class="plain">++) {</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">within</span><span class="plain"> == </span><span class="constant">FALSE</span><span class="plain">) &amp;&amp;</span>
<span class="plain">((</span><span class="functiontext">ACMESupport::text_at</span><span class="plain">(</span><span class="identifier">id</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"http:</span><span class="comment">")) <code class="display"></code></span>
<span class="string">(ACMESupport::text_at(id, i, I"</span><span class="identifier">https:</span><span class="comment">")))) {</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">before</span><span class="plain">);</span>
<span class="functiontext">Str::copy</span><span class="plain">(</span><span class="identifier">before</span><span class="plain">, </span><span class="identifier">id</span><span class="plain">); </span><span class="functiontext">Str::truncate</span><span class="plain">(</span><span class="identifier">before</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">);</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">after</span><span class="plain">);</span>
<span class="functiontext">Str::substr</span><span class="plain">(</span><span class="identifier">after</span><span class="plain">, </span><span class="functiontext">Str::at</span><span class="plain">(</span><span class="identifier">id</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">), </span><span class="functiontext">Str::end</span><span class="plain">(</span><span class="identifier">id</span><span class="plain">));</span>
<span class="reserved">match_results</span><span class="plain"> </span><span class="identifier">mr</span><span class="plain"> = </span><span class="functiontext">Regexp::create_mr</span><span class="plain">();</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">after</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"(https*:</span><span class="comment">%C+)(%c*)")) {</span>
<span class="string">Formats::text_r(OUT, wv, before, within, comments);</span>
<span class="string">Formats::url(OUT, wv, mr.exp[0], mr.exp[0], TRUE);</span>
<span class="string">Formats::text_r(OUT, wv, mr.exp[1], within, comments);</span>
<span class="string">return;</span>
<span class="string">}</span>
<span class="string">DISCARD_TEXT(before);</span>
<span class="string">DISCARD_TEXT(after);</span>
<span class="string">}</span>
<span class="string">}</span>
<span class="string">if (within) {</span>
<span class="string">Formats::source_fragment(OUT, wv, id);</span>
<span class="string">} else {</span>
<span class="string">Formats::text_fragment(OUT, wv, id);</span>
<span class="string">}</span>
<span class="string">}</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
@ -679,9 +655,172 @@ as appropriate.
<p class="endnote">The function Formats::text_comment is used in 5/tf (<a href="5-tf.html#SP24_2">&#167;24.2</a>), 5/hf (<a href="5-hf.html#SP10">&#167;10</a>).</p>
<p class="endnote">The function Formats::text_r appears nowhere else.</p>
<p class="endnote">The function Formats::text_r is used in <a href="#SP23_1">&#167;23.1</a>, <a href="#SP23_2">&#167;23.2</a>, <a href="#SP23_3_1">&#167;23.3.1</a>.</p>
<p class="inwebparagraph"><a id="SP24"></a><b>&#167;24. </b><code class="display"><span class="extract">COMMENTARY_TEXT_FOR_MTID</span></code> straightforwardly weaves out a run of contiguous
<p class="inwebparagraph"><a id="SP23_1"></a><b>&#167;23.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Split text and code extracts</span> <span class="cwebmacronumber">23.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">i</span><span class="plain">=0; </span><span class="identifier">i</span><span class="plain"> &lt; </span><span class="functiontext">Str::len</span><span class="plain">(</span><span class="identifier">id</span><span class="plain">); </span><span class="identifier">i</span><span class="plain">++) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::get_at</span><span class="plain">(</span><span class="identifier">id</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">) == </span><span class="character">'\\'</span><span class="plain">) </span><span class="identifier">i</span><span class="plain"> += </span><span class="functiontext">Str::len</span><span class="plain">(</span><span class="identifier">code_in_comments_notation</span><span class="plain">) - </span><span class="constant">1</span><span class="plain">;</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::includes_at</span><span class="plain">(</span><span class="identifier">id</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">, </span><span class="identifier">code_in_comments_notation</span><span class="plain">)) {</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">before</span><span class="plain">);</span>
<span class="functiontext">Str::copy</span><span class="plain">(</span><span class="identifier">before</span><span class="plain">, </span><span class="identifier">id</span><span class="plain">); </span><span class="functiontext">Str::truncate</span><span class="plain">(</span><span class="identifier">before</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">);</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">after</span><span class="plain">);</span>
<span class="functiontext">Str::substr</span><span class="plain">(</span><span class="identifier">after</span><span class="plain">, </span><span class="functiontext">Str::at</span><span class="plain">(</span><span class="identifier">id</span><span class="plain">,</span>
<span class="identifier">i</span><span class="plain"> + </span><span class="functiontext">Str::len</span><span class="plain">(</span><span class="identifier">code_in_comments_notation</span><span class="plain">)), </span><span class="functiontext">Str::end</span><span class="plain">(</span><span class="identifier">id</span><span class="plain">));</span>
<span class="functiontext">Formats::text_r</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="identifier">before</span><span class="plain">, </span><span class="identifier">within</span><span class="plain">, </span><span class="identifier">comments</span><span class="plain">);</span>
<span class="functiontext">Formats::text_r</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="identifier">after</span><span class="plain">, (</span><span class="identifier">within</span><span class="plain">)?</span><span class="identifier">FALSE:TRUE</span><span class="plain">, </span><span class="identifier">comments</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">before</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">after</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP23">&#167;23</a>.</p>
<p class="inwebparagraph"><a id="SP23_2"></a><b>&#167;23.2. </b><code class="display">
&lt;<span class="cwebmacrodefn">Recognose hyperlinks</span> <span class="cwebmacronumber">23.2</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">i</span><span class="plain">=0; </span><span class="identifier">i</span><span class="plain"> &lt; </span><span class="functiontext">Str::len</span><span class="plain">(</span><span class="identifier">id</span><span class="plain">); </span><span class="identifier">i</span><span class="plain">++) {</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="functiontext">Str::includes_at</span><span class="plain">(</span><span class="identifier">id</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"http://"</span><span class="plain">)) ||</span>
<span class="plain">(</span><span class="functiontext">Str::includes_at</span><span class="plain">(</span><span class="identifier">id</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"https://"</span><span class="plain">))) {</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">before</span><span class="plain">);</span>
<span class="functiontext">Str::copy</span><span class="plain">(</span><span class="identifier">before</span><span class="plain">, </span><span class="identifier">id</span><span class="plain">); </span><span class="functiontext">Str::truncate</span><span class="plain">(</span><span class="identifier">before</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">);</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">after</span><span class="plain">);</span>
<span class="functiontext">Str::substr</span><span class="plain">(</span><span class="identifier">after</span><span class="plain">, </span><span class="functiontext">Str::at</span><span class="plain">(</span><span class="identifier">id</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">), </span><span class="functiontext">Str::end</span><span class="plain">(</span><span class="identifier">id</span><span class="plain">));</span>
<span class="reserved">match_results</span><span class="plain"> </span><span class="identifier">mr</span><span class="plain"> = </span><span class="functiontext">Regexp::create_mr</span><span class="plain">();</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">after</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"(https*://%C+)(%c*)"</span><span class="plain">)) {</span>
<span class="functiontext">Formats::text_r</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="identifier">before</span><span class="plain">, </span><span class="identifier">within</span><span class="plain">, </span><span class="identifier">comments</span><span class="plain">);</span>
<span class="functiontext">Formats::url</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[0], </span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[0], </span><span class="constant">TRUE</span><span class="plain">);</span>
<span class="functiontext">Formats::text_r</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[1], </span><span class="identifier">within</span><span class="plain">, </span><span class="identifier">comments</span><span class="plain">);</span>
<span class="functiontext">Regexp::dispose_of</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="functiontext">Regexp::dispose_of</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">before</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">after</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP23">&#167;23</a>.</p>
<p class="inwebparagraph"><a id="SP23_3"></a><b>&#167;23.3. </b><code class="display">
&lt;<span class="cwebmacrodefn">Recognise cross-references</span> <span class="cwebmacronumber">23.3</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">N</span><span class="plain"> = </span><span class="functiontext">Str::len</span><span class="plain">(</span><span class="identifier">xref_notation</span><span class="plain">);</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">i</span><span class="plain">=0; </span><span class="identifier">i</span><span class="plain"> &lt; </span><span class="functiontext">Str::len</span><span class="plain">(</span><span class="identifier">id</span><span class="plain">); </span><span class="identifier">i</span><span class="plain">++) {</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">within</span><span class="plain"> == </span><span class="constant">FALSE</span><span class="plain">) &amp;&amp; (</span><span class="functiontext">Str::includes_at</span><span class="plain">(</span><span class="identifier">id</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">, </span><span class="identifier">xref_notation</span><span class="plain">))) {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">j</span><span class="plain"> = </span><span class="identifier">i</span><span class="plain"> + </span><span class="identifier">N</span><span class="plain">+1;</span>
<span class="reserved">while</span><span class="plain"> (</span><span class="identifier">j</span><span class="plain"> &lt; </span><span class="functiontext">Str::len</span><span class="plain">(</span><span class="identifier">id</span><span class="plain">)) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::includes_at</span><span class="plain">(</span><span class="identifier">id</span><span class="plain">, </span><span class="identifier">j</span><span class="plain">, </span><span class="identifier">xref_notation</span><span class="plain">)) {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">allow</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">before</span><span class="plain">);</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">reference</span><span class="plain">);</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">after</span><span class="plain">);</span>
<span class="functiontext">Str::substr</span><span class="plain">(</span><span class="identifier">before</span><span class="plain">, </span><span class="functiontext">Str::start</span><span class="plain">(</span><span class="identifier">id</span><span class="plain">), </span><span class="functiontext">Str::at</span><span class="plain">(</span><span class="identifier">id</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">));</span>
<span class="functiontext">Str::substr</span><span class="plain">(</span><span class="identifier">reference</span><span class="plain">, </span><span class="functiontext">Str::at</span><span class="plain">(</span><span class="identifier">id</span><span class="plain">, </span><span class="identifier">i</span><span class="plain"> + </span><span class="identifier">N</span><span class="plain">), </span><span class="functiontext">Str::at</span><span class="plain">(</span><span class="identifier">id</span><span class="plain">, </span><span class="identifier">j</span><span class="plain">));</span>
<span class="functiontext">Str::substr</span><span class="plain">(</span><span class="identifier">after</span><span class="plain">, </span><span class="functiontext">Str::at</span><span class="plain">(</span><span class="identifier">id</span><span class="plain">, </span><span class="identifier">j</span><span class="plain"> + </span><span class="identifier">N</span><span class="plain">), </span><span class="functiontext">Str::end</span><span class="plain">(</span><span class="identifier">id</span><span class="plain">));</span>
&lt;<span class="cwebmacro">Attempt to resolve the cross-reference</span> <span class="cwebmacronumber">23.3.1</span>&gt;<span class="plain">;</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">before</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">reference</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">after</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">allow</span><span class="plain">) </span><span class="reserved">return</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="identifier">j</span><span class="plain">++;</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP23">&#167;23</a>.</p>
<p class="inwebparagraph"><a id="SP23_3_1"></a><b>&#167;23.3.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Attempt to resolve the cross-reference</span> <span class="cwebmacronumber">23.3.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">url</span><span class="plain">);</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">title</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Formats::resolve_reference_in_weave</span><span class="plain">(</span><span class="identifier">url</span><span class="plain">, </span><span class="identifier">title</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="identifier">reference</span><span class="plain">,</span>
<span class="identifier">current_weave_line</span><span class="plain">)) {</span>
<span class="functiontext">Formats::text_r</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="identifier">before</span><span class="plain">, </span><span class="identifier">within</span><span class="plain">, </span><span class="identifier">comments</span><span class="plain">);</span>
<span class="functiontext">Formats::url</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="identifier">url</span><span class="plain">, </span><span class="identifier">title</span><span class="plain">, </span><span class="constant">FALSE</span><span class="plain">);</span>
<span class="functiontext">Formats::text_r</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="identifier">after</span><span class="plain">, </span><span class="identifier">within</span><span class="plain">, </span><span class="identifier">comments</span><span class="plain">);</span>
<span class="identifier">allow</span><span class="plain"> = </span><span class="constant">TRUE</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">url</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">title</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP23_3">&#167;23.3</a>.</p>
<p class="inwebparagraph"><a id="SP24"></a><b>&#167;24. </b>The following must decide what a reference like "Chapter 3" should refer
to: that is, whether it makes unamgiguous sense, and if so, what URL we should
link to, and what the full text of the link might be.
</p>
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Formats::resolve_reference_in_weave</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">url</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">title</span><span class="plain">,</span>
<span class="reserved">weave_target</span><span class="plain"> *</span><span class="identifier">wv</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">text</span><span class="plain">, </span><span class="reserved">source_line</span><span class="plain"> *</span><span class="identifier">L</span><span class="plain">) {</span>
<span class="reserved">module</span><span class="plain"> *</span><span class="identifier">found_M</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="reserved">section_md</span><span class="plain"> *</span><span class="identifier">found_Sm</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">named_as_module</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">N</span><span class="plain"> = </span><span class="functiontext">WebModules::named_reference</span><span class="plain">(&amp;</span><span class="identifier">found_M</span><span class="plain">, &amp;</span><span class="identifier">found_Sm</span><span class="plain">, &amp;</span><span class="identifier">named_as_module</span><span class="plain">,</span>
<span class="identifier">title</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">-&gt;</span><span class="identifier">weave_web</span><span class="plain">-&gt;</span><span class="element">md</span><span class="plain">-&gt;</span><span class="element">as_module</span><span class="plain">, </span><span class="identifier">text</span><span class="plain">, </span><span class="constant">FALSE</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">N</span><span class="plain"> == </span><span class="constant">0</span><span class="plain">) {</span>
<span class="functiontext">Main::error_in_web</span><span class="plain">(</span><span class="identifier">I</span><span class="string">"No section has this name"</span><span class="plain">, </span><span class="identifier">L</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="constant">FALSE</span><span class="plain">;</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">N</span><span class="plain"> &gt; </span><span class="constant">1</span><span class="plain">) {</span>
<span class="functiontext">Main::error_in_web</span><span class="plain">(</span><span class="identifier">I</span><span class="string">"Multiple sections might be meant here"</span><span class="plain">, </span><span class="identifier">L</span><span class="plain">);</span>
<span class="functiontext">WebModules::named_reference</span><span class="plain">(&amp;</span><span class="identifier">found_M</span><span class="plain">, &amp;</span><span class="identifier">found_Sm</span><span class="plain">, &amp;</span><span class="identifier">named_as_module</span><span class="plain">,</span>
<span class="identifier">title</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">-&gt;</span><span class="identifier">weave_web</span><span class="plain">-&gt;</span><span class="element">md</span><span class="plain">-&gt;</span><span class="element">as_module</span><span class="plain">, </span><span class="identifier">text</span><span class="plain">, </span><span class="constant">TRUE</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="constant">FALSE</span><span class="plain">;</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
<span class="reserved">chapter</span><span class="plain"> *</span><span class="identifier">C</span><span class="plain">;</span>
<span class="reserved">section</span><span class="plain"> *</span><span class="identifier">S</span><span class="plain">, *</span><span class="identifier">found_S</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER_LINKED_LIST</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">, </span><span class="reserved">chapter</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">-&gt;</span><span class="element">weave_web</span><span class="plain">-&gt;</span><span class="element">chapters</span><span class="plain">)</span>
<span class="identifier">LOOP_OVER_LINKED_LIST</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">, </span><span class="reserved">section</span><span class="plain">, </span><span class="identifier">C</span><span class="plain">-&gt;</span><span class="element">sections</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">S</span><span class="plain">-&gt;</span><span class="element">md</span><span class="plain"> == </span><span class="identifier">found_Sm</span><span class="plain">) </span><span class="identifier">found_S</span><span class="plain"> = </span><span class="identifier">S</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">found_S</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"could not locate S"</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">found_M</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"could not locate M"</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">found_M</span><span class="plain"> != </span><span class="identifier">wv</span><span class="plain">-&gt;</span><span class="element">weave_web</span><span class="plain">-&gt;</span><span class="element">md</span><span class="plain">-&gt;</span><span class="element">as_module</span><span class="plain">) {</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">url</span><span class="plain">, </span><span class="string">"../%S-module/"</span><span class="plain">, </span><span class="identifier">found_M</span><span class="plain">-&gt;</span><span class="element">module_name</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="functiontext">HTMLFormat::section_URL</span><span class="plain">(</span><span class="identifier">url</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="identifier">found_S</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">named_as_module</span><span class="plain"> == </span><span class="constant">FALSE</span><span class="plain">) &amp;&amp; (</span><span class="identifier">found_M</span><span class="plain"> != </span><span class="identifier">wv</span><span class="plain">-&gt;</span><span class="element">weave_web</span><span class="plain">-&gt;</span><span class="element">md</span><span class="plain">-&gt;</span><span class="element">as_module</span><span class="plain">)) {</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">title</span><span class="plain">, </span><span class="string">" (in %S)"</span><span class="plain">, </span><span class="identifier">found_M</span><span class="plain">-&gt;</span><span class="element">module_name</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">return</span><span class="plain"> </span><span class="constant">TRUE</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Formats::resolve_reference_in_weave is used in <a href="#SP23_3_1">&#167;23.3.1</a>, 5/hf (<a href="5-hf.html#SP10_2_1">&#167;10.2.1</a>).</p>
<p class="inwebparagraph"><a id="SP25"></a><b>&#167;25. </b><code class="display"><span class="extract">COMMENTARY_TEXT_FOR_MTID</span></code> straightforwardly weaves out a run of contiguous
text. Ordinarily, any formulae written in TeX notation (i.e., in dollar signs
used as brackets) will be transmogrified into a plain text paraphrase, but
the <code class="display"><span class="extract">PRESERVE_MATH_MODE_FOR_MTID</span></code> can prevent this. (And of course the TeX
@ -720,7 +859,7 @@ format does, because it wants to keep the formulae in all their glory.)
<p class="endnote">The function Formats::text_fragment is used in <a href="#SP23">&#167;23</a>.</p>
<p class="inwebparagraph"><a id="SP25"></a><b>&#167;25. </b>The weaver has special typographical support for the stand-alone Inform
<p class="inwebparagraph"><a id="SP26"></a><b>&#167;26. </b>The weaver has special typographical support for the stand-alone Inform
document of Preform grammar, and this is the hook for it. Most formats
should ignore it.
</p>
@ -749,7 +888,7 @@ should ignore it.
<p class="endnote">The function Formats::preform_document is used in 4/is (<a href="4-is.html#SP16">&#167;16</a>).</p>
<p class="inwebparagraph"><a id="SP26"></a><b>&#167;26. </b>When the weaver adds one of its endnotes &mdash; "This function is used in...",
<p class="inwebparagraph"><a id="SP27"></a><b>&#167;27. </b>When the weaver adds one of its endnotes &mdash; "This function is used in...",
or some such &mdash; it calls this method twice, once before the start, with
<code class="display"><span class="extract">end</span></code> set to 1, and once after the end, with <code class="display"><span class="extract">end</span></code> set to 2.
</p>
@ -771,7 +910,7 @@ or some such &mdash; it calls this method twice, once before the start, with
<p class="endnote">The function Formats::endnote is used in 2/tgs (<a href="2-tgs.html#SP7">&#167;7</a>, <a href="2-tgs.html#SP7_1">&#167;7.1</a>), 3/tw (<a href="3-tw.html#SP2_1">&#167;2.1</a>, <a href="3-tw.html#SP2_2">&#167;2.2</a>, <a href="3-tw.html#SP2_3">&#167;2.3</a>).</p>
<p class="inwebparagraph"><a id="SP27"></a><b>&#167;27. </b>"Locale" here isn't used in the Unix sense. It means text which describes
<p class="inwebparagraph"><a id="SP28"></a><b>&#167;28. </b>"Locale" here isn't used in the Unix sense. It means text which describes
a range of numbered paragraphs, from <code class="display"><span class="extract">par1</span></code> to <code class="display"><span class="extract">par2</span></code>, though <code class="display"><span class="extract">par2</span></code> can
instead be null, in which case the description is of just one para. (This
is often used in endnotes.)
@ -795,7 +934,7 @@ is often used in endnotes.)
<p class="endnote">The function Formats::locale is used in 3/tw (<a href="3-tw.html#SP2_1">&#167;2.1</a>, <a href="3-tw.html#SP2_2_1">&#167;2.2.1</a>), 5/ptf (<a href="5-ptf.html#SP6">&#167;6</a>).</p>
<p class="inwebparagraph"><a id="SP28"></a><b>&#167;28. </b>And finally: the bottom of the woven file. The <code class="display"><span class="extract">comment</span></code> is, again, not
<p class="inwebparagraph"><a id="SP29"></a><b>&#167;29. </b>And finally: the bottom of the woven file. The <code class="display"><span class="extract">comment</span></code> is, again, not
intended for human eyes, and will be some sort of "End of weave" remark.
</p>
@ -817,7 +956,7 @@ intended for human eyes, and will be some sort of "End of weave" remark.
<p class="endnote">The function Formats::tail is used in 3/tw (<a href="3-tw.html#SP1_5">&#167;1.5</a>).</p>
<p class="inwebparagraph"><a id="SP29"></a><b>&#167;29. Post-processing. </b>Consider what happens when Inweb makes a PDF, via TeX. The initial weave is
<p class="inwebparagraph"><a id="SP30"></a><b>&#167;30. Post-processing. </b>Consider what happens when Inweb makes a PDF, via TeX. The initial weave is
to a TeX file; it's then "post-processing" which will turn this into a PDF.
The following method calls allow such two-stage formats to function; in
this case, it would be the PDF format which provides the necessary methods
@ -840,7 +979,7 @@ to turn TeX into PDF. The important method is this one:
<p class="endnote">The function Formats::post_process_weave is used in 3/ts (<a href="3-ts.html#SP2">&#167;2</a>).</p>
<p class="inwebparagraph"><a id="SP30"></a><b>&#167;30. </b>Optionally, a fancy report can be printed out, to describe what has been
<p class="inwebparagraph"><a id="SP31"></a><b>&#167;31. </b>Optionally, a fancy report can be printed out, to describe what has been
done:
</p>
@ -860,7 +999,7 @@ done:
<p class="endnote">The function Formats::report_on_post_processing is used in 3/ts (<a href="3-ts.html#SP2_3">&#167;2.3</a>).</p>
<p class="inwebparagraph"><a id="SP31"></a><b>&#167;31. </b>After post-processing, an index file is sometimes needed. For example, if a
<p class="inwebparagraph"><a id="SP32"></a><b>&#167;32. </b>After post-processing, an index file is sometimes needed. For example, if a
big web is woven to a swarm of PDFs, one for each section, then we also want
to make an index page in HTML which provides annotated links to those PDFs.
</p>
@ -885,7 +1024,7 @@ to make an index page in HTML which provides annotated links to those PDFs.
<p class="endnote">The function Formats::index_pdfs appears nowhere else.</p>
<p class="inwebparagraph"><a id="SP32"></a><b>&#167;32. </b>And in that index file, we may want to substitute in values for placeholder
<p class="inwebparagraph"><a id="SP33"></a><b>&#167;33. </b>And in that index file, we may want to substitute in values for placeholder
text like <code class="display"><span class="extract">[[PDF Size]]</span></code> in the template file. This is the <code class="display"><span class="extract">detail</span></code>.
</p>

View file

@ -39,7 +39,7 @@
<p class="inwebparagraph"></p>
<p class="endnote">The function HTMLFormat::create is used in 5/wf (<a href="5-wf.html#SP3">&#167;3</a>).</p>
<p class="endnote">The function HTMLFormat::create is used in 5/fm (<a href="5-fm.html#SP3">&#167;3</a>).</p>
<p class="inwebparagraph"><a id="SP1_1"></a><b>&#167;1.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Create HTML</span> <span class="cwebmacronumber">1.1</span>&gt; =
@ -438,33 +438,25 @@ the page, and this drops one.
<span class="plain">}</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">current_colour</span><span class="plain"> = -1, </span><span class="identifier">colour_wanted</span><span class="plain"> = </span><span class="constant">PLAIN_COLOUR</span><span class="plain">;</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">i</span><span class="plain">=0; </span><span class="identifier">i</span><span class="plain"> &lt; </span><span class="functiontext">Str::len</span><span class="plain">(</span><span class="identifier">matter</span><span class="plain">); </span><span class="identifier">i</span><span class="plain">++) {</span>
<span class="identifier">colour_wanted</span><span class="plain"> = </span><span class="functiontext">Str::get_at</span><span class="plain">(</span><span class="identifier">colouring</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">); </span>&lt;<span class="cwebmacro">Adjust code colour as necessary</span> <span class="cwebmacronumber">10.1</span>&gt;<span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">linked</span><span class="plain">) &amp;&amp;</span>
<span class="plain">((</span><span class="functiontext">ACMESupport::text_at</span><span class="plain">(</span><span class="identifier">matter</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"http:</span><span class="comment">")) <code class="display"></code></span>
<span class="string">(ACMESupport::text_at(matter, i, I"</span><span class="identifier">https:</span><span class="comment">")))) {</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">before</span><span class="plain">);</span>
<span class="functiontext">Str::copy</span><span class="plain">(</span><span class="identifier">before</span><span class="plain">, </span><span class="identifier">matter</span><span class="plain">); </span><span class="functiontext">Str::truncate</span><span class="plain">(</span><span class="identifier">before</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">);</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">after</span><span class="plain">);</span>
<span class="functiontext">Str::substr</span><span class="plain">(</span><span class="identifier">after</span><span class="plain">, </span><span class="functiontext">Str::at</span><span class="plain">(</span><span class="identifier">matter</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">), </span><span class="functiontext">Str::end</span><span class="plain">(</span><span class="identifier">matter</span><span class="plain">));</span>
<span class="reserved">match_results</span><span class="plain"> </span><span class="identifier">mr</span><span class="plain"> = </span><span class="functiontext">Regexp::create_mr</span><span class="plain">();</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">after</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"(https*:</span><span class="comment">%C+)(%c*)")) {</span>
<span class="string">Formats::url(OUT, wv, mr.exp[0], mr.exp[0], TRUE);</span>
<span class="string">i += Str::len(mr.exp[0]);</span>
<span class="string">}</span>
<span class="string">DISCARD_TEXT(before);</span>
<span class="string">DISCARD_TEXT(after);</span>
<span class="string">}</span>
<span class="string">if (Str::get_at(matter, i) == '&lt;') WRITE("</span><span class="plain">&amp;</span><span class="identifier">lt</span><span class="plain">;</span><span class="string">");</span>
<span class="string">else if (Str::get_at(matter, i) == '&gt;') WRITE("</span><span class="plain">&amp;</span><span class="identifier">gt</span><span class="plain">;</span><span class="string">");</span>
<span class="string">else if (Str::get_at(matter, i) == '&amp;') WRITE("</span><span class="plain">&amp;</span><span class="identifier">amp</span><span class="plain">;</span><span class="string">");</span>
<span class="string">else WRITE("</span><span class="plain">%</span><span class="identifier">c</span><span class="string">", Str::get_at(matter, i));</span>
<span class="string">}</span>
<span class="string">if (current_colour &gt;= 0) HTML_CLOSE("</span><span class="identifier">span</span><span class="string">");</span>
<span class="string">current_colour = -1;</span>
<span class="string">if (finishes) {</span>
<span class="string">if (Str::len(concluding_comment) &gt; 0) {</span>
<span class="string">if (!starts) WRITE("</span><span class="plain"> </span><span class="string">");</span>
<span class="string">HTML_OPEN_WITH("</span><span class="identifier">span</span><span class="string">", "</span><span class="identifier">class</span><span class="plain">=\</span><span class="string">"comment\""</span><span class="plain">);</span>
<span class="identifier">colour_wanted</span><span class="plain"> = </span><span class="functiontext">Str::get_at</span><span class="plain">(</span><span class="identifier">colouring</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">); </span>&lt;<span class="cwebmacro">Adjust code colour as necessary</span> <span class="cwebmacronumber">10.3</span>&gt;<span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">linked</span><span class="plain">) {</span>
&lt;<span class="cwebmacro">Pick up hyperlinking at the eleventh hour</span> <span class="cwebmacronumber">10.1</span>&gt;<span class="plain">;</span>
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">xref_notation</span><span class="plain"> = </span><span class="functiontext">Bibliographic::get_datum</span><span class="plain">(</span><span class="identifier">wv</span><span class="plain">-&gt;</span><span class="element">weave_web</span><span class="plain">-&gt;</span><span class="element">md</span><span class="plain">,</span>
<span class="identifier">I</span><span class="string">"Cross-References Notation"</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::ne</span><span class="plain">(</span><span class="identifier">xref_notation</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Off"</span><span class="plain">))</span>
&lt;<span class="cwebmacro">Pick up cross-references at the eleventh hour</span> <span class="cwebmacronumber">10.2</span>&gt;<span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::get_at</span><span class="plain">(</span><span class="identifier">matter</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">) == </span><span class="character">'&lt;'</span><span class="plain">) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"&amp;lt;"</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::get_at</span><span class="plain">(</span><span class="identifier">matter</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">) == </span><span class="character">'&gt;'</span><span class="plain">) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"&amp;gt;"</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::get_at</span><span class="plain">(</span><span class="identifier">matter</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">) == </span><span class="character">'&amp;'</span><span class="plain">) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"&amp;amp;"</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"%c"</span><span class="plain">, </span><span class="functiontext">Str::get_at</span><span class="plain">(</span><span class="identifier">matter</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">));</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">current_colour</span><span class="plain"> &gt;= </span><span class="constant">0</span><span class="plain">) </span><span class="identifier">HTML_CLOSE</span><span class="plain">(</span><span class="string">"span"</span><span class="plain">);</span>
<span class="identifier">current_colour</span><span class="plain"> = -1;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">finishes</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::len</span><span class="plain">(</span><span class="identifier">concluding_comment</span><span class="plain">) &gt; </span><span class="constant">0</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (!</span><span class="identifier">starts</span><span class="plain">) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" "</span><span class="plain">);</span>
<span class="identifier">HTML_OPEN_WITH</span><span class="plain">(</span><span class="string">"span"</span><span class="plain">, </span><span class="string">"class=\"comment\""</span><span class="plain">);</span>
<span class="functiontext">Formats::text_comment</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="identifier">concluding_comment</span><span class="plain">);</span>
<span class="identifier">HTML_CLOSE</span><span class="plain">(</span><span class="string">"span"</span><span class="plain">);</span>
<span class="plain">}</span>
@ -478,7 +470,79 @@ the page, and this drops one.
<p class="endnote">The function HTMLFormat::source_code is used in <a href="#SP1_1_1">&#167;1.1.1</a>.</p>
<p class="inwebparagraph"><a id="SP10_1"></a><b>&#167;10.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Adjust code colour as necessary</span> <span class="cwebmacronumber">10.1</span>&gt; =
&lt;<span class="cwebmacrodefn">Pick up hyperlinking at the eleventh hour</span> <span class="cwebmacronumber">10.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">if</span><span class="plain"> ((</span><span class="functiontext">Str::includes_at</span><span class="plain">(</span><span class="identifier">matter</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"http://"</span><span class="plain">)) ||</span>
<span class="plain">(</span><span class="functiontext">Str::includes_at</span><span class="plain">(</span><span class="identifier">matter</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"https://"</span><span class="plain">))) {</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">before</span><span class="plain">);</span>
<span class="functiontext">Str::copy</span><span class="plain">(</span><span class="identifier">before</span><span class="plain">, </span><span class="identifier">matter</span><span class="plain">); </span><span class="functiontext">Str::truncate</span><span class="plain">(</span><span class="identifier">before</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">);</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">after</span><span class="plain">);</span>
<span class="functiontext">Str::substr</span><span class="plain">(</span><span class="identifier">after</span><span class="plain">, </span><span class="functiontext">Str::at</span><span class="plain">(</span><span class="identifier">matter</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">), </span><span class="functiontext">Str::end</span><span class="plain">(</span><span class="identifier">matter</span><span class="plain">));</span>
<span class="reserved">match_results</span><span class="plain"> </span><span class="identifier">mr</span><span class="plain"> = </span><span class="functiontext">Regexp::create_mr</span><span class="plain">();</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">after</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"(https*://%C+)(%c*)"</span><span class="plain">)) {</span>
<span class="functiontext">Formats::url</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[0], </span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[0], </span><span class="constant">TRUE</span><span class="plain">);</span>
<span class="identifier">i</span><span class="plain"> += </span><span class="functiontext">Str::len</span><span class="plain">(</span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[0]);</span>
<span class="plain">}</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">before</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">after</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP10">&#167;10</a>.</p>
<p class="inwebparagraph"><a id="SP10_2"></a><b>&#167;10.2. </b><code class="display">
&lt;<span class="cwebmacrodefn">Pick up cross-references at the eleventh hour</span> <span class="cwebmacronumber">10.2</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">N</span><span class="plain"> = </span><span class="functiontext">Str::len</span><span class="plain">(</span><span class="identifier">xref_notation</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="functiontext">Str::includes_at</span><span class="plain">(</span><span class="identifier">matter</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">, </span><span class="identifier">xref_notation</span><span class="plain">))) {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">j</span><span class="plain"> = </span><span class="identifier">i</span><span class="plain"> + </span><span class="identifier">N</span><span class="plain">+1;</span>
<span class="reserved">while</span><span class="plain"> (</span><span class="identifier">j</span><span class="plain"> &lt; </span><span class="functiontext">Str::len</span><span class="plain">(</span><span class="identifier">matter</span><span class="plain">)) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::includes_at</span><span class="plain">(</span><span class="identifier">matter</span><span class="plain">, </span><span class="identifier">j</span><span class="plain">, </span><span class="identifier">xref_notation</span><span class="plain">)) {</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">reference</span><span class="plain">);</span>
<span class="functiontext">Str::substr</span><span class="plain">(</span><span class="identifier">reference</span><span class="plain">, </span><span class="functiontext">Str::at</span><span class="plain">(</span><span class="identifier">matter</span><span class="plain">, </span><span class="identifier">i</span><span class="plain"> + </span><span class="identifier">N</span><span class="plain">), </span><span class="functiontext">Str::at</span><span class="plain">(</span><span class="identifier">matter</span><span class="plain">, </span><span class="identifier">j</span><span class="plain">));</span>
&lt;<span class="cwebmacro">Attempt to resolve the cross-reference</span> <span class="cwebmacronumber">10.2.1</span>&gt;<span class="plain">;</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">reference</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="identifier">j</span><span class="plain">++;</span>
<span class="plain">}</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP10">&#167;10</a>.</p>
<p class="inwebparagraph"><a id="SP10_2_1"></a><b>&#167;10.2.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Attempt to resolve the cross-reference</span> <span class="cwebmacronumber">10.2.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">url</span><span class="plain">);</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">title</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Formats::resolve_reference_in_weave</span><span class="plain">(</span><span class="identifier">url</span><span class="plain">, </span><span class="identifier">title</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="identifier">reference</span><span class="plain">,</span>
<span class="identifier">current_weave_line</span><span class="plain">)) {</span>
<span class="functiontext">Formats::url</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="identifier">url</span><span class="plain">, </span><span class="identifier">title</span><span class="plain">, </span><span class="constant">FALSE</span><span class="plain">);</span>
<span class="identifier">i</span><span class="plain"> = </span><span class="identifier">j</span><span class="plain"> + </span><span class="identifier">N</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">url</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">title</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP10_2">&#167;10.2</a>.</p>
<p class="inwebparagraph"><a id="SP10_3"></a><b>&#167;10.3. </b><code class="display">
&lt;<span class="cwebmacrodefn">Adjust code colour as necessary</span> <span class="cwebmacronumber">10.3</span>&gt; =
</code></p>
@ -733,7 +797,7 @@ the page, and this drops one.
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">col</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">in_code</span><span class="plain">) {</span>
<span class="reserved">char</span><span class="plain"> *</span><span class="identifier">cl</span><span class="plain"> = </span><span class="string">"plain"</span><span class="plain">;</span>
<span class="reserved">switch</span><span class="plain"> (</span><span class="identifier">col</span><span class="plain">) {</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">DEFINITION_COLOUR:</span><span class="plain"> </span><span class="identifier">cl</span><span class="plain"> = </span><span class="string">"cwebmacrotext"</span><span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">DEFINITION_COLOUR:</span><span class="plain"> </span><span class="identifier">cl</span><span class="plain"> = </span><span class="string">"cwebmacrotext"</span><span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">FUNCTION_COLOUR:</span><span class="plain"> </span><span class="identifier">cl</span><span class="plain"> = </span><span class="string">"functiontext"</span><span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">IDENTIFIER_COLOUR:</span><span class="plain"> </span><span class="identifier">cl</span><span class="plain"> = </span><span class="string">"identifier"</span><span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">ELEMENT_COLOUR:</span><span class="plain"> </span><span class="identifier">cl</span><span class="plain"> = </span><span class="string">"element"</span><span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
@ -823,6 +887,15 @@ the page, and this drops one.
<p class="inwebparagraph"><a id="SP25"></a><b>&#167;25. </b></p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">HTMLFormat::section_URL</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">weave_target</span><span class="plain"> *</span><span class="identifier">wv</span><span class="plain">, </span><span class="reserved">section</span><span class="plain"> *</span><span class="identifier">from</span><span class="plain">) {</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">linkto</span><span class="plain">);</span>
<span class="functiontext">Str::copy</span><span class="plain">(</span><span class="identifier">linkto</span><span class="plain">, </span><span class="identifier">from</span><span class="plain">-&gt;</span><span class="element">sect_range</span><span class="plain">);</span>
<span class="identifier">LOOP_THROUGH_TEXT</span><span class="plain">(</span><span class="identifier">pos</span><span class="plain">, </span><span class="identifier">linkto</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="functiontext">Str::get</span><span class="plain">(</span><span class="identifier">pos</span><span class="plain">) == </span><span class="character">'/'</span><span class="plain">) || (</span><span class="functiontext">Str::get</span><span class="plain">(</span><span class="identifier">pos</span><span class="plain">) == </span><span class="character">' '</span><span class="plain">))</span>
<span class="functiontext">Str::put</span><span class="plain">(</span><span class="identifier">pos</span><span class="plain">, </span><span class="character">'-'</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">linkto</span><span class="plain">, </span><span class="string">".html"</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"%S"</span><span class="plain">, </span><span class="identifier">linkto</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">HTMLFormat::xref</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">weave_target</span><span class="plain"> *</span><span class="identifier">wv</span><span class="plain">, </span><span class="reserved">paragraph</span><span class="plain"> *</span><span class="identifier">P</span><span class="plain">, </span><span class="reserved">section</span><span class="plain"> *</span><span class="identifier">from</span><span class="plain">,</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">a_link</span><span class="plain">) {</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">linkto</span><span class="plain">);</span>
@ -833,19 +906,24 @@ the page, and this drops one.
<span class="functiontext">Str::put</span><span class="plain">(</span><span class="identifier">pos</span><span class="plain">, </span><span class="character">'-'</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">linkto</span><span class="plain">, </span><span class="string">".html"</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"%S%s%S"</span><span class="plain">, </span><span class="identifier">linkto</span><span class="plain">, (</span><span class="identifier">a_link</span><span class="plain">)?</span><span class="string">"#"</span><span class="plain">:</span><span class="string">""</span><span class="plain">, </span><span class="identifier">P</span><span class="plain">-&gt;</span><span class="element">ornament</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"%S"</span><span class="plain">, </span><span class="identifier">linkto</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">P</span><span class="plain">) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"%s%S"</span><span class="plain">, (</span><span class="identifier">a_link</span><span class="plain">)?</span><span class="string">"#"</span><span class="plain">:</span><span class="string">""</span><span class="plain">, </span><span class="identifier">P</span><span class="plain">-&gt;</span><span class="element">ornament</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">linkto</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"P"</span><span class="plain">);</span>
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">N</span><span class="plain"> = </span><span class="identifier">P</span><span class="plain">-&gt;</span><span class="element">paragraph_number</span><span class="plain">;</span>
<span class="identifier">LOOP_THROUGH_TEXT</span><span class="plain">(</span><span class="identifier">pos</span><span class="plain">, </span><span class="identifier">N</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::get</span><span class="plain">(</span><span class="identifier">pos</span><span class="plain">) == </span><span class="character">'.'</span><span class="plain">) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"_"</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="identifier">PUT</span><span class="plain">(</span><span class="functiontext">Str::get</span><span class="plain">(</span><span class="identifier">pos</span><span class="plain">));</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">P</span><span class="plain">) {</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"P"</span><span class="plain">);</span>
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">N</span><span class="plain"> = </span><span class="identifier">P</span><span class="plain">-&gt;</span><span class="element">paragraph_number</span><span class="plain">;</span>
<span class="identifier">LOOP_THROUGH_TEXT</span><span class="plain">(</span><span class="identifier">pos</span><span class="plain">, </span><span class="identifier">N</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::get</span><span class="plain">(</span><span class="identifier">pos</span><span class="plain">) == </span><span class="character">'.'</span><span class="plain">) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"_"</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="identifier">PUT</span><span class="plain">(</span><span class="functiontext">Str::get</span><span class="plain">(</span><span class="identifier">pos</span><span class="plain">));</span>
<span class="plain">}</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function HTMLFormat::section_URL is used in 5/fm (<a href="5-fm.html#SP24">&#167;24</a>).</p>
<p class="endnote">The function HTMLFormat::xref is used in <a href="#SP8">&#167;8</a>, <a href="#SP9">&#167;9</a>, <a href="#SP24">&#167;24</a>.</p>
<p class="inwebparagraph"><a id="SP26"></a><b>&#167;26. </b></p>

View file

@ -53,7 +53,7 @@
<p class="inwebparagraph"></p>
<p class="endnote">The function PlainText::create is used in 5/wf (<a href="5-wf.html#SP3">&#167;3</a>).</p>
<p class="endnote">The function PlainText::create is used in 5/fm (<a href="5-fm.html#SP3">&#167;3</a>).</p>
<p class="inwebparagraph"><a id="SP2"></a><b>&#167;2. Methods. </b>For documentation, see "Weave Fornats".
</p>
@ -283,7 +283,7 @@
<p class="endnote">The function PlainText::tail is used in <a href="#SP1">&#167;1</a>.</p>
<hr class="tocbar">
<ul class="toc"><li><a href="5-wf.html">Back to 'Weave Formats'</a></li><li><a href="5-tf.html">Continue with 'TeX Format'</a></li></ul><hr class="tocbar">
<ul class="toc"><li><a href="5-fm.html">Back to 'Format Methods'</a></li><li><a href="5-tf.html">Continue with 'TeX Format'</a></li></ul><hr class="tocbar">
<!--End of weave-->
</main>
</body>

View file

@ -40,7 +40,7 @@
<p class="inwebparagraph"></p>
<p class="endnote">The function TeX::create is used in 5/wf (<a href="5-wf.html#SP3">&#167;3</a>).</p>
<p class="endnote">The function TeX::create is used in 5/fm (<a href="5-fm.html#SP3">&#167;3</a>).</p>
<p class="inwebparagraph"><a id="SP1_1"></a><b>&#167;1.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Create TeX format</span> <span class="cwebmacronumber">1.1</span>&gt; =
@ -857,7 +857,7 @@ To do this, the weaver calls the following.
<p class="inwebparagraph"></p>
<p class="endnote">The function TeX::remove_math_mode is used in 5/wf (<a href="5-wf.html#SP24">&#167;24</a>).</p>
<p class="endnote">The function TeX::remove_math_mode is used in 5/fm (<a href="5-fm.html#SP25">&#167;25</a>).</p>
<p class="endnote">The function TeX::remove_math_mode_range is used in <a href="#SP28_1">&#167;28.1</a>, <a href="#SP28_2">&#167;28.2</a>, <a href="#SP28_3">&#167;28.3</a>.</p>

View file

@ -553,19 +553,19 @@ following a "prototype".
<span class="plain">}</span>
<span class="functiontext">Regexp::dispose_of</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">);</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">tester</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">tester</span><span class="plain">, </span><span class="string">"%p/%S</span>
<span class="string">DISCARD_TEXT(leaf_pattern);</span>
<span class="string">Filenames::write_extension(tester, F);</span>
<span class="string">if (Dictionaries::find(patterns_done, tester) == NULL) {</span>
<span class="string">WRITE_TO(Dictionaries::create_text(patterns_done, tester), "</span><span class="identifier">got</span><span class="plain"> </span><span class="identifier">this</span><span class="string">");</span>
<span class="string">WRITE("</span><span class="plain"> </span><span class="string">");</span>
<span class="string">LOOP_THROUGH_TEXT(pos, tester) {</span>
<span class="string">wchar_t c = Str::get(pos);</span>
<span class="string">if (c == ' ') PUT('\\');</span>
<span class="string">PUT(c);</span>
<span class="string">}</span>
<span class="string">}</span>
<span class="string">DISCARD_TEXT(tester);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">tester</span><span class="plain">, </span><span class="string">"%p/%S/*"</span><span class="plain">, </span><span class="functiontext">Pathnames::up</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">), </span><span class="identifier">leaf_pattern</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">leaf_pattern</span><span class="plain">);</span>
<span class="functiontext">Filenames::write_extension</span><span class="plain">(</span><span class="identifier">tester</span><span class="plain">, </span><span class="identifier">F</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Dictionaries::find</span><span class="plain">(</span><span class="identifier">patterns_done</span><span class="plain">, </span><span class="identifier">tester</span><span class="plain">) == </span><span class="identifier">NULL</span><span class="plain">) {</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="functiontext">Dictionaries::create_text</span><span class="plain">(</span><span class="identifier">patterns_done</span><span class="plain">, </span><span class="identifier">tester</span><span class="plain">), </span><span class="string">"got this"</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" "</span><span class="plain">);</span>
<span class="identifier">LOOP_THROUGH_TEXT</span><span class="plain">(</span><span class="identifier">pos</span><span class="plain">, </span><span class="identifier">tester</span><span class="plain">) {</span>
<span class="identifier">wchar_t</span><span class="plain"> </span><span class="identifier">c</span><span class="plain"> = </span><span class="functiontext">Str::get</span><span class="plain">(</span><span class="identifier">pos</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">c</span><span class="plain"> == </span><span class="character">' '</span><span class="plain">) </span><span class="identifier">PUT</span><span class="plain">(</span><span class="character">'\\'</span><span class="plain">);</span>
<span class="identifier">PUT</span><span class="plain">(</span><span class="identifier">c</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">tester</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>

View file

@ -557,7 +557,74 @@ For example,
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP14"></a><b>&#167;14. </b>Pictures must be in PNG, JPG or PDF format and can be included with lines
<p class="inwebparagraph"><a id="SP14"></a><b>&#167;14. </b>Cross-references are also allowed. These are normally written within <code class="display"><span class="extract">//</span></code>
signs and are only available in the commentary of a web. They allow us to
place cross-references like so:
</p>
<pre class="display">
<span class="plain">To see how cross-references are implemented, see //Format Methods//,</span>
<span class="plain">or more generally the whole of //Chapter 5//; to decipher the text,</span>
<span class="plain">Inweb uses code from //foundation// at //foundation: Web Modules//.</span>
</pre>
<p class="inwebparagraph">To see how cross-references are implemented, see <a href="5-fm.html" class="internal">Format Methods</a>,
or more generally the whole of <a href="5-fm.html" class="internal">Chapter 5: Formats</a>; to decipher the text,
Inweb uses code from <a href="../foundation-module/1-fm.html" class="internal">the foundation module</a> at <a href="../foundation-module/8-wm.html" class="internal">Web Modules (in foundation)</a>.
</p>
<p class="inwebparagraph">What happened in that last sentence is that Inweb noticed the following:
</p>
<ul class="items"><li>(a) "Format Methods" is the name of a section of code in the Inweb web;
</li><li>(b) The web also has a "Chapter 5";
</li><li>(c) It uses a module called "foundation";
</li><li>(d) And that module has a section called "Web Modules".
</li></ul>
<p class="inwebparagraph">Inweb then made links accordingly. Chapters, which can be referred to either
numerically, link to the first section in them; modules likewise.
</p>
<p class="inwebparagraph">Errors are thrown if these references are in any way ambiguous. They are not
case sensitive.
</p>
<p class="inwebparagraph">Cross-references also work inside text extracts marked as <code class="display"><span class="extract">hyperlinked</span></code>.
</p>
<pre class="display">
<span class="plain">= (hyperlinked text)</span>
<span class="plain">See the //Manual// for more on this.</span>
<span class="plain">=</span>
</pre>
<p class="inwebparagraph">produces:
</p>
<pre class="display">
<span class="plain">See the <a href="M-iti.html" class="internal">Manual</a> for more on this.</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph">This notation may be inconvenient if you need <code class="display"><span class="extract">//</span></code> for something else, but it
can be configured in the Contents page of a web, say like so:
</p>
<pre class="display">
<span class="element">Cross-References Notation</span><span class="plain">:</span><span class="string"> &amp;&amp;&amp;</span>
</pre>
<p class="inwebparagraph">It's also possible to disable cross-referencing entirely with:
</p>
<pre class="display">
<span class="element">Cross-References Notation</span><span class="plain">:</span><span class="string"> Off</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP15"></a><b>&#167;15. </b>Pictures must be in PNG, JPG or PDF format and can be included with lines
like:
</p>
@ -577,7 +644,7 @@ the web called <code class="display"><span class="extract">Figures</span></code>
pathname <code class="display"><span class="extract">Figures/Fig_2_3.pdf</span></code>.
</p>
<p class="inwebparagraph"><a id="SP15"></a><b>&#167;15. </b>Mathematical formulae can be typed in TeX notation between dollar signs,
<p class="inwebparagraph"><a id="SP16"></a><b>&#167;16. </b>Mathematical formulae can be typed in TeX notation between dollar signs,
as usual for TeX formulae. This can of course only really be rendered if
the weave is to TeX, but a few very approximate attempts are made by Inweb
so that the HTML version may also make sense. For example, <code class="display"><span class="extract">$x \leq y$</span></code> would

View file

@ -32,6 +32,9 @@
programming language project.
</p>
<p class="inwebparagraph"><a href="1-ptt.html" class="internal">Patterns</a>
</p>
<p class="inwebparagraph">This means that it is a preprocessor and organiser of source code. It reads in
a "web", an expression of a program which mixes code with heavy quantities of
commentary. Inweb can do two basic things: "weave" the web into a booklet or

View file

@ -176,8 +176,8 @@
<p><span class="purpose">Weaving to a variety of different human-readable formats.</span></p>
<ul class="sectionlist">
<li>
<p><a href="5-wf.html"><spon class="sectiontitle">Weave Formats</span></a> -
<span class="purpose">To characterise the different weaving output formats (text, typeset, web and so on).</span></p>
<p><a href="5-fm.html"><spon class="sectiontitle">Format Methods</span></a> -
<span class="purpose">To characterise the relevant differences in behaviour between the various weaving formats offered, such as HTML, ePub, or TeX.</span></p>
</li>
<li>
<p><a href="5-ptf.html"><spon class="sectiontitle">Plain Text Format</span></a> -

View file

@ -1,4 +1,4 @@
[Foundation::] Foundation.
[Foundation::] Foundation Module.
Starting up and shutting down.

View file

@ -568,6 +568,16 @@ int Str::includes(text_stream *S, text_stream *T) {
return FALSE;
}
int Str::includes_at(text_stream *line, int i, text_stream *pattern) {
if (Str::len(pattern) == 0) return FALSE;
if (i < 0) return FALSE;
if (i + Str::len(pattern) > Str::len(line)) return FALSE;
LOOP_THROUGH_TEXT(pos, pattern)
if (Str::get(pos) != Str::get_at(line, i++))
return FALSE;
return TRUE;
}
@h Shim for literal storage.
This is where all of those I-literals created by Inweb are stored at run-time.
Note that every instance of, say, |I"fish"| would return the same string,

View file

@ -1,4 +1,4 @@
[Wide::] Wide Strings.w.
[Wide::] Wide Strings.
A minimal library for handling wide C strings.

View file

@ -70,6 +70,7 @@ void Bibliographic::initialise_data(web_md *Wm) {
bd = Bibliographic::set_datum(Wm, I"TeX Mathematics Notation", I"On"); bd->on_or_off = TRUE;
bd = Bibliographic::set_datum(Wm, I"Code In Commentary Notation", I"|");
bd = Bibliographic::set_datum(Wm, I"Code In Code Comments Notation", I"|");
bd = Bibliographic::set_datum(Wm, I"Cross-References Notation", I"//");
bd = Bibliographic::set_datum(Wm, I"Web Syntax Version", NULL);
}

View file

@ -22,6 +22,7 @@ typedef struct module {
struct linked_list *dependencies; /* of |module|: which other modules does this need? */
struct text_stream *module_tag;
int origin_marker; /* one of the |*_MOM| values above */
struct linked_list *chapters_md; /* of |chapter_md|: just the ones in this module */
struct linked_list *sections_md; /* of |section_md|: just the ones in this module */
MEMORY_MANAGEMENT
} module;
@ -34,6 +35,7 @@ module *WebModules::new(text_stream *name, pathname *at, int m) {
M->dependencies = NEW_LINKED_LIST(module);
M->origin_marker = m;
M->module_tag = I"miscellaneous";
M->chapters_md = NEW_LINKED_LIST(chapter_md);
M->sections_md = NEW_LINKED_LIST(section_md);
return M;
}
@ -116,3 +118,93 @@ sought if it looks like a web.
int WebModules::exists(pathname *P) {
return WebMetadata::directory_looks_like_a_web(P);
}
@h Resolving cross-reference names.
Suppose we are in module |from_M| and want to understand which section of
a relevant web |text| might refer to. It could be the name of a module,
either this one or one dependent on it; or the name of a chapter in one
of those, or the shortened forms of those; or the name of a section. It
may match multiple possibilities: we return how many, and if this is
positive, we write the module in which the first find was made in |*return M|,
the section in |*return_Sm|, and set the flag |*named_as_module| according
to whether the reference was a bare module name (say, "foundation") or not.
Note that we consider first the possibilities within |from_M|: we only
look at other modules if there are none. Thus, an unambiguous result in
|from_M| is good enough, even if there are other possibilities elsewhere.
A reference in the form |module: reference| is taken to be in the module
of that name: for example, |"foundation: Web Modules"| would find the
section of code you are now reading.
=
int WebModules::named_reference(module **return_M, section_md **return_Sm,
int *named_as_module, text_stream *title, module *from_M, text_stream *text, int list) {
*return_M = NULL; *return_Sm = NULL; *named_as_module = FALSE;
module *M;
int finds = 0;
if (from_M == NULL) return 0;
match_results mr = Regexp::create_mr();
text_stream *seek = text;
if (Regexp::match(&mr, text, L"(%C+?): *(%c+?) *")) {
LOOP_OVER_LINKED_LIST(M, module, from_M->dependencies)
if (Str::eq_insensitive(M->module_name, mr.exp[0])) {
seek = mr.exp[1];
@<Look for references to chapters or sections in M@>;
}
}
Regexp::dispose_of(&mr);
seek = text;
for (int stage = 1; ((finds == 0) && (stage <= 2)); stage++) {
if (stage == 1) {
M = from_M;
@<Look for references to chapters or sections in M@>;
}
if (stage == 2) {
LOOP_OVER_LINKED_LIST(M, module, from_M->dependencies)
@<Look for references to chapters or sections in M@>;
}
}
return finds;
}
@<Look for references to chapters or sections in M@> =
if (M == NULL) internal_error("no module");
if (Str::eq_insensitive(M->module_name, seek))
@<Found first section in module@>;
chapter_md *Cm;
section_md *Sm;
LOOP_OVER_LINKED_LIST(Cm, chapter_md, M->chapters_md) {
if ((Str::eq_insensitive(Cm->ch_title, seek)) ||
(Str::eq_insensitive(Cm->ch_basic_title, seek)) ||
(Str::eq_insensitive(Cm->ch_decorated_title, seek)))
@<Found first section in chapter@>;
LOOP_OVER_LINKED_LIST(Sm, section_md, Cm->sections_md)
if (Str::eq_insensitive(Sm->sect_title, seek))
@<Found section by name@>;
}
@<Found first section in module@> =
finds++;
if (finds == 1) {
*return_M = M; *return_Sm = FIRST_IN_LINKED_LIST(section_md, M->sections_md);
*named_as_module = TRUE;
WRITE_TO(title, "the %S module", M->module_name);
}
if (list) WRITE_TO(STDERR, "(%d) Module '%S'\n", finds, M->module_name);
@<Found first section in chapter@> =
finds++;
if (finds == 1) {
*return_M = M; *return_Sm = FIRST_IN_LINKED_LIST(section_md, Cm->sections_md);
WRITE_TO(title, "%S", Cm->ch_title);
}
if (list) WRITE_TO(STDERR, "(%d) Chapter '%S'\n", finds, Cm->ch_title);
@<Found section by name@> =
finds++;
if (finds == 1) {
*return_M = M; *return_Sm = Sm;
WRITE_TO(title, "%S", Sm->sect_title);
}
if (list) WRITE_TO(STDERR, "(%d) Section '%S'\n", finds, Sm->sect_title);

View file

@ -50,6 +50,8 @@ typedef struct web_md {
typedef struct chapter_md {
struct text_stream *ch_range; /* e.g., |P| for Preliminaries, |7| for Chapter 7, |C| for Appendix C */
struct text_stream *ch_title; /* e.g., "Chapter 3: Fresh Water Fish" */
struct text_stream *ch_basic_title; /* e.g., "Chapter 3" */
struct text_stream *ch_decorated_title; /* e.g., "Fresh Water Fish" */
struct text_stream *rubric; /* optional; without double-quotation marks */
struct text_stream *ch_language_name; /* in which most of the sections are written */
@ -462,7 +464,17 @@ with the same language as the main web unless stated otherwise.
@<Create the new chapter with these details@> =
chapter_md *Cm = CREATE(chapter_md);
Cm->ch_range = Str::duplicate(new_chapter_range);
if (line == NULL) PRINT("Nullity!\n");
Cm->ch_title = Str::duplicate(line);
match_results mr = Regexp::create_mr();
if (Regexp::match(&mr, Cm->ch_title, L"(%c*?): *(%c*)")) {
Cm->ch_basic_title = Str::duplicate(mr.exp[0]);
Cm->ch_decorated_title = Str::duplicate(mr.exp[1]);
} else {
Cm->ch_basic_title = Str::duplicate(Cm->ch_title);
Cm->ch_decorated_title = Str::new();
}
Regexp::dispose_of(&mr);
Cm->rubric = Str::new();
Cm->ch_language_name = language_name;
Cm->imported = TRUE;
@ -470,6 +482,7 @@ with the same language as the main web unless stated otherwise.
if (RS->main_web_not_module) Cm->imported = FALSE;
ADD_TO_LINKED_LIST(Cm, chapter_md, RS->Wm->chapters_md);
ADD_TO_LINKED_LIST(Cm, chapter_md, RS->reading_from->chapters_md);
RS->chapter_being_scanned = Cm;
@ That's enough on creating chapters. This is the more interesting business
@ -478,7 +491,6 @@ we also read in and process its file.
@<Read about, and read in, a new section@> =
section_md *Sm = CREATE(section_md);
Sm = CREATE(section_md);
@<Initialise the section structure@>;
@<Add the section to the web and the current chapter@>;
@<Work out the language and tangle target for the section@>;

View file

@ -6,7 +6,7 @@ Licence: Artistic License 2.0
Chapter 1: Setting Up
"Absolute basics."
Foundation
Foundation Module
POSIX Platforms ^"ifdef-PLATFORM_POSIX"
Windows Platform ^"ifdef-PLATFORM_WINDOWS"