Improved extracts and testing for the painter

This commit is contained in:
Graham Nelson 2020-04-07 00:53:26 +01:00
parent 37b01a8d89
commit 46c1ad0de7
131 changed files with 2330 additions and 2285 deletions

1
.gitignore vendored
View file

@ -25,4 +25,5 @@ Tests/Test Cases/_Tangled_Actual/
Tests/Test Cases/_Tangled_Console/ Tests/Test Cases/_Tangled_Console/
Tests/Test Cases/_Woven_Actual/ Tests/Test Cases/_Woven_Actual/
Tests/Test Cases/_Woven_Console/ Tests/Test Cases/_Woven_Console/
Tests/Test Painter/_Results_Actual/

View file

@ -42,6 +42,9 @@ typedef struct inweb_instructions {
int verbose_switch; /* |-verbose|: print names of files read to stdout */ int verbose_switch; /* |-verbose|: print names of files read to stdout */
int targets; /* used only for parsing */ int targets; /* used only for parsing */
struct programming_language *test_language_setting; /* |-test-language X| */
struct filename *test_language_on_setting; /* |-test-language-on X| */
struct pathname *import_setting; /* |-import X|: where to find imported webs */ struct pathname *import_setting; /* |-import X|: where to find imported webs */
} inweb_instructions; } inweb_instructions;
@ -105,6 +108,8 @@ inweb_instructions Configuration::read(int argc, char **argv) {
args.weave_docs = FALSE; args.weave_docs = FALSE;
args.import_setting = NULL; args.import_setting = NULL;
args.targets = 0; args.targets = 0;
args.test_language_setting = NULL;
args.test_language_on_setting = NULL;
@ The CommandLine section of Foundation needs to be told what command-line @ The CommandLine section of Foundation needs to be told what command-line
switches we want, other than the standard set (such as |-help|) which it switches we want, other than the standard set (such as |-help|) which it
@ -118,6 +123,8 @@ provides automatically.
@e LANGUAGE_CLSW @e LANGUAGE_CLSW
@e LANGUAGES_CLSW @e LANGUAGES_CLSW
@e SHOW_LANGUAGES_CLSW @e SHOW_LANGUAGES_CLSW
@e TEST_LANGUAGE_CLSW
@e TEST_LANGUAGE_ON_CLSW
@e ANALYSIS_CLSG @e ANALYSIS_CLSG
@ -173,6 +180,10 @@ provides automatically.
L"read all language definitions in path X"); L"read all language definitions in path X");
CommandLine::declare_switch(SHOW_LANGUAGES_CLSW, L"show-languages", 1, CommandLine::declare_switch(SHOW_LANGUAGES_CLSW, L"show-languages", 1,
L"list programming languages supported by Inweb"); L"list programming languages supported by Inweb");
CommandLine::declare_switch(TEST_LANGUAGE_CLSW, L"test-language", 2,
L"test language X on...");
CommandLine::declare_switch(TEST_LANGUAGE_ON_CLSW, L"test-language-on", 2,
L"...the code in the file X");
CommandLine::end_group(); CommandLine::end_group();
CommandLine::begin_group(ANALYSIS_CLSG, CommandLine::begin_group(ANALYSIS_CLSG,
@ -256,6 +267,13 @@ void Configuration::switch(int id, int val, text_stream *arg, void *state) {
case SHOW_LANGUAGES_CLSW: case SHOW_LANGUAGES_CLSW:
args->show_languages_switch = TRUE; args->show_languages_switch = TRUE;
Configuration::set_fundamental_mode(args, ANALYSE_MODE); break; Configuration::set_fundamental_mode(args, ANALYSE_MODE); break;
case TEST_LANGUAGE_CLSW:
args->test_language_setting =
Languages::read_definition(Filenames::from_text(arg));
Configuration::set_fundamental_mode(args, ANALYSE_MODE); break;
case TEST_LANGUAGE_ON_CLSW:
args->test_language_on_setting = Filenames::from_text(arg);
Configuration::set_fundamental_mode(args, ANALYSE_MODE); break;
case CATALOGUE_CLSW: case CATALOGUE_CLSW:
args->catalogue_switch = TRUE; args->catalogue_switch = TRUE;
Configuration::set_fundamental_mode(args, ANALYSE_MODE); break; Configuration::set_fundamental_mode(args, ANALYSE_MODE); break;

View file

@ -100,6 +100,7 @@ void Main::follow_instructions(inweb_instructions *ins) {
if (no_inweb_errors == 0) { if (no_inweb_errors == 0) {
if (ins->inweb_mode == TRANSLATE_MODE) @<Translate a makefile@> if (ins->inweb_mode == TRANSLATE_MODE) @<Translate a makefile@>
else if (ins->show_languages_switch) @<List available programming languages@> else if (ins->show_languages_switch) @<List available programming languages@>
else if ((ins->test_language_setting) || (ins->test_language_on_setting)) @<Test a language@>
else if (ins->inweb_mode != NO_MODE) @<Analyse, tangle or weave an existing web@>; else if (ins->inweb_mode != NO_MODE) @<Analyse, tangle or weave an existing web@>;
} }
} }
@ -129,6 +130,22 @@ void Main::follow_instructions(inweb_instructions *ins) {
Languages::read_definitions(NULL); Languages::read_definitions(NULL);
Languages::show(STDOUT); Languages::show(STDOUT);
@ And this:
@<Test a language@> =
if ((ins->test_language_setting) && (ins->test_language_on_setting)) {
TEMPORARY_TEXT(matter);
TEMPORARY_TEXT(coloured);
Painter::colour_file(ins->test_language_setting, ins->test_language_on_setting,
matter, coloured);
PRINT("Test of colouring for language %S:\n%S\n%S\n",
ins->test_language_setting->language_name, matter, coloured);
DISCARD_TEXT(matter);
DISCARD_TEXT(coloured);
} else {
Errors::fatal("-test-language and -test-language-on must both be given");
}
@ But otherwise we do something with the given web: @ But otherwise we do something with the given web:
@<Analyse, tangle or weave an existing web@> = @<Analyse, tangle or weave an existing web@> =

View file

@ -25,6 +25,7 @@ typedef struct source_line {
int category; /* what sort of line this is: an |*_LCAT| value */ int category; /* what sort of line this is: an |*_LCAT| value */
int command_code; /* used only for |COMMAND_LCAT| lines: a |*_CMD| value */ int command_code; /* used only for |COMMAND_LCAT| lines: a |*_CMD| value */
int default_defn; /* used only for |BEGIN_DEFINITION_LCAT| lines */ int default_defn; /* used only for |BEGIN_DEFINITION_LCAT| lines */
int plainer; /* used only for |BEGIN_CODE_LCAT| lines: suppresses box */
struct programming_language *colour_as; /* used only for |TEXT_EXTRACT_LCAT| lines */ struct programming_language *colour_as; /* used only for |TEXT_EXTRACT_LCAT| lines */
int is_commentary; /* flag */ int is_commentary; /* flag */
struct function *function_defined; /* if any C-like function is defined on this line */ struct function *function_defined; /* if any C-like function is defined on this line */
@ -49,6 +50,7 @@ source_line *Lines::new_source_line(text_stream *line, text_file_position *tfp)
sl->category = NO_LCAT; /* that is, unknown category as yet */ sl->category = NO_LCAT; /* that is, unknown category as yet */
sl->command_code = NO_CMD; sl->command_code = NO_CMD;
sl->default_defn = FALSE; sl->default_defn = FALSE;
sl->plainer = FALSE;
sl->colour_as = NULL; sl->colour_as = NULL;
sl->is_commentary = FALSE; sl->is_commentary = FALSE;
sl->function_defined = NULL; sl->function_defined = NULL;

View file

@ -387,14 +387,29 @@ division in the current section.
code_lcat_for_body = TEXT_EXTRACT_LCAT; code_lcat_for_body = TEXT_EXTRACT_LCAT;
code_pl_for_body = NULL; code_pl_for_body = NULL;
extract_mode = TRUE; extract_mode = TRUE;
} else if ((current_paragraph) && (Regexp::match(&mr2, mr.exp[0], L"%(sample (%c+) code%)"))) { } else if ((current_paragraph) &&
(Regexp::match(&mr2, mr.exp[0], L"%(sample (%c+) code%)"))) {
code_lcat_for_body = TEXT_EXTRACT_LCAT; code_lcat_for_body = TEXT_EXTRACT_LCAT;
code_pl_for_body = Languages::find_by_name(mr2.exp[0], W); code_pl_for_body = Languages::find_by_name(mr2.exp[0], W);
extract_mode = TRUE; extract_mode = TRUE;
} else if ((current_paragraph) && (Regexp::match(&mr2, mr.exp[0], L"%(sample code%)"))) { } else if ((current_paragraph) &&
(Regexp::match(&mr2, mr.exp[0], L"%(sample code%)"))) {
code_lcat_for_body = TEXT_EXTRACT_LCAT; code_lcat_for_body = TEXT_EXTRACT_LCAT;
code_pl_for_body = S->sect_language; code_pl_for_body = S->sect_language;
extract_mode = TRUE; extract_mode = TRUE;
} else if ((current_paragraph) &&
(Regexp::match(&mr2, mr.exp[0], L"%(text from (%c+) as (%c+)%)"))) {
code_pl_for_body = Languages::find_by_name(mr2.exp[1], W);
@<Spool from file@>;
} else if ((current_paragraph) &&
(Regexp::match(&mr2, mr.exp[0], L"%(text from (%c+)%)"))) {
code_pl_for_body = NULL;
@<Spool from file@>;
} else if ((current_paragraph) &&
(Regexp::match(&mr2, mr.exp[0], L"%(undisplayed text from (%c+)%)"))) {
code_pl_for_body = NULL;
L->plainer = TRUE;
@<Spool from file@>;
} else { } else {
Main::error_in_web(I"unknown bracketed annotation", L); Main::error_in_web(I"unknown bracketed annotation", L);
} }
@ -405,6 +420,26 @@ division in the current section.
Regexp::dispose_of(&mr2); Regexp::dispose_of(&mr2);
continue; continue;
@<Spool from file@> =
L->category = BEGIN_CODE_LCAT;
pathname *P = W->md->path_to_web;
filename *F = Filenames::from_text_relative(P, mr2.exp[0]);
linked_list *lines = Painter::lines(F);
text_stream *T;
source_line *latest = L;
LOOP_OVER_LINKED_LIST(T, text_stream, lines) {
source_line *TL = Lines::new_source_line(T, &(L->source));
TL->next_line = latest->next_line;
TL->plainer = L->plainer;
latest->next_line = TL;
latest = TL;
}
source_line *EEL = Lines::new_source_line(I"=", &(L->source));
EEL->next_line = latest->next_line;
latest->next_line = EEL;
code_lcat_for_body = TEXT_EXTRACT_LCAT;
extract_mode = TRUE;
@ So here we have the possibilities which start with a column-1 |@| sign. @ So here we have the possibilities which start with a column-1 |@| sign.
There appear to be hordes of these, but in fact most of them were removed There appear to be hordes of these, but in fact most of them were removed
in Inweb syntax version 2: in modern syntax, only |@d|, |@e|, |@h|, their in Inweb syntax version 2: in modern syntax, only |@d|, |@e|, |@h|, their

View file

@ -152,6 +152,7 @@ We skip these because we weave their contents in some other way:
if (L->category == END_EXTRACT_LCAT) continue; if (L->category == END_EXTRACT_LCAT) continue;
if (L->category == BEGIN_CODE_LCAT) { if (L->category == BEGIN_CODE_LCAT) {
state->line_break_pending = FALSE; state->line_break_pending = FALSE;
LanguageMethods::reset_syntax_colouring(S->sect_language);
continue; continue;
} }
@ -292,25 +293,25 @@ add a vertical skip between them to show the division more clearly.
match_results mr = Regexp::create_mr(); match_results mr = Regexp::create_mr();
if (Regexp::match(&mr, matter, L"%(...%) (%c*)")) { /* continue single */ if (Regexp::match(&mr, matter, L"%(...%) (%c*)")) { /* continue single */
Formats::change_material(OUT, wv, state->kind_of_material, REGULAR_MATERIAL, Formats::change_material(OUT, wv, state->kind_of_material, REGULAR_MATERIAL,
state->substantive_comment); state->substantive_comment, FALSE);
state->kind_of_material = REGULAR_MATERIAL; state->kind_of_material = REGULAR_MATERIAL;
Formats::item(OUT, wv, 1, I""); Formats::item(OUT, wv, 1, I"");
Str::copy(matter, mr.exp[0]); Str::copy(matter, mr.exp[0]);
} else if (Regexp::match(&mr, matter, L"%(-...%) (%c*)")) { /* continue double */ } else if (Regexp::match(&mr, matter, L"%(-...%) (%c*)")) { /* continue double */
Formats::change_material(OUT, wv, state->kind_of_material, REGULAR_MATERIAL, Formats::change_material(OUT, wv, state->kind_of_material, REGULAR_MATERIAL,
state->substantive_comment); state->substantive_comment, FALSE);
state->kind_of_material = REGULAR_MATERIAL; state->kind_of_material = REGULAR_MATERIAL;
Formats::item(OUT, wv, 2, I""); Formats::item(OUT, wv, 2, I"");
Str::copy(matter, mr.exp[0]); Str::copy(matter, mr.exp[0]);
} else if (Regexp::match(&mr, matter, L"%((%i+)%) (%c*)")) { /* begin single */ } else if (Regexp::match(&mr, matter, L"%((%i+)%) (%c*)")) { /* begin single */
Formats::change_material(OUT, wv, state->kind_of_material, REGULAR_MATERIAL, Formats::change_material(OUT, wv, state->kind_of_material, REGULAR_MATERIAL,
state->substantive_comment); state->substantive_comment, FALSE);
state->kind_of_material = REGULAR_MATERIAL; state->kind_of_material = REGULAR_MATERIAL;
Formats::item(OUT, wv, 1, mr.exp[0]); Formats::item(OUT, wv, 1, mr.exp[0]);
Str::copy(matter, mr.exp[1]); Str::copy(matter, mr.exp[1]);
} else if (Regexp::match(&mr, matter, L"%(-(%i+)%) (%c*)")) { /* begin double */ } else if (Regexp::match(&mr, matter, L"%(-(%i+)%) (%c*)")) { /* begin double */
Formats::change_material(OUT, wv, state->kind_of_material, REGULAR_MATERIAL, Formats::change_material(OUT, wv, state->kind_of_material, REGULAR_MATERIAL,
state->substantive_comment); state->substantive_comment, FALSE);
state->kind_of_material = REGULAR_MATERIAL; state->kind_of_material = REGULAR_MATERIAL;
Formats::item(OUT, wv, 2, mr.exp[0]); Formats::item(OUT, wv, 2, mr.exp[0]);
Str::copy(matter, mr.exp[1]); Str::copy(matter, mr.exp[1]);
@ -324,7 +325,8 @@ in the source is set indented in code style.
match_results mr = Regexp::create_mr(); match_results mr = Regexp::create_mr();
if (Regexp::match(&mr, matter, L"\t|(%c*)|(%c*?)")) { if (Regexp::match(&mr, matter, L"\t|(%c*)|(%c*?)")) {
if (state->kind_of_material != CODE_MATERIAL) { if (state->kind_of_material != CODE_MATERIAL) {
Formats::change_material(OUT, wv, state->kind_of_material, CODE_MATERIAL, TRUE); Formats::change_material(OUT, wv, state->kind_of_material, CODE_MATERIAL,
TRUE, L->plainer);
state->kind_of_material = CODE_MATERIAL; state->kind_of_material = CODE_MATERIAL;
} }
TEMPORARY_TEXT(original); TEMPORARY_TEXT(original);
@ -338,7 +340,8 @@ in the source is set indented in code style.
DISCARD_TEXT(original); DISCARD_TEXT(original);
continue; continue;
} else if (state->kind_of_material != REGULAR_MATERIAL) { } else if (state->kind_of_material != REGULAR_MATERIAL) {
Formats::change_material(OUT, wv, state->kind_of_material, REGULAR_MATERIAL, TRUE); Formats::change_material(OUT, wv, state->kind_of_material, REGULAR_MATERIAL,
TRUE, FALSE);
state->kind_of_material = REGULAR_MATERIAL; state->kind_of_material = REGULAR_MATERIAL;
} }
Regexp::dispose_of(&mr); Regexp::dispose_of(&mr);
@ -364,7 +367,8 @@ and macro usage is rendered differently.
W, C, S, L, matter, concluding_comment)) continue; W, C, S, L, matter, concluding_comment)) continue;
TEMPORARY_TEXT(colouring); TEMPORARY_TEXT(colouring);
LanguageMethods::syntax_colour(OUT, S->sect_language, wv, W, C, S, L, matter, colouring); LanguageMethods::syntax_colour(OUT, S->sect_language, wv, W, C, S, L,
matter, colouring);
int found = 0; int found = 0;
@<Find macro usages and adjust syntax colouring accordingly@>; @<Find macro usages and adjust syntax colouring accordingly@>;
@ -399,7 +403,7 @@ hence the name of the following paragraph:
else else
state->kind_of_material = CODE_MATERIAL; state->kind_of_material = CODE_MATERIAL;
Formats::change_material(OUT, wv, mode_now, state->kind_of_material, Formats::change_material(OUT, wv, mode_now, state->kind_of_material,
state->substantive_comment); state->substantive_comment, L->plainer);
state->line_break_pending = FALSE; state->line_break_pending = FALSE;
} }
@ -501,7 +505,7 @@ otherwise, they are set flush right.
@<Complete any started but not-fully-woven paragraph@>; @<Complete any started but not-fully-woven paragraph@>;
if (wv->theme_match) if (wv->theme_match)
@<If this is a paragraph break forced onto a new page, then throw a page@>; @<If this is a paragraph break forced onto a new page, then throw a page@>;
LanguageMethods::reset_syntax_colouring(S->sect_language); /* a precaution: limits bad colouring accidents to one para */ LanguageMethods::reset_syntax_colouring(S->sect_language);
int weight = 0; int weight = 0;
if (L->category == HEADING_START_LCAT) weight = 1; if (L->category == HEADING_START_LCAT) weight = 1;
if (L->category == SECTION_HEADING_LCAT) weight = 2; if (L->category == SECTION_HEADING_LCAT) weight = 2;
@ -647,7 +651,8 @@ At the end of a paragraph, on the other hand, we do this:
int mode_now = state->kind_of_material; int mode_now = state->kind_of_material;
if (state->kind_of_material != REGULAR_MATERIAL) { if (state->kind_of_material != REGULAR_MATERIAL) {
state->kind_of_material = REGULAR_MATERIAL; state->kind_of_material = REGULAR_MATERIAL;
Formats::change_material(OUT, wv, mode_now, state->kind_of_material, TRUE); Formats::change_material(OUT, wv, mode_now, state->kind_of_material,
TRUE, L?(L->plainer):FALSE);
} }
if ((current_paragraph) && (current_paragraph != state->last_endnoted_para)) { if ((current_paragraph) && (current_paragraph != state->last_endnoted_para)) {
state->last_endnoted_para = current_paragraph; state->last_endnoted_para = current_paragraph;

View file

@ -245,5 +245,5 @@ int ACMESupport::syntax_colour(programming_language *pl, text_stream *OUT, weave
hash_table *ht = &(S->sect_target->symbols); hash_table *ht = &(S->sect_target->symbols);
if ((L->category == TEXT_EXTRACT_LCAT) && (pl != S->sect_language)) if ((L->category == TEXT_EXTRACT_LCAT) && (pl != S->sect_language))
ht = &(pl->built_in_keywords); ht = &(pl->built_in_keywords);
return Painter::syntax_colour(pl, OUT, ht, matter, colouring, FALSE); return Painter::syntax_colour(pl, ht, matter, colouring, FALSE);
} }

View file

@ -25,7 +25,7 @@ programming_language *Languages::find_by_name(text_stream *lname, web *W) {
@<Read the language definition file with this name@> = @<Read the language definition file with this name@> =
filename *F = NULL; filename *F = NULL;
if (W) { if (W) {
pathname *P = Pathnames::subfolder(W->md->path_to_web, I"Private Languages"); pathname *P = Pathnames::subfolder(W->md->path_to_web, I"Dialects");
@<Try P@>; @<Try P@>;
} }
pathname *P = Languages::default_directory(); pathname *P = Languages::default_directory();
@ -415,6 +415,7 @@ typedef struct colouring_rule {
int match_prefix; /* one of the |*_RULE_PREFIX| values above */ int match_prefix; /* one of the |*_RULE_PREFIX| values above */
wchar_t match_regexp_text[MAX_ILDF_REGEXP_LENGTH]; wchar_t match_regexp_text[MAX_ILDF_REGEXP_LENGTH];
int number; /* for |number N| rules; 0 for others */ int number; /* for |number N| rules; 0 for others */
int number_of; /* for |number N of M| rules; 0 for others */
/* the conclusion: */ /* the conclusion: */
struct colouring_language_block *execute_block; /* or |NULL|, in which case... */ struct colouring_language_block *execute_block; /* or |NULL|, in which case... */
@ -440,6 +441,7 @@ colouring_rule *Languages::new_rule(colouring_language_block *within) {
rule->match_keyword_of_colour = NOT_A_COLOUR; rule->match_keyword_of_colour = NOT_A_COLOUR;
rule->match_regexp_text[0] = 0; rule->match_regexp_text[0] = 0;
rule->number = 0; rule->number = 0;
rule->number_of = 0;
rule->set_to_colour = NOT_A_COLOUR; rule->set_to_colour = NOT_A_COLOUR;
rule->set_prefix_to_colour = NOT_A_COLOUR; rule->set_prefix_to_colour = NOT_A_COLOUR;
@ -469,6 +471,9 @@ void Languages::parse_rule(language_reader_state *state, text_stream *premiss,
} }
if (Regexp::match(&mr, premiss, L"number (%d+)")) { if (Regexp::match(&mr, premiss, L"number (%d+)")) {
rule->number = Str::atoi(mr.exp[0], 0); rule->number = Str::atoi(mr.exp[0], 0);
} else if (Regexp::match(&mr, premiss, L"number (%d+) of (%d+)")) {
rule->number = Str::atoi(mr.exp[0], 0);
rule->number_of = Str::atoi(mr.exp[1], 0);
} else if (Regexp::match(&mr, premiss, L"keyword of (%c+)")) { } else if (Regexp::match(&mr, premiss, L"keyword of (%c+)")) {
rule->match_keyword_of_colour = Languages::colour(mr.exp[0], tfp); rule->match_keyword_of_colour = Languages::colour(mr.exp[0], tfp);
} else if (Regexp::match(&mr, premiss, L"keyword")) { } else if (Regexp::match(&mr, premiss, L"keyword")) {
@ -560,6 +565,7 @@ but which are not expressible in the syntax of this file.
@d PLAIN_COLOUR 'p' @d PLAIN_COLOUR 'p'
@d EXTRACT_COLOUR 'x' @d EXTRACT_COLOUR 'x'
@d COMMENT_COLOUR '!' @d COMMENT_COLOUR '!'
@d NEWLINE_COLOUR '\n'
@d NOT_A_COLOUR ' ' @d NOT_A_COLOUR ' '
@d UNQUOTED_COLOUR '_' @d UNQUOTED_COLOUR '_'

View file

@ -13,8 +13,10 @@ Because of that, we need to call the following before we begin a run of calls
to |Painter::syntax_colour|: to |Painter::syntax_colour|:
= =
int painter_count = 1;
void Painter::reset_syntax_colouring(programming_language *pl) { void Painter::reset_syntax_colouring(programming_language *pl) {
colouring_state = PLAIN_COLOUR; colouring_state = PLAIN_COLOUR;
painter_count = 1;
} }
@ As we begin, the text to colour is in |matter|, while |colouring| is an @ As we begin, the text to colour is in |matter|, while |colouring| is an
@ -33,7 +35,7 @@ We get to that by using a language's rules on literals, and then executing
its colouring program. its colouring program.
= =
int Painter::syntax_colour(programming_language *pl, text_stream *OUT, int Painter::syntax_colour(programming_language *pl,
hash_table *HT, text_stream *matter, text_stream *colouring, int with_comments) { hash_table *HT, text_stream *matter, text_stream *colouring, int with_comments) {
int from = 0, to = Str::len(matter) - 1; int from = 0, to = Str::len(matter) - 1;
if (with_comments) { if (with_comments) {
@ -49,11 +51,11 @@ int Painter::syntax_colour(programming_language *pl, text_stream *OUT,
DISCARD_TEXT(part_before_comment); DISCARD_TEXT(part_before_comment);
DISCARD_TEXT(part_within_comment); DISCARD_TEXT(part_within_comment);
} }
Painter::syntax_colour_inner(pl, OUT, HT, matter, colouring, from, to); Painter::syntax_colour_inner(pl, HT, matter, colouring, from, to);
return FALSE; return FALSE;
} }
void Painter::syntax_colour_inner(programming_language *pl, text_stream *OUT, void Painter::syntax_colour_inner(programming_language *pl,
hash_table *HT, text_stream *matter, text_stream *colouring, int from, int to) { hash_table *HT, text_stream *matter, text_stream *colouring, int from, int to) {
@<Spot identifiers, literal text and character constants@>; @<Spot identifiers, literal text and character constants@>;
@<Spot literal numerical constants@>; @<Spot literal numerical constants@>;
@ -190,7 +192,7 @@ takes over.
@<Now run the colouring program@> = @<Now run the colouring program@> =
if (pl->program) if (pl->program)
Painter::execute(HT, pl->program, matter, colouring, from, to); Painter::execute(HT, pl->program, matter, colouring, from, to, painter_count++);
@ The run-type for a block determines what the rules in it apply to: the @ The run-type for a block determines what the rules in it apply to: the
whole snippet of text, or each character on its own, or each run of characters whole snippet of text, or each character on its own, or each run of characters
@ -199,7 +201,7 @@ rule across the whole snippet before moving on to the next.
= =
void Painter::execute(hash_table *HT, colouring_language_block *block, text_stream *matter, void Painter::execute(hash_table *HT, colouring_language_block *block, text_stream *matter,
text_stream *colouring, int from, int to) { text_stream *colouring, int from, int to, int N) {
if (block == NULL) internal_error("no block"); if (block == NULL) internal_error("no block");
TEMPORARY_TEXT(colouring_at_start); TEMPORARY_TEXT(colouring_at_start);
Str::copy(colouring_at_start, colouring); Str::copy(colouring_at_start, colouring);
@ -207,7 +209,8 @@ void Painter::execute(hash_table *HT, colouring_language_block *block, text_stre
LOOP_OVER_LINKED_LIST(rule, colouring_rule, block->rules) { LOOP_OVER_LINKED_LIST(rule, colouring_rule, block->rules) {
switch (block->run) { switch (block->run) {
case WHOLE_LINE_CRULE_RUN: case WHOLE_LINE_CRULE_RUN:
Painter::execute_rule(HT, rule, matter, colouring, from, to, 1); Painter::execute_rule(HT, rule, matter, colouring, from, to,
(N == 0)?1:N);
break; break;
case CHARACTERS_CRULE_RUN: case CHARACTERS_CRULE_RUN:
for (int i=from; i<=to; i++) for (int i=from; i<=to; i++)
@ -298,7 +301,11 @@ void Painter::execute_rule(hash_table *HT, colouring_rule *rule, text_stream *ma
int Painter::satisfies(hash_table *HT, colouring_rule *rule, text_stream *matter, int Painter::satisfies(hash_table *HT, colouring_rule *rule, text_stream *matter,
text_stream *colouring, int from, int to, int N) { text_stream *colouring, int from, int to, int N) {
if (rule->number > 0) { if (rule->number > 0) {
if (rule->number != N) return FALSE; if (rule->number_of > 0) {
if (rule->number != ((N-1)%(rule->number_of)) + 1) return FALSE;
} else {
if (rule->number != N) return FALSE;
}
} else if (rule->match_regexp_text[0]) { } else if (rule->match_regexp_text[0]) {
if (Regexp::match(&(rule->mr), matter, rule->match_regexp_text) == FALSE) if (Regexp::match(&(rule->mr), matter, rule->match_regexp_text) == FALSE)
return FALSE; return FALSE;
@ -355,7 +362,7 @@ int Painter::satisfies(hash_table *HT, colouring_rule *rule, text_stream *matter
void Painter::follow(hash_table *HT, colouring_rule *rule, text_stream *matter, void Painter::follow(hash_table *HT, colouring_rule *rule, text_stream *matter,
text_stream *colouring, int from, int to) { text_stream *colouring, int from, int to) {
if (rule->execute_block) if (rule->execute_block)
Painter::execute(HT, rule->execute_block, matter, colouring, from, to); Painter::execute(HT, rule->execute_block, matter, colouring, from, to, 0);
else if (rule->debug) @<Print some debugging text@> else if (rule->debug) @<Print some debugging text@>
else { else {
if (rule->set_to_colour != NOT_A_COLOUR) if (rule->set_to_colour != NOT_A_COLOUR)
@ -375,3 +382,60 @@ void Painter::follow(hash_table *HT, colouring_rule *rule, text_stream *matter,
for (int i=from; i<=to; i++) for (int i=from; i<=to; i++)
PUT_TO(STDOUT, Str::get_at(colouring, i)); PUT_TO(STDOUT, Str::get_at(colouring, i));
PRINT("\n"); PRINT("\n");
@h Painting a file.
=
linked_list *Painter::lines(filename *F) {
linked_list *L = NEW_LINKED_LIST(text_stream);
TextFiles::read(F, FALSE, "unable to read file of textual extract", TRUE,
&Painter::text_file_helper, NULL, L);
int n = -1, c = 0;
text_stream *T;
LOOP_OVER_LINKED_LIST(T, text_stream, L) {
c++;
if (Str::is_whitespace(T) == FALSE)
n = c;
}
if (n >= 0) {
linked_list *R = NEW_LINKED_LIST(text_stream);
c = 0;
LOOP_OVER_LINKED_LIST(T, text_stream, L)
if (++c <= n)
ADD_TO_LINKED_LIST(T, text_stream, R);
return R;
}
return L;
}
void Painter::text_file_helper(text_stream *text, text_file_position *tfp, void *state) {
linked_list *L = (linked_list *) state;
ADD_TO_LINKED_LIST(Str::duplicate(text), text_stream, L);
}
void Painter::colour_file(programming_language *pl, filename *F, text_stream *to, text_stream *coloured) {
linked_list *L = Painter::lines(F);
if (pl) Painter::reset_syntax_colouring(pl);
int c = 1;
text_stream *T;
LOOP_OVER_LINKED_LIST(T, text_stream, L) {
if (c++ > 1) { PUT_TO(to, '\n'); PUT_TO(coloured, NEWLINE_COLOUR); }
Str::trim_white_space_at_end(T);
TEMPORARY_TEXT(ST);
TEMPORARY_TEXT(SC);
LOOP_THROUGH_TEXT(pos, T)
if (Str::get(pos) == '\t')
WRITE_TO(ST, " ");
else
PUT_TO(ST, Str::get(pos));
if (pl) {
Painter::syntax_colour(pl, (pl)?(&(pl->built_in_keywords)):NULL, ST, SC, TRUE);
} else {
LOOP_THROUGH_TEXT(pos, ST)
PUT_TO(SC, PLAIN_COLOUR);
}
WRITE_TO(to, "%S", ST);
WRITE_TO(coloured, "%S", SC);
}
if (c > 0) { PUT_TO(to, '\n'); PUT_TO(coloured, NEWLINE_COLOUR); }
}

View file

@ -374,13 +374,6 @@ void HTMLFormat::bar(weave_format *self, text_stream *OUT, weave_target *wv) {
} }
@ = @ =
typedef struct HTML_figure_state {
struct text_stream *OUT;
struct programming_language *colour_as;
struct weave_target *wv;
struct hash_table *keywords;
} HTML_figure_state;
void HTMLFormat::figure(weave_format *self, text_stream *OUT, weave_target *wv, void HTMLFormat::figure(weave_format *self, text_stream *OUT, weave_target *wv,
text_stream *figname, int w, int h, programming_language *pl) { text_stream *figname, int w, int h, programming_language *pl) {
HTMLFormat::exit_current_paragraph(OUT); HTMLFormat::exit_current_paragraph(OUT);
@ -388,44 +381,13 @@ void HTMLFormat::figure(weave_format *self, text_stream *OUT, weave_target *wv,
Pathnames::subfolder(wv->weave_web->md->path_to_web, I"Figures"), Pathnames::subfolder(wv->weave_web->md->path_to_web, I"Figures"),
figname); figname);
filename *RF = Filenames::from_text(figname); filename *RF = Filenames::from_text(figname);
TEMPORARY_TEXT(ext); HTML_OPEN("center");
Filenames::write_extension(ext, RF); HTML::image(OUT, RF);
if ((pl) || (Str::eq_insensitive(ext, I".txt"))) { Patterns::copy_file_into_weave(wv->weave_web, F);
if (pl == NULL) HTMLFormat::pre(OUT, NULL); HTML_CLOSE("center");
else HTMLFormat::pre(OUT, "display");
if (pl) Painter::reset_syntax_colouring(pl);
HTML_figure_state hfs;
hfs.OUT = OUT;
hfs.colour_as = pl;
hfs.wv = wv;
hfs.keywords = (pl)?(&(pl->built_in_keywords)):NULL;
TextFiles::read(F, FALSE, "unable to read file of textual figure", TRUE,
&HTMLFormat::text_file_helper, NULL, &hfs);
if (pl == NULL) HTMLFormat::cpre(OUT);
else HTMLFormat::cpre(OUT);
} else {
HTML_OPEN("center");
HTML::image(OUT, RF);
Patterns::copy_file_into_weave(wv->weave_web, F);
HTML_CLOSE("center");
}
DISCARD_TEXT(ext);
WRITE("\n"); WRITE("\n");
} }
void HTMLFormat::text_file_helper(text_stream *text, text_file_position *tfp, void *state) {
HTML_figure_state *hfs = (HTML_figure_state *) state;
TEMPORARY_TEXT(colouring);
LOOP_THROUGH_TEXT(pos, text) PUT_TO(colouring, PLAIN_COLOUR);
if (hfs->colour_as) {
Painter::syntax_colour(hfs->colour_as, hfs->OUT, hfs->keywords, text, colouring, TRUE);
Formats::source_code(hfs->OUT, hfs->wv, 0, I"", text, colouring, I"", TRUE, TRUE, TRUE);
} else {
WRITE_TO(hfs->OUT, "%S\n", text);
}
DISCARD_TEXT(colouring);
}
@ = @ =
void HTMLFormat::para_macro(weave_format *self, text_stream *OUT, weave_target *wv, void HTMLFormat::para_macro(weave_format *self, text_stream *OUT, weave_target *wv,
para_macro *pmac, int defn) { para_macro *pmac, int defn) {
@ -461,7 +423,7 @@ void HTMLFormat::blank_line(weave_format *self, text_stream *OUT, weave_target *
@ = @ =
void HTMLFormat::change_material(weave_format *self, text_stream *OUT, weave_target *wv, void HTMLFormat::change_material(weave_format *self, text_stream *OUT, weave_target *wv,
int old_material, int new_material, int content) { int old_material, int new_material, int content, int plainly) {
if (old_material != new_material) { if (old_material != new_material) {
if (old_material == MACRO_MATERIAL) HTML_CLOSE("code"); if (old_material == MACRO_MATERIAL) HTML_CLOSE("code");
if ((content) || (new_material != MACRO_MATERIAL)) if ((content) || (new_material != MACRO_MATERIAL))
@ -471,8 +433,8 @@ void HTMLFormat::change_material(weave_format *self, text_stream *OUT, weave_tar
case REGULAR_MATERIAL: case REGULAR_MATERIAL:
switch (new_material) { switch (new_material) {
case CODE_MATERIAL: case CODE_MATERIAL:
WRITE("\n"); if (plainly) HTMLFormat::pre(OUT, NULL);
HTMLFormat::pre(OUT, "display"); else HTMLFormat::pre(OUT, "display");
break; break;
case DEFINITION_MATERIAL: case DEFINITION_MATERIAL:
WRITE("\n"); WRITE("\n");
@ -510,7 +472,8 @@ void HTMLFormat::change_material(weave_format *self, text_stream *OUT, weave_tar
switch (new_material) { switch (new_material) {
case CODE_MATERIAL: case CODE_MATERIAL:
WRITE("\n"); WRITE("\n");
HTMLFormat::pre(OUT, "display"); if (plainly) HTMLFormat::pre(OUT, NULL);
else HTMLFormat::pre(OUT, "display");
break; break;
case MACRO_MATERIAL: case MACRO_MATERIAL:
WRITE("\n"); WRITE("\n");

View file

@ -379,7 +379,7 @@ void TeX::locale(weave_format *self, text_stream *OUT, weave_target *wv,
@ = @ =
void TeX::change_material(weave_format *self, text_stream *OUT, weave_target *wv, void TeX::change_material(weave_format *self, text_stream *OUT, weave_target *wv,
int old_material, int new_material, int content) { int old_material, int new_material, int content, int change_material) {
if (old_material != new_material) { if (old_material != new_material) {
switch (old_material) { switch (old_material) {
case REGULAR_MATERIAL: case REGULAR_MATERIAL:

View file

@ -340,11 +340,12 @@ weaver and turned into something else (such as list items).
= =
VMETHOD_TYPE(CHANGE_MATERIAL_FOR_MTID, weave_format *wf, text_stream *OUT, VMETHOD_TYPE(CHANGE_MATERIAL_FOR_MTID, weave_format *wf, text_stream *OUT,
weave_target *wv, int old_material, int new_material, int content) weave_target *wv, int old_material, int new_material, int content, int plainly)
void Formats::change_material(OUTPUT_STREAM, weave_target *wv, void Formats::change_material(OUTPUT_STREAM, weave_target *wv,
int old_material, int new_material, int content) { int old_material, int new_material, int content, int plainly) {
weave_format *wf = wv->format; weave_format *wf = wv->format;
VMETHOD_CALL(wf, CHANGE_MATERIAL_FOR_MTID, OUT, wv, old_material, new_material, content); VMETHOD_CALL(wf, CHANGE_MATERIAL_FOR_MTID, OUT, wv, old_material, new_material,
content, plainly);
} }
@ This is called on a change of colour. "Colour" is really a shorthand way @ This is called on a change of colour. "Colour" is really a shorthand way

View file

@ -0,0 +1,19 @@
Name: "PainterOutput"
colouring {
number 1 of 2 => !plain
number 2 of 2 => {
characters {
"!" => !comment
"c" => !character
"d" => !definition
"e" => !element
"f" => !function
"i" => !identifier
"n" => !constant
"p" => !plain
"r" => !reserved
"s" => !string
"x" => !extract
}
}
}

View file

@ -22,6 +22,8 @@ for locating programming language definitions:
-read-language X read language definition from file X -read-language X read language definition from file X
-read-languages X read all language definitions in path X -read-languages X read all language definitions in path X
-show-languages list programming languages supported by Inweb -show-languages list programming languages supported by Inweb
-test-language X test language X on...
-test-language-on X ...the code in the file X
for analysing a web: for analysing a web:
-advance-build increment daily build code for the web -advance-build increment daily build code for the web

View file

@ -14,8 +14,8 @@ colouring {
runs of unquoted { runs of unquoted {
runs of !identifier { runs of !identifier {
=> !reserved => !reserved
prefix . => !identifier on both prefix "." => !identifier on both
prefix ! => !element on both prefix "!" => !element on both
} }
characters { characters {
+ => !identifier + => !identifier

View file

@ -2,7 +2,6 @@ Name: "ILDF"
Details: "The Inweb Language Definition File format" Details: "The Inweb Language Definition File format"
Extension: ".ildf" Extension: ".ildf"
Whole Line Comment: "#" Whole Line Comment: "#"
Supports Namespaces: false
String Literal: "\"" String Literal: "\""
String Literal Escape: "\\" String Literal Escape: "\\"

View file

@ -20,62 +20,62 @@ End Ifndef: "#endif; ! %S\n"
# Reserved words: # Reserved words:
keyword Constant keyword "Constant"
keyword Array keyword "Array"
keyword box keyword "box"
keyword break keyword "break"
keyword child keyword "child"
keyword children keyword "children"
keyword continue keyword "continue"
keyword default keyword "default"
keyword do keyword "do"
keyword elder keyword "elder"
keyword eldest keyword "eldest"
keyword else keyword "else"
keyword false keyword "false"
keyword font keyword "font"
keyword for keyword "for"
keyword give keyword "give"
keyword has keyword "has"
keyword hasnt keyword "hasnt"
keyword if keyword "if"
keyword in keyword "in"
keyword indirect keyword "indirect"
keyword inversion keyword "inversion"
keyword jump keyword "jump"
keyword metaclass keyword "metaclass"
keyword move keyword "move"
keyword new_line keyword "new_line"
keyword nothing keyword "nothing"
keyword notin keyword "notin"
keyword objectloop keyword "objectloop"
keyword ofclass keyword "ofclass"
keyword or keyword "or"
keyword parent keyword "parent"
keyword print keyword "print"
keyword print_ret keyword "print_ret"
keyword provides keyword "provides"
keyword quit keyword "quit"
keyword random keyword "random"
keyword read keyword "read"
keyword remove keyword "remove"
keyword restore keyword "restore"
keyword return keyword "return"
keyword rfalse keyword "rfalse"
keyword rtrue keyword "rtrue"
keyword save keyword "save"
keyword sibling keyword "sibling"
keyword spaces keyword "spaces"
keyword string keyword "string"
keyword style keyword "style"
keyword switch keyword "switch"
keyword to keyword "to"
keyword true keyword "true"
keyword until keyword "until"
keyword while keyword "while"
keyword younger keyword "younger"
keyword youngest keyword "youngest"
colouring { colouring {
runs of unquoted { runs of unquoted {

View file

@ -4,13 +4,13 @@ The current help information as it would be printed at the command line.
@ Running Inweb with |-help| currently produces the following summary: @ Running Inweb with |-help| currently produces the following summary:
[[help.txt]] = (undisplayed text from Figures/help.txt)
@ Running Inweb with |-show-languages| currently produces the following list @ Running Inweb with |-show-languages| currently produces the following list
of programming languages for which support is provided in the standard of programming languages for which support is provided in the standard
distribution: distribution:
[[languages.txt]] = (undisplayed text from Figures/languages.txt)
It's easy to make new language definitions, and contributions of these are It's easy to make new language definitions, and contributions of these are
welcome. welcome.

View file

@ -9,6 +9,7 @@ is woven, it will look much nicer with syntax-colouring, and that clearly
can't be done without at least a surface understanding of what programs in can't be done without at least a surface understanding of what programs in
the language mean. the language mean.
@
As we've seen, the Contents section of a web has to specify its language. As we've seen, the Contents section of a web has to specify its language.
For example, For example,
@ -22,7 +23,7 @@ then its file is |L.ildf|. You can see the languages currently available
to Inweb by using |-show-languages|. At present, a newly installed Inweb to Inweb by using |-show-languages|. At present, a newly installed Inweb
replies like so: replies like so:
[[languages.txt]] = (undisplayed text from Figures/languages.txt)
@ So what if you want to write a literate program in a language not on that @ So what if you want to write a literate program in a language not on that
list? One option is to give the language as |None|. (Note that this is list? One option is to give the language as |None|. (Note that this is
@ -48,7 +49,14 @@ Once you have written a definition, use |-read-language L| at the command
line, where |L| is the file defining it. If you have many custom languages, line, where |L| is the file defining it. If you have many custom languages,
|-read-languages D| reads all of the definitions in a directory |D|. Or, if |-read-languages D| reads all of the definitions in a directory |D|. Or, if
the language in question is really quite specific to a single web, you can the language in question is really quite specific to a single web, you can
make a |Private Languages| subdirectory of the web and put it in there. make a |Dialects| subdirectory of the web and put it in there. (A dialect is,
after all, a local language.)
For testing purposes, running with |-test-language F -test-language-on G|
reads in a file |G| of code, and syntax-colours it according to the rules
for the language defined in the file |F|, then prints a plain-text diagram
of the results. (This can then be tested with Intest test cases, as indeed
Inweb does itself.)
@h Structure of language definitions. @h Structure of language definitions.
Each language is defined by a single ILDF file. ("Inweb Language Definition Each language is defined by a single ILDF file. ("Inweb Language Definition
@ -366,9 +374,7 @@ to be followed by |=>|: they always begin a block.
2. |characters in T| splits the snippet into each of its characters which 2. |characters in T| splits the snippet into each of its characters which
lie inside the text |T|. For example, here is a not very useful ILD for lie inside the text |T|. For example, here is a not very useful ILD for
plain text in which all vowels are in red: plain text in which all vowels are in red:
= (text from Dialects/VowelsExample.ildf as ILDF)
[[../Private Languages/VowelsExample.ildf as ILDF]]
Given the text: Given the text:
= (not code) = (not code)
A noir, E blanc, I rouge, U vert, O bleu : voyelles, A noir, E blanc, I rouge, U vert, O bleu : voyelles,
@ -386,7 +392,7 @@ Qui bombinent autour des puanteurs cruelles,
3. The split |instances of X| narrows in on each usage of the text |X| inside 3. The split |instances of X| narrows in on each usage of the text |X| inside
the snippet. For example, the snippet. For example,
[[../Private Languages/LineageExample.ildf as ILDF]] = (text from Dialects/LineageExample.ildf as ILDF)
acts on the text: acts on the text:
= (not code) = (not code)
Jacob first appears in the Book of Genesis, the son of Isaac and Rebecca, the Jacob first appears in the Book of Genesis, the son of Isaac and Rebecca, the
@ -403,7 +409,7 @@ while |====| would have two.
4. The split |runs of C|, where |C| describes a colour, splits the snippet 4. The split |runs of C|, where |C| describes a colour, splits the snippet
into non-overlapping contiguous pieces which have that colour. For example: into non-overlapping contiguous pieces which have that colour. For example:
[[../Private Languages/RunningExample.ildf as ILDF]] = (text from Dialects/RunningExample.ildf as ILDF)
acts on: acts on:
= (not code) = (not code)
Napoleon Bonaparte (1769-1821) took 167 scientists to Egypt in 1798, Napoleon Bonaparte (1769-1821) took 167 scientists to Egypt in 1798,
@ -418,7 +424,7 @@ Here the hyphens in number ranges have been coloured, but not the hyphen
in "so-called". in "so-called".
A more computer-science sort of example would be: A more computer-science sort of example would be:
[[../Private Languages/StdioExample.ildf as ILDF]] = (text from Dialects/StdioExample.ildf as ILDF)
which acts on: which acts on:
= (not code) = (not code)
if (x == 1) printf("Hello!"); if (x == 1) printf("Hello!");
@ -438,7 +444,7 @@ not a colour.
splits the snippet up into non-overlapping pieces which match it: possibly splits the snippet up into non-overlapping pieces which match it: possibly
none at all, of course, in which case the block of rules is never used. none at all, of course, in which case the block of rules is never used.
This is easier to demonstrate than explain: This is easier to demonstrate than explain:
[[../Private Languages/AssemblageExample.ildf as ILDF]] = (text from Dialects/AssemblageExample.ildf as ILDF)
which acts on: which acts on:
= (not code) = (not code)
JSR .initialise JSR .initialise
@ -460,7 +466,7 @@ to produce:
regular expression |E|, and then runs the rules on each bracketed regular expression |E|, and then runs the rules on each bracketed
subexpression in turn. (If there is no match, or there are no bracketed subexpression in turn. (If there is no match, or there are no bracketed
terms in |E|, nothing happens.) terms in |E|, nothing happens.)
[[../Private Languages/EquationsExample.ildf as ILDF]] = (text from Dialects/EquationsExample.ildf as ILDF)
acts on: acts on:
= (not code) = (not code)
A = 2716 A = 2716
@ -552,7 +558,7 @@ is required to match the entire snippet, not just somewhere inside.
7. Whenever a split takes place, Inweb keeps count of how many pieces there are, 7. Whenever a split takes place, Inweb keeps count of how many pieces there are,
and different rules can apply to differently numbered pieces. The notation and different rules can apply to differently numbered pieces. The notation
is |number N|, where |N| is the number, counting from 1. For example, is |number N|, where |N| is the number, counting from 1. For example,
[[../Private Languages/ThirdExample.ildf as ILDF]] = (text from Dialects/ThirdExample.ildf as ILDF)
acts on: acts on:
= (not code) = (not code)
With how sad steps, O Moon, thou climb'st the skies! With how sad steps, O Moon, thou climb'st the skies!
@ -587,6 +593,28 @@ Do they above love to be lov'd, and yet
Those lovers scorn whom that love doth possess? Those lovers scorn whom that love doth possess?
Do they call virtue there ungratefulness? Do they call virtue there ungratefulness?
= =
We can also cycle through a set of possibilities with |number N of M|,
where this time the count runs 1, 2, ..., |M|, 1, 2, ..., |M|, 1, ... and
so on. Thus |number 1 of 3| would work on the 1st, 4th, 7th, ... times;
|number 2 of 3| on the 2nd, 5th, 8th, ...; |number 3 of 3| on the 3rd, 6th,
9th, and so on. This, for example, paints the output from the painting
algorithm in Inweb:
= (text from Dialects/PainterOutput.ildf as ILDF)
since alternate lines are plain, for the original text, and then coloured,
to highlight the colours given to the characters in the original. Thus:
= (not code)
int x = 55; /* a magic number */
rrrpipppnnpp!!!!!!!!!!!!!!!!!!!!
Imaginary::function(x, beta);
fffffffffffffffffffpippiiiipp
=
becomes
= (sample PainterOutput code)
int x = 55; /* a magic number */
rrrpipppnnpp!!!!!!!!!!!!!!!!!!!!
Imaginary::function(x, beta);
fffffffffffffffffffpippiiiipp
=
@ Any condition can be reversed by preceding it with |not|. For example, @ Any condition can be reversed by preceding it with |not|. For example,
= (sample ILDF code) = (sample ILDF code)
@ -629,5 +657,4 @@ The rule |=> debug| is unconditional, and will print whenever it's reached.
Inweb Language Definition Format is a kind of language in itself, and in Inweb Language Definition Format is a kind of language in itself, and in
fact Inweb is supplied with an ILD for ILDF itself, which Inweb used to fact Inweb is supplied with an ILD for ILDF itself, which Inweb used to
syntax-colour the examples above. Here it is, as syntax-coloured by itself: syntax-colour the examples above. Here it is, as syntax-coloured by itself:
= (text from Languages/ILDF.ildf as ILDF)
[[../Languages/ILDF.ildf as ILDF]]

View file

@ -1,6 +1,6 @@
# Inweb 7 # Inweb 7
v7 'Escape to Danger' (6 April 2020) v7 'Escape to Danger' (7 April 2020)
## About Inweb ## About Inweb

File diff suppressed because it is too large Load diff

View file

@ -1,6 +1,3 @@
#ifndef PLATFORM_WINDOWS
#define PLATFORM_POSIX
#endif
/* Tangled output generated by inweb: do not edit */ /* Tangled output generated by inweb: do not edit */
#include <stdio.h> #include <stdio.h>
#ifdef PLATFORM_WINDOWS #ifdef PLATFORM_WINDOWS

View file

@ -1,4 +1 @@
#ifndef PLATFORM_WINDOWS
#define PLATFORM_POSIX
#endif
/* Tangled output generated by inweb: do not edit */ /* Tangled output generated by inweb: do not edit */

View file

@ -1,6 +1,3 @@
#ifndef PLATFORM_WINDOWS
#define PLATFORM_POSIX
#endif
/* Tangled output generated by inweb: do not edit */ /* Tangled output generated by inweb: do not edit */
#include <stdio.h> #include <stdio.h>
#line 9 "inweb/Tests/Test Cases/hellow.inweb" #line 9 "inweb/Tests/Test Cases/hellow.inweb"

View file

@ -1,6 +1,3 @@
#ifndef PLATFORM_WINDOWS
#define PLATFORM_POSIX
#endif
/* Tangled output generated by inweb: do not edit */ /* Tangled output generated by inweb: do not edit */
#include <stdio.h> #include <stdio.h>
#define RANGE 100 #define RANGE 100

View file

@ -455,12 +455,11 @@ main {
<!--Weave of 'Complete Program' generated by 7--> <!--Weave of 'Complete Program' generated by 7-->
<ul class="crumbs"><li><b>hellow</b></li></ul><p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. </b></p> <ul class="crumbs"><li><b>hellow</b></li></ul><p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. </b></p>
<pre class="display"> <pre class="display">
<span class="plain">#</span><span class="identifier">include</span><span class="plain"> &lt;</span><span class="identifier">stdio</span><span class="plain">.</span><span class="identifier">h</span><span class="plain">&gt;</span> <span class="plain">#</span><span class="identifier">include</span><span class="plain"> &lt;</span><span class="identifier">stdio</span><span class="plain">.</span><span class="identifier">h</span><span class="plain">&gt;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">main</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">argc</span><span class="plain">, </span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">argv</span><span class="plain">[]) {</span> <span class="reserved">int</span><span class="plain"> </span><span class="functiontext">main</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">argc</span><span class="plain">, </span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">argv</span><span class="plain">[]) {</span>
<span class="identifier">printf</span><span class="plain">(</span><span class="string">"Hello world!\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span> <span class="identifier">printf</span><span class="plain">(</span><span class="string">"Hello world!\n"</span><span class="plain">);</span>
<span class="plain">}</span> <span class="plain">}</span>
</pre> </pre>
@ -472,7 +471,7 @@ main {
<pre class="definitions"> <pre class="definitions">
<span class="definitionkeyword">define</span> <span class="constant">PEACH</span><span class="plain"> 1</span> <span class="definitionkeyword">define</span> <span class="constant">PEACH</span><span class="plain"> </span><span class="constant">1</span>
<span class="definitionkeyword">enum</span> <span class="constant">A_COM</span><span class="definitionkeyword"> from </span><span class="constant">1</span> <span class="definitionkeyword">enum</span> <span class="constant">A_COM</span><span class="definitionkeyword"> from </span><span class="constant">1</span>
<span class="definitionkeyword">enum</span> <span class="constant">B_COM</span> <span class="definitionkeyword">enum</span> <span class="constant">B_COM</span>
<span class="definitionkeyword">enum</span> <span class="constant">C_COM</span> <span class="definitionkeyword">enum</span> <span class="constant">C_COM</span>
@ -499,7 +498,6 @@ main {
<p class="inwebparagraph"><a id="SP3"></a><b>&#167;3. </b></p> <p class="inwebparagraph"><a id="SP3"></a><b>&#167;3. </b></p>
<pre class="display"> <pre class="display">
<span class="plain">#</span><span class="identifier">include</span><span class="plain"> </span><span class="string">"existent.h"</span> <span class="plain">#</span><span class="identifier">include</span><span class="plain"> </span><span class="string">"existent.h"</span>

View file

@ -459,7 +459,6 @@ Ipsum. But <code class="display"><span class="extract">identifier</span></code>
<p class="inwebparagraph"></p> <p class="inwebparagraph"></p>
<pre class="display"> <pre class="display">
<span class="plain">Green.</span> <span class="plain">Green.</span>
<span class="plain">Blue.</span> <span class="plain">Blue.</span>

View file

@ -455,12 +455,11 @@ main {
<!--Weave of 'Complete Program' generated by 7--> <!--Weave of 'Complete Program' generated by 7-->
<ul class="crumbs"><li><b>hellow</b></li></ul><p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. </b></p> <ul class="crumbs"><li><b>hellow</b></li></ul><p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. </b></p>
<pre class="display"> <pre class="display">
<span class="plain">#</span><span class="identifier">include</span><span class="plain"> &lt;</span><span class="identifier">stdio</span><span class="plain">.</span><span class="identifier">h</span><span class="plain">&gt;</span> <span class="plain">#</span><span class="identifier">include</span><span class="plain"> &lt;</span><span class="identifier">stdio</span><span class="plain">.</span><span class="identifier">h</span><span class="plain">&gt;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">main</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">argc</span><span class="plain">, </span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">argv</span><span class="plain">[]) {</span> <span class="reserved">int</span><span class="plain"> </span><span class="functiontext">main</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">argc</span><span class="plain">, </span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">argv</span><span class="plain">[]) {</span>
<span class="identifier">printf</span><span class="plain">(</span><span class="string">"Hello world!\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span> <span class="identifier">printf</span><span class="plain">(</span><span class="string">"Hello world!\n"</span><span class="plain">);</span>
<span class="plain">}</span> <span class="plain">}</span>
</pre> </pre>

View file

@ -455,21 +455,19 @@ main {
<!--Weave of 'Complete Program' generated by 7--> <!--Weave of 'Complete Program' generated by 7-->
<ul class="crumbs"><li><b>perl</b></li></ul><p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. </b></p> <ul class="crumbs"><li><b>perl</b></li></ul><p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. </b></p>
<pre class="display"> <pre class="display">
<span class="plain">print recolour("Santa likes red and green socks.\n");</span> <span class="identifier">print</span><span class="plain"> </span><span class="identifier">recolour</span><span class="plain">(</span><span class="string">"Santa likes red and green socks.\n"</span><span class="plain">);</span>
</pre> </pre>
<p class="inwebparagraph"></p> <p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP2"></a><b>&#167;2. </b></p> <p class="inwebparagraph"><a id="SP2"></a><b>&#167;2. </b></p>
<pre class="display"> <pre class="display">
<span class="plain">sub recolour {</span> <span class="identifier">sub</span><span class="plain"> </span><span class="identifier">recolour</span><span class="plain"> {</span>
<span class="plain">my $text = $_[0];</span> <span class="identifier">my</span><span class="plain"> $</span><span class="identifier">text</span><span class="plain"> = $</span><span class="identifier">_</span><span class="plain">[0];</span>
&lt;<span class="cwebmacro">Change the hues</span> <span class="cwebmacronumber">2.1</span>&gt;<span class="plain">;</span> &lt;<span class="cwebmacro">Change the hues</span> <span class="cwebmacronumber">2.1</span>&gt;<span class="plain">;</span>
<span class="plain">return $text;</span> <span class="identifier">return</span><span class="plain"> $</span><span class="identifier">text</span><span class="plain">;</span>
<span class="plain">}</span> <span class="plain">}</span>
</pre> </pre>
@ -481,8 +479,8 @@ main {
<pre class="displaydefn"> <pre class="displaydefn">
<span class="plain">$text =~ s/red/blue/;</span> <span class="plain">$</span><span class="identifier">text</span><span class="plain"> =~ </span><span class="identifier">s</span><span class="plain">/</span><span class="identifier">red</span><span class="plain">/</span><span class="identifier">blue</span><span class="plain">/;</span>
<span class="plain">$text =~ s/green/purple/;</span> <span class="plain">$</span><span class="identifier">text</span><span class="plain"> =~ </span><span class="identifier">s</span><span class="plain">/</span><span class="identifier">green</span><span class="plain">/</span><span class="identifier">purple</span><span class="plain">/;</span>
</pre> </pre>
<p class="inwebparagraph"></p> <p class="inwebparagraph"></p>

View file

@ -455,7 +455,6 @@ main {
<!--Weave of 'Complete Program' generated by 7--> <!--Weave of 'Complete Program' generated by 7-->
<ul class="crumbs"><li><b>plain</b></li></ul><p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. </b></p> <ul class="crumbs"><li><b>plain</b></li></ul><p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. </b></p>
<pre class="display"> <pre class="display">
&lt;<span class="cwebmacro">Titling</span> <span class="cwebmacronumber">1.1</span>&gt; &lt;<span class="cwebmacro">Titling</span> <span class="cwebmacronumber">1.1</span>&gt;
<span class="plain">No one would have believed in the last years of the</span> <span class="plain">No one would have believed in the last years of the</span>
@ -485,7 +484,6 @@ main {
<p class="inwebparagraph"><a id="SP2"></a><b>&#167;2. </b></p> <p class="inwebparagraph"><a id="SP2"></a><b>&#167;2. </b></p>
<pre class="display"> <pre class="display">
<span class="plain">With infinite complacency men went to and fro over this globe about</span> <span class="plain">With infinite complacency men went to and fro over this globe about</span>
<span class="plain">their little affairs, serene in their assurance of their empire over matter.</span> <span class="plain">their little affairs, serene in their assurance of their empire over matter.</span>

View file

@ -463,7 +463,7 @@ simplest method possible.
<pre class="definitions"> <pre class="definitions">
<span class="definitionkeyword">define</span> <span class="constant">RANGE</span><span class="plain"> 100</span> <span class="definitionkeyword">define</span> <span class="constant">RANGE</span><span class="plain"> </span><span class="constant">100</span>
</pre> </pre>
<pre class="display"> <pre class="display">
@ -486,7 +486,7 @@ simplest method possible.
<pre class="displaydefn"> <pre class="displaydefn">
<span class="reserved">if</span><span class="plain"> ((</span><span class="functiontext">isprime</span><span class="plain">(</span><span class="identifier">i</span><span class="plain">)) &amp;&amp; (</span><span class="functiontext">isprime</span><span class="plain">(</span><span class="identifier">i</span><span class="plain">+2)))</span> <span class="reserved">if</span><span class="plain"> ((</span><span class="functiontext">isprime</span><span class="plain">(</span><span class="identifier">i</span><span class="plain">)) &amp;&amp; (</span><span class="functiontext">isprime</span><span class="plain">(</span><span class="identifier">i</span><span class="plain">+2)))</span>
<span class="identifier">printf</span><span class="plain">(</span><span class="string">"%d and %d\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">+2);</span> <span class="identifier">printf</span><span class="plain">(</span><span class="string">"%d and %d\n"</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">+2);</span>
</pre> </pre>
<p class="inwebparagraph"></p> <p class="inwebparagraph"></p>
@ -496,7 +496,6 @@ simplest method possible.
<p class="inwebparagraph"><a id="SP2"></a><b>&#167;2. </b>This ought to print: <p class="inwebparagraph"><a id="SP2"></a><b>&#167;2. </b>This ought to print:
</p> </p>
<pre class="display"> <pre class="display">
<span class="plain">3 and 5</span> <span class="plain">3 and 5</span>
<span class="plain">5 and 7</span> <span class="plain">5 and 7</span>
@ -512,15 +511,15 @@ simplest method possible.
<pre class="definitions"> <pre class="definitions">
<span class="definitionkeyword">define</span> <span class="constant">TRUE</span><span class="plain"> 1</span> <span class="definitionkeyword">define</span> <span class="constant">TRUE</span><span class="plain"> </span><span class="constant">1</span>
<span class="definitionkeyword">define</span> <span class="constant">FALSE</span><span class="plain"> 0</span> <span class="definitionkeyword">define</span> <span class="constant">FALSE</span><span class="plain"> </span><span class="constant">0</span>
</pre> </pre>
<pre class="display"> <pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">isprime</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">n</span><span class="plain">) {</span> <span class="reserved">int</span><span class="plain"> </span><span class="functiontext">isprime</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">n</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">n</span><span class="plain"> &lt;= 1) </span><span class="reserved">return</span><span class="plain"> </span><span class="constant">FALSE</span><span class="plain">;</span> <span class="reserved">if</span><span class="plain"> (</span><span class="identifier">n</span><span class="plain"> &lt;= </span><span class="constant">1</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="constant">FALSE</span><span class="plain">;</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">m</span><span class="plain"> = 2; </span><span class="identifier">m</span><span class="plain">*</span><span class="identifier">m</span><span class="plain"> &lt;= </span><span class="identifier">n</span><span class="plain">; </span><span class="identifier">m</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">m</span><span class="plain"> = </span><span class="constant">2</span><span class="plain">; </span><span class="identifier">m</span><span class="plain">*</span><span class="identifier">m</span><span class="plain"> &lt;= </span><span class="identifier">n</span><span class="plain">; </span><span class="identifier">m</span><span class="plain">++)</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">n</span><span class="plain"> % </span><span class="identifier">m</span><span class="plain"> == 0)</span> <span class="reserved">if</span><span class="plain"> (</span><span class="identifier">n</span><span class="plain"> % </span><span class="identifier">m</span><span class="plain"> == </span><span class="constant">0</span><span class="plain">)</span>
<span class="reserved">return</span><span class="plain"> </span><span class="constant">FALSE</span><span class="plain">;</span> <span class="reserved">return</span><span class="plain"> </span><span class="constant">FALSE</span><span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="constant">TRUE</span><span class="plain">;</span> <span class="reserved">return</span><span class="plain"> </span><span class="constant">TRUE</span><span class="plain">;</span>
<span class="plain">}</span> <span class="plain">}</span>

View file

@ -0,0 +1,5 @@
JSR .initialise
LDR A, #.data
RTS
.initialise
TAX

View file

@ -0,0 +1,4 @@
A = 2716
B=3
C =715 + B
D < 14

View file

@ -0,0 +1,2 @@
Jacob first appears in the Book of Genesis, the son of Isaac and Rebecca, the
grandson of Abraham, Sarah and Bethuel, the nephew of Ishmael.

View file

@ -0,0 +1,4 @@
int x = 55; /* a magic number */
rrrpipppnnpp!!!!!!!!!!!!!!!!!!!!
Imaginary::function(x, beta);
fffffffffffffffffffpippiiiipp

View file

@ -0,0 +1,2 @@
Napoleon Bonaparte (1769-1821) took 167 scientists to Egypt in 1798,
who published their so-called Memoirs over the period 1798-1801.

View file

@ -0,0 +1 @@
if (x == 1) printf("Hello!");

View file

@ -0,0 +1,14 @@
With how sad steps, O Moon, thou climb'st the skies!
How silently, and with how wan a face!
What, may it be that even in heav'nly place
That busy archer his sharp arrows tries!
Sure, if that long-with love-acquainted eyes
Can judge of love, thou feel'st a lover's case,
I read it in thy looks; thy languish'd grace
To me, that feel the like, thy state descries.
Then, ev'n of fellowship, O Moon, tell me,
Is constant love deem'd there but want of wit?
Are beauties there as proud as here they be?
Do they above love to be lov'd, and yet
Those lovers scorn whom that love doth possess?
Do they call virtue there ungratefulness?

View file

@ -0,0 +1,4 @@
A noir, E blanc, I rouge, U vert, O bleu : voyelles,
Je dirai quelque jour vos naissances latentes :
A, noir corset velu des mouches éclatantes
Qui bombinent autour des puanteurs cruelles,

View file

@ -0,0 +1,13 @@
Test of colouring for language AssemblageExample:
JSR .initialise
LDR A, #.data
RTS
.initialise
TAX
ppppppppiiipfffffffffff
ppppppppiiipipppfffff
ppppppppiii
ppppfffffffffff
ppppppppiii

View file

@ -0,0 +1,11 @@
Test of colouring for language EquationsExample:
A = 2716
B=3
C =715 + B
D < 14
ppppfpppffff
ppppfpf
ppppfppfffpppp
pppppppppp

View file

@ -0,0 +1,7 @@
Test of colouring for language LineageExample:
Jacob first appears in the Book of Genesis, the son of Isaac and Rebecca, the
grandson of Abraham, Sarah and Bethuel, the nephew of Ishmael.
ppppppppppppppppppppppppppppppppppppppppppppppppfffpppppppppppppppppppppppppp
pppppfffpppppppppppppppppppppppppppppppppppppppppppppppppppppp

View file

@ -0,0 +1,11 @@
Test of colouring for language PainterOutput:
int x = 55; /* a magic number */
rrrpipppnnpp!!!!!!!!!!!!!!!!!!!!
Imaginary::function(x, beta);
fffffffffffffffffffpippiiiipp
pppppppppppppppppppppppppppppppppppp
pppprrrpipppnnpp!!!!!!!!!!!!!!!!!!!!
ppppppppppppppppppppppppppppppppp
ppppfffffffffffffffffffpippiiiipp

View file

@ -0,0 +1,7 @@
Test of colouring for language RunningExample:
Napoleon Bonaparte (1769-1821) took 167 scientists to Egypt in 1798,
who published their so-called Memoirs over the period 1798-1801.
ppppppppppppppppppppfffffffffpppppppfffppppppppppppppppppppppppffffp
ppppppppppppppppppppppppppppppppppppppppppppppppppppppfffffffffp

View file

@ -0,0 +1,5 @@
Test of colouring for language StdioExample:
if (x == 1) printf("Hello!");
iippippppnppffffffppiiiiipppp

View file

@ -0,0 +1,31 @@
Test of colouring for language ThirdExample:
With how sad steps, O Moon, thou climb'st the skies!
How silently, and with how wan a face!
What, may it be that even in heav'nly place
That busy archer his sharp arrows tries!
Sure, if that long-with love-acquainted eyes
Can judge of love, thou feel'st a lover's case,
I read it in thy looks; thy languish'd grace
To me, that feel the like, thy state descries.
Then, ev'n of fellowship, O Moon, tell me,
Is constant love deem'd there but want of wit?
Are beauties there as proud as here they be?
Do they above love to be lov'd, and yet
Those lovers scorn whom that love doth possess?
Do they call virtue there ungratefulness?
pppppppppfffpppppppppppppppppppppppppppppppppppppppp
ppppppppppppppfffppppppppppppppppppppp
ppppppppppffppppppppppppppppppppppppppppppp
ppppppppppffffffpppppppppppppppppppppppp
pppppppppffffppppppppppppppppppppppppppppppp
ppppppppppffppppppppppppppppppppppppppppppppppp
pppppppffppppppppppppppppppppppppppppppppppp
pppppppffffppppppppppppppppppppppppppppppppppp
pppppppppppffppppppppppppppppppppppppppppp
ppppppppppppffffpppppppppppppppppppppppppppppp
pppppppppppppfffffpppppppppppppppppppppppppp
ppppppppfffffpppppppppppppppppppppppppp
pppppppppppppfffffppppppppppppppppppppppppppppp
ppppppppffffppppppppppppppppppppppppppppp

View file

@ -0,0 +1,11 @@
Test of colouring for language VowelsExample:
A noir, E blanc, I rouge, U vert, O bleu : voyelles,
Je dirai quelque jour vos naissances latentes :
A, noir corset velu des mouches éclatantes
Qui bombinent autour des puanteurs cruelles,
fppffpppfpppfppppfppffpfppfppfppppfpppffppppfpfppfpp
pfppfpffppffppffppffpppfpppffppfppfpppfpfppfppp
fpppffpppfppfpppfpfppfpppffppfpppppfpfppfp
pffppfppfpfpppffpffpppfpppffppffpppppffppfpp

View file

@ -1,4 +1,5 @@
-cases [Inweb] 'inweb/Tests/Test Cases' -cases [Inweb] 'inweb/Tests/Test Cases'
-cases [Painter] 'inweb/Tests/Test Painter'
-recipe [Inweb] -recipe [Inweb]
set: $INWEB = inweb/Tangled/inweb set: $INWEB = inweb/Tangled/inweb
@ -42,3 +43,24 @@
pass: 'passed' pass: 'passed'
-end -end
-recipe [Painter]
set: $INWEB = inweb/Tangled/inweb
set: $LANGUAGES = inweb/Dialects
set: $INTERNAL = Internal
set: $CANVAS = $PATH/$CASE.txt
mkdir: $PATH/_Results_Actual
mkdir: $PATH/_Results_Ideal
mkdir: $PATH/_Results_Console
set: $A = $PATH/_Results_Actual/$CASE.txt
set: $I = $PATH/_Results_Ideal/$CASE.txt
step: $INWEB -test-language-on $CANVAS -test-language $LANGUAGES/$CASE.ildf >$A 2>&1
or: 'failed inweb' $A
show: $A
match text: $A $I
or: 'produced the wrong painting'
pass: 'passed'
-end

View file

@ -1,3 +1,3 @@
Prerelease: alpha.1 Prerelease: alpha.1
Build Date: 6 April 2020 Build Date: 7 April 2020
Build Number: 1A12 Build Number: 1A13

View file

@ -47,7 +47,6 @@ other tools or libraries to speak of, you could do worse.
<p class="inwebparagraph"></p> <p class="inwebparagraph"></p>
<pre class="display"> <pre class="display">
<span class="plain">Import: foundation</span> <span class="plain">Import: foundation</span>
</pre> </pre>
@ -70,7 +69,6 @@ Because pthread is not normally available on Windows, a special header is
supplied instead for that case. supplied instead for that case.
</p> </p>
<pre class="display"> <pre class="display">
<span class="plain">#</span><span class="identifier">include</span><span class="plain"> &lt;</span><span class="identifier">ctype</span><span class="plain">.</span><span class="identifier">h</span><span class="plain">&gt;</span> <span class="plain">#</span><span class="identifier">include</span><span class="plain"> &lt;</span><span class="identifier">ctype</span><span class="plain">.</span><span class="identifier">h</span><span class="plain">&gt;</span>
<span class="plain">#</span><span class="identifier">include</span><span class="plain"> &lt;</span><span class="identifier">stdarg</span><span class="plain">.</span><span class="identifier">h</span><span class="plain">&gt;</span> <span class="plain">#</span><span class="identifier">include</span><span class="plain"> &lt;</span><span class="identifier">stdarg</span><span class="plain">.</span><span class="identifier">h</span><span class="plain">&gt;</span>
@ -86,7 +84,6 @@ supplied instead for that case.
<p class="inwebparagraph"><a id="SP3"></a><b>&#167;3. </b></p> <p class="inwebparagraph"><a id="SP3"></a><b>&#167;3. </b></p>
<pre class="display"> <pre class="display">
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">DL</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">; </span><span class="comment">Current destination of debugging text: kept <code class="display"><span class="extract">NULL</span></code> until opened</span> <span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">DL</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">; </span><span class="comment">Current destination of debugging text: kept <code class="display"><span class="extract">NULL</span></code> until opened</span>
</pre> </pre>
@ -128,7 +125,6 @@ compromise in practice:
<p class="inwebparagraph"><a id="SP7"></a><b>&#167;7. </b>Very occasionally we'll store a pointer as data: <p class="inwebparagraph"><a id="SP7"></a><b>&#167;7. </b>Very occasionally we'll store a pointer as data:
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">long</span><span class="plain"> </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">pointer_sized_int</span><span class="plain">;</span> <span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">long</span><span class="plain"> </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">pointer_sized_int</span><span class="plain">;</span>
</pre> </pre>
@ -143,7 +139,6 @@ shutting down.
that is, literal <code class="display"><span class="extract">text_stream *</span></code> values written as <code class="display"><span class="extract">I"strings"</span></code>. that is, literal <code class="display"><span class="extract">text_stream *</span></code> values written as <code class="display"><span class="extract">I"strings"</span></code>.
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Foundation::start</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span> <span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Foundation::start</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="functiontext">Memory::start</span><span class="plain">();</span> <span class="functiontext">Memory::start</span><span class="plain">();</span>
@ -278,7 +273,6 @@ an early termination due to a fatal error, as this may lead to thread
safety problems. safety problems.
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Foundation::end</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span> <span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Foundation::end</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Log::aspect_switched_on</span><span class="plain">(</span><span class="constant">MEMORY_USAGE_DA</span><span class="plain">)) </span><span class="functiontext">Memory::log_statistics</span><span class="plain">();</span> <span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Log::aspect_switched_on</span><span class="plain">(</span><span class="constant">MEMORY_USAGE_DA</span><span class="plain">)) </span><span class="functiontext">Memory::log_statistics</span><span class="plain">();</span>

View file

@ -143,7 +143,6 @@ of files are encoded (as ASCII, as ISO Latin-1, as UTF-8, etc.). The default
here is UTF-8 since OS X and Linux both adopt this. here is UTF-8 since OS X and Linux both adopt this.
</p> </p>
<pre class="display"> <pre class="display">
<span class="plain">#</span><span class="identifier">ifndef</span><span class="plain"> </span><span class="constant">LOCALE_IS_ISO</span> <span class="plain">#</span><span class="identifier">ifndef</span><span class="plain"> </span><span class="constant">LOCALE_IS_ISO</span>
<span class="plain">#</span><span class="identifier">ifndef</span><span class="plain"> </span><span class="identifier">LOCALE_IS_UTF8</span> <span class="plain">#</span><span class="identifier">ifndef</span><span class="plain"> </span><span class="identifier">LOCALE_IS_UTF8</span>
@ -158,7 +157,6 @@ here is UTF-8 since OS X and Linux both adopt this.
<p class="inwebparagraph"><a id="SP8"></a><b>&#167;8. Environment variables. </b></p> <p class="inwebparagraph"><a id="SP8"></a><b>&#167;8. Environment variables. </b></p>
<pre class="display"> <pre class="display">
<span class="reserved">char</span><span class="plain"> *</span><span class="functiontext">Platform::getenv</span><span class="plain">(</span><span class="reserved">const</span><span class="plain"> </span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">name</span><span class="plain">) {</span> <span class="reserved">char</span><span class="plain"> *</span><span class="functiontext">Platform::getenv</span><span class="plain">(</span><span class="reserved">const</span><span class="plain"> </span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">name</span><span class="plain">) {</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">getenv</span><span class="plain">(</span><span class="identifier">name</span><span class="plain">);</span> <span class="reserved">return</span><span class="plain"> </span><span class="identifier">getenv</span><span class="plain">(</span><span class="identifier">name</span><span class="plain">);</span>
@ -179,7 +177,6 @@ always be unavailable: that doesn't mean we can't run on those platforms,
just that installation and use of Foundation-built tools is less convenient.) just that installation and use of Foundation-built tools is less convenient.)
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Platform::where_am_i</span><span class="plain">(</span><span class="identifier">wchar_t</span><span class="plain"> *</span><span class="identifier">p</span><span class="plain">, </span><span class="identifier">size_t</span><span class="plain"> </span><span class="identifier">length</span><span class="plain">) {</span> <span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Platform::where_am_i</span><span class="plain">(</span><span class="identifier">wchar_t</span><span class="plain"> *</span><span class="identifier">p</span><span class="plain">, </span><span class="identifier">size_t</span><span class="plain"> </span><span class="identifier">length</span><span class="plain">) {</span>
<span class="reserved">char</span><span class="plain"> </span><span class="identifier">buffer</span><span class="plain">[</span><span class="identifier">PATH_MAX</span><span class="plain"> + </span><span class="constant">1</span><span class="plain">];</span> <span class="reserved">char</span><span class="plain"> </span><span class="identifier">buffer</span><span class="plain">[</span><span class="identifier">PATH_MAX</span><span class="plain"> + </span><span class="constant">1</span><span class="plain">];</span>
@ -243,7 +240,6 @@ string.
<p class="inwebparagraph"><a id="SP9_1_1"></a><b>&#167;9.1.1. </b>And now the Mac version: <p class="inwebparagraph"><a id="SP9_1_1"></a><b>&#167;9.1.1. </b>And now the Mac version:
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">_NSGetExecutablePath</span><span class="plain">(</span><span class="reserved">char</span><span class="plain">* </span><span class="identifier">buf</span><span class="plain">, </span><span class="identifier">uint32_t</span><span class="plain">* </span><span class="identifier">bufsize</span><span class="plain">);</span> <span class="reserved">int</span><span class="plain"> </span><span class="functiontext">_NSGetExecutablePath</span><span class="plain">(</span><span class="reserved">char</span><span class="plain">* </span><span class="identifier">buf</span><span class="plain">, </span><span class="identifier">uint32_t</span><span class="plain">* </span><span class="identifier">bufsize</span><span class="plain">);</span>
@ -278,7 +274,6 @@ string.
<p class="inwebparagraph"><a id="SP9_1_2"></a><b>&#167;9.1.2. </b>For Unix, there's nothing we can generically do. <p class="inwebparagraph"><a id="SP9_1_2"></a><b>&#167;9.1.2. </b>For Unix, there's nothing we can generically do.
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Platform::where_am_i</span><span class="plain">(</span><span class="identifier">wchar_t</span><span class="plain"> *</span><span class="identifier">p</span><span class="plain">, </span><span class="identifier">size_t</span><span class="plain"> </span><span class="identifier">length</span><span class="plain">) {</span> <span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Platform::where_am_i</span><span class="plain">(</span><span class="identifier">wchar_t</span><span class="plain"> *</span><span class="identifier">p</span><span class="plain">, </span><span class="identifier">size_t</span><span class="plain"> </span><span class="identifier">length</span><span class="plain">) {</span>
&lt;<span class="cwebmacro">Fail</span> <span class="cwebmacronumber">9.1.4</span>&gt;<span class="plain">;</span> &lt;<span class="cwebmacro">Fail</span> <span class="cwebmacronumber">9.1.4</span>&gt;<span class="plain">;</span>
@ -294,7 +289,6 @@ string.
<p class="inwebparagraph"><a id="SP9_1_3"></a><b>&#167;9.1.3. </b>On Android, there's no real need for this. <p class="inwebparagraph"><a id="SP9_1_3"></a><b>&#167;9.1.3. </b>On Android, there's no real need for this.
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Platform::where_am_i</span><span class="plain">(</span><span class="identifier">wchar_t</span><span class="plain"> *</span><span class="identifier">p</span><span class="plain">, </span><span class="identifier">size_t</span><span class="plain"> </span><span class="identifier">length</span><span class="plain">) {</span> <span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Platform::where_am_i</span><span class="plain">(</span><span class="identifier">wchar_t</span><span class="plain"> *</span><span class="identifier">p</span><span class="plain">, </span><span class="identifier">size_t</span><span class="plain"> </span><span class="identifier">length</span><span class="plain">) {</span>
&lt;<span class="cwebmacro">Fail</span> <span class="cwebmacronumber">9.1.4</span>&gt;<span class="plain">;</span> &lt;<span class="cwebmacro">Fail</span> <span class="cwebmacronumber">9.1.4</span>&gt;<span class="plain">;</span>
@ -329,7 +323,6 @@ string.
<p class="inwebparagraph"><a id="SP10"></a><b>&#167;10. Shell commands. </b></p> <p class="inwebparagraph"><a id="SP10"></a><b>&#167;10. Shell commands. </b></p>
<pre class="display"> <pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Platform::system</span><span class="plain">(</span><span class="reserved">const</span><span class="plain"> </span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">cmd</span><span class="plain">) {</span> <span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Platform::system</span><span class="plain">(</span><span class="reserved">const</span><span class="plain"> </span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">cmd</span><span class="plain">) {</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">system</span><span class="plain">(</span><span class="identifier">cmd</span><span class="plain">);</span> <span class="reserved">return</span><span class="plain"> </span><span class="identifier">system</span><span class="plain">(</span><span class="identifier">cmd</span><span class="plain">);</span>
@ -363,7 +356,6 @@ bugs in Intest, with the worker threads apparently writing on each other's
memory space. Using <code class="display"><span class="extract">posix_spawn()</span></code> instead appears to work better. memory space. Using <code class="display"><span class="extract">posix_spawn()</span></code> instead appears to work better.
</p> </p>
<pre class="display"> <pre class="display">
<span class="plain">#</span><span class="identifier">include</span><span class="plain"> &lt;</span><span class="identifier">spawn</span><span class="plain">.</span><span class="identifier">h</span><span class="plain">&gt;</span> <span class="plain">#</span><span class="identifier">include</span><span class="plain"> &lt;</span><span class="identifier">spawn</span><span class="plain">.</span><span class="identifier">h</span><span class="plain">&gt;</span>
<span class="plain">#</span><span class="identifier">include</span><span class="plain"> &lt;</span><span class="identifier">sys</span><span class="plain">/</span><span class="identifier">wait</span><span class="plain">.</span><span class="identifier">h</span><span class="plain">&gt;</span> <span class="plain">#</span><span class="identifier">include</span><span class="plain"> &lt;</span><span class="identifier">sys</span><span class="plain">/</span><span class="identifier">wait</span><span class="plain">.</span><span class="identifier">h</span><span class="plain">&gt;</span>
@ -393,7 +385,6 @@ memory space. Using <code class="display"><span class="extract">posix_spawn()</s
<p class="inwebparagraph"><a id="SP12"></a><b>&#167;12. Directory handling. </b></p> <p class="inwebparagraph"><a id="SP12"></a><b>&#167;12. Directory handling. </b></p>
<pre class="display"> <pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Platform::mkdir</span><span class="plain">(</span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">transcoded_pathname</span><span class="plain">) {</span> <span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Platform::mkdir</span><span class="plain">(</span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">transcoded_pathname</span><span class="plain">) {</span>
<span class="identifier">errno</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span> <span class="identifier">errno</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
@ -448,7 +439,6 @@ is one which is earlier than any possible timestamp on the files we'll
be dealing with. be dealing with.
</p> </p>
<pre class="display"> <pre class="display">
<span class="identifier">time_t</span><span class="plain"> </span><span class="functiontext">Platform::never_time</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span> <span class="identifier">time_t</span><span class="plain"> </span><span class="functiontext">Platform::never_time</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="reserved">return</span><span class="plain"> (</span><span class="identifier">time_t</span><span class="plain">) </span><span class="constant">0</span><span class="plain">;</span> <span class="reserved">return</span><span class="plain"> (</span><span class="identifier">time_t</span><span class="plain">) </span><span class="constant">0</span><span class="plain">;</span>
@ -477,7 +467,6 @@ anything different which was originally in <code class="display"><span class="ex
<p class="inwebparagraph">In POSIX world, we can fairly well depend on <code class="display"><span class="extract">rsync</span></code> being around: <p class="inwebparagraph">In POSIX world, we can fairly well depend on <code class="display"><span class="extract">rsync</span></code> being around:
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Platform::rsync</span><span class="plain">(</span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">transcoded_source</span><span class="plain">, </span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">transcoded_dest</span><span class="plain">) {</span> <span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Platform::rsync</span><span class="plain">(</span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">transcoded_source</span><span class="plain">, </span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">transcoded_dest</span><span class="plain">) {</span>
<span class="reserved">char</span><span class="plain"> </span><span class="identifier">rsync_command</span><span class="plain">[10*</span><span class="constant">MAX_FILENAME_LENGTH</span><span class="plain">];</span> <span class="reserved">char</span><span class="plain"> </span><span class="identifier">rsync_command</span><span class="plain">[10*</span><span class="constant">MAX_FILENAME_LENGTH</span><span class="plain">];</span>
@ -512,7 +501,6 @@ anything different which was originally in <code class="display"><span class="ex
<p class="inwebparagraph"><a id="SP15"></a><b>&#167;15. Sleep. </b></p> <p class="inwebparagraph"><a id="SP15"></a><b>&#167;15. Sleep. </b></p>
<pre class="display"> <pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Platform::sleep</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">seconds</span><span class="plain">) {</span> <span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Platform::sleep</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">seconds</span><span class="plain">) {</span>
<span class="identifier">sleep</span><span class="plain">((</span><span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">int</span><span class="plain">) </span><span class="identifier">seconds</span><span class="plain">);</span> <span class="identifier">sleep</span><span class="plain">((</span><span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">int</span><span class="plain">) </span><span class="identifier">seconds</span><span class="plain">);</span>
@ -537,7 +525,6 @@ to survive, given the MacOS team's current hostility to scripting; we're
actually running a one-line AppleScript here. actually running a one-line AppleScript here.
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Platform::notification</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">text</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">happy</span><span class="plain">) {</span> <span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Platform::notification</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">text</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">happy</span><span class="plain">) {</span>
<span class="reserved">char</span><span class="plain"> *</span><span class="identifier">sound_name</span><span class="plain"> = </span><span class="string">"Bell.aiff"</span><span class="plain">;</span> <span class="reserved">char</span><span class="plain"> *</span><span class="identifier">sound_name</span><span class="plain"> = </span><span class="string">"Bell.aiff"</span><span class="plain">;</span>
@ -558,7 +545,6 @@ actually running a one-line AppleScript here.
<p class="inwebparagraph"><a id="SP17"></a><b>&#167;17. </b></p> <p class="inwebparagraph"><a id="SP17"></a><b>&#167;17. </b></p>
<pre class="display"> <pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Platform::notification</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">text</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">happy</span><span class="plain">) {</span> <span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Platform::notification</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">text</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">happy</span><span class="plain">) {</span>
<span class="plain">}</span> <span class="plain">}</span>
@ -572,7 +558,6 @@ actually running a one-line AppleScript here.
<p class="inwebparagraph"><a id="SP18"></a><b>&#167;18. Concurrency. </b></p> <p class="inwebparagraph"><a id="SP18"></a><b>&#167;18. Concurrency. </b></p>
<pre class="display"> <pre class="display">
<span class="reserved">typedef</span><span class="plain"> </span><span class="identifier">pthread_t</span><span class="plain"> </span><span class="identifier">foundation_thread</span><span class="plain">;</span> <span class="reserved">typedef</span><span class="plain"> </span><span class="identifier">pthread_t</span><span class="plain"> </span><span class="identifier">foundation_thread</span><span class="plain">;</span>
<span class="reserved">typedef</span><span class="plain"> </span><span class="identifier">pthread_attr_t</span><span class="plain"> </span><span class="identifier">foundation_thread_attributes</span><span class="plain">;</span> <span class="reserved">typedef</span><span class="plain"> </span><span class="identifier">pthread_attr_t</span><span class="plain"> </span><span class="identifier">foundation_thread_attributes</span><span class="plain">;</span>
@ -584,7 +569,6 @@ actually running a one-line AppleScript here.
<p class="inwebparagraph"><a id="SP19"></a><b>&#167;19. </b></p> <p class="inwebparagraph"><a id="SP19"></a><b>&#167;19. </b></p>
<pre class="display"> <pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Platform::create_thread</span><span class="plain">(</span><span class="identifier">foundation_thread</span><span class="plain"> *</span><span class="identifier">pt</span><span class="plain">,</span> <span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Platform::create_thread</span><span class="plain">(</span><span class="identifier">foundation_thread</span><span class="plain"> *</span><span class="identifier">pt</span><span class="plain">,</span>
<span class="reserved">const</span><span class="plain"> </span><span class="identifier">foundation_thread_attributes</span><span class="plain"> *</span><span class="identifier">pa</span><span class="plain">, </span><span class="reserved">void</span><span class="plain"> *(*</span><span class="identifier">fn</span><span class="plain">)(</span><span class="reserved">void</span><span class="plain"> *), </span><span class="reserved">void</span><span class="plain"> *</span><span class="identifier">arg</span><span class="plain">) {</span> <span class="reserved">const</span><span class="plain"> </span><span class="identifier">foundation_thread_attributes</span><span class="plain"> *</span><span class="identifier">pa</span><span class="plain">, </span><span class="reserved">void</span><span class="plain"> *(*</span><span class="identifier">fn</span><span class="plain">)(</span><span class="reserved">void</span><span class="plain"> *), </span><span class="reserved">void</span><span class="plain"> *</span><span class="identifier">arg</span><span class="plain">) {</span>

View file

@ -96,7 +96,6 @@ And with Windows GCC, <code class="display"><span class="extract">isdigit(-23)</
<p class="inwebparagraph"><a id="SP4"></a><b>&#167;4. Environment variables. </b></p> <p class="inwebparagraph"><a id="SP4"></a><b>&#167;4. Environment variables. </b></p>
<pre class="display"> <pre class="display">
<span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">long</span><span class="plain"> </span><span class="identifier">__stdcall</span><span class="plain"> </span><span class="functiontext">GetCurrentDirectoryA</span><span class="plain">(</span><span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">long</span><span class="plain"> </span><span class="identifier">len</span><span class="plain">, </span><span class="reserved">char</span><span class="plain">* </span><span class="identifier">buffer</span><span class="plain">);</span> <span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">long</span><span class="plain"> </span><span class="identifier">__stdcall</span><span class="plain"> </span><span class="functiontext">GetCurrentDirectoryA</span><span class="plain">(</span><span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">long</span><span class="plain"> </span><span class="identifier">len</span><span class="plain">, </span><span class="reserved">char</span><span class="plain">* </span><span class="identifier">buffer</span><span class="plain">);</span>
<span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">long</span><span class="plain"> </span><span class="identifier">__stdcall</span><span class="plain"> </span><span class="functiontext">SHGetFolderPathA</span><span class="plain">(</span><span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">long</span><span class="plain"> </span><span class="identifier">wnd</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">folder</span><span class="plain">,</span> <span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">long</span><span class="plain"> </span><span class="identifier">__stdcall</span><span class="plain"> </span><span class="functiontext">SHGetFolderPathA</span><span class="plain">(</span><span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">long</span><span class="plain"> </span><span class="identifier">wnd</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">folder</span><span class="plain">,</span>
@ -132,7 +131,6 @@ always be unavailable: that doesn't mean we can't run on those platforms,
just that installation and use of Foundation-built tools is less convenient.) just that installation and use of Foundation-built tools is less convenient.)
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Platform::where_am_i</span><span class="plain">(</span><span class="identifier">wchar_t</span><span class="plain"> *</span><span class="identifier">p</span><span class="plain">, </span><span class="identifier">size_t</span><span class="plain"> </span><span class="identifier">length</span><span class="plain">) {</span> <span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Platform::where_am_i</span><span class="plain">(</span><span class="identifier">wchar_t</span><span class="plain"> *</span><span class="identifier">p</span><span class="plain">, </span><span class="identifier">size_t</span><span class="plain"> </span><span class="identifier">length</span><span class="plain">) {</span>
<span class="identifier">DWORD</span><span class="plain"> </span><span class="identifier">result</span><span class="plain"> = </span><span class="identifier">GetModuleFileNameW</span><span class="plain">(</span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">p</span><span class="plain">, </span><span class="identifier">length</span><span class="plain">);</span> <span class="identifier">DWORD</span><span class="plain"> </span><span class="identifier">result</span><span class="plain"> = </span><span class="identifier">GetModuleFileNameW</span><span class="plain">(</span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">p</span><span class="plain">, </span><span class="identifier">length</span><span class="plain">);</span>
@ -148,7 +146,6 @@ just that installation and use of Foundation-built tools is less convenient.)
<p class="inwebparagraph"><a id="SP6"></a><b>&#167;6. Shell commands. </b></p> <p class="inwebparagraph"><a id="SP6"></a><b>&#167;6. Shell commands. </b></p>
<pre class="display"> <pre class="display">
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">Win32_Startup_Info</span><span class="plain"> {</span> <span class="reserved">struct</span><span class="plain"> </span><span class="identifier">Win32_Startup_Info</span><span class="plain"> {</span>
<span class="reserved">long</span><span class="plain"> </span><span class="identifier">v1</span><span class="plain">; </span><span class="reserved">char</span><span class="plain">* </span><span class="identifier">v2</span><span class="plain">; </span><span class="reserved">char</span><span class="plain">* </span><span class="identifier">v3</span><span class="plain">; </span><span class="reserved">char</span><span class="plain">* </span><span class="identifier">v4</span><span class="plain">; </span><span class="reserved">long</span><span class="plain"> </span><span class="identifier">v5</span><span class="plain">; </span><span class="reserved">long</span><span class="plain"> </span><span class="identifier">v6</span><span class="plain">;</span> <span class="reserved">long</span><span class="plain"> </span><span class="identifier">v1</span><span class="plain">; </span><span class="reserved">char</span><span class="plain">* </span><span class="identifier">v2</span><span class="plain">; </span><span class="reserved">char</span><span class="plain">* </span><span class="identifier">v3</span><span class="plain">; </span><span class="reserved">char</span><span class="plain">* </span><span class="identifier">v4</span><span class="plain">; </span><span class="reserved">long</span><span class="plain"> </span><span class="identifier">v5</span><span class="plain">; </span><span class="reserved">long</span><span class="plain"> </span><span class="identifier">v6</span><span class="plain">;</span>
@ -208,7 +205,6 @@ just that installation and use of Foundation-built tools is less convenient.)
<p class="inwebparagraph"><a id="SP7"></a><b>&#167;7. Directory handling. </b></p> <p class="inwebparagraph"><a id="SP7"></a><b>&#167;7. Directory handling. </b></p>
<pre class="display"> <pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Platform::mkdir</span><span class="plain">(</span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">transcoded_pathname</span><span class="plain">) {</span> <span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Platform::mkdir</span><span class="plain">(</span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">transcoded_pathname</span><span class="plain">) {</span>
<span class="identifier">errno</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span> <span class="identifier">errno</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
@ -262,7 +258,6 @@ just that installation and use of Foundation-built tools is less convenient.)
POSIX <code class="display"><span class="extract">sleep</span></code> is for seconds. POSIX <code class="display"><span class="extract">sleep</span></code> is for seconds.
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="identifier">__stdcall</span><span class="plain"> </span><span class="identifier">Sleep</span><span class="plain">(</span><span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">long</span><span class="plain"> </span><span class="identifier">ms</span><span class="plain">);</span> <span class="reserved">void</span><span class="plain"> </span><span class="identifier">__stdcall</span><span class="plain"> </span><span class="identifier">Sleep</span><span class="plain">(</span><span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">long</span><span class="plain"> </span><span class="identifier">ms</span><span class="plain">);</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Platform::sleep</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">seconds</span><span class="plain">) {</span> <span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Platform::sleep</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">seconds</span><span class="plain">) {</span>
@ -278,7 +273,6 @@ POSIX <code class="display"><span class="extract">sleep</span></code> is for sec
<p class="inwebparagraph"><a id="SP9"></a><b>&#167;9. Notifications. </b></p> <p class="inwebparagraph"><a id="SP9"></a><b>&#167;9. Notifications. </b></p>
<pre class="display"> <pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Platform::notification</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">text</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">happy</span><span class="plain">) {</span> <span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Platform::notification</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">text</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">happy</span><span class="plain">) {</span>
<span class="plain">}</span> <span class="plain">}</span>
@ -293,7 +287,6 @@ POSIX <code class="display"><span class="extract">sleep</span></code> is for sec
<p class="inwebparagraph"><a id="SP10"></a><b>&#167;10. Concurrency. </b>The following predeclarations come from the Windows SDK. <p class="inwebparagraph"><a id="SP10"></a><b>&#167;10. Concurrency. </b>The following predeclarations come from the Windows SDK.
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">long</span><span class="plain"> </span><span class="identifier">__stdcall</span><span class="plain"> </span><span class="functiontext">CreateThread</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">* </span><span class="identifier">attrs</span><span class="plain">, </span><span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">long</span><span class="plain"> </span><span class="identifier">stack</span><span class="plain">,</span> <span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">long</span><span class="plain"> </span><span class="identifier">__stdcall</span><span class="plain"> </span><span class="functiontext">CreateThread</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">* </span><span class="identifier">attrs</span><span class="plain">, </span><span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">long</span><span class="plain"> </span><span class="identifier">stack</span><span class="plain">,</span>
<span class="reserved">void</span><span class="plain">* </span><span class="identifier">func</span><span class="plain">, </span><span class="reserved">void</span><span class="plain">* </span><span class="identifier">param</span><span class="plain">, </span><span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">long</span><span class="plain"> </span><span class="identifier">flags</span><span class="plain">, </span><span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">long</span><span class="plain">* </span><span class="identifier">id</span><span class="plain">);</span> <span class="reserved">void</span><span class="plain">* </span><span class="identifier">func</span><span class="plain">, </span><span class="reserved">void</span><span class="plain">* </span><span class="identifier">param</span><span class="plain">, </span><span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">long</span><span class="plain"> </span><span class="identifier">flags</span><span class="plain">, </span><span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">long</span><span class="plain">* </span><span class="identifier">id</span><span class="plain">);</span>
@ -313,7 +306,6 @@ POSIX <code class="display"><span class="extract">sleep</span></code> is for sec
<p class="inwebparagraph"><a id="SP11"></a><b>&#167;11. </b></p> <p class="inwebparagraph"><a id="SP11"></a><b>&#167;11. </b></p>
<pre class="display"> <pre class="display">
<span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">long</span><span class="plain"> </span><span class="identifier">__stdcall</span><span class="plain"> </span><span class="functiontext">Platform::Win32_Thread_Func</span><span class="plain">(</span><span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">long</span><span class="plain"> </span><span class="identifier">param</span><span class="plain">) {</span> <span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">long</span><span class="plain"> </span><span class="identifier">__stdcall</span><span class="plain"> </span><span class="functiontext">Platform::Win32_Thread_Func</span><span class="plain">(</span><span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">long</span><span class="plain"> </span><span class="identifier">param</span><span class="plain">) {</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">Win32_Thread_Start</span><span class="plain">* </span><span class="identifier">start</span><span class="plain"> = (</span><span class="reserved">struct</span><span class="plain"> </span><span class="identifier">Win32_Thread_Start</span><span class="plain">*)</span><span class="identifier">param</span><span class="plain">;</span> <span class="reserved">struct</span><span class="plain"> </span><span class="identifier">Win32_Thread_Start</span><span class="plain">* </span><span class="identifier">start</span><span class="plain"> = (</span><span class="reserved">struct</span><span class="plain"> </span><span class="identifier">Win32_Thread_Start</span><span class="plain">*)</span><span class="identifier">param</span><span class="plain">;</span>
@ -370,7 +362,6 @@ is one which is earlier than any possible timestamp on the files we'll
be dealing with. be dealing with.
</p> </p>
<pre class="display"> <pre class="display">
<span class="identifier">time_t</span><span class="plain"> </span><span class="functiontext">Platform::never_time</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span> <span class="identifier">time_t</span><span class="plain"> </span><span class="functiontext">Platform::never_time</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="reserved">return</span><span class="plain"> (</span><span class="identifier">time_t</span><span class="plain">) </span><span class="constant">0</span><span class="plain">;</span> <span class="reserved">return</span><span class="plain"> (</span><span class="identifier">time_t</span><span class="plain">) </span><span class="constant">0</span><span class="plain">;</span>

View file

@ -34,7 +34,6 @@ pointers to some external structure. Often these will also be texts, but
not necessarily. not necessarily.
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">dictionary</span><span class="plain"> {</span> <span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">dictionary</span><span class="plain"> {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">textual</span><span class="plain">; </span><span class="comment">values are texts?</span> <span class="reserved">int</span><span class="plain"> </span><span class="identifier">textual</span><span class="plain">; </span><span class="comment">values are texts?</span>
@ -62,7 +61,6 @@ not necessarily.
efficiency's sake the caller can set them up with an initial size of her choice. efficiency's sake the caller can set them up with an initial size of her choice.
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">dictionary</span><span class="plain"> *</span><span class="functiontext">Dictionaries::new</span><span class="plain">(</span><span class="reserved">int</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">textual</span><span class="plain">) {</span> <span class="reserved">dictionary</span><span class="plain"> *</span><span class="functiontext">Dictionaries::new</span><span class="plain">(</span><span class="reserved">int</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">textual</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">S</span><span class="plain"> &lt; </span><span class="constant">2</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"dictionary too small"</span><span class="plain">);</span> <span class="reserved">if</span><span class="plain"> (</span><span class="identifier">S</span><span class="plain"> &lt; </span><span class="constant">2</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"dictionary too small"</span><span class="plain">);</span>
@ -86,7 +84,6 @@ efficiency's sake the caller can set them up with an initial size of her choice.
<p class="inwebparagraph"><a id="SP3"></a><b>&#167;3. Logging. </b></p> <p class="inwebparagraph"><a id="SP3"></a><b>&#167;3. Logging. </b></p>
<pre class="display"> <pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Dictionaries::log</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">dictionary</span><span class="plain"> *</span><span class="identifier">D</span><span class="plain">) {</span> <span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Dictionaries::log</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">dictionary</span><span class="plain"> *</span><span class="identifier">D</span><span class="plain">) {</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"Dictionary:\n"</span><span class="plain">, (</span><span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">int</span><span class="plain">) </span><span class="identifier">D</span><span class="plain">); </span><span class="constant">INDENT</span><span class="plain">;</span> <span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"Dictionary:\n"</span><span class="plain">, (</span><span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">int</span><span class="plain">) </span><span class="identifier">D</span><span class="plain">); </span><span class="constant">INDENT</span><span class="plain">;</span>
@ -112,7 +109,6 @@ here. If there are <code class="display"><span class="extract">N</span></code> s
(from 0 to <code class="display"><span class="extract">N-1</span></code>) a given key value belongs in. (from 0 to <code class="display"><span class="extract">N-1</span></code>) a given key value belongs in.
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Dictionaries::hash</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">K</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">N</span><span class="plain">) {</span> <span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Dictionaries::hash</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">K</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">N</span><span class="plain">) {</span>
<span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">hash</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span> <span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">hash</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
@ -132,7 +128,6 @@ remain valid only until somebody writes a new value into the dictionary;
so be careful if thread safety's an issue. so be careful if thread safety's an issue.
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">dict_entry</span><span class="plain"> *</span><span class="functiontext">Dictionaries::find</span><span class="plain">(</span><span class="reserved">dictionary</span><span class="plain"> *</span><span class="identifier">D</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">K</span><span class="plain">) {</span> <span class="reserved">dict_entry</span><span class="plain"> *</span><span class="functiontext">Dictionaries::find</span><span class="plain">(</span><span class="reserved">dictionary</span><span class="plain"> *</span><span class="identifier">D</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">K</span><span class="plain">) {</span>
<span class="reserved">return</span><span class="plain"> </span><span class="functiontext">Dictionaries::find_p</span><span class="plain">(</span><span class="identifier">D</span><span class="plain">, </span><span class="identifier">K</span><span class="plain">, </span><span class="constant">0</span><span class="plain">);</span> <span class="reserved">return</span><span class="plain"> </span><span class="functiontext">Dictionaries::find_p</span><span class="plain">(</span><span class="identifier">D</span><span class="plain">, </span><span class="identifier">K</span><span class="plain">, </span><span class="constant">0</span><span class="plain">);</span>
@ -158,7 +153,6 @@ as wide text (so that we can use literals like <code class="display"><span class
streams. So we also offer versions suffixed <code class="display"><span class="extract">_literal</span></code>: streams. So we also offer versions suffixed <code class="display"><span class="extract">_literal</span></code>:
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">dict_entry</span><span class="plain"> *</span><span class="functiontext">Dictionaries::find_literal</span><span class="plain">(</span><span class="reserved">dictionary</span><span class="plain"> *</span><span class="identifier">D</span><span class="plain">, </span><span class="identifier">wchar_t</span><span class="plain"> *</span><span class="identifier">lit</span><span class="plain">) {</span> <span class="reserved">dict_entry</span><span class="plain"> *</span><span class="functiontext">Dictionaries::find_literal</span><span class="plain">(</span><span class="reserved">dictionary</span><span class="plain"> *</span><span class="identifier">D</span><span class="plain">, </span><span class="identifier">wchar_t</span><span class="plain"> *</span><span class="identifier">lit</span><span class="plain">) {</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">K</span><span class="plain">);</span> <span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">K</span><span class="plain">);</span>
@ -194,7 +188,6 @@ streams. So we also offer versions suffixed <code class="display"><span class="e
it (if <code class="display"><span class="extract">-1</span></code>). it (if <code class="display"><span class="extract">-1</span></code>).
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">dict_entry</span><span class="plain"> *</span><span class="functiontext">Dictionaries::find_p</span><span class="plain">(</span><span class="reserved">dictionary</span><span class="plain"> *</span><span class="identifier">D</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">K</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">change</span><span class="plain">) {</span> <span class="reserved">dict_entry</span><span class="plain"> *</span><span class="functiontext">Dictionaries::find_p</span><span class="plain">(</span><span class="reserved">dictionary</span><span class="plain"> *</span><span class="identifier">D</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">K</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">change</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">D</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span>&lt;<span class="cwebmacro">Handle the null dictionary</span> <span class="cwebmacronumber">7.1</span>&gt;<span class="plain">;</span> <span class="reserved">if</span><span class="plain"> (</span><span class="identifier">D</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span>&lt;<span class="cwebmacro">Handle the null dictionary</span> <span class="cwebmacronumber">7.1</span>&gt;<span class="plain">;</span>
@ -335,7 +328,6 @@ same dictionary if deletions are a possibility.
values which are arbitrary pointers, so we have to use void pointers: values which are arbitrary pointers, so we have to use void pointers:
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">void</span><span class="plain"> *</span><span class="functiontext">Dictionaries::read_value</span><span class="plain">(</span><span class="reserved">dictionary</span><span class="plain"> *</span><span class="identifier">D</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">key</span><span class="plain">) {</span> <span class="reserved">void</span><span class="plain"> *</span><span class="functiontext">Dictionaries::read_value</span><span class="plain">(</span><span class="reserved">dictionary</span><span class="plain"> *</span><span class="identifier">D</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">key</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">D</span><span class="plain"> == </span><span class="identifier">NULL</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="reserved">if</span><span class="plain"> (</span><span class="identifier">D</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">NULL</span><span class="plain">;</span>
@ -386,7 +378,6 @@ values which are arbitrary pointers, so we have to use void pointers:
so we provide convenient wrappers with the correct C types. so we provide convenient wrappers with the correct C types.
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="functiontext">Dictionaries::create_text</span><span class="plain">(</span><span class="reserved">dictionary</span><span class="plain"> *</span><span class="identifier">D</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">key</span><span class="plain">) {</span> <span class="reserved">text_stream</span><span class="plain"> *</span><span class="functiontext">Dictionaries::create_text</span><span class="plain">(</span><span class="reserved">dictionary</span><span class="plain"> *</span><span class="identifier">D</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">key</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">D</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"wrote to null dictionary"</span><span class="plain">);</span> <span class="reserved">if</span><span class="plain"> (</span><span class="identifier">D</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"wrote to null dictionary"</span><span class="plain">);</span>
@ -412,7 +403,6 @@ so we provide convenient wrappers with the correct C types.
entry by reading the text pointer and then using <code class="display"><span class="extract">WRITE_TO</span></code>. entry by reading the text pointer and then using <code class="display"><span class="extract">WRITE_TO</span></code>.
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="functiontext">Dictionaries::get_text</span><span class="plain">(</span><span class="reserved">dictionary</span><span class="plain"> *</span><span class="identifier">D</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">key</span><span class="plain">) {</span> <span class="reserved">text_stream</span><span class="plain"> *</span><span class="functiontext">Dictionaries::get_text</span><span class="plain">(</span><span class="reserved">dictionary</span><span class="plain"> *</span><span class="identifier">D</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">key</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">D</span><span class="plain"> == </span><span class="identifier">NULL</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="reserved">if</span><span class="plain"> (</span><span class="identifier">D</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">NULL</span><span class="plain">;</span>
@ -441,7 +431,6 @@ entry by reading the text pointer and then using <code class="display"><span cla
and free the memory when done: and free the memory when done:
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Dictionaries::dispose_of</span><span class="plain">(</span><span class="reserved">dictionary</span><span class="plain"> *</span><span class="identifier">D</span><span class="plain">) {</span> <span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Dictionaries::dispose_of</span><span class="plain">(</span><span class="reserved">dictionary</span><span class="plain"> *</span><span class="identifier">D</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">D</span><span class="plain">-&gt;</span><span class="element">textual</span><span class="plain">)</span> <span class="reserved">if</span><span class="plain"> (</span><span class="identifier">D</span><span class="plain">-&gt;</span><span class="element">textual</span><span class="plain">)</span>

View file

@ -31,7 +31,6 @@
<p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. The DL stream. </b>The debugging log file occupies the following stream: <p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. The DL stream. </b>The debugging log file occupies the following stream:
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">text_stream</span><span class="plain"> </span><span class="identifier">debug_log_file_struct</span><span class="plain">; </span><span class="comment">The actual debugging log file</span> <span class="reserved">text_stream</span><span class="plain"> </span><span class="identifier">debug_log_file_struct</span><span class="plain">; </span><span class="comment">The actual debugging log file</span>
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">debug_log_file</span><span class="plain"> = &amp;</span><span class="identifier">debug_log_file_struct</span><span class="plain">; </span><span class="comment">The actual debugging log file</span> <span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">debug_log_file</span><span class="plain"> = &amp;</span><span class="identifier">debug_log_file_struct</span><span class="plain">; </span><span class="comment">The actual debugging log file</span>
@ -51,7 +50,6 @@ instance, the pseudo-function-call
<p class="inwebparagraph"></p> <p class="inwebparagraph"></p>
<pre class="display"> <pre class="display">
<span class="plain">LOGIF(WHATEVER, "Heading %d skipped\n", n);</span> <span class="plain">LOGIF(WHATEVER, "Heading %d skipped\n", n);</span>
</pre> </pre>
@ -76,7 +74,6 @@ not, as we please. Each has a unique number and a name of up to three words in
length. length.
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">debugging_aspect</span><span class="plain"> {</span> <span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">debugging_aspect</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">hyphenated_name</span><span class="plain">; </span><span class="comment">e.g., "memory-usage"</span> <span class="reserved">struct</span><span class="plain"> </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">hyphenated_name</span><span class="plain">; </span><span class="comment">e.g., "memory-usage"</span>
@ -181,7 +178,6 @@ is possible this has been switched to be <code class="display"><span class="extr
temporarily the sentence tracing file: but we don't care. temporarily the sentence tracing file: but we don't care.
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">debug_log_filename</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span> <span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">debug_log_filename</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
@ -239,7 +235,6 @@ the debugging log can be divided into "phases", subdivided into "stages".
This is how. This is how.
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">char</span><span class="plain"> </span><span class="identifier">debug_log_phase</span><span class="plain">[32];</span> <span class="reserved">char</span><span class="plain"> </span><span class="identifier">debug_log_phase</span><span class="plain">[32];</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">debug_log_subheading</span><span class="plain"> = </span><span class="constant">1</span><span class="plain">;</span> <span class="reserved">int</span><span class="plain"> </span><span class="identifier">debug_log_subheading</span><span class="plain"> = </span><span class="constant">1</span><span class="plain">;</span>
@ -272,7 +267,6 @@ being logged, and is used by our main macros. Aspect 0 mandates writing to the
debug log, and is used when errors occur. debug log, and is used when errors occur.
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Log::aspect_switched_on</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">aspect</span><span class="plain">) {</span> <span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Log::aspect_switched_on</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">aspect</span><span class="plain">) {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">decision</span><span class="plain"> = </span><span class="identifier">the_debugging_aspects</span><span class="plain">[</span><span class="identifier">aspect</span><span class="plain">].</span><span class="element">on_or_off</span><span class="plain">;</span> <span class="reserved">int</span><span class="plain"> </span><span class="identifier">decision</span><span class="plain"> = </span><span class="identifier">the_debugging_aspects</span><span class="plain">[</span><span class="identifier">aspect</span><span class="plain">].</span><span class="element">on_or_off</span><span class="plain">;</span>
@ -295,7 +289,6 @@ debug log, and is used when errors occur.
<p class="inwebparagraph"><a id="SP8"></a><b>&#167;8. </b>We sometimes want to switch everything on, or switch everything off: <p class="inwebparagraph"><a id="SP8"></a><b>&#167;8. </b>We sometimes want to switch everything on, or switch everything off:
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Log::set_all_aspects</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">new_state</span><span class="plain">) {</span> <span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Log::set_all_aspects</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">new_state</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">DL</span><span class="plain">) </span><span class="identifier">LOGIF</span><span class="plain">(</span><span class="identifier">DEBUGGING_LOG_INCLUSIONS</span><span class="plain">, </span><span class="string">"Set debugging aspect: everything -&gt; %s\n"</span><span class="plain">,</span> <span class="reserved">if</span><span class="plain"> (</span><span class="identifier">DL</span><span class="plain">) </span><span class="identifier">LOGIF</span><span class="plain">(</span><span class="identifier">DEBUGGING_LOG_INCLUSIONS</span><span class="plain">, </span><span class="string">"Set debugging aspect: everything -&gt; %s\n"</span><span class="plain">,</span>
@ -321,7 +314,6 @@ every space with a hyphen: for instance, <code class="display"><span class="extr
print out a list of debugging aspects to <code class="display"><span class="extract">STDOUT</span></code>. print out a list of debugging aspects to <code class="display"><span class="extract">STDOUT</span></code>.
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Log::set_aspect_from_command_line</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">int</span><span class="plain"> </span><span class="identifier">give_error</span><span class="plain">) {</span> <span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Log::set_aspect_from_command_line</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">int</span><span class="plain"> </span><span class="identifier">give_error</span><span class="plain">) {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">list_mode</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span> <span class="reserved">int</span><span class="plain"> </span><span class="identifier">list_mode</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
@ -358,7 +350,6 @@ print out a list of debugging aspects to <code class="display"><span class="extr
out again without having lost our earlier settings. out again without having lost our earlier settings.
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Log::tracing_on</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">starred</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">heading</span><span class="plain">) {</span> <span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Log::tracing_on</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">starred</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">heading</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">starred</span><span class="plain">) {</span> <span class="reserved">if</span><span class="plain"> (</span><span class="identifier">starred</span><span class="plain">) {</span>
@ -384,7 +375,6 @@ the reader with a list of other things which could have been put into it,
but weren't. but weren't.
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Log::show_debugging_settings_with_state</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">state</span><span class="plain">) {</span> <span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Log::show_debugging_settings_with_state</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">state</span><span class="plain">) {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">c</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span> <span class="reserved">int</span><span class="plain"> </span><span class="identifier">c</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>

View file

@ -62,7 +62,6 @@ a few items, only one call to the memory manager is needed.
<p class="inwebparagraph"><a id="SP2"></a><b>&#167;2. </b></p> <p class="inwebparagraph"><a id="SP2"></a><b>&#167;2. </b></p>
<pre class="display"> <pre class="display">
<span class="reserved">linked_list</span><span class="plain"> *</span><span class="functiontext">LinkedLists::new</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span> <span class="reserved">linked_list</span><span class="plain"> *</span><span class="functiontext">LinkedLists::new</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="reserved">linked_list</span><span class="plain"> *</span><span class="identifier">ll</span><span class="plain"> = </span><span class="identifier">CREATE</span><span class="plain">(</span><span class="reserved">linked_list</span><span class="plain">);</span> <span class="reserved">linked_list</span><span class="plain"> *</span><span class="identifier">ll</span><span class="plain"> = </span><span class="identifier">CREATE</span><span class="plain">(</span><span class="reserved">linked_list</span><span class="plain">);</span>
@ -81,7 +80,6 @@ a few items, only one call to the memory manager is needed.
want speed rather than memory efficiency. want speed rather than memory efficiency.
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">LinkedLists::add</span><span class="plain">(</span><span class="reserved">linked_list</span><span class="plain"> *</span><span class="identifier">L</span><span class="plain">, </span><span class="reserved">void</span><span class="plain"> *</span><span class="identifier">P</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">to_end</span><span class="plain">) {</span> <span class="reserved">void</span><span class="plain"> </span><span class="functiontext">LinkedLists::add</span><span class="plain">(</span><span class="reserved">linked_list</span><span class="plain"> *</span><span class="identifier">L</span><span class="plain">, </span><span class="reserved">void</span><span class="plain"> *</span><span class="identifier">P</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">to_end</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">NULL</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"null list"</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">NULL</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"null list"</span><span class="plain">);</span>
@ -117,7 +115,6 @@ want speed rather than memory efficiency.
<p class="inwebparagraph"><a id="SP4"></a><b>&#167;4. </b>Because of the direction of the links, only removing from the front is quick: <p class="inwebparagraph"><a id="SP4"></a><b>&#167;4. </b>Because of the direction of the links, only removing from the front is quick:
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">void</span><span class="plain"> *</span><span class="functiontext">LinkedLists::remove_from_front</span><span class="plain">(</span><span class="reserved">linked_list</span><span class="plain"> *</span><span class="identifier">L</span><span class="plain">) {</span> <span class="reserved">void</span><span class="plain"> *</span><span class="functiontext">LinkedLists::remove_from_front</span><span class="plain">(</span><span class="reserved">linked_list</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="identifier">L</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"null list"</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">NULL</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"null list"</span><span class="plain">);</span>
@ -137,7 +134,6 @@ want speed rather than memory efficiency.
<p class="inwebparagraph"><a id="SP5"></a><b>&#167;5. </b>It's rather slower to delete from a known position in the middle: <p class="inwebparagraph"><a id="SP5"></a><b>&#167;5. </b>It's rather slower to delete from a known position in the middle:
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">void</span><span class="plain"> *</span><span class="functiontext">LinkedLists::delete</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">N</span><span class="plain">, </span><span class="reserved">linked_list</span><span class="plain"> *</span><span class="identifier">L</span><span class="plain">) {</span> <span class="reserved">void</span><span class="plain"> *</span><span class="functiontext">LinkedLists::delete</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">N</span><span class="plain">, </span><span class="reserved">linked_list</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="identifier">L</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"null list"</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">NULL</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"null list"</span><span class="plain">);</span>
@ -166,7 +162,6 @@ want speed rather than memory efficiency.
<p class="inwebparagraph"><a id="SP6"></a><b>&#167;6. A function call API. </b></p> <p class="inwebparagraph"><a id="SP6"></a><b>&#167;6. A function call API. </b></p>
<pre class="display"> <pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">LinkedLists::len</span><span class="plain">(</span><span class="reserved">linked_list</span><span class="plain"> *</span><span class="identifier">L</span><span class="plain">) {</span> <span class="reserved">int</span><span class="plain"> </span><span class="functiontext">LinkedLists::len</span><span class="plain">(</span><span class="reserved">linked_list</span><span class="plain"> *</span><span class="identifier">L</span><span class="plain">) {</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">L</span><span class="plain">?(</span><span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">linked_list_length</span><span class="plain">):0;</span> <span class="reserved">return</span><span class="plain"> </span><span class="identifier">L</span><span class="plain">?(</span><span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">linked_list_length</span><span class="plain">):0;</span>

View file

@ -45,7 +45,6 @@ structures of type <code class="display"><span class="extract">thingummy</span><
<p class="inwebparagraph"></p> <p class="inwebparagraph"></p>
<pre class="display"> <pre class="display">
<span class="plain">typedef struct thingummy {</span> <span class="plain">typedef struct thingummy {</span>
<span class="plain"> int whatsit;</span> <span class="plain"> int whatsit;</span>
@ -121,7 +120,6 @@ to the number of objects in each completed array (so, typically 100) and
the doubly linked list is of the arrays. the doubly linked list is of the arrays.
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">allocation_status_structure</span><span class="plain"> {</span> <span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">allocation_status_structure</span><span class="plain"> {</span>
<span class="comment">actually needed for allocation purposes:</span> <span class="comment">actually needed for allocation purposes:</span>
@ -146,7 +144,6 @@ fairly small array of the structures defined above. The allocator can safely
begin as soon as this is initialised. begin as soon as this is initialised.
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">allocation_status_structure</span><span class="plain"> </span><span class="identifier">alloc_status</span><span class="plain">[</span><span class="identifier">NO_DEFINED_MT_VALUES</span><span class="plain">];</span> <span class="reserved">allocation_status_structure</span><span class="plain"> </span><span class="identifier">alloc_status</span><span class="plain">[</span><span class="identifier">NO_DEFINED_MT_VALUES</span><span class="plain">];</span>
@ -229,7 +226,6 @@ Each memory block consists of a header structure, followed by <code class="displ
null bytes, followed by actual data. null bytes, followed by actual data.
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">memblock_header</span><span class="plain"> {</span> <span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">memblock_header</span><span class="plain"> {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">block_number</span><span class="plain">;</span> <span class="reserved">int</span><span class="plain"> </span><span class="identifier">block_number</span><span class="plain">;</span>
@ -244,7 +240,6 @@ null bytes, followed by actual data.
<p class="inwebparagraph"><a id="SP10"></a><b>&#167;10. </b></p> <p class="inwebparagraph"><a id="SP10"></a><b>&#167;10. </b></p>
<pre class="display"> <pre class="display">
<span class="reserved">memblock_header</span><span class="plain"> *</span><span class="identifier">first_memblock_header</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">; </span><span class="comment">head of list of memory blocks</span> <span class="reserved">memblock_header</span><span class="plain"> *</span><span class="identifier">first_memblock_header</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">; </span><span class="comment">head of list of memory blocks</span>
<span class="reserved">memblock_header</span><span class="plain"> *</span><span class="identifier">current_memblock_header</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">; </span><span class="comment">tail of list of memory blocks</span> <span class="reserved">memblock_header</span><span class="plain"> *</span><span class="identifier">current_memblock_header</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">; </span><span class="comment">tail of list of memory blocks</span>
@ -258,7 +253,6 @@ null bytes, followed by actual data.
pair of routines. pair of routines.
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Memory::allocate_another_block</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span> <span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Memory::allocate_another_block</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">cp</span><span class="plain">;</span> <span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">cp</span><span class="plain">;</span>
@ -334,7 +328,6 @@ in turn, but of course being careful to avoid following links in a just-freed
block. block.
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Memory::free</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span> <span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Memory::free</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="functiontext">Memory::free_ssas</span><span class="plain">();</span> <span class="functiontext">Memory::free_ssas</span><span class="plain">();</span>
@ -382,7 +375,6 @@ a single large object, or a single array of small objects.
blocks, but we don't need to worry about that.) blocks, but we don't need to worry about that.)
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">memory_frame</span><span class="plain"> *</span><span class="identifier">first_memory_frame</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">; </span><span class="comment">earliest memory frame ever allocated</span> <span class="reserved">memory_frame</span><span class="plain"> *</span><span class="identifier">first_memory_frame</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">; </span><span class="comment">earliest memory frame ever allocated</span>
<span class="reserved">memory_frame</span><span class="plain"> *</span><span class="identifier">last_memory_frame</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">; </span><span class="comment">most recent memory frame allocated</span> <span class="reserved">memory_frame</span><span class="plain"> *</span><span class="identifier">last_memory_frame</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">; </span><span class="comment">most recent memory frame allocated</span>
@ -398,7 +390,6 @@ memory usage, we would implicitly have an O(n^2) running time in the
amount of storage n allocated. amount of storage n allocated.
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">calls_to_cmi</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span> <span class="reserved">int</span><span class="plain"> </span><span class="identifier">calls_to_cmi</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Memory::check_memory_integrity</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span> <span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Memory::check_memory_integrity</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
@ -436,7 +427,6 @@ list is checked for integrity; but we not seen how it is built. Every
memory frame is created by the following function: memory frame is created by the following function:
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">void</span><span class="plain"> *</span><span class="functiontext">Memory::allocate</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">mem_type</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">extent</span><span class="plain">) {</span> <span class="reserved">void</span><span class="plain"> *</span><span class="functiontext">Memory::allocate</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">mem_type</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">extent</span><span class="plain">) {</span>
<span class="identifier">CREATE_MUTEX</span><span class="plain">(</span><span class="identifier">mutex</span><span class="plain">);</span> <span class="identifier">CREATE_MUTEX</span><span class="plain">(</span><span class="identifier">mutex</span><span class="plain">);</span>
@ -720,7 +710,6 @@ used in the lower levels.
<p class="inwebparagraph">Here goes, then. <p class="inwebparagraph">Here goes, then.
</p> </p>
<pre class="display"> <pre class="display">
<span class="identifier">ALLOCATE_INDIVIDUALLY</span><span class="plain">(</span><span class="reserved">filename</span><span class="plain">)</span> <span class="identifier">ALLOCATE_INDIVIDUALLY</span><span class="plain">(</span><span class="reserved">filename</span><span class="plain">)</span>
<span class="identifier">ALLOCATE_INDIVIDUALLY</span><span class="plain">(</span><span class="reserved">pathname</span><span class="plain">)</span> <span class="identifier">ALLOCATE_INDIVIDUALLY</span><span class="plain">(</span><span class="reserved">pathname</span><span class="plain">)</span>
@ -789,7 +778,6 @@ we need to use the equivalent of traditional <code class="display"><span class="
<p class="inwebparagraph"><a id="SP23"></a><b>&#167;23. </b>And here is the (very simple) implementation. <p class="inwebparagraph"><a id="SP23"></a><b>&#167;23. </b>And here is the (very simple) implementation.
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">char</span><span class="plain"> *</span><span class="identifier">memory_needs</span><span class="plain">[</span><span class="identifier">NO_DEFINED_MREASON_VALUES</span><span class="plain">];</span> <span class="reserved">char</span><span class="plain"> *</span><span class="identifier">memory_needs</span><span class="plain">[</span><span class="identifier">NO_DEFINED_MREASON_VALUES</span><span class="plain">];</span>
@ -818,7 +806,6 @@ therefore the best estimate of how well we're doing is the "maximum memory
claimed" &mdash; the highest recorded net usage count over the run. claimed" &mdash; the highest recorded net usage count over the run.
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">max_memory_at_once_for_each_need</span><span class="plain">[</span><span class="identifier">NO_DEFINED_MREASON_VALUES</span><span class="plain">],</span> <span class="reserved">int</span><span class="plain"> </span><span class="identifier">max_memory_at_once_for_each_need</span><span class="plain">[</span><span class="identifier">NO_DEFINED_MREASON_VALUES</span><span class="plain">],</span>
<span class="identifier">memory_claimed_for_each_need</span><span class="plain">[</span><span class="identifier">NO_DEFINED_MREASON_VALUES</span><span class="plain">],</span> <span class="identifier">memory_claimed_for_each_need</span><span class="plain">[</span><span class="identifier">NO_DEFINED_MREASON_VALUES</span><span class="plain">],</span>
@ -835,7 +822,6 @@ exit on any such failure, so that the caller can be certain that the return
values of these functions are always non-<code class="display"><span class="extract">NULL</span></code> pointers. values of these functions are always non-<code class="display"><span class="extract">NULL</span></code> pointers.
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">void</span><span class="plain"> *</span><span class="functiontext">Memory::I7_calloc</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">how_many</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">size_in_bytes</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">reason</span><span class="plain">) {</span> <span class="reserved">void</span><span class="plain"> *</span><span class="functiontext">Memory::I7_calloc</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">how_many</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">size_in_bytes</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">reason</span><span class="plain">) {</span>
<span class="reserved">return</span><span class="plain"> </span><span class="functiontext">Memory::I7_alloc</span><span class="plain">(</span><span class="identifier">how_many</span><span class="plain">, </span><span class="identifier">size_in_bytes</span><span class="plain">, </span><span class="identifier">reason</span><span class="plain">);</span> <span class="reserved">return</span><span class="plain"> </span><span class="functiontext">Memory::I7_alloc</span><span class="plain">(</span><span class="identifier">how_many</span><span class="plain">, </span><span class="identifier">size_in_bytes</span><span class="plain">, </span><span class="identifier">reason</span><span class="plain">);</span>
@ -854,7 +840,6 @@ values of these functions are always non-<code class="display"><span class="extr
<p class="inwebparagraph"><a id="SP26"></a><b>&#167;26. </b>And this, then, is the joint routine implementing both. <p class="inwebparagraph"><a id="SP26"></a><b>&#167;26. </b>And this, then, is the joint routine implementing both.
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">void</span><span class="plain"> *</span><span class="functiontext">Memory::I7_alloc</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">N</span><span class="plain">, </span><span class="reserved">int</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">R</span><span class="plain">) {</span> <span class="reserved">void</span><span class="plain"> *</span><span class="functiontext">Memory::I7_alloc</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">N</span><span class="plain">, </span><span class="reserved">int</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">R</span><span class="plain">) {</span>
<span class="identifier">CREATE_MUTEX</span><span class="plain">(</span><span class="identifier">mutex</span><span class="plain">);</span> <span class="identifier">CREATE_MUTEX</span><span class="plain">(</span><span class="identifier">mutex</span><span class="plain">);</span>
@ -946,7 +931,6 @@ rarely and to allocate large blocks of memory.
<p class="inwebparagraph"><a id="SP27"></a><b>&#167;27. </b>We also provide our own wrapper for <code class="display"><span class="extract">free</span></code>: <p class="inwebparagraph"><a id="SP27"></a><b>&#167;27. </b>We also provide our own wrapper for <code class="display"><span class="extract">free</span></code>:
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Memory::I7_free</span><span class="plain">(</span><span class="reserved">void</span><span class="plain"> *</span><span class="identifier">pointer</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">R</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">bytes_freed</span><span class="plain">) {</span> <span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Memory::I7_free</span><span class="plain">(</span><span class="reserved">void</span><span class="plain"> *</span><span class="identifier">pointer</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">R</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">bytes_freed</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">R</span><span class="plain"> &lt; </span><span class="constant">0</span><span class="plain">) || (</span><span class="identifier">R</span><span class="plain"> &gt;= </span><span class="identifier">NO_DEFINED_MREASON_VALUES</span><span class="plain">)) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"no such memory reason"</span><span class="plain">);</span> <span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">R</span><span class="plain"> &lt; </span><span class="constant">0</span><span class="plain">) || (</span><span class="identifier">R</span><span class="plain"> &gt;= </span><span class="identifier">NO_DEFINED_MREASON_VALUES</span><span class="plain">)) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"no such memory reason"</span><span class="plain">);</span>
@ -996,7 +980,6 @@ safe in memory. Since the length can't be extended, it's usually unsafe
to write to the result. to write to the result.
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">char</span><span class="plain"> *</span><span class="functiontext">Memory::new_string</span><span class="plain">(</span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">from</span><span class="plain">) {</span> <span class="reserved">char</span><span class="plain"> *</span><span class="functiontext">Memory::new_string</span><span class="plain">(</span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">from</span><span class="plain">) {</span>
<span class="identifier">CREATE_MUTEX</span><span class="plain">(</span><span class="identifier">mutex</span><span class="plain">);</span> <span class="identifier">CREATE_MUTEX</span><span class="plain">(</span><span class="identifier">mutex</span><span class="plain">);</span>
@ -1023,7 +1006,6 @@ to write to the result.
<p class="inwebparagraph"><a id="SP30"></a><b>&#167;30. </b>And here we free any SSAs needed in the course of the run. <p class="inwebparagraph"><a id="SP30"></a><b>&#167;30. </b>And here we free any SSAs needed in the course of the run.
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Memory::free_ssas</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span> <span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Memory::free_ssas</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="reserved">string_storage_area</span><span class="plain"> *</span><span class="identifier">ssa</span><span class="plain">;</span> <span class="reserved">string_storage_area</span><span class="plain"> *</span><span class="identifier">ssa</span><span class="plain">;</span>
@ -1040,7 +1022,6 @@ to write to the result.
report in the debugging log (for which, see below). report in the debugging log (for which, see below).
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Memory::log_usage</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">total</span><span class="plain">) {</span> <span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Memory::log_usage</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">total</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">total_claimed_simply</span><span class="plain"> == </span><span class="constant">0</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="constant">0</span><span class="plain">;</span> <span class="reserved">if</span><span class="plain"> (</span><span class="identifier">total_claimed_simply</span><span class="plain"> == </span><span class="constant">0</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="constant">0</span><span class="plain">;</span>
@ -1065,7 +1046,6 @@ report in the debugging log (for which, see below).
<p class="inwebparagraph"><a id="SP32"></a><b>&#167;32. Memory usage report. </b>A small utility routine to help keep track of our unquestioned profligacy. <p class="inwebparagraph"><a id="SP32"></a><b>&#167;32. Memory usage report. </b>A small utility routine to help keep track of our unquestioned profligacy.
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Memory::log_statistics</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span> <span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Memory::log_statistics</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">total_for_objects</span><span class="plain"> = </span><span class="constant">MEMORY_GRANULARITY</span><span class="plain">*</span><span class="identifier">no_blocks_allocated</span><span class="plain">; </span><span class="comment">usage in bytes</span> <span class="reserved">int</span><span class="plain"> </span><span class="identifier">total_for_objects</span><span class="plain"> = </span><span class="constant">MEMORY_GRANULARITY</span><span class="plain">*</span><span class="identifier">no_blocks_allocated</span><span class="plain">; </span><span class="comment">usage in bytes</span>
@ -1177,7 +1157,6 @@ order of total number of bytes allocated.
<p class="inwebparagraph"><a id="SP33"></a><b>&#167;33. </b></p> <p class="inwebparagraph"><a id="SP33"></a><b>&#167;33. </b></p>
<pre class="display"> <pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Memory::compare_usage</span><span class="plain">(</span><span class="reserved">const</span><span class="plain"> </span><span class="reserved">void</span><span class="plain"> *</span><span class="identifier">ent1</span><span class="plain">, </span><span class="reserved">const</span><span class="plain"> </span><span class="reserved">void</span><span class="plain"> *</span><span class="identifier">ent2</span><span class="plain">) {</span> <span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Memory::compare_usage</span><span class="plain">(</span><span class="reserved">const</span><span class="plain"> </span><span class="reserved">void</span><span class="plain"> *</span><span class="identifier">ent1</span><span class="plain">, </span><span class="reserved">const</span><span class="plain"> </span><span class="reserved">void</span><span class="plain"> *</span><span class="identifier">ent2</span><span class="plain">) {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">ix1</span><span class="plain"> = *((</span><span class="reserved">const</span><span class="plain"> </span><span class="reserved">int</span><span class="plain"> *) </span><span class="identifier">ent1</span><span class="plain">);</span> <span class="reserved">int</span><span class="plain"> </span><span class="identifier">ix1</span><span class="plain"> = *((</span><span class="reserved">const</span><span class="plain"> </span><span class="reserved">int</span><span class="plain"> *) </span><span class="identifier">ent1</span><span class="plain">);</span>
@ -1194,7 +1173,6 @@ order of total number of bytes allocated.
usage. Recall that <code class="display"><span class="extract">bytes</span></code> is measured in bytes, but <code class="display"><span class="extract">total</span></code> in kilobytes. usage. Recall that <code class="display"><span class="extract">bytes</span></code> is measured in bytes, but <code class="display"><span class="extract">total</span></code> in kilobytes.
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Memory::proportion</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">bytes</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">total</span><span class="plain">) {</span> <span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Memory::proportion</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">bytes</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">total</span><span class="plain">) {</span>
<span class="reserved">float</span><span class="plain"> </span><span class="identifier">B</span><span class="plain"> = (</span><span class="reserved">float</span><span class="plain">) </span><span class="identifier">bytes</span><span class="plain">, </span><span class="identifier">T</span><span class="plain"> = (</span><span class="reserved">float</span><span class="plain">) </span><span class="identifier">total</span><span class="plain">;</span> <span class="reserved">float</span><span class="plain"> </span><span class="identifier">B</span><span class="plain"> = (</span><span class="reserved">float</span><span class="plain">) </span><span class="identifier">bytes</span><span class="plain">, </span><span class="identifier">T</span><span class="plain"> = (</span><span class="reserved">float</span><span class="plain">) </span><span class="identifier">total</span><span class="plain">;</span>
@ -1209,7 +1187,6 @@ usage. Recall that <code class="display"><span class="extract">bytes</span></cod
<p class="inwebparagraph"><a id="SP35"></a><b>&#167;35. </b></p> <p class="inwebparagraph"><a id="SP35"></a><b>&#167;35. </b></p>
<pre class="display"> <pre class="display">
<span class="reserved">void</span><span class="plain"> *</span><span class="functiontext">Memory::paranoid_calloc</span><span class="plain">(</span><span class="identifier">size_t</span><span class="plain"> </span><span class="identifier">N</span><span class="plain">, </span><span class="identifier">size_t</span><span class="plain"> </span><span class="identifier">S</span><span class="plain">) {</span> <span class="reserved">void</span><span class="plain"> *</span><span class="functiontext">Memory::paranoid_calloc</span><span class="plain">(</span><span class="identifier">size_t</span><span class="plain"> </span><span class="identifier">N</span><span class="plain">, </span><span class="identifier">size_t</span><span class="plain"> </span><span class="identifier">S</span><span class="plain">) {</span>
<span class="identifier">CREATE_MUTEX</span><span class="plain">(</span><span class="identifier">mutex</span><span class="plain">);</span> <span class="identifier">CREATE_MUTEX</span><span class="plain">(</span><span class="identifier">mutex</span><span class="plain">);</span>
@ -1329,7 +1306,6 @@ which is other than <code class="display"><span class="extract">void *</span></c
allocated objects above; so that leaves only humble <code class="display"><span class="extract">char *</span></code> pointers: allocated objects above; so that leaves only humble <code class="display"><span class="extract">char *</span></code> pointers:
</p> </p>
<pre class="display"> <pre class="display">
<span class="identifier">MAKE_REFERENCE_ROUTINES</span><span class="plain">(</span><span class="reserved">char</span><span class="plain">, </span><span class="constant">1000</span><span class="plain">)</span> <span class="identifier">MAKE_REFERENCE_ROUTINES</span><span class="plain">(</span><span class="reserved">char</span><span class="plain">, </span><span class="constant">1000</span><span class="plain">)</span>
</pre> </pre>

View file

@ -64,7 +64,6 @@ tagged functions attached to it dynamically: those, we'll call "methods".
<p class="inwebparagraph"><a id="SP3"></a><b>&#167;3. </b>A "method set" is simply a linked list of methods: <p class="inwebparagraph"><a id="SP3"></a><b>&#167;3. </b>A "method set" is simply a linked list of methods:
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">method_set</span><span class="plain"> {</span> <span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">method_set</span><span class="plain"> {</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">method</span><span class="plain"> *</span><span class="identifier">first_method</span><span class="plain">;</span> <span class="reserved">struct</span><span class="plain"> </span><span class="reserved">method</span><span class="plain"> *</span><span class="identifier">first_method</span><span class="plain">;</span>
@ -181,7 +180,6 @@ attach it to an object with a method set, using the <code class="display"><span
<p class="inwebparagraph"></p> <p class="inwebparagraph"></p>
<pre class="display"> <pre class="display">
<span class="plain">IMETHOD_CALL(some_object, UNUSED_METHOD_ID_MTID, I"Hello", 17)</span> <span class="plain">IMETHOD_CALL(some_object, UNUSED_METHOD_ID_MTID, I"Hello", 17)</span>
</pre> </pre>

View file

@ -87,7 +87,6 @@ formatted text to the current stream, which could be either a string or a
file. <code class="display"><span class="extract">PRINT</span></code> does the same but to <code class="display"><span class="extract">STDOUT</span></code>, and is thus essentially <code class="display"><span class="extract">printf</span></code>. file. <code class="display"><span class="extract">PRINT</span></code> does the same but to <code class="display"><span class="extract">STDOUT</span></code>, and is thus essentially <code class="display"><span class="extract">printf</span></code>.
</p> </p>
<pre class="display"> <pre class="display">
<span class="plain">#</span><span class="identifier">define</span><span class="plain"> </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="identifier">args</span><span class="plain">...) </span><span class="functiontext">Writers::printf</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">args</span><span class="plain">)</span> <span class="plain">#</span><span class="identifier">define</span><span class="plain"> </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="identifier">args</span><span class="plain">...) </span><span class="functiontext">Writers::printf</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">args</span><span class="plain">)</span>
@ -339,7 +338,6 @@ so out of the <code class="display"><span class="extract">chars_capacity</span><
<p class="inwebparagraph"><a id="SP18"></a><b>&#167;18. </b>A statistic we keep, since it costs little: <p class="inwebparagraph"><a id="SP18"></a><b>&#167;18. </b>A statistic we keep, since it costs little:
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">total_file_writes</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">; </span><span class="comment">number of text files opened for writing during the run</span> <span class="reserved">int</span><span class="plain"> </span><span class="identifier">total_file_writes</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">; </span><span class="comment">number of text files opened for writing during the run</span>
</pre> </pre>
@ -358,7 +356,6 @@ grow is the debugging file, and if it should reach 2 GB then it deserves to be
truncated and we will shed no tears. truncated and we will shed no tears.
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Streams::initialise</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">stream</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">from</span><span class="plain">) {</span> <span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Streams::initialise</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">stream</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">from</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">stream</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"tried to initialise NULL stream"</span><span class="plain">);</span> <span class="reserved">if</span><span class="plain"> (</span><span class="identifier">stream</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"tried to initialise NULL stream"</span><span class="plain">);</span>
@ -383,7 +380,6 @@ angle brackets, will be used automatically on writing. By default this flag
is clear, that is, no conversion is made. is clear, that is, no conversion is made.
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Streams::enable_XML_escapes</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">stream</span><span class="plain">) {</span> <span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Streams::enable_XML_escapes</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">stream</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">stream</span><span class="plain">) </span><span class="identifier">stream</span><span class="plain">-&gt;</span><span class="element">stream_flags</span><span class="plain"> |= </span><span class="constant">USES_XML_ESCAPES_STRF</span><span class="plain">;</span> <span class="reserved">if</span><span class="plain"> (</span><span class="identifier">stream</span><span class="plain">) </span><span class="identifier">stream</span><span class="plain">-&gt;</span><span class="element">stream_flags</span><span class="plain"> |= </span><span class="constant">USES_XML_ESCAPES_STRF</span><span class="plain">;</span>
@ -456,7 +452,6 @@ is clear, that is, no conversion is made.
<p class="inwebparagraph"><a id="SP21"></a><b>&#167;21. Logging. </b></p> <p class="inwebparagraph"><a id="SP21"></a><b>&#167;21. Logging. </b></p>
<pre class="display"> <pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Streams::log</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">void</span><span class="plain"> *</span><span class="identifier">vS</span><span class="plain">) {</span> <span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Streams::log</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">void</span><span class="plain"> *</span><span class="identifier">vS</span><span class="plain">) {</span>
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">stream</span><span class="plain"> = (</span><span class="reserved">text_stream</span><span class="plain"> *) </span><span class="identifier">vS</span><span class="plain">;</span> <span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">stream</span><span class="plain"> = (</span><span class="reserved">text_stream</span><span class="plain"> *) </span><span class="identifier">vS</span><span class="plain">;</span>
@ -484,7 +479,6 @@ is clear, that is, no conversion is made.
and returns a <code class="display"><span class="extract">text_stream *</span></code> pointer to it; subsequent calls just return this wrapper. and returns a <code class="display"><span class="extract">text_stream *</span></code> pointer to it; subsequent calls just return this wrapper.
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">text_stream</span><span class="plain"> </span><span class="identifier">STDOUT_struct</span><span class="plain">; </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">stdout_wrapper_initialised</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span> <span class="reserved">text_stream</span><span class="plain"> </span><span class="identifier">STDOUT_struct</span><span class="plain">; </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">stdout_wrapper_initialised</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="functiontext">Streams::get_stdout</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span> <span class="reserved">text_stream</span><span class="plain"> *</span><span class="functiontext">Streams::get_stdout</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
@ -509,7 +503,6 @@ and returns a <code class="display"><span class="extract">text_stream *</span></
<p class="inwebparagraph"><a id="SP23"></a><b>&#167;23. </b>And similarly for the standard error file. <p class="inwebparagraph"><a id="SP23"></a><b>&#167;23. </b>And similarly for the standard error file.
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">text_stream</span><span class="plain"> </span><span class="identifier">STDERR_struct</span><span class="plain">; </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">stderr_wrapper_initialised</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span> <span class="reserved">text_stream</span><span class="plain"> </span><span class="identifier">STDERR_struct</span><span class="plain">; </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">stderr_wrapper_initialised</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="functiontext">Streams::get_stderr</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span> <span class="reserved">text_stream</span><span class="plain"> *</span><span class="functiontext">Streams::get_stderr</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
@ -535,7 +528,6 @@ and returns a <code class="display"><span class="extract">text_stream *</span></
so we return <code class="display"><span class="extract">TRUE</span></code> if and only if successful. so we return <code class="display"><span class="extract">TRUE</span></code> if and only if successful.
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Streams::open_to_file</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">stream</span><span class="plain">, </span><span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">name</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">encoding</span><span class="plain">) {</span> <span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Streams::open_to_file</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">stream</span><span class="plain">, </span><span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">name</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">encoding</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">stream</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"tried to open NULL stream"</span><span class="plain">);</span> <span class="reserved">if</span><span class="plain"> (</span><span class="identifier">stream</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"tried to open NULL stream"</span><span class="plain">);</span>
@ -561,7 +553,6 @@ so we return <code class="display"><span class="extract">TRUE</span></code> if a
<p class="inwebparagraph"><a id="SP25"></a><b>&#167;25. </b>Similarly for appending: <p class="inwebparagraph"><a id="SP25"></a><b>&#167;25. </b>Similarly for appending:
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Streams::open_to_file_append</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">stream</span><span class="plain">, </span><span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">name</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">encoding</span><span class="plain">) {</span> <span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Streams::open_to_file_append</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">stream</span><span class="plain">, </span><span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">name</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">encoding</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">stream</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"tried to open NULL stream"</span><span class="plain">);</span> <span class="reserved">if</span><span class="plain"> (</span><span class="identifier">stream</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"tried to open NULL stream"</span><span class="plain">);</span>
@ -588,7 +579,6 @@ the text of the stream; this too can fail for host platform reasons, so again
we return a success code. we return a success code.
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Streams::open_to_memory</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">stream</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">capacity</span><span class="plain">) {</span> <span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Streams::open_to_memory</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">stream</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">capacity</span><span class="plain">) {</span>
<span class="identifier">CREATE_MUTEX</span><span class="plain">(</span><span class="identifier">mutex</span><span class="plain">);</span> <span class="identifier">CREATE_MUTEX</span><span class="plain">(</span><span class="identifier">mutex</span><span class="plain">);</span>
@ -614,7 +604,6 @@ we return a success code.
If called validly, this cannot fail. If called validly, this cannot fail.
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">text_stream</span><span class="plain"> </span><span class="functiontext">Streams::new_buffer</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">capacity</span><span class="plain">, </span><span class="identifier">wchar_t</span><span class="plain"> *</span><span class="identifier">at</span><span class="plain">) {</span> <span class="reserved">text_stream</span><span class="plain"> </span><span class="functiontext">Streams::new_buffer</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">capacity</span><span class="plain">, </span><span class="identifier">wchar_t</span><span class="plain"> *</span><span class="identifier">at</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">at</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"tried to make stream wrapper for NULL string"</span><span class="plain">);</span> <span class="reserved">if</span><span class="plain"> (</span><span class="identifier">at</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"tried to make stream wrapper for NULL string"</span><span class="plain">);</span>
@ -638,7 +627,6 @@ by a C string. First, a wide string (a sequence of 32-bit Unicode code
points, null terminated): points, null terminated):
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Streams::open_from_wide_string</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">stream</span><span class="plain">, </span><span class="identifier">wchar_t</span><span class="plain"> *</span><span class="identifier">c_string</span><span class="plain">) {</span> <span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Streams::open_from_wide_string</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">stream</span><span class="plain">, </span><span class="identifier">wchar_t</span><span class="plain"> *</span><span class="identifier">c_string</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">stream</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"tried to open NULL stream"</span><span class="plain">);</span> <span class="reserved">if</span><span class="plain"> (</span><span class="identifier">stream</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"tried to open NULL stream"</span><span class="plain">);</span>
@ -663,7 +651,6 @@ points, null terminated):
page of the Unicode set, null terminated): page of the Unicode set, null terminated):
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Streams::open_from_ISO_string</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">stream</span><span class="plain">, </span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">c_string</span><span class="plain">) {</span> <span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Streams::open_from_ISO_string</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">stream</span><span class="plain">, </span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">c_string</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">stream</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"tried to open NULL stream"</span><span class="plain">);</span> <span class="reserved">if</span><span class="plain"> (</span><span class="identifier">stream</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"tried to open NULL stream"</span><span class="plain">);</span>
@ -687,7 +674,6 @@ page of the Unicode set, null terminated):
<p class="inwebparagraph"><a id="SP28_2"></a><b>&#167;28.2. </b>Finally, a UTF-8 encoded C string: <p class="inwebparagraph"><a id="SP28_2"></a><b>&#167;28.2. </b>Finally, a UTF-8 encoded C string:
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Streams::open_from_UTF8_string</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">stream</span><span class="plain">, </span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">c_string</span><span class="plain">) {</span> <span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Streams::open_from_UTF8_string</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">stream</span><span class="plain">, </span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">c_string</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">stream</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"tried to open NULL stream"</span><span class="plain">);</span> <span class="reserved">if</span><span class="plain"> (</span><span class="identifier">stream</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"tried to open NULL stream"</span><span class="plain">);</span>
@ -734,7 +720,6 @@ page of the Unicode set, null terminated):
<p class="inwebparagraph"><a id="SP29"></a><b>&#167;29. Converting to C strings. </b>Now for the converse problem. <p class="inwebparagraph"><a id="SP29"></a><b>&#167;29. Converting to C strings. </b>Now for the converse problem.
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Streams::write_as_wide_string</span><span class="plain">(</span><span class="identifier">wchar_t</span><span class="plain"> *</span><span class="identifier">C_string</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">stream</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">buffer_size</span><span class="plain">) {</span> <span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Streams::write_as_wide_string</span><span class="plain">(</span><span class="identifier">wchar_t</span><span class="plain"> *</span><span class="identifier">C_string</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">stream</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">buffer_size</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">buffer_size</span><span class="plain"> == </span><span class="constant">0</span><span class="plain">) </span><span class="reserved">return</span><span class="plain">;</span> <span class="reserved">if</span><span class="plain"> (</span><span class="identifier">buffer_size</span><span class="plain"> == </span><span class="constant">0</span><span class="plain">) </span><span class="reserved">return</span><span class="plain">;</span>
@ -760,7 +745,6 @@ page of the Unicode set, null terminated):
ISO string: ISO string:
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Streams::write_as_ISO_string</span><span class="plain">(</span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">C_string</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">stream</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">buffer_size</span><span class="plain">) {</span> <span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Streams::write_as_ISO_string</span><span class="plain">(</span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">C_string</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">stream</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">buffer_size</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">buffer_size</span><span class="plain"> == </span><span class="constant">0</span><span class="plain">) </span><span class="reserved">return</span><span class="plain">;</span> <span class="reserved">if</span><span class="plain"> (</span><span class="identifier">buffer_size</span><span class="plain"> == </span><span class="constant">0</span><span class="plain">) </span><span class="reserved">return</span><span class="plain">;</span>
@ -785,7 +769,6 @@ ISO string:
<p class="inwebparagraph"><a id="SP31"></a><b>&#167;31. </b></p> <p class="inwebparagraph"><a id="SP31"></a><b>&#167;31. </b></p>
<pre class="display"> <pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Streams::write_as_UTF8_string</span><span class="plain">(</span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">C_string</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">stream</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">buffer_size</span><span class="plain">) {</span> <span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Streams::write_as_UTF8_string</span><span class="plain">(</span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">C_string</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">stream</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">buffer_size</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">buffer_size</span><span class="plain"> == </span><span class="constant">0</span><span class="plain">) </span><span class="reserved">return</span><span class="plain">;</span> <span class="reserved">if</span><span class="plain"> (</span><span class="identifier">buffer_size</span><span class="plain"> == </span><span class="constant">0</span><span class="plain">) </span><span class="reserved">return</span><span class="plain">;</span>
@ -822,7 +805,6 @@ ISO string:
<p class="inwebparagraph"><a id="SP32"></a><b>&#167;32. Locale versions. </b></p> <p class="inwebparagraph"><a id="SP32"></a><b>&#167;32. Locale versions. </b></p>
<pre class="display"> <pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Streams::open_from_locale_string</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">stream</span><span class="plain">, </span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">C_string</span><span class="plain">) {</span> <span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Streams::open_from_locale_string</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">stream</span><span class="plain">, </span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">C_string</span><span class="plain">) {</span>
<span class="plain">#</span><span class="identifier">ifdef</span><span class="plain"> </span><span class="identifier">LOCALE_IS_UTF8</span> <span class="plain">#</span><span class="identifier">ifdef</span><span class="plain"> </span><span class="identifier">LOCALE_IS_UTF8</span>
@ -864,7 +846,6 @@ ISO string:
<code class="display"><span class="extract">NULL</span></code>: <code class="display"><span class="extract">NULL</span></code>:
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Streams::flush</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">stream</span><span class="plain">) {</span> <span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Streams::flush</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">stream</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">stream</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="reserved">return</span><span class="plain">;</span> <span class="reserved">if</span><span class="plain"> (</span><span class="identifier">stream</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="reserved">return</span><span class="plain">;</span>
@ -879,7 +860,6 @@ ISO string:
<p class="inwebparagraph"><a id="SP34"></a><b>&#167;34. </b>But closing is not allowed for <code class="display"><span class="extract">NULL</span></code> or the standard I/O wrappers: <p class="inwebparagraph"><a id="SP34"></a><b>&#167;34. </b>But closing is not allowed for <code class="display"><span class="extract">NULL</span></code> or the standard I/O wrappers:
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Streams::close</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">stream</span><span class="plain">) {</span> <span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Streams::close</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">stream</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">stream</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"tried to close NULL stream"</span><span class="plain">);</span> <span class="reserved">if</span><span class="plain"> (</span><span class="identifier">stream</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"tried to close NULL stream"</span><span class="plain">);</span>
@ -962,7 +942,6 @@ how continuations are made, below.
<p class="inwebparagraph"><a id="SP35"></a><b>&#167;35. Writing. </b>Our equivalent of <code class="display"><span class="extract">fputc</span></code> reads: <p class="inwebparagraph"><a id="SP35"></a><b>&#167;35. Writing. </b>Our equivalent of <code class="display"><span class="extract">fputc</span></code> reads:
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Streams::putc</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">c_int</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">stream</span><span class="plain">) {</span> <span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Streams::putc</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">c_int</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">stream</span><span class="plain">) {</span>
<span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">c</span><span class="plain">;</span> <span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">c</span><span class="plain">;</span>
@ -1100,7 +1079,6 @@ hold any escape sequence when opened.
<p class="inwebparagraph"><a id="SP36"></a><b>&#167;36. </b>Literal printing is just printing with XML escapes switched off: <p class="inwebparagraph"><a id="SP36"></a><b>&#167;36. </b>Literal printing is just printing with XML escapes switched off:
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Streams::literal</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">stream</span><span class="plain">, </span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">p</span><span class="plain">) {</span> <span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Streams::literal</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">stream</span><span class="plain">, </span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">p</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">stream</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="reserved">return</span><span class="plain">;</span> <span class="reserved">if</span><span class="plain"> (</span><span class="identifier">stream</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="reserved">return</span><span class="plain">;</span>
@ -1121,7 +1099,6 @@ problem messages and then leave what they're doing incomplete, so we will
be a little cautious about assuming that a mismatch means an error. be a little cautious about assuming that a mismatch means an error.
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Streams::indent</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">stream</span><span class="plain">) {</span> <span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Streams::indent</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">stream</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">stream</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="reserved">return</span><span class="plain">;</span> <span class="reserved">if</span><span class="plain"> (</span><span class="identifier">stream</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="reserved">return</span><span class="plain">;</span>
@ -1161,7 +1138,6 @@ how much is written to <code class="display"><span class="extract">NULL</span></
field. field.
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Streams::get_position</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">stream</span><span class="plain">) {</span> <span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Streams::get_position</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">stream</span><span class="plain">) {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">t</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span> <span class="reserved">int</span><span class="plain"> </span><span class="identifier">t</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
@ -1181,7 +1157,6 @@ field.
no point, since it is used only in concert with backspacing. no point, since it is used only in concert with backspacing.
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Streams::latest</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">stream</span><span class="plain">) {</span> <span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Streams::latest</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">stream</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">stream</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="constant">0</span><span class="plain">;</span> <span class="reserved">if</span><span class="plain"> (</span><span class="identifier">stream</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="constant">0</span><span class="plain">;</span>
@ -1204,7 +1179,6 @@ no point, since it is used only in concert with backspacing.
zero byte found, so that putting a zero truncates it. zero byte found, so that putting a zero truncates it.
</p> </p>
<pre class="display"> <pre class="display">
<span class="identifier">wchar_t</span><span class="plain"> </span><span class="functiontext">Streams::get_char_at_index</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">stream</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">position</span><span class="plain">) {</span> <span class="identifier">wchar_t</span><span class="plain"> </span><span class="functiontext">Streams::get_char_at_index</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">stream</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">position</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">stream</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"examining null stream"</span><span class="plain">);</span> <span class="reserved">if</span><span class="plain"> (</span><span class="identifier">stream</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"examining null stream"</span><span class="plain">);</span>
@ -1251,7 +1225,6 @@ such continuation blocks (which would be inefficient if we immediately had
to open similar ones again). to open similar ones again).
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Streams::set_position</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">stream</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">position</span><span class="plain">) {</span> <span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Streams::set_position</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">stream</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">position</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">stream</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="reserved">return</span><span class="plain">;</span> <span class="reserved">if</span><span class="plain"> (</span><span class="identifier">stream</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="reserved">return</span><span class="plain">;</span>
@ -1282,7 +1255,6 @@ to open similar ones again).
<code class="display"><span class="extract">NULL</span></code>) but <code class="display"><span class="extract">to</span></code> can be anything (including <code class="display"><span class="extract">NULL</span></code>). <code class="display"><span class="extract">NULL</span></code>) but <code class="display"><span class="extract">to</span></code> can be anything (including <code class="display"><span class="extract">NULL</span></code>).
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Streams::copy</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">to</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">from</span><span class="plain">) {</span> <span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Streams::copy</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">to</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">from</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">from</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) || (</span><span class="identifier">to</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain">;</span> <span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">from</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) || (</span><span class="identifier">to</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain">;</span>
@ -1304,7 +1276,6 @@ to open similar ones again).
<p class="inwebparagraph"><a id="SP43"></a><b>&#167;43. Writer. </b>This writes one stream into another one, which implements <code class="display"><span class="extract">%S</span></code>. <p class="inwebparagraph"><a id="SP43"></a><b>&#167;43. Writer. </b>This writes one stream into another one, which implements <code class="display"><span class="extract">%S</span></code>.
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Streams::writer</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">format_string</span><span class="plain">, </span><span class="reserved">void</span><span class="plain"> *</span><span class="identifier">vS</span><span class="plain">) {</span> <span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Streams::writer</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">format_string</span><span class="plain">, </span><span class="reserved">void</span><span class="plain"> *</span><span class="identifier">vS</span><span class="plain">) {</span>
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">S</span><span class="plain"> = (</span><span class="reserved">text_stream</span><span class="plain"> *) </span><span class="identifier">vS</span><span class="plain">;</span> <span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">S</span><span class="plain"> = (</span><span class="reserved">text_stream</span><span class="plain"> *) </span><span class="identifier">vS</span><span class="plain">;</span>

View file

@ -64,7 +64,6 @@ so we have to do everything three times. (And then we have to do all that twice,
because the loggers don't use format strings.) because the loggers don't use format strings.)
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">escapes_registered</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span> <span class="reserved">int</span><span class="plain"> </span><span class="identifier">escapes_registered</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">escapes_category</span><span class="plain">[2][128]; </span><span class="comment">one of the <code class="display"><span class="extract">*_ECAT</span></code> values above</span> <span class="reserved">int</span><span class="plain"> </span><span class="identifier">escapes_category</span><span class="plain">[2][128]; </span><span class="comment">one of the <code class="display"><span class="extract">*_ECAT</span></code> values above</span>
@ -84,7 +83,6 @@ because the loggers don't use format strings.)
<p class="inwebparagraph"><a id="SP3"></a><b>&#167;3. </b></p> <p class="inwebparagraph"><a id="SP3"></a><b>&#167;3. </b></p>
<pre class="display"> <pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Writers::log_escape_usage</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span> <span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Writers::log_escape_usage</span><span class="plain">(</span><span class="reserved">void</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">cat</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">; </span><span class="identifier">cat</span><span class="plain"> &lt; </span><span class="constant">2</span><span class="plain">; </span><span class="identifier">cat</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">cat</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">; </span><span class="identifier">cat</span><span class="plain"> &lt; </span><span class="constant">2</span><span class="plain">; </span><span class="identifier">cat</span><span class="plain">++) {</span>
@ -107,7 +105,6 @@ because the loggers don't use format strings.)
<p class="inwebparagraph"><a id="SP4"></a><b>&#167;4. </b>That gives us a number of front doors: <p class="inwebparagraph"><a id="SP4"></a><b>&#167;4. </b>That gives us a number of front doors:
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Writers::register_writer</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">esc</span><span class="plain">, </span><span class="reserved">void</span><span class="plain"> (*</span><span class="identifier">f</span><span class="plain">)(</span><span class="reserved">text_stream</span><span class="plain"> *, </span><span class="reserved">char</span><span class="plain"> *, </span><span class="reserved">void</span><span class="plain"> *)) {</span> <span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Writers::register_writer</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">esc</span><span class="plain">, </span><span class="reserved">void</span><span class="plain"> (*</span><span class="identifier">f</span><span class="plain">)(</span><span class="reserved">text_stream</span><span class="plain"> *, </span><span class="reserved">char</span><span class="plain"> *, </span><span class="reserved">void</span><span class="plain"> *)) {</span>
<span class="functiontext">Writers::register_writer_p</span><span class="plain">(0, </span><span class="identifier">esc</span><span class="plain">, (</span><span class="reserved">void</span><span class="plain"> *) </span><span class="identifier">f</span><span class="plain">, </span><span class="constant">POINTER_ECAT</span><span class="plain">);</span> <span class="functiontext">Writers::register_writer_p</span><span class="plain">(0, </span><span class="identifier">esc</span><span class="plain">, (</span><span class="reserved">void</span><span class="plain"> *) </span><span class="identifier">f</span><span class="plain">, </span><span class="constant">POINTER_ECAT</span><span class="plain">);</span>
@ -140,7 +137,6 @@ because the loggers don't use format strings.)
<p class="inwebparagraph"><a id="SP5"></a><b>&#167;5. </b>All leading to: <p class="inwebparagraph"><a id="SP5"></a><b>&#167;5. </b>All leading to:
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Writers::register_writer_p</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">set</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">esc</span><span class="plain">, </span><span class="reserved">void</span><span class="plain"> *</span><span class="identifier">f</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">cat</span><span class="plain">) {</span> <span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Writers::register_writer_p</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">set</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">esc</span><span class="plain">, </span><span class="reserved">void</span><span class="plain"> *</span><span class="identifier">f</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">cat</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">escapes_registered</span><span class="plain"> == </span><span class="constant">FALSE</span><span class="plain">) </span>&lt;<span class="cwebmacro">Initialise the table of escapes</span> <span class="cwebmacronumber">5.1</span>&gt;<span class="plain">;</span> <span class="reserved">if</span><span class="plain"> (</span><span class="identifier">escapes_registered</span><span class="plain"> == </span><span class="constant">FALSE</span><span class="plain">) </span>&lt;<span class="cwebmacro">Initialise the table of escapes</span> <span class="cwebmacronumber">5.1</span>&gt;<span class="plain">;</span>
@ -201,7 +197,6 @@ for wide strings.
waiting for: waiting for:
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Writers::printf</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">stream</span><span class="plain">, </span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">fmt</span><span class="plain">, ...) {</span> <span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Writers::printf</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">stream</span><span class="plain">, </span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">fmt</span><span class="plain">, ...) {</span>
<span class="identifier">va_list</span><span class="plain"> </span><span class="identifier">ap</span><span class="plain">; </span><span class="comment">the variable argument list signified by the dots</span> <span class="identifier">va_list</span><span class="plain"> </span><span class="identifier">ap</span><span class="plain">; </span><span class="comment">the variable argument list signified by the dots</span>

View file

@ -73,7 +73,6 @@ different casing; and then repeat within that directory for the extension
file itself. file itself.
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">FILE</span><span class="plain"> *</span><span class="functiontext">CIFilingSystem::fopen</span><span class="plain">(</span><span class="reserved">const</span><span class="plain"> </span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">path</span><span class="plain">, </span><span class="reserved">const</span><span class="plain"> </span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">mode</span><span class="plain">) {</span> <span class="reserved">FILE</span><span class="plain"> *</span><span class="functiontext">CIFilingSystem::fopen</span><span class="plain">(</span><span class="reserved">const</span><span class="plain"> </span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">path</span><span class="plain">, </span><span class="reserved">const</span><span class="plain"> </span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">mode</span><span class="plain">) {</span>
<span class="reserved">char</span><span class="plain"> *</span><span class="identifier">topdirpath</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">, *</span><span class="identifier">ciextdirpath</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">, *</span><span class="identifier">cistring</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">, *</span><span class="identifier">ciextname</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span> <span class="reserved">char</span><span class="plain"> *</span><span class="identifier">topdirpath</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">, *</span><span class="identifier">ciextdirpath</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">, *</span><span class="identifier">cistring</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">, *</span><span class="identifier">ciextname</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
@ -279,7 +278,6 @@ return from the function.
<p class="inwebparagraph"></p> <p class="inwebparagraph"></p>
<pre class="display"> <pre class="display">
<span class="plain">/Users/bobama/Library/Inform/Extensions/Hillary Clinton/Health Care.i7x</span> <span class="plain">/Users/bobama/Library/Inform/Extensions/Hillary Clinton/Health Care.i7x</span>
</pre> </pre>
@ -289,7 +287,6 @@ return from the function.
<p class="inwebparagraph"></p> <p class="inwebparagraph"></p>
<pre class="display"> <pre class="display">
<span class="plain">topdirpath| is |/Users/bobama/Library/Inform/Extensions</span> <span class="plain">topdirpath| is |/Users/bobama/Library/Inform/Extensions</span>
, and its casing is correct <span class="plain">ciextdirpath| is |Hillary Clinton</span> , and its casing is correct <span class="plain">ciextdirpath| is |Hillary Clinton</span>
@ -346,7 +343,6 @@ that many contemporary implementations of <code class="display"><span class="ext
and in any case the code above contains much larger buffers than needed.) and in any case the code above contains much larger buffers than needed.)
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">CIFilingSystem::match_in_directory</span><span class="plain">(</span><span class="reserved">void</span><span class="plain"> *</span><span class="identifier">vd</span><span class="plain">,</span> <span class="reserved">int</span><span class="plain"> </span><span class="functiontext">CIFilingSystem::match_in_directory</span><span class="plain">(</span><span class="reserved">void</span><span class="plain"> *</span><span class="identifier">vd</span><span class="plain">,</span>
<span class="reserved">char</span><span class="plain"> *</span><span class="identifier">name</span><span class="plain">, </span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">last_match</span><span class="plain">) {</span> <span class="reserved">char</span><span class="plain"> *</span><span class="identifier">name</span><span class="plain">, </span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">last_match</span><span class="plain">) {</span>
@ -372,7 +368,6 @@ and in any case the code above contains much larger buffers than needed.)
<p class="inwebparagraph"><a id="SP5"></a><b>&#167;5. Non-POSIX tail. </b>On platforms without POSIX directory handling, we revert to regular <code class="display"><span class="extract">fopen</span></code>. <p class="inwebparagraph"><a id="SP5"></a><b>&#167;5. Non-POSIX tail. </b>On platforms without POSIX directory handling, we revert to regular <code class="display"><span class="extract">fopen</span></code>.
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">FILE</span><span class="plain"> *</span><span class="functiontext">CIFilingSystem::fopen</span><span class="plain">(</span><span class="reserved">const</span><span class="plain"> </span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">path</span><span class="plain">, </span><span class="reserved">const</span><span class="plain"> </span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">mode</span><span class="plain">) {</span> <span class="reserved">FILE</span><span class="plain"> *</span><span class="functiontext">CIFilingSystem::fopen</span><span class="plain">(</span><span class="reserved">const</span><span class="plain"> </span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">path</span><span class="plain">, </span><span class="reserved">const</span><span class="plain"> </span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">mode</span><span class="plain">) {</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">fopen</span><span class="plain">(</span><span class="identifier">path</span><span class="plain">, </span><span class="identifier">mode</span><span class="plain">);</span> <span class="reserved">return</span><span class="plain"> </span><span class="identifier">fopen</span><span class="plain">(</span><span class="identifier">path</span><span class="plain">, </span><span class="identifier">mode</span><span class="plain">);</span>

View file

@ -36,7 +36,6 @@ a "bareword". For example, in
<p class="inwebparagraph"></p> <p class="inwebparagraph"></p>
<pre class="display"> <pre class="display">
<span class="plain">-log no-memory-usage -fixtime jam marmalade</span> <span class="plain">-log no-memory-usage -fixtime jam marmalade</span>
</pre> </pre>
@ -101,7 +100,6 @@ in <code class="display"><span class="extract">-help</span></code>. Groups are e
we'll hash the switch names into the following: we'll hash the switch names into the following:
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">dictionary</span><span class="plain"> *</span><span class="identifier">cls_dictionary</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span> <span class="reserved">dictionary</span><span class="plain"> *</span><span class="identifier">cls_dictionary</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
</pre> </pre>
@ -114,7 +112,6 @@ A new <code class="display"><span class="extract">*_CLSW</span></code> value sho
swtich, and then the client should call: swtich, and then the client should call:
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">current_switch_group</span><span class="plain"> = -1;</span> <span class="reserved">int</span><span class="plain"> </span><span class="identifier">current_switch_group</span><span class="plain"> = -1;</span>
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">switch_group_names</span><span class="plain">[</span><span class="identifier">NO_DEFINED_CLSG_VALUES</span><span class="plain">+1];</span> <span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">switch_group_names</span><span class="plain">[</span><span class="identifier">NO_DEFINED_CLSG_VALUES</span><span class="plain">+1];</span>
@ -193,7 +190,6 @@ section. So the sorting version of <code class="display"><span class="extract">n
<code class="display"><span class="extract">-no-destroy-world</span></code>: <code class="display"><span class="extract">-no-destroy-world</span></code>:
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">command_line_switch</span><span class="plain"> *</span><span class="functiontext">CommandLine::declare_boolean_switch</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">id</span><span class="plain">,</span> <span class="reserved">command_line_switch</span><span class="plain"> *</span><span class="functiontext">CommandLine::declare_boolean_switch</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">id</span><span class="plain">,</span>
<span class="identifier">wchar_t</span><span class="plain"> *</span><span class="identifier">name_literal</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">val</span><span class="plain">, </span><span class="identifier">wchar_t</span><span class="plain"> *</span><span class="identifier">help_literal</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">active</span><span class="plain">) {</span> <span class="identifier">wchar_t</span><span class="plain"> *</span><span class="identifier">name_literal</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">val</span><span class="plain">, </span><span class="identifier">wchar_t</span><span class="plain"> *</span><span class="identifier">help_literal</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">active</span><span class="plain">) {</span>
@ -317,7 +313,6 @@ through the file if one has by that point been provided.
holds the filename to read from. holds the filename to read from.
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">command_line_file</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span> <span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">command_line_file</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">CommandLine::also_read_file</span><span class="plain">(</span><span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">F</span><span class="plain">) {</span> <span class="reserved">void</span><span class="plain"> </span><span class="functiontext">CommandLine::also_read_file</span><span class="plain">(</span><span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">F</span><span class="plain">) {</span>
@ -335,7 +330,6 @@ might not exist as early as now, we have to record any log entries, and play
them back later (i.e., when the debugging log does exist). them back later (i.e., when the debugging log does exist).
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">linked_list</span><span class="plain"> *</span><span class="identifier">command_line_logs</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span> <span class="reserved">linked_list</span><span class="plain"> *</span><span class="identifier">command_line_logs</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">CommandLine::record_log</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">line</span><span class="plain">) {</span> <span class="reserved">void</span><span class="plain"> </span><span class="functiontext">CommandLine::record_log</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">line</span><span class="plain">) {</span>
@ -368,7 +362,6 @@ is equivalent to <code class="display"><span class="extract">-greet 'Fred Smith'
problem with internal space characters in arguments. problem with internal space characters in arguments.
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">CommandLine::read_file</span><span class="plain">(</span><span class="reserved">clf_reader_state</span><span class="plain"> *</span><span class="identifier">crs</span><span class="plain">) {</span> <span class="reserved">void</span><span class="plain"> </span><span class="functiontext">CommandLine::read_file</span><span class="plain">(</span><span class="reserved">clf_reader_state</span><span class="plain"> *</span><span class="identifier">crs</span><span class="plain">) {</span>
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">logline</span><span class="plain"> = </span><span class="functiontext">Str::new</span><span class="plain">();</span> <span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">logline</span><span class="plain"> = </span><span class="functiontext">Str::new</span><span class="plain">();</span>
@ -428,7 +421,6 @@ problem with internal space characters in arguments.
<p class="inwebparagraph"><a id="SP12"></a><b>&#167;12. </b>We also allow <code class="display"><span class="extract">-setting=X</span></code> as equivalent to <code class="display"><span class="extract">-setting X</span></code>. <p class="inwebparagraph"><a id="SP12"></a><b>&#167;12. </b>We also allow <code class="display"><span class="extract">-setting=X</span></code> as equivalent to <code class="display"><span class="extract">-setting X</span></code>.
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">CommandLine::read_pair</span><span class="plain">(</span><span class="reserved">clf_reader_state</span><span class="plain"> *</span><span class="identifier">crs</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">opt</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">arg</span><span class="plain">) {</span> <span class="reserved">int</span><span class="plain"> </span><span class="functiontext">CommandLine::read_pair</span><span class="plain">(</span><span class="reserved">clf_reader_state</span><span class="plain"> *</span><span class="identifier">crs</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">opt</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">arg</span><span class="plain">) {</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">opt_p</span><span class="plain">);</span> <span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">opt_p</span><span class="plain">);</span>
@ -459,7 +451,6 @@ problem with internal space characters in arguments.
<p class="inwebparagraph"><a id="SP13"></a><b>&#167;13. </b>So at this point we have definitely found what looks like a switch: <p class="inwebparagraph"><a id="SP13"></a><b>&#167;13. </b>So at this point we have definitely found what looks like a switch:
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">CommandLine::read_pair_p</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">opt</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">opt_val</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">N</span><span class="plain">,</span> <span class="reserved">int</span><span class="plain"> </span><span class="functiontext">CommandLine::read_pair_p</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">opt</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">opt_val</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">N</span><span class="plain">,</span>
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">arg</span><span class="plain">, </span><span class="reserved">void</span><span class="plain"> *</span><span class="identifier">state</span><span class="plain">,</span> <span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">arg</span><span class="plain">, </span><span class="reserved">void</span><span class="plain"> *</span><span class="identifier">state</span><span class="plain">,</span>
@ -577,7 +568,6 @@ bottom one. (Those are the dull ones.)
a brief description of the tool's name and purpose. a brief description of the tool's name and purpose.
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">cls_heading</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span> <span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">cls_heading</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
@ -661,7 +651,6 @@ a brief description of the tool's name and purpose.
<p class="inwebparagraph"><a id="SP15"></a><b>&#167;15. </b></p> <p class="inwebparagraph"><a id="SP15"></a><b>&#167;15. </b></p>
<pre class="display"> <pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">CommandLine::compare_names</span><span class="plain">(</span><span class="reserved">const</span><span class="plain"> </span><span class="reserved">void</span><span class="plain"> *</span><span class="identifier">ent1</span><span class="plain">, </span><span class="reserved">const</span><span class="plain"> </span><span class="reserved">void</span><span class="plain"> *</span><span class="identifier">ent2</span><span class="plain">) {</span> <span class="reserved">int</span><span class="plain"> </span><span class="functiontext">CommandLine::compare_names</span><span class="plain">(</span><span class="reserved">const</span><span class="plain"> </span><span class="reserved">void</span><span class="plain"> *</span><span class="identifier">ent1</span><span class="plain">, </span><span class="reserved">const</span><span class="plain"> </span><span class="reserved">void</span><span class="plain"> *</span><span class="identifier">ent2</span><span class="plain">) {</span>
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">tx1</span><span class="plain"> = (*((</span><span class="reserved">const</span><span class="plain"> </span><span class="reserved">command_line_switch</span><span class="plain"> **) </span><span class="identifier">ent1</span><span class="plain">))-&gt;</span><span class="element">switch_sort_name</span><span class="plain">;</span> <span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">tx1</span><span class="plain"> = (*((</span><span class="reserved">const</span><span class="plain"> </span><span class="reserved">command_line_switch</span><span class="plain"> **) </span><span class="identifier">ent1</span><span class="plain">))-&gt;</span><span class="element">switch_sort_name</span><span class="plain">;</span>

View file

@ -29,7 +29,6 @@
<p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. </b>All of this abstracts the code already found in the platform definitions. <p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. </b>All of this abstracts the code already found in the platform definitions.
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">scan_directory</span><span class="plain"> {</span> <span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">scan_directory</span><span class="plain"> {</span>
<span class="reserved">void</span><span class="plain"> *</span><span class="identifier">directory_handle</span><span class="plain">;</span> <span class="reserved">void</span><span class="plain"> *</span><span class="identifier">directory_handle</span><span class="plain">;</span>
@ -47,7 +46,6 @@ whatever the locale encoding is; the filenames coming back have to be
transcoded the other way. transcoded the other way.
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">scan_directory</span><span class="plain"> *</span><span class="functiontext">Directories::open</span><span class="plain">(</span><span class="reserved">pathname</span><span class="plain"> *</span><span class="identifier">P</span><span class="plain">) {</span> <span class="reserved">scan_directory</span><span class="plain"> *</span><span class="functiontext">Directories::open</span><span class="plain">(</span><span class="reserved">pathname</span><span class="plain"> *</span><span class="identifier">P</span><span class="plain">) {</span>
<span class="reserved">scan_directory</span><span class="plain"> *</span><span class="identifier">D</span><span class="plain"> = </span><span class="identifier">CREATE</span><span class="plain">(</span><span class="reserved">scan_directory</span><span class="plain">);</span> <span class="reserved">scan_directory</span><span class="plain"> *</span><span class="identifier">D</span><span class="plain"> = </span><span class="identifier">CREATE</span><span class="plain">(</span><span class="reserved">scan_directory</span><span class="plain">);</span>

View file

@ -32,7 +32,6 @@
issued. If this returns <code class="display"><span class="extract">FALSE</span></code>, nothing is printed to <code class="display"><span class="extract">stderr</span></code>. issued. If this returns <code class="display"><span class="extract">FALSE</span></code>, nothing is printed to <code class="display"><span class="extract">stderr</span></code>.
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">int</span><span class="plain"> (*</span><span class="identifier">errors_handler</span><span class="plain">)(</span><span class="reserved">text_stream</span><span class="plain"> *, </span><span class="reserved">int</span><span class="plain">) = </span><span class="identifier">NULL</span><span class="plain">;</span> <span class="reserved">int</span><span class="plain"> (*</span><span class="identifier">errors_handler</span><span class="plain">)(</span><span class="reserved">text_stream</span><span class="plain"> *, </span><span class="reserved">int</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="identifier">internal_errors_handler</span><span class="plain">)(</span><span class="reserved">void</span><span class="plain"> *, </span><span class="reserved">char</span><span class="plain"> *, </span><span class="reserved">char</span><span class="plain"> *, </span><span class="reserved">int</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="identifier">internal_errors_handler</span><span class="plain">)(</span><span class="reserved">void</span><span class="plain"> *, </span><span class="reserved">char</span><span class="plain"> *, </span><span class="reserved">char</span><span class="plain"> *, </span><span class="reserved">int</span><span class="plain">) = </span><span class="identifier">NULL</span><span class="plain">;</span>
@ -75,7 +74,6 @@ or streams systems, and therefore must be written with a little care to use
the temporary stream, not some other string which might need fresh allocation. the temporary stream, not some other string which might need fresh allocation.
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Errors::fatal</span><span class="plain">(</span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">message</span><span class="plain">) {</span> <span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Errors::fatal</span><span class="plain">(</span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">message</span><span class="plain">) {</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">ERM</span><span class="plain">)</span> <span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">ERM</span><span class="plain">)</span>
@ -155,7 +153,6 @@ occurs unexpectedly, and one way to do that is to force a division by zero.
(This is only enabled by <code class="display"><span class="extract">-crash</span></code> at the command line and is for debugging only.) (This is only enabled by <code class="display"><span class="extract">-crash</span></code> at the command line and is for debugging only.)
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">debugger_mode</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span> <span class="reserved">int</span><span class="plain"> </span><span class="identifier">debugger_mode</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Errors::enter_debugger_mode</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span> <span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Errors::enter_debugger_mode</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
@ -185,7 +182,6 @@ occurs unexpectedly, and one way to do that is to force a division by zero.
specify this at three levels of abstraction: specify this at three levels of abstraction:
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Errors::nowhere</span><span class="plain">(</span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">message</span><span class="plain">) {</span> <span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Errors::nowhere</span><span class="plain">(</span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">message</span><span class="plain">) {</span>
<span class="functiontext">Errors::in_text_file</span><span class="plain">(</span><span class="identifier">message</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">);</span> <span class="functiontext">Errors::in_text_file</span><span class="plain">(</span><span class="identifier">message</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">);</span>
@ -217,7 +213,6 @@ specify this at three levels of abstraction:
<p class="inwebparagraph"><a id="SP6"></a><b>&#167;6. </b>Which funnel through: <p class="inwebparagraph"><a id="SP6"></a><b>&#167;6. </b>Which funnel through:
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Errors::at_position</span><span class="plain">(</span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">message</span><span class="plain">, </span><span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">file</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">line</span><span class="plain">) {</span> <span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Errors::at_position</span><span class="plain">(</span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">message</span><span class="plain">, </span><span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">file</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">line</span><span class="plain">) {</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">ERM</span><span class="plain">)</span> <span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">ERM</span><span class="plain">)</span>
@ -247,7 +242,6 @@ specify this at three levels of abstraction:
<p class="inwebparagraph"><a id="SP7"></a><b>&#167;7. </b>Lastly: <p class="inwebparagraph"><a id="SP7"></a><b>&#167;7. </b>Lastly:
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Errors::with_file</span><span class="plain">(</span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">message</span><span class="plain">, </span><span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">F</span><span class="plain">) {</span> <span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Errors::with_file</span><span class="plain">(</span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">message</span><span class="plain">, </span><span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">F</span><span class="plain">) {</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">ERM</span><span class="plain">)</span> <span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">ERM</span><span class="plain">)</span>

View file

@ -34,7 +34,6 @@ are a single instance of the following. (Note that the text part is stored
as Unicode code points, regardless of what text encoding the locale has.) as Unicode code points, regardless of what text encoding the locale has.)
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">filename</span><span class="plain"> {</span> <span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">filename</span><span class="plain"> {</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">pathname</span><span class="plain"> *</span><span class="identifier">pathname_of_location</span><span class="plain">;</span> <span class="reserved">struct</span><span class="plain"> </span><span class="reserved">pathname</span><span class="plain"> *</span><span class="identifier">pathname_of_location</span><span class="plain">;</span>
@ -50,7 +49,6 @@ as Unicode code points, regardless of what text encoding the locale has.)
<p class="inwebparagraph"><a id="SP2"></a><b>&#167;2. Creation. </b>A filename is made by supplying a pathname and a leafname. <p class="inwebparagraph"><a id="SP2"></a><b>&#167;2. Creation. </b>A filename is made by supplying a pathname and a leafname.
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">filename</span><span class="plain"> *</span><span class="functiontext">Filenames::in_folder</span><span class="plain">(</span><span class="reserved">pathname</span><span class="plain"> *</span><span class="identifier">P</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">file_name</span><span class="plain">) {</span> <span class="reserved">filename</span><span class="plain"> *</span><span class="functiontext">Filenames::in_folder</span><span class="plain">(</span><span class="reserved">pathname</span><span class="plain"> *</span><span class="identifier">P</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">file_name</span><span class="plain">) {</span>
<span class="reserved">return</span><span class="plain"> </span><span class="functiontext">Filenames::primitive</span><span class="plain">(</span><span class="identifier">file_name</span><span class="plain">, </span><span class="constant">0</span><span class="plain">, </span><span class="functiontext">Str::len</span><span class="plain">(</span><span class="identifier">file_name</span><span class="plain">), </span><span class="identifier">P</span><span class="plain">);</span> <span class="reserved">return</span><span class="plain"> </span><span class="functiontext">Filenames::primitive</span><span class="plain">(</span><span class="identifier">file_name</span><span class="plain">, </span><span class="constant">0</span><span class="plain">, </span><span class="functiontext">Str::len</span><span class="plain">(</span><span class="identifier">file_name</span><span class="plain">), </span><span class="identifier">P</span><span class="plain">);</span>
@ -78,7 +76,6 @@ as Unicode code points, regardless of what text encoding the locale has.)
<p class="inwebparagraph"><a id="SP3"></a><b>&#167;3. Strings to filenames. </b>The following takes a textual name and returns a filename. <p class="inwebparagraph"><a id="SP3"></a><b>&#167;3. Strings to filenames. </b>The following takes a textual name and returns a filename.
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">filename</span><span class="plain"> *</span><span class="functiontext">Filenames::from_text</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">path</span><span class="plain">) {</span> <span class="reserved">filename</span><span class="plain"> *</span><span class="functiontext">Filenames::from_text</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">path</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="constant">0</span><span class="plain">, </span><span class="identifier">pos</span><span class="plain"> = -1;</span> <span class="reserved">int</span><span class="plain"> </span><span class="identifier">i</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">, </span><span class="identifier">pos</span><span class="plain"> = -1;</span>
@ -119,7 +116,6 @@ as Unicode code points, regardless of what text encoding the locale has.)
<p class="inwebparagraph"><a id="SP4"></a><b>&#167;4. The writer. </b>And conversely: <p class="inwebparagraph"><a id="SP4"></a><b>&#167;4. The writer. </b>And conversely:
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Filenames::writer</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">format_string</span><span class="plain">, </span><span class="reserved">void</span><span class="plain"> *</span><span class="identifier">vF</span><span class="plain">) {</span> <span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Filenames::writer</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">format_string</span><span class="plain">, </span><span class="reserved">void</span><span class="plain"> *</span><span class="identifier">vF</span><span class="plain">) {</span>
<span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">F</span><span class="plain"> = (</span><span class="reserved">filename</span><span class="plain"> *) </span><span class="identifier">vF</span><span class="plain">;</span> <span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">F</span><span class="plain"> = (</span><span class="reserved">filename</span><span class="plain"> *) </span><span class="identifier">vF</span><span class="plain">;</span>
@ -142,7 +138,6 @@ as Unicode code points, regardless of what text encoding the locale has.)
<p class="inwebparagraph"><a id="SP5"></a><b>&#167;5. </b>And again relative to a given pathname: <p class="inwebparagraph"><a id="SP5"></a><b>&#167;5. </b>And again relative to a given pathname:
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Filenames::to_text_relative</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">F</span><span class="plain">, </span><span class="reserved">pathname</span><span class="plain"> *</span><span class="identifier">P</span><span class="plain">) {</span> <span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Filenames::to_text_relative</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">F</span><span class="plain">, </span><span class="reserved">pathname</span><span class="plain"> *</span><span class="identifier">P</span><span class="plain">) {</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">ft</span><span class="plain">);</span> <span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">ft</span><span class="plain">);</span>
@ -165,7 +160,6 @@ as Unicode code points, regardless of what text encoding the locale has.)
<p class="inwebparagraph"><a id="SP6"></a><b>&#167;6. Reading off the folder. </b></p> <p class="inwebparagraph"><a id="SP6"></a><b>&#167;6. Reading off the folder. </b></p>
<pre class="display"> <pre class="display">
<span class="reserved">pathname</span><span class="plain"> *</span><span class="functiontext">Filenames::get_path_to</span><span class="plain">(</span><span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">F</span><span class="plain">) {</span> <span class="reserved">pathname</span><span class="plain"> *</span><span class="functiontext">Filenames::get_path_to</span><span class="plain">(</span><span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">F</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">F</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">NULL</span><span class="plain">;</span> <span class="reserved">if</span><span class="plain"> (</span><span class="identifier">F</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">NULL</span><span class="plain">;</span>
@ -179,7 +173,6 @@ as Unicode code points, regardless of what text encoding the locale has.)
<p class="inwebparagraph"><a id="SP7"></a><b>&#167;7. Reading off the leafname. </b></p> <p class="inwebparagraph"><a id="SP7"></a><b>&#167;7. Reading off the leafname. </b></p>
<pre class="display"> <pre class="display">
<span class="reserved">filename</span><span class="plain"> *</span><span class="functiontext">Filenames::without_path</span><span class="plain">(</span><span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">F</span><span class="plain">) {</span> <span class="reserved">filename</span><span class="plain"> *</span><span class="functiontext">Filenames::without_path</span><span class="plain">(</span><span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">F</span><span class="plain">) {</span>
<span class="reserved">return</span><span class="plain"> </span><span class="functiontext">Filenames::in_folder</span><span class="plain">(</span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">F</span><span class="plain">-&gt;</span><span class="element">leafname</span><span class="plain">);</span> <span class="reserved">return</span><span class="plain"> </span><span class="functiontext">Filenames::in_folder</span><span class="plain">(</span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">F</span><span class="plain">-&gt;</span><span class="element">leafname</span><span class="plain">);</span>
@ -214,7 +207,6 @@ an accidental brush of the keyboard. Thus <code class="display"><span class="ext
as equivalent to <code class="display"><span class="extract">frog.jpg</span></code> when deciding the likely file format. as equivalent to <code class="display"><span class="extract">frog.jpg</span></code> when deciding the likely file format.
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Filenames::write_extension</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">F</span><span class="plain">) {</span> <span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Filenames::write_extension</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">F</span><span class="plain">) {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">on</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span> <span class="reserved">int</span><span class="plain"> </span><span class="identifier">on</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
@ -316,7 +308,6 @@ that we must transcode the filename to whatever the locale expects before
we call <code class="display"><span class="extract">fopen</span></code>, which is the main reason for the wrapper. we call <code class="display"><span class="extract">fopen</span></code>, which is the main reason for the wrapper.
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">FILE</span><span class="plain"> *</span><span class="functiontext">Filenames::fopen</span><span class="plain">(</span><span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">F</span><span class="plain">, </span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">usage</span><span class="plain">) {</span> <span class="reserved">FILE</span><span class="plain"> *</span><span class="functiontext">Filenames::fopen</span><span class="plain">(</span><span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">F</span><span class="plain">, </span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">usage</span><span class="plain">) {</span>
<span class="reserved">char</span><span class="plain"> </span><span class="identifier">transcoded_pathname</span><span class="plain">[4*</span><span class="constant">MAX_FILENAME_LENGTH</span><span class="plain">];</span> <span class="reserved">char</span><span class="plain"> </span><span class="identifier">transcoded_pathname</span><span class="plain">[4*</span><span class="constant">MAX_FILENAME_LENGTH</span><span class="plain">];</span>
@ -348,7 +339,6 @@ compare two filenames by seeing if they have the same canonical form
when printed out. when printed out.
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Filenames::eq</span><span class="plain">(</span><span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">F1</span><span class="plain">, </span><span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">F2</span><span class="plain">) {</span> <span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Filenames::eq</span><span class="plain">(</span><span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">F1</span><span class="plain">, </span><span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">F2</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">F1</span><span class="plain"> == </span><span class="identifier">F2</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="constant">TRUE</span><span class="plain">;</span> <span class="reserved">if</span><span class="plain"> (</span><span class="identifier">F1</span><span class="plain"> == </span><span class="identifier">F2</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="constant">TRUE</span><span class="plain">;</span>
@ -369,7 +359,6 @@ when printed out.
<p class="inwebparagraph"><a id="SP12"></a><b>&#167;12. Timestamps. </b></p> <p class="inwebparagraph"><a id="SP12"></a><b>&#167;12. Timestamps. </b></p>
<pre class="display"> <pre class="display">
<span class="identifier">time_t</span><span class="plain"> </span><span class="functiontext">Filenames::timestamp</span><span class="plain">(</span><span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">F</span><span class="plain">) {</span> <span class="identifier">time_t</span><span class="plain"> </span><span class="functiontext">Filenames::timestamp</span><span class="plain">(</span><span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">F</span><span class="plain">) {</span>
<span class="reserved">char</span><span class="plain"> </span><span class="identifier">transcoded_pathname</span><span class="plain">[4*</span><span class="constant">MAX_FILENAME_LENGTH</span><span class="plain">];</span> <span class="reserved">char</span><span class="plain"> </span><span class="identifier">transcoded_pathname</span><span class="plain">[4*</span><span class="constant">MAX_FILENAME_LENGTH</span><span class="plain">];</span>

View file

@ -34,7 +34,6 @@ directory), and "filename" to mean a location of a file. For example:
<p class="inwebparagraph"></p> <p class="inwebparagraph"></p>
<pre class="display"> <pre class="display">
<span class="plain">/Users/rblackmore/Documents/Fireball</span> <span class="plain">/Users/rblackmore/Documents/Fireball</span>
</pre> </pre>
@ -44,7 +43,6 @@ directory), and "filename" to mean a location of a file. For example:
<p class="inwebparagraph"></p> <p class="inwebparagraph"></p>
<pre class="display"> <pre class="display">
<span class="plain">/Users/rblackmore/Documents/Fireball/whoosh.aiff</span> <span class="plain">/Users/rblackmore/Documents/Fireball/whoosh.aiff</span>
</pre> </pre>
@ -64,7 +62,6 @@ describe a folder which doesn't exist on disc.
<p class="inwebparagraph"></p> <p class="inwebparagraph"></p>
<pre class="display"> <pre class="display">
<span class="plain">/Users/rblackmore/Documents/</span> <span class="plain">/Users/rblackmore/Documents/</span>
</pre> </pre>
@ -81,7 +78,6 @@ to begin with <code class="display"><span class="extract">FOLDER_SEPARATOR</span
host file system. host file system.
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">pathname</span><span class="plain"> {</span> <span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">pathname</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">intermediate</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">intermediate</span><span class="plain">;</span>
@ -99,7 +95,6 @@ host file system.
<code class="display"><span class="extract">HOME</span></code>, if it exists. <code class="display"><span class="extract">HOME</span></code>, if it exists.
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">pathname</span><span class="plain"> *</span><span class="identifier">home_path</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span> <span class="reserved">pathname</span><span class="plain"> *</span><span class="identifier">home_path</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">Pathnames::start</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span> <span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Pathnames::start</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
@ -118,7 +113,6 @@ host file system.
<p class="inwebparagraph"><a id="SP3"></a><b>&#167;3. Installation folder. </b></p> <p class="inwebparagraph"><a id="SP3"></a><b>&#167;3. Installation folder. </b></p>
<pre class="display"> <pre class="display">
<span class="reserved">pathname</span><span class="plain"> *</span><span class="identifier">installation_path</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span> <span class="reserved">pathname</span><span class="plain"> *</span><span class="identifier">installation_path</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">Pathnames::set_installation_path</span><span class="plain">(</span><span class="reserved">pathname</span><span class="plain"> *</span><span class="identifier">P</span><span class="plain">) {</span> <span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Pathnames::set_installation_path</span><span class="plain">(</span><span class="reserved">pathname</span><span class="plain"> *</span><span class="identifier">P</span><span class="plain">) {</span>
@ -159,7 +153,6 @@ host file system.
then going one level deeper, using the supplied name. then going one level deeper, using the supplied name.
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">pathname</span><span class="plain"> *</span><span class="functiontext">Pathnames::subfolder</span><span class="plain">(</span><span class="reserved">pathname</span><span class="plain"> *</span><span class="identifier">P</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">folder_name</span><span class="plain">) {</span> <span class="reserved">pathname</span><span class="plain"> *</span><span class="functiontext">Pathnames::subfolder</span><span class="plain">(</span><span class="reserved">pathname</span><span class="plain"> *</span><span class="identifier">P</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">folder_name</span><span class="plain">) {</span>
<span class="reserved">return</span><span class="plain"> </span><span class="functiontext">Pathnames::primitive</span><span class="plain">(</span><span class="identifier">folder_name</span><span class="plain">, </span><span class="constant">0</span><span class="plain">, </span><span class="functiontext">Str::len</span><span class="plain">(</span><span class="identifier">folder_name</span><span class="plain">), </span><span class="identifier">P</span><span class="plain">);</span> <span class="reserved">return</span><span class="plain"> </span><span class="functiontext">Pathnames::primitive</span><span class="plain">(</span><span class="identifier">folder_name</span><span class="plain">, </span><span class="constant">0</span><span class="plain">, </span><span class="functiontext">Str::len</span><span class="plain">(</span><span class="identifier">folder_name</span><span class="plain">), </span><span class="identifier">P</span><span class="plain">);</span>
@ -191,7 +184,6 @@ except possibly for an initial slash, so for example <code class="display"><span
<code class="display"><span class="extract">/paris/roubaix</span></code> is different. <code class="display"><span class="extract">/paris/roubaix</span></code> is different.
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">pathname</span><span class="plain"> *</span><span class="functiontext">Pathnames::from_text</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">path</span><span class="plain">) {</span> <span class="reserved">pathname</span><span class="plain"> *</span><span class="functiontext">Pathnames::from_text</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">path</span><span class="plain">) {</span>
<span class="reserved">return</span><span class="plain"> </span><span class="functiontext">Pathnames::from_text_relative</span><span class="plain">(</span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">path</span><span class="plain">);</span> <span class="reserved">return</span><span class="plain"> </span><span class="functiontext">Pathnames::from_text_relative</span><span class="plain">(</span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">path</span><span class="plain">);</span>
@ -220,7 +212,6 @@ except possibly for an initial slash, so for example <code class="display"><span
<p class="inwebparagraph"><a id="SP6"></a><b>&#167;6. Writer. </b>Conversely, by the miracle of depth-first recursion: <p class="inwebparagraph"><a id="SP6"></a><b>&#167;6. Writer. </b>Conversely, by the miracle of depth-first recursion:
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Pathnames::writer</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">format_string</span><span class="plain">, </span><span class="reserved">void</span><span class="plain"> *</span><span class="identifier">vP</span><span class="plain">) {</span> <span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Pathnames::writer</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">format_string</span><span class="plain">, </span><span class="reserved">void</span><span class="plain"> *</span><span class="identifier">vP</span><span class="plain">) {</span>
<span class="reserved">pathname</span><span class="plain"> *</span><span class="identifier">P</span><span class="plain"> = (</span><span class="reserved">pathname</span><span class="plain"> *) </span><span class="identifier">vP</span><span class="plain">;</span> <span class="reserved">pathname</span><span class="plain"> *</span><span class="identifier">P</span><span class="plain"> = (</span><span class="reserved">pathname</span><span class="plain"> *) </span><span class="identifier">vP</span><span class="plain">;</span>
@ -250,7 +241,6 @@ for example,
<p class="inwebparagraph"></p> <p class="inwebparagraph"></p>
<pre class="display"> <pre class="display">
<span class="plain">/Users/rblackmore/Documents/Fireball/tablature</span> <span class="plain">/Users/rblackmore/Documents/Fireball/tablature</span>
</pre> </pre>
@ -260,7 +250,6 @@ for example,
<p class="inwebparagraph"></p> <p class="inwebparagraph"></p>
<pre class="display"> <pre class="display">
<span class="plain">/Users/rblackmore/Documents/</span> <span class="plain">/Users/rblackmore/Documents/</span>
</pre> </pre>
@ -270,7 +259,6 @@ for example,
<p class="inwebparagraph"></p> <p class="inwebparagraph"></p>
<pre class="display"> <pre class="display">
<span class="plain">Fireball/tablature</span> <span class="plain">Fireball/tablature</span>
</pre> </pre>
@ -280,7 +268,6 @@ so it's probably not wise to use it with filenames typed in at the command
line. line.
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Pathnames::to_text_relative</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">pathname</span><span class="plain"> *</span><span class="identifier">P</span><span class="plain">, </span><span class="reserved">pathname</span><span class="plain"> *</span><span class="identifier">R</span><span class="plain">) {</span> <span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Pathnames::to_text_relative</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">pathname</span><span class="plain"> *</span><span class="identifier">P</span><span class="plain">, </span><span class="reserved">pathname</span><span class="plain"> *</span><span class="identifier">R</span><span class="plain">) {</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">rt</span><span class="plain">);</span> <span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">rt</span><span class="plain">);</span>
@ -319,7 +306,6 @@ line.
on the file system with that path. on the file system with that path.
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Pathnames::create_in_file_system</span><span class="plain">(</span><span class="reserved">pathname</span><span class="plain"> *</span><span class="identifier">P</span><span class="plain">) {</span> <span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Pathnames::create_in_file_system</span><span class="plain">(</span><span class="reserved">pathname</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="identifier">P</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="constant">TRUE</span><span class="plain">; </span><span class="comment">the root of the file system always exists</span> <span class="reserved">if</span><span class="plain"> (</span><span class="identifier">P</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="constant">TRUE</span><span class="plain">; </span><span class="comment">the root of the file system always exists</span>
@ -343,7 +329,6 @@ the <code class="display"><span class="extract">dest</span></code> tree an exact
anything different which was originally in <code class="display"><span class="extract">dest</span></code>). anything different which was originally in <code class="display"><span class="extract">dest</span></code>).
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Pathnames::rsync</span><span class="plain">(</span><span class="reserved">pathname</span><span class="plain"> *</span><span class="identifier">source</span><span class="plain">, </span><span class="reserved">pathname</span><span class="plain"> *</span><span class="identifier">dest</span><span class="plain">) {</span> <span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Pathnames::rsync</span><span class="plain">(</span><span class="reserved">pathname</span><span class="plain"> *</span><span class="identifier">source</span><span class="plain">, </span><span class="reserved">pathname</span><span class="plain"> *</span><span class="identifier">dest</span><span class="plain">) {</span>
<span class="reserved">char</span><span class="plain"> </span><span class="identifier">transcoded_source</span><span class="plain">[4*</span><span class="constant">MAX_FILENAME_LENGTH</span><span class="plain">];</span> <span class="reserved">char</span><span class="plain"> </span><span class="identifier">transcoded_source</span><span class="plain">[4*</span><span class="constant">MAX_FILENAME_LENGTH</span><span class="plain">];</span>

View file

@ -35,7 +35,6 @@ standard for POSIX, so will work on MacOS and Linux, but on a Windows system
they would need to be read in a POSIX-style environment like Cygwin. they would need to be read in a POSIX-style environment like Cygwin.
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Shell::quote_path</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">pathname</span><span class="plain"> *</span><span class="identifier">P</span><span class="plain">) {</span> <span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Shell::quote_path</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">pathname</span><span class="plain"> *</span><span class="identifier">P</span><span class="plain">) {</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">FN</span><span class="plain">);</span> <span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">FN</span><span class="plain">);</span>
@ -86,7 +85,6 @@ they would need to be read in a POSIX-style environment like Cygwin.
<p class="inwebparagraph"><a id="SP2"></a><b>&#167;2. </b>The generic shell code to apply <code class="display"><span class="extract">command</span></code> to a file <code class="display"><span class="extract">F</span></code>: <p class="inwebparagraph"><a id="SP2"></a><b>&#167;2. </b>The generic shell code to apply <code class="display"><span class="extract">command</span></code> to a file <code class="display"><span class="extract">F</span></code>:
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Shell::apply</span><span class="plain">(</span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">command</span><span class="plain">, </span><span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">F</span><span class="plain">) {</span> <span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Shell::apply</span><span class="plain">(</span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">command</span><span class="plain">, </span><span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">F</span><span class="plain">) {</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">COMMAND</span><span class="plain">)</span> <span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">COMMAND</span><span class="plain">)</span>
@ -115,7 +113,6 @@ they would need to be read in a POSIX-style environment like Cygwin.
<p class="inwebparagraph"><a id="SP3"></a><b>&#167;3. </b>Applications to using <code class="display"><span class="extract">rm</span></code> and <code class="display"><span class="extract">cp</span></code>: <p class="inwebparagraph"><a id="SP3"></a><b>&#167;3. </b>Applications to using <code class="display"><span class="extract">rm</span></code> and <code class="display"><span class="extract">cp</span></code>:
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Shell::rm</span><span class="plain">(</span><span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">F</span><span class="plain">) {</span> <span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Shell::rm</span><span class="plain">(</span><span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">F</span><span class="plain">) {</span>
<span class="functiontext">Shell::apply</span><span class="plain">(</span><span class="string">"rm"</span><span class="plain">, </span><span class="identifier">F</span><span class="plain">);</span> <span class="functiontext">Shell::apply</span><span class="plain">(</span><span class="string">"rm"</span><span class="plain">, </span><span class="identifier">F</span><span class="plain">);</span>
@ -143,7 +140,6 @@ they would need to be read in a POSIX-style environment like Cygwin.
from both <code class="display"><span class="extract">stdout</span></code> and <code class="display"><span class="extract">stderr</span></code> to the same named file. from both <code class="display"><span class="extract">stdout</span></code> and <code class="display"><span class="extract">stderr</span></code> to the same named file.
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Shell::redirect</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">F</span><span class="plain">) {</span> <span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Shell::redirect</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">F</span><span class="plain">) {</span>
<span class="functiontext">Shell::plain</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="string">"&gt;"</span><span class="plain">);</span> <span class="functiontext">Shell::plain</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="string">"&gt;"</span><span class="plain">);</span>

View file

@ -31,7 +31,6 @@
<p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. Clock. </b>From the local environment, we'll extract the time at which we're running. <p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. Clock. </b>From the local environment, we'll extract the time at which we're running.
</p> </p>
<pre class="display"> <pre class="display">
<span class="identifier">time_t</span><span class="plain"> </span><span class="identifier">right_now</span><span class="plain">;</span> <span class="identifier">time_t</span><span class="plain"> </span><span class="identifier">right_now</span><span class="plain">;</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">tm</span><span class="plain"> *</span><span class="identifier">the_present</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span> <span class="reserved">struct</span><span class="plain"> </span><span class="identifier">tm</span><span class="plain"> *</span><span class="identifier">the_present</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
@ -55,7 +54,6 @@ in one session with output generated another, even though that was on two
different dates. different dates.
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Time::fix</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span> <span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Time::fix</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">tm</span><span class="plain"> </span><span class="identifier">start</span><span class="plain">;</span> <span class="reserved">struct</span><span class="plain"> </span><span class="identifier">tm</span><span class="plain"> </span><span class="identifier">start</span><span class="plain">;</span>

View file

@ -30,7 +30,6 @@
<p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. Character classes. </b></p> <p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. Character classes. </b></p>
<pre class="display"> <pre class="display">
<span class="identifier">wchar_t</span><span class="plain"> </span><span class="functiontext">Characters::tolower</span><span class="plain">(</span><span class="identifier">wchar_t</span><span class="plain"> </span><span class="identifier">c</span><span class="plain">) {</span> <span class="identifier">wchar_t</span><span class="plain"> </span><span class="functiontext">Characters::tolower</span><span class="plain">(</span><span class="identifier">wchar_t</span><span class="plain"> </span><span class="identifier">c</span><span class="plain">) {</span>
<span class="reserved">return</span><span class="plain"> (</span><span class="identifier">wchar_t</span><span class="plain">) </span><span class="identifier">tolower</span><span class="plain">((</span><span class="reserved">int</span><span class="plain">) </span><span class="identifier">c</span><span class="plain">);</span> <span class="reserved">return</span><span class="plain"> (</span><span class="identifier">wchar_t</span><span class="plain">) </span><span class="identifier">tolower</span><span class="plain">((</span><span class="reserved">int</span><span class="plain">) </span><span class="identifier">c</span><span class="plain">);</span>
@ -80,7 +79,6 @@
<p class="inwebparagraph"><a id="SP2"></a><b>&#167;2. </b>White space classes: <p class="inwebparagraph"><a id="SP2"></a><b>&#167;2. </b>White space classes:
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Characters::is_space_or_tab</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">c</span><span class="plain">) {</span> <span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Characters::is_space_or_tab</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">c</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">c</span><span class="plain"> == </span><span class="character">' '</span><span class="plain">) || (</span><span class="identifier">c</span><span class="plain"> == </span><span class="character">'\t'</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="constant">TRUE</span><span class="plain">;</span> <span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">c</span><span class="plain"> == </span><span class="character">' '</span><span class="plain">) || (</span><span class="identifier">c</span><span class="plain"> == </span><span class="character">'\t'</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="constant">TRUE</span><span class="plain">;</span>
@ -103,7 +101,6 @@ sense of the Treaty of Babel rules on leading and trailing spaces in
iFiction records. iFiction records.
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Characters::is_babel_whitespace</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">c</span><span class="plain">) {</span> <span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Characters::is_babel_whitespace</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">c</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">c</span><span class="plain"> == </span><span class="character">' '</span><span class="plain">) || (</span><span class="identifier">c</span><span class="plain"> == </span><span class="character">'\t'</span><span class="plain">) || (</span><span class="identifier">c</span><span class="plain"> == </span><span class="character">'\x0a'</span><span class="plain">)</span> <span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">c</span><span class="plain"> == </span><span class="character">' '</span><span class="plain">) || (</span><span class="identifier">c</span><span class="plain"> == </span><span class="character">'\t'</span><span class="plain">) || (</span><span class="identifier">c</span><span class="plain"> == </span><span class="character">'\x0a'</span><span class="plain">)</span>
@ -120,7 +117,6 @@ iFiction records.
sufficient correctly to handle all characters in the ZSCII set. sufficient correctly to handle all characters in the ZSCII set.
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Characters::combine_accent</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">accent</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">letter</span><span class="plain">) {</span> <span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Characters::combine_accent</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">accent</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">letter</span><span class="plain">) {</span>
<span class="reserved">switch</span><span class="plain">(</span><span class="identifier">accent</span><span class="plain">) {</span> <span class="reserved">switch</span><span class="plain">(</span><span class="identifier">accent</span><span class="plain">) {</span>
@ -180,7 +176,6 @@ sufficient correctly to handle all characters in the ZSCII set.
the more obvious accents from it. the more obvious accents from it.
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Characters::make_filename_safe</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">charcode</span><span class="plain">) {</span> <span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Characters::make_filename_safe</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">charcode</span><span class="plain">) {</span>
<span class="identifier">charcode</span><span class="plain"> = </span><span class="functiontext">Characters::remove_accent</span><span class="plain">(</span><span class="identifier">charcode</span><span class="plain">);</span> <span class="identifier">charcode</span><span class="plain"> = </span><span class="functiontext">Characters::remove_accent</span><span class="plain">(</span><span class="identifier">charcode</span><span class="plain">);</span>
@ -196,7 +191,6 @@ the more obvious accents from it.
<p class="inwebparagraph"><a id="SP6"></a><b>&#167;6. </b>The following strips the accent, if present, from an ISO Latin-1 character: <p class="inwebparagraph"><a id="SP6"></a><b>&#167;6. </b>The following strips the accent, if present, from an ISO Latin-1 character:
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Characters::remove_accent</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">charcode</span><span class="plain">) {</span> <span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Characters::remove_accent</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">charcode</span><span class="plain">) {</span>
<span class="reserved">switch</span><span class="plain"> (</span><span class="identifier">charcode</span><span class="plain">) {</span> <span class="reserved">switch</span><span class="plain"> (</span><span class="identifier">charcode</span><span class="plain">) {</span>

View file

@ -55,7 +55,6 @@ the maximum length of a pathname, which is 1024 on Mac OS X.
<p class="inwebparagraph"><a id="SP2"></a><b>&#167;2. </b>Occasionally we need access to the real, unbounded strlen: <p class="inwebparagraph"><a id="SP2"></a><b>&#167;2. </b>Occasionally we need access to the real, unbounded strlen:
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">CStrings::strlen_unbounded</span><span class="plain">(</span><span class="reserved">const</span><span class="plain"> </span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">p</span><span class="plain">) {</span> <span class="reserved">int</span><span class="plain"> </span><span class="functiontext">CStrings::strlen_unbounded</span><span class="plain">(</span><span class="reserved">const</span><span class="plain"> </span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">p</span><span class="plain">) {</span>
<span class="reserved">return</span><span class="plain"> (</span><span class="reserved">int</span><span class="plain">) </span><span class="identifier">strlen</span><span class="plain">(</span><span class="identifier">p</span><span class="plain">);</span> <span class="reserved">return</span><span class="plain"> (</span><span class="reserved">int</span><span class="plain">) </span><span class="identifier">strlen</span><span class="plain">(</span><span class="identifier">p</span><span class="plain">);</span>
@ -72,7 +71,6 @@ result in a malformatted shell command being passed to the operating system,
which we cannot risk. which we cannot risk.
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">CStrings::check_len</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">n</span><span class="plain">) {</span> <span class="reserved">int</span><span class="plain"> </span><span class="functiontext">CStrings::check_len</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">n</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">n</span><span class="plain"> &gt; </span><span class="constant">MAX_STRING_LENGTH</span><span class="plain">) || (</span><span class="identifier">n</span><span class="plain"> &lt; </span><span class="constant">0</span><span class="plain">)) </span><span class="functiontext">Errors::fatal</span><span class="plain">(</span><span class="string">"String overflow\n"</span><span class="plain">);</span> <span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">n</span><span class="plain"> &gt; </span><span class="constant">MAX_STRING_LENGTH</span><span class="plain">) || (</span><span class="identifier">n</span><span class="plain"> &lt; </span><span class="constant">0</span><span class="plain">)) </span><span class="functiontext">Errors::fatal</span><span class="plain">(</span><span class="string">"String overflow\n"</span><span class="plain">);</span>
@ -88,7 +86,6 @@ which we cannot risk.
non-terminated string, though this should never actually happen. non-terminated string, though this should never actually happen.
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">CStrings::len</span><span class="plain">(</span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">str</span><span class="plain">) {</span> <span class="reserved">int</span><span class="plain"> </span><span class="functiontext">CStrings::len</span><span class="plain">(</span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">str</span><span class="plain">) {</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">i</span><span class="plain">=0; </span><span class="identifier">i</span><span class="plain">&lt;=</span><span class="constant">MAX_STRING_LENGTH</span><span class="plain">; </span><span class="identifier">i</span><span class="plain">++)</span> <span class="reserved">for</span><span class="plain"> (</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">i</span><span class="plain">=0; </span><span class="identifier">i</span><span class="plain">&lt;=</span><span class="constant">MAX_STRING_LENGTH</span><span class="plain">; </span><span class="identifier">i</span><span class="plain">++)</span>
@ -106,7 +103,6 @@ non-terminated string, though this should never actually happen.
bounds-checked: bounds-checked:
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">CStrings::copy</span><span class="plain">(</span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">to</span><span class="plain">, </span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">from</span><span class="plain">) {</span> <span class="reserved">void</span><span class="plain"> </span><span class="functiontext">CStrings::copy</span><span class="plain">(</span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">to</span><span class="plain">, </span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">from</span><span class="plain">) {</span>
<span class="functiontext">CStrings::check_len</span><span class="plain">(</span><span class="functiontext">CStrings::len</span><span class="plain">(</span><span class="identifier">from</span><span class="plain">));</span> <span class="functiontext">CStrings::check_len</span><span class="plain">(</span><span class="functiontext">CStrings::len</span><span class="plain">(</span><span class="identifier">from</span><span class="plain">));</span>
@ -123,7 +119,6 @@ bounds-checked:
<p class="inwebparagraph"><a id="SP6"></a><b>&#167;6. </b>String comparisons will be done with the following, not <code class="display"><span class="extract">strcmp</span></code> directly: <p class="inwebparagraph"><a id="SP6"></a><b>&#167;6. </b>String comparisons will be done with the following, not <code class="display"><span class="extract">strcmp</span></code> directly:
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">CStrings::ne</span><span class="plain">(</span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">A</span><span class="plain">, </span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">B</span><span class="plain">) {</span> <span class="reserved">int</span><span class="plain"> </span><span class="functiontext">CStrings::ne</span><span class="plain">(</span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">A</span><span class="plain">, </span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">B</span><span class="plain">) {</span>
<span class="reserved">return</span><span class="plain"> (</span><span class="functiontext">CStrings::cmp</span><span class="plain">(</span><span class="identifier">A</span><span class="plain">, </span><span class="identifier">B</span><span class="plain">) == </span><span class="constant">0</span><span class="plain">)?</span><span class="identifier">FALSE:TRUE</span><span class="plain">;</span> <span class="reserved">return</span><span class="plain"> (</span><span class="functiontext">CStrings::cmp</span><span class="plain">(</span><span class="identifier">A</span><span class="plain">, </span><span class="identifier">B</span><span class="plain">) == </span><span class="constant">0</span><span class="plain">)?</span><span class="identifier">FALSE:TRUE</span><span class="plain">;</span>
@ -137,7 +132,6 @@ bounds-checked:
<p class="inwebparagraph"><a id="SP7"></a><b>&#167;7. </b>On the rare occasions when we need to sort alphabetically we'll also call: <p class="inwebparagraph"><a id="SP7"></a><b>&#167;7. </b>On the rare occasions when we need to sort alphabetically we'll also call:
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">CStrings::cmp</span><span class="plain">(</span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">A</span><span class="plain">, </span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">B</span><span class="plain">) {</span> <span class="reserved">int</span><span class="plain"> </span><span class="functiontext">CStrings::cmp</span><span class="plain">(</span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">A</span><span class="plain">, </span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">B</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">A</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) || (</span><span class="identifier">A</span><span class="plain">[0] == </span><span class="constant">0</span><span class="plain">)) {</span> <span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">A</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) || (</span><span class="identifier">A</span><span class="plain">[0] == </span><span class="constant">0</span><span class="plain">)) {</span>
@ -157,7 +151,6 @@ bounds-checked:
whose locale is encoded as UTF-8. whose locale is encoded as UTF-8.
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">CStrings::transcode_ISO_string_to_UTF8</span><span class="plain">(</span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">p</span><span class="plain">, </span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">dest</span><span class="plain">) {</span> <span class="reserved">void</span><span class="plain"> </span><span class="functiontext">CStrings::transcode_ISO_string_to_UTF8</span><span class="plain">(</span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">p</span><span class="plain">, </span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">dest</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="identifier">j</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="identifier">j</span><span class="plain">;</span>
@ -185,7 +178,6 @@ result is therefore not a well-formed string and we have to fix matters by
hand. This I think makes for opaque code. So: hand. This I think makes for opaque code. So:
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">CStrings::truncated_strcpy</span><span class="plain">(</span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">to</span><span class="plain">, </span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">from</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">max</span><span class="plain">) {</span> <span class="reserved">void</span><span class="plain"> </span><span class="functiontext">CStrings::truncated_strcpy</span><span class="plain">(</span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">to</span><span class="plain">, </span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">from</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">max</span><span class="plain">) {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">i</span><span class="plain">;</span> <span class="reserved">int</span><span class="plain"> </span><span class="identifier">i</span><span class="plain">;</span>

View file

@ -32,7 +32,6 @@
of line terminator will always be stripped out before this is applied. of line terminator will always be stripped out before this is applied.
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Regexp::white_space</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">c</span><span class="plain">) {</span> <span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Regexp::white_space</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">c</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">c</span><span class="plain"> == </span><span class="character">' '</span><span class="plain">) || (</span><span class="identifier">c</span><span class="plain"> == </span><span class="character">'\t'</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="constant">TRUE</span><span class="plain">;</span> <span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">c</span><span class="plain"> == </span><span class="character">' '</span><span class="plain">) || (</span><span class="identifier">c</span><span class="plain"> == </span><span class="character">'\t'</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="constant">TRUE</span><span class="plain">;</span>
@ -49,7 +48,6 @@ C and has other meanings in other languages, but it's legal in C-for-Inform
identifiers. identifiers.
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Regexp::identifier_char</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">c</span><span class="plain">) {</span> <span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Regexp::identifier_char</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">c</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">c</span><span class="plain"> == </span><span class="character">'_'</span><span class="plain">) || (</span><span class="identifier">c</span><span class="plain"> == </span><span class="character">':'</span><span class="plain">) ||</span> <span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">c</span><span class="plain"> == </span><span class="character">'_'</span><span class="plain">) || (</span><span class="identifier">c</span><span class="plain"> == </span><span class="character">':'</span><span class="plain">) ||</span>
@ -70,7 +68,6 @@ easily be done as a regular expression using <code class="display"><span class="
here is much quicker. here is much quicker.
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Regexp::find_expansion</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">text</span><span class="plain">, </span><span class="identifier">wchar_t</span><span class="plain"> </span><span class="identifier">on1</span><span class="plain">, </span><span class="identifier">wchar_t</span><span class="plain"> </span><span class="identifier">on2</span><span class="plain">,</span> <span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Regexp::find_expansion</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">text</span><span class="plain">, </span><span class="identifier">wchar_t</span><span class="plain"> </span><span class="identifier">on1</span><span class="plain">, </span><span class="identifier">wchar_t</span><span class="plain"> </span><span class="identifier">on2</span><span class="plain">,</span>
<span class="identifier">wchar_t</span><span class="plain"> </span><span class="identifier">off1</span><span class="plain">, </span><span class="identifier">wchar_t</span><span class="plain"> </span><span class="identifier">off2</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> *</span><span class="identifier">len</span><span class="plain">) {</span> <span class="identifier">wchar_t</span><span class="plain"> </span><span class="identifier">off1</span><span class="plain">, </span><span class="identifier">wchar_t</span><span class="plain"> </span><span class="identifier">off2</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> *</span><span class="identifier">len</span><span class="plain">) {</span>
@ -93,7 +90,6 @@ here is much quicker.
<p class="inwebparagraph"><a id="SP4"></a><b>&#167;4. </b>Still more simply: <p class="inwebparagraph"><a id="SP4"></a><b>&#167;4. </b>Still more simply:
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Regexp::find_open_brace</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">text</span><span class="plain">) {</span> <span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Regexp::find_open_brace</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">text</span><span class="plain">) {</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">i</span><span class="plain">=0; </span><span class="identifier">i</span><span class="plain"> &lt; </span><span class="functiontext">Str::len</span><span class="plain">(</span><span class="identifier">text</span><span class="plain">); </span><span class="identifier">i</span><span class="plain">++)</span> <span class="reserved">for</span><span class="plain"> (</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">i</span><span class="plain">=0; </span><span class="identifier">i</span><span class="plain"> &lt; </span><span class="functiontext">Str::len</span><span class="plain">(</span><span class="identifier">text</span><span class="plain">); </span><span class="identifier">i</span><span class="plain">++)</span>
@ -111,7 +107,6 @@ here is much quicker.
equivalent to <code class="display"><span class="extract">Regexp::match(p, " *")</span></code>, but much faster. equivalent to <code class="display"><span class="extract">Regexp::match(p, " *")</span></code>, but much faster.
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Regexp::string_is_white_space</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">text</span><span class="plain">) {</span> <span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Regexp::string_is_white_space</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">text</span><span class="plain">) {</span>
<span class="identifier">LOOP_THROUGH_TEXT</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">, </span><span class="identifier">text</span><span class="plain">)</span> <span class="identifier">LOOP_THROUGH_TEXT</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">, </span><span class="identifier">text</span><span class="plain">)</span>
@ -137,7 +132,6 @@ short texts against particularly simple patterns. Here is an example of use:
<p class="inwebparagraph"></p> <p class="inwebparagraph"></p>
<pre class="display"> <pre class="display">
<span class="plain">match_results mr = Regexp::create_mr();</span> <span class="plain">match_results mr = Regexp::create_mr();</span>
<span class="plain">if (Regexp::match(&amp;mr, text, L"fish (%d+) ([a-zA-Z_][a-zA-Z0-9_]*) *") {</span> <span class="plain">if (Regexp::match(&amp;mr, text, L"fish (%d+) ([a-zA-Z_][a-zA-Z0-9_]*) *") {</span>
@ -176,7 +170,6 @@ terms would be subexpressions 0 and 1.
<p class="inwebparagraph"><a id="SP7"></a><b>&#167;7. </b>The internal state of the matcher is stored as follows: <p class="inwebparagraph"><a id="SP7"></a><b>&#167;7. </b>The internal state of the matcher is stored as follows:
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">match_position</span><span class="plain"> {</span> <span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">match_position</span><span class="plain"> {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">tpos</span><span class="plain">; </span><span class="comment">position within text being matched</span> <span class="reserved">int</span><span class="plain"> </span><span class="identifier">tpos</span><span class="plain">; </span><span class="comment">position within text being matched</span>
@ -212,6 +205,7 @@ are not. They are simply a little faster to access if short.
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">no_matched_texts</span><span class="plain">;</span> <span class="reserved">int</span><span class="plain"> </span><span class="identifier">no_matched_texts</span><span class="plain">;</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">match_result</span><span class="plain"> </span><span class="identifier">exp_storage</span><span class="plain">[</span><span class="constant">MAX_BRACKETED_SUBEXPRESSIONS</span><span class="plain">];</span> <span class="reserved">struct</span><span class="plain"> </span><span class="reserved">match_result</span><span class="plain"> </span><span class="identifier">exp_storage</span><span class="plain">[</span><span class="constant">MAX_BRACKETED_SUBEXPRESSIONS</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">exp</span><span class="plain">[</span><span class="constant">MAX_BRACKETED_SUBEXPRESSIONS</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">exp</span><span class="plain">[</span><span class="constant">MAX_BRACKETED_SUBEXPRESSIONS</span><span class="plain">];</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">exp_at</span><span class="plain">[</span><span class="constant">MAX_BRACKETED_SUBEXPRESSIONS</span><span class="plain">];</span>
<span class="plain">} </span><span class="reserved">match_results</span><span class="plain">;</span> <span class="plain">} </span><span class="reserved">match_results</span><span class="plain">;</span>
</pre> </pre>
@ -228,13 +222,14 @@ result strings grow very large), so that it's very quick to allocate and
deallocate. deallocate.
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">match_results</span><span class="plain"> </span><span class="functiontext">Regexp::create_mr</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span> <span class="reserved">match_results</span><span class="plain"> </span><span class="functiontext">Regexp::create_mr</span><span class="plain">(</span><span class="reserved">void</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="reserved">match_results</span><span class="plain"> </span><span class="identifier">mr</span><span class="plain">;</span>
<span class="identifier">mr</span><span class="plain">.</span><span class="element">no_matched_texts</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span> <span class="identifier">mr</span><span class="plain">.</span><span class="element">no_matched_texts</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">i</span><span class="plain">=0; </span><span class="identifier">i</span><span class="plain">&lt;</span><span class="constant">MAX_BRACKETED_SUBEXPRESSIONS</span><span class="plain">; </span><span class="identifier">i</span><span class="plain">++)</span> <span class="reserved">for</span><span class="plain"> (</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">i</span><span class="plain">=0; </span><span class="identifier">i</span><span class="plain">&lt;</span><span class="constant">MAX_BRACKETED_SUBEXPRESSIONS</span><span class="plain">; </span><span class="identifier">i</span><span class="plain">++) {</span>
<span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">] = </span><span class="identifier">NULL</span><span class="plain">;</span> <span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">] = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">mr</span><span class="plain">.</span><span class="element">exp_at</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">] = -1;</span>
<span class="plain">}</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">mr</span><span class="plain">;</span> <span class="reserved">return</span><span class="plain"> </span><span class="identifier">mr</span><span class="plain">;</span>
<span class="plain">}</span> <span class="plain">}</span>
@ -259,7 +254,6 @@ deallocate.
<p class="inwebparagraph"><a id="SP10"></a><b>&#167;10. </b>So, then: the matcher itself. <p class="inwebparagraph"><a id="SP10"></a><b>&#167;10. </b>So, then: the matcher itself.
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Regexp::match</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="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">text</span><span class="plain">, </span><span class="identifier">wchar_t</span><span class="plain"> *</span><span class="identifier">pattern</span><span class="plain">) {</span> <span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Regexp::match</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="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">text</span><span class="plain">, </span><span class="identifier">wchar_t</span><span class="plain"> *</span><span class="identifier">pattern</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">mr</span><span class="plain">) </span><span class="functiontext">Regexp::prepare</span><span class="plain">(</span><span class="identifier">mr</span><span class="plain">);</span> <span class="reserved">if</span><span class="plain"> (</span><span class="identifier">mr</span><span class="plain">) </span><span class="functiontext">Regexp::prepare</span><span class="plain">(</span><span class="identifier">mr</span><span class="plain">);</span>
@ -268,10 +262,27 @@ deallocate.
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">rv</span><span class="plain">;</span> <span class="reserved">return</span><span class="plain"> </span><span class="identifier">rv</span><span class="plain">;</span>
<span class="plain">}</span> <span class="plain">}</span>
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Regexp::match_from</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="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">text</span><span class="plain">, </span><span class="identifier">wchar_t</span><span class="plain"> *</span><span class="identifier">pattern</span><span class="plain">,</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">x</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">allow_partial</span><span class="plain">) {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">match_to</span><span class="plain"> = </span><span class="identifier">x</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">x</span><span class="plain"> &lt; </span><span class="functiontext">Str::len</span><span class="plain">(</span><span class="identifier">text</span><span class="plain">)) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">mr</span><span class="plain">) </span><span class="functiontext">Regexp::prepare</span><span class="plain">(</span><span class="identifier">mr</span><span class="plain">);</span>
<span class="reserved">match_position</span><span class="plain"> </span><span class="identifier">at</span><span class="plain">;</span>
<span class="identifier">at</span><span class="plain">.</span><span class="element">tpos</span><span class="plain"> = </span><span class="identifier">x</span><span class="plain">; </span><span class="identifier">at</span><span class="plain">.</span><span class="element">ppos</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">; </span><span class="identifier">at</span><span class="plain">.</span><span class="element">bc</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">; </span><span class="identifier">at</span><span class="plain">.</span><span class="element">bl</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
<span class="identifier">match_to</span><span class="plain"> = </span><span class="functiontext">Regexp::match_r</span><span class="plain">(</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">text</span><span class="plain">, </span><span class="identifier">pattern</span><span class="plain">, &amp;</span><span class="identifier">at</span><span class="plain">, </span><span class="identifier">allow_partial</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">match_to</span><span class="plain"> == -1) {</span>
<span class="identifier">match_to</span><span class="plain"> = </span><span class="identifier">x</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">mr</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>
<span class="plain">}</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">match_to</span><span class="plain"> - </span><span class="identifier">x</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Regexp::prepare</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="reserved">void</span><span class="plain"> </span><span class="functiontext">Regexp::prepare</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="reserved">if</span><span class="plain"> (</span><span class="identifier">mr</span><span class="plain">) {</span> <span class="reserved">if</span><span class="plain"> (</span><span class="identifier">mr</span><span class="plain">) {</span>
<span class="identifier">mr</span><span class="plain">-&gt;</span><span class="element">no_matched_texts</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span> <span class="identifier">mr</span><span class="plain">-&gt;</span><span class="element">no_matched_texts</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">i</span><span class="plain">=0; </span><span class="identifier">i</span><span class="plain">&lt;</span><span class="constant">MAX_BRACKETED_SUBEXPRESSIONS</span><span class="plain">; </span><span class="identifier">i</span><span class="plain">++) {</span> <span class="reserved">for</span><span class="plain"> (</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">i</span><span class="plain">=0; </span><span class="identifier">i</span><span class="plain">&lt;</span><span class="constant">MAX_BRACKETED_SUBEXPRESSIONS</span><span class="plain">; </span><span class="identifier">i</span><span class="plain">++) {</span>
<span class="identifier">mr</span><span class="plain">-&gt;</span><span class="element">exp_at</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">] = -1;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">mr</span><span class="plain">-&gt;</span><span class="element">exp</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">]) </span><span class="identifier">STREAM_CLOSE</span><span class="plain">(</span><span class="identifier">mr</span><span class="plain">-&gt;</span><span class="identifier">exp</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">]);</span> <span class="reserved">if</span><span class="plain"> (</span><span class="identifier">mr</span><span class="plain">-&gt;</span><span class="element">exp</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">]) </span><span class="identifier">STREAM_CLOSE</span><span class="plain">(</span><span class="identifier">mr</span><span class="plain">-&gt;</span><span class="identifier">exp</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">]);</span>
<span class="identifier">mr</span><span class="plain">-&gt;</span><span class="element">exp_storage</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">].</span><span class="element">match_text_struct</span><span class="plain"> =</span> <span class="identifier">mr</span><span class="plain">-&gt;</span><span class="element">exp_storage</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">].</span><span class="element">match_text_struct</span><span class="plain"> =</span>
<span class="functiontext">Streams::new_buffer</span><span class="plain">(</span> <span class="functiontext">Streams::new_buffer</span><span class="plain">(</span>
@ -287,11 +298,12 @@ deallocate.
<p class="endnote">The function Regexp::match is used in 3/cla (<a href="3-cla.html#SP11">&#167;11</a>, <a href="3-cla.html#SP12">&#167;12</a>), 8/ws (<a href="8-ws.html#SP7_3_2">&#167;7.3.2</a>, <a href="8-ws.html#SP7_3_3_2">&#167;7.3.3.2</a>, <a href="8-ws.html#SP7_3_3_2_1">&#167;7.3.3.2.1</a>, <a href="8-ws.html#SP7_2_2_1">&#167;7.2.2.1</a>, <a href="8-ws.html#SP7_2_2_3">&#167;7.2.2.3</a>), 8/bf (<a href="8-bf.html#SP3">&#167;3</a>).</p> <p class="endnote">The function Regexp::match is used in 3/cla (<a href="3-cla.html#SP11">&#167;11</a>, <a href="3-cla.html#SP12">&#167;12</a>), 8/ws (<a href="8-ws.html#SP7_3_2">&#167;7.3.2</a>, <a href="8-ws.html#SP7_3_3_2">&#167;7.3.3.2</a>, <a href="8-ws.html#SP7_3_3_2_1">&#167;7.3.3.2.1</a>, <a href="8-ws.html#SP7_2_2_1">&#167;7.2.2.1</a>, <a href="8-ws.html#SP7_2_2_3">&#167;7.2.2.3</a>), 8/bf (<a href="8-bf.html#SP3">&#167;3</a>).</p>
<p class="endnote">The function Regexp::match_from appears nowhere else.</p>
<p class="endnote">The function Regexp::prepare is used in <a href="#SP14">&#167;14</a>.</p> <p class="endnote">The function Regexp::prepare is used in <a href="#SP14">&#167;14</a>.</p>
<p class="inwebparagraph"><a id="SP11"></a><b>&#167;11. </b></p> <p class="inwebparagraph"><a id="SP11"></a><b>&#167;11. </b></p>
<pre class="display"> <pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Regexp::match_r</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="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">text</span><span class="plain">, </span><span class="identifier">wchar_t</span><span class="plain"> *</span><span class="identifier">pattern</span><span class="plain">,</span> <span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Regexp::match_r</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="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">text</span><span class="plain">, </span><span class="identifier">wchar_t</span><span class="plain"> *</span><span class="identifier">pattern</span><span class="plain">,</span>
<span class="reserved">match_position</span><span class="plain"> *</span><span class="identifier">scan_from</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">allow_partial</span><span class="plain">) {</span> <span class="reserved">match_position</span><span class="plain"> *</span><span class="identifier">scan_from</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">allow_partial</span><span class="plain">) {</span>
@ -447,6 +459,7 @@ to implement numeric repetition counts, which we won't need:
<span class="functiontext">Str::clear</span><span class="plain">(</span><span class="identifier">mr</span><span class="plain">-&gt;</span><span class="element">exp</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">]);</span> <span class="functiontext">Str::clear</span><span class="plain">(</span><span class="identifier">mr</span><span class="plain">-&gt;</span><span class="element">exp</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">]);</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">j</span><span class="plain"> = </span><span class="identifier">at</span><span class="plain">.</span><span class="element">brackets_start</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">]; </span><span class="identifier">j</span><span class="plain"> &lt;= </span><span class="identifier">at</span><span class="plain">.</span><span class="identifier">brackets_end</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">]; </span><span class="identifier">j</span><span class="plain">++)</span> <span class="reserved">for</span><span class="plain"> (</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">j</span><span class="plain"> = </span><span class="identifier">at</span><span class="plain">.</span><span class="element">brackets_start</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">]; </span><span class="identifier">j</span><span class="plain"> &lt;= </span><span class="identifier">at</span><span class="plain">.</span><span class="identifier">brackets_end</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">]; </span><span class="identifier">j</span><span class="plain">++)</span>
<span class="identifier">PUT_TO</span><span class="plain">(</span><span class="identifier">mr</span><span class="plain">-&gt;</span><span class="identifier">exp</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">], </span><span class="functiontext">Str::get_at</span><span class="plain">(</span><span class="identifier">text</span><span class="plain">, </span><span class="identifier">j</span><span class="plain">));</span> <span class="identifier">PUT_TO</span><span class="plain">(</span><span class="identifier">mr</span><span class="plain">-&gt;</span><span class="identifier">exp</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">], </span><span class="functiontext">Str::get_at</span><span class="plain">(</span><span class="identifier">text</span><span class="plain">, </span><span class="identifier">j</span><span class="plain">));</span>
<span class="identifier">mr</span><span class="plain">-&gt;</span><span class="element">exp_at</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">] = </span><span class="identifier">at</span><span class="plain">.</span><span class="element">brackets_start</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">];</span>
<span class="plain">}</span> <span class="plain">}</span>
<span class="identifier">mr</span><span class="plain">-&gt;</span><span class="element">no_matched_texts</span><span class="plain"> = </span><span class="identifier">at</span><span class="plain">.</span><span class="element">bc</span><span class="plain">;</span> <span class="identifier">mr</span><span class="plain">-&gt;</span><span class="element">no_matched_texts</span><span class="plain"> = </span><span class="identifier">at</span><span class="plain">.</span><span class="element">bc</span><span class="plain">;</span>
<span class="plain">}</span> <span class="plain">}</span>
@ -514,9 +527,10 @@ is literal.
<span class="plain">}</span> <span class="plain">}</span>
<span class="plain">*</span><span class="identifier">from</span><span class="plain"> = </span><span class="identifier">ppos</span><span class="plain">; *</span><span class="identifier">to</span><span class="plain"> = </span><span class="identifier">ppos</span><span class="plain">; </span><span class="reserved">return</span><span class="plain"> </span><span class="constant">LITERAL_CLASS</span><span class="plain">;</span> <span class="plain">*</span><span class="identifier">from</span><span class="plain"> = </span><span class="identifier">ppos</span><span class="plain">; *</span><span class="identifier">to</span><span class="plain"> = </span><span class="identifier">ppos</span><span class="plain">; </span><span class="reserved">return</span><span class="plain"> </span><span class="constant">LITERAL_CLASS</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="character">'['</span><span class="plain">:</span> <span class="reserved">case</span><span class="plain"> </span><span class="character">'['</span><span class="plain">:</span>
<span class="plain">*</span><span class="identifier">from</span><span class="plain"> = </span><span class="identifier">ppos</span><span class="plain">+2;</span> <span class="plain">*</span><span class="identifier">from</span><span class="plain"> = </span><span class="identifier">ppos</span><span class="plain">+1;</span>
<span class="identifier">ppos</span><span class="plain"> += </span><span class="constant">2</span><span class="plain">;</span>
<span class="reserved">while</span><span class="plain"> ((</span><span class="identifier">pattern</span><span class="plain">[</span><span class="identifier">ppos</span><span class="plain">]) &amp;&amp; (</span><span class="identifier">pattern</span><span class="plain">[</span><span class="identifier">ppos</span><span class="plain">] != </span><span class="character">']'</span><span class="plain">)) </span><span class="identifier">ppos</span><span class="plain">++;</span> <span class="reserved">while</span><span class="plain"> ((</span><span class="identifier">pattern</span><span class="plain">[</span><span class="identifier">ppos</span><span class="plain">]) &amp;&amp; (</span><span class="identifier">pattern</span><span class="plain">[</span><span class="identifier">ppos</span><span class="plain">] != </span><span class="character">']'</span><span class="plain">)) </span><span class="identifier">ppos</span><span class="plain">++;</span>
<span class="plain">*</span><span class="identifier">to</span><span class="plain"> = </span><span class="identifier">ppos</span><span class="plain"> - </span><span class="constant">1</span><span class="plain">; *</span><span class="identifier">len</span><span class="plain"> = </span><span class="identifier">ppos</span><span class="plain"> - *</span><span class="identifier">from</span><span class="plain"> + </span><span class="constant">1</span><span class="plain">;</span> <span class="plain">*</span><span class="identifier">to</span><span class="plain"> = </span><span class="identifier">ppos</span><span class="plain"> - </span><span class="constant">1</span><span class="plain">; *</span><span class="identifier">len</span><span class="plain"> = </span><span class="identifier">ppos</span><span class="plain"> - *</span><span class="identifier">from</span><span class="plain"> + </span><span class="constant">2</span><span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="constant">LITERAL_CLASS</span><span class="plain">;</span> <span class="reserved">return</span><span class="plain"> </span><span class="constant">LITERAL_CLASS</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="character">' '</span><span class="plain">:</span> <span class="reserved">case</span><span class="plain"> </span><span class="character">' '</span><span class="plain">:</span>
<span class="plain">*</span><span class="identifier">len</span><span class="plain"> = </span><span class="constant">1</span><span class="plain">; </span><span class="reserved">return</span><span class="plain"> </span><span class="constant">WHITESPACE_CLASS</span><span class="plain">;</span> <span class="plain">*</span><span class="identifier">len</span><span class="plain"> = </span><span class="constant">1</span><span class="plain">; </span><span class="reserved">return</span><span class="plain"> </span><span class="constant">WHITESPACE_CLASS</span><span class="plain">;</span>
@ -531,7 +545,6 @@ is literal.
<p class="inwebparagraph"><a id="SP13"></a><b>&#167;13. </b></p> <p class="inwebparagraph"><a id="SP13"></a><b>&#167;13. </b></p>
<pre class="display"> <pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Regexp::test_cclass</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">c</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">chcl</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">range_from</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">range_to</span><span class="plain">, </span><span class="identifier">wchar_t</span><span class="plain"> *</span><span class="identifier">drawn_from</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">reverse</span><span class="plain">) {</span> <span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Regexp::test_cclass</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">c</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">chcl</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">range_from</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">range_to</span><span class="plain">, </span><span class="identifier">wchar_t</span><span class="plain"> *</span><span class="identifier">drawn_from</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">reverse</span><span class="plain">) {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">match</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span> <span class="reserved">int</span><span class="plain"> </span><span class="identifier">match</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
@ -550,6 +563,9 @@ is literal.
<span class="plain">((</span><span class="identifier">c</span><span class="plain"> &gt;= </span><span class="character">'a'</span><span class="plain">) &amp;&amp; (</span><span class="identifier">c</span><span class="plain"> &lt;= </span><span class="character">'z'</span><span class="plain">)) ||</span> <span class="plain">((</span><span class="identifier">c</span><span class="plain"> &gt;= </span><span class="character">'a'</span><span class="plain">) &amp;&amp; (</span><span class="identifier">c</span><span class="plain"> &lt;= </span><span class="character">'z'</span><span class="plain">)) ||</span>
<span class="plain">((</span><span class="identifier">c</span><span class="plain"> &gt;= </span><span class="character">'0'</span><span class="plain">) &amp;&amp; (</span><span class="identifier">c</span><span class="plain"> &lt;= </span><span class="character">'9'</span><span class="plain">))) </span><span class="identifier">match</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">c</span><span class="plain"> &gt;= </span><span class="character">'0'</span><span class="plain">) &amp;&amp; (</span><span class="identifier">c</span><span class="plain"> &lt;= </span><span class="character">'9'</span><span class="plain">))) </span><span class="identifier">match</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="reserved">case</span><span class="plain"> </span><span class="identifier">LITERAL_CLASS:</span> <span class="reserved">case</span><span class="plain"> </span><span class="identifier">LITERAL_CLASS:</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">range_to</span><span class="plain"> &gt; </span><span class="identifier">range_from</span><span class="plain">) &amp;&amp; (</span><span class="identifier">drawn_from</span><span class="plain">[</span><span class="identifier">range_from</span><span class="plain">] == </span><span class="character">'^'</span><span class="plain">)) {</span>
<span class="identifier">range_from</span><span class="plain">++; </span><span class="identifier">reverse</span><span class="plain"> = </span><span class="identifier">reverse</span><span class="plain">?</span><span class="identifier">FALSE:TRUE</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">j</span><span class="plain"> = </span><span class="identifier">range_from</span><span class="plain">; </span><span class="identifier">j</span><span class="plain"> &lt;= </span><span class="identifier">range_to</span><span class="plain">; </span><span class="identifier">j</span><span class="plain">++) {</span> <span class="reserved">for</span><span class="plain"> (</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">j</span><span class="plain"> = </span><span class="identifier">range_from</span><span class="plain">; </span><span class="identifier">j</span><span class="plain"> &lt;= </span><span class="identifier">range_to</span><span class="plain">; </span><span class="identifier">j</span><span class="plain">++) {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">c1</span><span class="plain"> = </span><span class="identifier">drawn_from</span><span class="plain">[</span><span class="identifier">j</span><span class="plain">], </span><span class="identifier">c2</span><span class="plain"> = </span><span class="identifier">c1</span><span class="plain">;</span> <span class="reserved">int</span><span class="plain"> </span><span class="identifier">c1</span><span class="plain"> = </span><span class="identifier">drawn_from</span><span class="plain">[</span><span class="identifier">j</span><span class="plain">], </span><span class="identifier">c2</span><span class="plain"> = </span><span class="identifier">c1</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">j</span><span class="plain">+1 &lt; </span><span class="identifier">range_to</span><span class="plain">) &amp;&amp; (</span><span class="identifier">drawn_from</span><span class="plain">[</span><span class="identifier">j</span><span class="plain">+1] == </span><span class="character">'-'</span><span class="plain">)) { </span><span class="identifier">c2</span><span class="plain"> = </span><span class="identifier">drawn_from</span><span class="plain">[</span><span class="identifier">j</span><span class="plain">+2]; </span><span class="identifier">j</span><span class="plain"> += </span><span class="constant">2</span><span class="plain">; }</span> <span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">j</span><span class="plain">+1 &lt; </span><span class="identifier">range_to</span><span class="plain">) &amp;&amp; (</span><span class="identifier">drawn_from</span><span class="plain">[</span><span class="identifier">j</span><span class="plain">+1] == </span><span class="character">'-'</span><span class="plain">)) { </span><span class="identifier">c2</span><span class="plain"> = </span><span class="identifier">drawn_from</span><span class="plain">[</span><span class="identifier">j</span><span class="plain">+2]; </span><span class="identifier">j</span><span class="plain"> += </span><span class="constant">2</span><span class="plain">; }</span>
@ -576,7 +592,6 @@ For example,
<p class="inwebparagraph"></p> <p class="inwebparagraph"></p>
<pre class="display"> <pre class="display">
<span class="plain">Regexp::replace(text, L"[aeiou]", L"!", REP_REPEATING);</span> <span class="plain">Regexp::replace(text, L"[aeiou]", L"!", REP_REPEATING);</span>
</pre> </pre>

View file

@ -63,7 +63,6 @@ here is just the size of the initial memory block, which is fastest to
access. access.
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="functiontext">Str::new</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span> <span class="reserved">text_stream</span><span class="plain"> *</span><span class="functiontext">Str::new</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="reserved">return</span><span class="plain"> </span><span class="functiontext">Str::new_with_capacity</span><span class="plain">(32);</span> <span class="reserved">return</span><span class="plain"> </span><span class="functiontext">Str::new_with_capacity</span><span class="plain">(32);</span>
@ -93,7 +92,6 @@ we want the duplicate always to be writeable, so that <code class="display"><spa
duplicated as <code class="display"><span class="extract">NULL</span></code>. duplicated as <code class="display"><span class="extract">NULL</span></code>.
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="functiontext">Str::duplicate</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">E</span><span class="plain">) {</span> <span class="reserved">text_stream</span><span class="plain"> *</span><span class="functiontext">Str::duplicate</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">E</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">E</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="functiontext">Str::new</span><span class="plain">();</span> <span class="reserved">if</span><span class="plain"> (</span><span class="identifier">E</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="functiontext">Str::new</span><span class="plain">();</span>
@ -115,7 +113,6 @@ with the capacity of the initial block large enough to hold the whole
thing plus a little extra, for efficiency's sake. thing plus a little extra, for efficiency's sake.
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="functiontext">Str::new_from_wide_string</span><span class="plain">(</span><span class="identifier">wchar_t</span><span class="plain"> *</span><span class="identifier">C_string</span><span class="plain">) {</span> <span class="reserved">text_stream</span><span class="plain"> *</span><span class="functiontext">Str::new_from_wide_string</span><span class="plain">(</span><span class="identifier">wchar_t</span><span class="plain"> *</span><span class="identifier">C_string</span><span class="plain">) {</span>
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">S</span><span class="plain"> = </span><span class="identifier">CREATE</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain">);</span> <span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">S</span><span class="plain"> = </span><span class="identifier">CREATE</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain">);</span>
@ -155,7 +152,6 @@ thing plus a little extra, for efficiency's sake.
<p class="inwebparagraph"><a id="SP5"></a><b>&#167;5. </b>And sometimes we want to use an existing stream object: <p class="inwebparagraph"><a id="SP5"></a><b>&#167;5. </b>And sometimes we want to use an existing stream object:
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="functiontext">Str::from_wide_string</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">S</span><span class="plain">, </span><span class="identifier">wchar_t</span><span class="plain"> *</span><span class="identifier">c_string</span><span class="plain">) {</span> <span class="reserved">text_stream</span><span class="plain"> *</span><span class="functiontext">Str::from_wide_string</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">S</span><span class="plain">, </span><span class="identifier">wchar_t</span><span class="plain"> *</span><span class="identifier">c_string</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Streams::open_from_wide_string</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">, </span><span class="identifier">c_string</span><span class="plain">) == </span><span class="constant">FALSE</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">NULL</span><span class="plain">;</span> <span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Streams::open_from_wide_string</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">, </span><span class="identifier">c_string</span><span class="plain">) == </span><span class="constant">FALSE</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">NULL</span><span class="plain">;</span>
@ -176,7 +172,6 @@ thing plus a little extra, for efficiency's sake.
<p class="inwebparagraph"><a id="SP6"></a><b>&#167;6. Converting to C strings. </b></p> <p class="inwebparagraph"><a id="SP6"></a><b>&#167;6. Converting to C strings. </b></p>
<pre class="display"> <pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Str::copy_to_ISO_string</span><span class="plain">(</span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">C_string</span><span class="plain">, </span><span class="reserved">text_stream</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">buffer_size</span><span class="plain">) {</span> <span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Str::copy_to_ISO_string</span><span class="plain">(</span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">C_string</span><span class="plain">, </span><span class="reserved">text_stream</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">buffer_size</span><span class="plain">) {</span>
<span class="functiontext">Streams::write_as_ISO_string</span><span class="plain">(</span><span class="identifier">C_string</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">, </span><span class="identifier">buffer_size</span><span class="plain">);</span> <span class="functiontext">Streams::write_as_ISO_string</span><span class="plain">(</span><span class="identifier">C_string</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">, </span><span class="identifier">buffer_size</span><span class="plain">);</span>
@ -207,7 +202,6 @@ thing plus a little extra, for efficiency's sake.
<p class="inwebparagraph"><a id="SP7"></a><b>&#167;7. Converting to integers. </b></p> <p class="inwebparagraph"><a id="SP7"></a><b>&#167;7. Converting to integers. </b></p>
<pre class="display"> <pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Str::atoi</span><span class="plain">(</span><span class="reserved">text_stream</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">index</span><span class="plain">) {</span> <span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Str::atoi</span><span class="plain">(</span><span class="reserved">text_stream</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">index</span><span class="plain">) {</span>
<span class="reserved">char</span><span class="plain"> </span><span class="identifier">buffer</span><span class="plain">[32];</span> <span class="reserved">char</span><span class="plain"> </span><span class="identifier">buffer</span><span class="plain">[32];</span>
@ -227,7 +221,6 @@ thing plus a little extra, for efficiency's sake.
<p class="inwebparagraph"><a id="SP8"></a><b>&#167;8. Length. </b>A puritan would return a <code class="display"><span class="extract">size_t</span></code> here, but I am not a puritan. <p class="inwebparagraph"><a id="SP8"></a><b>&#167;8. Length. </b>A puritan would return a <code class="display"><span class="extract">size_t</span></code> here, but I am not a puritan.
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Str::len</span><span class="plain">(</span><span class="reserved">text_stream</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="functiontext">Str::len</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">S</span><span class="plain">) {</span>
<span class="reserved">return</span><span class="plain"> </span><span class="functiontext">Streams::get_position</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">);</span> <span class="reserved">return</span><span class="plain"> </span><span class="functiontext">Streams::get_position</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">);</span>
@ -236,7 +229,7 @@ thing plus a little extra, for efficiency's sake.
<p class="inwebparagraph"></p> <p class="inwebparagraph"></p>
<p class="endnote">The function Str::len is used in <a href="#SP3">&#167;3</a>, <a href="#SP7">&#167;7</a>, <a href="#SP10">&#167;10</a>, <a href="#SP11">&#167;11</a>, <a href="#SP12">&#167;12</a>, <a href="#SP13">&#167;13</a>, <a href="#SP14">&#167;14</a>, <a href="#SP15">&#167;15</a>, <a href="#SP16">&#167;16</a>, <a href="#SP18">&#167;18</a>, <a href="#SP19">&#167;19</a>, <a href="#SP20">&#167;20</a>, <a href="#SP21">&#167;21</a>, <a href="#SP23">&#167;23</a>, <a href="#SP24">&#167;24</a>, <a href="#SP25">&#167;25</a>, 2/dl (<a href="2-dl.html#SP9">&#167;9</a>), 3/cla (<a href="3-cla.html#SP13">&#167;13</a>, <a href="3-cla.html#SP14">&#167;14</a>, <a href="3-cla.html#SP14_1">&#167;14.1</a>), 3/pth (<a href="3-pth.html#SP4">&#167;4</a>, <a href="3-pth.html#SP5">&#167;5</a>, <a href="3-pth.html#SP7">&#167;7</a>), 3/fln (<a href="3-fln.html#SP2">&#167;2</a>, <a href="3-fln.html#SP3">&#167;3</a>, <a href="3-fln.html#SP5">&#167;5</a>, <a href="3-fln.html#SP9">&#167;9</a>), 4/taa (<a href="4-taa.html#SP2_1">&#167;2.1</a>), 4/pm (<a href="4-pm.html#SP3">&#167;3</a>, <a href="4-pm.html#SP4">&#167;4</a>, <a href="4-pm.html#SP11_3">&#167;11.3</a>, <a href="4-pm.html#SP14">&#167;14</a>), 5/htm (<a href="5-htm.html#SP7">&#167;7</a>, <a href="5-htm.html#SP15">&#167;15</a>), 5/ee (<a href="5-ee.html#SP7_1">&#167;7.1</a>, <a href="5-ee.html#SP7_2_3">&#167;7.2.3</a>, <a href="5-ee.html#SP7_2_4">&#167;7.2.4</a>), 7/vn (<a href="7-vn.html#SP7">&#167;7</a>, <a href="7-vn.html#SP7_1">&#167;7.1</a>, <a href="7-vn.html#SP10">&#167;10</a>), 8/ws (<a href="8-ws.html#SP7_3">&#167;7.3</a>, <a href="8-ws.html#SP7_3_3_1">&#167;7.3.3.1</a>, <a href="8-ws.html#SP7_2_2_3_1">&#167;7.2.2.3.1</a>, <a href="8-ws.html#SP7_2_2_4">&#167;7.2.2.4</a>), 8/bdfw (<a href="8-bdfw.html#SP5">&#167;5</a>, <a href="8-bdfw.html#SP6">&#167;6</a>), 8/bf (<a href="8-bf.html#SP3">&#167;3</a>, <a href="8-bf.html#SP4">&#167;4</a>, <a href="8-bf.html#SP5">&#167;5</a>, <a href="8-bf.html#SP6">&#167;6</a>, <a href="8-bf.html#SP9">&#167;9</a>).</p> <p class="endnote">The function Str::len is used in <a href="#SP3">&#167;3</a>, <a href="#SP7">&#167;7</a>, <a href="#SP10">&#167;10</a>, <a href="#SP11">&#167;11</a>, <a href="#SP12">&#167;12</a>, <a href="#SP13">&#167;13</a>, <a href="#SP14">&#167;14</a>, <a href="#SP15">&#167;15</a>, <a href="#SP16">&#167;16</a>, <a href="#SP18">&#167;18</a>, <a href="#SP19">&#167;19</a>, <a href="#SP20">&#167;20</a>, <a href="#SP21">&#167;21</a>, <a href="#SP23">&#167;23</a>, <a href="#SP24">&#167;24</a>, <a href="#SP25">&#167;25</a>, 2/dl (<a href="2-dl.html#SP9">&#167;9</a>), 3/cla (<a href="3-cla.html#SP13">&#167;13</a>, <a href="3-cla.html#SP14">&#167;14</a>, <a href="3-cla.html#SP14_1">&#167;14.1</a>), 3/pth (<a href="3-pth.html#SP4">&#167;4</a>, <a href="3-pth.html#SP5">&#167;5</a>, <a href="3-pth.html#SP7">&#167;7</a>), 3/fln (<a href="3-fln.html#SP2">&#167;2</a>, <a href="3-fln.html#SP3">&#167;3</a>, <a href="3-fln.html#SP5">&#167;5</a>, <a href="3-fln.html#SP9">&#167;9</a>), 4/taa (<a href="4-taa.html#SP2_1">&#167;2.1</a>), 4/pm (<a href="4-pm.html#SP3">&#167;3</a>, <a href="4-pm.html#SP4">&#167;4</a>, <a href="4-pm.html#SP10">&#167;10</a>, <a href="4-pm.html#SP11_3">&#167;11.3</a>, <a href="4-pm.html#SP14">&#167;14</a>), 5/htm (<a href="5-htm.html#SP7">&#167;7</a>, <a href="5-htm.html#SP15">&#167;15</a>), 5/ee (<a href="5-ee.html#SP7_1">&#167;7.1</a>, <a href="5-ee.html#SP7_2_3">&#167;7.2.3</a>, <a href="5-ee.html#SP7_2_4">&#167;7.2.4</a>), 7/vn (<a href="7-vn.html#SP7">&#167;7</a>, <a href="7-vn.html#SP7_1">&#167;7.1</a>, <a href="7-vn.html#SP10">&#167;10</a>), 8/ws (<a href="8-ws.html#SP7_3">&#167;7.3</a>, <a href="8-ws.html#SP7_3_3_1">&#167;7.3.3.1</a>, <a href="8-ws.html#SP7_2_2_3_1">&#167;7.2.2.3.1</a>, <a href="8-ws.html#SP7_2_2_4">&#167;7.2.2.4</a>), 8/bdfw (<a href="8-bdfw.html#SP5">&#167;5</a>, <a href="8-bdfw.html#SP6">&#167;6</a>), 8/bf (<a href="8-bf.html#SP3">&#167;3</a>, <a href="8-bf.html#SP4">&#167;4</a>, <a href="8-bf.html#SP5">&#167;5</a>, <a href="8-bf.html#SP6">&#167;6</a>, <a href="8-bf.html#SP9">&#167;9</a>).</p>
<p class="inwebparagraph"><a id="SP9"></a><b>&#167;9. Position markers. </b>A position marker is a lightweight way to refer to a particular position <p class="inwebparagraph"><a id="SP9"></a><b>&#167;9. Position markers. </b>A position marker is a lightweight way to refer to a particular position
in a given string. Position 0 is before the first character; if, for in a given string. Position 0 is before the first character; if, for
@ -246,7 +239,6 @@ but positive ones well past the end of the string are legal. (Doing things
at those positions may well not be, of course.) at those positions may well not be, of course.)
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">string_position</span><span class="plain"> {</span> <span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">string_position</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">S</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">S</span><span class="plain">;</span>
@ -261,7 +253,6 @@ at those positions may well not be, of course.)
<p class="inwebparagraph"><a id="SP10"></a><b>&#167;10. </b>You can then find a position in a given string thus: <p class="inwebparagraph"><a id="SP10"></a><b>&#167;10. </b>You can then find a position in a given string thus:
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">string_position</span><span class="plain"> </span><span class="functiontext">Str::start</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">S</span><span class="plain">) {</span> <span class="reserved">string_position</span><span class="plain"> </span><span class="functiontext">Str::start</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">S</span><span class="plain">) {</span>
<span class="reserved">string_position</span><span class="plain"> </span><span class="identifier">P</span><span class="plain">; </span><span class="identifier">P</span><span class="plain">.</span><span class="element">S</span><span class="plain"> = </span><span class="identifier">S</span><span class="plain">; </span><span class="identifier">P</span><span class="plain">.</span><span class="element">index</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">; </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">P</span><span class="plain">;</span> <span class="reserved">string_position</span><span class="plain"> </span><span class="identifier">P</span><span class="plain">; </span><span class="identifier">P</span><span class="plain">.</span><span class="element">S</span><span class="plain"> = </span><span class="identifier">S</span><span class="plain">; </span><span class="identifier">P</span><span class="plain">.</span><span class="element">index</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">; </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">P</span><span class="plain">;</span>
@ -289,7 +280,6 @@ at those positions may well not be, of course.)
<p class="inwebparagraph"><a id="SP11"></a><b>&#167;11. </b>And you can step forwards or backwards: <p class="inwebparagraph"><a id="SP11"></a><b>&#167;11. </b>And you can step forwards or backwards:
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">string_position</span><span class="plain"> </span><span class="functiontext">Str::back</span><span class="plain">(</span><span class="reserved">string_position</span><span class="plain"> </span><span class="identifier">P</span><span class="plain">) {</span> <span class="reserved">string_position</span><span class="plain"> </span><span class="functiontext">Str::back</span><span class="plain">(</span><span class="reserved">string_position</span><span class="plain"> </span><span class="identifier">P</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">P</span><span class="plain">.</span><span class="element">index</span><span class="plain"> &gt; </span><span class="constant">0</span><span class="plain">) </span><span class="identifier">P</span><span class="plain">.</span><span class="element">index</span><span class="plain">--; </span><span class="reserved">return</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="identifier">P</span><span class="plain">.</span><span class="element">index</span><span class="plain"> &gt; </span><span class="constant">0</span><span class="plain">) </span><span class="identifier">P</span><span class="plain">.</span><span class="element">index</span><span class="plain">--; </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">P</span><span class="plain">;</span>
@ -345,7 +335,6 @@ at those positions may well not be, of course.)
<p class="inwebparagraph"><a id="SP13"></a><b>&#167;13. Character operations. </b>How to get at individual characters, then, now that we can refer to positions: <p class="inwebparagraph"><a id="SP13"></a><b>&#167;13. Character operations. </b>How to get at individual characters, then, now that we can refer to positions:
</p> </p>
<pre class="display"> <pre class="display">
<span class="identifier">wchar_t</span><span class="plain"> </span><span class="functiontext">Str::get</span><span class="plain">(</span><span class="reserved">string_position</span><span class="plain"> </span><span class="identifier">P</span><span class="plain">) {</span> <span class="identifier">wchar_t</span><span class="plain"> </span><span class="functiontext">Str::get</span><span class="plain">(</span><span class="reserved">string_position</span><span class="plain"> </span><span class="identifier">P</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">P</span><span class="plain">.</span><span class="element">S</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) || (</span><span class="identifier">P</span><span class="plain">.</span><span class="element">index</span><span class="plain"> &lt; </span><span class="constant">0</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="constant">0</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="element">S</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) || (</span><span class="identifier">P</span><span class="plain">.</span><span class="element">index</span><span class="plain"> &lt; </span><span class="constant">0</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="constant">0</span><span class="plain">;</span>
@ -380,7 +369,6 @@ at those positions may well not be, of course.)
<p class="inwebparagraph"><a id="SP14"></a><b>&#167;14. </b></p> <p class="inwebparagraph"><a id="SP14"></a><b>&#167;14. </b></p>
<pre class="display"> <pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Str::put</span><span class="plain">(</span><span class="reserved">string_position</span><span class="plain"> </span><span class="identifier">P</span><span class="plain">, </span><span class="identifier">wchar_t</span><span class="plain"> </span><span class="identifier">C</span><span class="plain">) {</span> <span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Str::put</span><span class="plain">(</span><span class="reserved">string_position</span><span class="plain"> </span><span class="identifier">P</span><span class="plain">, </span><span class="identifier">wchar_t</span><span class="plain"> </span><span class="identifier">C</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="element">index</span><span class="plain"> &lt; </span><span class="constant">0</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"wrote before start of string"</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="element">index</span><span class="plain"> &lt; </span><span class="constant">0</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"wrote before start of string"</span><span class="plain">);</span>
@ -407,7 +395,6 @@ at those positions may well not be, of course.)
<p class="inwebparagraph"><a id="SP15"></a><b>&#167;15. Truncation. </b></p> <p class="inwebparagraph"><a id="SP15"></a><b>&#167;15. Truncation. </b></p>
<pre class="display"> <pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Str::clear</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">S</span><span class="plain">) {</span> <span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Str::clear</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">S</span><span class="plain">) {</span>
<span class="functiontext">Str::truncate</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">, </span><span class="constant">0</span><span class="plain">);</span> <span class="functiontext">Str::truncate</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">, </span><span class="constant">0</span><span class="plain">);</span>
@ -427,7 +414,6 @@ at those positions may well not be, of course.)
<p class="inwebparagraph"><a id="SP16"></a><b>&#167;16. Copying. </b></p> <p class="inwebparagraph"><a id="SP16"></a><b>&#167;16. Copying. </b></p>
<pre class="display"> <pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Str::concatenate</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">S1</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">S2</span><span class="plain">) {</span> <span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Str::concatenate</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">S1</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">S2</span><span class="plain">) {</span>
<span class="functiontext">Streams::copy</span><span class="plain">(</span><span class="identifier">S1</span><span class="plain">, </span><span class="identifier">S2</span><span class="plain">);</span> <span class="functiontext">Streams::copy</span><span class="plain">(</span><span class="identifier">S1</span><span class="plain">, </span><span class="identifier">S2</span><span class="plain">);</span>
@ -459,7 +445,6 @@ at those positions may well not be, of course.)
<p class="inwebparagraph"><a id="SP17"></a><b>&#167;17. </b>A subtly different operation is to set a string equal to a given C string: <p class="inwebparagraph"><a id="SP17"></a><b>&#167;17. </b>A subtly different operation is to set a string equal to a given C string:
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Str::copy_ISO_string</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">S</span><span class="plain">, </span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">C_string</span><span class="plain">) {</span> <span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Str::copy_ISO_string</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">S</span><span class="plain">, </span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">C_string</span><span class="plain">) {</span>
<span class="functiontext">Str::clear</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">);</span> <span class="functiontext">Str::clear</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">);</span>
@ -488,7 +473,6 @@ at those positions may well not be, of course.)
<p class="inwebparagraph"><a id="SP18"></a><b>&#167;18. Comparisons. </b>We provide both case sensitive and insensitive versions. <p class="inwebparagraph"><a id="SP18"></a><b>&#167;18. Comparisons. </b>We provide both case sensitive and insensitive versions.
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">S1</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">S2</span><span class="plain">) {</span> <span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">S1</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">S2</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">S1</span><span class="plain">) == </span><span class="functiontext">Str::len</span><span class="plain">(</span><span class="identifier">S2</span><span class="plain">)) &amp;&amp; (</span><span class="functiontext">Str::cmp</span><span class="plain">(</span><span class="identifier">S1</span><span class="plain">, </span><span class="identifier">S2</span><span class="plain">) == </span><span class="constant">0</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="constant">TRUE</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">S1</span><span class="plain">) == </span><span class="functiontext">Str::len</span><span class="plain">(</span><span class="identifier">S2</span><span class="plain">)) &amp;&amp; (</span><span class="functiontext">Str::cmp</span><span class="plain">(</span><span class="identifier">S1</span><span class="plain">, </span><span class="identifier">S2</span><span class="plain">) == </span><span class="constant">0</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="constant">TRUE</span><span class="plain">;</span>
@ -525,7 +509,6 @@ at those positions may well not be, of course.)
alphabetic sorting, like <code class="display"><span class="extract">strlen</span></code> in the C standard library. alphabetic sorting, like <code class="display"><span class="extract">strlen</span></code> in the C standard library.
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Str::cmp</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">S1</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">S2</span><span class="plain">) {</span> <span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Str::cmp</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">S1</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">S2</span><span class="plain">) {</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">string_position</span><span class="plain"> </span><span class="identifier">P</span><span class="plain"> = </span><span class="functiontext">Str::start</span><span class="plain">(</span><span class="identifier">S1</span><span class="plain">), </span><span class="identifier">Q</span><span class="plain"> = </span><span class="functiontext">Str::start</span><span class="plain">(</span><span class="identifier">S2</span><span class="plain">);</span> <span class="reserved">for</span><span class="plain"> (</span><span class="reserved">string_position</span><span class="plain"> </span><span class="identifier">P</span><span class="plain"> = </span><span class="functiontext">Str::start</span><span class="plain">(</span><span class="identifier">S1</span><span class="plain">), </span><span class="identifier">Q</span><span class="plain"> = </span><span class="functiontext">Str::start</span><span class="plain">(</span><span class="identifier">S2</span><span class="plain">);</span>
@ -560,7 +543,6 @@ alphabetic sorting, like <code class="display"><span class="extract">strlen</spa
<p class="inwebparagraph"></p> <p class="inwebparagraph"></p>
<pre class="display"> <pre class="display">
<span class="plain">Str::suffix_eq(I"wayzgoose", I"snow goose", N)</span> <span class="plain">Str::suffix_eq(I"wayzgoose", I"snow goose", N)</span>
</pre> </pre>
@ -572,7 +554,6 @@ alphabetic sorting, like <code class="display"><span class="extract">strlen</spa
for the staff of a publishing house.) for the staff of a publishing house.)
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Str::prefix_eq</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">S1</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">S2</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">N</span><span class="plain">) {</span> <span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Str::prefix_eq</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">S1</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">S2</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">N</span><span class="plain">) {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">L1</span><span class="plain"> = </span><span class="functiontext">Str::len</span><span class="plain">(</span><span class="identifier">S1</span><span class="plain">), </span><span class="identifier">L2</span><span class="plain"> = </span><span class="functiontext">Str::len</span><span class="plain">(</span><span class="identifier">S2</span><span class="plain">);</span> <span class="reserved">int</span><span class="plain"> </span><span class="identifier">L1</span><span class="plain"> = </span><span class="functiontext">Str::len</span><span class="plain">(</span><span class="identifier">S1</span><span class="plain">), </span><span class="identifier">L2</span><span class="plain"> = </span><span class="functiontext">Str::len</span><span class="plain">(</span><span class="identifier">S2</span><span class="plain">);</span>
@ -623,7 +604,6 @@ for the staff of a publishing house.)
<p class="inwebparagraph"><a id="SP21"></a><b>&#167;21. </b></p> <p class="inwebparagraph"><a id="SP21"></a><b>&#167;21. </b></p>
<pre class="display"> <pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Str::eq_wide_string</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">S1</span><span class="plain">, </span><span class="identifier">wchar_t</span><span class="plain"> *</span><span class="identifier">S2</span><span class="plain">) {</span> <span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Str::eq_wide_string</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">S1</span><span class="plain">, </span><span class="identifier">wchar_t</span><span class="plain"> *</span><span class="identifier">S2</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">S1</span><span class="plain">) == (</span><span class="reserved">int</span><span class="plain">) </span><span class="identifier">wcslen</span><span class="plain">(</span><span class="identifier">S2</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">S1</span><span class="plain">) == (</span><span class="reserved">int</span><span class="plain">) </span><span class="identifier">wcslen</span><span class="plain">(</span><span class="identifier">S2</span><span class="plain">)) {</span>
@ -660,7 +640,6 @@ for the staff of a publishing house.)
<p class="inwebparagraph"><a id="SP22"></a><b>&#167;22. White space. </b></p> <p class="inwebparagraph"><a id="SP22"></a><b>&#167;22. White space. </b></p>
<pre class="display"> <pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Str::is_whitespace</span><span class="plain">(</span><span class="reserved">text_stream</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="functiontext">Str::is_whitespace</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">S</span><span class="plain">) {</span>
<span class="identifier">LOOP_THROUGH_TEXT</span><span class="plain">(</span><span class="identifier">pos</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">)</span> <span class="identifier">LOOP_THROUGH_TEXT</span><span class="plain">(</span><span class="identifier">pos</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">)</span>
@ -677,7 +656,6 @@ for the staff of a publishing house.)
<p class="inwebparagraph"><a id="SP23"></a><b>&#167;23. </b>This removes spaces and tabs from both ends: <p class="inwebparagraph"><a id="SP23"></a><b>&#167;23. </b>This removes spaces and tabs from both ends:
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Str::trim_white_space</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">S</span><span class="plain">) {</span> <span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Str::trim_white_space</span><span class="plain">(</span><span class="reserved">text_stream</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">len</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="identifier">i</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">, </span><span class="identifier">j</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span> <span class="reserved">int</span><span class="plain"> </span><span class="identifier">len</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="identifier">i</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">, </span><span class="identifier">j</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
@ -741,7 +719,6 @@ for the staff of a publishing house.)
<p class="inwebparagraph"><a id="SP24"></a><b>&#167;24. Deleting characters. </b></p> <p class="inwebparagraph"><a id="SP24"></a><b>&#167;24. Deleting characters. </b></p>
<pre class="display"> <pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Str::delete_first_character</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">S</span><span class="plain">) {</span> <span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Str::delete_first_character</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">S</span><span class="plain">) {</span>
<span class="functiontext">Str::delete_nth_character</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">, </span><span class="constant">0</span><span class="plain">);</span> <span class="functiontext">Str::delete_nth_character</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">, </span><span class="constant">0</span><span class="plain">);</span>
@ -780,7 +757,6 @@ for the staff of a publishing house.)
<p class="inwebparagraph"><a id="SP25"></a><b>&#167;25. Substrings. </b></p> <p class="inwebparagraph"><a id="SP25"></a><b>&#167;25. Substrings. </b></p>
<pre class="display"> <pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Str::substr</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">string_position</span><span class="plain"> </span><span class="identifier">from</span><span class="plain">, </span><span class="reserved">string_position</span><span class="plain"> </span><span class="identifier">to</span><span class="plain">) {</span> <span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Str::substr</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">string_position</span><span class="plain"> </span><span class="identifier">from</span><span class="plain">, </span><span class="reserved">string_position</span><span class="plain"> </span><span class="identifier">to</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">from</span><span class="plain">.</span><span class="element">S</span><span class="plain"> != </span><span class="identifier">to</span><span class="plain">.</span><span class="element">S</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"substr on two different strings"</span><span class="plain">);</span> <span class="reserved">if</span><span class="plain"> (</span><span class="identifier">from</span><span class="plain">.</span><span class="element">S</span><span class="plain"> != </span><span class="identifier">to</span><span class="plain">.</span><span class="element">S</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"substr on two different strings"</span><span class="plain">);</span>
@ -853,7 +829,6 @@ a mutex. There's no real performance concern because the following routine
is run just once per I-literal in the source code, when the program starts up. is run just once per I-literal in the source code, when the program starts up.
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">dictionary</span><span class="plain"> *</span><span class="identifier">string_literals_dictionary</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span> <span class="reserved">dictionary</span><span class="plain"> *</span><span class="identifier">string_literals_dictionary</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>

View file

@ -348,7 +348,6 @@ it there.
<p class="inwebparagraph"><a id="SP3"></a><b>&#167;3. </b>Single nodes are matched thus: <p class="inwebparagraph"><a id="SP3"></a><b>&#167;3. </b>Single nodes are matched thus:
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Tries::matches</span><span class="plain">(</span><span class="reserved">match_trie</span><span class="plain"> *</span><span class="identifier">pos</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">c</span><span class="plain">) {</span> <span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Tries::matches</span><span class="plain">(</span><span class="reserved">match_trie</span><span class="plain"> *</span><span class="identifier">pos</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">c</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">pos</span><span class="plain">-&gt;</span><span class="element">match_character</span><span class="plain"> == </span><span class="constant">TRIE_ANYTHING</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="constant">TRUE</span><span class="plain">;</span> <span class="reserved">if</span><span class="plain"> (</span><span class="identifier">pos</span><span class="plain">-&gt;</span><span class="element">match_character</span><span class="plain"> == </span><span class="constant">TRIE_ANYTHING</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="constant">TRUE</span><span class="plain">;</span>
@ -387,7 +386,6 @@ it there.
<p class="inwebparagraph"><a id="SP4"></a><b>&#167;4. </b>Where: <p class="inwebparagraph"><a id="SP4"></a><b>&#167;4. </b>Where:
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">match_trie</span><span class="plain"> *</span><span class="functiontext">Tries::new</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">mc</span><span class="plain">) {</span> <span class="reserved">match_trie</span><span class="plain"> *</span><span class="functiontext">Tries::new</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">mc</span><span class="plain">) {</span>
<span class="reserved">match_trie</span><span class="plain"> *</span><span class="identifier">T</span><span class="plain"> = </span><span class="identifier">CREATE</span><span class="plain">(</span><span class="reserved">match_trie</span><span class="plain">);</span> <span class="reserved">match_trie</span><span class="plain"> *</span><span class="identifier">T</span><span class="plain"> = </span><span class="identifier">CREATE</span><span class="plain">(</span><span class="reserved">match_trie</span><span class="plain">);</span>
@ -410,7 +408,6 @@ start again with the next, and so on. Inform therefore often matches text
against a linked list of tries: we'll call that an "avinue". against a linked list of tries: we'll call that an "avinue".
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">match_avinue</span><span class="plain"> {</span> <span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">match_avinue</span><span class="plain"> {</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">match_trie</span><span class="plain"> *</span><span class="identifier">the_trie</span><span class="plain">;</span> <span class="reserved">struct</span><span class="plain"> </span><span class="reserved">match_trie</span><span class="plain"> *</span><span class="identifier">the_trie</span><span class="plain">;</span>
@ -426,7 +423,6 @@ against a linked list of tries: we'll call that an "avinue".
head node (of either sort). head node (of either sort).
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">match_avinue</span><span class="plain"> *</span><span class="functiontext">Tries::new_avinue</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">from_start</span><span class="plain">) {</span> <span class="reserved">match_avinue</span><span class="plain"> *</span><span class="functiontext">Tries::new_avinue</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">from_start</span><span class="plain">) {</span>
<span class="reserved">match_avinue</span><span class="plain"> *</span><span class="identifier">A</span><span class="plain"> = </span><span class="identifier">CREATE</span><span class="plain">(</span><span class="reserved">match_avinue</span><span class="plain">);</span> <span class="reserved">match_avinue</span><span class="plain"> *</span><span class="identifier">A</span><span class="plain"> = </span><span class="identifier">CREATE</span><span class="plain">(</span><span class="reserved">match_avinue</span><span class="plain">);</span>
@ -451,7 +447,6 @@ head node (of either sort).
tries. tries.
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">match_avinue</span><span class="plain"> *</span><span class="functiontext">Tries::duplicate_avinue</span><span class="plain">(</span><span class="reserved">match_avinue</span><span class="plain"> *</span><span class="identifier">A</span><span class="plain">) {</span> <span class="reserved">match_avinue</span><span class="plain"> *</span><span class="functiontext">Tries::duplicate_avinue</span><span class="plain">(</span><span class="reserved">match_avinue</span><span class="plain"> *</span><span class="identifier">A</span><span class="plain">) {</span>
<span class="reserved">match_avinue</span><span class="plain"> *</span><span class="identifier">F</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">, *</span><span class="identifier">FL</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span> <span class="reserved">match_avinue</span><span class="plain"> *</span><span class="identifier">F</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">, *</span><span class="identifier">FL</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
@ -476,7 +471,6 @@ tries.
trie in turn until one matches (if it does). trie in turn until one matches (if it does).
</p> </p>
<pre class="display"> <pre class="display">
<span class="identifier">wchar_t</span><span class="plain"> *</span><span class="functiontext">Tries::search_avinue</span><span class="plain">(</span><span class="reserved">match_avinue</span><span class="plain"> *</span><span class="identifier">T</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">p</span><span class="plain">) {</span> <span class="identifier">wchar_t</span><span class="plain"> *</span><span class="functiontext">Tries::search_avinue</span><span class="plain">(</span><span class="reserved">match_avinue</span><span class="plain"> *</span><span class="identifier">T</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">p</span><span class="plain">) {</span>
<span class="identifier">wchar_t</span><span class="plain"> *</span><span class="identifier">result</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span> <span class="identifier">wchar_t</span><span class="plain"> *</span><span class="identifier">result</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
@ -494,7 +488,6 @@ trie in turn until one matches (if it does).
<p class="inwebparagraph"><a id="SP9"></a><b>&#167;9. Logging. </b></p> <p class="inwebparagraph"><a id="SP9"></a><b>&#167;9. Logging. </b></p>
<pre class="display"> <pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Tries::log_avinue</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">void</span><span class="plain"> *</span><span class="identifier">vA</span><span class="plain">) {</span> <span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Tries::log_avinue</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">void</span><span class="plain"> *</span><span class="identifier">vA</span><span class="plain">) {</span>
<span class="reserved">match_avinue</span><span class="plain"> *</span><span class="identifier">A</span><span class="plain"> = (</span><span class="reserved">match_avinue</span><span class="plain"> *) </span><span class="identifier">vA</span><span class="plain">;</span> <span class="reserved">match_avinue</span><span class="plain"> *</span><span class="identifier">A</span><span class="plain"> = (</span><span class="reserved">match_avinue</span><span class="plain"> *) </span><span class="identifier">vA</span><span class="plain">;</span>

View file

@ -38,7 +38,6 @@ standard way to read in and iterate through lines of a text file.
file actually exists on disc at a given filename: file actually exists on disc at a given filename:
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">TextFiles::exists</span><span class="plain">(</span><span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">F</span><span class="plain">) {</span> <span class="reserved">int</span><span class="plain"> </span><span class="functiontext">TextFiles::exists</span><span class="plain">(</span><span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">F</span><span class="plain">) {</span>
<span class="reserved">FILE</span><span class="plain"> *</span><span class="identifier">HANDLE</span><span class="plain"> = </span><span class="functiontext">Filenames::fopen</span><span class="plain">(</span><span class="identifier">F</span><span class="plain">, </span><span class="string">"rb"</span><span class="plain">);</span> <span class="reserved">FILE</span><span class="plain"> *</span><span class="identifier">HANDLE</span><span class="plain"> = </span><span class="functiontext">Filenames::fopen</span><span class="plain">(</span><span class="identifier">F</span><span class="plain">, </span><span class="string">"rb"</span><span class="plain">);</span>
@ -55,7 +54,6 @@ file actually exists on disc at a given filename:
<p class="inwebparagraph"><a id="SP2"></a><b>&#167;2. Text file positions. </b>Here's how we record a position in a text file: <p class="inwebparagraph"><a id="SP2"></a><b>&#167;2. Text file positions. </b>Here's how we record a position in a text file:
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">text_file_position</span><span class="plain"> {</span> <span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">text_file_position</span><span class="plain"> {</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">text_file_filename</span><span class="plain">;</span> <span class="reserved">struct</span><span class="plain"> </span><span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">text_file_filename</span><span class="plain">;</span>
@ -75,7 +73,6 @@ file actually exists on disc at a given filename:
<p class="inwebparagraph"><a id="SP3"></a><b>&#167;3. </b>For access: <p class="inwebparagraph"><a id="SP3"></a><b>&#167;3. </b>For access:
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">TextFiles::get_line_count</span><span class="plain">(</span><span class="reserved">text_file_position</span><span class="plain"> *</span><span class="identifier">tfp</span><span class="plain">) {</span> <span class="reserved">int</span><span class="plain"> </span><span class="functiontext">TextFiles::get_line_count</span><span class="plain">(</span><span class="reserved">text_file_position</span><span class="plain"> *</span><span class="identifier">tfp</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">tfp</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="constant">0</span><span class="plain">;</span> <span class="reserved">if</span><span class="plain"> (</span><span class="identifier">tfp</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="constant">0</span><span class="plain">;</span>
@ -90,7 +87,6 @@ file actually exists on disc at a given filename:
<p class="inwebparagraph"><a id="SP4"></a><b>&#167;4. </b>And this is for a real nowhere man: <p class="inwebparagraph"><a id="SP4"></a><b>&#167;4. </b>And this is for a real nowhere man:
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">text_file_position</span><span class="plain"> </span><span class="functiontext">TextFiles::nowhere</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span> <span class="reserved">text_file_position</span><span class="plain"> </span><span class="functiontext">TextFiles::nowhere</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="reserved">text_file_position</span><span class="plain"> </span><span class="identifier">tfp</span><span class="plain">;</span> <span class="reserved">text_file_position</span><span class="plain"> </span><span class="identifier">tfp</span><span class="plain">;</span>
@ -113,7 +109,6 @@ we preserve a pointer called <code class="display"><span class="extract">state</
client. client.
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">TextFiles::read</span><span class="plain">(</span><span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">F</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">escape_oddities</span><span class="plain">, </span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">message</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">serious</span><span class="plain">,</span> <span class="reserved">int</span><span class="plain"> </span><span class="functiontext">TextFiles::read</span><span class="plain">(</span><span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">F</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">escape_oddities</span><span class="plain">, </span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">message</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">serious</span><span class="plain">,</span>
<span class="reserved">void</span><span class="plain"> (</span><span class="identifier">iterator</span><span class="plain">)(</span><span class="reserved">text_stream</span><span class="plain"> *, </span><span class="reserved">text_file_position</span><span class="plain"> *, </span><span class="reserved">void</span><span class="plain"> *),</span> <span class="reserved">void</span><span class="plain"> (</span><span class="identifier">iterator</span><span class="plain">)(</span><span class="reserved">text_stream</span><span class="plain"> *, </span><span class="reserved">text_file_position</span><span class="plain"> *, </span><span class="reserved">void</span><span class="plain"> *),</span>
@ -272,7 +267,6 @@ Text files seldom come that large.
<p class="inwebparagraph"><a id="SP6"></a><b>&#167;6. </b></p> <p class="inwebparagraph"><a id="SP6"></a><b>&#167;6. </b></p>
<pre class="display"> <pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">TextFiles::read_line</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">escape_oddities</span><span class="plain">, </span><span class="reserved">text_file_position</span><span class="plain"> *</span><span class="identifier">tfp</span><span class="plain">) {</span> <span class="reserved">void</span><span class="plain"> </span><span class="functiontext">TextFiles::read_line</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">escape_oddities</span><span class="plain">, </span><span class="reserved">text_file_position</span><span class="plain"> *</span><span class="identifier">tfp</span><span class="plain">) {</span>
<span class="functiontext">Str::clear</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">);</span> <span class="functiontext">Str::clear</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">);</span>
@ -303,7 +297,6 @@ Text files seldom come that large.
calling the following: calling the following:
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">TextFiles::lose_interest</span><span class="plain">(</span><span class="reserved">text_file_position</span><span class="plain"> *</span><span class="identifier">tfp</span><span class="plain">) {</span> <span class="reserved">void</span><span class="plain"> </span><span class="functiontext">TextFiles::lose_interest</span><span class="plain">(</span><span class="reserved">text_file_position</span><span class="plain"> *</span><span class="identifier">tfp</span><span class="plain">) {</span>
<span class="identifier">tfp</span><span class="plain">-&gt;</span><span class="element">actively_scanning</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span> <span class="identifier">tfp</span><span class="plain">-&gt;</span><span class="element">actively_scanning</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
@ -339,7 +332,6 @@ check the return value for <code class="display"><span class="extract">EOF</span
might be at the start of the file being read. might be at the start of the file being read.
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">unicode_file_buffer</span><span class="plain"> {</span> <span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">unicode_file_buffer</span><span class="plain"> {</span>
<span class="reserved">char</span><span class="plain"> </span><span class="identifier">unicode_feed_buffer</span><span class="plain">[32]; </span><span class="comment">holds a single escape such as "[unicode 3106]"</span> <span class="reserved">char</span><span class="plain"> </span><span class="identifier">unicode_feed_buffer</span><span class="plain">[32]; </span><span class="comment">holds a single escape such as "[unicode 3106]"</span>

View file

@ -36,7 +36,6 @@ words instead of bytes. The character values should be Unicode code points.
wrappers simply abstract the standard C library's handling. wrappers simply abstract the standard C library's handling.
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Wide::len</span><span class="plain">(</span><span class="identifier">wchar_t</span><span class="plain"> *</span><span class="identifier">p</span><span class="plain">) {</span> <span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Wide::len</span><span class="plain">(</span><span class="identifier">wchar_t</span><span class="plain"> *</span><span class="identifier">p</span><span class="plain">) {</span>
<span class="reserved">return</span><span class="plain"> (</span><span class="reserved">int</span><span class="plain">) </span><span class="identifier">wcslen</span><span class="plain">(</span><span class="identifier">p</span><span class="plain">);</span> <span class="reserved">return</span><span class="plain"> (</span><span class="reserved">int</span><span class="plain">) </span><span class="identifier">wcslen</span><span class="plain">(</span><span class="identifier">p</span><span class="plain">);</span>
@ -50,7 +49,6 @@ wrappers simply abstract the standard C library's handling.
<p class="inwebparagraph"><a id="SP2"></a><b>&#167;2. </b>On the rare occasions when we need to sort alphabetically we'll also call: <p class="inwebparagraph"><a id="SP2"></a><b>&#167;2. </b>On the rare occasions when we need to sort alphabetically we'll also call:
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Wide::cmp</span><span class="plain">(</span><span class="identifier">wchar_t</span><span class="plain"> *</span><span class="identifier">A</span><span class="plain">, </span><span class="identifier">wchar_t</span><span class="plain"> *</span><span class="identifier">B</span><span class="plain">) {</span> <span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Wide::cmp</span><span class="plain">(</span><span class="identifier">wchar_t</span><span class="plain"> *</span><span class="identifier">A</span><span class="plain">, </span><span class="identifier">wchar_t</span><span class="plain"> *</span><span class="identifier">B</span><span class="plain">) {</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">wcscmp</span><span class="plain">(</span><span class="identifier">A</span><span class="plain">, </span><span class="identifier">B</span><span class="plain">);</span> <span class="reserved">return</span><span class="plain"> </span><span class="identifier">wcscmp</span><span class="plain">(</span><span class="identifier">A</span><span class="plain">, </span><span class="identifier">B</span><span class="plain">);</span>
@ -63,7 +61,6 @@ wrappers simply abstract the standard C library's handling.
<p class="inwebparagraph"><a id="SP3"></a><b>&#167;3. </b></p> <p class="inwebparagraph"><a id="SP3"></a><b>&#167;3. </b></p>
<pre class="display"> <pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Wide::atoi</span><span class="plain">(</span><span class="identifier">wchar_t</span><span class="plain"> *</span><span class="identifier">p</span><span class="plain">) {</span> <span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Wide::atoi</span><span class="plain">(</span><span class="identifier">wchar_t</span><span class="plain"> *</span><span class="identifier">p</span><span class="plain">) {</span>
<span class="reserved">return</span><span class="plain"> (</span><span class="reserved">int</span><span class="plain">) </span><span class="identifier">wcstol</span><span class="plain">(</span><span class="identifier">p</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="constant">10</span><span class="plain">);</span> <span class="reserved">return</span><span class="plain"> (</span><span class="reserved">int</span><span class="plain">) </span><span class="identifier">wcstol</span><span class="plain">(</span><span class="identifier">p</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="constant">10</span><span class="plain">);</span>

View file

@ -47,7 +47,6 @@ of "volumes" (possibly only one), each of which is a series of "chapters"
essentially individual HTML files, plus some images. essentially individual HTML files, plus some images.
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">ebook</span><span class="plain"> {</span> <span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">ebook</span><span class="plain"> {</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">linked_list</span><span class="plain"> *</span><span class="identifier">metadata_list</span><span class="plain">; </span><span class="comment">of <code class="display"><span class="extract">ebook_datum</span></code>: DCMI-standard bibliographic data</span> <span class="reserved">struct</span><span class="plain"> </span><span class="reserved">linked_list</span><span class="plain"> *</span><span class="identifier">metadata_list</span><span class="plain">; </span><span class="comment">of <code class="display"><span class="extract">ebook_datum</span></code>: DCMI-standard bibliographic data</span>
@ -79,7 +78,6 @@ identify ebooks; we need to maintain a small dictionary, and so small that a
list is entirely sufficient. list is entirely sufficient.
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">ebook_datum</span><span class="plain"> {</span> <span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">ebook_datum</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">key</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">key</span><span class="plain">;</span>
@ -95,7 +93,6 @@ list is entirely sufficient.
<p class="inwebparagraph"><a id="SP3"></a><b>&#167;3. </b>As noted above, we use the following to stratify the book: <p class="inwebparagraph"><a id="SP3"></a><b>&#167;3. </b>As noted above, we use the following to stratify the book:
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">ebook_volume</span><span class="plain"> {</span> <span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">ebook_volume</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">volume_title</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">volume_title</span><span class="plain">;</span>
@ -124,7 +121,6 @@ list is entirely sufficient.
pages: pages:
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">ebook_page</span><span class="plain"> {</span> <span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">ebook_page</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">page_title</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">page_title</span><span class="plain">;</span>
@ -163,7 +159,6 @@ pages:
<p class="inwebparagraph"><a id="SP5"></a><b>&#167;5. Creation. </b></p> <p class="inwebparagraph"><a id="SP5"></a><b>&#167;5. Creation. </b></p>
<pre class="display"> <pre class="display">
<span class="reserved">ebook</span><span class="plain"> *</span><span class="functiontext">Epub::new</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">title</span><span class="plain">, </span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">prefix</span><span class="plain">) {</span> <span class="reserved">ebook</span><span class="plain"> *</span><span class="functiontext">Epub::new</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">title</span><span class="plain">, </span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">prefix</span><span class="plain">) {</span>
<span class="reserved">ebook</span><span class="plain"> *</span><span class="identifier">B</span><span class="plain"> = </span><span class="identifier">CREATE</span><span class="plain">(</span><span class="reserved">ebook</span><span class="plain">);</span> <span class="reserved">ebook</span><span class="plain"> *</span><span class="identifier">B</span><span class="plain"> = </span><span class="identifier">CREATE</span><span class="plain">(</span><span class="reserved">ebook</span><span class="plain">);</span>
@ -306,7 +301,6 @@ image separately. (This is a little inconvenient, but indoc wants to do it
that way.) that way.)
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">pathname</span><span class="plain"> *</span><span class="functiontext">Epub::begin_construction</span><span class="plain">(</span><span class="reserved">ebook</span><span class="plain"> *</span><span class="identifier">B</span><span class="plain">, </span><span class="reserved">pathname</span><span class="plain"> *</span><span class="identifier">P</span><span class="plain">, </span><span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">cover_image</span><span class="plain">) {</span> <span class="reserved">pathname</span><span class="plain"> *</span><span class="functiontext">Epub::begin_construction</span><span class="plain">(</span><span class="reserved">ebook</span><span class="plain"> *</span><span class="identifier">B</span><span class="plain">, </span><span class="reserved">pathname</span><span class="plain"> *</span><span class="identifier">P</span><span class="plain">, </span><span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">cover_image</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Pathnames::create_in_file_system</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">) == </span><span class="constant">FALSE</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">NULL</span><span class="plain">;</span> <span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Pathnames::create_in_file_system</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">) == </span><span class="constant">FALSE</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">NULL</span><span class="plain">;</span>
@ -430,7 +424,6 @@ images" at the ThreePress Consulting blog.)
<p class="inwebparagraph"><a id="SP7"></a><b>&#167;7. </b></p> <p class="inwebparagraph"><a id="SP7"></a><b>&#167;7. </b></p>
<pre class="display"> <pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Epub::end_construction</span><span class="plain">(</span><span class="reserved">ebook</span><span class="plain"> *</span><span class="identifier">B</span><span class="plain">) {</span> <span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Epub::end_construction</span><span class="plain">(</span><span class="reserved">ebook</span><span class="plain"> *</span><span class="identifier">B</span><span class="plain">) {</span>
&lt;<span class="cwebmacro">Attach default metadata</span> <span class="cwebmacronumber">7.1</span>&gt;<span class="plain">;</span> &lt;<span class="cwebmacro">Attach default metadata</span> <span class="cwebmacronumber">7.1</span>&gt;<span class="plain">;</span>

View file

@ -45,7 +45,6 @@ this auditing. To do that, we atach an <code class="display"><span class="extrac
text stream. text stream.
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">HTML_file_state</span><span class="plain"> {</span> <span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">HTML_file_state</span><span class="plain"> {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">XHTML_flag</span><span class="plain">; </span><span class="comment">writing strict XHTML for use in epubs</span> <span class="reserved">int</span><span class="plain"> </span><span class="identifier">XHTML_flag</span><span class="plain">; </span><span class="comment">writing strict XHTML for use in epubs</span>
@ -76,7 +75,6 @@ and in the right order. Thus we can't open body, open div, close body, because
that would be a div tag which was pushed but not pulled. that would be a div tag which was pushed but not pulled.
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">unique_xref</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span> <span class="reserved">int</span><span class="plain"> </span><span class="identifier">unique_xref</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">HTML_tag</span><span class="plain"> {</span> <span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">HTML_tag</span><span class="plain"> {</span>
@ -106,7 +104,6 @@ that would be a div tag which was pushed but not pulled.
<p class="inwebparagraph"><a id="SP4"></a><b>&#167;4. </b></p> <p class="inwebparagraph"><a id="SP4"></a><b>&#167;4. </b></p>
<pre class="display"> <pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">HTML::pop_tag</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">tag</span><span class="plain">) {</span> <span class="reserved">void</span><span class="plain"> </span><span class="functiontext">HTML::pop_tag</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">tag</span><span class="plain">) {</span>
<span class="reserved">HTML_file_state</span><span class="plain"> *</span><span class="identifier">hs</span><span class="plain"> = </span><span class="functiontext">Streams::get_HTML_file_state</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">);</span> <span class="reserved">HTML_file_state</span><span class="plain"> *</span><span class="identifier">hs</span><span class="plain"> = </span><span class="functiontext">Streams::get_HTML_file_state</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">);</span>
@ -134,7 +131,6 @@ that would be a div tag which was pushed but not pulled.
<p class="inwebparagraph"><a id="SP5"></a><b>&#167;5. </b>At the end, therefore, no tags must remain unpulled. <p class="inwebparagraph"><a id="SP5"></a><b>&#167;5. </b>At the end, therefore, no tags must remain unpulled.
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">HTML::completed</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">) {</span> <span class="reserved">void</span><span class="plain"> </span><span class="functiontext">HTML::completed</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">) {</span>
<span class="reserved">HTML_file_state</span><span class="plain"> *</span><span class="identifier">hs</span><span class="plain"> = </span><span class="functiontext">Streams::get_HTML_file_state</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">);</span> <span class="reserved">HTML_file_state</span><span class="plain"> *</span><span class="identifier">hs</span><span class="plain"> = </span><span class="functiontext">Streams::get_HTML_file_state</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">);</span>
@ -188,7 +184,6 @@ of which are variadic and have to be written out the old-fashioned way:
<p class="inwebparagraph"><a id="SP7"></a><b>&#167;7. </b>Which themselves depend on these routines: <p class="inwebparagraph"><a id="SP7"></a><b>&#167;7. </b>Which themselves depend on these routines:
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">HTML::tag</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">tag</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">details</span><span class="plain">) {</span> <span class="reserved">void</span><span class="plain"> </span><span class="functiontext">HTML::tag</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">tag</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">details</span><span class="plain">) {</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"&lt;%s"</span><span class="plain">, </span><span class="identifier">tag</span><span class="plain">);</span> <span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"&lt;%s"</span><span class="plain">, </span><span class="identifier">tag</span><span class="plain">);</span>
@ -269,7 +264,6 @@ of which are variadic and have to be written out the old-fashioned way:
<p class="inwebparagraph"><a id="SP8"></a><b>&#167;8. Head. </b></p> <p class="inwebparagraph"><a id="SP8"></a><b>&#167;8. Head. </b></p>
<pre class="display"> <pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">HTML::begin_head</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">CSS_file</span><span class="plain">) {</span> <span class="reserved">void</span><span class="plain"> </span><span class="functiontext">HTML::begin_head</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">CSS_file</span><span class="plain">) {</span>
<span class="reserved">HTML_file_state</span><span class="plain"> *</span><span class="identifier">hs</span><span class="plain"> = </span><span class="functiontext">Streams::get_HTML_file_state</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">);</span> <span class="reserved">HTML_file_state</span><span class="plain"> *</span><span class="identifier">hs</span><span class="plain"> = </span><span class="functiontext">Streams::get_HTML_file_state</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">);</span>
@ -302,7 +296,6 @@ of which are variadic and have to be written out the old-fashioned way:
<p class="inwebparagraph"><a id="SP9"></a><b>&#167;9. </b></p> <p class="inwebparagraph"><a id="SP9"></a><b>&#167;9. </b></p>
<pre class="display"> <pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">HTML::title</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">title</span><span class="plain">) {</span> <span class="reserved">void</span><span class="plain"> </span><span class="functiontext">HTML::title</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">title</span><span class="plain">) {</span>
<span class="identifier">HTML_OPEN</span><span class="plain">(</span><span class="string">"title"</span><span class="plain">);</span> <span class="identifier">HTML_OPEN</span><span class="plain">(</span><span class="string">"title"</span><span class="plain">);</span>
@ -317,7 +310,6 @@ of which are variadic and have to be written out the old-fashioned way:
<p class="inwebparagraph"><a id="SP10"></a><b>&#167;10. Scripts and styles. </b></p> <p class="inwebparagraph"><a id="SP10"></a><b>&#167;10. Scripts and styles. </b></p>
<pre class="display"> <pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">HTML::open_javascript</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">define_project</span><span class="plain">) {</span> <span class="reserved">void</span><span class="plain"> </span><span class="functiontext">HTML::open_javascript</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">define_project</span><span class="plain">) {</span>
<span class="identifier">HTML_OPEN_WITH</span><span class="plain">(</span><span class="string">"script"</span><span class="plain">, </span><span class="string">"type=\"text/javascript\""</span><span class="plain">);</span> <span class="identifier">HTML_OPEN_WITH</span><span class="plain">(</span><span class="string">"script"</span><span class="plain">, </span><span class="string">"type=\"text/javascript\""</span><span class="plain">);</span>
@ -392,7 +384,6 @@ of which are variadic and have to be written out the old-fashioned way:
<p class="inwebparagraph"><a id="SP11"></a><b>&#167;11. </b>The helper simply performs a textual copy: <p class="inwebparagraph"><a id="SP11"></a><b>&#167;11. </b>The helper simply performs a textual copy:
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">HTML::incorporate_helper</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">line_of_template</span><span class="plain">,</span> <span class="reserved">void</span><span class="plain"> </span><span class="functiontext">HTML::incorporate_helper</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">line_of_template</span><span class="plain">,</span>
<span class="reserved">text_file_position</span><span class="plain"> *</span><span class="identifier">tfp</span><span class="plain">, </span><span class="reserved">void</span><span class="plain"> *</span><span class="identifier">OUT</span><span class="plain">) {</span> <span class="reserved">text_file_position</span><span class="plain"> *</span><span class="identifier">tfp</span><span class="plain">, </span><span class="reserved">void</span><span class="plain"> *</span><span class="identifier">OUT</span><span class="plain">) {</span>
@ -406,7 +397,6 @@ of which are variadic and have to be written out the old-fashioned way:
<p class="inwebparagraph"><a id="SP12"></a><b>&#167;12. Body. </b></p> <p class="inwebparagraph"><a id="SP12"></a><b>&#167;12. Body. </b></p>
<pre class="display"> <pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">HTML::begin_body</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">class</span><span class="plain">) {</span> <span class="reserved">void</span><span class="plain"> </span><span class="functiontext">HTML::begin_body</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">class</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">class</span><span class="plain">) </span><span class="identifier">HTML_OPEN_WITH</span><span class="plain">(</span><span class="string">"body"</span><span class="plain">, </span><span class="string">"class=\"%S\""</span><span class="plain">, </span><span class="identifier">class</span><span class="plain">)</span> <span class="reserved">if</span><span class="plain"> (</span><span class="identifier">class</span><span class="plain">) </span><span class="identifier">HTML_OPEN_WITH</span><span class="plain">(</span><span class="string">"body"</span><span class="plain">, </span><span class="string">"class=\"%S\""</span><span class="plain">, </span><span class="identifier">class</span><span class="plain">)</span>
@ -427,7 +417,6 @@ of which are variadic and have to be written out the old-fashioned way:
<p class="inwebparagraph"><a id="SP13"></a><b>&#167;13. Divisions. </b></p> <p class="inwebparagraph"><a id="SP13"></a><b>&#167;13. Divisions. </b></p>
<pre class="display"> <pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">HTML::begin_div_with_id</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">id</span><span class="plain">) {</span> <span class="reserved">void</span><span class="plain"> </span><span class="functiontext">HTML::begin_div_with_id</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">id</span><span class="plain">) {</span>
<span class="identifier">HTML_OPEN_WITH</span><span class="plain">(</span><span class="string">"div"</span><span class="plain">, </span><span class="string">"id=\"%s\""</span><span class="plain">, </span><span class="identifier">id</span><span class="plain">);</span> <span class="identifier">HTML_OPEN_WITH</span><span class="plain">(</span><span class="string">"div"</span><span class="plain">, </span><span class="string">"id=\"%s\""</span><span class="plain">, </span><span class="identifier">id</span><span class="plain">);</span>
@ -487,7 +476,6 @@ of which are variadic and have to be written out the old-fashioned way:
<p class="inwebparagraph"><a id="SP14"></a><b>&#167;14. Images. </b></p> <p class="inwebparagraph"><a id="SP14"></a><b>&#167;14. Images. </b></p>
<pre class="display"> <pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">HTML::image</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">F</span><span class="plain">) {</span> <span class="reserved">void</span><span class="plain"> </span><span class="functiontext">HTML::image</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">F</span><span class="plain">) {</span>
<span class="identifier">HTML_TAG_WITH</span><span class="plain">(</span><span class="string">"img"</span><span class="plain">, </span><span class="string">"src=\"%/f\""</span><span class="plain">, </span><span class="identifier">F</span><span class="plain">);</span> <span class="identifier">HTML_TAG_WITH</span><span class="plain">(</span><span class="string">"img"</span><span class="plain">, </span><span class="string">"src=\"%/f\""</span><span class="plain">, </span><span class="identifier">F</span><span class="plain">);</span>
@ -500,7 +488,6 @@ of which are variadic and have to be written out the old-fashioned way:
<p class="inwebparagraph"><a id="SP15"></a><b>&#167;15. Links. </b></p> <p class="inwebparagraph"><a id="SP15"></a><b>&#167;15. Links. </b></p>
<pre class="display"> <pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">HTML::anchor</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">id</span><span class="plain">) {</span> <span class="reserved">void</span><span class="plain"> </span><span class="functiontext">HTML::anchor</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">id</span><span class="plain">) {</span>
<span class="identifier">HTML_OPEN_WITH</span><span class="plain">(</span><span class="string">"a"</span><span class="plain">, </span><span class="string">"id=\"%S\""</span><span class="plain">, </span><span class="identifier">id</span><span class="plain">); </span><span class="identifier">HTML_CLOSE</span><span class="plain">(</span><span class="string">"a"</span><span class="plain">);</span> <span class="identifier">HTML_OPEN_WITH</span><span class="plain">(</span><span class="string">"a"</span><span class="plain">, </span><span class="string">"id=\"%S\""</span><span class="plain">, </span><span class="identifier">id</span><span class="plain">); </span><span class="identifier">HTML_CLOSE</span><span class="plain">(</span><span class="string">"a"</span><span class="plain">);</span>
@ -554,7 +541,6 @@ of which are variadic and have to be written out the old-fashioned way:
<p class="inwebparagraph"><a id="SP16"></a><b>&#167;16. Tables. </b>Opening a generic bland table with reasonable column spacing: <p class="inwebparagraph"><a id="SP16"></a><b>&#167;16. Tables. </b>Opening a generic bland table with reasonable column spacing:
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">HTML::begin_plain_html_table</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">) {</span> <span class="reserved">void</span><span class="plain"> </span><span class="functiontext">HTML::begin_plain_html_table</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">) {</span>
<span class="functiontext">HTML::begin_html_table</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="constant">FALSE</span><span class="plain">, </span><span class="constant">0</span><span class="plain">, </span><span class="constant">0</span><span class="plain">, </span><span class="constant">0</span><span class="plain">, </span><span class="constant">0</span><span class="plain">, </span><span class="constant">0</span><span class="plain">);</span> <span class="functiontext">HTML::begin_html_table</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="constant">FALSE</span><span class="plain">, </span><span class="constant">0</span><span class="plain">, </span><span class="constant">0</span><span class="plain">, </span><span class="constant">0</span><span class="plain">, </span><span class="constant">0</span><span class="plain">, </span><span class="constant">0</span><span class="plain">);</span>
@ -574,7 +560,6 @@ of which are variadic and have to be written out the old-fashioned way:
<p class="inwebparagraph"><a id="SP17"></a><b>&#167;17. </b>And some more general code: <p class="inwebparagraph"><a id="SP17"></a><b>&#167;17. </b>And some more general code:
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">HTML::begin_html_table</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">colour</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">full_width</span><span class="plain">,</span> <span class="reserved">void</span><span class="plain"> </span><span class="functiontext">HTML::begin_html_table</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">colour</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">full_width</span><span class="plain">,</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">border</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">cellspacing</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">cellpadding</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">height</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">width</span><span class="plain">) {</span> <span class="reserved">int</span><span class="plain"> </span><span class="identifier">border</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">cellspacing</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">cellpadding</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">height</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">width</span><span class="plain">) {</span>
@ -792,7 +777,6 @@ of which are variadic and have to be written out the old-fashioned way:
<p class="inwebparagraph"><a id="SP19"></a><b>&#167;19. Miscellaneous. </b></p> <p class="inwebparagraph"><a id="SP19"></a><b>&#167;19. Miscellaneous. </b></p>
<pre class="display"> <pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">HTML::comment</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">text</span><span class="plain">) {</span> <span class="reserved">void</span><span class="plain"> </span><span class="functiontext">HTML::comment</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">text</span><span class="plain">) {</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"&lt;!--%S--&gt;\n"</span><span class="plain">, </span><span class="identifier">text</span><span class="plain">);</span> <span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"&lt;!--%S--&gt;\n"</span><span class="plain">, </span><span class="identifier">text</span><span class="plain">);</span>
@ -822,7 +806,6 @@ of which are variadic and have to be written out the old-fashioned way:
<p class="inwebparagraph"><a id="SP20"></a><b>&#167;20. HTML colours. </b>Inform uses these when constructing the map in the World index. <p class="inwebparagraph"><a id="SP20"></a><b>&#167;20. HTML colours. </b>Inform uses these when constructing the map in the World index.
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">colour_translation</span><span class="plain"> {</span> <span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">colour_translation</span><span class="plain"> {</span>
<span class="identifier">wchar_t</span><span class="plain"> *</span><span class="identifier">chip_name</span><span class="plain">;</span> <span class="identifier">wchar_t</span><span class="plain"> *</span><span class="identifier">chip_name</span><span class="plain">;</span>
@ -985,7 +968,6 @@ of which are variadic and have to be written out the old-fashioned way:
need to run quickly. need to run quickly.
</p> </p>
<pre class="display"> <pre class="display">
<span class="identifier">wchar_t</span><span class="plain"> *</span><span class="functiontext">HTML::translate_colour_name</span><span class="plain">(</span><span class="identifier">wchar_t</span><span class="plain"> *</span><span class="identifier">original</span><span class="plain">) {</span> <span class="identifier">wchar_t</span><span class="plain"> *</span><span class="functiontext">HTML::translate_colour_name</span><span class="plain">(</span><span class="identifier">wchar_t</span><span class="plain"> *</span><span class="identifier">original</span><span class="plain">) {</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">j</span><span class="plain">=0; </span><span class="functiontext">Wide::cmp</span><span class="plain">(</span><span class="identifier">table_of_translations</span><span class="plain">[</span><span class="identifier">j</span><span class="plain">].</span><span class="element">chip_name</span><span class="plain">, </span><span class="identifier">L</span><span class="string">""</span><span class="plain">); </span><span class="identifier">j</span><span class="plain">++)</span> <span class="reserved">for</span><span class="plain"> (</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">j</span><span class="plain">=0; </span><span class="functiontext">Wide::cmp</span><span class="plain">(</span><span class="identifier">table_of_translations</span><span class="plain">[</span><span class="identifier">j</span><span class="plain">].</span><span class="element">chip_name</span><span class="plain">, </span><span class="identifier">L</span><span class="string">""</span><span class="plain">); </span><span class="identifier">j</span><span class="plain">++)</span>
@ -1001,7 +983,6 @@ need to run quickly.
<p class="inwebparagraph"><a id="SP22"></a><b>&#167;22. </b></p> <p class="inwebparagraph"><a id="SP22"></a><b>&#167;22. </b></p>
<pre class="display"> <pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">HTML::begin_colour</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">col</span><span class="plain">) {</span> <span class="reserved">void</span><span class="plain"> </span><span class="functiontext">HTML::begin_colour</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">col</span><span class="plain">) {</span>
<span class="identifier">HTML_OPEN_WITH</span><span class="plain">(</span><span class="string">"span"</span><span class="plain">, </span><span class="string">"style=\"color:#%S\""</span><span class="plain">, </span><span class="identifier">col</span><span class="plain">);</span> <span class="identifier">HTML_OPEN_WITH</span><span class="plain">(</span><span class="string">"span"</span><span class="plain">, </span><span class="string">"style=\"color:#%S\""</span><span class="plain">, </span><span class="identifier">col</span><span class="plain">);</span>

View file

@ -32,7 +32,6 @@
arranged with most significant byte (MSB) first. arranged with most significant byte (MSB) first.
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">BinaryFiles::read_int8</span><span class="plain">(</span><span class="reserved">FILE</span><span class="plain"> *</span><span class="identifier">binary_file</span><span class="plain">, </span><span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">int</span><span class="plain"> *</span><span class="identifier">result</span><span class="plain">) {</span> <span class="reserved">int</span><span class="plain"> </span><span class="functiontext">BinaryFiles::read_int8</span><span class="plain">(</span><span class="reserved">FILE</span><span class="plain"> *</span><span class="identifier">binary_file</span><span class="plain">, </span><span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">int</span><span class="plain"> *</span><span class="identifier">result</span><span class="plain">) {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">c1</span><span class="plain"> = </span><span class="identifier">getc</span><span class="plain">(</span><span class="identifier">binary_file</span><span class="plain">);</span> <span class="reserved">int</span><span class="plain"> </span><span class="identifier">c1</span><span class="plain"> = </span><span class="identifier">getc</span><span class="plain">(</span><span class="identifier">binary_file</span><span class="plain">);</span>
@ -106,7 +105,6 @@ arranged with most significant byte (MSB) first.
<p class="inwebparagraph"><a id="SP2"></a><b>&#167;2. </b></p> <p class="inwebparagraph"><a id="SP2"></a><b>&#167;2. </b></p>
<pre class="display"> <pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">BinaryFiles::write_int32</span><span class="plain">(</span><span class="reserved">FILE</span><span class="plain"> *</span><span class="identifier">binary_file</span><span class="plain">, </span><span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">val</span><span class="plain">) {</span> <span class="reserved">int</span><span class="plain"> </span><span class="functiontext">BinaryFiles::write_int32</span><span class="plain">(</span><span class="reserved">FILE</span><span class="plain"> *</span><span class="identifier">binary_file</span><span class="plain">, </span><span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">val</span><span class="plain">) {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">c1</span><span class="plain"> = (</span><span class="reserved">int</span><span class="plain">) ((</span><span class="identifier">val</span><span class="plain"> &gt;&gt; </span><span class="constant">24</span><span class="plain">) &amp; </span><span class="constant">0xFF</span><span class="plain">);</span> <span class="reserved">int</span><span class="plain"> </span><span class="identifier">c1</span><span class="plain"> = (</span><span class="reserved">int</span><span class="plain">) ((</span><span class="identifier">val</span><span class="plain"> &gt;&gt; </span><span class="constant">24</span><span class="plain">) &amp; </span><span class="constant">0xFF</span><span class="plain">);</span>
@ -130,7 +128,6 @@ arranged with most significant byte (MSB) first.
integers 32 or 64 bits wide: integers 32 or 64 bits wide:
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">BinaryFiles::swap_bytes32</span><span class="plain">(</span><span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">int</span><span class="plain"> *</span><span class="identifier">value</span><span class="plain">) {</span> <span class="reserved">void</span><span class="plain"> </span><span class="functiontext">BinaryFiles::swap_bytes32</span><span class="plain">(</span><span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">int</span><span class="plain"> *</span><span class="identifier">value</span><span class="plain">) {</span>
<span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">result</span><span class="plain"> = (((*</span><span class="identifier">value</span><span class="plain"> &amp; </span><span class="constant">0xff</span><span class="plain">) &lt;&lt; </span><span class="constant">24</span><span class="plain">) +</span> <span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">result</span><span class="plain"> = (((*</span><span class="identifier">value</span><span class="plain"> &amp; </span><span class="constant">0xff</span><span class="plain">) &lt;&lt; </span><span class="constant">24</span><span class="plain">) +</span>
@ -165,7 +162,6 @@ of data plus a most significant bit which marks that a continuation byte
follows: follows:
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">BinaryFiles::read_variable_length_integer</span><span class="plain">(</span><span class="reserved">FILE</span><span class="plain"> *</span><span class="identifier">binary_file</span><span class="plain">, </span><span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">int</span><span class="plain"> *</span><span class="identifier">result</span><span class="plain">) {</span> <span class="reserved">int</span><span class="plain"> </span><span class="functiontext">BinaryFiles::read_variable_length_integer</span><span class="plain">(</span><span class="reserved">FILE</span><span class="plain"> *</span><span class="identifier">binary_file</span><span class="plain">, </span><span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">int</span><span class="plain"> *</span><span class="identifier">result</span><span class="plain">) {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">c</span><span class="plain">;</span> <span class="reserved">int</span><span class="plain"> </span><span class="identifier">c</span><span class="plain">;</span>
@ -189,7 +185,6 @@ follows:
floating-point numbers: floating-point numbers:
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">BinaryFiles::read_float80</span><span class="plain">(</span><span class="reserved">FILE</span><span class="plain"> *</span><span class="identifier">binary_file</span><span class="plain">, </span><span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">int</span><span class="plain"> *</span><span class="identifier">result</span><span class="plain">) {</span> <span class="reserved">int</span><span class="plain"> </span><span class="functiontext">BinaryFiles::read_float80</span><span class="plain">(</span><span class="reserved">FILE</span><span class="plain"> *</span><span class="identifier">binary_file</span><span class="plain">, </span><span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">int</span><span class="plain"> *</span><span class="identifier">result</span><span class="plain">) {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">c1</span><span class="plain">, </span><span class="identifier">c2</span><span class="plain">, </span><span class="identifier">exp</span><span class="plain">;</span> <span class="reserved">int</span><span class="plain"> </span><span class="identifier">c1</span><span class="plain">, </span><span class="identifier">c2</span><span class="plain">, </span><span class="identifier">exp</span><span class="plain">;</span>
@ -221,7 +216,6 @@ then null terminate it to make it valid C string. (<code class="display"><span c
be at least <code class="display"><span class="extract">length</span></code> plus 1 bytes long.) be at least <code class="display"><span class="extract">length</span></code> plus 1 bytes long.)
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">BinaryFiles::read_string</span><span class="plain">(</span><span class="reserved">FILE</span><span class="plain"> *</span><span class="identifier">binary_file</span><span class="plain">, </span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">string</span><span class="plain">, </span><span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">length</span><span class="plain">) {</span> <span class="reserved">int</span><span class="plain"> </span><span class="functiontext">BinaryFiles::read_string</span><span class="plain">(</span><span class="reserved">FILE</span><span class="plain"> *</span><span class="identifier">binary_file</span><span class="plain">, </span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">string</span><span class="plain">, </span><span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">length</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">length</span><span class="plain"> &gt; </span><span class="constant">0</span><span class="plain">) {</span> <span class="reserved">if</span><span class="plain"> (</span><span class="identifier">length</span><span class="plain"> &gt; </span><span class="constant">0</span><span class="plain">) {</span>
@ -239,7 +233,6 @@ be at least <code class="display"><span class="extract">length</span></code> plu
<p class="inwebparagraph"><a id="SP7"></a><b>&#167;7. Size. </b></p> <p class="inwebparagraph"><a id="SP7"></a><b>&#167;7. Size. </b></p>
<pre class="display"> <pre class="display">
<span class="reserved">long</span><span class="plain"> </span><span class="reserved">int</span><span class="plain"> </span><span class="functiontext">BinaryFiles::size</span><span class="plain">(</span><span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">F</span><span class="plain">) {</span> <span class="reserved">long</span><span class="plain"> </span><span class="reserved">int</span><span class="plain"> </span><span class="functiontext">BinaryFiles::size</span><span class="plain">(</span><span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">F</span><span class="plain">) {</span>
<span class="reserved">FILE</span><span class="plain"> *</span><span class="identifier">TEST_FILE</span><span class="plain"> = </span><span class="functiontext">BinaryFiles::try_to_open_for_reading</span><span class="plain">(</span><span class="identifier">F</span><span class="plain">);</span> <span class="reserved">FILE</span><span class="plain"> *</span><span class="identifier">TEST_FILE</span><span class="plain"> = </span><span class="functiontext">BinaryFiles::try_to_open_for_reading</span><span class="plain">(</span><span class="identifier">F</span><span class="plain">);</span>
@ -262,7 +255,6 @@ be at least <code class="display"><span class="extract">length</span></code> plu
<p class="inwebparagraph"><a id="SP8"></a><b>&#167;8. Opening. </b></p> <p class="inwebparagraph"><a id="SP8"></a><b>&#167;8. Opening. </b></p>
<pre class="display"> <pre class="display">
<span class="reserved">FILE</span><span class="plain"> *</span><span class="functiontext">BinaryFiles::open_for_reading</span><span class="plain">(</span><span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">F</span><span class="plain">) {</span> <span class="reserved">FILE</span><span class="plain"> *</span><span class="functiontext">BinaryFiles::open_for_reading</span><span class="plain">(</span><span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">F</span><span class="plain">) {</span>
<span class="reserved">FILE</span><span class="plain"> *</span><span class="identifier">handle</span><span class="plain"> = </span><span class="functiontext">Filenames::fopen</span><span class="plain">(</span><span class="identifier">F</span><span class="plain">, </span><span class="string">"rb"</span><span class="plain">);</span> <span class="reserved">FILE</span><span class="plain"> *</span><span class="identifier">handle</span><span class="plain"> = </span><span class="functiontext">Filenames::fopen</span><span class="plain">(</span><span class="identifier">F</span><span class="plain">, </span><span class="string">"rb"</span><span class="plain">);</span>
@ -305,7 +297,6 @@ be at least <code class="display"><span class="extract">length</span></code> plu
or to system APIs. or to system APIs.
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">BinaryFiles::copy</span><span class="plain">(</span><span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">from</span><span class="plain">, </span><span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">to</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">suppress_error</span><span class="plain">) {</span> <span class="reserved">int</span><span class="plain"> </span><span class="functiontext">BinaryFiles::copy</span><span class="plain">(</span><span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">from</span><span class="plain">, </span><span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">to</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">suppress_error</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">from</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) || (</span><span class="identifier">to</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">from</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) || (</span><span class="identifier">to</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">))</span>

View file

@ -47,7 +47,6 @@ actual image: this can have many forms, but in all cases tells us the
height and width. height and width.
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">ImageFiles::get_JPEG_dimensions</span><span class="plain">(</span><span class="reserved">FILE</span><span class="plain"> *</span><span class="identifier">JPEG_file</span><span class="plain">, </span><span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">int</span><span class="plain"> *</span><span class="identifier">width</span><span class="plain">, </span><span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">int</span><span class="plain"> *</span><span class="identifier">height</span><span class="plain">) {</span> <span class="reserved">int</span><span class="plain"> </span><span class="functiontext">ImageFiles::get_JPEG_dimensions</span><span class="plain">(</span><span class="reserved">FILE</span><span class="plain"> *</span><span class="identifier">JPEG_file</span><span class="plain">, </span><span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">int</span><span class="plain"> *</span><span class="identifier">width</span><span class="plain">, </span><span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">int</span><span class="plain"> *</span><span class="identifier">height</span><span class="plain">) {</span>
<span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">sig</span><span class="plain">, </span><span class="identifier">length</span><span class="plain">;</span> <span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">sig</span><span class="plain">, </span><span class="identifier">length</span><span class="plain">;</span>
@ -106,7 +105,6 @@ need to scan the IHDR chunk, of which the pixel width and height are the
first two words (section 11.2.2). first two words (section 11.2.2).
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">ImageFiles::get_PNG_dimensions</span><span class="plain">(</span><span class="reserved">FILE</span><span class="plain"> *</span><span class="identifier">PNG_file</span><span class="plain">, </span><span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">int</span><span class="plain"> *</span><span class="identifier">width</span><span class="plain">, </span><span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">int</span><span class="plain"> *</span><span class="identifier">height</span><span class="plain">) {</span> <span class="reserved">int</span><span class="plain"> </span><span class="functiontext">ImageFiles::get_PNG_dimensions</span><span class="plain">(</span><span class="reserved">FILE</span><span class="plain"> *</span><span class="identifier">PNG_file</span><span class="plain">, </span><span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">int</span><span class="plain"> *</span><span class="identifier">width</span><span class="plain">, </span><span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">int</span><span class="plain"> *</span><span class="identifier">height</span><span class="plain">) {</span>
<span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">sig1</span><span class="plain">, </span><span class="identifier">sig2</span><span class="plain">, </span><span class="identifier">length</span><span class="plain">, </span><span class="identifier">type</span><span class="plain">;</span> <span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">sig1</span><span class="plain">, </span><span class="identifier">sig2</span><span class="plain">, </span><span class="identifier">length</span><span class="plain">, </span><span class="identifier">type</span><span class="plain">;</span>

View file

@ -33,7 +33,6 @@ explicate the following, see the specifications for AIFF and OGG headers.
Durations are measured in centiseconds. Durations are measured in centiseconds.
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">SoundFiles::get_AIFF_duration</span><span class="plain">(</span><span class="reserved">FILE</span><span class="plain"> *</span><span class="identifier">pFile</span><span class="plain">, </span><span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">int</span><span class="plain"> *</span><span class="identifier">pDuration</span><span class="plain">,</span> <span class="reserved">int</span><span class="plain"> </span><span class="functiontext">SoundFiles::get_AIFF_duration</span><span class="plain">(</span><span class="reserved">FILE</span><span class="plain"> *</span><span class="identifier">pFile</span><span class="plain">, </span><span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">int</span><span class="plain"> *</span><span class="identifier">pDuration</span><span class="plain">,</span>
<span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">int</span><span class="plain"> *</span><span class="identifier">pBitsPerSecond</span><span class="plain">, </span><span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">int</span><span class="plain"> *</span><span class="identifier">pChannels</span><span class="plain">, </span><span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">int</span><span class="plain"> *</span><span class="identifier">pSampleRate</span><span class="plain">) {</span> <span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">int</span><span class="plain"> *</span><span class="identifier">pBitsPerSecond</span><span class="plain">, </span><span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">int</span><span class="plain"> *</span><span class="identifier">pChannels</span><span class="plain">, </span><span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">int</span><span class="plain"> *</span><span class="identifier">pSampleRate</span><span class="plain">) {</span>
@ -86,7 +85,6 @@ Durations are measured in centiseconds.
<p class="inwebparagraph"><a id="SP2"></a><b>&#167;2. OGG Vorbis files. </b></p> <p class="inwebparagraph"><a id="SP2"></a><b>&#167;2. OGG Vorbis files. </b></p>
<pre class="display"> <pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">SoundFiles::get_OggVorbis_duration</span><span class="plain">(</span><span class="reserved">FILE</span><span class="plain"> *</span><span class="identifier">pFile</span><span class="plain">, </span><span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">int</span><span class="plain"> *</span><span class="identifier">pDuration</span><span class="plain">,</span> <span class="reserved">int</span><span class="plain"> </span><span class="functiontext">SoundFiles::get_OggVorbis_duration</span><span class="plain">(</span><span class="reserved">FILE</span><span class="plain"> *</span><span class="identifier">pFile</span><span class="plain">, </span><span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">int</span><span class="plain"> *</span><span class="identifier">pDuration</span><span class="plain">,</span>
<span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">int</span><span class="plain"> *</span><span class="identifier">pBitsPerSecond</span><span class="plain">, </span><span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">int</span><span class="plain"> *</span><span class="identifier">pChannels</span><span class="plain">, </span><span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">int</span><span class="plain"> *</span><span class="identifier">pSampleRate</span><span class="plain">) {</span> <span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">int</span><span class="plain"> *</span><span class="identifier">pBitsPerSecond</span><span class="plain">, </span><span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">int</span><span class="plain"> *</span><span class="identifier">pChannels</span><span class="plain">, </span><span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">int</span><span class="plain"> *</span><span class="identifier">pSampleRate</span><span class="plain">) {</span>
@ -215,7 +213,6 @@ compiles for will allow. At present, the Glulx virtual machine does not
officially support MIDI, which makes the question moot. officially support MIDI, which makes the question moot.
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">SoundFiles::get_MIDI_information</span><span class="plain">(</span><span class="reserved">FILE</span><span class="plain"> *</span><span class="identifier">pFile</span><span class="plain">, </span><span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">int</span><span class="plain"> *</span><span class="identifier">pType</span><span class="plain">,</span> <span class="reserved">int</span><span class="plain"> </span><span class="functiontext">SoundFiles::get_MIDI_information</span><span class="plain">(</span><span class="reserved">FILE</span><span class="plain"> *</span><span class="identifier">pFile</span><span class="plain">, </span><span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">int</span><span class="plain"> *</span><span class="identifier">pType</span><span class="plain">,</span>
<span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">int</span><span class="plain"> *</span><span class="identifier">pNumTracks</span><span class="plain">) {</span> <span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">int</span><span class="plain"> *</span><span class="identifier">pNumTracks</span><span class="plain">) {</span>

View file

@ -62,7 +62,6 @@ time of the Reykjavik summit between Presidents Gorbachev and Reagan:
<p class="inwebparagraph"></p> <p class="inwebparagraph"></p>
<pre class="display"> <pre class="display">
<span class="plain">Moonmist</span> <span class="plain">Moonmist</span>
<span class="plain">Infocom interactive fiction - a mystery story</span> <span class="plain">Infocom interactive fiction - a mystery story</span>
@ -126,7 +125,6 @@ Instead they are used to represent the absence of a version number.
(In particular, a string of <code class="display"><span class="extract">-1</span></code>s is null.) (In particular, a string of <code class="display"><span class="extract">-1</span></code>s is null.)
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">semantic_version_number</span><span class="plain"> </span><span class="functiontext">VersionNumbers::null</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span> <span class="reserved">semantic_version_number</span><span class="plain"> </span><span class="functiontext">VersionNumbers::null</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="plain">#</span><span class="identifier">pragma</span><span class="plain"> </span><span class="identifier">clang</span><span class="plain"> </span><span class="identifier">diagnostic</span><span class="plain"> </span><span class="identifier">push</span> <span class="plain">#</span><span class="identifier">pragma</span><span class="plain"> </span><span class="identifier">clang</span><span class="plain"> </span><span class="identifier">diagnostic</span><span class="plain"> </span><span class="identifier">push</span>
@ -159,7 +157,6 @@ Instead they are used to represent the absence of a version number.
<p class="inwebparagraph"><a id="SP5"></a><b>&#167;5. Printing and parsing. </b>Printing is simple enough: <p class="inwebparagraph"><a id="SP5"></a><b>&#167;5. Printing and parsing. </b>Printing is simple enough:
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">VersionNumbers::to_text</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">semantic_version_number</span><span class="plain"> </span><span class="identifier">V</span><span class="plain">) {</span> <span class="reserved">void</span><span class="plain"> </span><span class="functiontext">VersionNumbers::to_text</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">semantic_version_number</span><span class="plain"> </span><span class="identifier">V</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">VersionNumbers::is_null</span><span class="plain">(</span><span class="identifier">V</span><span class="plain">)) { </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"null"</span><span class="plain">); </span><span class="reserved">return</span><span class="plain">; }</span> <span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">VersionNumbers::is_null</span><span class="plain">(</span><span class="identifier">V</span><span class="plain">)) { </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"null"</span><span class="plain">); </span><span class="reserved">return</span><span class="plain">; }</span>
@ -189,7 +186,6 @@ variadic macros are not carefully enough type-checked by <code class="display"><
to catch this sort of slip. to catch this sort of slip.
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">VersionNumbers::writer</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">format_string</span><span class="plain">, </span><span class="reserved">void</span><span class="plain"> *</span><span class="identifier">vE</span><span class="plain">) {</span> <span class="reserved">void</span><span class="plain"> </span><span class="functiontext">VersionNumbers::writer</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">format_string</span><span class="plain">, </span><span class="reserved">void</span><span class="plain"> *</span><span class="identifier">vE</span><span class="plain">) {</span>
<span class="reserved">semantic_version_number</span><span class="plain"> *</span><span class="identifier">V</span><span class="plain"> = (</span><span class="reserved">semantic_version_number</span><span class="plain"> *) </span><span class="identifier">vE</span><span class="plain">;</span> <span class="reserved">semantic_version_number</span><span class="plain"> *</span><span class="identifier">V</span><span class="plain"> = (</span><span class="reserved">semantic_version_number</span><span class="plain"> *) </span><span class="identifier">vE</span><span class="plain">;</span>
@ -303,7 +299,6 @@ of digits only, and alphabetically otherwise; and finally the number of
prerelease elements. Build metadata is disregarded entirely. prerelease elements. Build metadata is disregarded entirely.
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">VersionNumbers::le</span><span class="plain">(</span><span class="reserved">semantic_version_number</span><span class="plain"> </span><span class="identifier">V1</span><span class="plain">, </span><span class="reserved">semantic_version_number</span><span class="plain"> </span><span class="identifier">V2</span><span class="plain">) {</span> <span class="reserved">int</span><span class="plain"> </span><span class="functiontext">VersionNumbers::le</span><span class="plain">(</span><span class="reserved">semantic_version_number</span><span class="plain"> </span><span class="identifier">V1</span><span class="plain">, </span><span class="reserved">semantic_version_number</span><span class="plain"> </span><span class="identifier">V2</span><span class="plain">) {</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">i</span><span class="plain">=0; </span><span class="identifier">i</span><span class="plain">&lt;</span><span class="constant">SEMVER_NUMBER_DEPTH</span><span class="plain">; </span><span class="identifier">i</span><span class="plain">++) {</span> <span class="reserved">for</span><span class="plain"> (</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">i</span><span class="plain">=0; </span><span class="identifier">i</span><span class="plain">&lt;</span><span class="constant">SEMVER_NUMBER_DEPTH</span><span class="plain">; </span><span class="identifier">i</span><span class="plain">++) {</span>
@ -346,7 +341,6 @@ prerelease elements. Build metadata is disregarded entirely.
as if they were 0: as if they were 0:
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">VersionNumbers::floor</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">N</span><span class="plain">) {</span> <span class="reserved">int</span><span class="plain"> </span><span class="functiontext">VersionNumbers::floor</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">N</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">N</span><span class="plain"> &lt; </span><span class="constant">0</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="constant">0</span><span class="plain">;</span> <span class="reserved">if</span><span class="plain"> (</span><span class="identifier">N</span><span class="plain"> &lt; </span><span class="constant">0</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="constant">0</span><span class="plain">;</span>
@ -363,7 +357,6 @@ otherwise. If the value has more than about 10 digits, then the result will
not be meaningful, which I think is a technical violation of the standard. not be meaningful, which I think is a technical violation of the standard.
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">VersionNumbers::strict_atoi</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">T</span><span class="plain">) {</span> <span class="reserved">int</span><span class="plain"> </span><span class="functiontext">VersionNumbers::strict_atoi</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">T</span><span class="plain">) {</span>
<span class="identifier">LOOP_THROUGH_TEXT</span><span class="plain">(</span><span class="identifier">pos</span><span class="plain">, </span><span class="identifier">T</span><span class="plain">)</span> <span class="identifier">LOOP_THROUGH_TEXT</span><span class="plain">(</span><span class="identifier">pos</span><span class="plain">, </span><span class="identifier">T</span><span class="plain">)</span>
@ -385,7 +378,6 @@ These are trichotomous, that is, for each pair <code class="display"><span class
is true. is true.
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">VersionNumbers::eq</span><span class="plain">(</span><span class="reserved">semantic_version_number</span><span class="plain"> </span><span class="identifier">V1</span><span class="plain">, </span><span class="reserved">semantic_version_number</span><span class="plain"> </span><span class="identifier">V2</span><span class="plain">) {</span> <span class="reserved">int</span><span class="plain"> </span><span class="functiontext">VersionNumbers::eq</span><span class="plain">(</span><span class="reserved">semantic_version_number</span><span class="plain"> </span><span class="identifier">V1</span><span class="plain">, </span><span class="reserved">semantic_version_number</span><span class="plain"> </span><span class="identifier">V2</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="functiontext">VersionNumbers::le</span><span class="plain">(</span><span class="identifier">V1</span><span class="plain">, </span><span class="identifier">V2</span><span class="plain">)) &amp;&amp; (</span><span class="functiontext">VersionNumbers::le</span><span class="plain">(</span><span class="identifier">V2</span><span class="plain">, </span><span class="identifier">V1</span><span class="plain">)))</span> <span class="reserved">if</span><span class="plain"> ((</span><span class="functiontext">VersionNumbers::le</span><span class="plain">(</span><span class="identifier">V1</span><span class="plain">, </span><span class="identifier">V2</span><span class="plain">)) &amp;&amp; (</span><span class="functiontext">VersionNumbers::le</span><span class="plain">(</span><span class="identifier">V2</span><span class="plain">, </span><span class="identifier">V1</span><span class="plain">)))</span>
@ -425,7 +417,6 @@ is true.
<p class="inwebparagraph"><a id="SP12"></a><b>&#167;12. </b>And the following can be used for sorting, following the <code class="display"><span class="extract">strcmp</span></code> convention. <p class="inwebparagraph"><a id="SP12"></a><b>&#167;12. </b>And the following can be used for sorting, following the <code class="display"><span class="extract">strcmp</span></code> convention.
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">VersionNumbers::cmp</span><span class="plain">(</span><span class="reserved">semantic_version_number</span><span class="plain"> </span><span class="identifier">V1</span><span class="plain">, </span><span class="reserved">semantic_version_number</span><span class="plain"> </span><span class="identifier">V2</span><span class="plain">) {</span> <span class="reserved">int</span><span class="plain"> </span><span class="functiontext">VersionNumbers::cmp</span><span class="plain">(</span><span class="reserved">semantic_version_number</span><span class="plain"> </span><span class="identifier">V1</span><span class="plain">, </span><span class="reserved">semantic_version_number</span><span class="plain"> </span><span class="identifier">V2</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">VersionNumbers::eq</span><span class="plain">(</span><span class="identifier">V1</span><span class="plain">, </span><span class="identifier">V2</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="constant">0</span><span class="plain">;</span> <span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">VersionNumbers::eq</span><span class="plain">(</span><span class="identifier">V1</span><span class="plain">, </span><span class="identifier">V2</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="constant">0</span><span class="plain">;</span>

View file

@ -73,7 +73,6 @@ no sense for an interval to be empty seen from one end but not the other.
and <code class="display"><span class="extract">)</span></code> for open ones. and <code class="display"><span class="extract">)</span></code> for open ones.
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">VersionNumberRanges::write_range</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">semver_range</span><span class="plain"> *</span><span class="identifier">R</span><span class="plain">) {</span> <span class="reserved">void</span><span class="plain"> </span><span class="functiontext">VersionNumberRanges::write_range</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">semver_range</span><span class="plain"> *</span><span class="identifier">R</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">R</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"no range"</span><span class="plain">);</span> <span class="reserved">if</span><span class="plain"> (</span><span class="identifier">R</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"no range"</span><span class="plain">);</span>
@ -99,7 +98,6 @@ and <code class="display"><span class="extract">)</span></code> for open ones.
number lies in this range. number lies in this range.
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">semver_range</span><span class="plain"> *</span><span class="functiontext">VersionNumberRanges::any_range</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span> <span class="reserved">semver_range</span><span class="plain"> *</span><span class="functiontext">VersionNumberRanges::any_range</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="reserved">semver_range</span><span class="plain"> *</span><span class="identifier">R</span><span class="plain"> = </span><span class="identifier">CREATE</span><span class="plain">(</span><span class="reserved">semver_range</span><span class="plain">);</span> <span class="reserved">semver_range</span><span class="plain"> *</span><span class="identifier">R</span><span class="plain"> = </span><span class="identifier">CREATE</span><span class="plain">(</span><span class="reserved">semver_range</span><span class="plain">);</span>
@ -138,7 +136,6 @@ alphanumeric string gives it lower precendence than all other prerelease
versions. versions.
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">semver_range</span><span class="plain"> *</span><span class="functiontext">VersionNumberRanges::compatibility_range</span><span class="plain">(</span><span class="reserved">semantic_version_number</span><span class="plain"> </span><span class="identifier">V</span><span class="plain">) {</span> <span class="reserved">semver_range</span><span class="plain"> *</span><span class="functiontext">VersionNumberRanges::compatibility_range</span><span class="plain">(</span><span class="reserved">semantic_version_number</span><span class="plain"> </span><span class="identifier">V</span><span class="plain">) {</span>
<span class="reserved">semver_range</span><span class="plain"> *</span><span class="identifier">R</span><span class="plain"> = </span><span class="functiontext">VersionNumberRanges::any_range</span><span class="plain">();</span> <span class="reserved">semver_range</span><span class="plain"> *</span><span class="identifier">R</span><span class="plain"> = </span><span class="functiontext">VersionNumberRanges::any_range</span><span class="plain">();</span>
@ -164,7 +161,6 @@ versions.
inclusive: inclusive:
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">semver_range</span><span class="plain"> *</span><span class="functiontext">VersionNumberRanges::at_least_range</span><span class="plain">(</span><span class="reserved">semantic_version_number</span><span class="plain"> </span><span class="identifier">V</span><span class="plain">) {</span> <span class="reserved">semver_range</span><span class="plain"> *</span><span class="functiontext">VersionNumberRanges::at_least_range</span><span class="plain">(</span><span class="reserved">semantic_version_number</span><span class="plain"> </span><span class="identifier">V</span><span class="plain">) {</span>
<span class="reserved">semver_range</span><span class="plain"> *</span><span class="identifier">R</span><span class="plain"> = </span><span class="functiontext">VersionNumberRanges::any_range</span><span class="plain">();</span> <span class="reserved">semver_range</span><span class="plain"> *</span><span class="identifier">R</span><span class="plain"> = </span><span class="functiontext">VersionNumberRanges::any_range</span><span class="plain">();</span>
@ -190,7 +186,6 @@ inclusive:
<p class="inwebparagraph"><a id="SP6"></a><b>&#167;6. </b>Here we test whether V is at least a given end, and then at most: <p class="inwebparagraph"><a id="SP6"></a><b>&#167;6. </b>Here we test whether V is at least a given end, and then at most:
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">VersionNumberRanges::version_ge_end</span><span class="plain">(</span><span class="reserved">semantic_version_number</span><span class="plain"> </span><span class="identifier">V</span><span class="plain">, </span><span class="reserved">range_end</span><span class="plain"> </span><span class="identifier">E</span><span class="plain">) {</span> <span class="reserved">int</span><span class="plain"> </span><span class="functiontext">VersionNumberRanges::version_ge_end</span><span class="plain">(</span><span class="reserved">semantic_version_number</span><span class="plain"> </span><span class="identifier">V</span><span class="plain">, </span><span class="reserved">range_end</span><span class="plain"> </span><span class="identifier">E</span><span class="plain">) {</span>
<span class="reserved">switch</span><span class="plain"> (</span><span class="identifier">E</span><span class="plain">.</span><span class="identifier">end_type</span><span class="plain">) {</span> <span class="reserved">switch</span><span class="plain"> (</span><span class="identifier">E</span><span class="plain">.</span><span class="identifier">end_type</span><span class="plain">) {</span>
@ -234,7 +229,6 @@ inclusive:
<p class="inwebparagraph"><a id="SP7"></a><b>&#167;7. </b>This allows a simple way to write: <p class="inwebparagraph"><a id="SP7"></a><b>&#167;7. </b>This allows a simple way to write:
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">VersionNumberRanges::in_range</span><span class="plain">(</span><span class="reserved">semantic_version_number</span><span class="plain"> </span><span class="identifier">V</span><span class="plain">, </span><span class="reserved">semver_range</span><span class="plain"> *</span><span class="identifier">R</span><span class="plain">) {</span> <span class="reserved">int</span><span class="plain"> </span><span class="functiontext">VersionNumberRanges::in_range</span><span class="plain">(</span><span class="reserved">semantic_version_number</span><span class="plain"> </span><span class="identifier">V</span><span class="plain">, </span><span class="reserved">semver_range</span><span class="plain"> *</span><span class="identifier">R</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">R</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="constant">TRUE</span><span class="plain">;</span> <span class="reserved">if</span><span class="plain"> (</span><span class="identifier">R</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="constant">TRUE</span><span class="plain">;</span>
@ -264,7 +258,6 @@ upper end of <code class="display"><span class="extract">[..., 4]</span></code>
the boundary value is the same, open ends are stricter than closed ends. the boundary value is the same, open ends are stricter than closed ends.
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">VersionNumberRanges::stricter</span><span class="plain">(</span><span class="reserved">range_end</span><span class="plain"> </span><span class="identifier">E1</span><span class="plain">, </span><span class="reserved">range_end</span><span class="plain"> </span><span class="identifier">E2</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">lower</span><span class="plain">) {</span> <span class="reserved">int</span><span class="plain"> </span><span class="functiontext">VersionNumberRanges::stricter</span><span class="plain">(</span><span class="reserved">range_end</span><span class="plain"> </span><span class="identifier">E1</span><span class="plain">, </span><span class="reserved">range_end</span><span class="plain"> </span><span class="identifier">E2</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">lower</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">E1</span><span class="plain">.</span><span class="element">end_type</span><span class="plain"> == </span><span class="constant">EMPTY_RANGE_END</span><span class="plain">) &amp;&amp; (</span><span class="identifier">E2</span><span class="plain">.</span><span class="element">end_type</span><span class="plain"> == </span><span class="constant">EMPTY_RANGE_END</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="constant">0</span><span class="plain">;</span> <span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">E1</span><span class="plain">.</span><span class="element">end_type</span><span class="plain"> == </span><span class="constant">EMPTY_RANGE_END</span><span class="plain">) &amp;&amp; (</span><span class="identifier">E2</span><span class="plain">.</span><span class="element">end_type</span><span class="plain"> == </span><span class="constant">EMPTY_RANGE_END</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="constant">0</span><span class="plain">;</span>
@ -295,7 +288,6 @@ different version needs.) The return value is true if an actual change took
place, and false otherwise. place, and false otherwise.
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">VersionNumberRanges::intersect_range</span><span class="plain">(</span><span class="reserved">semver_range</span><span class="plain"> *</span><span class="identifier">R1</span><span class="plain">, </span><span class="reserved">semver_range</span><span class="plain"> *</span><span class="identifier">R2</span><span class="plain">) {</span> <span class="reserved">int</span><span class="plain"> </span><span class="functiontext">VersionNumberRanges::intersect_range</span><span class="plain">(</span><span class="reserved">semver_range</span><span class="plain"> *</span><span class="identifier">R1</span><span class="plain">, </span><span class="reserved">semver_range</span><span class="plain"> *</span><span class="identifier">R2</span><span class="plain">) {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">lc</span><span class="plain"> = </span><span class="functiontext">VersionNumberRanges::stricter</span><span class="plain">(</span><span class="identifier">R1</span><span class="plain">-&gt;</span><span class="element">lower</span><span class="plain">, </span><span class="identifier">R2</span><span class="plain">-&gt;</span><span class="element">lower</span><span class="plain">, </span><span class="constant">TRUE</span><span class="plain">);</span> <span class="reserved">int</span><span class="plain"> </span><span class="identifier">lc</span><span class="plain"> = </span><span class="functiontext">VersionNumberRanges::stricter</span><span class="plain">(</span><span class="identifier">R1</span><span class="plain">-&gt;</span><span class="element">lower</span><span class="plain">, </span><span class="identifier">R2</span><span class="plain">-&gt;</span><span class="element">lower</span><span class="plain">, </span><span class="constant">TRUE</span><span class="plain">);</span>

View file

@ -32,7 +32,6 @@
convenient to store them directly here than to use a dictionary. convenient to store them directly here than to use a dictionary.
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">web_bibliographic_datum</span><span class="plain"> {</span> <span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">web_bibliographic_datum</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">key</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">key</span><span class="plain">;</span>
@ -60,7 +59,6 @@ convenient to store them directly here than to use a dictionary.
<p class="inwebparagraph"><a id="SP3"></a><b>&#167;3. </b>The following check the rules: <p class="inwebparagraph"><a id="SP3"></a><b>&#167;3. </b>The following check the rules:
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Bibliographic::datum_can_be_declared</span><span class="plain">(</span><span class="reserved">web_md</span><span class="plain"> *</span><span class="identifier">Wm</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">key</span><span class="plain">) {</span> <span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Bibliographic::datum_can_be_declared</span><span class="plain">(</span><span class="reserved">web_md</span><span class="plain"> *</span><span class="identifier">Wm</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">key</span><span class="plain">) {</span>
<span class="reserved">web_bibliographic_datum</span><span class="plain"> *</span><span class="identifier">bd</span><span class="plain"> = </span><span class="functiontext">Bibliographic::look_up_datum</span><span class="plain">(</span><span class="identifier">Wm</span><span class="plain">, </span><span class="identifier">key</span><span class="plain">);</span> <span class="reserved">web_bibliographic_datum</span><span class="plain"> *</span><span class="identifier">bd</span><span class="plain"> = </span><span class="functiontext">Bibliographic::look_up_datum</span><span class="plain">(</span><span class="identifier">Wm</span><span class="plain">, </span><span class="identifier">key</span><span class="plain">);</span>
@ -84,7 +82,6 @@ convenient to store them directly here than to use a dictionary.
<p class="inwebparagraph"><a id="SP4"></a><b>&#167;4. Initialising a web. </b>Each web has the following slate of data: <p class="inwebparagraph"><a id="SP4"></a><b>&#167;4. Initialising a web. </b>Each web has the following slate of data:
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Bibliographic::initialise_data</span><span class="plain">(</span><span class="reserved">web_md</span><span class="plain"> *</span><span class="identifier">Wm</span><span class="plain">) {</span> <span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Bibliographic::initialise_data</span><span class="plain">(</span><span class="reserved">web_md</span><span class="plain"> *</span><span class="identifier">Wm</span><span class="plain">) {</span>
<span class="reserved">web_bibliographic_datum</span><span class="plain"> *</span><span class="identifier">bd</span><span class="plain">;</span> <span class="reserved">web_bibliographic_datum</span><span class="plain"> *</span><span class="identifier">bd</span><span class="plain">;</span>
@ -123,7 +120,6 @@ convenient to store them directly here than to use a dictionary.
to check that all the mandatory declarations have indeed been made: to check that all the mandatory declarations have indeed been made:
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Bibliographic::check_required_data</span><span class="plain">(</span><span class="reserved">web_md</span><span class="plain"> *</span><span class="identifier">Wm</span><span class="plain">) {</span> <span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Bibliographic::check_required_data</span><span class="plain">(</span><span class="reserved">web_md</span><span class="plain"> *</span><span class="identifier">Wm</span><span class="plain">) {</span>
<span class="reserved">web_bibliographic_datum</span><span class="plain"> *</span><span class="identifier">bd</span><span class="plain">;</span> <span class="reserved">web_bibliographic_datum</span><span class="plain"> *</span><span class="identifier">bd</span><span class="plain">;</span>
@ -142,7 +138,6 @@ to check that all the mandatory declarations have indeed been made:
<p class="inwebparagraph"><a id="SP6"></a><b>&#167;6. Reading bibliographic data. </b>Key names are case-sensitive. <p class="inwebparagraph"><a id="SP6"></a><b>&#167;6. Reading bibliographic data. </b>Key names are case-sensitive.
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="functiontext">Bibliographic::get_datum</span><span class="plain">(</span><span class="reserved">web_md</span><span class="plain"> *</span><span class="identifier">Wm</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">key</span><span class="plain">) {</span> <span class="reserved">text_stream</span><span class="plain"> *</span><span class="functiontext">Bibliographic::get_datum</span><span class="plain">(</span><span class="reserved">web_md</span><span class="plain"> *</span><span class="identifier">Wm</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">key</span><span class="plain">) {</span>
<span class="reserved">web_bibliographic_datum</span><span class="plain"> *</span><span class="identifier">bd</span><span class="plain"> = </span><span class="functiontext">Bibliographic::look_up_datum</span><span class="plain">(</span><span class="identifier">Wm</span><span class="plain">, </span><span class="identifier">key</span><span class="plain">);</span> <span class="reserved">web_bibliographic_datum</span><span class="plain"> *</span><span class="identifier">bd</span><span class="plain"> = </span><span class="functiontext">Bibliographic::look_up_datum</span><span class="plain">(</span><span class="identifier">Wm</span><span class="plain">, </span><span class="identifier">key</span><span class="plain">);</span>
@ -179,7 +174,6 @@ to check that all the mandatory declarations have indeed been made:
so this routine never fails. so this routine never fails.
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">web_bibliographic_datum</span><span class="plain"> *</span><span class="functiontext">Bibliographic::set_datum</span><span class="plain">(</span><span class="reserved">web_md</span><span class="plain"> *</span><span class="identifier">Wm</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">key</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">val</span><span class="plain">) {</span> <span class="reserved">web_bibliographic_datum</span><span class="plain"> *</span><span class="functiontext">Bibliographic::set_datum</span><span class="plain">(</span><span class="reserved">web_md</span><span class="plain"> *</span><span class="identifier">Wm</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">key</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">val</span><span class="plain">) {</span>
<span class="reserved">web_bibliographic_datum</span><span class="plain"> *</span><span class="identifier">bd</span><span class="plain"> = </span><span class="functiontext">Bibliographic::look_up_datum</span><span class="plain">(</span><span class="identifier">Wm</span><span class="plain">, </span><span class="identifier">key</span><span class="plain">);</span> <span class="reserved">web_bibliographic_datum</span><span class="plain"> *</span><span class="identifier">bd</span><span class="plain"> = </span><span class="functiontext">Bibliographic::look_up_datum</span><span class="plain">(</span><span class="identifier">Wm</span><span class="plain">, </span><span class="identifier">key</span><span class="plain">);</span>

View file

@ -32,7 +32,6 @@
file exists, we look for the same thing in the current working directory. file exists, we look for the same thing in the current working directory.
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">filename</span><span class="plain"> *</span><span class="functiontext">BuildFiles::build_file_for_web</span><span class="plain">(</span><span class="reserved">web_md</span><span class="plain"> *</span><span class="identifier">WS</span><span class="plain">) {</span> <span class="reserved">filename</span><span class="plain"> *</span><span class="functiontext">BuildFiles::build_file_for_web</span><span class="plain">(</span><span class="reserved">web_md</span><span class="plain"> *</span><span class="identifier">WS</span><span class="plain">) {</span>
<span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">F</span><span class="plain"> = </span><span class="functiontext">Filenames::in_folder</span><span class="plain">(</span><span class="identifier">WS</span><span class="plain">-&gt;</span><span class="element">path_to_web</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"build.txt"</span><span class="plain">);</span> <span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">F</span><span class="plain"> = </span><span class="functiontext">Filenames::in_folder</span><span class="plain">(</span><span class="identifier">WS</span><span class="plain">-&gt;</span><span class="element">path_to_web</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"build.txt"</span><span class="plain">);</span>
@ -50,7 +49,6 @@ file exists, we look for the same thing in the current working directory.
<p class="inwebparagraph"><a id="SP2"></a><b>&#167;2. </b>The format of such a file is very simple: up to three text fields: <p class="inwebparagraph"><a id="SP2"></a><b>&#167;2. </b>The format of such a file is very simple: up to three text fields:
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">build_file_data</span><span class="plain"> {</span> <span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">build_file_data</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">prerelease_text</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">prerelease_text</span><span class="plain">;</span>
@ -66,7 +64,6 @@ file exists, we look for the same thing in the current working directory.
<p class="inwebparagraph"><a id="SP3"></a><b>&#167;3. </b>Here's how to read in a build file: <p class="inwebparagraph"><a id="SP3"></a><b>&#167;3. </b>Here's how to read in a build file:
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">build_file_data</span><span class="plain"> </span><span class="functiontext">BuildFiles::read</span><span class="plain">(</span><span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">F</span><span class="plain">) {</span> <span class="reserved">build_file_data</span><span class="plain"> </span><span class="functiontext">BuildFiles::read</span><span class="plain">(</span><span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">F</span><span class="plain">) {</span>
<span class="reserved">build_file_data</span><span class="plain"> </span><span class="identifier">bfd</span><span class="plain">;</span> <span class="reserved">build_file_data</span><span class="plain"> </span><span class="identifier">bfd</span><span class="plain">;</span>
@ -104,7 +101,6 @@ file exists, we look for the same thing in the current working directory.
<p class="inwebparagraph"><a id="SP4"></a><b>&#167;4. </b>And here is how to write one: <p class="inwebparagraph"><a id="SP4"></a><b>&#167;4. </b>And here is how to write one:
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">BuildFiles::write</span><span class="plain">(</span><span class="reserved">build_file_data</span><span class="plain"> </span><span class="identifier">bfd</span><span class="plain">, </span><span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">F</span><span class="plain">) {</span> <span class="reserved">void</span><span class="plain"> </span><span class="functiontext">BuildFiles::write</span><span class="plain">(</span><span class="reserved">build_file_data</span><span class="plain"> </span><span class="identifier">bfd</span><span class="plain">, </span><span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">F</span><span class="plain">) {</span>
<span class="reserved">text_stream</span><span class="plain"> </span><span class="identifier">vr_stream</span><span class="plain">;</span> <span class="reserved">text_stream</span><span class="plain"> </span><span class="identifier">vr_stream</span><span class="plain">;</span>
@ -128,7 +124,6 @@ file exists, we look for the same thing in the current working directory.
set some bibliographic data. set some bibliographic data.
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">BuildFiles::set_bibliographic_data_for</span><span class="plain">(</span><span class="reserved">web_md</span><span class="plain"> *</span><span class="identifier">WS</span><span class="plain">) {</span> <span class="reserved">void</span><span class="plain"> </span><span class="functiontext">BuildFiles::set_bibliographic_data_for</span><span class="plain">(</span><span class="reserved">web_md</span><span class="plain"> *</span><span class="identifier">WS</span><span class="plain">) {</span>
<span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">F</span><span class="plain"> = </span><span class="functiontext">BuildFiles::build_file_for_web</span><span class="plain">(</span><span class="identifier">WS</span><span class="plain">);</span> <span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">F</span><span class="plain"> = </span><span class="functiontext">BuildFiles::build_file_for_web</span><span class="plain">(</span><span class="identifier">WS</span><span class="plain">);</span>
@ -158,7 +153,6 @@ the Contents page to specify all of this.
guaranteed to produce a semver-legal version number. guaranteed to produce a semver-legal version number.
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">BuildFiles::deduce_semver</span><span class="plain">(</span><span class="reserved">web_md</span><span class="plain"> *</span><span class="identifier">WS</span><span class="plain">) {</span> <span class="reserved">void</span><span class="plain"> </span><span class="functiontext">BuildFiles::deduce_semver</span><span class="plain">(</span><span class="reserved">web_md</span><span class="plain"> *</span><span class="identifier">WS</span><span class="plain">) {</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">combined</span><span class="plain">);</span> <span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">combined</span><span class="plain">);</span>
@ -194,7 +188,6 @@ guaranteed to produce a semver-legal version number.
number if we find that the date has changed. number if we find that the date has changed.
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">BuildFiles::advance_for_web</span><span class="plain">(</span><span class="reserved">web_md</span><span class="plain"> *</span><span class="identifier">WS</span><span class="plain">) {</span> <span class="reserved">void</span><span class="plain"> </span><span class="functiontext">BuildFiles::advance_for_web</span><span class="plain">(</span><span class="reserved">web_md</span><span class="plain"> *</span><span class="identifier">WS</span><span class="plain">) {</span>
<span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">F</span><span class="plain"> = </span><span class="functiontext">BuildFiles::build_file_for_web</span><span class="plain">(</span><span class="identifier">WS</span><span class="plain">);</span> <span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">F</span><span class="plain"> = </span><span class="functiontext">BuildFiles::build_file_for_web</span><span class="plain">(</span><span class="identifier">WS</span><span class="plain">);</span>
@ -222,7 +215,6 @@ number if we find that the date has changed.
rewrite <code class="display"><span class="extract">dateline</span></code> to today and return <code class="display"><span class="extract">FALSE</span></code>. rewrite <code class="display"><span class="extract">dateline</span></code> to today and return <code class="display"><span class="extract">FALSE</span></code>.
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">BuildFiles::dated_today</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">dateline</span><span class="plain">) {</span> <span class="reserved">int</span><span class="plain"> </span><span class="functiontext">BuildFiles::dated_today</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">dateline</span><span class="plain">) {</span>
<span class="reserved">char</span><span class="plain"> *</span><span class="identifier">monthname</span><span class="plain">[12] = { </span><span class="string">"January"</span><span class="plain">, </span><span class="string">"February"</span><span class="plain">, </span><span class="string">"March"</span><span class="plain">, </span><span class="string">"April"</span><span class="plain">, </span><span class="string">"May"</span><span class="plain">, </span><span class="string">"June"</span><span class="plain">,</span> <span class="reserved">char</span><span class="plain"> *</span><span class="identifier">monthname</span><span class="plain">[12] = { </span><span class="string">"January"</span><span class="plain">, </span><span class="string">"February"</span><span class="plain">, </span><span class="string">"March"</span><span class="plain">, </span><span class="string">"April"</span><span class="plain">, </span><span class="string">"May"</span><span class="plain">, </span><span class="string">"June"</span><span class="plain">,</span>
@ -256,7 +248,6 @@ then it rolls back around to <code class="display"><span class="extract">A</span
some 58 years. some 58 years.
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">BuildFiles::increment</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">T</span><span class="plain">) {</span> <span class="reserved">void</span><span class="plain"> </span><span class="functiontext">BuildFiles::increment</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">T</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">T</span><span class="plain">) != </span><span class="constant">4</span><span class="plain">) </span><span class="functiontext">Errors::with_text</span><span class="plain">(</span><span class="string">"build code malformed: %S"</span><span class="plain">, </span><span class="identifier">T</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">T</span><span class="plain">) != </span><span class="constant">4</span><span class="plain">) </span><span class="functiontext">Errors::with_text</span><span class="plain">(</span><span class="string">"build code malformed: %S"</span><span class="plain">, </span><span class="identifier">T</span><span class="plain">);</span>

View file

@ -62,7 +62,6 @@ means.
<p class="inwebparagraph"><a id="SP2"></a><b>&#167;2. </b></p> <p class="inwebparagraph"><a id="SP2"></a><b>&#167;2. </b></p>
<pre class="display"> <pre class="display">
<span class="reserved">module</span><span class="plain"> *</span><span class="functiontext">WebModules::new</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">pathname</span><span class="plain"> *</span><span class="identifier">at</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">m</span><span class="plain">) {</span> <span class="reserved">module</span><span class="plain"> *</span><span class="functiontext">WebModules::new</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">pathname</span><span class="plain"> *</span><span class="identifier">at</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">m</span><span class="plain">) {</span>
<span class="reserved">module</span><span class="plain"> *</span><span class="identifier">M</span><span class="plain"> = </span><span class="identifier">CREATE</span><span class="plain">(</span><span class="reserved">module</span><span class="plain">);</span> <span class="reserved">module</span><span class="plain"> *</span><span class="identifier">M</span><span class="plain"> = </span><span class="identifier">CREATE</span><span class="plain">(</span><span class="reserved">module</span><span class="plain">);</span>
@ -90,7 +89,6 @@ main web &mdash; which can be tangled, and results in an actual program &mdash;
internally named <code class="display"><span class="extract">"(main)"</span></code>, a name which the user will never see. internally named <code class="display"><span class="extract">"(main)"</span></code>, a name which the user will never see.
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">module</span><span class="plain"> *</span><span class="functiontext">WebModules::create_main_module</span><span class="plain">(</span><span class="reserved">web_md</span><span class="plain"> *</span><span class="identifier">WS</span><span class="plain">) {</span> <span class="reserved">module</span><span class="plain"> *</span><span class="functiontext">WebModules::create_main_module</span><span class="plain">(</span><span class="reserved">web_md</span><span class="plain"> *</span><span class="identifier">WS</span><span class="plain">) {</span>
<span class="reserved">return</span><span class="plain"> </span><span class="functiontext">WebModules::new</span><span class="plain">(</span><span class="identifier">I</span><span class="string">"(main)"</span><span class="plain">, </span><span class="identifier">WS</span><span class="plain">-&gt;</span><span class="element">path_to_web</span><span class="plain">, </span><span class="constant">READING_WEB_MOM</span><span class="plain">);</span> <span class="reserved">return</span><span class="plain"> </span><span class="functiontext">WebModules::new</span><span class="plain">(</span><span class="identifier">I</span><span class="string">"(main)"</span><span class="plain">, </span><span class="identifier">WS</span><span class="plain">-&gt;</span><span class="element">path_to_web</span><span class="plain">, </span><span class="constant">READING_WEB_MOM</span><span class="plain">);</span>
@ -107,7 +105,6 @@ needed when constructing makefiles, since the source code in B affects the
program generated by A. program generated by A.
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">WebModules::dependency</span><span class="plain">(</span><span class="reserved">module</span><span class="plain"> *</span><span class="identifier">A</span><span class="plain">, </span><span class="reserved">module</span><span class="plain"> *</span><span class="identifier">B</span><span class="plain">) {</span> <span class="reserved">void</span><span class="plain"> </span><span class="functiontext">WebModules::dependency</span><span class="plain">(</span><span class="reserved">module</span><span class="plain"> *</span><span class="identifier">A</span><span class="plain">, </span><span class="reserved">module</span><span class="plain"> *</span><span class="identifier">B</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">A</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) || (</span><span class="identifier">B</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">)) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"no module"</span><span class="plain">);</span> <span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">A</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) || (</span><span class="identifier">B</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">)) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"no module"</span><span class="plain">);</span>
@ -123,7 +120,6 @@ program generated by A.
(At one time there was going to be a more elaborate search hierarchy.) (At one time there was going to be a more elaborate search hierarchy.)
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">module_search</span><span class="plain"> {</span> <span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">module_search</span><span class="plain"> {</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">pathname</span><span class="plain"> *</span><span class="identifier">path_to_search</span><span class="plain">;</span> <span class="reserved">struct</span><span class="plain"> </span><span class="reserved">pathname</span><span class="plain"> *</span><span class="identifier">path_to_search</span><span class="plain">;</span>
@ -137,7 +133,6 @@ program generated by A.
<p class="inwebparagraph"><a id="SP6"></a><b>&#167;6. </b></p> <p class="inwebparagraph"><a id="SP6"></a><b>&#167;6. </b></p>
<pre class="display"> <pre class="display">
<span class="reserved">module_search</span><span class="plain"> *</span><span class="functiontext">WebModules::make_search_path</span><span class="plain">(</span><span class="reserved">pathname</span><span class="plain"> *</span><span class="identifier">ext_path</span><span class="plain">) {</span> <span class="reserved">module_search</span><span class="plain"> *</span><span class="functiontext">WebModules::make_search_path</span><span class="plain">(</span><span class="reserved">pathname</span><span class="plain"> *</span><span class="identifier">ext_path</span><span class="plain">) {</span>
<span class="reserved">module_search</span><span class="plain"> *</span><span class="identifier">ms</span><span class="plain"> = </span><span class="identifier">CREATE</span><span class="plain">(</span><span class="reserved">module_search</span><span class="plain">);</span> <span class="reserved">module_search</span><span class="plain"> *</span><span class="identifier">ms</span><span class="plain"> = </span><span class="identifier">CREATE</span><span class="plain">(</span><span class="reserved">module_search</span><span class="plain">);</span>
@ -154,7 +149,6 @@ program generated by A.
called <code class="display"><span class="extract">Blah</span></code> on disc? We try four possibilities in sequence: called <code class="display"><span class="extract">Blah</span></code> on disc? We try four possibilities in sequence:
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">module</span><span class="plain"> *</span><span class="functiontext">WebModules::find</span><span class="plain">(</span><span class="reserved">web_md</span><span class="plain"> *</span><span class="identifier">WS</span><span class="plain">, </span><span class="reserved">module_search</span><span class="plain"> *</span><span class="identifier">ms</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">pathname</span><span class="plain"> *</span><span class="identifier">X</span><span class="plain">) {</span> <span class="reserved">module</span><span class="plain"> *</span><span class="functiontext">WebModules::find</span><span class="plain">(</span><span class="reserved">web_md</span><span class="plain"> *</span><span class="identifier">WS</span><span class="plain">, </span><span class="reserved">module_search</span><span class="plain"> *</span><span class="identifier">ms</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">pathname</span><span class="plain"> *</span><span class="identifier">X</span><span class="plain">) {</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">);</span> <span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">);</span>
@ -202,7 +196,6 @@ and a dependency created from the web's <code class="display"><span class="extra
sought if it looks like a web. sought if it looks like a web.
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">WebModules::exists</span><span class="plain">(</span><span class="reserved">pathname</span><span class="plain"> *</span><span class="identifier">P</span><span class="plain">) {</span> <span class="reserved">int</span><span class="plain"> </span><span class="functiontext">WebModules::exists</span><span class="plain">(</span><span class="reserved">pathname</span><span class="plain"> *</span><span class="identifier">P</span><span class="plain">) {</span>
<span class="reserved">return</span><span class="plain"> </span><span class="functiontext">WebMetadata::directory_looks_like_a_web</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">);</span> <span class="reserved">return</span><span class="plain"> </span><span class="functiontext">WebMetadata::directory_looks_like_a_web</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">);</span>

View file

@ -58,7 +58,6 @@ produce the following metadata structure.
<p class="inwebparagraph">Each web produces a single instance of <code class="display"><span class="extract">web_md</span></code>: <p class="inwebparagraph">Each web produces a single instance of <code class="display"><span class="extract">web_md</span></code>:
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">web_md</span><span class="plain"> {</span> <span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">web_md</span><span class="plain"> {</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">pathname</span><span class="plain"> *</span><span class="identifier">path_to_web</span><span class="plain">; </span><span class="comment">relative to the current working directory</span> <span class="reserved">struct</span><span class="plain"> </span><span class="reserved">pathname</span><span class="plain"> *</span><span class="identifier">path_to_web</span><span class="plain">; </span><span class="comment">relative to the current working directory</span>
@ -88,7 +87,6 @@ produce the following metadata structure.
<p class="inwebparagraph"><a id="SP3"></a><b>&#167;3. </b>The <code class="display"><span class="extract">chapters_md</span></code> list in a <code class="display"><span class="extract">web_md</span></code> contains these as its entries: <p class="inwebparagraph"><a id="SP3"></a><b>&#167;3. </b>The <code class="display"><span class="extract">chapters_md</span></code> list in a <code class="display"><span class="extract">web_md</span></code> contains these as its entries:
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">chapter_md</span><span class="plain"> {</span> <span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">chapter_md</span><span class="plain"> {</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">ch_range</span><span class="plain">; </span><span class="comment">e.g., <code class="display"><span class="extract">P</span></code> for Preliminaries, <code class="display"><span class="extract">7</span></code> for Chapter 7, <code class="display"><span class="extract">C</span></code> for Appendix C</span> <span class="reserved">struct</span><span class="plain"> </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">ch_range</span><span class="plain">; </span><span class="comment">e.g., <code class="display"><span class="extract">P</span></code> for Preliminaries, <code class="display"><span class="extract">7</span></code> for Chapter 7, <code class="display"><span class="extract">C</span></code> for Appendix C</span>
@ -111,7 +109,6 @@ produce the following metadata structure.
<p class="inwebparagraph"><a id="SP4"></a><b>&#167;4. </b>And the <code class="display"><span class="extract">sections_md</span></code> list in a <code class="display"><span class="extract">chapter_md</span></code> contains these as its entries: <p class="inwebparagraph"><a id="SP4"></a><b>&#167;4. </b>And the <code class="display"><span class="extract">sections_md</span></code> list in a <code class="display"><span class="extract">chapter_md</span></code> contains these as its entries:
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">section_md</span><span class="plain"> {</span> <span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">section_md</span><span class="plain"> {</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">sect_title</span><span class="plain">; </span><span class="comment">e.g., "Program Control"</span> <span class="reserved">struct</span><span class="plain"> </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">sect_title</span><span class="plain">; </span><span class="comment">e.g., "Program Control"</span>
@ -138,7 +135,6 @@ in one (and thus, implicitly, a single chapter and a single section), in which
case a filename <code class="display"><span class="extract">alt_F</span></code> is supplied. case a filename <code class="display"><span class="extract">alt_F</span></code> is supplied.
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">web_md</span><span class="plain"> *</span><span class="functiontext">WebMetadata::get_without_modules</span><span class="plain">(</span><span class="reserved">pathname</span><span class="plain"> *</span><span class="identifier">P</span><span class="plain">, </span><span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">alt_F</span><span class="plain">) {</span> <span class="reserved">web_md</span><span class="plain"> *</span><span class="functiontext">WebMetadata::get_without_modules</span><span class="plain">(</span><span class="reserved">pathname</span><span class="plain"> *</span><span class="identifier">P</span><span class="plain">, </span><span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">alt_F</span><span class="plain">) {</span>
<span class="reserved">return</span><span class="plain"> </span><span class="functiontext">WebMetadata::get</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">, </span><span class="identifier">alt_F</span><span class="plain">, </span><span class="constant">V2_SYNTAX</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="constant">FALSE</span><span class="plain">, </span><span class="constant">FALSE</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">);</span> <span class="reserved">return</span><span class="plain"> </span><span class="functiontext">WebMetadata::get</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">, </span><span class="identifier">alt_F</span><span class="plain">, </span><span class="constant">V2_SYNTAX</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="constant">FALSE</span><span class="plain">, </span><span class="constant">FALSE</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">);</span>
@ -243,7 +239,6 @@ own right: instead, it's the top few lines of the single file. We handle that
by halting at the junction point. by halting at the junction point.
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">reader_state</span><span class="plain"> {</span> <span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">reader_state</span><span class="plain"> {</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">web_md</span><span class="plain"> *</span><span class="identifier">Wm</span><span class="plain">;</span> <span class="reserved">struct</span><span class="plain"> </span><span class="reserved">web_md</span><span class="plain"> *</span><span class="identifier">Wm</span><span class="plain">;</span>
@ -338,7 +333,6 @@ and sets out bibliographic information about the web, the sections and their
organisation, and so on. organisation, and so on.
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">WebMetadata::read_contents_line</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">line</span><span class="plain">, </span><span class="reserved">text_file_position</span><span class="plain"> *</span><span class="identifier">tfp</span><span class="plain">, </span><span class="reserved">void</span><span class="plain"> *</span><span class="identifier">X</span><span class="plain">) {</span> <span class="reserved">void</span><span class="plain"> </span><span class="functiontext">WebMetadata::read_contents_line</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">line</span><span class="plain">, </span><span class="reserved">text_file_position</span><span class="plain"> *</span><span class="identifier">tfp</span><span class="plain">, </span><span class="reserved">void</span><span class="plain"> *</span><span class="identifier">X</span><span class="plain">) {</span>
<span class="reserved">reader_state</span><span class="plain"> *</span><span class="identifier">RS</span><span class="plain"> = (</span><span class="reserved">reader_state</span><span class="plain"> *) </span><span class="identifier">X</span><span class="plain">;</span> <span class="reserved">reader_state</span><span class="plain"> *</span><span class="identifier">RS</span><span class="plain"> = (</span><span class="reserved">reader_state</span><span class="plain"> *) </span><span class="identifier">X</span><span class="plain">;</span>
@ -862,7 +856,6 @@ the extension needs to be <code class="display"><span class="extract">.i6t</span
<p class="inwebparagraph"><a id="SP8"></a><b>&#167;8. Relative pathnames or filenames. </b></p> <p class="inwebparagraph"><a id="SP8"></a><b>&#167;8. Relative pathnames or filenames. </b></p>
<pre class="display"> <pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">WebMetadata::directory_looks_like_a_web</span><span class="plain">(</span><span class="reserved">pathname</span><span class="plain"> *</span><span class="identifier">P</span><span class="plain">) {</span> <span class="reserved">int</span><span class="plain"> </span><span class="functiontext">WebMetadata::directory_looks_like_a_web</span><span class="plain">(</span><span class="reserved">pathname</span><span class="plain"> *</span><span class="identifier">P</span><span class="plain">) {</span>
<span class="reserved">return</span><span class="plain"> </span><span class="functiontext">TextFiles::exists</span><span class="plain">(</span><span class="functiontext">WebMetadata::contents_filename</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">));</span> <span class="reserved">return</span><span class="plain"> </span><span class="functiontext">TextFiles::exists</span><span class="plain">(</span><span class="functiontext">WebMetadata::contents_filename</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">));</span>
@ -881,7 +874,6 @@ the extension needs to be <code class="display"><span class="extract">.i6t</span
<p class="inwebparagraph"><a id="SP9"></a><b>&#167;9. Statistics. </b></p> <p class="inwebparagraph"><a id="SP9"></a><b>&#167;9. Statistics. </b></p>
<pre class="display"> <pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">WebMetadata::chapter_count</span><span class="plain">(</span><span class="reserved">web_md</span><span class="plain"> *</span><span class="identifier">Wm</span><span class="plain">) {</span> <span class="reserved">int</span><span class="plain"> </span><span class="functiontext">WebMetadata::chapter_count</span><span class="plain">(</span><span class="reserved">web_md</span><span class="plain"> *</span><span class="identifier">Wm</span><span class="plain">) {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">n</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span> <span class="reserved">int</span><span class="plain"> </span><span class="identifier">n</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>

View file

@ -30,7 +30,6 @@
<p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. Strings. </b></p> <p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. Strings. </b></p>
<pre class="display"> <pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Unit::test_strings</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span> <span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Unit::test_strings</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">S</span><span class="plain"> = </span><span class="functiontext">Str::new_from_wide_string</span><span class="plain">(</span><span class="identifier">L</span><span class="string">"Jack and Jill"</span><span class="plain">);</span> <span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">S</span><span class="plain"> = </span><span class="functiontext">Str::new_from_wide_string</span><span class="plain">(</span><span class="identifier">L</span><span class="string">"Jack and Jill"</span><span class="plain">);</span>
@ -70,7 +69,6 @@
<p class="inwebparagraph"><a id="SP2"></a><b>&#167;2. Literals. </b></p> <p class="inwebparagraph"><a id="SP2"></a><b>&#167;2. Literals. </b></p>
<pre class="display"> <pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Unit::test_literals</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span> <span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Unit::test_literals</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="identifier">LOG</span><span class="plain">(</span><span class="string">"This is \"tricky"</span><span class="plain">); </span><span class="identifier">LOG</span><span class="plain">(</span><span class="string">"%S"</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"bananas"</span><span class="plain">);</span> <span class="identifier">LOG</span><span class="plain">(</span><span class="string">"This is \"tricky"</span><span class="plain">); </span><span class="identifier">LOG</span><span class="plain">(</span><span class="string">"%S"</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"bananas"</span><span class="plain">);</span>
@ -92,7 +90,6 @@
<p class="inwebparagraph"><a id="SP3"></a><b>&#167;3. Dictionaries. </b></p> <p class="inwebparagraph"><a id="SP3"></a><b>&#167;3. Dictionaries. </b></p>
<pre class="display"> <pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Unit::test_dictionaries</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">arg</span><span class="plain">) {</span> <span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Unit::test_dictionaries</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">arg</span><span class="plain">) {</span>
<span class="reserved">dictionary</span><span class="plain"> *</span><span class="identifier">D</span><span class="plain"> = </span><span class="functiontext">Dictionaries::new</span><span class="plain">(2, </span><span class="constant">TRUE</span><span class="plain">);</span> <span class="reserved">dictionary</span><span class="plain"> *</span><span class="identifier">D</span><span class="plain"> = </span><span class="functiontext">Dictionaries::new</span><span class="plain">(2, </span><span class="constant">TRUE</span><span class="plain">);</span>
@ -153,7 +150,6 @@
<p class="inwebparagraph"><a id="SP4"></a><b>&#167;4. Regexp. </b></p> <p class="inwebparagraph"><a id="SP4"></a><b>&#167;4. Regexp. </b></p>
<pre class="display"> <pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Unit::test_regexp</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">arg</span><span class="plain">) {</span> <span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Unit::test_regexp</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">arg</span><span class="plain">) {</span>
<span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">F</span><span class="plain"> = </span><span class="functiontext">Filenames::from_text</span><span class="plain">(</span><span class="identifier">arg</span><span class="plain">);</span> <span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">F</span><span class="plain"> = </span><span class="functiontext">Filenames::from_text</span><span class="plain">(</span><span class="identifier">arg</span><span class="plain">);</span>
@ -193,7 +189,6 @@
<p class="inwebparagraph"><a id="SP5"></a><b>&#167;5. Replacements. </b></p> <p class="inwebparagraph"><a id="SP5"></a><b>&#167;5. Replacements. </b></p>
<pre class="display"> <pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Unit::test_replacement</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">arg</span><span class="plain">) {</span> <span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Unit::test_replacement</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">arg</span><span class="plain">) {</span>
<span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">F</span><span class="plain"> = </span><span class="functiontext">Filenames::from_text</span><span class="plain">(</span><span class="identifier">arg</span><span class="plain">);</span> <span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">F</span><span class="plain"> = </span><span class="functiontext">Filenames::from_text</span><span class="plain">(</span><span class="identifier">arg</span><span class="plain">);</span>
@ -227,7 +222,6 @@
<p class="inwebparagraph"><a id="SP6"></a><b>&#167;6. Linked lists. </b></p> <p class="inwebparagraph"><a id="SP6"></a><b>&#167;6. Linked lists. </b></p>
<pre class="display"> <pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Unit::test_linked_lists</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span> <span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Unit::test_linked_lists</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="reserved">linked_list</span><span class="plain"> *</span><span class="identifier">test_list</span><span class="plain"> = </span><span class="identifier">NEW_LINKED_LIST</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain">);</span> <span class="reserved">linked_list</span><span class="plain"> *</span><span class="identifier">test_list</span><span class="plain"> = </span><span class="identifier">NEW_LINKED_LIST</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain">);</span>
@ -258,7 +252,6 @@
<p class="inwebparagraph"><a id="SP7"></a><b>&#167;7. Stacks. </b></p> <p class="inwebparagraph"><a id="SP7"></a><b>&#167;7. Stacks. </b></p>
<pre class="display"> <pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Unit::test_stacks</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span> <span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Unit::test_stacks</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="constant">lifo_stack</span><span class="plain"> *</span><span class="identifier">test_stack</span><span class="plain"> = </span><span class="identifier">NEW_LIFO_STACK</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain">);</span> <span class="constant">lifo_stack</span><span class="plain"> *</span><span class="identifier">test_stack</span><span class="plain"> = </span><span class="identifier">NEW_LIFO_STACK</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain">);</span>
@ -291,7 +284,6 @@
<p class="inwebparagraph"><a id="SP8"></a><b>&#167;8. Semantic versions. </b></p> <p class="inwebparagraph"><a id="SP8"></a><b>&#167;8. Semantic versions. </b></p>
<pre class="display"> <pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Unit::test_range</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">text</span><span class="plain">) {</span> <span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Unit::test_range</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">text</span><span class="plain">) {</span>
<span class="reserved">semantic_version_number</span><span class="plain"> </span><span class="identifier">V</span><span class="plain"> = </span><span class="functiontext">VersionNumbers::from_text</span><span class="plain">(</span><span class="identifier">text</span><span class="plain">);</span> <span class="reserved">semantic_version_number</span><span class="plain"> </span><span class="identifier">V</span><span class="plain"> = </span><span class="functiontext">VersionNumbers::from_text</span><span class="plain">(</span><span class="identifier">text</span><span class="plain">);</span>

View file

@ -81,7 +81,6 @@ makes all the necessary constructor functions for creating objects of these
types. types.
</p> </p>
<pre class="display"> <pre class="display">
<span class="identifier">ALLOCATE_IN_ARRAYS</span><span class="plain">(</span><span class="reserved">source_line</span><span class="plain">, </span><span class="constant">1000</span><span class="plain">)</span> <span class="identifier">ALLOCATE_IN_ARRAYS</span><span class="plain">(</span><span class="reserved">source_line</span><span class="plain">, </span><span class="constant">1000</span><span class="plain">)</span>
<span class="identifier">ALLOCATE_INDIVIDUALLY</span><span class="plain">(</span><span class="reserved">breadcrumb_request</span><span class="plain">)</span> <span class="identifier">ALLOCATE_INDIVIDUALLY</span><span class="plain">(</span><span class="reserved">breadcrumb_request</span><span class="plain">)</span>

View file

@ -32,7 +32,6 @@
command line: there will only ever be one of these. command line: there will only ever be one of these.
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">inweb_instructions</span><span class="plain"> {</span> <span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">inweb_instructions</span><span class="plain"> {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">inweb_mode</span><span class="plain">; </span><span class="comment">our main mode of operation: one of the <code class="display"><span class="extract">*_MODE</span></code> constants</span> <span class="reserved">int</span><span class="plain"> </span><span class="identifier">inweb_mode</span><span class="plain">; </span><span class="comment">our main mode of operation: one of the <code class="display"><span class="extract">*_MODE</span></code> constants</span>
@ -68,6 +67,9 @@ command line: there will only ever be one of these.
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">verbose_switch</span><span class="plain">; </span><span class="comment"><code class="display"><span class="extract">-verbose</span></code>: print names of files read to stdout</span> <span class="reserved">int</span><span class="plain"> </span><span class="identifier">verbose_switch</span><span class="plain">; </span><span class="comment"><code class="display"><span class="extract">-verbose</span></code>: print names of files read to stdout</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">targets</span><span class="plain">; </span><span class="comment">used only for parsing</span> <span class="reserved">int</span><span class="plain"> </span><span class="identifier">targets</span><span class="plain">; </span><span class="comment">used only for parsing</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">programming_language</span><span class="plain"> *</span><span class="identifier">test_language_setting</span><span class="plain">; </span><span class="comment"><code class="display"><span class="extract">-test-language X</span></code></span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">test_language_on_setting</span><span class="plain">; </span><span class="comment"><code class="display"><span class="extract">-test-language-on X</span></code></span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">pathname</span><span class="plain"> *</span><span class="identifier">import_setting</span><span class="plain">; </span><span class="comment"><code class="display"><span class="extract">-import X</span></code>: where to find imported webs</span> <span class="reserved">struct</span><span class="plain"> </span><span class="reserved">pathname</span><span class="plain"> *</span><span class="identifier">import_setting</span><span class="plain">; </span><span class="comment"><code class="display"><span class="extract">-import X</span></code>: where to find imported webs</span>
<span class="plain">} </span><span class="reserved">inweb_instructions</span><span class="plain">;</span> <span class="plain">} </span><span class="reserved">inweb_instructions</span><span class="plain">;</span>
@ -89,7 +91,6 @@ to enumerate constants for the Inweb-specific command line switches, and
then declare them. then declare them.
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">inweb_instructions</span><span class="plain"> </span><span class="functiontext">Configuration::read</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">argc</span><span class="plain">, </span><span class="reserved">char</span><span class="plain"> **</span><span class="identifier">argv</span><span class="plain">) {</span> <span class="reserved">inweb_instructions</span><span class="plain"> </span><span class="functiontext">Configuration::read</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">argc</span><span class="plain">, </span><span class="reserved">char</span><span class="plain"> **</span><span class="identifier">argv</span><span class="plain">) {</span>
<span class="reserved">inweb_instructions</span><span class="plain"> </span><span class="identifier">args</span><span class="plain">;</span> <span class="reserved">inweb_instructions</span><span class="plain"> </span><span class="identifier">args</span><span class="plain">;</span>
@ -149,6 +150,8 @@ then declare them.
<span class="identifier">args</span><span class="plain">.</span><span class="element">weave_docs</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span> <span class="identifier">args</span><span class="plain">.</span><span class="element">weave_docs</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
<span class="identifier">args</span><span class="plain">.</span><span class="element">import_setting</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span> <span class="identifier">args</span><span class="plain">.</span><span class="element">import_setting</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">args</span><span class="plain">.</span><span class="element">targets</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span> <span class="identifier">args</span><span class="plain">.</span><span class="element">targets</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
<span class="identifier">args</span><span class="plain">.</span><span class="element">test_language_setting</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">args</span><span class="plain">.</span><span class="element">test_language_on_setting</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
</pre> </pre>
<p class="inwebparagraph"></p> <p class="inwebparagraph"></p>
@ -168,6 +171,8 @@ provides automatically.
<span class="definitionkeyword">enum</span> <span class="constant">LANGUAGE_CLSW</span> <span class="definitionkeyword">enum</span> <span class="constant">LANGUAGE_CLSW</span>
<span class="definitionkeyword">enum</span> <span class="constant">LANGUAGES_CLSW</span> <span class="definitionkeyword">enum</span> <span class="constant">LANGUAGES_CLSW</span>
<span class="definitionkeyword">enum</span> <span class="constant">SHOW_LANGUAGES_CLSW</span> <span class="definitionkeyword">enum</span> <span class="constant">SHOW_LANGUAGES_CLSW</span>
<span class="definitionkeyword">enum</span> <span class="constant">TEST_LANGUAGE_CLSW</span>
<span class="definitionkeyword">enum</span> <span class="constant">TEST_LANGUAGE_ON_CLSW</span>
<span class="definitionkeyword">enum</span> <span class="constant">ANALYSIS_CLSG</span> <span class="definitionkeyword">enum</span> <span class="constant">ANALYSIS_CLSG</span>
<span class="definitionkeyword">enum</span> <span class="constant">CATALOGUE_CLSW</span> <span class="definitionkeyword">enum</span> <span class="constant">CATALOGUE_CLSW</span>
<span class="definitionkeyword">enum</span> <span class="constant">FUNCTIONS_CLSW</span> <span class="definitionkeyword">enum</span> <span class="constant">FUNCTIONS_CLSW</span>
@ -222,6 +227,10 @@ provides automatically.
<span class="identifier">L</span><span class="string">"read all language definitions in path X"</span><span class="plain">);</span> <span class="identifier">L</span><span class="string">"read all language definitions in path X"</span><span class="plain">);</span>
<span class="functiontext">CommandLine::declare_switch</span><span class="plain">(</span><span class="constant">SHOW_LANGUAGES_CLSW</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"show-languages"</span><span class="plain">, </span><span class="constant">1</span><span class="plain">,</span> <span class="functiontext">CommandLine::declare_switch</span><span class="plain">(</span><span class="constant">SHOW_LANGUAGES_CLSW</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"show-languages"</span><span class="plain">, </span><span class="constant">1</span><span class="plain">,</span>
<span class="identifier">L</span><span class="string">"list programming languages supported by Inweb"</span><span class="plain">);</span> <span class="identifier">L</span><span class="string">"list programming languages supported by Inweb"</span><span class="plain">);</span>
<span class="functiontext">CommandLine::declare_switch</span><span class="plain">(</span><span class="constant">TEST_LANGUAGE_CLSW</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"test-language"</span><span class="plain">, </span><span class="constant">2</span><span class="plain">,</span>
<span class="identifier">L</span><span class="string">"test language X on..."</span><span class="plain">);</span>
<span class="functiontext">CommandLine::declare_switch</span><span class="plain">(</span><span class="constant">TEST_LANGUAGE_ON_CLSW</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"test-language-on"</span><span class="plain">, </span><span class="constant">2</span><span class="plain">,</span>
<span class="identifier">L</span><span class="string">"...the code in the file X"</span><span class="plain">);</span>
<span class="functiontext">CommandLine::end_group</span><span class="plain">();</span> <span class="functiontext">CommandLine::end_group</span><span class="plain">();</span>
<span class="functiontext">CommandLine::begin_group</span><span class="plain">(</span><span class="constant">ANALYSIS_CLSG</span><span class="plain">,</span> <span class="functiontext">CommandLine::begin_group</span><span class="plain">(</span><span class="constant">ANALYSIS_CLSG</span><span class="plain">,</span>
@ -295,7 +304,6 @@ provides automatically.
<p class="inwebparagraph"><a id="SP3"></a><b>&#167;3. </b>Foundation calls this on any <code class="display"><span class="extract">-switch</span></code> argument read: <p class="inwebparagraph"><a id="SP3"></a><b>&#167;3. </b>Foundation calls this on any <code class="display"><span class="extract">-switch</span></code> argument read:
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Configuration::switch</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">id</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">val</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">arg</span><span class="plain">, </span><span class="reserved">void</span><span class="plain"> *</span><span class="identifier">state</span><span class="plain">) {</span> <span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Configuration::switch</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">id</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">val</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">arg</span><span class="plain">, </span><span class="reserved">void</span><span class="plain"> *</span><span class="identifier">state</span><span class="plain">) {</span>
<span class="reserved">inweb_instructions</span><span class="plain"> *</span><span class="identifier">args</span><span class="plain"> = (</span><span class="reserved">inweb_instructions</span><span class="plain"> *) </span><span class="identifier">state</span><span class="plain">;</span> <span class="reserved">inweb_instructions</span><span class="plain"> *</span><span class="identifier">args</span><span class="plain"> = (</span><span class="reserved">inweb_instructions</span><span class="plain"> *) </span><span class="identifier">state</span><span class="plain">;</span>
@ -312,6 +320,13 @@ provides automatically.
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">SHOW_LANGUAGES_CLSW:</span> <span class="reserved">case</span><span class="plain"> </span><span class="identifier">SHOW_LANGUAGES_CLSW:</span>
<span class="identifier">args</span><span class="plain">-&gt;</span><span class="element">show_languages_switch</span><span class="plain"> = </span><span class="constant">TRUE</span><span class="plain">;</span> <span class="identifier">args</span><span class="plain">-&gt;</span><span class="element">show_languages_switch</span><span class="plain"> = </span><span class="constant">TRUE</span><span class="plain">;</span>
<span class="functiontext">Configuration::set_fundamental_mode</span><span class="plain">(</span><span class="identifier">args</span><span class="plain">, </span><span class="constant">ANALYSE_MODE</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span> <span class="functiontext">Configuration::set_fundamental_mode</span><span class="plain">(</span><span class="identifier">args</span><span class="plain">, </span><span class="constant">ANALYSE_MODE</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">TEST_LANGUAGE_CLSW:</span>
<span class="identifier">args</span><span class="plain">-&gt;</span><span class="element">test_language_setting</span><span class="plain"> =</span>
<span class="functiontext">Languages::read_definition</span><span class="plain">(</span><span class="functiontext">Filenames::from_text</span><span class="plain">(</span><span class="identifier">arg</span><span class="plain">));</span>
<span class="functiontext">Configuration::set_fundamental_mode</span><span class="plain">(</span><span class="identifier">args</span><span class="plain">, </span><span class="constant">ANALYSE_MODE</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">TEST_LANGUAGE_ON_CLSW:</span>
<span class="identifier">args</span><span class="plain">-&gt;</span><span class="element">test_language_on_setting</span><span class="plain"> = </span><span class="functiontext">Filenames::from_text</span><span class="plain">(</span><span class="identifier">arg</span><span class="plain">);</span>
<span class="functiontext">Configuration::set_fundamental_mode</span><span class="plain">(</span><span class="identifier">args</span><span class="plain">, </span><span class="constant">ANALYSE_MODE</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">CATALOGUE_CLSW:</span> <span class="reserved">case</span><span class="plain"> </span><span class="identifier">CATALOGUE_CLSW:</span>
<span class="identifier">args</span><span class="plain">-&gt;</span><span class="element">catalogue_switch</span><span class="plain"> = </span><span class="constant">TRUE</span><span class="plain">;</span> <span class="identifier">args</span><span class="plain">-&gt;</span><span class="element">catalogue_switch</span><span class="plain"> = </span><span class="constant">TRUE</span><span class="plain">;</span>
<span class="functiontext">Configuration::set_fundamental_mode</span><span class="plain">(</span><span class="identifier">args</span><span class="plain">, </span><span class="constant">ANALYSE_MODE</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span> <span class="functiontext">Configuration::set_fundamental_mode</span><span class="plain">(</span><span class="identifier">args</span><span class="plain">, </span><span class="constant">ANALYSE_MODE</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
@ -418,7 +433,6 @@ neither a switch (like <code class="display"><span class="extract">-weave</span>
the <code class="display"><span class="extract">X</span></code> in <code class="display"><span class="extract">-weave-as X</span></code>). the <code class="display"><span class="extract">X</span></code> in <code class="display"><span class="extract">-weave-as X</span></code>).
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Configuration::bareword</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">id</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">opt</span><span class="plain">, </span><span class="reserved">void</span><span class="plain"> *</span><span class="identifier">state</span><span class="plain">) {</span> <span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Configuration::bareword</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">id</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">opt</span><span class="plain">, </span><span class="reserved">void</span><span class="plain"> *</span><span class="identifier">state</span><span class="plain">) {</span>
<span class="reserved">inweb_instructions</span><span class="plain"> *</span><span class="identifier">args</span><span class="plain"> = (</span><span class="reserved">inweb_instructions</span><span class="plain"> *) </span><span class="identifier">state</span><span class="plain">;</span> <span class="reserved">inweb_instructions</span><span class="plain"> *</span><span class="identifier">args</span><span class="plain"> = (</span><span class="reserved">inweb_instructions</span><span class="plain"> *) </span><span class="identifier">state</span><span class="plain">;</span>
@ -440,7 +454,6 @@ are converted into swarm settings instead. <code class="display"><span class="ex
Otherwise, a range is a chapter number/letter, or a section range. Otherwise, a range is a chapter number/letter, or a section range.
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Configuration::set_range</span><span class="plain">(</span><span class="reserved">inweb_instructions</span><span class="plain"> *</span><span class="identifier">args</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">opt</span><span class="plain">) {</span> <span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Configuration::set_range</span><span class="plain">(</span><span class="reserved">inweb_instructions</span><span class="plain"> *</span><span class="identifier">args</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">opt</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">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>
@ -474,12 +487,11 @@ Otherwise, a range is a chapter number/letter, or a section range.
<p class="inwebparagraph"></p> <p class="inwebparagraph"></p>
<p class="endnote">The function Configuration::set_range is used in <a href="#SP4">&#167;4</a>, 1/pc (<a href="1-pc.html#SP7_3_3">&#167;7.3.3</a>).</p> <p class="endnote">The function Configuration::set_range is used in <a href="#SP4">&#167;4</a>, 1/pc (<a href="1-pc.html#SP7_4_3">&#167;7.4.3</a>).</p>
<p class="inwebparagraph"><a id="SP6"></a><b>&#167;6. </b>We can only be in a single mode at a time: <p class="inwebparagraph"><a id="SP6"></a><b>&#167;6. </b>We can only be in a single mode at a time:
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Configuration::set_fundamental_mode</span><span class="plain">(</span><span class="reserved">inweb_instructions</span><span class="plain"> *</span><span class="identifier">args</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">new_material</span><span class="plain">) {</span> <span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Configuration::set_fundamental_mode</span><span class="plain">(</span><span class="reserved">inweb_instructions</span><span class="plain"> *</span><span class="identifier">args</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">new_material</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">args</span><span class="plain">-&gt;</span><span class="identifier">inweb_mode</span><span class="plain"> != </span><span class="constant">NO_MODE</span><span class="plain">) &amp;&amp; (</span><span class="identifier">args</span><span class="plain">-&gt;</span><span class="element">inweb_mode</span><span class="plain"> != </span><span class="identifier">new_material</span><span class="plain">))</span> <span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">args</span><span class="plain">-&gt;</span><span class="identifier">inweb_mode</span><span class="plain"> != </span><span class="constant">NO_MODE</span><span class="plain">) &amp;&amp; (</span><span class="identifier">args</span><span class="plain">-&gt;</span><span class="element">inweb_mode</span><span class="plain"> != </span><span class="identifier">new_material</span><span class="plain">))</span>

View file

@ -32,7 +32,6 @@
versions: the second was cleaned up and simplified from the first in 2019. versions: the second was cleaned up and simplified from the first in 2019.
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">default_inweb_syntax</span><span class="plain"> = </span><span class="constant">V2_SYNTAX</span><span class="plain">;</span> <span class="reserved">int</span><span class="plain"> </span><span class="identifier">default_inweb_syntax</span><span class="plain"> = </span><span class="constant">V2_SYNTAX</span><span class="plain">;</span>
</pre> </pre>
@ -89,7 +88,6 @@ in the current working directory. The "materials" will then be in a further
subfolder called <code class="display"><span class="extract">Materials</span></code>. subfolder called <code class="display"><span class="extract">Materials</span></code>.
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">pathname</span><span class="plain"> *</span><span class="identifier">path_to_inweb</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">; </span><span class="comment">where we are installed</span> <span class="reserved">pathname</span><span class="plain"> *</span><span class="identifier">path_to_inweb</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">; </span><span class="comment">where we are installed</span>
<span class="reserved">pathname</span><span class="plain"> *</span><span class="identifier">path_to_inweb_materials</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">; </span><span class="comment">the materials pathname</span> <span class="reserved">pathname</span><span class="plain"> *</span><span class="identifier">path_to_inweb_materials</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">; </span><span class="comment">the materials pathname</span>
@ -101,7 +99,6 @@ subfolder called <code class="display"><span class="extract">Materials</span></c
<p class="inwebparagraph"><a id="SP5"></a><b>&#167;5. </b>We count the errors in order to be able to exit with a suitable exit code. <p class="inwebparagraph"><a id="SP5"></a><b>&#167;5. </b>We count the errors in order to be able to exit with a suitable exit code.
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">no_inweb_errors</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span> <span class="reserved">int</span><span class="plain"> </span><span class="identifier">no_inweb_errors</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
</pre> </pre>
@ -110,7 +107,6 @@ subfolder called <code class="display"><span class="extract">Materials</span></c
<p class="inwebparagraph"><a id="SP6"></a><b>&#167;6. Main routine. </b></p> <p class="inwebparagraph"><a id="SP6"></a><b>&#167;6. Main routine. </b></p>
<pre class="display"> <pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">main</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">argc</span><span class="plain">, </span><span class="reserved">char</span><span class="plain"> **</span><span class="identifier">argv</span><span class="plain">) {</span> <span class="reserved">int</span><span class="plain"> </span><span class="functiontext">main</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">argc</span><span class="plain">, </span><span class="reserved">char</span><span class="plain"> **</span><span class="identifier">argv</span><span class="plain">) {</span>
&lt;<span class="cwebmacro">Initialise inweb</span> <span class="cwebmacronumber">6.1</span>&gt;<span class="plain">;</span> &lt;<span class="cwebmacro">Initialise inweb</span> <span class="cwebmacronumber">6.1</span>&gt;<span class="plain">;</span>
@ -129,7 +125,7 @@ subfolder called <code class="display"><span class="extract">Materials</span></c
<p class="inwebparagraph"></p> <p class="inwebparagraph"></p>
<p class="endnote">The function main is used in <a href="#SP7_3_2">&#167;7.3.2</a>, 8/wm (<a href="8-wm.html#SP3">&#167;3</a>), 1/cnf (<a href="1-cnf.html#SP1">&#167;1</a>), 4/cl (<a href="4-cl.html#SP2_4_2_5">&#167;2.4.2.5</a>).</p> <p class="endnote">The function main is used in <a href="#SP7_4_2">&#167;7.4.2</a>, 8/wm (<a href="8-wm.html#SP3">&#167;3</a>), 1/cnf (<a href="1-cnf.html#SP1">&#167;1</a>), 4/cl (<a href="4-cl.html#SP2_4_2_5">&#167;2.4.2.5</a>).</p>
<p class="inwebparagraph"><a id="SP6_1"></a><b>&#167;6.1. </b><code class="display"> <p class="inwebparagraph"><a id="SP6_1"></a><b>&#167;6.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Initialise inweb</span> <span class="cwebmacronumber">6.1</span>&gt; = &lt;<span class="cwebmacrodefn">Initialise inweb</span> <span class="cwebmacronumber">6.1</span>&gt; =
@ -163,7 +159,6 @@ subfolder called <code class="display"><span class="extract">Materials</span></c
program: some input, some thinking, a choice of three forms of output. program: some input, some thinking, a choice of three forms of output.
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Main::follow_instructions</span><span class="plain">(</span><span class="reserved">inweb_instructions</span><span class="plain"> *</span><span class="identifier">ins</span><span class="plain">) {</span> <span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Main::follow_instructions</span><span class="plain">(</span><span class="reserved">inweb_instructions</span><span class="plain"> *</span><span class="identifier">ins</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="identifier">NULL</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="identifier">NULL</span><span class="plain">;</span>
@ -178,7 +173,8 @@ program: some input, some thinking, a choice of three forms of output.
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">no_inweb_errors</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">no_inweb_errors</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">ins</span><span class="plain">-&gt;</span><span class="element">inweb_mode</span><span class="plain"> == </span><span class="constant">TRANSLATE_MODE</span><span class="plain">) </span>&lt;<span class="cwebmacro">Translate a makefile</span> <span class="cwebmacronumber">7.1</span>&gt; <span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ins</span><span class="plain">-&gt;</span><span class="element">inweb_mode</span><span class="plain"> == </span><span class="constant">TRANSLATE_MODE</span><span class="plain">) </span>&lt;<span class="cwebmacro">Translate a makefile</span> <span class="cwebmacronumber">7.1</span>&gt;
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ins</span><span class="plain">-&gt;</span><span class="element">show_languages_switch</span><span class="plain">) </span>&lt;<span class="cwebmacro">List available programming languages</span> <span class="cwebmacronumber">7.2</span>&gt; <span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ins</span><span class="plain">-&gt;</span><span class="element">show_languages_switch</span><span class="plain">) </span>&lt;<span class="cwebmacro">List available programming languages</span> <span class="cwebmacronumber">7.2</span>&gt;
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ins</span><span class="plain">-&gt;</span><span class="element">inweb_mode</span><span class="plain"> != </span><span class="constant">NO_MODE</span><span class="plain">) </span>&lt;<span class="cwebmacro">Analyse, tangle or weave an existing web</span> <span class="cwebmacronumber">7.3</span>&gt;<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">ins</span><span class="plain">-&gt;</span><span class="element">test_language_setting</span><span class="plain">) || (</span><span class="identifier">ins</span><span class="plain">-&gt;</span><span class="element">test_language_on_setting</span><span class="plain">)) </span>&lt;<span class="cwebmacro">Test a language</span> <span class="cwebmacronumber">7.3</span>&gt;
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ins</span><span class="plain">-&gt;</span><span class="element">inweb_mode</span><span class="plain"> != </span><span class="constant">NO_MODE</span><span class="plain">) </span>&lt;<span class="cwebmacro">Analyse, tangle or weave an existing web</span> <span class="cwebmacronumber">7.4</span>&gt;<span class="plain">;</span>
<span class="plain">}</span> <span class="plain">}</span>
<span class="plain">}</span> <span class="plain">}</span>
</pre> </pre>
@ -236,32 +232,60 @@ program: some input, some thinking, a choice of three forms of output.
<p class="endnote">This code is used in <a href="#SP7">&#167;7</a>.</p> <p class="endnote">This code is used in <a href="#SP7">&#167;7</a>.</p>
<p class="inwebparagraph"><a id="SP7_3"></a><b>&#167;7.3. </b>But otherwise we do something with the given web: <p class="inwebparagraph"><a id="SP7_3"></a><b>&#167;7.3. </b>And this:
</p> </p>
<p class="macrodefinition"><code class="display"> <p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Analyse, tangle or weave an existing web</span> <span class="cwebmacronumber">7.3</span>&gt; = &lt;<span class="cwebmacrodefn">Test a language</span> <span class="cwebmacronumber">7.3</span>&gt; =
</code></p> </code></p>
<pre class="displaydefn"> <pre class="displaydefn">
<span class="functiontext">Reader::print_web_statistics</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">);</span> <span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">ins</span><span class="plain">-&gt;</span><span class="identifier">test_language_setting</span><span class="plain">) &amp;&amp; (</span><span class="identifier">ins</span><span class="plain">-&gt;</span><span class="element">test_language_on_setting</span><span class="plain">)) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ins</span><span class="plain">-&gt;</span><span class="element">inweb_mode</span><span class="plain"> == </span><span class="constant">ANALYSE_MODE</span><span class="plain">) </span>&lt;<span class="cwebmacro">Analyse the web</span> <span class="cwebmacronumber">7.3.1</span>&gt;<span class="plain">;</span> <span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">matter</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ins</span><span class="plain">-&gt;</span><span class="element">inweb_mode</span><span class="plain"> == </span><span class="constant">TANGLE_MODE</span><span class="plain">) </span>&lt;<span class="cwebmacro">Tangle the web</span> <span class="cwebmacronumber">7.3.2</span>&gt;<span class="plain">;</span> <span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">coloured</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ins</span><span class="plain">-&gt;</span><span class="element">inweb_mode</span><span class="plain"> == </span><span class="constant">WEAVE_MODE</span><span class="plain">) </span>&lt;<span class="cwebmacro">Weave the web</span> <span class="cwebmacronumber">7.3.3</span>&gt;<span class="plain">;</span> <span class="functiontext">Painter::colour_file</span><span class="plain">(</span><span class="identifier">ins</span><span class="plain">-&gt;</span><span class="element">test_language_setting</span><span class="plain">, </span><span class="identifier">ins</span><span class="plain">-&gt;</span><span class="element">test_language_on_setting</span><span class="plain">,</span>
<span class="identifier">matter</span><span class="plain">, </span><span class="identifier">coloured</span><span class="plain">);</span>
<span class="identifier">PRINT</span><span class="plain">(</span><span class="string">"Test of colouring for language %S:\n%S\n%S\n"</span><span class="plain">,</span>
<span class="identifier">ins</span><span class="plain">-&gt;</span><span class="element">test_language_setting</span><span class="plain">-&gt;</span><span class="element">language_name</span><span class="plain">, </span><span class="identifier">matter</span><span class="plain">, </span><span class="identifier">coloured</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">matter</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">coloured</span><span class="plain">);</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
<span class="functiontext">Errors::fatal</span><span class="plain">(</span><span class="string">"-test-language and -test-language-on must both be given"</span><span class="plain">);</span>
<span class="plain">}</span>
</pre> </pre>
<p class="inwebparagraph"></p> <p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP7">&#167;7</a>.</p> <p class="endnote">This code is used in <a href="#SP7">&#167;7</a>.</p>
<p class="inwebparagraph"><a id="SP7_3_1"></a><b>&#167;7.3.1. </b>"Analysis" invokes any combination of the following diagnostic tools: <p class="inwebparagraph"><a id="SP7_4"></a><b>&#167;7.4. </b>But otherwise we do something with the given web:
</p> </p>
<p class="macrodefinition"><code class="display"> <p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Analyse the web</span> <span class="cwebmacronumber">7.3.1</span>&gt; = &lt;<span class="cwebmacrodefn">Analyse, tangle or weave an existing web</span> <span class="cwebmacronumber">7.4</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="functiontext">Reader::print_web_statistics</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ins</span><span class="plain">-&gt;</span><span class="element">inweb_mode</span><span class="plain"> == </span><span class="constant">ANALYSE_MODE</span><span class="plain">) </span>&lt;<span class="cwebmacro">Analyse the web</span> <span class="cwebmacronumber">7.4.1</span>&gt;<span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ins</span><span class="plain">-&gt;</span><span class="element">inweb_mode</span><span class="plain"> == </span><span class="constant">TANGLE_MODE</span><span class="plain">) </span>&lt;<span class="cwebmacro">Tangle the web</span> <span class="cwebmacronumber">7.4.2</span>&gt;<span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ins</span><span class="plain">-&gt;</span><span class="element">inweb_mode</span><span class="plain"> == </span><span class="constant">WEAVE_MODE</span><span class="plain">) </span>&lt;<span class="cwebmacro">Weave the web</span> <span class="cwebmacronumber">7.4.3</span>&gt;<span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP7">&#167;7</a>.</p>
<p class="inwebparagraph"><a id="SP7_4_1"></a><b>&#167;7.4.1. </b>"Analysis" invokes any combination of the following diagnostic tools:
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Analyse the web</span> <span class="cwebmacronumber">7.4.1</span>&gt; =
</code></p> </code></p>
@ -287,9 +311,9 @@ program: some input, some thinking, a choice of three forms of output.
<p class="inwebparagraph"></p> <p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP7_3">&#167;7.3</a>.</p> <p class="endnote">This code is used in <a href="#SP7_4">&#167;7.4</a>.</p>
<p class="inwebparagraph"><a id="SP7_3_2"></a><b>&#167;7.3.2. </b>We can tangle to any one of what might be several targets, numbered upwards <p class="inwebparagraph"><a id="SP7_4_2"></a><b>&#167;7.4.2. </b>We can tangle to any one of what might be several targets, numbered upwards
from 0. Target 0 always exists, and is the main program forming the web. For from 0. Target 0 always exists, and is the main program forming the web. For
many webs, this will in fact be the only target, but Inweb also allows many webs, this will in fact be the only target, but Inweb also allows
marked sections of a web to be independent targets &mdash; the idea here is to marked sections of a web to be independent targets &mdash; the idea here is to
@ -307,7 +331,7 @@ line , but otherwise we impose a sensible choice based on the target.
<p class="macrodefinition"><code class="display"> <p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Tangle the web</span> <span class="cwebmacronumber">7.3.2</span>&gt; = &lt;<span class="cwebmacrodefn">Tangle the web</span> <span class="cwebmacronumber">7.4.2</span>&gt; =
</code></p> </code></p>
@ -315,9 +339,9 @@ line , but otherwise we impose a sensible choice based on the target.
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">tangle_leaf</span><span class="plain">);</span> <span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">tangle_leaf</span><span class="plain">);</span>
<span class="reserved">tangle_target</span><span class="plain"> *</span><span class="identifier">tn</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span> <span class="reserved">tangle_target</span><span class="plain"> *</span><span class="identifier">tn</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="functiontext">Str::eq_wide_string</span><span class="plain">(</span><span class="identifier">ins</span><span class="plain">-&gt;</span><span class="element">chosen_range</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"0"</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">ins</span><span class="plain">-&gt;</span><span class="element">chosen_range</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"0"</span><span class="plain">)) {</span>
&lt;<span class="cwebmacro">Work out main tangle destination</span> <span class="cwebmacronumber">7.3.2.1</span>&gt;<span class="plain">;</span> &lt;<span class="cwebmacro">Work out main tangle destination</span> <span class="cwebmacronumber">7.4.2.1</span>&gt;<span class="plain">;</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Reader::get_section_for_range</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">, </span><span class="identifier">ins</span><span class="plain">-&gt;</span><span class="element">chosen_range</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">Reader::get_section_for_range</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">, </span><span class="identifier">ins</span><span class="plain">-&gt;</span><span class="element">chosen_range</span><span class="plain">)) {</span>
&lt;<span class="cwebmacro">Work out an independent tangle destination, from one section of the web</span> <span class="cwebmacronumber">7.3.2.2</span>&gt;<span class="plain">;</span> &lt;<span class="cwebmacro">Work out an independent tangle destination, from one section of the web</span> <span class="cwebmacronumber">7.4.2.2</span>&gt;<span class="plain">;</span>
<span class="plain">}</span> <span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::len</span><span class="plain">(</span><span class="identifier">tangle_leaf</span><span class="plain">) == </span><span class="constant">0</span><span class="plain">) { </span><span class="functiontext">Errors::fatal</span><span class="plain">(</span><span class="string">"no tangle destination known"</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">tangle_leaf</span><span class="plain">) == </span><span class="constant">0</span><span class="plain">) { </span><span class="functiontext">Errors::fatal</span><span class="plain">(</span><span class="string">"no tangle destination known"</span><span class="plain">); }</span>
@ -334,15 +358,15 @@ line , but otherwise we impose a sensible choice based on the target.
<p class="inwebparagraph"></p> <p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP7_3">&#167;7.3</a>.</p> <p class="endnote">This code is used in <a href="#SP7_4">&#167;7.4</a>.</p>
<p class="inwebparagraph"><a id="SP7_3_2_1"></a><b>&#167;7.3.2.1. </b>Here the target number is 0, and the tangle is of the main part of the web, <p class="inwebparagraph"><a id="SP7_4_2_1"></a><b>&#167;7.4.2.1. </b>Here the target number is 0, and the tangle is of the main part of the web,
which for many small webs will be the entire thing. which for many small webs will be the entire thing.
</p> </p>
<p class="macrodefinition"><code class="display"> <p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Work out main tangle destination</span> <span class="cwebmacronumber">7.3.2.1</span>&gt; = &lt;<span class="cwebmacrodefn">Work out main tangle destination</span> <span class="cwebmacronumber">7.4.2.1</span>&gt; =
</code></p> </code></p>
@ -357,14 +381,14 @@ which for many small webs will be the entire thing.
<p class="inwebparagraph"></p> <p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP7_3_2">&#167;7.3.2</a>.</p> <p class="endnote">This code is used in <a href="#SP7_4_2">&#167;7.4.2</a>.</p>
<p class="inwebparagraph"><a id="SP7_3_2_2"></a><b>&#167;7.3.2.2. </b>If someone tangles, say, <code class="display"><span class="extract">2/eg</span></code> then the default filename is "Example Section". <p class="inwebparagraph"><a id="SP7_4_2_2"></a><b>&#167;7.4.2.2. </b>If someone tangles, say, <code class="display"><span class="extract">2/eg</span></code> then the default filename is "Example Section".
</p> </p>
<p class="macrodefinition"><code class="display"> <p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Work out an independent tangle destination, from one section of the web</span> <span class="cwebmacronumber">7.3.2.2</span>&gt; = &lt;<span class="cwebmacrodefn">Work out an independent tangle destination, from one section of the web</span> <span class="cwebmacronumber">7.4.2.2</span>&gt; =
</code></p> </code></p>
@ -377,20 +401,20 @@ which for many small webs will be the entire thing.
<p class="inwebparagraph"></p> <p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP7_3_2">&#167;7.3.2</a>.</p> <p class="endnote">This code is used in <a href="#SP7_4_2">&#167;7.4.2</a>.</p>
<p class="inwebparagraph"><a id="SP7_3_3"></a><b>&#167;7.3.3. </b>Weaving is not actually easier, it's just more thoroughly delegated: <p class="inwebparagraph"><a id="SP7_4_3"></a><b>&#167;7.4.3. </b>Weaving is not actually easier, it's just more thoroughly delegated:
</p> </p>
<p class="macrodefinition"><code class="display"> <p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Weave the web</span> <span class="cwebmacronumber">7.3.3</span>&gt; = &lt;<span class="cwebmacrodefn">Weave the web</span> <span class="cwebmacronumber">7.4.3</span>&gt; =
</code></p> </code></p>
<pre class="displaydefn"> <pre class="displaydefn">
<span class="functiontext">Numbering::number_web</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">);</span> <span class="functiontext">Numbering::number_web</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ins</span><span class="plain">-&gt;</span><span class="element">weave_docs</span><span class="plain">) </span>&lt;<span class="cwebmacro">Prepare a docs weave</span> <span class="cwebmacronumber">7.3.3.1</span>&gt;<span class="plain">;</span> <span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ins</span><span class="plain">-&gt;</span><span class="element">weave_docs</span><span class="plain">) </span>&lt;<span class="cwebmacro">Prepare a docs weave</span> <span class="cwebmacronumber">7.4.3.1</span>&gt;<span class="plain">;</span>
<span class="reserved">theme_tag</span><span class="plain"> *</span><span class="identifier">tag</span><span class="plain"> = </span><span class="functiontext">Tags::find_by_name</span><span class="plain">(</span><span class="identifier">ins</span><span class="plain">-&gt;</span><span class="element">tag_setting</span><span class="plain">, </span><span class="constant">FALSE</span><span class="plain">);</span> <span class="reserved">theme_tag</span><span class="plain"> *</span><span class="identifier">tag</span><span class="plain"> = </span><span class="functiontext">Tags::find_by_name</span><span class="plain">(</span><span class="identifier">ins</span><span class="plain">-&gt;</span><span class="element">tag_setting</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::len</span><span class="plain">(</span><span class="identifier">ins</span><span class="plain">-&gt;</span><span class="element">tag_setting</span><span class="plain">) &gt; </span><span class="constant">0</span><span class="plain">) &amp;&amp; (</span><span class="identifier">tag</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="functiontext">Str::len</span><span class="plain">(</span><span class="identifier">ins</span><span class="plain">-&gt;</span><span class="element">tag_setting</span><span class="plain">) &gt; </span><span class="constant">0</span><span class="plain">) &amp;&amp; (</span><span class="identifier">tag</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">))</span>
@ -402,7 +426,7 @@ which for many small webs will be the entire thing.
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">r</span><span class="plain"> = </span><span class="functiontext">Formats::begin_weaving</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">, </span><span class="identifier">pattern</span><span class="plain">);</span> <span class="reserved">int</span><span class="plain"> </span><span class="identifier">r</span><span class="plain"> = </span><span class="functiontext">Formats::begin_weaving</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">, </span><span class="identifier">pattern</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">r</span><span class="plain"> != </span><span class="constant">SWARM_OFF_SWM</span><span class="plain">) </span><span class="identifier">ins</span><span class="plain">-&gt;</span><span class="element">swarm_mode</span><span class="plain"> = </span><span class="identifier">r</span><span class="plain">;</span> <span class="reserved">if</span><span class="plain"> (</span><span class="identifier">r</span><span class="plain"> != </span><span class="constant">SWARM_OFF_SWM</span><span class="plain">) </span><span class="identifier">ins</span><span class="plain">-&gt;</span><span class="element">swarm_mode</span><span class="plain"> = </span><span class="identifier">r</span><span class="plain">;</span>
&lt;<span class="cwebmacro">Assign section numbers for printing purposes</span> <span class="cwebmacronumber">7.3.3.2</span>&gt;<span class="plain">;</span> &lt;<span class="cwebmacro">Assign section numbers for printing purposes</span> <span class="cwebmacronumber">7.4.3.2</span>&gt;<span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ins</span><span class="plain">-&gt;</span><span class="element">swarm_mode</span><span class="plain"> == </span><span class="constant">SWARM_OFF_SWM</span><span class="plain">) {</span> <span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ins</span><span class="plain">-&gt;</span><span class="element">swarm_mode</span><span class="plain"> == </span><span class="constant">SWARM_OFF_SWM</span><span class="plain">) {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">shall_we_open</span><span class="plain"> = </span><span class="identifier">ins</span><span class="plain">-&gt;</span><span class="element">open_pdf_switch</span><span class="plain">;</span> <span class="reserved">int</span><span class="plain"> </span><span class="identifier">shall_we_open</span><span class="plain"> = </span><span class="identifier">ins</span><span class="plain">-&gt;</span><span class="element">open_pdf_switch</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">shall_we_open</span><span class="plain"> == </span><span class="constant">NOT_APPLICABLE</span><span class="plain">) { </span><span class="comment">i.e., if it wasn't set at the command line</span> <span class="reserved">if</span><span class="plain"> (</span><span class="identifier">shall_we_open</span><span class="plain"> == </span><span class="constant">NOT_APPLICABLE</span><span class="plain">) { </span><span class="comment">i.e., if it wasn't set at the command line</span>
@ -422,15 +446,15 @@ which for many small webs will be the entire thing.
<p class="inwebparagraph"></p> <p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP7_3">&#167;7.3</a>.</p> <p class="endnote">This code is used in <a href="#SP7_4">&#167;7.4</a>.</p>
<p class="inwebparagraph"><a id="SP7_3_3_1"></a><b>&#167;7.3.3.1. </b>If the <code class="display"><span class="extract">-weave-docs</span></code> option was used, we have to weave into a subfolder of <p class="inwebparagraph"><a id="SP7_4_3_1"></a><b>&#167;7.4.3.1. </b>If the <code class="display"><span class="extract">-weave-docs</span></code> option was used, we have to weave into a subfolder of
<code class="display"><span class="extract">docs</span></code>, and we'll create it if it doesn't already exist. <code class="display"><span class="extract">docs</span></code>, and we'll create it if it doesn't already exist.
</p> </p>
<p class="macrodefinition"><code class="display"> <p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Prepare a docs weave</span> <span class="cwebmacronumber">7.3.3.1</span>&gt; = &lt;<span class="cwebmacrodefn">Prepare a docs weave</span> <span class="cwebmacronumber">7.4.3.1</span>&gt; =
</code></p> </code></p>
@ -456,10 +480,10 @@ which for many small webs will be the entire thing.
<p class="inwebparagraph"></p> <p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP7_3_3">&#167;7.3.3</a>.</p> <p class="endnote">This code is used in <a href="#SP7_4_3">&#167;7.4.3</a>.</p>
<p class="inwebparagraph"><a id="SP7_3_3_2"></a><b>&#167;7.3.3.2. </b><code class="display"> <p class="inwebparagraph"><a id="SP7_4_3_2"></a><b>&#167;7.4.3.2. </b><code class="display">
&lt;<span class="cwebmacrodefn">Assign section numbers for printing purposes</span> <span class="cwebmacronumber">7.3.3.2</span>&gt; = &lt;<span class="cwebmacrodefn">Assign section numbers for printing purposes</span> <span class="cwebmacronumber">7.4.3.2</span>&gt; =
</code></p> </code></p>
@ -472,14 +496,13 @@ which for many small webs will be the entire thing.
<p class="inwebparagraph"></p> <p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP7_3_3">&#167;7.3.3</a>.</p> <p class="endnote">This code is used in <a href="#SP7_4_3">&#167;7.4.3</a>.</p>
<p class="inwebparagraph"><a id="SP8"></a><b>&#167;8. Error messages. </b>The Foundation module provides convenient functions to issue error messages, <p class="inwebparagraph"><a id="SP8"></a><b>&#167;8. Error messages. </b>The Foundation module provides convenient functions to issue error messages,
but we'll use the following wrapper when issuing an error at a line of web but we'll use the following wrapper when issuing an error at a line of web
source: source:
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Main::error_in_web</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">message</span><span class="plain">, </span><span class="reserved">source_line</span><span class="plain"> *</span><span class="identifier">sl</span><span class="plain">) {</span> <span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Main::error_in_web</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">message</span><span class="plain">, </span><span class="reserved">source_line</span><span class="plain"> *</span><span class="identifier">sl</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">sl</span><span class="plain">) {</span> <span class="reserved">if</span><span class="plain"> (</span><span class="identifier">sl</span><span class="plain">) {</span>

View file

@ -33,7 +33,6 @@ names such as <code class="display"><span class="extract">HTML</span></code>. On
to such a name, and to read it in. This structure holds the result: to such a name, and to read it in. This structure holds the result:
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">weave_pattern</span><span class="plain"> {</span> <span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">weave_pattern</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">pattern_name</span><span class="plain">; </span><span class="comment">such as <code class="display"><span class="extract">HTML</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">pattern_name</span><span class="plain">; </span><span class="comment">such as <code class="display"><span class="extract">HTML</span></code></span>
@ -66,7 +65,6 @@ to such a name, and to read it in. This structure holds the result:
<p class="inwebparagraph"><a id="SP2"></a><b>&#167;2. </b>When a given web needs a pattern with a given name, this is where it comes. <p class="inwebparagraph"><a id="SP2"></a><b>&#167;2. </b>When a given web needs a pattern with a given name, this is where it comes.
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">weave_pattern</span><span class="plain"> *</span><span class="functiontext">Patterns::find</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">weave_pattern</span><span class="plain"> *</span><span class="functiontext">Patterns::find</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">filename</span><span class="plain"> *</span><span class="identifier">pattern_file</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span> <span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">pattern_file</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
@ -80,7 +78,7 @@ to such a name, and to read it in. This structure holds the result:
<p class="inwebparagraph"></p> <p class="inwebparagraph"></p>
<p class="endnote">The function Patterns::find is used in <a href="#SP3_1">&#167;3.1</a>, 1/pc (<a href="1-pc.html#SP7_3_3">&#167;7.3.3</a>).</p> <p class="endnote">The function Patterns::find is used in <a href="#SP3_1">&#167;3.1</a>, 1/pc (<a href="1-pc.html#SP7_4_3">&#167;7.4.3</a>).</p>
<p class="inwebparagraph"><a id="SP2_1"></a><b>&#167;2.1. </b><code class="display"> <p class="inwebparagraph"><a id="SP2_1"></a><b>&#167;2.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Initialise the pattern structure</span> <span class="cwebmacronumber">2.1</span>&gt; = &lt;<span class="cwebmacrodefn">Initialise the pattern structure</span> <span class="cwebmacronumber">2.1</span>&gt; =
@ -153,7 +151,6 @@ line, and this is used to send each line in the <code class="display"><span clas
following routine: following routine:
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Patterns::scan_pattern_line</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">line</span><span class="plain">, </span><span class="reserved">text_file_position</span><span class="plain"> *</span><span class="identifier">tfp</span><span class="plain">, </span><span class="reserved">void</span><span class="plain"> *</span><span class="identifier">X</span><span class="plain">) {</span> <span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Patterns::scan_pattern_line</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">line</span><span class="plain">, </span><span class="reserved">text_file_position</span><span class="plain"> *</span><span class="identifier">tfp</span><span class="plain">, </span><span class="reserved">void</span><span class="plain"> *</span><span class="identifier">X</span><span class="plain">) {</span>
<span class="reserved">weave_pattern</span><span class="plain"> *</span><span class="identifier">wp</span><span class="plain"> = (</span><span class="reserved">weave_pattern</span><span class="plain"> *) </span><span class="identifier">X</span><span class="plain">;</span> <span class="reserved">weave_pattern</span><span class="plain"> *</span><span class="identifier">wp</span><span class="plain"> = (</span><span class="reserved">weave_pattern</span><span class="plain"> *) </span><span class="identifier">X</span><span class="plain">;</span>
@ -294,7 +291,6 @@ actual location will depend on where the pattern directory is.
<p class="inwebparagraph"><a id="SP4"></a><b>&#167;4. </b></p> <p class="inwebparagraph"><a id="SP4"></a><b>&#167;4. </b></p>
<pre class="display"> <pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Patterns::yes_or_no</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">arg</span><span class="plain">, </span><span class="reserved">text_file_position</span><span class="plain"> *</span><span class="identifier">tfp</span><span class="plain">) {</span> <span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Patterns::yes_or_no</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">arg</span><span class="plain">, </span><span class="reserved">text_file_position</span><span class="plain"> *</span><span class="identifier">tfp</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">arg</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"yes"</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="constant">TRUE</span><span class="plain">;</span> <span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="identifier">arg</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"yes"</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="constant">TRUE</span><span class="plain">;</span>
@ -319,7 +315,6 @@ inherited from.
from each other then this routine will lock up into an infinite loop. from each other then this routine will lock up into an infinite loop.
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">filename</span><span class="plain"> *</span><span class="functiontext">Patterns::obtain_filename</span><span class="plain">(</span><span class="reserved">weave_pattern</span><span class="plain"> *</span><span class="identifier">pattern</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">leafname</span><span class="plain">) {</span> <span class="reserved">filename</span><span class="plain"> *</span><span class="functiontext">Patterns::obtain_filename</span><span class="plain">(</span><span class="reserved">weave_pattern</span><span class="plain"> *</span><span class="identifier">pattern</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">leafname</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::prefix_eq</span><span class="plain">(</span><span class="identifier">leafname</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"../"</span><span class="plain">, </span><span class="constant">3</span><span class="plain">)) {</span> <span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::prefix_eq</span><span class="plain">(</span><span class="identifier">leafname</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"../"</span><span class="plain">, </span><span class="constant">3</span><span class="plain">)) {</span>
@ -342,7 +337,6 @@ from each other then this routine will lock up into an infinite loop.
for payloads to be copied into weave, we make good use of the above: for payloads to be copied into weave, we make good use of the above:
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Patterns::copy_payloads_into_weave</span><span class="plain">(</span><span class="reserved">web</span><span class="plain"> *</span><span class="identifier">W</span><span class="plain">, </span><span class="reserved">weave_pattern</span><span class="plain"> *</span><span class="identifier">pattern</span><span class="plain">) {</span> <span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Patterns::copy_payloads_into_weave</span><span class="plain">(</span><span class="reserved">web</span><span class="plain"> *</span><span class="identifier">W</span><span class="plain">, </span><span class="reserved">weave_pattern</span><span class="plain"> *</span><span class="identifier">pattern</span><span class="plain">) {</span>
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">leafname</span><span class="plain">;</span> <span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">leafname</span><span class="plain">;</span>
@ -371,7 +365,6 @@ for payloads to be copied into weave, we make good use of the above:
<p class="inwebparagraph"><a id="SP7"></a><b>&#167;7. </b></p> <p class="inwebparagraph"><a id="SP7"></a><b>&#167;7. </b></p>
<pre class="display"> <pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Patterns::copy_file_into_weave</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">filename</span><span class="plain"> *</span><span class="identifier">F</span><span class="plain">) {</span> <span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Patterns::copy_file_into_weave</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">filename</span><span class="plain"> *</span><span class="identifier">F</span><span class="plain">) {</span>
<span class="reserved">pathname</span><span class="plain"> *</span><span class="identifier">H</span><span class="plain"> = </span><span class="identifier">W</span><span class="plain">-&gt;</span><span class="element">redirect_weaves_to</span><span class="plain">;</span> <span class="reserved">pathname</span><span class="plain"> *</span><span class="identifier">H</span><span class="plain"> = </span><span class="identifier">W</span><span class="plain">-&gt;</span><span class="element">redirect_weaves_to</span><span class="plain">;</span>

View file

@ -36,7 +36,6 @@ name following the final underscore, so in this case <code class="display"><span
increments sequentially in definition order. increments sequentially in definition order.
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">enumeration_set</span><span class="plain"> {</span> <span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">enumeration_set</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">postfix</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">postfix</span><span class="plain">;</span>
@ -56,7 +55,6 @@ increments sequentially in definition order.
compare all against all: compare all against all:
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">enumeration_set</span><span class="plain"> *</span><span class="functiontext">Enumerations::find</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">post</span><span class="plain">) {</span> <span class="reserved">enumeration_set</span><span class="plain"> *</span><span class="functiontext">Enumerations::find</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">post</span><span class="plain">) {</span>
<span class="reserved">enumeration_set</span><span class="plain"> *</span><span class="identifier">es</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span> <span class="reserved">enumeration_set</span><span class="plain"> *</span><span class="identifier">es</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
@ -76,7 +74,6 @@ sensible value, this is the start of a new enumeration set; otherwise it's
a further constant in what ought to be an existing set. a further constant in what ought to be an existing set.
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Enumerations::define</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">symbol</span><span class="plain">,</span> <span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Enumerations::define</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">symbol</span><span class="plain">,</span>
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">from</span><span class="plain">, </span><span class="reserved">source_line</span><span class="plain"> *</span><span class="identifier">L</span><span class="plain">) {</span> <span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">from</span><span class="plain">, </span><span class="reserved">source_line</span><span class="plain"> *</span><span class="identifier">L</span><span class="plain">) {</span>
@ -170,7 +167,6 @@ we would have <code class="display"><span class="extract">NO_DEFINED_ST_VALUES</
the code at the last line on which an <code class="display"><span class="extract">*_ST</span></code> value was defined. the code at the last line on which an <code class="display"><span class="extract">*_ST</span></code> value was defined.
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Enumerations::define_extents</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">tangle_target</span><span class="plain"> *</span><span class="identifier">target</span><span class="plain">, </span><span class="reserved">programming_language</span><span class="plain"> *</span><span class="identifier">lang</span><span class="plain">) {</span> <span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Enumerations::define_extents</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">tangle_target</span><span class="plain"> *</span><span class="identifier">target</span><span class="plain">, </span><span class="reserved">programming_language</span><span class="plain"> *</span><span class="identifier">lang</span><span class="plain">) {</span>
<span class="reserved">enumeration_set</span><span class="plain"> *</span><span class="identifier">es</span><span class="plain">;</span> <span class="reserved">enumeration_set</span><span class="plain"> *</span><span class="identifier">es</span><span class="plain">;</span>

View file

@ -42,7 +42,6 @@ is so tidily divisible into lines, we can usefully make each source line
correspond to one of these: correspond to one of these:
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">typedef</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="reserved">typedef</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="reserved">struct</span><span class="plain"> </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">text</span><span class="plain">; </span><span class="comment">the text as read in</span> <span class="reserved">struct</span><span class="plain"> </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">text</span><span class="plain">; </span><span class="comment">the text as read in</span>
@ -52,6 +51,7 @@ correspond to one of these:
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">category</span><span class="plain">; </span><span class="comment">what sort of line this is: an <code class="display"><span class="extract">*_LCAT</span></code> value</span> <span class="reserved">int</span><span class="plain"> </span><span class="identifier">category</span><span class="plain">; </span><span class="comment">what sort of line this is: an <code class="display"><span class="extract">*_LCAT</span></code> value</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">command_code</span><span class="plain">; </span><span class="comment">used only for <code class="display"><span class="extract">COMMAND_LCAT</span></code> lines: a <code class="display"><span class="extract">*_CMD</span></code> value</span> <span class="reserved">int</span><span class="plain"> </span><span class="identifier">command_code</span><span class="plain">; </span><span class="comment">used only for <code class="display"><span class="extract">COMMAND_LCAT</span></code> lines: a <code class="display"><span class="extract">*_CMD</span></code> value</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">default_defn</span><span class="plain">; </span><span class="comment">used only for <code class="display"><span class="extract">BEGIN_DEFINITION_LCAT</span></code> lines</span> <span class="reserved">int</span><span class="plain"> </span><span class="identifier">default_defn</span><span class="plain">; </span><span class="comment">used only for <code class="display"><span class="extract">BEGIN_DEFINITION_LCAT</span></code> lines</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">plainer</span><span class="plain">; </span><span class="comment">used only for <code class="display"><span class="extract">BEGIN_CODE_LCAT</span></code> lines: suppresses box</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">programming_language</span><span class="plain"> *</span><span class="identifier">colour_as</span><span class="plain">; </span><span class="comment">used only for <code class="display"><span class="extract">TEXT_EXTRACT_LCAT</span></code> lines</span> <span class="reserved">struct</span><span class="plain"> </span><span class="reserved">programming_language</span><span class="plain"> *</span><span class="identifier">colour_as</span><span class="plain">; </span><span class="comment">used only for <code class="display"><span class="extract">TEXT_EXTRACT_LCAT</span></code> lines</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">is_commentary</span><span class="plain">; </span><span class="comment">flag</span> <span class="reserved">int</span><span class="plain"> </span><span class="identifier">is_commentary</span><span class="plain">; </span><span class="comment">flag</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">function</span><span class="plain"> *</span><span class="identifier">function_defined</span><span class="plain">; </span><span class="comment">if any C-like function is defined on this line</span> <span class="reserved">struct</span><span class="plain"> </span><span class="reserved">function</span><span class="plain"> *</span><span class="identifier">function_defined</span><span class="plain">; </span><span class="comment">if any C-like function is defined on this line</span>
@ -69,11 +69,10 @@ correspond to one of these:
<p class="inwebparagraph"></p> <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, 5/hf 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/lm, 4/as, 4/cl, 4/is, 5/tf and here.</p>
<p class="inwebparagraph"><a id="SP2"></a><b>&#167;2. </b></p> <p class="inwebparagraph"><a id="SP2"></a><b>&#167;2. </b></p>
<pre class="display"> <pre class="display">
<span class="reserved">source_line</span><span class="plain"> *</span><span class="functiontext">Lines::new_source_line</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">line</span><span class="plain">, </span><span class="reserved">text_file_position</span><span class="plain"> *</span><span class="identifier">tfp</span><span class="plain">) {</span> <span class="reserved">source_line</span><span class="plain"> *</span><span class="functiontext">Lines::new_source_line</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">line</span><span class="plain">, </span><span class="reserved">text_file_position</span><span class="plain"> *</span><span class="identifier">tfp</span><span class="plain">) {</span>
<span class="reserved">source_line</span><span class="plain"> *</span><span class="identifier">sl</span><span class="plain"> = </span><span class="identifier">CREATE</span><span class="plain">(</span><span class="reserved">source_line</span><span class="plain">);</span> <span class="reserved">source_line</span><span class="plain"> *</span><span class="identifier">sl</span><span class="plain"> = </span><span class="identifier">CREATE</span><span class="plain">(</span><span class="reserved">source_line</span><span class="plain">);</span>
@ -84,6 +83,7 @@ correspond to one of these:
<span class="identifier">sl</span><span class="plain">-&gt;</span><span class="element">category</span><span class="plain"> = </span><span class="constant">NO_LCAT</span><span class="plain">; </span><span class="comment">that is, unknown category as yet</span> <span class="identifier">sl</span><span class="plain">-&gt;</span><span class="element">category</span><span class="plain"> = </span><span class="constant">NO_LCAT</span><span class="plain">; </span><span class="comment">that is, unknown category as yet</span>
<span class="identifier">sl</span><span class="plain">-&gt;</span><span class="element">command_code</span><span class="plain"> = </span><span class="constant">NO_CMD</span><span class="plain">;</span> <span class="identifier">sl</span><span class="plain">-&gt;</span><span class="element">command_code</span><span class="plain"> = </span><span class="constant">NO_CMD</span><span class="plain">;</span>
<span class="identifier">sl</span><span class="plain">-&gt;</span><span class="element">default_defn</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span> <span class="identifier">sl</span><span class="plain">-&gt;</span><span class="element">default_defn</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
<span class="identifier">sl</span><span class="plain">-&gt;</span><span class="element">plainer</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
<span class="identifier">sl</span><span class="plain">-&gt;</span><span class="element">colour_as</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span> <span class="identifier">sl</span><span class="plain">-&gt;</span><span class="element">colour_as</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">sl</span><span class="plain">-&gt;</span><span class="element">is_commentary</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span> <span class="identifier">sl</span><span class="plain">-&gt;</span><span class="element">is_commentary</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
<span class="identifier">sl</span><span class="plain">-&gt;</span><span class="element">function_defined</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span> <span class="identifier">sl</span><span class="plain">-&gt;</span><span class="element">function_defined</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
@ -102,7 +102,7 @@ correspond to one of these:
<p class="inwebparagraph"></p> <p class="inwebparagraph"></p>
<p class="endnote">The function Lines::new_source_line is used in 2/tr (<a href="2-tr.html#SP6_1_2">&#167;6.1.2</a>), 2/tp (<a href="2-tp.html#SP1_1_5_1">&#167;1.1.5.1</a>).</p> <p class="endnote">The function Lines::new_source_line is used in 2/tr (<a href="2-tr.html#SP6_1_2">&#167;6.1.2</a>), 2/tp (<a href="2-tp.html#SP1_1_5_1">&#167;1.1.5.1</a>, <a href="2-tp.html#SP1_1_6_7_1">&#167;1.1.6.7.1</a>).</p>
<p class="inwebparagraph"><a id="SP3"></a><b>&#167;3. Categories. </b>The line categories are enumerated as follows. We briefly note what the text <p class="inwebparagraph"><a id="SP3"></a><b>&#167;3. Categories. </b>The line categories are enumerated as follows. We briefly note what the text
operands (TO and TO2) are set to, if anything: most of the time they're blank. operands (TO and TO2) are set to, if anything: most of the time they're blank.
@ -143,7 +143,6 @@ version 1 syntax; version 2 removed the need for <code class="display"><span cla
of Inweb: of Inweb:
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">char</span><span class="plain"> *</span><span class="functiontext">Lines::category_name</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">cat</span><span class="plain">) {</span> <span class="reserved">char</span><span class="plain"> *</span><span class="functiontext">Lines::category_name</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">cat</span><span class="plain">) {</span>
<span class="reserved">switch</span><span class="plain"> (</span><span class="identifier">cat</span><span class="plain">) {</span> <span class="reserved">switch</span><span class="plain"> (</span><span class="identifier">cat</span><span class="plain">) {</span>

View file

@ -31,7 +31,6 @@
<p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. </b>We store these like so: <p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. </b>We store these like so:
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">para_macro</span><span class="plain"> {</span> <span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">para_macro</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">macro_name</span><span class="plain">; </span><span class="comment">usually long, like "Create a paragraph macro here"</span> <span class="reserved">struct</span><span class="plain"> </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">macro_name</span><span class="plain">; </span><span class="comment">usually long, like "Create a paragraph macro here"</span>
@ -50,7 +49,6 @@
the usage of these is always a single section. the usage of these is always a single section.
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">para_macro</span><span class="plain"> *</span><span class="functiontext">Macros::create</span><span class="plain">(</span><span class="reserved">section</span><span class="plain"> *</span><span class="identifier">S</span><span class="plain">, </span><span class="reserved">paragraph</span><span class="plain"> *</span><span class="identifier">P</span><span class="plain">, </span><span class="reserved">source_line</span><span class="plain"> *</span><span class="identifier">L</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">para_macro</span><span class="plain"> *</span><span class="functiontext">Macros::create</span><span class="plain">(</span><span class="reserved">section</span><span class="plain"> *</span><span class="identifier">S</span><span class="plain">, </span><span class="reserved">paragraph</span><span class="plain"> *</span><span class="identifier">P</span><span class="plain">, </span><span class="reserved">source_line</span><span class="plain"> *</span><span class="identifier">L</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">para_macro</span><span class="plain"> *</span><span class="identifier">pmac</span><span class="plain"> = </span><span class="identifier">CREATE</span><span class="plain">(</span><span class="reserved">para_macro</span><span class="plain">);</span> <span class="reserved">para_macro</span><span class="plain"> *</span><span class="identifier">pmac</span><span class="plain"> = </span><span class="identifier">CREATE</span><span class="plain">(</span><span class="reserved">para_macro</span><span class="plain">);</span>
@ -74,7 +72,6 @@ you can use the same macro name twice in different sections; and lookup is
much faster. much faster.
</p> </p>
<pre class="display"> <pre class="display">
<span class="reserved">para_macro</span><span class="plain"> *</span><span class="functiontext">Macros::find_by_name</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">section</span><span class="plain"> *</span><span class="identifier">scope</span><span class="plain">) {</span> <span class="reserved">para_macro</span><span class="plain"> *</span><span class="functiontext">Macros::find_by_name</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">section</span><span class="plain"> *</span><span class="identifier">scope</span><span class="plain">) {</span>
<span class="reserved">para_macro</span><span class="plain"> *</span><span class="identifier">pmac</span><span class="plain">;</span> <span class="reserved">para_macro</span><span class="plain"> *</span><span class="identifier">pmac</span><span class="plain">;</span>

Some files were not shown because too many files have changed in this diff Show more