Modernised Figure syntax
This commit is contained in:
parent
9d1c0173b8
commit
c66f5c1fae
24 changed files with 652 additions and 1117 deletions
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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:
|
||||
|
||||
=
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
922
Tangled/inweb.c
922
Tangled/inweb.c
File diff suppressed because it is too large
Load diff
|
@ -1,3 +1,3 @@
|
|||
Prerelease: alpha.1
|
||||
Build Date: 9 April 2020
|
||||
Build Number: 1A15
|
||||
Build Date: 10 April 2020
|
||||
Build Number: 1A16
|
||||
|
|
|
@ -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">§7.4.2</a>, 8/wm (<a href="8-wm.html#SP3">§3</a>), 1/cnf (<a href="1-cnf.html#SP1">§1</a>), 4/cl (<a href="4-cl.html#SP2_4_2_5">§2.4.2.5</a>).</p>
|
||||
<p class="endnote">The function main is used in <a href="#SP7_4_2">§7.4.2</a>, 8/wm (<a href="8-wm.html#SP3">§3</a>), 1/cnf (<a href="1-cnf.html#SP1">§1</a>), 4/saf (<a href="4-saf.html#SP7_3">§7.3</a>).</p>
|
||||
|
||||
<p class="inwebparagraph"><a id="SP6_1"></a><b>§6.1. </b><code class="display">
|
||||
<<span class="cwebmacrodefn">Initialise inweb</span> <span class="cwebmacronumber">6.1</span>> =
|
||||
|
@ -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">§5</a>), 2/tp (<a href="2-tp.html#SP1_1_6_3">§1.1.6.3</a>, <a href="2-tp.html#SP1_1_6_4">§1.1.6.4</a>, <a href="2-tp.html#SP1_1_6_7">§1.1.6.7</a>, <a href="2-tp.html#SP1_1_6_7_1">§1.1.6.7.1</a>, <a href="2-tp.html#SP1_1_6_5_1">§1.1.6.5.1</a>, <a href="2-tp.html#SP1_1_6_5_1_1">§1.1.6.5.1.1</a>, <a href="2-tp.html#SP1_1_6_5_1_2">§1.1.6.5.1.2</a>, <a href="2-tp.html#SP1_1_6_5_1_3">§1.1.6.5.1.3</a>, <a href="2-tp.html#SP1_1_6_5_1_4">§1.1.6.5.1.4</a>, <a href="2-tp.html#SP1_1_6_5_1_7">§1.1.6.5.1.7</a>, <a href="2-tp.html#SP3">§3</a>), 2/ec (<a href="2-ec.html#SP3_1">§3.1</a>, <a href="2-ec.html#SP3_2">§3.2</a>, <a href="2-ec.html#SP3_3">§3.3</a>), 3/ta (<a href="3-ta.html#SP4_1">§4.1</a>), 3/tt (<a href="3-tt.html#SP1_1_1_1">§1.1.1.1</a>, <a href="3-tt.html#SP3_1">§3.1</a>), 4/lm (<a href="4-lm.html#SP8">§8</a>), 4/cl (<a href="4-cl.html#SP2">§2</a>, <a href="4-cl.html#SP2_1">§2.1</a>, <a href="4-cl.html#SP2_4_2_1">§2.4.2.1</a>, <a href="4-cl.html#SP2_4_2_5">§2.4.2.5</a>, <a href="4-cl.html#SP10">§10</a>), 5/fm (<a href="5-fm.html#SP24">§24</a>).</p>
|
||||
<p class="endnote">The function Main::error_in_web is used in 1/cnf (<a href="1-cnf.html#SP5">§5</a>), 2/tp (<a href="2-tp.html#SP1_1_6_3">§1.1.6.3</a>, <a href="2-tp.html#SP1_1_6_4">§1.1.6.4</a>, <a href="2-tp.html#SP1_1_6_7">§1.1.6.7</a>, <a href="2-tp.html#SP1_1_6_7_1">§1.1.6.7.1</a>, <a href="2-tp.html#SP1_1_6_5_1">§1.1.6.5.1</a>, <a href="2-tp.html#SP1_1_6_5_1_1">§1.1.6.5.1.1</a>, <a href="2-tp.html#SP1_1_6_5_1_2">§1.1.6.5.1.2</a>, <a href="2-tp.html#SP1_1_6_5_1_3">§1.1.6.5.1.3</a>, <a href="2-tp.html#SP1_1_6_5_1_4">§1.1.6.5.1.4</a>, <a href="2-tp.html#SP1_1_6_5_1_7">§1.1.6.5.1.7</a>, <a href="2-tp.html#SP3">§3</a>), 2/ec (<a href="2-ec.html#SP3_1">§3.1</a>, <a href="2-ec.html#SP3_2">§3.2</a>, <a href="2-ec.html#SP3_3">§3.3</a>), 3/ta (<a href="3-ta.html#SP4_1">§4.1</a>), 3/tt (<a href="3-tt.html#SP1_1_1_1">§1.1.1.1</a>, <a href="3-tt.html#SP3_1">§3.1</a>), 4/saf (<a href="4-saf.html#SP7_3">§7.3</a>), 4/lm (<a href="4-lm.html#SP8">§8</a>), 4/cl (<a href="4-cl.html#SP2">§2</a>, <a href="4-cl.html#SP2_1">§2.1</a>, <a href="4-cl.html#SP2_4_2_1">§2.4.2.1</a>, <a href="4-cl.html#SP8">§8</a>), 5/fm (<a href="5-fm.html#SP24">§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">
|
||||
|
|
|
@ -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>§2. </b></p>
|
||||
|
||||
|
|
|
@ -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">§4.4</a>), 2/tp (<a href="2-tp.html#SP1_1_2">§1.1.2</a>, <a href="2-tp.html#SP1_1_6_3">§1.1.6.3</a>), 4/cl (<a href="4-cl.html#SP2_2">§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">§4.4</a>), 2/tp (<a href="2-tp.html#SP1_1_2">§1.1.2</a>, <a href="2-tp.html#SP1_1_6_3">§1.1.6.3</a>, <a href="2-tp.html#SP1_1_6_7">§1.1.6.7</a>), 4/cl (<a href="4-cl.html#SP2_2">§2.2</a>).</p>
|
||||
|
||||
<p class="inwebparagraph"><a id="SP5"></a><b>§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">§1.1.1.1</a>, <a href="3-tt.html#SP2">§2</a>), 4/cl (<a href="4-cl.html#SP5">§5</a>, <a href="4-cl.html#SP6_1">§6.1</a>, <a href="4-cl.html#SP6_3">§6.3</a>, <a href="4-cl.html#SP6_4">§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">§1.1.1.1</a>, <a href="3-tt.html#SP2">§2</a>), 4/cl (<a href="4-cl.html#SP4">§4</a>, <a href="4-cl.html#SP5_1">§5.1</a>, <a href="4-cl.html#SP5_3">§5.3</a>, <a href="4-cl.html#SP5_4">§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">§1.1.1.1</a>, <a href="3-tt.html#SP2">§2</a>), 4/cl (<a href="4-cl.html#SP5">§5</a>, <a href="4-cl.html#SP6_1">§6.1</a>, <a href="4-cl.html#SP6_3">§6.3</a>, <a href="4-cl.html#SP6_4">§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">§1.1.1.1</a>, <a href="3-tt.html#SP2">§2</a>), 4/cl (<a href="4-cl.html#SP4">§4</a>, <a href="4-cl.html#SP5_1">§5.1</a>, <a href="4-cl.html#SP5_3">§5.3</a>, <a href="4-cl.html#SP5_4">§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">§2</a>).</p>
|
||||
|
||||
|
|
|
@ -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>§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">-></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">-></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">-></span><span class="element">md</span><span class="plain">-></span><span class="identifier">using_syntax</span><span class="plain"> >= </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">-></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">-></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">-></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">-></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.
|
|||
<<span class="cwebmacro">Make plainer</span> <span class="cwebmacronumber">1.1.6.7.1</span>><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>
|
||||
<<span class="cwebmacro">Spool from file</span> <span class="cwebmacronumber">1.1.6.7.2</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_paragraph</span><span class="plain">) &&</span>
|
||||
<span class="plain">(</span><span class="functiontext">Regexp::match</span><span class="plain">(&</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">-></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">-></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">-></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">-></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>§1.1.6.5.1.8.2. </b><code class="display">
|
||||
<<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>> =
|
||||
|
|
|
@ -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>§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>§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:
|
||||
|
|
|
@ -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">-></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"> < </span><span class="functiontext">Str::len</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">-></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">-></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">-></span><span class="element">md</span><span class="plain">-></span><span class="element">ch_range</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">-></span><span class="element">md</span><span class="plain">-></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">-></span><span class="identifier">md</span><span class="plain">-></span><span class="element">ch_basic_title</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">-></span><span class="element">md</span><span class="plain">-></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"> < </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">-></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">-></span><span class="element">md</span><span class="plain">-></span><span class="element">ch_range</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">-></span><span class="element">md</span><span class="plain">-></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">-></span><span class="identifier">md</span><span class="plain">-></span><span class="element">ch_basic_title</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">-></span><span class="element">md</span><span class="plain">-></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">-></span><span class="element">sect_extent</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">-></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">-></span><span class="element">sect_range</span><span class="plain">); </span><span class="identifier">i</span><span class="plain"><</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"><</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">-></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">§10</a>.</p>
|
||||
|
||||
<p class="endnote">The function Analyser::find_hash_entry_for_section is used in <a href="#SP12">§12</a>, 3/tw (<a href="3-tw.html#SP2_2">§2.2</a>, <a href="3-tw.html#SP2_3">§2.3</a>), 4/cl (<a href="4-cl.html#SP9">§9</a>, <a href="4-cl.html#SP10">§10</a>), 4/is (<a href="4-is.html#SP14_1">§14.1</a>, <a href="4-is.html#SP14_2">§14.2</a>, <a href="4-is.html#SP18">§18</a>).</p>
|
||||
<p class="endnote">The function Analyser::find_hash_entry_for_section is used in <a href="#SP12">§12</a>, 3/tw (<a href="3-tw.html#SP2_2">§2.2</a>, <a href="3-tw.html#SP2_3">§2.3</a>), 4/cl (<a href="4-cl.html#SP7">§7</a>, <a href="4-cl.html#SP8">§8</a>), 4/is (<a href="4-is.html#SP14_1">§14.1</a>, <a href="4-is.html#SP14_2">§14.2</a>, <a href="4-is.html#SP18">§18</a>).</p>
|
||||
|
||||
<p class="inwebparagraph"><a id="SP10"></a><b>§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">§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">§1.1.6.5.1.6</a>, <a href="2-tp.html#SP1_1_6_5_1_7">§1.1.6.5.1.7</a>), 4/as (<a href="4-as.html#SP5">§5</a>), 4/cl (<a href="4-cl.html#SP2_2_2">§2.2.2</a>, <a href="4-cl.html#SP2_2_3_6">§2.2.3.6</a>, <a href="4-cl.html#SP2_4_2">§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">§1.1.6.5.1.6</a>, <a href="2-tp.html#SP1_1_6_5_1_7">§1.1.6.5.1.7</a>), 4/saf (<a href="4-saf.html#SP2">§2</a>, <a href="4-saf.html#SP4">§4</a>, <a href="4-saf.html#SP7">§7</a>), 4/as (<a href="4-as.html#SP5">§5</a>).</p>
|
||||
|
||||
<p class="endnote">The function Analyser::is_reserved_word is used in 4/tp (<a href="4-tp.html#SP5">§5</a>).</p>
|
||||
|
||||
|
|
|
@ -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">§2</a>, <a href="#SP3_1">§3.1</a>, <a href="#SP3_2">§3.2</a>, 4/as (<a href="4-as.html#SP3">§3</a>), 4/cl (<a href="4-cl.html#SP5">§5</a>), 4/is (<a href="4-is.html#SP9_1_2_1">§9.1.2.1</a>).</p>
|
||||
<p class="endnote">The function Tangler::tangle_code is used in <a href="#SP2">§2</a>, <a href="#SP3_1">§3.1</a>, <a href="#SP3_2">§3.2</a>, 4/as (<a href="4-as.html#SP3">§3</a>), 4/cl (<a href="4-cl.html#SP4">§4</a>), 4/is (<a href="4-is.html#SP9_1_2_1">§9.1.2.1</a>).</p>
|
||||
|
||||
<p class="inwebparagraph"><a id="SP3_1"></a><b>§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">§7.4.2</a>), 3/ta (<a href="3-ta.html#SP4">§4</a>, <a href="3-ta.html#SP4_1">§4.1</a>), 4/cl (<a href="4-cl.html#SP2">§2</a>, <a href="4-cl.html#SP2_2">§2.2</a>, <a href="4-cl.html#SP6_1">§6.1</a>, <a href="4-cl.html#SP6_4">§6.4</a>), 4/is (<a href="4-is.html#SP3">§3</a>, <a href="4-is.html#SP6">§6</a>, <a href="4-is.html#SP7">§7</a>).</p>
|
||||
<p class="endnote">The function Tangler::primary_target is used in 1/pc (<a href="1-pc.html#SP7_4_2">§7.4.2</a>), 3/ta (<a href="3-ta.html#SP4">§4</a>, <a href="3-ta.html#SP4_1">§4.1</a>), 4/cl (<a href="4-cl.html#SP2">§2</a>, <a href="4-cl.html#SP2_2">§2.2</a>, <a href="4-cl.html#SP5_1">§5.1</a>, <a href="4-cl.html#SP5_4">§5.4</a>), 4/is (<a href="4-is.html#SP3">§3</a>, <a href="4-is.html#SP6">§6</a>, <a href="4-is.html#SP7">§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">
|
||||
|
|
|
@ -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">(&</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">-></span><span class="element">md</span><span class="plain">-></span><span class="identifier">using_syntax</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">-></span><span class="element">md</span><span class="plain">-></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">-></span><span class="element">md</span><span class="plain">-></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">(&</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">-></span><span class="element">md</span><span class="plain">-></span><span class="identifier">using_syntax</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">-></span><span class="element">md</span><span class="plain">-></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">-></span><span class="element">md</span><span class="plain">-></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">(&</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">-></span><span class="element">md</span><span class="plain">-></span><span class="identifier">using_syntax</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">-></span><span class="element">md</span><span class="plain">-></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">-></span><span class="element">md</span><span class="plain">-></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">(&</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">-></span><span class="element">md</span><span class="plain">-></span><span class="identifier">using_syntax</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">-></span><span class="element">md</span><span class="plain">-></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">-></span><span class="element">md</span><span class="plain">-></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>
|
||||
|
|
|
@ -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">§1. </a></li><li><a href="#SP2">§2. Parsing</a></li><li><a href="#SP2_2">§2.2. Structures</a></li><li><a href="#SP2_3">§2.3. Structure dependency</a></li><li><a href="#SP2_4">§2.4. Functions</a></li><li><a href="#SP4">§4. Subcategorisation</a></li><li><a href="#SP5">§5. Tangling extras</a></li><li><a href="#SP6">§6. Tangling predeclarations</a></li><li><a href="#SP7">§7. Overriding regular code weaving</a></li><li><a href="#SP8">§8. Analysis</a></li></ul><hr class="tocbar">
|
||||
<ul class="toc"><li><a href="#SP1">§1. </a></li><li><a href="#SP2">§2. Parsing</a></li><li><a href="#SP2_2">§2.2. Structures</a></li><li><a href="#SP2_3">§2.3. Structure dependency</a></li><li><a href="#SP2_4">§2.4. Functions</a></li><li><a href="#SP3">§3. Subcategorisation</a></li><li><a href="#SP4">§4. Tangling extras</a></li><li><a href="#SP5">§5. Tangling predeclarations</a></li><li><a href="#SP6">§6. Overriding regular code weaving</a></li><li><a href="#SP7">§7. Analysis</a></li></ul><hr class="tocbar">
|
||||
|
||||
<p class="inwebparagraph"><a id="SP1"></a><b>§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>
|
||||
<<span class="cwebmacro">Find every typedef struct in the tangle</span> <span class="cwebmacronumber">2.2</span>><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">(&</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">L</span><span class="plain">-></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>
|
||||
<<span class="cwebmacro">Attach a structure to this source line</span> <span class="cwebmacronumber">2.2.2</span>><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">-></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">-></span><span class="element">text</span><span class="plain">) == </span><span class="character">'}'</span><span class="plain">) && (</span><span class="identifier">current_str</span><span class="plain">)) {</span>
|
||||
<span class="identifier">current_str</span><span class="plain">-></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">) && (</span><span class="identifier">current_str</span><span class="plain">-></span><span class="element">typedef_ends</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">)) {</span>
|
||||
<<span class="cwebmacro">Work through the a line in the structure definition</span> <span class="cwebmacronumber">2.2.3</span>><span class="plain">;</span>
|
||||
<<span class="cwebmacro">Work through a line in the structure definition</span> <span class="cwebmacronumber">2.2.1</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">(&</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">L</span><span class="plain">-></span><span class="element">text</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"typedef %c+"</span><span class="plain">)) &&</span>
|
||||
<span class="plain">(</span><span class="functiontext">Regexp::match</span><span class="plain">(&</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">L</span><span class="plain">-></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">-></span><span class="element">owning_paragraph</span><span class="plain">-></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">§2</a>.</p>
|
||||
|
||||
<p class="inwebparagraph"><a id="SP2_2_1"></a><b>§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>§2.2.2. </b><code class="display">
|
||||
<<span class="cwebmacrodefn">Attach a structure to this source line</span> <span class="cwebmacronumber">2.2.2</span>> =
|
||||
</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>
|
||||
<<span class="cwebmacro">Initialise the C structure structure</span> <span class="cwebmacronumber">2.2.2.1</span>><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">-></span><span class="element">owning_section</span><span class="plain">, </span><span class="identifier">str</span><span class="plain">-></span><span class="element">structure_name</span><span class="plain">, </span><span class="constant">RESERVED_COLOUR</span><span class="plain">);</span>
|
||||
<<span class="cwebmacro">Add this to the lists for its web and its paragraph</span> <span class="cwebmacronumber">2.2.2.2</span>><span class="plain">;</span>
|
||||
<<span class="cwebmacro">Insertion-sort this into the alphabetical list of all structures found</span> <span class="cwebmacronumber">2.2.2.3</span>><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">§2.2</a>.</p>
|
||||
|
||||
<p class="inwebparagraph"><a id="SP2_2_2_1"></a><b>§2.2.2.1. </b><code class="display">
|
||||
<<span class="cwebmacrodefn">Initialise the C structure structure</span> <span class="cwebmacronumber">2.2.2.1</span>> =
|
||||
</code></p>
|
||||
|
||||
|
||||
<pre class="displaydefn">
|
||||
<span class="identifier">str</span><span class="plain">-></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">-></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">-></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">-></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">-></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">-></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">§2.2.2</a>.</p>
|
||||
|
||||
<p class="inwebparagraph"><a id="SP2_2_2_2"></a><b>§2.2.2.2. </b><code class="display">
|
||||
<<span class="cwebmacrodefn">Add this to the lists for its web and its paragraph</span> <span class="cwebmacronumber">2.2.2.2</span>> =
|
||||
</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">-></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">-></span><span class="element">owning_paragraph</span><span class="plain">-></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">§2.2.2</a>.</p>
|
||||
|
||||
<p class="inwebparagraph"><a id="SP2_2_2_3"></a><b>§2.2.2.3. </b><code class="display">
|
||||
<<span class="cwebmacrodefn">Insertion-sort this into the alphabetical list of all structures found</span> <span class="cwebmacronumber">2.2.2.3</span>> =
|
||||
</code></p>
|
||||
|
||||
|
||||
<pre class="displaydefn">
|
||||
<span class="identifier">str</span><span class="plain">-></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">-></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">-></span><span class="element">structure_name</span><span class="plain">, </span><span class="identifier">seq</span><span class="plain">-></span><span class="element">structure_name</span><span class="plain">) < </span><span class="constant">0</span><span class="plain">) {</span>
|
||||
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">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">-></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">-></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">-></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">-></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">§2.2.2</a>.</p>
|
||||
|
||||
<p class="inwebparagraph"><a id="SP2_2_3"></a><b>§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>§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">
|
||||
<<span class="cwebmacrodefn">Work through the a line in the structure definition</span> <span class="cwebmacronumber">2.2.3</span>> =
|
||||
<<span class="cwebmacrodefn">Work through a line in the structure definition</span> <span class="cwebmacronumber">2.2.1</span>> =
|
||||
</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">-></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>
|
||||
<<span class="cwebmacro">Remove C type modifiers from the front of p</span> <span class="cwebmacronumber">2.2.3.1</span>><span class="plain">;</span>
|
||||
<<span class="cwebmacro">Remove C type modifiers from the front of p</span> <span class="cwebmacronumber">2.2.1.1</span>><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>
|
||||
<<span class="cwebmacro">Move pos past the type name</span> <span class="cwebmacronumber">2.2.3.2</span>><span class="plain">;</span>
|
||||
<<span class="cwebmacro">Move pos past any typographical type modifiers</span> <span class="cwebmacronumber">2.2.3.3</span>><span class="plain">;</span>
|
||||
<<span class="cwebmacro">Move pos past the type name</span> <span class="cwebmacronumber">2.2.1.2</span>><span class="plain">;</span>
|
||||
<<span class="cwebmacro">Move pos past any typographical type modifiers</span> <span class="cwebmacronumber">2.2.1.3</span>><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>
|
||||
<<span class="cwebmacro">Copy the element name into elname</span> <span class="cwebmacronumber">2.2.3.4</span>><span class="plain">;</span>
|
||||
<<span class="cwebmacro">Record the element</span> <span class="cwebmacronumber">2.2.3.6</span>><span class="plain">;</span>
|
||||
<<span class="cwebmacro">Copy the element name into elname</span> <span class="cwebmacronumber">2.2.1.4</span>><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">(&</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">§2.2</a>.</p>
|
||||
|
||||
<p class="inwebparagraph"><a id="SP2_2_3_1"></a><b>§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>§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">
|
||||
<<span class="cwebmacrodefn">Remove C type modifiers from the front of p</span> <span class="cwebmacronumber">2.2.3.1</span>> =
|
||||
<<span class="cwebmacrodefn">Remove C type modifiers from the front of p</span> <span class="cwebmacronumber">2.2.1.1</span>> =
|
||||
</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">§2.2.3</a>.</p>
|
||||
<p class="endnote">This code is used in <a href="#SP2_2_1">§2.2.1</a>.</p>
|
||||
|
||||
<p class="inwebparagraph"><a id="SP2_2_3_2"></a><b>§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>§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">
|
||||
<<span class="cwebmacrodefn">Move pos past the type name</span> <span class="cwebmacronumber">2.2.3.2</span>> =
|
||||
<<span class="cwebmacrodefn">Move pos past the type name</span> <span class="cwebmacronumber">2.2.1.2</span>> =
|
||||
</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">§2.2.3</a>.</p>
|
||||
<p class="endnote">This code is used in <a href="#SP2_2_1">§2.2.1</a>.</p>
|
||||
|
||||
<p class="inwebparagraph"><a id="SP2_2_3_3"></a><b>§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>§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">
|
||||
<<span class="cwebmacrodefn">Move pos past any typographical type modifiers</span> <span class="cwebmacronumber">2.2.3.3</span>> =
|
||||
<<span class="cwebmacrodefn">Move pos past any typographical type modifiers</span> <span class="cwebmacronumber">2.2.1.3</span>> =
|
||||
</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">§2.2.3</a>.</p>
|
||||
<p class="endnote">This code is used in <a href="#SP2_2_1">§2.2.1</a>.</p>
|
||||
|
||||
<p class="inwebparagraph"><a id="SP2_2_3_4"></a><b>§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>§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">
|
||||
<<span class="cwebmacrodefn">Copy the element name into elname</span> <span class="cwebmacronumber">2.2.3.4</span>> =
|
||||
<<span class="cwebmacrodefn">Copy the element name into elname</span> <span class="cwebmacronumber">2.2.1.4</span>> =
|
||||
</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">§2.2.3</a>.</p>
|
||||
|
||||
<p class="inwebparagraph"><a id="SP2_2_3_5"></a><b>§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>§2.2.3.6. </b><code class="display">
|
||||
<<span class="cwebmacrodefn">Record the element</span> <span class="cwebmacronumber">2.2.3.6</span>> =
|
||||
</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">-></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">-></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">-></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">-></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">-></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">-></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">-></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">§2.2.3</a>.</p>
|
||||
<p class="endnote">This code is used in <a href="#SP2_2_1">§2.2.1</a>.</p>
|
||||
|
||||
<p class="inwebparagraph"><a id="SP2_3"></a><b>§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">-></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">-></span><span class="element">structure_header_at</span><span class="plain">;</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">current_str</span><span class="plain">-></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">-></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">
|
||||
<<span class="cwebmacro">Soak up further arguments from continuation lines after the declaration</span> <span class="cwebmacronumber">2.4.2.1</span>><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">-></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>
|
||||
<<span class="cwebmacro">Initialise the function structure</span> <span class="cwebmacronumber">2.4.2.3</span>><span class="plain">;</span>
|
||||
<<span class="cwebmacro">Add the function to its paragraph and line</span> <span class="cwebmacronumber">2.4.2.4</span>><span class="plain">;</span>
|
||||
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">W</span><span class="plain">-></span><span class="element">main_language</span><span class="plain">-></span><span class="element">supports_namespaces</span><span class="plain">)</span>
|
||||
<<span class="cwebmacro">Check that the function has its namespace correctly declared</span> <span class="cwebmacronumber">2.4.2.5</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="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">-></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">-></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">-></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">-></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">-></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"><</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">-></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">§2.4.2</a>.</p>
|
||||
|
||||
<p class="inwebparagraph"><a id="SP2_4_2_2"></a><b>§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>§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">
|
||||
<<span class="cwebmacrodefn">Initialise the function structure</span> <span class="cwebmacronumber">2.4.2.3</span>> =
|
||||
</code></p>
|
||||
|
||||
|
||||
<pre class="displaydefn">
|
||||
<span class="identifier">fn</span><span class="plain">-></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">-></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">-></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">-></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">-></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">-></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">-></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">-></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">-></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">-></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">-></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"><</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">-></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">§2.4.2</a>.</p>
|
||||
|
||||
<p class="inwebparagraph"><a id="SP2_4_2_4"></a><b>§2.4.2.4. </b><code class="display">
|
||||
<<span class="cwebmacrodefn">Add the function to its paragraph and line</span> <span class="cwebmacronumber">2.4.2.4</span>> =
|
||||
</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">-></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">-></span><span class="element">functions</span><span class="plain">);</span>
|
||||
<span class="identifier">L</span><span class="plain">-></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">§2.4.2</a>.</p>
|
||||
|
||||
<p class="inwebparagraph"><a id="SP2_4_2_5"></a><b>§2.4.2.5. </b><code class="display">
|
||||
<<span class="cwebmacrodefn">Check that the function has its namespace correctly declared</span> <span class="cwebmacronumber">2.4.2.5</span>> =
|
||||
</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">(&</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">-></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">)) && (</span><span class="functiontext">Str::eq_wide_string</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">-></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">-></span><span class="element">sect_namespace</span><span class="plain">)) &&</span>
|
||||
<span class="plain">(</span><span class="identifier">L</span><span class="plain">-></span><span class="element">owning_paragraph</span><span class="plain">-></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">-></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">-></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">-></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">(&</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">§2.4.2</a>.</p>
|
||||
|
||||
<p class="inwebparagraph"><a id="SP3"></a><b>§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">-></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">-></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>§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>§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">§1</a>.</p>
|
||||
|
||||
<p class="inwebparagraph"><a id="SP5"></a><b>§5. Tangling extras. </b>"Additional early matter" is used for the inclusions of the ANSI library
|
||||
<p class="inwebparagraph"><a id="SP4"></a><b>§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">§1</a>.</p>
|
||||
|
||||
<p class="inwebparagraph"><a id="SP6"></a><b>§6. Tangling predeclarations. </b>This is where a language gets the chance to tangle predeclarations, early
|
||||
<p class="inwebparagraph"><a id="SP5"></a><b>§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 —
|
||||
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>
|
||||
<<span class="cwebmacro">Predeclare the structures in a well-founded order</span> <span class="cwebmacronumber">6.2</span>><span class="plain">;</span>
|
||||
<<span class="cwebmacro">Predeclare simple typedefs</span> <span class="cwebmacronumber">6.1</span>><span class="plain">;</span>
|
||||
<<span class="cwebmacro">Predeclare the functions</span> <span class="cwebmacronumber">6.4</span>><span class="plain">;</span>
|
||||
<<span class="cwebmacro">Predeclare the structures in a well-founded order</span> <span class="cwebmacronumber">5.2</span>><span class="plain">;</span>
|
||||
<<span class="cwebmacro">Predeclare simple typedefs</span> <span class="cwebmacronumber">5.1</span>><span class="plain">;</span>
|
||||
<<span class="cwebmacro">Predeclare the functions</span> <span class="cwebmacronumber">5.4</span>><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">§1</a>.</p>
|
||||
|
||||
<p class="inwebparagraph"><a id="SP6_1"></a><b>§6.1. </b>A "simple typedef" here means one that is aliasing something other than
|
||||
<p class="inwebparagraph"><a id="SP5_1"></a><b>§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">
|
||||
<<span class="cwebmacrodefn">Predeclare simple typedefs</span> <span class="cwebmacronumber">6.1</span>> =
|
||||
<<span class="cwebmacrodefn">Predeclare simple typedefs</span> <span class="cwebmacronumber">5.1</span>> =
|
||||
</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">§6</a>.</p>
|
||||
<p class="endnote">This code is used in <a href="#SP5">§5</a>.</p>
|
||||
|
||||
<p class="inwebparagraph"><a id="SP6_2"></a><b>§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>§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">
|
||||
<<span class="cwebmacrodefn">Predeclare the structures in a well-founded order</span> <span class="cwebmacronumber">6.2</span>> =
|
||||
<<span class="cwebmacrodefn">Predeclare the structures in a well-founded order</span> <span class="cwebmacronumber">5.2</span>> =
|
||||
</code></p>
|
||||
|
||||
|
||||
|
@ -906,9 +639,9 @@ finished.
|
|||
|
||||
<p class="inwebparagraph"></p>
|
||||
|
||||
<p class="endnote">This code is used in <a href="#SP6">§6</a>.</p>
|
||||
<p class="endnote">This code is used in <a href="#SP5">§5</a>.</p>
|
||||
|
||||
<p class="inwebparagraph"><a id="SP6_3"></a><b>§6.3. </b>Using the following recursion, which is therefore terminating:
|
||||
<p class="inwebparagraph"><a id="SP5_3"></a><b>§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">-></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">-></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">-></span><span class="element">typedef_begins</span><span class="plain">-></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">-></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">-></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">-></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">-></span><span class="element">structure_header_at</span><span class="plain">-></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">-></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">-></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">-></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">-></span><span class="element">text</span><span class="plain">);</span>
|
||||
<span class="identifier">L</span><span class="plain">-></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">-></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">-></span><span class="element">typedef_begins</span><span class="plain">-></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">-></span><span class="element">structure_header_at</span><span class="plain">-></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">§6.2</a>.</p>
|
||||
<p class="endnote">The function CLike::tangle_structure is used in <a href="#SP5_2">§5.2</a>.</p>
|
||||
|
||||
<p class="inwebparagraph"><a id="SP6_4"></a><b>§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>§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">
|
||||
<<span class="cwebmacrodefn">Predeclare the functions</span> <span class="cwebmacronumber">6.4</span>> =
|
||||
<<span class="cwebmacrodefn">Predeclare the functions</span> <span class="cwebmacronumber">5.4</span>> =
|
||||
</code></p>
|
||||
|
||||
|
||||
|
@ -988,36 +721,13 @@ exist either way.
|
|||
|
||||
<p class="inwebparagraph"></p>
|
||||
|
||||
<p class="endnote">This code is used in <a href="#SP6">§6</a>.</p>
|
||||
<p class="endnote">This code is used in <a href="#SP5">§5</a>.</p>
|
||||
|
||||
<p class="inwebparagraph"><a id="SP7"></a><b>§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>§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>§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">-></span><span class="element">typedef_begins</span><span class="plain">-></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">-></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">-></span><span class="element">function_header_at</span><span class="plain">-></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">-></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">§1</a>.</p>
|
||||
|
||||
<p class="inwebparagraph"><a id="SP9"></a><b>§9. </b>Having found all those functions and structure elements, we make sure they
|
||||
<p class="inwebparagraph"><a id="SP7"></a><b>§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">§1</a>.</p>
|
||||
|
||||
<p class="inwebparagraph"><a id="SP10"></a><b>§10. </b>The following is an opportunity for us to scold the author for any
|
||||
<p class="inwebparagraph"><a id="SP8"></a><b>§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
|
||||
|
|
|
@ -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">§1. Introduction</a></li><li><a href="#SP2">§2. Parsing methods</a></li><li><a href="#SP5">§5. Tangling methods</a></li><li><a href="#SP20">§20. Weaving methods</a></li><li><a href="#SP26">§26. Analysis methods</a></li><li><a href="#SP29">§29. What we support</a></li></ul><hr class="tocbar">
|
||||
<ul class="toc"><li><a href="#SP1">§1. Introduction</a></li><li><a href="#SP2">§2. Parsing methods</a></li><li><a href="#SP5">§5. Tangling methods</a></li><li><a href="#SP20">§20. Weaving methods</a></li><li><a href="#SP26">§26. Analysis methods</a></li><li><a href="#SP28">§28. What we support</a></li></ul><hr class="tocbar">
|
||||
|
||||
<p class="inwebparagraph"><a id="SP1"></a><b>§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">§2.1</a>, <a href="3-tt.html#SP3_1">§3.1</a>), 4/cl (<a href="4-cl.html#SP6_3">§6.3</a>, <a href="4-cl.html#SP6_4">§6.4</a>), 4/is (<a href="4-is.html#SP6">§6</a>, <a href="4-is.html#SP7">§7</a>).</p>
|
||||
<p class="endnote">The function LanguageMethods::insert_line_marker is used in 3/tt (<a href="3-tt.html#SP2_1">§2.1</a>, <a href="3-tt.html#SP3_1">§3.1</a>), 4/cl (<a href="4-cl.html#SP5_3">§5.3</a>, <a href="4-cl.html#SP5_4">§5.4</a>), 4/is (<a href="4-is.html#SP6">§6</a>, <a href="4-is.html#SP7">§7</a>).</p>
|
||||
|
||||
<p class="inwebparagraph"><a id="SP14"></a><b>§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">§3</a>, <a href="3-tt.html#SP3_1">§3.1</a>, <a href="3-tt.html#SP3_2">§3.2</a>), 4/cl (<a href="4-cl.html#SP6_1">§6.1</a>, <a href="4-cl.html#SP6_4">§6.4</a>).</p>
|
||||
<p class="endnote">The function LanguageMethods::tangle_code is used in 3/tt (<a href="3-tt.html#SP3">§3</a>, <a href="3-tt.html#SP3_1">§3.1</a>, <a href="3-tt.html#SP3_2">§3.2</a>), 4/cl (<a href="4-cl.html#SP5_1">§5.1</a>, <a href="4-cl.html#SP5_4">§5.4</a>).</p>
|
||||
|
||||
<p class="inwebparagraph"><a id="SP18"></a><b>§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">§2</a>).</p>
|
||||
|
||||
<p class="inwebparagraph"><a id="SP27"></a><b>§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">§4</a>).</p>
|
||||
|
||||
<p class="inwebparagraph"><a id="SP28"></a><b>§28. </b>And finally: in InC only, a few structure element names are given very slightly
|
||||
<p class="inwebparagraph"><a id="SP27"></a><b>§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">§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">§4</a>).</p>
|
||||
|
||||
<p class="inwebparagraph"><a id="SP29"></a><b>§29. What we support. </b></p>
|
||||
<p class="inwebparagraph"><a id="SP28"></a><b>§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">§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>
|
||||
|
|
|
@ -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>§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>
|
||||
|
|
|
@ -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">§1. The title of a section</a></li><li><a href="#SP2">§2. Paragraphing</a></li><li><a href="#SP6">§6. Conditional compilation</a></li><li><a href="#SP7">§7. Commentary</a></li><li><a href="#SP12">§12. Code samples and other extraneous matter</a></li></ul><hr class="tocbar">
|
||||
<ul class="toc"><li><a href="#SP1">§1. The title of a section</a></li><li><a href="#SP2">§2. Paragraphing</a></li><li><a href="#SP6">§6. Conditional compilation</a></li><li><a href="#SP7">§7. Commentary</a></li><li><a href="#SP12">§12. Code samples and other extraneous matter</a></li><li><a href="#SP13">§13. Links</a></li><li><a href="#SP14">§14. Cross-references</a></li><li><a href="#SP15">§15. Figures</a></li><li><a href="#SP16">§16. Mathematics notation</a></li></ul><hr class="tocbar">
|
||||
|
||||
<p class="inwebparagraph"><a id="SP1"></a><b>§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>§13. </b>URLs in the web are automatically recognised and a weave to HTML will
|
||||
<p class="inwebparagraph"><a id="SP13"></a><b>§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>§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>§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>§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>§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>§16. </b>Mathematical formulae can be typed in TeX notation between dollar signs,
|
||||
<p class="inwebparagraph"><a id="SP16"></a><b>§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
|
||||
|
|
|
@ -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>
|
||||
|
|
Loading…
Reference in a new issue