Modernised Figure syntax

This commit is contained in:
Graham Nelson 2020-04-10 09:11:09 +01:00
parent 9d1c0173b8
commit c66f5c1fae
24 changed files with 652 additions and 1117 deletions

View file

@ -278,7 +278,7 @@ would be "elctrcty", since we don't count "y" as a vowel here.
@ Version 1 syntax was cluttered up with a number of hardly-used markup
syntaxes called "commands", written in double squared brackets |[[Thus]]|.
In version 2, this notation is used only for figures.
In version 2, this notation is never used.
@<Parse the line as a possible Inweb command@> =
match_results mr = Regexp::create_mr();
@ -309,13 +309,7 @@ In version 2, this notation is used only for figures.
Tags::add_by_name(L->owning_paragraph, I"Figures");
L->command_code = FIGURE_CMD;
} else {
if (S->md->using_syntax >= V2_SYNTAX) {
Tags::add_by_name(L->owning_paragraph, I"Figures");
L->command_code = FIGURE_CMD;
Str::copy(L->text_operand, full_command);
} else {
Main::error_in_web(I"unknown [[command]]", L);
}
Main::error_in_web(I"unknown [[command]]", L);
}
L->is_commentary = TRUE;
DISCARD_TEXT(command_text);
@ -421,6 +415,14 @@ division in the current section.
@<Make plainer@>;
code_pl_for_body = NULL;
@<Spool from file@>;
} else if ((current_paragraph) &&
(Regexp::match(&mr2, mr.exp[0], L"%(figure (%c+)%)"))) {
Tags::add_by_name(L->owning_paragraph, I"Figures");
L->command_code = FIGURE_CMD;
L->category = COMMAND_LCAT;
code_lcat_for_body = COMMENT_BODY_LCAT;
L->text_operand = Str::duplicate(mr2.exp[0]);
comment_mode = TRUE;
} else {
Main::error_in_web(I"unknown bracketed annotation", L);
}

View file

@ -57,7 +57,7 @@ void Analyser::catalogue_the_sections(web *W, text_stream *range, int form) {
LOOP_OVER_LINKED_LIST(S, section, C->sections) {
if (max_range_width < Str::len(S->sect_range)) max_range_width = Str::len(S->sect_range);
TEMPORARY_TEXT(main_title);
WRITE_TO(main_title, "Chapter %S/%S", C->md->ch_range, S->md->sect_title);
WRITE_TO(main_title, "%S/%S", C->md->ch_basic_title, S->md->sect_title);
if (max_width < Str::len(main_title)) max_width = Str::len(main_title);
DISCARD_TEXT(main_title);
}
@ -66,14 +66,13 @@ void Analyser::catalogue_the_sections(web *W, text_stream *range, int form) {
PRINT(" -----\n");
LOOP_OVER_LINKED_LIST(S, section, C->sections) {
TEMPORARY_TEXT(main_title);
WRITE_TO(main_title, "Chapter %S/%S", C->md->ch_range, S->md->sect_title);
WRITE_TO(main_title, "%S/%S", C->md->ch_basic_title, S->md->sect_title);
PRINT("%4d %S", S->sect_extent, S->sect_range);
for (int i = Str::len(S->sect_range); i<max_range_width+2; i++) PRINT(" ");
PRINT("%S", main_title);
for (int i = Str::len(main_title); i<max_width+2; i++) PRINT(" ");
if (form != BASIC_SECTIONCAT)
LanguageMethods::catalogue(S->sect_language, S,
(form == FUNCTIONS_SECTIONCAT)?TRUE:FALSE);
Structures::catalogue(S, (form == FUNCTIONS_SECTIONCAT)?TRUE:FALSE);
PRINT("\n");
DISCARD_TEXT(main_title);
}

View file

@ -181,19 +181,19 @@ at us; but we don't weave them into the output, that's for sure.
match_results mr = Regexp::create_mr();
if (Regexp::match(&mr, figname, L"(%d+)cm: (%c+)")) {
if (S->md->using_syntax > V1_SYNTAX)
Parser::wrong_version(S->md->using_syntax, L, "[[Figure: Xcm:...]]", V1_SYNTAX);
Parser::wrong_version(S->md->using_syntax, L, "Figure: Xcm:...", V1_SYNTAX);
Formats::figure(OUT, wv, mr.exp[1], Str::atoi(mr.exp[0], 0), -1, NULL);
} else if (Regexp::match(&mr, figname, L"(%c+) width (%d+)cm")) {
if (S->md->using_syntax < V2_SYNTAX)
Parser::wrong_version(S->md->using_syntax, L, "[[F width Xcm]]", V2_SYNTAX);
Parser::wrong_version(S->md->using_syntax, L, "F width Xcm", V2_SYNTAX);
Formats::figure(OUT, wv, mr.exp[0], Str::atoi(mr.exp[1], 0), -1, NULL);
} else if (Regexp::match(&mr, figname, L"(%c+) height (%d+)cm")) {
if (S->md->using_syntax < V2_SYNTAX)
Parser::wrong_version(S->md->using_syntax, L, "[[F height Xcm]]", V2_SYNTAX);
Parser::wrong_version(S->md->using_syntax, L, "F height Xcm", V2_SYNTAX);
Formats::figure(OUT, wv, mr.exp[0], -1, Str::atoi(mr.exp[1], 0), NULL);
} else if (Regexp::match(&mr, figname, L"(%c+) as (%c+)")) {
if (S->md->using_syntax < V2_SYNTAX)
Parser::wrong_version(S->md->using_syntax, L, "[[F as L]]", V2_SYNTAX);
Parser::wrong_version(S->md->using_syntax, L, "F as L", V2_SYNTAX);
programming_language *pl = Languages::find_by_name(mr.exp[1], W);
Formats::figure(OUT, wv, mr.exp[0], -1, -1, pl);
} else {

View file

@ -13,7 +13,6 @@ void CLike::make_c_like(programming_language *pl) {
METHOD_ADD(pl, ADDITIONAL_EARLY_MATTER_TAN_MTID, CLike::additional_early_matter);
METHOD_ADD(pl, ADDITIONAL_PREDECLARATIONS_TAN_MTID, CLike::additional_predeclarations);
METHOD_ADD(pl, CATALOGUE_ANA_MTID, CLike::catalogue);
METHOD_ADD(pl, EARLY_PREWEAVE_ANALYSIS_ANA_MTID, CLike::analyse_code);
METHOD_ADD(pl, LATE_PREWEAVE_ANALYSIS_ANA_MTID, CLike::post_analysis);
}
@ -36,7 +35,6 @@ source line being scanned lies within.
=
int cc_sp = 0;
source_line *cc_stack[MAX_CONDITIONAL_COMPILATION_STACK];
c_structure *first_cst_alphabetically = NULL;
void CLike::further_parsing(programming_language *self, web *W) {
@<Find every typedef struct in the tangle@>;
@ -101,13 +99,13 @@ takes care of it automatically.
match_results mr = Regexp::create_mr();
if (Regexp::match(&mr, L->text, L"typedef struct (%i+) %c*{%c*")) {
@<Attach a structure to this source line@>;
current_str = Structures::new_struct(W, mr.exp[0], L);
Tags::add_by_name(L->owning_paragraph, I"Structures");
} else if ((Str::get_first_char(L->text) == '}') && (current_str)) {
current_str->typedef_ends = L;
current_str = NULL;
} else if ((current_str) && (current_str->typedef_ends == NULL)) {
@<Work through the a line in the structure definition@>;
@<Work through a line in the structure definition@>;
} else if ((Regexp::match(&mr, L->text, L"typedef %c+")) &&
(Regexp::match(&mr, L->text, L"%c+##%c+") == FALSE)) {
if (L->owning_paragraph->placed_very_early == FALSE)
@ -116,64 +114,6 @@ takes care of it automatically.
Regexp::dispose_of(&mr);
}
@ For each |typedef struct| we find, we will make one of these:
=
typedef struct c_structure {
struct text_stream *structure_name;
int tangled; /* whether the structure definition has been tangled out */
struct source_line *typedef_begins; /* opening line of |typedef| */
struct source_line *typedef_ends; /* closing line, where |}| appears */
struct linked_list *incorporates; /* of |c_structure| */
struct linked_list *elements; /* of |structure_element| */
struct c_structure *next_cst_alphabetically;
MEMORY_MANAGEMENT
} c_structure;
@<Attach a structure to this source line@> =
c_structure *str = CREATE(c_structure);
@<Initialise the C structure structure@>;
Analyser::mark_reserved_word_for_section(L->owning_section, str->structure_name, RESERVED_COLOUR);
@<Add this to the lists for its web and its paragraph@>;
@<Insertion-sort this into the alphabetical list of all structures found@>;
current_str = str;
@<Initialise the C structure structure@> =
str->structure_name = Str::duplicate(mr.exp[0]);
str->typedef_begins = L;
str->tangled = FALSE;
str->typedef_ends = NULL;
str->incorporates = NEW_LINKED_LIST(c_structure);
str->elements = NEW_LINKED_LIST(structure_element);
@<Add this to the lists for its web and its paragraph@> =
ADD_TO_LINKED_LIST(str, c_structure, W->c_structures);
ADD_TO_LINKED_LIST(str, c_structure, L->owning_paragraph->structures);
@<Insertion-sort this into the alphabetical list of all structures found@> =
str->next_cst_alphabetically = NULL;
if (first_cst_alphabetically == NULL) first_cst_alphabetically = str;
else {
int placed = FALSE;
c_structure *last = NULL;
for (c_structure *seq = first_cst_alphabetically; seq;
seq = seq->next_cst_alphabetically) {
if (Str::cmp(str->structure_name, seq->structure_name) < 0) {
if (seq == first_cst_alphabetically) {
str->next_cst_alphabetically = first_cst_alphabetically;
first_cst_alphabetically = str;
} else {
last->next_cst_alphabetically = str;
str->next_cst_alphabetically = seq;
}
placed = TRUE;
break;
}
last = seq;
}
if (placed == FALSE) last->next_cst_alphabetically = str;
}
@ At this point we're reading a line within the structure's definition; for
the sake of an illustrative example, let's suppose that line is:
= (text)
@ -181,7 +121,7 @@ the sake of an illustrative example, let's suppose that line is:
=
We need to extract the element name, |val|, and make a note of it.
@<Work through the a line in the structure definition@> =
@<Work through a line in the structure definition@> =
TEMPORARY_TEXT(p);
Str::copy(p, L->text);
Str::trim_white_space(p);
@ -194,7 +134,7 @@ We need to extract the element name, |val|, and make a note of it.
match_results mr = Regexp::create_mr();
TEMPORARY_TEXT(elname);
@<Copy the element name into elname@>;
@<Record the element@>;
Structures::new_element(current_str, elname, L);
DISCARD_TEXT(elname);
Regexp::dispose_of(&mr);
}
@ -238,32 +178,6 @@ down to just the identifier characters at the front, i.e., to |val|.
Str::substr(elname, pos, Str::end(p));
if (Regexp::match(&mr, elname, L"(%i+)%c*")) Str::copy(elname, mr.exp[0]);
@ Now we create an instance of |structure_element| to record the existence
of the element |val|, and add it to the linked list of elements of the
structure being defined.
In InC, only, certain element names used often in Inform's source code are
given mildly special treatment. This doesn't amount to much. |allow_sharing|
has no effect on tangling, so it doesn't change the program. It simply
affects the reports in the woven code about where structures are used.
=
typedef struct structure_element {
struct text_stream *element_name;
struct source_line *element_created_at;
int allow_sharing;
MEMORY_MANAGEMENT
} structure_element;
@<Record the element@> =
Analyser::mark_reserved_word_for_section(L->owning_section, elname, ELEMENT_COLOUR);
structure_element *elt = CREATE(structure_element);
elt->element_name = Str::duplicate(elname);
elt->allow_sharing = FALSE;
elt->element_created_at = L;
if (LanguageMethods::share_element(W->main_language, elname)) elt->allow_sharing = TRUE;
ADD_TO_LINKED_LIST(elt, structure_element, current_str->elements);
@h Structure dependency.
We say that S depends on T if |struct S| has an element whose type is
|struct T|. That matters because if so then |struct T| has to be defined
@ -280,7 +194,7 @@ will not trip the switch here.
@<Work out which structs contain which others@> =
c_structure *current_str;
LOOP_OVER(current_str, c_structure) {
for (source_line *L = current_str->typedef_begins;
for (source_line *L = current_str->structure_header_at;
((L) && (L != current_str->typedef_ends));
L = L->next_line) {
match_results mr = Regexp::create_mr();
@ -354,12 +268,12 @@ forms like |static long long int| will work.
@<A function definition was found@> =
@<Soak up further arguments from continuation lines after the declaration@>;
Analyser::mark_reserved_word_for_section(L->owning_section, fname, FUNCTION_COLOUR);
function *fn = CREATE(function);
@<Initialise the function structure@>;
@<Add the function to its paragraph and line@>;
if (W->main_language->supports_namespaces)
@<Check that the function has its namespace correctly declared@>;
function *fn = Structures::new_function(fname, L);
fn->function_arguments = Str::duplicate(arguments);
WRITE_TO(fn->function_type, "%S%S %S", qualifiers, ftype, asts);
if (Str::eq_wide_string(fn->function_name, L"isdigit")) fn->call_freely = TRUE;
fn->no_conditionals = cc_sp;
for (int i=0; i<cc_sp; i++) fn->within_conditionals[i] = cc_stack[i];
@ In some cases the function's declaration runs over several lines:
= (text as code)
@ -390,80 +304,6 @@ reach an open brace |{|.
int n = Regexp::find_open_brace(arguments);
if (n >= 0) Str::truncate(arguments, n);
@ Each function definition found results in one of these structures being made:
=
typedef struct function {
struct text_stream *function_name; /* e.g., |"cultivate"| */
struct text_stream *function_type; /* e.g., |"tree *"| */
struct text_stream *function_arguments; /* e.g., |"int rainfall)"|: note |)| */
struct source_line *function_header_at; /* where the first line of the header begins */
int within_namespace; /* written using InC namespace dividers */
int called_from_other_sections;
int call_freely;
int no_conditionals;
struct source_line *within_conditionals[MAX_CONDITIONAL_COMPILATION_STACK];
MEMORY_MANAGEMENT
} function;
@ Note that we take a snapshot of the conditional compilation stack as
part of the function structure. We'll need it when predeclaring the function.
@<Initialise the function structure@> =
fn->function_name = Str::duplicate(fname);
fn->function_arguments = Str::duplicate(arguments);
fn->function_type = Str::new();
WRITE_TO(fn->function_type, "%S%S %S", qualifiers, ftype, asts);
fn->within_namespace = FALSE;
fn->called_from_other_sections = FALSE;
fn->call_freely = FALSE;
if (Str::eq_wide_string(fn->function_name, L"isdigit")) fn->call_freely = TRUE;
fn->function_header_at = L;
fn->no_conditionals = cc_sp;
for (int i=0; i<cc_sp; i++) fn->within_conditionals[i] = cc_stack[i];
@<Add the function to its paragraph and line@> =
paragraph *P = L->owning_paragraph;
if (P) ADD_TO_LINKED_LIST(fn, function, P->functions);
L->function_defined = fn;
@<Check that the function has its namespace correctly declared@> =
text_stream *declared_namespace = NULL;
match_results mr = Regexp::create_mr();
if (Regexp::match(&mr, fname, L"(%c+::)%c*")) {
declared_namespace = mr.exp[0];
fn->within_namespace = TRUE;
} else if ((Str::eq_wide_string(fname, L"main")) && (Str::eq_wide_string(S->sect_namespace, L"Main::")))
declared_namespace = I"Main::";
if ((Str::ne(declared_namespace, S->sect_namespace)) &&
(L->owning_paragraph->placed_very_early == FALSE)) {
TEMPORARY_TEXT(err_mess);
if (Str::len(declared_namespace) == 0)
WRITE_TO(err_mess, "Function '%S' should have namespace prefix '%S'",
fname, S->sect_namespace);
else if (Str::len(S->sect_namespace) == 0)
WRITE_TO(err_mess, "Function '%S' declared in a section with no namespace",
fname);
else
WRITE_TO(err_mess, "Function '%S' declared in a section with the wrong namespace '%S'",
fname, S->sect_namespace);
Main::error_in_web(err_mess, L);
DISCARD_TEXT(err_mess);
}
Regexp::dispose_of(&mr);
@ The following
=
c_structure *CLike::find_structure(web *W, text_stream *name) {
c_structure *str;
LOOP_OVER_LINKED_LIST(str, c_structure, W->c_structures)
if (Str::eq(name, str->structure_name))
return str;
return NULL;
}
@h Subcategorisation.
The following is called after the parser gives every line in the web a
category; we can, if we wish, change that for a more exotic one. We simply
@ -563,14 +403,14 @@ void CLike::tangle_structure(OUTPUT_STREAM, programming_language *self, c_struct
LOOP_OVER_LINKED_LIST(embodied, c_structure, str->incorporates)
CLike::tangle_structure(OUT, self, embodied);
str->tangled = TRUE;
Tags::open_ifdefs(OUT, str->typedef_begins->owning_paragraph);
LanguageMethods::insert_line_marker(OUT, self, str->typedef_begins);
for (source_line *L = str->typedef_begins; L; L = L->next_line) {
Tags::open_ifdefs(OUT, str->structure_header_at->owning_paragraph);
LanguageMethods::insert_line_marker(OUT, self, str->structure_header_at);
for (source_line *L = str->structure_header_at; L; L = L->next_line) {
WRITE("%S\n", L->text);
L->suppress_tangling = TRUE;
if (L == str->typedef_ends) break;
}
Tags::close_ifdefs(OUT, str->typedef_begins->owning_paragraph);
Tags::close_ifdefs(OUT, str->structure_header_at->owning_paragraph);
}
@ Functions are rather easier to deal with. In general, if a function was
@ -619,24 +459,7 @@ We have the opportunity here to sidestep the regular weaving algorithm, and do
our own thing. We decline.
@h Analysis.
This implements the additional information in the |-structures| and |-functions|
fprms of section catalogue.
=
void CLike::catalogue(programming_language *self, section *S, int functions_too) {
c_structure *str;
LOOP_OVER(str, c_structure)
if (str->typedef_begins->owning_section == S)
PRINT(" %S ", str->structure_name);
if (functions_too) {
function *fn;
LOOP_OVER(fn, function)
if (fn->function_header_at->owning_section == S)
PRINT("\n %S", fn->function_name);
}
}
@ Having found all those functions and structure elements, we make sure they
Having found all those functions and structure elements, we make sure they
are all known to Inweb's hash table of interesting identifiers:
=

View file

@ -393,18 +393,7 @@ These are really a little miscellaneous, but they all have to do with looking
at the code in a web and working out what's going on, rather than producing
any weave or tangle output.
This one provides details to add to the section catalogue if |-structures|
or |-functions| is used at the command line:
@e CATALOGUE_ANA_MTID
=
VMETHOD_TYPE(CATALOGUE_ANA_MTID, programming_language *pl, section *S, int functions_too)
void LanguageMethods::catalogue(programming_language *pl, section *S, int functions_too) {
VMETHOD_CALL(pl, CATALOGUE_ANA_MTID, S, functions_too);
}
@ The "preweave analysis" is an opportunity to look through the code before
The "preweave analysis" is an opportunity to look through the code before
any weaving of it occurs. It's never called on a tangle run. These methods
are called first and last in the process, respectively. (What happens in
between is essentially that Inweb looks for identifiers, for later syntax

View file

@ -50,6 +50,7 @@ Chapter 4: Languages
"Providing support for syntax-colouring and for better organisation of code
in different programming languages."
Programming Languages
Structures and Functions
Language Methods
ACME Support
The Painter

View file

@ -9,7 +9,7 @@ number greater than 2 can be written this way. This remains open, though
every even number is a sum of at most six primes (Ramaré, 1995) and every
odd number is a sum of at most five (Tao, 2012).
[[Letter.jpg height 10cm]]
= (figure Letter.jpg height 10cm)
Computer verification has been made up to around $10^{18}$, but by rather better
methods.

View file

@ -361,7 +361,8 @@ For example,
...which is essential in order to restore the state of
=
@ URLs in the web are automatically recognised and a weave to HTML will
@h Links.
URLs in the web are automatically recognised and a weave to HTML will
make them into links. For example:
= (text)
For further reading, see: https://en.wikipedia.org/wiki/How_to_Avoid_Huge_Ships
@ -381,7 +382,8 @@ produces:
Compare: https://en.wikipedia.org/wiki/Crocheting_Adventures_with_Hyperbolic_Planes
=
@ Cross-references are also allowed. These are normally written within |//|
@h Cross-references.
These are like links, but internal. 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)
@ -406,7 +408,7 @@ 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)
= (text as Inweb)
= (hyperlinked text)
See the //Manual// for more on this.
=
@ -426,22 +428,31 @@ It's also possible to disable cross-referencing entirely with:
Cross-References Notation: Off
=
@ Pictures must be in PNG, JPG or PDF format and can be included with lines
like:
@h Figures.
Images to be included in weaves of a web are called "Figures", as they
would be in a printed book. These images should ideally be in PNG, JPG or PDF
format and placed in a subdirectory of the web called |Figures|: for instance,
the weaver would seek |Fig_2_3.pdf| at pathname |Figures/Fig_2_3.pdf|.
To embed an image, we write like so:
= (text as Inweb)
[[Fig_0_1.pdf]]
[[Whatever.jpg width 6cm]]
[[Something.pdf height 2cm]]
= (figure mars.jpg)
=
In the latter examples, we constrain the width or the height of the image
With results like so:
= (figure mars.jpg)
Inweb also has some limited ability to control the dimensions of an image as it
would be used in a PDF via TeX:
= (text as Inweb)
= (figure Whatever.jpg width 6cm)
= (figure Something.jpg height 2cm)
=
In these examples, we constrain the width or the height of the image
to be exactly that given: it is scaled accordingly. (They can't both be
constrained, so you can't change the aspect ratio.)
The weaver expects that any pictures needed will be stored in a subdirectory of
the web called |Figures|: for instance, the weaver would seek |Fig_2_3.pdf| at
pathname |Figures/Fig_2_3.pdf|.
@ Mathematical formulae can be typed in TeX notation between dollar signs,
@h Mathematics notation.
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, |$x \leq y$| would

View file

@ -1,6 +1,6 @@
# Inweb 7
v7-alpha.1+1A15 'Escape to Danger' (9 April 2020)
v7-alpha.1+1A16 'Escape to Danger' (10 April 2020)
## About Inweb

File diff suppressed because it is too large Load diff

View file

@ -1,3 +1,3 @@
Prerelease: alpha.1
Build Date: 9 April 2020
Build Number: 1A15
Build Date: 10 April 2020
Build Number: 1A16

View file

@ -125,7 +125,7 @@ subfolder called <code class="display"><span class="extract">Materials</span></c
<p class="inwebparagraph"></p>
<p class="endnote">The function main is used in <a href="#SP7_4_2">&#167;7.4.2</a>, 8/wm (<a href="8-wm.html#SP3">&#167;3</a>), 1/cnf (<a href="1-cnf.html#SP1">&#167;1</a>), 4/cl (<a href="4-cl.html#SP2_4_2_5">&#167;2.4.2.5</a>).</p>
<p class="endnote">The function main is used in <a href="#SP7_4_2">&#167;7.4.2</a>, 8/wm (<a href="8-wm.html#SP3">&#167;3</a>), 1/cnf (<a href="1-cnf.html#SP1">&#167;1</a>), 4/saf (<a href="4-saf.html#SP7_3">&#167;7.3</a>).</p>
<p class="inwebparagraph"><a id="SP6_1"></a><b>&#167;6.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Initialise inweb</span> <span class="cwebmacronumber">6.1</span>&gt; =
@ -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>), 5/fm (<a href="5-fm.html#SP24">&#167;24</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/saf (<a href="4-saf.html#SP7_3">&#167;7.3</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#SP8">&#167;8</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

@ -70,7 +70,7 @@ correspond to one of these:
<p class="inwebparagraph"></p>
<p class="endnote">The structure source_line is accessed in 1/pc, 2/tr, 2/tp, 2/pm, 2/ec, 2/pn, 3/ta, 3/tw, 3/tt, 4/lm, 4/as, 4/cl, 4/is, 5/tf and here.</p>
<p class="endnote">The structure source_line is accessed in 1/pc, 2/tr, 2/tp, 2/pm, 2/ec, 2/pn, 3/ta, 3/tw, 3/tt, 4/saf, 4/lm, 4/as, 4/cl, 4/is, 5/tf and here.</p>
<p class="inwebparagraph"><a id="SP2"></a><b>&#167;2. </b></p>

View file

@ -132,7 +132,7 @@ the tag is <code class="display"><span class="extract">History</span></code>, th
<p class="inwebparagraph"></p>
<p class="endnote">The function Tags::add_by_name is used in 2/tr (<a href="2-tr.html#SP4_4">&#167;4.4</a>), 2/tp (<a href="2-tp.html#SP1_1_2">&#167;1.1.2</a>, <a href="2-tp.html#SP1_1_6_3">&#167;1.1.6.3</a>), 4/cl (<a href="4-cl.html#SP2_2">&#167;2.2</a>).</p>
<p class="endnote">The function Tags::add_by_name is used in 2/tr (<a href="2-tr.html#SP4_4">&#167;4.4</a>), 2/tp (<a href="2-tp.html#SP1_1_2">&#167;1.1.2</a>, <a href="2-tp.html#SP1_1_6_3">&#167;1.1.6.3</a>, <a href="2-tp.html#SP1_1_6_7">&#167;1.1.6.7</a>), 4/cl (<a href="4-cl.html#SP2_2">&#167;2.2</a>).</p>
<p class="inwebparagraph"><a id="SP5"></a><b>&#167;5. </b>If a given line is tagged with a given tag, what caption does it have?
</p>
@ -209,9 +209,9 @@ doesn't specify a tag.)
<p class="inwebparagraph"></p>
<p class="endnote">The function Tags::open_ifdefs is used in 3/tt (<a href="3-tt.html#SP1_1_1_1">&#167;1.1.1.1</a>, <a href="3-tt.html#SP2">&#167;2</a>), 4/cl (<a href="4-cl.html#SP5">&#167;5</a>, <a href="4-cl.html#SP6_1">&#167;6.1</a>, <a href="4-cl.html#SP6_3">&#167;6.3</a>, <a href="4-cl.html#SP6_4">&#167;6.4</a>).</p>
<p class="endnote">The function Tags::open_ifdefs is used in 3/tt (<a href="3-tt.html#SP1_1_1_1">&#167;1.1.1.1</a>, <a href="3-tt.html#SP2">&#167;2</a>), 4/cl (<a href="4-cl.html#SP4">&#167;4</a>, <a href="4-cl.html#SP5_1">&#167;5.1</a>, <a href="4-cl.html#SP5_3">&#167;5.3</a>, <a href="4-cl.html#SP5_4">&#167;5.4</a>).</p>
<p class="endnote">The function Tags::close_ifdefs is used in 3/tt (<a href="3-tt.html#SP1_1_1_1">&#167;1.1.1.1</a>, <a href="3-tt.html#SP2">&#167;2</a>), 4/cl (<a href="4-cl.html#SP5">&#167;5</a>, <a href="4-cl.html#SP6_1">&#167;6.1</a>, <a href="4-cl.html#SP6_3">&#167;6.3</a>, <a href="4-cl.html#SP6_4">&#167;6.4</a>).</p>
<p class="endnote">The function Tags::close_ifdefs is used in 3/tt (<a href="3-tt.html#SP1_1_1_1">&#167;1.1.1.1</a>, <a href="3-tt.html#SP2">&#167;2</a>), 4/cl (<a href="4-cl.html#SP4">&#167;4</a>, <a href="4-cl.html#SP5_1">&#167;5.1</a>, <a href="4-cl.html#SP5_3">&#167;5.3</a>, <a href="4-cl.html#SP5_4">&#167;5.4</a>).</p>
<p class="endnote">The function Tags::show_endnote_on_ifdefs is used in 3/tw (<a href="3-tw.html#SP2">&#167;2</a>).</p>

View file

@ -462,7 +462,7 @@ would be "elctrcty", since we don't count "y" as a vowel here.
<p class="inwebparagraph"><a id="SP1_1_6_3"></a><b>&#167;1.1.6.3. </b>Version 1 syntax was cluttered up with a number of hardly-used markup
syntaxes called "commands", written in double squared brackets <code class="display"><span class="extract">[[Thus]]</span></code>.
In version 2, this notation is used only for figures.
In version 2, this notation is never used.
</p>
@ -500,13 +500,7 @@ In version 2, this notation is used only for figures.
<span class="functiontext">Tags::add_by_name</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">I</span><span class="string">"Figures"</span><span class="plain">);</span>
<span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">command_code</span><span class="plain"> = </span><span class="constant">FIGURE_CMD</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">S</span><span class="plain">-&gt;</span><span class="element">md</span><span class="plain">-&gt;</span><span class="identifier">using_syntax</span><span class="plain"> &gt;= </span><span class="constant">V2_SYNTAX</span><span class="plain">) {</span>
<span class="functiontext">Tags::add_by_name</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">I</span><span class="string">"Figures"</span><span class="plain">);</span>
<span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">command_code</span><span class="plain"> = </span><span class="constant">FIGURE_CMD</span><span class="plain">;</span>
<span class="functiontext">Str::copy</span><span class="plain">(</span><span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">text_operand</span><span class="plain">, </span><span class="identifier">full_command</span><span class="plain">);</span>
<span class="plain">} </span><span class="reserved">else</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">"unknown [[command]]"</span><span class="plain">, </span><span class="identifier">L</span><span class="plain">);</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">"unknown [[command]]"</span><span class="plain">, </span><span class="identifier">L</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">is_commentary</span><span class="plain"> = </span><span class="constant">TRUE</span><span class="plain">;</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">command_text</span><span class="plain">);</span>
@ -660,6 +654,14 @@ division in the current section.
&lt;<span class="cwebmacro">Make plainer</span> <span class="cwebmacronumber">1.1.6.7.1</span>&gt;<span class="plain">;</span>
<span class="identifier">code_pl_for_body</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
&lt;<span class="cwebmacro">Spool from file</span> <span class="cwebmacronumber">1.1.6.7.2</span>&gt;<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">current_paragraph</span><span class="plain">) &amp;&amp;</span>
<span class="plain">(</span><span class="functiontext">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr2</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">L</span><span class="string">"%(figure (%c+)%)"</span><span class="plain">))) {</span>
<span class="functiontext">Tags::add_by_name</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">I</span><span class="string">"Figures"</span><span class="plain">);</span>
<span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">command_code</span><span class="plain"> = </span><span class="constant">FIGURE_CMD</span><span class="plain">;</span>
<span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">category</span><span class="plain"> = </span><span class="constant">COMMAND_LCAT</span><span class="plain">;</span>
<span class="identifier">code_lcat_for_body</span><span class="plain"> = </span><span class="constant">COMMENT_BODY_LCAT</span><span class="plain">;</span>
<span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">text_operand</span><span class="plain"> = </span><span class="functiontext">Str::duplicate</span><span class="plain">(</span><span class="identifier">mr2</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[0]);</span>
<span class="identifier">comment_mode</span><span class="plain"> = </span><span class="constant">TRUE</span><span class="plain">;</span>
<span class="plain">} </span><span class="reserved">else</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">"unknown bracketed annotation"</span><span class="plain">, </span><span class="identifier">L</span><span class="plain">);</span>
<span class="plain">}</span>
@ -1091,7 +1093,7 @@ of French weaving" and the remainder,
<p class="inwebparagraph"></p>
<p class="endnote">The structure paragraph is accessed in 2/pm, 2/tgs, 2/pn, 3/tw, 3/tt, 4/cl, 4/is, 5/ptf, 5/tf, 5/hf and here.</p>
<p class="endnote">The structure paragraph is accessed in 2/pm, 2/tgs, 2/pn, 3/tw, 3/tt, 4/saf, 4/cl, 4/is, 5/ptf, 5/tf, 5/hf and here.</p>
<p class="inwebparagraph"><a id="SP1_1_6_5_1_8_2"></a><b>&#167;1.1.6.5.1.8.2. </b><code class="display">
&lt;<span class="cwebmacrodefn">Create a new paragraph, starting here, as new current paragraph</span> <span class="cwebmacronumber">1.1.6.5.1.8.2</span>&gt; =

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/fm, 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/saf, 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>
@ -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/fm, 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/saf, 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

@ -100,7 +100,7 @@ so that Chapter 4 contains no assumptions about the language.
<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">max_range_width</span><span class="plain"> &lt; </span><span class="functiontext">Str::len</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">-&gt;</span><span class="element">sect_range</span><span class="plain">)) </span><span class="identifier">max_range_width</span><span class="plain"> = </span><span class="functiontext">Str::len</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">-&gt;</span><span class="element">sect_range</span><span class="plain">);</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">main_title</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">main_title</span><span class="plain">, </span><span class="string">"Chapter %S/%S"</span><span class="plain">, </span><span class="identifier">C</span><span class="plain">-&gt;</span><span class="element">md</span><span class="plain">-&gt;</span><span class="element">ch_range</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">-&gt;</span><span class="element">md</span><span class="plain">-&gt;</span><span class="element">sect_title</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">main_title</span><span class="plain">, </span><span class="string">"%S/%S"</span><span class="plain">, </span><span class="identifier">C</span><span class="plain">-&gt;</span><span class="identifier">md</span><span class="plain">-&gt;</span><span class="element">ch_basic_title</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">-&gt;</span><span class="element">md</span><span class="plain">-&gt;</span><span class="element">sect_title</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">max_width</span><span class="plain"> &lt; </span><span class="functiontext">Str::len</span><span class="plain">(</span><span class="identifier">main_title</span><span class="plain">)) </span><span class="identifier">max_width</span><span class="plain"> = </span><span class="functiontext">Str::len</span><span class="plain">(</span><span class="identifier">main_title</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">main_title</span><span class="plain">);</span>
<span class="plain">}</span>
@ -109,14 +109,13 @@ so that Chapter 4 contains no assumptions about the language.
<span class="identifier">PRINT</span><span class="plain">(</span><span class="string">" -----\n"</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="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">main_title</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">main_title</span><span class="plain">, </span><span class="string">"Chapter %S/%S"</span><span class="plain">, </span><span class="identifier">C</span><span class="plain">-&gt;</span><span class="element">md</span><span class="plain">-&gt;</span><span class="element">ch_range</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">-&gt;</span><span class="element">md</span><span class="plain">-&gt;</span><span class="element">sect_title</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">main_title</span><span class="plain">, </span><span class="string">"%S/%S"</span><span class="plain">, </span><span class="identifier">C</span><span class="plain">-&gt;</span><span class="identifier">md</span><span class="plain">-&gt;</span><span class="element">ch_basic_title</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">-&gt;</span><span class="element">md</span><span class="plain">-&gt;</span><span class="element">sect_title</span><span class="plain">);</span>
<span class="identifier">PRINT</span><span class="plain">(</span><span class="string">"%4d %S"</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">-&gt;</span><span class="element">sect_extent</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">-&gt;</span><span class="element">sect_range</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"> = </span><span class="functiontext">Str::len</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">-&gt;</span><span class="element">sect_range</span><span class="plain">); </span><span class="identifier">i</span><span class="plain">&lt;</span><span class="identifier">max_range_width</span><span class="plain">+2; </span><span class="identifier">i</span><span class="plain">++) </span><span class="identifier">PRINT</span><span class="plain">(</span><span class="string">" "</span><span class="plain">);</span>
<span class="identifier">PRINT</span><span class="plain">(</span><span class="string">"%S"</span><span class="plain">, </span><span class="identifier">main_title</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"> = </span><span class="functiontext">Str::len</span><span class="plain">(</span><span class="identifier">main_title</span><span class="plain">); </span><span class="identifier">i</span><span class="plain">&lt;</span><span class="identifier">max_width</span><span class="plain">+2; </span><span class="identifier">i</span><span class="plain">++) </span><span class="identifier">PRINT</span><span class="plain">(</span><span class="string">" "</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">form</span><span class="plain"> != </span><span class="constant">BASIC_SECTIONCAT</span><span class="plain">)</span>
<span class="functiontext">LanguageMethods::catalogue</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">S</span><span class="plain">,</span>
<span class="plain">(</span><span class="identifier">form</span><span class="plain"> == </span><span class="constant">FUNCTIONS_SECTIONCAT</span><span class="plain">)?</span><span class="identifier">TRUE:FALSE</span><span class="plain">);</span>
<span class="functiontext">Structures::catalogue</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">, (</span><span class="identifier">form</span><span class="plain"> == </span><span class="constant">FUNCTIONS_SECTIONCAT</span><span class="plain">)?</span><span class="identifier">TRUE:FALSE</span><span class="plain">);</span>
<span class="identifier">PRINT</span><span class="plain">(</span><span class="string">"\n"</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">main_title</span><span class="plain">);</span>
<span class="plain">}</span>
@ -432,7 +431,7 @@ of each C function.
<p class="endnote">The function Analyser::find_hash_entry is used in <a href="#SP10">&#167;10</a>.</p>
<p class="endnote">The function Analyser::find_hash_entry_for_section is used in <a href="#SP12">&#167;12</a>, 3/tw (<a href="3-tw.html#SP2_2">&#167;2.2</a>, <a href="3-tw.html#SP2_3">&#167;2.3</a>), 4/cl (<a href="4-cl.html#SP9">&#167;9</a>, <a href="4-cl.html#SP10">&#167;10</a>), 4/is (<a href="4-is.html#SP14_1">&#167;14.1</a>, <a href="4-is.html#SP14_2">&#167;14.2</a>, <a href="4-is.html#SP18">&#167;18</a>).</p>
<p class="endnote">The function Analyser::find_hash_entry_for_section is used in <a href="#SP12">&#167;12</a>, 3/tw (<a href="3-tw.html#SP2_2">&#167;2.2</a>, <a href="3-tw.html#SP2_3">&#167;2.3</a>), 4/cl (<a href="4-cl.html#SP7">&#167;7</a>, <a href="4-cl.html#SP8">&#167;8</a>), 4/is (<a href="4-is.html#SP14_1">&#167;14.1</a>, <a href="4-is.html#SP14_2">&#167;14.2</a>, <a href="4-is.html#SP18">&#167;18</a>).</p>
<p class="inwebparagraph"><a id="SP10"></a><b>&#167;10. </b>Marking and testing these bits:
</p>
@ -462,7 +461,7 @@ of each C function.
<p class="endnote">The function Analyser::mark_reserved_word is used in 4/pl (<a href="4-pl.html#SP14">&#167;14</a>).</p>
<p class="endnote">The function Analyser::mark_reserved_word_for_section is used in 2/tp (<a href="2-tp.html#SP1_1_6_5_1_6">&#167;1.1.6.5.1.6</a>, <a href="2-tp.html#SP1_1_6_5_1_7">&#167;1.1.6.5.1.7</a>), 4/as (<a href="4-as.html#SP5">&#167;5</a>), 4/cl (<a href="4-cl.html#SP2_2_2">&#167;2.2.2</a>, <a href="4-cl.html#SP2_2_3_6">&#167;2.2.3.6</a>, <a href="4-cl.html#SP2_4_2">&#167;2.4.2</a>).</p>
<p class="endnote">The function Analyser::mark_reserved_word_for_section is used in 2/tp (<a href="2-tp.html#SP1_1_6_5_1_6">&#167;1.1.6.5.1.6</a>, <a href="2-tp.html#SP1_1_6_5_1_7">&#167;1.1.6.5.1.7</a>), 4/saf (<a href="4-saf.html#SP2">&#167;2</a>, <a href="4-saf.html#SP4">&#167;4</a>, <a href="4-saf.html#SP7">&#167;7</a>), 4/as (<a href="4-as.html#SP5">&#167;5</a>).</p>
<p class="endnote">The function Analyser::is_reserved_word is used in 4/tp (<a href="4-tp.html#SP5">&#167;5</a>).</p>

View file

@ -251,7 +251,7 @@ Almost all of the time, it simply prints <code class="display"><span class="extr
<p class="inwebparagraph"></p>
<p class="endnote">The function Tangler::tangle_code is used in <a href="#SP2">&#167;2</a>, <a href="#SP3_1">&#167;3.1</a>, <a href="#SP3_2">&#167;3.2</a>, 4/as (<a href="4-as.html#SP3">&#167;3</a>), 4/cl (<a href="4-cl.html#SP5">&#167;5</a>), 4/is (<a href="4-is.html#SP9_1_2_1">&#167;9.1.2.1</a>).</p>
<p class="endnote">The function Tangler::tangle_code is used in <a href="#SP2">&#167;2</a>, <a href="#SP3_1">&#167;3.1</a>, <a href="#SP3_2">&#167;3.2</a>, 4/as (<a href="4-as.html#SP3">&#167;3</a>), 4/cl (<a href="4-cl.html#SP4">&#167;4</a>), 4/is (<a href="4-is.html#SP9_1_2_1">&#167;9.1.2.1</a>).</p>
<p class="inwebparagraph"><a id="SP3_1"></a><b>&#167;3.1. </b>The first form of escape is a paragraph macro in the middle of code. For
example, we handle
@ -380,7 +380,7 @@ passes straight through. So <code class="display"><span class="extract">[[water]
<p class="inwebparagraph"></p>
<p class="endnote">The function Tangler::primary_target is used in 1/pc (<a href="1-pc.html#SP7_4_2">&#167;7.4.2</a>), 3/ta (<a href="3-ta.html#SP4">&#167;4</a>, <a href="3-ta.html#SP4_1">&#167;4.1</a>), 4/cl (<a href="4-cl.html#SP2">&#167;2</a>, <a href="4-cl.html#SP2_2">&#167;2.2</a>, <a href="4-cl.html#SP6_1">&#167;6.1</a>, <a href="4-cl.html#SP6_4">&#167;6.4</a>), 4/is (<a href="4-is.html#SP3">&#167;3</a>, <a href="4-is.html#SP6">&#167;6</a>, <a href="4-is.html#SP7">&#167;7</a>).</p>
<p class="endnote">The function Tangler::primary_target is used in 1/pc (<a href="1-pc.html#SP7_4_2">&#167;7.4.2</a>), 3/ta (<a href="3-ta.html#SP4">&#167;4</a>, <a href="3-ta.html#SP4_1">&#167;4.1</a>), 4/cl (<a href="4-cl.html#SP2">&#167;2</a>, <a href="4-cl.html#SP2_2">&#167;2.2</a>, <a href="4-cl.html#SP5_1">&#167;5.1</a>, <a href="4-cl.html#SP5_4">&#167;5.4</a>), 4/is (<a href="4-is.html#SP3">&#167;3</a>, <a href="4-is.html#SP6">&#167;6</a>, <a href="4-is.html#SP7">&#167;7</a>).</p>
<hr class="tocbar">
<ul class="toc"><li><a href="3-tw.html">Back to 'The Weaver'</a></li><li><i>(This section ends Chapter 3: Outputs.)</i></li></ul><hr class="tocbar">

View file

@ -329,19 +329,19 @@ at us; but we don't weave them into the output, that's for sure.
<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">figname</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"(%d+)cm: (%c+)"</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">-&gt;</span><span class="identifier">using_syntax</span><span class="plain"> &gt; </span><span class="constant">V1_SYNTAX</span><span class="plain">)</span>
<span class="functiontext">Parser::wrong_version</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">-&gt;</span><span class="element">md</span><span class="plain">-&gt;</span><span class="element">using_syntax</span><span class="plain">, </span><span class="identifier">L</span><span class="plain">, </span><span class="string">"[[Figure: Xcm:...]]"</span><span class="plain">, </span><span class="constant">V1_SYNTAX</span><span class="plain">);</span>
<span class="functiontext">Parser::wrong_version</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">-&gt;</span><span class="element">md</span><span class="plain">-&gt;</span><span class="element">using_syntax</span><span class="plain">, </span><span class="identifier">L</span><span class="plain">, </span><span class="string">"Figure: Xcm:..."</span><span class="plain">, </span><span class="constant">V1_SYNTAX</span><span class="plain">);</span>
<span class="functiontext">Formats::figure</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="functiontext">Str::atoi</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="constant">0</span><span class="plain">), -1, </span><span class="identifier">NULL</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">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">figname</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"(%c+) width (%d+)cm"</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">-&gt;</span><span class="identifier">using_syntax</span><span class="plain"> &lt; </span><span class="constant">V2_SYNTAX</span><span class="plain">)</span>
<span class="functiontext">Parser::wrong_version</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">-&gt;</span><span class="element">md</span><span class="plain">-&gt;</span><span class="element">using_syntax</span><span class="plain">, </span><span class="identifier">L</span><span class="plain">, </span><span class="string">"[[F width Xcm]]"</span><span class="plain">, </span><span class="constant">V2_SYNTAX</span><span class="plain">);</span>
<span class="functiontext">Parser::wrong_version</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">-&gt;</span><span class="element">md</span><span class="plain">-&gt;</span><span class="element">using_syntax</span><span class="plain">, </span><span class="identifier">L</span><span class="plain">, </span><span class="string">"F width Xcm"</span><span class="plain">, </span><span class="constant">V2_SYNTAX</span><span class="plain">);</span>
<span class="functiontext">Formats::figure</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="functiontext">Str::atoi</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="constant">0</span><span class="plain">), -1, </span><span class="identifier">NULL</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">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">figname</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"(%c+) height (%d+)cm"</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">-&gt;</span><span class="identifier">using_syntax</span><span class="plain"> &lt; </span><span class="constant">V2_SYNTAX</span><span class="plain">)</span>
<span class="functiontext">Parser::wrong_version</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">-&gt;</span><span class="element">md</span><span class="plain">-&gt;</span><span class="element">using_syntax</span><span class="plain">, </span><span class="identifier">L</span><span class="plain">, </span><span class="string">"[[F height Xcm]]"</span><span class="plain">, </span><span class="constant">V2_SYNTAX</span><span class="plain">);</span>
<span class="functiontext">Parser::wrong_version</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">-&gt;</span><span class="element">md</span><span class="plain">-&gt;</span><span class="element">using_syntax</span><span class="plain">, </span><span class="identifier">L</span><span class="plain">, </span><span class="string">"F height Xcm"</span><span class="plain">, </span><span class="constant">V2_SYNTAX</span><span class="plain">);</span>
<span class="functiontext">Formats::figure</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], -1, </span><span class="functiontext">Str::atoi</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="constant">0</span><span class="plain">), </span><span class="identifier">NULL</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">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">figname</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"(%c+) as (%c+)"</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">-&gt;</span><span class="identifier">using_syntax</span><span class="plain"> &lt; </span><span class="constant">V2_SYNTAX</span><span class="plain">)</span>
<span class="functiontext">Parser::wrong_version</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">-&gt;</span><span class="element">md</span><span class="plain">-&gt;</span><span class="element">using_syntax</span><span class="plain">, </span><span class="identifier">L</span><span class="plain">, </span><span class="string">"[[F as L]]"</span><span class="plain">, </span><span class="constant">V2_SYNTAX</span><span class="plain">);</span>
<span class="functiontext">Parser::wrong_version</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">-&gt;</span><span class="element">md</span><span class="plain">-&gt;</span><span class="element">using_syntax</span><span class="plain">, </span><span class="identifier">L</span><span class="plain">, </span><span class="string">"F as L"</span><span class="plain">, </span><span class="constant">V2_SYNTAX</span><span class="plain">);</span>
<span class="reserved">programming_language</span><span class="plain"> *</span><span class="identifier">pl</span><span class="plain"> = </span><span class="functiontext">Languages::find_by_name</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">W</span><span class="plain">);</span>
<span class="functiontext">Formats::figure</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], -1, -1, </span><span class="identifier">pl</span><span class="plain">);</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>

View file

@ -26,7 +26,7 @@
<!--Weave of 'C-Like Languages' 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#4">Chapter 4: Languages</a></li><li><b>C-Like Languages</b></li></ul><p class="purpose">To provide special features for the whole C family of languages.</p>
<ul class="toc"><li><a href="#SP1">&#167;1. </a></li><li><a href="#SP2">&#167;2. Parsing</a></li><li><a href="#SP2_2">&#167;2.2. Structures</a></li><li><a href="#SP2_3">&#167;2.3. Structure dependency</a></li><li><a href="#SP2_4">&#167;2.4. Functions</a></li><li><a href="#SP4">&#167;4. Subcategorisation</a></li><li><a href="#SP5">&#167;5. Tangling extras</a></li><li><a href="#SP6">&#167;6. Tangling predeclarations</a></li><li><a href="#SP7">&#167;7. Overriding regular code weaving</a></li><li><a href="#SP8">&#167;8. Analysis</a></li></ul><hr class="tocbar">
<ul class="toc"><li><a href="#SP1">&#167;1. </a></li><li><a href="#SP2">&#167;2. Parsing</a></li><li><a href="#SP2_2">&#167;2.2. Structures</a></li><li><a href="#SP2_3">&#167;2.3. Structure dependency</a></li><li><a href="#SP2_4">&#167;2.4. Functions</a></li><li><a href="#SP3">&#167;3. Subcategorisation</a></li><li><a href="#SP4">&#167;4. Tangling extras</a></li><li><a href="#SP5">&#167;5. Tangling predeclarations</a></li><li><a href="#SP6">&#167;6. Overriding regular code weaving</a></li><li><a href="#SP7">&#167;7. Analysis</a></li></ul><hr class="tocbar">
<p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. </b>What makes a language C-like?
This does:
@ -40,7 +40,6 @@ This does:
<span class="identifier">METHOD_ADD</span><span class="plain">(</span><span class="identifier">pl</span><span class="plain">, </span><span class="constant">ADDITIONAL_EARLY_MATTER_TAN_MTID</span><span class="plain">, </span><span class="functiontext">CLike::additional_early_matter</span><span class="plain">);</span>
<span class="identifier">METHOD_ADD</span><span class="plain">(</span><span class="identifier">pl</span><span class="plain">, </span><span class="constant">ADDITIONAL_PREDECLARATIONS_TAN_MTID</span><span class="plain">, </span><span class="functiontext">CLike::additional_predeclarations</span><span class="plain">);</span>
<span class="identifier">METHOD_ADD</span><span class="plain">(</span><span class="identifier">pl</span><span class="plain">, </span><span class="constant">CATALOGUE_ANA_MTID</span><span class="plain">, </span><span class="functiontext">CLike::catalogue</span><span class="plain">);</span>
<span class="identifier">METHOD_ADD</span><span class="plain">(</span><span class="identifier">pl</span><span class="plain">, </span><span class="constant">EARLY_PREWEAVE_ANALYSIS_ANA_MTID</span><span class="plain">, </span><span class="functiontext">CLike::analyse_code</span><span class="plain">);</span>
<span class="identifier">METHOD_ADD</span><span class="plain">(</span><span class="identifier">pl</span><span class="plain">, </span><span class="constant">LATE_PREWEAVE_ANALYSIS_ANA_MTID</span><span class="plain">, </span><span class="functiontext">CLike::post_analysis</span><span class="plain">);</span>
<span class="plain">}</span>
@ -73,7 +72,6 @@ source line being scanned lies within.
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">cc_sp</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
<span class="reserved">source_line</span><span class="plain"> *</span><span class="identifier">cc_stack</span><span class="plain">[</span><span class="constant">MAX_CONDITIONAL_COMPILATION_STACK</span><span class="plain">];</span>
<span class="reserved">c_structure</span><span class="plain"> *</span><span class="identifier">first_cst_alphabetically</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">CLike::further_parsing</span><span class="plain">(</span><span class="reserved">programming_language</span><span class="plain"> *</span><span class="identifier">self</span><span class="plain">, </span><span class="reserved">web</span><span class="plain"> *</span><span class="identifier">W</span><span class="plain">) {</span>
&lt;<span class="cwebmacro">Find every typedef struct in the tangle</span> <span class="cwebmacronumber">2.2</span>&gt;<span class="plain">;</span>
@ -163,13 +161,13 @@ takes care of it automatically.
<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">L</span><span class="plain">-&gt;</span><span class="element">text</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"typedef struct (%i+) %c*{%c*"</span><span class="plain">)) {</span>
&lt;<span class="cwebmacro">Attach a structure to this source line</span> <span class="cwebmacronumber">2.2.2</span>&gt;<span class="plain">;</span>
<span class="identifier">current_str</span><span class="plain"> = </span><span class="functiontext">Structures::new_struct</span><span class="plain">(</span><span class="identifier">W</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">L</span><span class="plain">);</span>
<span class="functiontext">Tags::add_by_name</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">I</span><span class="string">"Structures"</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::get_first_char</span><span class="plain">(</span><span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">text</span><span class="plain">) == </span><span class="character">'}'</span><span class="plain">) &amp;&amp; (</span><span class="identifier">current_str</span><span class="plain">)) {</span>
<span class="identifier">current_str</span><span class="plain">-&gt;</span><span class="element">typedef_ends</span><span class="plain"> = </span><span class="identifier">L</span><span class="plain">;</span>
<span class="identifier">current_str</span><span class="plain"> = </span><span class="identifier">NULL</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">current_str</span><span class="plain">) &amp;&amp; (</span><span class="identifier">current_str</span><span class="plain">-&gt;</span><span class="element">typedef_ends</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">)) {</span>
&lt;<span class="cwebmacro">Work through the a line in the structure definition</span> <span class="cwebmacronumber">2.2.3</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Work through a line in the structure definition</span> <span class="cwebmacronumber">2.2.1</span>&gt;<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">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">text</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"typedef %c+"</span><span class="plain">)) &amp;&amp;</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">L</span><span class="plain">-&gt;</span><span class="element">text</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"%c+##%c+"</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">L</span><span class="plain">-&gt;</span><span class="element">owning_paragraph</span><span class="plain">-&gt;</span><span class="element">placed_very_early</span><span class="plain"> == </span><span class="constant">FALSE</span><span class="plain">)</span>
@ -183,111 +181,7 @@ takes care of it automatically.
<p class="endnote">This code is used in <a href="#SP2">&#167;2</a>.</p>
<p class="inwebparagraph"><a id="SP2_2_1"></a><b>&#167;2.2.1. </b>For each <code class="display"><span class="extract">typedef struct</span></code> we find, we will make one of these:
</p>
<pre class="display">
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">c_structure</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">structure_name</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">tangled</span><span class="plain">; </span><span class="comment"> whether the structure definition has been tangled out</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">source_line</span><span class="plain"> *</span><span class="identifier">typedef_begins</span><span class="plain">; </span><span class="comment"> opening line of <code class="display"><span class="extract">typedef</span></code></span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">source_line</span><span class="plain"> *</span><span class="identifier">typedef_ends</span><span class="plain">; </span><span class="comment"> closing line, where <code class="display"><span class="extract">}</span></code> appears</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">linked_list</span><span class="plain"> *</span><span class="identifier">incorporates</span><span class="plain">; </span><span class="comment"> of <code class="display"><span class="extract">c_structure</span></code></span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">linked_list</span><span class="plain"> *</span><span class="identifier">elements</span><span class="plain">; </span><span class="comment"> of <code class="display"><span class="extract">structure_element</span></code></span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">c_structure</span><span class="plain"> *</span><span class="identifier">next_cst_alphabetically</span><span class="plain">;</span>
<span class="constant">MEMORY_MANAGEMENT</span>
<span class="plain">} </span><span class="reserved">c_structure</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The structure c_structure is accessed in 3/tw and here.</p>
<p class="inwebparagraph"><a id="SP2_2_2"></a><b>&#167;2.2.2. </b><code class="display">
&lt;<span class="cwebmacrodefn">Attach a structure to this source line</span> <span class="cwebmacronumber">2.2.2</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">c_structure</span><span class="plain"> *</span><span class="identifier">str</span><span class="plain"> = </span><span class="identifier">CREATE</span><span class="plain">(</span><span class="reserved">c_structure</span><span class="plain">);</span>
&lt;<span class="cwebmacro">Initialise the C structure structure</span> <span class="cwebmacronumber">2.2.2.1</span>&gt;<span class="plain">;</span>
<span class="functiontext">Analyser::mark_reserved_word_for_section</span><span class="plain">(</span><span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">owning_section</span><span class="plain">, </span><span class="identifier">str</span><span class="plain">-&gt;</span><span class="element">structure_name</span><span class="plain">, </span><span class="constant">RESERVED_COLOUR</span><span class="plain">);</span>
&lt;<span class="cwebmacro">Add this to the lists for its web and its paragraph</span> <span class="cwebmacronumber">2.2.2.2</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Insertion-sort this into the alphabetical list of all structures found</span> <span class="cwebmacronumber">2.2.2.3</span>&gt;<span class="plain">;</span>
<span class="identifier">current_str</span><span class="plain"> = </span><span class="identifier">str</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP2_2">&#167;2.2</a>.</p>
<p class="inwebparagraph"><a id="SP2_2_2_1"></a><b>&#167;2.2.2.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Initialise the C structure structure</span> <span class="cwebmacronumber">2.2.2.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">str</span><span class="plain">-&gt;</span><span class="element">structure_name</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">str</span><span class="plain">-&gt;</span><span class="element">typedef_begins</span><span class="plain"> = </span><span class="identifier">L</span><span class="plain">;</span>
<span class="identifier">str</span><span class="plain">-&gt;</span><span class="element">tangled</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
<span class="identifier">str</span><span class="plain">-&gt;</span><span class="element">typedef_ends</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">str</span><span class="plain">-&gt;</span><span class="element">incorporates</span><span class="plain"> = </span><span class="identifier">NEW_LINKED_LIST</span><span class="plain">(</span><span class="reserved">c_structure</span><span class="plain">);</span>
<span class="identifier">str</span><span class="plain">-&gt;</span><span class="element">elements</span><span class="plain"> = </span><span class="identifier">NEW_LINKED_LIST</span><span class="plain">(</span><span class="reserved">structure_element</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP2_2_2">&#167;2.2.2</a>.</p>
<p class="inwebparagraph"><a id="SP2_2_2_2"></a><b>&#167;2.2.2.2. </b><code class="display">
&lt;<span class="cwebmacrodefn">Add this to the lists for its web and its paragraph</span> <span class="cwebmacronumber">2.2.2.2</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">ADD_TO_LINKED_LIST</span><span class="plain">(</span><span class="identifier">str</span><span class="plain">, </span><span class="reserved">c_structure</span><span class="plain">, </span><span class="identifier">W</span><span class="plain">-&gt;</span><span class="element">c_structures</span><span class="plain">);</span>
<span class="identifier">ADD_TO_LINKED_LIST</span><span class="plain">(</span><span class="identifier">str</span><span class="plain">, </span><span class="reserved">c_structure</span><span class="plain">, </span><span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">owning_paragraph</span><span class="plain">-&gt;</span><span class="element">structures</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP2_2_2">&#167;2.2.2</a>.</p>
<p class="inwebparagraph"><a id="SP2_2_2_3"></a><b>&#167;2.2.2.3. </b><code class="display">
&lt;<span class="cwebmacrodefn">Insertion-sort this into the alphabetical list of all structures found</span> <span class="cwebmacronumber">2.2.2.3</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">str</span><span class="plain">-&gt;</span><span class="element">next_cst_alphabetically</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">first_cst_alphabetically</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">first_cst_alphabetically</span><span class="plain"> = </span><span class="identifier">str</span><span class="plain">;</span>
<span class="reserved">else</span><span class="plain"> {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">placed</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
<span class="reserved">c_structure</span><span class="plain"> *</span><span class="identifier">last</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">c_structure</span><span class="plain"> *</span><span class="identifier">seq</span><span class="plain"> = </span><span class="identifier">first_cst_alphabetically</span><span class="plain">; </span><span class="identifier">seq</span><span class="plain">;</span>
<span class="identifier">seq</span><span class="plain"> = </span><span class="identifier">seq</span><span class="plain">-&gt;</span><span class="identifier">next_cst_alphabetically</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::cmp</span><span class="plain">(</span><span class="identifier">str</span><span class="plain">-&gt;</span><span class="element">structure_name</span><span class="plain">, </span><span class="identifier">seq</span><span class="plain">-&gt;</span><span class="element">structure_name</span><span class="plain">) &lt; </span><span class="constant">0</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">seq</span><span class="plain"> == </span><span class="identifier">first_cst_alphabetically</span><span class="plain">) {</span>
<span class="identifier">str</span><span class="plain">-&gt;</span><span class="element">next_cst_alphabetically</span><span class="plain"> = </span><span class="identifier">first_cst_alphabetically</span><span class="plain">;</span>
<span class="identifier">first_cst_alphabetically</span><span class="plain"> = </span><span class="identifier">str</span><span class="plain">;</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
<span class="identifier">last</span><span class="plain">-&gt;</span><span class="element">next_cst_alphabetically</span><span class="plain"> = </span><span class="identifier">str</span><span class="plain">;</span>
<span class="identifier">str</span><span class="plain">-&gt;</span><span class="element">next_cst_alphabetically</span><span class="plain"> = </span><span class="identifier">seq</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="identifier">placed</span><span class="plain"> = </span><span class="constant">TRUE</span><span class="plain">;</span>
<span class="reserved">break</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="identifier">last</span><span class="plain"> = </span><span class="identifier">seq</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">placed</span><span class="plain"> == </span><span class="constant">FALSE</span><span class="plain">) </span><span class="identifier">last</span><span class="plain">-&gt;</span><span class="element">next_cst_alphabetically</span><span class="plain"> = </span><span class="identifier">str</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP2_2_2">&#167;2.2.2</a>.</p>
<p class="inwebparagraph"><a id="SP2_2_3"></a><b>&#167;2.2.3. </b>At this point we're reading a line within the structure's definition; for
<p class="inwebparagraph"><a id="SP2_2_1"></a><b>&#167;2.2.1. </b>At this point we're reading a line within the structure's definition; for
the sake of an illustrative example, let's suppose that line is:
</p>
@ -300,7 +194,7 @@ the sake of an illustrative example, let's suppose that line is:
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Work through the a line in the structure definition</span> <span class="cwebmacronumber">2.2.3</span>&gt; =
&lt;<span class="cwebmacrodefn">Work through a line in the structure definition</span> <span class="cwebmacronumber">2.2.1</span>&gt; =
</code></p>
@ -308,16 +202,16 @@ the sake of an illustrative example, let's suppose that line is:
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">p</span><span class="plain">);</span>
<span class="functiontext">Str::copy</span><span class="plain">(</span><span class="identifier">p</span><span class="plain">, </span><span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">text</span><span class="plain">);</span>
<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>
&lt;<span class="cwebmacro">Remove C type modifiers from the front of p</span> <span class="cwebmacronumber">2.2.1.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="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>
&lt;<span class="cwebmacro">Move pos past the type name</span> <span class="cwebmacronumber">2.2.1.2</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Move pos past any typographical type modifiers</span> <span class="cwebmacronumber">2.2.1.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>
<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="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">elname</span><span class="plain">);</span>
&lt;<span class="cwebmacro">Copy the element name into elname</span> <span class="cwebmacronumber">2.2.3.4</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Record the element</span> <span class="cwebmacronumber">2.2.3.6</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Copy the element name into elname</span> <span class="cwebmacronumber">2.2.1.4</span>&gt;<span class="plain">;</span>
<span class="functiontext">Structures::new_element</span><span class="plain">(</span><span class="identifier">current_str</span><span class="plain">, </span><span class="identifier">elname</span><span class="plain">, </span><span class="identifier">L</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">elname</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="plain">}</span>
@ -329,12 +223,12 @@ the sake of an illustrative example, let's suppose that line is:
<p class="endnote">This code is used in <a href="#SP2_2">&#167;2.2</a>.</p>
<p class="inwebparagraph"><a id="SP2_2_3_1"></a><b>&#167;2.2.3.1. </b>The following reduces <code class="display"><span class="extract">unsigned long long int *val;</span></code> to just <code class="display"><span class="extract">int *val;</span></code>.
<p class="inwebparagraph"><a id="SP2_2_1_1"></a><b>&#167;2.2.1.1. </b>The following reduces <code class="display"><span class="extract">unsigned long long int *val;</span></code> to just <code class="display"><span class="extract">int *val;</span></code>.
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Remove C type modifiers from the front of p</span> <span class="cwebmacronumber">2.2.3.1</span>&gt; =
&lt;<span class="cwebmacrodefn">Remove C type modifiers from the front of p</span> <span class="cwebmacronumber">2.2.1.1</span>&gt; =
</code></p>
@ -356,15 +250,15 @@ the sake of an illustrative example, let's suppose that line is:
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP2_2_3">&#167;2.2.3</a>.</p>
<p class="endnote">This code is used in <a href="#SP2_2_1">&#167;2.2.1</a>.</p>
<p class="inwebparagraph"><a id="SP2_2_3_2"></a><b>&#167;2.2.3.2. </b>At this point <code class="display"><span class="extract">p</span></code> has been reduced to <code class="display"><span class="extract">int *val;</span></code>, but the following moves
<p class="inwebparagraph"><a id="SP2_2_1_2"></a><b>&#167;2.2.1.2. </b>At this point <code class="display"><span class="extract">p</span></code> has been reduced to <code class="display"><span class="extract">int *val;</span></code>, but the following moves
<code class="display"><span class="extract">pos</span></code> to point to the <code class="display"><span class="extract">*</span></code>:
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Move pos past the type name</span> <span class="cwebmacronumber">2.2.3.2</span>&gt; =
&lt;<span class="cwebmacrodefn">Move pos past the type name</span> <span class="cwebmacronumber">2.2.1.2</span>&gt; =
</code></p>
@ -375,14 +269,14 @@ the sake of an illustrative example, let's suppose that line is:
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP2_2_3">&#167;2.2.3</a>.</p>
<p class="endnote">This code is used in <a href="#SP2_2_1">&#167;2.2.1</a>.</p>
<p class="inwebparagraph"><a id="SP2_2_3_3"></a><b>&#167;2.2.3.3. </b>And this moves it past the <code class="display"><span class="extract">*</span></code> to point to the <code class="display"><span class="extract">v</span></code> in <code class="display"><span class="extract">int *val;</span></code>:
<p class="inwebparagraph"><a id="SP2_2_1_3"></a><b>&#167;2.2.1.3. </b>And this moves it past the <code class="display"><span class="extract">*</span></code> to point to the <code class="display"><span class="extract">v</span></code> in <code class="display"><span class="extract">int *val;</span></code>:
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Move pos past any typographical type modifiers</span> <span class="cwebmacronumber">2.2.3.3</span>&gt; =
&lt;<span class="cwebmacrodefn">Move pos past any typographical type modifiers</span> <span class="cwebmacronumber">2.2.1.3</span>&gt; =
</code></p>
@ -393,15 +287,15 @@ the sake of an illustrative example, let's suppose that line is:
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP2_2_3">&#167;2.2.3</a>.</p>
<p class="endnote">This code is used in <a href="#SP2_2_1">&#167;2.2.1</a>.</p>
<p class="inwebparagraph"><a id="SP2_2_3_4"></a><b>&#167;2.2.3.4. </b>This then first copies the substring <code class="display"><span class="extract">val;</span></code> into <code class="display"><span class="extract">elname</span></code>, then cuts that
<p class="inwebparagraph"><a id="SP2_2_1_4"></a><b>&#167;2.2.1.4. </b>This then first copies the substring <code class="display"><span class="extract">val;</span></code> into <code class="display"><span class="extract">elname</span></code>, then cuts that
down to just the identifier characters at the front, i.e., to <code class="display"><span class="extract">val</span></code>.
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Copy the element name into elname</span> <span class="cwebmacronumber">2.2.3.4</span>&gt; =
&lt;<span class="cwebmacrodefn">Copy the element name into elname</span> <span class="cwebmacronumber">2.2.1.4</span>&gt; =
</code></p>
@ -412,50 +306,7 @@ down to just the identifier characters at the front, i.e., to <code class="displ
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP2_2_3">&#167;2.2.3</a>.</p>
<p class="inwebparagraph"><a id="SP2_2_3_5"></a><b>&#167;2.2.3.5. </b>Now we create an instance of <code class="display"><span class="extract">structure_element</span></code> to record the existence
of the element <code class="display"><span class="extract">val</span></code>, and add it to the linked list of elements of the
structure being defined.
</p>
<p class="inwebparagraph">In InC, only, certain element names used often in Inform's source code are
given mildly special treatment. This doesn't amount to much. <code class="display"><span class="extract">allow_sharing</span></code>
has no effect on tangling, so it doesn't change the program. It simply
affects the reports in the woven code about where structures are used.
</p>
<pre class="display">
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">structure_element</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">element_name</span><span class="plain">;</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">source_line</span><span class="plain"> *</span><span class="identifier">element_created_at</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">allow_sharing</span><span class="plain">;</span>
<span class="constant">MEMORY_MANAGEMENT</span>
<span class="plain">} </span><span class="reserved">structure_element</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The structure structure_element is accessed in 3/tw and here.</p>
<p class="inwebparagraph"><a id="SP2_2_3_6"></a><b>&#167;2.2.3.6. </b><code class="display">
&lt;<span class="cwebmacrodefn">Record the element</span> <span class="cwebmacronumber">2.2.3.6</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="functiontext">Analyser::mark_reserved_word_for_section</span><span class="plain">(</span><span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">owning_section</span><span class="plain">, </span><span class="identifier">elname</span><span class="plain">, </span><span class="constant">ELEMENT_COLOUR</span><span class="plain">);</span>
<span class="reserved">structure_element</span><span class="plain"> *</span><span class="identifier">elt</span><span class="plain"> = </span><span class="identifier">CREATE</span><span class="plain">(</span><span class="reserved">structure_element</span><span class="plain">);</span>
<span class="identifier">elt</span><span class="plain">-&gt;</span><span class="element">element_name</span><span class="plain"> = </span><span class="functiontext">Str::duplicate</span><span class="plain">(</span><span class="identifier">elname</span><span class="plain">);</span>
<span class="identifier">elt</span><span class="plain">-&gt;</span><span class="element">allow_sharing</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
<span class="identifier">elt</span><span class="plain">-&gt;</span><span class="element">element_created_at</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">LanguageMethods::share_element</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">-&gt;</span><span class="element">main_language</span><span class="plain">, </span><span class="identifier">elname</span><span class="plain">)) </span><span class="identifier">elt</span><span class="plain">-&gt;</span><span class="element">allow_sharing</span><span class="plain"> = </span><span class="constant">TRUE</span><span class="plain">;</span>
<span class="identifier">ADD_TO_LINKED_LIST</span><span class="plain">(</span><span class="identifier">elt</span><span class="plain">, </span><span class="reserved">structure_element</span><span class="plain">, </span><span class="identifier">current_str</span><span class="plain">-&gt;</span><span class="element">elements</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP2_2_3">&#167;2.2.3</a>.</p>
<p class="endnote">This code is used in <a href="#SP2_2_1">&#167;2.2.1</a>.</p>
<p class="inwebparagraph"><a id="SP2_3"></a><b>&#167;2.3. Structure dependency. </b>We say that S depends on T if <code class="display"><span class="extract">struct S</span></code> has an element whose type is
<code class="display"><span class="extract">struct T</span></code>. That matters because if so then <code class="display"><span class="extract">struct T</span></code> has to be defined
@ -483,7 +334,7 @@ matches only identifier characters and <code class="display"><span class="extrac
<pre class="displaydefn">
<span class="reserved">c_structure</span><span class="plain"> *</span><span class="identifier">current_str</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">current_str</span><span class="plain">, </span><span class="reserved">c_structure</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">current_str</span><span class="plain">-&gt;</span><span class="element">typedef_begins</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">current_str</span><span class="plain">-&gt;</span><span class="element">structure_header_at</span><span class="plain">;</span>
<span class="plain">((</span><span class="identifier">L</span><span class="plain">) &amp;&amp; (</span><span class="identifier">L</span><span class="plain"> != </span><span class="identifier">current_str</span><span class="plain">-&gt;</span><span class="element">typedef_ends</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="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>
@ -603,12 +454,12 @@ forms like <code class="display"><span class="extract">static long long int</spa
<pre class="displaydefn">
&lt;<span class="cwebmacro">Soak up further arguments from continuation lines after the declaration</span> <span class="cwebmacronumber">2.4.2.1</span>&gt;<span class="plain">;</span>
<span class="functiontext">Analyser::mark_reserved_word_for_section</span><span class="plain">(</span><span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">owning_section</span><span class="plain">, </span><span class="identifier">fname</span><span class="plain">, </span><span class="constant">FUNCTION_COLOUR</span><span class="plain">);</span>
<span class="reserved">function</span><span class="plain"> *</span><span class="identifier">fn</span><span class="plain"> = </span><span class="identifier">CREATE</span><span class="plain">(</span><span class="reserved">function</span><span class="plain">);</span>
&lt;<span class="cwebmacro">Initialise the function structure</span> <span class="cwebmacronumber">2.4.2.3</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Add the function to its paragraph and line</span> <span class="cwebmacronumber">2.4.2.4</span>&gt;<span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">W</span><span class="plain">-&gt;</span><span class="element">main_language</span><span class="plain">-&gt;</span><span class="element">supports_namespaces</span><span class="plain">)</span>
&lt;<span class="cwebmacro">Check that the function has its namespace correctly declared</span> <span class="cwebmacronumber">2.4.2.5</span>&gt;<span class="plain">;</span>
<span class="reserved">function</span><span class="plain"> *</span><span class="identifier">fn</span><span class="plain"> = </span><span class="functiontext">Structures::new_function</span><span class="plain">(</span><span class="identifier">fname</span><span class="plain">, </span><span class="identifier">L</span><span class="plain">);</span>
<span class="identifier">fn</span><span class="plain">-&gt;</span><span class="element">function_arguments</span><span class="plain"> = </span><span class="functiontext">Str::duplicate</span><span class="plain">(</span><span class="identifier">arguments</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">fn</span><span class="plain">-&gt;</span><span class="element">function_type</span><span class="plain">, </span><span class="string">"%S%S %S"</span><span class="plain">, </span><span class="identifier">qualifiers</span><span class="plain">, </span><span class="identifier">ftype</span><span class="plain">, </span><span class="identifier">asts</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq_wide_string</span><span class="plain">(</span><span class="identifier">fn</span><span class="plain">-&gt;</span><span class="element">function_name</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"isdigit"</span><span class="plain">)) </span><span class="identifier">fn</span><span class="plain">-&gt;</span><span class="element">call_freely</span><span class="plain"> = </span><span class="constant">TRUE</span><span class="plain">;</span>
<span class="identifier">fn</span><span class="plain">-&gt;</span><span class="element">no_conditionals</span><span class="plain"> = </span><span class="identifier">cc_sp</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="identifier">cc_sp</span><span class="plain">; </span><span class="identifier">i</span><span class="plain">++) </span><span class="identifier">fn</span><span class="plain">-&gt;</span><span class="element">within_conditionals</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">] = </span><span class="identifier">cc_stack</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">];</span>
</pre>
<p class="inwebparagraph"></p>
@ -661,125 +512,7 @@ reach an open brace <code class="display"><span class="extract">{</span></code>.
<p class="endnote">This code is used in <a href="#SP2_4_2">&#167;2.4.2</a>.</p>
<p class="inwebparagraph"><a id="SP2_4_2_2"></a><b>&#167;2.4.2.2. </b>Each function definition found results in one of these structures being made:
</p>
<pre class="display">
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">function</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">function_name</span><span class="plain">; </span><span class="comment"> e.g., <code class="display"><span class="extract">"cultivate"</span></code></span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">function_type</span><span class="plain">; </span><span class="comment"> e.g., <code class="display"><span class="extract">"tree *"</span></code></span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">function_arguments</span><span class="plain">; </span><span class="comment"> e.g., <code class="display"><span class="extract">"int rainfall)"</span></code>: note <code class="display"><span class="extract">)</span></code></span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">source_line</span><span class="plain"> *</span><span class="identifier">function_header_at</span><span class="plain">; </span><span class="comment"> where the first line of the header begins</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">within_namespace</span><span class="plain">; </span><span class="comment"> written using InC namespace dividers</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">called_from_other_sections</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">call_freely</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">no_conditionals</span><span class="plain">;</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">source_line</span><span class="plain"> *</span><span class="identifier">within_conditionals</span><span class="plain">[</span><span class="constant">MAX_CONDITIONAL_COMPILATION_STACK</span><span class="plain">];</span>
<span class="constant">MEMORY_MANAGEMENT</span>
<span class="plain">} </span><span class="reserved">function</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The structure function is accessed in 3/tw and here.</p>
<p class="inwebparagraph"><a id="SP2_4_2_3"></a><b>&#167;2.4.2.3. </b>Note that we take a snapshot of the conditional compilation stack as
part of the function structure. We'll need it when predeclaring the function.
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Initialise the function structure</span> <span class="cwebmacronumber">2.4.2.3</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">fn</span><span class="plain">-&gt;</span><span class="element">function_name</span><span class="plain"> = </span><span class="functiontext">Str::duplicate</span><span class="plain">(</span><span class="identifier">fname</span><span class="plain">);</span>
<span class="identifier">fn</span><span class="plain">-&gt;</span><span class="element">function_arguments</span><span class="plain"> = </span><span class="functiontext">Str::duplicate</span><span class="plain">(</span><span class="identifier">arguments</span><span class="plain">);</span>
<span class="identifier">fn</span><span class="plain">-&gt;</span><span class="element">function_type</span><span class="plain"> = </span><span class="functiontext">Str::new</span><span class="plain">();</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">fn</span><span class="plain">-&gt;</span><span class="element">function_type</span><span class="plain">, </span><span class="string">"%S%S %S"</span><span class="plain">, </span><span class="identifier">qualifiers</span><span class="plain">, </span><span class="identifier">ftype</span><span class="plain">, </span><span class="identifier">asts</span><span class="plain">);</span>
<span class="identifier">fn</span><span class="plain">-&gt;</span><span class="element">within_namespace</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
<span class="identifier">fn</span><span class="plain">-&gt;</span><span class="element">called_from_other_sections</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
<span class="identifier">fn</span><span class="plain">-&gt;</span><span class="element">call_freely</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::eq_wide_string</span><span class="plain">(</span><span class="identifier">fn</span><span class="plain">-&gt;</span><span class="element">function_name</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"isdigit"</span><span class="plain">)) </span><span class="identifier">fn</span><span class="plain">-&gt;</span><span class="element">call_freely</span><span class="plain"> = </span><span class="constant">TRUE</span><span class="plain">;</span>
<span class="identifier">fn</span><span class="plain">-&gt;</span><span class="element">function_header_at</span><span class="plain"> = </span><span class="identifier">L</span><span class="plain">;</span>
<span class="identifier">fn</span><span class="plain">-&gt;</span><span class="element">no_conditionals</span><span class="plain"> = </span><span class="identifier">cc_sp</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="identifier">cc_sp</span><span class="plain">; </span><span class="identifier">i</span><span class="plain">++) </span><span class="identifier">fn</span><span class="plain">-&gt;</span><span class="element">within_conditionals</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">] = </span><span class="identifier">cc_stack</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">];</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP2_4_2">&#167;2.4.2</a>.</p>
<p class="inwebparagraph"><a id="SP2_4_2_4"></a><b>&#167;2.4.2.4. </b><code class="display">
&lt;<span class="cwebmacrodefn">Add the function to its paragraph and line</span> <span class="cwebmacronumber">2.4.2.4</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">paragraph</span><span class="plain"> *</span><span class="identifier">P</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="reserved">if</span><span class="plain"> (</span><span class="identifier">P</span><span class="plain">) </span><span class="identifier">ADD_TO_LINKED_LIST</span><span class="plain">(</span><span class="identifier">fn</span><span class="plain">, </span><span class="reserved">function</span><span class="plain">, </span><span class="identifier">P</span><span class="plain">-&gt;</span><span class="element">functions</span><span class="plain">);</span>
<span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">function_defined</span><span class="plain"> = </span><span class="identifier">fn</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP2_4_2">&#167;2.4.2</a>.</p>
<p class="inwebparagraph"><a id="SP2_4_2_5"></a><b>&#167;2.4.2.5. </b><code class="display">
&lt;<span class="cwebmacrodefn">Check that the function has its namespace correctly declared</span> <span class="cwebmacronumber">2.4.2.5</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">declared_namespace</span><span class="plain"> = </span><span class="identifier">NULL</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">fname</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"(%c+::)%c*"</span><span class="plain">)) {</span>
<span class="identifier">declared_namespace</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">fn</span><span class="plain">-&gt;</span><span class="element">within_namespace</span><span class="plain"> = </span><span class="constant">TRUE</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::eq_wide_string</span><span class="plain">(</span><span class="identifier">fname</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"main"</span><span class="plain">)) &amp;&amp; (</span><span class="functiontext">Str::eq_wide_string</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">-&gt;</span><span class="element">sect_namespace</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"Main::"</span><span class="plain">)))</span>
<span class="identifier">declared_namespace</span><span class="plain"> = </span><span class="identifier">I</span><span class="string">"Main::"</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">declared_namespace</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">-&gt;</span><span class="element">sect_namespace</span><span class="plain">)) &amp;&amp;</span>
<span class="plain">(</span><span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">owning_paragraph</span><span class="plain">-&gt;</span><span class="element">placed_very_early</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">err_mess</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">declared_namespace</span><span class="plain">) == </span><span class="constant">0</span><span class="plain">)</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">err_mess</span><span class="plain">, </span><span class="string">"Function '%S' should have namespace prefix '%S'"</span><span class="plain">,</span>
<span class="identifier">fname</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">-&gt;</span><span class="identifier">sect_namespace</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::len</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">-&gt;</span><span class="element">sect_namespace</span><span class="plain">) == </span><span class="constant">0</span><span class="plain">)</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">err_mess</span><span class="plain">, </span><span class="string">"Function '%S' declared in a section with no namespace"</span><span class="plain">,</span>
<span class="identifier">fname</span><span class="plain">);</span>
<span class="reserved">else</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">err_mess</span><span class="plain">, </span><span class="string">"Function '%S' declared in a section with the wrong namespace '%S'"</span><span class="plain">,</span>
<span class="identifier">fname</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">-&gt;</span><span class="identifier">sect_namespace</span><span class="plain">);</span>
<span class="functiontext">Main::error_in_web</span><span class="plain">(</span><span class="identifier">err_mess</span><span class="plain">, </span><span class="identifier">L</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">err_mess</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>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP2_4_2">&#167;2.4.2</a>.</p>
<p class="inwebparagraph"><a id="SP3"></a><b>&#167;3. </b>The following
</p>
<pre class="display">
<span class="reserved">c_structure</span><span class="plain"> *</span><span class="functiontext">CLike::find_structure</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">text_stream</span><span class="plain"> *</span><span class="identifier">name</span><span class="plain">) {</span>
<span class="reserved">c_structure</span><span class="plain"> *</span><span class="identifier">str</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER_LINKED_LIST</span><span class="plain">(</span><span class="identifier">str</span><span class="plain">, </span><span class="reserved">c_structure</span><span class="plain">, </span><span class="identifier">W</span><span class="plain">-&gt;</span><span class="element">c_structures</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="identifier">name</span><span class="plain">, </span><span class="identifier">str</span><span class="plain">-&gt;</span><span class="element">structure_name</span><span class="plain">))</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">str</span><span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function CLike::find_structure appears nowhere else.</p>
<p class="inwebparagraph"><a id="SP4"></a><b>&#167;4. Subcategorisation. </b>The following is called after the parser gives every line in the web a
<p class="inwebparagraph"><a id="SP3"></a><b>&#167;3. Subcategorisation. </b>The following is called after the parser gives every line in the web a
category; we can, if we wish, change that for a more exotic one. We simply
look for a <code class="display"><span class="extract">#include</span></code> of one of the ANSI C standard libraries.
</p>
@ -807,7 +540,7 @@ look for a <code class="display"><span class="extract">#include</span></code> of
<p class="endnote">The function CLike::subcategorise_code is used in <a href="#SP1">&#167;1</a>.</p>
<p class="inwebparagraph"><a id="SP5"></a><b>&#167;5. Tangling extras. </b>"Additional early matter" is used for the inclusions of the ANSI library
<p class="inwebparagraph"><a id="SP4"></a><b>&#167;4. Tangling extras. </b>"Additional early matter" is used for the inclusions of the ANSI library
files. We need to do that early, because otherwise types declared in them
(such as <code class="display"><span class="extract">FILE</span></code>) won't exist in time for the structure definitions we will
be tangling next.
@ -837,7 +570,7 @@ platform-specific details to handle directories without POSIX in Windows.
<p class="endnote">The function CLike::additional_early_matter is used in <a href="#SP1">&#167;1</a>.</p>
<p class="inwebparagraph"><a id="SP6"></a><b>&#167;6. Tangling predeclarations. </b>This is where a language gets the chance to tangle predeclarations, early
<p class="inwebparagraph"><a id="SP5"></a><b>&#167;5. Tangling predeclarations. </b>This is where a language gets the chance to tangle predeclarations, early
on in the file. We use it first for the structures, and then the functions &mdash;
in that order since the function types likely involve the typedef names for the
structures.
@ -845,9 +578,9 @@ structures.
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">CLike::additional_predeclarations</span><span class="plain">(</span><span class="reserved">programming_language</span><span class="plain"> *</span><span class="identifier">self</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">web</span><span class="plain"> *</span><span class="identifier">W</span><span class="plain">) {</span>
&lt;<span class="cwebmacro">Predeclare the structures in a well-founded order</span> <span class="cwebmacronumber">6.2</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Predeclare simple typedefs</span> <span class="cwebmacronumber">6.1</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Predeclare the functions</span> <span class="cwebmacronumber">6.4</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Predeclare the structures in a well-founded order</span> <span class="cwebmacronumber">5.2</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Predeclare simple typedefs</span> <span class="cwebmacronumber">5.1</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Predeclare the functions</span> <span class="cwebmacronumber">5.4</span>&gt;<span class="plain">;</span>
<span class="plain">}</span>
</pre>
@ -855,13 +588,13 @@ structures.
<p class="endnote">The function CLike::additional_predeclarations is used in <a href="#SP1">&#167;1</a>.</p>
<p class="inwebparagraph"><a id="SP6_1"></a><b>&#167;6.1. </b>A "simple typedef" here means one that is aliasing something other than
<p class="inwebparagraph"><a id="SP5_1"></a><b>&#167;5.1. </b>A "simple typedef" here means one that is aliasing something other than
a structure: for example <code class="display"><span class="extract">typedef unsigned int uint;</span></code> would be a simple typedef.
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Predeclare simple typedefs</span> <span class="cwebmacronumber">6.1</span>&gt; =
&lt;<span class="cwebmacrodefn">Predeclare simple typedefs</span> <span class="cwebmacronumber">5.1</span>&gt; =
</code></p>
@ -879,9 +612,9 @@ a structure: for example <code class="display"><span class="extract">typedef uns
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP6">&#167;6</a>.</p>
<p class="endnote">This code is used in <a href="#SP5">&#167;5</a>.</p>
<p class="inwebparagraph"><a id="SP6_2"></a><b>&#167;6.2. </b>It's easy enough to make sure structures are tangled so that inner ones
<p class="inwebparagraph"><a id="SP5_2"></a><b>&#167;5.2. </b>It's easy enough to make sure structures are tangled so that inner ones
precede outer, but we need to be careful to be terminating if the source
code we're given is not well founded because of an error by its programmer:
for example, that structure A contains B contains C contains A. We do this
@ -892,7 +625,7 @@ finished.
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Predeclare the structures in a well-founded order</span> <span class="cwebmacronumber">6.2</span>&gt; =
&lt;<span class="cwebmacrodefn">Predeclare the structures in a well-founded order</span> <span class="cwebmacronumber">5.2</span>&gt; =
</code></p>
@ -906,9 +639,9 @@ finished.
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP6">&#167;6</a>.</p>
<p class="endnote">This code is used in <a href="#SP5">&#167;5</a>.</p>
<p class="inwebparagraph"><a id="SP6_3"></a><b>&#167;6.3. </b>Using the following recursion, which is therefore terminating:
<p class="inwebparagraph"><a id="SP5_3"></a><b>&#167;5.3. </b>Using the following recursion, which is therefore terminating:
</p>
<pre class="display">
@ -919,22 +652,22 @@ finished.
<span class="identifier">LOOP_OVER_LINKED_LIST</span><span class="plain">(</span><span class="identifier">embodied</span><span class="plain">, </span><span class="reserved">c_structure</span><span class="plain">, </span><span class="identifier">str</span><span class="plain">-&gt;</span><span class="element">incorporates</span><span class="plain">)</span>
<span class="functiontext">CLike::tangle_structure</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">self</span><span class="plain">, </span><span class="identifier">embodied</span><span class="plain">);</span>
<span class="identifier">str</span><span class="plain">-&gt;</span><span class="element">tangled</span><span class="plain"> = </span><span class="constant">TRUE</span><span class="plain">;</span>
<span class="functiontext">Tags::open_ifdefs</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">str</span><span class="plain">-&gt;</span><span class="element">typedef_begins</span><span class="plain">-&gt;</span><span class="element">owning_paragraph</span><span class="plain">);</span>
<span class="functiontext">LanguageMethods::insert_line_marker</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">self</span><span class="plain">, </span><span class="identifier">str</span><span class="plain">-&gt;</span><span class="element">typedef_begins</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">str</span><span class="plain">-&gt;</span><span class="element">typedef_begins</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="functiontext">Tags::open_ifdefs</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">str</span><span class="plain">-&gt;</span><span class="element">structure_header_at</span><span class="plain">-&gt;</span><span class="element">owning_paragraph</span><span class="plain">);</span>
<span class="functiontext">LanguageMethods::insert_line_marker</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">self</span><span class="plain">, </span><span class="identifier">str</span><span class="plain">-&gt;</span><span class="element">structure_header_at</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">str</span><span class="plain">-&gt;</span><span class="element">structure_header_at</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">WRITE</span><span class="plain">(</span><span class="string">"%S\n"</span><span class="plain">, </span><span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">text</span><span class="plain">);</span>
<span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">suppress_tangling</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">L</span><span class="plain"> == </span><span class="identifier">str</span><span class="plain">-&gt;</span><span class="element">typedef_ends</span><span class="plain">) </span><span class="reserved">break</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="functiontext">Tags::close_ifdefs</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">str</span><span class="plain">-&gt;</span><span class="element">typedef_begins</span><span class="plain">-&gt;</span><span class="element">owning_paragraph</span><span class="plain">);</span>
<span class="functiontext">Tags::close_ifdefs</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">str</span><span class="plain">-&gt;</span><span class="element">structure_header_at</span><span class="plain">-&gt;</span><span class="element">owning_paragraph</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function CLike::tangle_structure is used in <a href="#SP6_2">&#167;6.2</a>.</p>
<p class="endnote">The function CLike::tangle_structure is used in <a href="#SP5_2">&#167;5.2</a>.</p>
<p class="inwebparagraph"><a id="SP6_4"></a><b>&#167;6.4. </b>Functions are rather easier to deal with. In general, if a function was
<p class="inwebparagraph"><a id="SP5_4"></a><b>&#167;5.4. </b>Functions are rather easier to deal with. In general, if a function was
defined within some number of nested <code class="display"><span class="extract">#ifdef</span></code> or <code class="display"><span class="extract">#ifndef</span></code> directives, then
we reproduce those around the predeclaration: except, as a special trick,
if the line contains a particular comment. For example:
@ -955,7 +688,7 @@ exist either way.
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Predeclare the functions</span> <span class="cwebmacronumber">6.4</span>&gt; =
&lt;<span class="cwebmacrodefn">Predeclare the functions</span> <span class="cwebmacronumber">5.4</span>&gt; =
</code></p>
@ -988,36 +721,13 @@ exist either way.
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP6">&#167;6</a>.</p>
<p class="endnote">This code is used in <a href="#SP5">&#167;5</a>.</p>
<p class="inwebparagraph"><a id="SP7"></a><b>&#167;7. Overriding regular code weaving. </b>We have the opportunity here to sidestep the regular weaving algorithm, and do
<p class="inwebparagraph"><a id="SP6"></a><b>&#167;6. Overriding regular code weaving. </b>We have the opportunity here to sidestep the regular weaving algorithm, and do
our own thing. We decline.
</p>
<p class="inwebparagraph"><a id="SP8"></a><b>&#167;8. Analysis. </b>This implements the additional information in the <code class="display"><span class="extract">-structures</span></code> and <code class="display"><span class="extract">-functions</span></code>
fprms of section catalogue.
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">CLike::catalogue</span><span class="plain">(</span><span class="reserved">programming_language</span><span class="plain"> *</span><span class="identifier">self</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">int</span><span class="plain"> </span><span class="identifier">functions_too</span><span class="plain">) {</span>
<span class="reserved">c_structure</span><span class="plain"> *</span><span class="identifier">str</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">str</span><span class="plain">, </span><span class="reserved">c_structure</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">str</span><span class="plain">-&gt;</span><span class="element">typedef_begins</span><span class="plain">-&gt;</span><span class="element">owning_section</span><span class="plain"> == </span><span class="identifier">S</span><span class="plain">)</span>
<span class="identifier">PRINT</span><span class="plain">(</span><span class="string">" %S "</span><span class="plain">, </span><span class="identifier">str</span><span class="plain">-&gt;</span><span class="element">structure_name</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">functions_too</span><span class="plain">) {</span>
<span class="reserved">function</span><span class="plain"> *</span><span class="identifier">fn</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">fn</span><span class="plain">, </span><span class="reserved">function</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">fn</span><span class="plain">-&gt;</span><span class="element">function_header_at</span><span class="plain">-&gt;</span><span class="element">owning_section</span><span class="plain"> == </span><span class="identifier">S</span><span class="plain">)</span>
<span class="identifier">PRINT</span><span class="plain">(</span><span class="string">"\n %S"</span><span class="plain">, </span><span class="identifier">fn</span><span class="plain">-&gt;</span><span class="element">function_name</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function CLike::catalogue is used in <a href="#SP1">&#167;1</a>.</p>
<p class="inwebparagraph"><a id="SP9"></a><b>&#167;9. </b>Having found all those functions and structure elements, we make sure they
<p class="inwebparagraph"><a id="SP7"></a><b>&#167;7. Analysis. </b>Having found all those functions and structure elements, we make sure they
are all known to Inweb's hash table of interesting identifiers:
</p>
@ -1041,7 +751,7 @@ are all known to Inweb's hash table of interesting identifiers:
<p class="endnote">The function CLike::analyse_code is used in <a href="#SP1">&#167;1</a>.</p>
<p class="inwebparagraph"><a id="SP10"></a><b>&#167;10. </b>The following is an opportunity for us to scold the author for any
<p class="inwebparagraph"><a id="SP8"></a><b>&#167;8. </b>The following is an opportunity for us to scold the author for any
specifically C-like errors. We're going to look for functions named
<code class="display"><span class="extract">Whatever::name()</span></code> whose definitions are not in the <code class="display"><span class="extract">Whatever::</span></code> section;
in other words, we police the rule that functions actually are defined in the

View file

@ -26,7 +26,7 @@
<!--Weave of 'Language 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#4">Chapter 4: Languages</a></li><li><b>Language Methods</b></li></ul><p class="purpose">To characterise the relevant differences in behaviour between the various programming languages supported.</p>
<ul class="toc"><li><a href="#SP1">&#167;1. Introduction</a></li><li><a href="#SP2">&#167;2. Parsing methods</a></li><li><a href="#SP5">&#167;5. Tangling methods</a></li><li><a href="#SP20">&#167;20. Weaving methods</a></li><li><a href="#SP26">&#167;26. Analysis methods</a></li><li><a href="#SP29">&#167;29. What we support</a></li></ul><hr class="tocbar">
<ul class="toc"><li><a href="#SP1">&#167;1. Introduction</a></li><li><a href="#SP2">&#167;2. Parsing methods</a></li><li><a href="#SP5">&#167;5. Tangling methods</a></li><li><a href="#SP20">&#167;20. Weaving methods</a></li><li><a href="#SP26">&#167;26. Analysis methods</a></li><li><a href="#SP28">&#167;28. What we support</a></li></ul><hr class="tocbar">
<p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. Introduction. </b>The conventions for writing, weaving and tangling a web are really quite
independent of the programming language being written, woven or tangled;
@ -362,7 +362,7 @@ from the given file; we generate this automatically.
<p class="inwebparagraph"></p>
<p class="endnote">The function LanguageMethods::insert_line_marker is used in 3/tt (<a href="3-tt.html#SP2_1">&#167;2.1</a>, <a href="3-tt.html#SP3_1">&#167;3.1</a>), 4/cl (<a href="4-cl.html#SP6_3">&#167;6.3</a>, <a href="4-cl.html#SP6_4">&#167;6.4</a>), 4/is (<a href="4-is.html#SP6">&#167;6</a>, <a href="4-is.html#SP7">&#167;7</a>).</p>
<p class="endnote">The function LanguageMethods::insert_line_marker is used in 3/tt (<a href="3-tt.html#SP2_1">&#167;2.1</a>, <a href="3-tt.html#SP3_1">&#167;3.1</a>), 4/cl (<a href="4-cl.html#SP5_3">&#167;5.3</a>, <a href="4-cl.html#SP5_4">&#167;5.4</a>), 4/is (<a href="4-is.html#SP6">&#167;6</a>, <a href="4-is.html#SP7">&#167;7</a>).</p>
<p class="inwebparagraph"><a id="SP14"></a><b>&#167;14. </b>The following hooks are provided so that we can top and/or tail the expansion
of paragraph macros in the code. For example, C-like languages, use this to
@ -460,7 +460,7 @@ passes the code straight through, printing <code class="display"><span class="ex
<p class="inwebparagraph"></p>
<p class="endnote">The function LanguageMethods::tangle_code is used in 3/tt (<a href="3-tt.html#SP3">&#167;3</a>, <a href="3-tt.html#SP3_1">&#167;3.1</a>, <a href="3-tt.html#SP3_2">&#167;3.2</a>), 4/cl (<a href="4-cl.html#SP6_1">&#167;6.1</a>, <a href="4-cl.html#SP6_4">&#167;6.4</a>).</p>
<p class="endnote">The function LanguageMethods::tangle_code is used in 3/tt (<a href="3-tt.html#SP3">&#167;3</a>, <a href="3-tt.html#SP3_1">&#167;3.1</a>, <a href="3-tt.html#SP3_2">&#167;3.2</a>), 4/cl (<a href="4-cl.html#SP5_1">&#167;5.1</a>, <a href="4-cl.html#SP5_4">&#167;5.4</a>).</p>
<p class="inwebparagraph"><a id="SP18"></a><b>&#167;18. </b>We finally reach the bottom of the tangled file, a footer called the "gnabehs":
</p>
@ -646,27 +646,7 @@ at the code in a web and working out what's going on, rather than producing
any weave or tangle output.
</p>
<p class="inwebparagraph">This one provides details to add to the section catalogue if <code class="display"><span class="extract">-structures</span></code>
or <code class="display"><span class="extract">-functions</span></code> is used at the command line:
</p>
<pre class="definitions">
<span class="definitionkeyword">enum</span> <span class="constant">CATALOGUE_ANA_MTID</span>
</pre>
<pre class="display">
<span class="identifier">VMETHOD_TYPE</span><span class="plain">(</span><span class="constant">CATALOGUE_ANA_MTID</span><span class="plain">, </span><span class="reserved">programming_language</span><span class="plain"> *</span><span class="identifier">pl</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">int</span><span class="plain"> </span><span class="identifier">functions_too</span><span class="plain">)</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">LanguageMethods::catalogue</span><span class="plain">(</span><span class="reserved">programming_language</span><span class="plain"> *</span><span class="identifier">pl</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">int</span><span class="plain"> </span><span class="identifier">functions_too</span><span class="plain">) {</span>
<span class="identifier">VMETHOD_CALL</span><span class="plain">(</span><span class="identifier">pl</span><span class="plain">, </span><span class="constant">CATALOGUE_ANA_MTID</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">, </span><span class="identifier">functions_too</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function LanguageMethods::catalogue is used in 3/ta (<a href="3-ta.html#SP2">&#167;2</a>).</p>
<p class="inwebparagraph"><a id="SP27"></a><b>&#167;27. </b>The "preweave analysis" is an opportunity to look through the code before
<p class="inwebparagraph">The "preweave analysis" is an opportunity to look through the code before
any weaving of it occurs. It's never called on a tangle run. These methods
are called first and last in the process, respectively. (What happens in
between is essentially that Inweb looks for identifiers, for later syntax
@ -696,7 +676,7 @@ colouring purposes.)
<p class="endnote">The function LanguageMethods::late_preweave_analysis is used in 3/ta (<a href="3-ta.html#SP4">&#167;4</a>).</p>
<p class="inwebparagraph"><a id="SP28"></a><b>&#167;28. </b>And finally: in InC only, a few structure element names are given very slightly
<p class="inwebparagraph"><a id="SP27"></a><b>&#167;27. </b>And finally: in InC only, a few structure element names are given very slightly
special treatment, and this method decides which.
</p>
@ -716,9 +696,9 @@ special treatment, and this method decides which.
<p class="inwebparagraph"></p>
<p class="endnote">The function LanguageMethods::share_element is used in 4/cl (<a href="4-cl.html#SP2_2_3_6">&#167;2.2.3.6</a>).</p>
<p class="endnote">The function LanguageMethods::share_element is used in 4/saf (<a href="4-saf.html#SP4">&#167;4</a>).</p>
<p class="inwebparagraph"><a id="SP29"></a><b>&#167;29. What we support. </b></p>
<p class="inwebparagraph"><a id="SP28"></a><b>&#167;28. What we support. </b></p>
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">LanguageMethods::supports_definitions</span><span class="plain">(</span><span class="reserved">programming_language</span><span class="plain"> *</span><span class="identifier">pl</span><span class="plain">) {</span>
@ -734,7 +714,7 @@ special treatment, and this method decides which.
<p class="endnote">The function LanguageMethods::supports_definitions is used in 4/as (<a href="4-as.html#SP3">&#167;3</a>).</p>
<hr class="tocbar">
<ul class="toc"><li><a href="4-pl.html">Back to 'Programming Languages'</a></li><li><a href="4-as.html">Continue with 'ACME Support'</a></li></ul><hr class="tocbar">
<ul class="toc"><li><a href="4-saf.html">Back to 'Structures and Functions'</a></li><li><a href="4-as.html">Continue with 'ACME Support'</a></li></ul><hr class="tocbar">
<!--End of weave-->
</main>
</body>

View file

@ -228,7 +228,7 @@ into the following structure (one per language):
<p class="inwebparagraph"></p>
<p class="endnote">The structure programming_language is accessed in 1/pc, 3/tt, 4/lm, 4/as, 4/tp, 4/cl and here.</p>
<p class="endnote">The structure programming_language is accessed in 1/pc, 3/tt, 4/saf, 4/lm, 4/as, 4/tp and here.</p>
<p class="inwebparagraph"><a id="SP7"></a><b>&#167;7. </b>This is a simple one-pass compiler. The <code class="display"><span class="extract">language_reader_state</span></code> provides
the only state preserved as we work through line by line, except of course
@ -1020,7 +1020,7 @@ literal backslash.
<p class="endnote">The function Languages::add_escape_to_regexp appears nowhere else.</p>
<hr class="tocbar">
<ul class="toc"><li><i>(This section begins Chapter 4: Languages.)</i></li><li><a href="4-lm.html">Continue with 'Language Methods'</a></li></ul><hr class="tocbar">
<ul class="toc"><li><i>(This section begins Chapter 4: Languages.)</i></li><li><a href="4-saf.html">Continue with 'Structures and Functions'</a></li></ul><hr class="tocbar">
<!--End of weave-->
</main>
</body>

View file

@ -26,7 +26,7 @@
<!--Weave of 'How to Write a Web' 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#M">Manual</a></li><li><b>How to Write a Web</b></li></ul><p class="purpose">How to mark up code for literate programming.</p>
<ul class="toc"><li><a href="#SP1">&#167;1. The title of a section</a></li><li><a href="#SP2">&#167;2. Paragraphing</a></li><li><a href="#SP6">&#167;6. Conditional compilation</a></li><li><a href="#SP7">&#167;7. Commentary</a></li><li><a href="#SP12">&#167;12. Code samples and other extraneous matter</a></li></ul><hr class="tocbar">
<ul class="toc"><li><a href="#SP1">&#167;1. The title of a section</a></li><li><a href="#SP2">&#167;2. Paragraphing</a></li><li><a href="#SP6">&#167;6. Conditional compilation</a></li><li><a href="#SP7">&#167;7. Commentary</a></li><li><a href="#SP12">&#167;12. Code samples and other extraneous matter</a></li><li><a href="#SP13">&#167;13. Links</a></li><li><a href="#SP14">&#167;14. Cross-references</a></li><li><a href="#SP15">&#167;15. Figures</a></li><li><a href="#SP16">&#167;16. Mathematics notation</a></li></ul><hr class="tocbar">
<p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. The title of a section. </b>In any section file, there will be a few lines at the top which occur before
the first paragraph of code begins. (The first paragraph begins on the first
@ -524,7 +524,7 @@ For example,
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP13"></a><b>&#167;13. </b>URLs in the web are automatically recognised and a weave to HTML will
<p class="inwebparagraph"><a id="SP13"></a><b>&#167;13. Links. </b>URLs in the web are automatically recognised and a weave to HTML will
make them into links. For example:
</p>
@ -557,7 +557,7 @@ For example,
<p class="inwebparagraph"></p>
<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>
<p class="inwebparagraph"><a id="SP14"></a><b>&#167;14. Cross-references. </b>These are like links, but internal. 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>
@ -593,9 +593,9 @@ case sensitive.
</p>
<pre class="display">
<span class="plain">= (hyperlinked text)</span>
<span class="functiontext">= (hyperlinked text)</span>
<span class="plain">See the //Manual// for more on this.</span>
<span class="plain">=</span>
<span class="functiontext">=</span>
</pre>
<p class="inwebparagraph">produces:
@ -624,27 +624,38 @@ can be configured in the Contents page of a web, say like so:
<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 class="inwebparagraph"><a id="SP15"></a><b>&#167;15. Figures. </b>Images to be included in weaves of a web are called "Figures", as they
would be in a printed book. These images should ideally be in PNG, JPG or PDF
format and placed in a subdirectory of the web called <code class="display"><span class="extract">Figures</span></code>: for instance,
the weaver would seek <code class="display"><span class="extract">Fig_2_3.pdf</span></code> at pathname <code class="display"><span class="extract">Figures/Fig_2_3.pdf</span></code>.
</p>
<p class="inwebparagraph">To embed an image, we write like so:
</p>
<pre class="display">
<span class="functiontext">[[Fig_0_1.pdf]]</span>
<span class="functiontext">[[Whatever.jpg width 6cm]]</span>
<span class="functiontext">[[Something.pdf height 2cm]]</span>
<span class="functiontext">= (figure mars.jpg)</span>
</pre>
<p class="inwebparagraph">In the latter examples, we constrain the width or the height of the image
<p class="inwebparagraph">With results like so:
</p>
<center><img src="mars.jpg"></center>
<p class="inwebparagraph">Inweb also has some limited ability to control the dimensions of an image as it
would be used in a PDF via TeX:
</p>
<pre class="display">
<span class="functiontext">= (figure Whatever.jpg width 6cm)</span>
<span class="functiontext">= (figure Something.jpg height 2cm)</span>
</pre>
<p class="inwebparagraph">In these examples, we constrain the width or the height of the image
to be exactly that given: it is scaled accordingly. (They can't both be
constrained, so you can't change the aspect ratio.)
</p>
<p class="inwebparagraph">The weaver expects that any pictures needed will be stored in a subdirectory of
the web called <code class="display"><span class="extract">Figures</span></code>: for instance, the weaver would seek <code class="display"><span class="extract">Fig_2_3.pdf</span></code> at
pathname <code class="display"><span class="extract">Figures/Fig_2_3.pdf</span></code>.
</p>
<p class="inwebparagraph"><a id="SP16"></a><b>&#167;16. </b>Mathematical formulae can be typed in TeX notation between dollar signs,
<p class="inwebparagraph"><a id="SP16"></a><b>&#167;16. Mathematics notation. </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

@ -149,6 +149,10 @@
<p><a href="4-pl.html"><spon class="sectiontitle">Programming Languages</span></a> -
<span class="purpose">Defining the programming languages supported by Inweb, loading in their definitions from files.</span></p>
</li>
<li>
<p><a href="4-saf.html"><spon class="sectiontitle">Structures and Functions</span></a> -
<span class="purpose">Basic support for languages to recognise structure and function declarations.</span></p>
</li>
<li>
<p><a href="4-lm.html"><spon class="sectiontitle">Language Methods</span></a> -
<span class="purpose">To characterise the relevant differences in behaviour between the various programming languages supported.</span></p>